diff --git a/.github/workflows/verify.yml b/.github/workflows/verify.yml
index 5aa361b..eca1a64 100644
--- a/.github/workflows/verify.yml
+++ b/.github/workflows/verify.yml
@@ -5,7 +5,7 @@ on:
branches:
- main
pull_request:
- types: [opened, reopened]
+ types: [opened, reopened, synchronize]
jobs:
verify:
@@ -17,13 +17,91 @@ jobs:
with:
token: ${{ secrets.GITHUB_TOKEN }}
submodules: false
- - name: Enable Corepack
- run: corepack enable
+ - name: Setup Bun
+ uses: oven-sh/setup-bun@v2
- name: Install dependencies
- run: yarn install --frozen-lockfile
+ run: bun install --frozen-lockfile
- name: Lint
- run: yarn lint --no-fix
+ run: bun run lint --no-fix
- name: Test
- run: yarn test
+ run: bun run test
- name: Build
- run: yarn build
+ run: bun run build
+
+ verify-rust-cli:
+ runs-on: ubuntu-latest
+ name: verify-rust-cli
+ defaults:
+ run:
+ working-directory: packages/nestjs-trpc/cli
+ steps:
+ - name: Checkout the repo
+ uses: actions/checkout@v4
+ with:
+ token: ${{ secrets.GITHUB_TOKEN }}
+ submodules: false
+ - name: Setup Rust
+ uses: actions-rust-lang/setup-rust-toolchain@v1
+ with:
+ toolchain: stable
+ components: rustfmt, clippy
+ cache-workspaces: packages/nestjs-trpc/cli -> target
+ - name: Check formatting
+ run: cargo fmt --check
+ - name: Run clippy
+ run: cargo clippy --all-targets --all-features -- -D warnings
+ - name: Run tests
+ run: cargo test
+ - name: Build
+ run: cargo build --release
+ - name: Check file sizes
+ run: ./scripts/check-line-count.sh
+
+ e2e-tests:
+ runs-on: ubuntu-latest
+ name: e2e-tests
+ needs: [verify, verify-rust-cli]
+ steps:
+ - name: Checkout the repo
+ uses: actions/checkout@v4
+ with:
+ token: ${{ secrets.GITHUB_TOKEN }}
+ submodules: false
+ - name: Setup Bun
+ uses: oven-sh/setup-bun@v2
+ - name: Setup Rust
+ uses: actions-rust-lang/setup-rust-toolchain@v1
+ with:
+ toolchain: stable
+ cache-workspaces: packages/nestjs-trpc/cli -> target
+ - name: Install dependencies
+ run: bun install --frozen-lockfile
+ - name: Build library
+ run: bun run build
+ - name: Build Rust CLI
+ working-directory: packages/nestjs-trpc/cli
+ run: cargo build --release
+ - name: Generate types for Express example
+ working-directory: examples/nestjs-express
+ run: |
+ mkdir -p src/@generated
+ ../../packages/nestjs-trpc/cli/target/release/nestjs-trpc generate \
+ --entrypoint ./src/user.router.ts \
+ --output ./src/@generated/server.ts
+ - name: Verify Express generated file exists
+ run: test -s examples/nestjs-express/src/@generated/server.ts
+ - name: Generate types for Fastify example
+ working-directory: examples/nestjs-fastify
+ run: |
+ mkdir -p src/@generated
+ ../../packages/nestjs-trpc/cli/target/release/nestjs-trpc generate \
+ --entrypoint ./src/user.router.ts \
+ --output ./src/@generated/server.ts
+ - name: Verify Fastify generated file exists
+ run: test -s examples/nestjs-fastify/src/@generated/server.ts
+ - name: Run E2E tests (Express)
+ working-directory: examples/nestjs-express
+ run: bun run test:e2e
+ - name: Run E2E tests (Fastify)
+ working-directory: examples/nestjs-fastify
+ run: bun run test:e2e
diff --git a/.gitignore b/.gitignore
index a786439..e9c7c9e 100644
--- a/.gitignore
+++ b/.gitignore
@@ -33,4 +33,27 @@ test/**/dist
!.yarn/plugins
!.yarn/releases
!.yarn/sdks
-!.yarn/versions
\ No newline at end of file
+!.yarn/versions
+
+# Rust CLI (packages/nestjs-trpc/cli)
+**/target/
+**/*.rs.bk
+
+# Development tools
+.auto-claude/
+.worktrees/
+.claude/
+.planning/
+
+# Native binaries
+packages/nestjs-trpc/native/
+
+# Generated/build artifacts
+packages/nestjs-trpc/cli/@generated/
+**/*.rlib
+
+# Compiled test files
+examples/**/test/**/*.js
+examples/**/test/**/*.js.map
+examples/**/test/**/*.d.ts
+examples/**/test/**/*.d.ts.map
\ No newline at end of file
diff --git a/.husky/commit-msg b/.husky/commit-msg
index f617c56..ccc265c 100644
--- a/.husky/commit-msg
+++ b/.husky/commit-msg
@@ -1 +1 @@
-yarn commitlint -c --config .commitlintrc.json -E --edit
\ No newline at end of file
+bun run commitlint -c --config .commitlintrc.json -E --edit
diff --git a/.husky/pre-commit b/.husky/pre-commit
index 1a1f1f0..f2d66f6 100644
--- a/.husky/pre-commit
+++ b/.husky/pre-commit
@@ -1 +1 @@
-yarn lint-staged
\ No newline at end of file
+bun run lint-staged
diff --git a/.prettierignore b/.prettierignore
index f7bf61e..2ea5e9b 100644
--- a/.prettierignore
+++ b/.prettierignore
@@ -4,4 +4,5 @@ docs/
public/
*.md
*.mdx
-packages/**/__tests__/*.ts
\ No newline at end of file
+packages/**/__tests__/*.ts
+packages/nestjs-trpc/cli/tests/fixtures/
\ No newline at end of file
diff --git a/.yarnrc.yml b/.yarnrc.yml
deleted file mode 100644
index 5b2e612..0000000
--- a/.yarnrc.yml
+++ /dev/null
@@ -1,3 +0,0 @@
-nodeLinker: pnp
-pnpMode: strict
-enableTelemetry: false
\ No newline at end of file
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 74e78ad..76eb618 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,5 +1,36 @@
# Changelog
+## [2.0.0] - UNRELEASED
+
+### BREAKING CHANGES
+
+#### tRPC v11 Required
+- **Minimum tRPC version**: `@trpc/server@^11.0.0` is now required
+- If using data transformers, move them to link configuration (see [migration guide](/docs/migration/v10-to-v11))
+
+#### TypeScript Generator Removed
+- **Code generation**: Now handled exclusively by Rust CLI
+- **Removed**: `TRPCGenerator` class and `autoSchemaFile` option
+- **Removed**: `ts-morph` dependency
+- **Migration**: Use `npx nestjs-trpc generate` instead (see [migration guide](/docs/migration/typescript-to-rust-cli))
+
+#### ImportsScanner Removed
+- **Internal change**: `ImportsScanner` class removed (was internal, should not affect users)
+
+### Added
+
+- **Watch mode**: `npx nestjs-trpc watch` for automatic regeneration on file changes
+- **Better error messages**: Rich diagnostics with file paths and line numbers
+- **Faster generation**: Rust-based CLI is 10-50x faster than TypeScript generator
+
+### Changed
+
+- **Internal**: Router construction uses plain objects instead of explicit `router()` calls (tRPC v11 shorthand)
+
+### Fixed
+
+- Various parser edge cases for complex Zod schemas
+
## 1.6.1 (2024-10-30)
## 1.6.0 (2024-10-30)
diff --git a/CLAUDE.md b/CLAUDE.md
new file mode 100644
index 0000000..db3fc2a
--- /dev/null
+++ b/CLAUDE.md
@@ -0,0 +1,269 @@
+# CLAUDE.md
+
+This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.
+
+## Project Overview
+
+**NestJS tRPC** is a library that integrates tRPC into the NestJS framework using an opinionated, decorator-based approach that aligns with NestJS conventions. It provides end-to-end typesafety for APIs with automatic AppRouter generation and full dependency injection support.
+
+## Development Commands
+
+### Build & Development
+```bash
+# Build all packages (uses TypeScript project references)
+bun run build
+
+# Build nestjs-trpc package only
+cd packages/nestjs-trpc && bun run build
+
+# Watch mode for development
+cd packages/nestjs-trpc && bun run start:dev
+
+# Debug with Node inspector
+cd packages/nestjs-trpc && bun run debug:dev
+
+# Clean build artifacts
+bun run clean
+```
+
+### Testing
+```bash
+# Run all tests (workspace-wide)
+bun test
+
+# Run tests for nestjs-trpc package only
+cd packages/nestjs-trpc && bun test
+
+# Run tests with coverage
+cd packages/nestjs-trpc && bun test --coverage
+
+# Run related tests for changed files (used by lint-staged)
+bun test --bail --findRelatedTests
+```
+
+### Linting & Formatting
+```bash
+# Lint and auto-fix
+bun run lint
+
+# Lint without fixing (CI mode)
+bun run lint --no-fix
+
+# Format code
+bun run format
+```
+
+### Running Examples
+```bash
+# Run Express example
+cd examples/nestjs-express && bun run start:dev
+
+# Run Fastify example
+cd examples/nestjs-fastify && bun run start:dev
+
+# Run Next.js example (client-side)
+cd examples/nextjs-trpc && bun run dev
+```
+
+### Git Workflow
+- Commits use conventional commits enforced by commitlint
+- Allowed types: `build`, `chore`, `ci`, `docs`, `feat`, `fix`, `perf`, `refactor`, `revert`, `style`, `test`, `sample`
+- Lint-staged runs on pre-commit: prettier, eslint, and related tests
+- Tests must pass for affected files before committing
+
+## Architecture
+
+### Core Concepts
+
+The library follows a factory-based architecture where decorators mark classes and methods, then factories extract metadata at runtime to build the tRPC router:
+
+1. **Decorators** (`lib/decorators/`) - Metadata markers for routers and procedures:
+ - `@Router()` - Marks classes as tRPC routers, stores file path and optional alias
+ - `@Query()` / `@Mutation()` - Marks methods as tRPC procedures with input/output schemas
+ - `@UseMiddlewares()` - Attaches middleware to routers or procedures
+ - `@Context()` / `@RawInput()` - Parameter decorators for dependency injection
+
+2. **Factories** (`lib/factories/`) - Extract metadata and build tRPC structures:
+ - `RouterFactory` - Scans NestJS modules to find `@Router()` classes via reflection
+ - `ProcedureFactory` - Extracts `@Query()` and `@Mutation()` methods from router instances
+ - `MiddlewareFactory` - Processes `@UseMiddlewares()` metadata
+ - `TRPCFactory` - Top-level orchestrator that calls `RouterFactory.serializeRoutes()`
+
+3. **Generators** (`lib/generators/`) - TypeScript code generation for client types:
+ - `TRPCGenerator` - Main entry point, orchestrates schema file generation
+ - `RouterGenerator` - Generates router type definitions from metadata
+ - `ProcedureGenerator` - Generates procedure type definitions with input/output schemas
+ - `MiddlewareGenerator` / `ContextGenerator` - Generate context type augmentations
+ - Uses `ts-morph` to build TypeScript AST and write generated files
+
+4. **Scanners** (`lib/scanners/`) - File system and import analysis:
+ - `FileScanner` - Resolves caller file paths from stack traces
+ - `ImportsScanner` - Builds import dependency maps using `ts-morph`
+
+5. **Drivers** (`lib/drivers/`) - HTTP adapter integration:
+ - `ExpressDriver` - Integrates with Express via `@trpc/server/adapters/express`
+ - `FastifyDriver` - Integrates with Fastify via `@trpc/server/adapters/fastify`
+ - Auto-detected based on NestJS HttpAdapter
+
+### Runtime Flow
+
+1. **Module Initialization** (`TRPCModule.forRoot()`):
+ - Accepts `TRPCModuleOptions` including `autoSchemaFile` path
+ - If `autoSchemaFile` is provided, registers `GeneratorModule` for code generation
+ - Registers core providers: factories, drivers, `AppRouterHost`
+
+2. **Application Bootstrap** (`onModuleInit`):
+ - `TRPCDriver.start()` initializes tRPC with `initTRPC.context().create()`
+ - `TRPCFactory.serializeAppRoutes()` calls `RouterFactory` to build the router tree
+ - Generated `appRouter` stored in `AppRouterHost` (injectable singleton)
+ - Appropriate driver (Express/Fastify) mounts the router at `basePath` (default: `/trpc`)
+
+3. **Schema Generation** (if `autoSchemaFile` enabled):
+ - `TRPCGenerator.generateSchemaFile()` runs after module init
+ - Scans all routers/procedures, extracts Zod schemas and return types
+ - Generates TypeScript file with `export type AppRouter = typeof appRouter`
+ - Clients import this type for end-to-end typesafety
+
+### Key Design Patterns
+
+- **Reflection-based Discovery**: Uses `Reflect.getMetadata()` to find decorated classes/methods across all NestJS modules
+- **Metadata Keys** (`lib/trpc.constants.ts`): `ROUTER_METADATA_KEY`, `MIDDLEWARES_KEY`, etc.
+- **Lazy Router Construction**: Routers built at runtime from discovered metadata, not compile-time
+- **DI Integration**: Router/middleware instances resolved from NestJS DI container
+- **File Path Tracking**: Each `@Router()` stores its source file path for import resolution during generation
+
+## Monorepo Structure
+
+This is a **Bun workspaces** monorepo with the following structure:
+
+- **`packages/nestjs-trpc/`** - Main library package published to npm
+ - `lib/` - Source code (decorators, factories, generators, drivers, etc.)
+ - `dist/` - Compiled output
+
+- **`examples/`** - Integration examples demonstrating library usage
+ - `nestjs-express/` - Example using Express adapter
+ - `nestjs-fastify/` - Example using Fastify adapter
+ - `nextjs-trpc/` - Next.js client consuming tRPC endpoints
+
+- **`docs/`** - Documentation website (https://nestjs-trpc.io)
+
+- **Build System**: Uses TypeScript project references for efficient incremental compilation
+ - Root `tsconfig.json` files coordinate workspace builds
+ - Each package/example has its own `tsconfig.json` and `tsconfig.build.json`
+ - Build command: `tsc -b -v packages`
+
+## Testing
+
+- **Framework**: Jest with ts-jest preset
+- **Location**: Tests co-located in `__tests__` directories next to source files
+- **Config**: Uses `tsconfig.spec.json` with `ignoreCodes: [151001]` for TS diagnostics
+- **Coverage**: Enabled by default with `--coverage` flag
+- **Patterns**: `**/__tests__/**/*.ts`, `**/*.spec.ts`, `**/*.test.ts`
+
+## Important Implementation Notes
+
+1. **ts-morph Usage**: The generator heavily relies on `ts-morph` (TypeScript compiler API wrapper) to parse source files and build import maps. Changes to decorator metadata must be reflected in the corresponding generator.
+
+2. **Runtime vs Codegen**: The library has two distinct code paths:
+ - **Runtime**: Factories build the actual tRPC router from decorated classes
+ - **Codegen**: Generators analyze the same decorators to emit TypeScript types
+ These must stay in sync - a change to how a decorator works requires updating both.
+
+3. **Import Resolution**: `ImportsScanner` builds a map from class/type names to their source file paths by traversing import statements. This enables the generator to write correct import statements in generated files. If imports are missing, check `buildSourceFileImportsMap()` logic.
+
+4. **File Path Tracking**: `FileScanner.getCallerFilePath()` uses stack traces to determine where decorators are applied. This is fragile - avoid deeply nested decorator factories or the path resolution may break.
+
+5. **NestJS Module Scanning**: `RouterFactory.getRouters()` iterates `ModulesContainer` to find providers. Routers must be registered as providers in a NestJS module or they won't be discovered.
+
+6. **v11 Migration Note**: Comment in `router.factory.ts:102` indicates the `router()` wrapping call needs removal for tRPC v11 compatibility.
+
+## Coding Principles
+
+### Comments Philosophy
+
+**If code needs "how" or "what" comments to be understood, it's a sign the code needs refactoring.**
+
+Guidelines:
+- ✅ **Self-documenting code** - Use clear naming, proper abstractions, and logical structure
+- ✅ **"Why" comments only** - Explain non-obvious decisions, constraints, or trade-offs
+- ❌ **No "how" comments** - Don't explain step-by-step what the code does
+- ❌ **No "what" comments** - Don't describe what a function/variable is (the name should do that)
+- 🔧 **Refactor unclear code** - If you need to explain how/what, refactor instead
+
+Examples:
+```typescript
+// ❌ BAD - "what" comment
+// This function gets the user by ID
+function getUserById(id: string) { ... }
+
+// ❌ BAD - "how" comment
+// This function:
+// 1. Validates the input
+// 2. Queries the database
+// 3. Transforms the result
+function processUser(data) { ... }
+
+// ✅ GOOD - "why" comment
+// Using setTimeout instead of setImmediate because Node.js
+// event loop phases cause race conditions with DB connections
+setTimeout(checkConnection, 0);
+
+// ✅ GOOD - no comment needed, self-documenting
+function getUserById(id: string) { ... }
+function validateAndTransformUser(rawData: unknown): User { ... }
+```
+
+This principle applies to both the TypeScript library code and the Rust CLI.
+
+### File Size Limits
+
+**Keep files focused and maintainable by limiting file size to ~200-300 lines of production code.**
+
+Guidelines:
+- ✅ **Target: 200-300 lines** - Aim for files in this range (excluding tests)
+- ✅ **Split at logical boundaries** - Break large files into cohesive submodules
+- ✅ **Single Responsibility** - Each file should have one clear purpose
+- ❌ **Avoid mega-files** - Files over 500 lines are usually doing too much
+- 🔧 **Refactor when needed** - If a file grows beyond 300 lines, look for natural split points
+
+When counting:
+- Count only production code (exclude tests in `#[cfg(test)]` blocks)
+- Blank lines and imports don't count toward cognitive load
+- Focus on keeping the logic focused and navigable
+
+Example structure:
+```
+parser/
+├── mod.rs (~150 lines) - Public API + core orchestration
+├── router.rs (~220 lines) - Router extraction logic
+├── procedure.rs (~200 lines)- Procedure extraction logic
+└── schema/
+ ├── mod.rs (~150 lines) - Schema public API
+ ├── flatten.rs (~200 lines)- Flattening logic
+ └── traverse.rs (~200 lines)- AST traversal
+```
+
+This guideline applies primarily to the Rust CLI. TypeScript files can be larger if needed.
+
+## Package Manager
+
+- This project uses **Bun** as specified in `packageManager` field
+- `bun.lock` contains dependency lock information
+- Bun provides fast package installation and native TypeScript/JSX support
+
+## Publishing
+
+The library uses Lerna for version management and publishing:
+
+```bash
+# Prepare release (builds and copies changelog)
+bun run prepublish:npm
+
+# Publish to npm
+bun run publish:npm
+
+# Publish next/canary version
+bun run publish:next
+```
+
+The library is published as `nestjs-trpc` on npm with the main entry point at `./dist/index.js`.
diff --git a/README.md b/README.md
index a404515..814e8ee 100644
--- a/README.md
+++ b/README.md
@@ -34,13 +34,13 @@
## Features
-- ✅ Supports most tRPC features out of the box with more to come.
-- 🧙 Full static typesafety & autocompletion on the client, for inputs, outputs, and errors.
-- 🙀 Implements the Nestjs opinionated approach to how tRPC works.
-- ⚡️ Same client-side DX - We generate the AppRouter on the fly.
-- 🔋 Examples are available in the ./examples folder.
-- 📦 Out of the box support for **Dependency Injection** within the routes and procedures.
-- 👀 Native support for `express`, `fastify`, and `zod` with more drivers to come!
+- Fast Rust-based CLI for type generation with rich error messages
+- Full static typesafety & autocompletion on the client, for inputs, outputs, and errors
+- Implements the NestJS opinionated approach to how tRPC works
+- Watch mode for auto-regeneration during development
+- Out of the box support for **Dependency Injection** within the routes and procedures
+- Native support for `express`, `fastify`, and `zod` with more drivers to come
+- Examples are available in the ./examples folder
## Quickstart
@@ -49,6 +49,9 @@
To install **NestJS tRPC** with your preferred package manager, you can use any of the following commands:
```shell
+# bun
+bun add nestjs-trpc zod @trpc/server
+
# npm
npm install nestjs-trpc zod @trpc/server
@@ -59,6 +62,18 @@ pnpm add nestjs-trpc zod @trpc/server
yarn add nestjs-trpc zod @trpc/server
```
+### Generate Types
+
+Run the CLI to generate your AppRouter types:
+
+```shell
+# Generate types (one-time)
+npx nestjs-trpc generate
+
+# Watch mode for development
+npx nestjs-trpc watch
+```
+
## How to use
Here's a brief example demonstrating how to use the decorators available in **NestJS tRPC**:
@@ -110,3 +125,7 @@ class UserRouter {
+
+## Release Process
+
+For maintainers, see [Release Checklist](./docs/docs/RELEASE_CHECKLIST.md) for the v2.0.0 release process.
diff --git a/bun.lock b/bun.lock
new file mode 100644
index 0000000..9c82d06
--- /dev/null
+++ b/bun.lock
@@ -0,0 +1,4729 @@
+{
+ "lockfileVersion": 1,
+ "configVersion": 1,
+ "workspaces": {
+ "": {
+ "name": "nestjs-trpc-workspace",
+ "devDependencies": {
+ "@commitlint/cli": "^19.4.0",
+ "@commitlint/config-conventional": "^19.2.2",
+ "@commitlint/prompt-cli": "^19.3.1",
+ "@eslint/eslintrc": "^3.1.0",
+ "@eslint/js": "^9.11.1",
+ "@nestjs/cli": "^9.3.0",
+ "@nestjs/common": "10.4.1",
+ "@nestjs/core": "10.4.1",
+ "@nestjs/testing": "10.4.1",
+ "@release-it-plugins/workspaces": "^4.2.0",
+ "@release-it/conventional-changelog": "^8.0.1",
+ "@types/jest": "29.5.12",
+ "@types/node": "20.14.11",
+ "@typescript-eslint/eslint-plugin": "^8.2.0",
+ "@typescript-eslint/parser": "^8.2.0",
+ "conventional-changelog-conventionalcommits": "^8.0.0",
+ "eslint": "9.7.0",
+ "eslint-config-prettier": "9.1.0",
+ "eslint-plugin-import": "^2.29.1",
+ "eslint-plugin-prettier": "5.2.1",
+ "globals": "^15.9.0",
+ "husky": "^9.1.5",
+ "jest": "^29.7.0",
+ "lint-staged": "15.2.7",
+ "pinst": "^3.0.0",
+ "prettier": "^3.3.3",
+ "release-it": "17.1.1",
+ "rimraf": "^4.4.1",
+ "ts-jest": "29.2.3",
+ "tsconfig-paths": "^4.2.0",
+ "typescript": "^5.5.4",
+ },
+ },
+ "docs": {
+ "name": "nestjs-trpc.io",
+ "version": "1.0.0",
+ "dependencies": {
+ "@stackblitz/sdk": "^1.11.0",
+ "@uidotdev/usehooks": "^2.4.1",
+ "@vercel/analytics": "^1.3.1",
+ "clsx": "^2.1.1",
+ "framer-motion": "^11.2.13",
+ "geist": "^1.3.0",
+ "lucide-react": "^0.401.0",
+ "next": "14.2.4",
+ "nextra": "^2.13.4",
+ "nextra-theme-docs": "^2.13.4",
+ "react": "^18",
+ "react-dom": "^18",
+ },
+ "devDependencies": {
+ "@svgr/webpack": "^8.1.0",
+ "@types/node": "^20.14.10",
+ "@types/react": "^18",
+ "@types/react-dom": "^18",
+ "autoprefixer": "^10.4.19",
+ "eslint": "^8.57.0",
+ "eslint-config-next": "^14.2.6",
+ "next-sitemap": "^4.2.3",
+ "postcss": "^8",
+ "rimraf": "^6.0.1",
+ "tailwindcss": "^3.4.1",
+ "typescript": "^5",
+ },
+ },
+ "examples/nestjs-express": {
+ "name": "example-nestjs-express",
+ "version": "1.0.0",
+ "dependencies": {
+ "@nestjs/common": "10.4.1",
+ "@nestjs/config": "^3.0.0",
+ "@nestjs/core": "10.4.1",
+ "@nestjs/platform-express": "10.4.1",
+ "@trpc/server": "^11.0.0",
+ "nestjs-trpc": "workspace:*",
+ "reflect-metadata": "^0.1.13",
+ "rxjs": "^7.2.0",
+ "zod": "^3.21.4",
+ },
+ "devDependencies": {
+ "@nestjs/cli": "10.4.4",
+ "@nestjs/schematics": "^10.1.2",
+ "@nestjs/testing": "10.4.1",
+ "@swc/cli": "^0.4.0",
+ "@swc/core": "^1.7.18",
+ "@types/express": "^4.17.17",
+ "@types/jest": "^29.5.0",
+ "@types/node": "^22.5.0",
+ "@types/supertest": "^6.0.0",
+ "chokidar": "^3.6.0",
+ "jest": "^29.7.0",
+ "supertest": "^7.0.0",
+ "trpc-panel": "^1.3.4",
+ "ts-jest": "^29.2.0",
+ "ts-morph": "^23.0.0",
+ "ts-node": "^10.9.1",
+ "tsconfig-paths": "^4.2.0",
+ "tslib": "^2.5.0",
+ "typescript": "^5.0.3",
+ },
+ },
+ "examples/nestjs-fastify": {
+ "name": "example-nestjs-fastify",
+ "version": "1.0.0",
+ "dependencies": {
+ "@nestjs/common": "10.4.1",
+ "@nestjs/config": "^3.0.0",
+ "@nestjs/core": "10.4.1",
+ "@nestjs/platform-fastify": "^10.4.4",
+ "@trpc/server": "^11.0.0",
+ "fastify": "^5.0.0",
+ "nestjs-trpc": "workspace:*",
+ "reflect-metadata": "^0.1.13",
+ "rxjs": "^7.2.0",
+ "zod": "^3.21.4",
+ },
+ "devDependencies": {
+ "@nestjs/cli": "10.4.4",
+ "@nestjs/schematics": "^10.1.2",
+ "@nestjs/testing": "10.4.1",
+ "@swc/cli": "^0.4.0",
+ "@swc/core": "^1.7.18",
+ "@types/jest": "^29.5.0",
+ "@types/node": "^22.5.0",
+ "@types/supertest": "^6.0.0",
+ "chokidar": "^3.6.0",
+ "jest": "^29.7.0",
+ "supertest": "^7.0.0",
+ "trpc-panel": "^1.3.4",
+ "ts-jest": "^29.2.0",
+ "ts-morph": "^23.0.0",
+ "ts-node": "^10.9.1",
+ "tsconfig-paths": "^4.2.0",
+ "tslib": "^2.5.0",
+ "typescript": "^5.0.3",
+ },
+ },
+ "examples/nextjs-trpc": {
+ "name": "web",
+ "version": "0.1.0",
+ "dependencies": {
+ "@trpc/client": "^11.0.0",
+ "@trpc/server": "^11.0.0",
+ "next": "13.4.7",
+ "react": "18.2.0",
+ "react-dom": "18.2.0",
+ },
+ "devDependencies": {
+ "@types/node": "18.11.18",
+ "@types/react": "18.2.14",
+ "@types/react-dom": "18.2.6",
+ "autoprefixer": "10.4.14",
+ "postcss": "8.4.24",
+ "tailwindcss": "3.3.2",
+ "typescript": "^4.7.4",
+ },
+ },
+ "packages/nestjs-trpc": {
+ "name": "nestjs-trpc",
+ "version": "1.6.1",
+ "bin": {
+ "nestjs-trpc": "./bin/nestjs-trpc.js",
+ },
+ "dependencies": {
+ "lodash": "^4.17.21",
+ "tslib": "^2.5.0",
+ },
+ "devDependencies": {
+ "@nestjs/common": "10.4.1",
+ "@nestjs/core": "10.4.1",
+ "@nestjs/testing": "10.4.1",
+ "@trpc/server": "^11.0.0",
+ "@types/express": "^4.17.17",
+ "@types/jest": "^29.5.12",
+ "@types/lodash": "^4.17.5",
+ "@types/node": "^22.5.0",
+ "fastify": "^5.0.0",
+ "jest": "^29.7.0",
+ "reflect-metadata": "0.1.13",
+ "rxjs": "7.8.1",
+ "ts-jest": "^29.2.5",
+ "ts-node": "10.9.2",
+ "tsconfig-paths": "^4.2.0",
+ "type-fest": "^4.21.0",
+ "typescript": "5.5.3",
+ "zod": "^3.14.4",
+ },
+ "peerDependencies": {
+ "@nestjs/common": "^9.3.8 || ^10.0.0",
+ "@nestjs/core": "^9.3.8 || ^10.0.0",
+ "@trpc/server": "^11.0.0",
+ "reflect-metadata": "^0.1.13 || ^0.2.0",
+ "rxjs": "7.8.1",
+ "zod": "^3.14.0",
+ },
+ },
+ },
+ "overrides": {
+ "@nestjs/common": "10.4.1",
+ "@nestjs/core": "10.4.1",
+ "@nestjs/testing": "10.4.1",
+ },
+ "packages": {
+ "@alloc/quick-lru": ["@alloc/quick-lru@5.2.0", "", {}, "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw=="],
+
+ "@angular-devkit/core": ["@angular-devkit/core@16.0.1", "", { "dependencies": { "ajv": "8.12.0", "ajv-formats": "2.1.1", "jsonc-parser": "3.2.0", "rxjs": "7.8.1", "source-map": "0.7.4" }, "peerDependencies": { "chokidar": "^3.5.2" }, "optionalPeers": ["chokidar"] }, "sha512-2uz98IqkKJlgnHbWQ7VeL4pb+snGAZXIama2KXi+k9GsRntdcw+udX8rL3G9SdUGUF+m6+147Y1oRBMHsO/v4w=="],
+
+ "@angular-devkit/schematics": ["@angular-devkit/schematics@16.0.1", "", { "dependencies": { "@angular-devkit/core": "16.0.1", "jsonc-parser": "3.2.0", "magic-string": "0.30.0", "ora": "5.4.1", "rxjs": "7.8.1" } }, "sha512-A9D0LTYmiqiBa90GKcSuWb7hUouGIbm/AHbJbjL85WLLRbQA2PwKl7P5Mpd6nS/ZC0kfG4VQY3VOaDvb3qpI9g=="],
+
+ "@angular-devkit/schematics-cli": ["@angular-devkit/schematics-cli@16.0.1", "", { "dependencies": { "@angular-devkit/core": "16.0.1", "@angular-devkit/schematics": "16.0.1", "ansi-colors": "4.1.3", "inquirer": "8.2.4", "symbol-observable": "4.0.0", "yargs-parser": "21.1.1" }, "bin": { "schematics": "bin/schematics.js" } }, "sha512-6KLA125dpgd6oJGtiO2JpZAb92uOG3njQGIt7NFcuQGW/5GO7J41vMXH9cBAfdtbV8SIggSmR/cIEE9ijfj6YQ=="],
+
+ "@babel/code-frame": ["@babel/code-frame@7.28.6", "", { "dependencies": { "@babel/helper-validator-identifier": "^7.28.5", "js-tokens": "^4.0.0", "picocolors": "^1.1.1" } }, "sha512-JYgintcMjRiCvS8mMECzaEn+m3PfoQiyqukOMCCVQtoJGYJw8j/8LBJEiqkHLkfwCcs74E3pbAUFNg7d9VNJ+Q=="],
+
+ "@babel/compat-data": ["@babel/compat-data@7.28.6", "", {}, "sha512-2lfu57JtzctfIrcGMz992hyLlByuzgIk58+hhGCxjKZ3rWI82NnVLjXcaTqkI2NvlcvOskZaiZ5kjUALo3Lpxg=="],
+
+ "@babel/core": ["@babel/core@7.28.6", "", { "dependencies": { "@babel/code-frame": "^7.28.6", "@babel/generator": "^7.28.6", "@babel/helper-compilation-targets": "^7.28.6", "@babel/helper-module-transforms": "^7.28.6", "@babel/helpers": "^7.28.6", "@babel/parser": "^7.28.6", "@babel/template": "^7.28.6", "@babel/traverse": "^7.28.6", "@babel/types": "^7.28.6", "@jridgewell/remapping": "^2.3.5", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", "json5": "^2.2.3", "semver": "^6.3.1" } }, "sha512-H3mcG6ZDLTlYfaSNi0iOKkigqMFvkTKlGUYlD8GW7nNOYRrevuA46iTypPyv+06V3fEmvvazfntkBU34L0azAw=="],
+
+ "@babel/generator": ["@babel/generator@7.28.6", "", { "dependencies": { "@babel/parser": "^7.28.6", "@babel/types": "^7.28.6", "@jridgewell/gen-mapping": "^0.3.12", "@jridgewell/trace-mapping": "^0.3.28", "jsesc": "^3.0.2" } }, "sha512-lOoVRwADj8hjf7al89tvQ2a1lf53Z+7tiXMgpZJL3maQPDxh0DgLMN62B2MKUOFcoodBHLMbDM6WAbKgNy5Suw=="],
+
+ "@babel/helper-annotate-as-pure": ["@babel/helper-annotate-as-pure@7.27.3", "", { "dependencies": { "@babel/types": "^7.27.3" } }, "sha512-fXSwMQqitTGeHLBC08Eq5yXz2m37E4pJX1qAU1+2cNedz/ifv/bVXft90VeSav5nFO61EcNgwr0aJxbyPaWBPg=="],
+
+ "@babel/helper-compilation-targets": ["@babel/helper-compilation-targets@7.28.6", "", { "dependencies": { "@babel/compat-data": "^7.28.6", "@babel/helper-validator-option": "^7.27.1", "browserslist": "^4.24.0", "lru-cache": "^5.1.1", "semver": "^6.3.1" } }, "sha512-JYtls3hqi15fcx5GaSNL7SCTJ2MNmjrkHXg4FSpOA/grxK8KwyZ5bubHsCq8FXCkua6xhuaaBit+3b7+VZRfcA=="],
+
+ "@babel/helper-create-class-features-plugin": ["@babel/helper-create-class-features-plugin@7.28.6", "", { "dependencies": { "@babel/helper-annotate-as-pure": "^7.27.3", "@babel/helper-member-expression-to-functions": "^7.28.5", "@babel/helper-optimise-call-expression": "^7.27.1", "@babel/helper-replace-supers": "^7.28.6", "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", "@babel/traverse": "^7.28.6", "semver": "^6.3.1" }, "peerDependencies": { "@babel/core": "^7.0.0" } }, "sha512-dTOdvsjnG3xNT9Y0AUg1wAl38y+4Rl4sf9caSQZOXdNqVn+H+HbbJ4IyyHaIqNR6SW9oJpA/RuRjsjCw2IdIow=="],
+
+ "@babel/helper-create-regexp-features-plugin": ["@babel/helper-create-regexp-features-plugin@7.28.5", "", { "dependencies": { "@babel/helper-annotate-as-pure": "^7.27.3", "regexpu-core": "^6.3.1", "semver": "^6.3.1" }, "peerDependencies": { "@babel/core": "^7.0.0" } }, "sha512-N1EhvLtHzOvj7QQOUCCS3NrPJP8c5W6ZXCHDn7Yialuy1iu4r5EmIYkXlKNqT99Ciw+W0mDqWoR6HWMZlFP3hw=="],
+
+ "@babel/helper-define-polyfill-provider": ["@babel/helper-define-polyfill-provider@0.6.5", "", { "dependencies": { "@babel/helper-compilation-targets": "^7.27.2", "@babel/helper-plugin-utils": "^7.27.1", "debug": "^4.4.1", "lodash.debounce": "^4.0.8", "resolve": "^1.22.10" }, "peerDependencies": { "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" } }, "sha512-uJnGFcPsWQK8fvjgGP5LZUZZsYGIoPeRjSF5PGwrelYgq7Q15/Ft9NGFp1zglwgIv//W0uG4BevRuSJRyylZPg=="],
+
+ "@babel/helper-globals": ["@babel/helper-globals@7.28.0", "", {}, "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw=="],
+
+ "@babel/helper-member-expression-to-functions": ["@babel/helper-member-expression-to-functions@7.28.5", "", { "dependencies": { "@babel/traverse": "^7.28.5", "@babel/types": "^7.28.5" } }, "sha512-cwM7SBRZcPCLgl8a7cY0soT1SptSzAlMH39vwiRpOQkJlh53r5hdHwLSCZpQdVLT39sZt+CRpNwYG4Y2v77atg=="],
+
+ "@babel/helper-module-imports": ["@babel/helper-module-imports@7.28.6", "", { "dependencies": { "@babel/traverse": "^7.28.6", "@babel/types": "^7.28.6" } }, "sha512-l5XkZK7r7wa9LucGw9LwZyyCUscb4x37JWTPz7swwFE/0FMQAGpiWUZn8u9DzkSBWEcK25jmvubfpw2dnAMdbw=="],
+
+ "@babel/helper-module-transforms": ["@babel/helper-module-transforms@7.28.6", "", { "dependencies": { "@babel/helper-module-imports": "^7.28.6", "@babel/helper-validator-identifier": "^7.28.5", "@babel/traverse": "^7.28.6" }, "peerDependencies": { "@babel/core": "^7.0.0" } }, "sha512-67oXFAYr2cDLDVGLXTEABjdBJZ6drElUSI7WKp70NrpyISso3plG9SAGEF6y7zbha/wOzUByWWTJvEDVNIUGcA=="],
+
+ "@babel/helper-optimise-call-expression": ["@babel/helper-optimise-call-expression@7.27.1", "", { "dependencies": { "@babel/types": "^7.27.1" } }, "sha512-URMGH08NzYFhubNSGJrpUEphGKQwMQYBySzat5cAByY1/YgIRkULnIy3tAMeszlL/so2HbeilYloUmSpd7GdVw=="],
+
+ "@babel/helper-plugin-utils": ["@babel/helper-plugin-utils@7.28.6", "", {}, "sha512-S9gzZ/bz83GRysI7gAD4wPT/AI3uCnY+9xn+Mx/KPs2JwHJIz1W8PZkg2cqyt3RNOBM8ejcXhV6y8Og7ly/Dug=="],
+
+ "@babel/helper-remap-async-to-generator": ["@babel/helper-remap-async-to-generator@7.27.1", "", { "dependencies": { "@babel/helper-annotate-as-pure": "^7.27.1", "@babel/helper-wrap-function": "^7.27.1", "@babel/traverse": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0" } }, "sha512-7fiA521aVw8lSPeI4ZOD3vRFkoqkJcS+z4hFo82bFSH/2tNd6eJ5qCVMS5OzDmZh/kaHQeBaeyxK6wljcPtveA=="],
+
+ "@babel/helper-replace-supers": ["@babel/helper-replace-supers@7.28.6", "", { "dependencies": { "@babel/helper-member-expression-to-functions": "^7.28.5", "@babel/helper-optimise-call-expression": "^7.27.1", "@babel/traverse": "^7.28.6" }, "peerDependencies": { "@babel/core": "^7.0.0" } }, "sha512-mq8e+laIk94/yFec3DxSjCRD2Z0TAjhVbEJY3UQrlwVo15Lmt7C2wAUbK4bjnTs4APkwsYLTahXRraQXhb1WCg=="],
+
+ "@babel/helper-skip-transparent-expression-wrappers": ["@babel/helper-skip-transparent-expression-wrappers@7.27.1", "", { "dependencies": { "@babel/traverse": "^7.27.1", "@babel/types": "^7.27.1" } }, "sha512-Tub4ZKEXqbPjXgWLl2+3JpQAYBJ8+ikpQ2Ocj/q/r0LwE3UhENh7EUabyHjz2kCEsrRY83ew2DQdHluuiDQFzg=="],
+
+ "@babel/helper-string-parser": ["@babel/helper-string-parser@7.27.1", "", {}, "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA=="],
+
+ "@babel/helper-validator-identifier": ["@babel/helper-validator-identifier@7.28.5", "", {}, "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q=="],
+
+ "@babel/helper-validator-option": ["@babel/helper-validator-option@7.27.1", "", {}, "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg=="],
+
+ "@babel/helper-wrap-function": ["@babel/helper-wrap-function@7.28.6", "", { "dependencies": { "@babel/template": "^7.28.6", "@babel/traverse": "^7.28.6", "@babel/types": "^7.28.6" } }, "sha512-z+PwLziMNBeSQJonizz2AGnndLsP2DeGHIxDAn+wdHOGuo4Fo1x1HBPPXeE9TAOPHNNWQKCSlA2VZyYyyibDnQ=="],
+
+ "@babel/helpers": ["@babel/helpers@7.28.6", "", { "dependencies": { "@babel/template": "^7.28.6", "@babel/types": "^7.28.6" } }, "sha512-xOBvwq86HHdB7WUDTfKfT/Vuxh7gElQ+Sfti2Cy6yIWNW05P8iUslOVcZ4/sKbE+/jQaukQAdz/gf3724kYdqw=="],
+
+ "@babel/parser": ["@babel/parser@7.28.6", "", { "dependencies": { "@babel/types": "^7.28.6" }, "bin": "./bin/babel-parser.js" }, "sha512-TeR9zWR18BvbfPmGbLampPMW+uW1NZnJlRuuHso8i87QZNq2JRF9i6RgxRqtEq+wQGsS19NNTWr2duhnE49mfQ=="],
+
+ "@babel/plugin-bugfix-firefox-class-in-computed-class-key": ["@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.28.5", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1", "@babel/traverse": "^7.28.5" }, "peerDependencies": { "@babel/core": "^7.0.0" } }, "sha512-87GDMS3tsmMSi/3bWOte1UblL+YUTFMV8SZPZ2eSEL17s74Cw/l63rR6NmGVKMYW2GYi85nE+/d6Hw5N0bEk2Q=="],
+
+ "@babel/plugin-bugfix-safari-class-field-initializer-scope": ["@babel/plugin-bugfix-safari-class-field-initializer-scope@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0" } }, "sha512-qNeq3bCKnGgLkEXUuFry6dPlGfCdQNZbn7yUAPCInwAJHMU7THJfrBSozkcWq5sNM6RcF3S8XyQL2A52KNR9IA=="],
+
+ "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": ["@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0" } }, "sha512-g4L7OYun04N1WyqMNjldFwlfPCLVkgB54A/YCXICZYBsvJJE3kByKv9c9+R/nAfmIfjl2rKYLNyMHboYbZaWaA=="],
+
+ "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": ["@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1", "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", "@babel/plugin-transform-optional-chaining": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.13.0" } }, "sha512-oO02gcONcD5O1iTLi/6frMJBIwWEHceWGSGqrpCmEL8nogiS6J9PBlE48CaK20/Jx1LuRml9aDftLgdjXT8+Cw=="],
+
+ "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": ["@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.28.6", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.28.6", "@babel/traverse": "^7.28.6" }, "peerDependencies": { "@babel/core": "^7.0.0" } }, "sha512-a0aBScVTlNaiUe35UtfxAN7A/tehvvG4/ByO6+46VPKTRSlfnAFsgKy0FUh+qAkQrDTmhDkT+IBOKlOoMUxQ0g=="],
+
+ "@babel/plugin-proposal-private-property-in-object": ["@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2", "", { "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w=="],
+
+ "@babel/plugin-syntax-async-generators": ["@babel/plugin-syntax-async-generators@7.8.4", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw=="],
+
+ "@babel/plugin-syntax-bigint": ["@babel/plugin-syntax-bigint@7.8.3", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg=="],
+
+ "@babel/plugin-syntax-class-properties": ["@babel/plugin-syntax-class-properties@7.12.13", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.12.13" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA=="],
+
+ "@babel/plugin-syntax-class-static-block": ["@babel/plugin-syntax-class-static-block@7.14.5", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.14.5" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw=="],
+
+ "@babel/plugin-syntax-import-assertions": ["@babel/plugin-syntax-import-assertions@7.28.6", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.28.6" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-pSJUpFHdx9z5nqTSirOCMtYVP2wFgoWhP0p3g8ONK/4IHhLIBd0B9NYqAvIUAhq+OkhO4VM1tENCt0cjlsNShw=="],
+
+ "@babel/plugin-syntax-import-attributes": ["@babel/plugin-syntax-import-attributes@7.28.6", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.28.6" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-jiLC0ma9XkQT3TKJ9uYvlakm66Pamywo+qwL+oL8HJOvc6TWdZXVfhqJr8CCzbSGUAbDOzlGHJC1U+vRfLQDvw=="],
+
+ "@babel/plugin-syntax-import-meta": ["@babel/plugin-syntax-import-meta@7.10.4", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.10.4" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g=="],
+
+ "@babel/plugin-syntax-json-strings": ["@babel/plugin-syntax-json-strings@7.8.3", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA=="],
+
+ "@babel/plugin-syntax-jsx": ["@babel/plugin-syntax-jsx@7.28.6", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.28.6" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-wgEmr06G6sIpqr8YDwA2dSRTE3bJ+V0IfpzfSY3Lfgd7YWOaAdlykvJi13ZKBt8cZHfgH1IXN+CL656W3uUa4w=="],
+
+ "@babel/plugin-syntax-logical-assignment-operators": ["@babel/plugin-syntax-logical-assignment-operators@7.10.4", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.10.4" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig=="],
+
+ "@babel/plugin-syntax-nullish-coalescing-operator": ["@babel/plugin-syntax-nullish-coalescing-operator@7.8.3", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ=="],
+
+ "@babel/plugin-syntax-numeric-separator": ["@babel/plugin-syntax-numeric-separator@7.10.4", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.10.4" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug=="],
+
+ "@babel/plugin-syntax-object-rest-spread": ["@babel/plugin-syntax-object-rest-spread@7.8.3", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA=="],
+
+ "@babel/plugin-syntax-optional-catch-binding": ["@babel/plugin-syntax-optional-catch-binding@7.8.3", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q=="],
+
+ "@babel/plugin-syntax-optional-chaining": ["@babel/plugin-syntax-optional-chaining@7.8.3", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg=="],
+
+ "@babel/plugin-syntax-private-property-in-object": ["@babel/plugin-syntax-private-property-in-object@7.14.5", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.14.5" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg=="],
+
+ "@babel/plugin-syntax-top-level-await": ["@babel/plugin-syntax-top-level-await@7.14.5", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.14.5" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw=="],
+
+ "@babel/plugin-syntax-typescript": ["@babel/plugin-syntax-typescript@7.28.6", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.28.6" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-+nDNmQye7nlnuuHDboPbGm00Vqg3oO8niRRL27/4LYHUsHYh0zJ1xWOz0uRwNFmM1Avzk8wZbc6rdiYhomzv/A=="],
+
+ "@babel/plugin-syntax-unicode-sets-regex": ["@babel/plugin-syntax-unicode-sets-regex@7.18.6", "", { "dependencies": { "@babel/helper-create-regexp-features-plugin": "^7.18.6", "@babel/helper-plugin-utils": "^7.18.6" }, "peerDependencies": { "@babel/core": "^7.0.0" } }, "sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg=="],
+
+ "@babel/plugin-transform-arrow-functions": ["@babel/plugin-transform-arrow-functions@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-8Z4TGic6xW70FKThA5HYEKKyBpOOsucTOD1DjU3fZxDg+K3zBJcXMFnt/4yQiZnf5+MiOMSXQ9PaEK/Ilh1DeA=="],
+
+ "@babel/plugin-transform-async-generator-functions": ["@babel/plugin-transform-async-generator-functions@7.28.6", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.28.6", "@babel/helper-remap-async-to-generator": "^7.27.1", "@babel/traverse": "^7.28.6" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-9knsChgsMzBV5Yh3kkhrZNxH3oCYAfMBkNNaVN4cP2RVlFPe8wYdwwcnOsAbkdDoV9UjFtOXWrWB52M8W4jNeA=="],
+
+ "@babel/plugin-transform-async-to-generator": ["@babel/plugin-transform-async-to-generator@7.28.6", "", { "dependencies": { "@babel/helper-module-imports": "^7.28.6", "@babel/helper-plugin-utils": "^7.28.6", "@babel/helper-remap-async-to-generator": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-ilTRcmbuXjsMmcZ3HASTe4caH5Tpo93PkTxF9oG2VZsSWsahydmcEHhix9Ik122RcTnZnUzPbmux4wh1swfv7g=="],
+
+ "@babel/plugin-transform-block-scoped-functions": ["@babel/plugin-transform-block-scoped-functions@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-cnqkuOtZLapWYZUYM5rVIdv1nXYuFVIltZ6ZJ7nIj585QsjKM5dhL2Fu/lICXZ1OyIAFc7Qy+bvDAtTXqGrlhg=="],
+
+ "@babel/plugin-transform-block-scoping": ["@babel/plugin-transform-block-scoping@7.28.6", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.28.6" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-tt/7wOtBmwHPNMPu7ax4pdPz6shjFrmHDghvNC+FG9Qvj7D6mJcoRQIF5dy4njmxR941l6rgtvfSB2zX3VlUIw=="],
+
+ "@babel/plugin-transform-class-properties": ["@babel/plugin-transform-class-properties@7.28.6", "", { "dependencies": { "@babel/helper-create-class-features-plugin": "^7.28.6", "@babel/helper-plugin-utils": "^7.28.6" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-dY2wS3I2G7D697VHndN91TJr8/AAfXQNt5ynCTI/MpxMsSzHp+52uNivYT5wCPax3whc47DR8Ba7cmlQMg24bw=="],
+
+ "@babel/plugin-transform-class-static-block": ["@babel/plugin-transform-class-static-block@7.28.6", "", { "dependencies": { "@babel/helper-create-class-features-plugin": "^7.28.6", "@babel/helper-plugin-utils": "^7.28.6" }, "peerDependencies": { "@babel/core": "^7.12.0" } }, "sha512-rfQ++ghVwTWTqQ7w8qyDxL1XGihjBss4CmTgGRCTAC9RIbhVpyp4fOeZtta0Lbf+dTNIVJer6ych2ibHwkZqsQ=="],
+
+ "@babel/plugin-transform-classes": ["@babel/plugin-transform-classes@7.28.6", "", { "dependencies": { "@babel/helper-annotate-as-pure": "^7.27.3", "@babel/helper-compilation-targets": "^7.28.6", "@babel/helper-globals": "^7.28.0", "@babel/helper-plugin-utils": "^7.28.6", "@babel/helper-replace-supers": "^7.28.6", "@babel/traverse": "^7.28.6" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-EF5KONAqC5zAqT783iMGuM2ZtmEBy+mJMOKl2BCvPZ2lVrwvXnB6o+OBWCS+CoeCCpVRF2sA2RBKUxvT8tQT5Q=="],
+
+ "@babel/plugin-transform-computed-properties": ["@babel/plugin-transform-computed-properties@7.28.6", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.28.6", "@babel/template": "^7.28.6" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-bcc3k0ijhHbc2lEfpFHgx7eYw9KNXqOerKWfzbxEHUGKnS3sz9C4CNL9OiFN1297bDNfUiSO7DaLzbvHQQQ1BQ=="],
+
+ "@babel/plugin-transform-destructuring": ["@babel/plugin-transform-destructuring@7.28.5", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1", "@babel/traverse": "^7.28.5" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-Kl9Bc6D0zTUcFUvkNuQh4eGXPKKNDOJQXVyyM4ZAQPMveniJdxi8XMJwLo+xSoW3MIq81bD33lcUe9kZpl0MCw=="],
+
+ "@babel/plugin-transform-dotall-regex": ["@babel/plugin-transform-dotall-regex@7.28.6", "", { "dependencies": { "@babel/helper-create-regexp-features-plugin": "^7.28.5", "@babel/helper-plugin-utils": "^7.28.6" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-SljjowuNKB7q5Oayv4FoPzeB74g3QgLt8IVJw9ADvWy3QnUb/01aw8I4AVv8wYnPvQz2GDDZ/g3GhcNyDBI4Bg=="],
+
+ "@babel/plugin-transform-duplicate-keys": ["@babel/plugin-transform-duplicate-keys@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-MTyJk98sHvSs+cvZ4nOauwTTG1JeonDjSGvGGUNHreGQns+Mpt6WX/dVzWBHgg+dYZhkC4X+zTDfkTU+Vy9y7Q=="],
+
+ "@babel/plugin-transform-duplicate-named-capturing-groups-regex": ["@babel/plugin-transform-duplicate-named-capturing-groups-regex@7.28.6", "", { "dependencies": { "@babel/helper-create-regexp-features-plugin": "^7.28.5", "@babel/helper-plugin-utils": "^7.28.6" }, "peerDependencies": { "@babel/core": "^7.0.0" } }, "sha512-5suVoXjC14lUN6ZL9OLKIHCNVWCrqGqlmEp/ixdXjvgnEl/kauLvvMO/Xw9NyMc95Joj1AeLVPVMvibBgSoFlA=="],
+
+ "@babel/plugin-transform-dynamic-import": ["@babel/plugin-transform-dynamic-import@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-MHzkWQcEmjzzVW9j2q8LGjwGWpG2mjwaaB0BNQwst3FIjqsg8Ct/mIZlvSPJvfi9y2AC8mi/ktxbFVL9pZ1I4A=="],
+
+ "@babel/plugin-transform-explicit-resource-management": ["@babel/plugin-transform-explicit-resource-management@7.28.6", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.28.6", "@babel/plugin-transform-destructuring": "^7.28.5" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-Iao5Konzx2b6g7EPqTy40UZbcdXE126tTxVFr/nAIj+WItNxjKSYTEw3RC+A2/ZetmdJsgueL1KhaMCQHkLPIg=="],
+
+ "@babel/plugin-transform-exponentiation-operator": ["@babel/plugin-transform-exponentiation-operator@7.28.6", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.28.6" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-WitabqiGjV/vJ0aPOLSFfNY1u9U3R7W36B03r5I2KoNix+a3sOhJ3pKFB3R5It9/UiK78NiO0KE9P21cMhlPkw=="],
+
+ "@babel/plugin-transform-export-namespace-from": ["@babel/plugin-transform-export-namespace-from@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-tQvHWSZ3/jH2xuq/vZDy0jNn+ZdXJeM8gHvX4lnJmsc3+50yPlWdZXIc5ay+umX+2/tJIqHqiEqcJvxlmIvRvQ=="],
+
+ "@babel/plugin-transform-for-of": ["@babel/plugin-transform-for-of@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1", "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-BfbWFFEJFQzLCQ5N8VocnCtA8J1CLkNTe2Ms2wocj75dd6VpiqS5Z5quTYcUoo4Yq+DN0rtikODccuv7RU81sw=="],
+
+ "@babel/plugin-transform-function-name": ["@babel/plugin-transform-function-name@7.27.1", "", { "dependencies": { "@babel/helper-compilation-targets": "^7.27.1", "@babel/helper-plugin-utils": "^7.27.1", "@babel/traverse": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-1bQeydJF9Nr1eBCMMbC+hdwmRlsv5XYOMu03YSWFwNs0HsAmtSxxF1fyuYPqemVldVyFmlCU7w8UE14LupUSZQ=="],
+
+ "@babel/plugin-transform-json-strings": ["@babel/plugin-transform-json-strings@7.28.6", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.28.6" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-Nr+hEN+0geQkzhbdgQVPoqr47lZbm+5fCUmO70722xJZd0Mvb59+33QLImGj6F+DkK3xgDi1YVysP8whD6FQAw=="],
+
+ "@babel/plugin-transform-literals": ["@babel/plugin-transform-literals@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-0HCFSepIpLTkLcsi86GG3mTUzxV5jpmbv97hTETW3yzrAij8aqlD36toB1D0daVFJM8NK6GvKO0gslVQmm+zZA=="],
+
+ "@babel/plugin-transform-logical-assignment-operators": ["@babel/plugin-transform-logical-assignment-operators@7.28.6", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.28.6" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-+anKKair6gpi8VsM/95kmomGNMD0eLz1NQ8+Pfw5sAwWH9fGYXT50E55ZpV0pHUHWf6IUTWPM+f/7AAff+wr9A=="],
+
+ "@babel/plugin-transform-member-expression-literals": ["@babel/plugin-transform-member-expression-literals@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-hqoBX4dcZ1I33jCSWcXrP+1Ku7kdqXf1oeah7ooKOIiAdKQ+uqftgCFNOSzA5AMS2XIHEYeGFg4cKRCdpxzVOQ=="],
+
+ "@babel/plugin-transform-modules-amd": ["@babel/plugin-transform-modules-amd@7.27.1", "", { "dependencies": { "@babel/helper-module-transforms": "^7.27.1", "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-iCsytMg/N9/oFq6n+gFTvUYDZQOMK5kEdeYxmxt91fcJGycfxVP9CnrxoliM0oumFERba2i8ZtwRUCMhvP1LnA=="],
+
+ "@babel/plugin-transform-modules-commonjs": ["@babel/plugin-transform-modules-commonjs@7.28.6", "", { "dependencies": { "@babel/helper-module-transforms": "^7.28.6", "@babel/helper-plugin-utils": "^7.28.6" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-jppVbf8IV9iWWwWTQIxJMAJCWBuuKx71475wHwYytrRGQ2CWiDvYlADQno3tcYpS/T2UUWFQp3nVtYfK/YBQrA=="],
+
+ "@babel/plugin-transform-modules-systemjs": ["@babel/plugin-transform-modules-systemjs@7.28.5", "", { "dependencies": { "@babel/helper-module-transforms": "^7.28.3", "@babel/helper-plugin-utils": "^7.27.1", "@babel/helper-validator-identifier": "^7.28.5", "@babel/traverse": "^7.28.5" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-vn5Jma98LCOeBy/KpeQhXcV2WZgaRUtjwQmjoBuLNlOmkg0fB5pdvYVeWRYI69wWKwK2cD1QbMiUQnoujWvrew=="],
+
+ "@babel/plugin-transform-modules-umd": ["@babel/plugin-transform-modules-umd@7.27.1", "", { "dependencies": { "@babel/helper-module-transforms": "^7.27.1", "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-iQBE/xC5BV1OxJbp6WG7jq9IWiD+xxlZhLrdwpPkTX3ydmXdvoCpyfJN7acaIBZaOqTfr76pgzqBJflNbeRK+w=="],
+
+ "@babel/plugin-transform-named-capturing-groups-regex": ["@babel/plugin-transform-named-capturing-groups-regex@7.27.1", "", { "dependencies": { "@babel/helper-create-regexp-features-plugin": "^7.27.1", "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0" } }, "sha512-SstR5JYy8ddZvD6MhV0tM/j16Qds4mIpJTOd1Yu9J9pJjH93bxHECF7pgtc28XvkzTD6Pxcm/0Z73Hvk7kb3Ng=="],
+
+ "@babel/plugin-transform-new-target": ["@babel/plugin-transform-new-target@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-f6PiYeqXQ05lYq3TIfIDu/MtliKUbNwkGApPUvyo6+tc7uaR4cPjPe7DFPr15Uyycg2lZU6btZ575CuQoYh7MQ=="],
+
+ "@babel/plugin-transform-nullish-coalescing-operator": ["@babel/plugin-transform-nullish-coalescing-operator@7.28.6", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.28.6" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-3wKbRgmzYbw24mDJXT7N+ADXw8BC/imU9yo9c9X9NKaLF1fW+e5H1U5QjMUBe4Qo4Ox/o++IyUkl1sVCLgevKg=="],
+
+ "@babel/plugin-transform-numeric-separator": ["@babel/plugin-transform-numeric-separator@7.28.6", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.28.6" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-SJR8hPynj8outz+SlStQSwvziMN4+Bq99it4tMIf5/Caq+3iOc0JtKyse8puvyXkk3eFRIA5ID/XfunGgO5i6w=="],
+
+ "@babel/plugin-transform-object-rest-spread": ["@babel/plugin-transform-object-rest-spread@7.28.6", "", { "dependencies": { "@babel/helper-compilation-targets": "^7.28.6", "@babel/helper-plugin-utils": "^7.28.6", "@babel/plugin-transform-destructuring": "^7.28.5", "@babel/plugin-transform-parameters": "^7.27.7", "@babel/traverse": "^7.28.6" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-5rh+JR4JBC4pGkXLAcYdLHZjXudVxWMXbB6u6+E9lRL5TrGVbHt1TjxGbZ8CkmYw9zjkB7jutzOROArsqtncEA=="],
+
+ "@babel/plugin-transform-object-super": ["@babel/plugin-transform-object-super@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1", "@babel/helper-replace-supers": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-SFy8S9plRPbIcxlJ8A6mT/CxFdJx/c04JEctz4jf8YZaVS2px34j7NXRrlGlHkN/M2gnpL37ZpGRGVFLd3l8Ng=="],
+
+ "@babel/plugin-transform-optional-catch-binding": ["@babel/plugin-transform-optional-catch-binding@7.28.6", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.28.6" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-R8ja/Pyrv0OGAvAXQhSTmWyPJPml+0TMqXlO5w+AsMEiwb2fg3WkOvob7UxFSL3OIttFSGSRFKQsOhJ/X6HQdQ=="],
+
+ "@babel/plugin-transform-optional-chaining": ["@babel/plugin-transform-optional-chaining@7.28.6", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.28.6", "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-A4zobikRGJTsX9uqVFdafzGkqD30t26ck2LmOzAuLL8b2x6k3TIqRiT2xVvA9fNmFeTX484VpsdgmKNA0bS23w=="],
+
+ "@babel/plugin-transform-parameters": ["@babel/plugin-transform-parameters@7.27.7", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-qBkYTYCb76RRxUM6CcZA5KRu8K4SM8ajzVeUgVdMVO9NN9uI/GaVmBg/WKJJGnNokV9SY8FxNOVWGXzqzUidBg=="],
+
+ "@babel/plugin-transform-private-methods": ["@babel/plugin-transform-private-methods@7.28.6", "", { "dependencies": { "@babel/helper-create-class-features-plugin": "^7.28.6", "@babel/helper-plugin-utils": "^7.28.6" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-piiuapX9CRv7+0st8lmuUlRSmX6mBcVeNQ1b4AYzJxfCMuBfB0vBXDiGSmm03pKJw1v6cZ8KSeM+oUnM6yAExg=="],
+
+ "@babel/plugin-transform-private-property-in-object": ["@babel/plugin-transform-private-property-in-object@7.28.6", "", { "dependencies": { "@babel/helper-annotate-as-pure": "^7.27.3", "@babel/helper-create-class-features-plugin": "^7.28.6", "@babel/helper-plugin-utils": "^7.28.6" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-b97jvNSOb5+ehyQmBpmhOCiUC5oVK4PMnpRvO7+ymFBoqYjeDHIU9jnrNUuwHOiL9RpGDoKBpSViarV+BU+eVA=="],
+
+ "@babel/plugin-transform-property-literals": ["@babel/plugin-transform-property-literals@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-oThy3BCuCha8kDZ8ZkgOg2exvPYUlprMukKQXI1r1pJ47NCvxfkEy8vK+r/hT9nF0Aa4H1WUPZZjHTFtAhGfmQ=="],
+
+ "@babel/plugin-transform-react-constant-elements": ["@babel/plugin-transform-react-constant-elements@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-edoidOjl/ZxvYo4lSBOQGDSyToYVkTAwyVoa2tkuYTSmjrB1+uAedoL5iROVLXkxH+vRgA7uP4tMg2pUJpZ3Ug=="],
+
+ "@babel/plugin-transform-react-display-name": ["@babel/plugin-transform-react-display-name@7.28.0", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-D6Eujc2zMxKjfa4Zxl4GHMsmhKKZ9VpcqIchJLvwTxad9zWIYulwYItBovpDOoNLISpcZSXoDJ5gaGbQUDqViA=="],
+
+ "@babel/plugin-transform-react-jsx": ["@babel/plugin-transform-react-jsx@7.28.6", "", { "dependencies": { "@babel/helper-annotate-as-pure": "^7.27.3", "@babel/helper-module-imports": "^7.28.6", "@babel/helper-plugin-utils": "^7.28.6", "@babel/plugin-syntax-jsx": "^7.28.6", "@babel/types": "^7.28.6" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-61bxqhiRfAACulXSLd/GxqmAedUSrRZIu/cbaT18T1CetkTmtDN15it7i80ru4DVqRK1WMxQhXs+Lf9kajm5Ow=="],
+
+ "@babel/plugin-transform-react-jsx-development": ["@babel/plugin-transform-react-jsx-development@7.27.1", "", { "dependencies": { "@babel/plugin-transform-react-jsx": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-ykDdF5yI4f1WrAolLqeF3hmYU12j9ntLQl/AOG1HAS21jxyg1Q0/J/tpREuYLfatGdGmXp/3yS0ZA76kOlVq9Q=="],
+
+ "@babel/plugin-transform-react-pure-annotations": ["@babel/plugin-transform-react-pure-annotations@7.27.1", "", { "dependencies": { "@babel/helper-annotate-as-pure": "^7.27.1", "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-JfuinvDOsD9FVMTHpzA/pBLisxpv1aSf+OIV8lgH3MuWrks19R27e6a6DipIg4aX1Zm9Wpb04p8wljfKrVSnPA=="],
+
+ "@babel/plugin-transform-regenerator": ["@babel/plugin-transform-regenerator@7.28.6", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.28.6" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-eZhoEZHYQLL5uc1gS5e9/oTknS0sSSAtd5TkKMUp3J+S/CaUjagc0kOUPsEbDmMeva0nC3WWl4SxVY6+OBuxfw=="],
+
+ "@babel/plugin-transform-regexp-modifiers": ["@babel/plugin-transform-regexp-modifiers@7.28.6", "", { "dependencies": { "@babel/helper-create-regexp-features-plugin": "^7.28.5", "@babel/helper-plugin-utils": "^7.28.6" }, "peerDependencies": { "@babel/core": "^7.0.0" } }, "sha512-QGWAepm9qxpaIs7UM9FvUSnCGlb8Ua1RhyM4/veAxLwt3gMat/LSGrZixyuj4I6+Kn9iwvqCyPTtbdxanYoWYg=="],
+
+ "@babel/plugin-transform-reserved-words": ["@babel/plugin-transform-reserved-words@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-V2ABPHIJX4kC7HegLkYoDpfg9PVmuWy/i6vUM5eGK22bx4YVFD3M5F0QQnWQoDs6AGsUWTVOopBiMFQgHaSkVw=="],
+
+ "@babel/plugin-transform-shorthand-properties": ["@babel/plugin-transform-shorthand-properties@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-N/wH1vcn4oYawbJ13Y/FxcQrWk63jhfNa7jef0ih7PHSIHX2LB7GWE1rkPrOnka9kwMxb6hMl19p7lidA+EHmQ=="],
+
+ "@babel/plugin-transform-spread": ["@babel/plugin-transform-spread@7.28.6", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.28.6", "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-9U4QObUC0FtJl05AsUcodau/RWDytrU6uKgkxu09mLR9HLDAtUMoPuuskm5huQsoktmsYpI+bGmq+iapDcriKA=="],
+
+ "@babel/plugin-transform-sticky-regex": ["@babel/plugin-transform-sticky-regex@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-lhInBO5bi/Kowe2/aLdBAawijx+q1pQzicSgnkB6dUPc1+RC8QmJHKf2OjvU+NZWitguJHEaEmbV6VWEouT58g=="],
+
+ "@babel/plugin-transform-template-literals": ["@babel/plugin-transform-template-literals@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-fBJKiV7F2DxZUkg5EtHKXQdbsbURW3DZKQUWphDum0uRP6eHGGa/He9mc0mypL680pb+e/lDIthRohlv8NCHkg=="],
+
+ "@babel/plugin-transform-typeof-symbol": ["@babel/plugin-transform-typeof-symbol@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-RiSILC+nRJM7FY5srIyc4/fGIwUhyDuuBSdWn4y6yT6gm652DpCHZjIipgn6B7MQ1ITOUnAKWixEUjQRIBIcLw=="],
+
+ "@babel/plugin-transform-typescript": ["@babel/plugin-transform-typescript@7.28.6", "", { "dependencies": { "@babel/helper-annotate-as-pure": "^7.27.3", "@babel/helper-create-class-features-plugin": "^7.28.6", "@babel/helper-plugin-utils": "^7.28.6", "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", "@babel/plugin-syntax-typescript": "^7.28.6" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-0YWL2RFxOqEm9Efk5PvreamxPME8OyY0wM5wh5lHjF+VtVhdneCWGzZeSqzOfiobVqQaNCd2z0tQvnI9DaPWPw=="],
+
+ "@babel/plugin-transform-unicode-escapes": ["@babel/plugin-transform-unicode-escapes@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-Ysg4v6AmF26k9vpfFuTZg8HRfVWzsh1kVfowA23y9j/Gu6dOuahdUVhkLqpObp3JIv27MLSii6noRnuKN8H0Mg=="],
+
+ "@babel/plugin-transform-unicode-property-regex": ["@babel/plugin-transform-unicode-property-regex@7.28.6", "", { "dependencies": { "@babel/helper-create-regexp-features-plugin": "^7.28.5", "@babel/helper-plugin-utils": "^7.28.6" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-4Wlbdl/sIZjzi/8St0evF0gEZrgOswVO6aOzqxh1kDZOl9WmLrHq2HtGhnOJZmHZYKP8WZ1MDLCt5DAWwRo57A=="],
+
+ "@babel/plugin-transform-unicode-regex": ["@babel/plugin-transform-unicode-regex@7.27.1", "", { "dependencies": { "@babel/helper-create-regexp-features-plugin": "^7.27.1", "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-xvINq24TRojDuyt6JGtHmkVkrfVV3FPT16uytxImLeBZqW3/H52yN+kM1MGuyPkIQxrzKwPHs5U/MP3qKyzkGw=="],
+
+ "@babel/plugin-transform-unicode-sets-regex": ["@babel/plugin-transform-unicode-sets-regex@7.28.6", "", { "dependencies": { "@babel/helper-create-regexp-features-plugin": "^7.28.5", "@babel/helper-plugin-utils": "^7.28.6" }, "peerDependencies": { "@babel/core": "^7.0.0" } }, "sha512-/wHc/paTUmsDYN7SZkpWxogTOBNnlx7nBQYfy6JJlCT7G3mVhltk3e++N7zV0XfgGsrqBxd4rJQt9H16I21Y1Q=="],
+
+ "@babel/preset-env": ["@babel/preset-env@7.28.6", "", { "dependencies": { "@babel/compat-data": "^7.28.6", "@babel/helper-compilation-targets": "^7.28.6", "@babel/helper-plugin-utils": "^7.28.6", "@babel/helper-validator-option": "^7.27.1", "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.28.5", "@babel/plugin-bugfix-safari-class-field-initializer-scope": "^7.27.1", "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.27.1", "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.27.1", "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.28.6", "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2", "@babel/plugin-syntax-import-assertions": "^7.28.6", "@babel/plugin-syntax-import-attributes": "^7.28.6", "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", "@babel/plugin-transform-arrow-functions": "^7.27.1", "@babel/plugin-transform-async-generator-functions": "^7.28.6", "@babel/plugin-transform-async-to-generator": "^7.28.6", "@babel/plugin-transform-block-scoped-functions": "^7.27.1", "@babel/plugin-transform-block-scoping": "^7.28.6", "@babel/plugin-transform-class-properties": "^7.28.6", "@babel/plugin-transform-class-static-block": "^7.28.6", "@babel/plugin-transform-classes": "^7.28.6", "@babel/plugin-transform-computed-properties": "^7.28.6", "@babel/plugin-transform-destructuring": "^7.28.5", "@babel/plugin-transform-dotall-regex": "^7.28.6", "@babel/plugin-transform-duplicate-keys": "^7.27.1", "@babel/plugin-transform-duplicate-named-capturing-groups-regex": "^7.28.6", "@babel/plugin-transform-dynamic-import": "^7.27.1", "@babel/plugin-transform-explicit-resource-management": "^7.28.6", "@babel/plugin-transform-exponentiation-operator": "^7.28.6", "@babel/plugin-transform-export-namespace-from": "^7.27.1", "@babel/plugin-transform-for-of": "^7.27.1", "@babel/plugin-transform-function-name": "^7.27.1", "@babel/plugin-transform-json-strings": "^7.28.6", "@babel/plugin-transform-literals": "^7.27.1", "@babel/plugin-transform-logical-assignment-operators": "^7.28.6", "@babel/plugin-transform-member-expression-literals": "^7.27.1", "@babel/plugin-transform-modules-amd": "^7.27.1", "@babel/plugin-transform-modules-commonjs": "^7.28.6", "@babel/plugin-transform-modules-systemjs": "^7.28.5", "@babel/plugin-transform-modules-umd": "^7.27.1", "@babel/plugin-transform-named-capturing-groups-regex": "^7.27.1", "@babel/plugin-transform-new-target": "^7.27.1", "@babel/plugin-transform-nullish-coalescing-operator": "^7.28.6", "@babel/plugin-transform-numeric-separator": "^7.28.6", "@babel/plugin-transform-object-rest-spread": "^7.28.6", "@babel/plugin-transform-object-super": "^7.27.1", "@babel/plugin-transform-optional-catch-binding": "^7.28.6", "@babel/plugin-transform-optional-chaining": "^7.28.6", "@babel/plugin-transform-parameters": "^7.27.7", "@babel/plugin-transform-private-methods": "^7.28.6", "@babel/plugin-transform-private-property-in-object": "^7.28.6", "@babel/plugin-transform-property-literals": "^7.27.1", "@babel/plugin-transform-regenerator": "^7.28.6", "@babel/plugin-transform-regexp-modifiers": "^7.28.6", "@babel/plugin-transform-reserved-words": "^7.27.1", "@babel/plugin-transform-shorthand-properties": "^7.27.1", "@babel/plugin-transform-spread": "^7.28.6", "@babel/plugin-transform-sticky-regex": "^7.27.1", "@babel/plugin-transform-template-literals": "^7.27.1", "@babel/plugin-transform-typeof-symbol": "^7.27.1", "@babel/plugin-transform-unicode-escapes": "^7.27.1", "@babel/plugin-transform-unicode-property-regex": "^7.28.6", "@babel/plugin-transform-unicode-regex": "^7.27.1", "@babel/plugin-transform-unicode-sets-regex": "^7.28.6", "@babel/preset-modules": "0.1.6-no-external-plugins", "babel-plugin-polyfill-corejs2": "^0.4.14", "babel-plugin-polyfill-corejs3": "^0.13.0", "babel-plugin-polyfill-regenerator": "^0.6.5", "core-js-compat": "^3.43.0", "semver": "^6.3.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-GaTI4nXDrs7l0qaJ6Rg06dtOXTBCG6TMDB44zbqofCIC4PqC7SEvmFFtpxzCDw9W5aJ7RKVshgXTLvLdBFV/qw=="],
+
+ "@babel/preset-modules": ["@babel/preset-modules@0.1.6-no-external-plugins", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.0.0", "@babel/types": "^7.4.4", "esutils": "^2.0.2" }, "peerDependencies": { "@babel/core": "^7.0.0-0 || ^8.0.0-0 <8.0.0" } }, "sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA=="],
+
+ "@babel/preset-react": ["@babel/preset-react@7.28.5", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1", "@babel/helper-validator-option": "^7.27.1", "@babel/plugin-transform-react-display-name": "^7.28.0", "@babel/plugin-transform-react-jsx": "^7.27.1", "@babel/plugin-transform-react-jsx-development": "^7.27.1", "@babel/plugin-transform-react-pure-annotations": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-Z3J8vhRq7CeLjdC58jLv4lnZ5RKFUJWqH5emvxmv9Hv3BD1T9R/Im713R4MTKwvFaV74ejZ3sM01LyEKk4ugNQ=="],
+
+ "@babel/preset-typescript": ["@babel/preset-typescript@7.28.5", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1", "@babel/helper-validator-option": "^7.27.1", "@babel/plugin-syntax-jsx": "^7.27.1", "@babel/plugin-transform-modules-commonjs": "^7.27.1", "@babel/plugin-transform-typescript": "^7.28.5" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-+bQy5WOI2V6LJZpPVxY+yp66XdZ2yifu0Mc1aP5CQKgjn4QM5IN2i5fAZ4xKop47pr8rpVhiAeu+nDQa12C8+g=="],
+
+ "@babel/runtime": ["@babel/runtime@7.28.6", "", {}, "sha512-05WQkdpL9COIMz4LjTxGpPNCdlpyimKppYNoJ5Di5EUObifl8t4tuLuUBBZEpoLYOmfvIWrsp9fCl0HoPRVTdA=="],
+
+ "@babel/template": ["@babel/template@7.28.6", "", { "dependencies": { "@babel/code-frame": "^7.28.6", "@babel/parser": "^7.28.6", "@babel/types": "^7.28.6" } }, "sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ=="],
+
+ "@babel/traverse": ["@babel/traverse@7.28.6", "", { "dependencies": { "@babel/code-frame": "^7.28.6", "@babel/generator": "^7.28.6", "@babel/helper-globals": "^7.28.0", "@babel/parser": "^7.28.6", "@babel/template": "^7.28.6", "@babel/types": "^7.28.6", "debug": "^4.3.1" } }, "sha512-fgWX62k02qtjqdSNTAGxmKYY/7FSL9WAS1o2Hu5+I5m9T0yxZzr4cnrfXQ/MX0rIifthCSs6FKTlzYbJcPtMNg=="],
+
+ "@babel/types": ["@babel/types@7.28.6", "", { "dependencies": { "@babel/helper-string-parser": "^7.27.1", "@babel/helper-validator-identifier": "^7.28.5" } }, "sha512-0ZrskXVEHSWIqZM/sQZ4EV3jZJXRkio/WCxaqKZP1g//CEWEPSfeZFcms4XeKBCHU0ZKnIkdJeU/kF+eRp5lBg=="],
+
+ "@bcoe/v8-coverage": ["@bcoe/v8-coverage@0.2.3", "", {}, "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw=="],
+
+ "@braintree/sanitize-url": ["@braintree/sanitize-url@6.0.4", "", {}, "sha512-s3jaWicZd0pkP0jf5ysyHUI/RE7MHos6qlToFcGWXVp+ykHOy77OUMrfbgJ9it2C5bow7OIQwYYaHjk9XlBQ2A=="],
+
+ "@colors/colors": ["@colors/colors@1.5.0", "", {}, "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ=="],
+
+ "@commitlint/cli": ["@commitlint/cli@19.8.1", "", { "dependencies": { "@commitlint/format": "^19.8.1", "@commitlint/lint": "^19.8.1", "@commitlint/load": "^19.8.1", "@commitlint/read": "^19.8.1", "@commitlint/types": "^19.8.1", "tinyexec": "^1.0.0", "yargs": "^17.0.0" }, "bin": { "commitlint": "./cli.js" } }, "sha512-LXUdNIkspyxrlV6VDHWBmCZRtkEVRpBKxi2Gtw3J54cGWhLCTouVD/Q6ZSaSvd2YaDObWK8mDjrz3TIKtaQMAA=="],
+
+ "@commitlint/config-conventional": ["@commitlint/config-conventional@19.8.1", "", { "dependencies": { "@commitlint/types": "^19.8.1", "conventional-changelog-conventionalcommits": "^7.0.2" } }, "sha512-/AZHJL6F6B/G959CsMAzrPKKZjeEiAVifRyEwXxcT6qtqbPwGw+iQxmNS+Bu+i09OCtdNRW6pNpBvgPrtMr9EQ=="],
+
+ "@commitlint/config-validator": ["@commitlint/config-validator@19.8.1", "", { "dependencies": { "@commitlint/types": "^19.8.1", "ajv": "^8.11.0" } }, "sha512-0jvJ4u+eqGPBIzzSdqKNX1rvdbSU1lPNYlfQQRIFnBgLy26BtC0cFnr7c/AyuzExMxWsMOte6MkTi9I3SQ3iGQ=="],
+
+ "@commitlint/ensure": ["@commitlint/ensure@19.8.1", "", { "dependencies": { "@commitlint/types": "^19.8.1", "lodash.camelcase": "^4.3.0", "lodash.kebabcase": "^4.1.1", "lodash.snakecase": "^4.1.1", "lodash.startcase": "^4.4.0", "lodash.upperfirst": "^4.3.1" } }, "sha512-mXDnlJdvDzSObafjYrOSvZBwkD01cqB4gbnnFuVyNpGUM5ijwU/r/6uqUmBXAAOKRfyEjpkGVZxaDsCVnHAgyw=="],
+
+ "@commitlint/execute-rule": ["@commitlint/execute-rule@19.8.1", "", {}, "sha512-YfJyIqIKWI64Mgvn/sE7FXvVMQER/Cd+s3hZke6cI1xgNT/f6ZAz5heND0QtffH+KbcqAwXDEE1/5niYayYaQA=="],
+
+ "@commitlint/format": ["@commitlint/format@19.8.1", "", { "dependencies": { "@commitlint/types": "^19.8.1", "chalk": "^5.3.0" } }, "sha512-kSJj34Rp10ItP+Eh9oCItiuN/HwGQMXBnIRk69jdOwEW9llW9FlyqcWYbHPSGofmjsqeoxa38UaEA5tsbm2JWw=="],
+
+ "@commitlint/is-ignored": ["@commitlint/is-ignored@19.8.1", "", { "dependencies": { "@commitlint/types": "^19.8.1", "semver": "^7.6.0" } }, "sha512-AceOhEhekBUQ5dzrVhDDsbMaY5LqtN8s1mqSnT2Kz1ERvVZkNihrs3Sfk1Je/rxRNbXYFzKZSHaPsEJJDJV8dg=="],
+
+ "@commitlint/lint": ["@commitlint/lint@19.8.1", "", { "dependencies": { "@commitlint/is-ignored": "^19.8.1", "@commitlint/parse": "^19.8.1", "@commitlint/rules": "^19.8.1", "@commitlint/types": "^19.8.1" } }, "sha512-52PFbsl+1EvMuokZXLRlOsdcLHf10isTPlWwoY1FQIidTsTvjKXVXYb7AvtpWkDzRO2ZsqIgPK7bI98x8LRUEw=="],
+
+ "@commitlint/load": ["@commitlint/load@19.8.1", "", { "dependencies": { "@commitlint/config-validator": "^19.8.1", "@commitlint/execute-rule": "^19.8.1", "@commitlint/resolve-extends": "^19.8.1", "@commitlint/types": "^19.8.1", "chalk": "^5.3.0", "cosmiconfig": "^9.0.0", "cosmiconfig-typescript-loader": "^6.1.0", "lodash.isplainobject": "^4.0.6", "lodash.merge": "^4.6.2", "lodash.uniq": "^4.5.0" } }, "sha512-9V99EKG3u7z+FEoe4ikgq7YGRCSukAcvmKQuTtUyiYPnOd9a2/H9Ak1J9nJA1HChRQp9OA/sIKPugGS+FK/k1A=="],
+
+ "@commitlint/message": ["@commitlint/message@19.8.1", "", {}, "sha512-+PMLQvjRXiU+Ae0Wc+p99EoGEutzSXFVwQfa3jRNUZLNW5odZAyseb92OSBTKCu+9gGZiJASt76Cj3dLTtcTdg=="],
+
+ "@commitlint/parse": ["@commitlint/parse@19.8.1", "", { "dependencies": { "@commitlint/types": "^19.8.1", "conventional-changelog-angular": "^7.0.0", "conventional-commits-parser": "^5.0.0" } }, "sha512-mmAHYcMBmAgJDKWdkjIGq50X4yB0pSGpxyOODwYmoexxxiUCy5JJT99t1+PEMK7KtsCtzuWYIAXYAiKR+k+/Jw=="],
+
+ "@commitlint/prompt": ["@commitlint/prompt@19.8.1", "", { "dependencies": { "@commitlint/ensure": "^19.8.1", "@commitlint/load": "^19.8.1", "@commitlint/types": "^19.8.1", "chalk": "^5.3.0", "inquirer": "^9.2.15" } }, "sha512-IH3zJBJ2GSffgAJtW5EklK72skEAa3PZsbWQ5+Ybumd9QjKMnI9vagz5lprGRImdysaFREsMCOVpmcWjxpxPxg=="],
+
+ "@commitlint/prompt-cli": ["@commitlint/prompt-cli@19.8.1", "", { "dependencies": { "@commitlint/prompt": "^19.8.1", "inquirer": "^9.2.15", "tinyexec": "^1.0.0" }, "bin": { "commit": "./cli.js" } }, "sha512-rK92LywMpGKpBg730sRVRujUF3yP+xSLdfYpYSPK6jCbhVvTRPcBYVi3plIBR1VETto97+hN1HHTTpZsN8jSUA=="],
+
+ "@commitlint/read": ["@commitlint/read@19.8.1", "", { "dependencies": { "@commitlint/top-level": "^19.8.1", "@commitlint/types": "^19.8.1", "git-raw-commits": "^4.0.0", "minimist": "^1.2.8", "tinyexec": "^1.0.0" } }, "sha512-03Jbjb1MqluaVXKHKRuGhcKWtSgh3Jizqy2lJCRbRrnWpcM06MYm8th59Xcns8EqBYvo0Xqb+2DoZFlga97uXQ=="],
+
+ "@commitlint/resolve-extends": ["@commitlint/resolve-extends@19.8.1", "", { "dependencies": { "@commitlint/config-validator": "^19.8.1", "@commitlint/types": "^19.8.1", "global-directory": "^4.0.1", "import-meta-resolve": "^4.0.0", "lodash.mergewith": "^4.6.2", "resolve-from": "^5.0.0" } }, "sha512-GM0mAhFk49I+T/5UCYns5ayGStkTt4XFFrjjf0L4S26xoMTSkdCf9ZRO8en1kuopC4isDFuEm7ZOm/WRVeElVg=="],
+
+ "@commitlint/rules": ["@commitlint/rules@19.8.1", "", { "dependencies": { "@commitlint/ensure": "^19.8.1", "@commitlint/message": "^19.8.1", "@commitlint/to-lines": "^19.8.1", "@commitlint/types": "^19.8.1" } }, "sha512-Hnlhd9DyvGiGwjfjfToMi1dsnw1EXKGJNLTcsuGORHz6SS9swRgkBsou33MQ2n51/boIDrbsg4tIBbRpEWK2kw=="],
+
+ "@commitlint/to-lines": ["@commitlint/to-lines@19.8.1", "", {}, "sha512-98Mm5inzbWTKuZQr2aW4SReY6WUukdWXuZhrqf1QdKPZBCCsXuG87c+iP0bwtD6DBnmVVQjgp4whoHRVixyPBg=="],
+
+ "@commitlint/top-level": ["@commitlint/top-level@19.8.1", "", { "dependencies": { "find-up": "^7.0.0" } }, "sha512-Ph8IN1IOHPSDhURCSXBz44+CIu+60duFwRsg6HqaISFHQHbmBtxVw4ZrFNIYUzEP7WwrNPxa2/5qJ//NK1FGcw=="],
+
+ "@commitlint/types": ["@commitlint/types@19.8.1", "", { "dependencies": { "@types/conventional-commits-parser": "^5.0.0", "chalk": "^5.3.0" } }, "sha512-/yCrWGCoA1SVKOks25EGadP9Pnj0oAIHGpl2wH2M2Y46dPM2ueb8wyCVOD7O3WCTkaJ0IkKvzhl1JY7+uCT2Dw=="],
+
+ "@conventional-changelog/git-client": ["@conventional-changelog/git-client@1.0.1", "", { "dependencies": { "@types/semver": "^7.5.5", "semver": "^7.5.2" }, "peerDependencies": { "conventional-commits-filter": "^5.0.0", "conventional-commits-parser": "^6.0.0" }, "optionalPeers": ["conventional-commits-filter", "conventional-commits-parser"] }, "sha512-PJEqBwAleffCMETaVm/fUgHldzBE35JFk3/9LL6NUA5EXa3qednu+UT6M7E5iBu3zIQZCULYIiZ90fBYHt6xUw=="],
+
+ "@corex/deepmerge": ["@corex/deepmerge@4.0.43", "", {}, "sha512-N8uEMrMPL0cu/bdboEWpQYb/0i2K5Qn8eCsxzOmxSggJbbQte7ljMRoXm917AbntqTGOzdTu+vP3KOOzoC70HQ=="],
+
+ "@cspotcode/source-map-support": ["@cspotcode/source-map-support@0.8.1", "", { "dependencies": { "@jridgewell/trace-mapping": "0.3.9" } }, "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw=="],
+
+ "@emnapi/core": ["@emnapi/core@1.8.1", "", { "dependencies": { "@emnapi/wasi-threads": "1.1.0", "tslib": "^2.4.0" } }, "sha512-AvT9QFpxK0Zd8J0jopedNm+w/2fIzvtPKPjqyw9jwvBaReTTqPBk9Hixaz7KbjimP+QNz605/XnjFcDAL2pqBg=="],
+
+ "@emnapi/runtime": ["@emnapi/runtime@1.8.1", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-mehfKSMWjjNol8659Z8KxEMrdSJDDot5SXMq00dM8BN4o+CLNXQ0xH2V7EchNHV4RmbZLmmPdEaXZc5H2FXmDg=="],
+
+ "@emnapi/wasi-threads": ["@emnapi/wasi-threads@1.1.0", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-WI0DdZ8xFSbgMjR1sFsKABJ/C5OnRrjT06JXbZKexJGrDuPTzZdDYfFlsgcCXCyf+suG5QU2e/y1Wo2V/OapLQ=="],
+
+ "@eslint-community/eslint-utils": ["@eslint-community/eslint-utils@4.9.1", "", { "dependencies": { "eslint-visitor-keys": "^3.4.3" }, "peerDependencies": { "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" } }, "sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ=="],
+
+ "@eslint-community/regexpp": ["@eslint-community/regexpp@4.12.2", "", {}, "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew=="],
+
+ "@eslint/config-array": ["@eslint/config-array@0.17.1", "", { "dependencies": { "@eslint/object-schema": "^2.1.4", "debug": "^4.3.1", "minimatch": "^3.1.2" } }, "sha512-BlYOpej8AQ8Ev9xVqroV7a02JK3SkBAaN9GfMMH9W6Ch8FlQlkjGw4Ir7+FgYwfirivAf4t+GtzuAxqfukmISA=="],
+
+ "@eslint/eslintrc": ["@eslint/eslintrc@3.3.3", "", { "dependencies": { "ajv": "^6.12.4", "debug": "^4.3.2", "espree": "^10.0.1", "globals": "^14.0.0", "ignore": "^5.2.0", "import-fresh": "^3.2.1", "js-yaml": "^4.1.1", "minimatch": "^3.1.2", "strip-json-comments": "^3.1.1" } }, "sha512-Kr+LPIUVKz2qkx1HAMH8q1q6azbqBAsXJUxBl/ODDuVPX45Z9DfwB8tPjTi6nNZ8BuM3nbJxC5zCAg5elnBUTQ=="],
+
+ "@eslint/js": ["@eslint/js@9.39.2", "", {}, "sha512-q1mjIoW1VX4IvSocvM/vbTiveKC4k9eLrajNEuSsmjymSDEbpGddtpfOoN7YGAqBK3NG+uqo8ia4PDTt8buCYA=="],
+
+ "@eslint/object-schema": ["@eslint/object-schema@2.1.7", "", {}, "sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA=="],
+
+ "@fastify/ajv-compiler": ["@fastify/ajv-compiler@4.0.5", "", { "dependencies": { "ajv": "^8.12.0", "ajv-formats": "^3.0.1", "fast-uri": "^3.0.0" } }, "sha512-KoWKW+MhvfTRWL4qrhUwAAZoaChluo0m0vbiJlGMt2GXvL4LVPQEjt8kSpHI3IBq5Rez8fg+XeH3cneztq+C7A=="],
+
+ "@fastify/cors": ["@fastify/cors@9.0.1", "", { "dependencies": { "fastify-plugin": "^4.0.0", "mnemonist": "0.39.6" } }, "sha512-YY9Ho3ovI+QHIL2hW+9X4XqQjXLjJqsU+sMV/xFsxZkE8p3GNnYVFpoOxF7SsP5ZL76gwvbo3V9L+FIekBGU4Q=="],
+
+ "@fastify/error": ["@fastify/error@4.2.0", "", {}, "sha512-RSo3sVDXfHskiBZKBPRgnQTtIqpi/7zhJOEmAxCiBcM7d0uwdGdxLlsCaLzGs8v8NnxIRlfG0N51p5yFaOentQ=="],
+
+ "@fastify/fast-json-stringify-compiler": ["@fastify/fast-json-stringify-compiler@5.0.3", "", { "dependencies": { "fast-json-stringify": "^6.0.0" } }, "sha512-uik7yYHkLr6fxd8hJSZ8c+xF4WafPK+XzneQDPU+D10r5X19GW8lJcom2YijX2+qtFF1ENJlHXKFM9ouXNJYgQ=="],
+
+ "@fastify/formbody": ["@fastify/formbody@7.4.0", "", { "dependencies": { "fast-querystring": "^1.0.0", "fastify-plugin": "^4.0.0" } }, "sha512-H3C6h1GN56/SMrZS8N2vCT2cZr7mIHzBHzOBa5OPpjfB/D6FzP9mMpE02ZzrFX0ANeh0BAJdoXKOF2e7IbV+Og=="],
+
+ "@fastify/forwarded": ["@fastify/forwarded@3.0.1", "", {}, "sha512-JqDochHFqXs3C3Ml3gOY58zM7OqO9ENqPo0UqAjAjH8L01fRZqwX9iLeX34//kiJubF7r2ZQHtBRU36vONbLlw=="],
+
+ "@fastify/merge-json-schemas": ["@fastify/merge-json-schemas@0.2.1", "", { "dependencies": { "dequal": "^2.0.3" } }, "sha512-OA3KGBCy6KtIvLf8DINC5880o5iBlDX4SxzLQS8HorJAbqluzLRn80UXU0bxZn7UOFhFgpRJDasfwn9nG4FG4A=="],
+
+ "@fastify/middie": ["@fastify/middie@8.3.3", "", { "dependencies": { "@fastify/error": "^3.2.0", "fastify-plugin": "^4.0.0", "path-to-regexp": "^6.3.0", "reusify": "^1.0.4" } }, "sha512-+WHavMQr9CNTZoy2cjoDxoWp76kZ3JKjAtZj5sXNlxX5XBzHig0TeCPfPc+1+NQmliXtndT3PFwAjrQHE/6wnQ=="],
+
+ "@fastify/proxy-addr": ["@fastify/proxy-addr@5.1.0", "", { "dependencies": { "@fastify/forwarded": "^3.0.0", "ipaddr.js": "^2.1.0" } }, "sha512-INS+6gh91cLUjB+PVHfu1UqcB76Sqtpyp7bnL+FYojhjygvOPA9ctiD/JDKsyD9Xgu4hUhCSJBPig/w7duNajw=="],
+
+ "@headlessui/react": ["@headlessui/react@1.7.19", "", { "dependencies": { "@tanstack/react-virtual": "^3.0.0-beta.60", "client-only": "^0.0.1" }, "peerDependencies": { "react": "^16 || ^17 || ^18", "react-dom": "^16 || ^17 || ^18" } }, "sha512-Ll+8q3OlMJfJbAKM/+/Y2q6PPYbryqNTXDbryx7SXLIDamkF6iQFbriYHga0dY44PvDhvvBWCx1Xj4U5+G4hOw=="],
+
+ "@humanwhocodes/config-array": ["@humanwhocodes/config-array@0.13.0", "", { "dependencies": { "@humanwhocodes/object-schema": "^2.0.3", "debug": "^4.3.1", "minimatch": "^3.0.5" } }, "sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw=="],
+
+ "@humanwhocodes/module-importer": ["@humanwhocodes/module-importer@1.0.1", "", {}, "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA=="],
+
+ "@humanwhocodes/object-schema": ["@humanwhocodes/object-schema@2.0.3", "", {}, "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA=="],
+
+ "@humanwhocodes/retry": ["@humanwhocodes/retry@0.3.1", "", {}, "sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA=="],
+
+ "@hutson/parse-repository-url": ["@hutson/parse-repository-url@5.0.0", "", {}, "sha512-e5+YUKENATs1JgYHMzTr2MW/NDcXGfYFAuOQU8gJgF/kEh4EqKgfGrfLI67bMD4tbhZVlkigz/9YYwWcbOFthg=="],
+
+ "@iarna/toml": ["@iarna/toml@2.2.5", "", {}, "sha512-trnsAYxU3xnS1gPHPyU961coFyLkh4gAD/0zQ5mymY4yOZ+CYvsPqUbOFSw0aDM4y0tV7tiFxL/1XfXPNC6IPg=="],
+
+ "@inquirer/external-editor": ["@inquirer/external-editor@1.0.3", "", { "dependencies": { "chardet": "^2.1.1", "iconv-lite": "^0.7.0" }, "peerDependencies": { "@types/node": ">=18" }, "optionalPeers": ["@types/node"] }, "sha512-RWbSrDiYmO4LbejWY7ttpxczuwQyZLBUyygsA9Nsv95hpzUWwnNTVQmAq3xuh7vNwCp07UTmE5i11XAEExx4RA=="],
+
+ "@inquirer/figures": ["@inquirer/figures@1.0.15", "", {}, "sha512-t2IEY+unGHOzAaVM5Xx6DEWKeXlDDcNPeDyUpsRc6CUhBfU3VQOEl+Vssh7VNp1dR8MdUJBWhuObjXCsVpjN5g=="],
+
+ "@isaacs/balanced-match": ["@isaacs/balanced-match@4.0.1", "", {}, "sha512-yzMTt9lEb8Gv7zRioUilSglI0c0smZ9k5D65677DLWLtWJaXIS3CqcGyUFByYKlnUj6TkjLVs54fBl6+TiGQDQ=="],
+
+ "@isaacs/brace-expansion": ["@isaacs/brace-expansion@5.0.0", "", { "dependencies": { "@isaacs/balanced-match": "^4.0.1" } }, "sha512-ZT55BDLV0yv0RBm2czMiZ+SqCGO7AvmOM3G/w2xhVPH+te0aKgFjmBvGlL1dH+ql2tgGO3MVrbb3jCKyvpgnxA=="],
+
+ "@isaacs/cliui": ["@isaacs/cliui@8.0.2", "", { "dependencies": { "string-width": "^5.1.2", "string-width-cjs": "npm:string-width@^4.2.0", "strip-ansi": "^7.0.1", "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", "wrap-ansi": "^8.1.0", "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" } }, "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA=="],
+
+ "@istanbuljs/load-nyc-config": ["@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.13.1", "resolve-from": "^5.0.0" } }, "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ=="],
+
+ "@istanbuljs/schema": ["@istanbuljs/schema@0.1.3", "", {}, "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA=="],
+
+ "@jest/console": ["@jest/console@29.7.0", "", { "dependencies": { "@jest/types": "^29.6.3", "@types/node": "*", "chalk": "^4.0.0", "jest-message-util": "^29.7.0", "jest-util": "^29.7.0", "slash": "^3.0.0" } }, "sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg=="],
+
+ "@jest/core": ["@jest/core@29.7.0", "", { "dependencies": { "@jest/console": "^29.7.0", "@jest/reporters": "^29.7.0", "@jest/test-result": "^29.7.0", "@jest/transform": "^29.7.0", "@jest/types": "^29.6.3", "@types/node": "*", "ansi-escapes": "^4.2.1", "chalk": "^4.0.0", "ci-info": "^3.2.0", "exit": "^0.1.2", "graceful-fs": "^4.2.9", "jest-changed-files": "^29.7.0", "jest-config": "^29.7.0", "jest-haste-map": "^29.7.0", "jest-message-util": "^29.7.0", "jest-regex-util": "^29.6.3", "jest-resolve": "^29.7.0", "jest-resolve-dependencies": "^29.7.0", "jest-runner": "^29.7.0", "jest-runtime": "^29.7.0", "jest-snapshot": "^29.7.0", "jest-util": "^29.7.0", "jest-validate": "^29.7.0", "jest-watcher": "^29.7.0", "micromatch": "^4.0.4", "pretty-format": "^29.7.0", "slash": "^3.0.0", "strip-ansi": "^6.0.0" }, "peerDependencies": { "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" }, "optionalPeers": ["node-notifier"] }, "sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg=="],
+
+ "@jest/environment": ["@jest/environment@29.7.0", "", { "dependencies": { "@jest/fake-timers": "^29.7.0", "@jest/types": "^29.6.3", "@types/node": "*", "jest-mock": "^29.7.0" } }, "sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw=="],
+
+ "@jest/expect": ["@jest/expect@29.7.0", "", { "dependencies": { "expect": "^29.7.0", "jest-snapshot": "^29.7.0" } }, "sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ=="],
+
+ "@jest/expect-utils": ["@jest/expect-utils@29.7.0", "", { "dependencies": { "jest-get-type": "^29.6.3" } }, "sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA=="],
+
+ "@jest/fake-timers": ["@jest/fake-timers@29.7.0", "", { "dependencies": { "@jest/types": "^29.6.3", "@sinonjs/fake-timers": "^10.0.2", "@types/node": "*", "jest-message-util": "^29.7.0", "jest-mock": "^29.7.0", "jest-util": "^29.7.0" } }, "sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ=="],
+
+ "@jest/globals": ["@jest/globals@29.7.0", "", { "dependencies": { "@jest/environment": "^29.7.0", "@jest/expect": "^29.7.0", "@jest/types": "^29.6.3", "jest-mock": "^29.7.0" } }, "sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ=="],
+
+ "@jest/reporters": ["@jest/reporters@29.7.0", "", { "dependencies": { "@bcoe/v8-coverage": "^0.2.3", "@jest/console": "^29.7.0", "@jest/test-result": "^29.7.0", "@jest/transform": "^29.7.0", "@jest/types": "^29.6.3", "@jridgewell/trace-mapping": "^0.3.18", "@types/node": "*", "chalk": "^4.0.0", "collect-v8-coverage": "^1.0.0", "exit": "^0.1.2", "glob": "^7.1.3", "graceful-fs": "^4.2.9", "istanbul-lib-coverage": "^3.0.0", "istanbul-lib-instrument": "^6.0.0", "istanbul-lib-report": "^3.0.0", "istanbul-lib-source-maps": "^4.0.0", "istanbul-reports": "^3.1.3", "jest-message-util": "^29.7.0", "jest-util": "^29.7.0", "jest-worker": "^29.7.0", "slash": "^3.0.0", "string-length": "^4.0.1", "strip-ansi": "^6.0.0", "v8-to-istanbul": "^9.0.1" }, "peerDependencies": { "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" }, "optionalPeers": ["node-notifier"] }, "sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg=="],
+
+ "@jest/schemas": ["@jest/schemas@29.6.3", "", { "dependencies": { "@sinclair/typebox": "^0.27.8" } }, "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA=="],
+
+ "@jest/source-map": ["@jest/source-map@29.6.3", "", { "dependencies": { "@jridgewell/trace-mapping": "^0.3.18", "callsites": "^3.0.0", "graceful-fs": "^4.2.9" } }, "sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw=="],
+
+ "@jest/test-result": ["@jest/test-result@29.7.0", "", { "dependencies": { "@jest/console": "^29.7.0", "@jest/types": "^29.6.3", "@types/istanbul-lib-coverage": "^2.0.0", "collect-v8-coverage": "^1.0.0" } }, "sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA=="],
+
+ "@jest/test-sequencer": ["@jest/test-sequencer@29.7.0", "", { "dependencies": { "@jest/test-result": "^29.7.0", "graceful-fs": "^4.2.9", "jest-haste-map": "^29.7.0", "slash": "^3.0.0" } }, "sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw=="],
+
+ "@jest/transform": ["@jest/transform@29.7.0", "", { "dependencies": { "@babel/core": "^7.11.6", "@jest/types": "^29.6.3", "@jridgewell/trace-mapping": "^0.3.18", "babel-plugin-istanbul": "^6.1.1", "chalk": "^4.0.0", "convert-source-map": "^2.0.0", "fast-json-stable-stringify": "^2.1.0", "graceful-fs": "^4.2.9", "jest-haste-map": "^29.7.0", "jest-regex-util": "^29.6.3", "jest-util": "^29.7.0", "micromatch": "^4.0.4", "pirates": "^4.0.4", "slash": "^3.0.0", "write-file-atomic": "^4.0.2" } }, "sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw=="],
+
+ "@jest/types": ["@jest/types@29.6.3", "", { "dependencies": { "@jest/schemas": "^29.6.3", "@types/istanbul-lib-coverage": "^2.0.0", "@types/istanbul-reports": "^3.0.0", "@types/node": "*", "@types/yargs": "^17.0.8", "chalk": "^4.0.0" } }, "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw=="],
+
+ "@jridgewell/gen-mapping": ["@jridgewell/gen-mapping@0.3.13", "", { "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.0", "@jridgewell/trace-mapping": "^0.3.24" } }, "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA=="],
+
+ "@jridgewell/remapping": ["@jridgewell/remapping@2.3.5", "", { "dependencies": { "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.24" } }, "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ=="],
+
+ "@jridgewell/resolve-uri": ["@jridgewell/resolve-uri@3.1.2", "", {}, "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw=="],
+
+ "@jridgewell/source-map": ["@jridgewell/source-map@0.3.11", "", { "dependencies": { "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.25" } }, "sha512-ZMp1V8ZFcPG5dIWnQLr3NSI1MiCU7UETdS/A0G8V/XWHvJv3ZsFqutJn1Y5RPmAPX6F3BiE397OqveU/9NCuIA=="],
+
+ "@jridgewell/sourcemap-codec": ["@jridgewell/sourcemap-codec@1.5.5", "", {}, "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og=="],
+
+ "@jridgewell/trace-mapping": ["@jridgewell/trace-mapping@0.3.31", "", { "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" } }, "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw=="],
+
+ "@ljharb/through": ["@ljharb/through@2.3.14", "", { "dependencies": { "call-bind": "^1.0.8" } }, "sha512-ajBvlKpWucBB17FuQYUShqpqy8GRgYEpJW0vWJbUu1CV9lWyrDCapy0lScU8T8Z6qn49sSwJB3+M+evYIdGg+A=="],
+
+ "@lukeed/csprng": ["@lukeed/csprng@1.1.0", "", {}, "sha512-Z7C/xXCiGWsg0KuKsHTKJxbWhpI3Vs5GwLfOean7MGyVFGqdRgBbAjOCh6u4bbjPc/8MJ2pZmK/0DLdCbivLDA=="],
+
+ "@mdx-js/mdx": ["@mdx-js/mdx@2.3.0", "", { "dependencies": { "@types/estree-jsx": "^1.0.0", "@types/mdx": "^2.0.0", "estree-util-build-jsx": "^2.0.0", "estree-util-is-identifier-name": "^2.0.0", "estree-util-to-js": "^1.1.0", "estree-walker": "^3.0.0", "hast-util-to-estree": "^2.0.0", "markdown-extensions": "^1.0.0", "periscopic": "^3.0.0", "remark-mdx": "^2.0.0", "remark-parse": "^10.0.0", "remark-rehype": "^10.0.0", "unified": "^10.0.0", "unist-util-position-from-estree": "^1.0.0", "unist-util-stringify-position": "^3.0.0", "unist-util-visit": "^4.0.0", "vfile": "^5.0.0" } }, "sha512-jLuwRlz8DQfQNiUCJR50Y09CGPq3fLtmtUQfVrj79E0JWu3dvsVcxVIcfhR5h0iXu+/z++zDrYeiJqifRynJkA=="],
+
+ "@mdx-js/react": ["@mdx-js/react@2.3.0", "", { "dependencies": { "@types/mdx": "^2.0.0", "@types/react": ">=16" }, "peerDependencies": { "react": ">=16" } }, "sha512-zQH//gdOmuu7nt2oJR29vFhDv88oGPmVw6BggmrHeMI+xgEkp1B2dX9/bMBSYtK0dyLX/aOmesKS09g222K1/g=="],
+
+ "@mole-inc/bin-wrapper": ["@mole-inc/bin-wrapper@8.0.1", "", { "dependencies": { "bin-check": "^4.1.0", "bin-version-check": "^5.0.0", "content-disposition": "^0.5.4", "ext-name": "^5.0.0", "file-type": "^17.1.6", "filenamify": "^5.0.2", "got": "^11.8.5", "os-filter-obj": "^2.0.0" } }, "sha512-sTGoeZnjI8N4KS+sW2AN95gDBErhAguvkw/tWdCjeM8bvxpz5lqrnd0vOJABA1A+Ic3zED7PYoLP/RANLgVotA=="],
+
+ "@napi-rs/nice": ["@napi-rs/nice@1.1.1", "", { "optionalDependencies": { "@napi-rs/nice-android-arm-eabi": "1.1.1", "@napi-rs/nice-android-arm64": "1.1.1", "@napi-rs/nice-darwin-arm64": "1.1.1", "@napi-rs/nice-darwin-x64": "1.1.1", "@napi-rs/nice-freebsd-x64": "1.1.1", "@napi-rs/nice-linux-arm-gnueabihf": "1.1.1", "@napi-rs/nice-linux-arm64-gnu": "1.1.1", "@napi-rs/nice-linux-arm64-musl": "1.1.1", "@napi-rs/nice-linux-ppc64-gnu": "1.1.1", "@napi-rs/nice-linux-riscv64-gnu": "1.1.1", "@napi-rs/nice-linux-s390x-gnu": "1.1.1", "@napi-rs/nice-linux-x64-gnu": "1.1.1", "@napi-rs/nice-linux-x64-musl": "1.1.1", "@napi-rs/nice-openharmony-arm64": "1.1.1", "@napi-rs/nice-win32-arm64-msvc": "1.1.1", "@napi-rs/nice-win32-ia32-msvc": "1.1.1", "@napi-rs/nice-win32-x64-msvc": "1.1.1" } }, "sha512-xJIPs+bYuc9ASBl+cvGsKbGrJmS6fAKaSZCnT0lhahT5rhA2VVy9/EcIgd2JhtEuFOJNx7UHNn/qiTPTY4nrQw=="],
+
+ "@napi-rs/nice-android-arm-eabi": ["@napi-rs/nice-android-arm-eabi@1.1.1", "", { "os": "android", "cpu": "arm" }, "sha512-kjirL3N6TnRPv5iuHw36wnucNqXAO46dzK9oPb0wj076R5Xm8PfUVA9nAFB5ZNMmfJQJVKACAPd/Z2KYMppthw=="],
+
+ "@napi-rs/nice-android-arm64": ["@napi-rs/nice-android-arm64@1.1.1", "", { "os": "android", "cpu": "arm64" }, "sha512-blG0i7dXgbInN5urONoUCNf+DUEAavRffrO7fZSeoRMJc5qD+BJeNcpr54msPF6qfDD6kzs9AQJogZvT2KD5nw=="],
+
+ "@napi-rs/nice-darwin-arm64": ["@napi-rs/nice-darwin-arm64@1.1.1", "", { "os": "darwin", "cpu": "arm64" }, "sha512-s/E7w45NaLqTGuOjC2p96pct4jRfo61xb9bU1unM/MJ/RFkKlJyJDx7OJI/O0ll/hrfpqKopuAFDV8yo0hfT7A=="],
+
+ "@napi-rs/nice-darwin-x64": ["@napi-rs/nice-darwin-x64@1.1.1", "", { "os": "darwin", "cpu": "x64" }, "sha512-dGoEBnVpsdcC+oHHmW1LRK5eiyzLwdgNQq3BmZIav+9/5WTZwBYX7r5ZkQC07Nxd3KHOCkgbHSh4wPkH1N1LiQ=="],
+
+ "@napi-rs/nice-freebsd-x64": ["@napi-rs/nice-freebsd-x64@1.1.1", "", { "os": "freebsd", "cpu": "x64" }, "sha512-kHv4kEHAylMYmlNwcQcDtXjklYp4FCf0b05E+0h6nDHsZ+F0bDe04U/tXNOqrx5CmIAth4vwfkjjUmp4c4JktQ=="],
+
+ "@napi-rs/nice-linux-arm-gnueabihf": ["@napi-rs/nice-linux-arm-gnueabihf@1.1.1", "", { "os": "linux", "cpu": "arm" }, "sha512-E1t7K0efyKXZDoZg1LzCOLxgolxV58HCkaEkEvIYQx12ht2pa8hoBo+4OB3qh7e+QiBlp1SRf+voWUZFxyhyqg=="],
+
+ "@napi-rs/nice-linux-arm64-gnu": ["@napi-rs/nice-linux-arm64-gnu@1.1.1", "", { "os": "linux", "cpu": "arm64" }, "sha512-CIKLA12DTIZlmTaaKhQP88R3Xao+gyJxNWEn04wZwC2wmRapNnxCUZkVwggInMJvtVElA+D4ZzOU5sX4jV+SmQ=="],
+
+ "@napi-rs/nice-linux-arm64-musl": ["@napi-rs/nice-linux-arm64-musl@1.1.1", "", { "os": "linux", "cpu": "arm64" }, "sha512-+2Rzdb3nTIYZ0YJF43qf2twhqOCkiSrHx2Pg6DJaCPYhhaxbLcdlV8hCRMHghQ+EtZQWGNcS2xF4KxBhSGeutg=="],
+
+ "@napi-rs/nice-linux-ppc64-gnu": ["@napi-rs/nice-linux-ppc64-gnu@1.1.1", "", { "os": "linux", "cpu": "ppc64" }, "sha512-4FS8oc0GeHpwvv4tKciKkw3Y4jKsL7FRhaOeiPei0X9T4Jd619wHNe4xCLmN2EMgZoeGg+Q7GY7BsvwKpL22Tg=="],
+
+ "@napi-rs/nice-linux-riscv64-gnu": ["@napi-rs/nice-linux-riscv64-gnu@1.1.1", "", { "os": "linux", "cpu": "none" }, "sha512-HU0nw9uD4FO/oGCCk409tCi5IzIZpH2agE6nN4fqpwVlCn5BOq0MS1dXGjXaG17JaAvrlpV5ZeyZwSon10XOXw=="],
+
+ "@napi-rs/nice-linux-s390x-gnu": ["@napi-rs/nice-linux-s390x-gnu@1.1.1", "", { "os": "linux", "cpu": "s390x" }, "sha512-2YqKJWWl24EwrX0DzCQgPLKQBxYDdBxOHot1KWEq7aY2uYeX+Uvtv4I8xFVVygJDgf6/92h9N3Y43WPx8+PAgQ=="],
+
+ "@napi-rs/nice-linux-x64-gnu": ["@napi-rs/nice-linux-x64-gnu@1.1.1", "", { "os": "linux", "cpu": "x64" }, "sha512-/gaNz3R92t+dcrfCw/96pDopcmec7oCcAQ3l/M+Zxr82KT4DljD37CpgrnXV+pJC263JkW572pdbP3hP+KjcIg=="],
+
+ "@napi-rs/nice-linux-x64-musl": ["@napi-rs/nice-linux-x64-musl@1.1.1", "", { "os": "linux", "cpu": "x64" }, "sha512-xScCGnyj/oppsNPMnevsBe3pvNaoK7FGvMjT35riz9YdhB2WtTG47ZlbxtOLpjeO9SqqQ2J2igCmz6IJOD5JYw=="],
+
+ "@napi-rs/nice-openharmony-arm64": ["@napi-rs/nice-openharmony-arm64@1.1.1", "", { "os": "none", "cpu": "arm64" }, "sha512-6uJPRVwVCLDeoOaNyeiW0gp2kFIM4r7PL2MczdZQHkFi9gVlgm+Vn+V6nTWRcu856mJ2WjYJiumEajfSm7arPQ=="],
+
+ "@napi-rs/nice-win32-arm64-msvc": ["@napi-rs/nice-win32-arm64-msvc@1.1.1", "", { "os": "win32", "cpu": "arm64" }, "sha512-uoTb4eAvM5B2aj/z8j+Nv8OttPf2m+HVx3UjA5jcFxASvNhQriyCQF1OB1lHL43ZhW+VwZlgvjmP5qF3+59atA=="],
+
+ "@napi-rs/nice-win32-ia32-msvc": ["@napi-rs/nice-win32-ia32-msvc@1.1.1", "", { "os": "win32", "cpu": "ia32" }, "sha512-CNQqlQT9MwuCsg1Vd/oKXiuH+TcsSPJmlAFc5frFyX/KkOh0UpBLEj7aoY656d5UKZQMQFP7vJNa1DNUNORvug=="],
+
+ "@napi-rs/nice-win32-x64-msvc": ["@napi-rs/nice-win32-x64-msvc@1.1.1", "", { "os": "win32", "cpu": "x64" }, "sha512-vB+4G/jBQCAh0jelMTY3+kgFy00Hlx2f2/1zjMoH821IbplbWZOkLiTYXQkygNTzQJTq5cvwBDgn2ppHD+bglQ=="],
+
+ "@napi-rs/simple-git": ["@napi-rs/simple-git@0.1.22", "", { "optionalDependencies": { "@napi-rs/simple-git-android-arm-eabi": "0.1.22", "@napi-rs/simple-git-android-arm64": "0.1.22", "@napi-rs/simple-git-darwin-arm64": "0.1.22", "@napi-rs/simple-git-darwin-x64": "0.1.22", "@napi-rs/simple-git-freebsd-x64": "0.1.22", "@napi-rs/simple-git-linux-arm-gnueabihf": "0.1.22", "@napi-rs/simple-git-linux-arm64-gnu": "0.1.22", "@napi-rs/simple-git-linux-arm64-musl": "0.1.22", "@napi-rs/simple-git-linux-ppc64-gnu": "0.1.22", "@napi-rs/simple-git-linux-s390x-gnu": "0.1.22", "@napi-rs/simple-git-linux-x64-gnu": "0.1.22", "@napi-rs/simple-git-linux-x64-musl": "0.1.22", "@napi-rs/simple-git-win32-arm64-msvc": "0.1.22", "@napi-rs/simple-git-win32-ia32-msvc": "0.1.22", "@napi-rs/simple-git-win32-x64-msvc": "0.1.22" } }, "sha512-bMVoAKhpjTOPHkW/lprDPwv5aD4R4C3Irt8vn+SKA9wudLe9COLxOhurrKRsxmZccUbWXRF7vukNeGUAj5P8kA=="],
+
+ "@napi-rs/simple-git-android-arm-eabi": ["@napi-rs/simple-git-android-arm-eabi@0.1.22", "", { "os": "android", "cpu": "arm" }, "sha512-JQZdnDNm8o43A5GOzwN/0Tz3CDBQtBUNqzVwEopm32uayjdjxev1Csp1JeaqF3v9djLDIvsSE39ecsN2LhCKKQ=="],
+
+ "@napi-rs/simple-git-android-arm64": ["@napi-rs/simple-git-android-arm64@0.1.22", "", { "os": "android", "cpu": "arm64" }, "sha512-46OZ0SkhnvM+fapWjzg/eqbJvClxynUpWYyYBn4jAj7GQs1/Yyc8431spzDmkA8mL0M7Xo8SmbkzTDE7WwYAfg=="],
+
+ "@napi-rs/simple-git-darwin-arm64": ["@napi-rs/simple-git-darwin-arm64@0.1.22", "", { "os": "darwin", "cpu": "arm64" }, "sha512-zH3h0C8Mkn9//MajPI6kHnttywjsBmZ37fhLX/Fiw5XKu84eHA6dRyVtMzoZxj6s+bjNTgaMgMUucxPn9ktxTQ=="],
+
+ "@napi-rs/simple-git-darwin-x64": ["@napi-rs/simple-git-darwin-x64@0.1.22", "", { "os": "darwin", "cpu": "x64" }, "sha512-GZN7lRAkGKB6PJxWsoyeYJhh85oOOjVNyl+/uipNX8bR+mFDCqRsCE3rRCFGV9WrZUHXkcuRL2laIRn7lLi3ag=="],
+
+ "@napi-rs/simple-git-freebsd-x64": ["@napi-rs/simple-git-freebsd-x64@0.1.22", "", { "os": "freebsd", "cpu": "x64" }, "sha512-xyqX1C5I0WBrUgZONxHjZH5a4LqQ9oki3SKFAVpercVYAcx3pq6BkZy1YUOP4qx78WxU1CCNfHBN7V+XO7D99A=="],
+
+ "@napi-rs/simple-git-linux-arm-gnueabihf": ["@napi-rs/simple-git-linux-arm-gnueabihf@0.1.22", "", { "os": "linux", "cpu": "arm" }, "sha512-4LOtbp9ll93B9fxRvXiUJd1/RM3uafMJE7dGBZGKWBMGM76+BAcCEUv2BY85EfsU/IgopXI6n09TycRfPWOjxA=="],
+
+ "@napi-rs/simple-git-linux-arm64-gnu": ["@napi-rs/simple-git-linux-arm64-gnu@0.1.22", "", { "os": "linux", "cpu": "arm64" }, "sha512-GVOjP/JjCzbQ0kSqao7ctC/1sodVtv5VF57rW9BFpo2y6tEYPCqHnkQkTpieuwMNe+TVOhBUC1+wH0d9/knIHg=="],
+
+ "@napi-rs/simple-git-linux-arm64-musl": ["@napi-rs/simple-git-linux-arm64-musl@0.1.22", "", { "os": "linux", "cpu": "arm64" }, "sha512-MOs7fPyJiU/wqOpKzAOmOpxJ/TZfP4JwmvPad/cXTOWYwwyppMlXFRms3i98EU3HOazI/wMU2Ksfda3+TBluWA=="],
+
+ "@napi-rs/simple-git-linux-ppc64-gnu": ["@napi-rs/simple-git-linux-ppc64-gnu@0.1.22", "", { "os": "linux", "cpu": "ppc64" }, "sha512-L59dR30VBShRUIZ5/cQHU25upNgKS0AMQ7537J6LCIUEFwwXrKORZKJ8ceR+s3Sr/4jempWVvMdjEpFDE4HYww=="],
+
+ "@napi-rs/simple-git-linux-s390x-gnu": ["@napi-rs/simple-git-linux-s390x-gnu@0.1.22", "", { "os": "linux", "cpu": "s390x" }, "sha512-4FHkPlCSIZUGC6HiADffbe6NVoTBMd65pIwcd40IDbtFKOgFMBA+pWRqKiQ21FERGH16Zed7XHJJoY3jpOqtmQ=="],
+
+ "@napi-rs/simple-git-linux-x64-gnu": ["@napi-rs/simple-git-linux-x64-gnu@0.1.22", "", { "os": "linux", "cpu": "x64" }, "sha512-Ei1tM5Ho/dwknF3pOzqkNW9Iv8oFzRxE8uOhrITcdlpxRxVrBVptUF6/0WPdvd7R9747D/q61QG/AVyWsWLFKw=="],
+
+ "@napi-rs/simple-git-linux-x64-musl": ["@napi-rs/simple-git-linux-x64-musl@0.1.22", "", { "os": "linux", "cpu": "x64" }, "sha512-zRYxg7it0p3rLyEJYoCoL2PQJNgArVLyNavHW03TFUAYkYi5bxQ/UFNVpgxMaXohr5yu7qCBqeo9j4DWeysalg=="],
+
+ "@napi-rs/simple-git-win32-arm64-msvc": ["@napi-rs/simple-git-win32-arm64-msvc@0.1.22", "", { "os": "win32", "cpu": "arm64" }, "sha512-XGFR1fj+Y9cWACcovV2Ey/R2xQOZKs8t+7KHPerYdJ4PtjVzGznI4c2EBHXtdOIYvkw7tL5rZ7FN1HJKdD5Quw=="],
+
+ "@napi-rs/simple-git-win32-ia32-msvc": ["@napi-rs/simple-git-win32-ia32-msvc@0.1.22", "", { "os": "win32", "cpu": "ia32" }, "sha512-Gqr9Y0gs6hcNBA1IXBpoqTFnnIoHuZGhrYqaZzEvGMLrTrpbXrXVEtX3DAAD2RLc1b87CPcJ49a7sre3PU3Rfw=="],
+
+ "@napi-rs/simple-git-win32-x64-msvc": ["@napi-rs/simple-git-win32-x64-msvc@0.1.22", "", { "os": "win32", "cpu": "x64" }, "sha512-hQjcreHmUcpw4UrtkOron1/TQObfe484lxiXFLLUj7aWnnnOVs1mnXq5/Bo9+3NYZldFpFRJPdPBeHCisXkKJg=="],
+
+ "@napi-rs/wasm-runtime": ["@napi-rs/wasm-runtime@0.2.12", "", { "dependencies": { "@emnapi/core": "^1.4.3", "@emnapi/runtime": "^1.4.3", "@tybys/wasm-util": "^0.10.0" } }, "sha512-ZVWUcfwY4E/yPitQJl481FjFo3K22D6qF0DuFH6Y/nbnE11GY5uguDxZMGXPQ8WQ0128MXQD7TnfHyK4oWoIJQ=="],
+
+ "@nestjs/cli": ["@nestjs/cli@9.5.0", "", { "dependencies": { "@angular-devkit/core": "16.0.1", "@angular-devkit/schematics": "16.0.1", "@angular-devkit/schematics-cli": "16.0.1", "@nestjs/schematics": "^9.0.4", "chalk": "4.1.2", "chokidar": "3.5.3", "cli-table3": "0.6.3", "commander": "4.1.1", "fork-ts-checker-webpack-plugin": "8.0.0", "inquirer": "8.2.5", "node-emoji": "1.11.0", "ora": "5.4.1", "os-name": "4.0.1", "rimraf": "4.4.1", "shelljs": "0.8.5", "source-map-support": "0.5.21", "tree-kill": "1.2.2", "tsconfig-paths": "4.2.0", "tsconfig-paths-webpack-plugin": "4.0.1", "typescript": "4.9.5", "webpack": "5.82.1", "webpack-node-externals": "3.0.0" }, "bin": { "nest": "bin/nest.js" } }, "sha512-Z7q+3vNsQSG2d2r2Hl/OOj5EpfjVx3OfnJ9+KuAsOdw1sKLm7+Zc6KbhMFTd/eIvfx82ww3Nk72xdmfPYCulWA=="],
+
+ "@nestjs/common": ["@nestjs/common@10.4.1", "", { "dependencies": { "iterare": "1.2.1", "tslib": "2.6.3", "uid": "2.0.2" }, "peerDependencies": { "class-transformer": "*", "class-validator": "*", "reflect-metadata": "^0.1.12 || ^0.2.0", "rxjs": "^7.1.0" }, "optionalPeers": ["class-transformer", "class-validator"] }, "sha512-4CkrDx0s4XuWqFjX8WvOFV7Y6RGJd0P2OBblkhZS7nwoctoSuW5pyEa8SWak6YHNGrHRpFb6ymm5Ai4LncwRVA=="],
+
+ "@nestjs/config": ["@nestjs/config@3.3.0", "", { "dependencies": { "dotenv": "16.4.5", "dotenv-expand": "10.0.0", "lodash": "4.17.21" }, "peerDependencies": { "@nestjs/common": "^8.0.0 || ^9.0.0 || ^10.0.0", "rxjs": "^7.1.0" } }, "sha512-pdGTp8m9d0ZCrjTpjkUbZx6gyf2IKf+7zlkrPNMsJzYZ4bFRRTpXrnj+556/5uiI6AfL5mMrJc2u7dB6bvM+VA=="],
+
+ "@nestjs/core": ["@nestjs/core@10.4.1", "", { "dependencies": { "@nuxtjs/opencollective": "0.3.2", "fast-safe-stringify": "2.1.1", "iterare": "1.2.1", "path-to-regexp": "3.2.0", "tslib": "2.6.3", "uid": "2.0.2" }, "peerDependencies": { "@nestjs/common": "^10.0.0", "@nestjs/microservices": "^10.0.0", "@nestjs/platform-express": "^10.0.0", "@nestjs/websockets": "^10.0.0", "reflect-metadata": "^0.1.12 || ^0.2.0", "rxjs": "^7.1.0" }, "optionalPeers": ["@nestjs/microservices", "@nestjs/platform-express", "@nestjs/websockets"] }, "sha512-9I1WdfOBCCHdUm+ClBJupOuZQS6UxzIWHIq6Vp1brAA5ZKl/Wq6BVwSsbnUJGBy3J3PM2XHmR0EQ4fwX3nR7lA=="],
+
+ "@nestjs/platform-express": ["@nestjs/platform-express@10.4.1", "", { "dependencies": { "body-parser": "1.20.2", "cors": "2.8.5", "express": "4.19.2", "multer": "1.4.4-lts.1", "tslib": "2.6.3" }, "peerDependencies": { "@nestjs/common": "^10.0.0", "@nestjs/core": "^10.0.0" } }, "sha512-ccfqIDAq/bg1ShLI5KGtaLaYGykuAdvCi57ohewH7eKJSIpWY1DQjbgKlFfXokALYUq1YOMGqjeZ244OWHfDQg=="],
+
+ "@nestjs/platform-fastify": ["@nestjs/platform-fastify@10.4.22", "", { "dependencies": { "@fastify/cors": "9.0.1", "@fastify/formbody": "7.4.0", "@fastify/middie": "8.3.3", "fastify": "4.28.1", "light-my-request": "6.3.0", "path-to-regexp": "3.3.0", "tslib": "2.8.1" }, "peerDependencies": { "@fastify/static": "^6.0.0 || ^7.0.0", "@fastify/view": "^7.0.0 || ^8.0.0", "@nestjs/common": "^10.0.0", "@nestjs/core": "^10.0.0" }, "optionalPeers": ["@fastify/static", "@fastify/view"] }, "sha512-Y/8wX43806NIAAIx7nWY3A7kSiZc5ivPfIl4RIgo4goxuwVOjAwgytBtPhgtyP/O1nrighbMXtgHh2e/kWnHGA=="],
+
+ "@nestjs/schematics": ["@nestjs/schematics@10.2.3", "", { "dependencies": { "@angular-devkit/core": "17.3.11", "@angular-devkit/schematics": "17.3.11", "comment-json": "4.2.5", "jsonc-parser": "3.3.1", "pluralize": "8.0.0" }, "peerDependencies": { "typescript": ">=4.8.2" } }, "sha512-4e8gxaCk7DhBxVUly2PjYL4xC2ifDFexCqq1/u4TtivLGXotVk0wHdYuPYe1tHTHuR1lsOkRbfOCpkdTnigLVg=="],
+
+ "@nestjs/testing": ["@nestjs/testing@10.4.1", "", { "dependencies": { "tslib": "2.6.3" }, "peerDependencies": { "@nestjs/common": "^10.0.0", "@nestjs/core": "^10.0.0", "@nestjs/microservices": "^10.0.0", "@nestjs/platform-express": "^10.0.0" }, "optionalPeers": ["@nestjs/microservices", "@nestjs/platform-express"] }, "sha512-pR+su5+YGqCLH0RhhVkPowQK7FCORU0/PWAywPK7LScAOtD67ZoviZ7hAU4vnGdwkg4HCB0D7W8Bkg19CGU8Xw=="],
+
+ "@next/env": ["@next/env@13.5.11", "", {}, "sha512-fbb2C7HChgM7CemdCY+y3N1n8pcTKdqtQLbC7/EQtPdLvlMUT9JX/dBYl8MMZAtYG4uVMyPFHXckb68q/NRwqg=="],
+
+ "@next/eslint-plugin-next": ["@next/eslint-plugin-next@14.2.35", "", { "dependencies": { "glob": "10.3.10" } }, "sha512-Jw9A3ICz2183qSsqwi7fgq4SBPiNfmOLmTPXKvlnzstUwyvBrtySiY+8RXJweNAs9KThb1+bYhZh9XWcNOr2zQ=="],
+
+ "@next/swc-darwin-arm64": ["@next/swc-darwin-arm64@14.2.4", "", { "os": "darwin", "cpu": "arm64" }, "sha512-AH3mO4JlFUqsYcwFUHb1wAKlebHU/Hv2u2kb1pAuRanDZ7pD/A/KPD98RHZmwsJpdHQwfEc/06mgpSzwrJYnNg=="],
+
+ "@next/swc-darwin-x64": ["@next/swc-darwin-x64@14.2.4", "", { "os": "darwin", "cpu": "x64" }, "sha512-QVadW73sWIO6E2VroyUjuAxhWLZWEpiFqHdZdoQ/AMpN9YWGuHV8t2rChr0ahy+irKX5mlDU7OY68k3n4tAZTg=="],
+
+ "@next/swc-linux-arm64-gnu": ["@next/swc-linux-arm64-gnu@14.2.4", "", { "os": "linux", "cpu": "arm64" }, "sha512-KT6GUrb3oyCfcfJ+WliXuJnD6pCpZiosx2X3k66HLR+DMoilRb76LpWPGb4tZprawTtcnyrv75ElD6VncVamUQ=="],
+
+ "@next/swc-linux-arm64-musl": ["@next/swc-linux-arm64-musl@14.2.4", "", { "os": "linux", "cpu": "arm64" }, "sha512-Alv8/XGSs/ytwQcbCHwze1HmiIkIVhDHYLjczSVrf0Wi2MvKn/blt7+S6FJitj3yTlMwMxII1gIJ9WepI4aZ/A=="],
+
+ "@next/swc-linux-x64-gnu": ["@next/swc-linux-x64-gnu@14.2.4", "", { "os": "linux", "cpu": "x64" }, "sha512-ze0ShQDBPCqxLImzw4sCdfnB3lRmN3qGMB2GWDRlq5Wqy4G36pxtNOo2usu/Nm9+V2Rh/QQnrRc2l94kYFXO6Q=="],
+
+ "@next/swc-linux-x64-musl": ["@next/swc-linux-x64-musl@14.2.4", "", { "os": "linux", "cpu": "x64" }, "sha512-8dwC0UJoc6fC7PX70csdaznVMNr16hQrTDAMPvLPloazlcaWfdPogq+UpZX6Drqb1OBlwowz8iG7WR0Tzk/diQ=="],
+
+ "@next/swc-win32-arm64-msvc": ["@next/swc-win32-arm64-msvc@14.2.4", "", { "os": "win32", "cpu": "arm64" }, "sha512-jxyg67NbEWkDyvM+O8UDbPAyYRZqGLQDTPwvrBBeOSyVWW/jFQkQKQ70JDqDSYg1ZDdl+E3nkbFbq8xM8E9x8A=="],
+
+ "@next/swc-win32-ia32-msvc": ["@next/swc-win32-ia32-msvc@14.2.4", "", { "os": "win32", "cpu": "ia32" }, "sha512-twrmN753hjXRdcrZmZttb/m5xaCBFa48Dt3FbeEItpJArxriYDunWxJn+QFXdJ3hPkm4u7CKxncVvnmgQMY1ag=="],
+
+ "@next/swc-win32-x64-msvc": ["@next/swc-win32-x64-msvc@14.2.4", "", { "os": "win32", "cpu": "x64" }, "sha512-tkLrjBzqFTP8DVrAAQmZelEahfR9OxWpFR++vAI9FBhCiIxtwHwBHC23SBHCTURBtwB4kc/x44imVOnkKGNVGg=="],
+
+ "@noble/hashes": ["@noble/hashes@1.8.0", "", {}, "sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A=="],
+
+ "@nodelib/fs.scandir": ["@nodelib/fs.scandir@2.1.5", "", { "dependencies": { "@nodelib/fs.stat": "2.0.5", "run-parallel": "^1.1.9" } }, "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g=="],
+
+ "@nodelib/fs.stat": ["@nodelib/fs.stat@2.0.5", "", {}, "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A=="],
+
+ "@nodelib/fs.walk": ["@nodelib/fs.walk@1.2.8", "", { "dependencies": { "@nodelib/fs.scandir": "2.1.5", "fastq": "^1.6.0" } }, "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg=="],
+
+ "@nolyfill/is-core-module": ["@nolyfill/is-core-module@1.0.39", "", {}, "sha512-nn5ozdjYQpUCZlWGuxcJY/KpxkWQs4DcbMCmKojjyrYDEAGy4Ce19NN4v5MduafTwJlbKc99UA8YhSVqq9yPZA=="],
+
+ "@nuxtjs/opencollective": ["@nuxtjs/opencollective@0.3.2", "", { "dependencies": { "chalk": "^4.1.0", "consola": "^2.15.0", "node-fetch": "^2.6.1" }, "bin": { "opencollective": "bin/opencollective.js" } }, "sha512-um0xL3fO7Mf4fDxcqx9KryrB7zgRM5JSlvGN5AGkP6JLM5XEKyjeAiPbNxdXVXQ16isuAhYpvP88NgL2BGd6aA=="],
+
+ "@octokit/auth-token": ["@octokit/auth-token@4.0.0", "", {}, "sha512-tY/msAuJo6ARbK6SPIxZrPBms3xPbfwBrulZe0Wtr/DIY9lje2HeV1uoebShn6mx7SjCHif6EjMvoREj+gZ+SA=="],
+
+ "@octokit/core": ["@octokit/core@5.2.2", "", { "dependencies": { "@octokit/auth-token": "^4.0.0", "@octokit/graphql": "^7.1.0", "@octokit/request": "^8.4.1", "@octokit/request-error": "^5.1.1", "@octokit/types": "^13.0.0", "before-after-hook": "^2.2.0", "universal-user-agent": "^6.0.0" } }, "sha512-/g2d4sW9nUDJOMz3mabVQvOGhVa4e/BN/Um7yca9Bb2XTzPPnfTWHWQg+IsEYO7M3Vx+EXvaM/I2pJWIMun1bg=="],
+
+ "@octokit/endpoint": ["@octokit/endpoint@9.0.6", "", { "dependencies": { "@octokit/types": "^13.1.0", "universal-user-agent": "^6.0.0" } }, "sha512-H1fNTMA57HbkFESSt3Y9+FBICv+0jFceJFPWDePYlR/iMGrwM5ph+Dd4XRQs+8X+PUFURLQgX9ChPfhJ/1uNQw=="],
+
+ "@octokit/graphql": ["@octokit/graphql@7.1.1", "", { "dependencies": { "@octokit/request": "^8.4.1", "@octokit/types": "^13.0.0", "universal-user-agent": "^6.0.0" } }, "sha512-3mkDltSfcDUoa176nlGoA32RGjeWjl3K7F/BwHwRMJUW/IteSa4bnSV8p2ThNkcIcZU2umkZWxwETSSCJf2Q7g=="],
+
+ "@octokit/openapi-types": ["@octokit/openapi-types@24.2.0", "", {}, "sha512-9sIH3nSUttelJSXUrmGzl7QUBFul0/mB8HRYl3fOlgHbIWG+WnYDXU3v/2zMtAvuzZ/ed00Ei6on975FhBfzrg=="],
+
+ "@octokit/plugin-paginate-rest": ["@octokit/plugin-paginate-rest@9.2.2", "", { "dependencies": { "@octokit/types": "^12.6.0" }, "peerDependencies": { "@octokit/core": "5" } }, "sha512-u3KYkGF7GcZnSD/3UP0S7K5XUFT2FkOQdcfXZGZQPGv3lm4F2Xbf71lvjldr8c1H3nNbF+33cLEkWYbokGWqiQ=="],
+
+ "@octokit/plugin-request-log": ["@octokit/plugin-request-log@4.0.1", "", { "peerDependencies": { "@octokit/core": "5" } }, "sha512-GihNqNpGHorUrO7Qa9JbAl0dbLnqJVrV8OXe2Zm5/Y4wFkZQDfTreBzVmiRfJVfE4mClXdihHnbpyyO9FSX4HA=="],
+
+ "@octokit/plugin-rest-endpoint-methods": ["@octokit/plugin-rest-endpoint-methods@10.4.1", "", { "dependencies": { "@octokit/types": "^12.6.0" }, "peerDependencies": { "@octokit/core": "5" } }, "sha512-xV1b+ceKV9KytQe3zCVqjg+8GTGfDYwaT1ATU5isiUyVtlVAO3HNdzpS4sr4GBx4hxQ46s7ITtZrAsxG22+rVg=="],
+
+ "@octokit/request": ["@octokit/request@8.4.1", "", { "dependencies": { "@octokit/endpoint": "^9.0.6", "@octokit/request-error": "^5.1.1", "@octokit/types": "^13.1.0", "universal-user-agent": "^6.0.0" } }, "sha512-qnB2+SY3hkCmBxZsR/MPCybNmbJe4KAlfWErXq+rBKkQJlbjdJeS85VI9r8UqeLYLvnAenU8Q1okM/0MBsAGXw=="],
+
+ "@octokit/request-error": ["@octokit/request-error@5.1.1", "", { "dependencies": { "@octokit/types": "^13.1.0", "deprecation": "^2.0.0", "once": "^1.4.0" } }, "sha512-v9iyEQJH6ZntoENr9/yXxjuezh4My67CBSu9r6Ve/05Iu5gNgnisNWOsoJHTP6k0Rr0+HQIpnH+kyammu90q/g=="],
+
+ "@octokit/rest": ["@octokit/rest@20.0.2", "", { "dependencies": { "@octokit/core": "^5.0.0", "@octokit/plugin-paginate-rest": "^9.0.0", "@octokit/plugin-request-log": "^4.0.0", "@octokit/plugin-rest-endpoint-methods": "^10.0.0" } }, "sha512-Ux8NDgEraQ/DMAU1PlAohyfBBXDwhnX2j33Z1nJNziqAfHi70PuxkFYIcIt8aIAxtRE7KVuKp8lSR8pA0J5iOQ=="],
+
+ "@octokit/types": ["@octokit/types@13.10.0", "", { "dependencies": { "@octokit/openapi-types": "^24.2.0" } }, "sha512-ifLaO34EbbPj0Xgro4G5lP5asESjwHracYJvVaPIyXMuiuXLlhic3S47cBdTb+jfODkTE5YtGCLt3Ay3+J97sA=="],
+
+ "@paralleldrive/cuid2": ["@paralleldrive/cuid2@2.3.1", "", { "dependencies": { "@noble/hashes": "^1.1.5" } }, "sha512-XO7cAxhnTZl0Yggq6jOgjiOHhbgcO4NqFqwSmQpjK3b6TEE6Uj/jfSk6wzYyemh3+I0sHirKSetjQwn5cZktFw=="],
+
+ "@pinojs/redact": ["@pinojs/redact@0.4.0", "", {}, "sha512-k2ENnmBugE/rzQfEcdWHcCY+/FM3VLzH9cYEsbdsoqrvzAKRhUZeRNhAZvB8OitQJ1TBed3yqWtdjzS6wJKBwg=="],
+
+ "@pkgjs/parseargs": ["@pkgjs/parseargs@0.11.0", "", {}, "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg=="],
+
+ "@pkgr/core": ["@pkgr/core@0.1.2", "", {}, "sha512-fdDH1LSGfZdTH2sxdpVMw31BanV28K/Gry0cVFxaNP77neJSkd82mM8ErPNYs9e+0O7SdHBLTDzDgwUuy18RnQ=="],
+
+ "@pnpm/config.env-replace": ["@pnpm/config.env-replace@1.1.0", "", {}, "sha512-htyl8TWnKL7K/ESFa1oW2UB5lVDxuF5DpM7tBi6Hu2LNL3mWkIzNLG6N4zoCUP1lCKNxWy/3iu8mS8MvToGd6w=="],
+
+ "@pnpm/network.ca-file": ["@pnpm/network.ca-file@1.0.2", "", { "dependencies": { "graceful-fs": "4.2.10" } }, "sha512-YcPQ8a0jwYU9bTdJDpXjMi7Brhkr1mXsXrUJvjqM2mQDgkRiz8jFaQGOdaLxgjtUfQgZhKy/O3cG/YwmgKaxLA=="],
+
+ "@pnpm/npm-conf": ["@pnpm/npm-conf@3.0.2", "", { "dependencies": { "@pnpm/config.env-replace": "^1.1.0", "@pnpm/network.ca-file": "^1.0.1", "config-chain": "^1.1.11" } }, "sha512-h104Kh26rR8tm+a3Qkc5S4VLYint3FE48as7+/5oCEcKR2idC/pF1G6AhIXKI+eHPJa/3J9i5z0Al47IeGHPkA=="],
+
+ "@popperjs/core": ["@popperjs/core@2.11.8", "", {}, "sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A=="],
+
+ "@release-it-plugins/workspaces": ["@release-it-plugins/workspaces@4.2.1", "", { "dependencies": { "detect-indent": "^6.0.0", "detect-newline": "^3.1.0", "semver": "^7.1.3", "url-join": "^4.0.1", "validate-peer-dependencies": "^1.0.0", "walk-sync": "^2.0.2", "yaml": "^2.1.1" }, "peerDependencies": { "release-it": "^14.0.0 || ^15.2.0 || ^16.0.0 || ^17.0.0" } }, "sha512-lZEARr5tqsFskTPHBLjmYxqfC/DJkWRc0Q/wjOODHW8rtYPhL1w2zv7fwvgSjhFmMp0OdsJOXzkcSkUDvc9NnA=="],
+
+ "@release-it/conventional-changelog": ["@release-it/conventional-changelog@8.0.2", "", { "dependencies": { "concat-stream": "^2.0.0", "conventional-changelog": "^5.1.0", "conventional-recommended-bump": "^9.0.0", "git-semver-tags": "^8.0.0", "semver": "^7.6.3" }, "peerDependencies": { "release-it": "^17.0.0" } }, "sha512-WpnWWRr7O0JeLoiejLrPEWnnwFhCscBn1wBTAXeitiz2/Ifaol0s+t8otf/HYq/OiQOri2iH8d0CnVb72tBdIQ=="],
+
+ "@rtsao/scc": ["@rtsao/scc@1.1.0", "", {}, "sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g=="],
+
+ "@rushstack/eslint-patch": ["@rushstack/eslint-patch@1.15.0", "", {}, "sha512-ojSshQPKwVvSMR8yT2L/QtUkV5SXi/IfDiJ4/8d6UbTPjiHVmxZzUAzGD8Tzks1b9+qQkZa0isUOvYObedITaw=="],
+
+ "@sinclair/typebox": ["@sinclair/typebox@0.27.8", "", {}, "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA=="],
+
+ "@sindresorhus/is": ["@sindresorhus/is@5.6.0", "", {}, "sha512-TV7t8GKYaJWsn00tFDqBw8+Uqmr8A0fRU1tvTQhyZzGv0sJCGRQL3JGMI3ucuKo3XIZdUP+Lx7/gh2t3lewy7g=="],
+
+ "@sindresorhus/merge-streams": ["@sindresorhus/merge-streams@2.3.0", "", {}, "sha512-LtoMMhxAlorcGhmFYI+LhPgbPZCkgP6ra1YL604EeF6U98pLlQ3iWIGMdWSC+vWmPBWBNgmDBAhnAobLROJmwg=="],
+
+ "@sinonjs/commons": ["@sinonjs/commons@3.0.1", "", { "dependencies": { "type-detect": "4.0.8" } }, "sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ=="],
+
+ "@sinonjs/fake-timers": ["@sinonjs/fake-timers@10.3.0", "", { "dependencies": { "@sinonjs/commons": "^3.0.0" } }, "sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA=="],
+
+ "@stackblitz/sdk": ["@stackblitz/sdk@1.11.0", "", {}, "sha512-DFQGANNkEZRzFk1/rDP6TcFdM82ycHE+zfl9C/M/jXlH68jiqHWHFMQURLELoD8koxvu/eW5uhg94NSAZlYrUQ=="],
+
+ "@svgr/babel-plugin-add-jsx-attribute": ["@svgr/babel-plugin-add-jsx-attribute@8.0.0", "", { "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-b9MIk7yhdS1pMCZM8VeNfUlSKVRhsHZNMl5O9SfaX0l0t5wjdgu4IDzGB8bpnGBBOjGST3rRFVsaaEtI4W6f7g=="],
+
+ "@svgr/babel-plugin-remove-jsx-attribute": ["@svgr/babel-plugin-remove-jsx-attribute@8.0.0", "", { "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-BcCkm/STipKvbCl6b7QFrMh/vx00vIP63k2eM66MfHJzPr6O2U0jYEViXkHJWqXqQYjdeA9cuCl5KWmlwjDvbA=="],
+
+ "@svgr/babel-plugin-remove-jsx-empty-expression": ["@svgr/babel-plugin-remove-jsx-empty-expression@8.0.0", "", { "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-5BcGCBfBxB5+XSDSWnhTThfI9jcO5f0Ai2V24gZpG+wXF14BzwxxdDb4g6trdOux0rhibGs385BeFMSmxtS3uA=="],
+
+ "@svgr/babel-plugin-replace-jsx-attribute-value": ["@svgr/babel-plugin-replace-jsx-attribute-value@8.0.0", "", { "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-KVQ+PtIjb1BuYT3ht8M5KbzWBhdAjjUPdlMtpuw/VjT8coTrItWX6Qafl9+ji831JaJcu6PJNKCV0bp01lBNzQ=="],
+
+ "@svgr/babel-plugin-svg-dynamic-title": ["@svgr/babel-plugin-svg-dynamic-title@8.0.0", "", { "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-omNiKqwjNmOQJ2v6ge4SErBbkooV2aAWwaPFs2vUY7p7GhVkzRkJ00kILXQvRhA6miHnNpXv7MRnnSjdRjK8og=="],
+
+ "@svgr/babel-plugin-svg-em-dimensions": ["@svgr/babel-plugin-svg-em-dimensions@8.0.0", "", { "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-mURHYnu6Iw3UBTbhGwE/vsngtCIbHE43xCRK7kCw4t01xyGqb2Pd+WXekRRoFOBIY29ZoOhUCTEweDMdrjfi9g=="],
+
+ "@svgr/babel-plugin-transform-react-native-svg": ["@svgr/babel-plugin-transform-react-native-svg@8.1.0", "", { "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-Tx8T58CHo+7nwJ+EhUwx3LfdNSG9R2OKfaIXXs5soiy5HtgoAEkDay9LIimLOcG8dJQH1wPZp/cnAv6S9CrR1Q=="],
+
+ "@svgr/babel-plugin-transform-svg-component": ["@svgr/babel-plugin-transform-svg-component@8.0.0", "", { "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-DFx8xa3cZXTdb/k3kfPeaixecQLgKh5NVBMwD0AQxOzcZawK4oo1Jh9LbrcACUivsCA7TLG8eeWgrDXjTMhRmw=="],
+
+ "@svgr/babel-preset": ["@svgr/babel-preset@8.1.0", "", { "dependencies": { "@svgr/babel-plugin-add-jsx-attribute": "8.0.0", "@svgr/babel-plugin-remove-jsx-attribute": "8.0.0", "@svgr/babel-plugin-remove-jsx-empty-expression": "8.0.0", "@svgr/babel-plugin-replace-jsx-attribute-value": "8.0.0", "@svgr/babel-plugin-svg-dynamic-title": "8.0.0", "@svgr/babel-plugin-svg-em-dimensions": "8.0.0", "@svgr/babel-plugin-transform-react-native-svg": "8.1.0", "@svgr/babel-plugin-transform-svg-component": "8.0.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-7EYDbHE7MxHpv4sxvnVPngw5fuR6pw79SkcrILHJ/iMpuKySNCl5W1qcwPEpU+LgyRXOaAFgH0KhwD18wwg6ug=="],
+
+ "@svgr/core": ["@svgr/core@8.1.0", "", { "dependencies": { "@babel/core": "^7.21.3", "@svgr/babel-preset": "8.1.0", "camelcase": "^6.2.0", "cosmiconfig": "^8.1.3", "snake-case": "^3.0.4" } }, "sha512-8QqtOQT5ACVlmsvKOJNEaWmRPmcojMOzCz4Hs2BGG/toAp/K38LcsMRyLp349glq5AzJbCEeimEoxaX6v/fLrA=="],
+
+ "@svgr/hast-util-to-babel-ast": ["@svgr/hast-util-to-babel-ast@8.0.0", "", { "dependencies": { "@babel/types": "^7.21.3", "entities": "^4.4.0" } }, "sha512-EbDKwO9GpfWP4jN9sGdYwPBU0kdomaPIL2Eu4YwmgP+sJeXT+L7bMwJUBnhzfH8Q2qMBqZ4fJwpCyYsAN3mt2Q=="],
+
+ "@svgr/plugin-jsx": ["@svgr/plugin-jsx@8.1.0", "", { "dependencies": { "@babel/core": "^7.21.3", "@svgr/babel-preset": "8.1.0", "@svgr/hast-util-to-babel-ast": "8.0.0", "svg-parser": "^2.0.4" }, "peerDependencies": { "@svgr/core": "*" } }, "sha512-0xiIyBsLlr8quN+WyuxooNW9RJ0Dpr8uOnH/xrCVO8GLUcwHISwj1AG0k+LFzteTkAA0GbX0kj9q6Dk70PTiPA=="],
+
+ "@svgr/plugin-svgo": ["@svgr/plugin-svgo@8.1.0", "", { "dependencies": { "cosmiconfig": "^8.1.3", "deepmerge": "^4.3.1", "svgo": "^3.0.2" }, "peerDependencies": { "@svgr/core": "*" } }, "sha512-Ywtl837OGO9pTLIN/onoWLmDQ4zFUycI1g76vuKGEz6evR/ZTJlJuz3G/fIkb6OVBJ2g0o6CGJzaEjfmEo3AHA=="],
+
+ "@svgr/webpack": ["@svgr/webpack@8.1.0", "", { "dependencies": { "@babel/core": "^7.21.3", "@babel/plugin-transform-react-constant-elements": "^7.21.3", "@babel/preset-env": "^7.20.2", "@babel/preset-react": "^7.18.6", "@babel/preset-typescript": "^7.21.0", "@svgr/core": "8.1.0", "@svgr/plugin-jsx": "8.1.0", "@svgr/plugin-svgo": "8.1.0" } }, "sha512-LnhVjMWyMQV9ZmeEy26maJk+8HTIbd59cH4F2MJ439k9DqejRisfFNGAPvRYlKETuh9LrImlS8aKsBgKjMA8WA=="],
+
+ "@swc/cli": ["@swc/cli@0.4.0", "", { "dependencies": { "@mole-inc/bin-wrapper": "^8.0.1", "@swc/counter": "^0.1.3", "commander": "^8.3.0", "fast-glob": "^3.2.5", "minimatch": "^9.0.3", "piscina": "^4.3.0", "semver": "^7.3.8", "slash": "3.0.0", "source-map": "^0.7.3" }, "peerDependencies": { "@swc/core": "^1.2.66", "chokidar": "^3.5.1" }, "optionalPeers": ["chokidar"], "bin": { "swc": "bin/swc.js", "swcx": "bin/swcx.js", "spack": "bin/spack.js" } }, "sha512-4JdVrPtF/4rCMXp6Q1h5I6YkYZrCCcqod7Wk97ZQq7K8vNGzJUryBv4eHCvqx5sJOJBrbYm9fcswe1B0TygNoA=="],
+
+ "@swc/core": ["@swc/core@1.15.10", "", { "dependencies": { "@swc/counter": "^0.1.3", "@swc/types": "^0.1.25" }, "optionalDependencies": { "@swc/core-darwin-arm64": "1.15.10", "@swc/core-darwin-x64": "1.15.10", "@swc/core-linux-arm-gnueabihf": "1.15.10", "@swc/core-linux-arm64-gnu": "1.15.10", "@swc/core-linux-arm64-musl": "1.15.10", "@swc/core-linux-x64-gnu": "1.15.10", "@swc/core-linux-x64-musl": "1.15.10", "@swc/core-win32-arm64-msvc": "1.15.10", "@swc/core-win32-ia32-msvc": "1.15.10", "@swc/core-win32-x64-msvc": "1.15.10" }, "peerDependencies": { "@swc/helpers": ">=0.5.17" }, "optionalPeers": ["@swc/helpers"] }, "sha512-udNofxftduMUEv7nqahl2nvodCiCDQ4Ge0ebzsEm6P8s0RC2tBM0Hqx0nNF5J/6t9uagFJyWIDjXy3IIWMHDJw=="],
+
+ "@swc/core-darwin-arm64": ["@swc/core-darwin-arm64@1.15.10", "", { "os": "darwin", "cpu": "arm64" }, "sha512-U72pGqmJYbjrLhMndIemZ7u9Q9owcJczGxwtfJlz/WwMaGYAV/g4nkGiUVk/+QSX8sFCAjanovcU1IUsP2YulA=="],
+
+ "@swc/core-darwin-x64": ["@swc/core-darwin-x64@1.15.10", "", { "os": "darwin", "cpu": "x64" }, "sha512-NZpDXtwHH083L40xdyj1sY31MIwLgOxKfZEAGCI8xHXdHa+GWvEiVdGiu4qhkJctoHFzAEc7ZX3GN5phuJcPuQ=="],
+
+ "@swc/core-linux-arm-gnueabihf": ["@swc/core-linux-arm-gnueabihf@1.15.10", "", { "os": "linux", "cpu": "arm" }, "sha512-ioieF5iuRziUF1HkH1gg1r93e055dAdeBAPGAk40VjqpL5/igPJ/WxFHGvc6WMLhUubSJI4S0AiZAAhEAp1jDg=="],
+
+ "@swc/core-linux-arm64-gnu": ["@swc/core-linux-arm64-gnu@1.15.10", "", { "os": "linux", "cpu": "arm64" }, "sha512-tD6BClOrxSsNus9cJL7Gxdv7z7Y2hlyvZd9l0NQz+YXzmTWqnfzLpg16ovEI7gknH2AgDBB5ywOsqu8hUgSeEQ=="],
+
+ "@swc/core-linux-arm64-musl": ["@swc/core-linux-arm64-musl@1.15.10", "", { "os": "linux", "cpu": "arm64" }, "sha512-4uAHO3nbfbrTcmO/9YcVweTQdx5fN3l7ewwl5AEK4yoC4wXmoBTEPHAVdKNe4r9+xrTgd4BgyPsy0409OjjlMw=="],
+
+ "@swc/core-linux-x64-gnu": ["@swc/core-linux-x64-gnu@1.15.10", "", { "os": "linux", "cpu": "x64" }, "sha512-W0h9ONNw1pVIA0cN7wtboOSTl4Jk3tHq+w2cMPQudu9/+3xoCxpFb9ZdehwCAk29IsvdWzGzY6P7dDVTyFwoqg=="],
+
+ "@swc/core-linux-x64-musl": ["@swc/core-linux-x64-musl@1.15.10", "", { "os": "linux", "cpu": "x64" }, "sha512-XQNZlLZB62S8nAbw7pqoqwy91Ldy2RpaMRqdRN3T+tAg6Xg6FywXRKCsLh6IQOadr4p1+lGnqM/Wn35z5a/0Vw=="],
+
+ "@swc/core-win32-arm64-msvc": ["@swc/core-win32-arm64-msvc@1.15.10", "", { "os": "win32", "cpu": "arm64" }, "sha512-qnAGrRv5Nj/DATxAmCnJQRXXQqnJwR0trxLndhoHoxGci9MuguNIjWahS0gw8YZFjgTinbTxOwzatkoySihnmw=="],
+
+ "@swc/core-win32-ia32-msvc": ["@swc/core-win32-ia32-msvc@1.15.10", "", { "os": "win32", "cpu": "ia32" }, "sha512-i4X/q8QSvzVlaRtv1xfnfl+hVKpCfiJ+9th484rh937fiEZKxZGf51C+uO0lfKDP1FfnT6C1yBYwHy7FLBVXFw=="],
+
+ "@swc/core-win32-x64-msvc": ["@swc/core-win32-x64-msvc@1.15.10", "", { "os": "win32", "cpu": "x64" }, "sha512-HvY8XUFuoTXn6lSccDLYFlXv1SU/PzYi4PyUqGT++WfTnbw/68N/7BdUZqglGRwiSqr0qhYt/EhmBpULj0J9rA=="],
+
+ "@swc/counter": ["@swc/counter@0.1.3", "", {}, "sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ=="],
+
+ "@swc/helpers": ["@swc/helpers@0.5.5", "", { "dependencies": { "@swc/counter": "^0.1.3", "tslib": "^2.4.0" } }, "sha512-KGYxvIOXcceOAbEk4bi/dVLEK9z8sZ0uBB3Il5b1rhfClSpcX0yfRO0KmTkqR2cnQDymwLB+25ZyMzICg/cm/A=="],
+
+ "@swc/types": ["@swc/types@0.1.25", "", { "dependencies": { "@swc/counter": "^0.1.3" } }, "sha512-iAoY/qRhNH8a/hBvm3zKj9qQ4oc2+3w1unPJa2XvTK3XjeLXtzcCingVPw/9e5mn1+0yPqxcBGp9Jf0pkfMb1g=="],
+
+ "@szmarczak/http-timer": ["@szmarczak/http-timer@5.0.1", "", { "dependencies": { "defer-to-connect": "^2.0.1" } }, "sha512-+PmQX0PiAYPMeVYe237LJAYvOMYW1j2rH5YROyS3b4CTVJum34HfRvKvAzozHAQG0TnHNdUfY9nCeUyRAs//cw=="],
+
+ "@tanstack/react-virtual": ["@tanstack/react-virtual@3.13.18", "", { "dependencies": { "@tanstack/virtual-core": "3.13.18" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, "sha512-dZkhyfahpvlaV0rIKnvQiVoWPyURppl6w4m9IwMDpuIjcJ1sD9YGWrt0wISvgU7ewACXx2Ct46WPgI6qAD4v6A=="],
+
+ "@tanstack/virtual-core": ["@tanstack/virtual-core@3.13.18", "", {}, "sha512-Mx86Hqu1k39icq2Zusq+Ey2J6dDWTjDvEv43PJtRCoEYTLyfaPnxIQ6iy7YAOK0NV/qOEmZQ/uCufrppZxTgcg=="],
+
+ "@theguild/remark-mermaid": ["@theguild/remark-mermaid@0.0.5", "", { "dependencies": { "mermaid": "^10.2.2", "unist-util-visit": "^5.0.0" }, "peerDependencies": { "react": "^18.2.0" } }, "sha512-e+ZIyJkEv9jabI4m7q29wZtZv+2iwPGsXJ2d46Zi7e+QcFudiyuqhLhHG/3gX3ZEB+hxTch+fpItyMS8jwbIcw=="],
+
+ "@theguild/remark-npm2yarn": ["@theguild/remark-npm2yarn@0.2.1", "", { "dependencies": { "npm-to-yarn": "^2.1.0", "unist-util-visit": "^5.0.0" } }, "sha512-jUTFWwDxtLEFtGZh/TW/w30ySaDJ8atKWH8dq2/IiQF61dPrGfETpl0WxD0VdBfuLOeU14/kop466oBSRO/5CA=="],
+
+ "@tokenizer/token": ["@tokenizer/token@0.3.0", "", {}, "sha512-OvjF+z51L3ov0OyAU0duzsYuvO01PH7x4t6DJx+guahgTnBHkhJdG7soQeTSFLWN3efnHyibZ4Z8l2EuWwJN3A=="],
+
+ "@tootallnate/quickjs-emscripten": ["@tootallnate/quickjs-emscripten@0.23.0", "", {}, "sha512-C5Mc6rdnsaJDjO3UpGW/CQTHtCKaYlScZTly4JIu97Jxo/odCiH0ITnDXSJPTOrEKk/ycSZ0AOgTmkDtkOsvIA=="],
+
+ "@trpc/client": ["@trpc/client@11.8.1", "", { "peerDependencies": { "@trpc/server": "11.8.1", "typescript": ">=5.7.2" } }, "sha512-L/SJFGanr9xGABmuDoeXR4xAdHJmsXsiF9OuH+apecJ+8sUITzVT1EPeqp0ebqA6lBhEl5pPfg3rngVhi/h60Q=="],
+
+ "@trpc/server": ["@trpc/server@11.8.1", "", { "peerDependencies": { "typescript": ">=5.7.2" } }, "sha512-P4rzZRpEL7zDFgjxK65IdyH0e41FMFfTkQkuq0BA5tKcr7E6v9/v38DEklCpoDN6sPiB1Sigy/PUEzHENhswDA=="],
+
+ "@trysound/sax": ["@trysound/sax@0.2.0", "", {}, "sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA=="],
+
+ "@ts-morph/common": ["@ts-morph/common@0.24.0", "", { "dependencies": { "fast-glob": "^3.3.2", "minimatch": "^9.0.4", "mkdirp": "^3.0.1", "path-browserify": "^1.0.1" } }, "sha512-c1xMmNHWpNselmpIqursHeOHHBTIsJLbB+NuovbTTRCNiTLEr/U9dbJ8qy0jd/O2x5pc3seWuOUN5R2IoOTp8A=="],
+
+ "@tsconfig/node10": ["@tsconfig/node10@1.0.12", "", {}, "sha512-UCYBaeFvM11aU2y3YPZ//O5Rhj+xKyzy7mvcIoAjASbigy8mHMryP5cK7dgjlz2hWxh1g5pLw084E0a/wlUSFQ=="],
+
+ "@tsconfig/node12": ["@tsconfig/node12@1.0.11", "", {}, "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag=="],
+
+ "@tsconfig/node14": ["@tsconfig/node14@1.0.3", "", {}, "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow=="],
+
+ "@tsconfig/node16": ["@tsconfig/node16@1.0.4", "", {}, "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA=="],
+
+ "@tybys/wasm-util": ["@tybys/wasm-util@0.10.1", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg=="],
+
+ "@types/acorn": ["@types/acorn@4.0.6", "", { "dependencies": { "@types/estree": "*" } }, "sha512-veQTnWP+1D/xbxVrPC3zHnCZRjSrKfhbMUlEA43iMZLu7EsnTtkJklIuwrCPbOi8YkvDQAiW05VQQFvvz9oieQ=="],
+
+ "@types/babel__core": ["@types/babel__core@7.20.5", "", { "dependencies": { "@babel/parser": "^7.20.7", "@babel/types": "^7.20.7", "@types/babel__generator": "*", "@types/babel__template": "*", "@types/babel__traverse": "*" } }, "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA=="],
+
+ "@types/babel__generator": ["@types/babel__generator@7.27.0", "", { "dependencies": { "@babel/types": "^7.0.0" } }, "sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg=="],
+
+ "@types/babel__template": ["@types/babel__template@7.4.4", "", { "dependencies": { "@babel/parser": "^7.1.0", "@babel/types": "^7.0.0" } }, "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A=="],
+
+ "@types/babel__traverse": ["@types/babel__traverse@7.28.0", "", { "dependencies": { "@babel/types": "^7.28.2" } }, "sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q=="],
+
+ "@types/body-parser": ["@types/body-parser@1.19.6", "", { "dependencies": { "@types/connect": "*", "@types/node": "*" } }, "sha512-HLFeCYgz89uk22N5Qg3dvGvsv46B8GLvKKo1zKG4NybA8U2DiEO3w9lqGg29t/tfLRJpJ6iQxnVw4OnB7MoM9g=="],
+
+ "@types/cacheable-request": ["@types/cacheable-request@6.0.3", "", { "dependencies": { "@types/http-cache-semantics": "*", "@types/keyv": "^3.1.4", "@types/node": "*", "@types/responselike": "^1.0.0" } }, "sha512-IQ3EbTzGxIigb1I3qPZc1rWJnH0BmSKv5QYTalEwweFvyBDLSAe24zP0le/hyi7ecGfZVlIVAg4BZqb8WBwKqw=="],
+
+ "@types/connect": ["@types/connect@3.4.38", "", { "dependencies": { "@types/node": "*" } }, "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug=="],
+
+ "@types/conventional-commits-parser": ["@types/conventional-commits-parser@5.0.2", "", { "dependencies": { "@types/node": "*" } }, "sha512-BgT2szDXnVypgpNxOK8aL5SGjUdaQbC++WZNjF1Qge3Og2+zhHj+RWhmehLhYyvQwqAmvezruVfOf8+3m74W+g=="],
+
+ "@types/cookiejar": ["@types/cookiejar@2.1.5", "", {}, "sha512-he+DHOWReW0nghN24E1WUqM0efK4kI9oTqDm6XmK8ZPe2djZ90BSNdGnIyCLzCPw7/pogPlGbzI2wHGGmi4O/Q=="],
+
+ "@types/d3-scale": ["@types/d3-scale@4.0.9", "", { "dependencies": { "@types/d3-time": "*" } }, "sha512-dLmtwB8zkAeO/juAMfnV+sItKjlsw2lKdZVVy6LRr0cBmegxSABiLEpGVmSJJ8O08i4+sGR6qQtb6WtuwJdvVw=="],
+
+ "@types/d3-scale-chromatic": ["@types/d3-scale-chromatic@3.1.0", "", {}, "sha512-iWMJgwkK7yTRmWqRB5plb1kadXyQ5Sj8V/zYlFGMUBbIPKQScw+Dku9cAAMgJG+z5GYDoMjWGLVOvjghDEFnKQ=="],
+
+ "@types/d3-time": ["@types/d3-time@3.0.4", "", {}, "sha512-yuzZug1nkAAaBlBBikKZTgzCeA+k1uy4ZFwWANOfKw5z5LRhV0gNA7gNkKm7HoK+HRN0wX3EkxGk0fpbWhmB7g=="],
+
+ "@types/debug": ["@types/debug@4.1.12", "", { "dependencies": { "@types/ms": "*" } }, "sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ=="],
+
+ "@types/eslint": ["@types/eslint@9.6.1", "", { "dependencies": { "@types/estree": "*", "@types/json-schema": "*" } }, "sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag=="],
+
+ "@types/eslint-scope": ["@types/eslint-scope@3.7.7", "", { "dependencies": { "@types/eslint": "*", "@types/estree": "*" } }, "sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg=="],
+
+ "@types/estree": ["@types/estree@1.0.8", "", {}, "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w=="],
+
+ "@types/estree-jsx": ["@types/estree-jsx@1.0.5", "", { "dependencies": { "@types/estree": "*" } }, "sha512-52CcUVNFyfb1A2ALocQw/Dd1BQFNmSdkuC3BkZ6iqhdMfQz7JWOFRuJFloOzjk+6WijU56m9oKXFAXc7o3Towg=="],
+
+ "@types/express": ["@types/express@4.17.25", "", { "dependencies": { "@types/body-parser": "*", "@types/express-serve-static-core": "^4.17.33", "@types/qs": "*", "@types/serve-static": "^1" } }, "sha512-dVd04UKsfpINUnK0yBoYHDF3xu7xVH4BuDotC/xGuycx4CgbP48X/KF/586bcObxT0HENHXEU8Nqtu6NR+eKhw=="],
+
+ "@types/express-serve-static-core": ["@types/express-serve-static-core@4.19.8", "", { "dependencies": { "@types/node": "*", "@types/qs": "*", "@types/range-parser": "*", "@types/send": "*" } }, "sha512-02S5fmqeoKzVZCHPZid4b8JH2eM5HzQLZWN2FohQEy/0eXTq8VXZfSN6Pcr3F6N9R/vNrj7cpgbhjie6m/1tCA=="],
+
+ "@types/graceful-fs": ["@types/graceful-fs@4.1.9", "", { "dependencies": { "@types/node": "*" } }, "sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ=="],
+
+ "@types/hast": ["@types/hast@3.0.4", "", { "dependencies": { "@types/unist": "*" } }, "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ=="],
+
+ "@types/http-cache-semantics": ["@types/http-cache-semantics@4.0.4", "", {}, "sha512-1m0bIFVc7eJWyve9S0RnuRgcQqF/Xd5QsUZAZeQFr1Q3/p9JWoQQEqmVy+DPTNpGXwhgIetAoYF8JSc33q29QA=="],
+
+ "@types/http-errors": ["@types/http-errors@2.0.5", "", {}, "sha512-r8Tayk8HJnX0FztbZN7oVqGccWgw98T/0neJphO91KkmOzug1KkofZURD4UaD5uH8AqcFLfdPErnBod0u71/qg=="],
+
+ "@types/istanbul-lib-coverage": ["@types/istanbul-lib-coverage@2.0.6", "", {}, "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w=="],
+
+ "@types/istanbul-lib-report": ["@types/istanbul-lib-report@3.0.3", "", { "dependencies": { "@types/istanbul-lib-coverage": "*" } }, "sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA=="],
+
+ "@types/istanbul-reports": ["@types/istanbul-reports@3.0.4", "", { "dependencies": { "@types/istanbul-lib-report": "*" } }, "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ=="],
+
+ "@types/jest": ["@types/jest@29.5.12", "", { "dependencies": { "expect": "^29.0.0", "pretty-format": "^29.0.0" } }, "sha512-eDC8bTvT/QhYdxJAulQikueigY5AsdBRH2yDKW3yveW7svY3+DzN84/2NUgkw10RTiJbWqZrTtoGVdYlvFJdLw=="],
+
+ "@types/js-yaml": ["@types/js-yaml@4.0.9", "", {}, "sha512-k4MGaQl5TGo/iipqb2UDG2UwjXziSWkh0uysQelTlJpX1qGlpUZYm8PnO4DxG1qBomtJUdYJ6qR6xdIah10JLg=="],
+
+ "@types/json-schema": ["@types/json-schema@7.0.15", "", {}, "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA=="],
+
+ "@types/json5": ["@types/json5@0.0.29", "", {}, "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ=="],
+
+ "@types/katex": ["@types/katex@0.16.8", "", {}, "sha512-trgaNyfU+Xh2Tc+ABIb44a5AYUpicB3uwirOioeOkNPPbmgRNtcWyDeeFRzjPZENO9Vq8gvVqfhaaXWLlevVwg=="],
+
+ "@types/keyv": ["@types/keyv@3.1.4", "", { "dependencies": { "@types/node": "*" } }, "sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg=="],
+
+ "@types/lodash": ["@types/lodash@4.17.23", "", {}, "sha512-RDvF6wTulMPjrNdCoYRC8gNR880JNGT8uB+REUpC2Ns4pRqQJhGz90wh7rgdXDPpCczF3VGktDuFGVnz8zP7HA=="],
+
+ "@types/mdast": ["@types/mdast@3.0.15", "", { "dependencies": { "@types/unist": "^2" } }, "sha512-LnwD+mUEfxWMa1QpDraczIn6k0Ee3SMicuYSSzS6ZYl2gKS09EClnJYGd8Du6rfc5r/GZEk5o1mRb8TaTj03sQ=="],
+
+ "@types/mdx": ["@types/mdx@2.0.13", "", {}, "sha512-+OWZQfAYyio6YkJb3HLxDrvnx6SWWDbC0zVPfBRzUk0/nqoDyf6dNxQi3eArPe8rJ473nobTMQ/8Zk+LxJ+Yuw=="],
+
+ "@types/methods": ["@types/methods@1.1.4", "", {}, "sha512-ymXWVrDiCxTBE3+RIrrP533E70eA+9qu7zdWoHuOmGujkYtzf4HQF96b8nwHLqhuf4ykX61IGRIB38CC6/sImQ=="],
+
+ "@types/mime": ["@types/mime@1.3.5", "", {}, "sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w=="],
+
+ "@types/minimatch": ["@types/minimatch@3.0.5", "", {}, "sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ=="],
+
+ "@types/ms": ["@types/ms@2.1.0", "", {}, "sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA=="],
+
+ "@types/node": ["@types/node@20.14.11", "", { "dependencies": { "undici-types": "~5.26.4" } }, "sha512-kprQpL8MMeszbz6ojB5/tU8PLN4kesnN8Gjzw349rDlNgsSzg90lAVj3llK99Dh7JON+t9AuscPPFW6mPbTnSA=="],
+
+ "@types/normalize-package-data": ["@types/normalize-package-data@2.4.4", "", {}, "sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA=="],
+
+ "@types/parse-json": ["@types/parse-json@4.0.2", "", {}, "sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw=="],
+
+ "@types/prop-types": ["@types/prop-types@15.7.15", "", {}, "sha512-F6bEyamV9jKGAFBEmlQnesRPGOQqS2+Uwi0Em15xenOxHaf2hv6L8YCVn3rPdPJOiJfPiCnLIRyvwVaqMY3MIw=="],
+
+ "@types/qs": ["@types/qs@6.14.0", "", {}, "sha512-eOunJqu0K1923aExK6y8p6fsihYEn/BYuQ4g0CxAAgFc4b/ZLN4CrsRZ55srTdqoiLzU2B2evC+apEIxprEzkQ=="],
+
+ "@types/range-parser": ["@types/range-parser@1.2.7", "", {}, "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ=="],
+
+ "@types/react": ["@types/react@18.3.27", "", { "dependencies": { "@types/prop-types": "*", "csstype": "^3.2.2" } }, "sha512-cisd7gxkzjBKU2GgdYrTdtQx1SORymWyaAFhaxQPK9bYO9ot3Y5OikQRvY0VYQtvwjeQnizCINJAenh/V7MK2w=="],
+
+ "@types/react-dom": ["@types/react-dom@18.3.7", "", { "peerDependencies": { "@types/react": "^18.0.0" } }, "sha512-MEe3UeoENYVFXzoXEWsvcpg6ZvlrFNlOQ7EOsvhI3CfAXwzPfO8Qwuxd40nepsYKqyyVQnTdEfv68q91yLcKrQ=="],
+
+ "@types/responselike": ["@types/responselike@1.0.3", "", { "dependencies": { "@types/node": "*" } }, "sha512-H/+L+UkTV33uf49PH5pCAUBVPNj2nDBXTN+qS1dOwyyg24l3CcicicCA7ca+HMvJBZcFgl5r8e+RR6elsb4Lyw=="],
+
+ "@types/scheduler": ["@types/scheduler@0.26.0", "", {}, "sha512-WFHp9YUJQ6CKshqoC37iOlHnQSmxNc795UhB26CyBBttrN9svdIrUjl/NjnNmfcwtncN0h/0PPAFWv9ovP8mLA=="],
+
+ "@types/semver": ["@types/semver@7.7.1", "", {}, "sha512-FmgJfu+MOcQ370SD0ev7EI8TlCAfKYU+B4m5T3yXc1CiRN94g/SZPtsCkk506aUDtlMnFZvasDwHHUcZUEaYuA=="],
+
+ "@types/send": ["@types/send@0.17.6", "", { "dependencies": { "@types/mime": "^1", "@types/node": "*" } }, "sha512-Uqt8rPBE8SY0RK8JB1EzVOIZ32uqy8HwdxCnoCOsYrvnswqmFZ/k+9Ikidlk/ImhsdvBsloHbAlewb2IEBV/Og=="],
+
+ "@types/serve-static": ["@types/serve-static@1.15.10", "", { "dependencies": { "@types/http-errors": "*", "@types/node": "*", "@types/send": "<1" } }, "sha512-tRs1dB+g8Itk72rlSI2ZrW6vZg0YrLI81iQSTkMmOqnqCaNr/8Ek4VwWcN5vZgCYWbg/JJSGBlUaYGAOP73qBw=="],
+
+ "@types/stack-utils": ["@types/stack-utils@2.0.3", "", {}, "sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw=="],
+
+ "@types/superagent": ["@types/superagent@8.1.9", "", { "dependencies": { "@types/cookiejar": "^2.1.5", "@types/methods": "^1.1.4", "@types/node": "*", "form-data": "^4.0.0" } }, "sha512-pTVjI73witn+9ILmoJdajHGW2jkSaOzhiFYF1Rd3EQ94kymLqB9PjD9ISg7WaALC7+dCHT0FGe9T2LktLq/3GQ=="],
+
+ "@types/supertest": ["@types/supertest@6.0.3", "", { "dependencies": { "@types/methods": "^1.1.4", "@types/superagent": "^8.1.0" } }, "sha512-8WzXq62EXFhJ7QsH3Ocb/iKQ/Ty9ZVWnVzoTKc9tyyFRRF3a74Tk2+TLFgaFFw364Ere+npzHKEJ6ga2LzIL7w=="],
+
+ "@types/trusted-types": ["@types/trusted-types@2.0.7", "", {}, "sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw=="],
+
+ "@types/unist": ["@types/unist@3.0.3", "", {}, "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q=="],
+
+ "@types/yargs": ["@types/yargs@17.0.35", "", { "dependencies": { "@types/yargs-parser": "*" } }, "sha512-qUHkeCyQFxMXg79wQfTtfndEC+N9ZZg76HJftDJp+qH2tV7Gj4OJi7l+PiWwJ+pWtW8GwSmqsDj/oymhrTWXjg=="],
+
+ "@types/yargs-parser": ["@types/yargs-parser@21.0.3", "", {}, "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ=="],
+
+ "@typescript-eslint/eslint-plugin": ["@typescript-eslint/eslint-plugin@8.53.1", "", { "dependencies": { "@eslint-community/regexpp": "^4.12.2", "@typescript-eslint/scope-manager": "8.53.1", "@typescript-eslint/type-utils": "8.53.1", "@typescript-eslint/utils": "8.53.1", "@typescript-eslint/visitor-keys": "8.53.1", "ignore": "^7.0.5", "natural-compare": "^1.4.0", "ts-api-utils": "^2.4.0" }, "peerDependencies": { "@typescript-eslint/parser": "^8.53.1", "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <6.0.0" } }, "sha512-cFYYFZ+oQFi6hUnBTbLRXfTJiaQtYE3t4O692agbBl+2Zy+eqSKWtPjhPXJu1G7j4RLjKgeJPDdq3EqOwmX5Ag=="],
+
+ "@typescript-eslint/parser": ["@typescript-eslint/parser@8.53.1", "", { "dependencies": { "@typescript-eslint/scope-manager": "8.53.1", "@typescript-eslint/types": "8.53.1", "@typescript-eslint/typescript-estree": "8.53.1", "@typescript-eslint/visitor-keys": "8.53.1", "debug": "^4.4.3" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <6.0.0" } }, "sha512-nm3cvFN9SqZGXjmw5bZ6cGmvJSyJPn0wU9gHAZZHDnZl2wF9PhHv78Xf06E0MaNk4zLVHL8hb2/c32XvyJOLQg=="],
+
+ "@typescript-eslint/project-service": ["@typescript-eslint/project-service@8.53.1", "", { "dependencies": { "@typescript-eslint/tsconfig-utils": "^8.53.1", "@typescript-eslint/types": "^8.53.1", "debug": "^4.4.3" }, "peerDependencies": { "typescript": ">=4.8.4 <6.0.0" } }, "sha512-WYC4FB5Ra0xidsmlPb+1SsnaSKPmS3gsjIARwbEkHkoWloQmuzcfypljaJcR78uyLA1h8sHdWWPHSLDI+MtNog=="],
+
+ "@typescript-eslint/scope-manager": ["@typescript-eslint/scope-manager@8.53.1", "", { "dependencies": { "@typescript-eslint/types": "8.53.1", "@typescript-eslint/visitor-keys": "8.53.1" } }, "sha512-Lu23yw1uJMFY8cUeq7JlrizAgeQvWugNQzJp8C3x8Eo5Jw5Q2ykMdiiTB9vBVOOUBysMzmRRmUfwFrZuI2C4SQ=="],
+
+ "@typescript-eslint/tsconfig-utils": ["@typescript-eslint/tsconfig-utils@8.53.1", "", { "peerDependencies": { "typescript": ">=4.8.4 <6.0.0" } }, "sha512-qfvLXS6F6b1y43pnf0pPbXJ+YoXIC7HKg0UGZ27uMIemKMKA6XH2DTxsEDdpdN29D+vHV07x/pnlPNVLhdhWiA=="],
+
+ "@typescript-eslint/type-utils": ["@typescript-eslint/type-utils@8.53.1", "", { "dependencies": { "@typescript-eslint/types": "8.53.1", "@typescript-eslint/typescript-estree": "8.53.1", "@typescript-eslint/utils": "8.53.1", "debug": "^4.4.3", "ts-api-utils": "^2.4.0" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <6.0.0" } }, "sha512-MOrdtNvyhy0rHyv0ENzub1d4wQYKb2NmIqG7qEqPWFW7Mpy2jzFC3pQ2yKDvirZB7jypm5uGjF2Qqs6OIqu47w=="],
+
+ "@typescript-eslint/types": ["@typescript-eslint/types@8.53.1", "", {}, "sha512-jr/swrr2aRmUAUjW5/zQHbMaui//vQlsZcJKijZf3M26bnmLj8LyZUpj8/Rd6uzaek06OWsqdofN/Thenm5O8A=="],
+
+ "@typescript-eslint/typescript-estree": ["@typescript-eslint/typescript-estree@8.53.1", "", { "dependencies": { "@typescript-eslint/project-service": "8.53.1", "@typescript-eslint/tsconfig-utils": "8.53.1", "@typescript-eslint/types": "8.53.1", "@typescript-eslint/visitor-keys": "8.53.1", "debug": "^4.4.3", "minimatch": "^9.0.5", "semver": "^7.7.3", "tinyglobby": "^0.2.15", "ts-api-utils": "^2.4.0" }, "peerDependencies": { "typescript": ">=4.8.4 <6.0.0" } }, "sha512-RGlVipGhQAG4GxV1s34O91cxQ/vWiHJTDHbXRr0li2q/BGg3RR/7NM8QDWgkEgrwQYCvmJV9ichIwyoKCQ+DTg=="],
+
+ "@typescript-eslint/utils": ["@typescript-eslint/utils@8.53.1", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.9.1", "@typescript-eslint/scope-manager": "8.53.1", "@typescript-eslint/types": "8.53.1", "@typescript-eslint/typescript-estree": "8.53.1" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <6.0.0" } }, "sha512-c4bMvGVWW4hv6JmDUEG7fSYlWOl3II2I4ylt0NM+seinYQlZMQIaKaXIIVJWt9Ofh6whrpM+EdDQXKXjNovvrg=="],
+
+ "@typescript-eslint/visitor-keys": ["@typescript-eslint/visitor-keys@8.53.1", "", { "dependencies": { "@typescript-eslint/types": "8.53.1", "eslint-visitor-keys": "^4.2.1" } }, "sha512-oy+wV7xDKFPRyNggmXuZQSBzvoLnpmJs+GhzRhPjrxl2b/jIlyjVokzm47CZCDUdXKr2zd7ZLodPfOBpOPyPlg=="],
+
+ "@uidotdev/usehooks": ["@uidotdev/usehooks@2.4.1", "", { "peerDependencies": { "react": ">=18.0.0", "react-dom": ">=18.0.0" } }, "sha512-1I+RwWyS+kdv3Mv0Vmc+p0dPYH0DTRAo04HLyXReYBL9AeseDWUJyi4THuksBJcu9F0Pih69Ak150VDnqbVnXg=="],
+
+ "@ungap/structured-clone": ["@ungap/structured-clone@1.3.0", "", {}, "sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g=="],
+
+ "@unrs/resolver-binding-android-arm-eabi": ["@unrs/resolver-binding-android-arm-eabi@1.11.1", "", { "os": "android", "cpu": "arm" }, "sha512-ppLRUgHVaGRWUx0R0Ut06Mjo9gBaBkg3v/8AxusGLhsIotbBLuRk51rAzqLC8gq6NyyAojEXglNjzf6R948DNw=="],
+
+ "@unrs/resolver-binding-android-arm64": ["@unrs/resolver-binding-android-arm64@1.11.1", "", { "os": "android", "cpu": "arm64" }, "sha512-lCxkVtb4wp1v+EoN+HjIG9cIIzPkX5OtM03pQYkG+U5O/wL53LC4QbIeazgiKqluGeVEeBlZahHalCaBvU1a2g=="],
+
+ "@unrs/resolver-binding-darwin-arm64": ["@unrs/resolver-binding-darwin-arm64@1.11.1", "", { "os": "darwin", "cpu": "arm64" }, "sha512-gPVA1UjRu1Y/IsB/dQEsp2V1pm44Of6+LWvbLc9SDk1c2KhhDRDBUkQCYVWe6f26uJb3fOK8saWMgtX8IrMk3g=="],
+
+ "@unrs/resolver-binding-darwin-x64": ["@unrs/resolver-binding-darwin-x64@1.11.1", "", { "os": "darwin", "cpu": "x64" }, "sha512-cFzP7rWKd3lZaCsDze07QX1SC24lO8mPty9vdP+YVa3MGdVgPmFc59317b2ioXtgCMKGiCLxJ4HQs62oz6GfRQ=="],
+
+ "@unrs/resolver-binding-freebsd-x64": ["@unrs/resolver-binding-freebsd-x64@1.11.1", "", { "os": "freebsd", "cpu": "x64" }, "sha512-fqtGgak3zX4DCB6PFpsH5+Kmt/8CIi4Bry4rb1ho6Av2QHTREM+47y282Uqiu3ZRF5IQioJQ5qWRV6jduA+iGw=="],
+
+ "@unrs/resolver-binding-linux-arm-gnueabihf": ["@unrs/resolver-binding-linux-arm-gnueabihf@1.11.1", "", { "os": "linux", "cpu": "arm" }, "sha512-u92mvlcYtp9MRKmP+ZvMmtPN34+/3lMHlyMj7wXJDeXxuM0Vgzz0+PPJNsro1m3IZPYChIkn944wW8TYgGKFHw=="],
+
+ "@unrs/resolver-binding-linux-arm-musleabihf": ["@unrs/resolver-binding-linux-arm-musleabihf@1.11.1", "", { "os": "linux", "cpu": "arm" }, "sha512-cINaoY2z7LVCrfHkIcmvj7osTOtm6VVT16b5oQdS4beibX2SYBwgYLmqhBjA1t51CarSaBuX5YNsWLjsqfW5Cw=="],
+
+ "@unrs/resolver-binding-linux-arm64-gnu": ["@unrs/resolver-binding-linux-arm64-gnu@1.11.1", "", { "os": "linux", "cpu": "arm64" }, "sha512-34gw7PjDGB9JgePJEmhEqBhWvCiiWCuXsL9hYphDF7crW7UgI05gyBAi6MF58uGcMOiOqSJ2ybEeCvHcq0BCmQ=="],
+
+ "@unrs/resolver-binding-linux-arm64-musl": ["@unrs/resolver-binding-linux-arm64-musl@1.11.1", "", { "os": "linux", "cpu": "arm64" }, "sha512-RyMIx6Uf53hhOtJDIamSbTskA99sPHS96wxVE/bJtePJJtpdKGXO1wY90oRdXuYOGOTuqjT8ACccMc4K6QmT3w=="],
+
+ "@unrs/resolver-binding-linux-ppc64-gnu": ["@unrs/resolver-binding-linux-ppc64-gnu@1.11.1", "", { "os": "linux", "cpu": "ppc64" }, "sha512-D8Vae74A4/a+mZH0FbOkFJL9DSK2R6TFPC9M+jCWYia/q2einCubX10pecpDiTmkJVUH+y8K3BZClycD8nCShA=="],
+
+ "@unrs/resolver-binding-linux-riscv64-gnu": ["@unrs/resolver-binding-linux-riscv64-gnu@1.11.1", "", { "os": "linux", "cpu": "none" }, "sha512-frxL4OrzOWVVsOc96+V3aqTIQl1O2TjgExV4EKgRY09AJ9leZpEg8Ak9phadbuX0BA4k8U5qtvMSQQGGmaJqcQ=="],
+
+ "@unrs/resolver-binding-linux-riscv64-musl": ["@unrs/resolver-binding-linux-riscv64-musl@1.11.1", "", { "os": "linux", "cpu": "none" }, "sha512-mJ5vuDaIZ+l/acv01sHoXfpnyrNKOk/3aDoEdLO/Xtn9HuZlDD6jKxHlkN8ZhWyLJsRBxfv9GYM2utQ1SChKew=="],
+
+ "@unrs/resolver-binding-linux-s390x-gnu": ["@unrs/resolver-binding-linux-s390x-gnu@1.11.1", "", { "os": "linux", "cpu": "s390x" }, "sha512-kELo8ebBVtb9sA7rMe1Cph4QHreByhaZ2QEADd9NzIQsYNQpt9UkM9iqr2lhGr5afh885d/cB5QeTXSbZHTYPg=="],
+
+ "@unrs/resolver-binding-linux-x64-gnu": ["@unrs/resolver-binding-linux-x64-gnu@1.11.1", "", { "os": "linux", "cpu": "x64" }, "sha512-C3ZAHugKgovV5YvAMsxhq0gtXuwESUKc5MhEtjBpLoHPLYM+iuwSj3lflFwK3DPm68660rZ7G8BMcwSro7hD5w=="],
+
+ "@unrs/resolver-binding-linux-x64-musl": ["@unrs/resolver-binding-linux-x64-musl@1.11.1", "", { "os": "linux", "cpu": "x64" }, "sha512-rV0YSoyhK2nZ4vEswT/QwqzqQXw5I6CjoaYMOX0TqBlWhojUf8P94mvI7nuJTeaCkkds3QE4+zS8Ko+GdXuZtA=="],
+
+ "@unrs/resolver-binding-wasm32-wasi": ["@unrs/resolver-binding-wasm32-wasi@1.11.1", "", { "dependencies": { "@napi-rs/wasm-runtime": "^0.2.11" }, "cpu": "none" }, "sha512-5u4RkfxJm+Ng7IWgkzi3qrFOvLvQYnPBmjmZQ8+szTK/b31fQCnleNl1GgEt7nIsZRIf5PLhPwT0WM+q45x/UQ=="],
+
+ "@unrs/resolver-binding-win32-arm64-msvc": ["@unrs/resolver-binding-win32-arm64-msvc@1.11.1", "", { "os": "win32", "cpu": "arm64" }, "sha512-nRcz5Il4ln0kMhfL8S3hLkxI85BXs3o8EYoattsJNdsX4YUU89iOkVn7g0VHSRxFuVMdM4Q1jEpIId1Ihim/Uw=="],
+
+ "@unrs/resolver-binding-win32-ia32-msvc": ["@unrs/resolver-binding-win32-ia32-msvc@1.11.1", "", { "os": "win32", "cpu": "ia32" }, "sha512-DCEI6t5i1NmAZp6pFonpD5m7i6aFrpofcp4LA2i8IIq60Jyo28hamKBxNrZcyOwVOZkgsRp9O2sXWBWP8MnvIQ=="],
+
+ "@unrs/resolver-binding-win32-x64-msvc": ["@unrs/resolver-binding-win32-x64-msvc@1.11.1", "", { "os": "win32", "cpu": "x64" }, "sha512-lrW200hZdbfRtztbygyaq/6jP6AKE8qQN2KvPcJ+x7wiD038YtnYtZ82IMNJ69GJibV7bwL3y9FgK+5w/pYt6g=="],
+
+ "@vercel/analytics": ["@vercel/analytics@1.6.1", "", { "peerDependencies": { "@remix-run/react": "^2", "@sveltejs/kit": "^1 || ^2", "next": ">= 13", "react": "^18 || ^19 || ^19.0.0-rc", "svelte": ">= 4", "vue": "^3", "vue-router": "^4" }, "optionalPeers": ["@remix-run/react", "@sveltejs/kit", "next", "react", "svelte", "vue", "vue-router"] }, "sha512-oH9He/bEM+6oKlv3chWuOOcp8Y6fo6/PSro8hEkgCW3pu9/OiCXiUpRUogDh3Fs3LH2sosDrx8CxeOLBEE+afg=="],
+
+ "@webassemblyjs/ast": ["@webassemblyjs/ast@1.14.1", "", { "dependencies": { "@webassemblyjs/helper-numbers": "1.13.2", "@webassemblyjs/helper-wasm-bytecode": "1.13.2" } }, "sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ=="],
+
+ "@webassemblyjs/floating-point-hex-parser": ["@webassemblyjs/floating-point-hex-parser@1.13.2", "", {}, "sha512-6oXyTOzbKxGH4steLbLNOu71Oj+C8Lg34n6CqRvqfS2O71BxY6ByfMDRhBytzknj9yGUPVJ1qIKhRlAwO1AovA=="],
+
+ "@webassemblyjs/helper-api-error": ["@webassemblyjs/helper-api-error@1.13.2", "", {}, "sha512-U56GMYxy4ZQCbDZd6JuvvNV/WFildOjsaWD3Tzzvmw/mas3cXzRJPMjP83JqEsgSbyrmaGjBfDtV7KDXV9UzFQ=="],
+
+ "@webassemblyjs/helper-buffer": ["@webassemblyjs/helper-buffer@1.14.1", "", {}, "sha512-jyH7wtcHiKssDtFPRB+iQdxlDf96m0E39yb0k5uJVhFGleZFoNw1c4aeIcVUPPbXUVJ94wwnMOAqUHyzoEPVMA=="],
+
+ "@webassemblyjs/helper-numbers": ["@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" } }, "sha512-FE8aCmS5Q6eQYcV3gI35O4J789wlQA+7JrqTTpJqn5emA4U2hvwJmvFRC0HODS+3Ye6WioDklgd6scJ3+PLnEA=="],
+
+ "@webassemblyjs/helper-wasm-bytecode": ["@webassemblyjs/helper-wasm-bytecode@1.13.2", "", {}, "sha512-3QbLKy93F0EAIXLh0ogEVR6rOubA9AoZ+WRYhNbFyuB70j3dRdwH9g+qXhLAO0kiYGlg3TxDV+I4rQTr/YNXkA=="],
+
+ "@webassemblyjs/helper-wasm-section": ["@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" } }, "sha512-ds5mXEqTJ6oxRoqjhWDU83OgzAYjwsCV8Lo/N+oRsNDmx/ZDpqalmrtgOMkHwxsG0iI//3BwWAErYRHtgn0dZw=="],
+
+ "@webassemblyjs/ieee754": ["@webassemblyjs/ieee754@1.13.2", "", { "dependencies": { "@xtuc/ieee754": "^1.2.0" } }, "sha512-4LtOzh58S/5lX4ITKxnAK2USuNEvpdVV9AlgGQb8rJDHaLeHciwG4zlGr0j/SNWlr7x3vO1lDEsuePvtcDNCkw=="],
+
+ "@webassemblyjs/leb128": ["@webassemblyjs/leb128@1.13.2", "", { "dependencies": { "@xtuc/long": "4.2.2" } }, "sha512-Lde1oNoIdzVzdkNEAWZ1dZ5orIbff80YPdHx20mrHwHrVNNTjNr8E3xz9BdpcGqRQbAEa+fkrCb+fRFTl/6sQw=="],
+
+ "@webassemblyjs/utf8": ["@webassemblyjs/utf8@1.13.2", "", {}, "sha512-3NQWGjKTASY1xV5m7Hr0iPeXD9+RDobLll3T9d2AO+g3my8xy5peVyjSag4I50mR1bBSN/Ct12lo+R9tJk0NZQ=="],
+
+ "@webassemblyjs/wasm-edit": ["@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" } }, "sha512-RNJUIQH/J8iA/1NzlE4N7KtyZNHi3w7at7hDjvRNm5rcUXa00z1vRz3glZoULfJ5mpvYhLybmVcwcjGrC1pRrQ=="],
+
+ "@webassemblyjs/wasm-gen": ["@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" } }, "sha512-AmomSIjP8ZbfGQhumkNvgC33AY7qtMCXnN6bL2u2Js4gVCg8fp735aEiMSBbDR7UQIj90n4wKAFUSEd0QN2Ukg=="],
+
+ "@webassemblyjs/wasm-opt": ["@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" } }, "sha512-PTcKLUNvBqnY2U6E5bdOQcSM+oVP/PmrDY9NzowJjislEjwP/C4an2303MCVS2Mg9d3AJpIGdUFIQQWbPds0Sw=="],
+
+ "@webassemblyjs/wasm-parser": ["@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" } }, "sha512-JLBl+KZ0R5qB7mCnud/yyX08jWFw5MsoalJ1pQ4EdFlgj9VdXKGuENGsiCIjegI1W7p91rUlcB/LB5yRJKNTcQ=="],
+
+ "@webassemblyjs/wast-printer": ["@webassemblyjs/wast-printer@1.14.1", "", { "dependencies": { "@webassemblyjs/ast": "1.14.1", "@xtuc/long": "4.2.2" } }, "sha512-kPSSXE6De1XOR820C90RIo2ogvZG+c3KiHzqUoO/F34Y2shGzesfqv7o57xrxovZJH/MetF5UjroJ/R/3isoiw=="],
+
+ "@xtuc/ieee754": ["@xtuc/ieee754@1.2.0", "", {}, "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA=="],
+
+ "@xtuc/long": ["@xtuc/long@4.2.2", "", {}, "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ=="],
+
+ "JSONStream": ["JSONStream@1.3.5", "", { "dependencies": { "jsonparse": "^1.2.0", "through": ">=2.2.7 <3" }, "bin": { "JSONStream": "./bin.js" } }, "sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ=="],
+
+ "abort-controller": ["abort-controller@3.0.0", "", { "dependencies": { "event-target-shim": "^5.0.0" } }, "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg=="],
+
+ "abstract-logging": ["abstract-logging@2.0.1", "", {}, "sha512-2BjRTZxTPvheOvGbBslFSYOUkr+SjPtOnrLP33f+VIWLzezQpZcqVg7ja3L4dBXmzzgwT+a029jRx5PCi3JuiA=="],
+
+ "accepts": ["accepts@1.3.8", "", { "dependencies": { "mime-types": "~2.1.34", "negotiator": "0.6.3" } }, "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw=="],
+
+ "acorn": ["acorn@8.15.0", "", { "bin": { "acorn": "bin/acorn" } }, "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg=="],
+
+ "acorn-import-assertions": ["acorn-import-assertions@1.9.0", "", { "peerDependencies": { "acorn": "^8" } }, "sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA=="],
+
+ "acorn-import-attributes": ["acorn-import-attributes@1.9.5", "", { "peerDependencies": { "acorn": "^8" } }, "sha512-n02Vykv5uA3eHGM/Z2dQrcD56kL8TyDb2p1+0P83PClMnC/nc+anbQRhIOWnSq4Ke/KvDPrY3C9hDtC/A3eHnQ=="],
+
+ "acorn-jsx": ["acorn-jsx@5.3.2", "", { "peerDependencies": { "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ=="],
+
+ "acorn-walk": ["acorn-walk@8.3.4", "", { "dependencies": { "acorn": "^8.11.0" } }, "sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g=="],
+
+ "add-stream": ["add-stream@1.0.0", "", {}, "sha512-qQLMr+8o0WC4FZGQTcJiKBVC59JylcPSrTtk6usvmIDFUOCKegapy1VHQwRbFMOFyb/inzUVqHs+eMYKDM1YeQ=="],
+
+ "agent-base": ["agent-base@7.1.4", "", {}, "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ=="],
+
+ "ajv": ["ajv@6.12.6", "", { "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", "json-schema-traverse": "^0.4.1", "uri-js": "^4.2.2" } }, "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g=="],
+
+ "ajv-formats": ["ajv-formats@2.1.1", "", { "dependencies": { "ajv": "^8.0.0" } }, "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA=="],
+
+ "ajv-keywords": ["ajv-keywords@3.5.2", "", { "peerDependencies": { "ajv": "^6.9.1" } }, "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ=="],
+
+ "ansi-align": ["ansi-align@3.0.1", "", { "dependencies": { "string-width": "^4.1.0" } }, "sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w=="],
+
+ "ansi-colors": ["ansi-colors@4.1.3", "", {}, "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw=="],
+
+ "ansi-escapes": ["ansi-escapes@4.3.2", "", { "dependencies": { "type-fest": "^0.21.3" } }, "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ=="],
+
+ "ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="],
+
+ "ansi-sequence-parser": ["ansi-sequence-parser@1.1.3", "", {}, "sha512-+fksAx9eG3Ab6LDnLs3ZqZa8KVJ/jYnX+D4Qe1azX+LFGFAXqynCQLOdLpNYN/l9e7l6hMWwZbrnctqr6eSQSw=="],
+
+ "ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="],
+
+ "any-promise": ["any-promise@1.3.0", "", {}, "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A=="],
+
+ "anymatch": ["anymatch@3.1.3", "", { "dependencies": { "normalize-path": "^3.0.0", "picomatch": "^2.0.4" } }, "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw=="],
+
+ "append-field": ["append-field@1.0.0", "", {}, "sha512-klpgFSWLW1ZEs8svjfb7g4qWY0YS5imI82dTg+QahUvJ8YqAY0P10Uk8tTyh9ZGuYEZEMaeJYCF5BFuX552hsw=="],
+
+ "arch": ["arch@2.2.0", "", {}, "sha512-Of/R0wqp83cgHozfIYLbBMnej79U/SVGOOyuB3VVFv1NRM/PSFMK12x9KVtiYzJqmnU5WR2qp0Z5rHb7sWGnFQ=="],
+
+ "arg": ["arg@4.1.3", "", {}, "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA=="],
+
+ "argparse": ["argparse@2.0.1", "", {}, "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q=="],
+
+ "aria-query": ["aria-query@5.3.2", "", {}, "sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw=="],
+
+ "array-buffer-byte-length": ["array-buffer-byte-length@1.0.2", "", { "dependencies": { "call-bound": "^1.0.3", "is-array-buffer": "^3.0.5" } }, "sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw=="],
+
+ "array-flatten": ["array-flatten@1.1.1", "", {}, "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg=="],
+
+ "array-ify": ["array-ify@1.0.0", "", {}, "sha512-c5AMf34bKdvPhQ7tBGhqkgKNUzMr4WUs+WDtC2ZUGOUncbxKMTvqxYctiseW3+L4bA8ec+GcZ6/A/FW4m8ukng=="],
+
+ "array-includes": ["array-includes@3.1.9", "", { "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.4", "define-properties": "^1.2.1", "es-abstract": "^1.24.0", "es-object-atoms": "^1.1.1", "get-intrinsic": "^1.3.0", "is-string": "^1.1.1", "math-intrinsics": "^1.1.0" } }, "sha512-FmeCCAenzH0KH381SPT5FZmiA/TmpndpcaShhfgEN9eCVjnFBqq3l1xrI42y8+PPLI6hypzou4GXw00WHmPBLQ=="],
+
+ "array-timsort": ["array-timsort@1.0.3", "", {}, "sha512-/+3GRL7dDAGEfM6TseQk/U+mi18TU2Ms9I3UlLdUMhz2hbvGNTKdj9xniwXfUqgYhHxRx0+8UnKkvlNwVU+cWQ=="],
+
+ "array.prototype.findlast": ["array.prototype.findlast@1.2.5", "", { "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1", "es-abstract": "^1.23.2", "es-errors": "^1.3.0", "es-object-atoms": "^1.0.0", "es-shim-unscopables": "^1.0.2" } }, "sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ=="],
+
+ "array.prototype.findlastindex": ["array.prototype.findlastindex@1.2.6", "", { "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.4", "define-properties": "^1.2.1", "es-abstract": "^1.23.9", "es-errors": "^1.3.0", "es-object-atoms": "^1.1.1", "es-shim-unscopables": "^1.1.0" } }, "sha512-F/TKATkzseUExPlfvmwQKGITM3DGTK+vkAsCZoDc5daVygbJBnjEUCbgkAvVFsgfXfX4YIqZ/27G3k3tdXrTxQ=="],
+
+ "array.prototype.flat": ["array.prototype.flat@1.3.3", "", { "dependencies": { "call-bind": "^1.0.8", "define-properties": "^1.2.1", "es-abstract": "^1.23.5", "es-shim-unscopables": "^1.0.2" } }, "sha512-rwG/ja1neyLqCuGZ5YYrznA62D4mZXg0i1cIskIUKSiqF3Cje9/wXAls9B9s1Wa2fomMsIv8czB8jZcPmxCXFg=="],
+
+ "array.prototype.flatmap": ["array.prototype.flatmap@1.3.3", "", { "dependencies": { "call-bind": "^1.0.8", "define-properties": "^1.2.1", "es-abstract": "^1.23.5", "es-shim-unscopables": "^1.0.2" } }, "sha512-Y7Wt51eKJSyi80hFrJCePGGNo5ktJCslFuboqJsbf57CCPcm5zztluPlc4/aD8sWsKvlwatezpV4U1efk8kpjg=="],
+
+ "array.prototype.map": ["array.prototype.map@1.0.8", "", { "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.3", "define-properties": "^1.2.1", "es-abstract": "^1.23.6", "es-array-method-boxes-properly": "^1.0.0", "es-object-atoms": "^1.0.0", "is-string": "^1.1.1" } }, "sha512-YocPM7bYYu2hXGxWpb5vwZ8cMeudNHYtYBcUDY4Z1GWa53qcnQMWSl25jeBHNzitjl9HW2AWW4ro/S/nftUaOQ=="],
+
+ "array.prototype.tosorted": ["array.prototype.tosorted@1.1.4", "", { "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1", "es-abstract": "^1.23.3", "es-errors": "^1.3.0", "es-shim-unscopables": "^1.0.2" } }, "sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC/wA=="],
+
+ "arraybuffer.prototype.slice": ["arraybuffer.prototype.slice@1.0.4", "", { "dependencies": { "array-buffer-byte-length": "^1.0.1", "call-bind": "^1.0.8", "define-properties": "^1.2.1", "es-abstract": "^1.23.5", "es-errors": "^1.3.0", "get-intrinsic": "^1.2.6", "is-array-buffer": "^3.0.4" } }, "sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ=="],
+
+ "asap": ["asap@2.0.6", "", {}, "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA=="],
+
+ "ast-types": ["ast-types@0.13.4", "", { "dependencies": { "tslib": "^2.0.1" } }, "sha512-x1FCFnFifvYDDzTaLII71vG5uvDwgtmDTEVWAxrgeiR8VjMONcCXJx7E+USjDtHlwFmt9MysbqgF9b9Vjr6w+w=="],
+
+ "ast-types-flow": ["ast-types-flow@0.0.8", "", {}, "sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ=="],
+
+ "astring": ["astring@1.9.0", "", { "bin": { "astring": "bin/astring" } }, "sha512-LElXdjswlqjWrPpJFg1Fx4wpkOCxj1TDHlSV4PlaRxHGWko024xICaa97ZkMfs6DRKlCguiAI+rbXv5GWwXIkg=="],
+
+ "async": ["async@3.2.6", "", {}, "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA=="],
+
+ "async-function": ["async-function@1.0.0", "", {}, "sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA=="],
+
+ "async-retry": ["async-retry@1.3.3", "", { "dependencies": { "retry": "0.13.1" } }, "sha512-wfr/jstw9xNi/0teMHrRW7dsz3Lt5ARhYNZ2ewpadnhaIp5mbALhOAP+EAdsC7t4Z6wqsDVv9+W6gm1Dk9mEyw=="],
+
+ "asynckit": ["asynckit@0.4.0", "", {}, "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q=="],
+
+ "atomic-sleep": ["atomic-sleep@1.0.0", "", {}, "sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ=="],
+
+ "autoprefixer": ["autoprefixer@10.4.23", "", { "dependencies": { "browserslist": "^4.28.1", "caniuse-lite": "^1.0.30001760", "fraction.js": "^5.3.4", "picocolors": "^1.1.1", "postcss-value-parser": "^4.2.0" }, "peerDependencies": { "postcss": "^8.1.0" }, "bin": { "autoprefixer": "bin/autoprefixer" } }, "sha512-YYTXSFulfwytnjAPlw8QHncHJmlvFKtczb8InXaAx9Q0LbfDnfEYDE55omerIJKihhmU61Ft+cAOSzQVaBUmeA=="],
+
+ "available-typed-arrays": ["available-typed-arrays@1.0.7", "", { "dependencies": { "possible-typed-array-names": "^1.0.0" } }, "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ=="],
+
+ "avvio": ["avvio@9.1.0", "", { "dependencies": { "@fastify/error": "^4.0.0", "fastq": "^1.17.1" } }, "sha512-fYASnYi600CsH/j9EQov7lECAniYiBFiiAtBNuZYLA2leLe9qOvZzqYHFjtIj6gD2VMoMLP14834LFWvr4IfDw=="],
+
+ "axe-core": ["axe-core@4.11.1", "", {}, "sha512-BASOg+YwO2C+346x3LZOeoovTIoTrRqEsqMa6fmfAV0P+U9mFr9NsyOEpiYvFjbc64NMrSswhV50WdXzdb/Z5A=="],
+
+ "axobject-query": ["axobject-query@4.1.0", "", {}, "sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ=="],
+
+ "babel-jest": ["babel-jest@29.7.0", "", { "dependencies": { "@jest/transform": "^29.7.0", "@types/babel__core": "^7.1.14", "babel-plugin-istanbul": "^6.1.1", "babel-preset-jest": "^29.6.3", "chalk": "^4.0.0", "graceful-fs": "^4.2.9", "slash": "^3.0.0" }, "peerDependencies": { "@babel/core": "^7.8.0" } }, "sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg=="],
+
+ "babel-plugin-istanbul": ["babel-plugin-istanbul@6.1.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.0.0", "@istanbuljs/load-nyc-config": "^1.0.0", "@istanbuljs/schema": "^0.1.2", "istanbul-lib-instrument": "^5.0.4", "test-exclude": "^6.0.0" } }, "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA=="],
+
+ "babel-plugin-jest-hoist": ["babel-plugin-jest-hoist@29.6.3", "", { "dependencies": { "@babel/template": "^7.3.3", "@babel/types": "^7.3.3", "@types/babel__core": "^7.1.14", "@types/babel__traverse": "^7.0.6" } }, "sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg=="],
+
+ "babel-plugin-polyfill-corejs2": ["babel-plugin-polyfill-corejs2@0.4.14", "", { "dependencies": { "@babel/compat-data": "^7.27.7", "@babel/helper-define-polyfill-provider": "^0.6.5", "semver": "^6.3.1" }, "peerDependencies": { "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" } }, "sha512-Co2Y9wX854ts6U8gAAPXfn0GmAyctHuK8n0Yhfjd6t30g7yvKjspvvOo9yG+z52PZRgFErt7Ka2pYnXCjLKEpg=="],
+
+ "babel-plugin-polyfill-corejs3": ["babel-plugin-polyfill-corejs3@0.13.0", "", { "dependencies": { "@babel/helper-define-polyfill-provider": "^0.6.5", "core-js-compat": "^3.43.0" }, "peerDependencies": { "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" } }, "sha512-U+GNwMdSFgzVmfhNm8GJUX88AadB3uo9KpJqS3FaqNIPKgySuvMb+bHPsOmmuWyIcuqZj/pzt1RUIUZns4y2+A=="],
+
+ "babel-plugin-polyfill-regenerator": ["babel-plugin-polyfill-regenerator@0.6.5", "", { "dependencies": { "@babel/helper-define-polyfill-provider": "^0.6.5" }, "peerDependencies": { "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" } }, "sha512-ISqQ2frbiNU9vIJkzg7dlPpznPZ4jOiUQ1uSmB0fEHeowtN3COYRsXr/xexn64NpU13P06jc/L5TgiJXOgrbEg=="],
+
+ "babel-preset-current-node-syntax": ["babel-preset-current-node-syntax@1.2.0", "", { "dependencies": { "@babel/plugin-syntax-async-generators": "^7.8.4", "@babel/plugin-syntax-bigint": "^7.8.3", "@babel/plugin-syntax-class-properties": "^7.12.13", "@babel/plugin-syntax-class-static-block": "^7.14.5", "@babel/plugin-syntax-import-attributes": "^7.24.7", "@babel/plugin-syntax-import-meta": "^7.10.4", "@babel/plugin-syntax-json-strings": "^7.8.3", "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", "@babel/plugin-syntax-numeric-separator": "^7.10.4", "@babel/plugin-syntax-object-rest-spread": "^7.8.3", "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", "@babel/plugin-syntax-optional-chaining": "^7.8.3", "@babel/plugin-syntax-private-property-in-object": "^7.14.5", "@babel/plugin-syntax-top-level-await": "^7.14.5" }, "peerDependencies": { "@babel/core": "^7.0.0 || ^8.0.0-0" } }, "sha512-E/VlAEzRrsLEb2+dv8yp3bo4scof3l9nR4lrld+Iy5NyVqgVYUJnDAmunkhPMisRI32Qc4iRiz425d8vM++2fg=="],
+
+ "babel-preset-jest": ["babel-preset-jest@29.6.3", "", { "dependencies": { "babel-plugin-jest-hoist": "^29.6.3", "babel-preset-current-node-syntax": "^1.0.0" }, "peerDependencies": { "@babel/core": "^7.0.0" } }, "sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA=="],
+
+ "bail": ["bail@2.0.2", "", {}, "sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw=="],
+
+ "balanced-match": ["balanced-match@1.0.2", "", {}, "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="],
+
+ "base64-js": ["base64-js@1.5.1", "", {}, "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA=="],
+
+ "baseline-browser-mapping": ["baseline-browser-mapping@2.9.16", "", { "bin": { "baseline-browser-mapping": "dist/cli.js" } }, "sha512-KeUZdBuxngy825i8xvzaK1Ncnkx0tBmb3k8DkEuqjKRkmtvNTjey2ZsNeh8Dw4lfKvbCOu9oeNx2TKm2vHqcRw=="],
+
+ "basic-ftp": ["basic-ftp@5.1.0", "", {}, "sha512-RkaJzeJKDbaDWTIPiJwubyljaEPwpVWkm9Rt5h9Nd6h7tEXTJ3VB4qxdZBioV7JO5yLUaOKwz7vDOzlncUsegw=="],
+
+ "before-after-hook": ["before-after-hook@2.2.3", "", {}, "sha512-NzUnlZexiaH/46WDhANlyR2bXRopNg4F/zuSA3OpZnllCUgRaOF2znDioDWrmbNVsuZk6l9pMquQB38cfBZwkQ=="],
+
+ "bin-check": ["bin-check@4.1.0", "", { "dependencies": { "execa": "^0.7.0", "executable": "^4.1.0" } }, "sha512-b6weQyEUKsDGFlACWSIOfveEnImkJyK/FGW6FAG42loyoquvjdtOIqO6yBFzHyqyVVhNgNkQxxx09SFLK28YnA=="],
+
+ "bin-version": ["bin-version@6.0.0", "", { "dependencies": { "execa": "^5.0.0", "find-versions": "^5.0.0" } }, "sha512-nk5wEsP4RiKjG+vF+uG8lFsEn4d7Y6FVDamzzftSunXOoOcOOkzcWdKVlGgFFwlUQCj63SgnUkLLGF8v7lufhw=="],
+
+ "bin-version-check": ["bin-version-check@5.1.0", "", { "dependencies": { "bin-version": "^6.0.0", "semver": "^7.5.3", "semver-truncate": "^3.0.0" } }, "sha512-bYsvMqJ8yNGILLz1KP9zKLzQ6YpljV3ln1gqhuLkUtyfGi3qXKGuK2p+U4NAvjVFzDFiBBtOpCOSFNuYYEGZ5g=="],
+
+ "binary-extensions": ["binary-extensions@2.3.0", "", {}, "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw=="],
+
+ "bl": ["bl@4.1.0", "", { "dependencies": { "buffer": "^5.5.0", "inherits": "^2.0.4", "readable-stream": "^3.4.0" } }, "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w=="],
+
+ "body-parser": ["body-parser@1.20.2", "", { "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.11.0", "raw-body": "2.5.2", "type-is": "~1.6.18", "unpipe": "1.0.0" } }, "sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA=="],
+
+ "boolbase": ["boolbase@1.0.0", "", {}, "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww=="],
+
+ "boxen": ["boxen@7.1.1", "", { "dependencies": { "ansi-align": "^3.0.1", "camelcase": "^7.0.1", "chalk": "^5.2.0", "cli-boxes": "^3.0.0", "string-width": "^5.1.2", "type-fest": "^2.13.0", "widest-line": "^4.0.1", "wrap-ansi": "^8.1.0" } }, "sha512-2hCgjEmP8YLWQ130n2FerGv7rYpfBmnmp9Uy2Le1vge6X3gZIfSmEzP5QTDElFxcvVcXlEn8Aq6MU/PZygIOog=="],
+
+ "brace-expansion": ["brace-expansion@1.1.12", "", { "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg=="],
+
+ "braces": ["braces@3.0.3", "", { "dependencies": { "fill-range": "^7.1.1" } }, "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA=="],
+
+ "browserslist": ["browserslist@4.28.1", "", { "dependencies": { "baseline-browser-mapping": "^2.9.0", "caniuse-lite": "^1.0.30001759", "electron-to-chromium": "^1.5.263", "node-releases": "^2.0.27", "update-browserslist-db": "^1.2.0" }, "bin": { "browserslist": "cli.js" } }, "sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA=="],
+
+ "bs-logger": ["bs-logger@0.2.6", "", { "dependencies": { "fast-json-stable-stringify": "2.x" } }, "sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog=="],
+
+ "bser": ["bser@2.1.1", "", { "dependencies": { "node-int64": "^0.4.0" } }, "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ=="],
+
+ "buffer": ["buffer@5.7.1", "", { "dependencies": { "base64-js": "^1.3.1", "ieee754": "^1.1.13" } }, "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ=="],
+
+ "buffer-from": ["buffer-from@1.1.2", "", {}, "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ=="],
+
+ "bundle-name": ["bundle-name@4.1.0", "", { "dependencies": { "run-applescript": "^7.0.0" } }, "sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q=="],
+
+ "busboy": ["busboy@1.6.0", "", { "dependencies": { "streamsearch": "^1.1.0" } }, "sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA=="],
+
+ "bytes": ["bytes@3.1.2", "", {}, "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg=="],
+
+ "cacheable-lookup": ["cacheable-lookup@7.0.0", "", {}, "sha512-+qJyx4xiKra8mZrcwhjMRMUhD5NR1R8esPkzIYxX96JiecFoxAXFuz/GpR3+ev4PE1WamHip78wV0vcmPQtp8w=="],
+
+ "cacheable-request": ["cacheable-request@10.2.14", "", { "dependencies": { "@types/http-cache-semantics": "^4.0.2", "get-stream": "^6.0.1", "http-cache-semantics": "^4.1.1", "keyv": "^4.5.3", "mimic-response": "^4.0.0", "normalize-url": "^8.0.0", "responselike": "^3.0.0" } }, "sha512-zkDT5WAF4hSSoUgyfg5tFIxz8XQK+25W/TLVojJTMKBaxevLBBtLxgqguAuVQB8PVW79FVjHcU+GJ9tVbDZ9mQ=="],
+
+ "call-bind": ["call-bind@1.0.8", "", { "dependencies": { "call-bind-apply-helpers": "^1.0.0", "es-define-property": "^1.0.0", "get-intrinsic": "^1.2.4", "set-function-length": "^1.2.2" } }, "sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww=="],
+
+ "call-bind-apply-helpers": ["call-bind-apply-helpers@1.0.2", "", { "dependencies": { "es-errors": "^1.3.0", "function-bind": "^1.1.2" } }, "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ=="],
+
+ "call-bound": ["call-bound@1.0.4", "", { "dependencies": { "call-bind-apply-helpers": "^1.0.2", "get-intrinsic": "^1.3.0" } }, "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg=="],
+
+ "callsites": ["callsites@3.1.0", "", {}, "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ=="],
+
+ "camelcase": ["camelcase@6.3.0", "", {}, "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA=="],
+
+ "camelcase-css": ["camelcase-css@2.0.1", "", {}, "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA=="],
+
+ "caniuse-lite": ["caniuse-lite@1.0.30001765", "", {}, "sha512-LWcNtSyZrakjECqmpP4qdg0MMGdN368D7X8XvvAqOcqMv0RxnlqVKZl2V6/mBR68oYMxOZPLw/gO7DuisMHUvQ=="],
+
+ "ccount": ["ccount@2.0.1", "", {}, "sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg=="],
+
+ "chalk": ["chalk@4.1.2", "", { "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA=="],
+
+ "char-regex": ["char-regex@1.0.2", "", {}, "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw=="],
+
+ "character-entities": ["character-entities@2.0.2", "", {}, "sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ=="],
+
+ "character-entities-html4": ["character-entities-html4@2.1.0", "", {}, "sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA=="],
+
+ "character-entities-legacy": ["character-entities-legacy@3.0.0", "", {}, "sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ=="],
+
+ "character-reference-invalid": ["character-reference-invalid@2.0.1", "", {}, "sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw=="],
+
+ "chardet": ["chardet@2.1.1", "", {}, "sha512-PsezH1rqdV9VvyNhxxOW32/d75r01NY7TQCmOqomRo15ZSOKbpTFVsfjghxo6JloQUCGnH4k1LGu0R4yCLlWQQ=="],
+
+ "chokidar": ["chokidar@3.6.0", "", { "dependencies": { "anymatch": "~3.1.2", "braces": "~3.0.2", "glob-parent": "~5.1.2", "is-binary-path": "~2.1.0", "is-glob": "~4.0.1", "normalize-path": "~3.0.0", "readdirp": "~3.6.0" }, "optionalDependencies": { "fsevents": "~2.3.2" } }, "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw=="],
+
+ "chrome-trace-event": ["chrome-trace-event@1.0.4", "", {}, "sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ=="],
+
+ "ci-info": ["ci-info@3.9.0", "", {}, "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ=="],
+
+ "cjs-module-lexer": ["cjs-module-lexer@1.4.3", "", {}, "sha512-9z8TZaGM1pfswYeXrUpzPrkx8UnWYdhJclsiYMm6x/w5+nN+8Tf/LnAgfLGQCm59qAOxU8WwHEq2vNwF6i4j+Q=="],
+
+ "cli-boxes": ["cli-boxes@3.0.0", "", {}, "sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g=="],
+
+ "cli-cursor": ["cli-cursor@3.1.0", "", { "dependencies": { "restore-cursor": "^3.1.0" } }, "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw=="],
+
+ "cli-spinners": ["cli-spinners@2.9.2", "", {}, "sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg=="],
+
+ "cli-table3": ["cli-table3@0.6.3", "", { "dependencies": { "string-width": "^4.2.0" }, "optionalDependencies": { "@colors/colors": "1.5.0" } }, "sha512-w5Jac5SykAeZJKntOxJCrm63Eg5/4dhMWIcuTbo9rpE+brgaSZo0RuNJZeOyMgsUdhDeojvgyQLmjI+K50ZGyg=="],
+
+ "cli-truncate": ["cli-truncate@4.0.0", "", { "dependencies": { "slice-ansi": "^5.0.0", "string-width": "^7.0.0" } }, "sha512-nPdaFdQ0h/GEigbPClz11D0v/ZJEwxmeVZGeMo3Z5StPtUTkA9o1lD6QwoirYiSDzbcwn2XcjwmCp68W1IS4TA=="],
+
+ "cli-width": ["cli-width@4.1.0", "", {}, "sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ=="],
+
+ "client-only": ["client-only@0.0.1", "", {}, "sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA=="],
+
+ "clipboardy": ["clipboardy@1.2.2", "", { "dependencies": { "arch": "^2.1.0", "execa": "^0.8.0" } }, "sha512-16KrBOV7bHmHdxcQiCvfUFYVFyEah4FI8vYT1Fr7CGSA4G+xBWMEfUEQJS1hxeHGtI9ju1Bzs9uXSbj5HZKArw=="],
+
+ "cliui": ["cliui@8.0.1", "", { "dependencies": { "string-width": "^4.2.0", "strip-ansi": "^6.0.1", "wrap-ansi": "^7.0.0" } }, "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ=="],
+
+ "clone": ["clone@1.0.4", "", {}, "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg=="],
+
+ "clone-response": ["clone-response@1.0.3", "", { "dependencies": { "mimic-response": "^1.0.0" } }, "sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA=="],
+
+ "clsx": ["clsx@2.1.1", "", {}, "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA=="],
+
+ "co": ["co@4.6.0", "", {}, "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ=="],
+
+ "code-block-writer": ["code-block-writer@13.0.3", "", {}, "sha512-Oofo0pq3IKnsFtuHqSF7TqBfr71aeyZDVJ0HpmqB7FBM2qEigL0iPONSCZSO9pE9dZTAxANe5XHG9Uy0YMv8cg=="],
+
+ "collect-v8-coverage": ["collect-v8-coverage@1.0.3", "", {}, "sha512-1L5aqIkwPfiodaMgQunkF1zRhNqifHBmtbbbxcr6yVxxBnliw4TDOW6NxpO8DJLgJ16OT+Y4ztZqP6p/FtXnAw=="],
+
+ "color-convert": ["color-convert@2.0.1", "", { "dependencies": { "color-name": "~1.1.4" } }, "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ=="],
+
+ "color-name": ["color-name@1.1.4", "", {}, "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="],
+
+ "colorette": ["colorette@2.0.20", "", {}, "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w=="],
+
+ "combined-stream": ["combined-stream@1.0.8", "", { "dependencies": { "delayed-stream": "~1.0.0" } }, "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg=="],
+
+ "comma-separated-tokens": ["comma-separated-tokens@2.0.3", "", {}, "sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg=="],
+
+ "commander": ["commander@4.1.1", "", {}, "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA=="],
+
+ "comment-json": ["comment-json@4.2.5", "", { "dependencies": { "array-timsort": "^1.0.3", "core-util-is": "^1.0.3", "esprima": "^4.0.1", "has-own-prop": "^2.0.0", "repeat-string": "^1.6.1" } }, "sha512-bKw/r35jR3HGt5PEPm1ljsQQGyCrR8sFGNiN5L+ykDHdpO8Smxkrkla9Yi6NkQyUrb8V54PGhfMs6NrIwtxtdw=="],
+
+ "compare-func": ["compare-func@2.0.0", "", { "dependencies": { "array-ify": "^1.0.0", "dot-prop": "^5.1.0" } }, "sha512-zHig5N+tPWARooBnb0Zx1MFcdfpyJrfTJ3Y5L+IFvUm8rM74hHz66z0gw0x4tijh5CorKkKUCnW82R2vmpeCRA=="],
+
+ "component-emitter": ["component-emitter@1.3.1", "", {}, "sha512-T0+barUSQRTUQASh8bx02dl+DhF54GtIDY13Y3m9oWTklKbb3Wv974meRpeZ3lp1JpLVECWWNHC4vaG2XHXouQ=="],
+
+ "compute-scroll-into-view": ["compute-scroll-into-view@3.1.1", "", {}, "sha512-VRhuHOLoKYOy4UbilLbUzbYg93XLjv2PncJC50EuTWPA3gaja1UjBsUP/D/9/juV3vQFr6XBEzn9KCAHdUvOHw=="],
+
+ "concat-map": ["concat-map@0.0.1", "", {}, "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg=="],
+
+ "concat-stream": ["concat-stream@2.0.0", "", { "dependencies": { "buffer-from": "^1.0.0", "inherits": "^2.0.3", "readable-stream": "^3.0.2", "typedarray": "^0.0.6" } }, "sha512-MWufYdFw53ccGjCA+Ol7XJYpAlW6/prSMzuPOTRnJGcGzuhLn4Scrz7qf6o8bROZ514ltazcIFJZevcfbo0x7A=="],
+
+ "config-chain": ["config-chain@1.1.13", "", { "dependencies": { "ini": "^1.3.4", "proto-list": "~1.2.1" } }, "sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ=="],
+
+ "configstore": ["configstore@6.0.0", "", { "dependencies": { "dot-prop": "^6.0.1", "graceful-fs": "^4.2.6", "unique-string": "^3.0.0", "write-file-atomic": "^3.0.3", "xdg-basedir": "^5.0.1" } }, "sha512-cD31W1v3GqUlQvbBCGcXmd2Nj9SvLDOP1oQ0YFuLETufzSPaKp11rYBsSOm7rCsW3OnIRAFM3OxRhceaXNYHkA=="],
+
+ "consola": ["consola@2.15.3", "", {}, "sha512-9vAdYbHj6x2fLKC4+oPH0kFzY/orMZyG2Aj+kNylHxKGJ/Ed4dpNyAQYwJOdqO4zdM7XpVHmyejQDcQHrnuXbw=="],
+
+ "content-disposition": ["content-disposition@0.5.4", "", { "dependencies": { "safe-buffer": "5.2.1" } }, "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ=="],
+
+ "content-type": ["content-type@1.0.5", "", {}, "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA=="],
+
+ "conventional-changelog": ["conventional-changelog@5.1.0", "", { "dependencies": { "conventional-changelog-angular": "^7.0.0", "conventional-changelog-atom": "^4.0.0", "conventional-changelog-codemirror": "^4.0.0", "conventional-changelog-conventionalcommits": "^7.0.2", "conventional-changelog-core": "^7.0.0", "conventional-changelog-ember": "^4.0.0", "conventional-changelog-eslint": "^5.0.0", "conventional-changelog-express": "^4.0.0", "conventional-changelog-jquery": "^5.0.0", "conventional-changelog-jshint": "^4.0.0", "conventional-changelog-preset-loader": "^4.1.0" } }, "sha512-aWyE/P39wGYRPllcCEZDxTVEmhyLzTc9XA6z6rVfkuCD2UBnhV/sgSOKbQrEG5z9mEZJjnopjgQooTKxEg8mAg=="],
+
+ "conventional-changelog-angular": ["conventional-changelog-angular@7.0.0", "", { "dependencies": { "compare-func": "^2.0.0" } }, "sha512-ROjNchA9LgfNMTTFSIWPzebCwOGFdgkEq45EnvvrmSLvCtAw0HSmrCs7/ty+wAeYUZyNay0YMUNYFTRL72PkBQ=="],
+
+ "conventional-changelog-atom": ["conventional-changelog-atom@4.0.0", "", {}, "sha512-q2YtiN7rnT1TGwPTwjjBSIPIzDJCRE+XAUahWxnh+buKK99Kks4WLMHoexw38GXx9OUxAsrp44f9qXe5VEMYhw=="],
+
+ "conventional-changelog-codemirror": ["conventional-changelog-codemirror@4.0.0", "", {}, "sha512-hQSojc/5imn1GJK3A75m9hEZZhc3urojA5gMpnar4JHmgLnuM3CUIARPpEk86glEKr3c54Po3WV/vCaO/U8g3Q=="],
+
+ "conventional-changelog-conventionalcommits": ["conventional-changelog-conventionalcommits@8.0.0", "", { "dependencies": { "compare-func": "^2.0.0" } }, "sha512-eOvlTO6OcySPyyyk8pKz2dP4jjElYunj9hn9/s0OB+gapTO8zwS9UQWrZ1pmF2hFs3vw1xhonOLGcGjy/zgsuA=="],
+
+ "conventional-changelog-core": ["conventional-changelog-core@7.0.0", "", { "dependencies": { "@hutson/parse-repository-url": "^5.0.0", "add-stream": "^1.0.0", "conventional-changelog-writer": "^7.0.0", "conventional-commits-parser": "^5.0.0", "git-raw-commits": "^4.0.0", "git-semver-tags": "^7.0.0", "hosted-git-info": "^7.0.0", "normalize-package-data": "^6.0.0", "read-pkg": "^8.0.0", "read-pkg-up": "^10.0.0" } }, "sha512-UYgaB1F/COt7VFjlYKVE/9tTzfU3VUq47r6iWf6lM5T7TlOxr0thI63ojQueRLIpVbrtHK4Ffw+yQGduw2Bhdg=="],
+
+ "conventional-changelog-ember": ["conventional-changelog-ember@4.0.0", "", {}, "sha512-D0IMhwcJUg1Y8FSry6XAplEJcljkHVlvAZddhhsdbL1rbsqRsMfGx/PIkPYq0ru5aDgn+OxhQ5N5yR7P9mfsvA=="],
+
+ "conventional-changelog-eslint": ["conventional-changelog-eslint@5.0.0", "", {}, "sha512-6JtLWqAQIeJLn/OzUlYmzd9fKeNSWmQVim9kql+v4GrZwLx807kAJl3IJVc3jTYfVKWLxhC3BGUxYiuVEcVjgA=="],
+
+ "conventional-changelog-express": ["conventional-changelog-express@4.0.0", "", {}, "sha512-yWyy5c7raP9v7aTvPAWzqrztACNO9+FEI1FSYh7UP7YT1AkWgv5UspUeB5v3Ibv4/o60zj2o9GF2tqKQ99lIsw=="],
+
+ "conventional-changelog-jquery": ["conventional-changelog-jquery@5.0.0", "", {}, "sha512-slLjlXLRNa/icMI3+uGLQbtrgEny3RgITeCxevJB+p05ExiTgHACP5p3XiMKzjBn80n+Rzr83XMYfRInEtCPPw=="],
+
+ "conventional-changelog-jshint": ["conventional-changelog-jshint@4.0.0", "", { "dependencies": { "compare-func": "^2.0.0" } }, "sha512-LyXq1bbl0yG0Ai1SbLxIk8ZxUOe3AjnlwE6sVRQmMgetBk+4gY9EO3d00zlEt8Y8gwsITytDnPORl8al7InTjg=="],
+
+ "conventional-changelog-preset-loader": ["conventional-changelog-preset-loader@4.1.0", "", {}, "sha512-HozQjJicZTuRhCRTq4rZbefaiCzRM2pr6u2NL3XhrmQm4RMnDXfESU6JKu/pnKwx5xtdkYfNCsbhN5exhiKGJA=="],
+
+ "conventional-changelog-writer": ["conventional-changelog-writer@7.0.1", "", { "dependencies": { "conventional-commits-filter": "^4.0.0", "handlebars": "^4.7.7", "json-stringify-safe": "^5.0.1", "meow": "^12.0.1", "semver": "^7.5.2", "split2": "^4.0.0" }, "bin": { "conventional-changelog-writer": "cli.mjs" } }, "sha512-Uo+R9neH3r/foIvQ0MKcsXkX642hdm9odUp7TqgFS7BsalTcjzRlIfWZrZR1gbxOozKucaKt5KAbjW8J8xRSmA=="],
+
+ "conventional-commits-filter": ["conventional-commits-filter@4.0.0", "", {}, "sha512-rnpnibcSOdFcdclpFwWa+pPlZJhXE7l+XK04zxhbWrhgpR96h33QLz8hITTXbcYICxVr3HZFtbtUAQ+4LdBo9A=="],
+
+ "conventional-commits-parser": ["conventional-commits-parser@5.0.0", "", { "dependencies": { "JSONStream": "^1.3.5", "is-text-path": "^2.0.0", "meow": "^12.0.1", "split2": "^4.0.0" }, "bin": { "conventional-commits-parser": "cli.mjs" } }, "sha512-ZPMl0ZJbw74iS9LuX9YIAiW8pfM5p3yh2o/NbXHbkFuZzY5jvdi5jFycEOkmBW5H5I7nA+D6f3UcsCLP2vvSEA=="],
+
+ "conventional-recommended-bump": ["conventional-recommended-bump@9.0.0", "", { "dependencies": { "conventional-changelog-preset-loader": "^4.1.0", "conventional-commits-filter": "^4.0.0", "conventional-commits-parser": "^5.0.0", "git-raw-commits": "^4.0.0", "git-semver-tags": "^7.0.0", "meow": "^12.0.1" }, "bin": { "conventional-recommended-bump": "cli.mjs" } }, "sha512-HR1yD0G5HgYAu6K0wJjLd7QGRK8MQDqqj6Tn1n/ja1dFwBCE6QmV+iSgQ5F7hkx7OUR/8bHpxJqYtXj2f/opPQ=="],
+
+ "convert-source-map": ["convert-source-map@2.0.0", "", {}, "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg=="],
+
+ "cookie": ["cookie@0.6.0", "", {}, "sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw=="],
+
+ "cookie-signature": ["cookie-signature@1.2.2", "", {}, "sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg=="],
+
+ "cookiejar": ["cookiejar@2.1.4", "", {}, "sha512-LDx6oHrK+PhzLKJU9j5S7/Y3jM/mUHvD/DeI1WQmJn652iPC5Y4TBzC9l+5OMOXlyTTA+SmVUPm0HQUwpD5Jqw=="],
+
+ "core-js-compat": ["core-js-compat@3.47.0", "", { "dependencies": { "browserslist": "^4.28.0" } }, "sha512-IGfuznZ/n7Kp9+nypamBhvwdwLsW6KC8IOaURw2doAK5e98AG3acVLdh0woOnEqCfUtS+Vu882JE4k/DAm3ItQ=="],
+
+ "core-util-is": ["core-util-is@1.0.3", "", {}, "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ=="],
+
+ "cors": ["cors@2.8.5", "", { "dependencies": { "object-assign": "^4", "vary": "^1" } }, "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g=="],
+
+ "cose-base": ["cose-base@1.0.3", "", { "dependencies": { "layout-base": "^1.0.0" } }, "sha512-s9whTXInMSgAp/NVXVNuVxVKzGH2qck3aQlVHxDCdAEPgtMKwc4Wq6/QKhgdEdgbLSi9rBTAcPoRa6JpiG4ksg=="],
+
+ "cosmiconfig": ["cosmiconfig@9.0.0", "", { "dependencies": { "env-paths": "^2.2.1", "import-fresh": "^3.3.0", "js-yaml": "^4.1.0", "parse-json": "^5.2.0" }, "peerDependencies": { "typescript": ">=4.9.5" }, "optionalPeers": ["typescript"] }, "sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg=="],
+
+ "cosmiconfig-typescript-loader": ["cosmiconfig-typescript-loader@6.2.0", "", { "dependencies": { "jiti": "^2.6.1" }, "peerDependencies": { "@types/node": "*", "cosmiconfig": ">=9", "typescript": ">=5" } }, "sha512-GEN39v7TgdxgIoNcdkRE3uiAzQt3UXLyHbRHD6YoL048XAeOomyxaP+Hh/+2C6C2wYjxJ2onhJcsQp+L4YEkVQ=="],
+
+ "create-jest": ["create-jest@29.7.0", "", { "dependencies": { "@jest/types": "^29.6.3", "chalk": "^4.0.0", "exit": "^0.1.2", "graceful-fs": "^4.2.9", "jest-config": "^29.7.0", "jest-util": "^29.7.0", "prompts": "^2.0.1" }, "bin": { "create-jest": "bin/create-jest.js" } }, "sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q=="],
+
+ "create-require": ["create-require@1.1.1", "", {}, "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ=="],
+
+ "cross-spawn": ["cross-spawn@7.0.6", "", { "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", "which": "^2.0.1" } }, "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA=="],
+
+ "crypto-random-string": ["crypto-random-string@4.0.0", "", { "dependencies": { "type-fest": "^1.0.1" } }, "sha512-x8dy3RnvYdlUcPOjkEHqozhiwzKNSq7GcPuXFbnyMOCHxX8V3OgIg/pYuabl2sbUPfIJaeAQB7PMOK8DFIdoRA=="],
+
+ "css-select": ["css-select@5.2.2", "", { "dependencies": { "boolbase": "^1.0.0", "css-what": "^6.1.0", "domhandler": "^5.0.2", "domutils": "^3.0.1", "nth-check": "^2.0.1" } }, "sha512-TizTzUddG/xYLA3NXodFM0fSbNizXjOKhqiQQwvhlspadZokn1KDy0NZFS0wuEubIYAV5/c1/lAr0TaaFXEXzw=="],
+
+ "css-tree": ["css-tree@2.3.1", "", { "dependencies": { "mdn-data": "2.0.30", "source-map-js": "^1.0.1" } }, "sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw=="],
+
+ "css-what": ["css-what@6.2.2", "", {}, "sha512-u/O3vwbptzhMs3L1fQE82ZSLHQQfto5gyZzwteVIEyeaY5Fc7R4dapF/BvRoSYFeqfBk4m0V1Vafq5Pjv25wvA=="],
+
+ "cssesc": ["cssesc@3.0.0", "", { "bin": { "cssesc": "bin/cssesc" } }, "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg=="],
+
+ "csso": ["csso@5.0.5", "", { "dependencies": { "css-tree": "~2.2.0" } }, "sha512-0LrrStPOdJj+SPCCrGhzryycLjwcgUSHBtxNA8aIDxf0GLsRh1cKYhB00Gd1lDOS4yGH69+SNn13+TWbVHETFQ=="],
+
+ "csstype": ["csstype@3.2.3", "", {}, "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ=="],
+
+ "cytoscape": ["cytoscape@3.33.1", "", {}, "sha512-iJc4TwyANnOGR1OmWhsS9ayRS3s+XQ185FmuHObThD+5AeJCakAAbWv8KimMTt08xCCLNgneQwFp+JRJOr9qGQ=="],
+
+ "cytoscape-cose-bilkent": ["cytoscape-cose-bilkent@4.1.0", "", { "dependencies": { "cose-base": "^1.0.0" }, "peerDependencies": { "cytoscape": "^3.2.0" } }, "sha512-wgQlVIUJF13Quxiv5e1gstZ08rnZj2XaLHGoFMYXz7SkNfCDOOteKBE6SYRfA9WxxI/iBc3ajfDoc6hb/MRAHQ=="],
+
+ "d3": ["d3@7.9.0", "", { "dependencies": { "d3-array": "3", "d3-axis": "3", "d3-brush": "3", "d3-chord": "3", "d3-color": "3", "d3-contour": "4", "d3-delaunay": "6", "d3-dispatch": "3", "d3-drag": "3", "d3-dsv": "3", "d3-ease": "3", "d3-fetch": "3", "d3-force": "3", "d3-format": "3", "d3-geo": "3", "d3-hierarchy": "3", "d3-interpolate": "3", "d3-path": "3", "d3-polygon": "3", "d3-quadtree": "3", "d3-random": "3", "d3-scale": "4", "d3-scale-chromatic": "3", "d3-selection": "3", "d3-shape": "3", "d3-time": "3", "d3-time-format": "4", "d3-timer": "3", "d3-transition": "3", "d3-zoom": "3" } }, "sha512-e1U46jVP+w7Iut8Jt8ri1YsPOvFpg46k+K8TpCb0P+zjCkjkPnV7WzfDJzMHy1LnA+wj5pLT1wjO901gLXeEhA=="],
+
+ "d3-array": ["d3-array@3.2.4", "", { "dependencies": { "internmap": "1 - 2" } }, "sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg=="],
+
+ "d3-axis": ["d3-axis@3.0.0", "", {}, "sha512-IH5tgjV4jE/GhHkRV0HiVYPDtvfjHQlQfJHs0usq7M30XcSBvOotpmH1IgkcXsO/5gEQZD43B//fc7SRT5S+xw=="],
+
+ "d3-brush": ["d3-brush@3.0.0", "", { "dependencies": { "d3-dispatch": "1 - 3", "d3-drag": "2 - 3", "d3-interpolate": "1 - 3", "d3-selection": "3", "d3-transition": "3" } }, "sha512-ALnjWlVYkXsVIGlOsuWH1+3udkYFI48Ljihfnh8FZPF2QS9o+PzGLBslO0PjzVoHLZ2KCVgAM8NVkXPJB2aNnQ=="],
+
+ "d3-chord": ["d3-chord@3.0.1", "", { "dependencies": { "d3-path": "1 - 3" } }, "sha512-VE5S6TNa+j8msksl7HwjxMHDM2yNK3XCkusIlpX5kwauBfXuyLAtNg9jCp/iHH61tgI4sb6R/EIMWCqEIdjT/g=="],
+
+ "d3-color": ["d3-color@3.1.0", "", {}, "sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA=="],
+
+ "d3-contour": ["d3-contour@4.0.2", "", { "dependencies": { "d3-array": "^3.2.0" } }, "sha512-4EzFTRIikzs47RGmdxbeUvLWtGedDUNkTcmzoeyg4sP/dvCexO47AaQL7VKy/gul85TOxw+IBgA8US2xwbToNA=="],
+
+ "d3-delaunay": ["d3-delaunay@6.0.4", "", { "dependencies": { "delaunator": "5" } }, "sha512-mdjtIZ1XLAM8bm/hx3WwjfHt6Sggek7qH043O8KEjDXN40xi3vx/6pYSVTwLjEgiXQTbvaouWKynLBiUZ6SK6A=="],
+
+ "d3-dispatch": ["d3-dispatch@3.0.1", "", {}, "sha512-rzUyPU/S7rwUflMyLc1ETDeBj0NRuHKKAcvukozwhshr6g6c5d8zh4c2gQjY2bZ0dXeGLWc1PF174P2tVvKhfg=="],
+
+ "d3-drag": ["d3-drag@3.0.0", "", { "dependencies": { "d3-dispatch": "1 - 3", "d3-selection": "3" } }, "sha512-pWbUJLdETVA8lQNJecMxoXfH6x+mO2UQo8rSmZ+QqxcbyA3hfeprFgIT//HW2nlHChWeIIMwS2Fq+gEARkhTkg=="],
+
+ "d3-dsv": ["d3-dsv@3.0.1", "", { "dependencies": { "commander": "7", "iconv-lite": "0.6", "rw": "1" }, "bin": { "csv2json": "bin/dsv2json.js", "csv2tsv": "bin/dsv2dsv.js", "dsv2dsv": "bin/dsv2dsv.js", "dsv2json": "bin/dsv2json.js", "json2csv": "bin/json2dsv.js", "json2dsv": "bin/json2dsv.js", "json2tsv": "bin/json2dsv.js", "tsv2csv": "bin/dsv2dsv.js", "tsv2json": "bin/dsv2json.js" } }, "sha512-UG6OvdI5afDIFP9w4G0mNq50dSOsXHJaRE8arAS5o9ApWnIElp8GZw1Dun8vP8OyHOZ/QJUKUJwxiiCCnUwm+Q=="],
+
+ "d3-ease": ["d3-ease@3.0.1", "", {}, "sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w=="],
+
+ "d3-fetch": ["d3-fetch@3.0.1", "", { "dependencies": { "d3-dsv": "1 - 3" } }, "sha512-kpkQIM20n3oLVBKGg6oHrUchHM3xODkTzjMoj7aWQFq5QEM+R6E4WkzT5+tojDY7yjez8KgCBRoj4aEr99Fdqw=="],
+
+ "d3-force": ["d3-force@3.0.0", "", { "dependencies": { "d3-dispatch": "1 - 3", "d3-quadtree": "1 - 3", "d3-timer": "1 - 3" } }, "sha512-zxV/SsA+U4yte8051P4ECydjD/S+qeYtnaIyAs9tgHCqfguma/aAQDjo85A9Z6EKhBirHRJHXIgJUlffT4wdLg=="],
+
+ "d3-format": ["d3-format@3.1.2", "", {}, "sha512-AJDdYOdnyRDV5b6ArilzCPPwc1ejkHcoyFarqlPqT7zRYjhavcT3uSrqcMvsgh2CgoPbK3RCwyHaVyxYcP2Arg=="],
+
+ "d3-geo": ["d3-geo@3.1.1", "", { "dependencies": { "d3-array": "2.5.0 - 3" } }, "sha512-637ln3gXKXOwhalDzinUgY83KzNWZRKbYubaG+fGVuc/dxO64RRljtCTnf5ecMyE1RIdtqpkVcq0IbtU2S8j2Q=="],
+
+ "d3-hierarchy": ["d3-hierarchy@3.1.2", "", {}, "sha512-FX/9frcub54beBdugHjDCdikxThEqjnR93Qt7PvQTOHxyiNCAlvMrHhclk3cD5VeAaq9fxmfRp+CnWw9rEMBuA=="],
+
+ "d3-interpolate": ["d3-interpolate@3.0.1", "", { "dependencies": { "d3-color": "1 - 3" } }, "sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g=="],
+
+ "d3-path": ["d3-path@3.1.0", "", {}, "sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ=="],
+
+ "d3-polygon": ["d3-polygon@3.0.1", "", {}, "sha512-3vbA7vXYwfe1SYhED++fPUQlWSYTTGmFmQiany/gdbiWgU/iEyQzyymwL9SkJjFFuCS4902BSzewVGsHHmHtXg=="],
+
+ "d3-quadtree": ["d3-quadtree@3.0.1", "", {}, "sha512-04xDrxQTDTCFwP5H6hRhsRcb9xxv2RzkcsygFzmkSIOJy3PeRJP7sNk3VRIbKXcog561P9oU0/rVH6vDROAgUw=="],
+
+ "d3-random": ["d3-random@3.0.1", "", {}, "sha512-FXMe9GfxTxqd5D6jFsQ+DJ8BJS4E/fT5mqqdjovykEB2oFbTMDVdg1MGFxfQW+FBOGoB++k8swBrgwSHT1cUXQ=="],
+
+ "d3-sankey": ["d3-sankey@0.12.3", "", { "dependencies": { "d3-array": "1 - 2", "d3-shape": "^1.2.0" } }, "sha512-nQhsBRmM19Ax5xEIPLMY9ZmJ/cDvd1BG3UVvt5h3WRxKg5zGRbvnteTyWAbzeSvlh3tW7ZEmq4VwR5mB3tutmQ=="],
+
+ "d3-scale": ["d3-scale@4.0.2", "", { "dependencies": { "d3-array": "2.10.0 - 3", "d3-format": "1 - 3", "d3-interpolate": "1.2.0 - 3", "d3-time": "2.1.1 - 3", "d3-time-format": "2 - 4" } }, "sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ=="],
+
+ "d3-scale-chromatic": ["d3-scale-chromatic@3.1.0", "", { "dependencies": { "d3-color": "1 - 3", "d3-interpolate": "1 - 3" } }, "sha512-A3s5PWiZ9YCXFye1o246KoscMWqf8BsD9eRiJ3He7C9OBaxKhAd5TFCdEx/7VbKtxxTsu//1mMJFrEt572cEyQ=="],
+
+ "d3-selection": ["d3-selection@3.0.0", "", {}, "sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ=="],
+
+ "d3-shape": ["d3-shape@3.2.0", "", { "dependencies": { "d3-path": "^3.1.0" } }, "sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA=="],
+
+ "d3-time": ["d3-time@3.1.0", "", { "dependencies": { "d3-array": "2 - 3" } }, "sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q=="],
+
+ "d3-time-format": ["d3-time-format@4.1.0", "", { "dependencies": { "d3-time": "1 - 3" } }, "sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg=="],
+
+ "d3-timer": ["d3-timer@3.0.1", "", {}, "sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA=="],
+
+ "d3-transition": ["d3-transition@3.0.1", "", { "dependencies": { "d3-color": "1 - 3", "d3-dispatch": "1 - 3", "d3-ease": "1 - 3", "d3-interpolate": "1 - 3", "d3-timer": "1 - 3" }, "peerDependencies": { "d3-selection": "2 - 3" } }, "sha512-ApKvfjsSR6tg06xrL434C0WydLr7JewBB3V+/39RMHsaXTOG0zmt/OAXeng5M5LBm0ojmxJrpomQVZ1aPvBL4w=="],
+
+ "d3-zoom": ["d3-zoom@3.0.0", "", { "dependencies": { "d3-dispatch": "1 - 3", "d3-drag": "2 - 3", "d3-interpolate": "1 - 3", "d3-selection": "2 - 3", "d3-transition": "2 - 3" } }, "sha512-b8AmV3kfQaqWAuacbPuNbL6vahnOJflOhexLzMMNLga62+/nh0JzvJ0aO/5a5MVgUFGS7Hu1P9P03o3fJkDCyw=="],
+
+ "dagre-d3-es": ["dagre-d3-es@7.0.13", "", { "dependencies": { "d3": "^7.9.0", "lodash-es": "^4.17.21" } }, "sha512-efEhnxpSuwpYOKRm/L5KbqoZmNNukHa/Flty4Wp62JRvgH2ojwVgPgdYyr4twpieZnyRDdIH7PY2mopX26+j2Q=="],
+
+ "damerau-levenshtein": ["damerau-levenshtein@1.0.8", "", {}, "sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA=="],
+
+ "dargs": ["dargs@8.1.0", "", {}, "sha512-wAV9QHOsNbwnWdNW2FYvE1P56wtgSbM+3SZcdGiWQILwVjACCXDCI3Ai8QlCjMDB8YK5zySiXZYBiwGmNY3lnw=="],
+
+ "data-uri-to-buffer": ["data-uri-to-buffer@4.0.1", "", {}, "sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A=="],
+
+ "data-view-buffer": ["data-view-buffer@1.0.2", "", { "dependencies": { "call-bound": "^1.0.3", "es-errors": "^1.3.0", "is-data-view": "^1.0.2" } }, "sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ=="],
+
+ "data-view-byte-length": ["data-view-byte-length@1.0.2", "", { "dependencies": { "call-bound": "^1.0.3", "es-errors": "^1.3.0", "is-data-view": "^1.0.2" } }, "sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ=="],
+
+ "data-view-byte-offset": ["data-view-byte-offset@1.0.1", "", { "dependencies": { "call-bound": "^1.0.2", "es-errors": "^1.3.0", "is-data-view": "^1.0.1" } }, "sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ=="],
+
+ "dayjs": ["dayjs@1.11.19", "", {}, "sha512-t5EcLVS6QPBNqM2z8fakk/NKel+Xzshgt8FFKAn+qwlD1pzZWxh0nVCrvFK7ZDb6XucZeF9z8C7CBWTRIVApAw=="],
+
+ "debug": ["debug@4.4.3", "", { "dependencies": { "ms": "^2.1.3" } }, "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA=="],
+
+ "decode-named-character-reference": ["decode-named-character-reference@1.3.0", "", { "dependencies": { "character-entities": "^2.0.0" } }, "sha512-GtpQYB283KrPp6nRw50q3U9/VfOutZOe103qlN7BPP6Ad27xYnOIWv4lPzo8HCAL+mMZofJ9KEy30fq6MfaK6Q=="],
+
+ "decompress-response": ["decompress-response@6.0.0", "", { "dependencies": { "mimic-response": "^3.1.0" } }, "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ=="],
+
+ "dedent": ["dedent@1.7.1", "", { "peerDependencies": { "babel-plugin-macros": "^3.1.0" }, "optionalPeers": ["babel-plugin-macros"] }, "sha512-9JmrhGZpOlEgOLdQgSm0zxFaYoQon408V1v49aqTWuXENVlnCuY9JBZcXZiCsZQWDjTm5Qf/nIvAy77mXDAjEg=="],
+
+ "deep-extend": ["deep-extend@0.6.0", "", {}, "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA=="],
+
+ "deep-is": ["deep-is@0.1.4", "", {}, "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ=="],
+
+ "deepmerge": ["deepmerge@4.3.1", "", {}, "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A=="],
+
+ "default-browser": ["default-browser@5.4.0", "", { "dependencies": { "bundle-name": "^4.1.0", "default-browser-id": "^5.0.0" } }, "sha512-XDuvSq38Hr1MdN47EDvYtx3U0MTqpCEn+F6ft8z2vYDzMrvQhVp0ui9oQdqW3MvK3vqUETglt1tVGgjLuJ5izg=="],
+
+ "default-browser-id": ["default-browser-id@5.0.1", "", {}, "sha512-x1VCxdX4t+8wVfd1so/9w+vQ4vx7lKd2Qp5tDRutErwmR85OgmfX7RlLRMWafRMY7hbEiXIbudNrjOAPa/hL8Q=="],
+
+ "defaults": ["defaults@1.0.4", "", { "dependencies": { "clone": "^1.0.2" } }, "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A=="],
+
+ "defer-to-connect": ["defer-to-connect@2.0.1", "", {}, "sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg=="],
+
+ "define-data-property": ["define-data-property@1.1.4", "", { "dependencies": { "es-define-property": "^1.0.0", "es-errors": "^1.3.0", "gopd": "^1.0.1" } }, "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A=="],
+
+ "define-lazy-prop": ["define-lazy-prop@3.0.0", "", {}, "sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg=="],
+
+ "define-properties": ["define-properties@1.2.1", "", { "dependencies": { "define-data-property": "^1.0.1", "has-property-descriptors": "^1.0.0", "object-keys": "^1.1.1" } }, "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg=="],
+
+ "degenerator": ["degenerator@5.0.1", "", { "dependencies": { "ast-types": "^0.13.4", "escodegen": "^2.1.0", "esprima": "^4.0.1" } }, "sha512-TllpMR/t0M5sqCXfj85i4XaAzxmS5tVA16dqvdkMwGmzI+dXLXnw3J+3Vdv7VKw+ThlTMboK6i9rnZ6Nntj5CQ=="],
+
+ "delaunator": ["delaunator@5.0.1", "", { "dependencies": { "robust-predicates": "^3.0.2" } }, "sha512-8nvh+XBe96aCESrGOqMp/84b13H9cdKbG5P2ejQCh4d4sK9RL4371qou9drQjMhvnPmhWl5hnmqbEE0fXr9Xnw=="],
+
+ "delayed-stream": ["delayed-stream@1.0.0", "", {}, "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ=="],
+
+ "depd": ["depd@2.0.0", "", {}, "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw=="],
+
+ "deprecation": ["deprecation@2.3.1", "", {}, "sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ=="],
+
+ "dequal": ["dequal@2.0.3", "", {}, "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA=="],
+
+ "destroy": ["destroy@1.2.0", "", {}, "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg=="],
+
+ "detect-indent": ["detect-indent@6.1.0", "", {}, "sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA=="],
+
+ "detect-newline": ["detect-newline@3.1.0", "", {}, "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA=="],
+
+ "devlop": ["devlop@1.1.0", "", { "dependencies": { "dequal": "^2.0.0" } }, "sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA=="],
+
+ "dezalgo": ["dezalgo@1.0.4", "", { "dependencies": { "asap": "^2.0.0", "wrappy": "1" } }, "sha512-rXSP0bf+5n0Qonsb+SVVfNfIsimO4HEtmnIpPHY8Q1UCzKlQrDMfdobr8nJOOsRgWCyMRqeSBQzmWUMq7zvVig=="],
+
+ "didyoumean": ["didyoumean@1.2.2", "", {}, "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw=="],
+
+ "diff": ["diff@4.0.4", "", {}, "sha512-X07nttJQkwkfKfvTPG/KSnE2OMdcUCao6+eXF3wmnIQRn2aPAHH3VxDbDOdegkd6JbPsXqShpvEOHfAT+nCNwQ=="],
+
+ "diff-sequences": ["diff-sequences@29.6.3", "", {}, "sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q=="],
+
+ "dlv": ["dlv@1.1.3", "", {}, "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA=="],
+
+ "doctrine": ["doctrine@2.1.0", "", { "dependencies": { "esutils": "^2.0.2" } }, "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw=="],
+
+ "dom-serializer": ["dom-serializer@2.0.0", "", { "dependencies": { "domelementtype": "^2.3.0", "domhandler": "^5.0.2", "entities": "^4.2.0" } }, "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg=="],
+
+ "domelementtype": ["domelementtype@2.3.0", "", {}, "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw=="],
+
+ "domhandler": ["domhandler@5.0.3", "", { "dependencies": { "domelementtype": "^2.3.0" } }, "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w=="],
+
+ "dompurify": ["dompurify@3.3.1", "", { "optionalDependencies": { "@types/trusted-types": "^2.0.7" } }, "sha512-qkdCKzLNtrgPFP1Vo+98FRzJnBRGe4ffyCea9IwHB1fyxPOeNTHpLKYGd4Uk9xvNoH0ZoOjwZxNptyMwqrId1Q=="],
+
+ "domutils": ["domutils@3.2.2", "", { "dependencies": { "dom-serializer": "^2.0.0", "domelementtype": "^2.3.0", "domhandler": "^5.0.3" } }, "sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw=="],
+
+ "dot-case": ["dot-case@3.0.4", "", { "dependencies": { "no-case": "^3.0.4", "tslib": "^2.0.3" } }, "sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w=="],
+
+ "dot-prop": ["dot-prop@5.3.0", "", { "dependencies": { "is-obj": "^2.0.0" } }, "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q=="],
+
+ "dotenv": ["dotenv@16.4.5", "", {}, "sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg=="],
+
+ "dotenv-expand": ["dotenv-expand@10.0.0", "", {}, "sha512-GopVGCpVS1UKH75VKHGuQFqS1Gusej0z4FyQkPdwjil2gNIv+LNsqBlboOzpJFZKVT95GkCyWJbBSdFEFUWI2A=="],
+
+ "dunder-proto": ["dunder-proto@1.0.1", "", { "dependencies": { "call-bind-apply-helpers": "^1.0.1", "es-errors": "^1.3.0", "gopd": "^1.2.0" } }, "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A=="],
+
+ "eastasianwidth": ["eastasianwidth@0.2.0", "", {}, "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA=="],
+
+ "ee-first": ["ee-first@1.1.1", "", {}, "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow=="],
+
+ "ejs": ["ejs@3.1.10", "", { "dependencies": { "jake": "^10.8.5" }, "bin": { "ejs": "bin/cli.js" } }, "sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA=="],
+
+ "electron-to-chromium": ["electron-to-chromium@1.5.267", "", {}, "sha512-0Drusm6MVRXSOJpGbaSVgcQsuB4hEkMpHXaVstcPmhu5LIedxs1xNK/nIxmQIU/RPC0+1/o0AVZfBTkTNJOdUw=="],
+
+ "elkjs": ["elkjs@0.9.3", "", {}, "sha512-f/ZeWvW/BCXbhGEf1Ujp29EASo/lk1FDnETgNKwJrsVvGZhUWCZyg3xLJjAsxfOmt8KjswHmI5EwCQcPMpOYhQ=="],
+
+ "emittery": ["emittery@0.13.1", "", {}, "sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ=="],
+
+ "emoji-regex": ["emoji-regex@9.2.2", "", {}, "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg=="],
+
+ "encodeurl": ["encodeurl@1.0.2", "", {}, "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w=="],
+
+ "end-of-stream": ["end-of-stream@1.4.5", "", { "dependencies": { "once": "^1.4.0" } }, "sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg=="],
+
+ "enhanced-resolve": ["enhanced-resolve@5.18.4", "", { "dependencies": { "graceful-fs": "^4.2.4", "tapable": "^2.2.0" } }, "sha512-LgQMM4WXU3QI+SYgEc2liRgznaD5ojbmY3sb8LxyguVkIg5FxdpTkvk72te2R38/TGKxH634oLxXRGY6d7AP+Q=="],
+
+ "ensure-posix-path": ["ensure-posix-path@1.1.1", "", {}, "sha512-VWU0/zXzVbeJNXvME/5EmLuEj2TauvoaTz6aFYK1Z92JCBlDlZ3Gu0tuGR42kpW1754ywTs+QB0g5TP0oj9Zaw=="],
+
+ "entities": ["entities@4.5.0", "", {}, "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw=="],
+
+ "env-paths": ["env-paths@2.2.1", "", {}, "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A=="],
+
+ "environment": ["environment@1.1.0", "", {}, "sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q=="],
+
+ "error-ex": ["error-ex@1.3.4", "", { "dependencies": { "is-arrayish": "^0.2.1" } }, "sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ=="],
+
+ "es-abstract": ["es-abstract@1.24.1", "", { "dependencies": { "array-buffer-byte-length": "^1.0.2", "arraybuffer.prototype.slice": "^1.0.4", "available-typed-arrays": "^1.0.7", "call-bind": "^1.0.8", "call-bound": "^1.0.4", "data-view-buffer": "^1.0.2", "data-view-byte-length": "^1.0.2", "data-view-byte-offset": "^1.0.1", "es-define-property": "^1.0.1", "es-errors": "^1.3.0", "es-object-atoms": "^1.1.1", "es-set-tostringtag": "^2.1.0", "es-to-primitive": "^1.3.0", "function.prototype.name": "^1.1.8", "get-intrinsic": "^1.3.0", "get-proto": "^1.0.1", "get-symbol-description": "^1.1.0", "globalthis": "^1.0.4", "gopd": "^1.2.0", "has-property-descriptors": "^1.0.2", "has-proto": "^1.2.0", "has-symbols": "^1.1.0", "hasown": "^2.0.2", "internal-slot": "^1.1.0", "is-array-buffer": "^3.0.5", "is-callable": "^1.2.7", "is-data-view": "^1.0.2", "is-negative-zero": "^2.0.3", "is-regex": "^1.2.1", "is-set": "^2.0.3", "is-shared-array-buffer": "^1.0.4", "is-string": "^1.1.1", "is-typed-array": "^1.1.15", "is-weakref": "^1.1.1", "math-intrinsics": "^1.1.0", "object-inspect": "^1.13.4", "object-keys": "^1.1.1", "object.assign": "^4.1.7", "own-keys": "^1.0.1", "regexp.prototype.flags": "^1.5.4", "safe-array-concat": "^1.1.3", "safe-push-apply": "^1.0.0", "safe-regex-test": "^1.1.0", "set-proto": "^1.0.0", "stop-iteration-iterator": "^1.1.0", "string.prototype.trim": "^1.2.10", "string.prototype.trimend": "^1.0.9", "string.prototype.trimstart": "^1.0.8", "typed-array-buffer": "^1.0.3", "typed-array-byte-length": "^1.0.3", "typed-array-byte-offset": "^1.0.4", "typed-array-length": "^1.0.7", "unbox-primitive": "^1.1.0", "which-typed-array": "^1.1.19" } }, "sha512-zHXBLhP+QehSSbsS9Pt23Gg964240DPd6QCf8WpkqEXxQ7fhdZzYsocOr5u7apWonsS5EjZDmTF+/slGMyasvw=="],
+
+ "es-array-method-boxes-properly": ["es-array-method-boxes-properly@1.0.0", "", {}, "sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA=="],
+
+ "es-define-property": ["es-define-property@1.0.1", "", {}, "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g=="],
+
+ "es-errors": ["es-errors@1.3.0", "", {}, "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw=="],
+
+ "es-get-iterator": ["es-get-iterator@1.1.3", "", { "dependencies": { "call-bind": "^1.0.2", "get-intrinsic": "^1.1.3", "has-symbols": "^1.0.3", "is-arguments": "^1.1.1", "is-map": "^2.0.2", "is-set": "^2.0.2", "is-string": "^1.0.7", "isarray": "^2.0.5", "stop-iteration-iterator": "^1.0.0" } }, "sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw=="],
+
+ "es-iterator-helpers": ["es-iterator-helpers@1.2.2", "", { "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.4", "define-properties": "^1.2.1", "es-abstract": "^1.24.1", "es-errors": "^1.3.0", "es-set-tostringtag": "^2.1.0", "function-bind": "^1.1.2", "get-intrinsic": "^1.3.0", "globalthis": "^1.0.4", "gopd": "^1.2.0", "has-property-descriptors": "^1.0.2", "has-proto": "^1.2.0", "has-symbols": "^1.1.0", "internal-slot": "^1.1.0", "iterator.prototype": "^1.1.5", "safe-array-concat": "^1.1.3" } }, "sha512-BrUQ0cPTB/IwXj23HtwHjS9n7O4h9FX94b4xc5zlTHxeLgTAdzYUDyy6KdExAl9lbN5rtfe44xpjpmj9grxs5w=="],
+
+ "es-module-lexer": ["es-module-lexer@1.7.0", "", {}, "sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA=="],
+
+ "es-object-atoms": ["es-object-atoms@1.1.1", "", { "dependencies": { "es-errors": "^1.3.0" } }, "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA=="],
+
+ "es-set-tostringtag": ["es-set-tostringtag@2.1.0", "", { "dependencies": { "es-errors": "^1.3.0", "get-intrinsic": "^1.2.6", "has-tostringtag": "^1.0.2", "hasown": "^2.0.2" } }, "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA=="],
+
+ "es-shim-unscopables": ["es-shim-unscopables@1.1.0", "", { "dependencies": { "hasown": "^2.0.2" } }, "sha512-d9T8ucsEhh8Bi1woXCf+TIKDIROLG5WCkxg8geBCbvk22kzwC5G2OnXVMO6FUsvQlgUUXQ2itephWDLqDzbeCw=="],
+
+ "es-to-primitive": ["es-to-primitive@1.3.0", "", { "dependencies": { "is-callable": "^1.2.7", "is-date-object": "^1.0.5", "is-symbol": "^1.0.4" } }, "sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g=="],
+
+ "escalade": ["escalade@3.2.0", "", {}, "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA=="],
+
+ "escape-goat": ["escape-goat@4.0.0", "", {}, "sha512-2Sd4ShcWxbx6OY1IHyla/CVNwvg7XwZVoXZHcSu9w9SReNP1EzzD5T8NWKIR38fIqEns9kDWKUQTXXAmlDrdPg=="],
+
+ "escape-html": ["escape-html@1.0.3", "", {}, "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow=="],
+
+ "escape-string-regexp": ["escape-string-regexp@4.0.0", "", {}, "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA=="],
+
+ "escodegen": ["escodegen@2.1.0", "", { "dependencies": { "esprima": "^4.0.1", "estraverse": "^5.2.0", "esutils": "^2.0.2" }, "optionalDependencies": { "source-map": "~0.6.1" }, "bin": { "esgenerate": "bin/esgenerate.js", "escodegen": "bin/escodegen.js" } }, "sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w=="],
+
+ "eslint": ["eslint@9.7.0", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.11.0", "@eslint/config-array": "^0.17.0", "@eslint/eslintrc": "^3.1.0", "@eslint/js": "9.7.0", "@humanwhocodes/module-importer": "^1.0.1", "@humanwhocodes/retry": "^0.3.0", "@nodelib/fs.walk": "^1.2.8", "ajv": "^6.12.4", "chalk": "^4.0.0", "cross-spawn": "^7.0.2", "debug": "^4.3.2", "escape-string-regexp": "^4.0.0", "eslint-scope": "^8.0.2", "eslint-visitor-keys": "^4.0.0", "espree": "^10.1.0", "esquery": "^1.5.0", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", "file-entry-cache": "^8.0.0", "find-up": "^5.0.0", "glob-parent": "^6.0.2", "ignore": "^5.2.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", "is-path-inside": "^3.0.3", "json-stable-stringify-without-jsonify": "^1.0.1", "levn": "^0.4.1", "lodash.merge": "^4.6.2", "minimatch": "^3.1.2", "natural-compare": "^1.4.0", "optionator": "^0.9.3", "strip-ansi": "^6.0.1", "text-table": "^0.2.0" }, "bin": { "eslint": "bin/eslint.js" } }, "sha512-FzJ9D/0nGiCGBf8UXO/IGLTgLVzIxze1zpfA8Ton2mjLovXdAPlYDv+MQDcqj3TmrhAGYfOpz9RfR+ent0AgAw=="],
+
+ "eslint-config-next": ["eslint-config-next@14.2.35", "", { "dependencies": { "@next/eslint-plugin-next": "14.2.35", "@rushstack/eslint-patch": "^1.3.3", "@typescript-eslint/eslint-plugin": "^5.4.2 || ^6.0.0 || ^7.0.0 || ^8.0.0", "@typescript-eslint/parser": "^5.4.2 || ^6.0.0 || ^7.0.0 || ^8.0.0", "eslint-import-resolver-node": "^0.3.6", "eslint-import-resolver-typescript": "^3.5.2", "eslint-plugin-import": "^2.28.1", "eslint-plugin-jsx-a11y": "^6.7.1", "eslint-plugin-react": "^7.33.2", "eslint-plugin-react-hooks": "^4.5.0 || 5.0.0-canary-7118f5dd7-20230705" }, "peerDependencies": { "eslint": "^7.23.0 || ^8.0.0", "typescript": ">=3.3.1" }, "optionalPeers": ["typescript"] }, "sha512-BpLsv01UisH193WyT/1lpHqq5iJ/Orfz9h/NOOlAmTUq4GY349PextQ62K4XpnaM9supeiEn3TaOTeQO07gURg=="],
+
+ "eslint-config-prettier": ["eslint-config-prettier@9.1.0", "", { "peerDependencies": { "eslint": ">=7.0.0" }, "bin": { "eslint-config-prettier": "bin/cli.js" } }, "sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw=="],
+
+ "eslint-import-resolver-node": ["eslint-import-resolver-node@0.3.9", "", { "dependencies": { "debug": "^3.2.7", "is-core-module": "^2.13.0", "resolve": "^1.22.4" } }, "sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g=="],
+
+ "eslint-import-resolver-typescript": ["eslint-import-resolver-typescript@3.10.1", "", { "dependencies": { "@nolyfill/is-core-module": "1.0.39", "debug": "^4.4.0", "get-tsconfig": "^4.10.0", "is-bun-module": "^2.0.0", "stable-hash": "^0.0.5", "tinyglobby": "^0.2.13", "unrs-resolver": "^1.6.2" }, "peerDependencies": { "eslint": "*", "eslint-plugin-import": "*", "eslint-plugin-import-x": "*" }, "optionalPeers": ["eslint-plugin-import", "eslint-plugin-import-x"] }, "sha512-A1rHYb06zjMGAxdLSkN2fXPBwuSaQ0iO5M/hdyS0Ajj1VBaRp0sPD3dn1FhME3c/JluGFbwSxyCfqdSbtQLAHQ=="],
+
+ "eslint-module-utils": ["eslint-module-utils@2.12.1", "", { "dependencies": { "debug": "^3.2.7" } }, "sha512-L8jSWTze7K2mTg0vos/RuLRS5soomksDPoJLXIslC7c8Wmut3bx7CPpJijDcBZtxQ5lrbUdM+s0OlNbz0DCDNw=="],
+
+ "eslint-plugin-import": ["eslint-plugin-import@2.32.0", "", { "dependencies": { "@rtsao/scc": "^1.1.0", "array-includes": "^3.1.9", "array.prototype.findlastindex": "^1.2.6", "array.prototype.flat": "^1.3.3", "array.prototype.flatmap": "^1.3.3", "debug": "^3.2.7", "doctrine": "^2.1.0", "eslint-import-resolver-node": "^0.3.9", "eslint-module-utils": "^2.12.1", "hasown": "^2.0.2", "is-core-module": "^2.16.1", "is-glob": "^4.0.3", "minimatch": "^3.1.2", "object.fromentries": "^2.0.8", "object.groupby": "^1.0.3", "object.values": "^1.2.1", "semver": "^6.3.1", "string.prototype.trimend": "^1.0.9", "tsconfig-paths": "^3.15.0" }, "peerDependencies": { "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 || ^9" } }, "sha512-whOE1HFo/qJDyX4SnXzP4N6zOWn79WhnCUY/iDR0mPfQZO8wcYE4JClzI2oZrhBnnMUCBCHZhO6VQyoBU95mZA=="],
+
+ "eslint-plugin-jsx-a11y": ["eslint-plugin-jsx-a11y@6.10.2", "", { "dependencies": { "aria-query": "^5.3.2", "array-includes": "^3.1.8", "array.prototype.flatmap": "^1.3.2", "ast-types-flow": "^0.0.8", "axe-core": "^4.10.0", "axobject-query": "^4.1.0", "damerau-levenshtein": "^1.0.8", "emoji-regex": "^9.2.2", "hasown": "^2.0.2", "jsx-ast-utils": "^3.3.5", "language-tags": "^1.0.9", "minimatch": "^3.1.2", "object.fromentries": "^2.0.8", "safe-regex-test": "^1.0.3", "string.prototype.includes": "^2.0.1" }, "peerDependencies": { "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9" } }, "sha512-scB3nz4WmG75pV8+3eRUQOHZlNSUhFNq37xnpgRkCCELU3XMvXAxLk1eqWWyE22Ki4Q01Fnsw9BA3cJHDPgn2Q=="],
+
+ "eslint-plugin-prettier": ["eslint-plugin-prettier@5.2.1", "", { "dependencies": { "prettier-linter-helpers": "^1.0.0", "synckit": "^0.9.1" }, "peerDependencies": { "@types/eslint": ">=8.0.0", "eslint": ">=8.0.0", "eslint-config-prettier": "*", "prettier": ">=3.0.0" }, "optionalPeers": ["@types/eslint", "eslint-config-prettier"] }, "sha512-gH3iR3g4JfF+yYPaJYkN7jEl9QbweL/YfkoRlNnuIEHEz1vHVlCmWOS+eGGiRuzHQXdJFCOTxRgvju9b8VUmrw=="],
+
+ "eslint-plugin-react": ["eslint-plugin-react@7.37.5", "", { "dependencies": { "array-includes": "^3.1.8", "array.prototype.findlast": "^1.2.5", "array.prototype.flatmap": "^1.3.3", "array.prototype.tosorted": "^1.1.4", "doctrine": "^2.1.0", "es-iterator-helpers": "^1.2.1", "estraverse": "^5.3.0", "hasown": "^2.0.2", "jsx-ast-utils": "^2.4.1 || ^3.0.0", "minimatch": "^3.1.2", "object.entries": "^1.1.9", "object.fromentries": "^2.0.8", "object.values": "^1.2.1", "prop-types": "^15.8.1", "resolve": "^2.0.0-next.5", "semver": "^6.3.1", "string.prototype.matchall": "^4.0.12", "string.prototype.repeat": "^1.0.0" }, "peerDependencies": { "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7" } }, "sha512-Qteup0SqU15kdocexFNAJMvCJEfa2xUKNV4CC1xsVMrIIqEy3SQ/rqyxCWNzfrd3/ldy6HMlD2e0JDVpDg2qIA=="],
+
+ "eslint-plugin-react-hooks": ["eslint-plugin-react-hooks@4.6.2", "", { "peerDependencies": { "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0" } }, "sha512-QzliNJq4GinDBcD8gPB5v0wh6g8q3SUi6EFF0x8N/BL9PoVs0atuGc47ozMRyOWAKdwaZ5OnbOEa3WR+dSGKuQ=="],
+
+ "eslint-scope": ["eslint-scope@8.4.0", "", { "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^5.2.0" } }, "sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg=="],
+
+ "eslint-visitor-keys": ["eslint-visitor-keys@4.2.1", "", {}, "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ=="],
+
+ "espree": ["espree@10.4.0", "", { "dependencies": { "acorn": "^8.15.0", "acorn-jsx": "^5.3.2", "eslint-visitor-keys": "^4.2.1" } }, "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ=="],
+
+ "esprima": ["esprima@4.0.1", "", { "bin": { "esparse": "./bin/esparse.js", "esvalidate": "./bin/esvalidate.js" } }, "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A=="],
+
+ "esquery": ["esquery@1.7.0", "", { "dependencies": { "estraverse": "^5.1.0" } }, "sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g=="],
+
+ "esrecurse": ["esrecurse@4.3.0", "", { "dependencies": { "estraverse": "^5.2.0" } }, "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag=="],
+
+ "estraverse": ["estraverse@5.3.0", "", {}, "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA=="],
+
+ "estree-util-attach-comments": ["estree-util-attach-comments@2.1.1", "", { "dependencies": { "@types/estree": "^1.0.0" } }, "sha512-+5Ba/xGGS6mnwFbXIuQiDPTbuTxuMCooq3arVv7gPZtYpjp+VXH/NkHAP35OOefPhNG/UGqU3vt/LTABwcHX0w=="],
+
+ "estree-util-build-jsx": ["estree-util-build-jsx@2.2.2", "", { "dependencies": { "@types/estree-jsx": "^1.0.0", "estree-util-is-identifier-name": "^2.0.0", "estree-walker": "^3.0.0" } }, "sha512-m56vOXcOBuaF+Igpb9OPAy7f9w9OIkb5yhjsZuaPm7HoGi4oTOQi0h2+yZ+AtKklYFZ+rPC4n0wYCJCEU1ONqg=="],
+
+ "estree-util-is-identifier-name": ["estree-util-is-identifier-name@2.1.0", "", {}, "sha512-bEN9VHRyXAUOjkKVQVvArFym08BTWB0aJPppZZr0UNyAqWsLaVfAqP7hbaTJjzHifmB5ebnR8Wm7r7yGN/HonQ=="],
+
+ "estree-util-to-js": ["estree-util-to-js@1.2.0", "", { "dependencies": { "@types/estree-jsx": "^1.0.0", "astring": "^1.8.0", "source-map": "^0.7.0" } }, "sha512-IzU74r1PK5IMMGZXUVZbmiu4A1uhiPgW5hm1GjcOfr4ZzHaMPpLNJjR7HjXiIOzi25nZDrgFTobHTkV5Q6ITjA=="],
+
+ "estree-util-value-to-estree": ["estree-util-value-to-estree@3.5.0", "", { "dependencies": { "@types/estree": "^1.0.0" } }, "sha512-aMV56R27Gv3QmfmF1MY12GWkGzzeAezAX+UplqHVASfjc9wNzI/X6hC0S9oxq61WT4aQesLGslWP9tKk6ghRZQ=="],
+
+ "estree-util-visit": ["estree-util-visit@1.2.1", "", { "dependencies": { "@types/estree-jsx": "^1.0.0", "@types/unist": "^2.0.0" } }, "sha512-xbgqcrkIVbIG+lI/gzbvd9SGTJL4zqJKBFttUl5pP27KhAjtMKbX/mQXJ7qgyXpMgVy/zvpm0xoQQaGL8OloOw=="],
+
+ "estree-walker": ["estree-walker@3.0.3", "", { "dependencies": { "@types/estree": "^1.0.0" } }, "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g=="],
+
+ "esutils": ["esutils@2.0.3", "", {}, "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g=="],
+
+ "etag": ["etag@1.8.1", "", {}, "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg=="],
+
+ "event-target-shim": ["event-target-shim@5.0.1", "", {}, "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ=="],
+
+ "eventemitter3": ["eventemitter3@5.0.4", "", {}, "sha512-mlsTRyGaPBjPedk6Bvw+aqbsXDtoAyAzm5MO7JgU+yVRyMQ5O8bD4Kcci7BS85f93veegeCPkL8R4GLClnjLFw=="],
+
+ "events": ["events@3.3.0", "", {}, "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q=="],
+
+ "example-nestjs-express": ["example-nestjs-express@workspace:examples/nestjs-express"],
+
+ "example-nestjs-fastify": ["example-nestjs-fastify@workspace:examples/nestjs-fastify"],
+
+ "execa": ["execa@8.0.1", "", { "dependencies": { "cross-spawn": "^7.0.3", "get-stream": "^8.0.1", "human-signals": "^5.0.0", "is-stream": "^3.0.0", "merge-stream": "^2.0.0", "npm-run-path": "^5.1.0", "onetime": "^6.0.0", "signal-exit": "^4.1.0", "strip-final-newline": "^3.0.0" } }, "sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg=="],
+
+ "executable": ["executable@4.1.1", "", { "dependencies": { "pify": "^2.2.0" } }, "sha512-8iA79xD3uAch729dUG8xaaBBFGaEa0wdD2VkYLFHwlqosEj/jT66AzcreRDSgV7ehnNLBW2WR5jIXwGKjVdTLg=="],
+
+ "exit": ["exit@0.1.2", "", {}, "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ=="],
+
+ "expect": ["expect@29.7.0", "", { "dependencies": { "@jest/expect-utils": "^29.7.0", "jest-get-type": "^29.6.3", "jest-matcher-utils": "^29.7.0", "jest-message-util": "^29.7.0", "jest-util": "^29.7.0" } }, "sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw=="],
+
+ "express": ["express@4.19.2", "", { "dependencies": { "accepts": "~1.3.8", "array-flatten": "1.1.1", "body-parser": "1.20.2", "content-disposition": "0.5.4", "content-type": "~1.0.4", "cookie": "0.6.0", "cookie-signature": "1.0.6", "debug": "2.6.9", "depd": "2.0.0", "encodeurl": "~1.0.2", "escape-html": "~1.0.3", "etag": "~1.8.1", "finalhandler": "1.2.0", "fresh": "0.5.2", "http-errors": "2.0.0", "merge-descriptors": "1.0.1", "methods": "~1.1.2", "on-finished": "2.4.1", "parseurl": "~1.3.3", "path-to-regexp": "0.1.7", "proxy-addr": "~2.0.7", "qs": "6.11.0", "range-parser": "~1.2.1", "safe-buffer": "5.2.1", "send": "0.18.0", "serve-static": "1.15.0", "setprototypeof": "1.2.0", "statuses": "2.0.1", "type-is": "~1.6.18", "utils-merge": "1.0.1", "vary": "~1.1.2" } }, "sha512-5T6nhjsT+EOMzuck8JjBHARTHfMht0POzlA60WV2pMD3gyXw2LZnZ+ueGdNxG+0calOJcWKbpFcuzLZ91YWq9Q=="],
+
+ "ext-list": ["ext-list@2.2.2", "", { "dependencies": { "mime-db": "^1.28.0" } }, "sha512-u+SQgsubraE6zItfVA0tBuCBhfU9ogSRnsvygI7wht9TS510oLkBRXBsqopeUG/GBOIQyKZO9wjTqIu/sf5zFA=="],
+
+ "ext-name": ["ext-name@5.0.0", "", { "dependencies": { "ext-list": "^2.0.0", "sort-keys-length": "^1.0.0" } }, "sha512-yblEwXAbGv1VQDmow7s38W77hzAgJAO50ztBLMcUyUBfxv1HC+LGwtiEN+Co6LtlqT/5uwVOxsD4TNIilWhwdQ=="],
+
+ "extend": ["extend@3.0.2", "", {}, "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g=="],
+
+ "extend-shallow": ["extend-shallow@2.0.1", "", { "dependencies": { "is-extendable": "^0.1.0" } }, "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug=="],
+
+ "external-editor": ["external-editor@3.1.0", "", { "dependencies": { "chardet": "^0.7.0", "iconv-lite": "^0.4.24", "tmp": "^0.0.33" } }, "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew=="],
+
+ "fast-content-type-parse": ["fast-content-type-parse@1.1.0", "", {}, "sha512-fBHHqSTFLVnR61C+gltJuE5GkVQMV0S2nqUO8TJ+5Z3qAKG8vAx4FKai1s5jq/inV1+sREynIWSuQ6HgoSXpDQ=="],
+
+ "fast-decode-uri-component": ["fast-decode-uri-component@1.0.1", "", {}, "sha512-WKgKWg5eUxvRZGwW8FvfbaH7AXSh2cL+3j5fMGzUMCxWBJ3dV3a7Wz8y2f/uQ0e3B6WmodD3oS54jTQ9HVTIIg=="],
+
+ "fast-deep-equal": ["fast-deep-equal@3.1.3", "", {}, "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q=="],
+
+ "fast-diff": ["fast-diff@1.3.0", "", {}, "sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw=="],
+
+ "fast-glob": ["fast-glob@3.3.3", "", { "dependencies": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", "glob-parent": "^5.1.2", "merge2": "^1.3.0", "micromatch": "^4.0.8" } }, "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg=="],
+
+ "fast-json-stable-stringify": ["fast-json-stable-stringify@2.1.0", "", {}, "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw=="],
+
+ "fast-json-stringify": ["fast-json-stringify@6.2.0", "", { "dependencies": { "@fastify/merge-json-schemas": "^0.2.0", "ajv": "^8.12.0", "ajv-formats": "^3.0.1", "fast-uri": "^3.0.0", "json-schema-ref-resolver": "^3.0.0", "rfdc": "^1.2.0" } }, "sha512-Eaf/KNIDwHkzfyeQFNfLXJnQ7cl1XQI3+zRqmPlvtkMigbXnAcasTrvJQmquBSxKfFGeRA6PFog8t+hFmpDoWw=="],
+
+ "fast-levenshtein": ["fast-levenshtein@2.0.6", "", {}, "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw=="],
+
+ "fast-querystring": ["fast-querystring@1.1.2", "", { "dependencies": { "fast-decode-uri-component": "^1.0.1" } }, "sha512-g6KuKWmFXc0fID8WWH0jit4g0AGBoJhCkJMb1RmbsSEUNvQ+ZC8D6CUZ+GtF8nMzSPXnhiePyyqqipzNNEnHjg=="],
+
+ "fast-safe-stringify": ["fast-safe-stringify@2.1.1", "", {}, "sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA=="],
+
+ "fast-uri": ["fast-uri@3.1.0", "", {}, "sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA=="],
+
+ "fastify": ["fastify@5.7.1", "", { "dependencies": { "@fastify/ajv-compiler": "^4.0.5", "@fastify/error": "^4.0.0", "@fastify/fast-json-stringify-compiler": "^5.0.0", "@fastify/proxy-addr": "^5.0.0", "abstract-logging": "^2.0.1", "avvio": "^9.0.0", "fast-json-stringify": "^6.0.0", "find-my-way": "^9.0.0", "light-my-request": "^6.0.0", "pino": "^10.1.0", "process-warning": "^5.0.0", "rfdc": "^1.3.1", "secure-json-parse": "^4.0.0", "semver": "^7.6.0", "toad-cache": "^3.7.0" } }, "sha512-ZW7S4fxlZhE+tYWVokFzjh+i56R+buYKNGhrVl6DtN8sxkyMEzpJnzvO8A/ZZrsg5w6X37u6I4EOQikYS5DXpA=="],
+
+ "fastify-plugin": ["fastify-plugin@4.5.1", "", {}, "sha512-stRHYGeuqpEZTL1Ef0Ovr2ltazUT9g844X5z/zEBFLG8RYlpDiOCIG+ATvYEp+/zmc7sN29mcIMp8gvYplYPIQ=="],
+
+ "fastq": ["fastq@1.20.1", "", { "dependencies": { "reusify": "^1.0.4" } }, "sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw=="],
+
+ "fb-watchman": ["fb-watchman@2.0.2", "", { "dependencies": { "bser": "2.1.1" } }, "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA=="],
+
+ "fdir": ["fdir@6.5.0", "", { "peerDependencies": { "picomatch": "^3 || ^4" }, "optionalPeers": ["picomatch"] }, "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg=="],
+
+ "fetch-blob": ["fetch-blob@3.2.0", "", { "dependencies": { "node-domexception": "^1.0.0", "web-streams-polyfill": "^3.0.3" } }, "sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ=="],
+
+ "figures": ["figures@3.2.0", "", { "dependencies": { "escape-string-regexp": "^1.0.5" } }, "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg=="],
+
+ "file-entry-cache": ["file-entry-cache@8.0.0", "", { "dependencies": { "flat-cache": "^4.0.0" } }, "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ=="],
+
+ "file-type": ["file-type@17.1.6", "", { "dependencies": { "readable-web-to-node-stream": "^3.0.2", "strtok3": "^7.0.0-alpha.9", "token-types": "^5.0.0-alpha.2" } }, "sha512-hlDw5Ev+9e883s0pwUsuuYNu4tD7GgpUnOvykjv1Gya0ZIjuKumthDRua90VUn6/nlRKAjcxLUnHNTIUWwWIiw=="],
+
+ "filelist": ["filelist@1.0.4", "", { "dependencies": { "minimatch": "^5.0.1" } }, "sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q=="],
+
+ "filename-reserved-regex": ["filename-reserved-regex@3.0.0", "", {}, "sha512-hn4cQfU6GOT/7cFHXBqeBg2TbrMBgdD0kcjLhvSQYYwm3s4B6cjvBfb7nBALJLAXqmU5xajSa7X2NnUud/VCdw=="],
+
+ "filenamify": ["filenamify@5.1.1", "", { "dependencies": { "filename-reserved-regex": "^3.0.0", "strip-outer": "^2.0.0", "trim-repeated": "^2.0.0" } }, "sha512-M45CbrJLGACfrPOkrTp3j2EcO9OBkKUYME0eiqOCa7i2poaklU0jhlIaMlr8ijLorT0uLAzrn3qXOp5684CkfA=="],
+
+ "fill-range": ["fill-range@7.1.1", "", { "dependencies": { "to-regex-range": "^5.0.1" } }, "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg=="],
+
+ "finalhandler": ["finalhandler@1.2.0", "", { "dependencies": { "debug": "2.6.9", "encodeurl": "~1.0.2", "escape-html": "~1.0.3", "on-finished": "2.4.1", "parseurl": "~1.3.3", "statuses": "2.0.1", "unpipe": "~1.0.0" } }, "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg=="],
+
+ "find-my-way": ["find-my-way@9.4.0", "", { "dependencies": { "fast-deep-equal": "^3.1.3", "fast-querystring": "^1.0.0", "safe-regex2": "^5.0.0" } }, "sha512-5Ye4vHsypZRYtS01ob/iwHzGRUDELlsoCftI/OZFhcLs1M0tkGPcXldE80TAZC5yYuJMBPJQQ43UHlqbJWiX2w=="],
+
+ "find-up": ["find-up@5.0.0", "", { "dependencies": { "locate-path": "^6.0.0", "path-exists": "^4.0.0" } }, "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng=="],
+
+ "find-versions": ["find-versions@5.1.0", "", { "dependencies": { "semver-regex": "^4.0.5" } }, "sha512-+iwzCJ7C5v5KgcBuueqVoNiHVoQpwiUK5XFLjf0affFTep+Wcw93tPvmb8tqujDNmzhBDPddnWV/qgWSXgq+Hg=="],
+
+ "flat-cache": ["flat-cache@4.0.1", "", { "dependencies": { "flatted": "^3.2.9", "keyv": "^4.5.4" } }, "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw=="],
+
+ "flatted": ["flatted@3.3.3", "", {}, "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg=="],
+
+ "flexsearch": ["flexsearch@0.7.43", "", {}, "sha512-c5o/+Um8aqCSOXGcZoqZOm+NqtVwNsvVpWv6lfmSclU954O3wvQKxxK8zj74fPaSJbXpSLTs4PRhh+wnoCXnKg=="],
+
+ "focus-visible": ["focus-visible@5.2.1", "", {}, "sha512-8Bx950VD1bWTQJEH/AM6SpEk+SU55aVnp4Ujhuuxy3eMEBCRwBnTBnVXr9YAPvZL3/CNjCa8u4IWfNmEO53whA=="],
+
+ "for-each": ["for-each@0.3.5", "", { "dependencies": { "is-callable": "^1.2.7" } }, "sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg=="],
+
+ "foreground-child": ["foreground-child@3.3.1", "", { "dependencies": { "cross-spawn": "^7.0.6", "signal-exit": "^4.0.1" } }, "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw=="],
+
+ "fork-ts-checker-webpack-plugin": ["fork-ts-checker-webpack-plugin@8.0.0", "", { "dependencies": { "@babel/code-frame": "^7.16.7", "chalk": "^4.1.2", "chokidar": "^3.5.3", "cosmiconfig": "^7.0.1", "deepmerge": "^4.2.2", "fs-extra": "^10.0.0", "memfs": "^3.4.1", "minimatch": "^3.0.4", "node-abort-controller": "^3.0.1", "schema-utils": "^3.1.1", "semver": "^7.3.5", "tapable": "^2.2.1" }, "peerDependencies": { "typescript": ">3.6.0", "webpack": "^5.11.0" } }, "sha512-mX3qW3idpueT2klaQXBzrIM/pHw+T0B/V9KHEvNrqijTq9NFnMZU6oreVxDYcf33P8a5cW+67PjodNHthGnNVg=="],
+
+ "form-data": ["form-data@4.0.5", "", { "dependencies": { "asynckit": "^0.4.0", "combined-stream": "^1.0.8", "es-set-tostringtag": "^2.1.0", "hasown": "^2.0.2", "mime-types": "^2.1.12" } }, "sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w=="],
+
+ "form-data-encoder": ["form-data-encoder@2.1.4", "", {}, "sha512-yDYSgNMraqvnxiEXO4hi88+YZxaHC6QKzb5N84iRCTDeRO7ZALpir/lVmf/uXUhnwUr2O4HU8s/n6x+yNjQkHw=="],
+
+ "formdata-polyfill": ["formdata-polyfill@4.0.10", "", { "dependencies": { "fetch-blob": "^3.1.2" } }, "sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g=="],
+
+ "formidable": ["formidable@3.5.4", "", { "dependencies": { "@paralleldrive/cuid2": "^2.2.2", "dezalgo": "^1.0.4", "once": "^1.4.0" } }, "sha512-YikH+7CUTOtP44ZTnUhR7Ic2UASBPOqmaRkRKxRbywPTe5VxF7RRCck4af9wutiZ/QKM5nME9Bie2fFaPz5Gug=="],
+
+ "forwarded": ["forwarded@0.2.0", "", {}, "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow=="],
+
+ "fraction.js": ["fraction.js@5.3.4", "", {}, "sha512-1X1NTtiJphryn/uLQz3whtY6jK3fTqoE3ohKs0tT+Ujr1W59oopxmoEh7Lu5p6vBaPbgoM0bzveAW4Qi5RyWDQ=="],
+
+ "framer-motion": ["framer-motion@11.18.2", "", { "dependencies": { "motion-dom": "^11.18.1", "motion-utils": "^11.18.1", "tslib": "^2.4.0" }, "peerDependencies": { "@emotion/is-prop-valid": "*", "react": "^18.0.0 || ^19.0.0", "react-dom": "^18.0.0 || ^19.0.0" }, "optionalPeers": ["@emotion/is-prop-valid", "react", "react-dom"] }, "sha512-5F5Och7wrvtLVElIpclDT0CBzMVg3dL22B64aZwHtsIY8RB4mXICLrkajK4G9R+ieSAGcgrLeae2SeUTg2pr6w=="],
+
+ "fresh": ["fresh@0.5.2", "", {}, "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q=="],
+
+ "fs-extra": ["fs-extra@10.1.0", "", { "dependencies": { "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", "universalify": "^2.0.0" } }, "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ=="],
+
+ "fs-monkey": ["fs-monkey@1.1.0", "", {}, "sha512-QMUezzXWII9EV5aTFXW1UBVUO77wYPpjqIF8/AviUCThNeSYZykpoTixUeaNNBwmCev0AMDWMAni+f8Hxb1IFw=="],
+
+ "fs.realpath": ["fs.realpath@1.0.0", "", {}, "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw=="],
+
+ "fsevents": ["fsevents@2.3.3", "", { "os": "darwin" }, "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw=="],
+
+ "function-bind": ["function-bind@1.1.2", "", {}, "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA=="],
+
+ "function.prototype.name": ["function.prototype.name@1.1.8", "", { "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.3", "define-properties": "^1.2.1", "functions-have-names": "^1.2.3", "hasown": "^2.0.2", "is-callable": "^1.2.7" } }, "sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q=="],
+
+ "functions-have-names": ["functions-have-names@1.2.3", "", {}, "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ=="],
+
+ "fuzzysort": ["fuzzysort@2.0.4", "", {}, "sha512-Api1mJL+Ad7W7vnDZnWq5pGaXJjyencT+iKGia2PlHUcSsSzWwIQ3S1isiMpwpavjYtGd2FzhUIhnnhOULZgDw=="],
+
+ "geist": ["geist@1.5.1", "", { "peerDependencies": { "next": ">=13.2.0" } }, "sha512-mAHZxIsL2o3ZITFaBVFBnwyDOw+zNLYum6A6nIjpzCGIO8QtC3V76XF2RnZTyLx1wlDTmMDy8jg3Ib52MIjGvQ=="],
+
+ "generator-function": ["generator-function@2.0.1", "", {}, "sha512-SFdFmIJi+ybC0vjlHN0ZGVGHc3lgE0DxPAT0djjVg+kjOnSqclqmj0KQ7ykTOLP6YxoqOvuAODGdcHJn+43q3g=="],
+
+ "gensync": ["gensync@1.0.0-beta.2", "", {}, "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg=="],
+
+ "get-caller-file": ["get-caller-file@2.0.5", "", {}, "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg=="],
+
+ "get-east-asian-width": ["get-east-asian-width@1.4.0", "", {}, "sha512-QZjmEOC+IT1uk6Rx0sX22V6uHWVwbdbxf1faPqJ1QhLdGgsRGCZoyaQBm/piRdJy/D2um6hM1UP7ZEeQ4EkP+Q=="],
+
+ "get-intrinsic": ["get-intrinsic@1.3.0", "", { "dependencies": { "call-bind-apply-helpers": "^1.0.2", "es-define-property": "^1.0.1", "es-errors": "^1.3.0", "es-object-atoms": "^1.1.1", "function-bind": "^1.1.2", "get-proto": "^1.0.1", "gopd": "^1.2.0", "has-symbols": "^1.1.0", "hasown": "^2.0.2", "math-intrinsics": "^1.1.0" } }, "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ=="],
+
+ "get-package-type": ["get-package-type@0.1.0", "", {}, "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q=="],
+
+ "get-proto": ["get-proto@1.0.1", "", { "dependencies": { "dunder-proto": "^1.0.1", "es-object-atoms": "^1.0.0" } }, "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g=="],
+
+ "get-stream": ["get-stream@8.0.1", "", {}, "sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA=="],
+
+ "get-symbol-description": ["get-symbol-description@1.1.0", "", { "dependencies": { "call-bound": "^1.0.3", "es-errors": "^1.3.0", "get-intrinsic": "^1.2.6" } }, "sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg=="],
+
+ "get-tsconfig": ["get-tsconfig@4.13.0", "", { "dependencies": { "resolve-pkg-maps": "^1.0.0" } }, "sha512-1VKTZJCwBrvbd+Wn3AOgQP/2Av+TfTCOlE4AcRJE72W1ksZXbAx8PPBR9RzgTeSPzlPMHrbANMH3LbltH73wxQ=="],
+
+ "get-uri": ["get-uri@6.0.5", "", { "dependencies": { "basic-ftp": "^5.0.2", "data-uri-to-buffer": "^6.0.2", "debug": "^4.3.4" } }, "sha512-b1O07XYq8eRuVzBNgJLstU6FYc1tS6wnMtF1I1D9lE8LxZSOGZ7LhxN54yPP6mGw5f2CkXY2BQUL9Fx41qvcIg=="],
+
+ "git-raw-commits": ["git-raw-commits@4.0.0", "", { "dependencies": { "dargs": "^8.0.0", "meow": "^12.0.1", "split2": "^4.0.0" }, "bin": { "git-raw-commits": "cli.mjs" } }, "sha512-ICsMM1Wk8xSGMowkOmPrzo2Fgmfo4bMHLNX6ytHjajRJUqvHOw/TFapQ+QG75c3X/tTDDhOSRPGC52dDbNM8FQ=="],
+
+ "git-semver-tags": ["git-semver-tags@8.0.0", "", { "dependencies": { "@conventional-changelog/git-client": "^1.0.0", "meow": "^13.0.0" }, "bin": { "git-semver-tags": "src/cli.js" } }, "sha512-N7YRIklvPH3wYWAR2vysaqGLPRcpwQ0GKdlqTiVN5w1UmCdaeY3K8s6DMKRCh54DDdzyt/OAB6C8jgVtb7Y2Fg=="],
+
+ "git-up": ["git-up@7.0.0", "", { "dependencies": { "is-ssh": "^1.4.0", "parse-url": "^8.1.0" } }, "sha512-ONdIrbBCFusq1Oy0sC71F5azx8bVkvtZtMJAsv+a6lz5YAmbNnLD6HAB4gptHZVLPR8S2/kVN6Gab7lryq5+lQ=="],
+
+ "git-url-parse": ["git-url-parse@14.0.0", "", { "dependencies": { "git-up": "^7.0.0" } }, "sha512-NnLweV+2A4nCvn4U/m2AoYu0pPKlsmhK9cknG7IMwsjFY1S2jxM+mAhsDxyxfCIGfGaD+dozsyX4b6vkYc83yQ=="],
+
+ "github-slugger": ["github-slugger@2.0.0", "", {}, "sha512-IaOQ9puYtjrkq7Y0Ygl9KDZnrf/aiUJYUpVf89y8kyaxbRG7Y1SrX/jaumrv81vc61+kiMempujsM3Yw7w5qcw=="],
+
+ "glob": ["glob@9.3.5", "", { "dependencies": { "fs.realpath": "^1.0.0", "minimatch": "^8.0.2", "minipass": "^4.2.4", "path-scurry": "^1.6.1" } }, "sha512-e1LleDykUz2Iu+MTYdkSsuWX8lvAjAcs0Xef0lNIu0S2wOAzuTxCJtcd9S3cijlwYF18EsU3rzb8jPVobxDh9Q=="],
+
+ "glob-parent": ["glob-parent@6.0.2", "", { "dependencies": { "is-glob": "^4.0.3" } }, "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A=="],
+
+ "glob-to-regexp": ["glob-to-regexp@0.4.1", "", {}, "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw=="],
+
+ "global-directory": ["global-directory@4.0.1", "", { "dependencies": { "ini": "4.1.1" } }, "sha512-wHTUcDUoZ1H5/0iVqEudYW4/kAlN5cZ3j/bXn0Dpbizl9iaUVeWSHqiOjsgk6OW2bkLclbBjzewBz6weQ1zA2Q=="],
+
+ "global-dirs": ["global-dirs@3.0.1", "", { "dependencies": { "ini": "2.0.0" } }, "sha512-NBcGGFbBA9s1VzD41QXDG+3++t9Mn5t1FpLdhESY6oKY4gYTFpX4wO3sqGUa0Srjtbfj3szX0RnemmrVRUdULA=="],
+
+ "globals": ["globals@15.15.0", "", {}, "sha512-7ACyT3wmyp3I61S4fG682L0VA2RGD9otkqGJIwNUMF1SWUombIIk+af1unuDYgMm082aHYwD+mzJvv9Iu8dsgg=="],
+
+ "globalthis": ["globalthis@1.0.4", "", { "dependencies": { "define-properties": "^1.2.1", "gopd": "^1.0.1" } }, "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ=="],
+
+ "globby": ["globby@14.0.1", "", { "dependencies": { "@sindresorhus/merge-streams": "^2.1.0", "fast-glob": "^3.3.2", "ignore": "^5.2.4", "path-type": "^5.0.0", "slash": "^5.1.0", "unicorn-magic": "^0.1.0" } }, "sha512-jOMLD2Z7MAhyG8aJpNOpmziMOP4rPLcc95oQPKXBazW82z+CEgPFBQvEpRUa1KeIMUJo4Wsm+q6uzO/Q/4BksQ=="],
+
+ "gopd": ["gopd@1.2.0", "", {}, "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg=="],
+
+ "got": ["got@13.0.0", "", { "dependencies": { "@sindresorhus/is": "^5.2.0", "@szmarczak/http-timer": "^5.0.1", "cacheable-lookup": "^7.0.0", "cacheable-request": "^10.2.8", "decompress-response": "^6.0.0", "form-data-encoder": "^2.1.2", "get-stream": "^6.0.1", "http2-wrapper": "^2.1.10", "lowercase-keys": "^3.0.0", "p-cancelable": "^3.0.0", "responselike": "^3.0.0" } }, "sha512-XfBk1CxOOScDcMr9O1yKkNaQyy865NbYs+F7dr4H0LZMVgCj2Le59k6PqbNHoL5ToeaEQUYh6c6yMfVcc6SJxA=="],
+
+ "graceful-fs": ["graceful-fs@4.2.11", "", {}, "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ=="],
+
+ "graphemer": ["graphemer@1.4.0", "", {}, "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag=="],
+
+ "gray-matter": ["gray-matter@4.0.3", "", { "dependencies": { "js-yaml": "^3.13.1", "kind-of": "^6.0.2", "section-matter": "^1.0.0", "strip-bom-string": "^1.0.0" } }, "sha512-5v6yZd4JK3eMI3FqqCouswVqwugaA9r4dNZB1wwcmrD02QkV5H0y7XBQW8QwQqEaZY1pM9aqORSORhJRdNK44Q=="],
+
+ "handlebars": ["handlebars@4.7.8", "", { "dependencies": { "minimist": "^1.2.5", "neo-async": "^2.6.2", "source-map": "^0.6.1", "wordwrap": "^1.0.0" }, "optionalDependencies": { "uglify-js": "^3.1.4" }, "bin": { "handlebars": "bin/handlebars" } }, "sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ=="],
+
+ "has-bigints": ["has-bigints@1.1.0", "", {}, "sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg=="],
+
+ "has-flag": ["has-flag@4.0.0", "", {}, "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="],
+
+ "has-own-prop": ["has-own-prop@2.0.0", "", {}, "sha512-Pq0h+hvsVm6dDEa8x82GnLSYHOzNDt7f0ddFa3FqcQlgzEiptPqL+XrOJNavjOzSYiYWIrgeVYYgGlLmnxwilQ=="],
+
+ "has-property-descriptors": ["has-property-descriptors@1.0.2", "", { "dependencies": { "es-define-property": "^1.0.0" } }, "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg=="],
+
+ "has-proto": ["has-proto@1.2.0", "", { "dependencies": { "dunder-proto": "^1.0.0" } }, "sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ=="],
+
+ "has-symbols": ["has-symbols@1.1.0", "", {}, "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ=="],
+
+ "has-tostringtag": ["has-tostringtag@1.0.2", "", { "dependencies": { "has-symbols": "^1.0.3" } }, "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw=="],
+
+ "hash-obj": ["hash-obj@4.0.0", "", { "dependencies": { "is-obj": "^3.0.0", "sort-keys": "^5.0.0", "type-fest": "^1.0.2" } }, "sha512-FwO1BUVWkyHasWDW4S8o0ssQXjvyghLV2rfVhnN36b2bbcj45eGiuzdn9XOvOpjV3TKQD7Gm2BWNXdE9V4KKYg=="],
+
+ "hasown": ["hasown@2.0.2", "", { "dependencies": { "function-bind": "^1.1.2" } }, "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ=="],
+
+ "hast-util-from-dom": ["hast-util-from-dom@5.0.1", "", { "dependencies": { "@types/hast": "^3.0.0", "hastscript": "^9.0.0", "web-namespaces": "^2.0.0" } }, "sha512-N+LqofjR2zuzTjCPzyDUdSshy4Ma6li7p/c3pA78uTwzFgENbgbUrm2ugwsOdcjI1muO+o6Dgzp9p8WHtn/39Q=="],
+
+ "hast-util-from-html": ["hast-util-from-html@2.0.3", "", { "dependencies": { "@types/hast": "^3.0.0", "devlop": "^1.1.0", "hast-util-from-parse5": "^8.0.0", "parse5": "^7.0.0", "vfile": "^6.0.0", "vfile-message": "^4.0.0" } }, "sha512-CUSRHXyKjzHov8yKsQjGOElXy/3EKpyX56ELnkHH34vDVw1N1XSQ1ZcAvTyAPtGqLTuKP/uxM+aLkSPqF/EtMw=="],
+
+ "hast-util-from-html-isomorphic": ["hast-util-from-html-isomorphic@2.0.0", "", { "dependencies": { "@types/hast": "^3.0.0", "hast-util-from-dom": "^5.0.0", "hast-util-from-html": "^2.0.0", "unist-util-remove-position": "^5.0.0" } }, "sha512-zJfpXq44yff2hmE0XmwEOzdWin5xwH+QIhMLOScpX91e/NSGPsAzNCvLQDIEPyO2TXi+lBmU6hjLIhV8MwP2kw=="],
+
+ "hast-util-from-parse5": ["hast-util-from-parse5@8.0.3", "", { "dependencies": { "@types/hast": "^3.0.0", "@types/unist": "^3.0.0", "devlop": "^1.0.0", "hastscript": "^9.0.0", "property-information": "^7.0.0", "vfile": "^6.0.0", "vfile-location": "^5.0.0", "web-namespaces": "^2.0.0" } }, "sha512-3kxEVkEKt0zvcZ3hCRYI8rqrgwtlIOFMWkbclACvjlDw8Li9S2hk/d51OI0nr/gIpdMHNepwgOKqZ/sy0Clpyg=="],
+
+ "hast-util-is-element": ["hast-util-is-element@3.0.0", "", { "dependencies": { "@types/hast": "^3.0.0" } }, "sha512-Val9mnv2IWpLbNPqc/pUem+a7Ipj2aHacCwgNfTiK0vJKl0LF+4Ba4+v1oPHFpf3bLYmreq0/l3Gud9S5OH42g=="],
+
+ "hast-util-parse-selector": ["hast-util-parse-selector@4.0.0", "", { "dependencies": { "@types/hast": "^3.0.0" } }, "sha512-wkQCkSYoOGCRKERFWcxMVMOcYE2K1AaNLU8DXS9arxnLOUEWbOXKXiJUNzEpqZ3JOKpnha3jkFrumEjVliDe7A=="],
+
+ "hast-util-raw": ["hast-util-raw@9.1.0", "", { "dependencies": { "@types/hast": "^3.0.0", "@types/unist": "^3.0.0", "@ungap/structured-clone": "^1.0.0", "hast-util-from-parse5": "^8.0.0", "hast-util-to-parse5": "^8.0.0", "html-void-elements": "^3.0.0", "mdast-util-to-hast": "^13.0.0", "parse5": "^7.0.0", "unist-util-position": "^5.0.0", "unist-util-visit": "^5.0.0", "vfile": "^6.0.0", "web-namespaces": "^2.0.0", "zwitch": "^2.0.0" } }, "sha512-Y8/SBAHkZGoNkpzqqfCldijcuUKh7/su31kEBp67cFY09Wy0mTRgtsLYsiIxMJxlu0f6AA5SUTbDR8K0rxnbUw=="],
+
+ "hast-util-to-estree": ["hast-util-to-estree@2.3.3", "", { "dependencies": { "@types/estree": "^1.0.0", "@types/estree-jsx": "^1.0.0", "@types/hast": "^2.0.0", "@types/unist": "^2.0.0", "comma-separated-tokens": "^2.0.0", "estree-util-attach-comments": "^2.0.0", "estree-util-is-identifier-name": "^2.0.0", "hast-util-whitespace": "^2.0.0", "mdast-util-mdx-expression": "^1.0.0", "mdast-util-mdxjs-esm": "^1.0.0", "property-information": "^6.0.0", "space-separated-tokens": "^2.0.0", "style-to-object": "^0.4.1", "unist-util-position": "^4.0.0", "zwitch": "^2.0.0" } }, "sha512-ihhPIUPxN0v0w6M5+IiAZZrn0LH2uZomeWwhn7uP7avZC6TE7lIiEh2yBMPr5+zi1aUCXq6VoYRgs2Bw9xmycQ=="],
+
+ "hast-util-to-parse5": ["hast-util-to-parse5@8.0.1", "", { "dependencies": { "@types/hast": "^3.0.0", "comma-separated-tokens": "^2.0.0", "devlop": "^1.0.0", "property-information": "^7.0.0", "space-separated-tokens": "^2.0.0", "web-namespaces": "^2.0.0", "zwitch": "^2.0.0" } }, "sha512-MlWT6Pjt4CG9lFCjiz4BH7l9wmrMkfkJYCxFwKQic8+RTZgWPuWxwAfjJElsXkex7DJjfSJsQIt931ilUgmwdA=="],
+
+ "hast-util-to-text": ["hast-util-to-text@4.0.2", "", { "dependencies": { "@types/hast": "^3.0.0", "@types/unist": "^3.0.0", "hast-util-is-element": "^3.0.0", "unist-util-find-after": "^5.0.0" } }, "sha512-KK6y/BN8lbaq654j7JgBydev7wuNMcID54lkRav1P0CaE1e47P72AWWPiGKXTJU271ooYzcvTAn/Zt0REnvc7A=="],
+
+ "hast-util-whitespace": ["hast-util-whitespace@2.0.1", "", {}, "sha512-nAxA0v8+vXSBDt3AnRUNjyRIQ0rD+ntpbAp4LnPkumc5M9yUbSMa4XDU9Q6etY4f1Wp4bNgvc1yjiZtsTTrSng=="],
+
+ "hastscript": ["hastscript@9.0.1", "", { "dependencies": { "@types/hast": "^3.0.0", "comma-separated-tokens": "^2.0.0", "hast-util-parse-selector": "^4.0.0", "property-information": "^7.0.0", "space-separated-tokens": "^2.0.0" } }, "sha512-g7df9rMFX/SPi34tyGCyUBREQoKkapwdY/T04Qn9TDWfHhAYt4/I0gMVirzK5wEzeUqIjEB+LXC/ypb7Aqno5w=="],
+
+ "hosted-git-info": ["hosted-git-info@7.0.2", "", { "dependencies": { "lru-cache": "^10.0.1" } }, "sha512-puUZAUKT5m8Zzvs72XWy3HtvVbTWljRE66cP60bxJzAqf2DgICo7lYTY2IHUmLnNpjYvw5bvmoHvPc0QO2a62w=="],
+
+ "html-escaper": ["html-escaper@2.0.2", "", {}, "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg=="],
+
+ "html-void-elements": ["html-void-elements@3.0.0", "", {}, "sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg=="],
+
+ "http-cache-semantics": ["http-cache-semantics@4.2.0", "", {}, "sha512-dTxcvPXqPvXBQpq5dUr6mEMJX4oIEFv6bwom3FDwKRDsuIjjJGANqhBuoAn9c1RQJIdAKav33ED65E2ys+87QQ=="],
+
+ "http-errors": ["http-errors@2.0.0", "", { "dependencies": { "depd": "2.0.0", "inherits": "2.0.4", "setprototypeof": "1.2.0", "statuses": "2.0.1", "toidentifier": "1.0.1" } }, "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ=="],
+
+ "http-proxy-agent": ["http-proxy-agent@7.0.2", "", { "dependencies": { "agent-base": "^7.1.0", "debug": "^4.3.4" } }, "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig=="],
+
+ "http2-wrapper": ["http2-wrapper@2.2.1", "", { "dependencies": { "quick-lru": "^5.1.1", "resolve-alpn": "^1.2.0" } }, "sha512-V5nVw1PAOgfI3Lmeaj2Exmeg7fenjhRUgz1lPSezy1CuhPYbgQtbQj4jZfEAEMlaL+vupsvhjqCyjzob0yxsmQ=="],
+
+ "https-proxy-agent": ["https-proxy-agent@7.0.6", "", { "dependencies": { "agent-base": "^7.1.2", "debug": "4" } }, "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw=="],
+
+ "human-signals": ["human-signals@5.0.0", "", {}, "sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ=="],
+
+ "husky": ["husky@9.1.7", "", { "bin": { "husky": "bin.js" } }, "sha512-5gs5ytaNjBrh5Ow3zrvdUUY+0VxIuWVL4i9irt6friV+BqdCfmV11CQTWMiBYWHbXhco+J1kHfTOUkePhCDvMA=="],
+
+ "iconv-lite": ["iconv-lite@0.4.24", "", { "dependencies": { "safer-buffer": ">= 2.1.2 < 3" } }, "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA=="],
+
+ "ieee754": ["ieee754@1.2.1", "", {}, "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA=="],
+
+ "ignore": ["ignore@5.3.2", "", {}, "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g=="],
+
+ "import-fresh": ["import-fresh@3.3.1", "", { "dependencies": { "parent-module": "^1.0.0", "resolve-from": "^4.0.0" } }, "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ=="],
+
+ "import-lazy": ["import-lazy@4.0.0", "", {}, "sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw=="],
+
+ "import-local": ["import-local@3.2.0", "", { "dependencies": { "pkg-dir": "^4.2.0", "resolve-cwd": "^3.0.0" }, "bin": { "import-local-fixture": "fixtures/cli.js" } }, "sha512-2SPlun1JUPWoM6t3F0dw0FkCF/jWY8kttcY4f599GLTSjh2OCuuhdTkJQsEcZzBqbXZGKMK2OqW1oZsjtf/gQA=="],
+
+ "import-meta-resolve": ["import-meta-resolve@4.2.0", "", {}, "sha512-Iqv2fzaTQN28s/FwZAoFq0ZSs/7hMAHJVX+w8PZl3cY19Pxk6jFFalxQoIfW2826i/fDLXv8IiEZRIT0lDuWcg=="],
+
+ "imurmurhash": ["imurmurhash@0.1.4", "", {}, "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA=="],
+
+ "inflight": ["inflight@1.0.6", "", { "dependencies": { "once": "^1.3.0", "wrappy": "1" } }, "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA=="],
+
+ "inherits": ["inherits@2.0.4", "", {}, "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="],
+
+ "ini": ["ini@4.1.1", "", {}, "sha512-QQnnxNyfvmHFIsj7gkPcYymR8Jdw/o7mp5ZFihxn6h8Ci6fh3Dx4E1gPjpQEpIuPo9XVNY/ZUwh4BPMjGyL01g=="],
+
+ "inline-style-parser": ["inline-style-parser@0.1.1", "", {}, "sha512-7NXolsK4CAS5+xvdj5OMMbI962hU/wvwoxk+LWR9Ek9bVtyuuYScDN6eS0rUm6TxApFpw7CX1o4uJzcd4AyD3Q=="],
+
+ "inquirer": ["inquirer@9.3.8", "", { "dependencies": { "@inquirer/external-editor": "^1.0.2", "@inquirer/figures": "^1.0.3", "ansi-escapes": "^4.3.2", "cli-width": "^4.1.0", "mute-stream": "1.0.0", "ora": "^5.4.1", "run-async": "^3.0.0", "rxjs": "^7.8.1", "string-width": "^4.2.3", "strip-ansi": "^6.0.1", "wrap-ansi": "^6.2.0", "yoctocolors-cjs": "^2.1.2" } }, "sha512-pFGGdaHrmRKMh4WoDDSowddgjT1Vkl90atobmTeSmcPGdYiwikch/m/Ef5wRaiamHejtw0cUUMMerzDUXCci2w=="],
+
+ "internal-slot": ["internal-slot@1.1.0", "", { "dependencies": { "es-errors": "^1.3.0", "hasown": "^2.0.2", "side-channel": "^1.1.0" } }, "sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw=="],
+
+ "internmap": ["internmap@2.0.3", "", {}, "sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg=="],
+
+ "interpret": ["interpret@1.4.0", "", {}, "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA=="],
+
+ "intersection-observer": ["intersection-observer@0.12.2", "", {}, "sha512-7m1vEcPCxXYI8HqnL8CKI6siDyD+eIWSwgB3DZA+ZTogxk9I4CDnj4wilt9x/+/QbHI4YG5YZNmC6458/e9Ktg=="],
+
+ "ip-address": ["ip-address@10.1.0", "", {}, "sha512-XXADHxXmvT9+CRxhXg56LJovE+bmWnEWB78LB83VZTprKTmaC5QfruXocxzTZ2Kl0DNwKuBdlIhjL8LeY8Sf8Q=="],
+
+ "ipaddr.js": ["ipaddr.js@2.3.0", "", {}, "sha512-Zv/pA+ciVFbCSBBjGfaKUya/CcGmUHzTydLMaTwrUUEM2DIEO3iZvueGxmacvmN50fGpGVKeTXpb2LcYQxeVdg=="],
+
+ "is-alphabetical": ["is-alphabetical@2.0.1", "", {}, "sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ=="],
+
+ "is-alphanumerical": ["is-alphanumerical@2.0.1", "", { "dependencies": { "is-alphabetical": "^2.0.0", "is-decimal": "^2.0.0" } }, "sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw=="],
+
+ "is-arguments": ["is-arguments@1.2.0", "", { "dependencies": { "call-bound": "^1.0.2", "has-tostringtag": "^1.0.2" } }, "sha512-7bVbi0huj/wrIAOzb8U1aszg9kdi3KN/CyU19CTI7tAoZYEZoL9yCDXpbXN+uPsuWnP02cyug1gleqq+TU+YCA=="],
+
+ "is-array-buffer": ["is-array-buffer@3.0.5", "", { "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.3", "get-intrinsic": "^1.2.6" } }, "sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A=="],
+
+ "is-arrayish": ["is-arrayish@0.2.1", "", {}, "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg=="],
+
+ "is-async-function": ["is-async-function@2.1.1", "", { "dependencies": { "async-function": "^1.0.0", "call-bound": "^1.0.3", "get-proto": "^1.0.1", "has-tostringtag": "^1.0.2", "safe-regex-test": "^1.1.0" } }, "sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ=="],
+
+ "is-bigint": ["is-bigint@1.1.0", "", { "dependencies": { "has-bigints": "^1.0.2" } }, "sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ=="],
+
+ "is-binary-path": ["is-binary-path@2.1.0", "", { "dependencies": { "binary-extensions": "^2.0.0" } }, "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw=="],
+
+ "is-boolean-object": ["is-boolean-object@1.2.2", "", { "dependencies": { "call-bound": "^1.0.3", "has-tostringtag": "^1.0.2" } }, "sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A=="],
+
+ "is-buffer": ["is-buffer@2.0.5", "", {}, "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ=="],
+
+ "is-bun-module": ["is-bun-module@2.0.0", "", { "dependencies": { "semver": "^7.7.1" } }, "sha512-gNCGbnnnnFAUGKeZ9PdbyeGYJqewpmc2aKHUEMO5nQPWU9lOmv7jcmQIv+qHD8fXW6W7qfuCwX4rY9LNRjXrkQ=="],
+
+ "is-callable": ["is-callable@1.2.7", "", {}, "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA=="],
+
+ "is-ci": ["is-ci@3.0.1", "", { "dependencies": { "ci-info": "^3.2.0" }, "bin": { "is-ci": "bin.js" } }, "sha512-ZYvCgrefwqoQ6yTyYUbQu64HsITZ3NfKX1lzaEYdkTDcfKzzCI/wthRRYKkdjHKFVgNiXKAKm65Zo1pk2as/QQ=="],
+
+ "is-core-module": ["is-core-module@2.16.1", "", { "dependencies": { "hasown": "^2.0.2" } }, "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w=="],
+
+ "is-data-view": ["is-data-view@1.0.2", "", { "dependencies": { "call-bound": "^1.0.2", "get-intrinsic": "^1.2.6", "is-typed-array": "^1.1.13" } }, "sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw=="],
+
+ "is-date-object": ["is-date-object@1.1.0", "", { "dependencies": { "call-bound": "^1.0.2", "has-tostringtag": "^1.0.2" } }, "sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg=="],
+
+ "is-decimal": ["is-decimal@2.0.1", "", {}, "sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A=="],
+
+ "is-docker": ["is-docker@3.0.0", "", { "bin": { "is-docker": "cli.js" } }, "sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ=="],
+
+ "is-extendable": ["is-extendable@0.1.1", "", {}, "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw=="],
+
+ "is-extglob": ["is-extglob@2.1.1", "", {}, "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ=="],
+
+ "is-finalizationregistry": ["is-finalizationregistry@1.1.1", "", { "dependencies": { "call-bound": "^1.0.3" } }, "sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg=="],
+
+ "is-fullwidth-code-point": ["is-fullwidth-code-point@3.0.0", "", {}, "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg=="],
+
+ "is-generator-fn": ["is-generator-fn@2.1.0", "", {}, "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ=="],
+
+ "is-generator-function": ["is-generator-function@1.1.2", "", { "dependencies": { "call-bound": "^1.0.4", "generator-function": "^2.0.0", "get-proto": "^1.0.1", "has-tostringtag": "^1.0.2", "safe-regex-test": "^1.1.0" } }, "sha512-upqt1SkGkODW9tsGNG5mtXTXtECizwtS2kA161M+gJPc1xdb/Ax629af6YrTwcOeQHbewrPNlE5Dx7kzvXTizA=="],
+
+ "is-glob": ["is-glob@4.0.3", "", { "dependencies": { "is-extglob": "^2.1.1" } }, "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg=="],
+
+ "is-hexadecimal": ["is-hexadecimal@2.0.1", "", {}, "sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg=="],
+
+ "is-in-ci": ["is-in-ci@0.1.0", "", { "bin": { "is-in-ci": "cli.js" } }, "sha512-d9PXLEY0v1iJ64xLiQMJ51J128EYHAaOR4yZqQi8aHGfw6KgifM3/Viw1oZZ1GCVmb3gBuyhLyHj0HgR2DhSXQ=="],
+
+ "is-inside-container": ["is-inside-container@1.0.0", "", { "dependencies": { "is-docker": "^3.0.0" }, "bin": { "is-inside-container": "cli.js" } }, "sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA=="],
+
+ "is-installed-globally": ["is-installed-globally@0.4.0", "", { "dependencies": { "global-dirs": "^3.0.0", "is-path-inside": "^3.0.2" } }, "sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ=="],
+
+ "is-interactive": ["is-interactive@1.0.0", "", {}, "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w=="],
+
+ "is-map": ["is-map@2.0.3", "", {}, "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw=="],
+
+ "is-negative-zero": ["is-negative-zero@2.0.3", "", {}, "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw=="],
+
+ "is-npm": ["is-npm@6.1.0", "", {}, "sha512-O2z4/kNgyjhQwVR1Wpkbfc19JIhggF97NZNCpWTnjH7kVcZMUrnut9XSN7txI7VdyIYk5ZatOq3zvSuWpU8hoA=="],
+
+ "is-number": ["is-number@7.0.0", "", {}, "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng=="],
+
+ "is-number-object": ["is-number-object@1.1.1", "", { "dependencies": { "call-bound": "^1.0.3", "has-tostringtag": "^1.0.2" } }, "sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw=="],
+
+ "is-obj": ["is-obj@2.0.0", "", {}, "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w=="],
+
+ "is-path-inside": ["is-path-inside@3.0.3", "", {}, "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ=="],
+
+ "is-plain-obj": ["is-plain-obj@4.1.0", "", {}, "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg=="],
+
+ "is-reference": ["is-reference@3.0.3", "", { "dependencies": { "@types/estree": "^1.0.6" } }, "sha512-ixkJoqQvAP88E6wLydLGGqCJsrFUnqoH6HnaczB8XmDH1oaWU+xxdptvikTgaEhtZ53Ky6YXiBuUI2WXLMCwjw=="],
+
+ "is-regex": ["is-regex@1.2.1", "", { "dependencies": { "call-bound": "^1.0.2", "gopd": "^1.2.0", "has-tostringtag": "^1.0.2", "hasown": "^2.0.2" } }, "sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g=="],
+
+ "is-set": ["is-set@2.0.3", "", {}, "sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg=="],
+
+ "is-shared-array-buffer": ["is-shared-array-buffer@1.0.4", "", { "dependencies": { "call-bound": "^1.0.3" } }, "sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A=="],
+
+ "is-ssh": ["is-ssh@1.4.1", "", { "dependencies": { "protocols": "^2.0.1" } }, "sha512-JNeu1wQsHjyHgn9NcWTaXq6zWSR6hqE0++zhfZlkFBbScNkyvxCdeV8sRkSBaeLKxmbpR21brail63ACNxJ0Tg=="],
+
+ "is-stream": ["is-stream@3.0.0", "", {}, "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA=="],
+
+ "is-string": ["is-string@1.1.1", "", { "dependencies": { "call-bound": "^1.0.3", "has-tostringtag": "^1.0.2" } }, "sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA=="],
+
+ "is-symbol": ["is-symbol@1.1.1", "", { "dependencies": { "call-bound": "^1.0.2", "has-symbols": "^1.1.0", "safe-regex-test": "^1.1.0" } }, "sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w=="],
+
+ "is-text-path": ["is-text-path@2.0.0", "", { "dependencies": { "text-extensions": "^2.0.0" } }, "sha512-+oDTluR6WEjdXEJMnC2z6A4FRwFoYuvShVVEGsS7ewc0UTi2QtAKMDJuL4BDEVt+5T7MjFo12RP8ghOM75oKJw=="],
+
+ "is-typed-array": ["is-typed-array@1.1.15", "", { "dependencies": { "which-typed-array": "^1.1.16" } }, "sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ=="],
+
+ "is-typedarray": ["is-typedarray@1.0.0", "", {}, "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA=="],
+
+ "is-unicode-supported": ["is-unicode-supported@0.1.0", "", {}, "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw=="],
+
+ "is-weakmap": ["is-weakmap@2.0.2", "", {}, "sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w=="],
+
+ "is-weakref": ["is-weakref@1.1.1", "", { "dependencies": { "call-bound": "^1.0.3" } }, "sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew=="],
+
+ "is-weakset": ["is-weakset@2.0.4", "", { "dependencies": { "call-bound": "^1.0.3", "get-intrinsic": "^1.2.6" } }, "sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ=="],
+
+ "is-wsl": ["is-wsl@3.1.0", "", { "dependencies": { "is-inside-container": "^1.0.0" } }, "sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw=="],
+
+ "isarray": ["isarray@2.0.5", "", {}, "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw=="],
+
+ "isexe": ["isexe@2.0.0", "", {}, "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw=="],
+
+ "issue-parser": ["issue-parser@6.0.0", "", { "dependencies": { "lodash.capitalize": "^4.2.1", "lodash.escaperegexp": "^4.1.2", "lodash.isplainobject": "^4.0.6", "lodash.isstring": "^4.0.1", "lodash.uniqby": "^4.7.0" } }, "sha512-zKa/Dxq2lGsBIXQ7CUZWTHfvxPC2ej0KfO7fIPqLlHB9J2hJ7rGhZ5rilhuufylr4RXYPzJUeFjKxz305OsNlA=="],
+
+ "istanbul-lib-coverage": ["istanbul-lib-coverage@3.2.2", "", {}, "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg=="],
+
+ "istanbul-lib-instrument": ["istanbul-lib-instrument@6.0.3", "", { "dependencies": { "@babel/core": "^7.23.9", "@babel/parser": "^7.23.9", "@istanbuljs/schema": "^0.1.3", "istanbul-lib-coverage": "^3.2.0", "semver": "^7.5.4" } }, "sha512-Vtgk7L/R2JHyyGW07spoFlB8/lpjiOLTjMdms6AFMraYt3BaJauod/NGrfnVG/y4Ix1JEuMRPDPEj2ua+zz1/Q=="],
+
+ "istanbul-lib-report": ["istanbul-lib-report@3.0.1", "", { "dependencies": { "istanbul-lib-coverage": "^3.0.0", "make-dir": "^4.0.0", "supports-color": "^7.1.0" } }, "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw=="],
+
+ "istanbul-lib-source-maps": ["istanbul-lib-source-maps@4.0.1", "", { "dependencies": { "debug": "^4.1.1", "istanbul-lib-coverage": "^3.0.0", "source-map": "^0.6.1" } }, "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw=="],
+
+ "istanbul-reports": ["istanbul-reports@3.2.0", "", { "dependencies": { "html-escaper": "^2.0.0", "istanbul-lib-report": "^3.0.0" } }, "sha512-HGYWWS/ehqTV3xN10i23tkPkpH46MLCIMFNCaaKNavAXTF1RkqxawEPtnjnGZ6XKSInBKkiOA5BKS+aZiY3AvA=="],
+
+ "iterare": ["iterare@1.2.1", "", {}, "sha512-RKYVTCjAnRthyJes037NX/IiqeidgN1xc3j1RjFfECFp28A1GVwK9nA+i0rJPaHqSZwygLzRnFlzUuHFoWWy+Q=="],
+
+ "iterate-iterator": ["iterate-iterator@1.0.2", "", {}, "sha512-t91HubM4ZDQ70M9wqp+pcNpu8OyJ9UAtXntT/Bcsvp5tZMnz9vRa+IunKXeI8AnfZMTv0jNuVEmGeLSMjVvfPw=="],
+
+ "iterate-value": ["iterate-value@1.0.2", "", { "dependencies": { "es-get-iterator": "^1.0.2", "iterate-iterator": "^1.0.1" } }, "sha512-A6fMAio4D2ot2r/TYzr4yUWrmwNdsN5xL7+HUiyACE4DXm+q8HtPcnFTp+NnW3k4N05tZ7FVYFFb2CR13NxyHQ=="],
+
+ "iterator.prototype": ["iterator.prototype@1.1.5", "", { "dependencies": { "define-data-property": "^1.1.4", "es-object-atoms": "^1.0.0", "get-intrinsic": "^1.2.6", "get-proto": "^1.0.0", "has-symbols": "^1.1.0", "set-function-name": "^2.0.2" } }, "sha512-H0dkQoCa3b2VEeKQBOxFph+JAbcrQdE7KC0UkqwpLmv2EC4P41QXP+rqo9wYodACiG5/WM5s9oDApTU8utwj9g=="],
+
+ "jackspeak": ["jackspeak@3.4.3", "", { "dependencies": { "@isaacs/cliui": "^8.0.2" }, "optionalDependencies": { "@pkgjs/parseargs": "^0.11.0" } }, "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw=="],
+
+ "jake": ["jake@10.9.4", "", { "dependencies": { "async": "^3.2.6", "filelist": "^1.0.4", "picocolors": "^1.1.1" }, "bin": { "jake": "bin/cli.js" } }, "sha512-wpHYzhxiVQL+IV05BLE2Xn34zW1S223hvjtqk0+gsPrwd/8JNLXJgZZM/iPFsYc1xyphF+6M6EvdE5E9MBGkDA=="],
+
+ "jest": ["jest@29.7.0", "", { "dependencies": { "@jest/core": "^29.7.0", "@jest/types": "^29.6.3", "import-local": "^3.0.2", "jest-cli": "^29.7.0" }, "peerDependencies": { "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" }, "optionalPeers": ["node-notifier"], "bin": { "jest": "bin/jest.js" } }, "sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw=="],
+
+ "jest-changed-files": ["jest-changed-files@29.7.0", "", { "dependencies": { "execa": "^5.0.0", "jest-util": "^29.7.0", "p-limit": "^3.1.0" } }, "sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w=="],
+
+ "jest-circus": ["jest-circus@29.7.0", "", { "dependencies": { "@jest/environment": "^29.7.0", "@jest/expect": "^29.7.0", "@jest/test-result": "^29.7.0", "@jest/types": "^29.6.3", "@types/node": "*", "chalk": "^4.0.0", "co": "^4.6.0", "dedent": "^1.0.0", "is-generator-fn": "^2.0.0", "jest-each": "^29.7.0", "jest-matcher-utils": "^29.7.0", "jest-message-util": "^29.7.0", "jest-runtime": "^29.7.0", "jest-snapshot": "^29.7.0", "jest-util": "^29.7.0", "p-limit": "^3.1.0", "pretty-format": "^29.7.0", "pure-rand": "^6.0.0", "slash": "^3.0.0", "stack-utils": "^2.0.3" } }, "sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw=="],
+
+ "jest-cli": ["jest-cli@29.7.0", "", { "dependencies": { "@jest/core": "^29.7.0", "@jest/test-result": "^29.7.0", "@jest/types": "^29.6.3", "chalk": "^4.0.0", "create-jest": "^29.7.0", "exit": "^0.1.2", "import-local": "^3.0.2", "jest-config": "^29.7.0", "jest-util": "^29.7.0", "jest-validate": "^29.7.0", "yargs": "^17.3.1" }, "peerDependencies": { "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" }, "optionalPeers": ["node-notifier"], "bin": { "jest": "bin/jest.js" } }, "sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg=="],
+
+ "jest-config": ["jest-config@29.7.0", "", { "dependencies": { "@babel/core": "^7.11.6", "@jest/test-sequencer": "^29.7.0", "@jest/types": "^29.6.3", "babel-jest": "^29.7.0", "chalk": "^4.0.0", "ci-info": "^3.2.0", "deepmerge": "^4.2.2", "glob": "^7.1.3", "graceful-fs": "^4.2.9", "jest-circus": "^29.7.0", "jest-environment-node": "^29.7.0", "jest-get-type": "^29.6.3", "jest-regex-util": "^29.6.3", "jest-resolve": "^29.7.0", "jest-runner": "^29.7.0", "jest-util": "^29.7.0", "jest-validate": "^29.7.0", "micromatch": "^4.0.4", "parse-json": "^5.2.0", "pretty-format": "^29.7.0", "slash": "^3.0.0", "strip-json-comments": "^3.1.1" }, "peerDependencies": { "@types/node": "*", "ts-node": ">=9.0.0" }, "optionalPeers": ["@types/node", "ts-node"] }, "sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ=="],
+
+ "jest-diff": ["jest-diff@29.7.0", "", { "dependencies": { "chalk": "^4.0.0", "diff-sequences": "^29.6.3", "jest-get-type": "^29.6.3", "pretty-format": "^29.7.0" } }, "sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw=="],
+
+ "jest-docblock": ["jest-docblock@29.7.0", "", { "dependencies": { "detect-newline": "^3.0.0" } }, "sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g=="],
+
+ "jest-each": ["jest-each@29.7.0", "", { "dependencies": { "@jest/types": "^29.6.3", "chalk": "^4.0.0", "jest-get-type": "^29.6.3", "jest-util": "^29.7.0", "pretty-format": "^29.7.0" } }, "sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ=="],
+
+ "jest-environment-node": ["jest-environment-node@29.7.0", "", { "dependencies": { "@jest/environment": "^29.7.0", "@jest/fake-timers": "^29.7.0", "@jest/types": "^29.6.3", "@types/node": "*", "jest-mock": "^29.7.0", "jest-util": "^29.7.0" } }, "sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw=="],
+
+ "jest-get-type": ["jest-get-type@29.6.3", "", {}, "sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw=="],
+
+ "jest-haste-map": ["jest-haste-map@29.7.0", "", { "dependencies": { "@jest/types": "^29.6.3", "@types/graceful-fs": "^4.1.3", "@types/node": "*", "anymatch": "^3.0.3", "fb-watchman": "^2.0.0", "graceful-fs": "^4.2.9", "jest-regex-util": "^29.6.3", "jest-util": "^29.7.0", "jest-worker": "^29.7.0", "micromatch": "^4.0.4", "walker": "^1.0.8" }, "optionalDependencies": { "fsevents": "^2.3.2" } }, "sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA=="],
+
+ "jest-leak-detector": ["jest-leak-detector@29.7.0", "", { "dependencies": { "jest-get-type": "^29.6.3", "pretty-format": "^29.7.0" } }, "sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw=="],
+
+ "jest-matcher-utils": ["jest-matcher-utils@29.7.0", "", { "dependencies": { "chalk": "^4.0.0", "jest-diff": "^29.7.0", "jest-get-type": "^29.6.3", "pretty-format": "^29.7.0" } }, "sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g=="],
+
+ "jest-message-util": ["jest-message-util@29.7.0", "", { "dependencies": { "@babel/code-frame": "^7.12.13", "@jest/types": "^29.6.3", "@types/stack-utils": "^2.0.0", "chalk": "^4.0.0", "graceful-fs": "^4.2.9", "micromatch": "^4.0.4", "pretty-format": "^29.7.0", "slash": "^3.0.0", "stack-utils": "^2.0.3" } }, "sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w=="],
+
+ "jest-mock": ["jest-mock@29.7.0", "", { "dependencies": { "@jest/types": "^29.6.3", "@types/node": "*", "jest-util": "^29.7.0" } }, "sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw=="],
+
+ "jest-pnp-resolver": ["jest-pnp-resolver@1.2.3", "", { "peerDependencies": { "jest-resolve": "*" }, "optionalPeers": ["jest-resolve"] }, "sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w=="],
+
+ "jest-regex-util": ["jest-regex-util@29.6.3", "", {}, "sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg=="],
+
+ "jest-resolve": ["jest-resolve@29.7.0", "", { "dependencies": { "chalk": "^4.0.0", "graceful-fs": "^4.2.9", "jest-haste-map": "^29.7.0", "jest-pnp-resolver": "^1.2.2", "jest-util": "^29.7.0", "jest-validate": "^29.7.0", "resolve": "^1.20.0", "resolve.exports": "^2.0.0", "slash": "^3.0.0" } }, "sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA=="],
+
+ "jest-resolve-dependencies": ["jest-resolve-dependencies@29.7.0", "", { "dependencies": { "jest-regex-util": "^29.6.3", "jest-snapshot": "^29.7.0" } }, "sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA=="],
+
+ "jest-runner": ["jest-runner@29.7.0", "", { "dependencies": { "@jest/console": "^29.7.0", "@jest/environment": "^29.7.0", "@jest/test-result": "^29.7.0", "@jest/transform": "^29.7.0", "@jest/types": "^29.6.3", "@types/node": "*", "chalk": "^4.0.0", "emittery": "^0.13.1", "graceful-fs": "^4.2.9", "jest-docblock": "^29.7.0", "jest-environment-node": "^29.7.0", "jest-haste-map": "^29.7.0", "jest-leak-detector": "^29.7.0", "jest-message-util": "^29.7.0", "jest-resolve": "^29.7.0", "jest-runtime": "^29.7.0", "jest-util": "^29.7.0", "jest-watcher": "^29.7.0", "jest-worker": "^29.7.0", "p-limit": "^3.1.0", "source-map-support": "0.5.13" } }, "sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ=="],
+
+ "jest-runtime": ["jest-runtime@29.7.0", "", { "dependencies": { "@jest/environment": "^29.7.0", "@jest/fake-timers": "^29.7.0", "@jest/globals": "^29.7.0", "@jest/source-map": "^29.6.3", "@jest/test-result": "^29.7.0", "@jest/transform": "^29.7.0", "@jest/types": "^29.6.3", "@types/node": "*", "chalk": "^4.0.0", "cjs-module-lexer": "^1.0.0", "collect-v8-coverage": "^1.0.0", "glob": "^7.1.3", "graceful-fs": "^4.2.9", "jest-haste-map": "^29.7.0", "jest-message-util": "^29.7.0", "jest-mock": "^29.7.0", "jest-regex-util": "^29.6.3", "jest-resolve": "^29.7.0", "jest-snapshot": "^29.7.0", "jest-util": "^29.7.0", "slash": "^3.0.0", "strip-bom": "^4.0.0" } }, "sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ=="],
+
+ "jest-snapshot": ["jest-snapshot@29.7.0", "", { "dependencies": { "@babel/core": "^7.11.6", "@babel/generator": "^7.7.2", "@babel/plugin-syntax-jsx": "^7.7.2", "@babel/plugin-syntax-typescript": "^7.7.2", "@babel/types": "^7.3.3", "@jest/expect-utils": "^29.7.0", "@jest/transform": "^29.7.0", "@jest/types": "^29.6.3", "babel-preset-current-node-syntax": "^1.0.0", "chalk": "^4.0.0", "expect": "^29.7.0", "graceful-fs": "^4.2.9", "jest-diff": "^29.7.0", "jest-get-type": "^29.6.3", "jest-matcher-utils": "^29.7.0", "jest-message-util": "^29.7.0", "jest-util": "^29.7.0", "natural-compare": "^1.4.0", "pretty-format": "^29.7.0", "semver": "^7.5.3" } }, "sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw=="],
+
+ "jest-util": ["jest-util@29.7.0", "", { "dependencies": { "@jest/types": "^29.6.3", "@types/node": "*", "chalk": "^4.0.0", "ci-info": "^3.2.0", "graceful-fs": "^4.2.9", "picomatch": "^2.2.3" } }, "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA=="],
+
+ "jest-validate": ["jest-validate@29.7.0", "", { "dependencies": { "@jest/types": "^29.6.3", "camelcase": "^6.2.0", "chalk": "^4.0.0", "jest-get-type": "^29.6.3", "leven": "^3.1.0", "pretty-format": "^29.7.0" } }, "sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw=="],
+
+ "jest-watcher": ["jest-watcher@29.7.0", "", { "dependencies": { "@jest/test-result": "^29.7.0", "@jest/types": "^29.6.3", "@types/node": "*", "ansi-escapes": "^4.2.1", "chalk": "^4.0.0", "emittery": "^0.13.1", "jest-util": "^29.7.0", "string-length": "^4.0.1" } }, "sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g=="],
+
+ "jest-worker": ["jest-worker@27.5.1", "", { "dependencies": { "@types/node": "*", "merge-stream": "^2.0.0", "supports-color": "^8.0.0" } }, "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg=="],
+
+ "jiti": ["jiti@1.21.7", "", { "bin": { "jiti": "bin/jiti.js" } }, "sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A=="],
+
+ "js-tokens": ["js-tokens@4.0.0", "", {}, "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ=="],
+
+ "js-yaml": ["js-yaml@4.1.1", "", { "dependencies": { "argparse": "^2.0.1" }, "bin": { "js-yaml": "bin/js-yaml.js" } }, "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA=="],
+
+ "jsesc": ["jsesc@3.1.0", "", { "bin": { "jsesc": "bin/jsesc" } }, "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA=="],
+
+ "json-buffer": ["json-buffer@3.0.1", "", {}, "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ=="],
+
+ "json-parse-even-better-errors": ["json-parse-even-better-errors@2.3.1", "", {}, "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w=="],
+
+ "json-schema-ref-resolver": ["json-schema-ref-resolver@3.0.0", "", { "dependencies": { "dequal": "^2.0.3" } }, "sha512-hOrZIVL5jyYFjzk7+y7n5JDzGlU8rfWDuYyHwGa2WA8/pcmMHezp2xsVwxrebD/Q9t8Nc5DboieySDpCp4WG4A=="],
+
+ "json-schema-traverse": ["json-schema-traverse@0.4.1", "", {}, "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg=="],
+
+ "json-stable-stringify-without-jsonify": ["json-stable-stringify-without-jsonify@1.0.1", "", {}, "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw=="],
+
+ "json-stringify-safe": ["json-stringify-safe@5.0.1", "", {}, "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA=="],
+
+ "json5": ["json5@2.2.3", "", { "bin": { "json5": "lib/cli.js" } }, "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg=="],
+
+ "jsonc-parser": ["jsonc-parser@3.3.1", "", {}, "sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ=="],
+
+ "jsonfile": ["jsonfile@6.2.0", "", { "dependencies": { "universalify": "^2.0.0" }, "optionalDependencies": { "graceful-fs": "^4.1.6" } }, "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg=="],
+
+ "jsonparse": ["jsonparse@1.3.1", "", {}, "sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg=="],
+
+ "jsx-ast-utils": ["jsx-ast-utils@3.3.5", "", { "dependencies": { "array-includes": "^3.1.6", "array.prototype.flat": "^1.3.1", "object.assign": "^4.1.4", "object.values": "^1.1.6" } }, "sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ=="],
+
+ "katex": ["katex@0.16.27", "", { "dependencies": { "commander": "^8.3.0" }, "bin": { "katex": "cli.js" } }, "sha512-aeQoDkuRWSqQN6nSvVCEFvfXdqo1OQiCmmW1kc9xSdjutPv7BGO7pqY9sQRJpMOGrEdfDgF2TfRXe5eUAD2Waw=="],
+
+ "keyv": ["keyv@4.5.4", "", { "dependencies": { "json-buffer": "3.0.1" } }, "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw=="],
+
+ "khroma": ["khroma@2.1.0", "", {}, "sha512-Ls993zuzfayK269Svk9hzpeGUKob/sIgZzyHYdjQoAdQetRKpOLj+k/QQQ/6Qi0Yz65mlROrfd+Ev+1+7dz9Kw=="],
+
+ "kind-of": ["kind-of@6.0.3", "", {}, "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw=="],
+
+ "kleur": ["kleur@3.0.3", "", {}, "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w=="],
+
+ "language-subtag-registry": ["language-subtag-registry@0.3.23", "", {}, "sha512-0K65Lea881pHotoGEa5gDlMxt3pctLi2RplBb7Ezh4rRdLEOtgi7n4EwK9lamnUCkKBqaeKRVebTq6BAxSkpXQ=="],
+
+ "language-tags": ["language-tags@1.0.9", "", { "dependencies": { "language-subtag-registry": "^0.3.20" } }, "sha512-MbjN408fEndfiQXbFQ1vnd+1NoLDsnQW41410oQBXiyXDMYH5z505juWa4KUE1LqxRC7DgOgZDbKLxHIwm27hA=="],
+
+ "latest-version": ["latest-version@7.0.0", "", { "dependencies": { "package-json": "^8.1.0" } }, "sha512-KvNT4XqAMzdcL6ka6Tl3i2lYeFDgXNCuIX+xNx6ZMVR1dFq+idXd9FLKNMOIx0t9mJ9/HudyX4oZWXZQ0UJHeg=="],
+
+ "layout-base": ["layout-base@1.0.2", "", {}, "sha512-8h2oVEZNktL4BH2JCOI90iD1yXwL6iNW7KcCKT2QZgQJR2vbqDsldCTPRU9NifTCqHZci57XvQQ15YTu+sTYPg=="],
+
+ "leven": ["leven@3.1.0", "", {}, "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A=="],
+
+ "levn": ["levn@0.4.1", "", { "dependencies": { "prelude-ls": "^1.2.1", "type-check": "~0.4.0" } }, "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ=="],
+
+ "light-my-request": ["light-my-request@6.3.0", "", { "dependencies": { "cookie": "^1.0.1", "process-warning": "^4.0.0", "set-cookie-parser": "^2.6.0" } }, "sha512-bWTAPJmeWQH5suJNYwG0f5cs0p6ho9e6f1Ppoxv5qMosY+s9Ir2+ZLvvHcgA7VTDop4zl/NCHhOVVqU+kd++Ow=="],
+
+ "lilconfig": ["lilconfig@3.1.3", "", {}, "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw=="],
+
+ "lines-and-columns": ["lines-and-columns@1.2.4", "", {}, "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg=="],
+
+ "lint-staged": ["lint-staged@15.2.7", "", { "dependencies": { "chalk": "~5.3.0", "commander": "~12.1.0", "debug": "~4.3.4", "execa": "~8.0.1", "lilconfig": "~3.1.1", "listr2": "~8.2.1", "micromatch": "~4.0.7", "pidtree": "~0.6.0", "string-argv": "~0.3.2", "yaml": "~2.4.2" }, "bin": { "lint-staged": "bin/lint-staged.js" } }, "sha512-+FdVbbCZ+yoh7E/RosSdqKJyUM2OEjTciH0TFNkawKgvFp1zbGlEC39RADg+xKBG1R4mhoH2j85myBQZ5wR+lw=="],
+
+ "listr2": ["listr2@8.2.5", "", { "dependencies": { "cli-truncate": "^4.0.0", "colorette": "^2.0.20", "eventemitter3": "^5.0.1", "log-update": "^6.1.0", "rfdc": "^1.4.1", "wrap-ansi": "^9.0.0" } }, "sha512-iyAZCeyD+c1gPyE9qpFu8af0Y+MRtmKOncdGoA2S5EY8iFq99dmmvkNnHiWo+pj0s7yH7l3KPIgee77tKpXPWQ=="],
+
+ "loader-runner": ["loader-runner@4.3.1", "", {}, "sha512-IWqP2SCPhyVFTBtRcgMHdzlf9ul25NwaFx4wCEH/KjAXuuHY4yNjvPXsBokp8jCB936PyWRaPKUNh8NvylLp2Q=="],
+
+ "locate-path": ["locate-path@6.0.0", "", { "dependencies": { "p-locate": "^5.0.0" } }, "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw=="],
+
+ "lodash": ["lodash@4.17.21", "", {}, "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg=="],
+
+ "lodash-es": ["lodash-es@4.17.22", "", {}, "sha512-XEawp1t0gxSi9x01glktRZ5HDy0HXqrM0x5pXQM98EaI0NxO6jVM7omDOxsuEo5UIASAnm2bRp1Jt/e0a2XU8Q=="],
+
+ "lodash.camelcase": ["lodash.camelcase@4.3.0", "", {}, "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA=="],
+
+ "lodash.capitalize": ["lodash.capitalize@4.2.1", "", {}, "sha512-kZzYOKspf8XVX5AvmQF94gQW0lejFVgb80G85bU4ZWzoJ6C03PQg3coYAUpSTpQWelrZELd3XWgHzw4Ck5kaIw=="],
+
+ "lodash.debounce": ["lodash.debounce@4.0.8", "", {}, "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow=="],
+
+ "lodash.escaperegexp": ["lodash.escaperegexp@4.1.2", "", {}, "sha512-TM9YBvyC84ZxE3rgfefxUWiQKLilstD6k7PTGt6wfbtXF8ixIJLOL3VYyV/z+ZiPLsVxAsKAFVwWlWeb2Y8Yyw=="],
+
+ "lodash.get": ["lodash.get@4.4.2", "", {}, "sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ=="],
+
+ "lodash.isplainobject": ["lodash.isplainobject@4.0.6", "", {}, "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA=="],
+
+ "lodash.isstring": ["lodash.isstring@4.0.1", "", {}, "sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw=="],
+
+ "lodash.kebabcase": ["lodash.kebabcase@4.1.1", "", {}, "sha512-N8XRTIMMqqDgSy4VLKPnJ/+hpGZN+PHQiJnSenYqPaVV/NCqEogTnAdZLQiGKhxX+JCs8waWq2t1XHWKOmlY8g=="],
+
+ "lodash.memoize": ["lodash.memoize@4.1.2", "", {}, "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag=="],
+
+ "lodash.merge": ["lodash.merge@4.6.2", "", {}, "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ=="],
+
+ "lodash.mergewith": ["lodash.mergewith@4.6.2", "", {}, "sha512-GK3g5RPZWTRSeLSpgP8Xhra+pnjBC56q9FZYe1d5RN3TJ35dbkGy3YqBSMbyCrlbi+CM9Z3Jk5yTL7RCsqboyQ=="],
+
+ "lodash.snakecase": ["lodash.snakecase@4.1.1", "", {}, "sha512-QZ1d4xoBHYUeuouhEq3lk3Uq7ldgyFXGBhg04+oRLnIz8o9T65Eh+8YdroUwn846zchkA9yDsDl5CVVaV2nqYw=="],
+
+ "lodash.startcase": ["lodash.startcase@4.4.0", "", {}, "sha512-+WKqsK294HMSc2jEbNgpHpd0JfIBhp7rEV4aqXWqFr6AlXov+SlcgB1Fv01y2kGe3Gc8nMW7VA0SrGuSkRfIEg=="],
+
+ "lodash.uniq": ["lodash.uniq@4.5.0", "", {}, "sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ=="],
+
+ "lodash.uniqby": ["lodash.uniqby@4.7.0", "", {}, "sha512-e/zcLx6CSbmaEgFHCA7BnoQKyCtKMxnuWrJygbwPs/AIn+IMKl66L8/s+wBUn5LRw2pZx3bUHibiV1b6aTWIww=="],
+
+ "lodash.upperfirst": ["lodash.upperfirst@4.3.1", "", {}, "sha512-sReKOYJIJf74dhJONhU4e0/shzi1trVbSWDOhKYE5XV2O+H7Sb2Dihwuc7xWxVl+DgFPyTqIN3zMfT9cq5iWDg=="],
+
+ "log-symbols": ["log-symbols@4.1.0", "", { "dependencies": { "chalk": "^4.1.0", "is-unicode-supported": "^0.1.0" } }, "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg=="],
+
+ "log-update": ["log-update@6.1.0", "", { "dependencies": { "ansi-escapes": "^7.0.0", "cli-cursor": "^5.0.0", "slice-ansi": "^7.1.0", "strip-ansi": "^7.1.0", "wrap-ansi": "^9.0.0" } }, "sha512-9ie8ItPR6tjY5uYJh8K/Zrv/RMZ5VOlOWvtZdEHYSTFKZfIBPQa9tOAEeAWhd+AnIneLJ22w5fjOYtoutpWq5w=="],
+
+ "longest-streak": ["longest-streak@3.1.0", "", {}, "sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g=="],
+
+ "loose-envify": ["loose-envify@1.4.0", "", { "dependencies": { "js-tokens": "^3.0.0 || ^4.0.0" }, "bin": { "loose-envify": "cli.js" } }, "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q=="],
+
+ "lower-case": ["lower-case@2.0.2", "", { "dependencies": { "tslib": "^2.0.3" } }, "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg=="],
+
+ "lowercase-keys": ["lowercase-keys@3.0.0", "", {}, "sha512-ozCC6gdQ+glXOQsveKD0YsDy8DSQFjDTz4zyzEHNV5+JP5D62LmfDZ6o1cycFx9ouG940M5dE8C8CTewdj2YWQ=="],
+
+ "lru-cache": ["lru-cache@7.18.3", "", {}, "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA=="],
+
+ "lucide-react": ["lucide-react@0.401.0", "", { "peerDependencies": { "react": "^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, "sha512-4HijVZoWBe8BfLNbXyLH8ZZI4XUj/YeGWaHHjEe0/49L5Qw4pVA+HvZrvJH8ekNxz2nLvoDlfsJVOBNgBs9Bug=="],
+
+ "macos-release": ["macos-release@2.5.1", "", {}, "sha512-DXqXhEM7gW59OjZO8NIjBCz9AQ1BEMrfiOAl4AYByHCtVHRF4KoGNO8mqQeM8lRCtQe/UnJ4imO/d2HdkKsd+A=="],
+
+ "magic-string": ["magic-string@0.30.0", "", { "dependencies": { "@jridgewell/sourcemap-codec": "^1.4.13" } }, "sha512-LA+31JYDJLs82r2ScLrlz1GjSgu66ZV518eyWT+S8VhyQn/JL0u9MeBOvQMGYiPk1DBiSN9DDMOcXvigJZaViQ=="],
+
+ "make-dir": ["make-dir@4.0.0", "", { "dependencies": { "semver": "^7.5.3" } }, "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw=="],
+
+ "make-error": ["make-error@1.3.6", "", {}, "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw=="],
+
+ "makeerror": ["makeerror@1.0.12", "", { "dependencies": { "tmpl": "1.0.5" } }, "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg=="],
+
+ "markdown-extensions": ["markdown-extensions@1.1.1", "", {}, "sha512-WWC0ZuMzCyDHYCasEGs4IPvLyTGftYwh6wIEOULOF0HXcqZlhwRzrK0w2VUlxWA98xnvb/jszw4ZSkJ6ADpM6Q=="],
+
+ "markdown-table": ["markdown-table@3.0.4", "", {}, "sha512-wiYz4+JrLyb/DqW2hkFJxP7Vd7JuTDm77fvbM8VfEQdmSMqcImWeeRbHwZjBjIFki/VaMK2BhFi7oUUZeM5bqw=="],
+
+ "match-sorter": ["match-sorter@6.4.0", "", { "dependencies": { "@babel/runtime": "^7.23.8", "remove-accents": "0.5.0" } }, "sha512-d4664ahzdL1QTTvmK1iI0JsrxWeJ6gn33qkYtnPg3mcn+naBLtXSgSPOe+X2vUgtgGwaAk3eiaj7gwKjjMAq+Q=="],
+
+ "matcher-collection": ["matcher-collection@2.0.1", "", { "dependencies": { "@types/minimatch": "^3.0.3", "minimatch": "^3.0.2" } }, "sha512-daE62nS2ZQsDg9raM0IlZzLmI2u+7ZapXBwdoeBUKAYERPDDIc0qNqA8E0Rp2D+gspKR7BgIFP52GeujaGXWeQ=="],
+
+ "math-intrinsics": ["math-intrinsics@1.1.0", "", {}, "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g=="],
+
+ "mdast-util-definitions": ["mdast-util-definitions@5.1.2", "", { "dependencies": { "@types/mdast": "^3.0.0", "@types/unist": "^2.0.0", "unist-util-visit": "^4.0.0" } }, "sha512-8SVPMuHqlPME/z3gqVwWY4zVXn8lqKv/pAhC57FuJ40ImXyBpmO5ukh98zB2v7Blql2FiHjHv9LVztSIqjY+MA=="],
+
+ "mdast-util-find-and-replace": ["mdast-util-find-and-replace@2.2.2", "", { "dependencies": { "@types/mdast": "^3.0.0", "escape-string-regexp": "^5.0.0", "unist-util-is": "^5.0.0", "unist-util-visit-parents": "^5.0.0" } }, "sha512-MTtdFRz/eMDHXzeK6W3dO7mXUlF82Gom4y0oOgvHhh/HXZAGvIQDUvQ0SuUx+j2tv44b8xTHOm8K/9OoRFnXKw=="],
+
+ "mdast-util-from-markdown": ["mdast-util-from-markdown@1.3.1", "", { "dependencies": { "@types/mdast": "^3.0.0", "@types/unist": "^2.0.0", "decode-named-character-reference": "^1.0.0", "mdast-util-to-string": "^3.1.0", "micromark": "^3.0.0", "micromark-util-decode-numeric-character-reference": "^1.0.0", "micromark-util-decode-string": "^1.0.0", "micromark-util-normalize-identifier": "^1.0.0", "micromark-util-symbol": "^1.0.0", "micromark-util-types": "^1.0.0", "unist-util-stringify-position": "^3.0.0", "uvu": "^0.5.0" } }, "sha512-4xTO/M8c82qBcnQc1tgpNtubGUW/Y1tBQ1B0i5CtSoelOLKFYlElIr3bvgREYYO5iRqbMY1YuqZng0GVOI8Qww=="],
+
+ "mdast-util-gfm": ["mdast-util-gfm@2.0.2", "", { "dependencies": { "mdast-util-from-markdown": "^1.0.0", "mdast-util-gfm-autolink-literal": "^1.0.0", "mdast-util-gfm-footnote": "^1.0.0", "mdast-util-gfm-strikethrough": "^1.0.0", "mdast-util-gfm-table": "^1.0.0", "mdast-util-gfm-task-list-item": "^1.0.0", "mdast-util-to-markdown": "^1.0.0" } }, "sha512-qvZ608nBppZ4icQlhQQIAdc6S3Ffj9RGmzwUKUWuEICFnd1LVkN3EktF7ZHAgfcEdvZB5owU9tQgt99e2TlLjg=="],
+
+ "mdast-util-gfm-autolink-literal": ["mdast-util-gfm-autolink-literal@1.0.3", "", { "dependencies": { "@types/mdast": "^3.0.0", "ccount": "^2.0.0", "mdast-util-find-and-replace": "^2.0.0", "micromark-util-character": "^1.0.0" } }, "sha512-My8KJ57FYEy2W2LyNom4n3E7hKTuQk/0SES0u16tjA9Z3oFkF4RrC/hPAPgjlSpezsOvI8ObcXcElo92wn5IGA=="],
+
+ "mdast-util-gfm-footnote": ["mdast-util-gfm-footnote@1.0.2", "", { "dependencies": { "@types/mdast": "^3.0.0", "mdast-util-to-markdown": "^1.3.0", "micromark-util-normalize-identifier": "^1.0.0" } }, "sha512-56D19KOGbE00uKVj3sgIykpwKL179QsVFwx/DCW0u/0+URsryacI4MAdNJl0dh+u2PSsD9FtxPFbHCzJ78qJFQ=="],
+
+ "mdast-util-gfm-strikethrough": ["mdast-util-gfm-strikethrough@1.0.3", "", { "dependencies": { "@types/mdast": "^3.0.0", "mdast-util-to-markdown": "^1.3.0" } }, "sha512-DAPhYzTYrRcXdMjUtUjKvW9z/FNAMTdU0ORyMcbmkwYNbKocDpdk+PX1L1dQgOID/+vVs1uBQ7ElrBQfZ0cuiQ=="],
+
+ "mdast-util-gfm-table": ["mdast-util-gfm-table@1.0.7", "", { "dependencies": { "@types/mdast": "^3.0.0", "markdown-table": "^3.0.0", "mdast-util-from-markdown": "^1.0.0", "mdast-util-to-markdown": "^1.3.0" } }, "sha512-jjcpmNnQvrmN5Vx7y7lEc2iIOEytYv7rTvu+MeyAsSHTASGCCRA79Igg2uKssgOs1i1po8s3plW0sTu1wkkLGg=="],
+
+ "mdast-util-gfm-task-list-item": ["mdast-util-gfm-task-list-item@1.0.2", "", { "dependencies": { "@types/mdast": "^3.0.0", "mdast-util-to-markdown": "^1.3.0" } }, "sha512-PFTA1gzfp1B1UaiJVyhJZA1rm0+Tzn690frc/L8vNX1Jop4STZgOE6bxUhnzdVSB+vm2GU1tIsuQcA9bxTQpMQ=="],
+
+ "mdast-util-math": ["mdast-util-math@2.0.2", "", { "dependencies": { "@types/mdast": "^3.0.0", "longest-streak": "^3.0.0", "mdast-util-to-markdown": "^1.3.0" } }, "sha512-8gmkKVp9v6+Tgjtq6SYx9kGPpTf6FVYRa53/DLh479aldR9AyP48qeVOgNZ5X7QUK7nOy4yw7vg6mbiGcs9jWQ=="],
+
+ "mdast-util-mdx": ["mdast-util-mdx@2.0.1", "", { "dependencies": { "mdast-util-from-markdown": "^1.0.0", "mdast-util-mdx-expression": "^1.0.0", "mdast-util-mdx-jsx": "^2.0.0", "mdast-util-mdxjs-esm": "^1.0.0", "mdast-util-to-markdown": "^1.0.0" } }, "sha512-38w5y+r8nyKlGvNjSEqWrhG0w5PmnRA+wnBvm+ulYCct7nsGYhFVb0lljS9bQav4psDAS1eGkP2LMVcZBi/aqw=="],
+
+ "mdast-util-mdx-expression": ["mdast-util-mdx-expression@1.3.2", "", { "dependencies": { "@types/estree-jsx": "^1.0.0", "@types/hast": "^2.0.0", "@types/mdast": "^3.0.0", "mdast-util-from-markdown": "^1.0.0", "mdast-util-to-markdown": "^1.0.0" } }, "sha512-xIPmR5ReJDu/DHH1OoIT1HkuybIfRGYRywC+gJtI7qHjCJp/M9jrmBEJW22O8lskDWm562BX2W8TiAwRTb0rKA=="],
+
+ "mdast-util-mdx-jsx": ["mdast-util-mdx-jsx@2.1.4", "", { "dependencies": { "@types/estree-jsx": "^1.0.0", "@types/hast": "^2.0.0", "@types/mdast": "^3.0.0", "@types/unist": "^2.0.0", "ccount": "^2.0.0", "mdast-util-from-markdown": "^1.1.0", "mdast-util-to-markdown": "^1.3.0", "parse-entities": "^4.0.0", "stringify-entities": "^4.0.0", "unist-util-remove-position": "^4.0.0", "unist-util-stringify-position": "^3.0.0", "vfile-message": "^3.0.0" } }, "sha512-DtMn9CmVhVzZx3f+optVDF8yFgQVt7FghCRNdlIaS3X5Bnym3hZwPbg/XW86vdpKjlc1PVj26SpnLGeJBXD3JA=="],
+
+ "mdast-util-mdxjs-esm": ["mdast-util-mdxjs-esm@1.3.1", "", { "dependencies": { "@types/estree-jsx": "^1.0.0", "@types/hast": "^2.0.0", "@types/mdast": "^3.0.0", "mdast-util-from-markdown": "^1.0.0", "mdast-util-to-markdown": "^1.0.0" } }, "sha512-SXqglS0HrEvSdUEfoXFtcg7DRl7S2cwOXc7jkuusG472Mmjag34DUDeOJUZtl+BVnyeO1frIgVpHlNRWc2gk/w=="],
+
+ "mdast-util-phrasing": ["mdast-util-phrasing@3.0.1", "", { "dependencies": { "@types/mdast": "^3.0.0", "unist-util-is": "^5.0.0" } }, "sha512-WmI1gTXUBJo4/ZmSk79Wcb2HcjPJBzM1nlI/OUWA8yk2X9ik3ffNbBGsU+09BFmXaL1IBb9fiuvq6/KMiNycSg=="],
+
+ "mdast-util-to-hast": ["mdast-util-to-hast@12.3.0", "", { "dependencies": { "@types/hast": "^2.0.0", "@types/mdast": "^3.0.0", "mdast-util-definitions": "^5.0.0", "micromark-util-sanitize-uri": "^1.1.0", "trim-lines": "^3.0.0", "unist-util-generated": "^2.0.0", "unist-util-position": "^4.0.0", "unist-util-visit": "^4.0.0" } }, "sha512-pits93r8PhnIoU4Vy9bjW39M2jJ6/tdHyja9rrot9uujkN7UTU9SDnE6WNJz/IGyQk3XHX6yNNtrBH6cQzm8Hw=="],
+
+ "mdast-util-to-markdown": ["mdast-util-to-markdown@1.5.0", "", { "dependencies": { "@types/mdast": "^3.0.0", "@types/unist": "^2.0.0", "longest-streak": "^3.0.0", "mdast-util-phrasing": "^3.0.0", "mdast-util-to-string": "^3.0.0", "micromark-util-decode-string": "^1.0.0", "unist-util-visit": "^4.0.0", "zwitch": "^2.0.0" } }, "sha512-bbv7TPv/WC49thZPg3jXuqzuvI45IL2EVAr/KxF0BSdHsU0ceFHOmwQn6evxAh1GaoK/6GQ1wp4R4oW2+LFL/A=="],
+
+ "mdast-util-to-string": ["mdast-util-to-string@3.2.0", "", { "dependencies": { "@types/mdast": "^3.0.0" } }, "sha512-V4Zn/ncyN1QNSqSBxTrMOLpjr+IKdHl2v3KVLoWmDPscP4r9GcCi71gjgvUV1SFSKh92AjAG4peFuBl2/YgCJg=="],
+
+ "mdn-data": ["mdn-data@2.0.30", "", {}, "sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA=="],
+
+ "media-typer": ["media-typer@0.3.0", "", {}, "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ=="],
+
+ "memfs": ["memfs@3.6.0", "", { "dependencies": { "fs-monkey": "^1.0.4" } }, "sha512-EGowvkkgbMcIChjMTMkESFDbZeSh8xZ7kNSF0hAiAN4Jh6jgHCRS0Ga/+C8y6Au+oqpezRHCfPsmJ2+DwAgiwQ=="],
+
+ "meow": ["meow@12.1.1", "", {}, "sha512-BhXM0Au22RwUneMPwSCnyhTOizdWoIEPU9sp0Aqa1PnDMR5Wv2FGXYDjuzJEIX+Eo2Rb8xuYe5jrnm5QowQFkw=="],
+
+ "merge-descriptors": ["merge-descriptors@1.0.1", "", {}, "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w=="],
+
+ "merge-stream": ["merge-stream@2.0.0", "", {}, "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w=="],
+
+ "merge2": ["merge2@1.4.1", "", {}, "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg=="],
+
+ "mermaid": ["mermaid@10.9.5", "", { "dependencies": { "@braintree/sanitize-url": "^6.0.1", "@types/d3-scale": "^4.0.3", "@types/d3-scale-chromatic": "^3.0.0", "cytoscape": "^3.28.1", "cytoscape-cose-bilkent": "^4.1.0", "d3": "^7.4.0", "d3-sankey": "^0.12.3", "dagre-d3-es": "7.0.13", "dayjs": "^1.11.7", "dompurify": "^3.2.4", "elkjs": "^0.9.0", "katex": "^0.16.9", "khroma": "^2.0.0", "lodash-es": "^4.17.21", "mdast-util-from-markdown": "^1.3.0", "non-layered-tidy-tree-layout": "^2.0.2", "stylis": "^4.1.3", "ts-dedent": "^2.2.0", "uuid": "^9.0.0", "web-worker": "^1.2.0" } }, "sha512-eRlKEjzak4z1rcXeCd1OAlyawhrptClQDo8OuI8n6bSVqJ9oMfd5Lrf3Q+TdJHewi/9AIOc3UmEo8Fz+kNzzuQ=="],
+
+ "methods": ["methods@1.1.2", "", {}, "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w=="],
+
+ "micromark": ["micromark@3.2.0", "", { "dependencies": { "@types/debug": "^4.0.0", "debug": "^4.0.0", "decode-named-character-reference": "^1.0.0", "micromark-core-commonmark": "^1.0.1", "micromark-factory-space": "^1.0.0", "micromark-util-character": "^1.0.0", "micromark-util-chunked": "^1.0.0", "micromark-util-combine-extensions": "^1.0.0", "micromark-util-decode-numeric-character-reference": "^1.0.0", "micromark-util-encode": "^1.0.0", "micromark-util-normalize-identifier": "^1.0.0", "micromark-util-resolve-all": "^1.0.0", "micromark-util-sanitize-uri": "^1.0.0", "micromark-util-subtokenize": "^1.0.0", "micromark-util-symbol": "^1.0.0", "micromark-util-types": "^1.0.1", "uvu": "^0.5.0" } }, "sha512-uD66tJj54JLYq0De10AhWycZWGQNUvDI55xPgk2sQM5kn1JYlhbCMTtEeT27+vAhW2FBQxLlOmS3pmA7/2z4aA=="],
+
+ "micromark-core-commonmark": ["micromark-core-commonmark@1.1.0", "", { "dependencies": { "decode-named-character-reference": "^1.0.0", "micromark-factory-destination": "^1.0.0", "micromark-factory-label": "^1.0.0", "micromark-factory-space": "^1.0.0", "micromark-factory-title": "^1.0.0", "micromark-factory-whitespace": "^1.0.0", "micromark-util-character": "^1.0.0", "micromark-util-chunked": "^1.0.0", "micromark-util-classify-character": "^1.0.0", "micromark-util-html-tag-name": "^1.0.0", "micromark-util-normalize-identifier": "^1.0.0", "micromark-util-resolve-all": "^1.0.0", "micromark-util-subtokenize": "^1.0.0", "micromark-util-symbol": "^1.0.0", "micromark-util-types": "^1.0.1", "uvu": "^0.5.0" } }, "sha512-BgHO1aRbolh2hcrzL2d1La37V0Aoz73ymF8rAcKnohLy93titmv62E0gP8Hrx9PKcKrqCZ1BbLGbP3bEhoXYlw=="],
+
+ "micromark-extension-gfm": ["micromark-extension-gfm@2.0.3", "", { "dependencies": { "micromark-extension-gfm-autolink-literal": "^1.0.0", "micromark-extension-gfm-footnote": "^1.0.0", "micromark-extension-gfm-strikethrough": "^1.0.0", "micromark-extension-gfm-table": "^1.0.0", "micromark-extension-gfm-tagfilter": "^1.0.0", "micromark-extension-gfm-task-list-item": "^1.0.0", "micromark-util-combine-extensions": "^1.0.0", "micromark-util-types": "^1.0.0" } }, "sha512-vb9OoHqrhCmbRidQv/2+Bc6pkP0FrtlhurxZofvOEy5o8RtuuvTq+RQ1Vw5ZDNrVraQZu3HixESqbG+0iKk/MQ=="],
+
+ "micromark-extension-gfm-autolink-literal": ["micromark-extension-gfm-autolink-literal@1.0.5", "", { "dependencies": { "micromark-util-character": "^1.0.0", "micromark-util-sanitize-uri": "^1.0.0", "micromark-util-symbol": "^1.0.0", "micromark-util-types": "^1.0.0" } }, "sha512-z3wJSLrDf8kRDOh2qBtoTRD53vJ+CWIyo7uyZuxf/JAbNJjiHsOpG1y5wxk8drtv3ETAHutCu6N3thkOOgueWg=="],
+
+ "micromark-extension-gfm-footnote": ["micromark-extension-gfm-footnote@1.1.2", "", { "dependencies": { "micromark-core-commonmark": "^1.0.0", "micromark-factory-space": "^1.0.0", "micromark-util-character": "^1.0.0", "micromark-util-normalize-identifier": "^1.0.0", "micromark-util-sanitize-uri": "^1.0.0", "micromark-util-symbol": "^1.0.0", "micromark-util-types": "^1.0.0", "uvu": "^0.5.0" } }, "sha512-Yxn7z7SxgyGWRNa4wzf8AhYYWNrwl5q1Z8ii+CSTTIqVkmGZF1CElX2JI8g5yGoM3GAman9/PVCUFUSJ0kB/8Q=="],
+
+ "micromark-extension-gfm-strikethrough": ["micromark-extension-gfm-strikethrough@1.0.7", "", { "dependencies": { "micromark-util-chunked": "^1.0.0", "micromark-util-classify-character": "^1.0.0", "micromark-util-resolve-all": "^1.0.0", "micromark-util-symbol": "^1.0.0", "micromark-util-types": "^1.0.0", "uvu": "^0.5.0" } }, "sha512-sX0FawVE1o3abGk3vRjOH50L5TTLr3b5XMqnP9YDRb34M0v5OoZhG+OHFz1OffZ9dlwgpTBKaT4XW/AsUVnSDw=="],
+
+ "micromark-extension-gfm-table": ["micromark-extension-gfm-table@1.0.7", "", { "dependencies": { "micromark-factory-space": "^1.0.0", "micromark-util-character": "^1.0.0", "micromark-util-symbol": "^1.0.0", "micromark-util-types": "^1.0.0", "uvu": "^0.5.0" } }, "sha512-3ZORTHtcSnMQEKtAOsBQ9/oHp9096pI/UvdPtN7ehKvrmZZ2+bbWhi0ln+I9drmwXMt5boocn6OlwQzNXeVeqw=="],
+
+ "micromark-extension-gfm-tagfilter": ["micromark-extension-gfm-tagfilter@1.0.2", "", { "dependencies": { "micromark-util-types": "^1.0.0" } }, "sha512-5XWB9GbAUSHTn8VPU8/1DBXMuKYT5uOgEjJb8gN3mW0PNW5OPHpSdojoqf+iq1xo7vWzw/P8bAHY0n6ijpXF7g=="],
+
+ "micromark-extension-gfm-task-list-item": ["micromark-extension-gfm-task-list-item@1.0.5", "", { "dependencies": { "micromark-factory-space": "^1.0.0", "micromark-util-character": "^1.0.0", "micromark-util-symbol": "^1.0.0", "micromark-util-types": "^1.0.0", "uvu": "^0.5.0" } }, "sha512-RMFXl2uQ0pNQy6Lun2YBYT9g9INXtWJULgbt01D/x8/6yJ2qpKyzdZD3pi6UIkzF++Da49xAelVKUeUMqd5eIQ=="],
+
+ "micromark-extension-math": ["micromark-extension-math@2.1.2", "", { "dependencies": { "@types/katex": "^0.16.0", "katex": "^0.16.0", "micromark-factory-space": "^1.0.0", "micromark-util-character": "^1.0.0", "micromark-util-symbol": "^1.0.0", "micromark-util-types": "^1.0.0", "uvu": "^0.5.0" } }, "sha512-es0CcOV89VNS9wFmyn+wyFTKweXGW4CEvdaAca6SWRWPyYCbBisnjaHLjWO4Nszuiud84jCpkHsqAJoa768Pvg=="],
+
+ "micromark-extension-mdx-expression": ["micromark-extension-mdx-expression@1.0.8", "", { "dependencies": { "@types/estree": "^1.0.0", "micromark-factory-mdx-expression": "^1.0.0", "micromark-factory-space": "^1.0.0", "micromark-util-character": "^1.0.0", "micromark-util-events-to-acorn": "^1.0.0", "micromark-util-symbol": "^1.0.0", "micromark-util-types": "^1.0.0", "uvu": "^0.5.0" } }, "sha512-zZpeQtc5wfWKdzDsHRBY003H2Smg+PUi2REhqgIhdzAa5xonhP03FcXxqFSerFiNUr5AWmHpaNPQTBVOS4lrXw=="],
+
+ "micromark-extension-mdx-jsx": ["micromark-extension-mdx-jsx@1.0.5", "", { "dependencies": { "@types/acorn": "^4.0.0", "@types/estree": "^1.0.0", "estree-util-is-identifier-name": "^2.0.0", "micromark-factory-mdx-expression": "^1.0.0", "micromark-factory-space": "^1.0.0", "micromark-util-character": "^1.0.0", "micromark-util-symbol": "^1.0.0", "micromark-util-types": "^1.0.0", "uvu": "^0.5.0", "vfile-message": "^3.0.0" } }, "sha512-gPH+9ZdmDflbu19Xkb8+gheqEDqkSpdCEubQyxuz/Hn8DOXiXvrXeikOoBA71+e8Pfi0/UYmU3wW3H58kr7akA=="],
+
+ "micromark-extension-mdx-md": ["micromark-extension-mdx-md@1.0.1", "", { "dependencies": { "micromark-util-types": "^1.0.0" } }, "sha512-7MSuj2S7xjOQXAjjkbjBsHkMtb+mDGVW6uI2dBL9snOBCbZmoNgDAeZ0nSn9j3T42UE/g2xVNMn18PJxZvkBEA=="],
+
+ "micromark-extension-mdxjs": ["micromark-extension-mdxjs@1.0.1", "", { "dependencies": { "acorn": "^8.0.0", "acorn-jsx": "^5.0.0", "micromark-extension-mdx-expression": "^1.0.0", "micromark-extension-mdx-jsx": "^1.0.0", "micromark-extension-mdx-md": "^1.0.0", "micromark-extension-mdxjs-esm": "^1.0.0", "micromark-util-combine-extensions": "^1.0.0", "micromark-util-types": "^1.0.0" } }, "sha512-7YA7hF6i5eKOfFUzZ+0z6avRG52GpWR8DL+kN47y3f2KhxbBZMhmxe7auOeaTBrW2DenbbZTf1ea9tA2hDpC2Q=="],
+
+ "micromark-extension-mdxjs-esm": ["micromark-extension-mdxjs-esm@1.0.5", "", { "dependencies": { "@types/estree": "^1.0.0", "micromark-core-commonmark": "^1.0.0", "micromark-util-character": "^1.0.0", "micromark-util-events-to-acorn": "^1.0.0", "micromark-util-symbol": "^1.0.0", "micromark-util-types": "^1.0.0", "unist-util-position-from-estree": "^1.1.0", "uvu": "^0.5.0", "vfile-message": "^3.0.0" } }, "sha512-xNRBw4aoURcyz/S69B19WnZAkWJMxHMT5hE36GtDAyhoyn/8TuAeqjFJQlwk+MKQsUD7b3l7kFX+vlfVWgcX1w=="],
+
+ "micromark-factory-destination": ["micromark-factory-destination@1.1.0", "", { "dependencies": { "micromark-util-character": "^1.0.0", "micromark-util-symbol": "^1.0.0", "micromark-util-types": "^1.0.0" } }, "sha512-XaNDROBgx9SgSChd69pjiGKbV+nfHGDPVYFs5dOoDd7ZnMAE+Cuu91BCpsY8RT2NP9vo/B8pds2VQNCLiu0zhg=="],
+
+ "micromark-factory-label": ["micromark-factory-label@1.1.0", "", { "dependencies": { "micromark-util-character": "^1.0.0", "micromark-util-symbol": "^1.0.0", "micromark-util-types": "^1.0.0", "uvu": "^0.5.0" } }, "sha512-OLtyez4vZo/1NjxGhcpDSbHQ+m0IIGnT8BoPamh+7jVlzLJBH98zzuCoUeMxvM6WsNeh8wx8cKvqLiPHEACn0w=="],
+
+ "micromark-factory-mdx-expression": ["micromark-factory-mdx-expression@1.0.9", "", { "dependencies": { "@types/estree": "^1.0.0", "micromark-util-character": "^1.0.0", "micromark-util-events-to-acorn": "^1.0.0", "micromark-util-symbol": "^1.0.0", "micromark-util-types": "^1.0.0", "unist-util-position-from-estree": "^1.0.0", "uvu": "^0.5.0", "vfile-message": "^3.0.0" } }, "sha512-jGIWzSmNfdnkJq05c7b0+Wv0Kfz3NJ3N4cBjnbO4zjXIlxJr+f8lk+5ZmwFvqdAbUy2q6B5rCY//g0QAAaXDWA=="],
+
+ "micromark-factory-space": ["micromark-factory-space@1.1.0", "", { "dependencies": { "micromark-util-character": "^1.0.0", "micromark-util-types": "^1.0.0" } }, "sha512-cRzEj7c0OL4Mw2v6nwzttyOZe8XY/Z8G0rzmWQZTBi/jjwyw/U4uqKtUORXQrR5bAZZnbTI/feRV/R7hc4jQYQ=="],
+
+ "micromark-factory-title": ["micromark-factory-title@1.1.0", "", { "dependencies": { "micromark-factory-space": "^1.0.0", "micromark-util-character": "^1.0.0", "micromark-util-symbol": "^1.0.0", "micromark-util-types": "^1.0.0" } }, "sha512-J7n9R3vMmgjDOCY8NPw55jiyaQnH5kBdV2/UXCtZIpnHH3P6nHUKaH7XXEYuWwx/xUJcawa8plLBEjMPU24HzQ=="],
+
+ "micromark-factory-whitespace": ["micromark-factory-whitespace@1.1.0", "", { "dependencies": { "micromark-factory-space": "^1.0.0", "micromark-util-character": "^1.0.0", "micromark-util-symbol": "^1.0.0", "micromark-util-types": "^1.0.0" } }, "sha512-v2WlmiymVSp5oMg+1Q0N1Lxmt6pMhIHD457whWM7/GUlEks1hI9xj5w3zbc4uuMKXGisksZk8DzP2UyGbGqNsQ=="],
+
+ "micromark-util-character": ["micromark-util-character@1.2.0", "", { "dependencies": { "micromark-util-symbol": "^1.0.0", "micromark-util-types": "^1.0.0" } }, "sha512-lXraTwcX3yH/vMDaFWCQJP1uIszLVebzUa3ZHdrgxr7KEU/9mL4mVgCpGbyhvNLNlauROiNUq7WN5u7ndbY6xg=="],
+
+ "micromark-util-chunked": ["micromark-util-chunked@1.1.0", "", { "dependencies": { "micromark-util-symbol": "^1.0.0" } }, "sha512-Ye01HXpkZPNcV6FiyoW2fGZDUw4Yc7vT0E9Sad83+bEDiCJ1uXu0S3mr8WLpsz3HaG3x2q0HM6CTuPdcZcluFQ=="],
+
+ "micromark-util-classify-character": ["micromark-util-classify-character@1.1.0", "", { "dependencies": { "micromark-util-character": "^1.0.0", "micromark-util-symbol": "^1.0.0", "micromark-util-types": "^1.0.0" } }, "sha512-SL0wLxtKSnklKSUplok1WQFoGhUdWYKggKUiqhX+Swala+BtptGCu5iPRc+xvzJ4PXE/hwM3FNXsfEVgoZsWbw=="],
+
+ "micromark-util-combine-extensions": ["micromark-util-combine-extensions@1.1.0", "", { "dependencies": { "micromark-util-chunked": "^1.0.0", "micromark-util-types": "^1.0.0" } }, "sha512-Q20sp4mfNf9yEqDL50WwuWZHUrCO4fEyeDCnMGmG5Pr0Cz15Uo7KBs6jq+dq0EgX4DPwwrh9m0X+zPV1ypFvUA=="],
+
+ "micromark-util-decode-numeric-character-reference": ["micromark-util-decode-numeric-character-reference@1.1.0", "", { "dependencies": { "micromark-util-symbol": "^1.0.0" } }, "sha512-m9V0ExGv0jB1OT21mrWcuf4QhP46pH1KkfWy9ZEezqHKAxkj4mPCy3nIH1rkbdMlChLHX531eOrymlwyZIf2iw=="],
+
+ "micromark-util-decode-string": ["micromark-util-decode-string@1.1.0", "", { "dependencies": { "decode-named-character-reference": "^1.0.0", "micromark-util-character": "^1.0.0", "micromark-util-decode-numeric-character-reference": "^1.0.0", "micromark-util-symbol": "^1.0.0" } }, "sha512-YphLGCK8gM1tG1bd54azwyrQRjCFcmgj2S2GoJDNnh4vYtnL38JS8M4gpxzOPNyHdNEpheyWXCTnnTDY3N+NVQ=="],
+
+ "micromark-util-encode": ["micromark-util-encode@1.1.0", "", {}, "sha512-EuEzTWSTAj9PA5GOAs992GzNh2dGQO52UvAbtSOMvXTxv3Criqb6IOzJUBCmEqrrXSblJIJBbFFv6zPxpreiJw=="],
+
+ "micromark-util-events-to-acorn": ["micromark-util-events-to-acorn@1.2.3", "", { "dependencies": { "@types/acorn": "^4.0.0", "@types/estree": "^1.0.0", "@types/unist": "^2.0.0", "estree-util-visit": "^1.0.0", "micromark-util-symbol": "^1.0.0", "micromark-util-types": "^1.0.0", "uvu": "^0.5.0", "vfile-message": "^3.0.0" } }, "sha512-ij4X7Wuc4fED6UoLWkmo0xJQhsktfNh1J0m8g4PbIMPlx+ek/4YdW5mvbye8z/aZvAPUoxgXHrwVlXAPKMRp1w=="],
+
+ "micromark-util-html-tag-name": ["micromark-util-html-tag-name@1.2.0", "", {}, "sha512-VTQzcuQgFUD7yYztuQFKXT49KghjtETQ+Wv/zUjGSGBioZnkA4P1XXZPT1FHeJA6RwRXSF47yvJ1tsJdoxwO+Q=="],
+
+ "micromark-util-normalize-identifier": ["micromark-util-normalize-identifier@1.1.0", "", { "dependencies": { "micromark-util-symbol": "^1.0.0" } }, "sha512-N+w5vhqrBihhjdpM8+5Xsxy71QWqGn7HYNUvch71iV2PM7+E3uWGox1Qp90loa1ephtCxG2ftRV/Conitc6P2Q=="],
+
+ "micromark-util-resolve-all": ["micromark-util-resolve-all@1.1.0", "", { "dependencies": { "micromark-util-types": "^1.0.0" } }, "sha512-b/G6BTMSg+bX+xVCshPTPyAu2tmA0E4X98NSR7eIbeC6ycCqCeE7wjfDIgzEbkzdEVJXRtOG4FbEm/uGbCRouA=="],
+
+ "micromark-util-sanitize-uri": ["micromark-util-sanitize-uri@1.2.0", "", { "dependencies": { "micromark-util-character": "^1.0.0", "micromark-util-encode": "^1.0.0", "micromark-util-symbol": "^1.0.0" } }, "sha512-QO4GXv0XZfWey4pYFndLUKEAktKkG5kZTdUNaTAkzbuJxn2tNBOr+QtxR2XpWaMhbImT2dPzyLrPXLlPhph34A=="],
+
+ "micromark-util-subtokenize": ["micromark-util-subtokenize@1.1.0", "", { "dependencies": { "micromark-util-chunked": "^1.0.0", "micromark-util-symbol": "^1.0.0", "micromark-util-types": "^1.0.0", "uvu": "^0.5.0" } }, "sha512-kUQHyzRoxvZO2PuLzMt2P/dwVsTiivCK8icYTeR+3WgbuPqfHgPPy7nFKbeqRivBvn/3N3GBiNC+JRTMSxEC7A=="],
+
+ "micromark-util-symbol": ["micromark-util-symbol@1.1.0", "", {}, "sha512-uEjpEYY6KMs1g7QfJ2eX1SQEV+ZT4rUD3UcF6l57acZvLNK7PBZL+ty82Z1qhK1/yXIY4bdx04FKMgR0g4IAag=="],
+
+ "micromark-util-types": ["micromark-util-types@1.1.0", "", {}, "sha512-ukRBgie8TIAcacscVHSiddHjO4k/q3pnedmzMQ4iwDcK0FtFCohKOlFbaOL/mPgfnPsL3C1ZyxJa4sbWrBl3jg=="],
+
+ "micromatch": ["micromatch@4.0.8", "", { "dependencies": { "braces": "^3.0.3", "picomatch": "^2.3.1" } }, "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA=="],
+
+ "mime": ["mime@2.6.0", "", { "bin": { "mime": "cli.js" } }, "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg=="],
+
+ "mime-db": ["mime-db@1.52.0", "", {}, "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg=="],
+
+ "mime-types": ["mime-types@2.1.35", "", { "dependencies": { "mime-db": "1.52.0" } }, "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw=="],
+
+ "mimic-fn": ["mimic-fn@4.0.0", "", {}, "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw=="],
+
+ "mimic-function": ["mimic-function@5.0.1", "", {}, "sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA=="],
+
+ "mimic-response": ["mimic-response@4.0.0", "", {}, "sha512-e5ISH9xMYU0DzrT+jl8q2ze9D6eWBto+I8CNpe+VI+K2J/F/k3PdkdTdz4wvGVH4NTpo+NRYTVIuMQEMMcsLqg=="],
+
+ "minimatch": ["minimatch@3.1.2", "", { "dependencies": { "brace-expansion": "^1.1.7" } }, "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw=="],
+
+ "minimist": ["minimist@1.2.8", "", {}, "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA=="],
+
+ "minipass": ["minipass@4.2.8", "", {}, "sha512-fNzuVyifolSLFL4NzpF+wEF4qrgqaaKX0haXPQEdQ7NKAN+WecoKMHV09YcuL/DHxrUsYQOK3MiuDf7Ip2OXfQ=="],
+
+ "mkdirp": ["mkdirp@3.0.1", "", { "bin": { "mkdirp": "dist/cjs/src/bin.js" } }, "sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg=="],
+
+ "mnemonist": ["mnemonist@0.39.6", "", { "dependencies": { "obliterator": "^2.0.1" } }, "sha512-A/0v5Z59y63US00cRSLiloEIw3t5G+MiKz4BhX21FI+YBJXBOGW0ohFxTxO08dsOYlzxo87T7vGfZKYp2bcAWA=="],
+
+ "motion-dom": ["motion-dom@11.18.1", "", { "dependencies": { "motion-utils": "^11.18.1" } }, "sha512-g76KvA001z+atjfxczdRtw/RXOM3OMSdd1f4DL77qCTF/+avrRJiawSG4yDibEQ215sr9kpinSlX2pCTJ9zbhw=="],
+
+ "motion-utils": ["motion-utils@11.18.1", "", {}, "sha512-49Kt+HKjtbJKLtgO/LKj9Ld+6vw9BjH5d9sc40R/kVyH8GLAXgT42M2NnuPcJNuA3s9ZfZBUcwIgpmZWGEE+hA=="],
+
+ "mri": ["mri@1.2.0", "", {}, "sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA=="],
+
+ "ms": ["ms@2.1.3", "", {}, "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="],
+
+ "multer": ["multer@1.4.4-lts.1", "", { "dependencies": { "append-field": "^1.0.0", "busboy": "^1.0.0", "concat-stream": "^1.5.2", "mkdirp": "^0.5.4", "object-assign": "^4.1.1", "type-is": "^1.6.4", "xtend": "^4.0.0" } }, "sha512-WeSGziVj6+Z2/MwQo3GvqzgR+9Uc+qt8SwHKh3gvNPiISKfsMfG4SvCOFYlxxgkXt7yIV2i1yczehm0EOKIxIg=="],
+
+ "mute-stream": ["mute-stream@1.0.0", "", {}, "sha512-avsJQhyd+680gKXyG/sQc0nXaC6rBkPOfyHYcFb9+hdkqQkR9bdnkJ0AMZhke0oesPqIO+mFFJ+IdBc7mst4IA=="],
+
+ "mz": ["mz@2.7.0", "", { "dependencies": { "any-promise": "^1.0.0", "object-assign": "^4.0.1", "thenify-all": "^1.0.0" } }, "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q=="],
+
+ "nanoid": ["nanoid@3.3.11", "", { "bin": { "nanoid": "bin/nanoid.cjs" } }, "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w=="],
+
+ "napi-postinstall": ["napi-postinstall@0.3.4", "", { "bin": { "napi-postinstall": "lib/cli.js" } }, "sha512-PHI5f1O0EP5xJ9gQmFGMS6IZcrVvTjpXjz7Na41gTE7eE2hK11lg04CECCYEEjdc17EV4DO+fkGEtt7TpTaTiQ=="],
+
+ "natural-compare": ["natural-compare@1.4.0", "", {}, "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw=="],
+
+ "negotiator": ["negotiator@0.6.3", "", {}, "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg=="],
+
+ "neo-async": ["neo-async@2.6.2", "", {}, "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw=="],
+
+ "nestjs-trpc": ["nestjs-trpc@workspace:packages/nestjs-trpc"],
+
+ "nestjs-trpc.io": ["nestjs-trpc.io@workspace:docs"],
+
+ "netmask": ["netmask@2.0.2", "", {}, "sha512-dBpDMdxv9Irdq66304OLfEmQ9tbNRFnFTuZiLo+bD+r332bBmMJ8GBLXklIXXgxd3+v9+KUnZaUR5PJMa75Gsg=="],
+
+ "new-github-release-url": ["new-github-release-url@2.0.0", "", { "dependencies": { "type-fest": "^2.5.1" } }, "sha512-NHDDGYudnvRutt/VhKFlX26IotXe1w0cmkDm6JGquh5bz/bDTw0LufSmH/GxTjEdpHEO+bVKFTwdrcGa/9XlKQ=="],
+
+ "next": ["next@14.2.4", "", { "dependencies": { "@next/env": "14.2.4", "@swc/helpers": "0.5.5", "busboy": "1.6.0", "caniuse-lite": "^1.0.30001579", "graceful-fs": "^4.2.11", "postcss": "8.4.31", "styled-jsx": "5.1.1" }, "optionalDependencies": { "@next/swc-darwin-arm64": "14.2.4", "@next/swc-darwin-x64": "14.2.4", "@next/swc-linux-arm64-gnu": "14.2.4", "@next/swc-linux-arm64-musl": "14.2.4", "@next/swc-linux-x64-gnu": "14.2.4", "@next/swc-linux-x64-musl": "14.2.4", "@next/swc-win32-arm64-msvc": "14.2.4", "@next/swc-win32-ia32-msvc": "14.2.4", "@next/swc-win32-x64-msvc": "14.2.4" }, "peerDependencies": { "@opentelemetry/api": "^1.1.0", "@playwright/test": "^1.41.2", "react": "^18.2.0", "react-dom": "^18.2.0", "sass": "^1.3.0" }, "optionalPeers": ["@opentelemetry/api", "@playwright/test", "sass"], "bin": { "next": "dist/bin/next" } }, "sha512-R8/V7vugY+822rsQGQCjoLhMuC9oFj9SOi4Cl4b2wjDrseD0LRZ10W7R6Czo4w9ZznVSshKjuIomsRjvm9EKJQ=="],
+
+ "next-mdx-remote": ["next-mdx-remote@4.4.1", "", { "dependencies": { "@mdx-js/mdx": "^2.2.1", "@mdx-js/react": "^2.2.1", "vfile": "^5.3.0", "vfile-matter": "^3.0.1" }, "peerDependencies": { "react": ">=16.x <=18.x", "react-dom": ">=16.x <=18.x" } }, "sha512-1BvyXaIou6xy3XoNF4yaMZUCb6vD2GTAa5ciOa6WoO+gAUTYsb1K4rI/HSC2ogAWLrb/7VSV52skz07vOzmqIQ=="],
+
+ "next-seo": ["next-seo@6.8.0", "", { "peerDependencies": { "next": "^8.1.1-canary.54 || >=9.0.0", "react": ">=16.0.0", "react-dom": ">=16.0.0" } }, "sha512-zcxaV67PFXCSf8e6SXxbxPaOTgc8St/esxfsYXfQXMM24UESUVSXFm7f2A9HMkAwa0Gqn4s64HxYZAGfdF4Vhg=="],
+
+ "next-sitemap": ["next-sitemap@4.2.3", "", { "dependencies": { "@corex/deepmerge": "^4.0.43", "@next/env": "^13.4.3", "fast-glob": "^3.2.12", "minimist": "^1.2.8" }, "peerDependencies": { "next": "*" }, "bin": { "next-sitemap": "bin/next-sitemap.mjs", "next-sitemap-cjs": "bin/next-sitemap.cjs" } }, "sha512-vjdCxeDuWDzldhCnyFCQipw5bfpl4HmZA7uoo3GAaYGjGgfL4Cxb1CiztPuWGmS+auYs7/8OekRS8C2cjdAsjQ=="],
+
+ "next-themes": ["next-themes@0.2.1", "", { "peerDependencies": { "next": "*", "react": "*", "react-dom": "*" } }, "sha512-B+AKNfYNIzh0vqQQKqQItTS8evEouKD7H5Hj3kmuPERwddR2TxvDSFZuTj6T7Jfn1oyeUyJMydPl1Bkxkh0W7A=="],
+
+ "nextra": ["nextra@2.13.4", "", { "dependencies": { "@headlessui/react": "^1.7.17", "@mdx-js/mdx": "^2.3.0", "@mdx-js/react": "^2.3.0", "@napi-rs/simple-git": "^0.1.9", "@theguild/remark-mermaid": "^0.0.5", "@theguild/remark-npm2yarn": "^0.2.0", "clsx": "^2.0.0", "github-slugger": "^2.0.0", "graceful-fs": "^4.2.11", "gray-matter": "^4.0.3", "katex": "^0.16.9", "lodash.get": "^4.4.2", "next-mdx-remote": "^4.2.1", "p-limit": "^3.1.0", "rehype-katex": "^7.0.0", "rehype-pretty-code": "0.9.11", "rehype-raw": "^7.0.0", "remark-gfm": "^3.0.1", "remark-math": "^5.1.1", "remark-reading-time": "^2.0.1", "shiki": "^0.14.3", "slash": "^3.0.0", "title": "^3.5.3", "unist-util-remove": "^4.0.0", "unist-util-visit": "^5.0.0", "zod": "^3.22.3" }, "peerDependencies": { "next": ">=9.5.3", "react": ">=16.13.1", "react-dom": ">=16.13.1" } }, "sha512-7of2rSBxuUa3+lbMmZwG9cqgftcoNOVQLTT6Rxf3EhBR9t1EI7b43dted8YoqSNaigdE3j1CoyNkX8N/ZzlEpw=="],
+
+ "nextra-theme-docs": ["nextra-theme-docs@2.13.4", "", { "dependencies": { "@headlessui/react": "^1.7.17", "@popperjs/core": "^2.11.8", "clsx": "^2.0.0", "escape-string-regexp": "^5.0.0", "flexsearch": "^0.7.31", "focus-visible": "^5.2.0", "git-url-parse": "^13.1.0", "intersection-observer": "^0.12.2", "match-sorter": "^6.3.1", "next-seo": "^6.0.0", "next-themes": "^0.2.1", "scroll-into-view-if-needed": "^3.1.0", "zod": "^3.22.3" }, "peerDependencies": { "next": ">=9.5.3", "nextra": "2.13.4", "react": ">=16.13.1", "react-dom": ">=16.13.1" } }, "sha512-2XOoMfwBCTYBt8ds4ZHftt9Wyf2XsykiNo02eir/XEYB+sGeUoE77kzqfidjEOKCSzOHYbK9BDMcg2+B/2vYRw=="],
+
+ "no-case": ["no-case@3.0.4", "", { "dependencies": { "lower-case": "^2.0.2", "tslib": "^2.0.3" } }, "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg=="],
+
+ "node-abort-controller": ["node-abort-controller@3.1.1", "", {}, "sha512-AGK2yQKIjRuqnc6VkX2Xj5d+QW8xZ87pa1UK6yA6ouUyuxfHuMP6umE5QK7UmTeOAymo+Zx1Fxiuw9rVx8taHQ=="],
+
+ "node-domexception": ["node-domexception@1.0.0", "", {}, "sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ=="],
+
+ "node-emoji": ["node-emoji@1.11.0", "", { "dependencies": { "lodash": "^4.17.21" } }, "sha512-wo2DpQkQp7Sjm2A0cq+sN7EHKO6Sl0ctXeBdFZrL9T9+UywORbufTcTZxom8YqpLQt/FqNMUkOpkZrJVYSKD3A=="],
+
+ "node-fetch": ["node-fetch@3.3.2", "", { "dependencies": { "data-uri-to-buffer": "^4.0.0", "fetch-blob": "^3.1.4", "formdata-polyfill": "^4.0.10" } }, "sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA=="],
+
+ "node-int64": ["node-int64@0.4.0", "", {}, "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw=="],
+
+ "node-releases": ["node-releases@2.0.27", "", {}, "sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA=="],
+
+ "non-layered-tidy-tree-layout": ["non-layered-tidy-tree-layout@2.0.2", "", {}, "sha512-gkXMxRzUH+PB0ax9dUN0yYF0S25BqeAYqhgMaLUFmpXLEk7Fcu8f4emJuOAY0V8kjDICxROIKsTAKsV/v355xw=="],
+
+ "normalize-package-data": ["normalize-package-data@6.0.2", "", { "dependencies": { "hosted-git-info": "^7.0.0", "semver": "^7.3.5", "validate-npm-package-license": "^3.0.4" } }, "sha512-V6gygoYb/5EmNI+MEGrWkC+e6+Rr7mTmfHrxDbLzxQogBkgzo76rkok0Am6thgSF7Mv2nLOajAJj5vDJZEFn7g=="],
+
+ "normalize-path": ["normalize-path@3.0.0", "", {}, "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA=="],
+
+ "normalize-range": ["normalize-range@0.1.2", "", {}, "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA=="],
+
+ "normalize-url": ["normalize-url@8.1.1", "", {}, "sha512-JYc0DPlpGWB40kH5g07gGTrYuMqV653k3uBKY6uITPWds3M0ov3GaWGp9lbE3Bzngx8+XkfzgvASb9vk9JDFXQ=="],
+
+ "npm-run-path": ["npm-run-path@5.3.0", "", { "dependencies": { "path-key": "^4.0.0" } }, "sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ=="],
+
+ "npm-to-yarn": ["npm-to-yarn@2.2.1", "", {}, "sha512-O/j/ROyX0KGLG7O6Ieut/seQ0oiTpHF2tXAcFbpdTLQFiaNtkyTXXocM1fwpaa60dg1qpWj0nHlbNhx6qwuENQ=="],
+
+ "nth-check": ["nth-check@2.1.1", "", { "dependencies": { "boolbase": "^1.0.0" } }, "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w=="],
+
+ "object-assign": ["object-assign@4.1.1", "", {}, "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg=="],
+
+ "object-hash": ["object-hash@3.0.0", "", {}, "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw=="],
+
+ "object-inspect": ["object-inspect@1.13.4", "", {}, "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew=="],
+
+ "object-keys": ["object-keys@1.1.1", "", {}, "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA=="],
+
+ "object.assign": ["object.assign@4.1.7", "", { "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.3", "define-properties": "^1.2.1", "es-object-atoms": "^1.0.0", "has-symbols": "^1.1.0", "object-keys": "^1.1.1" } }, "sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw=="],
+
+ "object.entries": ["object.entries@1.1.9", "", { "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.4", "define-properties": "^1.2.1", "es-object-atoms": "^1.1.1" } }, "sha512-8u/hfXFRBD1O0hPUjioLhoWFHRmt6tKA4/vZPyckBr18l1KE9uHrFaFaUi8MDRTpi4uak2goyPTSNJLXX2k2Hw=="],
+
+ "object.fromentries": ["object.fromentries@2.0.8", "", { "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1", "es-abstract": "^1.23.2", "es-object-atoms": "^1.0.0" } }, "sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ=="],
+
+ "object.groupby": ["object.groupby@1.0.3", "", { "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1", "es-abstract": "^1.23.2" } }, "sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ=="],
+
+ "object.values": ["object.values@1.2.1", "", { "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.3", "define-properties": "^1.2.1", "es-object-atoms": "^1.0.0" } }, "sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA=="],
+
+ "obliterator": ["obliterator@2.0.5", "", {}, "sha512-42CPE9AhahZRsMNslczq0ctAEtqk8Eka26QofnqC346BZdHDySk3LWka23LI7ULIw11NmltpiLagIq8gBozxTw=="],
+
+ "on-exit-leak-free": ["on-exit-leak-free@2.1.2", "", {}, "sha512-0eJJY6hXLGf1udHwfNftBqH+g73EU4B504nZeKpz1sYRKafAghwxEJunB2O7rDZkL4PGfsMVnTXZ2EjibbqcsA=="],
+
+ "on-finished": ["on-finished@2.4.1", "", { "dependencies": { "ee-first": "1.1.1" } }, "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg=="],
+
+ "once": ["once@1.4.0", "", { "dependencies": { "wrappy": "1" } }, "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w=="],
+
+ "onetime": ["onetime@6.0.0", "", { "dependencies": { "mimic-fn": "^4.0.0" } }, "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ=="],
+
+ "open": ["open@10.0.3", "", { "dependencies": { "default-browser": "^5.2.1", "define-lazy-prop": "^3.0.0", "is-inside-container": "^1.0.0", "is-wsl": "^3.1.0" } }, "sha512-dtbI5oW7987hwC9qjJTyABldTaa19SuyJse1QboWv3b0qCcrrLNVDqBx1XgELAjh9QTVQaP/C5b1nhQebd1H2A=="],
+
+ "optionator": ["optionator@0.9.4", "", { "dependencies": { "deep-is": "^0.1.3", "fast-levenshtein": "^2.0.6", "levn": "^0.4.1", "prelude-ls": "^1.2.1", "type-check": "^0.4.0", "word-wrap": "^1.2.5" } }, "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g=="],
+
+ "ora": ["ora@5.4.1", "", { "dependencies": { "bl": "^4.1.0", "chalk": "^4.1.0", "cli-cursor": "^3.1.0", "cli-spinners": "^2.5.0", "is-interactive": "^1.0.0", "is-unicode-supported": "^0.1.0", "log-symbols": "^4.1.0", "strip-ansi": "^6.0.0", "wcwidth": "^1.0.1" } }, "sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ=="],
+
+ "os-filter-obj": ["os-filter-obj@2.0.0", "", { "dependencies": { "arch": "^2.1.0" } }, "sha512-uksVLsqG3pVdzzPvmAHpBK0wKxYItuzZr7SziusRPoz67tGV8rL1szZ6IdeUrbqLjGDwApBtN29eEE3IqGHOjg=="],
+
+ "os-name": ["os-name@4.0.1", "", { "dependencies": { "macos-release": "^2.5.0", "windows-release": "^4.0.0" } }, "sha512-xl9MAoU97MH1Xt5K9ERft2YfCAoaO6msy1OBA0ozxEC0x0TmIoE6K3QvgJMMZA9yKGLmHXNY/YZoDbiGDj4zYw=="],
+
+ "os-tmpdir": ["os-tmpdir@1.0.2", "", {}, "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g=="],
+
+ "own-keys": ["own-keys@1.0.1", "", { "dependencies": { "get-intrinsic": "^1.2.6", "object-keys": "^1.1.1", "safe-push-apply": "^1.0.0" } }, "sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg=="],
+
+ "p-cancelable": ["p-cancelable@3.0.0", "", {}, "sha512-mlVgR3PGuzlo0MmTdk4cXqXWlwQDLnONTAg6sm62XkMJEiRxN3GL3SffkYvqwonbkJBcrI7Uvv5Zh9yjvn2iUw=="],
+
+ "p-finally": ["p-finally@1.0.0", "", {}, "sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow=="],
+
+ "p-limit": ["p-limit@3.1.0", "", { "dependencies": { "yocto-queue": "^0.1.0" } }, "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ=="],
+
+ "p-locate": ["p-locate@5.0.0", "", { "dependencies": { "p-limit": "^3.0.2" } }, "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw=="],
+
+ "p-try": ["p-try@2.2.0", "", {}, "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ=="],
+
+ "pac-proxy-agent": ["pac-proxy-agent@7.2.0", "", { "dependencies": { "@tootallnate/quickjs-emscripten": "^0.23.0", "agent-base": "^7.1.2", "debug": "^4.3.4", "get-uri": "^6.0.1", "http-proxy-agent": "^7.0.0", "https-proxy-agent": "^7.0.6", "pac-resolver": "^7.0.1", "socks-proxy-agent": "^8.0.5" } }, "sha512-TEB8ESquiLMc0lV8vcd5Ql/JAKAoyzHFXaStwjkzpOpC5Yv+pIzLfHvjTSdf3vpa2bMiUQrg9i6276yn8666aA=="],
+
+ "pac-resolver": ["pac-resolver@7.0.1", "", { "dependencies": { "degenerator": "^5.0.0", "netmask": "^2.0.2" } }, "sha512-5NPgf87AT2STgwa2ntRMr45jTKrYBGkVU36yT0ig/n/GMAa3oPqhZfIQ2kMEimReg0+t9kZViDVZ83qfVUlckg=="],
+
+ "package-json": ["package-json@8.1.1", "", { "dependencies": { "got": "^12.1.0", "registry-auth-token": "^5.0.1", "registry-url": "^6.0.0", "semver": "^7.3.7" } }, "sha512-cbH9IAIJHNj9uXi196JVsRlt7cHKak6u/e6AkL/bkRelZ7rlL3X1YKxsZwa36xipOEKAsdtmaG6aAJoM1fx2zA=="],
+
+ "package-json-from-dist": ["package-json-from-dist@1.0.1", "", {}, "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw=="],
+
+ "parent-module": ["parent-module@1.0.1", "", { "dependencies": { "callsites": "^3.0.0" } }, "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g=="],
+
+ "parse-entities": ["parse-entities@4.0.2", "", { "dependencies": { "@types/unist": "^2.0.0", "character-entities-legacy": "^3.0.0", "character-reference-invalid": "^2.0.0", "decode-named-character-reference": "^1.0.0", "is-alphanumerical": "^2.0.0", "is-decimal": "^2.0.0", "is-hexadecimal": "^2.0.0" } }, "sha512-GG2AQYWoLgL877gQIKeRPGO1xF9+eG1ujIb5soS5gPvLQ1y2o8FL90w2QWNdf9I361Mpp7726c+lj3U0qK1uGw=="],
+
+ "parse-json": ["parse-json@5.2.0", "", { "dependencies": { "@babel/code-frame": "^7.0.0", "error-ex": "^1.3.1", "json-parse-even-better-errors": "^2.3.0", "lines-and-columns": "^1.1.6" } }, "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg=="],
+
+ "parse-numeric-range": ["parse-numeric-range@1.3.0", "", {}, "sha512-twN+njEipszzlMJd4ONUYgSfZPDxgHhT9Ahed5uTigpQn90FggW4SA/AIPq/6a149fTbE9qBEcSwE3FAEp6wQQ=="],
+
+ "parse-path": ["parse-path@7.1.0", "", { "dependencies": { "protocols": "^2.0.0" } }, "sha512-EuCycjZtfPcjWk7KTksnJ5xPMvWGA/6i4zrLYhRG0hGvC3GPU/jGUj3Cy+ZR0v30duV3e23R95T1lE2+lsndSw=="],
+
+ "parse-url": ["parse-url@8.1.0", "", { "dependencies": { "parse-path": "^7.0.0" } }, "sha512-xDvOoLU5XRrcOZvnI6b8zA6n9O9ejNk/GExuz1yBuWUGn9KA97GI6HTs6u02wKara1CeVmZhH+0TZFdWScR89w=="],
+
+ "parse5": ["parse5@7.3.0", "", { "dependencies": { "entities": "^6.0.0" } }, "sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw=="],
+
+ "parseurl": ["parseurl@1.3.3", "", {}, "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ=="],
+
+ "path": ["path@0.12.7", "", { "dependencies": { "process": "^0.11.1", "util": "^0.10.3" } }, "sha512-aXXC6s+1w7otVF9UletFkFcDsJeO7lSZBPUQhtb5O0xJe8LtYhj/GxldoL09bBj9+ZmE2hNoHqQSFMN5fikh4Q=="],
+
+ "path-browserify": ["path-browserify@1.0.1", "", {}, "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g=="],
+
+ "path-exists": ["path-exists@4.0.0", "", {}, "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w=="],
+
+ "path-is-absolute": ["path-is-absolute@1.0.1", "", {}, "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg=="],
+
+ "path-key": ["path-key@3.1.1", "", {}, "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q=="],
+
+ "path-parse": ["path-parse@1.0.7", "", {}, "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw=="],
+
+ "path-root": ["path-root@0.1.1", "", { "dependencies": { "path-root-regex": "^0.1.0" } }, "sha512-QLcPegTHF11axjfojBIoDygmS2E3Lf+8+jI6wOVmNVenrKSo3mFdSGiIgdSHenczw3wPtlVMQaFVwGmM7BJdtg=="],
+
+ "path-root-regex": ["path-root-regex@0.1.2", "", {}, "sha512-4GlJ6rZDhQZFE0DPVKh0e9jmZ5egZfxTkp7bcRDuPlJXbAwhxcl2dINPUAsjLdejqaLsCeg8axcLjIbvBjN4pQ=="],
+
+ "path-scurry": ["path-scurry@1.11.1", "", { "dependencies": { "lru-cache": "^10.2.0", "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" } }, "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA=="],
+
+ "path-to-regexp": ["path-to-regexp@3.2.0", "", {}, "sha512-jczvQbCUS7XmS7o+y1aEO9OBVFeZBQ1MDSEqmO7xSoPgOPoowY/SxLpZ6Vh97/8qHZOteiCKb7gkG9gA2ZUxJA=="],
+
+ "path-type": ["path-type@5.0.0", "", {}, "sha512-5HviZNaZcfqP95rwpv+1HDgUamezbqdSYTyzjTvwtJSnIH+3vnbmWsItli8OFEndS984VT55M3jduxZbX351gg=="],
+
+ "peek-readable": ["peek-readable@5.4.2", "", {}, "sha512-peBp3qZyuS6cNIJ2akRNG1uo1WJ1d0wTxg/fxMdZ0BqCVhx242bSFHM9eNqflfJVS9SsgkzgT/1UgnsurBOTMg=="],
+
+ "periscopic": ["periscopic@3.1.0", "", { "dependencies": { "@types/estree": "^1.0.0", "estree-walker": "^3.0.0", "is-reference": "^3.0.0" } }, "sha512-vKiQ8RRtkl9P+r/+oefh25C3fhybptkHKCZSPlcXiJux2tJF55GnEj3BVn4A5gKfq9NWWXXrxkHBwVPUfH0opw=="],
+
+ "picocolors": ["picocolors@1.1.1", "", {}, "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA=="],
+
+ "picomatch": ["picomatch@2.3.1", "", {}, "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA=="],
+
+ "pidtree": ["pidtree@0.6.0", "", { "bin": { "pidtree": "bin/pidtree.js" } }, "sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g=="],
+
+ "pify": ["pify@2.3.0", "", {}, "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog=="],
+
+ "pino": ["pino@10.2.1", "", { "dependencies": { "@pinojs/redact": "^0.4.0", "atomic-sleep": "^1.0.0", "on-exit-leak-free": "^2.1.0", "pino-abstract-transport": "^3.0.0", "pino-std-serializers": "^7.0.0", "process-warning": "^5.0.0", "quick-format-unescaped": "^4.0.3", "real-require": "^0.2.0", "safe-stable-stringify": "^2.3.1", "sonic-boom": "^4.0.1", "thread-stream": "^4.0.0" }, "bin": { "pino": "bin.js" } }, "sha512-Tjyv76gdUe2460dEhtcnA4fU/+HhGq2Kr7OWlo2R/Xxbmn/ZNKWavNWTD2k97IE+s755iVU7WcaOEIl+H3cq8w=="],
+
+ "pino-abstract-transport": ["pino-abstract-transport@3.0.0", "", { "dependencies": { "split2": "^4.0.0" } }, "sha512-wlfUczU+n7Hy/Ha5j9a/gZNy7We5+cXp8YL+X+PG8S0KXxw7n/JXA3c46Y0zQznIJ83URJiwy7Lh56WLokNuxg=="],
+
+ "pino-std-serializers": ["pino-std-serializers@7.1.0", "", {}, "sha512-BndPH67/JxGExRgiX1dX0w1FvZck5Wa4aal9198SrRhZjH3GxKQUKIBnYJTdj2HDN3UQAS06HlfcSbQj2OHmaw=="],
+
+ "pinst": ["pinst@3.0.0", "", { "bin": { "pinst": "bin.js" } }, "sha512-cengSmBxtCyaJqtRSvJorIIZXMXg+lJ3sIljGmtBGUVonMnMsVJbnzl6jGN1HkOWwxNuJynCJ2hXxxqCQrFDdw=="],
+
+ "pirates": ["pirates@4.0.7", "", {}, "sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA=="],
+
+ "piscina": ["piscina@4.9.2", "", { "optionalDependencies": { "@napi-rs/nice": "^1.0.1" } }, "sha512-Fq0FERJWFEUpB4eSY59wSNwXD4RYqR+nR/WiEVcZW8IWfVBxJJafcgTEZDQo8k3w0sUarJ8RyVbbUF4GQ2LGbQ=="],
+
+ "pkg-dir": ["pkg-dir@4.2.0", "", { "dependencies": { "find-up": "^4.0.0" } }, "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ=="],
+
+ "pluralize": ["pluralize@8.0.0", "", {}, "sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA=="],
+
+ "possible-typed-array-names": ["possible-typed-array-names@1.1.0", "", {}, "sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg=="],
+
+ "postcss": ["postcss@8.5.6", "", { "dependencies": { "nanoid": "^3.3.11", "picocolors": "^1.1.1", "source-map-js": "^1.2.1" } }, "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg=="],
+
+ "postcss-import": ["postcss-import@15.1.0", "", { "dependencies": { "postcss-value-parser": "^4.0.0", "read-cache": "^1.0.0", "resolve": "^1.1.7" }, "peerDependencies": { "postcss": "^8.0.0" } }, "sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew=="],
+
+ "postcss-js": ["postcss-js@4.1.0", "", { "dependencies": { "camelcase-css": "^2.0.1" }, "peerDependencies": { "postcss": "^8.4.21" } }, "sha512-oIAOTqgIo7q2EOwbhb8UalYePMvYoIeRY2YKntdpFQXNosSu3vLrniGgmH9OKs/qAkfoj5oB3le/7mINW1LCfw=="],
+
+ "postcss-load-config": ["postcss-load-config@6.0.1", "", { "dependencies": { "lilconfig": "^3.1.1" }, "peerDependencies": { "jiti": ">=1.21.0", "postcss": ">=8.0.9", "tsx": "^4.8.1", "yaml": "^2.4.2" }, "optionalPeers": ["jiti", "postcss", "tsx", "yaml"] }, "sha512-oPtTM4oerL+UXmx+93ytZVN82RrlY/wPUV8IeDxFrzIjXOLF1pN+EmKPLbubvKHT2HC20xXsCAH2Z+CKV6Oz/g=="],
+
+ "postcss-nested": ["postcss-nested@6.2.0", "", { "dependencies": { "postcss-selector-parser": "^6.1.1" }, "peerDependencies": { "postcss": "^8.2.14" } }, "sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ=="],
+
+ "postcss-selector-parser": ["postcss-selector-parser@6.1.2", "", { "dependencies": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" } }, "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg=="],
+
+ "postcss-value-parser": ["postcss-value-parser@4.2.0", "", {}, "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ=="],
+
+ "prelude-ls": ["prelude-ls@1.2.1", "", {}, "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g=="],
+
+ "prettier": ["prettier@3.8.0", "", { "bin": { "prettier": "bin/prettier.cjs" } }, "sha512-yEPsovQfpxYfgWNhCfECjG5AQaO+K3dp6XERmOepyPDVqcJm+bjyCVO3pmU+nAPe0N5dDvekfGezt/EIiRe1TA=="],
+
+ "prettier-linter-helpers": ["prettier-linter-helpers@1.0.1", "", { "dependencies": { "fast-diff": "^1.1.2" } }, "sha512-SxToR7P8Y2lWmv/kTzVLC1t/GDI2WGjMwNhLLE9qtH8Q13C+aEmuRlzDst4Up4s0Wc8sF2M+J57iB3cMLqftfg=="],
+
+ "pretty-format": ["pretty-format@29.7.0", "", { "dependencies": { "@jest/schemas": "^29.6.3", "ansi-styles": "^5.0.0", "react-is": "^18.0.0" } }, "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ=="],
+
+ "process": ["process@0.11.10", "", {}, "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A=="],
+
+ "process-nextick-args": ["process-nextick-args@2.0.1", "", {}, "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag=="],
+
+ "process-warning": ["process-warning@5.0.0", "", {}, "sha512-a39t9ApHNx2L4+HBnQKqxxHNs1r7KF+Intd8Q/g1bUh6q0WIp9voPXJ/x0j+ZL45KF1pJd9+q2jLIRMfvEshkA=="],
+
+ "promise.allsettled": ["promise.allsettled@1.0.7", "", { "dependencies": { "array.prototype.map": "^1.0.5", "call-bind": "^1.0.2", "define-properties": "^1.2.0", "es-abstract": "^1.22.1", "get-intrinsic": "^1.2.1", "iterate-value": "^1.0.2" } }, "sha512-hezvKvQQmsFkOdrZfYxUxkyxl8mgFQeT259Ajj9PXdbg9VzBCWrItOev72JyWxkCD5VSSqAeHmlN3tWx4DlmsA=="],
+
+ "prompts": ["prompts@2.4.2", "", { "dependencies": { "kleur": "^3.0.3", "sisteransi": "^1.0.5" } }, "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q=="],
+
+ "prop-types": ["prop-types@15.8.1", "", { "dependencies": { "loose-envify": "^1.4.0", "object-assign": "^4.1.1", "react-is": "^16.13.1" } }, "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg=="],
+
+ "property-information": ["property-information@6.5.0", "", {}, "sha512-PgTgs/BlvHxOu8QuEN7wi5A0OmXaBcHpmCSTehcs6Uuu9IkDIEo13Hy7n898RHfrQ49vKCoGeWZSaAK01nwVig=="],
+
+ "proto-list": ["proto-list@1.2.4", "", {}, "sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA=="],
+
+ "protocols": ["protocols@2.0.2", "", {}, "sha512-hHVTzba3wboROl0/aWRRG9dMytgH6ow//STBZh43l/wQgmMhYhOFi0EHWAPtoCz9IAUymsyP0TSBHkhgMEGNnQ=="],
+
+ "proxy-addr": ["proxy-addr@2.0.7", "", { "dependencies": { "forwarded": "0.2.0", "ipaddr.js": "1.9.1" } }, "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg=="],
+
+ "proxy-agent": ["proxy-agent@6.4.0", "", { "dependencies": { "agent-base": "^7.0.2", "debug": "^4.3.4", "http-proxy-agent": "^7.0.1", "https-proxy-agent": "^7.0.3", "lru-cache": "^7.14.1", "pac-proxy-agent": "^7.0.1", "proxy-from-env": "^1.1.0", "socks-proxy-agent": "^8.0.2" } }, "sha512-u0piLU+nCOHMgGjRbimiXmA9kM/L9EHh3zL81xCdp7m+Y2pHIsnmbdDoEDoAz5geaonNR6q6+yOPQs6n4T6sBQ=="],
+
+ "proxy-from-env": ["proxy-from-env@1.1.0", "", {}, "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg=="],
+
+ "pseudomap": ["pseudomap@1.0.2", "", {}, "sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ=="],
+
+ "pump": ["pump@3.0.3", "", { "dependencies": { "end-of-stream": "^1.1.0", "once": "^1.3.1" } }, "sha512-todwxLMY7/heScKmntwQG8CXVkWUOdYxIvY2s0VWAAMh/nd8SoYiRaKjlr7+iCs984f2P8zvrfWcDDYVb73NfA=="],
+
+ "punycode": ["punycode@1.4.1", "", {}, "sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ=="],
+
+ "pupa": ["pupa@3.3.0", "", { "dependencies": { "escape-goat": "^4.0.0" } }, "sha512-LjgDO2zPtoXP2wJpDjZrGdojii1uqO0cnwKoIoUzkfS98HDmbeiGmYiXo3lXeFlq2xvne1QFQhwYXSUCLKtEuA=="],
+
+ "pure-rand": ["pure-rand@6.1.0", "", {}, "sha512-bVWawvoZoBYpp6yIoQtQXHZjmz35RSVHnUOTefl8Vcjr8snTPY1wnpSPMWekcFwbxI6gtmT7rSYPFvz71ldiOA=="],
+
+ "qs": ["qs@6.14.1", "", { "dependencies": { "side-channel": "^1.1.0" } }, "sha512-4EK3+xJl8Ts67nLYNwqw/dsFVnCf+qR7RgXSK9jEEm9unao3njwMDdmsdvoKBKHzxd7tCYz5e5M+SnMjdtXGQQ=="],
+
+ "queue-microtask": ["queue-microtask@1.2.3", "", {}, "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A=="],
+
+ "quick-format-unescaped": ["quick-format-unescaped@4.0.4", "", {}, "sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg=="],
+
+ "quick-lru": ["quick-lru@5.1.1", "", {}, "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA=="],
+
+ "randombytes": ["randombytes@2.1.0", "", { "dependencies": { "safe-buffer": "^5.1.0" } }, "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ=="],
+
+ "range-parser": ["range-parser@1.2.1", "", {}, "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg=="],
+
+ "raw-body": ["raw-body@2.5.2", "", { "dependencies": { "bytes": "3.1.2", "http-errors": "2.0.0", "iconv-lite": "0.4.24", "unpipe": "1.0.0" } }, "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA=="],
+
+ "rc": ["rc@1.2.8", "", { "dependencies": { "deep-extend": "^0.6.0", "ini": "~1.3.0", "minimist": "^1.2.0", "strip-json-comments": "~2.0.1" }, "bin": { "rc": "./cli.js" } }, "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw=="],
+
+ "react": ["react@18.3.1", "", { "dependencies": { "loose-envify": "^1.1.0" } }, "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ=="],
+
+ "react-dom": ["react-dom@18.3.1", "", { "dependencies": { "loose-envify": "^1.1.0", "scheduler": "^0.23.2" }, "peerDependencies": { "react": "^18.3.1" } }, "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw=="],
+
+ "react-is": ["react-is@18.3.1", "", {}, "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg=="],
+
+ "read-cache": ["read-cache@1.0.0", "", { "dependencies": { "pify": "^2.3.0" } }, "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA=="],
+
+ "read-pkg": ["read-pkg@8.1.0", "", { "dependencies": { "@types/normalize-package-data": "^2.4.1", "normalize-package-data": "^6.0.0", "parse-json": "^7.0.0", "type-fest": "^4.2.0" } }, "sha512-PORM8AgzXeskHO/WEv312k9U03B8K9JSiWF/8N9sUuFjBa+9SF2u6K7VClzXwDXab51jCd8Nd36CNM+zR97ScQ=="],
+
+ "read-pkg-up": ["read-pkg-up@10.1.0", "", { "dependencies": { "find-up": "^6.3.0", "read-pkg": "^8.1.0", "type-fest": "^4.2.0" } }, "sha512-aNtBq4jR8NawpKJQldrQcSW9y/d+KWH4v24HWkHljOZ7H0av+YTGANBzRh9A5pw7v/bLVsLVPpOhJ7gHNVy8lA=="],
+
+ "readable-stream": ["readable-stream@3.6.2", "", { "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", "util-deprecate": "^1.0.1" } }, "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA=="],
+
+ "readable-web-to-node-stream": ["readable-web-to-node-stream@3.0.4", "", { "dependencies": { "readable-stream": "^4.7.0" } }, "sha512-9nX56alTf5bwXQ3ZDipHJhusu9NTQJ/CVPtb/XHAJCXihZeitfJvIRS4GqQ/mfIoOE3IelHMrpayVrosdHBuLw=="],
+
+ "readdirp": ["readdirp@3.6.0", "", { "dependencies": { "picomatch": "^2.2.1" } }, "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA=="],
+
+ "reading-time": ["reading-time@1.5.0", "", {}, "sha512-onYyVhBNr4CmAxFsKS7bz+uTLRakypIe4R+5A824vBSkQy/hB3fZepoVEf8OVAxzLvK+H/jm9TzpI3ETSm64Kg=="],
+
+ "real-require": ["real-require@0.2.0", "", {}, "sha512-57frrGM/OCTLqLOAh0mhVA9VBMHd+9U7Zb2THMGdBUoZVOtGbJzjxsYGDJ3A9AYYCP4hn6y1TVbaOfzWtm5GFg=="],
+
+ "rechoir": ["rechoir@0.6.2", "", { "dependencies": { "resolve": "^1.1.6" } }, "sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw=="],
+
+ "reflect-metadata": ["reflect-metadata@0.1.14", "", {}, "sha512-ZhYeb6nRaXCfhnndflDK8qI6ZQ/YcWZCISRAWICW9XYqMUwjZM9Z0DveWX/ABN01oxSHwVxKQmxeYZSsm0jh5A=="],
+
+ "reflect.getprototypeof": ["reflect.getprototypeof@1.0.10", "", { "dependencies": { "call-bind": "^1.0.8", "define-properties": "^1.2.1", "es-abstract": "^1.23.9", "es-errors": "^1.3.0", "es-object-atoms": "^1.0.0", "get-intrinsic": "^1.2.7", "get-proto": "^1.0.1", "which-builtin-type": "^1.2.1" } }, "sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw=="],
+
+ "regenerate": ["regenerate@1.4.2", "", {}, "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A=="],
+
+ "regenerate-unicode-properties": ["regenerate-unicode-properties@10.2.2", "", { "dependencies": { "regenerate": "^1.4.2" } }, "sha512-m03P+zhBeQd1RGnYxrGyDAPpWX/epKirLrp8e3qevZdVkKtnCrjjWczIbYc8+xd6vcTStVlqfycTx1KR4LOr0g=="],
+
+ "regexp.prototype.flags": ["regexp.prototype.flags@1.5.4", "", { "dependencies": { "call-bind": "^1.0.8", "define-properties": "^1.2.1", "es-errors": "^1.3.0", "get-proto": "^1.0.1", "gopd": "^1.2.0", "set-function-name": "^2.0.2" } }, "sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA=="],
+
+ "regexpu-core": ["regexpu-core@6.4.0", "", { "dependencies": { "regenerate": "^1.4.2", "regenerate-unicode-properties": "^10.2.2", "regjsgen": "^0.8.0", "regjsparser": "^0.13.0", "unicode-match-property-ecmascript": "^2.0.0", "unicode-match-property-value-ecmascript": "^2.2.1" } }, "sha512-0ghuzq67LI9bLXpOX/ISfve/Mq33a4aFRzoQYhnnok1JOFpmE/A2TBGkNVenOGEeSBCjIiWcc6MVOG5HEQv0sA=="],
+
+ "registry-auth-token": ["registry-auth-token@5.1.1", "", { "dependencies": { "@pnpm/npm-conf": "^3.0.2" } }, "sha512-P7B4+jq8DeD2nMsAcdfaqHbssgHtZ7Z5+++a5ask90fvmJ8p5je4mOa+wzu+DB4vQ5tdJV/xywY+UnVFeQLV5Q=="],
+
+ "registry-url": ["registry-url@6.0.1", "", { "dependencies": { "rc": "1.2.8" } }, "sha512-+crtS5QjFRqFCoQmvGduwYWEBng99ZvmFvF+cUJkGYF1L1BfU8C6Zp9T7f5vPAwyLkUExpvK+ANVZmGU49qi4Q=="],
+
+ "regjsgen": ["regjsgen@0.8.0", "", {}, "sha512-RvwtGe3d7LvWiDQXeQw8p5asZUmfU1G/l6WbUXeHta7Y2PEIvBTwH6E2EfmYUK8pxcxEdEmaomqyp0vZZ7C+3Q=="],
+
+ "regjsparser": ["regjsparser@0.13.0", "", { "dependencies": { "jsesc": "~3.1.0" }, "bin": { "regjsparser": "bin/parser" } }, "sha512-NZQZdC5wOE/H3UT28fVGL+ikOZcEzfMGk/c3iN9UGxzWHMa1op7274oyiUVrAG4B2EuFhus8SvkaYnhvW92p9Q=="],
+
+ "rehype-katex": ["rehype-katex@7.0.1", "", { "dependencies": { "@types/hast": "^3.0.0", "@types/katex": "^0.16.0", "hast-util-from-html-isomorphic": "^2.0.0", "hast-util-to-text": "^4.0.0", "katex": "^0.16.0", "unist-util-visit-parents": "^6.0.0", "vfile": "^6.0.0" } }, "sha512-OiM2wrZ/wuhKkigASodFoo8wimG3H12LWQaH8qSPVJn9apWKFSH3YOCtbKpBorTVw/eI7cuT21XBbvwEswbIOA=="],
+
+ "rehype-pretty-code": ["rehype-pretty-code@0.9.11", "", { "dependencies": { "@types/hast": "^2.0.0", "hash-obj": "^4.0.0", "parse-numeric-range": "^1.3.0" }, "peerDependencies": { "shiki": "*" } }, "sha512-Eq90eCYXQJISktfRZ8PPtwc5SUyH6fJcxS8XOMnHPUQZBtC6RYo67gGlley9X2nR8vlniPj0/7oCDEYHKQa/oA=="],
+
+ "rehype-raw": ["rehype-raw@7.0.0", "", { "dependencies": { "@types/hast": "^3.0.0", "hast-util-raw": "^9.0.0", "vfile": "^6.0.0" } }, "sha512-/aE8hCfKlQeA8LmyeyQvQF3eBiLRGNlfBJEvWH7ivp9sBqs7TNqBL5X3v157rM4IFETqDnIOO+z5M/biZbo9Ww=="],
+
+ "release-it": ["release-it@17.1.1", "", { "dependencies": { "@iarna/toml": "2.2.5", "@octokit/rest": "20.0.2", "async-retry": "1.3.3", "chalk": "5.3.0", "cosmiconfig": "9.0.0", "execa": "8.0.1", "git-url-parse": "14.0.0", "globby": "14.0.1", "got": "13.0.0", "inquirer": "9.2.14", "is-ci": "3.0.1", "issue-parser": "6.0.0", "lodash": "4.17.21", "mime-types": "2.1.35", "new-github-release-url": "2.0.0", "node-fetch": "3.3.2", "open": "10.0.3", "ora": "8.0.1", "os-name": "5.1.0", "promise.allsettled": "1.0.7", "proxy-agent": "6.4.0", "semver": "7.6.0", "shelljs": "0.8.5", "update-notifier": "7.0.0", "url-join": "5.0.0", "wildcard-match": "5.1.2", "yargs-parser": "21.1.1" }, "bin": { "release-it": "bin/release-it.js" } }, "sha512-b+4Tu2eb5f2wIdIe5E9hre0evbMQrXp/kRq0natHsHYJVqu1Bd4/h2a+swFi0faGmC3cJdB16uYR6LscG9SchQ=="],
+
+ "remark-gfm": ["remark-gfm@3.0.1", "", { "dependencies": { "@types/mdast": "^3.0.0", "mdast-util-gfm": "^2.0.0", "micromark-extension-gfm": "^2.0.0", "unified": "^10.0.0" } }, "sha512-lEFDoi2PICJyNrACFOfDD3JlLkuSbOa5Wd8EPt06HUdptv8Gn0bxYTdbU/XXQ3swAPkEaGxxPN9cbnMHvVu1Ig=="],
+
+ "remark-math": ["remark-math@5.1.1", "", { "dependencies": { "@types/mdast": "^3.0.0", "mdast-util-math": "^2.0.0", "micromark-extension-math": "^2.0.0", "unified": "^10.0.0" } }, "sha512-cE5T2R/xLVtfFI4cCePtiRn+e6jKMtFDR3P8V3qpv8wpKjwvHoBA4eJzvX+nVrnlNy0911bdGmuspCSwetfYHw=="],
+
+ "remark-mdx": ["remark-mdx@2.3.0", "", { "dependencies": { "mdast-util-mdx": "^2.0.0", "micromark-extension-mdxjs": "^1.0.0" } }, "sha512-g53hMkpM0I98MU266IzDFMrTD980gNF3BJnkyFcmN+dD873mQeD5rdMO3Y2X+x8umQfbSE0PcoEDl7ledSA+2g=="],
+
+ "remark-parse": ["remark-parse@10.0.2", "", { "dependencies": { "@types/mdast": "^3.0.0", "mdast-util-from-markdown": "^1.0.0", "unified": "^10.0.0" } }, "sha512-3ydxgHa/ZQzG8LvC7jTXccARYDcRld3VfcgIIFs7bI6vbRSxJJmzgLEIIoYKyrfhaY+ujuWaf/PJiMZXoiCXgw=="],
+
+ "remark-reading-time": ["remark-reading-time@2.0.2", "", { "dependencies": { "estree-util-is-identifier-name": "^2.0.0", "estree-util-value-to-estree": "^3.3.3", "reading-time": "^1.3.0", "unist-util-visit": "^3.1.0" } }, "sha512-ILjIuR0dQQ8pELPgaFvz7ralcSN62rD/L1pTUJgWb4gfua3ZwYEI8mnKGxEQCbrXSUF/OvycTkcUbifGOtOn5A=="],
+
+ "remark-rehype": ["remark-rehype@10.1.0", "", { "dependencies": { "@types/hast": "^2.0.0", "@types/mdast": "^3.0.0", "mdast-util-to-hast": "^12.1.0", "unified": "^10.0.0" } }, "sha512-EFmR5zppdBp0WQeDVZ/b66CWJipB2q2VLNFMabzDSGR66Z2fQii83G5gTBbgGEnEEA0QRussvrFHxk1HWGJskw=="],
+
+ "remove-accents": ["remove-accents@0.5.0", "", {}, "sha512-8g3/Otx1eJaVD12e31UbJj1YzdtVvzH85HV7t+9MJYk/u3XmkOUJ5Ys9wQrf9PCPK8+xn4ymzqYCiZl6QWKn+A=="],
+
+ "repeat-string": ["repeat-string@1.6.1", "", {}, "sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w=="],
+
+ "require-directory": ["require-directory@2.1.1", "", {}, "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q=="],
+
+ "require-from-string": ["require-from-string@2.0.2", "", {}, "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw=="],
+
+ "resolve": ["resolve@1.22.11", "", { "dependencies": { "is-core-module": "^2.16.1", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, "bin": { "resolve": "bin/resolve" } }, "sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ=="],
+
+ "resolve-alpn": ["resolve-alpn@1.2.1", "", {}, "sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g=="],
+
+ "resolve-cwd": ["resolve-cwd@3.0.0", "", { "dependencies": { "resolve-from": "^5.0.0" } }, "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg=="],
+
+ "resolve-from": ["resolve-from@4.0.0", "", {}, "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g=="],
+
+ "resolve-package-path": ["resolve-package-path@3.1.0", "", { "dependencies": { "path-root": "^0.1.1", "resolve": "^1.17.0" } }, "sha512-2oC2EjWbMJwvSN6Z7DbDfJMnD8MYEouaLn5eIX0j8XwPsYCVIyY9bbnX88YHVkbr8XHqvZrYbxaLPibfTYKZMA=="],
+
+ "resolve-pkg-maps": ["resolve-pkg-maps@1.0.0", "", {}, "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw=="],
+
+ "resolve.exports": ["resolve.exports@2.0.3", "", {}, "sha512-OcXjMsGdhL4XnbShKpAcSqPMzQoYkYyhbEaeSko47MjRP9NfEQMhZkXL1DoFlt9LWQn4YttrdnV6X2OiyzBi+A=="],
+
+ "responselike": ["responselike@3.0.0", "", { "dependencies": { "lowercase-keys": "^3.0.0" } }, "sha512-40yHxbNcl2+rzXvZuVkrYohathsSJlMTXKryG5y8uciHv1+xDLHQpgjG64JUO9nrEq2jGLH6IZ8BcZyw3wrweg=="],
+
+ "restore-cursor": ["restore-cursor@3.1.0", "", { "dependencies": { "onetime": "^5.1.0", "signal-exit": "^3.0.2" } }, "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA=="],
+
+ "ret": ["ret@0.5.0", "", {}, "sha512-I1XxrZSQ+oErkRR4jYbAyEEu2I0avBvvMM5JN+6EBprOGRCs63ENqZ3vjavq8fBw2+62G5LF5XelKwuJpcvcxw=="],
+
+ "retry": ["retry@0.13.1", "", {}, "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg=="],
+
+ "reusify": ["reusify@1.1.0", "", {}, "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw=="],
+
+ "rfdc": ["rfdc@1.4.1", "", {}, "sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA=="],
+
+ "rimraf": ["rimraf@4.4.1", "", { "dependencies": { "glob": "^9.2.0" }, "bin": { "rimraf": "dist/cjs/src/bin.js" } }, "sha512-Gk8NlF062+T9CqNGn6h4tls3k6T1+/nXdOcSZVikNVtlRdYpA7wRJJMoXmuvOnLW844rPjdQ7JgXCYM6PPC/og=="],
+
+ "robust-predicates": ["robust-predicates@3.0.2", "", {}, "sha512-IXgzBWvWQwE6PrDI05OvmXUIruQTcoMDzRsOd5CDvHCVLcLHMTSYvOK5Cm46kWqlV3yAbuSpBZdJ5oP5OUoStg=="],
+
+ "run-applescript": ["run-applescript@7.1.0", "", {}, "sha512-DPe5pVFaAsinSaV6QjQ6gdiedWDcRCbUuiQfQa2wmWV7+xC9bGulGI8+TdRmoFkAPaBXk8CrAbnlY2ISniJ47Q=="],
+
+ "run-async": ["run-async@3.0.0", "", {}, "sha512-540WwVDOMxA6dN6We19EcT9sc3hkXPw5mzRNGM3FkdN/vtE9NFvj5lFAPNwUDmJjXidm3v7TC1cTE7t17Ulm1Q=="],
+
+ "run-parallel": ["run-parallel@1.2.0", "", { "dependencies": { "queue-microtask": "^1.2.2" } }, "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA=="],
+
+ "rw": ["rw@1.3.3", "", {}, "sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ=="],
+
+ "rxjs": ["rxjs@7.8.2", "", { "dependencies": { "tslib": "^2.1.0" } }, "sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA=="],
+
+ "sade": ["sade@1.8.1", "", { "dependencies": { "mri": "^1.1.0" } }, "sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A=="],
+
+ "safe-array-concat": ["safe-array-concat@1.1.3", "", { "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.2", "get-intrinsic": "^1.2.6", "has-symbols": "^1.1.0", "isarray": "^2.0.5" } }, "sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q=="],
+
+ "safe-buffer": ["safe-buffer@5.2.1", "", {}, "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ=="],
+
+ "safe-push-apply": ["safe-push-apply@1.0.0", "", { "dependencies": { "es-errors": "^1.3.0", "isarray": "^2.0.5" } }, "sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA=="],
+
+ "safe-regex-test": ["safe-regex-test@1.1.0", "", { "dependencies": { "call-bound": "^1.0.2", "es-errors": "^1.3.0", "is-regex": "^1.2.1" } }, "sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw=="],
+
+ "safe-regex2": ["safe-regex2@5.0.0", "", { "dependencies": { "ret": "~0.5.0" } }, "sha512-YwJwe5a51WlK7KbOJREPdjNrpViQBI3p4T50lfwPuDhZnE3XGVTlGvi+aolc5+RvxDD6bnUmjVsU9n1eboLUYw=="],
+
+ "safe-stable-stringify": ["safe-stable-stringify@2.5.0", "", {}, "sha512-b3rppTKm9T+PsVCBEOUR46GWI7fdOs00VKZ1+9c1EWDaDMvjQc6tUwuFyIprgGgTcWoVHSKrU8H31ZHA2e0RHA=="],
+
+ "safer-buffer": ["safer-buffer@2.1.2", "", {}, "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="],
+
+ "scheduler": ["scheduler@0.23.2", "", { "dependencies": { "loose-envify": "^1.1.0" } }, "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ=="],
+
+ "schema-utils": ["schema-utils@3.3.0", "", { "dependencies": { "@types/json-schema": "^7.0.8", "ajv": "^6.12.5", "ajv-keywords": "^3.5.2" } }, "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg=="],
+
+ "scroll-into-view-if-needed": ["scroll-into-view-if-needed@3.1.0", "", { "dependencies": { "compute-scroll-into-view": "^3.0.2" } }, "sha512-49oNpRjWRvnU8NyGVmUaYG4jtTkNonFZI86MmGRDqBphEK2EXT9gdEUoQPZhuBM8yWHxCWbobltqYO5M4XrUvQ=="],
+
+ "section-matter": ["section-matter@1.0.0", "", { "dependencies": { "extend-shallow": "^2.0.1", "kind-of": "^6.0.0" } }, "sha512-vfD3pmTzGpufjScBh50YHKzEu2lxBWhVEHsNGoEXmCmn2hKGfeNLYMzCJpe8cD7gqX7TJluOVpBkAequ6dgMmA=="],
+
+ "secure-json-parse": ["secure-json-parse@4.1.0", "", {}, "sha512-l4KnYfEyqYJxDwlNVyRfO2E4NTHfMKAWdUuA8J0yve2Dz/E/PdBepY03RvyJpssIpRFwJoCD55wA+mEDs6ByWA=="],
+
+ "semver": ["semver@7.7.3", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q=="],
+
+ "semver-diff": ["semver-diff@4.0.0", "", { "dependencies": { "semver": "^7.3.5" } }, "sha512-0Ju4+6A8iOnpL/Thra7dZsSlOHYAHIeMxfhWQRI1/VLcT3WDBZKKtQt/QkBOsiIN9ZpuvHE6cGZ0x4glCMmfiA=="],
+
+ "semver-regex": ["semver-regex@4.0.5", "", {}, "sha512-hunMQrEy1T6Jr2uEVjrAIqjwWcQTgOAcIM52C8MY1EZSD3DDNft04XzvYKPqjED65bNVVko0YI38nYeEHCX3yw=="],
+
+ "semver-truncate": ["semver-truncate@3.0.0", "", { "dependencies": { "semver": "^7.3.5" } }, "sha512-LJWA9kSvMolR51oDE6PN3kALBNaUdkxzAGcexw8gjMA8xr5zUqK0JiR3CgARSqanYF3Z1YHvsErb1KDgh+v7Rg=="],
+
+ "send": ["send@0.18.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" } }, "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg=="],
+
+ "serialize-javascript": ["serialize-javascript@6.0.2", "", { "dependencies": { "randombytes": "^2.1.0" } }, "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g=="],
+
+ "serve-static": ["serve-static@1.15.0", "", { "dependencies": { "encodeurl": "~1.0.2", "escape-html": "~1.0.3", "parseurl": "~1.3.3", "send": "0.18.0" } }, "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g=="],
+
+ "set-cookie-parser": ["set-cookie-parser@2.7.2", "", {}, "sha512-oeM1lpU/UvhTxw+g3cIfxXHyJRc/uidd3yK1P242gzHds0udQBYzs3y8j4gCCW+ZJ7ad0yctld8RYO+bdurlvw=="],
+
+ "set-function-length": ["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" } }, "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg=="],
+
+ "set-function-name": ["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" } }, "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ=="],
+
+ "set-proto": ["set-proto@1.0.0", "", { "dependencies": { "dunder-proto": "^1.0.1", "es-errors": "^1.3.0", "es-object-atoms": "^1.0.0" } }, "sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw=="],
+
+ "setprototypeof": ["setprototypeof@1.2.0", "", {}, "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw=="],
+
+ "shebang-command": ["shebang-command@2.0.0", "", { "dependencies": { "shebang-regex": "^3.0.0" } }, "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA=="],
+
+ "shebang-regex": ["shebang-regex@3.0.0", "", {}, "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A=="],
+
+ "shelljs": ["shelljs@0.8.5", "", { "dependencies": { "glob": "^7.0.0", "interpret": "^1.0.0", "rechoir": "^0.6.2" }, "bin": { "shjs": "bin/shjs" } }, "sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow=="],
+
+ "shiki": ["shiki@0.14.7", "", { "dependencies": { "ansi-sequence-parser": "^1.1.0", "jsonc-parser": "^3.2.0", "vscode-oniguruma": "^1.7.0", "vscode-textmate": "^8.0.0" } }, "sha512-dNPAPrxSc87ua2sKJ3H5dQ/6ZaY8RNnaAqK+t0eG7p0Soi2ydiqbGOTaZCqaYvA/uZYfS1LJnemt3Q+mSfcPCg=="],
+
+ "side-channel": ["side-channel@1.1.0", "", { "dependencies": { "es-errors": "^1.3.0", "object-inspect": "^1.13.3", "side-channel-list": "^1.0.0", "side-channel-map": "^1.0.1", "side-channel-weakmap": "^1.0.2" } }, "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw=="],
+
+ "side-channel-list": ["side-channel-list@1.0.0", "", { "dependencies": { "es-errors": "^1.3.0", "object-inspect": "^1.13.3" } }, "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA=="],
+
+ "side-channel-map": ["side-channel-map@1.0.1", "", { "dependencies": { "call-bound": "^1.0.2", "es-errors": "^1.3.0", "get-intrinsic": "^1.2.5", "object-inspect": "^1.13.3" } }, "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA=="],
+
+ "side-channel-weakmap": ["side-channel-weakmap@1.0.2", "", { "dependencies": { "call-bound": "^1.0.2", "es-errors": "^1.3.0", "get-intrinsic": "^1.2.5", "object-inspect": "^1.13.3", "side-channel-map": "^1.0.1" } }, "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A=="],
+
+ "signal-exit": ["signal-exit@4.1.0", "", {}, "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw=="],
+
+ "sisteransi": ["sisteransi@1.0.5", "", {}, "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg=="],
+
+ "slash": ["slash@3.0.0", "", {}, "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q=="],
+
+ "slice-ansi": ["slice-ansi@5.0.0", "", { "dependencies": { "ansi-styles": "^6.0.0", "is-fullwidth-code-point": "^4.0.0" } }, "sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ=="],
+
+ "smart-buffer": ["smart-buffer@4.2.0", "", {}, "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg=="],
+
+ "snake-case": ["snake-case@3.0.4", "", { "dependencies": { "dot-case": "^3.0.4", "tslib": "^2.0.3" } }, "sha512-LAOh4z89bGQvl9pFfNF8V146i7o7/CqFPbqzYgP+yYzDIDeS9HaNFtXABamRW+AQzEVODcvE79ljJ+8a9YSdMg=="],
+
+ "socks": ["socks@2.8.7", "", { "dependencies": { "ip-address": "^10.0.1", "smart-buffer": "^4.2.0" } }, "sha512-HLpt+uLy/pxB+bum/9DzAgiKS8CX1EvbWxI4zlmgGCExImLdiad2iCwXT5Z4c9c3Eq8rP2318mPW2c+QbtjK8A=="],
+
+ "socks-proxy-agent": ["socks-proxy-agent@8.0.5", "", { "dependencies": { "agent-base": "^7.1.2", "debug": "^4.3.4", "socks": "^2.8.3" } }, "sha512-HehCEsotFqbPW9sJ8WVYB6UbmIMv7kUUORIF2Nncq4VQvBfNBLibW9YZR5dlYCSUhwcD628pRllm7n+E+YTzJw=="],
+
+ "sonic-boom": ["sonic-boom@4.2.0", "", { "dependencies": { "atomic-sleep": "^1.0.0" } }, "sha512-INb7TM37/mAcsGmc9hyyI6+QR3rR1zVRu36B0NeGXKnOOLiZOfER5SA+N7X7k3yUYRzLWafduTDvJAfDswwEww=="],
+
+ "sort-keys": ["sort-keys@5.1.0", "", { "dependencies": { "is-plain-obj": "^4.0.0" } }, "sha512-aSbHV0DaBcr7u0PVHXzM6NbZNAtrr9sF6+Qfs9UUVG7Ll3jQ6hHi8F/xqIIcn2rvIVbr0v/2zyjSdwSV47AgLQ=="],
+
+ "sort-keys-length": ["sort-keys-length@1.0.1", "", { "dependencies": { "sort-keys": "^1.0.0" } }, "sha512-GRbEOUqCxemTAk/b32F2xa8wDTs+Z1QHOkbhJDQTvv/6G3ZkbJ+frYWsTcc7cBB3Fu4wy4XlLCuNtJuMn7Gsvw=="],
+
+ "source-map": ["source-map@0.7.6", "", {}, "sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ=="],
+
+ "source-map-js": ["source-map-js@1.2.1", "", {}, "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA=="],
+
+ "source-map-support": ["source-map-support@0.5.21", "", { "dependencies": { "buffer-from": "^1.0.0", "source-map": "^0.6.0" } }, "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w=="],
+
+ "space-separated-tokens": ["space-separated-tokens@2.0.2", "", {}, "sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q=="],
+
+ "spdx-correct": ["spdx-correct@3.2.0", "", { "dependencies": { "spdx-expression-parse": "^3.0.0", "spdx-license-ids": "^3.0.0" } }, "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA=="],
+
+ "spdx-exceptions": ["spdx-exceptions@2.5.0", "", {}, "sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w=="],
+
+ "spdx-expression-parse": ["spdx-expression-parse@3.0.1", "", { "dependencies": { "spdx-exceptions": "^2.1.0", "spdx-license-ids": "^3.0.0" } }, "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q=="],
+
+ "spdx-license-ids": ["spdx-license-ids@3.0.22", "", {}, "sha512-4PRT4nh1EImPbt2jASOKHX7PB7I+e4IWNLvkKFDxNhJlfjbYlleYQh285Z/3mPTHSAK/AvdMmw5BNNuYH8ShgQ=="],
+
+ "split2": ["split2@4.2.0", "", {}, "sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg=="],
+
+ "sprintf-js": ["sprintf-js@1.0.3", "", {}, "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g=="],
+
+ "stable-hash": ["stable-hash@0.0.5", "", {}, "sha512-+L3ccpzibovGXFK+Ap/f8LOS0ahMrHTf3xu7mMLSpEGU0EO9ucaysSylKo9eRDFNhWve/y275iPmIZ4z39a9iA=="],
+
+ "stack-utils": ["stack-utils@2.0.6", "", { "dependencies": { "escape-string-regexp": "^2.0.0" } }, "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ=="],
+
+ "statuses": ["statuses@2.0.1", "", {}, "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ=="],
+
+ "stdin-discarder": ["stdin-discarder@0.2.2", "", {}, "sha512-UhDfHmA92YAlNnCfhmq0VeNL5bDbiZGg7sZ2IvPsXubGkiNa9EC+tUTsjBRsYUAz87btI6/1wf4XoVvQ3uRnmQ=="],
+
+ "stop-iteration-iterator": ["stop-iteration-iterator@1.1.0", "", { "dependencies": { "es-errors": "^1.3.0", "internal-slot": "^1.1.0" } }, "sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ=="],
+
+ "streamsearch": ["streamsearch@1.1.0", "", {}, "sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg=="],
+
+ "string-argv": ["string-argv@0.3.2", "", {}, "sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q=="],
+
+ "string-length": ["string-length@4.0.2", "", { "dependencies": { "char-regex": "^1.0.2", "strip-ansi": "^6.0.0" } }, "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ=="],
+
+ "string-width": ["string-width@4.2.3", "", { "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" } }, "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g=="],
+
+ "string-width-cjs": ["string-width@4.2.3", "", { "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" } }, "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g=="],
+
+ "string.prototype.includes": ["string.prototype.includes@2.0.1", "", { "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1", "es-abstract": "^1.23.3" } }, "sha512-o7+c9bW6zpAdJHTtujeePODAhkuicdAryFsfVKwA+wGw89wJ4GTY484WTucM9hLtDEOpOvI+aHnzqnC5lHp4Rg=="],
+
+ "string.prototype.matchall": ["string.prototype.matchall@4.0.12", "", { "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.3", "define-properties": "^1.2.1", "es-abstract": "^1.23.6", "es-errors": "^1.3.0", "es-object-atoms": "^1.0.0", "get-intrinsic": "^1.2.6", "gopd": "^1.2.0", "has-symbols": "^1.1.0", "internal-slot": "^1.1.0", "regexp.prototype.flags": "^1.5.3", "set-function-name": "^2.0.2", "side-channel": "^1.1.0" } }, "sha512-6CC9uyBL+/48dYizRf7H7VAYCMCNTBeM78x/VTUe9bFEaxBepPJDa1Ow99LqI/1yF7kuy7Q3cQsYMrcjGUcskA=="],
+
+ "string.prototype.repeat": ["string.prototype.repeat@1.0.0", "", { "dependencies": { "define-properties": "^1.1.3", "es-abstract": "^1.17.5" } }, "sha512-0u/TldDbKD8bFCQ/4f5+mNRrXwZ8hg2w7ZR8wa16e8z9XpePWl3eGEcUD0OXpEH/VJH/2G3gjUtR3ZOiBe2S/w=="],
+
+ "string.prototype.trim": ["string.prototype.trim@1.2.10", "", { "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.2", "define-data-property": "^1.1.4", "define-properties": "^1.2.1", "es-abstract": "^1.23.5", "es-object-atoms": "^1.0.0", "has-property-descriptors": "^1.0.2" } }, "sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA=="],
+
+ "string.prototype.trimend": ["string.prototype.trimend@1.0.9", "", { "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.2", "define-properties": "^1.2.1", "es-object-atoms": "^1.0.0" } }, "sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ=="],
+
+ "string.prototype.trimstart": ["string.prototype.trimstart@1.0.8", "", { "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1", "es-object-atoms": "^1.0.0" } }, "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg=="],
+
+ "string_decoder": ["string_decoder@1.3.0", "", { "dependencies": { "safe-buffer": "~5.2.0" } }, "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA=="],
+
+ "stringify-entities": ["stringify-entities@4.0.4", "", { "dependencies": { "character-entities-html4": "^2.0.0", "character-entities-legacy": "^3.0.0" } }, "sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg=="],
+
+ "strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="],
+
+ "strip-ansi-cjs": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="],
+
+ "strip-bom": ["strip-bom@3.0.0", "", {}, "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA=="],
+
+ "strip-bom-string": ["strip-bom-string@1.0.0", "", {}, "sha512-uCC2VHvQRYu+lMh4My/sFNmF2klFymLX1wHJeXnbEJERpV/ZsVuonzerjfrGpIGF7LBVa1O7i9kjiWvJiFck8g=="],
+
+ "strip-eof": ["strip-eof@1.0.0", "", {}, "sha512-7FCwGGmx8mD5xQd3RPUvnSpUXHM3BWuzjtpD4TXsfcZ9EL4azvVVUscFYwD9nx8Kh+uCBC00XBtAykoMHwTh8Q=="],
+
+ "strip-final-newline": ["strip-final-newline@3.0.0", "", {}, "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw=="],
+
+ "strip-json-comments": ["strip-json-comments@3.1.1", "", {}, "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig=="],
+
+ "strip-outer": ["strip-outer@2.0.0", "", {}, "sha512-A21Xsm1XzUkK0qK1ZrytDUvqsQWict2Cykhvi0fBQntGG5JSprESasEyV1EZ/4CiR5WB5KjzLTrP/bO37B0wPg=="],
+
+ "strtok3": ["strtok3@7.1.1", "", { "dependencies": { "@tokenizer/token": "^0.3.0", "peek-readable": "^5.1.3" } }, "sha512-mKX8HA/cdBqMKUr0MMZAFssCkIGoZeSCMXgnt79yKxNFguMLVFgRe6wB+fsL0NmoHDbeyZXczy7vEPSoo3rkzg=="],
+
+ "style-to-object": ["style-to-object@0.4.4", "", { "dependencies": { "inline-style-parser": "0.1.1" } }, "sha512-HYNoHZa2GorYNyqiCaBgsxvcJIn7OHq6inEga+E6Ke3m5JkoqpQbnFssk4jwe+K7AhGa2fcha4wSOf1Kn01dMg=="],
+
+ "styled-jsx": ["styled-jsx@5.1.1", "", { "dependencies": { "client-only": "0.0.1" }, "peerDependencies": { "react": ">= 16.8.0 || 17.x.x || ^18.0.0-0" } }, "sha512-pW7uC1l4mBZ8ugbiZrcIsiIvVx1UmTfw7UkC3Um2tmfUq9Bhk8IiyEIPl6F8agHgjzku6j0xQEZbfA5uSgSaCw=="],
+
+ "stylis": ["stylis@4.3.6", "", {}, "sha512-yQ3rwFWRfwNUY7H5vpU0wfdkNSnvnJinhF9830Swlaxl03zsOjCfmX0ugac+3LtK0lYSgwL/KXc8oYL3mG4YFQ=="],
+
+ "sucrase": ["sucrase@3.35.1", "", { "dependencies": { "@jridgewell/gen-mapping": "^0.3.2", "commander": "^4.0.0", "lines-and-columns": "^1.1.6", "mz": "^2.7.0", "pirates": "^4.0.1", "tinyglobby": "^0.2.11", "ts-interface-checker": "^0.1.9" }, "bin": { "sucrase": "bin/sucrase", "sucrase-node": "bin/sucrase-node" } }, "sha512-DhuTmvZWux4H1UOnWMB3sk0sbaCVOoQZjv8u1rDoTV0HTdGem9hkAZtl4JZy8P2z4Bg0nT+YMeOFyVr4zcG5Tw=="],
+
+ "superagent": ["superagent@10.3.0", "", { "dependencies": { "component-emitter": "^1.3.1", "cookiejar": "^2.1.4", "debug": "^4.3.7", "fast-safe-stringify": "^2.1.1", "form-data": "^4.0.5", "formidable": "^3.5.4", "methods": "^1.1.2", "mime": "2.6.0", "qs": "^6.14.1" } }, "sha512-B+4Ik7ROgVKrQsXTV0Jwp2u+PXYLSlqtDAhYnkkD+zn3yg8s/zjA2MeGayPoY/KICrbitwneDHrjSotxKL+0XQ=="],
+
+ "supertest": ["supertest@7.2.2", "", { "dependencies": { "cookie-signature": "^1.2.2", "methods": "^1.1.2", "superagent": "^10.3.0" } }, "sha512-oK8WG9diS3DlhdUkcFn4tkNIiIbBx9lI2ClF8K+b2/m8Eyv47LSawxUzZQSNKUrVb2KsqeTDCcjAAVPYaSLVTA=="],
+
+ "supports-color": ["supports-color@7.2.0", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw=="],
+
+ "supports-preserve-symlinks-flag": ["supports-preserve-symlinks-flag@1.0.0", "", {}, "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w=="],
+
+ "svg-parser": ["svg-parser@2.0.4", "", {}, "sha512-e4hG1hRwoOdRb37cIMSgzNsxyzKfayW6VOflrwvR+/bzrkyxY/31WkbgnQpgtrNp1SdpJvpUAGTa/ZoiPNDuRQ=="],
+
+ "svgo": ["svgo@3.3.2", "", { "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", "csso": "^5.0.5", "picocolors": "^1.0.0" }, "bin": "./bin/svgo" }, "sha512-OoohrmuUlBs8B8o6MB2Aevn+pRIH9zDALSR+6hhqVfa6fRwG/Qw9VUMSMW9VNg2CFc/MTIfabtdOVl9ODIJjpw=="],
+
+ "symbol-observable": ["symbol-observable@4.0.0", "", {}, "sha512-b19dMThMV4HVFynSAM1++gBHAbk2Tc/osgLIBZMKsyqh34jb2e8Os7T6ZW/Bt3pJFdBTd2JwAnAAEQV7rSNvcQ=="],
+
+ "synckit": ["synckit@0.9.3", "", { "dependencies": { "@pkgr/core": "^0.1.0", "tslib": "^2.6.2" } }, "sha512-JJoOEKTfL1urb1mDoEblhD9NhEbWmq9jHEMEnxoC4ujUaZ4itA8vKgwkFAyNClgxplLi9tsUKX+EduK0p/l7sg=="],
+
+ "tailwindcss": ["tailwindcss@3.4.19", "", { "dependencies": { "@alloc/quick-lru": "^5.2.0", "arg": "^5.0.2", "chokidar": "^3.6.0", "didyoumean": "^1.2.2", "dlv": "^1.1.3", "fast-glob": "^3.3.2", "glob-parent": "^6.0.2", "is-glob": "^4.0.3", "jiti": "^1.21.7", "lilconfig": "^3.1.3", "micromatch": "^4.0.8", "normalize-path": "^3.0.0", "object-hash": "^3.0.0", "picocolors": "^1.1.1", "postcss": "^8.4.47", "postcss-import": "^15.1.0", "postcss-js": "^4.0.1", "postcss-load-config": "^4.0.2 || ^5.0 || ^6.0", "postcss-nested": "^6.2.0", "postcss-selector-parser": "^6.1.2", "resolve": "^1.22.8", "sucrase": "^3.35.0" }, "bin": { "tailwind": "lib/cli.js", "tailwindcss": "lib/cli.js" } }, "sha512-3ofp+LL8E+pK/JuPLPggVAIaEuhvIz4qNcf3nA1Xn2o/7fb7s/TYpHhwGDv1ZU3PkBluUVaF8PyCHcm48cKLWQ=="],
+
+ "tapable": ["tapable@2.3.0", "", {}, "sha512-g9ljZiwki/LfxmQADO3dEY1CbpmXT5Hm2fJ+QaGKwSXUylMybePR7/67YW7jOrrvjEgL1Fmz5kzyAjWVWLlucg=="],
+
+ "terser": ["terser@5.46.0", "", { "dependencies": { "@jridgewell/source-map": "^0.3.3", "acorn": "^8.15.0", "commander": "^2.20.0", "source-map-support": "~0.5.20" }, "bin": { "terser": "bin/terser" } }, "sha512-jTwoImyr/QbOWFFso3YoU3ik0jBBDJ6JTOQiy/J2YxVJdZCc+5u7skhNwiOR3FQIygFqVUPHl7qbbxtjW2K3Qg=="],
+
+ "terser-webpack-plugin": ["terser-webpack-plugin@5.3.16", "", { "dependencies": { "@jridgewell/trace-mapping": "^0.3.25", "jest-worker": "^27.4.5", "schema-utils": "^4.3.0", "serialize-javascript": "^6.0.2", "terser": "^5.31.1" }, "peerDependencies": { "webpack": "^5.1.0" } }, "sha512-h9oBFCWrq78NyWWVcSwZarJkZ01c2AyGrzs1crmHZO3QUg9D61Wu4NPjBy69n7JqylFF5y+CsUZYmYEIZ3mR+Q=="],
+
+ "test-exclude": ["test-exclude@6.0.0", "", { "dependencies": { "@istanbuljs/schema": "^0.1.2", "glob": "^7.1.4", "minimatch": "^3.0.4" } }, "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w=="],
+
+ "text-extensions": ["text-extensions@2.4.0", "", {}, "sha512-te/NtwBwfiNRLf9Ijqx3T0nlqZiQ2XrrtBvu+cLL8ZRrGkO0NHTug8MYFKyoSrv/sHTaSKfilUkizV6XhxMJ3g=="],
+
+ "text-table": ["text-table@0.2.0", "", {}, "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw=="],
+
+ "thenify": ["thenify@3.3.1", "", { "dependencies": { "any-promise": "^1.0.0" } }, "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw=="],
+
+ "thenify-all": ["thenify-all@1.6.0", "", { "dependencies": { "thenify": ">= 3.1.0 < 4" } }, "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA=="],
+
+ "thread-stream": ["thread-stream@4.0.0", "", { "dependencies": { "real-require": "^0.2.0" } }, "sha512-4iMVL6HAINXWf1ZKZjIPcz5wYaOdPhtO8ATvZ+Xqp3BTdaqtAwQkNmKORqcIo5YkQqGXq5cwfswDwMqqQNrpJA=="],
+
+ "through": ["through@2.3.8", "", {}, "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg=="],
+
+ "tinyexec": ["tinyexec@1.0.2", "", {}, "sha512-W/KYk+NFhkmsYpuHq5JykngiOCnxeVL8v8dFnqxSD8qEEdRfXk1SDM6JzNqcERbcGYj9tMrDQBYV9cjgnunFIg=="],
+
+ "tinyglobby": ["tinyglobby@0.2.15", "", { "dependencies": { "fdir": "^6.5.0", "picomatch": "^4.0.3" } }, "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ=="],
+
+ "title": ["title@3.5.3", "", { "dependencies": { "arg": "1.0.0", "chalk": "2.3.0", "clipboardy": "1.2.2", "titleize": "1.0.0" }, "bin": { "title": "bin/title.js" } }, "sha512-20JyowYglSEeCvZv3EZ0nZ046vLarO37prvV0mbtQV7C8DJPGgN967r8SJkqd3XK3K3lD3/Iyfp3avjfil8Q2Q=="],
+
+ "titleize": ["titleize@1.0.0", "", {}, "sha512-TARUb7z1pGvlLxgPk++7wJ6aycXF3GJ0sNSBTAsTuJrQG5QuZlkUQP+zl+nbjAh4gMX9yDw9ZYklMd7vAfJKEw=="],
+
+ "tmp": ["tmp@0.0.33", "", { "dependencies": { "os-tmpdir": "~1.0.2" } }, "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw=="],
+
+ "tmpl": ["tmpl@1.0.5", "", {}, "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw=="],
+
+ "to-regex-range": ["to-regex-range@5.0.1", "", { "dependencies": { "is-number": "^7.0.0" } }, "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ=="],
+
+ "toad-cache": ["toad-cache@3.7.0", "", {}, "sha512-/m8M+2BJUpoJdgAHoG+baCwBT+tf2VraSfkBgl0Y00qIWt41DJ8R5B8nsEw0I58YwF5IZH6z24/2TobDKnqSWw=="],
+
+ "toidentifier": ["toidentifier@1.0.1", "", {}, "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA=="],
+
+ "token-types": ["token-types@5.0.1", "", { "dependencies": { "@tokenizer/token": "^0.3.0", "ieee754": "^1.2.1" } }, "sha512-Y2fmSnZjQdDb9W4w4r1tswlMHylzWIeOKpx0aZH9BgGtACHhrk3OkT52AzwcuqTRBZtvvnTjDBh8eynMulu8Vg=="],
+
+ "tr46": ["tr46@0.0.3", "", {}, "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw=="],
+
+ "tree-kill": ["tree-kill@1.2.2", "", { "bin": { "tree-kill": "cli.js" } }, "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A=="],
+
+ "trim-lines": ["trim-lines@3.0.1", "", {}, "sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg=="],
+
+ "trim-repeated": ["trim-repeated@2.0.0", "", { "dependencies": { "escape-string-regexp": "^5.0.0" } }, "sha512-QUHBFTJGdOwmp0tbOG505xAgOp/YliZP/6UgafFXYZ26WT1bvQmSMJUvkeVSASuJJHbqsFbynTvkd5W8RBTipg=="],
+
+ "trough": ["trough@2.2.0", "", {}, "sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw=="],
+
+ "trpc-panel": ["trpc-panel@1.3.4", "", { "dependencies": { "fuzzysort": "^2.0.4", "path": "^0.12.7", "url": "^0.11.0", "zod-to-json-schema": "^3.20.0" }, "peerDependencies": { "@trpc/server": "^10.0.0", "zod": "^3.19.1" } }, "sha512-u5/dCi/AAp2tpJcCL5ZCfrdJtHHu8hrtm2hzSBZCE7z9Tw6MB1rCcliSQvgMPIEXMQrgwXk4t4IedfWkxioKng=="],
+
+ "ts-api-utils": ["ts-api-utils@2.4.0", "", { "peerDependencies": { "typescript": ">=4.8.4" } }, "sha512-3TaVTaAv2gTiMB35i3FiGJaRfwb3Pyn/j3m/bfAvGe8FB7CF6u+LMYqYlDh7reQf7UNvoTvdfAqHGmPGOSsPmA=="],
+
+ "ts-dedent": ["ts-dedent@2.2.0", "", {}, "sha512-q5W7tVM71e2xjHZTlgfTDoPF/SmqKG5hddq9SzR49CH2hayqRKJtQ4mtRlSxKaJlR/+9rEM+mnBHf7I2/BQcpQ=="],
+
+ "ts-interface-checker": ["ts-interface-checker@0.1.13", "", {}, "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA=="],
+
+ "ts-jest": ["ts-jest@29.2.3", "", { "dependencies": { "bs-logger": "0.x", "ejs": "^3.1.10", "fast-json-stable-stringify": "2.x", "jest-util": "^29.0.0", "json5": "^2.2.3", "lodash.memoize": "4.x", "make-error": "1.x", "semver": "^7.5.3", "yargs-parser": "^21.0.1" }, "peerDependencies": { "@babel/core": ">=7.0.0-beta.0 <8", "@jest/transform": "^29.0.0", "@jest/types": "^29.0.0", "babel-jest": "^29.0.0", "jest": "^29.0.0", "typescript": ">=4.3 <6" }, "optionalPeers": ["@babel/core", "@jest/transform", "@jest/types", "babel-jest"], "bin": { "ts-jest": "cli.js" } }, "sha512-yCcfVdiBFngVz9/keHin9EnsrQtQtEu3nRykNy9RVp+FiPFFbPJ3Sg6Qg4+TkmH0vMP5qsTKgXSsk80HRwvdgQ=="],
+
+ "ts-morph": ["ts-morph@23.0.0", "", { "dependencies": { "@ts-morph/common": "~0.24.0", "code-block-writer": "^13.0.1" } }, "sha512-FcvFx7a9E8TUe6T3ShihXJLiJOiqyafzFKUO4aqIHDUCIvADdGNShcbc2W5PMr3LerXRv7mafvFZ9lRENxJmug=="],
+
+ "ts-node": ["ts-node@10.9.2", "", { "dependencies": { "@cspotcode/source-map-support": "^0.8.0", "@tsconfig/node10": "^1.0.7", "@tsconfig/node12": "^1.0.7", "@tsconfig/node14": "^1.0.0", "@tsconfig/node16": "^1.0.2", "acorn": "^8.4.1", "acorn-walk": "^8.1.1", "arg": "^4.1.0", "create-require": "^1.1.0", "diff": "^4.0.1", "make-error": "^1.1.1", "v8-compile-cache-lib": "^3.0.1", "yn": "3.1.1" }, "peerDependencies": { "@swc/core": ">=1.2.50", "@swc/wasm": ">=1.2.50", "@types/node": "*", "typescript": ">=2.7" }, "optionalPeers": ["@swc/core", "@swc/wasm"], "bin": { "ts-node": "dist/bin.js", "ts-script": "dist/bin-script-deprecated.js", "ts-node-cwd": "dist/bin-cwd.js", "ts-node-esm": "dist/bin-esm.js", "ts-node-script": "dist/bin-script.js", "ts-node-transpile-only": "dist/bin-transpile.js" } }, "sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ=="],
+
+ "tsconfig-paths": ["tsconfig-paths@4.2.0", "", { "dependencies": { "json5": "^2.2.2", "minimist": "^1.2.6", "strip-bom": "^3.0.0" } }, "sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg=="],
+
+ "tsconfig-paths-webpack-plugin": ["tsconfig-paths-webpack-plugin@4.0.1", "", { "dependencies": { "chalk": "^4.1.0", "enhanced-resolve": "^5.7.0", "tsconfig-paths": "^4.1.2" } }, "sha512-m5//KzLoKmqu2MVix+dgLKq70MnFi8YL8sdzQZ6DblmCdfuq/y3OqvJd5vMndg2KEVCOeNz8Es4WVZhYInteLw=="],
+
+ "tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="],
+
+ "type-check": ["type-check@0.4.0", "", { "dependencies": { "prelude-ls": "^1.2.1" } }, "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew=="],
+
+ "type-detect": ["type-detect@4.0.8", "", {}, "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g=="],
+
+ "type-fest": ["type-fest@4.41.0", "", {}, "sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA=="],
+
+ "type-is": ["type-is@1.6.18", "", { "dependencies": { "media-typer": "0.3.0", "mime-types": "~2.1.24" } }, "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g=="],
+
+ "typed-array-buffer": ["typed-array-buffer@1.0.3", "", { "dependencies": { "call-bound": "^1.0.3", "es-errors": "^1.3.0", "is-typed-array": "^1.1.14" } }, "sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw=="],
+
+ "typed-array-byte-length": ["typed-array-byte-length@1.0.3", "", { "dependencies": { "call-bind": "^1.0.8", "for-each": "^0.3.3", "gopd": "^1.2.0", "has-proto": "^1.2.0", "is-typed-array": "^1.1.14" } }, "sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg=="],
+
+ "typed-array-byte-offset": ["typed-array-byte-offset@1.0.4", "", { "dependencies": { "available-typed-arrays": "^1.0.7", "call-bind": "^1.0.8", "for-each": "^0.3.3", "gopd": "^1.2.0", "has-proto": "^1.2.0", "is-typed-array": "^1.1.15", "reflect.getprototypeof": "^1.0.9" } }, "sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ=="],
+
+ "typed-array-length": ["typed-array-length@1.0.7", "", { "dependencies": { "call-bind": "^1.0.7", "for-each": "^0.3.3", "gopd": "^1.0.1", "is-typed-array": "^1.1.13", "possible-typed-array-names": "^1.0.0", "reflect.getprototypeof": "^1.0.6" } }, "sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg=="],
+
+ "typedarray": ["typedarray@0.0.6", "", {}, "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA=="],
+
+ "typedarray-to-buffer": ["typedarray-to-buffer@3.1.5", "", { "dependencies": { "is-typedarray": "^1.0.0" } }, "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q=="],
+
+ "typescript": ["typescript@5.9.3", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw=="],
+
+ "uglify-js": ["uglify-js@3.19.3", "", { "bin": { "uglifyjs": "bin/uglifyjs" } }, "sha512-v3Xu+yuwBXisp6QYTcH4UbH+xYJXqnq2m/LtQVWKWzYc1iehYnLixoQDN9FH6/j9/oybfd6W9Ghwkl8+UMKTKQ=="],
+
+ "uid": ["uid@2.0.2", "", { "dependencies": { "@lukeed/csprng": "^1.0.0" } }, "sha512-u3xV3X7uzvi5b1MncmZo3i2Aw222Zk1keqLA1YkHldREkAhAqi65wuPfe7lHx8H/Wzy+8CE7S7uS3jekIM5s8g=="],
+
+ "unbox-primitive": ["unbox-primitive@1.1.0", "", { "dependencies": { "call-bound": "^1.0.3", "has-bigints": "^1.0.2", "has-symbols": "^1.1.0", "which-boxed-primitive": "^1.1.1" } }, "sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw=="],
+
+ "undici-types": ["undici-types@5.26.5", "", {}, "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA=="],
+
+ "unicode-canonical-property-names-ecmascript": ["unicode-canonical-property-names-ecmascript@2.0.1", "", {}, "sha512-dA8WbNeb2a6oQzAQ55YlT5vQAWGV9WXOsi3SskE3bcCdM0P4SDd+24zS/OCacdRq5BkdsRj9q3Pg6YyQoxIGqg=="],
+
+ "unicode-match-property-ecmascript": ["unicode-match-property-ecmascript@2.0.0", "", { "dependencies": { "unicode-canonical-property-names-ecmascript": "^2.0.0", "unicode-property-aliases-ecmascript": "^2.0.0" } }, "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q=="],
+
+ "unicode-match-property-value-ecmascript": ["unicode-match-property-value-ecmascript@2.2.1", "", {}, "sha512-JQ84qTuMg4nVkx8ga4A16a1epI9H6uTXAknqxkGF/aFfRLw1xC/Bp24HNLaZhHSkWd3+84t8iXnp1J0kYcZHhg=="],
+
+ "unicode-property-aliases-ecmascript": ["unicode-property-aliases-ecmascript@2.2.0", "", {}, "sha512-hpbDzxUY9BFwX+UeBnxv3Sh1q7HFxj48DTmXchNgRa46lO8uj3/1iEn3MiNUYTg1g9ctIqXCCERn8gYZhHC5lQ=="],
+
+ "unicorn-magic": ["unicorn-magic@0.1.0", "", {}, "sha512-lRfVq8fE8gz6QMBuDM6a+LO3IAzTi05H6gCVaUpir2E1Rwpo4ZUog45KpNXKC/Mn3Yb9UDuHumeFTo9iV/D9FQ=="],
+
+ "unified": ["unified@10.1.2", "", { "dependencies": { "@types/unist": "^2.0.0", "bail": "^2.0.0", "extend": "^3.0.0", "is-buffer": "^2.0.0", "is-plain-obj": "^4.0.0", "trough": "^2.0.0", "vfile": "^5.0.0" } }, "sha512-pUSWAi/RAnVy1Pif2kAoeWNBa3JVrx0MId2LASj8G+7AiHWoKZNTomq6LG326T68U7/e263X6fTdcXIy7XnF7Q=="],
+
+ "unique-string": ["unique-string@3.0.0", "", { "dependencies": { "crypto-random-string": "^4.0.0" } }, "sha512-VGXBUVwxKMBUznyffQweQABPRRW1vHZAbadFZud4pLFAqRGvv/96vafgjWFqzourzr8YonlQiPgH0YCJfawoGQ=="],
+
+ "unist-util-find-after": ["unist-util-find-after@5.0.0", "", { "dependencies": { "@types/unist": "^3.0.0", "unist-util-is": "^6.0.0" } }, "sha512-amQa0Ep2m6hE2g72AugUItjbuM8X8cGQnFoHk0pGfrFeT9GZhzN5SW8nRsiGKK7Aif4CrACPENkA6P/Lw6fHGQ=="],
+
+ "unist-util-generated": ["unist-util-generated@2.0.1", "", {}, "sha512-qF72kLmPxAw0oN2fwpWIqbXAVyEqUzDHMsbtPvOudIlUzXYFIeQIuxXQCRCFh22B7cixvU0MG7m3MW8FTq/S+A=="],
+
+ "unist-util-is": ["unist-util-is@6.0.1", "", { "dependencies": { "@types/unist": "^3.0.0" } }, "sha512-LsiILbtBETkDz8I9p1dQ0uyRUWuaQzd/cuEeS1hoRSyW5E5XGmTzlwY1OrNzzakGowI9Dr/I8HVaw4hTtnxy8g=="],
+
+ "unist-util-position": ["unist-util-position@4.0.4", "", { "dependencies": { "@types/unist": "^2.0.0" } }, "sha512-kUBE91efOWfIVBo8xzh/uZQ7p9ffYRtUbMRZBNFYwf0RK8koUMx6dGUfwylLOKmaT2cs4wSW96QoYUSXAyEtpg=="],
+
+ "unist-util-position-from-estree": ["unist-util-position-from-estree@1.1.2", "", { "dependencies": { "@types/unist": "^2.0.0" } }, "sha512-poZa0eXpS+/XpoQwGwl79UUdea4ol2ZuCYguVaJS4qzIOMDzbqz8a3erUCOmubSZkaOuGamb3tX790iwOIROww=="],
+
+ "unist-util-remove": ["unist-util-remove@4.0.0", "", { "dependencies": { "@types/unist": "^3.0.0", "unist-util-is": "^6.0.0", "unist-util-visit-parents": "^6.0.0" } }, "sha512-b4gokeGId57UVRX/eVKej5gXqGlc9+trkORhFJpu9raqZkZhU0zm8Doi05+HaiBsMEIJowL+2WtQ5ItjsngPXg=="],
+
+ "unist-util-remove-position": ["unist-util-remove-position@5.0.0", "", { "dependencies": { "@types/unist": "^3.0.0", "unist-util-visit": "^5.0.0" } }, "sha512-Hp5Kh3wLxv0PHj9m2yZhhLt58KzPtEYKQQ4yxfYFEO7EvHwzyDYnduhHnY1mDxoqr7VUwVuHXk9RXKIiYS1N8Q=="],
+
+ "unist-util-stringify-position": ["unist-util-stringify-position@3.0.3", "", { "dependencies": { "@types/unist": "^2.0.0" } }, "sha512-k5GzIBZ/QatR8N5X2y+drfpWG8IDBzdnVj6OInRNWm1oXrzydiaAT2OQiA8DPRRZyAKb9b6I2a6PxYklZD0gKg=="],
+
+ "unist-util-visit": ["unist-util-visit@5.0.0", "", { "dependencies": { "@types/unist": "^3.0.0", "unist-util-is": "^6.0.0", "unist-util-visit-parents": "^6.0.0" } }, "sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg=="],
+
+ "unist-util-visit-parents": ["unist-util-visit-parents@6.0.2", "", { "dependencies": { "@types/unist": "^3.0.0", "unist-util-is": "^6.0.0" } }, "sha512-goh1s1TBrqSqukSc8wrjwWhL0hiJxgA8m4kFxGlQ+8FYQ3C/m11FcTs4YYem7V664AhHVvgoQLk890Ssdsr2IQ=="],
+
+ "universal-user-agent": ["universal-user-agent@6.0.1", "", {}, "sha512-yCzhz6FN2wU1NiiQRogkTQszlQSlpWaw8SvVegAc+bDxbzHgh1vX8uIe8OYyMH6DwH+sdTJsgMl36+mSMdRJIQ=="],
+
+ "universalify": ["universalify@2.0.1", "", {}, "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw=="],
+
+ "unpipe": ["unpipe@1.0.0", "", {}, "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ=="],
+
+ "unrs-resolver": ["unrs-resolver@1.11.1", "", { "dependencies": { "napi-postinstall": "^0.3.0" }, "optionalDependencies": { "@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" } }, "sha512-bSjt9pjaEBnNiGgc9rUiHGKv5l4/TGzDmYw3RhnkJGtLhbnnA/5qJj7x3dNDCRx/PJxu774LlH8lCOlB4hEfKg=="],
+
+ "update-browserslist-db": ["update-browserslist-db@1.2.3", "", { "dependencies": { "escalade": "^3.2.0", "picocolors": "^1.1.1" }, "peerDependencies": { "browserslist": ">= 4.21.0" }, "bin": { "update-browserslist-db": "cli.js" } }, "sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w=="],
+
+ "update-notifier": ["update-notifier@7.0.0", "", { "dependencies": { "boxen": "^7.1.1", "chalk": "^5.3.0", "configstore": "^6.0.0", "import-lazy": "^4.0.0", "is-in-ci": "^0.1.0", "is-installed-globally": "^0.4.0", "is-npm": "^6.0.0", "latest-version": "^7.0.0", "pupa": "^3.1.0", "semver": "^7.5.4", "semver-diff": "^4.0.0", "xdg-basedir": "^5.1.0" } }, "sha512-Hv25Bh+eAbOLlsjJreVPOs4vd51rrtCrmhyOJtbpAojro34jS4KQaEp4/EvlHJX7jSO42VvEFpkastVyXyIsdQ=="],
+
+ "uri-js": ["uri-js@4.4.1", "", { "dependencies": { "punycode": "^2.1.0" } }, "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg=="],
+
+ "url": ["url@0.11.4", "", { "dependencies": { "punycode": "^1.4.1", "qs": "^6.12.3" } }, "sha512-oCwdVC7mTuWiPyjLUz/COz5TLk6wgp0RCsN+wHZ2Ekneac9w8uuV0njcbbie2ME+Vs+d6duwmYuR3HgQXs1fOg=="],
+
+ "url-join": ["url-join@4.0.1", "", {}, "sha512-jk1+QP6ZJqyOiuEI9AEWQfju/nB2Pw466kbA0LEZljHwKeMgd9WrAEgEGxjPDD2+TNbbb37rTyhEfrCXfuKXnA=="],
+
+ "util": ["util@0.10.4", "", { "dependencies": { "inherits": "2.0.3" } }, "sha512-0Pm9hTQ3se5ll1XihRic3FDIku70C+iHUdT/W926rSgHV5QgXsYbKZN8MSC3tJtSkhuROzvsQjAaFENRXr+19A=="],
+
+ "util-deprecate": ["util-deprecate@1.0.2", "", {}, "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw=="],
+
+ "utils-merge": ["utils-merge@1.0.1", "", {}, "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA=="],
+
+ "uuid": ["uuid@9.0.1", "", { "bin": { "uuid": "dist/bin/uuid" } }, "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA=="],
+
+ "uvu": ["uvu@0.5.6", "", { "dependencies": { "dequal": "^2.0.0", "diff": "^5.0.0", "kleur": "^4.0.3", "sade": "^1.7.3" }, "bin": { "uvu": "bin.js" } }, "sha512-+g8ENReyr8YsOc6fv/NVJs2vFdHBnBNdfE49rshrTzDWOlUx4Gq7KOS2GD8eqhy2j+Ejq29+SbKH8yjkAqXqoA=="],
+
+ "v8-compile-cache-lib": ["v8-compile-cache-lib@3.0.1", "", {}, "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg=="],
+
+ "v8-to-istanbul": ["v8-to-istanbul@9.3.0", "", { "dependencies": { "@jridgewell/trace-mapping": "^0.3.12", "@types/istanbul-lib-coverage": "^2.0.1", "convert-source-map": "^2.0.0" } }, "sha512-kiGUalWN+rgBJ/1OHZsBtU4rXZOfj/7rKQxULKlIzwzQSvMJUUNgPwJEEh7gU6xEVxC0ahoOBvN2YI8GH6FNgA=="],
+
+ "validate-npm-package-license": ["validate-npm-package-license@3.0.4", "", { "dependencies": { "spdx-correct": "^3.0.0", "spdx-expression-parse": "^3.0.0" } }, "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew=="],
+
+ "validate-peer-dependencies": ["validate-peer-dependencies@1.2.0", "", { "dependencies": { "resolve-package-path": "^3.1.0", "semver": "^7.3.2" } }, "sha512-nd2HUpKc6RWblPZQ2GDuI65sxJ2n/UqZwSBVtj64xlWjMx0m7ZB2m9b2JS3v1f+n9VWH/dd1CMhkHfP6pIdckA=="],
+
+ "vary": ["vary@1.1.2", "", {}, "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg=="],
+
+ "vfile": ["vfile@5.3.7", "", { "dependencies": { "@types/unist": "^2.0.0", "is-buffer": "^2.0.0", "unist-util-stringify-position": "^3.0.0", "vfile-message": "^3.0.0" } }, "sha512-r7qlzkgErKjobAmyNIkkSpizsFPYiUPuJb5pNW1RB4JcYVZhs4lIbVqk8XPk033CV/1z8ss5pkax8SuhGpcG8g=="],
+
+ "vfile-location": ["vfile-location@5.0.3", "", { "dependencies": { "@types/unist": "^3.0.0", "vfile": "^6.0.0" } }, "sha512-5yXvWDEgqeiYiBe1lbxYF7UMAIm/IcopxMHrMQDq3nvKcjPKIhZklUKL+AE7J7uApI4kwe2snsK+eI6UTj9EHg=="],
+
+ "vfile-matter": ["vfile-matter@3.0.1", "", { "dependencies": { "@types/js-yaml": "^4.0.0", "is-buffer": "^2.0.0", "js-yaml": "^4.0.0" } }, "sha512-CAAIDwnh6ZdtrqAuxdElUqQRQDQgbbIrYtDYI8gCjXS1qQ+1XdLoK8FIZWxJwn0/I+BkSSZpar3SOgjemQz4fg=="],
+
+ "vfile-message": ["vfile-message@3.1.4", "", { "dependencies": { "@types/unist": "^2.0.0", "unist-util-stringify-position": "^3.0.0" } }, "sha512-fa0Z6P8HUrQN4BZaX05SIVXic+7kE3b05PWAtPuYP9QLHsLKYR7/AlLW3NtOrpXRLeawpDLMsVkmk5DG0NXgWw=="],
+
+ "vscode-oniguruma": ["vscode-oniguruma@1.7.0", "", {}, "sha512-L9WMGRfrjOhgHSdOYgCt/yRMsXzLDJSL7BPrOZt73gU0iWO4mpqzqQzOz5srxqTvMBaR0XZTSrVWo4j55Rc6cA=="],
+
+ "vscode-textmate": ["vscode-textmate@8.0.0", "", {}, "sha512-AFbieoL7a5LMqcnOF04ji+rpXadgOXnZsxQr//r83kLPr7biP7am3g9zbaZIaBGwBRWeSvoMD4mgPdX3e4NWBg=="],
+
+ "walk-sync": ["walk-sync@2.2.0", "", { "dependencies": { "@types/minimatch": "^3.0.3", "ensure-posix-path": "^1.1.0", "matcher-collection": "^2.0.0", "minimatch": "^3.0.4" } }, "sha512-IC8sL7aB4/ZgFcGI2T1LczZeFWZ06b3zoHH7jBPyHxOtIIz1jppWHjjEXkOFvFojBVAK9pV7g47xOZ4LW3QLfg=="],
+
+ "walker": ["walker@1.0.8", "", { "dependencies": { "makeerror": "1.0.12" } }, "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ=="],
+
+ "watchpack": ["watchpack@2.4.0", "", { "dependencies": { "glob-to-regexp": "^0.4.1", "graceful-fs": "^4.1.2" } }, "sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg=="],
+
+ "wcwidth": ["wcwidth@1.0.1", "", { "dependencies": { "defaults": "^1.0.3" } }, "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg=="],
+
+ "web": ["web@workspace:examples/nextjs-trpc"],
+
+ "web-namespaces": ["web-namespaces@2.0.1", "", {}, "sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ=="],
+
+ "web-streams-polyfill": ["web-streams-polyfill@3.3.3", "", {}, "sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw=="],
+
+ "web-worker": ["web-worker@1.5.0", "", {}, "sha512-RiMReJrTAiA+mBjGONMnjVDP2u3p9R1vkcGz6gDIrOMT3oGuYwX2WRMYI9ipkphSuE5XKEhydbhNEJh4NY9mlw=="],
+
+ "webidl-conversions": ["webidl-conversions@3.0.1", "", {}, "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ=="],
+
+ "webpack": ["webpack@5.82.1", "", { "dependencies": { "@types/eslint-scope": "^3.7.3", "@types/estree": "^1.0.0", "@webassemblyjs/ast": "^1.11.5", "@webassemblyjs/wasm-edit": "^1.11.5", "@webassemblyjs/wasm-parser": "^1.11.5", "acorn": "^8.7.1", "acorn-import-assertions": "^1.7.6", "browserslist": "^4.14.5", "chrome-trace-event": "^1.0.2", "enhanced-resolve": "^5.14.0", "es-module-lexer": "^1.2.1", "eslint-scope": "5.1.1", "events": "^3.2.0", "glob-to-regexp": "^0.4.1", "graceful-fs": "^4.2.9", "json-parse-even-better-errors": "^2.3.1", "loader-runner": "^4.2.0", "mime-types": "^2.1.27", "neo-async": "^2.6.2", "schema-utils": "^3.1.2", "tapable": "^2.1.1", "terser-webpack-plugin": "^5.3.7", "watchpack": "^2.4.0", "webpack-sources": "^3.2.3" }, "bin": { "webpack": "bin/webpack.js" } }, "sha512-C6uiGQJ+Gt4RyHXXYt+v9f+SN1v83x68URwgxNQ98cvH8kxiuywWGP4XeNZ1paOzZ63aY3cTciCEQJNFUljlLw=="],
+
+ "webpack-node-externals": ["webpack-node-externals@3.0.0", "", {}, "sha512-LnL6Z3GGDPht/AigwRh2dvL9PQPFQ8skEpVrWZXLWBYmqcaojHNN0onvHzie6rq7EWKrrBfPYqNEzTJgiwEQDQ=="],
+
+ "webpack-sources": ["webpack-sources@3.3.3", "", {}, "sha512-yd1RBzSGanHkitROoPFd6qsrxt+oFhg/129YzheDGqeustzX0vTZJZsSsQjVQC4yzBQ56K55XU8gaNCtIzOnTg=="],
+
+ "whatwg-url": ["whatwg-url@5.0.0", "", { "dependencies": { "tr46": "~0.0.3", "webidl-conversions": "^3.0.0" } }, "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw=="],
+
+ "which": ["which@2.0.2", "", { "dependencies": { "isexe": "^2.0.0" }, "bin": { "node-which": "./bin/node-which" } }, "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA=="],
+
+ "which-boxed-primitive": ["which-boxed-primitive@1.1.1", "", { "dependencies": { "is-bigint": "^1.1.0", "is-boolean-object": "^1.2.1", "is-number-object": "^1.1.1", "is-string": "^1.1.1", "is-symbol": "^1.1.1" } }, "sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA=="],
+
+ "which-builtin-type": ["which-builtin-type@1.2.1", "", { "dependencies": { "call-bound": "^1.0.2", "function.prototype.name": "^1.1.6", "has-tostringtag": "^1.0.2", "is-async-function": "^2.0.0", "is-date-object": "^1.1.0", "is-finalizationregistry": "^1.1.0", "is-generator-function": "^1.0.10", "is-regex": "^1.2.1", "is-weakref": "^1.0.2", "isarray": "^2.0.5", "which-boxed-primitive": "^1.1.0", "which-collection": "^1.0.2", "which-typed-array": "^1.1.16" } }, "sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q=="],
+
+ "which-collection": ["which-collection@1.0.2", "", { "dependencies": { "is-map": "^2.0.3", "is-set": "^2.0.3", "is-weakmap": "^2.0.2", "is-weakset": "^2.0.3" } }, "sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw=="],
+
+ "which-typed-array": ["which-typed-array@1.1.20", "", { "dependencies": { "available-typed-arrays": "^1.0.7", "call-bind": "^1.0.8", "call-bound": "^1.0.4", "for-each": "^0.3.5", "get-proto": "^1.0.1", "gopd": "^1.2.0", "has-tostringtag": "^1.0.2" } }, "sha512-LYfpUkmqwl0h9A2HL09Mms427Q1RZWuOHsukfVcKRq9q95iQxdw0ix1JQrqbcDR9PH1QDwf5Qo8OZb5lksZ8Xg=="],
+
+ "widest-line": ["widest-line@4.0.1", "", { "dependencies": { "string-width": "^5.0.1" } }, "sha512-o0cyEG0e8GPzT4iGHphIOh0cJOV8fivsXxddQasHPHfoZf1ZexrfeA21w2NaEN1RHE+fXlfISmOE8R9N3u3Qig=="],
+
+ "wildcard-match": ["wildcard-match@5.1.2", "", {}, "sha512-qNXwI591Z88c8bWxp+yjV60Ch4F8Riawe3iGxbzquhy8Xs9m+0+SLFBGb/0yCTIDElawtaImC37fYZ+dr32KqQ=="],
+
+ "windows-release": ["windows-release@4.0.0", "", { "dependencies": { "execa": "^4.0.2" } }, "sha512-OxmV4wzDKB1x7AZaZgXMVsdJ1qER1ed83ZrTYd5Bwq2HfJVg3DJS8nqlAG4sMoJ7mu8cuRmLEYyU13BKwctRAg=="],
+
+ "word-wrap": ["word-wrap@1.2.5", "", {}, "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA=="],
+
+ "wordwrap": ["wordwrap@1.0.0", "", {}, "sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q=="],
+
+ "wrap-ansi": ["wrap-ansi@6.2.0", "", { "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", "strip-ansi": "^6.0.0" } }, "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA=="],
+
+ "wrap-ansi-cjs": ["wrap-ansi@7.0.0", "", { "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", "strip-ansi": "^6.0.0" } }, "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q=="],
+
+ "wrappy": ["wrappy@1.0.2", "", {}, "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ=="],
+
+ "write-file-atomic": ["write-file-atomic@4.0.2", "", { "dependencies": { "imurmurhash": "^0.1.4", "signal-exit": "^3.0.7" } }, "sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg=="],
+
+ "xdg-basedir": ["xdg-basedir@5.1.0", "", {}, "sha512-GCPAHLvrIH13+c0SuacwvRYj2SxJXQ4kaVTT5xgL3kPrz56XxkF21IGhjSE1+W0aw7gpBWRGXLCPnPby6lSpmQ=="],
+
+ "xtend": ["xtend@4.0.2", "", {}, "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ=="],
+
+ "y18n": ["y18n@5.0.8", "", {}, "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA=="],
+
+ "yallist": ["yallist@4.0.0", "", {}, "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="],
+
+ "yaml": ["yaml@2.8.2", "", { "bin": { "yaml": "bin.mjs" } }, "sha512-mplynKqc1C2hTVYxd0PU2xQAc22TI1vShAYGksCCfxbn/dFwnHTNi1bvYsBTkhdUNtGIf5xNOg938rrSSYvS9A=="],
+
+ "yargs": ["yargs@17.7.2", "", { "dependencies": { "cliui": "^8.0.1", "escalade": "^3.1.1", "get-caller-file": "^2.0.5", "require-directory": "^2.1.1", "string-width": "^4.2.3", "y18n": "^5.0.5", "yargs-parser": "^21.1.1" } }, "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w=="],
+
+ "yargs-parser": ["yargs-parser@21.1.1", "", {}, "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw=="],
+
+ "yn": ["yn@3.1.1", "", {}, "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q=="],
+
+ "yocto-queue": ["yocto-queue@0.1.0", "", {}, "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q=="],
+
+ "yoctocolors-cjs": ["yoctocolors-cjs@2.1.3", "", {}, "sha512-U/PBtDf35ff0D8X8D0jfdzHYEPFxAI7jJlxZXwCSez5M3190m+QobIfh+sWDWSHMCWWJN2AWamkegn6vr6YBTw=="],
+
+ "zod": ["zod@3.25.76", "", {}, "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ=="],
+
+ "zod-to-json-schema": ["zod-to-json-schema@3.25.1", "", { "peerDependencies": { "zod": "^3.25 || ^4" } }, "sha512-pM/SU9d3YAggzi6MtR4h7ruuQlqKtad8e9S0fmxcMi+ueAK5Korys/aWcV9LIIHTVbj01NdzxcnXSN+O74ZIVA=="],
+
+ "zwitch": ["zwitch@2.0.4", "", {}, "sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A=="],
+
+ "@angular-devkit/core/ajv": ["ajv@8.12.0", "", { "dependencies": { "fast-deep-equal": "^3.1.1", "json-schema-traverse": "^1.0.0", "require-from-string": "^2.0.2", "uri-js": "^4.2.2" } }, "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA=="],
+
+ "@angular-devkit/core/jsonc-parser": ["jsonc-parser@3.2.0", "", {}, "sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w=="],
+
+ "@angular-devkit/core/rxjs": ["rxjs@7.8.1", "", { "dependencies": { "tslib": "^2.1.0" } }, "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg=="],
+
+ "@angular-devkit/core/source-map": ["source-map@0.7.4", "", {}, "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA=="],
+
+ "@angular-devkit/schematics/jsonc-parser": ["jsonc-parser@3.2.0", "", {}, "sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w=="],
+
+ "@angular-devkit/schematics/rxjs": ["rxjs@7.8.1", "", { "dependencies": { "tslib": "^2.1.0" } }, "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg=="],
+
+ "@angular-devkit/schematics-cli/inquirer": ["inquirer@8.2.4", "", { "dependencies": { "ansi-escapes": "^4.2.1", "chalk": "^4.1.1", "cli-cursor": "^3.1.0", "cli-width": "^3.0.0", "external-editor": "^3.0.3", "figures": "^3.0.0", "lodash": "^4.17.21", "mute-stream": "0.0.8", "ora": "^5.4.1", "run-async": "^2.4.0", "rxjs": "^7.5.5", "string-width": "^4.1.0", "strip-ansi": "^6.0.0", "through": "^2.3.6", "wrap-ansi": "^7.0.0" } }, "sha512-nn4F01dxU8VeKfq192IjLsxu0/OmMZ4Lg3xKAns148rCaXP6ntAoEkVYZThWjwON8AlzdZZi6oqnhNbxUG9hVg=="],
+
+ "@babel/core/semver": ["semver@6.3.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="],
+
+ "@babel/helper-compilation-targets/lru-cache": ["lru-cache@5.1.1", "", { "dependencies": { "yallist": "^3.0.2" } }, "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w=="],
+
+ "@babel/helper-compilation-targets/semver": ["semver@6.3.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="],
+
+ "@babel/helper-create-class-features-plugin/semver": ["semver@6.3.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="],
+
+ "@babel/helper-create-regexp-features-plugin/semver": ["semver@6.3.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="],
+
+ "@babel/preset-env/semver": ["semver@6.3.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="],
+
+ "@commitlint/config-conventional/conventional-changelog-conventionalcommits": ["conventional-changelog-conventionalcommits@7.0.2", "", { "dependencies": { "compare-func": "^2.0.0" } }, "sha512-NKXYmMR/Hr1DevQegFB4MwfM5Vv0m4UIxKZTTYuD98lpTknaZlSRrDOG4X7wIXpGkfsYxZTghUN+Qq+T0YQI7w=="],
+
+ "@commitlint/config-validator/ajv": ["ajv@8.12.0", "", { "dependencies": { "fast-deep-equal": "^3.1.1", "json-schema-traverse": "^1.0.0", "require-from-string": "^2.0.2", "uri-js": "^4.2.2" } }, "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA=="],
+
+ "@commitlint/format/chalk": ["chalk@5.3.0", "", {}, "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w=="],
+
+ "@commitlint/load/chalk": ["chalk@5.3.0", "", {}, "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w=="],
+
+ "@commitlint/prompt/chalk": ["chalk@5.3.0", "", {}, "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w=="],
+
+ "@commitlint/resolve-extends/resolve-from": ["resolve-from@5.0.0", "", {}, "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw=="],
+
+ "@commitlint/top-level/find-up": ["find-up@7.0.0", "", { "dependencies": { "locate-path": "^7.2.0", "path-exists": "^5.0.0", "unicorn-magic": "^0.1.0" } }, "sha512-YyZM99iHrqLKjmt4LJDj58KI+fYyufRLBSYcqycxf//KpBk9FoewoGX0450m9nB44qrZnovzC2oeP5hUibxc/g=="],
+
+ "@commitlint/types/chalk": ["chalk@5.3.0", "", {}, "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w=="],
+
+ "@cspotcode/source-map-support/@jridgewell/trace-mapping": ["@jridgewell/trace-mapping@0.3.9", "", { "dependencies": { "@jridgewell/resolve-uri": "^3.0.3", "@jridgewell/sourcemap-codec": "^1.4.10" } }, "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ=="],
+
+ "@eslint-community/eslint-utils/eslint-visitor-keys": ["eslint-visitor-keys@3.4.3", "", {}, "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag=="],
+
+ "@eslint/eslintrc/globals": ["globals@14.0.0", "", {}, "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ=="],
+
+ "@fastify/ajv-compiler/ajv": ["ajv@8.12.0", "", { "dependencies": { "fast-deep-equal": "^3.1.1", "json-schema-traverse": "^1.0.0", "require-from-string": "^2.0.2", "uri-js": "^4.2.2" } }, "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA=="],
+
+ "@fastify/ajv-compiler/ajv-formats": ["ajv-formats@3.0.1", "", { "dependencies": { "ajv": "^8.0.0" } }, "sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ=="],
+
+ "@fastify/middie/@fastify/error": ["@fastify/error@3.4.1", "", {}, "sha512-wWSvph+29GR783IhmvdwWnN4bUxTD01Vm5Xad4i7i1VuAOItLvbPAb69sb0IQ2N57yprvhNIwAP5B6xfKTmjmQ=="],
+
+ "@fastify/middie/path-to-regexp": ["path-to-regexp@6.3.0", "", {}, "sha512-Yhpw4T9C6hPpgPeA28us07OJeqZ5EzQTkbfwuhsUg0c237RomFoETJgmp2sa3F/41gfLE6G5cqcYwznmeEeOlQ=="],
+
+ "@inquirer/external-editor/iconv-lite": ["iconv-lite@0.7.2", "", { "dependencies": { "safer-buffer": ">= 2.1.2 < 3.0.0" } }, "sha512-im9DjEDQ55s9fL4EYzOAv0yMqmMBSZp6G0VvFyTMPKWxiSBHUj9NW/qqLmXUwXrrM7AvqSlTCfvqRb0cM8yYqw=="],
+
+ "@isaacs/cliui/string-width": ["string-width@5.1.2", "", { "dependencies": { "eastasianwidth": "^0.2.0", "emoji-regex": "^9.2.2", "strip-ansi": "^7.0.1" } }, "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA=="],
+
+ "@isaacs/cliui/strip-ansi": ["strip-ansi@7.1.2", "", { "dependencies": { "ansi-regex": "^6.0.1" } }, "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA=="],
+
+ "@isaacs/cliui/wrap-ansi": ["wrap-ansi@8.1.0", "", { "dependencies": { "ansi-styles": "^6.1.0", "string-width": "^5.0.1", "strip-ansi": "^7.0.1" } }, "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ=="],
+
+ "@istanbuljs/load-nyc-config/camelcase": ["camelcase@5.3.1", "", {}, "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg=="],
+
+ "@istanbuljs/load-nyc-config/find-up": ["find-up@4.1.0", "", { "dependencies": { "locate-path": "^5.0.0", "path-exists": "^4.0.0" } }, "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw=="],
+
+ "@istanbuljs/load-nyc-config/js-yaml": ["js-yaml@3.14.2", "", { "dependencies": { "argparse": "^1.0.7", "esprima": "^4.0.0" }, "bin": { "js-yaml": "bin/js-yaml.js" } }, "sha512-PMSmkqxr106Xa156c2M265Z+FTrPl+oxd/rgOQy2tijQeK5TxQ43psO1ZCwhVOSdnn+RzkzlRz/eY4BgJBYVpg=="],
+
+ "@istanbuljs/load-nyc-config/resolve-from": ["resolve-from@5.0.0", "", {}, "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw=="],
+
+ "@jest/console/@types/node": ["@types/node@22.19.7", "", { "dependencies": { "undici-types": "~6.21.0" } }, "sha512-MciR4AKGHWl7xwxkBa6xUGxQJ4VBOmPTF7sL+iGzuahOFaO0jHCsuEfS80pan1ef4gWId1oWOweIhrDEYLuaOw=="],
+
+ "@jest/core/@types/node": ["@types/node@22.19.7", "", { "dependencies": { "undici-types": "~6.21.0" } }, "sha512-MciR4AKGHWl7xwxkBa6xUGxQJ4VBOmPTF7sL+iGzuahOFaO0jHCsuEfS80pan1ef4gWId1oWOweIhrDEYLuaOw=="],
+
+ "@jest/environment/@types/node": ["@types/node@22.19.7", "", { "dependencies": { "undici-types": "~6.21.0" } }, "sha512-MciR4AKGHWl7xwxkBa6xUGxQJ4VBOmPTF7sL+iGzuahOFaO0jHCsuEfS80pan1ef4gWId1oWOweIhrDEYLuaOw=="],
+
+ "@jest/fake-timers/@types/node": ["@types/node@22.19.7", "", { "dependencies": { "undici-types": "~6.21.0" } }, "sha512-MciR4AKGHWl7xwxkBa6xUGxQJ4VBOmPTF7sL+iGzuahOFaO0jHCsuEfS80pan1ef4gWId1oWOweIhrDEYLuaOw=="],
+
+ "@jest/reporters/@types/node": ["@types/node@22.19.7", "", { "dependencies": { "undici-types": "~6.21.0" } }, "sha512-MciR4AKGHWl7xwxkBa6xUGxQJ4VBOmPTF7sL+iGzuahOFaO0jHCsuEfS80pan1ef4gWId1oWOweIhrDEYLuaOw=="],
+
+ "@jest/reporters/glob": ["glob@7.2.3", "", { "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", "inherits": "2", "minimatch": "^3.1.1", "once": "^1.3.0", "path-is-absolute": "^1.0.0" } }, "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q=="],
+
+ "@jest/reporters/jest-worker": ["jest-worker@29.7.0", "", { "dependencies": { "@types/node": "*", "jest-util": "^29.7.0", "merge-stream": "^2.0.0", "supports-color": "^8.0.0" } }, "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw=="],
+
+ "@jest/types/@types/node": ["@types/node@22.19.7", "", { "dependencies": { "undici-types": "~6.21.0" } }, "sha512-MciR4AKGHWl7xwxkBa6xUGxQJ4VBOmPTF7sL+iGzuahOFaO0jHCsuEfS80pan1ef4gWId1oWOweIhrDEYLuaOw=="],
+
+ "@mdx-js/mdx/unist-util-visit": ["unist-util-visit@4.1.2", "", { "dependencies": { "@types/unist": "^2.0.0", "unist-util-is": "^5.0.0", "unist-util-visit-parents": "^5.1.1" } }, "sha512-MSd8OUGISqHdVvfY9TPhyK2VdUrPgxkUtWSuMHF6XAAFuL4LokseigBnZtPnJMu+FbynTkFNnFlyjxpVKujMRg=="],
+
+ "@mole-inc/bin-wrapper/got": ["got@11.8.6", "", { "dependencies": { "@sindresorhus/is": "^4.0.0", "@szmarczak/http-timer": "^4.0.5", "@types/cacheable-request": "^6.0.1", "@types/responselike": "^1.0.0", "cacheable-lookup": "^5.0.3", "cacheable-request": "^7.0.2", "decompress-response": "^6.0.0", "http2-wrapper": "^1.0.0-beta.5.2", "lowercase-keys": "^2.0.0", "p-cancelable": "^2.0.0", "responselike": "^2.0.0" } }, "sha512-6tfZ91bOr7bOXnK7PRDCGBLa1H4U080YHNaAQ2KsMGlLEzRbk44nsZF2E1IeRc3vtJHPVbKCYgdFbaGO2ljd8g=="],
+
+ "@nestjs/cli/@nestjs/schematics": ["@nestjs/schematics@9.2.0", "", { "dependencies": { "@angular-devkit/core": "16.0.1", "@angular-devkit/schematics": "16.0.1", "jsonc-parser": "3.2.0", "pluralize": "8.0.0" }, "peerDependencies": { "typescript": ">=4.3.5" } }, "sha512-wHpNJDPzM6XtZUOB3gW0J6mkFCSJilzCM3XrHI1o0C8vZmFE1snbmkIXNyoi1eV0Nxh1BMymcgz5vIMJgQtTqw=="],
+
+ "@nestjs/cli/chokidar": ["chokidar@3.5.3", "", { "dependencies": { "anymatch": "~3.1.2", "braces": "~3.0.2", "glob-parent": "~5.1.2", "is-binary-path": "~2.1.0", "is-glob": "~4.0.1", "normalize-path": "~3.0.0", "readdirp": "~3.6.0" }, "optionalDependencies": { "fsevents": "~2.3.2" } }, "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw=="],
+
+ "@nestjs/cli/inquirer": ["inquirer@8.2.5", "", { "dependencies": { "ansi-escapes": "^4.2.1", "chalk": "^4.1.1", "cli-cursor": "^3.1.0", "cli-width": "^3.0.0", "external-editor": "^3.0.3", "figures": "^3.0.0", "lodash": "^4.17.21", "mute-stream": "0.0.8", "ora": "^5.4.1", "run-async": "^2.4.0", "rxjs": "^7.5.5", "string-width": "^4.1.0", "strip-ansi": "^6.0.0", "through": "^2.3.6", "wrap-ansi": "^7.0.0" } }, "sha512-QAgPDQMEgrDssk1XiwwHoOGYF9BAbUcc1+j+FhEvaOt8/cKRqyLn0U5qA6F74fGhTMGxf92pOvPBeh29jQJDTQ=="],
+
+ "@nestjs/cli/typescript": ["typescript@4.9.5", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g=="],
+
+ "@nestjs/common/tslib": ["tslib@2.6.3", "", {}, "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ=="],
+
+ "@nestjs/core/tslib": ["tslib@2.6.3", "", {}, "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ=="],
+
+ "@nestjs/platform-express/tslib": ["tslib@2.6.3", "", {}, "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ=="],
+
+ "@nestjs/platform-fastify/fastify": ["fastify@4.28.1", "", { "dependencies": { "@fastify/ajv-compiler": "^3.5.0", "@fastify/error": "^3.4.0", "@fastify/fast-json-stringify-compiler": "^4.3.0", "abstract-logging": "^2.0.1", "avvio": "^8.3.0", "fast-content-type-parse": "^1.1.0", "fast-json-stringify": "^5.8.0", "find-my-way": "^8.0.0", "light-my-request": "^5.11.0", "pino": "^9.0.0", "process-warning": "^3.0.0", "proxy-addr": "^2.0.7", "rfdc": "^1.3.0", "secure-json-parse": "^2.7.0", "semver": "^7.5.4", "toad-cache": "^3.3.0" } }, "sha512-kFWUtpNr4i7t5vY2EJPCN2KgMVpuqfU4NjnJNCgiNB900oiDeYqaNDRcAfeBbOF5hGixixxcKnOU4KN9z6QncQ=="],
+
+ "@nestjs/platform-fastify/path-to-regexp": ["path-to-regexp@3.3.0", "", {}, "sha512-qyCH421YQPS2WFDxDjftfc1ZR5WKQzVzqsp4n9M2kQhVOo/ByahFoUNJfl58kOcEGfQ//7weFTDhm+ss8Ecxgw=="],
+
+ "@nestjs/schematics/@angular-devkit/core": ["@angular-devkit/core@17.3.11", "", { "dependencies": { "ajv": "8.12.0", "ajv-formats": "2.1.1", "jsonc-parser": "3.2.1", "picomatch": "4.0.1", "rxjs": "7.8.1", "source-map": "0.7.4" }, "peerDependencies": { "chokidar": "^3.5.2" }, "optionalPeers": ["chokidar"] }, "sha512-vTNDYNsLIWpYk2I969LMQFH29GTsLzxNk/0cLw5q56ARF0v5sIWfHYwGTS88jdDqIpuuettcSczbxeA7EuAmqQ=="],
+
+ "@nestjs/schematics/@angular-devkit/schematics": ["@angular-devkit/schematics@17.3.11", "", { "dependencies": { "@angular-devkit/core": "17.3.11", "jsonc-parser": "3.2.1", "magic-string": "0.30.8", "ora": "5.4.1", "rxjs": "7.8.1" } }, "sha512-I5wviiIqiFwar9Pdk30Lujk8FczEEc18i22A5c6Z9lbmhPQdTroDnEQdsfXjy404wPe8H62s0I15o4pmMGfTYQ=="],
+
+ "@nestjs/testing/tslib": ["tslib@2.6.3", "", {}, "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ=="],
+
+ "@next/eslint-plugin-next/glob": ["glob@10.3.10", "", { "dependencies": { "foreground-child": "^3.1.0", "jackspeak": "^2.3.5", "minimatch": "^9.0.1", "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0", "path-scurry": "^1.10.1" }, "bin": { "glob": "dist/esm/bin.mjs" } }, "sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g=="],
+
+ "@nuxtjs/opencollective/node-fetch": ["node-fetch@2.7.0", "", { "dependencies": { "whatwg-url": "^5.0.0" }, "peerDependencies": { "encoding": "^0.1.0" }, "optionalPeers": ["encoding"] }, "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A=="],
+
+ "@octokit/plugin-paginate-rest/@octokit/types": ["@octokit/types@12.6.0", "", { "dependencies": { "@octokit/openapi-types": "^20.0.0" } }, "sha512-1rhSOfRa6H9w4YwK0yrf5faDaDTb+yLyBUKOCV4xtCDB5VmIPqd/v9yr9o6SAzOAlRxMiRiCic6JVM1/kunVkw=="],
+
+ "@octokit/plugin-rest-endpoint-methods/@octokit/types": ["@octokit/types@12.6.0", "", { "dependencies": { "@octokit/openapi-types": "^20.0.0" } }, "sha512-1rhSOfRa6H9w4YwK0yrf5faDaDTb+yLyBUKOCV4xtCDB5VmIPqd/v9yr9o6SAzOAlRxMiRiCic6JVM1/kunVkw=="],
+
+ "@pnpm/network.ca-file/graceful-fs": ["graceful-fs@4.2.10", "", {}, "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA=="],
+
+ "@svgr/core/cosmiconfig": ["cosmiconfig@8.3.6", "", { "dependencies": { "import-fresh": "^3.3.0", "js-yaml": "^4.1.0", "parse-json": "^5.2.0", "path-type": "^4.0.0" }, "peerDependencies": { "typescript": ">=4.9.5" }, "optionalPeers": ["typescript"] }, "sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA=="],
+
+ "@svgr/plugin-svgo/cosmiconfig": ["cosmiconfig@8.3.6", "", { "dependencies": { "import-fresh": "^3.3.0", "js-yaml": "^4.1.0", "parse-json": "^5.2.0", "path-type": "^4.0.0" }, "peerDependencies": { "typescript": ">=4.9.5" }, "optionalPeers": ["typescript"] }, "sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA=="],
+
+ "@swc/cli/commander": ["commander@8.3.0", "", {}, "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww=="],
+
+ "@swc/cli/minimatch": ["minimatch@9.0.5", "", { "dependencies": { "brace-expansion": "^2.0.1" } }, "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow=="],
+
+ "@ts-morph/common/minimatch": ["minimatch@9.0.5", "", { "dependencies": { "brace-expansion": "^2.0.1" } }, "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow=="],
+
+ "@types/body-parser/@types/node": ["@types/node@22.19.7", "", { "dependencies": { "undici-types": "~6.21.0" } }, "sha512-MciR4AKGHWl7xwxkBa6xUGxQJ4VBOmPTF7sL+iGzuahOFaO0jHCsuEfS80pan1ef4gWId1oWOweIhrDEYLuaOw=="],
+
+ "@types/cacheable-request/@types/node": ["@types/node@22.19.7", "", { "dependencies": { "undici-types": "~6.21.0" } }, "sha512-MciR4AKGHWl7xwxkBa6xUGxQJ4VBOmPTF7sL+iGzuahOFaO0jHCsuEfS80pan1ef4gWId1oWOweIhrDEYLuaOw=="],
+
+ "@types/connect/@types/node": ["@types/node@22.19.7", "", { "dependencies": { "undici-types": "~6.21.0" } }, "sha512-MciR4AKGHWl7xwxkBa6xUGxQJ4VBOmPTF7sL+iGzuahOFaO0jHCsuEfS80pan1ef4gWId1oWOweIhrDEYLuaOw=="],
+
+ "@types/conventional-commits-parser/@types/node": ["@types/node@22.19.7", "", { "dependencies": { "undici-types": "~6.21.0" } }, "sha512-MciR4AKGHWl7xwxkBa6xUGxQJ4VBOmPTF7sL+iGzuahOFaO0jHCsuEfS80pan1ef4gWId1oWOweIhrDEYLuaOw=="],
+
+ "@types/express-serve-static-core/@types/node": ["@types/node@22.19.7", "", { "dependencies": { "undici-types": "~6.21.0" } }, "sha512-MciR4AKGHWl7xwxkBa6xUGxQJ4VBOmPTF7sL+iGzuahOFaO0jHCsuEfS80pan1ef4gWId1oWOweIhrDEYLuaOw=="],
+
+ "@types/graceful-fs/@types/node": ["@types/node@22.19.7", "", { "dependencies": { "undici-types": "~6.21.0" } }, "sha512-MciR4AKGHWl7xwxkBa6xUGxQJ4VBOmPTF7sL+iGzuahOFaO0jHCsuEfS80pan1ef4gWId1oWOweIhrDEYLuaOw=="],
+
+ "@types/keyv/@types/node": ["@types/node@22.19.7", "", { "dependencies": { "undici-types": "~6.21.0" } }, "sha512-MciR4AKGHWl7xwxkBa6xUGxQJ4VBOmPTF7sL+iGzuahOFaO0jHCsuEfS80pan1ef4gWId1oWOweIhrDEYLuaOw=="],
+
+ "@types/mdast/@types/unist": ["@types/unist@2.0.11", "", {}, "sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA=="],
+
+ "@types/responselike/@types/node": ["@types/node@22.19.7", "", { "dependencies": { "undici-types": "~6.21.0" } }, "sha512-MciR4AKGHWl7xwxkBa6xUGxQJ4VBOmPTF7sL+iGzuahOFaO0jHCsuEfS80pan1ef4gWId1oWOweIhrDEYLuaOw=="],
+
+ "@types/send/@types/node": ["@types/node@22.19.7", "", { "dependencies": { "undici-types": "~6.21.0" } }, "sha512-MciR4AKGHWl7xwxkBa6xUGxQJ4VBOmPTF7sL+iGzuahOFaO0jHCsuEfS80pan1ef4gWId1oWOweIhrDEYLuaOw=="],
+
+ "@types/serve-static/@types/node": ["@types/node@22.19.7", "", { "dependencies": { "undici-types": "~6.21.0" } }, "sha512-MciR4AKGHWl7xwxkBa6xUGxQJ4VBOmPTF7sL+iGzuahOFaO0jHCsuEfS80pan1ef4gWId1oWOweIhrDEYLuaOw=="],
+
+ "@types/superagent/@types/node": ["@types/node@22.19.7", "", { "dependencies": { "undici-types": "~6.21.0" } }, "sha512-MciR4AKGHWl7xwxkBa6xUGxQJ4VBOmPTF7sL+iGzuahOFaO0jHCsuEfS80pan1ef4gWId1oWOweIhrDEYLuaOw=="],
+
+ "@typescript-eslint/eslint-plugin/ignore": ["ignore@7.0.5", "", {}, "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg=="],
+
+ "@typescript-eslint/typescript-estree/minimatch": ["minimatch@9.0.5", "", { "dependencies": { "brace-expansion": "^2.0.1" } }, "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow=="],
+
+ "ajv-formats/ajv": ["ajv@8.12.0", "", { "dependencies": { "fast-deep-equal": "^3.1.1", "json-schema-traverse": "^1.0.0", "require-from-string": "^2.0.2", "uri-js": "^4.2.2" } }, "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA=="],
+
+ "ansi-escapes/type-fest": ["type-fest@0.21.3", "", {}, "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w=="],
+
+ "babel-plugin-istanbul/istanbul-lib-instrument": ["istanbul-lib-instrument@5.2.1", "", { "dependencies": { "@babel/core": "^7.12.3", "@babel/parser": "^7.14.7", "@istanbuljs/schema": "^0.1.2", "istanbul-lib-coverage": "^3.2.0", "semver": "^6.3.0" } }, "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg=="],
+
+ "babel-plugin-polyfill-corejs2/semver": ["semver@6.3.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="],
+
+ "bin-check/execa": ["execa@0.7.0", "", { "dependencies": { "cross-spawn": "^5.0.1", "get-stream": "^3.0.0", "is-stream": "^1.1.0", "npm-run-path": "^2.0.0", "p-finally": "^1.0.0", "signal-exit": "^3.0.0", "strip-eof": "^1.0.0" } }, "sha512-RztN09XglpYI7aBBrJCPW95jEH7YF1UEPOoX9yDhUTPdp7mK+CQvnLTuD10BNXZ3byLTu2uehZ8EcKT/4CGiFw=="],
+
+ "bin-version/execa": ["execa@5.1.1", "", { "dependencies": { "cross-spawn": "^7.0.3", "get-stream": "^6.0.0", "human-signals": "^2.1.0", "is-stream": "^2.0.0", "merge-stream": "^2.0.0", "npm-run-path": "^4.0.1", "onetime": "^5.1.2", "signal-exit": "^3.0.3", "strip-final-newline": "^2.0.0" } }, "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg=="],
+
+ "body-parser/debug": ["debug@2.6.9", "", { "dependencies": { "ms": "2.0.0" } }, "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA=="],
+
+ "body-parser/qs": ["qs@6.11.0", "", { "dependencies": { "side-channel": "^1.0.4" } }, "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q=="],
+
+ "boxen/camelcase": ["camelcase@7.0.1", "", {}, "sha512-xlx1yCK2Oc1APsPXDL2LdlNP6+uu8OCDdhOBSVT279M/S+y75O30C2VuD8T2ogdePBBl7PfPF4504tnLgX3zfw=="],
+
+ "boxen/chalk": ["chalk@5.3.0", "", {}, "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w=="],
+
+ "boxen/string-width": ["string-width@5.1.2", "", { "dependencies": { "eastasianwidth": "^0.2.0", "emoji-regex": "^9.2.2", "strip-ansi": "^7.0.1" } }, "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA=="],
+
+ "boxen/type-fest": ["type-fest@2.19.0", "", {}, "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA=="],
+
+ "boxen/wrap-ansi": ["wrap-ansi@8.1.0", "", { "dependencies": { "ansi-styles": "^6.1.0", "string-width": "^5.0.1", "strip-ansi": "^7.0.1" } }, "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ=="],
+
+ "cacheable-request/get-stream": ["get-stream@6.0.1", "", {}, "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg=="],
+
+ "chokidar/glob-parent": ["glob-parent@5.1.2", "", { "dependencies": { "is-glob": "^4.0.1" } }, "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow=="],
+
+ "cli-truncate/string-width": ["string-width@7.2.0", "", { "dependencies": { "emoji-regex": "^10.3.0", "get-east-asian-width": "^1.0.0", "strip-ansi": "^7.1.0" } }, "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ=="],
+
+ "clipboardy/execa": ["execa@0.8.0", "", { "dependencies": { "cross-spawn": "^5.0.1", "get-stream": "^3.0.0", "is-stream": "^1.1.0", "npm-run-path": "^2.0.0", "p-finally": "^1.0.0", "signal-exit": "^3.0.0", "strip-eof": "^1.0.0" } }, "sha512-zDWS+Rb1E8BlqqhALSt9kUhss8Qq4nN3iof3gsOdyINksElaPyNBtKUMTR62qhvgVWR0CqCX7sdnKe4MnUbFEA=="],
+
+ "cliui/wrap-ansi": ["wrap-ansi@7.0.0", "", { "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", "strip-ansi": "^6.0.0" } }, "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q=="],
+
+ "clone-response/mimic-response": ["mimic-response@1.0.1", "", {}, "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ=="],
+
+ "config-chain/ini": ["ini@1.3.8", "", {}, "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew=="],
+
+ "configstore/dot-prop": ["dot-prop@6.0.1", "", { "dependencies": { "is-obj": "^2.0.0" } }, "sha512-tE7ztYzXHIeyvc7N+hR3oi7FIbf/NIjVP9hmAt3yMXzrQ072/fpjGLx2GxNxGxUl5V73MEqYzioOMoVhGMJ5cA=="],
+
+ "configstore/write-file-atomic": ["write-file-atomic@3.0.3", "", { "dependencies": { "imurmurhash": "^0.1.4", "is-typedarray": "^1.0.0", "signal-exit": "^3.0.2", "typedarray-to-buffer": "^3.1.5" } }, "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q=="],
+
+ "conventional-changelog/conventional-changelog-conventionalcommits": ["conventional-changelog-conventionalcommits@7.0.2", "", { "dependencies": { "compare-func": "^2.0.0" } }, "sha512-NKXYmMR/Hr1DevQegFB4MwfM5Vv0m4UIxKZTTYuD98lpTknaZlSRrDOG4X7wIXpGkfsYxZTghUN+Qq+T0YQI7w=="],
+
+ "conventional-changelog-core/git-semver-tags": ["git-semver-tags@7.0.1", "", { "dependencies": { "meow": "^12.0.1", "semver": "^7.5.2" }, "bin": { "git-semver-tags": "cli.mjs" } }, "sha512-NY0ZHjJzyyNXHTDZmj+GG7PyuAKtMsyWSwh07CR2hOZFa+/yoTsXci/nF2obzL8UDhakFNkD9gNdt/Ed+cxh2Q=="],
+
+ "conventional-recommended-bump/git-semver-tags": ["git-semver-tags@7.0.1", "", { "dependencies": { "meow": "^12.0.1", "semver": "^7.5.2" }, "bin": { "git-semver-tags": "cli.mjs" } }, "sha512-NY0ZHjJzyyNXHTDZmj+GG7PyuAKtMsyWSwh07CR2hOZFa+/yoTsXci/nF2obzL8UDhakFNkD9gNdt/Ed+cxh2Q=="],
+
+ "cosmiconfig-typescript-loader/jiti": ["jiti@2.6.1", "", { "bin": { "jiti": "lib/jiti-cli.mjs" } }, "sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ=="],
+
+ "crypto-random-string/type-fest": ["type-fest@1.4.0", "", {}, "sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA=="],
+
+ "csso/css-tree": ["css-tree@2.2.1", "", { "dependencies": { "mdn-data": "2.0.28", "source-map-js": "^1.0.1" } }, "sha512-OA0mILzGc1kCOCSJerOeqDxDQ4HOh+G8NbOJFOTgOCzpw7fCBubk0fEyxp8AgOL/jvLgYA/uV0cMbe43ElF1JA=="],
+
+ "d3-dsv/commander": ["commander@7.2.0", "", {}, "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw=="],
+
+ "d3-dsv/iconv-lite": ["iconv-lite@0.6.3", "", { "dependencies": { "safer-buffer": ">= 2.1.2 < 3.0.0" } }, "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw=="],
+
+ "d3-sankey/d3-array": ["d3-array@2.12.1", "", { "dependencies": { "internmap": "^1.0.0" } }, "sha512-B0ErZK/66mHtEsR1TkPEEkwdy+WDesimkM5gpZr5Dsg54BiTA5RXtYW5qTLIAcekaS9xfZrzBLF/OAkB3Qn1YQ=="],
+
+ "d3-sankey/d3-shape": ["d3-shape@1.3.7", "", { "dependencies": { "d3-path": "1" } }, "sha512-EUkvKjqPFUAZyOlhY5gzCxCeI0Aep04LwIRpsZ/mLFelJiUfnK56jo5JMDSE7yyP2kLSb6LtF+S5chMk7uqPqw=="],
+
+ "decompress-response/mimic-response": ["mimic-response@3.1.0", "", {}, "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ=="],
+
+ "escodegen/source-map": ["source-map@0.6.1", "", {}, "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="],
+
+ "eslint/@eslint/js": ["@eslint/js@9.7.0", "", {}, "sha512-ChuWDQenef8OSFnvuxv0TCVxEwmu3+hPNKvM9B34qpM0rDRbjL8t5QkQeHHeAfsKQjuH9wS82WeCi1J/owatng=="],
+
+ "eslint-import-resolver-node/debug": ["debug@3.2.7", "", { "dependencies": { "ms": "^2.1.1" } }, "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ=="],
+
+ "eslint-module-utils/debug": ["debug@3.2.7", "", { "dependencies": { "ms": "^2.1.1" } }, "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ=="],
+
+ "eslint-plugin-import/debug": ["debug@3.2.7", "", { "dependencies": { "ms": "^2.1.1" } }, "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ=="],
+
+ "eslint-plugin-import/semver": ["semver@6.3.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="],
+
+ "eslint-plugin-import/tsconfig-paths": ["tsconfig-paths@3.15.0", "", { "dependencies": { "@types/json5": "^0.0.29", "json5": "^1.0.2", "minimist": "^1.2.6", "strip-bom": "^3.0.0" } }, "sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg=="],
+
+ "eslint-plugin-react/resolve": ["resolve@2.0.0-next.5", "", { "dependencies": { "is-core-module": "^2.13.0", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, "bin": { "resolve": "bin/resolve" } }, "sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA=="],
+
+ "eslint-plugin-react/semver": ["semver@6.3.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="],
+
+ "estree-util-visit/@types/unist": ["@types/unist@2.0.11", "", {}, "sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA=="],
+
+ "example-nestjs-express/@nestjs/cli": ["@nestjs/cli@10.4.4", "", { "dependencies": { "@angular-devkit/core": "17.3.8", "@angular-devkit/schematics": "17.3.8", "@angular-devkit/schematics-cli": "17.3.8", "@nestjs/schematics": "^10.0.1", "chalk": "4.1.2", "chokidar": "3.6.0", "cli-table3": "0.6.5", "commander": "4.1.1", "fork-ts-checker-webpack-plugin": "9.0.2", "glob": "10.4.2", "inquirer": "8.2.6", "node-emoji": "1.11.0", "ora": "5.4.1", "tree-kill": "1.2.2", "tsconfig-paths": "4.2.0", "tsconfig-paths-webpack-plugin": "4.1.0", "typescript": "5.3.3", "webpack": "5.93.0", "webpack-node-externals": "3.0.0" }, "peerDependencies": { "@swc/cli": "^0.1.62 || ^0.3.0 || ^0.4.0", "@swc/core": "^1.3.62" }, "optionalPeers": ["@swc/cli", "@swc/core"], "bin": { "nest": "bin/nest.js" } }, "sha512-WKERbSZJGof0+9XeeMmWnb/9FpNxogcB5eTJTHjc9no0ymdTw3jTzT+KZL9iC/hGqBpuomDLaNFCYbAOt29nBw=="],
+
+ "example-nestjs-express/@types/node": ["@types/node@22.19.7", "", { "dependencies": { "undici-types": "~6.21.0" } }, "sha512-MciR4AKGHWl7xwxkBa6xUGxQJ4VBOmPTF7sL+iGzuahOFaO0jHCsuEfS80pan1ef4gWId1oWOweIhrDEYLuaOw=="],
+
+ "example-nestjs-fastify/@nestjs/cli": ["@nestjs/cli@10.4.4", "", { "dependencies": { "@angular-devkit/core": "17.3.8", "@angular-devkit/schematics": "17.3.8", "@angular-devkit/schematics-cli": "17.3.8", "@nestjs/schematics": "^10.0.1", "chalk": "4.1.2", "chokidar": "3.6.0", "cli-table3": "0.6.5", "commander": "4.1.1", "fork-ts-checker-webpack-plugin": "9.0.2", "glob": "10.4.2", "inquirer": "8.2.6", "node-emoji": "1.11.0", "ora": "5.4.1", "tree-kill": "1.2.2", "tsconfig-paths": "4.2.0", "tsconfig-paths-webpack-plugin": "4.1.0", "typescript": "5.3.3", "webpack": "5.93.0", "webpack-node-externals": "3.0.0" }, "peerDependencies": { "@swc/cli": "^0.1.62 || ^0.3.0 || ^0.4.0", "@swc/core": "^1.3.62" }, "optionalPeers": ["@swc/cli", "@swc/core"], "bin": { "nest": "bin/nest.js" } }, "sha512-WKERbSZJGof0+9XeeMmWnb/9FpNxogcB5eTJTHjc9no0ymdTw3jTzT+KZL9iC/hGqBpuomDLaNFCYbAOt29nBw=="],
+
+ "example-nestjs-fastify/@types/node": ["@types/node@22.19.7", "", { "dependencies": { "undici-types": "~6.21.0" } }, "sha512-MciR4AKGHWl7xwxkBa6xUGxQJ4VBOmPTF7sL+iGzuahOFaO0jHCsuEfS80pan1ef4gWId1oWOweIhrDEYLuaOw=="],
+
+ "express/cookie-signature": ["cookie-signature@1.0.6", "", {}, "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ=="],
+
+ "express/debug": ["debug@2.6.9", "", { "dependencies": { "ms": "2.0.0" } }, "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA=="],
+
+ "express/path-to-regexp": ["path-to-regexp@0.1.7", "", {}, "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ=="],
+
+ "express/qs": ["qs@6.11.0", "", { "dependencies": { "side-channel": "^1.0.4" } }, "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q=="],
+
+ "external-editor/chardet": ["chardet@0.7.0", "", {}, "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA=="],
+
+ "fast-glob/glob-parent": ["glob-parent@5.1.2", "", { "dependencies": { "is-glob": "^4.0.1" } }, "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow=="],
+
+ "fast-json-stringify/ajv": ["ajv@8.12.0", "", { "dependencies": { "fast-deep-equal": "^3.1.1", "json-schema-traverse": "^1.0.0", "require-from-string": "^2.0.2", "uri-js": "^4.2.2" } }, "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA=="],
+
+ "fast-json-stringify/ajv-formats": ["ajv-formats@3.0.1", "", { "dependencies": { "ajv": "^8.0.0" } }, "sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ=="],
+
+ "figures/escape-string-regexp": ["escape-string-regexp@1.0.5", "", {}, "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg=="],
+
+ "filelist/minimatch": ["minimatch@5.1.6", "", { "dependencies": { "brace-expansion": "^2.0.1" } }, "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g=="],
+
+ "finalhandler/debug": ["debug@2.6.9", "", { "dependencies": { "ms": "2.0.0" } }, "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA=="],
+
+ "fork-ts-checker-webpack-plugin/cosmiconfig": ["cosmiconfig@7.1.0", "", { "dependencies": { "@types/parse-json": "^4.0.0", "import-fresh": "^3.2.1", "parse-json": "^5.0.0", "path-type": "^4.0.0", "yaml": "^1.10.0" } }, "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA=="],
+
+ "get-uri/data-uri-to-buffer": ["data-uri-to-buffer@6.0.2", "", {}, "sha512-7hvf7/GW8e86rW0ptuwS3OcBGDjIi6SZva7hCyWC0yYry2cOPmLIjXAUHI6DK2HsnwJd9ifmt57i8eV2n4YNpw=="],
+
+ "git-semver-tags/meow": ["meow@13.2.0", "", {}, "sha512-pxQJQzB6djGPXh08dacEloMFopsOqGVRKFPYvPOt9XDZ1HasbgDZA74CJGreSU4G3Ak7EFJGoiH2auq+yXISgA=="],
+
+ "glob/minimatch": ["minimatch@8.0.4", "", { "dependencies": { "brace-expansion": "^2.0.1" } }, "sha512-W0Wvr9HyFXZRGIDgCicunpQ299OKXs9RgZfaukz4qAW/pJhcpUfupc9c+OObPOFueNy8VSrZgEmDtk6Kh4WzDA=="],
+
+ "global-dirs/ini": ["ini@2.0.0", "", {}, "sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA=="],
+
+ "globby/slash": ["slash@5.1.0", "", {}, "sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg=="],
+
+ "got/get-stream": ["get-stream@6.0.1", "", {}, "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg=="],
+
+ "gray-matter/js-yaml": ["js-yaml@3.14.2", "", { "dependencies": { "argparse": "^1.0.7", "esprima": "^4.0.0" }, "bin": { "js-yaml": "bin/js-yaml.js" } }, "sha512-PMSmkqxr106Xa156c2M265Z+FTrPl+oxd/rgOQy2tijQeK5TxQ43psO1ZCwhVOSdnn+RzkzlRz/eY4BgJBYVpg=="],
+
+ "handlebars/source-map": ["source-map@0.6.1", "", {}, "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="],
+
+ "hash-obj/is-obj": ["is-obj@3.0.0", "", {}, "sha512-IlsXEHOjtKhpN8r/tRFj2nDyTmHvcfNeu/nrRIcXE17ROeatXchkojffa1SpdqW4cr/Fj6QkEf/Gn4zf6KKvEQ=="],
+
+ "hash-obj/type-fest": ["type-fest@1.4.0", "", {}, "sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA=="],
+
+ "hast-util-from-html/vfile": ["vfile@6.0.3", "", { "dependencies": { "@types/unist": "^3.0.0", "vfile-message": "^4.0.0" } }, "sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q=="],
+
+ "hast-util-from-html/vfile-message": ["vfile-message@4.0.3", "", { "dependencies": { "@types/unist": "^3.0.0", "unist-util-stringify-position": "^4.0.0" } }, "sha512-QTHzsGd1EhbZs4AsQ20JX1rC3cOlt/IWJruk893DfLRr57lcnOeMaWG4K0JrRta4mIJZKth2Au3mM3u03/JWKw=="],
+
+ "hast-util-from-parse5/property-information": ["property-information@7.1.0", "", {}, "sha512-TwEZ+X+yCJmYfL7TPUOcvBZ4QfoT5YenQiJuX//0th53DE6w0xxLEtfK3iyryQFddXuvkIk51EEgrJQ0WJkOmQ=="],
+
+ "hast-util-from-parse5/vfile": ["vfile@6.0.3", "", { "dependencies": { "@types/unist": "^3.0.0", "vfile-message": "^4.0.0" } }, "sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q=="],
+
+ "hast-util-raw/mdast-util-to-hast": ["mdast-util-to-hast@13.2.1", "", { "dependencies": { "@types/hast": "^3.0.0", "@types/mdast": "^4.0.0", "@ungap/structured-clone": "^1.0.0", "devlop": "^1.0.0", "micromark-util-sanitize-uri": "^2.0.0", "trim-lines": "^3.0.0", "unist-util-position": "^5.0.0", "unist-util-visit": "^5.0.0", "vfile": "^6.0.0" } }, "sha512-cctsq2wp5vTsLIcaymblUriiTcZd0CwWtCbLvrOzYCDZoWyMNV8sZ7krj09FSnsiJi3WVsHLM4k6Dq/yaPyCXA=="],
+
+ "hast-util-raw/unist-util-position": ["unist-util-position@5.0.0", "", { "dependencies": { "@types/unist": "^3.0.0" } }, "sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA=="],
+
+ "hast-util-raw/vfile": ["vfile@6.0.3", "", { "dependencies": { "@types/unist": "^3.0.0", "vfile-message": "^4.0.0" } }, "sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q=="],
+
+ "hast-util-to-estree/@types/hast": ["@types/hast@2.3.10", "", { "dependencies": { "@types/unist": "^2" } }, "sha512-McWspRw8xx8J9HurkVBfYj0xKoE25tOFlHGdx4MJ5xORQrMGZNqJhVQWaIbm6Oyla5kYOXtDiopzKRJzEOkwJw=="],
+
+ "hast-util-to-estree/@types/unist": ["@types/unist@2.0.11", "", {}, "sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA=="],
+
+ "hast-util-to-parse5/property-information": ["property-information@7.1.0", "", {}, "sha512-TwEZ+X+yCJmYfL7TPUOcvBZ4QfoT5YenQiJuX//0th53DE6w0xxLEtfK3iyryQFddXuvkIk51EEgrJQ0WJkOmQ=="],
+
+ "hastscript/property-information": ["property-information@7.1.0", "", {}, "sha512-TwEZ+X+yCJmYfL7TPUOcvBZ4QfoT5YenQiJuX//0th53DE6w0xxLEtfK3iyryQFddXuvkIk51EEgrJQ0WJkOmQ=="],
+
+ "hosted-git-info/lru-cache": ["lru-cache@10.4.3", "", {}, "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ=="],
+
+ "istanbul-lib-source-maps/source-map": ["source-map@0.6.1", "", {}, "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="],
+
+ "jest-changed-files/execa": ["execa@5.1.1", "", { "dependencies": { "cross-spawn": "^7.0.3", "get-stream": "^6.0.0", "human-signals": "^2.1.0", "is-stream": "^2.0.0", "merge-stream": "^2.0.0", "npm-run-path": "^4.0.1", "onetime": "^5.1.2", "signal-exit": "^3.0.3", "strip-final-newline": "^2.0.0" } }, "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg=="],
+
+ "jest-circus/@types/node": ["@types/node@22.19.7", "", { "dependencies": { "undici-types": "~6.21.0" } }, "sha512-MciR4AKGHWl7xwxkBa6xUGxQJ4VBOmPTF7sL+iGzuahOFaO0jHCsuEfS80pan1ef4gWId1oWOweIhrDEYLuaOw=="],
+
+ "jest-config/glob": ["glob@7.2.3", "", { "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", "inherits": "2", "minimatch": "^3.1.1", "once": "^1.3.0", "path-is-absolute": "^1.0.0" } }, "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q=="],
+
+ "jest-environment-node/@types/node": ["@types/node@22.19.7", "", { "dependencies": { "undici-types": "~6.21.0" } }, "sha512-MciR4AKGHWl7xwxkBa6xUGxQJ4VBOmPTF7sL+iGzuahOFaO0jHCsuEfS80pan1ef4gWId1oWOweIhrDEYLuaOw=="],
+
+ "jest-haste-map/@types/node": ["@types/node@22.19.7", "", { "dependencies": { "undici-types": "~6.21.0" } }, "sha512-MciR4AKGHWl7xwxkBa6xUGxQJ4VBOmPTF7sL+iGzuahOFaO0jHCsuEfS80pan1ef4gWId1oWOweIhrDEYLuaOw=="],
+
+ "jest-haste-map/jest-worker": ["jest-worker@29.7.0", "", { "dependencies": { "@types/node": "*", "jest-util": "^29.7.0", "merge-stream": "^2.0.0", "supports-color": "^8.0.0" } }, "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw=="],
+
+ "jest-mock/@types/node": ["@types/node@22.19.7", "", { "dependencies": { "undici-types": "~6.21.0" } }, "sha512-MciR4AKGHWl7xwxkBa6xUGxQJ4VBOmPTF7sL+iGzuahOFaO0jHCsuEfS80pan1ef4gWId1oWOweIhrDEYLuaOw=="],
+
+ "jest-runner/@types/node": ["@types/node@22.19.7", "", { "dependencies": { "undici-types": "~6.21.0" } }, "sha512-MciR4AKGHWl7xwxkBa6xUGxQJ4VBOmPTF7sL+iGzuahOFaO0jHCsuEfS80pan1ef4gWId1oWOweIhrDEYLuaOw=="],
+
+ "jest-runner/jest-worker": ["jest-worker@29.7.0", "", { "dependencies": { "@types/node": "*", "jest-util": "^29.7.0", "merge-stream": "^2.0.0", "supports-color": "^8.0.0" } }, "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw=="],
+
+ "jest-runner/source-map-support": ["source-map-support@0.5.13", "", { "dependencies": { "buffer-from": "^1.0.0", "source-map": "^0.6.0" } }, "sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w=="],
+
+ "jest-runtime/@types/node": ["@types/node@22.19.7", "", { "dependencies": { "undici-types": "~6.21.0" } }, "sha512-MciR4AKGHWl7xwxkBa6xUGxQJ4VBOmPTF7sL+iGzuahOFaO0jHCsuEfS80pan1ef4gWId1oWOweIhrDEYLuaOw=="],
+
+ "jest-runtime/glob": ["glob@7.2.3", "", { "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", "inherits": "2", "minimatch": "^3.1.1", "once": "^1.3.0", "path-is-absolute": "^1.0.0" } }, "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q=="],
+
+ "jest-runtime/strip-bom": ["strip-bom@4.0.0", "", {}, "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w=="],
+
+ "jest-util/@types/node": ["@types/node@22.19.7", "", { "dependencies": { "undici-types": "~6.21.0" } }, "sha512-MciR4AKGHWl7xwxkBa6xUGxQJ4VBOmPTF7sL+iGzuahOFaO0jHCsuEfS80pan1ef4gWId1oWOweIhrDEYLuaOw=="],
+
+ "jest-watcher/@types/node": ["@types/node@22.19.7", "", { "dependencies": { "undici-types": "~6.21.0" } }, "sha512-MciR4AKGHWl7xwxkBa6xUGxQJ4VBOmPTF7sL+iGzuahOFaO0jHCsuEfS80pan1ef4gWId1oWOweIhrDEYLuaOw=="],
+
+ "jest-worker/@types/node": ["@types/node@22.19.7", "", { "dependencies": { "undici-types": "~6.21.0" } }, "sha512-MciR4AKGHWl7xwxkBa6xUGxQJ4VBOmPTF7sL+iGzuahOFaO0jHCsuEfS80pan1ef4gWId1oWOweIhrDEYLuaOw=="],
+
+ "jest-worker/supports-color": ["supports-color@8.1.1", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q=="],
+
+ "katex/commander": ["commander@8.3.0", "", {}, "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww=="],
+
+ "light-my-request/cookie": ["cookie@1.1.1", "", {}, "sha512-ei8Aos7ja0weRpFzJnEA9UHJ/7XQmqglbRwnf2ATjcB9Wq874VKH9kfjjirM6UhU2/E5fFYadylyhFldcqSidQ=="],
+
+ "light-my-request/process-warning": ["process-warning@4.0.1", "", {}, "sha512-3c2LzQ3rY9d0hc1emcsHhfT9Jwz0cChib/QN89oME2R451w5fy3f0afAhERFZAwrbDU43wk12d0ORBpDVME50Q=="],
+
+ "lint-staged/chalk": ["chalk@5.3.0", "", {}, "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w=="],
+
+ "lint-staged/commander": ["commander@12.1.0", "", {}, "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA=="],
+
+ "lint-staged/debug": ["debug@4.3.7", "", { "dependencies": { "ms": "^2.1.3" } }, "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ=="],
+
+ "lint-staged/yaml": ["yaml@2.4.5", "", { "bin": { "yaml": "bin.mjs" } }, "sha512-aBx2bnqDzVOyNKfsysjA2ms5ZlnjSAW2eG3/L5G/CSujfjLJTJsEw1bGw8kCf04KodQWk1pxlGnZ56CRxiawmg=="],
+
+ "listr2/wrap-ansi": ["wrap-ansi@9.0.2", "", { "dependencies": { "ansi-styles": "^6.2.1", "string-width": "^7.0.0", "strip-ansi": "^7.1.0" } }, "sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww=="],
+
+ "log-update/ansi-escapes": ["ansi-escapes@7.2.0", "", { "dependencies": { "environment": "^1.0.0" } }, "sha512-g6LhBsl+GBPRWGWsBtutpzBYuIIdBkLEvad5C/va/74Db018+5TZiyA26cZJAr3Rft5lprVqOIPxf5Vid6tqAw=="],
+
+ "log-update/cli-cursor": ["cli-cursor@5.0.0", "", { "dependencies": { "restore-cursor": "^5.0.0" } }, "sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw=="],
+
+ "log-update/slice-ansi": ["slice-ansi@7.1.2", "", { "dependencies": { "ansi-styles": "^6.2.1", "is-fullwidth-code-point": "^5.0.0" } }, "sha512-iOBWFgUX7caIZiuutICxVgX1SdxwAVFFKwt1EvMYYec/NWO5meOJ6K5uQxhrYBdQJne4KxiqZc+KptFOWFSI9w=="],
+
+ "log-update/strip-ansi": ["strip-ansi@7.1.2", "", { "dependencies": { "ansi-regex": "^6.0.1" } }, "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA=="],
+
+ "log-update/wrap-ansi": ["wrap-ansi@9.0.2", "", { "dependencies": { "ansi-styles": "^6.2.1", "string-width": "^7.0.0", "strip-ansi": "^7.1.0" } }, "sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww=="],
+
+ "mdast-util-definitions/@types/unist": ["@types/unist@2.0.11", "", {}, "sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA=="],
+
+ "mdast-util-definitions/unist-util-visit": ["unist-util-visit@4.1.2", "", { "dependencies": { "@types/unist": "^2.0.0", "unist-util-is": "^5.0.0", "unist-util-visit-parents": "^5.1.1" } }, "sha512-MSd8OUGISqHdVvfY9TPhyK2VdUrPgxkUtWSuMHF6XAAFuL4LokseigBnZtPnJMu+FbynTkFNnFlyjxpVKujMRg=="],
+
+ "mdast-util-find-and-replace/escape-string-regexp": ["escape-string-regexp@5.0.0", "", {}, "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw=="],
+
+ "mdast-util-find-and-replace/unist-util-is": ["unist-util-is@5.2.1", "", { "dependencies": { "@types/unist": "^2.0.0" } }, "sha512-u9njyyfEh43npf1M+yGKDGVPbY/JWEemg5nH05ncKPfi+kBbKBJoTdsogMu33uhytuLlv9y0O7GH7fEdwLdLQw=="],
+
+ "mdast-util-find-and-replace/unist-util-visit-parents": ["unist-util-visit-parents@5.1.3", "", { "dependencies": { "@types/unist": "^2.0.0", "unist-util-is": "^5.0.0" } }, "sha512-x6+y8g7wWMyQhL1iZfhIPhDAs7Xwbn9nRosDXl7qoPTSCy0yNxnKc+hWokFifWQIDGi154rdUqKvbCa4+1kLhg=="],
+
+ "mdast-util-from-markdown/@types/unist": ["@types/unist@2.0.11", "", {}, "sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA=="],
+
+ "mdast-util-mdx-expression/@types/hast": ["@types/hast@2.3.10", "", { "dependencies": { "@types/unist": "^2" } }, "sha512-McWspRw8xx8J9HurkVBfYj0xKoE25tOFlHGdx4MJ5xORQrMGZNqJhVQWaIbm6Oyla5kYOXtDiopzKRJzEOkwJw=="],
+
+ "mdast-util-mdx-jsx/@types/hast": ["@types/hast@2.3.10", "", { "dependencies": { "@types/unist": "^2" } }, "sha512-McWspRw8xx8J9HurkVBfYj0xKoE25tOFlHGdx4MJ5xORQrMGZNqJhVQWaIbm6Oyla5kYOXtDiopzKRJzEOkwJw=="],
+
+ "mdast-util-mdx-jsx/@types/unist": ["@types/unist@2.0.11", "", {}, "sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA=="],
+
+ "mdast-util-mdx-jsx/unist-util-remove-position": ["unist-util-remove-position@4.0.2", "", { "dependencies": { "@types/unist": "^2.0.0", "unist-util-visit": "^4.0.0" } }, "sha512-TkBb0HABNmxzAcfLf4qsIbFbaPDvMO6wa3b3j4VcEzFVaw1LBKwnW4/sRJ/atSLSzoIg41JWEdnE7N6DIhGDGQ=="],
+
+ "mdast-util-mdxjs-esm/@types/hast": ["@types/hast@2.3.10", "", { "dependencies": { "@types/unist": "^2" } }, "sha512-McWspRw8xx8J9HurkVBfYj0xKoE25tOFlHGdx4MJ5xORQrMGZNqJhVQWaIbm6Oyla5kYOXtDiopzKRJzEOkwJw=="],
+
+ "mdast-util-phrasing/unist-util-is": ["unist-util-is@5.2.1", "", { "dependencies": { "@types/unist": "^2.0.0" } }, "sha512-u9njyyfEh43npf1M+yGKDGVPbY/JWEemg5nH05ncKPfi+kBbKBJoTdsogMu33uhytuLlv9y0O7GH7fEdwLdLQw=="],
+
+ "mdast-util-to-hast/@types/hast": ["@types/hast@2.3.10", "", { "dependencies": { "@types/unist": "^2" } }, "sha512-McWspRw8xx8J9HurkVBfYj0xKoE25tOFlHGdx4MJ5xORQrMGZNqJhVQWaIbm6Oyla5kYOXtDiopzKRJzEOkwJw=="],
+
+ "mdast-util-to-hast/unist-util-visit": ["unist-util-visit@4.1.2", "", { "dependencies": { "@types/unist": "^2.0.0", "unist-util-is": "^5.0.0", "unist-util-visit-parents": "^5.1.1" } }, "sha512-MSd8OUGISqHdVvfY9TPhyK2VdUrPgxkUtWSuMHF6XAAFuL4LokseigBnZtPnJMu+FbynTkFNnFlyjxpVKujMRg=="],
+
+ "mdast-util-to-markdown/@types/unist": ["@types/unist@2.0.11", "", {}, "sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA=="],
+
+ "mdast-util-to-markdown/unist-util-visit": ["unist-util-visit@4.1.2", "", { "dependencies": { "@types/unist": "^2.0.0", "unist-util-is": "^5.0.0", "unist-util-visit-parents": "^5.1.1" } }, "sha512-MSd8OUGISqHdVvfY9TPhyK2VdUrPgxkUtWSuMHF6XAAFuL4LokseigBnZtPnJMu+FbynTkFNnFlyjxpVKujMRg=="],
+
+ "micromark-util-events-to-acorn/@types/unist": ["@types/unist@2.0.11", "", {}, "sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA=="],
+
+ "multer/concat-stream": ["concat-stream@1.6.2", "", { "dependencies": { "buffer-from": "^1.0.0", "inherits": "^2.0.3", "readable-stream": "^2.2.2", "typedarray": "^0.0.6" } }, "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw=="],
+
+ "multer/mkdirp": ["mkdirp@0.5.6", "", { "dependencies": { "minimist": "^1.2.6" }, "bin": { "mkdirp": "bin/cmd.js" } }, "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw=="],
+
+ "nestjs-trpc/@types/node": ["@types/node@22.19.7", "", { "dependencies": { "undici-types": "~6.21.0" } }, "sha512-MciR4AKGHWl7xwxkBa6xUGxQJ4VBOmPTF7sL+iGzuahOFaO0jHCsuEfS80pan1ef4gWId1oWOweIhrDEYLuaOw=="],
+
+ "nestjs-trpc/reflect-metadata": ["reflect-metadata@0.1.13", "", {}, "sha512-Ts1Y/anZELhSsjMcU605fU9RE4Oi3p5ORujwbIKXfWa+0Zxs510Qrmrce5/Jowq3cHSZSJqBjypxmHarc+vEWg=="],
+
+ "nestjs-trpc/rxjs": ["rxjs@7.8.1", "", { "dependencies": { "tslib": "^2.1.0" } }, "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg=="],
+
+ "nestjs-trpc/ts-jest": ["ts-jest@29.4.6", "", { "dependencies": { "bs-logger": "^0.2.6", "fast-json-stable-stringify": "^2.1.0", "handlebars": "^4.7.8", "json5": "^2.2.3", "lodash.memoize": "^4.1.2", "make-error": "^1.3.6", "semver": "^7.7.3", "type-fest": "^4.41.0", "yargs-parser": "^21.1.1" }, "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", "jest": "^29.0.0 || ^30.0.0", "jest-util": "^29.0.0 || ^30.0.0", "typescript": ">=4.3 <6" }, "optionalPeers": ["@babel/core", "@jest/transform", "@jest/types", "babel-jest", "jest-util"], "bin": { "ts-jest": "cli.js" } }, "sha512-fSpWtOO/1AjSNQguk43hb/JCo16oJDnMJf3CdEGNkqsEX3t0KX96xvyX1D7PfLCpVoKu4MfVrqUkFyblYoY4lA=="],
+
+ "nestjs-trpc/typescript": ["typescript@5.5.3", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-/hreyEujaB0w76zKo6717l3L0o/qEUtRgdvUBvlkhoWeOVMjMuHNHk0BRBzikzuGDqNmPQbg5ifMEqsHLiIUcQ=="],
+
+ "nestjs-trpc.io/eslint": ["eslint@8.57.1", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.6.1", "@eslint/eslintrc": "^2.1.4", "@eslint/js": "8.57.1", "@humanwhocodes/config-array": "^0.13.0", "@humanwhocodes/module-importer": "^1.0.1", "@nodelib/fs.walk": "^1.2.8", "@ungap/structured-clone": "^1.2.0", "ajv": "^6.12.4", "chalk": "^4.0.0", "cross-spawn": "^7.0.2", "debug": "^4.3.2", "doctrine": "^3.0.0", "escape-string-regexp": "^4.0.0", "eslint-scope": "^7.2.2", "eslint-visitor-keys": "^3.4.3", "espree": "^9.6.1", "esquery": "^1.4.2", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", "file-entry-cache": "^6.0.1", "find-up": "^5.0.0", "glob-parent": "^6.0.2", "globals": "^13.19.0", "graphemer": "^1.4.0", "ignore": "^5.2.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", "is-path-inside": "^3.0.3", "js-yaml": "^4.1.0", "json-stable-stringify-without-jsonify": "^1.0.1", "levn": "^0.4.1", "lodash.merge": "^4.6.2", "minimatch": "^3.1.2", "natural-compare": "^1.4.0", "optionator": "^0.9.3", "strip-ansi": "^6.0.1", "text-table": "^0.2.0" }, "bin": { "eslint": "bin/eslint.js" } }, "sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA=="],
+
+ "nestjs-trpc.io/rimraf": ["rimraf@6.1.2", "", { "dependencies": { "glob": "^13.0.0", "package-json-from-dist": "^1.0.1" }, "bin": { "rimraf": "dist/esm/bin.mjs" } }, "sha512-cFCkPslJv7BAXJsYlK1dZsbP8/ZNLkCAQ0bi1hf5EKX2QHegmDFEFA6QhuYJlk7UDdc+02JjO80YSOrWPpw06g=="],
+
+ "new-github-release-url/type-fest": ["type-fest@2.19.0", "", {}, "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA=="],
+
+ "next/@next/env": ["@next/env@14.2.4", "", {}, "sha512-3EtkY5VDkuV2+lNmKlbkibIJxcO4oIHEhBWne6PaAp+76J9KoSsGvNikp6ivzAT8dhhBMYrm6op2pS1ApG0Hzg=="],
+
+ "next/postcss": ["postcss@8.4.31", "", { "dependencies": { "nanoid": "^3.3.6", "picocolors": "^1.0.0", "source-map-js": "^1.0.2" } }, "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ=="],
+
+ "nextra-theme-docs/escape-string-regexp": ["escape-string-regexp@5.0.0", "", {}, "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw=="],
+
+ "nextra-theme-docs/git-url-parse": ["git-url-parse@13.1.1", "", { "dependencies": { "git-up": "^7.0.0" } }, "sha512-PCFJyeSSdtnbfhSNRw9Wk96dDCNx+sogTe4YNXeXSJxt7xz5hvXekuRn9JX7m+Mf4OscCu8h+mtAl3+h5Fo8lQ=="],
+
+ "npm-run-path/path-key": ["path-key@4.0.0", "", {}, "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ=="],
+
+ "package-json/got": ["got@12.6.1", "", { "dependencies": { "@sindresorhus/is": "^5.2.0", "@szmarczak/http-timer": "^5.0.1", "cacheable-lookup": "^7.0.0", "cacheable-request": "^10.2.8", "decompress-response": "^6.0.0", "form-data-encoder": "^2.1.2", "get-stream": "^6.0.1", "http2-wrapper": "^2.1.10", "lowercase-keys": "^3.0.0", "p-cancelable": "^3.0.0", "responselike": "^3.0.0" } }, "sha512-mThBblvlAF1d4O5oqyvN+ZxLAYwIJK7bpMxgYqPD9okW0C3qm5FFn7k811QrcuEBwaogR3ngOFoCfs6mRv7teQ=="],
+
+ "parse-entities/@types/unist": ["@types/unist@2.0.11", "", {}, "sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA=="],
+
+ "parse5/entities": ["entities@6.0.1", "", {}, "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g=="],
+
+ "path-scurry/lru-cache": ["lru-cache@10.4.3", "", {}, "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ=="],
+
+ "path-scurry/minipass": ["minipass@7.1.2", "", {}, "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw=="],
+
+ "pkg-dir/find-up": ["find-up@4.1.0", "", { "dependencies": { "locate-path": "^5.0.0", "path-exists": "^4.0.0" } }, "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw=="],
+
+ "pretty-format/ansi-styles": ["ansi-styles@5.2.0", "", {}, "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA=="],
+
+ "prop-types/react-is": ["react-is@16.13.1", "", {}, "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ=="],
+
+ "proxy-addr/ipaddr.js": ["ipaddr.js@1.9.1", "", {}, "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g=="],
+
+ "rc/ini": ["ini@1.3.8", "", {}, "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew=="],
+
+ "rc/strip-json-comments": ["strip-json-comments@2.0.1", "", {}, "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ=="],
+
+ "read-pkg/parse-json": ["parse-json@7.1.1", "", { "dependencies": { "@babel/code-frame": "^7.21.4", "error-ex": "^1.3.2", "json-parse-even-better-errors": "^3.0.0", "lines-and-columns": "^2.0.3", "type-fest": "^3.8.0" } }, "sha512-SgOTCX/EZXtZxBE5eJ97P4yGM5n37BwRU+YMsH4vNzFqJV/oWFXXCmwFlgWUM4PrakybVOueJJ6pwHqSVhTFDw=="],
+
+ "read-pkg-up/find-up": ["find-up@6.3.0", "", { "dependencies": { "locate-path": "^7.1.0", "path-exists": "^5.0.0" } }, "sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw=="],
+
+ "readable-web-to-node-stream/readable-stream": ["readable-stream@4.7.0", "", { "dependencies": { "abort-controller": "^3.0.0", "buffer": "^6.0.3", "events": "^3.3.0", "process": "^0.11.10", "string_decoder": "^1.3.0" } }, "sha512-oIGGmcpTLwPga8Bn6/Z75SVaH1z5dUut2ibSyAMVhmUggWpmDn2dapB0n7f8nwaSiRtepAsfJyfXIO5DCVAODg=="],
+
+ "rehype-katex/vfile": ["vfile@6.0.3", "", { "dependencies": { "@types/unist": "^3.0.0", "vfile-message": "^4.0.0" } }, "sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q=="],
+
+ "rehype-pretty-code/@types/hast": ["@types/hast@2.3.10", "", { "dependencies": { "@types/unist": "^2" } }, "sha512-McWspRw8xx8J9HurkVBfYj0xKoE25tOFlHGdx4MJ5xORQrMGZNqJhVQWaIbm6Oyla5kYOXtDiopzKRJzEOkwJw=="],
+
+ "rehype-raw/vfile": ["vfile@6.0.3", "", { "dependencies": { "@types/unist": "^3.0.0", "vfile-message": "^4.0.0" } }, "sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q=="],
+
+ "release-it/chalk": ["chalk@5.3.0", "", {}, "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w=="],
+
+ "release-it/inquirer": ["inquirer@9.2.14", "", { "dependencies": { "@ljharb/through": "^2.3.12", "ansi-escapes": "^4.3.2", "chalk": "^5.3.0", "cli-cursor": "^3.1.0", "cli-width": "^4.1.0", "external-editor": "^3.1.0", "figures": "^3.2.0", "lodash": "^4.17.21", "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" } }, "sha512-4ByIMt677Iz5AvjyKrDpzaepIyMewNvDcvwpVVRZNmy9dLakVoVgdCHZXbK1SlVJra1db0JZ6XkJyHsanpdrdQ=="],
+
+ "release-it/ora": ["ora@8.0.1", "", { "dependencies": { "chalk": "^5.3.0", "cli-cursor": "^4.0.0", "cli-spinners": "^2.9.2", "is-interactive": "^2.0.0", "is-unicode-supported": "^2.0.0", "log-symbols": "^6.0.0", "stdin-discarder": "^0.2.1", "string-width": "^7.0.0", "strip-ansi": "^7.1.0" } }, "sha512-ANIvzobt1rls2BDny5fWZ3ZVKyD6nscLvfFRpQgfWsythlcsVUC9kL0zq6j2Z5z9wwp1kd7wpsD/T9qNPVLCaQ=="],
+
+ "release-it/os-name": ["os-name@5.1.0", "", { "dependencies": { "macos-release": "^3.1.0", "windows-release": "^5.0.1" } }, "sha512-YEIoAnM6zFmzw3PQ201gCVCIWbXNyKObGlVvpAVvraAeOHnlYVKFssbA/riRX5R40WA6kKrZ7Dr7dWzO3nKSeQ=="],
+
+ "release-it/semver": ["semver@7.6.0", "", { "dependencies": { "lru-cache": "^6.0.0" }, "bin": { "semver": "bin/semver.js" } }, "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg=="],
+
+ "release-it/url-join": ["url-join@5.0.0", "", {}, "sha512-n2huDr9h9yzd6exQVnH/jU5mr+Pfx08LRXXZhkLLetAMESRj+anQsTAh940iMrIetKAmry9coFuZQ2jY8/p3WA=="],
+
+ "remark-reading-time/unist-util-visit": ["unist-util-visit@3.1.0", "", { "dependencies": { "@types/unist": "^2.0.0", "unist-util-is": "^5.0.0", "unist-util-visit-parents": "^4.0.0" } }, "sha512-Szoh+R/Ll68QWAyQyZZpQzZQm2UPbxibDvaY8Xc9SUtYgPsDzx5AWSk++UUt2hJuow8mvwR+rG+LQLw+KsuAKA=="],
+
+ "remark-rehype/@types/hast": ["@types/hast@2.3.10", "", { "dependencies": { "@types/unist": "^2" } }, "sha512-McWspRw8xx8J9HurkVBfYj0xKoE25tOFlHGdx4MJ5xORQrMGZNqJhVQWaIbm6Oyla5kYOXtDiopzKRJzEOkwJw=="],
+
+ "resolve-cwd/resolve-from": ["resolve-from@5.0.0", "", {}, "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw=="],
+
+ "restore-cursor/onetime": ["onetime@5.1.2", "", { "dependencies": { "mimic-fn": "^2.1.0" } }, "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg=="],
+
+ "restore-cursor/signal-exit": ["signal-exit@3.0.7", "", {}, "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ=="],
+
+ "send/debug": ["debug@2.6.9", "", { "dependencies": { "ms": "2.0.0" } }, "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA=="],
+
+ "send/mime": ["mime@1.6.0", "", { "bin": { "mime": "cli.js" } }, "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg=="],
+
+ "shelljs/glob": ["glob@7.2.3", "", { "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", "inherits": "2", "minimatch": "^3.1.1", "once": "^1.3.0", "path-is-absolute": "^1.0.0" } }, "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q=="],
+
+ "slice-ansi/ansi-styles": ["ansi-styles@6.2.3", "", {}, "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg=="],
+
+ "slice-ansi/is-fullwidth-code-point": ["is-fullwidth-code-point@4.0.0", "", {}, "sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ=="],
+
+ "sort-keys-length/sort-keys": ["sort-keys@1.1.2", "", { "dependencies": { "is-plain-obj": "^1.0.0" } }, "sha512-vzn8aSqKgytVik0iwdBEi+zevbTYZogewTUM6dtpmGwEcdzbub/TX4bCzRhebDCRC3QzXgJsLRKB2V/Oof7HXg=="],
+
+ "source-map-support/source-map": ["source-map@0.6.1", "", {}, "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="],
+
+ "stack-utils/escape-string-regexp": ["escape-string-regexp@2.0.0", "", {}, "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w=="],
+
+ "string-width/emoji-regex": ["emoji-regex@8.0.0", "", {}, "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="],
+
+ "string-width-cjs/emoji-regex": ["emoji-regex@8.0.0", "", {}, "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="],
+
+ "svgo/commander": ["commander@7.2.0", "", {}, "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw=="],
+
+ "tailwindcss/arg": ["arg@5.0.2", "", {}, "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg=="],
+
+ "terser/commander": ["commander@2.20.3", "", {}, "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ=="],
+
+ "terser-webpack-plugin/schema-utils": ["schema-utils@4.3.3", "", { "dependencies": { "@types/json-schema": "^7.0.9", "ajv": "^8.9.0", "ajv-formats": "^2.1.1", "ajv-keywords": "^5.1.0" } }, "sha512-eflK8wEtyOE6+hsaRVPxvUKYCpRgzLqDTb8krvAsRIwOGlHoSgYLgBXoubGgLd2fT41/OUYdb48v4k4WWHQurA=="],
+
+ "test-exclude/glob": ["glob@7.2.3", "", { "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", "inherits": "2", "minimatch": "^3.1.1", "once": "^1.3.0", "path-is-absolute": "^1.0.0" } }, "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q=="],
+
+ "tinyglobby/picomatch": ["picomatch@4.0.3", "", {}, "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q=="],
+
+ "title/arg": ["arg@1.0.0", "", {}, "sha512-Wk7TEzl1KqvTGs/uyhmHO/3XLd3t1UeU4IstvPXVzGPM522cTjqjNZ99esCkcL52sjqjo8e8CTBcWhkxvGzoAw=="],
+
+ "title/chalk": ["chalk@2.3.0", "", { "dependencies": { "ansi-styles": "^3.1.0", "escape-string-regexp": "^1.0.5", "supports-color": "^4.0.0" } }, "sha512-Az5zJR2CBujap2rqXGaJKaPHyJ0IrUimvYNX+ncCy8PJP4ltOGTrHUIo097ZaL2zMeKYpiCdqDvS6zdrTFok3Q=="],
+
+ "trim-repeated/escape-string-regexp": ["escape-string-regexp@5.0.0", "", {}, "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw=="],
+
+ "unified/@types/unist": ["@types/unist@2.0.11", "", {}, "sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA=="],
+
+ "unist-util-position/@types/unist": ["@types/unist@2.0.11", "", {}, "sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA=="],
+
+ "unist-util-position-from-estree/@types/unist": ["@types/unist@2.0.11", "", {}, "sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA=="],
+
+ "unist-util-stringify-position/@types/unist": ["@types/unist@2.0.11", "", {}, "sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA=="],
+
+ "update-notifier/chalk": ["chalk@5.3.0", "", {}, "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w=="],
+
+ "uri-js/punycode": ["punycode@2.3.1", "", {}, "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg=="],
+
+ "util/inherits": ["inherits@2.0.3", "", {}, "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw=="],
+
+ "uvu/diff": ["diff@5.2.2", "", {}, "sha512-vtcDfH3TOjP8UekytvnHH1o1P4FcUdt4eQ1Y+Abap1tk/OB2MWQvcwS2ClCd1zuIhc3JKOx6p3kod8Vfys3E+A=="],
+
+ "uvu/kleur": ["kleur@4.1.5", "", {}, "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ=="],
+
+ "vfile/@types/unist": ["@types/unist@2.0.11", "", {}, "sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA=="],
+
+ "vfile-location/vfile": ["vfile@6.0.3", "", { "dependencies": { "@types/unist": "^3.0.0", "vfile-message": "^4.0.0" } }, "sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q=="],
+
+ "vfile-message/@types/unist": ["@types/unist@2.0.11", "", {}, "sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA=="],
+
+ "web/@types/node": ["@types/node@18.11.18", "", {}, "sha512-DHQpWGjyQKSHj3ebjFI/wRKcqQcdR+MoFBygntYOZytCqNfkd2ZC4ARDJ2DQqhjH5p85Nnd3jhUJIXrszFX/JA=="],
+
+ "web/@types/react": ["@types/react@18.2.14", "", { "dependencies": { "@types/prop-types": "*", "@types/scheduler": "*", "csstype": "^3.0.2" } }, "sha512-A0zjq+QN/O0Kpe30hA1GidzyFjatVvrpIvWLxD+xv67Vt91TWWgco9IvrJBkeyHm1trGaFS/FSGqPlhyeZRm0g=="],
+
+ "web/@types/react-dom": ["@types/react-dom@18.2.6", "", { "dependencies": { "@types/react": "*" } }, "sha512-2et4PDvg6PVCyS7fuTc4gPoksV58bW0RwSxWKcPRcHZf0PRUGq03TKcD/rUHe3azfV6/5/biUBJw+HhCQjaP0A=="],
+
+ "web/autoprefixer": ["autoprefixer@10.4.14", "", { "dependencies": { "browserslist": "^4.21.5", "caniuse-lite": "^1.0.30001464", "fraction.js": "^4.2.0", "normalize-range": "^0.1.2", "picocolors": "^1.0.0", "postcss-value-parser": "^4.2.0" }, "peerDependencies": { "postcss": "^8.1.0" }, "bin": { "autoprefixer": "bin/autoprefixer" } }, "sha512-FQzyfOsTlwVzjHxKEqRIAdJx9niO6VCBCoEwax/VLSoQF29ggECcPuBqUMZ+u8jCZOPSy8b8/8KnuFbp0SaFZQ=="],
+
+ "web/next": ["next@13.4.7", "", { "dependencies": { "@next/env": "13.4.7", "@swc/helpers": "0.5.1", "busboy": "1.6.0", "caniuse-lite": "^1.0.30001406", "postcss": "8.4.14", "styled-jsx": "5.1.1", "watchpack": "2.4.0", "zod": "3.21.4" }, "optionalDependencies": { "@next/swc-darwin-arm64": "13.4.7", "@next/swc-darwin-x64": "13.4.7", "@next/swc-linux-arm64-gnu": "13.4.7", "@next/swc-linux-arm64-musl": "13.4.7", "@next/swc-linux-x64-gnu": "13.4.7", "@next/swc-linux-x64-musl": "13.4.7", "@next/swc-win32-arm64-msvc": "13.4.7", "@next/swc-win32-ia32-msvc": "13.4.7", "@next/swc-win32-x64-msvc": "13.4.7" }, "peerDependencies": { "@opentelemetry/api": "^1.1.0", "fibers": ">= 3.1.0", "react": "^18.2.0", "react-dom": "^18.2.0", "sass": "^1.3.0" }, "optionalPeers": ["@opentelemetry/api", "fibers", "sass"], "bin": { "next": "dist/bin/next" } }, "sha512-M8z3k9VmG51SRT6v5uDKdJXcAqLzP3C+vaKfLIAM0Mhx1um1G7MDnO63+m52qPdZfrTFzMZNzfsgvm3ghuVHIQ=="],
+
+ "web/postcss": ["postcss@8.4.24", "", { "dependencies": { "nanoid": "^3.3.6", "picocolors": "^1.0.0", "source-map-js": "^1.0.2" } }, "sha512-M0RzbcI0sO/XJNucsGjvWU9ERWxb/ytp1w6dKtxTKgixdtQDq4rmx/g8W1hnaheq9jgwL/oyEdH5Bc4WwJKMqg=="],
+
+ "web/react": ["react@18.2.0", "", { "dependencies": { "loose-envify": "^1.1.0" } }, "sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ=="],
+
+ "web/react-dom": ["react-dom@18.2.0", "", { "dependencies": { "loose-envify": "^1.1.0", "scheduler": "^0.23.0" }, "peerDependencies": { "react": "^18.2.0" } }, "sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g=="],
+
+ "web/tailwindcss": ["tailwindcss@3.3.2", "", { "dependencies": { "@alloc/quick-lru": "^5.2.0", "arg": "^5.0.2", "chokidar": "^3.5.3", "didyoumean": "^1.2.2", "dlv": "^1.1.3", "fast-glob": "^3.2.12", "glob-parent": "^6.0.2", "is-glob": "^4.0.3", "jiti": "^1.18.2", "lilconfig": "^2.1.0", "micromatch": "^4.0.5", "normalize-path": "^3.0.0", "object-hash": "^3.0.0", "picocolors": "^1.0.0", "postcss": "^8.4.23", "postcss-import": "^15.1.0", "postcss-js": "^4.0.1", "postcss-load-config": "^4.0.1", "postcss-nested": "^6.0.1", "postcss-selector-parser": "^6.0.11", "postcss-value-parser": "^4.2.0", "resolve": "^1.22.2", "sucrase": "^3.32.0" }, "bin": { "tailwind": "lib/cli.js", "tailwindcss": "lib/cli.js" } }, "sha512-9jPkMiIBXvPc2KywkraqsUfbfj+dHDb+JPWtSJa9MLFdrPyazI7q6WX2sUrm7R9eVR7qqv3Pas7EvQFzxKnI6w=="],
+
+ "web/typescript": ["typescript@4.9.5", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g=="],
+
+ "webpack/eslint-scope": ["eslint-scope@5.1.1", "", { "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^4.1.1" } }, "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw=="],
+
+ "widest-line/string-width": ["string-width@5.1.2", "", { "dependencies": { "eastasianwidth": "^0.2.0", "emoji-regex": "^9.2.2", "strip-ansi": "^7.0.1" } }, "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA=="],
+
+ "windows-release/execa": ["execa@4.1.0", "", { "dependencies": { "cross-spawn": "^7.0.0", "get-stream": "^5.0.0", "human-signals": "^1.1.1", "is-stream": "^2.0.0", "merge-stream": "^2.0.0", "npm-run-path": "^4.0.0", "onetime": "^5.1.0", "signal-exit": "^3.0.2", "strip-final-newline": "^2.0.0" } }, "sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA=="],
+
+ "write-file-atomic/signal-exit": ["signal-exit@3.0.7", "", {}, "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ=="],
+
+ "@angular-devkit/core/ajv/json-schema-traverse": ["json-schema-traverse@1.0.0", "", {}, "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug=="],
+
+ "@angular-devkit/schematics-cli/inquirer/cli-width": ["cli-width@3.0.0", "", {}, "sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw=="],
+
+ "@angular-devkit/schematics-cli/inquirer/mute-stream": ["mute-stream@0.0.8", "", {}, "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA=="],
+
+ "@angular-devkit/schematics-cli/inquirer/run-async": ["run-async@2.4.1", "", {}, "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ=="],
+
+ "@angular-devkit/schematics-cli/inquirer/wrap-ansi": ["wrap-ansi@7.0.0", "", { "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", "strip-ansi": "^6.0.0" } }, "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q=="],
+
+ "@babel/helper-compilation-targets/lru-cache/yallist": ["yallist@3.1.1", "", {}, "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g=="],
+
+ "@commitlint/config-validator/ajv/json-schema-traverse": ["json-schema-traverse@1.0.0", "", {}, "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug=="],
+
+ "@commitlint/top-level/find-up/locate-path": ["locate-path@7.2.0", "", { "dependencies": { "p-locate": "^6.0.0" } }, "sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA=="],
+
+ "@commitlint/top-level/find-up/path-exists": ["path-exists@5.0.0", "", {}, "sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ=="],
+
+ "@fastify/ajv-compiler/ajv/json-schema-traverse": ["json-schema-traverse@1.0.0", "", {}, "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug=="],
+
+ "@isaacs/cliui/strip-ansi/ansi-regex": ["ansi-regex@6.2.2", "", {}, "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg=="],
+
+ "@isaacs/cliui/wrap-ansi/ansi-styles": ["ansi-styles@6.2.3", "", {}, "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg=="],
+
+ "@istanbuljs/load-nyc-config/find-up/locate-path": ["locate-path@5.0.0", "", { "dependencies": { "p-locate": "^4.1.0" } }, "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g=="],
+
+ "@istanbuljs/load-nyc-config/js-yaml/argparse": ["argparse@1.0.10", "", { "dependencies": { "sprintf-js": "~1.0.2" } }, "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg=="],
+
+ "@jest/console/@types/node/undici-types": ["undici-types@6.21.0", "", {}, "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ=="],
+
+ "@jest/core/@types/node/undici-types": ["undici-types@6.21.0", "", {}, "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ=="],
+
+ "@jest/environment/@types/node/undici-types": ["undici-types@6.21.0", "", {}, "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ=="],
+
+ "@jest/fake-timers/@types/node/undici-types": ["undici-types@6.21.0", "", {}, "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ=="],
+
+ "@jest/reporters/@types/node/undici-types": ["undici-types@6.21.0", "", {}, "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ=="],
+
+ "@jest/reporters/jest-worker/supports-color": ["supports-color@8.1.1", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q=="],
+
+ "@jest/types/@types/node/undici-types": ["undici-types@6.21.0", "", {}, "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ=="],
+
+ "@mdx-js/mdx/unist-util-visit/@types/unist": ["@types/unist@2.0.11", "", {}, "sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA=="],
+
+ "@mdx-js/mdx/unist-util-visit/unist-util-is": ["unist-util-is@5.2.1", "", { "dependencies": { "@types/unist": "^2.0.0" } }, "sha512-u9njyyfEh43npf1M+yGKDGVPbY/JWEemg5nH05ncKPfi+kBbKBJoTdsogMu33uhytuLlv9y0O7GH7fEdwLdLQw=="],
+
+ "@mdx-js/mdx/unist-util-visit/unist-util-visit-parents": ["unist-util-visit-parents@5.1.3", "", { "dependencies": { "@types/unist": "^2.0.0", "unist-util-is": "^5.0.0" } }, "sha512-x6+y8g7wWMyQhL1iZfhIPhDAs7Xwbn9nRosDXl7qoPTSCy0yNxnKc+hWokFifWQIDGi154rdUqKvbCa4+1kLhg=="],
+
+ "@mole-inc/bin-wrapper/got/@sindresorhus/is": ["@sindresorhus/is@4.6.0", "", {}, "sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw=="],
+
+ "@mole-inc/bin-wrapper/got/@szmarczak/http-timer": ["@szmarczak/http-timer@4.0.6", "", { "dependencies": { "defer-to-connect": "^2.0.0" } }, "sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w=="],
+
+ "@mole-inc/bin-wrapper/got/cacheable-lookup": ["cacheable-lookup@5.0.4", "", {}, "sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA=="],
+
+ "@mole-inc/bin-wrapper/got/cacheable-request": ["cacheable-request@7.0.4", "", { "dependencies": { "clone-response": "^1.0.2", "get-stream": "^5.1.0", "http-cache-semantics": "^4.0.0", "keyv": "^4.0.0", "lowercase-keys": "^2.0.0", "normalize-url": "^6.0.1", "responselike": "^2.0.0" } }, "sha512-v+p6ongsrp0yTGbJXjgxPow2+DL93DASP4kXCDKb8/bwRtt9OEF3whggkkDkGNzgcWy2XaF4a8nZglC7uElscg=="],
+
+ "@mole-inc/bin-wrapper/got/http2-wrapper": ["http2-wrapper@1.0.3", "", { "dependencies": { "quick-lru": "^5.1.1", "resolve-alpn": "^1.0.0" } }, "sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg=="],
+
+ "@mole-inc/bin-wrapper/got/lowercase-keys": ["lowercase-keys@2.0.0", "", {}, "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA=="],
+
+ "@mole-inc/bin-wrapper/got/p-cancelable": ["p-cancelable@2.1.1", "", {}, "sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg=="],
+
+ "@mole-inc/bin-wrapper/got/responselike": ["responselike@2.0.1", "", { "dependencies": { "lowercase-keys": "^2.0.0" } }, "sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw=="],
+
+ "@nestjs/cli/@nestjs/schematics/jsonc-parser": ["jsonc-parser@3.2.0", "", {}, "sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w=="],
+
+ "@nestjs/cli/chokidar/glob-parent": ["glob-parent@5.1.2", "", { "dependencies": { "is-glob": "^4.0.1" } }, "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow=="],
+
+ "@nestjs/cli/inquirer/cli-width": ["cli-width@3.0.0", "", {}, "sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw=="],
+
+ "@nestjs/cli/inquirer/mute-stream": ["mute-stream@0.0.8", "", {}, "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA=="],
+
+ "@nestjs/cli/inquirer/run-async": ["run-async@2.4.1", "", {}, "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ=="],
+
+ "@nestjs/cli/inquirer/wrap-ansi": ["wrap-ansi@7.0.0", "", { "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", "strip-ansi": "^6.0.0" } }, "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q=="],
+
+ "@nestjs/platform-fastify/fastify/@fastify/ajv-compiler": ["@fastify/ajv-compiler@3.6.0", "", { "dependencies": { "ajv": "^8.11.0", "ajv-formats": "^2.1.1", "fast-uri": "^2.0.0" } }, "sha512-LwdXQJjmMD+GwLOkP7TVC68qa+pSSogeWWmznRJ/coyTcfe9qA05AHFSe1eZFwK6q+xVRpChnvFUkf1iYaSZsQ=="],
+
+ "@nestjs/platform-fastify/fastify/@fastify/error": ["@fastify/error@3.4.1", "", {}, "sha512-wWSvph+29GR783IhmvdwWnN4bUxTD01Vm5Xad4i7i1VuAOItLvbPAb69sb0IQ2N57yprvhNIwAP5B6xfKTmjmQ=="],
+
+ "@nestjs/platform-fastify/fastify/@fastify/fast-json-stringify-compiler": ["@fastify/fast-json-stringify-compiler@4.3.0", "", { "dependencies": { "fast-json-stringify": "^5.7.0" } }, "sha512-aZAXGYo6m22Fk1zZzEUKBvut/CIIQe/BapEORnxiD5Qr0kPHqqI69NtEMCme74h+at72sPhbkb4ZrLd1W3KRLA=="],
+
+ "@nestjs/platform-fastify/fastify/avvio": ["avvio@8.4.0", "", { "dependencies": { "@fastify/error": "^3.3.0", "fastq": "^1.17.1" } }, "sha512-CDSwaxINFy59iNwhYnkvALBwZiTydGkOecZyPkqBpABYR1KqGEsET0VOOYDwtleZSUIdeY36DC2bSZ24CO1igA=="],
+
+ "@nestjs/platform-fastify/fastify/fast-json-stringify": ["fast-json-stringify@5.16.1", "", { "dependencies": { "@fastify/merge-json-schemas": "^0.1.0", "ajv": "^8.10.0", "ajv-formats": "^3.0.1", "fast-deep-equal": "^3.1.3", "fast-uri": "^2.1.0", "json-schema-ref-resolver": "^1.0.1", "rfdc": "^1.2.0" } }, "sha512-KAdnLvy1yu/XrRtP+LJnxbBGrhN+xXu+gt3EUvZhYGKCr3lFHq/7UFJHHFgmJKoqlh6B40bZLEv7w46B0mqn1g=="],
+
+ "@nestjs/platform-fastify/fastify/find-my-way": ["find-my-way@8.2.2", "", { "dependencies": { "fast-deep-equal": "^3.1.3", "fast-querystring": "^1.0.0", "safe-regex2": "^3.1.0" } }, "sha512-Dobi7gcTEq8yszimcfp/R7+owiT4WncAJ7VTTgFH1jYJ5GaG1FbhjwDG820hptN0QDFvzVY3RfCzdInvGPGzjA=="],
+
+ "@nestjs/platform-fastify/fastify/light-my-request": ["light-my-request@5.14.0", "", { "dependencies": { "cookie": "^0.7.0", "process-warning": "^3.0.0", "set-cookie-parser": "^2.4.1" } }, "sha512-aORPWntbpH5esaYpGOOmri0OHDOe3wC5M2MQxZ9dvMLZm6DnaAn0kJlcbU9hwsQgLzmZyReKwFwwPkR+nHu5kA=="],
+
+ "@nestjs/platform-fastify/fastify/pino": ["pino@9.14.0", "", { "dependencies": { "@pinojs/redact": "^0.4.0", "atomic-sleep": "^1.0.0", "on-exit-leak-free": "^2.1.0", "pino-abstract-transport": "^2.0.0", "pino-std-serializers": "^7.0.0", "process-warning": "^5.0.0", "quick-format-unescaped": "^4.0.3", "real-require": "^0.2.0", "safe-stable-stringify": "^2.3.1", "sonic-boom": "^4.0.1", "thread-stream": "^3.0.0" }, "bin": { "pino": "bin.js" } }, "sha512-8OEwKp5juEvb/MjpIc4hjqfgCNysrS94RIOMXYvpYCdm/jglrKEiAYmiumbmGhCvs+IcInsphYDFwqrjr7398w=="],
+
+ "@nestjs/platform-fastify/fastify/process-warning": ["process-warning@3.0.0", "", {}, "sha512-mqn0kFRl0EoqhnL0GQ0veqFHyIN1yig9RHh/InzORTUiZHFRAur+aMtRkELNwGs9aNwKS6tg/An4NYBPGwvtzQ=="],
+
+ "@nestjs/platform-fastify/fastify/secure-json-parse": ["secure-json-parse@2.7.0", "", {}, "sha512-6aU+Rwsezw7VR8/nyvKTx8QpWH9FrcYiXXlqC4z5d5XQBDRqtbfsRjnwGyqbi3gddNtWHuEk9OANUotL26qKUw=="],
+
+ "@nestjs/schematics/@angular-devkit/core/ajv": ["ajv@8.12.0", "", { "dependencies": { "fast-deep-equal": "^3.1.1", "json-schema-traverse": "^1.0.0", "require-from-string": "^2.0.2", "uri-js": "^4.2.2" } }, "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA=="],
+
+ "@nestjs/schematics/@angular-devkit/core/jsonc-parser": ["jsonc-parser@3.2.1", "", {}, "sha512-AilxAyFOAcK5wA1+LeaySVBrHsGQvUFCDWXKpZjzaL0PqW+xfBOttn8GNtWKFWqneyMZj41MWF9Kl6iPWLwgOA=="],
+
+ "@nestjs/schematics/@angular-devkit/core/picomatch": ["picomatch@4.0.1", "", {}, "sha512-xUXwsxNjwTQ8K3GnT4pCJm+xq3RUPQbmkYJTP5aFIfNIvbcc/4MUxgBaaRSZJ6yGJZiGSyYlM6MzwTsRk8SYCg=="],
+
+ "@nestjs/schematics/@angular-devkit/core/rxjs": ["rxjs@7.8.1", "", { "dependencies": { "tslib": "^2.1.0" } }, "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg=="],
+
+ "@nestjs/schematics/@angular-devkit/core/source-map": ["source-map@0.7.4", "", {}, "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA=="],
+
+ "@nestjs/schematics/@angular-devkit/schematics/jsonc-parser": ["jsonc-parser@3.2.1", "", {}, "sha512-AilxAyFOAcK5wA1+LeaySVBrHsGQvUFCDWXKpZjzaL0PqW+xfBOttn8GNtWKFWqneyMZj41MWF9Kl6iPWLwgOA=="],
+
+ "@nestjs/schematics/@angular-devkit/schematics/magic-string": ["magic-string@0.30.8", "", { "dependencies": { "@jridgewell/sourcemap-codec": "^1.4.15" } }, "sha512-ISQTe55T2ao7XtlAStud6qwYPZjE4GK1S/BeVPus4jrq6JuOnQ00YKQC581RWhR122W7msZV263KzVeLoqidyQ=="],
+
+ "@nestjs/schematics/@angular-devkit/schematics/rxjs": ["rxjs@7.8.1", "", { "dependencies": { "tslib": "^2.1.0" } }, "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg=="],
+
+ "@next/eslint-plugin-next/glob/jackspeak": ["jackspeak@2.3.6", "", { "dependencies": { "@isaacs/cliui": "^8.0.2" }, "optionalDependencies": { "@pkgjs/parseargs": "^0.11.0" } }, "sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ=="],
+
+ "@next/eslint-plugin-next/glob/minimatch": ["minimatch@9.0.5", "", { "dependencies": { "brace-expansion": "^2.0.1" } }, "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow=="],
+
+ "@next/eslint-plugin-next/glob/minipass": ["minipass@7.1.2", "", {}, "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw=="],
+
+ "@octokit/plugin-paginate-rest/@octokit/types/@octokit/openapi-types": ["@octokit/openapi-types@20.0.0", "", {}, "sha512-EtqRBEjp1dL/15V7WiX5LJMIxxkdiGJnabzYx5Apx4FkQIFgAfKumXeYAqqJCj1s+BMX4cPFIFC4OLCR6stlnA=="],
+
+ "@octokit/plugin-rest-endpoint-methods/@octokit/types/@octokit/openapi-types": ["@octokit/openapi-types@20.0.0", "", {}, "sha512-EtqRBEjp1dL/15V7WiX5LJMIxxkdiGJnabzYx5Apx4FkQIFgAfKumXeYAqqJCj1s+BMX4cPFIFC4OLCR6stlnA=="],
+
+ "@svgr/core/cosmiconfig/path-type": ["path-type@4.0.0", "", {}, "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw=="],
+
+ "@svgr/plugin-svgo/cosmiconfig/path-type": ["path-type@4.0.0", "", {}, "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw=="],
+
+ "@swc/cli/minimatch/brace-expansion": ["brace-expansion@2.0.2", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ=="],
+
+ "@ts-morph/common/minimatch/brace-expansion": ["brace-expansion@2.0.2", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ=="],
+
+ "@types/body-parser/@types/node/undici-types": ["undici-types@6.21.0", "", {}, "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ=="],
+
+ "@types/cacheable-request/@types/node/undici-types": ["undici-types@6.21.0", "", {}, "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ=="],
+
+ "@types/connect/@types/node/undici-types": ["undici-types@6.21.0", "", {}, "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ=="],
+
+ "@types/conventional-commits-parser/@types/node/undici-types": ["undici-types@6.21.0", "", {}, "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ=="],
+
+ "@types/express-serve-static-core/@types/node/undici-types": ["undici-types@6.21.0", "", {}, "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ=="],
+
+ "@types/graceful-fs/@types/node/undici-types": ["undici-types@6.21.0", "", {}, "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ=="],
+
+ "@types/keyv/@types/node/undici-types": ["undici-types@6.21.0", "", {}, "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ=="],
+
+ "@types/responselike/@types/node/undici-types": ["undici-types@6.21.0", "", {}, "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ=="],
+
+ "@types/send/@types/node/undici-types": ["undici-types@6.21.0", "", {}, "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ=="],
+
+ "@types/serve-static/@types/node/undici-types": ["undici-types@6.21.0", "", {}, "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ=="],
+
+ "@types/superagent/@types/node/undici-types": ["undici-types@6.21.0", "", {}, "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ=="],
+
+ "@typescript-eslint/typescript-estree/minimatch/brace-expansion": ["brace-expansion@2.0.2", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ=="],
+
+ "ajv-formats/ajv/json-schema-traverse": ["json-schema-traverse@1.0.0", "", {}, "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug=="],
+
+ "babel-plugin-istanbul/istanbul-lib-instrument/semver": ["semver@6.3.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="],
+
+ "bin-check/execa/cross-spawn": ["cross-spawn@5.1.0", "", { "dependencies": { "lru-cache": "^4.0.1", "shebang-command": "^1.2.0", "which": "^1.2.9" } }, "sha512-pTgQJ5KC0d2hcY8eyL1IzlBPYjTkyH72XRZPnLyKus2mBfNjQs3klqbJU2VILqZryAZUt9JOb3h/mWMy23/f5A=="],
+
+ "bin-check/execa/get-stream": ["get-stream@3.0.0", "", {}, "sha512-GlhdIUuVakc8SJ6kK0zAFbiGzRFzNnY4jUuEbV9UROo4Y+0Ny4fjvcZFVTeDA4odpFyOQzaw6hXukJSq/f28sQ=="],
+
+ "bin-check/execa/is-stream": ["is-stream@1.1.0", "", {}, "sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ=="],
+
+ "bin-check/execa/npm-run-path": ["npm-run-path@2.0.2", "", { "dependencies": { "path-key": "^2.0.0" } }, "sha512-lJxZYlT4DW/bRUtFh1MQIWqmLwQfAxnqWG4HhEdjMlkrJYnJn0Jrr2u3mgxqaWsdiBc76TYkTG/mhrnYTuzfHw=="],
+
+ "bin-check/execa/signal-exit": ["signal-exit@3.0.7", "", {}, "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ=="],
+
+ "bin-version/execa/get-stream": ["get-stream@6.0.1", "", {}, "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg=="],
+
+ "bin-version/execa/human-signals": ["human-signals@2.1.0", "", {}, "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw=="],
+
+ "bin-version/execa/is-stream": ["is-stream@2.0.1", "", {}, "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg=="],
+
+ "bin-version/execa/npm-run-path": ["npm-run-path@4.0.1", "", { "dependencies": { "path-key": "^3.0.0" } }, "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw=="],
+
+ "bin-version/execa/onetime": ["onetime@5.1.2", "", { "dependencies": { "mimic-fn": "^2.1.0" } }, "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg=="],
+
+ "bin-version/execa/signal-exit": ["signal-exit@3.0.7", "", {}, "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ=="],
+
+ "bin-version/execa/strip-final-newline": ["strip-final-newline@2.0.0", "", {}, "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA=="],
+
+ "body-parser/debug/ms": ["ms@2.0.0", "", {}, "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="],
+
+ "boxen/string-width/strip-ansi": ["strip-ansi@7.1.2", "", { "dependencies": { "ansi-regex": "^6.0.1" } }, "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA=="],
+
+ "boxen/wrap-ansi/ansi-styles": ["ansi-styles@6.2.3", "", {}, "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg=="],
+
+ "boxen/wrap-ansi/strip-ansi": ["strip-ansi@7.1.2", "", { "dependencies": { "ansi-regex": "^6.0.1" } }, "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA=="],
+
+ "cli-truncate/string-width/emoji-regex": ["emoji-regex@10.6.0", "", {}, "sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A=="],
+
+ "cli-truncate/string-width/strip-ansi": ["strip-ansi@7.1.2", "", { "dependencies": { "ansi-regex": "^6.0.1" } }, "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA=="],
+
+ "clipboardy/execa/cross-spawn": ["cross-spawn@5.1.0", "", { "dependencies": { "lru-cache": "^4.0.1", "shebang-command": "^1.2.0", "which": "^1.2.9" } }, "sha512-pTgQJ5KC0d2hcY8eyL1IzlBPYjTkyH72XRZPnLyKus2mBfNjQs3klqbJU2VILqZryAZUt9JOb3h/mWMy23/f5A=="],
+
+ "clipboardy/execa/get-stream": ["get-stream@3.0.0", "", {}, "sha512-GlhdIUuVakc8SJ6kK0zAFbiGzRFzNnY4jUuEbV9UROo4Y+0Ny4fjvcZFVTeDA4odpFyOQzaw6hXukJSq/f28sQ=="],
+
+ "clipboardy/execa/is-stream": ["is-stream@1.1.0", "", {}, "sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ=="],
+
+ "clipboardy/execa/npm-run-path": ["npm-run-path@2.0.2", "", { "dependencies": { "path-key": "^2.0.0" } }, "sha512-lJxZYlT4DW/bRUtFh1MQIWqmLwQfAxnqWG4HhEdjMlkrJYnJn0Jrr2u3mgxqaWsdiBc76TYkTG/mhrnYTuzfHw=="],
+
+ "clipboardy/execa/signal-exit": ["signal-exit@3.0.7", "", {}, "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ=="],
+
+ "configstore/write-file-atomic/signal-exit": ["signal-exit@3.0.7", "", {}, "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ=="],
+
+ "csso/css-tree/mdn-data": ["mdn-data@2.0.28", "", {}, "sha512-aylIc7Z9y4yzHYAJNuESG3hfhC+0Ibp/MAMiaOZgNv4pmEdFyfZhhhny4MNiAfWdBQ1RQ2mfDWmM1x8SvGyp8g=="],
+
+ "d3-sankey/d3-array/internmap": ["internmap@1.0.1", "", {}, "sha512-lDB5YccMydFBtasVtxnZ3MRBHuaoE8GKsppq+EchKL2U4nK/DmEpPHNH8MZe5HkMtpSiTSOZwfN0tzYjO/lJEw=="],
+
+ "d3-sankey/d3-shape/d3-path": ["d3-path@1.0.9", "", {}, "sha512-VLaYcn81dtHVTjEHd8B+pbe9yHWpXKZUC87PzoFmsFrJqgFwDe/qxfp5MlfsfM1V5E/iVt0MmEbWQ7FVIXh/bg=="],
+
+ "eslint-plugin-import/tsconfig-paths/json5": ["json5@1.0.2", "", { "dependencies": { "minimist": "^1.2.0" }, "bin": { "json5": "lib/cli.js" } }, "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA=="],
+
+ "example-nestjs-express/@nestjs/cli/@angular-devkit/core": ["@angular-devkit/core@17.3.8", "", { "dependencies": { "ajv": "8.12.0", "ajv-formats": "2.1.1", "jsonc-parser": "3.2.1", "picomatch": "4.0.1", "rxjs": "7.8.1", "source-map": "0.7.4" }, "peerDependencies": { "chokidar": "^3.5.2" }, "optionalPeers": ["chokidar"] }, "sha512-Q8q0voCGudbdCgJ7lXdnyaxKHbNQBARH68zPQV72WT8NWy+Gw/tys870i6L58NWbBaCJEUcIj/kb6KoakSRu+Q=="],
+
+ "example-nestjs-express/@nestjs/cli/@angular-devkit/schematics": ["@angular-devkit/schematics@17.3.8", "", { "dependencies": { "@angular-devkit/core": "17.3.8", "jsonc-parser": "3.2.1", "magic-string": "0.30.8", "ora": "5.4.1", "rxjs": "7.8.1" } }, "sha512-QRVEYpIfgkprNHc916JlPuNbLzOgrm9DZalHasnLUz4P6g7pR21olb8YCyM2OTJjombNhya9ZpckcADU5Qyvlg=="],
+
+ "example-nestjs-express/@nestjs/cli/@angular-devkit/schematics-cli": ["@angular-devkit/schematics-cli@17.3.8", "", { "dependencies": { "@angular-devkit/core": "17.3.8", "@angular-devkit/schematics": "17.3.8", "ansi-colors": "4.1.3", "inquirer": "9.2.15", "symbol-observable": "4.0.0", "yargs-parser": "21.1.1" }, "bin": { "schematics": "bin/schematics.js" } }, "sha512-TjmiwWJarX7oqvNiRAroQ5/LeKUatxBOCNEuKXO/PV8e7pn/Hr/BqfFm+UcYrQoFdZplmtNAfqmbqgVziKvCpA=="],
+
+ "example-nestjs-express/@nestjs/cli/cli-table3": ["cli-table3@0.6.5", "", { "dependencies": { "string-width": "^4.2.0" }, "optionalDependencies": { "@colors/colors": "1.5.0" } }, "sha512-+W/5efTR7y5HRD7gACw9yQjqMVvEMLBHmboM/kPWam+H+Hmyrgjh6YncVKK122YZkXrLudzTuAukUw9FnMf7IQ=="],
+
+ "example-nestjs-express/@nestjs/cli/fork-ts-checker-webpack-plugin": ["fork-ts-checker-webpack-plugin@9.0.2", "", { "dependencies": { "@babel/code-frame": "^7.16.7", "chalk": "^4.1.2", "chokidar": "^3.5.3", "cosmiconfig": "^8.2.0", "deepmerge": "^4.2.2", "fs-extra": "^10.0.0", "memfs": "^3.4.1", "minimatch": "^3.0.4", "node-abort-controller": "^3.0.1", "schema-utils": "^3.1.1", "semver": "^7.3.5", "tapable": "^2.2.1" }, "peerDependencies": { "typescript": ">3.6.0", "webpack": "^5.11.0" } }, "sha512-Uochze2R8peoN1XqlSi/rGUkDQpRogtLFocP9+PGu68zk1BDAKXfdeCdyVZpgTk8V8WFVQXdEz426VKjXLO1Gg=="],
+
+ "example-nestjs-express/@nestjs/cli/glob": ["glob@10.4.2", "", { "dependencies": { "foreground-child": "^3.1.0", "jackspeak": "^3.1.2", "minimatch": "^9.0.4", "minipass": "^7.1.2", "package-json-from-dist": "^1.0.0", "path-scurry": "^1.11.1" }, "bin": { "glob": "dist/esm/bin.mjs" } }, "sha512-GwMlUF6PkPo3Gk21UxkCohOv0PLcIXVtKyLlpEI28R/cO/4eNOdmLk3CMW1wROV/WR/EsZOWAfBbBOqYvs88/w=="],
+
+ "example-nestjs-express/@nestjs/cli/inquirer": ["inquirer@8.2.6", "", { "dependencies": { "ansi-escapes": "^4.2.1", "chalk": "^4.1.1", "cli-cursor": "^3.1.0", "cli-width": "^3.0.0", "external-editor": "^3.0.3", "figures": "^3.0.0", "lodash": "^4.17.21", "mute-stream": "0.0.8", "ora": "^5.4.1", "run-async": "^2.4.0", "rxjs": "^7.5.5", "string-width": "^4.1.0", "strip-ansi": "^6.0.0", "through": "^2.3.6", "wrap-ansi": "^6.0.1" } }, "sha512-M1WuAmb7pn9zdFRtQYk26ZBoY043Sse0wVDdk4Bppr+JOXyQYybdtvK+l9wUibhtjdjvtoiNy8tk+EgsYIUqKg=="],
+
+ "example-nestjs-express/@nestjs/cli/tsconfig-paths-webpack-plugin": ["tsconfig-paths-webpack-plugin@4.1.0", "", { "dependencies": { "chalk": "^4.1.0", "enhanced-resolve": "^5.7.0", "tsconfig-paths": "^4.1.2" } }, "sha512-xWFISjviPydmtmgeUAuXp4N1fky+VCtfhOkDUFIv5ea7p4wuTomI4QTrXvFBX2S4jZsmyTSrStQl+E+4w+RzxA=="],
+
+ "example-nestjs-express/@nestjs/cli/typescript": ["typescript@5.3.3", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw=="],
+
+ "example-nestjs-express/@nestjs/cli/webpack": ["webpack@5.93.0", "", { "dependencies": { "@types/eslint-scope": "^3.7.3", "@types/estree": "^1.0.5", "@webassemblyjs/ast": "^1.12.1", "@webassemblyjs/wasm-edit": "^1.12.1", "@webassemblyjs/wasm-parser": "^1.12.1", "acorn": "^8.7.1", "acorn-import-attributes": "^1.9.5", "browserslist": "^4.21.10", "chrome-trace-event": "^1.0.2", "enhanced-resolve": "^5.17.0", "es-module-lexer": "^1.2.1", "eslint-scope": "5.1.1", "events": "^3.2.0", "glob-to-regexp": "^0.4.1", "graceful-fs": "^4.2.11", "json-parse-even-better-errors": "^2.3.1", "loader-runner": "^4.2.0", "mime-types": "^2.1.27", "neo-async": "^2.6.2", "schema-utils": "^3.2.0", "tapable": "^2.1.1", "terser-webpack-plugin": "^5.3.10", "watchpack": "^2.4.1", "webpack-sources": "^3.2.3" }, "bin": { "webpack": "bin/webpack.js" } }, "sha512-Y0m5oEY1LRuwly578VqluorkXbvXKh7U3rLoQCEO04M97ScRr44afGVkI0FQFsXzysk5OgFAxjZAb9rsGQVihA=="],
+
+ "example-nestjs-express/@types/node/undici-types": ["undici-types@6.21.0", "", {}, "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ=="],
+
+ "example-nestjs-fastify/@nestjs/cli/@angular-devkit/core": ["@angular-devkit/core@17.3.8", "", { "dependencies": { "ajv": "8.12.0", "ajv-formats": "2.1.1", "jsonc-parser": "3.2.1", "picomatch": "4.0.1", "rxjs": "7.8.1", "source-map": "0.7.4" }, "peerDependencies": { "chokidar": "^3.5.2" }, "optionalPeers": ["chokidar"] }, "sha512-Q8q0voCGudbdCgJ7lXdnyaxKHbNQBARH68zPQV72WT8NWy+Gw/tys870i6L58NWbBaCJEUcIj/kb6KoakSRu+Q=="],
+
+ "example-nestjs-fastify/@nestjs/cli/@angular-devkit/schematics": ["@angular-devkit/schematics@17.3.8", "", { "dependencies": { "@angular-devkit/core": "17.3.8", "jsonc-parser": "3.2.1", "magic-string": "0.30.8", "ora": "5.4.1", "rxjs": "7.8.1" } }, "sha512-QRVEYpIfgkprNHc916JlPuNbLzOgrm9DZalHasnLUz4P6g7pR21olb8YCyM2OTJjombNhya9ZpckcADU5Qyvlg=="],
+
+ "example-nestjs-fastify/@nestjs/cli/@angular-devkit/schematics-cli": ["@angular-devkit/schematics-cli@17.3.8", "", { "dependencies": { "@angular-devkit/core": "17.3.8", "@angular-devkit/schematics": "17.3.8", "ansi-colors": "4.1.3", "inquirer": "9.2.15", "symbol-observable": "4.0.0", "yargs-parser": "21.1.1" }, "bin": { "schematics": "bin/schematics.js" } }, "sha512-TjmiwWJarX7oqvNiRAroQ5/LeKUatxBOCNEuKXO/PV8e7pn/Hr/BqfFm+UcYrQoFdZplmtNAfqmbqgVziKvCpA=="],
+
+ "example-nestjs-fastify/@nestjs/cli/cli-table3": ["cli-table3@0.6.5", "", { "dependencies": { "string-width": "^4.2.0" }, "optionalDependencies": { "@colors/colors": "1.5.0" } }, "sha512-+W/5efTR7y5HRD7gACw9yQjqMVvEMLBHmboM/kPWam+H+Hmyrgjh6YncVKK122YZkXrLudzTuAukUw9FnMf7IQ=="],
+
+ "example-nestjs-fastify/@nestjs/cli/fork-ts-checker-webpack-plugin": ["fork-ts-checker-webpack-plugin@9.0.2", "", { "dependencies": { "@babel/code-frame": "^7.16.7", "chalk": "^4.1.2", "chokidar": "^3.5.3", "cosmiconfig": "^8.2.0", "deepmerge": "^4.2.2", "fs-extra": "^10.0.0", "memfs": "^3.4.1", "minimatch": "^3.0.4", "node-abort-controller": "^3.0.1", "schema-utils": "^3.1.1", "semver": "^7.3.5", "tapable": "^2.2.1" }, "peerDependencies": { "typescript": ">3.6.0", "webpack": "^5.11.0" } }, "sha512-Uochze2R8peoN1XqlSi/rGUkDQpRogtLFocP9+PGu68zk1BDAKXfdeCdyVZpgTk8V8WFVQXdEz426VKjXLO1Gg=="],
+
+ "example-nestjs-fastify/@nestjs/cli/glob": ["glob@10.4.2", "", { "dependencies": { "foreground-child": "^3.1.0", "jackspeak": "^3.1.2", "minimatch": "^9.0.4", "minipass": "^7.1.2", "package-json-from-dist": "^1.0.0", "path-scurry": "^1.11.1" }, "bin": { "glob": "dist/esm/bin.mjs" } }, "sha512-GwMlUF6PkPo3Gk21UxkCohOv0PLcIXVtKyLlpEI28R/cO/4eNOdmLk3CMW1wROV/WR/EsZOWAfBbBOqYvs88/w=="],
+
+ "example-nestjs-fastify/@nestjs/cli/inquirer": ["inquirer@8.2.6", "", { "dependencies": { "ansi-escapes": "^4.2.1", "chalk": "^4.1.1", "cli-cursor": "^3.1.0", "cli-width": "^3.0.0", "external-editor": "^3.0.3", "figures": "^3.0.0", "lodash": "^4.17.21", "mute-stream": "0.0.8", "ora": "^5.4.1", "run-async": "^2.4.0", "rxjs": "^7.5.5", "string-width": "^4.1.0", "strip-ansi": "^6.0.0", "through": "^2.3.6", "wrap-ansi": "^6.0.1" } }, "sha512-M1WuAmb7pn9zdFRtQYk26ZBoY043Sse0wVDdk4Bppr+JOXyQYybdtvK+l9wUibhtjdjvtoiNy8tk+EgsYIUqKg=="],
+
+ "example-nestjs-fastify/@nestjs/cli/tsconfig-paths-webpack-plugin": ["tsconfig-paths-webpack-plugin@4.1.0", "", { "dependencies": { "chalk": "^4.1.0", "enhanced-resolve": "^5.7.0", "tsconfig-paths": "^4.1.2" } }, "sha512-xWFISjviPydmtmgeUAuXp4N1fky+VCtfhOkDUFIv5ea7p4wuTomI4QTrXvFBX2S4jZsmyTSrStQl+E+4w+RzxA=="],
+
+ "example-nestjs-fastify/@nestjs/cli/typescript": ["typescript@5.3.3", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw=="],
+
+ "example-nestjs-fastify/@nestjs/cli/webpack": ["webpack@5.93.0", "", { "dependencies": { "@types/eslint-scope": "^3.7.3", "@types/estree": "^1.0.5", "@webassemblyjs/ast": "^1.12.1", "@webassemblyjs/wasm-edit": "^1.12.1", "@webassemblyjs/wasm-parser": "^1.12.1", "acorn": "^8.7.1", "acorn-import-attributes": "^1.9.5", "browserslist": "^4.21.10", "chrome-trace-event": "^1.0.2", "enhanced-resolve": "^5.17.0", "es-module-lexer": "^1.2.1", "eslint-scope": "5.1.1", "events": "^3.2.0", "glob-to-regexp": "^0.4.1", "graceful-fs": "^4.2.11", "json-parse-even-better-errors": "^2.3.1", "loader-runner": "^4.2.0", "mime-types": "^2.1.27", "neo-async": "^2.6.2", "schema-utils": "^3.2.0", "tapable": "^2.1.1", "terser-webpack-plugin": "^5.3.10", "watchpack": "^2.4.1", "webpack-sources": "^3.2.3" }, "bin": { "webpack": "bin/webpack.js" } }, "sha512-Y0m5oEY1LRuwly578VqluorkXbvXKh7U3rLoQCEO04M97ScRr44afGVkI0FQFsXzysk5OgFAxjZAb9rsGQVihA=="],
+
+ "example-nestjs-fastify/@types/node/undici-types": ["undici-types@6.21.0", "", {}, "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ=="],
+
+ "express/debug/ms": ["ms@2.0.0", "", {}, "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="],
+
+ "fast-json-stringify/ajv/json-schema-traverse": ["json-schema-traverse@1.0.0", "", {}, "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug=="],
+
+ "filelist/minimatch/brace-expansion": ["brace-expansion@2.0.2", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ=="],
+
+ "finalhandler/debug/ms": ["ms@2.0.0", "", {}, "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="],
+
+ "fork-ts-checker-webpack-plugin/cosmiconfig/path-type": ["path-type@4.0.0", "", {}, "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw=="],
+
+ "fork-ts-checker-webpack-plugin/cosmiconfig/yaml": ["yaml@1.10.2", "", {}, "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg=="],
+
+ "glob/minimatch/brace-expansion": ["brace-expansion@2.0.2", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ=="],
+
+ "gray-matter/js-yaml/argparse": ["argparse@1.0.10", "", { "dependencies": { "sprintf-js": "~1.0.2" } }, "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg=="],
+
+ "hast-util-from-html/vfile-message/unist-util-stringify-position": ["unist-util-stringify-position@4.0.0", "", { "dependencies": { "@types/unist": "^3.0.0" } }, "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ=="],
+
+ "hast-util-from-parse5/vfile/vfile-message": ["vfile-message@4.0.3", "", { "dependencies": { "@types/unist": "^3.0.0", "unist-util-stringify-position": "^4.0.0" } }, "sha512-QTHzsGd1EhbZs4AsQ20JX1rC3cOlt/IWJruk893DfLRr57lcnOeMaWG4K0JrRta4mIJZKth2Au3mM3u03/JWKw=="],
+
+ "hast-util-raw/mdast-util-to-hast/@types/mdast": ["@types/mdast@4.0.4", "", { "dependencies": { "@types/unist": "*" } }, "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA=="],
+
+ "hast-util-raw/mdast-util-to-hast/micromark-util-sanitize-uri": ["micromark-util-sanitize-uri@2.0.1", "", { "dependencies": { "micromark-util-character": "^2.0.0", "micromark-util-encode": "^2.0.0", "micromark-util-symbol": "^2.0.0" } }, "sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ=="],
+
+ "hast-util-raw/vfile/vfile-message": ["vfile-message@4.0.3", "", { "dependencies": { "@types/unist": "^3.0.0", "unist-util-stringify-position": "^4.0.0" } }, "sha512-QTHzsGd1EhbZs4AsQ20JX1rC3cOlt/IWJruk893DfLRr57lcnOeMaWG4K0JrRta4mIJZKth2Au3mM3u03/JWKw=="],
+
+ "jest-changed-files/execa/get-stream": ["get-stream@6.0.1", "", {}, "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg=="],
+
+ "jest-changed-files/execa/human-signals": ["human-signals@2.1.0", "", {}, "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw=="],
+
+ "jest-changed-files/execa/is-stream": ["is-stream@2.0.1", "", {}, "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg=="],
+
+ "jest-changed-files/execa/npm-run-path": ["npm-run-path@4.0.1", "", { "dependencies": { "path-key": "^3.0.0" } }, "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw=="],
+
+ "jest-changed-files/execa/onetime": ["onetime@5.1.2", "", { "dependencies": { "mimic-fn": "^2.1.0" } }, "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg=="],
+
+ "jest-changed-files/execa/signal-exit": ["signal-exit@3.0.7", "", {}, "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ=="],
+
+ "jest-changed-files/execa/strip-final-newline": ["strip-final-newline@2.0.0", "", {}, "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA=="],
+
+ "jest-circus/@types/node/undici-types": ["undici-types@6.21.0", "", {}, "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ=="],
+
+ "jest-environment-node/@types/node/undici-types": ["undici-types@6.21.0", "", {}, "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ=="],
+
+ "jest-haste-map/@types/node/undici-types": ["undici-types@6.21.0", "", {}, "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ=="],
+
+ "jest-haste-map/jest-worker/supports-color": ["supports-color@8.1.1", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q=="],
+
+ "jest-mock/@types/node/undici-types": ["undici-types@6.21.0", "", {}, "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ=="],
+
+ "jest-runner/@types/node/undici-types": ["undici-types@6.21.0", "", {}, "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ=="],
+
+ "jest-runner/jest-worker/supports-color": ["supports-color@8.1.1", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q=="],
+
+ "jest-runner/source-map-support/source-map": ["source-map@0.6.1", "", {}, "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="],
+
+ "jest-runtime/@types/node/undici-types": ["undici-types@6.21.0", "", {}, "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ=="],
+
+ "jest-util/@types/node/undici-types": ["undici-types@6.21.0", "", {}, "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ=="],
+
+ "jest-watcher/@types/node/undici-types": ["undici-types@6.21.0", "", {}, "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ=="],
+
+ "jest-worker/@types/node/undici-types": ["undici-types@6.21.0", "", {}, "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ=="],
+
+ "listr2/wrap-ansi/ansi-styles": ["ansi-styles@6.2.3", "", {}, "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg=="],
+
+ "listr2/wrap-ansi/string-width": ["string-width@7.2.0", "", { "dependencies": { "emoji-regex": "^10.3.0", "get-east-asian-width": "^1.0.0", "strip-ansi": "^7.1.0" } }, "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ=="],
+
+ "listr2/wrap-ansi/strip-ansi": ["strip-ansi@7.1.2", "", { "dependencies": { "ansi-regex": "^6.0.1" } }, "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA=="],
+
+ "log-update/cli-cursor/restore-cursor": ["restore-cursor@5.1.0", "", { "dependencies": { "onetime": "^7.0.0", "signal-exit": "^4.1.0" } }, "sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA=="],
+
+ "log-update/slice-ansi/ansi-styles": ["ansi-styles@6.2.3", "", {}, "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg=="],
+
+ "log-update/slice-ansi/is-fullwidth-code-point": ["is-fullwidth-code-point@5.1.0", "", { "dependencies": { "get-east-asian-width": "^1.3.1" } }, "sha512-5XHYaSyiqADb4RnZ1Bdad6cPp8Toise4TzEjcOYDHZkTCbKgiUl7WTUCpNWHuxmDt91wnsZBc9xinNzopv3JMQ=="],
+
+ "log-update/strip-ansi/ansi-regex": ["ansi-regex@6.2.2", "", {}, "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg=="],
+
+ "log-update/wrap-ansi/ansi-styles": ["ansi-styles@6.2.3", "", {}, "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg=="],
+
+ "log-update/wrap-ansi/string-width": ["string-width@7.2.0", "", { "dependencies": { "emoji-regex": "^10.3.0", "get-east-asian-width": "^1.0.0", "strip-ansi": "^7.1.0" } }, "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ=="],
+
+ "mdast-util-definitions/unist-util-visit/unist-util-is": ["unist-util-is@5.2.1", "", { "dependencies": { "@types/unist": "^2.0.0" } }, "sha512-u9njyyfEh43npf1M+yGKDGVPbY/JWEemg5nH05ncKPfi+kBbKBJoTdsogMu33uhytuLlv9y0O7GH7fEdwLdLQw=="],
+
+ "mdast-util-definitions/unist-util-visit/unist-util-visit-parents": ["unist-util-visit-parents@5.1.3", "", { "dependencies": { "@types/unist": "^2.0.0", "unist-util-is": "^5.0.0" } }, "sha512-x6+y8g7wWMyQhL1iZfhIPhDAs7Xwbn9nRosDXl7qoPTSCy0yNxnKc+hWokFifWQIDGi154rdUqKvbCa4+1kLhg=="],
+
+ "mdast-util-find-and-replace/unist-util-is/@types/unist": ["@types/unist@2.0.11", "", {}, "sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA=="],
+
+ "mdast-util-find-and-replace/unist-util-visit-parents/@types/unist": ["@types/unist@2.0.11", "", {}, "sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA=="],
+
+ "mdast-util-mdx-expression/@types/hast/@types/unist": ["@types/unist@2.0.11", "", {}, "sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA=="],
+
+ "mdast-util-mdx-jsx/unist-util-remove-position/unist-util-visit": ["unist-util-visit@4.1.2", "", { "dependencies": { "@types/unist": "^2.0.0", "unist-util-is": "^5.0.0", "unist-util-visit-parents": "^5.1.1" } }, "sha512-MSd8OUGISqHdVvfY9TPhyK2VdUrPgxkUtWSuMHF6XAAFuL4LokseigBnZtPnJMu+FbynTkFNnFlyjxpVKujMRg=="],
+
+ "mdast-util-mdxjs-esm/@types/hast/@types/unist": ["@types/unist@2.0.11", "", {}, "sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA=="],
+
+ "mdast-util-phrasing/unist-util-is/@types/unist": ["@types/unist@2.0.11", "", {}, "sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA=="],
+
+ "mdast-util-to-hast/@types/hast/@types/unist": ["@types/unist@2.0.11", "", {}, "sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA=="],
+
+ "mdast-util-to-hast/unist-util-visit/@types/unist": ["@types/unist@2.0.11", "", {}, "sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA=="],
+
+ "mdast-util-to-hast/unist-util-visit/unist-util-is": ["unist-util-is@5.2.1", "", { "dependencies": { "@types/unist": "^2.0.0" } }, "sha512-u9njyyfEh43npf1M+yGKDGVPbY/JWEemg5nH05ncKPfi+kBbKBJoTdsogMu33uhytuLlv9y0O7GH7fEdwLdLQw=="],
+
+ "mdast-util-to-hast/unist-util-visit/unist-util-visit-parents": ["unist-util-visit-parents@5.1.3", "", { "dependencies": { "@types/unist": "^2.0.0", "unist-util-is": "^5.0.0" } }, "sha512-x6+y8g7wWMyQhL1iZfhIPhDAs7Xwbn9nRosDXl7qoPTSCy0yNxnKc+hWokFifWQIDGi154rdUqKvbCa4+1kLhg=="],
+
+ "mdast-util-to-markdown/unist-util-visit/unist-util-is": ["unist-util-is@5.2.1", "", { "dependencies": { "@types/unist": "^2.0.0" } }, "sha512-u9njyyfEh43npf1M+yGKDGVPbY/JWEemg5nH05ncKPfi+kBbKBJoTdsogMu33uhytuLlv9y0O7GH7fEdwLdLQw=="],
+
+ "mdast-util-to-markdown/unist-util-visit/unist-util-visit-parents": ["unist-util-visit-parents@5.1.3", "", { "dependencies": { "@types/unist": "^2.0.0", "unist-util-is": "^5.0.0" } }, "sha512-x6+y8g7wWMyQhL1iZfhIPhDAs7Xwbn9nRosDXl7qoPTSCy0yNxnKc+hWokFifWQIDGi154rdUqKvbCa4+1kLhg=="],
+
+ "multer/concat-stream/readable-stream": ["readable-stream@2.3.8", "", { "dependencies": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", "isarray": "~1.0.0", "process-nextick-args": "~2.0.0", "safe-buffer": "~5.1.1", "string_decoder": "~1.1.1", "util-deprecate": "~1.0.1" } }, "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA=="],
+
+ "nestjs-trpc.io/eslint/@eslint/eslintrc": ["@eslint/eslintrc@2.1.4", "", { "dependencies": { "ajv": "^6.12.4", "debug": "^4.3.2", "espree": "^9.6.0", "globals": "^13.19.0", "ignore": "^5.2.0", "import-fresh": "^3.2.1", "js-yaml": "^4.1.0", "minimatch": "^3.1.2", "strip-json-comments": "^3.1.1" } }, "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ=="],
+
+ "nestjs-trpc.io/eslint/@eslint/js": ["@eslint/js@8.57.1", "", {}, "sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q=="],
+
+ "nestjs-trpc.io/eslint/doctrine": ["doctrine@3.0.0", "", { "dependencies": { "esutils": "^2.0.2" } }, "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w=="],
+
+ "nestjs-trpc.io/eslint/eslint-scope": ["eslint-scope@7.2.2", "", { "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^5.2.0" } }, "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg=="],
+
+ "nestjs-trpc.io/eslint/eslint-visitor-keys": ["eslint-visitor-keys@3.4.3", "", {}, "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag=="],
+
+ "nestjs-trpc.io/eslint/espree": ["espree@9.6.1", "", { "dependencies": { "acorn": "^8.9.0", "acorn-jsx": "^5.3.2", "eslint-visitor-keys": "^3.4.1" } }, "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ=="],
+
+ "nestjs-trpc.io/eslint/file-entry-cache": ["file-entry-cache@6.0.1", "", { "dependencies": { "flat-cache": "^3.0.4" } }, "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg=="],
+
+ "nestjs-trpc.io/eslint/globals": ["globals@13.24.0", "", { "dependencies": { "type-fest": "^0.20.2" } }, "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ=="],
+
+ "nestjs-trpc.io/rimraf/glob": ["glob@13.0.0", "", { "dependencies": { "minimatch": "^10.1.1", "minipass": "^7.1.2", "path-scurry": "^2.0.0" } }, "sha512-tvZgpqk6fz4BaNZ66ZsRaZnbHvP/jG3uKJvAZOwEVUL4RTA5nJeeLYfyN9/VA8NX/V3IBG+hkeuGpKjvELkVhA=="],
+
+ "nestjs-trpc/@types/node/undici-types": ["undici-types@6.21.0", "", {}, "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ=="],
+
+ "package-json/got/get-stream": ["get-stream@6.0.1", "", {}, "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg=="],
+
+ "pkg-dir/find-up/locate-path": ["locate-path@5.0.0", "", { "dependencies": { "p-locate": "^4.1.0" } }, "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g=="],
+
+ "read-pkg-up/find-up/locate-path": ["locate-path@7.2.0", "", { "dependencies": { "p-locate": "^6.0.0" } }, "sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA=="],
+
+ "read-pkg-up/find-up/path-exists": ["path-exists@5.0.0", "", {}, "sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ=="],
+
+ "read-pkg/parse-json/json-parse-even-better-errors": ["json-parse-even-better-errors@3.0.2", "", {}, "sha512-fi0NG4bPjCHunUJffmLd0gxssIgkNmArMvis4iNah6Owg1MCJjWhEcDLmsK6iGkJq3tHwbDkTlce70/tmXN4cQ=="],
+
+ "read-pkg/parse-json/lines-and-columns": ["lines-and-columns@2.0.4", "", {}, "sha512-wM1+Z03eypVAVUCE7QdSqpVIvelbOakn1M0bPDoA4SGWPx3sNDVUiMo3L6To6WWGClB7VyXnhQ4Sn7gxiJbE6A=="],
+
+ "read-pkg/parse-json/type-fest": ["type-fest@3.13.1", "", {}, "sha512-tLq3bSNx+xSpwvAJnzrK0Ep5CLNWjvFTOp71URMaAEWBfRb9nnJiBoUe0tF8bI4ZFO3omgBR6NvnbzVUT3Ly4g=="],
+
+ "readable-web-to-node-stream/readable-stream/buffer": ["buffer@6.0.3", "", { "dependencies": { "base64-js": "^1.3.1", "ieee754": "^1.2.1" } }, "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA=="],
+
+ "rehype-katex/vfile/vfile-message": ["vfile-message@4.0.3", "", { "dependencies": { "@types/unist": "^3.0.0", "unist-util-stringify-position": "^4.0.0" } }, "sha512-QTHzsGd1EhbZs4AsQ20JX1rC3cOlt/IWJruk893DfLRr57lcnOeMaWG4K0JrRta4mIJZKth2Au3mM3u03/JWKw=="],
+
+ "rehype-pretty-code/@types/hast/@types/unist": ["@types/unist@2.0.11", "", {}, "sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA=="],
+
+ "rehype-raw/vfile/vfile-message": ["vfile-message@4.0.3", "", { "dependencies": { "@types/unist": "^3.0.0", "unist-util-stringify-position": "^4.0.0" } }, "sha512-QTHzsGd1EhbZs4AsQ20JX1rC3cOlt/IWJruk893DfLRr57lcnOeMaWG4K0JrRta4mIJZKth2Au3mM3u03/JWKw=="],
+
+ "release-it/inquirer/ora": ["ora@5.4.1", "", { "dependencies": { "bl": "^4.1.0", "chalk": "^4.1.0", "cli-cursor": "^3.1.0", "cli-spinners": "^2.5.0", "is-interactive": "^1.0.0", "is-unicode-supported": "^0.1.0", "log-symbols": "^4.1.0", "strip-ansi": "^6.0.0", "wcwidth": "^1.0.1" } }, "sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ=="],
+
+ "release-it/ora/cli-cursor": ["cli-cursor@4.0.0", "", { "dependencies": { "restore-cursor": "^4.0.0" } }, "sha512-VGtlMu3x/4DOtIUwEkRezxUZ2lBacNJCHash0N0WeZDBS+7Ux1dm3XWAgWYxLJFMMdOeXMHXorshEFhbMSGelg=="],
+
+ "release-it/ora/is-interactive": ["is-interactive@2.0.0", "", {}, "sha512-qP1vozQRI+BMOPcjFzrjXuQvdak2pHNUMZoeG2eRbiSqyvbEf/wQtEOTOX1guk6E3t36RkaqiSt8A/6YElNxLQ=="],
+
+ "release-it/ora/is-unicode-supported": ["is-unicode-supported@2.1.0", "", {}, "sha512-mE00Gnza5EEB3Ds0HfMyllZzbBrmLOX3vfWoj9A9PEnTfratQ/BcaJOuMhnkhjXvb2+FkY3VuHqtAGpTPmglFQ=="],
+
+ "release-it/ora/log-symbols": ["log-symbols@6.0.0", "", { "dependencies": { "chalk": "^5.3.0", "is-unicode-supported": "^1.3.0" } }, "sha512-i24m8rpwhmPIS4zscNzK6MSEhk0DUWa/8iYQWxhffV8jkI4Phvs3F+quL5xvS0gdQR0FyTCMMH33Y78dDTzzIw=="],
+
+ "release-it/ora/string-width": ["string-width@7.2.0", "", { "dependencies": { "emoji-regex": "^10.3.0", "get-east-asian-width": "^1.0.0", "strip-ansi": "^7.1.0" } }, "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ=="],
+
+ "release-it/ora/strip-ansi": ["strip-ansi@7.1.2", "", { "dependencies": { "ansi-regex": "^6.0.1" } }, "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA=="],
+
+ "release-it/os-name/macos-release": ["macos-release@3.4.0", "", {}, "sha512-wpGPwyg/xrSp4H4Db4xYSeAr6+cFQGHfspHzDUdYxswDnUW0L5Ov63UuJiSr8NMSpyaChO4u1n0MXUvVPtrN6A=="],
+
+ "release-it/os-name/windows-release": ["windows-release@5.1.1", "", { "dependencies": { "execa": "^5.1.1" } }, "sha512-NMD00arvqcq2nwqc5Q6KtrSRHK+fVD31erE5FEMahAw5PmVCgD7MUXodq3pdZSUkqA9Cda2iWx6s1XYwiJWRmw=="],
+
+ "release-it/semver/lru-cache": ["lru-cache@6.0.0", "", { "dependencies": { "yallist": "^4.0.0" } }, "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA=="],
+
+ "remark-reading-time/unist-util-visit/@types/unist": ["@types/unist@2.0.11", "", {}, "sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA=="],
+
+ "remark-reading-time/unist-util-visit/unist-util-is": ["unist-util-is@5.2.1", "", { "dependencies": { "@types/unist": "^2.0.0" } }, "sha512-u9njyyfEh43npf1M+yGKDGVPbY/JWEemg5nH05ncKPfi+kBbKBJoTdsogMu33uhytuLlv9y0O7GH7fEdwLdLQw=="],
+
+ "remark-reading-time/unist-util-visit/unist-util-visit-parents": ["unist-util-visit-parents@4.1.1", "", { "dependencies": { "@types/unist": "^2.0.0", "unist-util-is": "^5.0.0" } }, "sha512-1xAFJXAKpnnJl8G7K5KgU7FY55y3GcLIXqkzUj5QF/QVP7biUm0K0O2oqVkYsdjzJKifYeWn9+o6piAK2hGSHw=="],
+
+ "remark-rehype/@types/hast/@types/unist": ["@types/unist@2.0.11", "", {}, "sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA=="],
+
+ "restore-cursor/onetime/mimic-fn": ["mimic-fn@2.1.0", "", {}, "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg=="],
+
+ "send/debug/ms": ["ms@2.0.0", "", {}, "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="],
+
+ "sort-keys-length/sort-keys/is-plain-obj": ["is-plain-obj@1.1.0", "", {}, "sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg=="],
+
+ "terser-webpack-plugin/schema-utils/ajv": ["ajv@8.12.0", "", { "dependencies": { "fast-deep-equal": "^3.1.1", "json-schema-traverse": "^1.0.0", "require-from-string": "^2.0.2", "uri-js": "^4.2.2" } }, "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA=="],
+
+ "terser-webpack-plugin/schema-utils/ajv-keywords": ["ajv-keywords@5.1.0", "", { "dependencies": { "fast-deep-equal": "^3.1.3" }, "peerDependencies": { "ajv": "^8.8.2" } }, "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw=="],
+
+ "title/chalk/ansi-styles": ["ansi-styles@3.2.1", "", { "dependencies": { "color-convert": "^1.9.0" } }, "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA=="],
+
+ "title/chalk/escape-string-regexp": ["escape-string-regexp@1.0.5", "", {}, "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg=="],
+
+ "title/chalk/supports-color": ["supports-color@4.5.0", "", { "dependencies": { "has-flag": "^2.0.0" } }, "sha512-ycQR/UbvI9xIlEdQT1TQqwoXtEldExbCEAJgRo5YXlmSKjv6ThHnP9/vwGa1gr19Gfw+LkFd7KqYMhzrRC5JYw=="],
+
+ "vfile-location/vfile/vfile-message": ["vfile-message@4.0.3", "", { "dependencies": { "@types/unist": "^3.0.0", "unist-util-stringify-position": "^4.0.0" } }, "sha512-QTHzsGd1EhbZs4AsQ20JX1rC3cOlt/IWJruk893DfLRr57lcnOeMaWG4K0JrRta4mIJZKth2Au3mM3u03/JWKw=="],
+
+ "web/@types/react-dom/@types/react": ["@types/react@18.3.27", "", { "dependencies": { "@types/prop-types": "*", "csstype": "^3.2.2" } }, "sha512-cisd7gxkzjBKU2GgdYrTdtQx1SORymWyaAFhaxQPK9bYO9ot3Y5OikQRvY0VYQtvwjeQnizCINJAenh/V7MK2w=="],
+
+ "web/autoprefixer/fraction.js": ["fraction.js@4.3.7", "", {}, "sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew=="],
+
+ "web/next/@next/env": ["@next/env@13.4.7", "", {}, "sha512-ZlbiFulnwiFsW9UV1ku1OvX/oyIPLtMk9p/nnvDSwI0s7vSoZdRtxXNsaO+ZXrLv/pMbXVGq4lL8TbY9iuGmVw=="],
+
+ "web/next/@next/swc-darwin-arm64": ["@next/swc-darwin-arm64@13.4.7", "", { "os": "darwin", "cpu": "arm64" }, "sha512-VZTxPv1b59KGiv/pZHTO5Gbsdeoxcj2rU2cqJu03btMhHpn3vwzEK0gUSVC/XW96aeGO67X+cMahhwHzef24/w=="],
+
+ "web/next/@next/swc-darwin-x64": ["@next/swc-darwin-x64@13.4.7", "", { "os": "darwin", "cpu": "x64" }, "sha512-gO2bw+2Ymmga+QYujjvDz9955xvYGrWofmxTq7m70b9pDPvl7aDFABJOZ2a8SRCuSNB5mXU8eTOmVVwyp/nAew=="],
+
+ "web/next/@next/swc-linux-arm64-gnu": ["@next/swc-linux-arm64-gnu@13.4.7", "", { "os": "linux", "cpu": "arm64" }, "sha512-6cqp3vf1eHxjIDhEOc7Mh/s8z1cwc/l5B6ZNkOofmZVyu1zsbEM5Hmx64s12Rd9AYgGoiCz4OJ4M/oRnkE16/Q=="],
+
+ "web/next/@next/swc-linux-arm64-musl": ["@next/swc-linux-arm64-musl@13.4.7", "", { "os": "linux", "cpu": "arm64" }, "sha512-T1kD2FWOEy5WPidOn1si0rYmWORNch4a/NR52Ghyp4q7KyxOCuiOfZzyhVC5tsLIBDH3+cNdB5DkD9afpNDaOw=="],
+
+ "web/next/@next/swc-linux-x64-gnu": ["@next/swc-linux-x64-gnu@13.4.7", "", { "os": "linux", "cpu": "x64" }, "sha512-zaEC+iEiAHNdhl6fuwl0H0shnTzQoAoJiDYBUze8QTntE/GNPfTYpYboxF5LRYIjBwETUatvE0T64W6SKDipvg=="],
+
+ "web/next/@next/swc-linux-x64-musl": ["@next/swc-linux-x64-musl@13.4.7", "", { "os": "linux", "cpu": "x64" }, "sha512-X6r12F8d8SKAtYJqLZBBMIwEqcTRvUdVm+xIq+l6pJqlgT2tNsLLf2i5Cl88xSsIytBICGsCNNHd+siD2fbWBA=="],
+
+ "web/next/@next/swc-win32-arm64-msvc": ["@next/swc-win32-arm64-msvc@13.4.7", "", { "os": "win32", "cpu": "arm64" }, "sha512-NPnmnV+vEIxnu6SUvjnuaWRglZzw4ox5n/MQTxeUhb5iwVWFedolPFebMNwgrWu4AELwvTdGtWjqof53AiWHcw=="],
+
+ "web/next/@next/swc-win32-ia32-msvc": ["@next/swc-win32-ia32-msvc@13.4.7", "", { "os": "win32", "cpu": "ia32" }, "sha512-6Hxijm6/a8XqLQpOOf/XuwWRhcuc/g4rBB2oxjgCMuV9Xlr2bLs5+lXyh8w9YbAUMYR3iC9mgOlXbHa79elmXw=="],
+
+ "web/next/@next/swc-win32-x64-msvc": ["@next/swc-win32-x64-msvc@13.4.7", "", { "os": "win32", "cpu": "x64" }, "sha512-sW9Yt36Db1nXJL+mTr2Wo0y+VkPWeYhygvcHj1FF0srVtV+VoDjxleKtny21QHaG05zdeZnw2fCtf2+dEqgwqA=="],
+
+ "web/next/@swc/helpers": ["@swc/helpers@0.5.1", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-sJ902EfIzn1Fa+qYmjdQqh8tPsoxyBz+8yBKC2HKUxyezKJFwPGOn7pv4WY6QuQW//ySQi5lJjA/ZT9sNWWNTg=="],
+
+ "web/next/postcss": ["postcss@8.4.14", "", { "dependencies": { "nanoid": "^3.3.4", "picocolors": "^1.0.0", "source-map-js": "^1.0.2" } }, "sha512-E398TUmfAYFPBSdzgeieK2Y1+1cpdxJx8yXbK/m57nRhKSmk1GB2tO4lbLBtlkfPQTDKfe4Xqv1ASWPpayPEig=="],
+
+ "web/next/zod": ["zod@3.21.4", "", {}, "sha512-m46AKbrzKVzOzs/DZgVnG5H55N1sv1M8qZU3A8RIKbs3mrACDNeIOeilDymVb2HdmP8uwshOCF4uJ8uM9rCqJw=="],
+
+ "web/tailwindcss/arg": ["arg@5.0.2", "", {}, "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg=="],
+
+ "web/tailwindcss/lilconfig": ["lilconfig@2.1.0", "", {}, "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ=="],
+
+ "web/tailwindcss/postcss": ["postcss@8.5.6", "", { "dependencies": { "nanoid": "^3.3.11", "picocolors": "^1.1.1", "source-map-js": "^1.2.1" } }, "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg=="],
+
+ "web/tailwindcss/postcss-load-config": ["postcss-load-config@4.0.2", "", { "dependencies": { "lilconfig": "^3.0.0", "yaml": "^2.3.4" }, "peerDependencies": { "postcss": ">=8.0.9", "ts-node": ">=9.0.0" }, "optionalPeers": ["postcss", "ts-node"] }, "sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ=="],
+
+ "webpack/eslint-scope/estraverse": ["estraverse@4.3.0", "", {}, "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw=="],
+
+ "widest-line/string-width/strip-ansi": ["strip-ansi@7.1.2", "", { "dependencies": { "ansi-regex": "^6.0.1" } }, "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA=="],
+
+ "windows-release/execa/get-stream": ["get-stream@5.2.0", "", { "dependencies": { "pump": "^3.0.0" } }, "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA=="],
+
+ "windows-release/execa/human-signals": ["human-signals@1.1.1", "", {}, "sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw=="],
+
+ "windows-release/execa/is-stream": ["is-stream@2.0.1", "", {}, "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg=="],
+
+ "windows-release/execa/npm-run-path": ["npm-run-path@4.0.1", "", { "dependencies": { "path-key": "^3.0.0" } }, "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw=="],
+
+ "windows-release/execa/onetime": ["onetime@5.1.2", "", { "dependencies": { "mimic-fn": "^2.1.0" } }, "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg=="],
+
+ "windows-release/execa/signal-exit": ["signal-exit@3.0.7", "", {}, "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ=="],
+
+ "windows-release/execa/strip-final-newline": ["strip-final-newline@2.0.0", "", {}, "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA=="],
+
+ "@commitlint/top-level/find-up/locate-path/p-locate": ["p-locate@6.0.0", "", { "dependencies": { "p-limit": "^4.0.0" } }, "sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw=="],
+
+ "@istanbuljs/load-nyc-config/find-up/locate-path/p-locate": ["p-locate@4.1.0", "", { "dependencies": { "p-limit": "^2.2.0" } }, "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A=="],
+
+ "@mole-inc/bin-wrapper/got/cacheable-request/get-stream": ["get-stream@5.2.0", "", { "dependencies": { "pump": "^3.0.0" } }, "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA=="],
+
+ "@mole-inc/bin-wrapper/got/cacheable-request/normalize-url": ["normalize-url@6.1.0", "", {}, "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A=="],
+
+ "@nestjs/platform-fastify/fastify/@fastify/ajv-compiler/ajv": ["ajv@8.12.0", "", { "dependencies": { "fast-deep-equal": "^3.1.1", "json-schema-traverse": "^1.0.0", "require-from-string": "^2.0.2", "uri-js": "^4.2.2" } }, "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA=="],
+
+ "@nestjs/platform-fastify/fastify/@fastify/ajv-compiler/fast-uri": ["fast-uri@2.4.0", "", {}, "sha512-ypuAmmMKInk5q7XcepxlnUWDLWv4GFtaJqAzWKqn62IpQ3pejtr5dTVbt3vwqVaMKmkNR55sTT+CqUKIaT21BA=="],
+
+ "@nestjs/platform-fastify/fastify/fast-json-stringify/@fastify/merge-json-schemas": ["@fastify/merge-json-schemas@0.1.1", "", { "dependencies": { "fast-deep-equal": "^3.1.3" } }, "sha512-fERDVz7topgNjtXsJTTW1JKLy0rhuLRcquYqNR9rF7OcVpCa2OVW49ZPDIhaRRCaUuvVxI+N416xUoF76HNSXA=="],
+
+ "@nestjs/platform-fastify/fastify/fast-json-stringify/ajv": ["ajv@8.12.0", "", { "dependencies": { "fast-deep-equal": "^3.1.1", "json-schema-traverse": "^1.0.0", "require-from-string": "^2.0.2", "uri-js": "^4.2.2" } }, "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA=="],
+
+ "@nestjs/platform-fastify/fastify/fast-json-stringify/ajv-formats": ["ajv-formats@3.0.1", "", { "dependencies": { "ajv": "^8.0.0" } }, "sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ=="],
+
+ "@nestjs/platform-fastify/fastify/fast-json-stringify/fast-uri": ["fast-uri@2.4.0", "", {}, "sha512-ypuAmmMKInk5q7XcepxlnUWDLWv4GFtaJqAzWKqn62IpQ3pejtr5dTVbt3vwqVaMKmkNR55sTT+CqUKIaT21BA=="],
+
+ "@nestjs/platform-fastify/fastify/fast-json-stringify/json-schema-ref-resolver": ["json-schema-ref-resolver@1.0.1", "", { "dependencies": { "fast-deep-equal": "^3.1.3" } }, "sha512-EJAj1pgHc1hxF6vo2Z3s69fMjO1INq6eGHXZ8Z6wCQeldCuwxGK9Sxf4/cScGn3FZubCVUehfWtcDM/PLteCQw=="],
+
+ "@nestjs/platform-fastify/fastify/find-my-way/safe-regex2": ["safe-regex2@3.1.0", "", { "dependencies": { "ret": "~0.4.0" } }, "sha512-RAAZAGbap2kBfbVhvmnTFv73NWLMvDGOITFYTZBAaY8eR+Ir4ef7Up/e7amo+y1+AH+3PtLkrt9mvcTsG9LXug=="],
+
+ "@nestjs/platform-fastify/fastify/light-my-request/cookie": ["cookie@0.7.2", "", {}, "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w=="],
+
+ "@nestjs/platform-fastify/fastify/pino/pino-abstract-transport": ["pino-abstract-transport@2.0.0", "", { "dependencies": { "split2": "^4.0.0" } }, "sha512-F63x5tizV6WCh4R6RHyi2Ml+M70DNRXt/+HANowMflpgGFMAym/VKm6G7ZOQRjqN7XbGxK1Lg9t6ZrtzOaivMw=="],
+
+ "@nestjs/platform-fastify/fastify/pino/process-warning": ["process-warning@5.0.0", "", {}, "sha512-a39t9ApHNx2L4+HBnQKqxxHNs1r7KF+Intd8Q/g1bUh6q0WIp9voPXJ/x0j+ZL45KF1pJd9+q2jLIRMfvEshkA=="],
+
+ "@nestjs/platform-fastify/fastify/pino/thread-stream": ["thread-stream@3.1.0", "", { "dependencies": { "real-require": "^0.2.0" } }, "sha512-OqyPZ9u96VohAyMfJykzmivOrY2wfMSf3C5TtFJVgN+Hm6aj+voFhlK+kZEIv2FBh1X6Xp3DlnCOfEQ3B2J86A=="],
+
+ "@nestjs/schematics/@angular-devkit/core/ajv/json-schema-traverse": ["json-schema-traverse@1.0.0", "", {}, "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug=="],
+
+ "@next/eslint-plugin-next/glob/minimatch/brace-expansion": ["brace-expansion@2.0.2", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ=="],
+
+ "bin-check/execa/cross-spawn/lru-cache": ["lru-cache@4.1.5", "", { "dependencies": { "pseudomap": "^1.0.2", "yallist": "^2.1.2" } }, "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g=="],
+
+ "bin-check/execa/cross-spawn/shebang-command": ["shebang-command@1.2.0", "", { "dependencies": { "shebang-regex": "^1.0.0" } }, "sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg=="],
+
+ "bin-check/execa/cross-spawn/which": ["which@1.3.1", "", { "dependencies": { "isexe": "^2.0.0" }, "bin": { "which": "./bin/which" } }, "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ=="],
+
+ "bin-check/execa/npm-run-path/path-key": ["path-key@2.0.1", "", {}, "sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw=="],
+
+ "bin-version/execa/onetime/mimic-fn": ["mimic-fn@2.1.0", "", {}, "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg=="],
+
+ "boxen/string-width/strip-ansi/ansi-regex": ["ansi-regex@6.2.2", "", {}, "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg=="],
+
+ "boxen/wrap-ansi/strip-ansi/ansi-regex": ["ansi-regex@6.2.2", "", {}, "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg=="],
+
+ "cli-truncate/string-width/strip-ansi/ansi-regex": ["ansi-regex@6.2.2", "", {}, "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg=="],
+
+ "clipboardy/execa/cross-spawn/lru-cache": ["lru-cache@4.1.5", "", { "dependencies": { "pseudomap": "^1.0.2", "yallist": "^2.1.2" } }, "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g=="],
+
+ "clipboardy/execa/cross-spawn/shebang-command": ["shebang-command@1.2.0", "", { "dependencies": { "shebang-regex": "^1.0.0" } }, "sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg=="],
+
+ "clipboardy/execa/cross-spawn/which": ["which@1.3.1", "", { "dependencies": { "isexe": "^2.0.0" }, "bin": { "which": "./bin/which" } }, "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ=="],
+
+ "clipboardy/execa/npm-run-path/path-key": ["path-key@2.0.1", "", {}, "sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw=="],
+
+ "example-nestjs-express/@nestjs/cli/@angular-devkit/core/ajv": ["ajv@8.12.0", "", { "dependencies": { "fast-deep-equal": "^3.1.1", "json-schema-traverse": "^1.0.0", "require-from-string": "^2.0.2", "uri-js": "^4.2.2" } }, "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA=="],
+
+ "example-nestjs-express/@nestjs/cli/@angular-devkit/core/jsonc-parser": ["jsonc-parser@3.2.1", "", {}, "sha512-AilxAyFOAcK5wA1+LeaySVBrHsGQvUFCDWXKpZjzaL0PqW+xfBOttn8GNtWKFWqneyMZj41MWF9Kl6iPWLwgOA=="],
+
+ "example-nestjs-express/@nestjs/cli/@angular-devkit/core/picomatch": ["picomatch@4.0.1", "", {}, "sha512-xUXwsxNjwTQ8K3GnT4pCJm+xq3RUPQbmkYJTP5aFIfNIvbcc/4MUxgBaaRSZJ6yGJZiGSyYlM6MzwTsRk8SYCg=="],
+
+ "example-nestjs-express/@nestjs/cli/@angular-devkit/core/rxjs": ["rxjs@7.8.1", "", { "dependencies": { "tslib": "^2.1.0" } }, "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg=="],
+
+ "example-nestjs-express/@nestjs/cli/@angular-devkit/core/source-map": ["source-map@0.7.4", "", {}, "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA=="],
+
+ "example-nestjs-express/@nestjs/cli/@angular-devkit/schematics/jsonc-parser": ["jsonc-parser@3.2.1", "", {}, "sha512-AilxAyFOAcK5wA1+LeaySVBrHsGQvUFCDWXKpZjzaL0PqW+xfBOttn8GNtWKFWqneyMZj41MWF9Kl6iPWLwgOA=="],
+
+ "example-nestjs-express/@nestjs/cli/@angular-devkit/schematics/magic-string": ["magic-string@0.30.8", "", { "dependencies": { "@jridgewell/sourcemap-codec": "^1.4.15" } }, "sha512-ISQTe55T2ao7XtlAStud6qwYPZjE4GK1S/BeVPus4jrq6JuOnQ00YKQC581RWhR122W7msZV263KzVeLoqidyQ=="],
+
+ "example-nestjs-express/@nestjs/cli/@angular-devkit/schematics/rxjs": ["rxjs@7.8.1", "", { "dependencies": { "tslib": "^2.1.0" } }, "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg=="],
+
+ "example-nestjs-express/@nestjs/cli/@angular-devkit/schematics-cli/inquirer": ["inquirer@9.2.15", "", { "dependencies": { "@ljharb/through": "^2.3.12", "ansi-escapes": "^4.3.2", "chalk": "^5.3.0", "cli-cursor": "^3.1.0", "cli-width": "^4.1.0", "external-editor": "^3.1.0", "figures": "^3.2.0", "lodash": "^4.17.21", "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" } }, "sha512-vI2w4zl/mDluHt9YEQ/543VTCwPKWiHzKtm9dM2V0NdFcqEexDAjUHzO1oA60HRNaVifGXXM1tRRNluLVHa0Kg=="],
+
+ "example-nestjs-express/@nestjs/cli/fork-ts-checker-webpack-plugin/cosmiconfig": ["cosmiconfig@8.3.6", "", { "dependencies": { "import-fresh": "^3.3.0", "js-yaml": "^4.1.0", "parse-json": "^5.2.0", "path-type": "^4.0.0" }, "peerDependencies": { "typescript": ">=4.9.5" }, "optionalPeers": ["typescript"] }, "sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA=="],
+
+ "example-nestjs-express/@nestjs/cli/glob/minimatch": ["minimatch@9.0.5", "", { "dependencies": { "brace-expansion": "^2.0.1" } }, "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow=="],
+
+ "example-nestjs-express/@nestjs/cli/glob/minipass": ["minipass@7.1.2", "", {}, "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw=="],
+
+ "example-nestjs-express/@nestjs/cli/inquirer/cli-width": ["cli-width@3.0.0", "", {}, "sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw=="],
+
+ "example-nestjs-express/@nestjs/cli/inquirer/mute-stream": ["mute-stream@0.0.8", "", {}, "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA=="],
+
+ "example-nestjs-express/@nestjs/cli/inquirer/run-async": ["run-async@2.4.1", "", {}, "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ=="],
+
+ "example-nestjs-express/@nestjs/cli/webpack/eslint-scope": ["eslint-scope@5.1.1", "", { "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^4.1.1" } }, "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw=="],
+
+ "example-nestjs-express/@nestjs/cli/webpack/watchpack": ["watchpack@2.5.1", "", { "dependencies": { "glob-to-regexp": "^0.4.1", "graceful-fs": "^4.1.2" } }, "sha512-Zn5uXdcFNIA1+1Ei5McRd+iRzfhENPCe7LeABkJtNulSxjma+l7ltNx55BWZkRlwRnpOgHqxnjyaDgJnNXnqzg=="],
+
+ "example-nestjs-fastify/@nestjs/cli/@angular-devkit/core/ajv": ["ajv@8.12.0", "", { "dependencies": { "fast-deep-equal": "^3.1.1", "json-schema-traverse": "^1.0.0", "require-from-string": "^2.0.2", "uri-js": "^4.2.2" } }, "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA=="],
+
+ "example-nestjs-fastify/@nestjs/cli/@angular-devkit/core/jsonc-parser": ["jsonc-parser@3.2.1", "", {}, "sha512-AilxAyFOAcK5wA1+LeaySVBrHsGQvUFCDWXKpZjzaL0PqW+xfBOttn8GNtWKFWqneyMZj41MWF9Kl6iPWLwgOA=="],
+
+ "example-nestjs-fastify/@nestjs/cli/@angular-devkit/core/picomatch": ["picomatch@4.0.1", "", {}, "sha512-xUXwsxNjwTQ8K3GnT4pCJm+xq3RUPQbmkYJTP5aFIfNIvbcc/4MUxgBaaRSZJ6yGJZiGSyYlM6MzwTsRk8SYCg=="],
+
+ "example-nestjs-fastify/@nestjs/cli/@angular-devkit/core/rxjs": ["rxjs@7.8.1", "", { "dependencies": { "tslib": "^2.1.0" } }, "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg=="],
+
+ "example-nestjs-fastify/@nestjs/cli/@angular-devkit/core/source-map": ["source-map@0.7.4", "", {}, "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA=="],
+
+ "example-nestjs-fastify/@nestjs/cli/@angular-devkit/schematics/jsonc-parser": ["jsonc-parser@3.2.1", "", {}, "sha512-AilxAyFOAcK5wA1+LeaySVBrHsGQvUFCDWXKpZjzaL0PqW+xfBOttn8GNtWKFWqneyMZj41MWF9Kl6iPWLwgOA=="],
+
+ "example-nestjs-fastify/@nestjs/cli/@angular-devkit/schematics/magic-string": ["magic-string@0.30.8", "", { "dependencies": { "@jridgewell/sourcemap-codec": "^1.4.15" } }, "sha512-ISQTe55T2ao7XtlAStud6qwYPZjE4GK1S/BeVPus4jrq6JuOnQ00YKQC581RWhR122W7msZV263KzVeLoqidyQ=="],
+
+ "example-nestjs-fastify/@nestjs/cli/@angular-devkit/schematics/rxjs": ["rxjs@7.8.1", "", { "dependencies": { "tslib": "^2.1.0" } }, "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg=="],
+
+ "example-nestjs-fastify/@nestjs/cli/@angular-devkit/schematics-cli/inquirer": ["inquirer@9.2.15", "", { "dependencies": { "@ljharb/through": "^2.3.12", "ansi-escapes": "^4.3.2", "chalk": "^5.3.0", "cli-cursor": "^3.1.0", "cli-width": "^4.1.0", "external-editor": "^3.1.0", "figures": "^3.2.0", "lodash": "^4.17.21", "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" } }, "sha512-vI2w4zl/mDluHt9YEQ/543VTCwPKWiHzKtm9dM2V0NdFcqEexDAjUHzO1oA60HRNaVifGXXM1tRRNluLVHa0Kg=="],
+
+ "example-nestjs-fastify/@nestjs/cli/fork-ts-checker-webpack-plugin/cosmiconfig": ["cosmiconfig@8.3.6", "", { "dependencies": { "import-fresh": "^3.3.0", "js-yaml": "^4.1.0", "parse-json": "^5.2.0", "path-type": "^4.0.0" }, "peerDependencies": { "typescript": ">=4.9.5" }, "optionalPeers": ["typescript"] }, "sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA=="],
+
+ "example-nestjs-fastify/@nestjs/cli/glob/minimatch": ["minimatch@9.0.5", "", { "dependencies": { "brace-expansion": "^2.0.1" } }, "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow=="],
+
+ "example-nestjs-fastify/@nestjs/cli/glob/minipass": ["minipass@7.1.2", "", {}, "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw=="],
+
+ "example-nestjs-fastify/@nestjs/cli/inquirer/cli-width": ["cli-width@3.0.0", "", {}, "sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw=="],
+
+ "example-nestjs-fastify/@nestjs/cli/inquirer/mute-stream": ["mute-stream@0.0.8", "", {}, "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA=="],
+
+ "example-nestjs-fastify/@nestjs/cli/inquirer/run-async": ["run-async@2.4.1", "", {}, "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ=="],
+
+ "example-nestjs-fastify/@nestjs/cli/webpack/eslint-scope": ["eslint-scope@5.1.1", "", { "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^4.1.1" } }, "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw=="],
+
+ "example-nestjs-fastify/@nestjs/cli/webpack/watchpack": ["watchpack@2.5.1", "", { "dependencies": { "glob-to-regexp": "^0.4.1", "graceful-fs": "^4.1.2" } }, "sha512-Zn5uXdcFNIA1+1Ei5McRd+iRzfhENPCe7LeABkJtNulSxjma+l7ltNx55BWZkRlwRnpOgHqxnjyaDgJnNXnqzg=="],
+
+ "hast-util-from-parse5/vfile/vfile-message/unist-util-stringify-position": ["unist-util-stringify-position@4.0.0", "", { "dependencies": { "@types/unist": "^3.0.0" } }, "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ=="],
+
+ "hast-util-raw/mdast-util-to-hast/micromark-util-sanitize-uri/micromark-util-character": ["micromark-util-character@2.1.1", "", { "dependencies": { "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q=="],
+
+ "hast-util-raw/mdast-util-to-hast/micromark-util-sanitize-uri/micromark-util-encode": ["micromark-util-encode@2.0.1", "", {}, "sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw=="],
+
+ "hast-util-raw/mdast-util-to-hast/micromark-util-sanitize-uri/micromark-util-symbol": ["micromark-util-symbol@2.0.1", "", {}, "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q=="],
+
+ "hast-util-raw/vfile/vfile-message/unist-util-stringify-position": ["unist-util-stringify-position@4.0.0", "", { "dependencies": { "@types/unist": "^3.0.0" } }, "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ=="],
+
+ "jest-changed-files/execa/onetime/mimic-fn": ["mimic-fn@2.1.0", "", {}, "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg=="],
+
+ "listr2/wrap-ansi/string-width/emoji-regex": ["emoji-regex@10.6.0", "", {}, "sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A=="],
+
+ "listr2/wrap-ansi/strip-ansi/ansi-regex": ["ansi-regex@6.2.2", "", {}, "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg=="],
+
+ "log-update/cli-cursor/restore-cursor/onetime": ["onetime@7.0.0", "", { "dependencies": { "mimic-function": "^5.0.0" } }, "sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ=="],
+
+ "log-update/wrap-ansi/string-width/emoji-regex": ["emoji-regex@10.6.0", "", {}, "sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A=="],
+
+ "mdast-util-mdx-jsx/unist-util-remove-position/unist-util-visit/unist-util-is": ["unist-util-is@5.2.1", "", { "dependencies": { "@types/unist": "^2.0.0" } }, "sha512-u9njyyfEh43npf1M+yGKDGVPbY/JWEemg5nH05ncKPfi+kBbKBJoTdsogMu33uhytuLlv9y0O7GH7fEdwLdLQw=="],
+
+ "mdast-util-mdx-jsx/unist-util-remove-position/unist-util-visit/unist-util-visit-parents": ["unist-util-visit-parents@5.1.3", "", { "dependencies": { "@types/unist": "^2.0.0", "unist-util-is": "^5.0.0" } }, "sha512-x6+y8g7wWMyQhL1iZfhIPhDAs7Xwbn9nRosDXl7qoPTSCy0yNxnKc+hWokFifWQIDGi154rdUqKvbCa4+1kLhg=="],
+
+ "multer/concat-stream/readable-stream/isarray": ["isarray@1.0.0", "", {}, "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ=="],
+
+ "multer/concat-stream/readable-stream/safe-buffer": ["safe-buffer@5.1.2", "", {}, "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="],
+
+ "multer/concat-stream/readable-stream/string_decoder": ["string_decoder@1.1.1", "", { "dependencies": { "safe-buffer": "~5.1.0" } }, "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg=="],
+
+ "nestjs-trpc.io/eslint/file-entry-cache/flat-cache": ["flat-cache@3.2.0", "", { "dependencies": { "flatted": "^3.2.9", "keyv": "^4.5.3", "rimraf": "^3.0.2" } }, "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw=="],
+
+ "nestjs-trpc.io/eslint/globals/type-fest": ["type-fest@0.20.2", "", {}, "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ=="],
+
+ "nestjs-trpc.io/rimraf/glob/minimatch": ["minimatch@10.1.1", "", { "dependencies": { "@isaacs/brace-expansion": "^5.0.0" } }, "sha512-enIvLvRAFZYXJzkCYG5RKmPfrFArdLv+R+lbQ53BmIMLIry74bjKzX6iHAm8WYamJkhSSEabrWN5D97XnKObjQ=="],
+
+ "nestjs-trpc.io/rimraf/glob/minipass": ["minipass@7.1.2", "", {}, "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw=="],
+
+ "nestjs-trpc.io/rimraf/glob/path-scurry": ["path-scurry@2.0.1", "", { "dependencies": { "lru-cache": "^11.0.0", "minipass": "^7.1.2" } }, "sha512-oWyT4gICAu+kaA7QWk/jvCHWarMKNs6pXOGWKDTr7cw4IGcUbW+PeTfbaQiLGheFRpjo6O9J0PmyMfQPjH71oA=="],
+
+ "pkg-dir/find-up/locate-path/p-locate": ["p-locate@4.1.0", "", { "dependencies": { "p-limit": "^2.2.0" } }, "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A=="],
+
+ "read-pkg-up/find-up/locate-path/p-locate": ["p-locate@6.0.0", "", { "dependencies": { "p-limit": "^4.0.0" } }, "sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw=="],
+
+ "rehype-katex/vfile/vfile-message/unist-util-stringify-position": ["unist-util-stringify-position@4.0.0", "", { "dependencies": { "@types/unist": "^3.0.0" } }, "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ=="],
+
+ "rehype-raw/vfile/vfile-message/unist-util-stringify-position": ["unist-util-stringify-position@4.0.0", "", { "dependencies": { "@types/unist": "^3.0.0" } }, "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ=="],
+
+ "release-it/inquirer/ora/chalk": ["chalk@4.1.2", "", { "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA=="],
+
+ "release-it/ora/cli-cursor/restore-cursor": ["restore-cursor@4.0.0", "", { "dependencies": { "onetime": "^5.1.0", "signal-exit": "^3.0.2" } }, "sha512-I9fPXU9geO9bHOt9pHHOhOkYerIMsmVaWB0rA2AI9ERh/+x/i7MV5HKBNrg+ljO5eoPVgCcnFuRjJ9uH6I/3eg=="],
+
+ "release-it/ora/log-symbols/is-unicode-supported": ["is-unicode-supported@1.3.0", "", {}, "sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ=="],
+
+ "release-it/ora/string-width/emoji-regex": ["emoji-regex@10.6.0", "", {}, "sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A=="],
+
+ "release-it/ora/strip-ansi/ansi-regex": ["ansi-regex@6.2.2", "", {}, "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg=="],
+
+ "release-it/os-name/windows-release/execa": ["execa@5.1.1", "", { "dependencies": { "cross-spawn": "^7.0.3", "get-stream": "^6.0.0", "human-signals": "^2.1.0", "is-stream": "^2.0.0", "merge-stream": "^2.0.0", "npm-run-path": "^4.0.1", "onetime": "^5.1.2", "signal-exit": "^3.0.3", "strip-final-newline": "^2.0.0" } }, "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg=="],
+
+ "terser-webpack-plugin/schema-utils/ajv/json-schema-traverse": ["json-schema-traverse@1.0.0", "", {}, "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug=="],
+
+ "title/chalk/ansi-styles/color-convert": ["color-convert@1.9.3", "", { "dependencies": { "color-name": "1.1.3" } }, "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg=="],
+
+ "title/chalk/supports-color/has-flag": ["has-flag@2.0.0", "", {}, "sha512-P+1n3MnwjR/Epg9BBo1KT8qbye2g2Ou4sFumihwt6I4tsUX7jnLcX4BTOSKg/B1ZrIYMN9FcEnG4x5a7NB8Eng=="],
+
+ "vfile-location/vfile/vfile-message/unist-util-stringify-position": ["unist-util-stringify-position@4.0.0", "", { "dependencies": { "@types/unist": "^3.0.0" } }, "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ=="],
+
+ "web/tailwindcss/postcss-load-config/lilconfig": ["lilconfig@3.1.3", "", {}, "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw=="],
+
+ "widest-line/string-width/strip-ansi/ansi-regex": ["ansi-regex@6.2.2", "", {}, "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg=="],
+
+ "windows-release/execa/onetime/mimic-fn": ["mimic-fn@2.1.0", "", {}, "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg=="],
+
+ "@commitlint/top-level/find-up/locate-path/p-locate/p-limit": ["p-limit@4.0.0", "", { "dependencies": { "yocto-queue": "^1.0.0" } }, "sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ=="],
+
+ "@istanbuljs/load-nyc-config/find-up/locate-path/p-locate/p-limit": ["p-limit@2.3.0", "", { "dependencies": { "p-try": "^2.0.0" } }, "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w=="],
+
+ "@nestjs/platform-fastify/fastify/@fastify/ajv-compiler/ajv/json-schema-traverse": ["json-schema-traverse@1.0.0", "", {}, "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug=="],
+
+ "@nestjs/platform-fastify/fastify/fast-json-stringify/ajv/json-schema-traverse": ["json-schema-traverse@1.0.0", "", {}, "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug=="],
+
+ "@nestjs/platform-fastify/fastify/find-my-way/safe-regex2/ret": ["ret@0.4.3", "", {}, "sha512-0f4Memo5QP7WQyUEAYUO3esD/XjOc3Zjjg5CPsAq1p8sIu0XPeMbHJemKA0BO7tV0X7+A0FoEpbmHXWxPyD3wQ=="],
+
+ "bin-check/execa/cross-spawn/lru-cache/yallist": ["yallist@2.1.2", "", {}, "sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A=="],
+
+ "bin-check/execa/cross-spawn/shebang-command/shebang-regex": ["shebang-regex@1.0.0", "", {}, "sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ=="],
+
+ "clipboardy/execa/cross-spawn/lru-cache/yallist": ["yallist@2.1.2", "", {}, "sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A=="],
+
+ "clipboardy/execa/cross-spawn/shebang-command/shebang-regex": ["shebang-regex@1.0.0", "", {}, "sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ=="],
+
+ "example-nestjs-express/@nestjs/cli/@angular-devkit/core/ajv/json-schema-traverse": ["json-schema-traverse@1.0.0", "", {}, "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug=="],
+
+ "example-nestjs-express/@nestjs/cli/@angular-devkit/schematics-cli/inquirer/chalk": ["chalk@5.3.0", "", {}, "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w=="],
+
+ "example-nestjs-express/@nestjs/cli/fork-ts-checker-webpack-plugin/cosmiconfig/path-type": ["path-type@4.0.0", "", {}, "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw=="],
+
+ "example-nestjs-express/@nestjs/cli/glob/minimatch/brace-expansion": ["brace-expansion@2.0.2", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ=="],
+
+ "example-nestjs-express/@nestjs/cli/webpack/eslint-scope/estraverse": ["estraverse@4.3.0", "", {}, "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw=="],
+
+ "example-nestjs-fastify/@nestjs/cli/@angular-devkit/core/ajv/json-schema-traverse": ["json-schema-traverse@1.0.0", "", {}, "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug=="],
+
+ "example-nestjs-fastify/@nestjs/cli/@angular-devkit/schematics-cli/inquirer/chalk": ["chalk@5.3.0", "", {}, "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w=="],
+
+ "example-nestjs-fastify/@nestjs/cli/fork-ts-checker-webpack-plugin/cosmiconfig/path-type": ["path-type@4.0.0", "", {}, "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw=="],
+
+ "example-nestjs-fastify/@nestjs/cli/glob/minimatch/brace-expansion": ["brace-expansion@2.0.2", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ=="],
+
+ "example-nestjs-fastify/@nestjs/cli/webpack/eslint-scope/estraverse": ["estraverse@4.3.0", "", {}, "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw=="],
+
+ "hast-util-raw/mdast-util-to-hast/micromark-util-sanitize-uri/micromark-util-character/micromark-util-types": ["micromark-util-types@2.0.2", "", {}, "sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA=="],
+
+ "nestjs-trpc.io/eslint/file-entry-cache/flat-cache/rimraf": ["rimraf@3.0.2", "", { "dependencies": { "glob": "^7.1.3" }, "bin": { "rimraf": "bin.js" } }, "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA=="],
+
+ "nestjs-trpc.io/rimraf/glob/path-scurry/lru-cache": ["lru-cache@11.2.4", "", {}, "sha512-B5Y16Jr9LB9dHVkh6ZevG+vAbOsNOYCX+sXvFWFu7B3Iz5mijW3zdbMyhsh8ANd2mSWBYdJgnqi+mL7/LrOPYg=="],
+
+ "pkg-dir/find-up/locate-path/p-locate/p-limit": ["p-limit@2.3.0", "", { "dependencies": { "p-try": "^2.0.0" } }, "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w=="],
+
+ "read-pkg-up/find-up/locate-path/p-locate/p-limit": ["p-limit@4.0.0", "", { "dependencies": { "yocto-queue": "^1.0.0" } }, "sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ=="],
+
+ "release-it/ora/cli-cursor/restore-cursor/onetime": ["onetime@5.1.2", "", { "dependencies": { "mimic-fn": "^2.1.0" } }, "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg=="],
+
+ "release-it/ora/cli-cursor/restore-cursor/signal-exit": ["signal-exit@3.0.7", "", {}, "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ=="],
+
+ "release-it/os-name/windows-release/execa/get-stream": ["get-stream@6.0.1", "", {}, "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg=="],
+
+ "release-it/os-name/windows-release/execa/human-signals": ["human-signals@2.1.0", "", {}, "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw=="],
+
+ "release-it/os-name/windows-release/execa/is-stream": ["is-stream@2.0.1", "", {}, "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg=="],
+
+ "release-it/os-name/windows-release/execa/npm-run-path": ["npm-run-path@4.0.1", "", { "dependencies": { "path-key": "^3.0.0" } }, "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw=="],
+
+ "release-it/os-name/windows-release/execa/onetime": ["onetime@5.1.2", "", { "dependencies": { "mimic-fn": "^2.1.0" } }, "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg=="],
+
+ "release-it/os-name/windows-release/execa/signal-exit": ["signal-exit@3.0.7", "", {}, "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ=="],
+
+ "release-it/os-name/windows-release/execa/strip-final-newline": ["strip-final-newline@2.0.0", "", {}, "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA=="],
+
+ "title/chalk/ansi-styles/color-convert/color-name": ["color-name@1.1.3", "", {}, "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw=="],
+
+ "@commitlint/top-level/find-up/locate-path/p-locate/p-limit/yocto-queue": ["yocto-queue@1.2.2", "", {}, "sha512-4LCcse/U2MHZ63HAJVE+v71o7yOdIe4cZ70Wpf8D/IyjDKYQLV5GD46B+hSTjJsvV5PztjvHoU580EftxjDZFQ=="],
+
+ "nestjs-trpc.io/eslint/file-entry-cache/flat-cache/rimraf/glob": ["glob@7.2.3", "", { "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", "inherits": "2", "minimatch": "^3.1.1", "once": "^1.3.0", "path-is-absolute": "^1.0.0" } }, "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q=="],
+
+ "read-pkg-up/find-up/locate-path/p-locate/p-limit/yocto-queue": ["yocto-queue@1.2.2", "", {}, "sha512-4LCcse/U2MHZ63HAJVE+v71o7yOdIe4cZ70Wpf8D/IyjDKYQLV5GD46B+hSTjJsvV5PztjvHoU580EftxjDZFQ=="],
+
+ "release-it/ora/cli-cursor/restore-cursor/onetime/mimic-fn": ["mimic-fn@2.1.0", "", {}, "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg=="],
+
+ "release-it/os-name/windows-release/execa/onetime/mimic-fn": ["mimic-fn@2.1.0", "", {}, "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg=="],
+ }
+}
diff --git a/docs/.eslintrc.json b/docs/.eslintrc.json
index 4939927..bffb357 100644
--- a/docs/.eslintrc.json
+++ b/docs/.eslintrc.json
@@ -1,6 +1,3 @@
{
- "extends": "next/core-web-vitals",
- "rules": {
- "prettier/prettier": "warn"
- }
+ "extends": "next/core-web-vitals"
}
diff --git a/docs/docs/RELEASE_CHECKLIST.md b/docs/docs/RELEASE_CHECKLIST.md
new file mode 100644
index 0000000..60986d1
--- /dev/null
+++ b/docs/docs/RELEASE_CHECKLIST.md
@@ -0,0 +1,132 @@
+# Release Checklist: v2.0.0
+
+This checklist documents the release process for nestjs-trpc v2.0.0.
+
+## Pre-Release Validation
+
+- [ ] All CI checks pass on main branch
+ - [ ] `verify` job (lint, test, build)
+ - [ ] `verify-rust-cli` job (fmt, clippy, test, build)
+ - [ ] `e2e-tests` job (Express and Fastify examples)
+
+- [ ] Local validation
+ - [ ] `bun install && bun run build` succeeds
+ - [ ] `bun test` passes (46 unit tests)
+ - [ ] `cd packages/nestjs-trpc/cli && cargo test` passes
+
+- [ ] Example apps work
+ - [ ] `cd examples/nestjs-express && bun run start:dev` starts without errors
+ - [ ] `cd examples/nestjs-fastify && bun run start:dev` starts without errors
+ - [ ] `cd examples/nextjs-trpc && bun run dev` starts without errors
+
+## Documentation
+
+- [ ] CHANGELOG.md updated with all changes since last release
+ - [ ] Breaking changes clearly marked
+ - [ ] Migration guide links included
+- [ ] Migration guides complete
+ - [ ] docs/docs/migration/v10-to-v11.md
+ - [ ] docs/docs/migration/typescript-to-rust-cli.md
+- [ ] Installation docs updated (no autoSchemaFile references)
+- [ ] README.md updated with CLI workflow
+
+## Binary Publishing
+
+Build Rust CLI for all supported platforms:
+
+- [ ] macOS Intel (x86_64-apple-darwin)
+ ```bash
+ cargo build --release --target x86_64-apple-darwin
+ ```
+- [ ] macOS ARM (aarch64-apple-darwin)
+ ```bash
+ cargo build --release --target aarch64-apple-darwin
+ ```
+- [ ] Linux x64 (x86_64-unknown-linux-gnu)
+ ```bash
+ cross build --release --target x86_64-unknown-linux-gnu
+ ```
+- [ ] Linux ARM (aarch64-unknown-linux-gnu)
+ ```bash
+ cross build --release --target aarch64-unknown-linux-gnu
+ ```
+- [ ] Windows x64 (x86_64-pc-windows-msvc)
+ ```bash
+ cross build --release --target x86_64-pc-windows-msvc
+ ```
+
+- [ ] Place binaries in `packages/nestjs-trpc/native/` with correct paths:
+ ```
+ native/
+ ├── darwin-arm64/nestjs-trpc
+ ├── darwin-x64/nestjs-trpc
+ ├── linux-arm64/nestjs-trpc
+ ├── linux-x64/nestjs-trpc
+ └── win32-x64/nestjs-trpc.exe
+ ```
+
+- [ ] Test CLI binary on at least one platform:
+ ```bash
+ cd examples/nestjs-express
+ npx nestjs-trpc generate --input ./src --output ./src/@generated/server.ts
+ ```
+
+## npm Publishing
+
+- [ ] Ensure you're logged into npm: `npm whoami`
+- [ ] Update version in package.json:
+ ```bash
+ cd packages/nestjs-trpc
+ npm version major # Bumps to 2.0.0
+ ```
+- [ ] Verify package contents:
+ ```bash
+ npm pack --dry-run
+ ```
+- [ ] Publish to npm:
+ ```bash
+ npm publish
+ ```
+- [ ] Verify package on npmjs.com: https://www.npmjs.com/package/nestjs-trpc
+- [ ] Push git tags:
+ ```bash
+ git push --tags
+ ```
+
+## Post-Release
+
+- [ ] Create GitHub Release
+ - Go to: https://github.com/KevinEdry/nestjs-trpc/releases/new
+ - Tag: v2.0.0
+ - Title: v2.0.0
+ - Description: Copy from CHANGELOG.md
+ - Mark as latest release
+
+- [ ] Announcements
+ - [ ] Twitter/X post
+ - [ ] Discord announcement (if applicable)
+
+- [ ] Monitor for issues
+ - Watch GitHub issues for 24-48 hours after release
+ - Be ready to publish patch release if critical bugs found
+
+## Rollback Plan
+
+If critical issues found after publish:
+
+1. Deprecate the broken version:
+ ```bash
+ npm deprecate nestjs-trpc@2.0.0 "Critical bug found, please use 2.0.1"
+ ```
+
+2. Fix the issue and publish patch:
+ ```bash
+ npm version patch
+ npm publish
+ ```
+
+## Notes
+
+- Windows ARM64 is not supported in v2.0.0 (document if requested)
+- The `autoSchemaFile` option no longer exists - users must use CLI
+- Breaking changes require migration guide links in CHANGELOG
diff --git a/docs/docs/migration/typescript-to-rust-cli.md b/docs/docs/migration/typescript-to-rust-cli.md
new file mode 100644
index 0000000..411a6a4
--- /dev/null
+++ b/docs/docs/migration/typescript-to-rust-cli.md
@@ -0,0 +1,199 @@
+---
+sidebar_position: 2
+---
+
+# Migrating to the Rust CLI
+
+Starting with nestjs-trpc v2.0.0, code generation is handled by a Rust-based CLI instead of the previous TypeScript-based generator.
+
+## Why the Change?
+
+The Rust CLI provides:
+
+- **Faster generation**: 10-50x faster parsing and code generation
+- **No runtime dependency**: Works without Node.js TypeScript compiler
+- **Watch mode**: Automatic regeneration on file changes
+- **Better error messages**: Rich diagnostics with file locations
+
+## Migration Steps
+
+### 1. Update to v2.0.0
+
+```bash
+bun add nestjs-trpc@^2.0.0
+```
+
+### 2. Update Your Generate Script
+
+**Before (using Node.js API):**
+```json
+{
+ "scripts": {
+ "generate": "ts-node ./scripts/generate.ts"
+ }
+}
+```
+
+**After (using CLI):**
+```json
+{
+ "scripts": {
+ "generate": "npx nestjs-trpc generate"
+ }
+}
+```
+
+### 3. Remove Old Generation Scripts
+
+If you had a custom generation script, you can delete it:
+
+```bash
+rm ./scripts/generate.ts
+```
+
+### 4. Run Generation
+
+```bash
+bun run generate
+```
+
+Or with watch mode:
+
+```bash
+npx nestjs-trpc watch
+```
+
+## CLI Options
+
+```bash
+# Basic generation
+npx nestjs-trpc generate
+
+# Specify paths
+npx nestjs-trpc generate --input ./src --output ./src/@generated/server.ts
+
+# Watch mode
+npx nestjs-trpc watch --input ./src --output ./src/@generated/server.ts
+
+# Verbose output
+npx nestjs-trpc generate --verbose
+
+# Debug mode (for bug reports)
+npx nestjs-trpc generate --debug
+```
+
+## Breaking Changes
+
+### Removed: Node.js Generation API
+
+The following API has been removed:
+
+```typescript
+// This no longer exists
+import { TRPCGenerator } from 'nestjs-trpc';
+generator.generateSchemaFile();
+```
+
+Use the CLI instead:
+
+```bash
+npx nestjs-trpc generate
+```
+
+### Removed: autoSchemaFile Option
+
+The `autoSchemaFile` option in `TRPCModule.forRoot()` has been removed:
+
+```typescript
+// Before (no longer works)
+TRPCModule.forRoot({
+ autoSchemaFile: './src/@generated/server.ts',
+})
+
+// After (use CLI)
+// 1. Remove autoSchemaFile option
+TRPCModule.forRoot({})
+
+// 2. Add CLI to build/dev scripts
+```
+
+### Removed: ts-morph Dependency
+
+The library no longer depends on ts-morph. If your project used it indirectly through nestjs-trpc, you may need to add it explicitly if you use it elsewhere.
+
+## Output Differences
+
+The Rust CLI generates equivalent TypeScript output to the previous generator. If you notice any differences:
+
+1. **Whitespace/formatting**: Minor formatting differences are expected
+2. **Import order**: May differ but functionally equivalent
+3. **Type inference**: Should be identical
+
+If you find functional differences, please [open an issue](https://github.com/KevinEdry/nestjs-trpc/issues).
+
+## Troubleshooting
+
+### "Command not found: nestjs-trpc"
+
+Ensure you're on v2.0.0+:
+```bash
+npm list nestjs-trpc
+```
+
+### "No routers found"
+
+Check that your router files:
+- Are in the input directory (default: current directory)
+- Use the `@Router()` decorator
+- Export the router class
+
+### "Parse error in file"
+
+The CLI will show the exact file and location of the error. Common causes:
+- Syntax errors in TypeScript
+- Invalid decorator usage
+- Missing Zod imports
+
+### Watch mode not detecting changes
+
+Ensure:
+- You're editing files in the input directory
+- Files have `.ts` extension
+- The file isn't in the output directory (excluded to prevent loops)
+
+## IDE Integration
+
+### VS Code Task
+
+Add to `.vscode/tasks.json`:
+
+```json
+{
+ "version": "2.0.0",
+ "tasks": [
+ {
+ "label": "Generate Types",
+ "type": "shell",
+ "command": "npx nestjs-trpc generate",
+ "problemMatcher": []
+ },
+ {
+ "label": "Watch Types",
+ "type": "shell",
+ "command": "npx nestjs-trpc watch",
+ "isBackground": true,
+ "problemMatcher": []
+ }
+ ]
+}
+```
+
+### Git Hooks
+
+Add to pre-commit (optional):
+
+```bash
+# .husky/pre-commit
+npx nestjs-trpc generate
+git add src/@generated/server.ts
+```
diff --git a/docs/docs/migration/v10-to-v11.md b/docs/docs/migration/v10-to-v11.md
new file mode 100644
index 0000000..12488df
--- /dev/null
+++ b/docs/docs/migration/v10-to-v11.md
@@ -0,0 +1,111 @@
+---
+sidebar_position: 1
+---
+
+# Migrating from tRPC v10 to v11
+
+This guide covers upgrading nestjs-trpc when moving from tRPC v10 to v11.
+
+## Overview
+
+tRPC v11 is largely backward compatible with v10. The main changes are:
+
+- **Data transformers**: Move to link configuration
+- **Client creation**: `createTRPCProxyClient` renamed to `createTRPCClient`
+- **SSG helpers**: `createProxySSGHelpers` renamed to `createSSGHelpers`
+- **Subscriptions**: New SSE-based subscriptions (WebSocket still supported)
+
+## Required Changes
+
+### 1. Update Dependencies
+
+```bash
+# Update your NestJS backend
+bun add @trpc/server@^11.0.0
+
+# Update your client (e.g., Next.js frontend)
+bun add @trpc/client@^11.0.0 @trpc/server@^11.0.0
+```
+
+### 2. Data Transformers (if using)
+
+If you use superjson or other data transformers, move them to link configuration:
+
+**Before (v10):**
+```typescript
+// In your client
+const client = createTRPCProxyClient({
+ transformer: superjson,
+ links: [httpBatchLink({ url: '/api/trpc' })],
+});
+```
+
+**After (v11):**
+```typescript
+// In your client
+const client = createTRPCClient({
+ links: [
+ httpBatchLink({
+ url: '/api/trpc',
+ transformer: superjson,
+ }),
+ ],
+});
+```
+
+### 3. Client Creation (if using vanilla client)
+
+**Before (v10):**
+```typescript
+import { createTRPCProxyClient } from '@trpc/client';
+const client = createTRPCProxyClient({ ... });
+```
+
+**After (v11):**
+```typescript
+import { createTRPCClient } from '@trpc/client';
+const client = createTRPCClient({ ... });
+```
+
+Note: The old name still works but is deprecated.
+
+## No Changes Required
+
+These features work identically in v11:
+
+- `@Router()` decorator
+- `@Query()` and `@Mutation()` decorators
+- `@UseMiddlewares()` decorator
+- `@Context()` parameter decorator
+- Zod schema validation
+- All input/output type inference
+
+## Internal Changes
+
+The following internal implementation changed but requires no user action:
+
+- Router construction now uses plain objects instead of explicit `router()` calls
+- This is an internal optimization that aligns with tRPC v11 best practices
+
+## Troubleshooting
+
+### "Cannot find module '@trpc/server'"
+
+Ensure you've updated both server and client packages to v11.
+
+### "Type errors after upgrade"
+
+Clear your TypeScript cache and rebuild:
+```bash
+rm -rf node_modules/.cache
+bun run build
+```
+
+### "Transformer not working"
+
+Make sure transformer is in the link options, not the root client options.
+
+## Further Reading
+
+- [Official tRPC v11 Migration Guide](https://trpc.io/docs/migrate-from-v10-to-v11)
+- [tRPC v11 Announcement](https://trpc.io/blog/announcing-trpc-v11)
diff --git a/docs/package.json b/docs/package.json
index b1b5c60..2ef5f6b 100644
--- a/docs/package.json
+++ b/docs/package.json
@@ -31,7 +31,7 @@
"@types/react": "^18",
"@types/react-dom": "^18",
"autoprefixer": "^10.4.19",
- "eslint": "^9.9.1",
+ "eslint": "^8.57.0",
"eslint-config-next": "^14.2.6",
"next-sitemap": "^4.2.3",
"postcss": "^8",
diff --git a/docs/pages/docs/index.mdx b/docs/pages/docs/index.mdx
index 7ea8271..9de0bed 100644
--- a/docs/pages/docs/index.mdx
+++ b/docs/pages/docs/index.mdx
@@ -56,21 +56,42 @@ import { TRPCModule } from 'nestjs-trpc';
@Module({
imports: [
TRPCModule.forRoot({
- autoSchemaFile: './src/@generated',
+ // Optional: specify custom base path (default: '/trpc')
+ // basePath: '/api/trpc',
}),
],
})
export class AppModule {}
```
-The `forRoot()` method takes an options object as an argument. These options are passed through to the underlying `express` or `fastify` driver. For example, if you want to disable the schema file generation (when deploying to production), you can omit the `autoSchemaFile` option.
+The `forRoot()` method takes an options object as an argument. These options are passed through to the underlying `express` or `fastify` driver.
+
+### Generate Types
+
+Run the CLI to generate your AppRouter types:
+
+```bash copy
+npx nestjs-trpc generate
+```
+
+This scans your routers and creates a TypeScript file with your complete router types. For watch mode during development:
+
+```bash copy
+npx nestjs-trpc watch
+```
+
+By default, types are generated to `./src/@generated/server.ts`. You can customize this with the `--output` flag:
+
+```bash copy
+npx nestjs-trpc generate --output ./src/trpc/types.ts
+```
### Start your NestJS server. You should be good to go! 🎉
-
- When setting up **NestJS tRPC** you must set your `"sourceMap": true{:typescript}` in your `compilerOptions` within the `tsconfig.json` configuration file.
+
+ Setting `"sourceMap": true{:typescript}` in your `compilerOptions` within `tsconfig.json` can help with debugging, but is not required for the CLI to work.
### Module Options
@@ -80,7 +101,7 @@ You can import `TRPCModuleOptions` type from `nestjs-trpc` to safely assert all
```typescript
import { TRPCModule, TRPCModuleOptions } from 'nestjs-trpc';
const trpcOptions: TRPCModuleOptions = {
- autoSchemaFile: './src/@generated',
+ basePath: '/trpc',
};
```
@@ -90,16 +111,6 @@ const trpcOptions: TRPCModuleOptions = {
`string`
`"/trpc"`
-
- `autoSchemaFile`
- `string`
- -
-
-
- `schemaFileImports`
- `Array`
- -
-
`context`
`TRPCContext`
@@ -116,3 +127,10 @@ const trpcOptions: TRPCModuleOptions = {
-
+
+### Supported Platforms
+
+The CLI binary is available for:
+- macOS (Intel and Apple Silicon)
+- Linux (x64 and ARM64)
+- Windows (x64)
diff --git a/docs/vercel.json b/docs/vercel.json
new file mode 100644
index 0000000..7ef21ac
--- /dev/null
+++ b/docs/vercel.json
@@ -0,0 +1,5 @@
+{
+ "framework": "nextjs",
+ "installCommand": "bun install",
+ "buildCommand": "bun run build"
+}
diff --git a/eslint.config.mjs b/eslint.config.mjs
index 1f5b38b..50c6d7f 100644
--- a/eslint.config.mjs
+++ b/eslint.config.mjs
@@ -18,6 +18,8 @@ export default [{
ignores: [
"packages/**/tests/**",
"packages/**/dist/**",
+ "packages/**/config/**",
+ "**/*.d.ts",
"examples",
"dist",
"node_modules",
diff --git a/examples/nestjs-express/.gitignore b/examples/nestjs-express/.gitignore
index 9139cc3..f450262 100644
--- a/examples/nestjs-express/.gitignore
+++ b/examples/nestjs-express/.gitignore
@@ -10,7 +10,6 @@ npm-debug.log
.DS_Store
# examples
-/test
/coverage
/.nyc_output
test-schema.graphql
diff --git a/examples/nestjs-express/package.json b/examples/nestjs-express/package.json
index 7349509..c82aa6f 100644
--- a/examples/nestjs-express/package.json
+++ b/examples/nestjs-express/package.json
@@ -9,7 +9,8 @@
"start": "nest start",
"start:dev": "nest start --watch --preserveWatchOutput",
"start:debug": "nest start --debug --watch --preserveWatchOutput",
- "start:prod": "node dist/main"
+ "start:prod": "node dist/main",
+ "test:e2e": "jest --config ./test/e2e/jest-e2e.json"
},
"keywords": [],
"author": "",
@@ -19,7 +20,7 @@
"@nestjs/config": "^3.0.0",
"@nestjs/core": "10.4.1",
"@nestjs/platform-express": "10.4.1",
- "@trpc/server": "^10.33.0",
+ "@trpc/server": "^11.0.0",
"nestjs-trpc": "workspace:*",
"reflect-metadata": "^0.1.13",
"rxjs": "^7.2.0",
@@ -28,12 +29,18 @@
"devDependencies": {
"@nestjs/cli": "10.4.4",
"@nestjs/schematics": "^10.1.2",
+ "@nestjs/testing": "10.4.1",
"@swc/cli": "^0.4.0",
"@swc/core": "^1.7.18",
"@types/express": "^4.17.17",
+ "@types/jest": "^29.5.0",
"@types/node": "^22.5.0",
+ "@types/supertest": "^6.0.0",
"chokidar": "^3.6.0",
+ "jest": "^29.7.0",
+ "supertest": "^7.0.0",
"trpc-panel": "^1.3.4",
+ "ts-jest": "^29.2.0",
"ts-morph": "^23.0.0",
"ts-node": "^10.9.1",
"tsconfig-paths": "^4.2.0",
diff --git a/examples/nestjs-express/src/app.module.ts b/examples/nestjs-express/src/app.module.ts
index ed5fb9e..8a74a2d 100644
--- a/examples/nestjs-express/src/app.module.ts
+++ b/examples/nestjs-express/src/app.module.ts
@@ -9,8 +9,6 @@ import { TrpcPanelController } from './trpc-panel.controller';
@Module({
imports: [
TRPCModule.forRoot({
- autoSchemaFile:
- process.env.NODE_ENV === 'production' ? undefined : './src/@generated',
context: AppContext,
}),
],
diff --git a/examples/nestjs-express/test/e2e/jest-e2e.json b/examples/nestjs-express/test/e2e/jest-e2e.json
new file mode 100644
index 0000000..a09998e
--- /dev/null
+++ b/examples/nestjs-express/test/e2e/jest-e2e.json
@@ -0,0 +1,25 @@
+{
+ "moduleFileExtensions": ["js", "json", "ts"],
+ "rootDir": "../..",
+ "testEnvironment": "node",
+ "testRegex": "test/e2e/.*.e2e-spec.ts$",
+ "transform": {
+ "^.+\\.ts$": [
+ "ts-jest",
+ {
+ "tsconfig": {
+ "module": "commonjs",
+ "target": "ES2021",
+ "emitDecoratorMetadata": true,
+ "experimentalDecorators": true,
+ "esModuleInterop": true,
+ "skipLibCheck": true,
+ "types": ["jest", "node"]
+ }
+ }
+ ]
+ },
+ "transformIgnorePatterns": [
+ "node_modules/(?!nestjs-trpc)"
+ ]
+}
diff --git a/examples/nestjs-express/test/e2e/trpc.e2e-spec.ts b/examples/nestjs-express/test/e2e/trpc.e2e-spec.ts
new file mode 100644
index 0000000..87eae6c
--- /dev/null
+++ b/examples/nestjs-express/test/e2e/trpc.e2e-spec.ts
@@ -0,0 +1,55 @@
+import { Test, TestingModule } from '@nestjs/testing';
+import { INestApplication } from '@nestjs/common';
+import request from 'supertest';
+import { AppModule } from '../../src/app.module';
+
+describe('tRPC Integration (e2e)', () => {
+ let app: INestApplication;
+
+ beforeAll(async () => {
+ const moduleFixture: TestingModule = await Test.createTestingModule({
+ imports: [AppModule],
+ }).compile();
+
+ app = moduleFixture.createNestApplication();
+ await app.init();
+ });
+
+ afterAll(async () => {
+ if (app) {
+ await app.close();
+ }
+ });
+
+ describe('users router', () => {
+ it('GET /trpc/users.getUserById should return user data', async () => {
+ const input = JSON.stringify({ userId: '1' });
+ const response = await request(app.getHttpServer())
+ .get(`/trpc/users.getUserById?input=${encodeURIComponent(input)}`)
+ .expect(200);
+
+ expect(response.body).toHaveProperty('result');
+ expect(response.body.result).toHaveProperty('data');
+ expect(response.body.result.data).toHaveProperty('name');
+ expect(response.body.result.data).toHaveProperty('email');
+ });
+
+ it('GET /trpc/users.getUserById with different userId should return user data', async () => {
+ const input = JSON.stringify({ userId: 'test-user-123' });
+ const response = await request(app.getHttpServer())
+ .get(`/trpc/users.getUserById?input=${encodeURIComponent(input)}`)
+ .expect(200);
+
+ expect(response.body).toHaveProperty('result');
+ expect(response.body.result).toHaveProperty('data');
+ });
+
+ it('GET /trpc/users.getUserById without input should return error', async () => {
+ const response = await request(app.getHttpServer())
+ .get('/trpc/users.getUserById')
+ .expect(400);
+
+ expect(response.body).toHaveProperty('error');
+ });
+ });
+});
diff --git a/examples/nestjs-express/test/e2e/types.e2e-spec.ts b/examples/nestjs-express/test/e2e/types.e2e-spec.ts
new file mode 100644
index 0000000..a3d8d1a
--- /dev/null
+++ b/examples/nestjs-express/test/e2e/types.e2e-spec.ts
@@ -0,0 +1,22 @@
+/**
+ * Type verification tests for generated AppRouter types.
+ *
+ * These tests verify that the Rust CLI generates valid TypeScript types
+ * that can be imported and type-checked. If TypeScript compilation succeeds,
+ * the generated types are valid.
+ */
+import type { AppRouter } from '../../src/@generated/server';
+
+describe('Generated Types (e2e)', () => {
+ it('AppRouter type is importable', () => {
+ const routerType: AppRouter | null = null;
+ expect(routerType).toBeNull();
+ });
+
+ it('AppRouter has expected router structure', () => {
+ type UsersRouter = AppRouter['users'];
+ type GetUserById = UsersRouter['getUserById'];
+
+ expect(true).toBe(true);
+ });
+});
diff --git a/examples/nestjs-express/tsconfig.build.json b/examples/nestjs-express/tsconfig.build.json
index 7e1f6ae..8d9185c 100644
--- a/examples/nestjs-express/tsconfig.build.json
+++ b/examples/nestjs-express/tsconfig.build.json
@@ -4,5 +4,5 @@
"outDir": "./dist",
"rootDir": "./src"
},
- "exclude": ["node_modules", "dist", "src/**/__tests__/*", "*.spec.ts"]
+ "exclude": ["node_modules", "dist", "test", "src/**/__tests__/*", "*.spec.ts"]
}
diff --git a/examples/nestjs-fastify/.gitignore b/examples/nestjs-fastify/.gitignore
index 9139cc3..1064ef8 100644
--- a/examples/nestjs-fastify/.gitignore
+++ b/examples/nestjs-fastify/.gitignore
@@ -10,7 +10,6 @@ npm-debug.log
.DS_Store
# examples
-/test
/coverage
/.nyc_output
test-schema.graphql
@@ -22,4 +21,5 @@ dist
.yarn/
-src/@generated
\ No newline at end of file
+src/@generated
+@generated
\ No newline at end of file
diff --git a/examples/nestjs-fastify/package.json b/examples/nestjs-fastify/package.json
index 290b576..1807392 100644
--- a/examples/nestjs-fastify/package.json
+++ b/examples/nestjs-fastify/package.json
@@ -9,7 +9,8 @@
"start": "nest start",
"start:dev": "nest start --watch --preserveWatchOutput",
"start:debug": "nest start --debug --watch --preserveWatchOutput",
- "start:prod": "node dist/main"
+ "start:prod": "node dist/main",
+ "test:e2e": "jest --config ./test/e2e/jest-e2e.json"
},
"keywords": [],
"author": "",
@@ -19,7 +20,7 @@
"@nestjs/config": "^3.0.0",
"@nestjs/core": "10.4.1",
"@nestjs/platform-fastify": "^10.4.4",
- "@trpc/server": "^10.33.0",
+ "@trpc/server": "^11.0.0",
"fastify": "^5.0.0",
"nestjs-trpc": "workspace:*",
"reflect-metadata": "^0.1.13",
@@ -29,11 +30,17 @@
"devDependencies": {
"@nestjs/cli": "10.4.4",
"@nestjs/schematics": "^10.1.2",
+ "@nestjs/testing": "10.4.1",
"@swc/cli": "^0.4.0",
"@swc/core": "^1.7.18",
+ "@types/jest": "^29.5.0",
"@types/node": "^22.5.0",
+ "@types/supertest": "^6.0.0",
"chokidar": "^3.6.0",
+ "jest": "^29.7.0",
+ "supertest": "^7.0.0",
"trpc-panel": "^1.3.4",
+ "ts-jest": "^29.2.0",
"ts-morph": "^23.0.0",
"ts-node": "^10.9.1",
"tsconfig-paths": "^4.2.0",
diff --git a/examples/nestjs-fastify/src/app.module.ts b/examples/nestjs-fastify/src/app.module.ts
index 1c1c780..94331f4 100644
--- a/examples/nestjs-fastify/src/app.module.ts
+++ b/examples/nestjs-fastify/src/app.module.ts
@@ -10,7 +10,6 @@ import { LoggingMiddleware } from './logging.middleware';
@Module({
imports: [
TRPCModule.forRoot({
- autoSchemaFile: './src/@generated',
context: AppContext,
}),
],
diff --git a/examples/nestjs-fastify/src/protected.middleware.ts b/examples/nestjs-fastify/src/protected.middleware.ts
index de2ab7c..5ee6ebf 100644
--- a/examples/nestjs-fastify/src/protected.middleware.ts
+++ b/examples/nestjs-fastify/src/protected.middleware.ts
@@ -4,7 +4,7 @@ import {
TRPCMiddleware,
} from 'nestjs-trpc';
import { Inject, Injectable } from '@nestjs/common';
-import { UserService } from './user.service';
+import { mop, UserService } from './user.service';
@Injectable()
export class ProtectedMiddleware implements TRPCMiddleware {
@@ -12,7 +12,7 @@ export class ProtectedMiddleware implements TRPCMiddleware {
async use(opts: MiddlewareOptions): Promise {
return opts.next({
ctx: {
- ben: 1,
+ blarg: mop,
},
});
}
diff --git a/examples/nestjs-fastify/src/user.service.ts b/examples/nestjs-fastify/src/user.service.ts
index 5a75df8..c3d4451 100644
--- a/examples/nestjs-fastify/src/user.service.ts
+++ b/examples/nestjs-fastify/src/user.service.ts
@@ -1,6 +1,10 @@
import { Injectable } from '@nestjs/common';
import { User } from './user.schema';
+export const mop = {
+ minimi: true,
+};
+
@Injectable()
export class UserService {
async test(): Promise {
diff --git a/examples/nestjs-fastify/test/e2e/jest-e2e.json b/examples/nestjs-fastify/test/e2e/jest-e2e.json
new file mode 100644
index 0000000..a09998e
--- /dev/null
+++ b/examples/nestjs-fastify/test/e2e/jest-e2e.json
@@ -0,0 +1,25 @@
+{
+ "moduleFileExtensions": ["js", "json", "ts"],
+ "rootDir": "../..",
+ "testEnvironment": "node",
+ "testRegex": "test/e2e/.*.e2e-spec.ts$",
+ "transform": {
+ "^.+\\.ts$": [
+ "ts-jest",
+ {
+ "tsconfig": {
+ "module": "commonjs",
+ "target": "ES2021",
+ "emitDecoratorMetadata": true,
+ "experimentalDecorators": true,
+ "esModuleInterop": true,
+ "skipLibCheck": true,
+ "types": ["jest", "node"]
+ }
+ }
+ ]
+ },
+ "transformIgnorePatterns": [
+ "node_modules/(?!nestjs-trpc)"
+ ]
+}
diff --git a/examples/nestjs-fastify/test/e2e/trpc.e2e-spec.ts b/examples/nestjs-fastify/test/e2e/trpc.e2e-spec.ts
new file mode 100644
index 0000000..a6bd325
--- /dev/null
+++ b/examples/nestjs-fastify/test/e2e/trpc.e2e-spec.ts
@@ -0,0 +1,62 @@
+import { Test, TestingModule } from '@nestjs/testing';
+import { INestApplication } from '@nestjs/common';
+import {
+ FastifyAdapter,
+ NestFastifyApplication,
+} from '@nestjs/platform-fastify';
+import request from 'supertest';
+import { AppModule } from '../../src/app.module';
+
+describe('tRPC Integration (e2e)', () => {
+ let app: INestApplication;
+
+ beforeAll(async () => {
+ const moduleFixture: TestingModule = await Test.createTestingModule({
+ imports: [AppModule],
+ }).compile();
+
+ app = moduleFixture.createNestApplication(
+ new FastifyAdapter(),
+ );
+ await app.init();
+ await app.getHttpAdapter().getInstance().ready();
+ });
+
+ afterAll(async () => {
+ if (app) {
+ await app.close();
+ }
+ });
+
+ describe('users router', () => {
+ it('GET /trpc/users.getUserById should return user data', async () => {
+ const input = JSON.stringify({ userId: '1' });
+ const response = await request(app.getHttpServer())
+ .get(`/trpc/users.getUserById?input=${encodeURIComponent(input)}`)
+ .expect(200);
+
+ expect(response.body).toHaveProperty('result');
+ expect(response.body.result).toHaveProperty('data');
+ expect(response.body.result.data).toHaveProperty('name');
+ expect(response.body.result.data).toHaveProperty('email');
+ });
+
+ it('GET /trpc/users.getUserById with different userId should return user data', async () => {
+ const input = JSON.stringify({ userId: 'test-user-123' });
+ const response = await request(app.getHttpServer())
+ .get(`/trpc/users.getUserById?input=${encodeURIComponent(input)}`)
+ .expect(200);
+
+ expect(response.body).toHaveProperty('result');
+ expect(response.body.result).toHaveProperty('data');
+ });
+
+ it('GET /trpc/users.getUserById without input should return error', async () => {
+ const response = await request(app.getHttpServer())
+ .get('/trpc/users.getUserById')
+ .expect(400);
+
+ expect(response.body).toHaveProperty('error');
+ });
+ });
+});
diff --git a/examples/nestjs-fastify/test/e2e/types.e2e-spec.ts b/examples/nestjs-fastify/test/e2e/types.e2e-spec.ts
new file mode 100644
index 0000000..a3d8d1a
--- /dev/null
+++ b/examples/nestjs-fastify/test/e2e/types.e2e-spec.ts
@@ -0,0 +1,22 @@
+/**
+ * Type verification tests for generated AppRouter types.
+ *
+ * These tests verify that the Rust CLI generates valid TypeScript types
+ * that can be imported and type-checked. If TypeScript compilation succeeds,
+ * the generated types are valid.
+ */
+import type { AppRouter } from '../../src/@generated/server';
+
+describe('Generated Types (e2e)', () => {
+ it('AppRouter type is importable', () => {
+ const routerType: AppRouter | null = null;
+ expect(routerType).toBeNull();
+ });
+
+ it('AppRouter has expected router structure', () => {
+ type UsersRouter = AppRouter['users'];
+ type GetUserById = UsersRouter['getUserById'];
+
+ expect(true).toBe(true);
+ });
+});
diff --git a/examples/nestjs-fastify/tsconfig.build.json b/examples/nestjs-fastify/tsconfig.build.json
index 7e1f6ae..17704cf 100644
--- a/examples/nestjs-fastify/tsconfig.build.json
+++ b/examples/nestjs-fastify/tsconfig.build.json
@@ -4,5 +4,5 @@
"outDir": "./dist",
"rootDir": "./src"
},
- "exclude": ["node_modules", "dist", "src/**/__tests__/*", "*.spec.ts"]
+ "exclude": ["node_modules", "dist", "test", "src/**/__tests__/*", "*.spec.ts", "@generated"]
}
diff --git a/examples/nextjs-trpc/app/trpc.ts b/examples/nextjs-trpc/app/trpc.ts
index 3b7bb4e..7897eeb 100644
--- a/examples/nextjs-trpc/app/trpc.ts
+++ b/examples/nextjs-trpc/app/trpc.ts
@@ -1,10 +1,10 @@
-import { createTRPCProxyClient, httpBatchLink } from "@trpc/client";
-import { AppRouter } from "@server/@generated/server";
+import { createTRPCClient, httpBatchLink } from '@trpc/client';
+import { AppRouter } from '@server/@generated/server';
-export const trpc = createTRPCProxyClient({
+export const trpc = createTRPCClient({
links: [
httpBatchLink({
url: `${process.env.NEXT_PUBLIC_NESTJS_SERVER}/trpc`,
}),
],
-});
\ No newline at end of file
+});
diff --git a/examples/nextjs-trpc/package.json b/examples/nextjs-trpc/package.json
index 2156588..a75fe9d 100644
--- a/examples/nextjs-trpc/package.json
+++ b/examples/nextjs-trpc/package.json
@@ -9,8 +9,8 @@
"lint": "next lint"
},
"dependencies": {
- "@trpc/client": "^10.33.0",
- "@trpc/server": "^10.33.0",
+ "@trpc/client": "^11.0.0",
+ "@trpc/server": "^11.0.0",
"next": "13.4.7",
"react": "18.2.0",
"react-dom": "18.2.0"
diff --git a/package.json b/package.json
index fa9157f..d29b915 100644
--- a/package.json
+++ b/package.json
@@ -9,14 +9,14 @@
"clean": "tsc -b --clean",
"format": "prettier packages/**/*.ts --ignore-path ./.prettierignore --write",
"lint": "eslint 'packages/**/*.ts' --fix",
- "test": "yarn workspaces foreach --all run test",
+ "test": "bun run --filter '*' test",
"release": "release-it",
- "prepublish:npm": "yarn build && yarn changelog | pbcopy",
+ "prepublish:npm": "bun run build && bun run changelog | pbcopy",
"publish:npm": "lerna publish",
- "prepublish:next": "yarn build",
+ "prepublish:next": "bun run build",
"publish:next": "lerna publish --dist-tag next",
"prepack": "pinst --disable",
- "postinstall": "husky",
+ "postinstall": "rm -rf packages/nestjs-trpc/node_modules/@nestjs && husky",
"postpack": "pinst --enable",
"prepare": "husky"
},
@@ -35,6 +35,9 @@
"docs"
],
"devDependencies": {
+ "@nestjs/common": "10.4.1",
+ "@nestjs/core": "10.4.1",
+ "@nestjs/testing": "10.4.1",
"@commitlint/cli": "^19.4.0",
"@commitlint/config-conventional": "^19.2.2",
"@commitlint/prompt-cli": "^19.3.1",
@@ -65,15 +68,28 @@
"typescript": "^5.5.4"
},
"lint-staged": {
- "*.ts": [
- "prettier --write",
- "eslint --fix",
- "yarn test --bail --findRelatedTests"
+ "!(packages/nestjs-trpc/cli/tests/fixtures/**)*.ts": [
+ "prettier --write --ignore-path .prettierignore",
+ "eslint --fix"
+ ],
+ "packages/nestjs-trpc/cli/**/*.rs": [
+ "cargo fmt --manifest-path packages/nestjs-trpc/cli/Cargo.toml --",
+ "bash -c 'cargo clippy --manifest-path packages/nestjs-trpc/cli/Cargo.toml --all-targets --all-features -- -D warnings'"
]
},
"repository": {
"type": "git",
"url": "https://github.com/KevinEdry/nestjs-trpc"
},
- "packageManager": "yarn@4.4.0"
+ "packageManager": "bun@1.3.5",
+ "resolutions": {
+ "@nestjs/common": "10.4.1",
+ "@nestjs/core": "10.4.1",
+ "@nestjs/testing": "10.4.1"
+ },
+ "overrides": {
+ "@nestjs/common": "10.4.1",
+ "@nestjs/core": "10.4.1",
+ "@nestjs/testing": "10.4.1"
+ }
}
diff --git a/packages/nestjs-trpc/README.md b/packages/nestjs-trpc/README.md
index 6bf2fdf..fdc9fb6 100644
--- a/packages/nestjs-trpc/README.md
+++ b/packages/nestjs-trpc/README.md
@@ -49,6 +49,9 @@
To install **NestJS tRPC** with your preferred package manager, you can use any of the following commands:
```shell
+# bun
+bun add trpc-nestjs zod @trpc/server
+
# npm
npm install trpc-nestjs zod @trpc/server
diff --git a/packages/nestjs-trpc/bin/nestjs-trpc.js b/packages/nestjs-trpc/bin/nestjs-trpc.js
new file mode 100755
index 0000000..23f9914
--- /dev/null
+++ b/packages/nestjs-trpc/bin/nestjs-trpc.js
@@ -0,0 +1,75 @@
+#!/usr/bin/env node
+
+const { execFileSync } = require('child_process');
+const path = require('path');
+const fs = require('fs');
+
+const BINARY_NAME = process.platform === 'win32' ? 'nestjs-trpc.exe' : 'nestjs-trpc';
+
+function getBinaryPath() {
+ const platform = process.platform;
+ const arch = process.arch;
+
+ const platformMap = {
+ darwin: 'apple-darwin',
+ linux: 'unknown-linux-gnu',
+ win32: 'pc-windows-msvc',
+ };
+
+ const archMap = {
+ x64: 'x86_64',
+ arm64: 'aarch64',
+ };
+
+ const targetPlatform = platformMap[platform];
+ const targetArch = archMap[arch];
+
+ if (!targetPlatform || !targetArch) {
+ console.error(`Unsupported platform: ${platform}-${arch}`);
+ process.exit(1);
+ }
+
+ // Check for pre-built native binary (npm distribution)
+ const binaryDir = path.join(__dirname, '..', 'native', `${targetArch}-${targetPlatform}`);
+ const binaryPath = path.join(binaryDir, BINARY_NAME);
+
+ if (fs.existsSync(binaryPath)) {
+ return binaryPath;
+ }
+
+ // Fallback to cargo build output (local development)
+ const cargoBinaryPath = path.join(__dirname, '..', 'cli', 'target', 'release', BINARY_NAME);
+ if (fs.existsSync(cargoBinaryPath)) {
+ return cargoBinaryPath;
+ }
+
+ // Debug build fallback
+ const cargoDebugPath = path.join(__dirname, '..', 'cli', 'target', 'debug', BINARY_NAME);
+ if (fs.existsSync(cargoDebugPath)) {
+ return cargoDebugPath;
+ }
+
+ console.error(`Binary not found. Checked:`);
+ console.error(` - ${binaryPath} (native)`);
+ console.error(` - ${cargoBinaryPath} (cargo release)`);
+ console.error(` - ${cargoDebugPath} (cargo debug)`);
+ console.error('');
+ console.error('For local development, run: cd packages/nestjs-trpc/cli && cargo build --release');
+ process.exit(1);
+}
+
+try {
+ const binaryPath = getBinaryPath();
+ const args = process.argv.slice(2);
+
+ execFileSync(binaryPath, args, {
+ stdio: 'inherit',
+ env: process.env,
+ });
+} catch (error) {
+ if (error.status !== undefined) {
+ process.exit(error.status);
+ }
+ console.error('Failed to execute nestjs-trpc CLI:', error.message);
+ process.exit(1);
+}
diff --git a/packages/nestjs-trpc/cli/.rustfmt.toml b/packages/nestjs-trpc/cli/.rustfmt.toml
new file mode 100644
index 0000000..7c7129c
--- /dev/null
+++ b/packages/nestjs-trpc/cli/.rustfmt.toml
@@ -0,0 +1,10 @@
+# rustfmt configuration for nestjs-trpc CLI
+# Only stable options - works with stable Rust
+
+edition = "2021"
+max_width = 100
+hard_tabs = false
+tab_spaces = 4
+newline_style = "Auto"
+use_field_init_shorthand = true
+use_try_shorthand = true
diff --git a/packages/nestjs-trpc/cli/CLAUDE.md b/packages/nestjs-trpc/cli/CLAUDE.md
new file mode 100644
index 0000000..87a430b
--- /dev/null
+++ b/packages/nestjs-trpc/cli/CLAUDE.md
@@ -0,0 +1,367 @@
+## Code Quality Standards
+
+### Comments: Only "Why", Never "How" or "What"
+
+**Golden Rule**: Code should be self-documenting. Comments explain *why*, never *what* or *how*.
+
+```rust
+// ❌ BAD: "What" comment - code already says this
+// Increment the counter
+counter += 1;
+
+// ❌ BAD: "How" comment - code already shows how
+// Loop through items and find matching ID
+for item in items {
+ if item.id == target_id {
+ return Some(item);
+ }
+}
+
+// ✅ GOOD: "Why" comment - explains business logic
+// Task must move to previous column before deletion to maintain audit trail
+move_task_previous();
+delete_task();
+```
+
+**If you need a "how" or "what" comment, REFACTOR instead:**
+
+```rust
+// ❌ BAD: Needs comment to explain
+// Parse the timestamp and convert to local timezone
+let dt = chrono::DateTime::parse_from_rfc3339(&s)
+ .map(|d| d.with_timezone(&chrono::Local))?;
+
+// ✅ GOOD: Function name makes it clear
+let dt = parse_timestamp_as_local(&s)?;
+```
+
+**When "why" comments are appropriate:**
+- Business logic rationale: "We use base64 to avoid URL encoding issues"
+- Performance trade-offs: "Caching here reduces API calls by 90%"
+- Non-obvious algorithms: "Binary search chosen for O(log n) lookup on sorted data"
+- Workarounds: "Clippy false positive on this pattern, see issue #123"
+- Safety invariants: "SAFETY: This assumes the buffer is always initialized"
+
+### No Abbreviations
+
+**All identifiers must use full words, not abbreviations.**
+
+```rust
+// ❌ BAD: Abbreviations
+let cfg = Config::default();
+let msg = "Hello";
+let idx = 0;
+let btn = Button::new();
+let ctx = AppContext::new();
+
+// ✅ GOOD: Full words
+let config = Config::default();
+let message = "Hello";
+let index = 0;
+let button = Button::new();
+let context = AppContext::new();
+```
+
+**Exceptions (industry standard abbreviations only):**
+- `id` (identifier) - universally understood
+- `url` (Uniform Resource Locator) - more common than "address"
+- `html`, `json`, `xml` - file format names
+- `io` (input/output) - standard library convention
+- `uuid` (Universally Unique Identifier) - standard acronym
+- `pty` (pseudo-terminal) - standard Unix term
+- `terminal` (when referring to terminal emulator/UI) - standard term
+
+**Common violations to avoid:**
+- ❌ `num` → ✅ `number` or `count`
+- ❌ `str` → ✅ `string` (except `&str` type)
+- ❌ `arr` → ✅ `array`
+- ❌ `btn` → ✅ `button`
+- ❌ `msg` → ✅ `message`
+- ❌ `tmp` → ✅ `temporary`
+- ❌ `val` → ✅ `value`
+- ❌ `cfg` → ✅ `config`
+- ❌ `ctx` → ✅ `context`
+- ❌ `doc` → ✅ `document`
+- ❌ `img` → ✅ `image`
+
+**Why this matters:**
+- Code is read 10x more than written
+- Abbreviations are ambiguous (`msg` = message or messages?)
+- IDEs have autocomplete - no typing savings
+- Newcomers understand full words instantly
+- Consistency > brevity
+
+**Refactoring over Comments:**
+If you're writing a comment to explain what code does, the code is too complex. Refactor by:
+1. Extract to well-named functions
+2. Use descriptive variable names
+3. Simplify complex expressions
+4. Break long functions into smaller pieces
+
+### Never Nester: Return Early
+
+**CRITICAL RULE: Maximum nesting depth is 2 levels. NO EXCEPTIONS.**
+
+Nested ifs are unreadable. Use early returns and descriptive variable names:
+
+```rust
+// ❌ BAD: Nested ifs to oblivion - WHO CAN READ THIS?
+if self.selected_column == 1 {
+ if let Some(task_idx) = self.selected_task {
+ if let Some(task) = self.columns[self.selected_column].tasks.get_mut(task_idx) {
+ if let Some(instance_id) = task.instance_id {
+ task.is_paused = !task.is_paused;
+ return Some((instance_id, task.is_paused));
+ }
+ }
+ }
+}
+None
+
+// ✅ GOOD: Early returns with descriptive checks
+let is_in_progress_column = self.selected_column == 1;
+if !is_in_progress_column {
+ return None;
+}
+
+let task_index = self.selected_task?;
+let task = self.columns[self.selected_column].tasks.get_mut(task_index)?;
+let instance_id = task.instance_id?;
+
+task.is_paused = !task.is_paused;
+Some((instance_id, task.is_paused))
+```
+
+**Key techniques:**
+1. **Use descriptive variable names for conditions** - `is_in_progress_column` instead of `self.selected_column == 1`
+2. **Early return/guard clauses** - Check failure conditions first and return
+3. **Use `?` operator** - Convert `Option`/`Result` to early returns automatically
+4. **Invert conditions** - `if !condition { return }` keeps happy path unindented
+
+```rust
+// ❌ BAD: Triple nested
+if user.is_admin {
+ if project.is_active {
+ if has_permission {
+ do_work();
+ }
+ }
+}
+
+// ✅ GOOD: Flat with descriptive checks
+let is_admin = user.is_admin;
+let is_active = project.is_active;
+
+if !is_admin || !is_active || !has_permission {
+ return;
+}
+
+do_work();
+```
+
+### Functional Core, Imperative Shell
+
+Separate pure logic from side effects:
+
+```rust
+// FUNCTIONAL CORE: Pure business logic
+fn calculate_discount(user: &User, amount: f64) -> f64 {
+ // Pure function - no I/O, no mutation
+ if user.is_premium && amount > 100.0 {
+ amount * 0.2
+ } else {
+ 0.0
+ }
+}
+
+// IMPERATIVE SHELL: Side effects at edges
+fn apply_discount_and_save(user_id: Uuid, amount: f64) -> Result<()> {
+ let user = database.load(user_id)?; // I/O
+ let discount = calculate_discount(&user, amount); // Pure
+ database.save_transaction(discount)?; // I/O
+ Ok(())
+}
+```
+
+**Benefits:**
+- Pure functions are easy to test (no mocks)
+- Logic is reusable across different contexts
+- Side effects are isolated and explicit
+- Easier to reason about code behavior
+
+**Functional Core Rules:**
+- ✅ Take data as parameters
+- ✅ Return computed results
+- ✅ No I/O (files, network, database)
+- ✅ No mutation of external state
+- ✅ No `Utc::now()` or random numbers (pass as parameter)
+- ✅ Deterministic: same input → same output
+
+**Imperative Shell Rules:**
+- ✅ Handle I/O operations
+- ✅ Manage state changes
+- ✅ Call pure functions
+- ✅ Keep thin - delegate logic to core
+- ✅ Coordinate side effects
+
+### Code Locality: Keep Things Together
+
+**CRITICAL PRINCIPLE: Code should live close to where it's used.**
+
+Don't create centralized files for things that aren't truly shared. This applies to:
+- Constants
+- Helper functions
+- Type definitions
+- Configuration
+
+```rust
+// ❌ BAD: Centralized constants file for unshared values
+// src/constants.rs
+pub const DIALOG_WIDTH: u16 = 60;
+pub const COLUMN_HEIGHT: u16 = 7;
+pub const BUTTON_COUNT: usize = 4;
+
+// src/dialogs.rs
+use crate::constants::DIALOG_WIDTH; // Has to jump to another file
+
+// src/columns.rs
+use crate::constants::COLUMN_HEIGHT; // Has to jump to another file
+
+// ✅ GOOD: Constants live with the code that uses them
+// src/dialogs.rs
+const DIALOG_WIDTH: u16 = 60;
+const BUTTON_COUNT: usize = 4;
+
+fn render_dialog() {
+ // Constants are right here!
+}
+
+// src/columns.rs
+const COLUMN_HEIGHT: u16 = 7;
+
+fn render_column() {
+ // Constants are right here!
+}
+```
+
+**When to centralize:**
+Only create a shared module when code is **actually used in 2+ places**:
+
+```rust
+// ✅ GOOD: Truly shared constants
+// src/ui/colors.rs
+pub const PRIMARY_COLOR: Color = Color::Cyan;
+pub const ERROR_COLOR: Color = Color::Red;
+
+// Used in multiple modules
+// src/dialogs.rs
+use crate::ui::colors::{PRIMARY_COLOR, ERROR_COLOR};
+
+// src/status_bar.rs
+use crate::ui::colors::{PRIMARY_COLOR, ERROR_COLOR};
+```
+
+**Benefits:**
+- **Easier to understand** - No jumping between files to find definitions
+- **Easier to modify** - Change constants without hunting through centralized files
+- **Better encapsulation** - Each module owns its configuration
+- **No false abstraction** - No "shared" files that aren't actually shared
+
+**File Size Guideline:**
+Keep files under 250-300 lines. If a file grows too large:
+1. Split by **feature/responsibility**, not by "type of thing"
+2. Keep related code together in the split modules
+
+```
+❌ BAD split:
+ui/
+ constants.rs (all constants)
+ helpers.rs (all helpers)
+ types.rs (all types)
+
+✅ GOOD split:
+ui/
+ dialogs.rs (dialog constants, helpers, types, rendering)
+ columns.rs (column constants, helpers, types, rendering)
+ status_bar.rs (status constants, helpers, types, rendering)
+```
+
+### No Magic Numbers
+
+**All numeric literals must be named constants with descriptive names.**
+
+Magic numbers are unnamed numeric literals scattered through code. They make code hard to understand and maintain.
+
+```rust
+// ❌ BAD: What do these numbers mean?
+if area.width < 80 {
+ let size = 60;
+} else {
+ let size = 50;
+}
+let padding = 2;
+let offset = padding * 2;
+
+// ✅ GOOD: Self-documenting named constants
+const SMALL_SCREEN_THRESHOLD: u16 = 80;
+const DIALOG_WIDTH_SMALL: u16 = 60;
+const DIALOG_WIDTH_NORMAL: u16 = 50;
+const DIALOG_PADDING: u16 = 2;
+const DIALOG_PADDING_DOUBLE: u16 = 4;
+
+if area.width < SMALL_SCREEN_THRESHOLD {
+ let size = DIALOG_WIDTH_SMALL;
+} else {
+ let size = DIALOG_WIDTH_NORMAL;
+}
+let padding = DIALOG_PADDING;
+let offset = DIALOG_PADDING_DOUBLE;
+```
+
+**Exceptions (literals that are OK):**
+- `0` and `1` in common contexts (array indexing, initialization, increment/decrement)
+- `-1` for error codes or "not found" sentinels (when idiomatic)
+- `2` in `x / 2` for simple halving
+- Simple calculations: `100 - percent` for percentage complement
+
+**When naming constants:**
+- Use descriptive names that explain **what** the value represents
+- Use units in the name: `TIMEOUT_MS`, `WIDTH_PIXELS`, `MAX_COUNT`
+- Group related constants together
+
+```rust
+// ✅ GOOD: Clear naming with units and grouping
+// Dialog dimensions
+const DIALOG_WIDTH_THRESHOLD: u16 = 80;
+const DIALOG_WIDTH_SMALL: u16 = 80;
+const DIALOG_WIDTH_NORMAL: u16 = 60;
+
+// Animation timing (milliseconds)
+const SPINNER_FRAME_DURATION_MS: u128 = 100;
+const SPINNER_FRAME_COUNT: u128 = 10;
+
+// Layout percentages
+const BUTTON_WIDTH_PERCENT: u16 = 25;
+const REVIEW_POPUP_HEIGHT_PERCENT: u16 = 90;
+```
+
+**Where to put constants:**
+Remember **Code Locality** - constants go in the file that uses them, not in a centralized constants file (unless truly shared across files).
+
+### Code Review Checklist
+
+Before submitting code, verify:
+
+- [ ] No "what" or "how" comments (only "why")
+- [ ] No abbreviations in identifiers
+- [ ] All functions have clear, descriptive names
+- [ ] Complex logic extracted to named functions
+- [ ] Magic numbers replaced with named constants
+- [ ] Constants live in the file that uses them (code locality)
+- [ ] Boolean expressions named for clarity
+- [ ] Early returns used, maximum 2 levels of nesting
+- [ ] Pure functions separated from side effects
+- [ ] Functions under 50 lines
+- [ ] Files under 250-300 lines (split by feature if larger)
+- [ ] No code repetition
+- [ ] No `unsafe` code anywhere
\ No newline at end of file
diff --git a/packages/nestjs-trpc/cli/Cargo.lock b/packages/nestjs-trpc/cli/Cargo.lock
new file mode 100644
index 0000000..f417dd1
--- /dev/null
+++ b/packages/nestjs-trpc/cli/Cargo.lock
@@ -0,0 +1,2633 @@
+# This file is automatically @generated by Cargo.
+# It is not intended for manual editing.
+version = 3
+
+[[package]]
+name = "addr2line"
+version = "0.25.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1b5d307320b3181d6d7954e663bd7c774a838b8220fe0593c86d9fb09f498b4b"
+dependencies = [
+ "gimli",
+]
+
+[[package]]
+name = "adler2"
+version = "2.0.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "320119579fcad9c21884f5c4861d16174d0e06250625266f50fe6898340abefa"
+
+[[package]]
+name = "ahash"
+version = "0.8.12"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5a15f179cd60c4584b8a8c596927aadc462e27f2ca70c04e0071964a73ba7a75"
+dependencies = [
+ "cfg-if",
+ "once_cell",
+ "version_check",
+ "zerocopy",
+]
+
+[[package]]
+name = "aho-corasick"
+version = "1.1.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ddd31a130427c27518df266943a5308ed92d4b226cc639f5a8f1002816174301"
+dependencies = [
+ "memchr",
+]
+
+[[package]]
+name = "allocator-api2"
+version = "0.2.21"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923"
+
+[[package]]
+name = "android_system_properties"
+version = "0.1.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311"
+dependencies = [
+ "libc",
+]
+
+[[package]]
+name = "anes"
+version = "0.1.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4b46cbb362ab8752921c97e041f5e366ee6297bd428a31275b9fcf1e380f7299"
+
+[[package]]
+name = "anstream"
+version = "0.6.21"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "43d5b281e737544384e969a5ccad3f1cdd24b48086a0fc1b2a5262a26b8f4f4a"
+dependencies = [
+ "anstyle",
+ "anstyle-parse",
+ "anstyle-query",
+ "anstyle-wincon",
+ "colorchoice",
+ "is_terminal_polyfill",
+ "utf8parse",
+]
+
+[[package]]
+name = "anstyle"
+version = "1.0.13"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5192cca8006f1fd4f7237516f40fa183bb07f8fbdfedaa0036de5ea9b0b45e78"
+
+[[package]]
+name = "anstyle-parse"
+version = "0.2.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4e7644824f0aa2c7b9384579234ef10eb7efb6a0deb83f9630a49594dd9c15c2"
+dependencies = [
+ "utf8parse",
+]
+
+[[package]]
+name = "anstyle-query"
+version = "1.1.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "40c48f72fd53cd289104fc64099abca73db4166ad86ea0b4341abe65af83dadc"
+dependencies = [
+ "windows-sys 0.61.2",
+]
+
+[[package]]
+name = "anstyle-wincon"
+version = "3.0.11"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "291e6a250ff86cd4a820112fb8898808a366d8f9f58ce16d1f538353ad55747d"
+dependencies = [
+ "anstyle",
+ "once_cell_polyfill",
+ "windows-sys 0.61.2",
+]
+
+[[package]]
+name = "anyhow"
+version = "1.0.100"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a23eb6b1614318a8071c9b2521f36b424b2c83db5eb3a0fead4a6c0809af6e61"
+
+[[package]]
+name = "ar_archive_writer"
+version = "0.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f0c269894b6fe5e9d7ada0cf69b5bf847ff35bc25fc271f08e1d080fce80339a"
+dependencies = [
+ "object 0.32.2",
+]
+
+[[package]]
+name = "ascii"
+version = "1.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d92bec98840b8f03a5ff5413de5293bfcd8bf96467cf5452609f939ec6f5de16"
+
+[[package]]
+name = "assert_cmd"
+version = "2.1.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9c5bcfa8749ac45dd12cb11055aeeb6b27a3895560d60d71e3c23bf979e60514"
+dependencies = [
+ "anstyle",
+ "bstr",
+ "libc",
+ "predicates",
+ "predicates-core",
+ "predicates-tree",
+ "wait-timeout",
+]
+
+[[package]]
+name = "ast_node"
+version = "5.0.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2eb025ef00a6da925cf40870b9c8d008526b6004ece399cb0974209720f0b194"
+dependencies = [
+ "quote",
+ "swc_macros_common",
+ "syn",
+]
+
+[[package]]
+name = "autocfg"
+version = "1.5.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8"
+
+[[package]]
+name = "backtrace"
+version = "0.3.76"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "bb531853791a215d7c62a30daf0dde835f381ab5de4589cfe7c649d2cbe92bd6"
+dependencies = [
+ "addr2line",
+ "cfg-if",
+ "libc",
+ "miniz_oxide",
+ "object 0.37.3",
+ "rustc-demangle",
+ "windows-link",
+]
+
+[[package]]
+name = "backtrace-ext"
+version = "0.2.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "537beee3be4a18fb023b570f80e3ae28003db9167a751266b259926e25539d50"
+dependencies = [
+ "backtrace",
+]
+
+[[package]]
+name = "base64-simd"
+version = "0.8.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "339abbe78e73178762e23bea9dfd08e697eb3f3301cd4be981c0f78ba5859195"
+dependencies = [
+ "outref",
+ "vsimd",
+]
+
+[[package]]
+name = "better_scoped_tls"
+version = "1.0.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7cd228125315b132eed175bf47619ac79b945b26e56b848ba203ae4ea8603609"
+dependencies = [
+ "scoped-tls",
+]
+
+[[package]]
+name = "bitflags"
+version = "1.3.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a"
+
+[[package]]
+name = "bitflags"
+version = "2.10.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "812e12b5285cc515a9c72a5c1d3b6d46a19dac5acfef5265968c166106e31dd3"
+
+[[package]]
+name = "bitvec"
+version = "1.0.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1bc2832c24239b0141d5674bb9174f9d68a8b5b3f2753311927c172ca46f7e9c"
+dependencies = [
+ "funty",
+ "radium",
+ "tap",
+ "wyz",
+]
+
+[[package]]
+name = "block2"
+version = "0.6.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "cdeb9d870516001442e364c5220d3574d2da8dc765554b4a617230d33fa58ef5"
+dependencies = [
+ "objc2",
+]
+
+[[package]]
+name = "bstr"
+version = "1.12.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "63044e1ae8e69f3b5a92c736ca6269b8d12fa7efe39bf34ddb06d102cf0e2cab"
+dependencies = [
+ "memchr",
+ "regex-automata",
+ "serde",
+]
+
+[[package]]
+name = "bumpalo"
+version = "3.19.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5dd9dc738b7a8311c7ade152424974d8115f2cdad61e8dab8dac9f2362298510"
+dependencies = [
+ "allocator-api2",
+]
+
+[[package]]
+name = "bytes"
+version = "1.11.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b35204fbdc0b3f4446b89fc1ac2cf84a8a68971995d0bf2e925ec7cd960f9cb3"
+
+[[package]]
+name = "bytes-str"
+version = "0.2.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7c60b5ce37e0b883c37eb89f79a1e26fbe9c1081945d024eee93e8d91a7e18b3"
+dependencies = [
+ "bytes",
+ "serde",
+]
+
+[[package]]
+name = "cast"
+version = "0.3.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "37b2a672a2cb129a2e41c10b1224bb368f9f37a2b16b612598138befd7b37eb5"
+
+[[package]]
+name = "castaway"
+version = "0.2.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "dec551ab6e7578819132c713a93c022a05d60159dc86e7a7050223577484c55a"
+dependencies = [
+ "rustversion",
+]
+
+[[package]]
+name = "cc"
+version = "1.2.51"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7a0aeaff4ff1a90589618835a598e545176939b97874f7abc7851caa0618f203"
+dependencies = [
+ "find-msvc-tools",
+ "shlex",
+]
+
+[[package]]
+name = "cfg-if"
+version = "1.0.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801"
+
+[[package]]
+name = "cfg_aliases"
+version = "0.2.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724"
+
+[[package]]
+name = "chrono"
+version = "0.4.43"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "fac4744fb15ae8337dc853fee7fb3f4e48c0fbaa23d0afe49c447b4fab126118"
+dependencies = [
+ "iana-time-zone",
+ "js-sys",
+ "num-traits",
+ "wasm-bindgen",
+ "windows-link",
+]
+
+[[package]]
+name = "ciborium"
+version = "0.2.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "42e69ffd6f0917f5c029256a24d0161db17cea3997d185db0d35926308770f0e"
+dependencies = [
+ "ciborium-io",
+ "ciborium-ll",
+ "serde",
+]
+
+[[package]]
+name = "ciborium-io"
+version = "0.2.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "05afea1e0a06c9be33d539b876f1ce3692f4afea2cb41f740e7743225ed1c757"
+
+[[package]]
+name = "ciborium-ll"
+version = "0.2.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "57663b653d948a338bfb3eeba9bb2fd5fcfaecb9e199e87e1eda4d9e8b240fd9"
+dependencies = [
+ "ciborium-io",
+ "half",
+]
+
+[[package]]
+name = "clap"
+version = "4.5.54"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c6e6ff9dcd79cff5cd969a17a545d79e84ab086e444102a591e288a8aa3ce394"
+dependencies = [
+ "clap_builder",
+ "clap_derive",
+]
+
+[[package]]
+name = "clap_builder"
+version = "4.5.54"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "fa42cf4d2b7a41bc8f663a7cab4031ebafa1bf3875705bfaf8466dc60ab52c00"
+dependencies = [
+ "anstream",
+ "anstyle",
+ "clap_lex",
+ "strsim",
+]
+
+[[package]]
+name = "clap_derive"
+version = "4.5.49"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2a0b5487afeab2deb2ff4e03a807ad1a03ac532ff5a2cee5d86884440c7f7671"
+dependencies = [
+ "heck",
+ "proc-macro2",
+ "quote",
+ "syn",
+]
+
+[[package]]
+name = "clap_lex"
+version = "0.7.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a1d728cc89cf3aee9ff92b05e62b19ee65a02b5702cff7d5a377e32c6ae29d8d"
+
+[[package]]
+name = "colorchoice"
+version = "1.0.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b05b61dc5112cbb17e4b6cd61790d9845d13888356391624cbe7e41efeac1e75"
+
+[[package]]
+name = "compact_str"
+version = "0.7.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f86b9c4c00838774a6d902ef931eff7470720c51d90c2e32cfe15dc304737b3f"
+dependencies = [
+ "castaway",
+ "cfg-if",
+ "itoa",
+ "ryu",
+ "static_assertions",
+]
+
+[[package]]
+name = "console"
+version = "0.15.11"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "054ccb5b10f9f2cbf51eb355ca1d05c2d279ce1804688d0db74b4733a5aeafd8"
+dependencies = [
+ "encode_unicode",
+ "libc",
+ "once_cell",
+ "windows-sys 0.59.0",
+]
+
+[[package]]
+name = "console"
+version = "0.16.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "03e45a4a8926227e4197636ba97a9fc9b00477e9f4bd711395687c5f0734bec4"
+dependencies = [
+ "encode_unicode",
+ "libc",
+ "once_cell",
+ "unicode-width 0.2.2",
+ "windows-sys 0.61.2",
+]
+
+[[package]]
+name = "core-foundation-sys"
+version = "0.8.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b"
+
+[[package]]
+name = "criterion"
+version = "0.5.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f2b12d017a929603d80db1831cd3a24082f8137ce19c69e6447f54f5fc8d692f"
+dependencies = [
+ "anes",
+ "cast",
+ "ciborium",
+ "clap",
+ "criterion-plot",
+ "is-terminal",
+ "itertools",
+ "num-traits",
+ "once_cell",
+ "oorandom",
+ "plotters",
+ "rayon",
+ "regex",
+ "serde",
+ "serde_derive",
+ "serde_json",
+ "tinytemplate",
+ "walkdir",
+]
+
+[[package]]
+name = "criterion-plot"
+version = "0.5.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6b50826342786a51a89e2da3a28f1c32b06e387201bc2d19791f622c673706b1"
+dependencies = [
+ "cast",
+ "itertools",
+]
+
+[[package]]
+name = "crossbeam-channel"
+version = "0.5.15"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "82b8f8f868b36967f9606790d1903570de9ceaf870a7bf9fbbd3016d636a2cb2"
+dependencies = [
+ "crossbeam-utils",
+]
+
+[[package]]
+name = "crossbeam-deque"
+version = "0.8.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9dd111b7b7f7d55b72c0a6ae361660ee5853c9af73f70c3c2ef6858b950e2e51"
+dependencies = [
+ "crossbeam-epoch",
+ "crossbeam-utils",
+]
+
+[[package]]
+name = "crossbeam-epoch"
+version = "0.9.18"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5b82ac4a3c2ca9c3460964f020e1402edd5753411d7737aa39c3714ad1b5420e"
+dependencies = [
+ "crossbeam-utils",
+]
+
+[[package]]
+name = "crossbeam-utils"
+version = "0.8.21"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28"
+
+[[package]]
+name = "crunchy"
+version = "0.2.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "460fbee9c2c2f33933d720630a6a0bac33ba7053db5344fac858d4b8952d77d5"
+
+[[package]]
+name = "ctrlc"
+version = "3.5.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "73736a89c4aff73035ba2ed2e565061954da00d4970fc9ac25dcc85a2a20d790"
+dependencies = [
+ "dispatch2",
+ "nix",
+ "windows-sys 0.61.2",
+]
+
+[[package]]
+name = "data-encoding"
+version = "2.9.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2a2330da5de22e8a3cb63252ce2abb30116bf5265e89c0e01bc17015ce30a476"
+
+[[package]]
+name = "debugid"
+version = "0.8.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "bef552e6f588e446098f6ba40d89ac146c8c7b64aade83c051ee00bb5d2bc18d"
+dependencies = [
+ "serde",
+ "uuid",
+]
+
+[[package]]
+name = "difflib"
+version = "0.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6184e33543162437515c2e2b48714794e37845ec9851711914eec9d308f6ebe8"
+
+[[package]]
+name = "dispatch2"
+version = "0.3.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "89a09f22a6c6069a18470eb92d2298acf25463f14256d24778e1230d789a2aec"
+dependencies = [
+ "bitflags 2.10.0",
+ "block2",
+ "libc",
+ "objc2",
+]
+
+[[package]]
+name = "displaydoc"
+version = "0.2.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn",
+]
+
+[[package]]
+name = "either"
+version = "1.15.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719"
+
+[[package]]
+name = "encode_unicode"
+version = "1.0.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "34aa73646ffb006b8f5147f3dc182bd4bcb190227ce861fc4a4844bf8e3cb2c0"
+
+[[package]]
+name = "errno"
+version = "0.3.14"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb"
+dependencies = [
+ "libc",
+ "windows-sys 0.61.2",
+]
+
+[[package]]
+name = "fastrand"
+version = "2.3.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be"
+
+[[package]]
+name = "find-msvc-tools"
+version = "0.1.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "645cbb3a84e60b7531617d5ae4e57f7e27308f6445f5abf653209ea76dec8dff"
+
+[[package]]
+name = "float-cmp"
+version = "0.10.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b09cf3155332e944990140d967ff5eceb70df778b34f77d8075db46e4704e6d8"
+dependencies = [
+ "num-traits",
+]
+
+[[package]]
+name = "form_urlencoded"
+version = "1.2.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "cb4cb245038516f5f85277875cdaa4f7d2c9a0fa0468de06ed190163b1581fcf"
+dependencies = [
+ "percent-encoding",
+]
+
+[[package]]
+name = "from_variant"
+version = "3.0.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e5ff35a391aef949120a0340d690269b3d9f63460a6106e99bd07b961f345ea9"
+dependencies = [
+ "swc_macros_common",
+ "syn",
+]
+
+[[package]]
+name = "fsevent-sys"
+version = "4.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "76ee7a02da4d231650c7cea31349b889be2f45ddb3ef3032d2ec8185f6313fd2"
+dependencies = [
+ "libc",
+]
+
+[[package]]
+name = "funty"
+version = "2.0.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e6d5a32815ae3f33302d95fdcb2ce17862f8c65363dcfd29360480ba1001fc9c"
+
+[[package]]
+name = "getrandom"
+version = "0.3.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "899def5c37c4fd7b2664648c28120ecec138e4d395b459e5ca34f9cce2dd77fd"
+dependencies = [
+ "cfg-if",
+ "libc",
+ "r-efi",
+ "wasip2",
+]
+
+[[package]]
+name = "gimli"
+version = "0.32.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e629b9b98ef3dd8afe6ca2bd0f89306cec16d43d907889945bc5d6687f2f13c7"
+
+[[package]]
+name = "globset"
+version = "0.4.18"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "52dfc19153a48bde0cbd630453615c8151bce3a5adfac7a0aebfbf0a1e1f57e3"
+dependencies = [
+ "aho-corasick",
+ "bstr",
+ "log",
+ "regex-automata",
+ "regex-syntax",
+]
+
+[[package]]
+name = "half"
+version = "2.7.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6ea2d84b969582b4b1864a92dc5d27cd2b77b622a8d79306834f1be5ba20d84b"
+dependencies = [
+ "cfg-if",
+ "crunchy",
+ "zerocopy",
+]
+
+[[package]]
+name = "hashbrown"
+version = "0.14.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1"
+dependencies = [
+ "ahash",
+ "allocator-api2",
+]
+
+[[package]]
+name = "heck"
+version = "0.5.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea"
+
+[[package]]
+name = "hermit-abi"
+version = "0.5.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "fc0fef456e4baa96da950455cd02c081ca953b141298e41db3fc7e36b1da849c"
+
+[[package]]
+name = "hstr"
+version = "3.0.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0c43c0a9e8fbdb3bb9dc8eee85e1e2ac81605418b4c83b6b7413cbf14d56ca5c"
+dependencies = [
+ "hashbrown",
+ "new_debug_unreachable",
+ "once_cell",
+ "rustc-hash",
+ "serde",
+ "triomphe",
+]
+
+[[package]]
+name = "iana-time-zone"
+version = "0.1.64"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "33e57f83510bb73707521ebaffa789ec8caf86f9657cad665b092b581d40e9fb"
+dependencies = [
+ "android_system_properties",
+ "core-foundation-sys",
+ "iana-time-zone-haiku",
+ "js-sys",
+ "log",
+ "wasm-bindgen",
+ "windows-core",
+]
+
+[[package]]
+name = "iana-time-zone-haiku"
+version = "0.1.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f"
+dependencies = [
+ "cc",
+]
+
+[[package]]
+name = "icu_collections"
+version = "2.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4c6b649701667bbe825c3b7e6388cb521c23d88644678e83c0c4d0a621a34b43"
+dependencies = [
+ "displaydoc",
+ "potential_utf",
+ "yoke",
+ "zerofrom",
+ "zerovec",
+]
+
+[[package]]
+name = "icu_locale_core"
+version = "2.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "edba7861004dd3714265b4db54a3c390e880ab658fec5f7db895fae2046b5bb6"
+dependencies = [
+ "displaydoc",
+ "litemap",
+ "tinystr",
+ "writeable",
+ "zerovec",
+]
+
+[[package]]
+name = "icu_normalizer"
+version = "2.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5f6c8828b67bf8908d82127b2054ea1b4427ff0230ee9141c54251934ab1b599"
+dependencies = [
+ "icu_collections",
+ "icu_normalizer_data",
+ "icu_properties",
+ "icu_provider",
+ "smallvec",
+ "zerovec",
+]
+
+[[package]]
+name = "icu_normalizer_data"
+version = "2.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7aedcccd01fc5fe81e6b489c15b247b8b0690feb23304303a9e560f37efc560a"
+
+[[package]]
+name = "icu_properties"
+version = "2.1.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "020bfc02fe870ec3a66d93e677ccca0562506e5872c650f893269e08615d74ec"
+dependencies = [
+ "icu_collections",
+ "icu_locale_core",
+ "icu_properties_data",
+ "icu_provider",
+ "zerotrie",
+ "zerovec",
+]
+
+[[package]]
+name = "icu_properties_data"
+version = "2.1.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "616c294cf8d725c6afcd8f55abc17c56464ef6211f9ed59cccffe534129c77af"
+
+[[package]]
+name = "icu_provider"
+version = "2.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "85962cf0ce02e1e0a629cc34e7ca3e373ce20dda4c4d7294bbd0bf1fdb59e614"
+dependencies = [
+ "displaydoc",
+ "icu_locale_core",
+ "writeable",
+ "yoke",
+ "zerofrom",
+ "zerotrie",
+ "zerovec",
+]
+
+[[package]]
+name = "idna"
+version = "1.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3b0875f23caa03898994f6ddc501886a45c7d3d62d04d2d90788d47be1b1e4de"
+dependencies = [
+ "idna_adapter",
+ "smallvec",
+ "utf8_iter",
+]
+
+[[package]]
+name = "idna_adapter"
+version = "1.2.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3acae9609540aa318d1bc588455225fb2085b9ed0c4f6bd0d9d5bcd86f1a0344"
+dependencies = [
+ "icu_normalizer",
+ "icu_properties",
+]
+
+[[package]]
+name = "if_chain"
+version = "1.0.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "cd62e6b5e86ea8eeeb8db1de02880a6abc01a397b2ebb64b5d74ac255318f5cb"
+
+[[package]]
+name = "indicatif"
+version = "0.18.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9375e112e4b463ec1b1c6c011953545c65a30164fbab5b581df32b3abf0dcb88"
+dependencies = [
+ "console 0.16.2",
+ "portable-atomic",
+ "unicode-width 0.2.2",
+ "unit-prefix",
+ "web-time",
+]
+
+[[package]]
+name = "inotify"
+version = "0.11.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f37dccff2791ab604f9babef0ba14fbe0be30bd368dc541e2b08d07c8aa908f3"
+dependencies = [
+ "bitflags 2.10.0",
+ "inotify-sys",
+ "libc",
+]
+
+[[package]]
+name = "inotify-sys"
+version = "0.1.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e05c02b5e89bff3b946cedeca278abc628fe811e604f027c45a8aa3cf793d0eb"
+dependencies = [
+ "libc",
+]
+
+[[package]]
+name = "insta"
+version = "1.46.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "248b42847813a1550dafd15296fd9748c651d0c32194559dbc05d804d54b21e8"
+dependencies = [
+ "console 0.15.11",
+ "once_cell",
+ "serde",
+ "similar",
+ "tempfile",
+]
+
+[[package]]
+name = "is-macro"
+version = "0.3.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1d57a3e447e24c22647738e4607f1df1e0ec6f72e16182c4cd199f647cdfb0e4"
+dependencies = [
+ "heck",
+ "proc-macro2",
+ "quote",
+ "syn",
+]
+
+[[package]]
+name = "is-terminal"
+version = "0.4.17"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3640c1c38b8e4e43584d8df18be5fc6b0aa314ce6ebf51b53313d4306cca8e46"
+dependencies = [
+ "hermit-abi",
+ "libc",
+ "windows-sys 0.61.2",
+]
+
+[[package]]
+name = "is_ci"
+version = "1.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7655c9839580ee829dfacba1d1278c2b7883e50a277ff7541299489d6bdfdc45"
+
+[[package]]
+name = "is_terminal_polyfill"
+version = "1.70.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a6cb138bb79a146c1bd460005623e142ef0181e3d0219cb493e02f7d08a35695"
+
+[[package]]
+name = "itertools"
+version = "0.10.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b0fd2260e829bddf4cb6ea802289de2f86d6a7a690192fbe91b3f46e0f2c8473"
+dependencies = [
+ "either",
+]
+
+[[package]]
+name = "itoa"
+version = "1.0.17"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "92ecc6618181def0457392ccd0ee51198e065e016d1d527a7ac1b6dc7c1f09d2"
+
+[[package]]
+name = "js-sys"
+version = "0.3.83"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "464a3709c7f55f1f721e5389aa6ea4e3bc6aba669353300af094b29ffbdde1d8"
+dependencies = [
+ "once_cell",
+ "wasm-bindgen",
+]
+
+[[package]]
+name = "kqueue"
+version = "1.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "eac30106d7dce88daf4a3fcb4879ea939476d5074a9b7ddd0fb97fa4bed5596a"
+dependencies = [
+ "kqueue-sys",
+ "libc",
+]
+
+[[package]]
+name = "kqueue-sys"
+version = "1.0.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ed9625ffda8729b85e45cf04090035ac368927b8cebc34898e7c120f52e4838b"
+dependencies = [
+ "bitflags 1.3.2",
+ "libc",
+]
+
+[[package]]
+name = "lazy_static"
+version = "1.5.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe"
+
+[[package]]
+name = "libc"
+version = "0.2.179"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c5a2d376baa530d1238d133232d15e239abad80d05838b4b59354e5268af431f"
+
+[[package]]
+name = "linux-raw-sys"
+version = "0.11.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "df1d3c3b53da64cf5760482273a98e575c651a67eec7f77df96b5b642de8f039"
+
+[[package]]
+name = "litemap"
+version = "0.8.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6373607a59f0be73a39b6fe456b8192fcc3585f602af20751600e974dd455e77"
+
+[[package]]
+name = "log"
+version = "0.4.29"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5e5032e24019045c762d3c0f28f5b6b8bbf38563a65908389bf7978758920897"
+
+[[package]]
+name = "matchers"
+version = "0.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d1525a2a28c7f4fa0fc98bb91ae755d1e2d1505079e05539e35bc876b5d65ae9"
+dependencies = [
+ "regex-automata",
+]
+
+[[package]]
+name = "memchr"
+version = "2.7.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f52b00d39961fc5b2736ea853c9cc86238e165017a493d1d5c8eac6bdc4cc273"
+
+[[package]]
+name = "miette"
+version = "7.6.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5f98efec8807c63c752b5bd61f862c165c115b0a35685bdcfd9238c7aeb592b7"
+dependencies = [
+ "backtrace",
+ "backtrace-ext",
+ "cfg-if",
+ "miette-derive",
+ "owo-colors",
+ "supports-color",
+ "supports-hyperlinks",
+ "supports-unicode",
+ "terminal_size",
+ "textwrap",
+ "unicode-width 0.1.14",
+]
+
+[[package]]
+name = "miette-derive"
+version = "7.6.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "db5b29714e950dbb20d5e6f74f9dcec4edbcc1067bb7f8ed198c097b8c1a818b"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn",
+]
+
+[[package]]
+name = "miniz_oxide"
+version = "0.8.9"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1fa76a2c86f704bdb222d66965fb3d63269ce38518b83cb0575fca855ebb6316"
+dependencies = [
+ "adler2",
+]
+
+[[package]]
+name = "mio"
+version = "1.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a69bcab0ad47271a0234d9422b131806bf3968021e5dc9328caf2d4cd58557fc"
+dependencies = [
+ "libc",
+ "log",
+ "wasi",
+ "windows-sys 0.61.2",
+]
+
+[[package]]
+name = "nestjs-trpc"
+version = "0.1.0"
+dependencies = [
+ "anyhow",
+ "assert_cmd",
+ "chrono",
+ "clap",
+ "console 0.16.2",
+ "criterion",
+ "crossbeam-channel",
+ "ctrlc",
+ "globset",
+ "indicatif",
+ "insta",
+ "miette",
+ "notify",
+ "notify-debouncer-mini",
+ "pathdiff",
+ "predicates",
+ "regex",
+ "serde",
+ "serde_json",
+ "similar",
+ "swc_common",
+ "swc_ecma_ast",
+ "swc_ecma_codegen",
+ "swc_ecma_parser",
+ "tempfile",
+ "thiserror",
+ "tracing",
+ "tracing-subscriber",
+ "walkdir",
+]
+
+[[package]]
+name = "new_debug_unreachable"
+version = "1.0.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "650eef8c711430f1a879fdd01d4745a7deea475becfb90269c06775983bbf086"
+
+[[package]]
+name = "nix"
+version = "0.30.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "74523f3a35e05aba87a1d978330aef40f67b0304ac79c1c00b294c9830543db6"
+dependencies = [
+ "bitflags 2.10.0",
+ "cfg-if",
+ "cfg_aliases",
+ "libc",
+]
+
+[[package]]
+name = "normalize-line-endings"
+version = "0.3.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "61807f77802ff30975e01f4f071c8ba10c022052f98b3294119f3e615d13e5be"
+
+[[package]]
+name = "notify"
+version = "8.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4d3d07927151ff8575b7087f245456e549fea62edf0ec4e565a5ee50c8402bc3"
+dependencies = [
+ "bitflags 2.10.0",
+ "fsevent-sys",
+ "inotify",
+ "kqueue",
+ "libc",
+ "log",
+ "mio",
+ "notify-types",
+ "walkdir",
+ "windows-sys 0.60.2",
+]
+
+[[package]]
+name = "notify-debouncer-mini"
+version = "0.6.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a689eb4262184d9a1727f9087cd03883ea716682ab03ed24efec57d7716dccb8"
+dependencies = [
+ "log",
+ "notify",
+ "notify-types",
+ "tempfile",
+]
+
+[[package]]
+name = "notify-types"
+version = "2.0.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5e0826a989adedc2a244799e823aece04662b66609d96af8dff7ac6df9a8925d"
+
+[[package]]
+name = "nu-ansi-term"
+version = "0.50.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7957b9740744892f114936ab4a57b3f487491bbeafaf8083688b16841a4240e5"
+dependencies = [
+ "windows-sys 0.61.2",
+]
+
+[[package]]
+name = "num-bigint"
+version = "0.4.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a5e44f723f1133c9deac646763579fdb3ac745e418f2a7af9cd0c431da1f20b9"
+dependencies = [
+ "num-integer",
+ "num-traits",
+ "serde",
+]
+
+[[package]]
+name = "num-integer"
+version = "0.1.46"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f"
+dependencies = [
+ "num-traits",
+]
+
+[[package]]
+name = "num-traits"
+version = "0.2.19"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841"
+dependencies = [
+ "autocfg",
+]
+
+[[package]]
+name = "objc2"
+version = "0.6.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b7c2599ce0ec54857b29ce62166b0ed9b4f6f1a70ccc9a71165b6154caca8c05"
+dependencies = [
+ "objc2-encode",
+]
+
+[[package]]
+name = "objc2-encode"
+version = "4.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ef25abbcd74fb2609453eb695bd2f860d389e457f67dc17cafc8b8cbc89d0c33"
+
+[[package]]
+name = "object"
+version = "0.32.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a6a622008b6e321afc04970976f62ee297fdbaa6f95318ca343e3eebb9648441"
+dependencies = [
+ "memchr",
+]
+
+[[package]]
+name = "object"
+version = "0.37.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ff76201f031d8863c38aa7f905eca4f53abbfa15f609db4277d44cd8938f33fe"
+dependencies = [
+ "memchr",
+]
+
+[[package]]
+name = "once_cell"
+version = "1.21.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d"
+
+[[package]]
+name = "once_cell_polyfill"
+version = "1.70.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "384b8ab6d37215f3c5301a95a4accb5d64aa607f1fcb26a11b5303878451b4fe"
+
+[[package]]
+name = "oorandom"
+version = "11.1.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d6790f58c7ff633d8771f42965289203411a5e5c68388703c06e14f24770b41e"
+
+[[package]]
+name = "outref"
+version = "0.5.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1a80800c0488c3a21695ea981a54918fbb37abf04f4d0720c453632255e2ff0e"
+
+[[package]]
+name = "owo-colors"
+version = "4.2.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9c6901729fa79e91a0913333229e9ca5dc725089d1c363b2f4b4760709dc4a52"
+
+[[package]]
+name = "pathdiff"
+version = "0.2.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "df94ce210e5bc13cb6651479fa48d14f601d9858cfe0467f43ae157023b938d3"
+
+[[package]]
+name = "percent-encoding"
+version = "2.3.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220"
+
+[[package]]
+name = "phf"
+version = "0.11.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1fd6780a80ae0c52cc120a26a1a42c1ae51b247a253e4e06113d23d2c2edd078"
+dependencies = [
+ "phf_macros",
+ "phf_shared",
+]
+
+[[package]]
+name = "phf_generator"
+version = "0.11.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3c80231409c20246a13fddb31776fb942c38553c51e871f8cbd687a4cfb5843d"
+dependencies = [
+ "phf_shared",
+ "rand",
+]
+
+[[package]]
+name = "phf_macros"
+version = "0.11.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f84ac04429c13a7ff43785d75ad27569f2951ce0ffd30a3321230db2fc727216"
+dependencies = [
+ "phf_generator",
+ "phf_shared",
+ "proc-macro2",
+ "quote",
+ "syn",
+]
+
+[[package]]
+name = "phf_shared"
+version = "0.11.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "67eabc2ef2a60eb7faa00097bd1ffdb5bd28e62bf39990626a582201b7a754e5"
+dependencies = [
+ "siphasher 1.0.1",
+]
+
+[[package]]
+name = "pin-project-lite"
+version = "0.2.16"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3b3cff922bd51709b605d9ead9aa71031d81447142d828eb4a6eba76fe619f9b"
+
+[[package]]
+name = "plotters"
+version = "0.3.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5aeb6f403d7a4911efb1e33402027fc44f29b5bf6def3effcc22d7bb75f2b747"
+dependencies = [
+ "num-traits",
+ "plotters-backend",
+ "plotters-svg",
+ "wasm-bindgen",
+ "web-sys",
+]
+
+[[package]]
+name = "plotters-backend"
+version = "0.3.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "df42e13c12958a16b3f7f4386b9ab1f3e7933914ecea48da7139435263a4172a"
+
+[[package]]
+name = "plotters-svg"
+version = "0.3.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "51bae2ac328883f7acdfea3d66a7c35751187f870bc81f94563733a154d7a670"
+dependencies = [
+ "plotters-backend",
+]
+
+[[package]]
+name = "portable-atomic"
+version = "1.13.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f89776e4d69bb58bc6993e99ffa1d11f228b839984854c7daeb5d37f87cbe950"
+
+[[package]]
+name = "potential_utf"
+version = "0.1.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b73949432f5e2a09657003c25bca5e19a0e9c84f8058ca374f49e0ebe605af77"
+dependencies = [
+ "zerovec",
+]
+
+[[package]]
+name = "predicates"
+version = "3.1.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a5d19ee57562043d37e82899fade9a22ebab7be9cef5026b07fda9cdd4293573"
+dependencies = [
+ "anstyle",
+ "difflib",
+ "float-cmp",
+ "normalize-line-endings",
+ "predicates-core",
+ "regex",
+]
+
+[[package]]
+name = "predicates-core"
+version = "1.0.9"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "727e462b119fe9c93fd0eb1429a5f7647394014cf3c04ab2c0350eeb09095ffa"
+
+[[package]]
+name = "predicates-tree"
+version = "1.0.12"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "72dd2d6d381dfb73a193c7fca536518d7caee39fc8503f74e7dc0be0531b425c"
+dependencies = [
+ "predicates-core",
+ "termtree",
+]
+
+[[package]]
+name = "proc-macro2"
+version = "1.0.105"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "535d180e0ecab6268a3e718bb9fd44db66bbbc256257165fc699dadf70d16fe7"
+dependencies = [
+ "unicode-ident",
+]
+
+[[package]]
+name = "psm"
+version = "0.1.28"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d11f2fedc3b7dafdc2851bc52f277377c5473d378859be234bc7ebb593144d01"
+dependencies = [
+ "ar_archive_writer",
+ "cc",
+]
+
+[[package]]
+name = "quote"
+version = "1.0.43"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "dc74d9a594b72ae6656596548f56f667211f8a97b3d4c3d467150794690dc40a"
+dependencies = [
+ "proc-macro2",
+]
+
+[[package]]
+name = "r-efi"
+version = "5.3.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f"
+
+[[package]]
+name = "radium"
+version = "0.7.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "dc33ff2d4973d518d823d61aa239014831e521c75da58e3df4840d3f47749d09"
+
+[[package]]
+name = "rand"
+version = "0.8.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404"
+dependencies = [
+ "rand_core",
+]
+
+[[package]]
+name = "rand_core"
+version = "0.6.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c"
+
+[[package]]
+name = "rayon"
+version = "1.11.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "368f01d005bf8fd9b1206fb6fa653e6c4a81ceb1466406b81792d87c5677a58f"
+dependencies = [
+ "either",
+ "rayon-core",
+]
+
+[[package]]
+name = "rayon-core"
+version = "1.13.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "22e18b0f0062d30d4230b2e85ff77fdfe4326feb054b9783a3460d8435c8ab91"
+dependencies = [
+ "crossbeam-deque",
+ "crossbeam-utils",
+]
+
+[[package]]
+name = "regex"
+version = "1.12.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "843bc0191f75f3e22651ae5f1e72939ab2f72a4bc30fa80a066bd66edefc24d4"
+dependencies = [
+ "aho-corasick",
+ "memchr",
+ "regex-automata",
+ "regex-syntax",
+]
+
+[[package]]
+name = "regex-automata"
+version = "0.4.13"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5276caf25ac86c8d810222b3dbb938e512c55c6831a10f3e6ed1c93b84041f1c"
+dependencies = [
+ "aho-corasick",
+ "memchr",
+ "regex-syntax",
+]
+
+[[package]]
+name = "regex-syntax"
+version = "0.8.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7a2d987857b319362043e95f5353c0535c1f58eec5336fdfcf626430af7def58"
+
+[[package]]
+name = "rustc-demangle"
+version = "0.1.27"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b50b8869d9fc858ce7266cce0194bd74df58b9d0e3f6df3a9fc8eb470d95c09d"
+
+[[package]]
+name = "rustc-hash"
+version = "2.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "357703d41365b4b27c590e3ed91eabb1b663f07c4c084095e60cbed4362dff0d"
+
+[[package]]
+name = "rustix"
+version = "1.1.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "146c9e247ccc180c1f61615433868c99f3de3ae256a30a43b49f67c2d9171f34"
+dependencies = [
+ "bitflags 2.10.0",
+ "errno",
+ "libc",
+ "linux-raw-sys",
+ "windows-sys 0.61.2",
+]
+
+[[package]]
+name = "rustversion"
+version = "1.0.22"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b39cdef0fa800fc44525c84ccb54a029961a8215f9619753635a9c0d2538d46d"
+
+[[package]]
+name = "ryu"
+version = "1.0.22"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a50f4cf475b65d88e057964e0e9bb1f0aa9bbb2036dc65c64596b42932536984"
+
+[[package]]
+name = "ryu-js"
+version = "1.0.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "dd29631678d6fb0903b69223673e122c32e9ae559d0960a38d574695ebc0ea15"
+
+[[package]]
+name = "same-file"
+version = "1.0.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502"
+dependencies = [
+ "winapi-util",
+]
+
+[[package]]
+name = "scoped-tls"
+version = "1.0.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e1cf6437eb19a8f4a6cc0f7dca544973b0b78843adbfeb3683d1a94a0024a294"
+
+[[package]]
+name = "seq-macro"
+version = "0.3.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1bc711410fbe7399f390ca1c3b60ad0f53f80e95c5eb935e52268a0e2cd49acc"
+
+[[package]]
+name = "serde"
+version = "1.0.228"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9a8e94ea7f378bd32cbbd37198a4a91436180c5bb472411e48b5ec2e2124ae9e"
+dependencies = [
+ "serde_core",
+ "serde_derive",
+]
+
+[[package]]
+name = "serde_core"
+version = "1.0.228"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "41d385c7d4ca58e59fc732af25c3983b67ac852c1a25000afe1175de458b67ad"
+dependencies = [
+ "serde_derive",
+]
+
+[[package]]
+name = "serde_derive"
+version = "1.0.228"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn",
+]
+
+[[package]]
+name = "serde_json"
+version = "1.0.148"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3084b546a1dd6289475996f182a22aba973866ea8e8b02c51d9f46b1336a22da"
+dependencies = [
+ "itoa",
+ "memchr",
+ "serde",
+ "serde_core",
+ "zmij",
+]
+
+[[package]]
+name = "sharded-slab"
+version = "0.1.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f40ca3c46823713e0d4209592e8d6e826aa57e928f09752619fc696c499637f6"
+dependencies = [
+ "lazy_static",
+]
+
+[[package]]
+name = "shlex"
+version = "1.3.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64"
+
+[[package]]
+name = "similar"
+version = "2.7.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "bbbb5d9659141646ae647b42fe094daf6c6192d1620870b449d9557f748b2daa"
+
+[[package]]
+name = "siphasher"
+version = "0.3.11"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "38b58827f4464d87d377d175e90bf58eb00fd8716ff0a62f80356b5e61555d0d"
+
+[[package]]
+name = "siphasher"
+version = "1.0.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "56199f7ddabf13fe5074ce809e7d3f42b42ae711800501b5b16ea82ad029c39d"
+
+[[package]]
+name = "smallvec"
+version = "1.15.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03"
+
+[[package]]
+name = "smartstring"
+version = "1.0.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3fb72c633efbaa2dd666986505016c32c3044395ceaf881518399d2f4127ee29"
+dependencies = [
+ "autocfg",
+ "static_assertions",
+ "version_check",
+]
+
+[[package]]
+name = "stable_deref_trait"
+version = "1.2.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6ce2be8dc25455e1f91df71bfa12ad37d7af1092ae736f3a6cd0e37bc7810596"
+
+[[package]]
+name = "stacker"
+version = "0.1.22"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e1f8b29fb42aafcea4edeeb6b2f2d7ecd0d969c48b4cf0d2e64aafc471dd6e59"
+dependencies = [
+ "cc",
+ "cfg-if",
+ "libc",
+ "psm",
+ "windows-sys 0.59.0",
+]
+
+[[package]]
+name = "static_assertions"
+version = "1.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f"
+
+[[package]]
+name = "string_enum"
+version = "1.0.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ae36a4951ca7bd1cfd991c241584a9824a70f6aff1e7d4f693fb3f2465e4030e"
+dependencies = [
+ "quote",
+ "swc_macros_common",
+ "syn",
+]
+
+[[package]]
+name = "strsim"
+version = "0.11.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f"
+
+[[package]]
+name = "supports-color"
+version = "3.0.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c64fc7232dd8d2e4ac5ce4ef302b1d81e0b80d055b9d77c7c4f51f6aa4c867d6"
+dependencies = [
+ "is_ci",
+]
+
+[[package]]
+name = "supports-hyperlinks"
+version = "3.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e396b6523b11ccb83120b115a0b7366de372751aa6edf19844dfb13a6af97e91"
+
+[[package]]
+name = "supports-unicode"
+version = "3.0.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b7401a30af6cb5818bb64852270bb722533397edcfc7344954a38f420819ece2"
+
+[[package]]
+name = "swc_allocator"
+version = "4.0.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9d7eefd2c8b228a8c73056482b2ae4b3a1071fbe07638e3b55ceca8570cc48bb"
+dependencies = [
+ "allocator-api2",
+ "bumpalo",
+ "hashbrown",
+ "rustc-hash",
+]
+
+[[package]]
+name = "swc_atoms"
+version = "9.0.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d4ccbe2ecad10ad7432100f878a107b1d972a8aee83ca53184d00c23a078bb8a"
+dependencies = [
+ "hstr",
+ "once_cell",
+ "serde",
+]
+
+[[package]]
+name = "swc_common"
+version = "18.0.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a1c06698254e9b47daaf9bbb062af489a350bd8d10dfaab0cabbd32d46cec69d"
+dependencies = [
+ "anyhow",
+ "ast_node",
+ "better_scoped_tls",
+ "bytes-str",
+ "either",
+ "from_variant",
+ "num-bigint",
+ "once_cell",
+ "rustc-hash",
+ "serde",
+ "siphasher 0.3.11",
+ "swc_atoms",
+ "swc_eq_ignore_macros",
+ "swc_sourcemap",
+ "swc_visit",
+ "tracing",
+ "unicode-width 0.2.2",
+ "url",
+]
+
+[[package]]
+name = "swc_ecma_ast"
+version = "19.0.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "724195600825cbdd2a899d5473d2ce1f24ae418bff1231f160ecf38a3bc81f46"
+dependencies = [
+ "bitflags 2.10.0",
+ "is-macro",
+ "num-bigint",
+ "once_cell",
+ "phf",
+ "rustc-hash",
+ "string_enum",
+ "swc_atoms",
+ "swc_common",
+ "swc_visit",
+ "unicode-id-start",
+]
+
+[[package]]
+name = "swc_ecma_codegen"
+version = "21.0.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5c77d9d21345ca986ae3b5ff1a4fa3607b15b07ed397506e6dba32e867cf40fd"
+dependencies = [
+ "ascii",
+ "compact_str",
+ "memchr",
+ "num-bigint",
+ "once_cell",
+ "regex",
+ "rustc-hash",
+ "ryu-js",
+ "serde",
+ "swc_allocator",
+ "swc_atoms",
+ "swc_common",
+ "swc_ecma_ast",
+ "swc_ecma_codegen_macros",
+ "swc_sourcemap",
+ "tracing",
+]
+
+[[package]]
+name = "swc_ecma_codegen_macros"
+version = "2.0.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e276dc62c0a2625a560397827989c82a93fd545fcf6f7faec0935a82cc4ddbb8"
+dependencies = [
+ "proc-macro2",
+ "swc_macros_common",
+ "syn",
+]
+
+[[package]]
+name = "swc_ecma_parser"
+version = "32.0.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e1d0c36843109fff178bbedc439b4190daa865d78e553134243a4df220329fdd"
+dependencies = [
+ "bitflags 2.10.0",
+ "either",
+ "num-bigint",
+ "phf",
+ "rustc-hash",
+ "seq-macro",
+ "serde",
+ "smartstring",
+ "stacker",
+ "swc_atoms",
+ "swc_common",
+ "swc_ecma_ast",
+ "tracing",
+]
+
+[[package]]
+name = "swc_eq_ignore_macros"
+version = "1.0.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c16ce73424a6316e95e09065ba6a207eba7765496fed113702278b7711d4b632"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn",
+]
+
+[[package]]
+name = "swc_macros_common"
+version = "1.0.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "aae1efbaa74943dc5ad2a2fb16cbd78b77d7e4d63188f3c5b4df2b4dcd2faaae"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn",
+]
+
+[[package]]
+name = "swc_sourcemap"
+version = "9.3.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "de08ef00f816acdd1a58ee8a81c0e1a59eefef2093aefe5611f256fa6b64c4d7"
+dependencies = [
+ "base64-simd",
+ "bitvec",
+ "bytes-str",
+ "data-encoding",
+ "debugid",
+ "if_chain",
+ "rustc-hash",
+ "serde",
+ "serde_json",
+ "unicode-id-start",
+ "url",
+]
+
+[[package]]
+name = "swc_visit"
+version = "2.0.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "62fb71484b486c185e34d2172f0eabe7f4722742aad700f426a494bb2de232a2"
+dependencies = [
+ "either",
+ "new_debug_unreachable",
+]
+
+[[package]]
+name = "syn"
+version = "2.0.113"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "678faa00651c9eb72dd2020cbdf275d92eccb2400d568e419efdd64838145cb4"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "unicode-ident",
+]
+
+[[package]]
+name = "synstructure"
+version = "0.13.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn",
+]
+
+[[package]]
+name = "tap"
+version = "1.0.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369"
+
+[[package]]
+name = "tempfile"
+version = "3.24.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "655da9c7eb6305c55742045d5a8d2037996d61d8de95806335c7c86ce0f82e9c"
+dependencies = [
+ "fastrand",
+ "getrandom",
+ "once_cell",
+ "rustix",
+ "windows-sys 0.61.2",
+]
+
+[[package]]
+name = "terminal_size"
+version = "0.4.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "60b8cb979cb11c32ce1603f8137b22262a9d131aaa5c37b5678025f22b8becd0"
+dependencies = [
+ "rustix",
+ "windows-sys 0.60.2",
+]
+
+[[package]]
+name = "termtree"
+version = "0.5.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8f50febec83f5ee1df3015341d8bd429f2d1cc62bcba7ea2076759d315084683"
+
+[[package]]
+name = "textwrap"
+version = "0.16.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c13547615a44dc9c452a8a534638acdf07120d4b6847c8178705da06306a3057"
+dependencies = [
+ "unicode-linebreak",
+ "unicode-width 0.2.2",
+]
+
+[[package]]
+name = "thiserror"
+version = "2.0.17"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f63587ca0f12b72a0600bcba1d40081f830876000bb46dd2337a3051618f4fc8"
+dependencies = [
+ "thiserror-impl",
+]
+
+[[package]]
+name = "thiserror-impl"
+version = "2.0.17"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3ff15c8ecd7de3849db632e14d18d2571fa09dfc5ed93479bc4485c7a517c913"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn",
+]
+
+[[package]]
+name = "thread_local"
+version = "1.1.9"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f60246a4944f24f6e018aa17cdeffb7818b76356965d03b07d6a9886e8962185"
+dependencies = [
+ "cfg-if",
+]
+
+[[package]]
+name = "tinystr"
+version = "0.8.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "42d3e9c45c09de15d06dd8acf5f4e0e399e85927b7f00711024eb7ae10fa4869"
+dependencies = [
+ "displaydoc",
+ "zerovec",
+]
+
+[[package]]
+name = "tinytemplate"
+version = "1.2.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "be4d6b5f19ff7664e8c98d03e2139cb510db9b0a60b55f8e8709b689d939b6bc"
+dependencies = [
+ "serde",
+ "serde_json",
+]
+
+[[package]]
+name = "tracing"
+version = "0.1.44"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "63e71662fa4b2a2c3a26f570f037eb95bb1f85397f3cd8076caed2f026a6d100"
+dependencies = [
+ "pin-project-lite",
+ "tracing-attributes",
+ "tracing-core",
+]
+
+[[package]]
+name = "tracing-attributes"
+version = "0.1.31"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7490cfa5ec963746568740651ac6781f701c9c5ea257c58e057f3ba8cf69e8da"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn",
+]
+
+[[package]]
+name = "tracing-core"
+version = "0.1.36"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "db97caf9d906fbde555dd62fa95ddba9eecfd14cb388e4f491a66d74cd5fb79a"
+dependencies = [
+ "once_cell",
+ "valuable",
+]
+
+[[package]]
+name = "tracing-log"
+version = "0.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ee855f1f400bd0e5c02d150ae5de3840039a3f54b025156404e34c23c03f47c3"
+dependencies = [
+ "log",
+ "once_cell",
+ "tracing-core",
+]
+
+[[package]]
+name = "tracing-subscriber"
+version = "0.3.22"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2f30143827ddab0d256fd843b7a66d164e9f271cfa0dde49142c5ca0ca291f1e"
+dependencies = [
+ "matchers",
+ "nu-ansi-term",
+ "once_cell",
+ "regex-automata",
+ "sharded-slab",
+ "smallvec",
+ "thread_local",
+ "tracing",
+ "tracing-core",
+ "tracing-log",
+]
+
+[[package]]
+name = "triomphe"
+version = "0.1.15"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "dd69c5aa8f924c7519d6372789a74eac5b94fb0f8fcf0d4a97eb0bfc3e785f39"
+dependencies = [
+ "serde",
+ "stable_deref_trait",
+]
+
+[[package]]
+name = "unicode-id-start"
+version = "1.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "81b79ad29b5e19de4260020f8919b443b2ef0277d242ce532ec7b7a2cc8b6007"
+
+[[package]]
+name = "unicode-ident"
+version = "1.0.22"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9312f7c4f6ff9069b165498234ce8be658059c6728633667c526e27dc2cf1df5"
+
+[[package]]
+name = "unicode-linebreak"
+version = "0.1.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3b09c83c3c29d37506a3e260c08c03743a6bb66a9cd432c6934ab501a190571f"
+
+[[package]]
+name = "unicode-width"
+version = "0.1.14"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7dd6e30e90baa6f72411720665d41d89b9a3d039dc45b8faea1ddd07f617f6af"
+
+[[package]]
+name = "unicode-width"
+version = "0.2.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b4ac048d71ede7ee76d585517add45da530660ef4390e49b098733c6e897f254"
+
+[[package]]
+name = "unit-prefix"
+version = "0.5.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "81e544489bf3d8ef66c953931f56617f423cd4b5494be343d9b9d3dda037b9a3"
+
+[[package]]
+name = "url"
+version = "2.5.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ff67a8a4397373c3ef660812acab3268222035010ab8680ec4215f38ba3d0eed"
+dependencies = [
+ "form_urlencoded",
+ "idna",
+ "percent-encoding",
+ "serde",
+]
+
+[[package]]
+name = "utf8_iter"
+version = "1.0.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be"
+
+[[package]]
+name = "utf8parse"
+version = "0.2.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821"
+
+[[package]]
+name = "uuid"
+version = "1.19.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e2e054861b4bd027cd373e18e8d8d8e6548085000e41290d95ce0c373a654b4a"
+dependencies = [
+ "js-sys",
+ "wasm-bindgen",
+]
+
+[[package]]
+name = "valuable"
+version = "0.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ba73ea9cf16a25df0c8caa16c51acb937d5712a8429db78a3ee29d5dcacd3a65"
+
+[[package]]
+name = "version_check"
+version = "0.9.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a"
+
+[[package]]
+name = "vsimd"
+version = "0.8.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5c3082ca00d5a5ef149bb8b555a72ae84c9c59f7250f013ac822ac2e49b19c64"
+
+[[package]]
+name = "wait-timeout"
+version = "0.2.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "09ac3b126d3914f9849036f826e054cbabdc8519970b8998ddaf3b5bd3c65f11"
+dependencies = [
+ "libc",
+]
+
+[[package]]
+name = "walkdir"
+version = "2.5.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "29790946404f91d9c5d06f9874efddea1dc06c5efe94541a7d6863108e3a5e4b"
+dependencies = [
+ "same-file",
+ "winapi-util",
+]
+
+[[package]]
+name = "wasi"
+version = "0.11.1+wasi-snapshot-preview1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b"
+
+[[package]]
+name = "wasip2"
+version = "1.0.1+wasi-0.2.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0562428422c63773dad2c345a1882263bbf4d65cf3f42e90921f787ef5ad58e7"
+dependencies = [
+ "wit-bindgen",
+]
+
+[[package]]
+name = "wasm-bindgen"
+version = "0.2.106"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0d759f433fa64a2d763d1340820e46e111a7a5ab75f993d1852d70b03dbb80fd"
+dependencies = [
+ "cfg-if",
+ "once_cell",
+ "rustversion",
+ "wasm-bindgen-macro",
+ "wasm-bindgen-shared",
+]
+
+[[package]]
+name = "wasm-bindgen-macro"
+version = "0.2.106"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "48cb0d2638f8baedbc542ed444afc0644a29166f1595371af4fecf8ce1e7eeb3"
+dependencies = [
+ "quote",
+ "wasm-bindgen-macro-support",
+]
+
+[[package]]
+name = "wasm-bindgen-macro-support"
+version = "0.2.106"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "cefb59d5cd5f92d9dcf80e4683949f15ca4b511f4ac0a6e14d4e1ac60c6ecd40"
+dependencies = [
+ "bumpalo",
+ "proc-macro2",
+ "quote",
+ "syn",
+ "wasm-bindgen-shared",
+]
+
+[[package]]
+name = "wasm-bindgen-shared"
+version = "0.2.106"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "cbc538057e648b67f72a982e708d485b2efa771e1ac05fec311f9f63e5800db4"
+dependencies = [
+ "unicode-ident",
+]
+
+[[package]]
+name = "web-sys"
+version = "0.3.83"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9b32828d774c412041098d182a8b38b16ea816958e07cf40eec2bc080ae137ac"
+dependencies = [
+ "js-sys",
+ "wasm-bindgen",
+]
+
+[[package]]
+name = "web-time"
+version = "1.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5a6580f308b1fad9207618087a65c04e7a10bc77e02c8e84e9b00dd4b12fa0bb"
+dependencies = [
+ "js-sys",
+ "wasm-bindgen",
+]
+
+[[package]]
+name = "winapi-util"
+version = "0.1.11"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c2a7b1c03c876122aa43f3020e6c3c3ee5c05081c9a00739faf7503aeba10d22"
+dependencies = [
+ "windows-sys 0.61.2",
+]
+
+[[package]]
+name = "windows-core"
+version = "0.62.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b8e83a14d34d0623b51dce9581199302a221863196a1dde71a7663a4c2be9deb"
+dependencies = [
+ "windows-implement",
+ "windows-interface",
+ "windows-link",
+ "windows-result",
+ "windows-strings",
+]
+
+[[package]]
+name = "windows-implement"
+version = "0.60.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "053e2e040ab57b9dc951b72c264860db7eb3b0200ba345b4e4c3b14f67855ddf"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn",
+]
+
+[[package]]
+name = "windows-interface"
+version = "0.59.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3f316c4a2570ba26bbec722032c4099d8c8bc095efccdc15688708623367e358"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn",
+]
+
+[[package]]
+name = "windows-link"
+version = "0.2.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5"
+
+[[package]]
+name = "windows-result"
+version = "0.4.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7781fa89eaf60850ac3d2da7af8e5242a5ea78d1a11c49bf2910bb5a73853eb5"
+dependencies = [
+ "windows-link",
+]
+
+[[package]]
+name = "windows-strings"
+version = "0.5.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7837d08f69c77cf6b07689544538e017c1bfcf57e34b4c0ff58e6c2cd3b37091"
+dependencies = [
+ "windows-link",
+]
+
+[[package]]
+name = "windows-sys"
+version = "0.59.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b"
+dependencies = [
+ "windows-targets 0.52.6",
+]
+
+[[package]]
+name = "windows-sys"
+version = "0.60.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f2f500e4d28234f72040990ec9d39e3a6b950f9f22d3dba18416c35882612bcb"
+dependencies = [
+ "windows-targets 0.53.5",
+]
+
+[[package]]
+name = "windows-sys"
+version = "0.61.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ae137229bcbd6cdf0f7b80a31df61766145077ddf49416a728b02cb3921ff3fc"
+dependencies = [
+ "windows-link",
+]
+
+[[package]]
+name = "windows-targets"
+version = "0.52.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973"
+dependencies = [
+ "windows_aarch64_gnullvm 0.52.6",
+ "windows_aarch64_msvc 0.52.6",
+ "windows_i686_gnu 0.52.6",
+ "windows_i686_gnullvm 0.52.6",
+ "windows_i686_msvc 0.52.6",
+ "windows_x86_64_gnu 0.52.6",
+ "windows_x86_64_gnullvm 0.52.6",
+ "windows_x86_64_msvc 0.52.6",
+]
+
+[[package]]
+name = "windows-targets"
+version = "0.53.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4945f9f551b88e0d65f3db0bc25c33b8acea4d9e41163edf90dcd0b19f9069f3"
+dependencies = [
+ "windows-link",
+ "windows_aarch64_gnullvm 0.53.1",
+ "windows_aarch64_msvc 0.53.1",
+ "windows_i686_gnu 0.53.1",
+ "windows_i686_gnullvm 0.53.1",
+ "windows_i686_msvc 0.53.1",
+ "windows_x86_64_gnu 0.53.1",
+ "windows_x86_64_gnullvm 0.53.1",
+ "windows_x86_64_msvc 0.53.1",
+]
+
+[[package]]
+name = "windows_aarch64_gnullvm"
+version = "0.52.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3"
+
+[[package]]
+name = "windows_aarch64_gnullvm"
+version = "0.53.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a9d8416fa8b42f5c947f8482c43e7d89e73a173cead56d044f6a56104a6d1b53"
+
+[[package]]
+name = "windows_aarch64_msvc"
+version = "0.52.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469"
+
+[[package]]
+name = "windows_aarch64_msvc"
+version = "0.53.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b9d782e804c2f632e395708e99a94275910eb9100b2114651e04744e9b125006"
+
+[[package]]
+name = "windows_i686_gnu"
+version = "0.52.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b"
+
+[[package]]
+name = "windows_i686_gnu"
+version = "0.53.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "960e6da069d81e09becb0ca57a65220ddff016ff2d6af6a223cf372a506593a3"
+
+[[package]]
+name = "windows_i686_gnullvm"
+version = "0.52.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66"
+
+[[package]]
+name = "windows_i686_gnullvm"
+version = "0.53.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "fa7359d10048f68ab8b09fa71c3daccfb0e9b559aed648a8f95469c27057180c"
+
+[[package]]
+name = "windows_i686_msvc"
+version = "0.52.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66"
+
+[[package]]
+name = "windows_i686_msvc"
+version = "0.53.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1e7ac75179f18232fe9c285163565a57ef8d3c89254a30685b57d83a38d326c2"
+
+[[package]]
+name = "windows_x86_64_gnu"
+version = "0.52.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78"
+
+[[package]]
+name = "windows_x86_64_gnu"
+version = "0.53.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9c3842cdd74a865a8066ab39c8a7a473c0778a3f29370b5fd6b4b9aa7df4a499"
+
+[[package]]
+name = "windows_x86_64_gnullvm"
+version = "0.52.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d"
+
+[[package]]
+name = "windows_x86_64_gnullvm"
+version = "0.53.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0ffa179e2d07eee8ad8f57493436566c7cc30ac536a3379fdf008f47f6bb7ae1"
+
+[[package]]
+name = "windows_x86_64_msvc"
+version = "0.52.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec"
+
+[[package]]
+name = "windows_x86_64_msvc"
+version = "0.53.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d6bbff5f0aada427a1e5a6da5f1f98158182f26556f345ac9e04d36d0ebed650"
+
+[[package]]
+name = "wit-bindgen"
+version = "0.46.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f17a85883d4e6d00e8a97c586de764dabcc06133f7f1d55dce5cdc070ad7fe59"
+
+[[package]]
+name = "writeable"
+version = "0.6.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9edde0db4769d2dc68579893f2306b26c6ecfbe0ef499b013d731b7b9247e0b9"
+
+[[package]]
+name = "wyz"
+version = "0.5.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "05f360fc0b24296329c78fda852a1e9ae82de9cf7b27dae4b7f62f118f77b9ed"
+dependencies = [
+ "tap",
+]
+
+[[package]]
+name = "yoke"
+version = "0.8.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "72d6e5c6afb84d73944e5cedb052c4680d5657337201555f9f2a16b7406d4954"
+dependencies = [
+ "stable_deref_trait",
+ "yoke-derive",
+ "zerofrom",
+]
+
+[[package]]
+name = "yoke-derive"
+version = "0.8.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b659052874eb698efe5b9e8cf382204678a0086ebf46982b79d6ca3182927e5d"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn",
+ "synstructure",
+]
+
+[[package]]
+name = "zerocopy"
+version = "0.8.31"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "fd74ec98b9250adb3ca554bdde269adf631549f51d8a8f8f0a10b50f1cb298c3"
+dependencies = [
+ "zerocopy-derive",
+]
+
+[[package]]
+name = "zerocopy-derive"
+version = "0.8.31"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d8a8d209fdf45cf5138cbb5a506f6b52522a25afccc534d1475dad8e31105c6a"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn",
+]
+
+[[package]]
+name = "zerofrom"
+version = "0.1.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "50cc42e0333e05660c3587f3bf9d0478688e15d870fab3346451ce7f8c9fbea5"
+dependencies = [
+ "zerofrom-derive",
+]
+
+[[package]]
+name = "zerofrom-derive"
+version = "0.1.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d71e5d6e06ab090c67b5e44993ec16b72dcbaabc526db883a360057678b48502"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn",
+ "synstructure",
+]
+
+[[package]]
+name = "zerotrie"
+version = "0.2.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2a59c17a5562d507e4b54960e8569ebee33bee890c70aa3fe7b97e85a9fd7851"
+dependencies = [
+ "displaydoc",
+ "yoke",
+ "zerofrom",
+]
+
+[[package]]
+name = "zerovec"
+version = "0.11.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6c28719294829477f525be0186d13efa9a3c602f7ec202ca9e353d310fb9a002"
+dependencies = [
+ "yoke",
+ "zerofrom",
+ "zerovec-derive",
+]
+
+[[package]]
+name = "zerovec-derive"
+version = "0.11.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "eadce39539ca5cb3985590102671f2567e659fca9666581ad3411d59207951f3"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn",
+]
+
+[[package]]
+name = "zmij"
+version = "1.0.12"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2fc5a66a20078bf1251bde995aa2fdcc4b800c70b5d92dd2c62abc5c60f679f8"
diff --git a/packages/nestjs-trpc/cli/Cargo.toml b/packages/nestjs-trpc/cli/Cargo.toml
new file mode 100644
index 0000000..284ee36
--- /dev/null
+++ b/packages/nestjs-trpc/cli/Cargo.toml
@@ -0,0 +1,112 @@
+# ============================================================================
+# CLI Build Instructions
+# ============================================================================
+# To build and test the CLI, run the following commands in a terminal
+# where Rust/cargo is available:
+#
+# cd packages/nestjs-trpc/cli
+# cargo build --release
+#
+# To test against the example project:
+#
+# cd examples/nestjs-fastify
+# npx nestjs-trpc generate
+# npx tsc --noEmit src/@generated/server.ts
+#
+# ============================================================================
+
+[package]
+name = "nestjs-trpc"
+version = "0.1.0"
+edition = "2021"
+rust-version = "1.73"
+description = "Standalone CLI for generating tRPC routers from NestJS decorators"
+authors = ["NestJS-tRPC Contributors"]
+license = "MIT"
+repository = "https://github.com/KevinEdry/nestjs-trpc"
+keywords = ["nestjs", "trpc", "cli", "typescript", "codegen"]
+categories = ["command-line-utilities", "development-tools"]
+
+[[bin]]
+name = "nestjs-trpc"
+path = "src/main.rs"
+
+[lib]
+name = "nestjs_trpc"
+path = "src/lib.rs"
+
+[dependencies]
+# CLI framework
+clap = { version = "4.5", features = ["derive"] }
+
+# TypeScript parsing (SWC) - Latest compatible versions
+swc_common = { version = "18", features = ["sourcemap"] }
+swc_ecma_ast = "19"
+swc_ecma_parser = "32"
+swc_ecma_codegen = "21"
+
+# File discovery
+walkdir = "2.5"
+globset = "0.4"
+
+# Path utilities
+pathdiff = "0.2"
+
+# Error handling
+anyhow = "1.0"
+thiserror = "2.0"
+miette = { version = "7.6", features = ["fancy"] }
+
+# JSON parsing
+serde_json = "1.0"
+serde = { version = "1.0", features = ["derive"] }
+
+# Text diffing (for dry-run mode)
+similar = "2.6"
+
+# Logging
+tracing = "0.1"
+tracing-subscriber = { version = "0.3", features = ["env-filter"] }
+
+# Watch mode
+notify = "8.2"
+notify-debouncer-mini = "0.6"
+indicatif = "0.18"
+console = "0.16"
+crossbeam-channel = "0.5"
+ctrlc = "3.5"
+chrono = "0.4"
+
+# Temp file management (for dry-run mode)
+tempfile = "3.15"
+
+[dev-dependencies]
+assert_cmd = "2.0"
+predicates = "3.1"
+criterion = { version = "0.5", features = ["html_reports"] }
+insta = { version = "1.42", features = ["yaml"] }
+regex = "1.11"
+
+[profile.release]
+lto = true
+codegen-units = 1
+strip = true
+
+[lints.rust]
+unsafe_code = "forbid"
+
+[lints.clippy]
+pedantic = { level = "warn", priority = -1 }
+nursery = { level = "warn", priority = -1 }
+module_name_repetitions = "allow"
+missing_errors_doc = "allow"
+missing_panics_doc = "allow"
+undocumented_unsafe_blocks = "deny"
+too_many_lines = "warn"
+cognitive_complexity = "warn"
+unwrap_used = "deny"
+expect_used = "deny"
+
+[[bench]]
+name = "parse_benchmark"
+harness = false
diff --git a/packages/nestjs-trpc/cli/benches/fixtures/large-project/routers/user_01.router.ts b/packages/nestjs-trpc/cli/benches/fixtures/large-project/routers/user_01.router.ts
new file mode 100644
index 0000000..80d7454
--- /dev/null
+++ b/packages/nestjs-trpc/cli/benches/fixtures/large-project/routers/user_01.router.ts
@@ -0,0 +1,41 @@
+import { Router, Query, Mutation } from 'nestjs-trpc';
+import { z } from 'zod';
+
+const user01Schema = z.object({
+ id: z.string(),
+ name: z.string(),
+ email: z.string().email(),
+ createdAt: z.date(),
+});
+
+@Router({ alias: 'users01' })
+export class User01Router {
+ @Query({
+ input: z.object({ id: z.string() }),
+ output: user01Schema,
+ })
+ getUser01(id: string) {
+ return {
+ id,
+ name: 'User 01',
+ email: 'user01@test.com',
+ createdAt: new Date(),
+ };
+ }
+
+ @Mutation({
+ input: z.object({ name: z.string(), email: z.string() }),
+ output: user01Schema,
+ })
+ createUser01(name: string, email: string) {
+ return { id: 'new-01', name, email, createdAt: new Date() };
+ }
+
+ @Query({
+ input: z.object({ search: z.string().optional() }),
+ output: z.array(user01Schema),
+ })
+ listUsers01(search?: string) {
+ return [];
+ }
+}
diff --git a/packages/nestjs-trpc/cli/benches/fixtures/large-project/routers/user_02.router.ts b/packages/nestjs-trpc/cli/benches/fixtures/large-project/routers/user_02.router.ts
new file mode 100644
index 0000000..688fcaf
--- /dev/null
+++ b/packages/nestjs-trpc/cli/benches/fixtures/large-project/routers/user_02.router.ts
@@ -0,0 +1,41 @@
+import { Router, Query, Mutation } from 'nestjs-trpc';
+import { z } from 'zod';
+
+const user02Schema = z.object({
+ id: z.string(),
+ name: z.string(),
+ email: z.string().email(),
+ createdAt: z.date(),
+});
+
+@Router({ alias: 'users02' })
+export class User02Router {
+ @Query({
+ input: z.object({ id: z.string() }),
+ output: user02Schema,
+ })
+ getUser02(id: string) {
+ return {
+ id,
+ name: 'User 02',
+ email: 'user02@test.com',
+ createdAt: new Date(),
+ };
+ }
+
+ @Mutation({
+ input: z.object({ name: z.string(), email: z.string() }),
+ output: user02Schema,
+ })
+ createUser02(name: string, email: string) {
+ return { id: 'new-02', name, email, createdAt: new Date() };
+ }
+
+ @Query({
+ input: z.object({ search: z.string().optional() }),
+ output: z.array(user02Schema),
+ })
+ listUsers02(search?: string) {
+ return [];
+ }
+}
diff --git a/packages/nestjs-trpc/cli/benches/fixtures/large-project/routers/user_03.router.ts b/packages/nestjs-trpc/cli/benches/fixtures/large-project/routers/user_03.router.ts
new file mode 100644
index 0000000..0829fc8
--- /dev/null
+++ b/packages/nestjs-trpc/cli/benches/fixtures/large-project/routers/user_03.router.ts
@@ -0,0 +1,41 @@
+import { Router, Query, Mutation } from 'nestjs-trpc';
+import { z } from 'zod';
+
+const user03Schema = z.object({
+ id: z.string(),
+ name: z.string(),
+ email: z.string().email(),
+ createdAt: z.date(),
+});
+
+@Router({ alias: 'users03' })
+export class User03Router {
+ @Query({
+ input: z.object({ id: z.string() }),
+ output: user03Schema,
+ })
+ getUser03(id: string) {
+ return {
+ id,
+ name: 'User 03',
+ email: 'user03@test.com',
+ createdAt: new Date(),
+ };
+ }
+
+ @Mutation({
+ input: z.object({ name: z.string(), email: z.string() }),
+ output: user03Schema,
+ })
+ createUser03(name: string, email: string) {
+ return { id: 'new-03', name, email, createdAt: new Date() };
+ }
+
+ @Query({
+ input: z.object({ search: z.string().optional() }),
+ output: z.array(user03Schema),
+ })
+ listUsers03(search?: string) {
+ return [];
+ }
+}
diff --git a/packages/nestjs-trpc/cli/benches/fixtures/large-project/routers/user_04.router.ts b/packages/nestjs-trpc/cli/benches/fixtures/large-project/routers/user_04.router.ts
new file mode 100644
index 0000000..ec7c0a2
--- /dev/null
+++ b/packages/nestjs-trpc/cli/benches/fixtures/large-project/routers/user_04.router.ts
@@ -0,0 +1,41 @@
+import { Router, Query, Mutation } from 'nestjs-trpc';
+import { z } from 'zod';
+
+const user04Schema = z.object({
+ id: z.string(),
+ name: z.string(),
+ email: z.string().email(),
+ createdAt: z.date(),
+});
+
+@Router({ alias: 'users04' })
+export class User04Router {
+ @Query({
+ input: z.object({ id: z.string() }),
+ output: user04Schema,
+ })
+ getUser04(id: string) {
+ return {
+ id,
+ name: 'User 04',
+ email: 'user04@test.com',
+ createdAt: new Date(),
+ };
+ }
+
+ @Mutation({
+ input: z.object({ name: z.string(), email: z.string() }),
+ output: user04Schema,
+ })
+ createUser04(name: string, email: string) {
+ return { id: 'new-04', name, email, createdAt: new Date() };
+ }
+
+ @Query({
+ input: z.object({ search: z.string().optional() }),
+ output: z.array(user04Schema),
+ })
+ listUsers04(search?: string) {
+ return [];
+ }
+}
diff --git a/packages/nestjs-trpc/cli/benches/fixtures/large-project/routers/user_05.router.ts b/packages/nestjs-trpc/cli/benches/fixtures/large-project/routers/user_05.router.ts
new file mode 100644
index 0000000..0656594
--- /dev/null
+++ b/packages/nestjs-trpc/cli/benches/fixtures/large-project/routers/user_05.router.ts
@@ -0,0 +1,41 @@
+import { Router, Query, Mutation } from 'nestjs-trpc';
+import { z } from 'zod';
+
+const user05Schema = z.object({
+ id: z.string(),
+ name: z.string(),
+ email: z.string().email(),
+ createdAt: z.date(),
+});
+
+@Router({ alias: 'users05' })
+export class User05Router {
+ @Query({
+ input: z.object({ id: z.string() }),
+ output: user05Schema,
+ })
+ getUser05(id: string) {
+ return {
+ id,
+ name: 'User 05',
+ email: 'user05@test.com',
+ createdAt: new Date(),
+ };
+ }
+
+ @Mutation({
+ input: z.object({ name: z.string(), email: z.string() }),
+ output: user05Schema,
+ })
+ createUser05(name: string, email: string) {
+ return { id: 'new-05', name, email, createdAt: new Date() };
+ }
+
+ @Query({
+ input: z.object({ search: z.string().optional() }),
+ output: z.array(user05Schema),
+ })
+ listUsers05(search?: string) {
+ return [];
+ }
+}
diff --git a/packages/nestjs-trpc/cli/benches/fixtures/large-project/routers/user_06.router.ts b/packages/nestjs-trpc/cli/benches/fixtures/large-project/routers/user_06.router.ts
new file mode 100644
index 0000000..069c46c
--- /dev/null
+++ b/packages/nestjs-trpc/cli/benches/fixtures/large-project/routers/user_06.router.ts
@@ -0,0 +1,41 @@
+import { Router, Query, Mutation } from 'nestjs-trpc';
+import { z } from 'zod';
+
+const user06Schema = z.object({
+ id: z.string(),
+ name: z.string(),
+ email: z.string().email(),
+ createdAt: z.date(),
+});
+
+@Router({ alias: 'users06' })
+export class User06Router {
+ @Query({
+ input: z.object({ id: z.string() }),
+ output: user06Schema,
+ })
+ getUser06(id: string) {
+ return {
+ id,
+ name: 'User 06',
+ email: 'user06@test.com',
+ createdAt: new Date(),
+ };
+ }
+
+ @Mutation({
+ input: z.object({ name: z.string(), email: z.string() }),
+ output: user06Schema,
+ })
+ createUser06(name: string, email: string) {
+ return { id: 'new-06', name, email, createdAt: new Date() };
+ }
+
+ @Query({
+ input: z.object({ search: z.string().optional() }),
+ output: z.array(user06Schema),
+ })
+ listUsers06(search?: string) {
+ return [];
+ }
+}
diff --git a/packages/nestjs-trpc/cli/benches/fixtures/large-project/routers/user_07.router.ts b/packages/nestjs-trpc/cli/benches/fixtures/large-project/routers/user_07.router.ts
new file mode 100644
index 0000000..2363bce
--- /dev/null
+++ b/packages/nestjs-trpc/cli/benches/fixtures/large-project/routers/user_07.router.ts
@@ -0,0 +1,41 @@
+import { Router, Query, Mutation } from 'nestjs-trpc';
+import { z } from 'zod';
+
+const user07Schema = z.object({
+ id: z.string(),
+ name: z.string(),
+ email: z.string().email(),
+ createdAt: z.date(),
+});
+
+@Router({ alias: 'users07' })
+export class User07Router {
+ @Query({
+ input: z.object({ id: z.string() }),
+ output: user07Schema,
+ })
+ getUser07(id: string) {
+ return {
+ id,
+ name: 'User 07',
+ email: 'user07@test.com',
+ createdAt: new Date(),
+ };
+ }
+
+ @Mutation({
+ input: z.object({ name: z.string(), email: z.string() }),
+ output: user07Schema,
+ })
+ createUser07(name: string, email: string) {
+ return { id: 'new-07', name, email, createdAt: new Date() };
+ }
+
+ @Query({
+ input: z.object({ search: z.string().optional() }),
+ output: z.array(user07Schema),
+ })
+ listUsers07(search?: string) {
+ return [];
+ }
+}
diff --git a/packages/nestjs-trpc/cli/benches/fixtures/large-project/routers/user_08.router.ts b/packages/nestjs-trpc/cli/benches/fixtures/large-project/routers/user_08.router.ts
new file mode 100644
index 0000000..227be5b
--- /dev/null
+++ b/packages/nestjs-trpc/cli/benches/fixtures/large-project/routers/user_08.router.ts
@@ -0,0 +1,41 @@
+import { Router, Query, Mutation } from 'nestjs-trpc';
+import { z } from 'zod';
+
+const user08Schema = z.object({
+ id: z.string(),
+ name: z.string(),
+ email: z.string().email(),
+ createdAt: z.date(),
+});
+
+@Router({ alias: 'users08' })
+export class User08Router {
+ @Query({
+ input: z.object({ id: z.string() }),
+ output: user08Schema,
+ })
+ getUser08(id: string) {
+ return {
+ id,
+ name: 'User 08',
+ email: 'user08@test.com',
+ createdAt: new Date(),
+ };
+ }
+
+ @Mutation({
+ input: z.object({ name: z.string(), email: z.string() }),
+ output: user08Schema,
+ })
+ createUser08(name: string, email: string) {
+ return { id: 'new-08', name, email, createdAt: new Date() };
+ }
+
+ @Query({
+ input: z.object({ search: z.string().optional() }),
+ output: z.array(user08Schema),
+ })
+ listUsers08(search?: string) {
+ return [];
+ }
+}
diff --git a/packages/nestjs-trpc/cli/benches/fixtures/large-project/routers/user_09.router.ts b/packages/nestjs-trpc/cli/benches/fixtures/large-project/routers/user_09.router.ts
new file mode 100644
index 0000000..0162020
--- /dev/null
+++ b/packages/nestjs-trpc/cli/benches/fixtures/large-project/routers/user_09.router.ts
@@ -0,0 +1,41 @@
+import { Router, Query, Mutation } from 'nestjs-trpc';
+import { z } from 'zod';
+
+const user09Schema = z.object({
+ id: z.string(),
+ name: z.string(),
+ email: z.string().email(),
+ createdAt: z.date(),
+});
+
+@Router({ alias: 'users09' })
+export class User09Router {
+ @Query({
+ input: z.object({ id: z.string() }),
+ output: user09Schema,
+ })
+ getUser09(id: string) {
+ return {
+ id,
+ name: 'User 09',
+ email: 'user09@test.com',
+ createdAt: new Date(),
+ };
+ }
+
+ @Mutation({
+ input: z.object({ name: z.string(), email: z.string() }),
+ output: user09Schema,
+ })
+ createUser09(name: string, email: string) {
+ return { id: 'new-09', name, email, createdAt: new Date() };
+ }
+
+ @Query({
+ input: z.object({ search: z.string().optional() }),
+ output: z.array(user09Schema),
+ })
+ listUsers09(search?: string) {
+ return [];
+ }
+}
diff --git a/packages/nestjs-trpc/cli/benches/fixtures/large-project/routers/user_10.router.ts b/packages/nestjs-trpc/cli/benches/fixtures/large-project/routers/user_10.router.ts
new file mode 100644
index 0000000..c92c560
--- /dev/null
+++ b/packages/nestjs-trpc/cli/benches/fixtures/large-project/routers/user_10.router.ts
@@ -0,0 +1,41 @@
+import { Router, Query, Mutation } from 'nestjs-trpc';
+import { z } from 'zod';
+
+const user10Schema = z.object({
+ id: z.string(),
+ name: z.string(),
+ email: z.string().email(),
+ createdAt: z.date(),
+});
+
+@Router({ alias: 'users10' })
+export class User10Router {
+ @Query({
+ input: z.object({ id: z.string() }),
+ output: user10Schema,
+ })
+ getUser10(id: string) {
+ return {
+ id,
+ name: 'User 10',
+ email: 'user10@test.com',
+ createdAt: new Date(),
+ };
+ }
+
+ @Mutation({
+ input: z.object({ name: z.string(), email: z.string() }),
+ output: user10Schema,
+ })
+ createUser10(name: string, email: string) {
+ return { id: 'new-10', name, email, createdAt: new Date() };
+ }
+
+ @Query({
+ input: z.object({ search: z.string().optional() }),
+ output: z.array(user10Schema),
+ })
+ listUsers10(search?: string) {
+ return [];
+ }
+}
diff --git a/packages/nestjs-trpc/cli/benches/fixtures/large-project/routers/user_11.router.ts b/packages/nestjs-trpc/cli/benches/fixtures/large-project/routers/user_11.router.ts
new file mode 100644
index 0000000..513370f
--- /dev/null
+++ b/packages/nestjs-trpc/cli/benches/fixtures/large-project/routers/user_11.router.ts
@@ -0,0 +1,41 @@
+import { Router, Query, Mutation } from 'nestjs-trpc';
+import { z } from 'zod';
+
+const user11Schema = z.object({
+ id: z.string(),
+ name: z.string(),
+ email: z.string().email(),
+ createdAt: z.date(),
+});
+
+@Router({ alias: 'users11' })
+export class User11Router {
+ @Query({
+ input: z.object({ id: z.string() }),
+ output: user11Schema,
+ })
+ getUser11(id: string) {
+ return {
+ id,
+ name: 'User 11',
+ email: 'user11@test.com',
+ createdAt: new Date(),
+ };
+ }
+
+ @Mutation({
+ input: z.object({ name: z.string(), email: z.string() }),
+ output: user11Schema,
+ })
+ createUser11(name: string, email: string) {
+ return { id: 'new-11', name, email, createdAt: new Date() };
+ }
+
+ @Query({
+ input: z.object({ search: z.string().optional() }),
+ output: z.array(user11Schema),
+ })
+ listUsers11(search?: string) {
+ return [];
+ }
+}
diff --git a/packages/nestjs-trpc/cli/benches/fixtures/large-project/routers/user_12.router.ts b/packages/nestjs-trpc/cli/benches/fixtures/large-project/routers/user_12.router.ts
new file mode 100644
index 0000000..e0c3eca
--- /dev/null
+++ b/packages/nestjs-trpc/cli/benches/fixtures/large-project/routers/user_12.router.ts
@@ -0,0 +1,41 @@
+import { Router, Query, Mutation } from 'nestjs-trpc';
+import { z } from 'zod';
+
+const user12Schema = z.object({
+ id: z.string(),
+ name: z.string(),
+ email: z.string().email(),
+ createdAt: z.date(),
+});
+
+@Router({ alias: 'users12' })
+export class User12Router {
+ @Query({
+ input: z.object({ id: z.string() }),
+ output: user12Schema,
+ })
+ getUser12(id: string) {
+ return {
+ id,
+ name: 'User 12',
+ email: 'user12@test.com',
+ createdAt: new Date(),
+ };
+ }
+
+ @Mutation({
+ input: z.object({ name: z.string(), email: z.string() }),
+ output: user12Schema,
+ })
+ createUser12(name: string, email: string) {
+ return { id: 'new-12', name, email, createdAt: new Date() };
+ }
+
+ @Query({
+ input: z.object({ search: z.string().optional() }),
+ output: z.array(user12Schema),
+ })
+ listUsers12(search?: string) {
+ return [];
+ }
+}
diff --git a/packages/nestjs-trpc/cli/benches/fixtures/large-project/routers/user_13.router.ts b/packages/nestjs-trpc/cli/benches/fixtures/large-project/routers/user_13.router.ts
new file mode 100644
index 0000000..d133ab5
--- /dev/null
+++ b/packages/nestjs-trpc/cli/benches/fixtures/large-project/routers/user_13.router.ts
@@ -0,0 +1,41 @@
+import { Router, Query, Mutation } from 'nestjs-trpc';
+import { z } from 'zod';
+
+const user13Schema = z.object({
+ id: z.string(),
+ name: z.string(),
+ email: z.string().email(),
+ createdAt: z.date(),
+});
+
+@Router({ alias: 'users13' })
+export class User13Router {
+ @Query({
+ input: z.object({ id: z.string() }),
+ output: user13Schema,
+ })
+ getUser13(id: string) {
+ return {
+ id,
+ name: 'User 13',
+ email: 'user13@test.com',
+ createdAt: new Date(),
+ };
+ }
+
+ @Mutation({
+ input: z.object({ name: z.string(), email: z.string() }),
+ output: user13Schema,
+ })
+ createUser13(name: string, email: string) {
+ return { id: 'new-13', name, email, createdAt: new Date() };
+ }
+
+ @Query({
+ input: z.object({ search: z.string().optional() }),
+ output: z.array(user13Schema),
+ })
+ listUsers13(search?: string) {
+ return [];
+ }
+}
diff --git a/packages/nestjs-trpc/cli/benches/fixtures/large-project/routers/user_14.router.ts b/packages/nestjs-trpc/cli/benches/fixtures/large-project/routers/user_14.router.ts
new file mode 100644
index 0000000..fd807a9
--- /dev/null
+++ b/packages/nestjs-trpc/cli/benches/fixtures/large-project/routers/user_14.router.ts
@@ -0,0 +1,41 @@
+import { Router, Query, Mutation } from 'nestjs-trpc';
+import { z } from 'zod';
+
+const user14Schema = z.object({
+ id: z.string(),
+ name: z.string(),
+ email: z.string().email(),
+ createdAt: z.date(),
+});
+
+@Router({ alias: 'users14' })
+export class User14Router {
+ @Query({
+ input: z.object({ id: z.string() }),
+ output: user14Schema,
+ })
+ getUser14(id: string) {
+ return {
+ id,
+ name: 'User 14',
+ email: 'user14@test.com',
+ createdAt: new Date(),
+ };
+ }
+
+ @Mutation({
+ input: z.object({ name: z.string(), email: z.string() }),
+ output: user14Schema,
+ })
+ createUser14(name: string, email: string) {
+ return { id: 'new-14', name, email, createdAt: new Date() };
+ }
+
+ @Query({
+ input: z.object({ search: z.string().optional() }),
+ output: z.array(user14Schema),
+ })
+ listUsers14(search?: string) {
+ return [];
+ }
+}
diff --git a/packages/nestjs-trpc/cli/benches/fixtures/large-project/routers/user_15.router.ts b/packages/nestjs-trpc/cli/benches/fixtures/large-project/routers/user_15.router.ts
new file mode 100644
index 0000000..5046153
--- /dev/null
+++ b/packages/nestjs-trpc/cli/benches/fixtures/large-project/routers/user_15.router.ts
@@ -0,0 +1,41 @@
+import { Router, Query, Mutation } from 'nestjs-trpc';
+import { z } from 'zod';
+
+const user15Schema = z.object({
+ id: z.string(),
+ name: z.string(),
+ email: z.string().email(),
+ createdAt: z.date(),
+});
+
+@Router({ alias: 'users15' })
+export class User15Router {
+ @Query({
+ input: z.object({ id: z.string() }),
+ output: user15Schema,
+ })
+ getUser15(id: string) {
+ return {
+ id,
+ name: 'User 15',
+ email: 'user15@test.com',
+ createdAt: new Date(),
+ };
+ }
+
+ @Mutation({
+ input: z.object({ name: z.string(), email: z.string() }),
+ output: user15Schema,
+ })
+ createUser15(name: string, email: string) {
+ return { id: 'new-15', name, email, createdAt: new Date() };
+ }
+
+ @Query({
+ input: z.object({ search: z.string().optional() }),
+ output: z.array(user15Schema),
+ })
+ listUsers15(search?: string) {
+ return [];
+ }
+}
diff --git a/packages/nestjs-trpc/cli/benches/fixtures/large-project/routers/user_16.router.ts b/packages/nestjs-trpc/cli/benches/fixtures/large-project/routers/user_16.router.ts
new file mode 100644
index 0000000..a924853
--- /dev/null
+++ b/packages/nestjs-trpc/cli/benches/fixtures/large-project/routers/user_16.router.ts
@@ -0,0 +1,41 @@
+import { Router, Query, Mutation } from 'nestjs-trpc';
+import { z } from 'zod';
+
+const user16Schema = z.object({
+ id: z.string(),
+ name: z.string(),
+ email: z.string().email(),
+ createdAt: z.date(),
+});
+
+@Router({ alias: 'users16' })
+export class User16Router {
+ @Query({
+ input: z.object({ id: z.string() }),
+ output: user16Schema,
+ })
+ getUser16(id: string) {
+ return {
+ id,
+ name: 'User 16',
+ email: 'user16@test.com',
+ createdAt: new Date(),
+ };
+ }
+
+ @Mutation({
+ input: z.object({ name: z.string(), email: z.string() }),
+ output: user16Schema,
+ })
+ createUser16(name: string, email: string) {
+ return { id: 'new-16', name, email, createdAt: new Date() };
+ }
+
+ @Query({
+ input: z.object({ search: z.string().optional() }),
+ output: z.array(user16Schema),
+ })
+ listUsers16(search?: string) {
+ return [];
+ }
+}
diff --git a/packages/nestjs-trpc/cli/benches/fixtures/large-project/routers/user_17.router.ts b/packages/nestjs-trpc/cli/benches/fixtures/large-project/routers/user_17.router.ts
new file mode 100644
index 0000000..3fd6fea
--- /dev/null
+++ b/packages/nestjs-trpc/cli/benches/fixtures/large-project/routers/user_17.router.ts
@@ -0,0 +1,41 @@
+import { Router, Query, Mutation } from 'nestjs-trpc';
+import { z } from 'zod';
+
+const user17Schema = z.object({
+ id: z.string(),
+ name: z.string(),
+ email: z.string().email(),
+ createdAt: z.date(),
+});
+
+@Router({ alias: 'users17' })
+export class User17Router {
+ @Query({
+ input: z.object({ id: z.string() }),
+ output: user17Schema,
+ })
+ getUser17(id: string) {
+ return {
+ id,
+ name: 'User 17',
+ email: 'user17@test.com',
+ createdAt: new Date(),
+ };
+ }
+
+ @Mutation({
+ input: z.object({ name: z.string(), email: z.string() }),
+ output: user17Schema,
+ })
+ createUser17(name: string, email: string) {
+ return { id: 'new-17', name, email, createdAt: new Date() };
+ }
+
+ @Query({
+ input: z.object({ search: z.string().optional() }),
+ output: z.array(user17Schema),
+ })
+ listUsers17(search?: string) {
+ return [];
+ }
+}
diff --git a/packages/nestjs-trpc/cli/benches/fixtures/large-project/routers/user_18.router.ts b/packages/nestjs-trpc/cli/benches/fixtures/large-project/routers/user_18.router.ts
new file mode 100644
index 0000000..7ab0ccb
--- /dev/null
+++ b/packages/nestjs-trpc/cli/benches/fixtures/large-project/routers/user_18.router.ts
@@ -0,0 +1,41 @@
+import { Router, Query, Mutation } from 'nestjs-trpc';
+import { z } from 'zod';
+
+const user18Schema = z.object({
+ id: z.string(),
+ name: z.string(),
+ email: z.string().email(),
+ createdAt: z.date(),
+});
+
+@Router({ alias: 'users18' })
+export class User18Router {
+ @Query({
+ input: z.object({ id: z.string() }),
+ output: user18Schema,
+ })
+ getUser18(id: string) {
+ return {
+ id,
+ name: 'User 18',
+ email: 'user18@test.com',
+ createdAt: new Date(),
+ };
+ }
+
+ @Mutation({
+ input: z.object({ name: z.string(), email: z.string() }),
+ output: user18Schema,
+ })
+ createUser18(name: string, email: string) {
+ return { id: 'new-18', name, email, createdAt: new Date() };
+ }
+
+ @Query({
+ input: z.object({ search: z.string().optional() }),
+ output: z.array(user18Schema),
+ })
+ listUsers18(search?: string) {
+ return [];
+ }
+}
diff --git a/packages/nestjs-trpc/cli/benches/fixtures/large-project/routers/user_19.router.ts b/packages/nestjs-trpc/cli/benches/fixtures/large-project/routers/user_19.router.ts
new file mode 100644
index 0000000..ccb1f25
--- /dev/null
+++ b/packages/nestjs-trpc/cli/benches/fixtures/large-project/routers/user_19.router.ts
@@ -0,0 +1,41 @@
+import { Router, Query, Mutation } from 'nestjs-trpc';
+import { z } from 'zod';
+
+const user19Schema = z.object({
+ id: z.string(),
+ name: z.string(),
+ email: z.string().email(),
+ createdAt: z.date(),
+});
+
+@Router({ alias: 'users19' })
+export class User19Router {
+ @Query({
+ input: z.object({ id: z.string() }),
+ output: user19Schema,
+ })
+ getUser19(id: string) {
+ return {
+ id,
+ name: 'User 19',
+ email: 'user19@test.com',
+ createdAt: new Date(),
+ };
+ }
+
+ @Mutation({
+ input: z.object({ name: z.string(), email: z.string() }),
+ output: user19Schema,
+ })
+ createUser19(name: string, email: string) {
+ return { id: 'new-19', name, email, createdAt: new Date() };
+ }
+
+ @Query({
+ input: z.object({ search: z.string().optional() }),
+ output: z.array(user19Schema),
+ })
+ listUsers19(search?: string) {
+ return [];
+ }
+}
diff --git a/packages/nestjs-trpc/cli/benches/fixtures/large-project/routers/user_20.router.ts b/packages/nestjs-trpc/cli/benches/fixtures/large-project/routers/user_20.router.ts
new file mode 100644
index 0000000..8b2021c
--- /dev/null
+++ b/packages/nestjs-trpc/cli/benches/fixtures/large-project/routers/user_20.router.ts
@@ -0,0 +1,41 @@
+import { Router, Query, Mutation } from 'nestjs-trpc';
+import { z } from 'zod';
+
+const user20Schema = z.object({
+ id: z.string(),
+ name: z.string(),
+ email: z.string().email(),
+ createdAt: z.date(),
+});
+
+@Router({ alias: 'users20' })
+export class User20Router {
+ @Query({
+ input: z.object({ id: z.string() }),
+ output: user20Schema,
+ })
+ getUser20(id: string) {
+ return {
+ id,
+ name: 'User 20',
+ email: 'user20@test.com',
+ createdAt: new Date(),
+ };
+ }
+
+ @Mutation({
+ input: z.object({ name: z.string(), email: z.string() }),
+ output: user20Schema,
+ })
+ createUser20(name: string, email: string) {
+ return { id: 'new-20', name, email, createdAt: new Date() };
+ }
+
+ @Query({
+ input: z.object({ search: z.string().optional() }),
+ output: z.array(user20Schema),
+ })
+ listUsers20(search?: string) {
+ return [];
+ }
+}
diff --git a/packages/nestjs-trpc/cli/benches/fixtures/large-project/routers/user_21.router.ts b/packages/nestjs-trpc/cli/benches/fixtures/large-project/routers/user_21.router.ts
new file mode 100644
index 0000000..22b3197
--- /dev/null
+++ b/packages/nestjs-trpc/cli/benches/fixtures/large-project/routers/user_21.router.ts
@@ -0,0 +1,41 @@
+import { Router, Query, Mutation } from 'nestjs-trpc';
+import { z } from 'zod';
+
+const user21Schema = z.object({
+ id: z.string(),
+ name: z.string(),
+ email: z.string().email(),
+ createdAt: z.date(),
+});
+
+@Router({ alias: 'users21' })
+export class User21Router {
+ @Query({
+ input: z.object({ id: z.string() }),
+ output: user21Schema,
+ })
+ getUser21(id: string) {
+ return {
+ id,
+ name: 'User 21',
+ email: 'user21@test.com',
+ createdAt: new Date(),
+ };
+ }
+
+ @Mutation({
+ input: z.object({ name: z.string(), email: z.string() }),
+ output: user21Schema,
+ })
+ createUser21(name: string, email: string) {
+ return { id: 'new-21', name, email, createdAt: new Date() };
+ }
+
+ @Query({
+ input: z.object({ search: z.string().optional() }),
+ output: z.array(user21Schema),
+ })
+ listUsers21(search?: string) {
+ return [];
+ }
+}
diff --git a/packages/nestjs-trpc/cli/benches/fixtures/large-project/routers/user_22.router.ts b/packages/nestjs-trpc/cli/benches/fixtures/large-project/routers/user_22.router.ts
new file mode 100644
index 0000000..e3cb199
--- /dev/null
+++ b/packages/nestjs-trpc/cli/benches/fixtures/large-project/routers/user_22.router.ts
@@ -0,0 +1,41 @@
+import { Router, Query, Mutation } from 'nestjs-trpc';
+import { z } from 'zod';
+
+const user22Schema = z.object({
+ id: z.string(),
+ name: z.string(),
+ email: z.string().email(),
+ createdAt: z.date(),
+});
+
+@Router({ alias: 'users22' })
+export class User22Router {
+ @Query({
+ input: z.object({ id: z.string() }),
+ output: user22Schema,
+ })
+ getUser22(id: string) {
+ return {
+ id,
+ name: 'User 22',
+ email: 'user22@test.com',
+ createdAt: new Date(),
+ };
+ }
+
+ @Mutation({
+ input: z.object({ name: z.string(), email: z.string() }),
+ output: user22Schema,
+ })
+ createUser22(name: string, email: string) {
+ return { id: 'new-22', name, email, createdAt: new Date() };
+ }
+
+ @Query({
+ input: z.object({ search: z.string().optional() }),
+ output: z.array(user22Schema),
+ })
+ listUsers22(search?: string) {
+ return [];
+ }
+}
diff --git a/packages/nestjs-trpc/cli/benches/fixtures/large-project/routers/user_23.router.ts b/packages/nestjs-trpc/cli/benches/fixtures/large-project/routers/user_23.router.ts
new file mode 100644
index 0000000..d791b4c
--- /dev/null
+++ b/packages/nestjs-trpc/cli/benches/fixtures/large-project/routers/user_23.router.ts
@@ -0,0 +1,41 @@
+import { Router, Query, Mutation } from 'nestjs-trpc';
+import { z } from 'zod';
+
+const user23Schema = z.object({
+ id: z.string(),
+ name: z.string(),
+ email: z.string().email(),
+ createdAt: z.date(),
+});
+
+@Router({ alias: 'users23' })
+export class User23Router {
+ @Query({
+ input: z.object({ id: z.string() }),
+ output: user23Schema,
+ })
+ getUser23(id: string) {
+ return {
+ id,
+ name: 'User 23',
+ email: 'user23@test.com',
+ createdAt: new Date(),
+ };
+ }
+
+ @Mutation({
+ input: z.object({ name: z.string(), email: z.string() }),
+ output: user23Schema,
+ })
+ createUser23(name: string, email: string) {
+ return { id: 'new-23', name, email, createdAt: new Date() };
+ }
+
+ @Query({
+ input: z.object({ search: z.string().optional() }),
+ output: z.array(user23Schema),
+ })
+ listUsers23(search?: string) {
+ return [];
+ }
+}
diff --git a/packages/nestjs-trpc/cli/benches/fixtures/large-project/routers/user_24.router.ts b/packages/nestjs-trpc/cli/benches/fixtures/large-project/routers/user_24.router.ts
new file mode 100644
index 0000000..8594aa3
--- /dev/null
+++ b/packages/nestjs-trpc/cli/benches/fixtures/large-project/routers/user_24.router.ts
@@ -0,0 +1,41 @@
+import { Router, Query, Mutation } from 'nestjs-trpc';
+import { z } from 'zod';
+
+const user24Schema = z.object({
+ id: z.string(),
+ name: z.string(),
+ email: z.string().email(),
+ createdAt: z.date(),
+});
+
+@Router({ alias: 'users24' })
+export class User24Router {
+ @Query({
+ input: z.object({ id: z.string() }),
+ output: user24Schema,
+ })
+ getUser24(id: string) {
+ return {
+ id,
+ name: 'User 24',
+ email: 'user24@test.com',
+ createdAt: new Date(),
+ };
+ }
+
+ @Mutation({
+ input: z.object({ name: z.string(), email: z.string() }),
+ output: user24Schema,
+ })
+ createUser24(name: string, email: string) {
+ return { id: 'new-24', name, email, createdAt: new Date() };
+ }
+
+ @Query({
+ input: z.object({ search: z.string().optional() }),
+ output: z.array(user24Schema),
+ })
+ listUsers24(search?: string) {
+ return [];
+ }
+}
diff --git a/packages/nestjs-trpc/cli/benches/fixtures/large-project/routers/user_25.router.ts b/packages/nestjs-trpc/cli/benches/fixtures/large-project/routers/user_25.router.ts
new file mode 100644
index 0000000..968e751
--- /dev/null
+++ b/packages/nestjs-trpc/cli/benches/fixtures/large-project/routers/user_25.router.ts
@@ -0,0 +1,41 @@
+import { Router, Query, Mutation } from 'nestjs-trpc';
+import { z } from 'zod';
+
+const user25Schema = z.object({
+ id: z.string(),
+ name: z.string(),
+ email: z.string().email(),
+ createdAt: z.date(),
+});
+
+@Router({ alias: 'users25' })
+export class User25Router {
+ @Query({
+ input: z.object({ id: z.string() }),
+ output: user25Schema,
+ })
+ getUser25(id: string) {
+ return {
+ id,
+ name: 'User 25',
+ email: 'user25@test.com',
+ createdAt: new Date(),
+ };
+ }
+
+ @Mutation({
+ input: z.object({ name: z.string(), email: z.string() }),
+ output: user25Schema,
+ })
+ createUser25(name: string, email: string) {
+ return { id: 'new-25', name, email, createdAt: new Date() };
+ }
+
+ @Query({
+ input: z.object({ search: z.string().optional() }),
+ output: z.array(user25Schema),
+ })
+ listUsers25(search?: string) {
+ return [];
+ }
+}
diff --git a/packages/nestjs-trpc/cli/benches/fixtures/large-project/routers/user_26.router.ts b/packages/nestjs-trpc/cli/benches/fixtures/large-project/routers/user_26.router.ts
new file mode 100644
index 0000000..6f62d90
--- /dev/null
+++ b/packages/nestjs-trpc/cli/benches/fixtures/large-project/routers/user_26.router.ts
@@ -0,0 +1,41 @@
+import { Router, Query, Mutation } from 'nestjs-trpc';
+import { z } from 'zod';
+
+const user26Schema = z.object({
+ id: z.string(),
+ name: z.string(),
+ email: z.string().email(),
+ createdAt: z.date(),
+});
+
+@Router({ alias: 'users26' })
+export class User26Router {
+ @Query({
+ input: z.object({ id: z.string() }),
+ output: user26Schema,
+ })
+ getUser26(id: string) {
+ return {
+ id,
+ name: 'User 26',
+ email: 'user26@test.com',
+ createdAt: new Date(),
+ };
+ }
+
+ @Mutation({
+ input: z.object({ name: z.string(), email: z.string() }),
+ output: user26Schema,
+ })
+ createUser26(name: string, email: string) {
+ return { id: 'new-26', name, email, createdAt: new Date() };
+ }
+
+ @Query({
+ input: z.object({ search: z.string().optional() }),
+ output: z.array(user26Schema),
+ })
+ listUsers26(search?: string) {
+ return [];
+ }
+}
diff --git a/packages/nestjs-trpc/cli/benches/fixtures/large-project/routers/user_27.router.ts b/packages/nestjs-trpc/cli/benches/fixtures/large-project/routers/user_27.router.ts
new file mode 100644
index 0000000..de3492f
--- /dev/null
+++ b/packages/nestjs-trpc/cli/benches/fixtures/large-project/routers/user_27.router.ts
@@ -0,0 +1,41 @@
+import { Router, Query, Mutation } from 'nestjs-trpc';
+import { z } from 'zod';
+
+const user27Schema = z.object({
+ id: z.string(),
+ name: z.string(),
+ email: z.string().email(),
+ createdAt: z.date(),
+});
+
+@Router({ alias: 'users27' })
+export class User27Router {
+ @Query({
+ input: z.object({ id: z.string() }),
+ output: user27Schema,
+ })
+ getUser27(id: string) {
+ return {
+ id,
+ name: 'User 27',
+ email: 'user27@test.com',
+ createdAt: new Date(),
+ };
+ }
+
+ @Mutation({
+ input: z.object({ name: z.string(), email: z.string() }),
+ output: user27Schema,
+ })
+ createUser27(name: string, email: string) {
+ return { id: 'new-27', name, email, createdAt: new Date() };
+ }
+
+ @Query({
+ input: z.object({ search: z.string().optional() }),
+ output: z.array(user27Schema),
+ })
+ listUsers27(search?: string) {
+ return [];
+ }
+}
diff --git a/packages/nestjs-trpc/cli/benches/fixtures/large-project/routers/user_28.router.ts b/packages/nestjs-trpc/cli/benches/fixtures/large-project/routers/user_28.router.ts
new file mode 100644
index 0000000..b10f1d9
--- /dev/null
+++ b/packages/nestjs-trpc/cli/benches/fixtures/large-project/routers/user_28.router.ts
@@ -0,0 +1,41 @@
+import { Router, Query, Mutation } from 'nestjs-trpc';
+import { z } from 'zod';
+
+const user28Schema = z.object({
+ id: z.string(),
+ name: z.string(),
+ email: z.string().email(),
+ createdAt: z.date(),
+});
+
+@Router({ alias: 'users28' })
+export class User28Router {
+ @Query({
+ input: z.object({ id: z.string() }),
+ output: user28Schema,
+ })
+ getUser28(id: string) {
+ return {
+ id,
+ name: 'User 28',
+ email: 'user28@test.com',
+ createdAt: new Date(),
+ };
+ }
+
+ @Mutation({
+ input: z.object({ name: z.string(), email: z.string() }),
+ output: user28Schema,
+ })
+ createUser28(name: string, email: string) {
+ return { id: 'new-28', name, email, createdAt: new Date() };
+ }
+
+ @Query({
+ input: z.object({ search: z.string().optional() }),
+ output: z.array(user28Schema),
+ })
+ listUsers28(search?: string) {
+ return [];
+ }
+}
diff --git a/packages/nestjs-trpc/cli/benches/fixtures/large-project/routers/user_29.router.ts b/packages/nestjs-trpc/cli/benches/fixtures/large-project/routers/user_29.router.ts
new file mode 100644
index 0000000..b41c8b5
--- /dev/null
+++ b/packages/nestjs-trpc/cli/benches/fixtures/large-project/routers/user_29.router.ts
@@ -0,0 +1,41 @@
+import { Router, Query, Mutation } from 'nestjs-trpc';
+import { z } from 'zod';
+
+const user29Schema = z.object({
+ id: z.string(),
+ name: z.string(),
+ email: z.string().email(),
+ createdAt: z.date(),
+});
+
+@Router({ alias: 'users29' })
+export class User29Router {
+ @Query({
+ input: z.object({ id: z.string() }),
+ output: user29Schema,
+ })
+ getUser29(id: string) {
+ return {
+ id,
+ name: 'User 29',
+ email: 'user29@test.com',
+ createdAt: new Date(),
+ };
+ }
+
+ @Mutation({
+ input: z.object({ name: z.string(), email: z.string() }),
+ output: user29Schema,
+ })
+ createUser29(name: string, email: string) {
+ return { id: 'new-29', name, email, createdAt: new Date() };
+ }
+
+ @Query({
+ input: z.object({ search: z.string().optional() }),
+ output: z.array(user29Schema),
+ })
+ listUsers29(search?: string) {
+ return [];
+ }
+}
diff --git a/packages/nestjs-trpc/cli/benches/fixtures/large-project/routers/user_30.router.ts b/packages/nestjs-trpc/cli/benches/fixtures/large-project/routers/user_30.router.ts
new file mode 100644
index 0000000..28cefa2
--- /dev/null
+++ b/packages/nestjs-trpc/cli/benches/fixtures/large-project/routers/user_30.router.ts
@@ -0,0 +1,41 @@
+import { Router, Query, Mutation } from 'nestjs-trpc';
+import { z } from 'zod';
+
+const user30Schema = z.object({
+ id: z.string(),
+ name: z.string(),
+ email: z.string().email(),
+ createdAt: z.date(),
+});
+
+@Router({ alias: 'users30' })
+export class User30Router {
+ @Query({
+ input: z.object({ id: z.string() }),
+ output: user30Schema,
+ })
+ getUser30(id: string) {
+ return {
+ id,
+ name: 'User 30',
+ email: 'user30@test.com',
+ createdAt: new Date(),
+ };
+ }
+
+ @Mutation({
+ input: z.object({ name: z.string(), email: z.string() }),
+ output: user30Schema,
+ })
+ createUser30(name: string, email: string) {
+ return { id: 'new-30', name, email, createdAt: new Date() };
+ }
+
+ @Query({
+ input: z.object({ search: z.string().optional() }),
+ output: z.array(user30Schema),
+ })
+ listUsers30(search?: string) {
+ return [];
+ }
+}
diff --git a/packages/nestjs-trpc/cli/benches/fixtures/large-project/routers/user_31.router.ts b/packages/nestjs-trpc/cli/benches/fixtures/large-project/routers/user_31.router.ts
new file mode 100644
index 0000000..e85f9b4
--- /dev/null
+++ b/packages/nestjs-trpc/cli/benches/fixtures/large-project/routers/user_31.router.ts
@@ -0,0 +1,41 @@
+import { Router, Query, Mutation } from 'nestjs-trpc';
+import { z } from 'zod';
+
+const user31Schema = z.object({
+ id: z.string(),
+ name: z.string(),
+ email: z.string().email(),
+ createdAt: z.date(),
+});
+
+@Router({ alias: 'users31' })
+export class User31Router {
+ @Query({
+ input: z.object({ id: z.string() }),
+ output: user31Schema,
+ })
+ getUser31(id: string) {
+ return {
+ id,
+ name: 'User 31',
+ email: 'user31@test.com',
+ createdAt: new Date(),
+ };
+ }
+
+ @Mutation({
+ input: z.object({ name: z.string(), email: z.string() }),
+ output: user31Schema,
+ })
+ createUser31(name: string, email: string) {
+ return { id: 'new-31', name, email, createdAt: new Date() };
+ }
+
+ @Query({
+ input: z.object({ search: z.string().optional() }),
+ output: z.array(user31Schema),
+ })
+ listUsers31(search?: string) {
+ return [];
+ }
+}
diff --git a/packages/nestjs-trpc/cli/benches/fixtures/large-project/routers/user_32.router.ts b/packages/nestjs-trpc/cli/benches/fixtures/large-project/routers/user_32.router.ts
new file mode 100644
index 0000000..278e628
--- /dev/null
+++ b/packages/nestjs-trpc/cli/benches/fixtures/large-project/routers/user_32.router.ts
@@ -0,0 +1,41 @@
+import { Router, Query, Mutation } from 'nestjs-trpc';
+import { z } from 'zod';
+
+const user32Schema = z.object({
+ id: z.string(),
+ name: z.string(),
+ email: z.string().email(),
+ createdAt: z.date(),
+});
+
+@Router({ alias: 'users32' })
+export class User32Router {
+ @Query({
+ input: z.object({ id: z.string() }),
+ output: user32Schema,
+ })
+ getUser32(id: string) {
+ return {
+ id,
+ name: 'User 32',
+ email: 'user32@test.com',
+ createdAt: new Date(),
+ };
+ }
+
+ @Mutation({
+ input: z.object({ name: z.string(), email: z.string() }),
+ output: user32Schema,
+ })
+ createUser32(name: string, email: string) {
+ return { id: 'new-32', name, email, createdAt: new Date() };
+ }
+
+ @Query({
+ input: z.object({ search: z.string().optional() }),
+ output: z.array(user32Schema),
+ })
+ listUsers32(search?: string) {
+ return [];
+ }
+}
diff --git a/packages/nestjs-trpc/cli/benches/fixtures/large-project/routers/user_33.router.ts b/packages/nestjs-trpc/cli/benches/fixtures/large-project/routers/user_33.router.ts
new file mode 100644
index 0000000..d739c24
--- /dev/null
+++ b/packages/nestjs-trpc/cli/benches/fixtures/large-project/routers/user_33.router.ts
@@ -0,0 +1,41 @@
+import { Router, Query, Mutation } from 'nestjs-trpc';
+import { z } from 'zod';
+
+const user33Schema = z.object({
+ id: z.string(),
+ name: z.string(),
+ email: z.string().email(),
+ createdAt: z.date(),
+});
+
+@Router({ alias: 'users33' })
+export class User33Router {
+ @Query({
+ input: z.object({ id: z.string() }),
+ output: user33Schema,
+ })
+ getUser33(id: string) {
+ return {
+ id,
+ name: 'User 33',
+ email: 'user33@test.com',
+ createdAt: new Date(),
+ };
+ }
+
+ @Mutation({
+ input: z.object({ name: z.string(), email: z.string() }),
+ output: user33Schema,
+ })
+ createUser33(name: string, email: string) {
+ return { id: 'new-33', name, email, createdAt: new Date() };
+ }
+
+ @Query({
+ input: z.object({ search: z.string().optional() }),
+ output: z.array(user33Schema),
+ })
+ listUsers33(search?: string) {
+ return [];
+ }
+}
diff --git a/packages/nestjs-trpc/cli/benches/fixtures/large-project/routers/user_34.router.ts b/packages/nestjs-trpc/cli/benches/fixtures/large-project/routers/user_34.router.ts
new file mode 100644
index 0000000..a35e698
--- /dev/null
+++ b/packages/nestjs-trpc/cli/benches/fixtures/large-project/routers/user_34.router.ts
@@ -0,0 +1,41 @@
+import { Router, Query, Mutation } from 'nestjs-trpc';
+import { z } from 'zod';
+
+const user34Schema = z.object({
+ id: z.string(),
+ name: z.string(),
+ email: z.string().email(),
+ createdAt: z.date(),
+});
+
+@Router({ alias: 'users34' })
+export class User34Router {
+ @Query({
+ input: z.object({ id: z.string() }),
+ output: user34Schema,
+ })
+ getUser34(id: string) {
+ return {
+ id,
+ name: 'User 34',
+ email: 'user34@test.com',
+ createdAt: new Date(),
+ };
+ }
+
+ @Mutation({
+ input: z.object({ name: z.string(), email: z.string() }),
+ output: user34Schema,
+ })
+ createUser34(name: string, email: string) {
+ return { id: 'new-34', name, email, createdAt: new Date() };
+ }
+
+ @Query({
+ input: z.object({ search: z.string().optional() }),
+ output: z.array(user34Schema),
+ })
+ listUsers34(search?: string) {
+ return [];
+ }
+}
diff --git a/packages/nestjs-trpc/cli/benches/fixtures/large-project/routers/user_35.router.ts b/packages/nestjs-trpc/cli/benches/fixtures/large-project/routers/user_35.router.ts
new file mode 100644
index 0000000..ab53383
--- /dev/null
+++ b/packages/nestjs-trpc/cli/benches/fixtures/large-project/routers/user_35.router.ts
@@ -0,0 +1,41 @@
+import { Router, Query, Mutation } from 'nestjs-trpc';
+import { z } from 'zod';
+
+const user35Schema = z.object({
+ id: z.string(),
+ name: z.string(),
+ email: z.string().email(),
+ createdAt: z.date(),
+});
+
+@Router({ alias: 'users35' })
+export class User35Router {
+ @Query({
+ input: z.object({ id: z.string() }),
+ output: user35Schema,
+ })
+ getUser35(id: string) {
+ return {
+ id,
+ name: 'User 35',
+ email: 'user35@test.com',
+ createdAt: new Date(),
+ };
+ }
+
+ @Mutation({
+ input: z.object({ name: z.string(), email: z.string() }),
+ output: user35Schema,
+ })
+ createUser35(name: string, email: string) {
+ return { id: 'new-35', name, email, createdAt: new Date() };
+ }
+
+ @Query({
+ input: z.object({ search: z.string().optional() }),
+ output: z.array(user35Schema),
+ })
+ listUsers35(search?: string) {
+ return [];
+ }
+}
diff --git a/packages/nestjs-trpc/cli/benches/fixtures/large-project/routers/user_36.router.ts b/packages/nestjs-trpc/cli/benches/fixtures/large-project/routers/user_36.router.ts
new file mode 100644
index 0000000..a70ead1
--- /dev/null
+++ b/packages/nestjs-trpc/cli/benches/fixtures/large-project/routers/user_36.router.ts
@@ -0,0 +1,41 @@
+import { Router, Query, Mutation } from 'nestjs-trpc';
+import { z } from 'zod';
+
+const user36Schema = z.object({
+ id: z.string(),
+ name: z.string(),
+ email: z.string().email(),
+ createdAt: z.date(),
+});
+
+@Router({ alias: 'users36' })
+export class User36Router {
+ @Query({
+ input: z.object({ id: z.string() }),
+ output: user36Schema,
+ })
+ getUser36(id: string) {
+ return {
+ id,
+ name: 'User 36',
+ email: 'user36@test.com',
+ createdAt: new Date(),
+ };
+ }
+
+ @Mutation({
+ input: z.object({ name: z.string(), email: z.string() }),
+ output: user36Schema,
+ })
+ createUser36(name: string, email: string) {
+ return { id: 'new-36', name, email, createdAt: new Date() };
+ }
+
+ @Query({
+ input: z.object({ search: z.string().optional() }),
+ output: z.array(user36Schema),
+ })
+ listUsers36(search?: string) {
+ return [];
+ }
+}
diff --git a/packages/nestjs-trpc/cli/benches/fixtures/large-project/routers/user_37.router.ts b/packages/nestjs-trpc/cli/benches/fixtures/large-project/routers/user_37.router.ts
new file mode 100644
index 0000000..6eac16e
--- /dev/null
+++ b/packages/nestjs-trpc/cli/benches/fixtures/large-project/routers/user_37.router.ts
@@ -0,0 +1,41 @@
+import { Router, Query, Mutation } from 'nestjs-trpc';
+import { z } from 'zod';
+
+const user37Schema = z.object({
+ id: z.string(),
+ name: z.string(),
+ email: z.string().email(),
+ createdAt: z.date(),
+});
+
+@Router({ alias: 'users37' })
+export class User37Router {
+ @Query({
+ input: z.object({ id: z.string() }),
+ output: user37Schema,
+ })
+ getUser37(id: string) {
+ return {
+ id,
+ name: 'User 37',
+ email: 'user37@test.com',
+ createdAt: new Date(),
+ };
+ }
+
+ @Mutation({
+ input: z.object({ name: z.string(), email: z.string() }),
+ output: user37Schema,
+ })
+ createUser37(name: string, email: string) {
+ return { id: 'new-37', name, email, createdAt: new Date() };
+ }
+
+ @Query({
+ input: z.object({ search: z.string().optional() }),
+ output: z.array(user37Schema),
+ })
+ listUsers37(search?: string) {
+ return [];
+ }
+}
diff --git a/packages/nestjs-trpc/cli/benches/fixtures/large-project/routers/user_38.router.ts b/packages/nestjs-trpc/cli/benches/fixtures/large-project/routers/user_38.router.ts
new file mode 100644
index 0000000..e260ae6
--- /dev/null
+++ b/packages/nestjs-trpc/cli/benches/fixtures/large-project/routers/user_38.router.ts
@@ -0,0 +1,41 @@
+import { Router, Query, Mutation } from 'nestjs-trpc';
+import { z } from 'zod';
+
+const user38Schema = z.object({
+ id: z.string(),
+ name: z.string(),
+ email: z.string().email(),
+ createdAt: z.date(),
+});
+
+@Router({ alias: 'users38' })
+export class User38Router {
+ @Query({
+ input: z.object({ id: z.string() }),
+ output: user38Schema,
+ })
+ getUser38(id: string) {
+ return {
+ id,
+ name: 'User 38',
+ email: 'user38@test.com',
+ createdAt: new Date(),
+ };
+ }
+
+ @Mutation({
+ input: z.object({ name: z.string(), email: z.string() }),
+ output: user38Schema,
+ })
+ createUser38(name: string, email: string) {
+ return { id: 'new-38', name, email, createdAt: new Date() };
+ }
+
+ @Query({
+ input: z.object({ search: z.string().optional() }),
+ output: z.array(user38Schema),
+ })
+ listUsers38(search?: string) {
+ return [];
+ }
+}
diff --git a/packages/nestjs-trpc/cli/benches/fixtures/large-project/routers/user_39.router.ts b/packages/nestjs-trpc/cli/benches/fixtures/large-project/routers/user_39.router.ts
new file mode 100644
index 0000000..b6cfb1b
--- /dev/null
+++ b/packages/nestjs-trpc/cli/benches/fixtures/large-project/routers/user_39.router.ts
@@ -0,0 +1,41 @@
+import { Router, Query, Mutation } from 'nestjs-trpc';
+import { z } from 'zod';
+
+const user39Schema = z.object({
+ id: z.string(),
+ name: z.string(),
+ email: z.string().email(),
+ createdAt: z.date(),
+});
+
+@Router({ alias: 'users39' })
+export class User39Router {
+ @Query({
+ input: z.object({ id: z.string() }),
+ output: user39Schema,
+ })
+ getUser39(id: string) {
+ return {
+ id,
+ name: 'User 39',
+ email: 'user39@test.com',
+ createdAt: new Date(),
+ };
+ }
+
+ @Mutation({
+ input: z.object({ name: z.string(), email: z.string() }),
+ output: user39Schema,
+ })
+ createUser39(name: string, email: string) {
+ return { id: 'new-39', name, email, createdAt: new Date() };
+ }
+
+ @Query({
+ input: z.object({ search: z.string().optional() }),
+ output: z.array(user39Schema),
+ })
+ listUsers39(search?: string) {
+ return [];
+ }
+}
diff --git a/packages/nestjs-trpc/cli/benches/fixtures/large-project/routers/user_40.router.ts b/packages/nestjs-trpc/cli/benches/fixtures/large-project/routers/user_40.router.ts
new file mode 100644
index 0000000..67415f1
--- /dev/null
+++ b/packages/nestjs-trpc/cli/benches/fixtures/large-project/routers/user_40.router.ts
@@ -0,0 +1,41 @@
+import { Router, Query, Mutation } from 'nestjs-trpc';
+import { z } from 'zod';
+
+const user40Schema = z.object({
+ id: z.string(),
+ name: z.string(),
+ email: z.string().email(),
+ createdAt: z.date(),
+});
+
+@Router({ alias: 'users40' })
+export class User40Router {
+ @Query({
+ input: z.object({ id: z.string() }),
+ output: user40Schema,
+ })
+ getUser40(id: string) {
+ return {
+ id,
+ name: 'User 40',
+ email: 'user40@test.com',
+ createdAt: new Date(),
+ };
+ }
+
+ @Mutation({
+ input: z.object({ name: z.string(), email: z.string() }),
+ output: user40Schema,
+ })
+ createUser40(name: string, email: string) {
+ return { id: 'new-40', name, email, createdAt: new Date() };
+ }
+
+ @Query({
+ input: z.object({ search: z.string().optional() }),
+ output: z.array(user40Schema),
+ })
+ listUsers40(search?: string) {
+ return [];
+ }
+}
diff --git a/packages/nestjs-trpc/cli/benches/fixtures/large-project/routers/user_41.router.ts b/packages/nestjs-trpc/cli/benches/fixtures/large-project/routers/user_41.router.ts
new file mode 100644
index 0000000..e7901b8
--- /dev/null
+++ b/packages/nestjs-trpc/cli/benches/fixtures/large-project/routers/user_41.router.ts
@@ -0,0 +1,41 @@
+import { Router, Query, Mutation } from 'nestjs-trpc';
+import { z } from 'zod';
+
+const user41Schema = z.object({
+ id: z.string(),
+ name: z.string(),
+ email: z.string().email(),
+ createdAt: z.date(),
+});
+
+@Router({ alias: 'users41' })
+export class User41Router {
+ @Query({
+ input: z.object({ id: z.string() }),
+ output: user41Schema,
+ })
+ getUser41(id: string) {
+ return {
+ id,
+ name: 'User 41',
+ email: 'user41@test.com',
+ createdAt: new Date(),
+ };
+ }
+
+ @Mutation({
+ input: z.object({ name: z.string(), email: z.string() }),
+ output: user41Schema,
+ })
+ createUser41(name: string, email: string) {
+ return { id: 'new-41', name, email, createdAt: new Date() };
+ }
+
+ @Query({
+ input: z.object({ search: z.string().optional() }),
+ output: z.array(user41Schema),
+ })
+ listUsers41(search?: string) {
+ return [];
+ }
+}
diff --git a/packages/nestjs-trpc/cli/benches/fixtures/large-project/routers/user_42.router.ts b/packages/nestjs-trpc/cli/benches/fixtures/large-project/routers/user_42.router.ts
new file mode 100644
index 0000000..700a54c
--- /dev/null
+++ b/packages/nestjs-trpc/cli/benches/fixtures/large-project/routers/user_42.router.ts
@@ -0,0 +1,41 @@
+import { Router, Query, Mutation } from 'nestjs-trpc';
+import { z } from 'zod';
+
+const user42Schema = z.object({
+ id: z.string(),
+ name: z.string(),
+ email: z.string().email(),
+ createdAt: z.date(),
+});
+
+@Router({ alias: 'users42' })
+export class User42Router {
+ @Query({
+ input: z.object({ id: z.string() }),
+ output: user42Schema,
+ })
+ getUser42(id: string) {
+ return {
+ id,
+ name: 'User 42',
+ email: 'user42@test.com',
+ createdAt: new Date(),
+ };
+ }
+
+ @Mutation({
+ input: z.object({ name: z.string(), email: z.string() }),
+ output: user42Schema,
+ })
+ createUser42(name: string, email: string) {
+ return { id: 'new-42', name, email, createdAt: new Date() };
+ }
+
+ @Query({
+ input: z.object({ search: z.string().optional() }),
+ output: z.array(user42Schema),
+ })
+ listUsers42(search?: string) {
+ return [];
+ }
+}
diff --git a/packages/nestjs-trpc/cli/benches/fixtures/large-project/routers/user_43.router.ts b/packages/nestjs-trpc/cli/benches/fixtures/large-project/routers/user_43.router.ts
new file mode 100644
index 0000000..012e770
--- /dev/null
+++ b/packages/nestjs-trpc/cli/benches/fixtures/large-project/routers/user_43.router.ts
@@ -0,0 +1,41 @@
+import { Router, Query, Mutation } from 'nestjs-trpc';
+import { z } from 'zod';
+
+const user43Schema = z.object({
+ id: z.string(),
+ name: z.string(),
+ email: z.string().email(),
+ createdAt: z.date(),
+});
+
+@Router({ alias: 'users43' })
+export class User43Router {
+ @Query({
+ input: z.object({ id: z.string() }),
+ output: user43Schema,
+ })
+ getUser43(id: string) {
+ return {
+ id,
+ name: 'User 43',
+ email: 'user43@test.com',
+ createdAt: new Date(),
+ };
+ }
+
+ @Mutation({
+ input: z.object({ name: z.string(), email: z.string() }),
+ output: user43Schema,
+ })
+ createUser43(name: string, email: string) {
+ return { id: 'new-43', name, email, createdAt: new Date() };
+ }
+
+ @Query({
+ input: z.object({ search: z.string().optional() }),
+ output: z.array(user43Schema),
+ })
+ listUsers43(search?: string) {
+ return [];
+ }
+}
diff --git a/packages/nestjs-trpc/cli/benches/fixtures/large-project/routers/user_44.router.ts b/packages/nestjs-trpc/cli/benches/fixtures/large-project/routers/user_44.router.ts
new file mode 100644
index 0000000..2df2f19
--- /dev/null
+++ b/packages/nestjs-trpc/cli/benches/fixtures/large-project/routers/user_44.router.ts
@@ -0,0 +1,41 @@
+import { Router, Query, Mutation } from 'nestjs-trpc';
+import { z } from 'zod';
+
+const user44Schema = z.object({
+ id: z.string(),
+ name: z.string(),
+ email: z.string().email(),
+ createdAt: z.date(),
+});
+
+@Router({ alias: 'users44' })
+export class User44Router {
+ @Query({
+ input: z.object({ id: z.string() }),
+ output: user44Schema,
+ })
+ getUser44(id: string) {
+ return {
+ id,
+ name: 'User 44',
+ email: 'user44@test.com',
+ createdAt: new Date(),
+ };
+ }
+
+ @Mutation({
+ input: z.object({ name: z.string(), email: z.string() }),
+ output: user44Schema,
+ })
+ createUser44(name: string, email: string) {
+ return { id: 'new-44', name, email, createdAt: new Date() };
+ }
+
+ @Query({
+ input: z.object({ search: z.string().optional() }),
+ output: z.array(user44Schema),
+ })
+ listUsers44(search?: string) {
+ return [];
+ }
+}
diff --git a/packages/nestjs-trpc/cli/benches/fixtures/large-project/routers/user_45.router.ts b/packages/nestjs-trpc/cli/benches/fixtures/large-project/routers/user_45.router.ts
new file mode 100644
index 0000000..e738aae
--- /dev/null
+++ b/packages/nestjs-trpc/cli/benches/fixtures/large-project/routers/user_45.router.ts
@@ -0,0 +1,41 @@
+import { Router, Query, Mutation } from 'nestjs-trpc';
+import { z } from 'zod';
+
+const user45Schema = z.object({
+ id: z.string(),
+ name: z.string(),
+ email: z.string().email(),
+ createdAt: z.date(),
+});
+
+@Router({ alias: 'users45' })
+export class User45Router {
+ @Query({
+ input: z.object({ id: z.string() }),
+ output: user45Schema,
+ })
+ getUser45(id: string) {
+ return {
+ id,
+ name: 'User 45',
+ email: 'user45@test.com',
+ createdAt: new Date(),
+ };
+ }
+
+ @Mutation({
+ input: z.object({ name: z.string(), email: z.string() }),
+ output: user45Schema,
+ })
+ createUser45(name: string, email: string) {
+ return { id: 'new-45', name, email, createdAt: new Date() };
+ }
+
+ @Query({
+ input: z.object({ search: z.string().optional() }),
+ output: z.array(user45Schema),
+ })
+ listUsers45(search?: string) {
+ return [];
+ }
+}
diff --git a/packages/nestjs-trpc/cli/benches/fixtures/large-project/routers/user_46.router.ts b/packages/nestjs-trpc/cli/benches/fixtures/large-project/routers/user_46.router.ts
new file mode 100644
index 0000000..6ebfd26
--- /dev/null
+++ b/packages/nestjs-trpc/cli/benches/fixtures/large-project/routers/user_46.router.ts
@@ -0,0 +1,41 @@
+import { Router, Query, Mutation } from 'nestjs-trpc';
+import { z } from 'zod';
+
+const user46Schema = z.object({
+ id: z.string(),
+ name: z.string(),
+ email: z.string().email(),
+ createdAt: z.date(),
+});
+
+@Router({ alias: 'users46' })
+export class User46Router {
+ @Query({
+ input: z.object({ id: z.string() }),
+ output: user46Schema,
+ })
+ getUser46(id: string) {
+ return {
+ id,
+ name: 'User 46',
+ email: 'user46@test.com',
+ createdAt: new Date(),
+ };
+ }
+
+ @Mutation({
+ input: z.object({ name: z.string(), email: z.string() }),
+ output: user46Schema,
+ })
+ createUser46(name: string, email: string) {
+ return { id: 'new-46', name, email, createdAt: new Date() };
+ }
+
+ @Query({
+ input: z.object({ search: z.string().optional() }),
+ output: z.array(user46Schema),
+ })
+ listUsers46(search?: string) {
+ return [];
+ }
+}
diff --git a/packages/nestjs-trpc/cli/benches/fixtures/large-project/routers/user_47.router.ts b/packages/nestjs-trpc/cli/benches/fixtures/large-project/routers/user_47.router.ts
new file mode 100644
index 0000000..32ecd8a
--- /dev/null
+++ b/packages/nestjs-trpc/cli/benches/fixtures/large-project/routers/user_47.router.ts
@@ -0,0 +1,41 @@
+import { Router, Query, Mutation } from 'nestjs-trpc';
+import { z } from 'zod';
+
+const user47Schema = z.object({
+ id: z.string(),
+ name: z.string(),
+ email: z.string().email(),
+ createdAt: z.date(),
+});
+
+@Router({ alias: 'users47' })
+export class User47Router {
+ @Query({
+ input: z.object({ id: z.string() }),
+ output: user47Schema,
+ })
+ getUser47(id: string) {
+ return {
+ id,
+ name: 'User 47',
+ email: 'user47@test.com',
+ createdAt: new Date(),
+ };
+ }
+
+ @Mutation({
+ input: z.object({ name: z.string(), email: z.string() }),
+ output: user47Schema,
+ })
+ createUser47(name: string, email: string) {
+ return { id: 'new-47', name, email, createdAt: new Date() };
+ }
+
+ @Query({
+ input: z.object({ search: z.string().optional() }),
+ output: z.array(user47Schema),
+ })
+ listUsers47(search?: string) {
+ return [];
+ }
+}
diff --git a/packages/nestjs-trpc/cli/benches/fixtures/large-project/routers/user_48.router.ts b/packages/nestjs-trpc/cli/benches/fixtures/large-project/routers/user_48.router.ts
new file mode 100644
index 0000000..0542268
--- /dev/null
+++ b/packages/nestjs-trpc/cli/benches/fixtures/large-project/routers/user_48.router.ts
@@ -0,0 +1,41 @@
+import { Router, Query, Mutation } from 'nestjs-trpc';
+import { z } from 'zod';
+
+const user48Schema = z.object({
+ id: z.string(),
+ name: z.string(),
+ email: z.string().email(),
+ createdAt: z.date(),
+});
+
+@Router({ alias: 'users48' })
+export class User48Router {
+ @Query({
+ input: z.object({ id: z.string() }),
+ output: user48Schema,
+ })
+ getUser48(id: string) {
+ return {
+ id,
+ name: 'User 48',
+ email: 'user48@test.com',
+ createdAt: new Date(),
+ };
+ }
+
+ @Mutation({
+ input: z.object({ name: z.string(), email: z.string() }),
+ output: user48Schema,
+ })
+ createUser48(name: string, email: string) {
+ return { id: 'new-48', name, email, createdAt: new Date() };
+ }
+
+ @Query({
+ input: z.object({ search: z.string().optional() }),
+ output: z.array(user48Schema),
+ })
+ listUsers48(search?: string) {
+ return [];
+ }
+}
diff --git a/packages/nestjs-trpc/cli/benches/fixtures/large-project/routers/user_49.router.ts b/packages/nestjs-trpc/cli/benches/fixtures/large-project/routers/user_49.router.ts
new file mode 100644
index 0000000..84980aa
--- /dev/null
+++ b/packages/nestjs-trpc/cli/benches/fixtures/large-project/routers/user_49.router.ts
@@ -0,0 +1,41 @@
+import { Router, Query, Mutation } from 'nestjs-trpc';
+import { z } from 'zod';
+
+const user49Schema = z.object({
+ id: z.string(),
+ name: z.string(),
+ email: z.string().email(),
+ createdAt: z.date(),
+});
+
+@Router({ alias: 'users49' })
+export class User49Router {
+ @Query({
+ input: z.object({ id: z.string() }),
+ output: user49Schema,
+ })
+ getUser49(id: string) {
+ return {
+ id,
+ name: 'User 49',
+ email: 'user49@test.com',
+ createdAt: new Date(),
+ };
+ }
+
+ @Mutation({
+ input: z.object({ name: z.string(), email: z.string() }),
+ output: user49Schema,
+ })
+ createUser49(name: string, email: string) {
+ return { id: 'new-49', name, email, createdAt: new Date() };
+ }
+
+ @Query({
+ input: z.object({ search: z.string().optional() }),
+ output: z.array(user49Schema),
+ })
+ listUsers49(search?: string) {
+ return [];
+ }
+}
diff --git a/packages/nestjs-trpc/cli/benches/fixtures/large-project/routers/user_50.router.ts b/packages/nestjs-trpc/cli/benches/fixtures/large-project/routers/user_50.router.ts
new file mode 100644
index 0000000..2f1f2e2
--- /dev/null
+++ b/packages/nestjs-trpc/cli/benches/fixtures/large-project/routers/user_50.router.ts
@@ -0,0 +1,41 @@
+import { Router, Query, Mutation } from 'nestjs-trpc';
+import { z } from 'zod';
+
+const user50Schema = z.object({
+ id: z.string(),
+ name: z.string(),
+ email: z.string().email(),
+ createdAt: z.date(),
+});
+
+@Router({ alias: 'users50' })
+export class User50Router {
+ @Query({
+ input: z.object({ id: z.string() }),
+ output: user50Schema,
+ })
+ getUser50(id: string) {
+ return {
+ id,
+ name: 'User 50',
+ email: 'user50@test.com',
+ createdAt: new Date(),
+ };
+ }
+
+ @Mutation({
+ input: z.object({ name: z.string(), email: z.string() }),
+ output: user50Schema,
+ })
+ createUser50(name: string, email: string) {
+ return { id: 'new-50', name, email, createdAt: new Date() };
+ }
+
+ @Query({
+ input: z.object({ search: z.string().optional() }),
+ output: z.array(user50Schema),
+ })
+ listUsers50(search?: string) {
+ return [];
+ }
+}
diff --git a/packages/nestjs-trpc/cli/benches/parse_benchmark.rs b/packages/nestjs-trpc/cli/benches/parse_benchmark.rs
new file mode 100644
index 0000000..ef5d7ac
--- /dev/null
+++ b/packages/nestjs-trpc/cli/benches/parse_benchmark.rs
@@ -0,0 +1,84 @@
+#![allow(clippy::unwrap_used, clippy::expect_used)]
+
+use criterion::{black_box, criterion_group, criterion_main, Criterion};
+use nestjs_trpc::{parse_typescript_file, FileScanner, TsParser};
+use std::path::PathBuf;
+
+fn bench_fixtures_directory() -> PathBuf {
+ PathBuf::from(env!("CARGO_MANIFEST_DIR")).join("benches/fixtures")
+}
+
+fn test_fixtures_directory() -> PathBuf {
+ PathBuf::from(env!("CARGO_MANIFEST_DIR")).join("tests/fixtures")
+}
+
+fn bench_parse_single_router(criterion: &mut Criterion) {
+ let fixture = test_fixtures_directory().join("valid/simple-router/user.router.ts");
+
+ criterion.bench_function("parse_single_router", |bencher| {
+ bencher.iter(|| parse_typescript_file(black_box(&fixture)));
+ });
+}
+
+fn parse_all_files(parser: &TsParser, files: &[PathBuf]) {
+ for file in files {
+ let _ = parser.parse_file(black_box(file));
+ }
+}
+
+fn bench_parse_multiple_routers(criterion: &mut Criterion) {
+ let routers_directory = bench_fixtures_directory().join("large-project/routers");
+
+ let scanner = FileScanner::new(&routers_directory).expect("Scanner initialization failed");
+ let router_files = scanner.scan("*.router.ts").expect("Scan failed");
+
+ let files_10: Vec<_> = router_files.iter().take(10).cloned().collect();
+ let files_25: Vec<_> = router_files.iter().take(25).cloned().collect();
+ let files_50: Vec<_> = router_files.iter().take(50).cloned().collect();
+
+ let mut group = criterion.benchmark_group("parse_multiple_routers");
+
+ group.bench_function("10", |bencher| {
+ let parser = TsParser::new();
+ bencher.iter(|| parse_all_files(&parser, &files_10));
+ });
+
+ group.bench_function("25", |bencher| {
+ let parser = TsParser::new();
+ bencher.iter(|| parse_all_files(&parser, &files_25));
+ });
+
+ group.bench_function("50", |bencher| {
+ let parser = TsParser::new();
+ bencher.iter(|| parse_all_files(&parser, &files_50));
+ });
+
+ group.finish();
+}
+
+fn bench_parser_initialization(criterion: &mut Criterion) {
+ criterion.bench_function("parser_initialization", |bencher| {
+ bencher.iter(|| black_box(TsParser::new()));
+ });
+}
+
+fn bench_file_scanning(criterion: &mut Criterion) {
+ let routers_directory = bench_fixtures_directory().join("large-project/routers");
+
+ criterion.bench_function("file_scanning_50_files", |bencher| {
+ bencher.iter(|| {
+ let scanner = FileScanner::new(black_box(&routers_directory)).unwrap();
+ scanner.scan("*.router.ts")
+ });
+ });
+}
+
+criterion_group!(
+ benches,
+ bench_parse_single_router,
+ bench_parse_multiple_routers,
+ bench_parser_initialization,
+ bench_file_scanning,
+);
+
+criterion_main!(benches);
diff --git a/packages/nestjs-trpc/cli/clippy.toml b/packages/nestjs-trpc/cli/clippy.toml
new file mode 100644
index 0000000..4c9f2d6
--- /dev/null
+++ b/packages/nestjs-trpc/cli/clippy.toml
@@ -0,0 +1,14 @@
+# Clippy configuration for nestjs-trpc CLI
+# Enforces code quality guidelines from CLAUDE.md
+
+# Maximum lines per function (excluding blanks/comments)
+# Helps keep functions focused and testable
+too-many-lines-threshold = 100
+
+# Maximum nesting depth (per ARCH-04: max 2 levels)
+# Enforces early return pattern
+excessive-nesting-threshold = 3
+
+# Allow unwrap/expect in test code (unit tests with #[cfg(test)] and #[test])
+allow-unwrap-in-tests = true
+allow-expect-in-tests = true
diff --git a/packages/nestjs-trpc/cli/scripts/check-line-count.sh b/packages/nestjs-trpc/cli/scripts/check-line-count.sh
new file mode 100755
index 0000000..42d7f3e
--- /dev/null
+++ b/packages/nestjs-trpc/cli/scripts/check-line-count.sh
@@ -0,0 +1,44 @@
+#!/bin/bash
+# Check that Rust files don't exceed 300 lines of production code
+# Production code = total lines - test code - comments - blank lines
+# This is a warning-only check per project guidelines
+
+set -e
+
+MAX_LINES=300
+WARNINGS=0
+
+cd "$(dirname "$0")/.."
+
+echo "Checking Rust file sizes (limit: $MAX_LINES lines of production code)..."
+echo ""
+
+for file in $(find src -name "*.rs" -type f); do
+ # Count lines excluding:
+ # - #[cfg(test)] blocks and everything after
+ # - Lines that are only comments (// or /* */)
+ # - Blank lines
+ lines=$(awk '
+ /^[[:space:]]*#\[cfg\(test\)\]/ { in_test=1 }
+ /^[[:space:]]*mod tests/ { in_test=1 }
+ !in_test && !/^[[:space:]]*(\/\/|\/\*|\*|$)/ { count++ }
+ END { print count+0 }
+ ' "$file")
+
+ if [ "$lines" -gt "$MAX_LINES" ]; then
+ echo "WARNING: $file has ~$lines lines of production code (limit: $MAX_LINES)"
+ WARNINGS=$((WARNINGS + 1))
+ fi
+done
+
+echo ""
+
+if [ "$WARNINGS" -gt 0 ]; then
+ echo "$WARNINGS file(s) exceed the $MAX_LINES line limit."
+ echo "Consider splitting into focused submodules."
+ echo ""
+ # Exit 0 - this is a warning, not a failure
+ exit 0
+else
+ echo "All files within $MAX_LINES line limit."
+fi
diff --git a/packages/nestjs-trpc/cli/src/cli/generate.rs b/packages/nestjs-trpc/cli/src/cli/generate.rs
new file mode 100644
index 0000000..819dbab
--- /dev/null
+++ b/packages/nestjs-trpc/cli/src/cli/generate.rs
@@ -0,0 +1,308 @@
+use std::fs;
+use std::path::PathBuf;
+use std::process::ExitCode;
+
+use anyhow::{Context, Result};
+use console::style;
+use tracing::info;
+
+use nestjs_trpc::{compute_diff, discover_root_module, find_tsc, run_tsc_validation, DiffResult};
+
+use super::output::{DiffSummary, DryRunOutput, ValidationError};
+use super::{DEFAULT_OUTPUT_PATH, DEFAULT_ROUTER_PATTERN};
+
+const MAX_ERRORS_DISPLAYED: usize = 10;
+const EXIT_SUCCESS: u8 = 0;
+const EXIT_VALIDATION_ERROR: u8 = 1;
+
+pub fn run_generate(
+ entrypoint_override: Option<&str>,
+ output_override: Option<&str>,
+ router_pattern_override: Option<&str>,
+ dry_run: bool,
+ json_output: bool,
+) -> Result {
+ let current_directory = std::env::current_dir().context("Failed to get current directory")?;
+
+ let root_module_path = if let Some(entrypoint) = entrypoint_override {
+ let path = PathBuf::from(entrypoint);
+ if path.is_absolute() {
+ path
+ } else {
+ current_directory.join(path)
+ }
+ } else {
+ discover_root_module(¤t_directory).context(
+ "Failed to discover TRPCModule. Use --entrypoint to specify the module path.",
+ )?
+ };
+
+ info!(
+ root_module = %root_module_path.display(),
+ "Found root module"
+ );
+
+ let (output_path, router_pattern) =
+ build_generation_config(output_override, router_pattern_override)?;
+
+ let base_directory = root_module_path.parent().unwrap_or(¤t_directory);
+
+ if dry_run {
+ run_dry_run_generation(base_directory, &output_path, &router_pattern, json_output)
+ } else {
+ run_normal_generation(base_directory, &output_path, &router_pattern)
+ }
+}
+
+fn run_normal_generation(
+ base_directory: &std::path::Path,
+ output_path: &std::path::Path,
+ router_pattern: &str,
+) -> Result {
+ let generation_result =
+ nestjs_trpc::run_generation(base_directory, output_path, router_pattern)?;
+
+ print_summary(
+ output_path,
+ generation_result.router_count,
+ generation_result.procedure_count,
+ );
+ Ok(ExitCode::from(EXIT_SUCCESS))
+}
+
+fn run_dry_run_generation(
+ base_directory: &std::path::Path,
+ output_path: &std::path::Path,
+ router_pattern: &str,
+ json_output: bool,
+) -> Result {
+ let temp_directory = tempfile::tempdir().context("Failed to create temporary directory")?;
+ let temp_output_path = temp_directory.path().join("@generated");
+
+ let generation_result =
+ nestjs_trpc::run_generation(base_directory, &temp_output_path, router_pattern)?;
+
+ let generated_server_path = temp_output_path.join("server.ts");
+ let generated_content =
+ fs::read_to_string(&generated_server_path).context("Failed to read generated server.ts")?;
+
+ let existing_server_path = if output_path
+ .extension()
+ .is_some_and(|extension| extension == "ts" || extension == "tsx")
+ {
+ output_path.to_path_buf()
+ } else {
+ output_path.join("server.ts")
+ };
+ let existing_content = fs::read_to_string(&existing_server_path).ok();
+
+ let diff_result = compute_diff(existing_content.as_deref(), &generated_content, "server.ts");
+
+ let tsc_result = run_tsc_validation_if_available(base_directory, &temp_output_path);
+
+ let dry_run_output =
+ build_dry_run_output(&generation_result, &diff_result, tsc_result.as_ref());
+
+ let exit_code = if dry_run_output.success {
+ EXIT_SUCCESS
+ } else {
+ EXIT_VALIDATION_ERROR
+ };
+
+ if json_output {
+ println!("{}", dry_run_output.to_json());
+ } else {
+ print_dry_run_human_output(&dry_run_output, &diff_result);
+ }
+
+ Ok(ExitCode::from(exit_code))
+}
+
+fn run_tsc_validation_if_available(
+ base_directory: &std::path::Path,
+ temp_output_path: &std::path::Path,
+) -> Option {
+ let tsc_binary = find_tsc(base_directory)?;
+
+ let generated_tsconfig = temp_output_path.join("tsconfig.json");
+ if !generated_tsconfig.exists() {
+ return None;
+ }
+
+ info!(tsc = %tsc_binary.display(), "Running TypeScript validation");
+
+ run_tsc_validation(base_directory, &generated_tsconfig).ok()
+}
+
+fn build_dry_run_output(
+ generation_result: &nestjs_trpc::GenerationResult,
+ diff_result: &DiffResult,
+ tsc_result: Option<&nestjs_trpc::TscResult>,
+) -> DryRunOutput {
+ let validation_errors: Vec = tsc_result
+ .map(|result| {
+ result
+ .errors
+ .iter()
+ .map(|error| ValidationError {
+ file: error.file.clone(),
+ line: error.line,
+ column: error.column,
+ code: error.code.clone(),
+ message: error.message.clone(),
+ severity: format!("{:?}", error.severity).to_lowercase(),
+ })
+ .collect()
+ })
+ .unwrap_or_default();
+
+ let has_validation_errors =
+ !validation_errors.is_empty() && validation_errors.iter().any(|e| e.severity == "error");
+
+ DryRunOutput {
+ success: !has_validation_errors,
+ router_count: generation_result.router_count,
+ procedure_count: generation_result.procedure_count,
+ diff: Some(DiffSummary {
+ has_changes: diff_result.has_changes,
+ files_changed: usize::from(diff_result.has_changes),
+ lines_added: diff_result.lines_added,
+ lines_removed: diff_result.lines_removed,
+ }),
+ validation_errors,
+ parse_errors: vec![],
+ }
+}
+
+fn print_dry_run_human_output(output: &DryRunOutput, diff_result: &DiffResult) {
+ println!();
+
+ if output.success {
+ println!(
+ "{} Dry run completed successfully",
+ style("✓").green().bold()
+ );
+ } else {
+ println!("{} Dry run found issues", style("✗").red().bold());
+ }
+
+ println!();
+ println!(" Routers: {}", output.router_count);
+ println!(" Procedures: {}", output.procedure_count);
+ println!();
+
+ if let Some(diff_summary) = &output.diff {
+ print_diff_summary(diff_summary, diff_result);
+ }
+
+ if !output.validation_errors.is_empty() {
+ print_validation_errors(&output.validation_errors);
+ }
+}
+
+fn print_diff_summary(summary: &DiffSummary, diff_result: &DiffResult) {
+ if !summary.has_changes {
+ println!(" {} No changes detected", style("•").dim());
+ return;
+ }
+
+ println!(
+ " {} {} added, {} removed",
+ style("Changes:").bold(),
+ style(format!("+{}", summary.lines_added)).green(),
+ style(format!("-{}", summary.lines_removed)).red()
+ );
+ println!();
+
+ if !diff_result.unified_diff.is_empty() {
+ print_colored_diff(&diff_result.unified_diff);
+ }
+}
+
+fn print_colored_diff(unified_diff: &str) {
+ for line in unified_diff.lines() {
+ let styled_line = if line.starts_with('+') && !line.starts_with("+++") {
+ style(line).green().to_string()
+ } else if line.starts_with('-') && !line.starts_with("---") {
+ style(line).red().to_string()
+ } else if line.starts_with("@@") {
+ style(line).cyan().to_string()
+ } else {
+ line.to_string()
+ };
+ println!(" {styled_line}");
+ }
+ println!();
+}
+
+fn print_validation_errors(errors: &[ValidationError]) {
+ println!(" {} TypeScript Errors:", style("Validation").bold());
+ println!();
+
+ let errors_to_show = if errors.len() > MAX_ERRORS_DISPLAYED {
+ &errors[..MAX_ERRORS_DISPLAYED]
+ } else {
+ errors
+ };
+
+ for error in errors_to_show {
+ println!(
+ " {}:{}: {} {}",
+ style(&error.file).cyan(),
+ error.line,
+ style(&error.code).yellow(),
+ error.message
+ );
+ }
+
+ if errors.len() > MAX_ERRORS_DISPLAYED {
+ let remaining = errors.len() - MAX_ERRORS_DISPLAYED;
+ println!();
+ println!(
+ " {} ... and {} more error{}",
+ style("").dim(),
+ remaining,
+ if remaining == 1 { "" } else { "s" }
+ );
+ }
+
+ println!();
+}
+
+fn build_generation_config(
+ output_override: Option<&str>,
+ router_pattern_override: Option<&str>,
+) -> Result<(PathBuf, String)> {
+ let output_path = if let Some(output) = output_override {
+ if PathBuf::from(output).is_absolute() {
+ PathBuf::from(output)
+ } else {
+ std::env::current_dir()?.join(output)
+ }
+ } else {
+ std::env::current_dir()?.join(DEFAULT_OUTPUT_PATH)
+ };
+
+ let router_pattern =
+ router_pattern_override.map_or_else(|| DEFAULT_ROUTER_PATTERN.to_string(), String::from);
+
+ Ok((output_path, router_pattern))
+}
+
+fn print_summary(output_path: &std::path::Path, router_count: usize, procedure_count: usize) {
+ let server_path = if output_path
+ .extension()
+ .is_some_and(|extension| extension == "ts" || extension == "tsx")
+ {
+ output_path.to_path_buf()
+ } else {
+ output_path.join("server.ts")
+ };
+
+ println!("✓ Generated server.ts successfully!");
+ println!();
+ println!(" Output: {}", server_path.display());
+ println!(" Routers: {router_count}");
+ println!(" Procedures: {procedure_count}");
+ println!();
+}
diff --git a/packages/nestjs-trpc/cli/src/cli/mod.rs b/packages/nestjs-trpc/cli/src/cli/mod.rs
new file mode 100644
index 0000000..7d6b585
--- /dev/null
+++ b/packages/nestjs-trpc/cli/src/cli/mod.rs
@@ -0,0 +1,84 @@
+mod generate;
+mod output;
+mod watch;
+
+pub use generate::run_generate;
+pub use watch::run_watch;
+
+use clap::{Parser, Subcommand};
+
+pub const DEFAULT_ROUTER_PATTERN: &str = "**/*.router.ts";
+pub const DEFAULT_OUTPUT_PATH: &str = "./@generated";
+
+#[derive(Parser, Debug)]
+#[command(name = "nestjs-trpc")]
+#[command(author, version, about)]
+#[command(long_about = "A CLI tool that generates tRPC router definitions from \
+NestJS router classes decorated with @Router, @Query, and @Mutation.\n\n\
+Configuration is automatically extracted from TRPCModule.forRoot() in your NestJS module.")]
+#[command(after_help = "EXAMPLES:
+ nestjs-trpc generate Generate router types
+ nestjs-trpc generate --dry-run Validate without writing files
+ nestjs-trpc watch Watch mode for development
+
+Learn more: https://nestjs-trpc.io")]
+pub struct Cli {
+ #[command(subcommand)]
+ pub command: Option,
+
+ /// Increase verbosity (-v for info, -vv for debug, -vvv for trace)
+ #[arg(short, long, action = clap::ArgAction::Count, global = true, help_heading = "Verbosity")]
+ pub verbose: u8,
+
+ /// Enable full debug output with file locations for bug reports
+ #[arg(long, global = true, help_heading = "Verbosity")]
+ pub debug: bool,
+}
+
+#[derive(Subcommand, Debug)]
+pub enum Commands {
+ /// Generate tRPC router types from decorated TypeScript classes
+ #[command(after_help = "EXAMPLES:
+ nestjs-trpc generate
+ nestjs-trpc generate --entrypoint src/app.module.ts
+ nestjs-trpc generate --dry-run --json")]
+ Generate {
+ /// Path to `NestJS` module entry point (auto-discovered if not specified)
+ #[arg(short, long, value_name = "PATH", help_heading = "Input")]
+ entrypoint: Option,
+
+ /// Glob pattern to find router files
+ #[arg(short, long, value_name = "PATTERN", help_heading = "Input")]
+ router_pattern: Option,
+
+ /// Output directory for generated files
+ #[arg(short, long, value_name = "PATH", help_heading = "Output")]
+ output: Option,
+
+ /// Output results as JSON (useful for tooling integration)
+ #[arg(long, help_heading = "Output")]
+ json: bool,
+
+ /// Validate and show what would be generated without writing files
+ #[arg(long, help_heading = "Validation")]
+ dry_run: bool,
+ },
+ /// Watch for file changes and regenerate router types automatically
+ #[command(after_help = "EXAMPLES:
+ nestjs-trpc watch
+ nestjs-trpc watch --entrypoint src/app.module.ts
+ nestjs-trpc watch -v")]
+ Watch {
+ /// Path to `NestJS` module entry point (auto-discovered if not specified)
+ #[arg(short, long, value_name = "PATH", help_heading = "Input")]
+ entrypoint: Option,
+
+ /// Glob pattern to find router files
+ #[arg(short, long, value_name = "PATTERN", help_heading = "Input")]
+ router_pattern: Option,
+
+ /// Output directory for generated files
+ #[arg(short, long, value_name = "PATH", help_heading = "Output")]
+ output: Option,
+ },
+}
diff --git a/packages/nestjs-trpc/cli/src/cli/output.rs b/packages/nestjs-trpc/cli/src/cli/output.rs
new file mode 100644
index 0000000..543e9cf
--- /dev/null
+++ b/packages/nestjs-trpc/cli/src/cli/output.rs
@@ -0,0 +1,150 @@
+use serde::Serialize;
+
+#[derive(Debug, Serialize)]
+#[serde(rename_all = "camelCase")]
+pub struct DryRunOutput {
+ pub success: bool,
+ pub router_count: usize,
+ pub procedure_count: usize,
+ #[serde(skip_serializing_if = "Option::is_none")]
+ pub diff: Option,
+ #[serde(skip_serializing_if = "Vec::is_empty")]
+ pub validation_errors: Vec,
+ #[serde(skip_serializing_if = "Vec::is_empty")]
+ pub parse_errors: Vec,
+}
+
+#[derive(Debug, Serialize)]
+#[serde(rename_all = "camelCase")]
+pub struct DiffSummary {
+ pub has_changes: bool,
+ pub files_changed: usize,
+ pub lines_added: usize,
+ pub lines_removed: usize,
+}
+
+#[derive(Debug, Serialize)]
+#[serde(rename_all = "camelCase")]
+pub struct ValidationError {
+ pub file: String,
+ pub line: usize,
+ pub column: usize,
+ pub code: String,
+ pub message: String,
+ pub severity: String,
+}
+
+#[derive(Debug, Serialize)]
+#[serde(rename_all = "camelCase")]
+pub struct ParseError {
+ pub file: String,
+ #[serde(skip_serializing_if = "Option::is_none")]
+ pub line: Option,
+ pub message: String,
+}
+
+#[allow(clippy::expect_used)]
+impl DryRunOutput {
+ pub fn to_json(&self) -> String {
+ // SAFETY: DryRunOutput contains only strings, numbers, and booleans - serde_json serialization is infallible for these types
+ serde_json::to_string_pretty(self).expect("Serialization should not fail")
+ }
+
+ #[allow(dead_code)] // API method for future compact JSON output
+ pub fn to_json_compact(&self) -> String {
+ // SAFETY: DryRunOutput contains only strings, numbers, and booleans - serde_json serialization is infallible for these types
+ serde_json::to_string(self).expect("Serialization should not fail")
+ }
+}
+
+#[cfg(test)]
+mod tests {
+ use super::*;
+
+ #[test]
+ fn serializes_minimal_output() {
+ let output = DryRunOutput {
+ success: true,
+ router_count: 2,
+ procedure_count: 5,
+ diff: None,
+ validation_errors: vec![],
+ parse_errors: vec![],
+ };
+
+ let json = output.to_json();
+ assert!(json.contains("\"success\": true"));
+ assert!(json.contains("\"routerCount\": 2"));
+ assert!(json.contains("\"procedureCount\": 5"));
+ assert!(!json.contains("diff"));
+ assert!(!json.contains("validationErrors"));
+ assert!(!json.contains("parseErrors"));
+ }
+
+ #[test]
+ fn serializes_with_diff() {
+ let output = DryRunOutput {
+ success: true,
+ router_count: 1,
+ procedure_count: 2,
+ diff: Some(DiffSummary {
+ has_changes: true,
+ files_changed: 1,
+ lines_added: 10,
+ lines_removed: 5,
+ }),
+ validation_errors: vec![],
+ parse_errors: vec![],
+ };
+
+ let json = output.to_json();
+ assert!(json.contains("\"hasChanges\": true"));
+ assert!(json.contains("\"filesChanged\": 1"));
+ assert!(json.contains("\"linesAdded\": 10"));
+ assert!(json.contains("\"linesRemoved\": 5"));
+ }
+
+ #[test]
+ fn serializes_with_errors() {
+ let output = DryRunOutput {
+ success: false,
+ router_count: 0,
+ procedure_count: 0,
+ diff: None,
+ validation_errors: vec![ValidationError {
+ file: "src/app.ts".to_string(),
+ line: 10,
+ column: 5,
+ code: "TS2322".to_string(),
+ message: "Type error".to_string(),
+ severity: "error".to_string(),
+ }],
+ parse_errors: vec![ParseError {
+ file: "src/broken.ts".to_string(),
+ line: Some(3),
+ message: "Unexpected token".to_string(),
+ }],
+ };
+
+ let json = output.to_json();
+ assert!(json.contains("\"validationErrors\""));
+ assert!(json.contains("\"parseErrors\""));
+ assert!(json.contains("TS2322"));
+ }
+
+ #[test]
+ fn compact_json_has_no_whitespace() {
+ let output = DryRunOutput {
+ success: true,
+ router_count: 1,
+ procedure_count: 1,
+ diff: None,
+ validation_errors: vec![],
+ parse_errors: vec![],
+ };
+
+ let compact = output.to_json_compact();
+ assert!(!compact.contains('\n'));
+ assert!(!compact.contains(" "));
+ }
+}
diff --git a/packages/nestjs-trpc/cli/src/cli/watch.rs b/packages/nestjs-trpc/cli/src/cli/watch.rs
new file mode 100644
index 0000000..2019cae
--- /dev/null
+++ b/packages/nestjs-trpc/cli/src/cli/watch.rs
@@ -0,0 +1,69 @@
+use std::path::{Path, PathBuf};
+
+use anyhow::{Context, Result};
+use tracing::{debug, info};
+
+use nestjs_trpc::{discover_root_module, WatchConfig, WatchSession};
+
+use super::{DEFAULT_OUTPUT_PATH, DEFAULT_ROUTER_PATTERN};
+
+pub fn run_watch(
+ entrypoint_override: Option<&str>,
+ output_override: Option<&str>,
+ router_pattern_override: Option<&str>,
+ verbose: bool,
+) -> Result<()> {
+ let current_directory = std::env::current_dir().context("Failed to get current directory")?;
+
+ let root_module_path = if let Some(entrypoint) = entrypoint_override {
+ let path = PathBuf::from(entrypoint);
+ if path.is_absolute() {
+ path
+ } else {
+ current_directory.join(path)
+ }
+ } else {
+ discover_root_module(¤t_directory).context(
+ "Failed to discover TRPCModule. Use --entrypoint to specify the module path.",
+ )?
+ };
+
+ info!(
+ root_module = %root_module_path.display(),
+ "Found root module"
+ );
+
+ let output_path = resolve_output_path(output_override, ¤t_directory);
+
+ let router_pattern =
+ router_pattern_override.map_or_else(|| DEFAULT_ROUTER_PATTERN.to_string(), String::from);
+
+ let base_directory = root_module_path.parent().unwrap_or(¤t_directory);
+
+ debug!(
+ output_path = %output_path.display(),
+ router_pattern = %router_pattern,
+ base_directory = %base_directory.display(),
+ "Using watch configuration"
+ );
+
+ let config = WatchConfig::new(router_pattern, output_path, base_directory.to_path_buf())
+ .with_debounce_milliseconds(300)
+ .with_verbose(verbose);
+
+ let session = WatchSession::new(config)?;
+ session.run()
+}
+
+fn resolve_output_path(output_override: Option<&str>, current_directory: &Path) -> PathBuf {
+ let Some(output) = output_override else {
+ return current_directory.join(DEFAULT_OUTPUT_PATH);
+ };
+
+ let path = PathBuf::from(output);
+ if path.is_absolute() {
+ path
+ } else {
+ current_directory.join(output)
+ }
+}
diff --git a/packages/nestjs-trpc/cli/src/config.rs b/packages/nestjs-trpc/cli/src/config.rs
new file mode 100644
index 0000000..8f5503a
--- /dev/null
+++ b/packages/nestjs-trpc/cli/src/config.rs
@@ -0,0 +1,489 @@
+use std::fs;
+use std::path::{Path, PathBuf};
+
+use swc_ecma_ast::{
+ ExportDefaultExpr, Expr, ExprOrSpread, Lit, ModuleDecl, ModuleItem, ObjectLit, Prop, PropName,
+ PropOrSpread,
+};
+use tracing::trace;
+
+use crate::error::ConfigError;
+use crate::parser::TsParser;
+
+const DEFAULT_OUTPUT_PATH: &str = "./src/@generated";
+const DEFAULT_ROUTER_PATTERN: &str = "src/**/*.router.ts";
+const DEFAULT_ROOT_MODULE: &str = "src/app.module.ts";
+
+#[derive(Debug, Clone, Default)]
+pub struct Config {
+ pub generation: GenerationConfig,
+ pub parsing: ParsingConfig,
+}
+
+#[derive(Debug, Clone)]
+pub struct GenerationConfig {
+ pub output_path: PathBuf,
+ pub router_pattern: String,
+ pub root_module: PathBuf,
+}
+
+#[derive(Debug, Clone)]
+pub struct ParsingConfig {
+ pub decorators: bool,
+}
+
+impl Default for GenerationConfig {
+ fn default() -> Self {
+ Self {
+ output_path: PathBuf::from(DEFAULT_OUTPUT_PATH),
+ router_pattern: DEFAULT_ROUTER_PATTERN.to_string(),
+ root_module: PathBuf::from(DEFAULT_ROOT_MODULE),
+ }
+ }
+}
+
+impl Default for ParsingConfig {
+ fn default() -> Self {
+ Self { decorators: true }
+ }
+}
+
+impl Config {
+ pub fn load>(path: P) -> Result {
+ let path = path.as_ref();
+
+ if !path.exists() {
+ return Err(ConfigError::NotFound {
+ path: path.to_path_buf(),
+ });
+ }
+
+ let contents = fs::read_to_string(path).map_err(|source| ConfigError::ReadFailed {
+ path: path.to_path_buf(),
+ source,
+ })?;
+
+ trace!(content_length = contents.len(), "Read configuration file");
+
+ Self::parse(&contents, path)
+ }
+
+ pub fn parse>(ts_source: &str, path: P) -> Result {
+ let path = path.as_ref();
+ let parser = TsParser::new();
+
+ let parsed =
+ parser
+ .parse_source(path, ts_source)
+ .map_err(|e| ConfigError::InvalidSyntax {
+ path: path.to_path_buf(),
+ message: format!("Failed to parse TypeScript: {e}"),
+ })?;
+
+ let config_obj = Self::extract_default_export(&parsed.module.body, path)?;
+ Self::parse_config_object(config_obj, path)
+ }
+
+ fn extract_default_export<'a>(
+ body: &'a [ModuleItem],
+ path: &Path,
+ ) -> Result<&'a ObjectLit, ConfigError> {
+ let default_export = body.iter().find_map(Self::find_default_export_expression);
+
+ let Some(expression) = default_export else {
+ return Err(ConfigError::InvalidSyntax {
+ path: path.to_path_buf(),
+ message: "No default export found in config file".to_string(),
+ });
+ };
+
+ Self::extract_object_from_expression(expression, path)
+ }
+
+ fn find_default_export_expression(item: &ModuleItem) -> Option<&Expr> {
+ let ModuleItem::ModuleDecl(ModuleDecl::ExportDefaultExpr(ExportDefaultExpr {
+ expr, ..
+ })) = item
+ else {
+ return None;
+ };
+
+ Some(expr)
+ }
+
+ fn extract_object_from_expression<'a>(
+ expression: &'a Expr,
+ path: &Path,
+ ) -> Result<&'a ObjectLit, ConfigError> {
+ match expression {
+ Expr::Object(object) => Ok(object),
+ Expr::Call(call) => Self::extract_object_from_define_config_call(call, path),
+ _ => Err(ConfigError::InvalidSyntax {
+ path: path.to_path_buf(),
+ message: "Default export must be an object literal or defineConfig call"
+ .to_string(),
+ }),
+ }
+ }
+
+ fn extract_object_from_define_config_call<'a>(
+ call: &'a swc_ecma_ast::CallExpr,
+ path: &Path,
+ ) -> Result<&'a ObjectLit, ConfigError> {
+ let Some(ExprOrSpread { spread: None, expr }) = call.args.first() else {
+ return Err(Self::invalid_define_config_error(path));
+ };
+
+ let Expr::Object(object) = &**expr else {
+ return Err(Self::invalid_define_config_error(path));
+ };
+
+ Ok(object)
+ }
+
+ fn invalid_define_config_error(path: &Path) -> ConfigError {
+ ConfigError::InvalidSyntax {
+ path: path.to_path_buf(),
+ message:
+ "Default export must be an object literal or defineConfig call with object literal"
+ .to_string(),
+ }
+ }
+
+ fn parse_config_object(object: &ObjectLit, path: &Path) -> Result {
+ let mut config = Self::default();
+
+ for (key, value) in Self::iterate_key_value_properties(object) {
+ Self::apply_config_field(&mut config, &key, value, path)?;
+ }
+
+ Ok(config)
+ }
+
+ fn apply_config_field(
+ config: &mut Self,
+ key: &str,
+ value: &Expr,
+ path: &Path,
+ ) -> Result<(), ConfigError> {
+ match key {
+ "generation" => Self::apply_generation_section(config, value, path),
+ "parsing" => Self::apply_parsing_section(config, value, path),
+ _ => Err(ConfigError::InvalidSyntax {
+ path: path.to_path_buf(),
+ message: format!("Unknown field: {key}"),
+ }),
+ }
+ }
+
+ fn apply_generation_section(
+ config: &mut Self,
+ value: &Expr,
+ path: &Path,
+ ) -> Result<(), ConfigError> {
+ let Expr::Object(generation_object) = value else {
+ return Ok(());
+ };
+ config.generation = Self::parse_generation_config(generation_object, path)?;
+ Ok(())
+ }
+
+ fn apply_parsing_section(
+ config: &mut Self,
+ value: &Expr,
+ path: &Path,
+ ) -> Result<(), ConfigError> {
+ let Expr::Object(parsing_object) = value else {
+ return Ok(());
+ };
+ config.parsing = Self::parse_parsing_config(parsing_object, path)?;
+ Ok(())
+ }
+
+ fn parse_generation_config(
+ object: &ObjectLit,
+ path: &Path,
+ ) -> Result {
+ let mut config = GenerationConfig::default();
+
+ for (key, value) in Self::iterate_key_value_properties(object) {
+ Self::apply_generation_field(&mut config, &key, value, path)?;
+ }
+
+ Ok(config)
+ }
+
+ fn apply_generation_field(
+ config: &mut GenerationConfig,
+ key: &str,
+ value: &Expr,
+ path: &Path,
+ ) -> Result<(), ConfigError> {
+ match key {
+ "outputPath" => Self::set_output_path(config, value),
+ "routerPattern" => Self::set_router_pattern(config, value),
+ "rootModule" => Self::set_root_module(config, value),
+ _ => {
+ return Err(ConfigError::InvalidSyntax {
+ path: path.to_path_buf(),
+ message: format!("Unknown generation field: {key}"),
+ });
+ }
+ }
+ Ok(())
+ }
+
+ fn set_output_path(config: &mut GenerationConfig, value: &Expr) {
+ if let Some(string_value) = Self::extract_string_literal(value) {
+ config.output_path = PathBuf::from(string_value);
+ }
+ }
+
+ fn set_router_pattern(config: &mut GenerationConfig, value: &Expr) {
+ if let Some(string_value) = Self::extract_string_literal(value) {
+ config.router_pattern = string_value;
+ }
+ }
+
+ fn set_root_module(config: &mut GenerationConfig, value: &Expr) {
+ if let Some(string_value) = Self::extract_string_literal(value) {
+ config.root_module = PathBuf::from(string_value);
+ }
+ }
+
+ fn parse_parsing_config(object: &ObjectLit, path: &Path) -> Result {
+ let mut config = ParsingConfig::default();
+
+ for (key, value) in Self::iterate_key_value_properties(object) {
+ Self::apply_parsing_field(&mut config, &key, value, path)?;
+ }
+
+ Ok(config)
+ }
+
+ fn apply_parsing_field(
+ config: &mut ParsingConfig,
+ key: &str,
+ value: &Expr,
+ path: &Path,
+ ) -> Result<(), ConfigError> {
+ match key {
+ "decorators" => Self::set_decorators(config, value),
+ _ => {
+ return Err(ConfigError::InvalidSyntax {
+ path: path.to_path_buf(),
+ message: format!("Unknown parsing field: {key}"),
+ });
+ }
+ }
+ Ok(())
+ }
+
+ fn set_decorators(config: &mut ParsingConfig, value: &Expr) {
+ if let Expr::Lit(Lit::Bool(boolean)) = value {
+ config.decorators = boolean.value;
+ }
+ }
+
+ fn iterate_key_value_properties(object: &ObjectLit) -> impl Iterator- {
+ object.props.iter().filter_map(Self::extract_key_value_pair)
+ }
+
+ fn extract_key_value_pair(property_or_spread: &PropOrSpread) -> Option<(String, &Expr)> {
+ let PropOrSpread::Prop(property) = property_or_spread else {
+ return None;
+ };
+ let Prop::KeyValue(key_value) = &**property else {
+ return None;
+ };
+ let key = Self::extract_property_key(&key_value.key)?;
+ Some((key, &key_value.value))
+ }
+
+ fn extract_property_key(property_name: &PropName) -> Option
{
+ match property_name {
+ PropName::Ident(identifier) => Some(identifier.sym.to_string()),
+ PropName::Str(string) => Some(string.value.to_string_lossy().into_owned()),
+ _ => None,
+ }
+ }
+
+ fn extract_string_literal(expression: &Expr) -> Option {
+ let Expr::Lit(Lit::Str(string_literal)) = expression else {
+ return None;
+ };
+ Some(string_literal.value.to_string_lossy().into_owned())
+ }
+
+ #[must_use]
+ pub fn with_output_path(mut self, output_path: PathBuf) -> Self {
+ self.generation.output_path = output_path;
+ self
+ }
+
+ #[must_use]
+ pub fn resolve_paths>(mut self, base: P) -> Self {
+ let base = base.as_ref();
+
+ if self.generation.output_path.is_relative() {
+ self.generation.output_path = base.join(&self.generation.output_path);
+ }
+
+ if self.generation.root_module.is_relative() {
+ self.generation.root_module = base.join(&self.generation.root_module);
+ }
+
+ self
+ }
+}
+
+#[cfg(test)]
+mod tests {
+ use super::*;
+
+ #[test]
+ fn test_parse_full_config() {
+ let ts = r"
+export default {
+ generation: {
+ outputPath: './dist/generated',
+ routerPattern: 'lib/**/*.router.ts',
+ rootModule: 'lib/app.module.ts'
+ },
+ parsing: {
+ decorators: true
+ }
+}
+";
+
+ let config = Config::parse(ts, "test.config.ts").expect("Failed to parse config");
+
+ assert_eq!(
+ config.generation.output_path,
+ PathBuf::from("./dist/generated")
+ );
+ assert_eq!(config.generation.router_pattern, "lib/**/*.router.ts");
+ assert_eq!(
+ config.generation.root_module,
+ PathBuf::from("lib/app.module.ts")
+ );
+ assert!(config.parsing.decorators);
+ }
+
+ #[test]
+ fn test_parse_minimal_config() {
+ let ts = r"
+export default {
+ generation: {
+ outputPath: './output'
+ }
+}
+";
+
+ let config = Config::parse(ts, "test.config.ts").expect("Failed to parse config");
+
+ assert_eq!(config.generation.output_path, PathBuf::from("./output"));
+ assert_eq!(config.generation.router_pattern, "src/**/*.router.ts");
+ assert_eq!(
+ config.generation.root_module,
+ PathBuf::from("src/app.module.ts")
+ );
+ assert!(config.parsing.decorators);
+ }
+
+ #[test]
+ fn test_parse_empty_config() {
+ let ts = "export default {}";
+
+ let config = Config::parse(ts, "test.config.ts").expect("Failed to parse empty config");
+
+ assert_eq!(
+ config.generation.output_path,
+ PathBuf::from("./src/@generated")
+ );
+ assert_eq!(config.generation.router_pattern, "src/**/*.router.ts");
+ assert_eq!(
+ config.generation.root_module,
+ PathBuf::from("src/app.module.ts")
+ );
+ assert!(config.parsing.decorators);
+ }
+
+ #[test]
+ fn test_parse_decorators_false() {
+ let ts = r"
+export default {
+ parsing: {
+ decorators: false
+ }
+}
+";
+
+ let config = Config::parse(ts, "test.config.ts").expect("Failed to parse config");
+
+ assert!(!config.parsing.decorators);
+ }
+
+ #[test]
+ fn test_parse_invalid_syntax() {
+ let ts = "export default { invalid typescript";
+
+ let result = Config::parse(ts, "test.config.ts");
+ assert!(result.is_err());
+ }
+
+ #[test]
+ fn test_parse_no_default_export() {
+ let ts = "const config = {}";
+
+ let result = Config::parse(ts, "test.config.ts");
+ assert!(result.is_err());
+
+ let err = result.unwrap_err();
+ match err {
+ ConfigError::InvalidSyntax { message, .. } => {
+ assert!(message.contains("No default export"));
+ }
+ _ => panic!("Expected InvalidSyntax error"),
+ }
+ }
+
+ #[test]
+ fn test_parse_unknown_field() {
+ let ts = r"
+export default {
+ generation: {
+ outputPath: './output',
+ unknownField: 'should fail'
+ }
+}
+";
+
+ let result = Config::parse(ts, "test.config.ts");
+ assert!(result.is_err());
+
+ let err = result.unwrap_err();
+ match err {
+ ConfigError::InvalidSyntax { message, .. } => {
+ assert!(message.contains("Unknown generation field"));
+ }
+ _ => panic!("Expected InvalidSyntax error for unknown field"),
+ }
+ }
+
+ #[test]
+ fn test_default_config() {
+ let config = Config::default();
+
+ assert_eq!(
+ config.generation.output_path,
+ PathBuf::from("./src/@generated")
+ );
+ assert_eq!(config.generation.router_pattern, "src/**/*.router.ts");
+ assert_eq!(
+ config.generation.root_module,
+ PathBuf::from("src/app.module.ts")
+ );
+ assert!(config.parsing.decorators);
+ }
+}
diff --git a/packages/nestjs-trpc/cli/src/diagnostic.rs b/packages/nestjs-trpc/cli/src/diagnostic.rs
new file mode 100644
index 0000000..9a7a230
--- /dev/null
+++ b/packages/nestjs-trpc/cli/src/diagnostic.rs
@@ -0,0 +1,305 @@
+use miette::{Diagnostic, NamedSource, SourceSpan};
+use std::path::{Path, PathBuf};
+use thiserror::Error;
+
+/// Context for displaying source code in error messages.
+/// Used internally to create diagnostic errors with source snippets.
+pub struct SourceContext {
+ pub src: NamedSource,
+ pub span: SourceSpan,
+}
+
+impl SourceContext {
+ /// Creates a new source context from file content and byte offset.
+ #[must_use]
+ pub fn from_file(path: &Path, content: &str, offset: usize, length: usize) -> Self {
+ Self {
+ src: NamedSource::new(path.display().to_string(), content.to_string()),
+ span: SourceSpan::new(offset.into(), length),
+ }
+ }
+
+ /// Calculates byte offset from line and column numbers (1-indexed).
+ #[must_use]
+ pub fn line_column_to_offset(content: &str, line: usize, column: usize) -> usize {
+ let line_start = find_line_start_offset(content, line);
+ let column_offset = column.saturating_sub(1);
+ line_start + column_offset
+ }
+}
+
+fn find_line_start_offset(content: &str, target_line: usize) -> usize {
+ let mut current_line = 1;
+ let mut offset = 0;
+
+ for (index, character) in content.char_indices() {
+ if current_line == target_line {
+ return offset;
+ }
+ if character == '\n' {
+ current_line += 1;
+ }
+ offset = index + character.len_utf8();
+ }
+
+ offset
+}
+
+/// Diagnostic error for TypeScript syntax errors with source code context.
+#[derive(Error, Debug, Diagnostic)]
+#[error("{message}")]
+#[diagnostic(
+ code(nestjs_trpc::syntax_error),
+ help("Check for missing semicolons, brackets, or invalid syntax")
+)]
+pub struct SyntaxDiagnostic {
+ pub message: String,
+
+ #[source_code]
+ src: NamedSource,
+
+ #[label("error here")]
+ span: SourceSpan,
+}
+
+impl SyntaxDiagnostic {
+ /// Creates a syntax diagnostic from error details.
+ #[must_use]
+ pub fn new(path: &Path, content: &str, line: usize, column: usize, message: String) -> Self {
+ let offset = SourceContext::line_column_to_offset(content, line, column);
+ let error_length = find_error_length(content, offset);
+
+ Self {
+ message,
+ src: NamedSource::new(path.display().to_string(), content.to_string()),
+ span: SourceSpan::new(offset.into(), error_length),
+ }
+ }
+}
+
+/// Diagnostic error for invalid decorator usage.
+#[derive(Error, Debug, Diagnostic)]
+#[error("Invalid @{decorator} decorator")]
+#[diagnostic(
+ code(nestjs_trpc::invalid_decorator),
+ help("Decorators must be @Router, @Query, or @Mutation with valid arguments")
+)]
+pub struct DecoratorDiagnostic {
+ pub decorator: String,
+
+ #[source_code]
+ src: NamedSource,
+
+ #[label("invalid decorator here")]
+ span: SourceSpan,
+}
+
+impl DecoratorDiagnostic {
+ /// Creates a decorator diagnostic from error details.
+ #[must_use]
+ pub fn new(
+ path: &Path,
+ content: &str,
+ decorator: String,
+ offset: usize,
+ length: usize,
+ ) -> Self {
+ Self {
+ decorator,
+ src: NamedSource::new(path.display().to_string(), content.to_string()),
+ span: SourceSpan::new(offset.into(), length),
+ }
+ }
+}
+
+/// Diagnostic error for unresolved imports.
+#[derive(Error, Debug, Diagnostic)]
+#[error("Cannot resolve import '{name}'")]
+#[diagnostic(
+ code(nestjs_trpc::unresolved_import),
+ help("Check that the module exists and the import path is correct")
+)]
+pub struct ImportDiagnostic {
+ pub name: String,
+
+ #[source_code]
+ src: NamedSource,
+
+ #[label("unresolved import")]
+ span: SourceSpan,
+}
+
+impl ImportDiagnostic {
+ /// Creates an import diagnostic from error details.
+ #[must_use]
+ pub fn new(path: &Path, content: &str, name: String, offset: usize, length: usize) -> Self {
+ Self {
+ name,
+ src: NamedSource::new(path.display().to_string(), content.to_string()),
+ span: SourceSpan::new(offset.into(), length),
+ }
+ }
+}
+
+/// Diagnostic error for missing @Router decorator.
+#[derive(Error, Debug, Diagnostic)]
+#[error("No @Router decorated classes found")]
+#[diagnostic(
+ code(nestjs_trpc::no_routers),
+ help("Ensure your router classes are decorated with @Router from 'nestjs-trpc'")
+)]
+pub struct NoRoutersDiagnostic {
+ pub searched_files: Vec,
+}
+
+/// Diagnostic error for schema resolution failures.
+#[derive(Error, Debug, Diagnostic)]
+#[error("Cannot resolve schema '{name}'")]
+#[diagnostic(
+ code(nestjs_trpc::unresolved_schema),
+ help("Ensure the schema variable is defined and exported")
+)]
+pub struct SchemaDiagnostic {
+ pub name: String,
+
+ #[source_code]
+ src: NamedSource,
+
+ #[label("schema reference")]
+ span: SourceSpan,
+}
+
+impl SchemaDiagnostic {
+ /// Creates a schema diagnostic from error details.
+ #[must_use]
+ pub fn new(path: &Path, content: &str, name: String, offset: usize, length: usize) -> Self {
+ Self {
+ name,
+ src: NamedSource::new(path.display().to_string(), content.to_string()),
+ span: SourceSpan::new(offset.into(), length),
+ }
+ }
+}
+
+/// Finds a reasonable error length for highlighting.
+/// Tries to highlight the token at the error position.
+fn find_error_length(content: &str, offset: usize) -> usize {
+ if offset >= content.len() {
+ return 1;
+ }
+
+ let remaining = &content[offset..];
+ let mut length = 0;
+
+ for character in remaining.chars() {
+ if character.is_whitespace() || character == ';' || character == ',' {
+ break;
+ }
+ length += character.len_utf8();
+ if length >= 20 {
+ break;
+ }
+ }
+
+ length.max(1)
+}
+
+#[cfg(test)]
+mod tests {
+ use super::*;
+
+ #[test]
+ fn test_line_column_to_offset_first_line() {
+ let content = "const x = 1;";
+ let offset = SourceContext::line_column_to_offset(content, 1, 7);
+ assert_eq!(offset, 6);
+ }
+
+ #[test]
+ fn test_line_column_to_offset_second_line() {
+ let content = "line one\nline two";
+ let offset = SourceContext::line_column_to_offset(content, 2, 1);
+ assert_eq!(offset, 9);
+ }
+
+ #[test]
+ fn test_line_column_to_offset_middle_of_line() {
+ let content = "first\nsecond\nthird";
+ let offset = SourceContext::line_column_to_offset(content, 2, 4);
+ assert_eq!(offset, 9);
+ }
+
+ #[test]
+ fn test_find_error_length_word() {
+ let content = "const invalid here";
+ let length = find_error_length(content, 6);
+ assert_eq!(length, 7);
+ }
+
+ #[test]
+ fn test_find_error_length_at_end() {
+ let content = "const";
+ let length = find_error_length(content, 0);
+ assert_eq!(length, 5);
+ }
+
+ #[test]
+ fn test_syntax_diagnostic_creation() {
+ let diagnostic = SyntaxDiagnostic::new(
+ Path::new("test.ts"),
+ "const x = {{\n",
+ 1,
+ 11,
+ "Unexpected token".to_string(),
+ );
+
+ assert_eq!(diagnostic.message, "Unexpected token");
+ }
+
+ #[test]
+ fn test_source_context_from_file() {
+ let context = SourceContext::from_file(Path::new("test.ts"), "content here", 0, 7);
+
+ assert_eq!(context.span.offset(), 0);
+ assert_eq!(context.span.len(), 7);
+ }
+
+ #[test]
+ fn test_decorator_diagnostic_creation() {
+ let diagnostic = DecoratorDiagnostic::new(
+ Path::new("router.ts"),
+ "@InvalidDecorator\nclass Test {}",
+ "InvalidDecorator".to_string(),
+ 1,
+ 16,
+ );
+
+ assert_eq!(diagnostic.decorator, "InvalidDecorator");
+ }
+
+ #[test]
+ fn test_import_diagnostic_creation() {
+ let diagnostic = ImportDiagnostic::new(
+ Path::new("file.ts"),
+ "import { Missing } from './missing';",
+ "Missing".to_string(),
+ 9,
+ 7,
+ );
+
+ assert_eq!(diagnostic.name, "Missing");
+ }
+
+ #[test]
+ fn test_schema_diagnostic_creation() {
+ let diagnostic = SchemaDiagnostic::new(
+ Path::new("schema.ts"),
+ "const schema = unknownSchema;",
+ "unknownSchema".to_string(),
+ 15,
+ 13,
+ );
+
+ assert_eq!(diagnostic.name, "unknownSchema");
+ }
+}
diff --git a/packages/nestjs-trpc/cli/src/discovery.rs b/packages/nestjs-trpc/cli/src/discovery.rs
new file mode 100644
index 0000000..9d4aad8
--- /dev/null
+++ b/packages/nestjs-trpc/cli/src/discovery.rs
@@ -0,0 +1,274 @@
+use crate::error::ConfigError;
+use crate::parser::{extract_trpc_options, TsParser};
+use serde_json::Value;
+use std::fs;
+use std::path::{Path, PathBuf};
+use tracing::{debug, trace};
+
+const PACKAGE_JSON: &str = "package.json";
+
+const DEFAULT_CANDIDATE_PATHS: &[&str] = &[
+ "src/main.ts",
+ "src/app.module.ts",
+ "lib/main.ts",
+ "lib/app.module.ts",
+ "app.module.ts",
+];
+
+pub fn discover_root_module(base_directory: &Path) -> Result {
+ debug!("Starting root module discovery");
+
+ if let Some(entry_point) = find_entry_point_from_package_json(base_directory)? {
+ debug!(entry_point = ?entry_point, "Found entry point from package.json");
+
+ if let Some(module) = find_trpc_module_near(&entry_point) {
+ debug!(module = ?module, "Found TRPCModule near package.json entry point");
+ return Ok(module);
+ }
+ }
+
+ for candidate in DEFAULT_CANDIDATE_PATHS {
+ let candidate_path = base_directory.join(candidate);
+ trace!(candidate = ?candidate_path, "Checking candidate path");
+
+ if !candidate_path.exists() {
+ continue;
+ }
+
+ if let Some(module) = check_file_for_trpc_module(&candidate_path) {
+ debug!(module = ?module, "Found TRPCModule in candidate");
+ return Ok(module);
+ }
+ }
+
+ Err(ConfigError::ModuleNotFound {
+ searched_paths: DEFAULT_CANDIDATE_PATHS
+ .iter()
+ .map(|p| base_directory.join(p))
+ .collect(),
+ })
+}
+
+fn find_entry_point_from_package_json(
+ base_directory: &Path,
+) -> Result, ConfigError> {
+ let package_json_path = base_directory.join(PACKAGE_JSON);
+
+ if !package_json_path.exists() {
+ debug!("No package.json found");
+ return Ok(None);
+ }
+
+ let contents =
+ fs::read_to_string(&package_json_path).map_err(|source| ConfigError::ReadFailed {
+ path: package_json_path.clone(),
+ source,
+ })?;
+
+ let package_json: Value =
+ serde_json::from_str(&contents).map_err(|source| ConfigError::InvalidSyntax {
+ path: package_json_path.clone(),
+ message: format!("Invalid JSON in package.json: {source}"),
+ })?;
+
+ if let Some(source_field) = package_json.get("source").and_then(|v| v.as_str()) {
+ let source_path = base_directory.join(source_field);
+ if source_path.exists() {
+ trace!(source = ?source_path, "Found 'source' field in package.json");
+ return Ok(Some(source_path));
+ }
+ }
+
+ if let Some(main_field) = package_json.get("main").and_then(|v| v.as_str()) {
+ let main_path = base_directory.join(main_field);
+
+ let typescript_equivalent = main_path.with_extension("").with_extension("ts");
+
+ if typescript_equivalent.exists() {
+ trace!(main = ?typescript_equivalent, "Found TypeScript equivalent of 'main' field");
+ return Ok(Some(typescript_equivalent));
+ }
+
+ if main_path.exists() {
+ trace!(main = ?main_path, "Found 'main' field in package.json");
+ return Ok(Some(main_path));
+ }
+ }
+
+ debug!("No valid entry point found in package.json");
+ Ok(None)
+}
+
+fn find_trpc_module_near(entry_point: &Path) -> Option {
+ if check_file_for_trpc_module(entry_point).is_some() {
+ return Some(entry_point.to_path_buf());
+ }
+
+ let parent_directory = entry_point.parent()?;
+
+ for candidate in &["app.module.ts", "main.module.ts"] {
+ let candidate_path = parent_directory.join(candidate);
+ if let Some(module) = check_file_for_trpc_module(&candidate_path) {
+ return Some(module);
+ }
+ }
+
+ None
+}
+
+fn check_file_for_trpc_module(file_path: &Path) -> Option {
+ if !file_path.exists() {
+ return None;
+ }
+
+ let parser = TsParser::new();
+ let parsed = parser.parse_file(file_path).ok()?;
+
+ if extract_trpc_options(&parsed).is_some() {
+ Some(file_path.to_path_buf())
+ } else {
+ None
+ }
+}
+
+#[cfg(test)]
+mod tests {
+ use super::*;
+ use std::fs;
+ use tempfile::TempDir;
+
+ fn create_package_json(directory: &Path, main: Option<&str>, source: Option<&str>) {
+ let mut package_json = serde_json::json!({
+ "name": "test-package",
+ "version": "1.0.0"
+ });
+
+ if let Some(main_value) = main {
+ package_json["main"] = serde_json::json!(main_value);
+ }
+
+ if let Some(source_value) = source {
+ package_json["source"] = serde_json::json!(source_value);
+ }
+
+ fs::write(
+ directory.join("package.json"),
+ serde_json::to_string_pretty(&package_json).unwrap(),
+ )
+ .unwrap();
+ }
+
+ fn create_module_file(directory: &Path, path: &str, has_trpc: bool) {
+ let file_path = directory.join(path);
+ if let Some(parent) = file_path.parent() {
+ fs::create_dir_all(parent).unwrap();
+ }
+
+ let content = if has_trpc {
+ r"
+ import { Module } from '@nestjs/common';
+ import { TRPCModule } from 'nestjs-trpc';
+
+ @Module({
+ imports: [
+ TRPCModule.forRoot({
+ autoSchemaFile: './generated',
+ }),
+ ],
+ })
+ export class AppModule {}
+ "
+ } else {
+ r"
+ import { Module } from '@nestjs/common';
+
+ @Module({})
+ export class AppModule {}
+ "
+ };
+
+ fs::write(file_path, content).unwrap();
+ }
+
+ #[test]
+ fn test_discover_from_package_json_source() {
+ let temp_directory = TempDir::new().unwrap();
+ let base = temp_directory.path();
+
+ create_package_json(base, None, Some("src/main.ts"));
+ create_module_file(base, "src/main.ts", true);
+
+ let result = discover_root_module(base).unwrap();
+ assert!(result.ends_with("src/main.ts"));
+ }
+
+ #[test]
+ fn test_discover_from_package_json_main() {
+ let temp_directory = TempDir::new().unwrap();
+ let base = temp_directory.path();
+
+ create_package_json(base, Some("dist/main.js"), None);
+ create_module_file(base, "dist/main.ts", true);
+
+ let result = discover_root_module(base).unwrap();
+ assert!(result.ends_with("dist/main.ts"));
+ }
+
+ #[test]
+ fn test_discover_from_default_candidates() {
+ let temp_directory = TempDir::new().unwrap();
+ let base = temp_directory.path();
+
+ create_module_file(base, "src/app.module.ts", true);
+
+ let result = discover_root_module(base).unwrap();
+ assert!(result.ends_with("src/app.module.ts"));
+ }
+
+ #[test]
+ fn test_discover_lib_directory() {
+ let temp_directory = TempDir::new().unwrap();
+ let base = temp_directory.path();
+
+ create_module_file(base, "lib/app.module.ts", true);
+
+ let result = discover_root_module(base).unwrap();
+ assert!(result.ends_with("lib/app.module.ts"));
+ }
+
+ #[test]
+ fn test_discover_current_directory() {
+ let temp_directory = TempDir::new().unwrap();
+ let base = temp_directory.path();
+
+ create_module_file(base, "app.module.ts", true);
+
+ let result = discover_root_module(base).unwrap();
+ assert!(result.ends_with("app.module.ts"));
+ }
+
+ #[test]
+ fn test_discover_not_found() {
+ let temp_directory = TempDir::new().unwrap();
+ let base = temp_directory.path();
+
+ create_module_file(base, "src/app.module.ts", false);
+
+ let result = discover_root_module(base);
+ assert!(result.is_err());
+ }
+
+ #[test]
+ fn test_find_trpc_module_near_entry_point() {
+ let temp_directory = TempDir::new().unwrap();
+ let base = temp_directory.path();
+
+ create_module_file(base, "src/main.ts", false);
+ create_module_file(base, "src/app.module.ts", true);
+
+ let entry_point = base.join("src/main.ts");
+ let result = find_trpc_module_near(&entry_point);
+ assert!(result.is_some());
+ assert!(result.unwrap().ends_with("src/app.module.ts"));
+ }
+}
diff --git a/packages/nestjs-trpc/cli/src/error.rs b/packages/nestjs-trpc/cli/src/error.rs
new file mode 100644
index 0000000..1af0f3f
--- /dev/null
+++ b/packages/nestjs-trpc/cli/src/error.rs
@@ -0,0 +1,268 @@
+use miette::Diagnostic;
+use std::path::PathBuf;
+use thiserror::Error;
+
+#[derive(Error, Debug, Diagnostic)]
+pub enum CliError {
+ #[error(transparent)]
+ #[diagnostic(transparent)]
+ Config(#[from] ConfigError),
+
+ #[error(transparent)]
+ #[diagnostic(transparent)]
+ Scanner(#[from] ScannerError),
+
+ #[error(transparent)]
+ #[diagnostic(transparent)]
+ Parser(#[from] ParserError),
+
+ #[error(transparent)]
+ #[diagnostic(transparent)]
+ Import(#[from] ImportError),
+
+ #[error(transparent)]
+ #[diagnostic(transparent)]
+ Generator(#[from] GeneratorError),
+
+ #[error("I/O error: {0}")]
+ #[diagnostic(code(nestjs_trpc::io_error))]
+ Io(#[from] std::io::Error),
+}
+
+#[derive(Error, Debug, Diagnostic)]
+#[diagnostic(code(nestjs_trpc::config_error))]
+pub enum ConfigError {
+ #[error("Configuration file not found at '{path}'. Run `nestjs-trpc init` to create one.")]
+ #[diagnostic(help(
+ "Create a configuration file or use --entrypoint to specify the module path"
+ ))]
+ NotFound { path: PathBuf },
+
+ #[error("Failed to read configuration file '{path}': {source}")]
+ ReadFailed {
+ path: PathBuf,
+ #[source]
+ source: std::io::Error,
+ },
+
+ #[error("Invalid configuration syntax in '{path}': {message}")]
+ #[diagnostic(help("Check the configuration file for JSON/TypeScript syntax errors"))]
+ InvalidSyntax { path: PathBuf, message: String },
+
+ #[error("Missing required configuration field '{field}' in '{path}'")]
+ #[diagnostic(help("Add the required field to your configuration file"))]
+ MissingField { path: PathBuf, field: String },
+
+ #[error("Invalid value for '{field}' in '{path}': {message}")]
+ InvalidValue {
+ path: PathBuf,
+ field: String,
+ message: String,
+ },
+
+ #[error("Could not find TRPCModule.forRoot() in any of the following locations:\n{}", .searched_paths.iter().map(|p| format!(" - {}", p.display())).collect::>().join("\n"))]
+ #[diagnostic(help("Use --entrypoint to specify the path to your NestJS module containing TRPCModule.forRoot()"))]
+ ModuleNotFound { searched_paths: Vec },
+}
+
+#[derive(Error, Debug, Diagnostic)]
+#[diagnostic(code(nestjs_trpc::scanner_error))]
+pub enum ScannerError {
+ #[error("Invalid glob pattern '{0}': {1}")]
+ #[diagnostic(help("Check the glob pattern syntax (e.g., '**/*.router.ts')"))]
+ InvalidPattern(String, String),
+
+ #[error("Directory not found: '{0}'")]
+ #[diagnostic(help("Verify the directory path exists"))]
+ DirectoryNotFound(PathBuf),
+
+ #[error("Path is not a directory: '{0}'")]
+ NotADirectory(PathBuf),
+
+ #[error("No router files found matching pattern '{pattern}' in '{root}'")]
+ #[diagnostic(help("Check that your router files exist and match the pattern"))]
+ NoFilesFound { pattern: String, root: PathBuf },
+
+ #[error("I/O error reading '{0}': {1}")]
+ IoError(PathBuf, String),
+
+ #[error("Failed to read directory entry in '{path}': {source}")]
+ ReadFailed {
+ path: PathBuf,
+ #[source]
+ source: std::io::Error,
+ },
+}
+
+#[derive(Error, Debug, Diagnostic)]
+#[diagnostic(code(nestjs_trpc::parser_error))]
+pub enum ParserError {
+ #[error("Failed to read source file '{path}': {source}")]
+ ReadFailed {
+ path: PathBuf,
+ #[source]
+ source: std::io::Error,
+ },
+
+ #[error("Syntax error in '{path}' at line {line}, column {column}: {message}")]
+ #[diagnostic(help("Check for missing semicolons, brackets, or invalid TypeScript syntax"))]
+ SyntaxError {
+ path: PathBuf,
+ line: usize,
+ column: usize,
+ message: String,
+ },
+
+ #[error("Class '{class_name}' in '{path}' is missing @Router decorator")]
+ #[diagnostic(help("Add @Router decorator from 'nestjs-trpc' to your router class"))]
+ MissingRouterDecorator { path: PathBuf, class_name: String },
+
+ #[error("Invalid decorator arguments for @{decorator} in '{path}': {message}")]
+ #[diagnostic(help("Check the decorator syntax and arguments"))]
+ InvalidDecoratorArgs {
+ path: PathBuf,
+ decorator: String,
+ message: String,
+ },
+
+ #[error("Unsupported AST node type in '{path}': {node_type}")]
+ UnsupportedNode { path: PathBuf, node_type: String },
+}
+
+#[derive(Error, Debug, Diagnostic)]
+#[diagnostic(code(nestjs_trpc::import_error))]
+pub enum ImportError {
+ #[error("Circular import detected: {cycle}")]
+ #[diagnostic(help("Refactor to break the circular dependency"))]
+ CircularImport { cycle: String },
+
+ #[error("Cannot resolve import '{name}' from '{source_path}'")]
+ #[diagnostic(help("Check that the module exists and the import path is correct"))]
+ Unresolved { name: String, source_path: PathBuf },
+
+ #[error("Failed to resolve '{name}' through barrel file '{barrel}': {message}")]
+ BarrelResolutionFailed {
+ name: String,
+ barrel: PathBuf,
+ message: String,
+ },
+
+ #[error("Module not found: '{module}' imported from '{source_path}'")]
+ #[diagnostic(help("Verify the module path and that the file exists"))]
+ ModuleNotFound {
+ module: String,
+ source_path: PathBuf,
+ },
+}
+
+#[derive(Error, Debug, Diagnostic)]
+#[diagnostic(code(nestjs_trpc::generator_error))]
+pub enum GeneratorError {
+ #[error("Failed to create output directory '{path}': {source}")]
+ CreateDirFailed {
+ path: PathBuf,
+ #[source]
+ source: std::io::Error,
+ },
+
+ #[error("Failed to write output file '{path}': {source}")]
+ WriteFailed {
+ path: PathBuf,
+ #[source]
+ source: std::io::Error,
+ },
+
+ #[error("No routers found to generate. Check your router_pattern configuration.")]
+ #[diagnostic(help(
+ "Ensure your router classes are decorated with @Router from 'nestjs-trpc'"
+ ))]
+ NoRouters,
+
+ #[error("Failed to flatten Zod schema '{schema}' in '{path}': {message}")]
+ SchemaFlattenFailed {
+ path: PathBuf,
+ schema: String,
+ message: String,
+ },
+
+ #[error("Unresolved schema reference '{name}' in '{path}'. The variable was not found.")]
+ #[diagnostic(help("Ensure the schema variable is defined and exported"))]
+ UnresolvedSchema { path: PathBuf, name: String },
+}
+
+pub type Result = std::result::Result;
+
+#[cfg(test)]
+mod tests {
+ use super::*;
+
+ #[test]
+ fn test_config_not_found_error() {
+ let err = ConfigError::NotFound {
+ path: PathBuf::from("nestjs-trpc.toml"),
+ };
+ let message = err.to_string();
+ assert!(message.contains("nestjs-trpc.toml"));
+ assert!(message.contains("nestjs-trpc init"));
+ }
+
+ #[test]
+ fn test_parser_syntax_error() {
+ let err = ParserError::SyntaxError {
+ path: PathBuf::from("user.router.ts"),
+ line: 10,
+ column: 5,
+ message: "Unexpected token".to_string(),
+ };
+ let message = err.to_string();
+ assert!(message.contains("user.router.ts"));
+ assert!(message.contains("line 10"));
+ assert!(message.contains("column 5"));
+ }
+
+ #[test]
+ fn test_circular_import_error() {
+ let err = ImportError::CircularImport {
+ cycle: "a.ts -> b.ts -> c.ts -> a.ts".to_string(),
+ };
+ let message = err.to_string();
+ assert!(message.contains("Circular import"));
+ assert!(message.contains("a.ts -> b.ts -> c.ts -> a.ts"));
+ }
+
+ #[test]
+ fn test_error_chaining() {
+ let io_err = std::io::Error::new(std::io::ErrorKind::NotFound, "file not found");
+ let parser_err = ParserError::ReadFailed {
+ path: PathBuf::from("test.ts"),
+ source: io_err,
+ };
+ let cli_err = CliError::from(parser_err);
+
+ // Verify error chain works
+ assert!(cli_err.to_string().contains("test.ts"));
+ }
+
+ #[test]
+ fn test_scanner_no_files_found() {
+ let err = ScannerError::NoFilesFound {
+ pattern: "**/*.router.ts".to_string(),
+ root: PathBuf::from("./src"),
+ };
+ let message = err.to_string();
+ assert!(message.contains("**/*.router.ts"));
+ assert!(message.contains("./src"));
+ }
+
+ #[test]
+ fn test_generator_unresolved_schema() {
+ let err = GeneratorError::UnresolvedSchema {
+ path: PathBuf::from("user.router.ts"),
+ name: "userSchema".to_string(),
+ };
+ let message = err.to_string();
+ assert!(message.contains("userSchema"));
+ assert!(message.contains("user.router.ts"));
+ assert!(message.contains("not found"));
+ }
+}
diff --git a/packages/nestjs-trpc/cli/src/generation.rs b/packages/nestjs-trpc/cli/src/generation.rs
new file mode 100644
index 0000000..71624c2
--- /dev/null
+++ b/packages/nestjs-trpc/cli/src/generation.rs
@@ -0,0 +1,262 @@
+use std::collections::HashMap;
+use std::fs;
+use std::path::{Path, PathBuf};
+use std::time::Instant;
+
+use anyhow::{Context, Result};
+use tracing::{debug, info, warn};
+
+use crate::{
+ build_imports_map, extract_procedures_from_class, DecoratorParser, FileScanner, ParsedFile,
+ ParserError, RouterMetadata, RouterParser, ServerGenerator, SyntaxDiagnostic, TsParser,
+};
+
+/// Result of a generation operation
+#[derive(Debug, Clone)]
+pub struct GenerationResult {
+ pub router_count: usize,
+ pub procedure_count: usize,
+ pub duration_milliseconds: u64,
+}
+
+/// Core generation logic that can be called from both CLI and watch mode.
+/// Returns router count, procedure count, and duration in milliseconds.
+pub fn run_generation(
+ base_directory: &Path,
+ output_path: &Path,
+ router_pattern: &str,
+) -> Result {
+ let start_time = Instant::now();
+
+ let router_files = scan_router_files(base_directory, router_pattern)?;
+ let (typescript_parser, parsed_files) = parse_router_files(&router_files)?;
+ let routers = extract_routers(&parsed_files)?;
+ let schema_locations =
+ build_schema_locations(&typescript_parser, &parsed_files, base_directory);
+ write_server_file(output_path, &routers, &schema_locations)?;
+
+ let router_count = routers.len();
+ let procedure_count = routers.iter().map(|r| r.procedures.len()).sum();
+ // u128 millis won't overflow u64 for any realistic program lifetime (584 million years)
+ #[allow(clippy::cast_possible_truncation)]
+ let duration_milliseconds = start_time.elapsed().as_millis() as u64;
+
+ Ok(GenerationResult {
+ router_count,
+ procedure_count,
+ duration_milliseconds,
+ })
+}
+
+fn scan_router_files(base_directory: &Path, pattern: &str) -> Result> {
+ let scanner = FileScanner::new(base_directory).with_context(|| {
+ format!(
+ "Failed to initialize scanner for '{}'",
+ base_directory.display()
+ )
+ })?;
+
+ let router_files = scanner
+ .scan(pattern)
+ .with_context(|| format!("Failed to scan for router files with pattern '{pattern}'"))?;
+
+ if router_files.is_empty() {
+ anyhow::bail!(
+ "No router files found matching pattern '{pattern}' in '{}'.\n\
+ Check that your router files exist and match the pattern.",
+ base_directory.display()
+ );
+ }
+
+ info!(
+ count = router_files.len(),
+ pattern = %pattern,
+ "Found router files"
+ );
+
+ for file in &router_files {
+ debug!(file = ?file, "Found router file");
+ }
+
+ Ok(router_files)
+}
+
+fn parse_router_files(router_files: &[PathBuf]) -> Result<(TsParser, Vec)> {
+ let typescript_parser = TsParser::new();
+ let (parsed_files, parse_errors) = typescript_parser.parse_files(router_files);
+
+ for error in &parse_errors {
+ print_parse_error(error);
+ }
+
+ if parsed_files.is_empty() {
+ anyhow::bail!(
+ "Failed to parse any router files. {} files had syntax errors.",
+ parse_errors.len()
+ );
+ }
+
+ info!(
+ parsed = parsed_files.len(),
+ errors = parse_errors.len(),
+ "Parsed TypeScript files"
+ );
+
+ Ok((typescript_parser, parsed_files))
+}
+
+fn print_parse_error(error: &ParserError) {
+ if let ParserError::SyntaxError {
+ path,
+ line,
+ column,
+ message,
+ } = error
+ {
+ if let Ok(content) = fs::read_to_string(path) {
+ let diagnostic = SyntaxDiagnostic::new(path, &content, *line, *column, message.clone());
+ let report = miette::Report::new(diagnostic);
+ eprintln!("{report:?}");
+ return;
+ }
+ }
+
+ warn!("Parse error: {}", error);
+}
+
+fn extract_routers(parsed_files: &[ParsedFile]) -> Result> {
+ let router_parser = RouterParser::new();
+ let decorator_parser = DecoratorParser::new();
+
+ let mut routers: Vec = Vec::new();
+
+ for parsed_file in parsed_files {
+ let router_infos = router_parser.extract_routers(parsed_file);
+
+ for router_info in router_infos {
+ let procedures = extract_procedures_from_class(
+ parsed_file,
+ &router_info.class_name,
+ &decorator_parser,
+ );
+
+ let router_metadata = RouterMetadata {
+ name: router_info.class_name,
+ alias: router_info.alias,
+ file_path: router_info.file_path,
+ procedures,
+ };
+
+ debug!(
+ router = %router_metadata.name,
+ alias = ?router_metadata.alias,
+ procedures = router_metadata.procedures.len(),
+ "Extracted router metadata"
+ );
+
+ routers.push(router_metadata);
+ }
+ }
+
+ if routers.is_empty() {
+ anyhow::bail!(
+ "No @Router decorated classes found in {} parsed files.\n\
+ Ensure your router classes are decorated with @Router from 'nestjs-trpc'.",
+ parsed_files.len()
+ );
+ }
+
+ info!(
+ routers = routers.len(),
+ total_procedures = routers.iter().map(|r| r.procedures.len()).sum::(),
+ "Extracted router metadata"
+ );
+
+ Ok(routers)
+}
+
+fn build_schema_locations(
+ typescript_parser: &TsParser,
+ parsed_files: &[ParsedFile],
+ base_directory: &Path,
+) -> HashMap {
+ let mut schema_locations = HashMap::new();
+
+ for parsed_file in parsed_files {
+ add_imports_from_file(
+ &mut schema_locations,
+ typescript_parser,
+ parsed_file,
+ base_directory,
+ );
+ }
+
+ debug!(
+ schema_count = schema_locations.len(),
+ "Built schema locations map"
+ );
+
+ schema_locations
+}
+
+fn add_imports_from_file(
+ schema_locations: &mut HashMap,
+ typescript_parser: &TsParser,
+ parsed_file: &ParsedFile,
+ base_directory: &Path,
+) {
+ let imports_map = match build_imports_map(typescript_parser, parsed_file, base_directory) {
+ Ok(map) => map,
+ Err(error) => {
+ warn!(
+ "Failed to build imports map for {:?}: {}",
+ parsed_file.file_path, error
+ );
+ return;
+ }
+ };
+
+ for (name, resolved) in imports_map {
+ schema_locations.insert(name, resolved.source_file);
+ }
+}
+
+fn write_server_file(
+ output_path: &Path,
+ routers: &[RouterMetadata],
+ schema_locations: &HashMap,
+) -> Result {
+ let server_generator = ServerGenerator::new();
+
+ let server_file_path = if output_path
+ .extension()
+ .is_some_and(|ext| ext == "ts" || ext == "tsx")
+ {
+ output_path.to_path_buf()
+ } else {
+ output_path.join("server.ts")
+ };
+ let server_content =
+ server_generator.generate_with_schema_imports(routers, schema_locations, &server_file_path);
+
+ debug!(
+ content_length = server_content.len(),
+ "Generated server.ts content"
+ );
+
+ if let Some(parent) = server_file_path.parent() {
+ fs::create_dir_all(parent)
+ .with_context(|| format!("Failed to create output directory '{}'", parent.display()))?;
+ }
+
+ fs::write(&server_file_path, &server_content).with_context(|| {
+ format!(
+ "Failed to write generated file to '{}'",
+ server_file_path.display()
+ )
+ })?;
+
+ info!(output = %server_file_path.display(), "Generated server.ts");
+
+ Ok(server_file_path)
+}
diff --git a/packages/nestjs-trpc/cli/src/generator/mod.rs b/packages/nestjs-trpc/cli/src/generator/mod.rs
new file mode 100644
index 0000000..38f2442
--- /dev/null
+++ b/packages/nestjs-trpc/cli/src/generator/mod.rs
@@ -0,0 +1,375 @@
+pub mod server;
+pub mod types;
+
+use std::collections::HashSet;
+use std::fmt::Write;
+use std::path::Path;
+
+pub use server::{generate_server_file, ServerGenerator};
+pub use types::{generate_types_file, TypesGenerator};
+
+pub type GeneratorResult = std::result::Result;
+
+#[derive(Debug, Clone)]
+pub struct StaticGenerator {
+ pub(crate) use_single_quotes: bool,
+
+ pub(crate) use_semicolons: bool,
+}
+
+impl Default for StaticGenerator {
+ fn default() -> Self {
+ Self::new()
+ }
+}
+
+impl StaticGenerator {
+ #[must_use]
+ pub const fn new() -> Self {
+ Self {
+ use_single_quotes: false,
+ use_semicolons: true,
+ }
+ }
+
+ #[must_use]
+ pub const fn with_single_quotes(mut self, use_single_quotes: bool) -> Self {
+ self.use_single_quotes = use_single_quotes;
+ self
+ }
+
+ #[must_use]
+ pub const fn with_semicolons(mut self, use_semicolons: bool) -> Self {
+ self.use_semicolons = use_semicolons;
+ self
+ }
+
+ const fn quote(&self) -> char {
+ if self.use_single_quotes {
+ '\''
+ } else {
+ '"'
+ }
+ }
+
+ const fn terminator(&self) -> &str {
+ if self.use_semicolons {
+ ";"
+ } else {
+ ""
+ }
+ }
+
+ #[must_use]
+ pub fn generate_static_declarations(&self) -> String {
+ let q = self.quote();
+ let term = self.terminator();
+
+ let mut output = String::new();
+
+ let _ = writeln!(
+ output,
+ "import {{ initTRPC }} from {q}@trpc/server{q}{term}"
+ );
+ let _ = writeln!(output, "import {{ z }} from {q}zod{q}{term}");
+
+ output.push('\n');
+
+ let _ = writeln!(output, "const t = initTRPC.create(){term}");
+ let _ = writeln!(output, "const publicProcedure = t.procedure{term}");
+
+ output
+ }
+
+ #[must_use]
+ pub fn generate_trpc_import(&self) -> String {
+ let q = self.quote();
+ let term = self.terminator();
+ format!("import {{ initTRPC }} from {q}@trpc/server{q}{term}")
+ }
+
+ #[must_use]
+ pub fn generate_zod_import(&self) -> String {
+ let q = self.quote();
+ let term = self.terminator();
+ format!("import {{ z }} from {q}zod{q}{term}")
+ }
+
+ #[must_use]
+ pub fn generate_t_declaration(&self) -> String {
+ let term = self.terminator();
+ format!("const t = initTRPC.create(){term}")
+ }
+
+ #[must_use]
+ pub fn generate_public_procedure_declaration(&self) -> String {
+ let term = self.terminator();
+ format!("const publicProcedure = t.procedure{term}")
+ }
+
+ pub fn generate_schema_imports<'a, I>(
+ &self,
+ schema_names: I,
+ schema_locations: &std::collections::HashMap,
+ output_file_path: &Path,
+ ) -> String
+ where
+ I: IntoIterator- ,
+ {
+ let output_dir = output_file_path.parent().unwrap_or_else(|| Path::new("."));
+ let mut seen_paths: HashSet
= HashSet::new();
+
+ schema_names
+ .into_iter()
+ .filter_map(|name| {
+ self.format_schema_import(name, schema_locations, output_dir, &mut seen_paths)
+ })
+ .collect()
+ }
+
+ fn format_schema_import(
+ &self,
+ schema_name: &str,
+ schema_locations: &std::collections::HashMap,
+ output_dir: &Path,
+ seen_paths: &mut HashSet,
+ ) -> Option {
+ let source_path = schema_locations.get(schema_name)?;
+ let relative_path = Self::calculate_relative_path(output_dir, source_path);
+
+ if !seen_paths.insert(relative_path.clone()) {
+ return None;
+ }
+
+ let q = self.quote();
+ let term = self.terminator();
+ Some(format!(
+ "import {{ {schema_name} }} from {q}{relative_path}{q}{term}\n"
+ ))
+ }
+
+ fn calculate_relative_path(from_dir: &Path, to_file: &Path) -> String {
+ let relative = pathdiff::diff_paths(to_file, from_dir).map_or_else(
+ || to_file.to_string_lossy().to_string(),
+ |p| p.to_string_lossy().to_string(),
+ );
+
+ let without_ext = relative
+ .strip_suffix(".ts")
+ .or_else(|| relative.strip_suffix(".tsx"))
+ .unwrap_or(&relative);
+
+ if without_ext.starts_with('.') || without_ext.starts_with('/') {
+ without_ext.to_string()
+ } else {
+ format!("./{without_ext}")
+ }
+ }
+}
+
+#[must_use]
+pub fn generate_static_section() -> String {
+ StaticGenerator::new().generate_static_declarations()
+}
+
+#[cfg(test)]
+mod tests {
+ use super::*;
+ use std::collections::HashMap;
+
+ #[test]
+ fn test_static_generator_creation() {
+ let generator = StaticGenerator::new();
+ assert!(!generator.use_single_quotes);
+ assert!(generator.use_semicolons);
+ }
+
+ #[test]
+ fn test_static_generator_default() {
+ let generator = StaticGenerator::default();
+ assert!(!generator.use_single_quotes);
+ assert!(generator.use_semicolons);
+ }
+
+ #[test]
+ fn test_generate_static_declarations() {
+ let generator = StaticGenerator::new();
+ let output = generator.generate_static_declarations();
+
+ // Verify import declarations
+ assert!(output.contains("import { initTRPC } from \"@trpc/server\";"));
+ assert!(output.contains("import { z } from \"zod\";"));
+
+ // Verify variable declarations
+ assert!(output.contains("const t = initTRPC.create();"));
+ assert!(output.contains("const publicProcedure = t.procedure;"));
+ }
+
+ #[test]
+ fn test_generate_static_declarations_with_single_quotes() {
+ let generator = StaticGenerator::new().with_single_quotes(true);
+ let output = generator.generate_static_declarations();
+
+ assert!(output.contains("import { initTRPC } from '@trpc/server';"));
+ assert!(output.contains("import { z } from 'zod';"));
+ }
+
+ #[test]
+ fn test_generate_static_declarations_without_semicolons() {
+ let generator = StaticGenerator::new().with_semicolons(false);
+ let output = generator.generate_static_declarations();
+
+ assert!(output.contains("import { initTRPC } from \"@trpc/server\"\n"));
+ assert!(output.contains("import { z } from \"zod\"\n"));
+ assert!(output.contains("const t = initTRPC.create()\n"));
+ assert!(output.contains("const publicProcedure = t.procedure\n"));
+ // Verify no semicolons
+ assert!(!output.contains(';'));
+ }
+
+ #[test]
+ fn test_generate_trpc_import() {
+ let generator = StaticGenerator::new();
+ let output = generator.generate_trpc_import();
+ assert_eq!(output, "import { initTRPC } from \"@trpc/server\";");
+ }
+
+ #[test]
+ fn test_generate_zod_import() {
+ let generator = StaticGenerator::new();
+ let output = generator.generate_zod_import();
+ assert_eq!(output, "import { z } from \"zod\";");
+ }
+
+ #[test]
+ fn test_generate_t_declaration() {
+ let generator = StaticGenerator::new();
+ let output = generator.generate_t_declaration();
+ assert_eq!(output, "const t = initTRPC.create();");
+ }
+
+ #[test]
+ fn test_generate_public_procedure_declaration() {
+ let generator = StaticGenerator::new();
+ let output = generator.generate_public_procedure_declaration();
+ assert_eq!(output, "const publicProcedure = t.procedure;");
+ }
+
+ #[test]
+ fn test_generate_schema_imports() {
+ let generator = StaticGenerator::new();
+
+ let mut schema_locations: HashMap = HashMap::new();
+ schema_locations.insert(
+ "userSchema".to_string(),
+ std::path::PathBuf::from("src/schemas/user.schema.ts"),
+ );
+ schema_locations.insert(
+ "postSchema".to_string(),
+ std::path::PathBuf::from("src/schemas/post.schema.ts"),
+ );
+
+ let output_path = Path::new("src/@generated/server.ts");
+ let schema_names = vec!["userSchema", "postSchema"];
+
+ let output =
+ generator.generate_schema_imports(schema_names, &schema_locations, output_path);
+
+ // Verify imports are generated with relative paths
+ assert!(output.contains("import { userSchema }"));
+ assert!(output.contains("import { postSchema }"));
+ // Path should be relative from @generated to schemas
+ assert!(output.contains("../schemas/user.schema"));
+ assert!(output.contains("../schemas/post.schema"));
+ }
+
+ #[test]
+ fn test_generate_schema_imports_empty() {
+ let generator = StaticGenerator::new();
+ let schema_locations: HashMap = HashMap::new();
+ let output_path = Path::new("src/@generated/server.ts");
+
+ let output = generator.generate_schema_imports(
+ std::iter::empty::<&str>(),
+ &schema_locations,
+ output_path,
+ );
+
+ assert!(output.is_empty());
+ }
+
+ #[test]
+ fn test_calculate_relative_path() {
+ // Same directory
+ let result = StaticGenerator::calculate_relative_path(
+ Path::new("src/@generated"),
+ Path::new("src/@generated/types.ts"),
+ );
+ assert_eq!(result, "./types");
+
+ // Parent directory
+ let result = StaticGenerator::calculate_relative_path(
+ Path::new("src/@generated"),
+ Path::new("src/schemas/user.ts"),
+ );
+ assert_eq!(result, "../schemas/user");
+ }
+
+ #[test]
+ fn test_static_declarations_format() {
+ let generator = StaticGenerator::new();
+ let output = generator.generate_static_declarations();
+
+ // Verify proper formatting with blank line between imports and declarations
+ let lines: Vec<&str> = output.lines().collect();
+ assert_eq!(lines.len(), 5); // 2 imports + 1 blank + 2 declarations
+
+ // First two lines are imports
+ assert!(lines[0].starts_with("import"));
+ assert!(lines[1].starts_with("import"));
+
+ // Third line is blank
+ assert!(lines[2].is_empty());
+
+ // Last two lines are declarations
+ assert!(lines[3].starts_with("const t"));
+ assert!(lines[4].starts_with("const publicProcedure"));
+ }
+
+ #[test]
+ fn test_convenience_function() {
+ let output = generate_static_section();
+
+ // Verify it produces the same output as the method
+ let generator = StaticGenerator::new();
+ let expected = generator.generate_static_declarations();
+
+ assert_eq!(output, expected);
+ }
+
+ #[test]
+ fn test_builder_pattern_chaining() {
+ let generator = StaticGenerator::new()
+ .with_single_quotes(true)
+ .with_semicolons(false);
+
+ assert!(generator.use_single_quotes);
+ assert!(!generator.use_semicolons);
+ }
+
+ #[test]
+ fn test_output_matches_expected_format() {
+ let generator = StaticGenerator::new();
+ let output = generator.generate_static_declarations();
+
+ // This matches the format from the spec and examples
+ let expected = r#"import { initTRPC } from "@trpc/server";
+import { z } from "zod";
+
+const t = initTRPC.create();
+const publicProcedure = t.procedure;
+"#;
+
+ assert_eq!(output, expected);
+ }
+}
diff --git a/packages/nestjs-trpc/cli/src/generator/server.rs b/packages/nestjs-trpc/cli/src/generator/server.rs
new file mode 100644
index 0000000..91cd873
--- /dev/null
+++ b/packages/nestjs-trpc/cli/src/generator/server.rs
@@ -0,0 +1,908 @@
+use crate::generator::StaticGenerator;
+use crate::{ProcedureMetadata, RouterMetadata};
+use std::collections::HashMap;
+use std::path::Path;
+
+const GENERATED_FILE_HEADER: &str = "\
+/**
+ * AUTO-GENERATED FILE - DO NOT EDIT!
+ *
+ * This file was automatically generated by nestjs-trpc.
+ * Any manual changes will be overwritten on the next generation.
+ *
+ * Command: `npx nestjs-trpc generate`
+ * Learn more: https://nestjs-trpc.io
+ */
+";
+
+#[derive(Debug, Clone)]
+pub struct ServerGenerator {
+ static_generator: StaticGenerator,
+
+ indent: String,
+}
+
+impl Default for ServerGenerator {
+ fn default() -> Self {
+ Self::new()
+ }
+}
+
+impl ServerGenerator {
+ #[must_use]
+ pub fn new() -> Self {
+ Self {
+ static_generator: StaticGenerator::new(),
+ indent: " ".to_string(),
+ }
+ }
+
+ #[must_use]
+ pub const fn with_static_generator(mut self, generator: StaticGenerator) -> Self {
+ self.static_generator = generator;
+ self
+ }
+
+ #[must_use]
+ pub fn with_indent(mut self, indent: &str) -> Self {
+ self.indent = indent.to_string();
+ self
+ }
+
+ #[must_use]
+ pub const fn static_generator(&self) -> &StaticGenerator {
+ &self.static_generator
+ }
+
+ #[must_use]
+ pub fn generate(&self, routers: &[RouterMetadata]) -> String {
+ let mut output = String::new();
+
+ output.push_str(GENERATED_FILE_HEADER);
+ output.push('\n');
+
+ output.push_str(&self.static_generator.generate_static_declarations());
+
+ output.push('\n');
+
+ output.push_str(&self.generate_app_router(routers));
+
+ output.push('\n');
+
+ output.push_str(&self.generate_app_router_type_export());
+
+ output
+ }
+
+ #[must_use]
+ pub fn generate_with_schema_imports(
+ &self,
+ routers: &[RouterMetadata],
+ schema_locations: &HashMap,
+ output_file_path: &Path,
+ ) -> String {
+ let mut output = String::new();
+
+ output.push_str(GENERATED_FILE_HEADER);
+ output.push('\n');
+
+ output.push_str(&self.static_generator.generate_static_declarations());
+
+ let schema_names: Vec<&str> = routers
+ .iter()
+ .flat_map(|r| &r.procedures)
+ .flat_map(Self::extract_schema_refs)
+ .collect();
+
+ self.append_schema_imports(
+ &mut output,
+ &schema_names,
+ schema_locations,
+ output_file_path,
+ );
+
+ output.push('\n');
+
+ output.push_str(&self.generate_app_router(routers));
+
+ output.push('\n');
+
+ output.push_str(&self.generate_app_router_type_export());
+
+ output
+ }
+
+ #[must_use]
+ pub fn generate_app_router(&self, routers: &[RouterMetadata]) -> String {
+ let term = self.terminator();
+
+ if routers.is_empty() {
+ return format!("const appRouter = t.router({{}}){term}\n");
+ }
+
+ let router_strings: Vec = routers
+ .iter()
+ .map(|router| self.generate_router_string(router, 1))
+ .collect();
+
+ let routers_content = router_strings.join(",\n");
+
+ format!("const appRouter = t.router({{\n{routers_content}\n}}){term}\n")
+ }
+
+ #[must_use]
+ pub fn generate_router_string(&self, router: &RouterMetadata, depth: usize) -> String {
+ let indent = self.indent.repeat(depth);
+ let inner_indent = self.indent.repeat(depth + 1);
+
+ let router_key = router
+ .alias
+ .clone()
+ .unwrap_or_else(|| to_camel_case(&router.name));
+
+ if router.procedures.is_empty() {
+ return format!("{indent}{router_key}: t.router({{}})");
+ }
+
+ let procedure_strings: Vec = router
+ .procedures
+ .iter()
+ .map(|proc| self.generate_procedure_string(proc, depth + 1))
+ .collect();
+
+ let procedures_content = procedure_strings.join(",\n");
+
+ format!("{indent}{router_key}: t.router({{\n{procedures_content}\n{inner_indent}}})")
+ }
+
+ #[must_use]
+ pub fn generate_procedure_string(&self, procedure: &ProcedureMetadata, depth: usize) -> String {
+ let indent = self.indent.repeat(depth);
+ let chain_indent = self.indent.repeat(depth + 1);
+
+ let mut chain_parts: Vec = Vec::new();
+
+ chain_parts.push(format!("{indent}{}: publicProcedure", procedure.name));
+
+ if let Some(input) = &procedure.input_schema {
+ chain_parts.push(format!("{chain_indent}.input({input})"));
+ }
+
+ if let Some(output) = &procedure.output_schema {
+ chain_parts.push(format!("{chain_indent}.output({output})"));
+ }
+
+ let proc_type = procedure.procedure_type.to_string();
+ chain_parts.push(format!(
+ "{chain_indent}.{proc_type}(async () => \"PLACEHOLDER_DO_NOT_REMOVE\" as any)"
+ ));
+
+ chain_parts.join("\n")
+ }
+
+ #[must_use]
+ pub fn generate_app_router_type_export(&self) -> String {
+ let term = self.terminator();
+ format!("export type AppRouter = typeof appRouter{term}\n")
+ }
+
+ const fn terminator(&self) -> &str {
+ if self.static_generator.use_semicolons {
+ ";"
+ } else {
+ ""
+ }
+ }
+
+ fn extract_schema_refs(procedure: &ProcedureMetadata) -> Vec<&str> {
+ let input_ref = procedure.input_schema_ref.as_deref();
+ let output_ref = procedure.output_schema_ref.as_deref();
+ [input_ref, output_ref].into_iter().flatten().collect()
+ }
+
+ fn append_schema_imports(
+ &self,
+ output: &mut String,
+ schema_names: &[&str],
+ schema_locations: &HashMap,
+ output_file_path: &Path,
+ ) {
+ if schema_names.is_empty() {
+ return;
+ }
+
+ let schema_imports = self.static_generator.generate_schema_imports(
+ schema_names.iter().copied(),
+ schema_locations,
+ output_file_path,
+ );
+
+ if !schema_imports.is_empty() {
+ output.push_str(&schema_imports);
+ }
+ }
+}
+
+fn to_camel_case(s: &str) -> String {
+ let mut chars = s.chars();
+ chars.next().map_or_else(String::new, |first| {
+ first.to_lowercase().chain(chars).collect()
+ })
+}
+
+#[must_use]
+pub fn generate_server_file(routers: &[RouterMetadata]) -> String {
+ ServerGenerator::new().generate(routers)
+}
+
+#[cfg(test)]
+mod tests {
+ use super::*;
+ use crate::{ProcedureMetadata, ProcedureType};
+
+ fn create_test_procedure(
+ name: &str,
+ proc_type: ProcedureType,
+ input: Option<&str>,
+ output: Option<&str>,
+ ) -> ProcedureMetadata {
+ ProcedureMetadata {
+ name: name.to_string(),
+ procedure_type: proc_type,
+ input_schema: input.map(std::string::ToString::to_string),
+ output_schema: output.map(std::string::ToString::to_string),
+ input_schema_ref: None,
+ output_schema_ref: None,
+ }
+ }
+
+ fn create_test_router(
+ name: &str,
+ alias: Option<&str>,
+ procedures: Vec,
+ ) -> RouterMetadata {
+ RouterMetadata {
+ name: name.to_string(),
+ alias: alias.map(std::string::ToString::to_string),
+ file_path: std::path::PathBuf::from("test.router.ts"),
+ procedures,
+ }
+ }
+
+ #[test]
+ fn test_server_generator_creation() {
+ let generator = ServerGenerator::new();
+ assert_eq!(generator.indent, " ");
+ }
+
+ #[test]
+ fn test_server_generator_default() {
+ let generator = ServerGenerator::default();
+ assert_eq!(generator.indent, " ");
+ }
+
+ #[test]
+ fn test_to_camel_case() {
+ assert_eq!(to_camel_case("UserRouter"), "userRouter");
+ assert_eq!(to_camel_case("MyClass"), "myClass");
+ assert_eq!(to_camel_case("ABC"), "aBC");
+ assert_eq!(to_camel_case("a"), "a");
+ assert_eq!(to_camel_case(""), "");
+ }
+
+ #[test]
+ fn test_generate_procedure_string_query_with_input_output() {
+ let generator = ServerGenerator::new();
+ let procedure = create_test_procedure(
+ "getUserById",
+ ProcedureType::Query,
+ Some("z.object({ userId: z.string() })"),
+ Some("z.object({ name: z.string() })"),
+ );
+
+ let output = generator.generate_procedure_string(&procedure, 2);
+
+ assert!(output.contains("getUserById: publicProcedure"));
+ assert!(output.contains(".input(z.object({ userId: z.string() }))"));
+ assert!(output.contains(".output(z.object({ name: z.string() }))"));
+ assert!(output.contains(".query(async () => \"PLACEHOLDER_DO_NOT_REMOVE\" as any)"));
+ }
+
+ #[test]
+ fn test_generate_procedure_string_mutation_with_input() {
+ let generator = ServerGenerator::new();
+ let procedure = create_test_procedure(
+ "createUser",
+ ProcedureType::Mutation,
+ Some("z.object({ name: z.string() })"),
+ None,
+ );
+
+ let output = generator.generate_procedure_string(&procedure, 2);
+
+ assert!(output.contains("createUser: publicProcedure"));
+ assert!(output.contains(".input(z.object({ name: z.string() }))"));
+ assert!(!output.contains(".output"));
+ assert!(output.contains(".mutation(async () => \"PLACEHOLDER_DO_NOT_REMOVE\" as any)"));
+ }
+
+ #[test]
+ fn test_generate_procedure_string_query_no_input_no_output() {
+ let generator = ServerGenerator::new();
+ let procedure = create_test_procedure("getAll", ProcedureType::Query, None, None);
+
+ let output = generator.generate_procedure_string(&procedure, 2);
+
+ assert!(output.contains("getAll: publicProcedure"));
+ assert!(!output.contains(".input"));
+ assert!(!output.contains(".output"));
+ assert!(output.contains(".query(async () => \"PLACEHOLDER_DO_NOT_REMOVE\" as any)"));
+ }
+
+ #[test]
+ fn test_generate_router_string_with_alias() {
+ let generator = ServerGenerator::new();
+ let router = create_test_router(
+ "UserRouter",
+ Some("users"),
+ vec![create_test_procedure(
+ "getUser",
+ ProcedureType::Query,
+ None,
+ None,
+ )],
+ );
+
+ let output = generator.generate_router_string(&router, 1);
+
+ assert!(output.contains("users: t.router({"));
+ assert!(output.contains("getUser: publicProcedure"));
+ }
+
+ #[test]
+ fn test_generate_router_string_without_alias() {
+ let generator = ServerGenerator::new();
+ let router = create_test_router(
+ "UserRouter",
+ None,
+ vec![create_test_procedure(
+ "getUser",
+ ProcedureType::Query,
+ None,
+ None,
+ )],
+ );
+
+ let output = generator.generate_router_string(&router, 1);
+
+ // Should use camelCase class name
+ assert!(output.contains("userRouter: t.router({"));
+ }
+
+ #[test]
+ fn test_generate_router_string_empty_procedures() {
+ let generator = ServerGenerator::new();
+ let router = create_test_router("EmptyRouter", Some("empty"), vec![]);
+
+ let output = generator.generate_router_string(&router, 1);
+
+ assert!(output.contains("empty: t.router({})"));
+ }
+
+ #[test]
+ fn test_generate_app_router_empty() {
+ let generator = ServerGenerator::new();
+ let output = generator.generate_app_router(&[]);
+
+ assert!(output.contains("const appRouter = t.router({});"));
+ }
+
+ #[test]
+ fn test_generate_app_router_single_router() {
+ let generator = ServerGenerator::new();
+ let routers = vec![create_test_router(
+ "UserRouter",
+ Some("users"),
+ vec![create_test_procedure(
+ "getUser",
+ ProcedureType::Query,
+ None,
+ None,
+ )],
+ )];
+
+ let output = generator.generate_app_router(&routers);
+
+ assert!(output.contains("const appRouter = t.router({"));
+ assert!(output.contains("users: t.router({"));
+ assert!(output.contains("getUser: publicProcedure"));
+ }
+
+ #[test]
+ fn test_generate_app_router_multiple_routers() {
+ let generator = ServerGenerator::new();
+ let routers = vec![
+ create_test_router(
+ "UserRouter",
+ Some("users"),
+ vec![create_test_procedure(
+ "getUser",
+ ProcedureType::Query,
+ None,
+ None,
+ )],
+ ),
+ create_test_router(
+ "PostRouter",
+ Some("posts"),
+ vec![create_test_procedure(
+ "createPost",
+ ProcedureType::Mutation,
+ Some("z.object({ title: z.string() })"),
+ None,
+ )],
+ ),
+ ];
+
+ let output = generator.generate_app_router(&routers);
+
+ assert!(output.contains("users: t.router({"));
+ assert!(output.contains("posts: t.router({"));
+ assert!(output.contains("getUser: publicProcedure"));
+ assert!(output.contains("createPost: publicProcedure"));
+ }
+
+ #[test]
+ fn test_generate_app_router_type_export() {
+ let generator = ServerGenerator::new();
+ let output = generator.generate_app_router_type_export();
+
+ assert_eq!(output, "export type AppRouter = typeof appRouter;\n");
+ }
+
+ #[test]
+ fn test_generate_complete_file() {
+ let generator = ServerGenerator::new();
+ let routers = vec![create_test_router(
+ "UserRouter",
+ Some("users"),
+ vec![create_test_procedure(
+ "getUserById",
+ ProcedureType::Query,
+ Some("z.object({ userId: z.string() })"),
+ Some("z.object({ name: z.string(), email: z.string() })"),
+ )],
+ )];
+
+ let output = generator.generate(&routers);
+
+ // Check static declarations
+ assert!(output.contains("import { initTRPC } from \"@trpc/server\";"));
+ assert!(output.contains("import { z } from \"zod\";"));
+ assert!(output.contains("const t = initTRPC.create();"));
+ assert!(output.contains("const publicProcedure = t.procedure;"));
+
+ // Check appRouter
+ assert!(output.contains("const appRouter = t.router({"));
+ assert!(output.contains("users: t.router({"));
+ assert!(output.contains("getUserById: publicProcedure"));
+ assert!(output.contains(".input(z.object({ userId: z.string() }))"));
+ assert!(output.contains(".output(z.object({ name: z.string(), email: z.string() }))"));
+ assert!(output.contains(".query(async () => \"PLACEHOLDER_DO_NOT_REMOVE\" as any)"));
+
+ // Check type export
+ assert!(output.contains("export type AppRouter = typeof appRouter;"));
+ }
+
+ #[test]
+ fn test_generate_complete_file_empty_routers() {
+ let generator = ServerGenerator::new();
+ let output = generator.generate(&[]);
+
+ assert!(output.contains("import { initTRPC }"));
+ assert!(output.contains("import { z }"));
+ assert!(output.contains("const appRouter = t.router({});"));
+ assert!(output.contains("export type AppRouter = typeof appRouter;"));
+ }
+
+ #[test]
+ fn test_generate_server_file_convenience_function() {
+ let routers = vec![create_test_router(
+ "TestRouter",
+ Some("test"),
+ vec![create_test_procedure(
+ "testQuery",
+ ProcedureType::Query,
+ None,
+ None,
+ )],
+ )];
+
+ let output = generate_server_file(&routers);
+
+ assert!(output.contains("test: t.router({"));
+ assert!(output.contains("testQuery: publicProcedure"));
+ }
+
+ #[test]
+ fn test_with_indent_configuration() {
+ let generator = ServerGenerator::new().with_indent("\t");
+ let procedure =
+ create_test_procedure("getUser", ProcedureType::Query, Some("z.string()"), None);
+
+ let output = generator.generate_procedure_string(&procedure, 1);
+
+ assert!(output.contains("\t\t.input(z.string())"));
+ }
+
+ #[test]
+ fn test_with_static_generator_configuration() {
+ let static_gen = StaticGenerator::new().with_single_quotes(true);
+ let generator = ServerGenerator::new().with_static_generator(static_gen);
+ let routers = vec![create_test_router("Test", Some("test"), vec![])];
+
+ let output = generator.generate(&routers);
+
+ assert!(output.contains("import { initTRPC } from '@trpc/server';"));
+ assert!(output.contains("import { z } from 'zod';"));
+ }
+
+ #[test]
+ fn test_without_semicolons() {
+ let static_gen = StaticGenerator::new().with_semicolons(false);
+ let generator = ServerGenerator::new().with_static_generator(static_gen);
+ // Use empty routers to get empty t.router({})
+ let output = generator.generate(&[]);
+
+ assert!(output.contains("const appRouter = t.router({})\n"));
+ assert!(output.contains("export type AppRouter = typeof appRouter\n"));
+ }
+
+ #[test]
+ fn test_multiple_procedures_in_router() {
+ let generator = ServerGenerator::new();
+ let router = create_test_router(
+ "UserRouter",
+ Some("users"),
+ vec![
+ create_test_procedure("getUser", ProcedureType::Query, None, None),
+ create_test_procedure("createUser", ProcedureType::Mutation, None, None),
+ create_test_procedure("updateUser", ProcedureType::Mutation, None, None),
+ ],
+ );
+
+ let output = generator.generate_router_string(&router, 1);
+
+ assert!(output.contains("getUser: publicProcedure"));
+ assert!(output.contains("createUser: publicProcedure"));
+ assert!(output.contains("updateUser: publicProcedure"));
+ // Check procedures are separated by commas
+ assert!(output.matches(".query(async () =>").count() == 1);
+ assert!(output.matches(".mutation(async () =>").count() == 2);
+ }
+
+ #[test]
+ fn test_output_format_matches_expected() {
+ let generator = ServerGenerator::new();
+ let routers = vec![create_test_router(
+ "UserRouter",
+ Some("users"),
+ vec![create_test_procedure(
+ "getUserById",
+ ProcedureType::Query,
+ Some("z.object({ userId: z.string() })"),
+ Some("z.object({ name: z.string(), email: z.string(), password: z.string() })"),
+ )],
+ )];
+
+ let output = generator.generate(&routers);
+
+ // Verify the overall structure
+ let expected_parts = [
+ "import { initTRPC } from \"@trpc/server\";",
+ "import { z } from \"zod\";",
+ "const t = initTRPC.create();",
+ "const publicProcedure = t.procedure;",
+ "const appRouter = t.router({",
+ "users: t.router({",
+ "getUserById: publicProcedure",
+ ".input(z.object({ userId: z.string() }))",
+ ".output(z.object({ name: z.string(), email: z.string(), password: z.string() }))",
+ ".query(async () => \"PLACEHOLDER_DO_NOT_REMOVE\" as any)",
+ "})",
+ "});",
+ "export type AppRouter = typeof appRouter;",
+ ];
+
+ for part in expected_parts {
+ assert!(
+ output.contains(part),
+ "Output should contain: {part}\nActual output:\n{output}"
+ );
+ }
+ }
+
+ #[test]
+ fn test_procedure_indentation() {
+ let generator = ServerGenerator::new();
+ let procedure = create_test_procedure(
+ "test",
+ ProcedureType::Query,
+ Some("z.string()"),
+ Some("z.number()"),
+ );
+
+ let output = generator.generate_procedure_string(&procedure, 2);
+
+ // At depth 2, the procedure name should have 4 spaces (2 * " ")
+ // The chain methods should have 6 spaces (3 * " ")
+ let lines: Vec<&str> = output.lines().collect();
+ assert!(lines[0].starts_with(" test:"));
+ assert!(lines[1].starts_with(" .input"));
+ assert!(lines[2].starts_with(" .output"));
+ assert!(lines[3].starts_with(" .query"));
+ }
+
+ #[test]
+ fn test_static_generator_accessor() {
+ let static_gen = StaticGenerator::new().with_single_quotes(true);
+ let generator = ServerGenerator::new().with_static_generator(static_gen);
+
+ let static_ref = generator.static_generator();
+ assert!(static_ref.use_single_quotes);
+ }
+
+ // ========================================================================
+ // Additional edge case tests for generator robustness (TEST-03)
+ // ========================================================================
+
+ #[test]
+ fn test_generate_handles_special_characters_in_router_name() {
+ let generator = ServerGenerator::new();
+ let router = create_test_router(
+ "SpecialRouter",
+ None,
+ vec![create_test_procedure(
+ "getUser",
+ ProcedureType::Query,
+ None,
+ None,
+ )],
+ );
+
+ let output = generator.generate_router_string(&router, 1);
+ // camelCase of SpecialRouter is specialRouter
+ assert!(output.contains("specialRouter: t.router({"));
+ }
+
+ #[test]
+ fn test_generate_handles_unicode_in_alias() {
+ let generator = ServerGenerator::new();
+ let router = create_test_router(
+ "UserRouter",
+ Some("utilisateur"),
+ vec![create_test_procedure(
+ "getUser",
+ ProcedureType::Query,
+ None,
+ None,
+ )],
+ );
+
+ let output = generator.generate_router_string(&router, 1);
+ assert!(output.contains("utilisateur: t.router({"));
+ }
+
+ #[test]
+ fn test_generate_handles_very_long_schema() {
+ let generator = ServerGenerator::new();
+ let long_schema = format!(
+ "z.object({{ {} }})",
+ (0..50)
+ .map(|i| format!("field{i}: z.string()"))
+ .collect::>()
+ .join(", ")
+ );
+
+ let procedure = create_test_procedure(
+ "testProcedure",
+ ProcedureType::Query,
+ Some(&long_schema),
+ None,
+ );
+
+ let output = generator.generate_procedure_string(&procedure, 1);
+ assert!(output.contains(&long_schema));
+ }
+
+ #[test]
+ fn test_generate_handles_nested_zod_schema() {
+ let generator = ServerGenerator::new();
+ let nested_schema = "z.object({ user: z.object({ profile: z.object({ address: z.object({ city: z.string() }) }) }) })";
+
+ let procedure = create_test_procedure(
+ "getDeepData",
+ ProcedureType::Query,
+ Some(nested_schema),
+ None,
+ );
+
+ let output = generator.generate_procedure_string(&procedure, 1);
+ assert!(output.contains(nested_schema));
+ }
+
+ #[test]
+ fn test_generate_handles_empty_procedure_name() {
+ let generator = ServerGenerator::new();
+ let procedure = ProcedureMetadata {
+ name: String::new(),
+ procedure_type: ProcedureType::Query,
+ input_schema: None,
+ output_schema: None,
+ input_schema_ref: None,
+ output_schema_ref: None,
+ };
+
+ let output = generator.generate_procedure_string(&procedure, 1);
+ assert!(output.contains(": publicProcedure"));
+ }
+
+ #[test]
+ fn test_generate_handles_empty_router_name() {
+ let generator = ServerGenerator::new();
+ let router = RouterMetadata {
+ name: String::new(),
+ alias: None,
+ file_path: std::path::PathBuf::from("test.ts"),
+ procedures: vec![],
+ };
+
+ let output = generator.generate_router_string(&router, 1);
+ assert!(output.contains(": t.router({})"));
+ }
+
+ #[test]
+ fn test_generate_with_schema_imports_empty_locations() {
+ let generator = ServerGenerator::new();
+ let routers = vec![create_test_router(
+ "UserRouter",
+ Some("users"),
+ vec![ProcedureMetadata {
+ name: "getUser".to_string(),
+ procedure_type: ProcedureType::Query,
+ input_schema: Some("userInputSchema".to_string()),
+ output_schema: None,
+ input_schema_ref: Some("userInputSchema".to_string()),
+ output_schema_ref: None,
+ }],
+ )];
+
+ let schema_locations = HashMap::new();
+ let output_path = std::path::PathBuf::from("/output/server.ts");
+
+ let output =
+ generator.generate_with_schema_imports(&routers, &schema_locations, &output_path);
+
+ assert!(output.contains("const appRouter"));
+ assert!(output.contains("export type AppRouter"));
+ }
+
+ #[test]
+ fn test_generate_multiple_routers_ordering() {
+ let generator = ServerGenerator::new();
+ let routers = vec![
+ create_test_router("ZRouter", Some("z"), vec![]),
+ create_test_router("ARouter", Some("a"), vec![]),
+ create_test_router("MRouter", Some("m"), vec![]),
+ ];
+
+ let output = generator.generate_app_router(&routers);
+
+ let z_pos = output.find("z: t.router").unwrap_or(0);
+ let a_pos = output.find("a: t.router").unwrap_or(0);
+ let m_pos = output.find("m: t.router").unwrap_or(0);
+
+ assert!(z_pos < a_pos, "Order should be preserved (z before a)");
+ assert!(a_pos < m_pos, "Order should be preserved (a before m)");
+ }
+
+ #[test]
+ fn test_generate_procedure_output_only() {
+ let generator = ServerGenerator::new();
+ let procedure = create_test_procedure(
+ "getUser",
+ ProcedureType::Query,
+ None,
+ Some("z.object({ name: z.string() })"),
+ );
+
+ let output = generator.generate_procedure_string(&procedure, 1);
+
+ assert!(!output.contains(".input("));
+ assert!(output.contains(".output(z.object({ name: z.string() }))"));
+ }
+
+ #[test]
+ fn test_camel_case_single_character() {
+ assert_eq!(to_camel_case("X"), "x");
+ }
+
+ #[test]
+ fn test_camel_case_already_lowercase() {
+ assert_eq!(to_camel_case("already"), "already");
+ }
+
+ #[test]
+ fn test_camel_case_numeric_suffix() {
+ assert_eq!(to_camel_case("Router2"), "router2");
+ }
+
+ #[test]
+ fn test_generate_handles_quotes_in_schema() {
+ let generator = ServerGenerator::new();
+ let schema_with_quotes = r#"z.enum(["active", "inactive"])"#;
+
+ let procedure = create_test_procedure(
+ "getStatus",
+ ProcedureType::Query,
+ Some(schema_with_quotes),
+ None,
+ );
+
+ let output = generator.generate_procedure_string(&procedure, 1);
+ assert!(output.contains(r#"z.enum(["active", "inactive"])"#));
+ }
+
+ #[test]
+ fn test_generate_deep_nesting_depth() {
+ let generator = ServerGenerator::new();
+ let procedure = create_test_procedure("deep", ProcedureType::Query, None, None);
+
+ let output = generator.generate_procedure_string(&procedure, 10);
+
+ let first_line = output.lines().next().unwrap();
+ let expected_indent = " ".repeat(10);
+ assert!(first_line.starts_with(&expected_indent));
+ }
+
+ #[test]
+ fn test_extract_schema_refs_both_present() {
+ let procedure = ProcedureMetadata {
+ name: "test".to_string(),
+ procedure_type: ProcedureType::Query,
+ input_schema: Some("inputSchema".to_string()),
+ output_schema: Some("outputSchema".to_string()),
+ input_schema_ref: Some("InputRef".to_string()),
+ output_schema_ref: Some("OutputRef".to_string()),
+ };
+
+ let refs = ServerGenerator::extract_schema_refs(&procedure);
+ assert_eq!(refs.len(), 2);
+ assert!(refs.contains(&"InputRef"));
+ assert!(refs.contains(&"OutputRef"));
+ }
+
+ #[test]
+ fn test_extract_schema_refs_none_present() {
+ let procedure = ProcedureMetadata {
+ name: "test".to_string(),
+ procedure_type: ProcedureType::Query,
+ input_schema: None,
+ output_schema: None,
+ input_schema_ref: None,
+ output_schema_ref: None,
+ };
+
+ let refs = ServerGenerator::extract_schema_refs(&procedure);
+ assert!(refs.is_empty());
+ }
+
+ #[test]
+ fn test_generate_file_header_present() {
+ let generator = ServerGenerator::new();
+ let output = generator.generate(&[]);
+
+ assert!(output.contains("AUTO-GENERATED FILE - DO NOT EDIT!"));
+ assert!(output.contains("nestjs-trpc"));
+ }
+}
diff --git a/packages/nestjs-trpc/cli/src/generator/types.rs b/packages/nestjs-trpc/cli/src/generator/types.rs
new file mode 100644
index 0000000..31d9e38
--- /dev/null
+++ b/packages/nestjs-trpc/cli/src/generator/types.rs
@@ -0,0 +1,487 @@
+use crate::generator::StaticGenerator;
+use crate::parser::context::ContextInfo;
+use crate::parser::middleware::MiddlewareInfo;
+use std::fmt::Write;
+
+const FILE_HEADER: &str = r"/**
+ * AUTO-GENERATED FILE - DO NOT EDIT!
+ *
+ * This file was automatically generated by nestjs-trpc.
+ * Any manual changes will be overwritten on the next generation.
+ *
+ * Command: `npx nestjs-trpc generate`
+ * Learn more: https://nestjs-trpc.io
+ */
+";
+
+#[derive(Debug, Clone)]
+pub struct TypesGenerator {
+ static_generator: StaticGenerator,
+}
+
+impl Default for TypesGenerator {
+ fn default() -> Self {
+ Self::new()
+ }
+}
+
+impl TypesGenerator {
+ #[must_use]
+ pub const fn new() -> Self {
+ Self {
+ static_generator: StaticGenerator::new(),
+ }
+ }
+
+ #[must_use]
+ pub const fn with_static_generator(static_generator: StaticGenerator) -> Self {
+ Self { static_generator }
+ }
+
+ #[must_use]
+ pub fn generate(
+ &self,
+ context: Option<&ContextInfo>,
+ middlewares: &[MiddlewareInfo],
+ ) -> String {
+ let mut output = String::new();
+
+ output.push_str(FILE_HEADER);
+ output.push('\n');
+
+ if let Some(context_info) = context {
+ let context_type = self.generate_context_type(context_info);
+ output.push_str(&context_type);
+ output.push('\n');
+ }
+
+ for middleware in middlewares {
+ self.append_middleware_interface(&mut output, middleware);
+ }
+
+ output
+ }
+
+ fn generate_context_type(&self, context: &ContextInfo) -> String {
+ let terminator = self.terminator();
+ format!(
+ "export type Context = {}{terminator}\n",
+ context.return_type
+ )
+ }
+
+ fn append_middleware_interface(&self, output: &mut String, middleware: &MiddlewareInfo) {
+ if middleware.context_properties.is_empty() {
+ return;
+ }
+ let interface = self.generate_middleware_interface(middleware);
+ output.push_str(&interface);
+ output.push('\n');
+ }
+
+ fn generate_middleware_interface(&self, middleware: &MiddlewareInfo) -> String {
+ let terminator = self.terminator();
+ let interface_name = format!("{}Context", middleware.class_name);
+
+ let mut output = String::new();
+ let _ = writeln!(
+ output,
+ "export interface {interface_name} extends Context {{"
+ );
+
+ for property in &middleware.context_properties {
+ let _ = writeln!(
+ output,
+ " {}: {}{terminator}",
+ property.name, property.type_string
+ );
+ }
+
+ let _ = writeln!(output, "}}");
+
+ output
+ }
+
+ const fn terminator(&self) -> &str {
+ if self.static_generator.use_semicolons {
+ ";"
+ } else {
+ ""
+ }
+ }
+}
+
+#[must_use]
+pub fn generate_types_file(
+ context: Option<&ContextInfo>,
+ middlewares: &[MiddlewareInfo],
+) -> String {
+ TypesGenerator::new().generate(context, middlewares)
+}
+
+#[cfg(test)]
+mod tests {
+ use super::*;
+ use std::path::PathBuf;
+
+ fn create_context_info() -> ContextInfo {
+ ContextInfo {
+ class_name: "AppContext".to_string(),
+ file_path: PathBuf::from("src/app.context.ts"),
+ return_type: "{ req: any; auth: { user: User } }".to_string(),
+ }
+ }
+
+ fn create_middleware_info() -> MiddlewareInfo {
+ use crate::parser::middleware::ContextProperty;
+ MiddlewareInfo {
+ class_name: "ProtectedMiddleware".to_string(),
+ file_path: PathBuf::from("src/protected.middleware.ts"),
+ context_properties: vec![ContextProperty {
+ name: "ben".to_string(),
+ type_string: "number".to_string(),
+ }],
+ }
+ }
+
+ #[test]
+ fn test_generator_creation() {
+ let generator = TypesGenerator::new();
+ assert!(generator.static_generator.use_semicolons);
+ }
+
+ #[test]
+ fn test_generator_default() {
+ let generator = TypesGenerator::default();
+ assert!(generator.static_generator.use_semicolons);
+ }
+
+ #[test]
+ fn test_generate_with_context_only() {
+ let generator = TypesGenerator::new();
+ let context = create_context_info();
+ let output = generator.generate(Some(&context), &[]);
+
+ assert!(output.contains("AUTO-GENERATED FILE"));
+ assert!(output.contains("export type Context = { req: any; auth: { user: User } };"));
+ }
+
+ #[test]
+ fn test_generate_with_middleware_only() {
+ let generator = TypesGenerator::new();
+ let middleware = create_middleware_info();
+ let output = generator.generate(None, &[middleware]);
+
+ assert!(output.contains("AUTO-GENERATED FILE"));
+ assert!(output.contains("export interface ProtectedMiddlewareContext extends Context {"));
+ assert!(output.contains("ben: number;"));
+ }
+
+ #[test]
+ fn test_generate_with_context_and_middleware() {
+ let generator = TypesGenerator::new();
+ let context = create_context_info();
+ let middleware = create_middleware_info();
+ let output = generator.generate(Some(&context), &[middleware]);
+
+ assert!(output.contains("export type Context = { req: any; auth: { user: User } };"));
+ assert!(output.contains("export interface ProtectedMiddlewareContext extends Context {"));
+ assert!(output.contains("ben: number;"));
+ }
+
+ #[test]
+ fn test_generate_empty() {
+ let generator = TypesGenerator::new();
+ let output = generator.generate(None, &[]);
+
+ assert!(output.contains("AUTO-GENERATED FILE"));
+ assert!(!output.contains("export type Context"));
+ assert!(!output.contains("export interface"));
+ }
+
+ #[test]
+ fn test_generate_multiple_middlewares() {
+ use crate::parser::middleware::ContextProperty;
+
+ let generator = TypesGenerator::new();
+ let context = create_context_info();
+
+ let middleware1 = MiddlewareInfo {
+ class_name: "AuthMiddleware".to_string(),
+ file_path: PathBuf::from("auth.middleware.ts"),
+ context_properties: vec![
+ ContextProperty {
+ name: "userId".to_string(),
+ type_string: "string".to_string(),
+ },
+ ContextProperty {
+ name: "isAdmin".to_string(),
+ type_string: "boolean".to_string(),
+ },
+ ],
+ };
+
+ let middleware2 = MiddlewareInfo {
+ class_name: "LoggingMiddleware".to_string(),
+ file_path: PathBuf::from("logging.middleware.ts"),
+ context_properties: vec![],
+ };
+
+ let middleware3 = MiddlewareInfo {
+ class_name: "RateLimitMiddleware".to_string(),
+ file_path: PathBuf::from("rate-limit.middleware.ts"),
+ context_properties: vec![ContextProperty {
+ name: "requestCount".to_string(),
+ type_string: "number".to_string(),
+ }],
+ };
+
+ let output = generator.generate(Some(&context), &[middleware1, middleware2, middleware3]);
+
+ assert!(output.contains("export interface AuthMiddlewareContext extends Context {"));
+ assert!(output.contains("userId: string;"));
+ assert!(output.contains("isAdmin: boolean;"));
+
+ assert!(!output.contains("LoggingMiddlewareContext"));
+
+ assert!(output.contains("export interface RateLimitMiddlewareContext extends Context {"));
+ assert!(output.contains("requestCount: number;"));
+ }
+
+ #[test]
+ fn test_generate_without_semicolons() {
+ let static_generator = StaticGenerator::new().with_semicolons(false);
+ let generator = TypesGenerator::with_static_generator(static_generator);
+ let context = create_context_info();
+ let middleware = create_middleware_info();
+
+ let output = generator.generate(Some(&context), &[middleware]);
+
+ assert!(!output.contains("};"));
+ assert!(output.contains("ben: number\n"));
+ }
+
+ #[test]
+ fn test_convenience_function() {
+ let context = create_context_info();
+ let middleware = create_middleware_info();
+
+ let output = generate_types_file(Some(&context), &[middleware]);
+
+ assert!(output.contains("export type Context"));
+ assert!(output.contains("export interface ProtectedMiddlewareContext"));
+ }
+
+ #[test]
+ fn test_file_header() {
+ let generator = TypesGenerator::new();
+ let output = generator.generate(None, &[]);
+
+ assert!(output.starts_with("/**\n"));
+ assert!(output.contains("AUTO-GENERATED FILE - DO NOT EDIT!"));
+ assert!(output.contains("npx nestjs-trpc generate"));
+ assert!(output.contains("nestjs-trpc.io"));
+ }
+
+ // ========================================================================
+ // Additional edge case tests for types generator (TEST-03)
+ // ========================================================================
+
+ #[test]
+ fn test_generate_context_with_complex_return_type() {
+ let generator = TypesGenerator::new();
+ let context = ContextInfo {
+ class_name: "ComplexContext".to_string(),
+ file_path: PathBuf::from("complex.context.ts"),
+ return_type: "{ req: Request; res: Response; db: Database; cache: Redis; session: Session | null }".to_string(),
+ };
+
+ let output = generator.generate(Some(&context), &[]);
+
+ assert!(output.contains("export type Context = { req: Request; res: Response; db: Database; cache: Redis; session: Session | null };"));
+ }
+
+ #[test]
+ fn test_generate_context_with_generic_type() {
+ let generator = TypesGenerator::new();
+ let context = ContextInfo {
+ class_name: "GenericContext".to_string(),
+ file_path: PathBuf::from("generic.context.ts"),
+ return_type: "{ data: Array> }".to_string(),
+ };
+
+ let output = generator.generate(Some(&context), &[]);
+
+ assert!(output.contains("export type Context = { data: Array> };"));
+ }
+
+ #[test]
+ fn test_generate_middleware_with_many_properties() {
+ use crate::parser::middleware::ContextProperty;
+
+ let generator = TypesGenerator::new();
+ let middleware = MiddlewareInfo {
+ class_name: "ComplexMiddleware".to_string(),
+ file_path: PathBuf::from("complex.middleware.ts"),
+ context_properties: vec![
+ ContextProperty {
+ name: "userId".to_string(),
+ type_string: "string".to_string(),
+ },
+ ContextProperty {
+ name: "roles".to_string(),
+ type_string: "string[]".to_string(),
+ },
+ ContextProperty {
+ name: "permissions".to_string(),
+ type_string: "Set".to_string(),
+ },
+ ContextProperty {
+ name: "metadata".to_string(),
+ type_string: "Record".to_string(),
+ },
+ ContextProperty {
+ name: "timestamp".to_string(),
+ type_string: "Date".to_string(),
+ },
+ ],
+ };
+
+ let output = generator.generate(None, &[middleware]);
+
+ assert!(output.contains("export interface ComplexMiddlewareContext extends Context {"));
+ assert!(output.contains("userId: string;"));
+ assert!(output.contains("roles: string[];"));
+ assert!(output.contains("permissions: Set;"));
+ assert!(output.contains("metadata: Record;"));
+ assert!(output.contains("timestamp: Date;"));
+ }
+
+ #[test]
+ fn test_generate_middleware_with_empty_name() {
+ use crate::parser::middleware::ContextProperty;
+
+ let generator = TypesGenerator::new();
+ let middleware = MiddlewareInfo {
+ class_name: String::new(),
+ file_path: PathBuf::from("empty.middleware.ts"),
+ context_properties: vec![ContextProperty {
+ name: "field".to_string(),
+ type_string: "string".to_string(),
+ }],
+ };
+
+ let output = generator.generate(None, &[middleware]);
+ assert!(output.contains("export interface Context extends Context {"));
+ }
+
+ #[test]
+ fn test_generate_middleware_with_special_property_names() {
+ use crate::parser::middleware::ContextProperty;
+
+ let generator = TypesGenerator::new();
+ let middleware = MiddlewareInfo {
+ class_name: "SpecialMiddleware".to_string(),
+ file_path: PathBuf::from("special.middleware.ts"),
+ context_properties: vec![
+ ContextProperty {
+ name: "$special".to_string(),
+ type_string: "any".to_string(),
+ },
+ ContextProperty {
+ name: "_private".to_string(),
+ type_string: "string".to_string(),
+ },
+ ],
+ };
+
+ let output = generator.generate(None, &[middleware]);
+
+ assert!(output.contains("$special: any;"));
+ assert!(output.contains("_private: string;"));
+ }
+
+ #[test]
+ fn test_generate_context_with_empty_return_type() {
+ let generator = TypesGenerator::new();
+ let context = ContextInfo {
+ class_name: "EmptyContext".to_string(),
+ file_path: PathBuf::from("empty.context.ts"),
+ return_type: "{}".to_string(),
+ };
+
+ let output = generator.generate(Some(&context), &[]);
+
+ assert!(output.contains("export type Context = {};"));
+ }
+
+ #[test]
+ fn test_generate_preserves_middleware_order() {
+ use crate::parser::middleware::ContextProperty;
+
+ let generator = TypesGenerator::new();
+ let middlewares = vec![
+ MiddlewareInfo {
+ class_name: "FirstMiddleware".to_string(),
+ file_path: PathBuf::from("first.middleware.ts"),
+ context_properties: vec![ContextProperty {
+ name: "first".to_string(),
+ type_string: "number".to_string(),
+ }],
+ },
+ MiddlewareInfo {
+ class_name: "SecondMiddleware".to_string(),
+ file_path: PathBuf::from("second.middleware.ts"),
+ context_properties: vec![ContextProperty {
+ name: "second".to_string(),
+ type_string: "number".to_string(),
+ }],
+ },
+ MiddlewareInfo {
+ class_name: "ThirdMiddleware".to_string(),
+ file_path: PathBuf::from("third.middleware.ts"),
+ context_properties: vec![ContextProperty {
+ name: "third".to_string(),
+ type_string: "number".to_string(),
+ }],
+ },
+ ];
+
+ let output = generator.generate(None, &middlewares);
+
+ let first_pos = output.find("FirstMiddlewareContext").unwrap();
+ let second_pos = output.find("SecondMiddlewareContext").unwrap();
+ let third_pos = output.find("ThirdMiddlewareContext").unwrap();
+
+ assert!(first_pos < second_pos, "First should come before Second");
+ assert!(second_pos < third_pos, "Second should come before Third");
+ }
+
+ #[test]
+ fn test_generate_context_and_middleware_together() {
+ use crate::parser::middleware::ContextProperty;
+
+ let generator = TypesGenerator::new();
+ let context = create_context_info();
+ let middleware = MiddlewareInfo {
+ class_name: "AuthMiddleware".to_string(),
+ file_path: PathBuf::from("auth.middleware.ts"),
+ context_properties: vec![ContextProperty {
+ name: "isAuthenticated".to_string(),
+ type_string: "boolean".to_string(),
+ }],
+ };
+
+ let output = generator.generate(Some(&context), &[middleware]);
+
+ let context_pos = output.find("export type Context").unwrap();
+ let middleware_pos = output
+ .find("export interface AuthMiddlewareContext")
+ .unwrap();
+
+ assert!(
+ context_pos < middleware_pos,
+ "Context type should come before middleware interfaces"
+ );
+ }
+}
diff --git a/packages/nestjs-trpc/cli/src/lib.rs b/packages/nestjs-trpc/cli/src/lib.rs
new file mode 100644
index 0000000..a018467
--- /dev/null
+++ b/packages/nestjs-trpc/cli/src/lib.rs
@@ -0,0 +1,76 @@
+// False positives from thiserror/miette derive macros - struct fields are used
+// via string interpolation in #[error(...)] and diagnostic attributes
+#![allow(unused_assignments)]
+
+pub mod config;
+pub mod diagnostic;
+pub mod discovery;
+pub mod error;
+pub mod generation;
+pub mod generator;
+pub mod parser;
+pub mod scanner;
+pub mod validation;
+pub mod watcher;
+
+pub use anyhow::Result;
+pub use config::{Config, GenerationConfig, ParsingConfig};
+pub use diagnostic::{
+ DecoratorDiagnostic, ImportDiagnostic, NoRoutersDiagnostic, SchemaDiagnostic, SourceContext,
+ SyntaxDiagnostic,
+};
+pub use discovery::discover_root_module;
+pub use error::{CliError, ConfigError, GeneratorError, ImportError, ParserError, ScannerError};
+pub use generation::{run_generation, GenerationResult};
+pub use generator::{
+ generate_server_file, generate_static_section, generate_types_file, ServerGenerator,
+ StaticGenerator, TypesGenerator,
+};
+pub use parser::imports::{build_imports_map, DeclarationType, ImportResolver, ResolvedImport};
+pub use parser::procedure::extract_procedures_from_class;
+pub use parser::{
+ extract_context, extract_middleware, extract_middleware_names_from_class, extract_routers,
+ extract_trpc_options, flatten_zod_schema, is_procedure_decorator, parse_typescript_file,
+ parse_typescript_source, resolve_context_file, ContextInfo, ContextParser, ContextProperty,
+ DecoratorParser, MiddlewareInfo, MiddlewareParser, ModuleParser, ParsedFile,
+ ProcedureDecoratorInfo, RouterInfo, RouterParser, TrpcModuleOptions, TsParser, ZodFlattener,
+ ZodResult,
+};
+pub use scanner::{scan_for_routers, FileScanner};
+pub use validation::{
+ compute_diff, find_tsc, run_tsc_validation, DiffResult, TscError, TscResult, TscSeverity,
+};
+pub use watcher::{WatchConfig, WatchSession};
+
+#[derive(Debug, Clone)]
+pub struct RouterMetadata {
+ pub name: String,
+ pub alias: Option,
+ pub file_path: std::path::PathBuf,
+ pub procedures: Vec,
+}
+
+#[derive(Debug, Clone)]
+pub struct ProcedureMetadata {
+ pub name: String,
+ pub procedure_type: ProcedureType,
+ pub input_schema: Option,
+ pub output_schema: Option,
+ pub input_schema_ref: Option,
+ pub output_schema_ref: Option,
+}
+
+#[derive(Debug, Clone, Copy, PartialEq, Eq)]
+pub enum ProcedureType {
+ Query,
+ Mutation,
+}
+
+impl std::fmt::Display for ProcedureType {
+ fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+ match self {
+ Self::Query => write!(f, "query"),
+ Self::Mutation => write!(f, "mutation"),
+ }
+ }
+}
diff --git a/packages/nestjs-trpc/cli/src/main.rs b/packages/nestjs-trpc/cli/src/main.rs
new file mode 100644
index 0000000..a24f9f1
--- /dev/null
+++ b/packages/nestjs-trpc/cli/src/main.rs
@@ -0,0 +1,143 @@
+mod cli;
+
+use std::fs;
+use std::process::ExitCode;
+
+use anyhow::Result;
+use clap::Parser;
+use tracing::debug;
+use tracing_subscriber::filter::LevelFilter;
+use tracing_subscriber::EnvFilter;
+
+use cli::{Cli, Commands};
+use nestjs_trpc::{ParserError, SyntaxDiagnostic};
+
+const EXIT_SUCCESS: u8 = 0;
+const EXIT_RUNTIME_ERROR: u8 = 1;
+const EXIT_USAGE_ERROR: u8 = 2;
+
+fn setup_color_output() {
+ if std::env::var("NO_COLOR").is_ok() {
+ console::set_colors_enabled(false);
+ console::set_colors_enabled_stderr(false);
+ }
+}
+
+#[allow(clippy::expect_used)]
+fn main() -> ExitCode {
+ setup_color_output();
+
+ let cli = match Cli::try_parse() {
+ Ok(cli) => cli,
+ Err(error) => {
+ // SAFETY: If stderr is not writable, there is no way to report errors anyway - panic is the only option
+ error.print().expect("Failed to print CLI error");
+ let exit_code = if error.use_stderr() {
+ EXIT_USAGE_ERROR
+ } else {
+ EXIT_SUCCESS
+ };
+ return ExitCode::from(exit_code);
+ }
+ };
+
+ setup_logging(&cli);
+ debug!(?cli, "Parsed CLI arguments");
+
+ match run(&cli) {
+ Ok(exit_code) => exit_code,
+ Err(error) => {
+ print_error(&error);
+ ExitCode::from(EXIT_RUNTIME_ERROR)
+ }
+ }
+}
+
+fn print_error(error: &anyhow::Error) {
+ if let Some(ParserError::SyntaxError {
+ path,
+ line,
+ column,
+ message,
+ }) = error.downcast_ref::()
+ {
+ if let Ok(content) = fs::read_to_string(path) {
+ let diagnostic = SyntaxDiagnostic::new(path, &content, *line, *column, message.clone());
+ let report = miette::Report::new(diagnostic);
+ eprintln!("{report:?}");
+ return;
+ }
+ }
+
+ let report = miette::Report::msg(format!("{error:#}"));
+ eprintln!("{report:?}");
+}
+
+fn setup_logging(cli: &Cli) {
+ let level = if cli.debug {
+ LevelFilter::TRACE
+ } else {
+ match cli.verbose {
+ 0 => LevelFilter::WARN,
+ 1 => LevelFilter::INFO,
+ 2 => LevelFilter::DEBUG,
+ _ => LevelFilter::TRACE,
+ }
+ };
+
+ let filter = EnvFilter::builder()
+ .with_default_directive(level.into())
+ .from_env_lossy();
+
+ tracing_subscriber::fmt()
+ .with_env_filter(filter)
+ .with_target(cli.debug)
+ .with_file(cli.debug)
+ .with_line_number(cli.debug)
+ .init();
+
+ if cli.debug {
+ debug!("Debug mode enabled - full diagnostic output active");
+ }
+}
+
+fn run(cli: &Cli) -> Result {
+ match &cli.command {
+ Some(Commands::Generate {
+ entrypoint,
+ output,
+ router_pattern,
+ json,
+ dry_run,
+ }) => {
+ return cli::run_generate(
+ entrypoint.as_deref(),
+ output.as_deref(),
+ router_pattern.as_deref(),
+ *dry_run,
+ *json,
+ );
+ }
+ Some(Commands::Watch {
+ entrypoint,
+ output,
+ router_pattern,
+ }) => {
+ cli::run_watch(
+ entrypoint.as_deref(),
+ output.as_deref(),
+ router_pattern.as_deref(),
+ cli.verbose > 0,
+ )?;
+ }
+ None => {
+ tracing::info!("No command specified. Use --help for usage information.");
+ println!("NestJS-tRPC CLI - Generate tRPC routers from decorated TypeScript classes.");
+ println!();
+ println!("Run 'nestjs-trpc --help' for usage information.");
+ println!("Run 'nestjs-trpc generate' to generate the server.ts file.");
+ }
+ }
+
+ Ok(ExitCode::from(EXIT_SUCCESS))
+}
diff --git a/packages/nestjs-trpc/cli/src/parser/context.rs b/packages/nestjs-trpc/cli/src/parser/context.rs
new file mode 100644
index 0000000..e6b3702
--- /dev/null
+++ b/packages/nestjs-trpc/cli/src/parser/context.rs
@@ -0,0 +1,409 @@
+use crate::parser::ParsedFile;
+use std::path::PathBuf;
+use swc_ecma_ast::{
+ BlockStmt, Class, ClassMember, ClassMethod, Decl, Expr, Lit, ModuleDecl, ModuleItem, ObjectLit,
+ Prop, PropName, PropOrSpread, ReturnStmt, Stmt,
+};
+use tracing::{debug, trace};
+
+#[derive(Debug, Clone)]
+pub struct ContextInfo {
+ pub class_name: String,
+ pub file_path: PathBuf,
+ pub return_type: String,
+}
+
+fn filter_create_method(member: &ClassMember) -> Option<&ClassMethod> {
+ let ClassMember::Method(method) = member else {
+ return None;
+ };
+ let method_name = get_method_name(method);
+ (method_name.as_deref() == Some("create")).then_some(method)
+}
+
+fn get_method_name(method: &ClassMethod) -> Option {
+ match &method.key {
+ PropName::Ident(identifier) => Some(identifier.sym.to_string()),
+ PropName::Str(string) => Some(string.value.to_string_lossy().into_owned()),
+ _ => None,
+ }
+}
+
+#[derive(Debug, Clone, Default)]
+pub struct ContextParser;
+
+impl ContextParser {
+ #[must_use]
+ pub const fn new() -> Self {
+ Self
+ }
+
+ pub fn extract_context(
+ &self,
+ parsed_file: &ParsedFile,
+ context_class_name: &str,
+ ) -> Option {
+ debug!(
+ path = ?parsed_file.file_path,
+ class = %context_class_name,
+ "Extracting context class info"
+ );
+
+ let info =
+ parsed_file.module.body.iter().find_map(|item| {
+ self.extract_from_module_item(item, context_class_name, parsed_file)
+ });
+
+ if let Some(ref info) = info {
+ debug!(
+ class = %info.class_name,
+ return_type = %info.return_type,
+ "Extracted context info"
+ );
+ } else {
+ debug!(
+ class = %context_class_name,
+ "Context class not found"
+ );
+ }
+
+ info
+ }
+
+ fn extract_from_module_item(
+ &self,
+ item: &ModuleItem,
+ context_class_name: &str,
+ parsed_file: &ParsedFile,
+ ) -> Option {
+ match item {
+ ModuleItem::ModuleDecl(ModuleDecl::ExportDecl(export_declaration)) => self
+ .extract_from_export_declaration(
+ &export_declaration.decl,
+ context_class_name,
+ parsed_file,
+ ),
+ ModuleItem::Stmt(Stmt::Decl(Decl::Class(class_declaration))) => self
+ .extract_from_class_if_matches(class_declaration, context_class_name, parsed_file),
+ _ => None,
+ }
+ }
+
+ fn extract_from_export_declaration(
+ &self,
+ declaration: &Decl,
+ context_class_name: &str,
+ parsed_file: &ParsedFile,
+ ) -> Option {
+ let Decl::Class(class_declaration) = declaration else {
+ return None;
+ };
+
+ self.extract_from_class_if_matches(class_declaration, context_class_name, parsed_file)
+ }
+
+ fn extract_from_class_if_matches(
+ &self,
+ class_declaration: &swc_ecma_ast::ClassDecl,
+ context_class_name: &str,
+ parsed_file: &ParsedFile,
+ ) -> Option {
+ let class_name = class_declaration.ident.sym.as_ref();
+ let is_target_class = class_name == context_class_name;
+
+ if !is_target_class {
+ return None;
+ }
+
+ self.extract_from_class(class_name, &class_declaration.class, parsed_file)
+ }
+
+ fn extract_from_class(
+ &self,
+ class_name: &str,
+ class: &Class,
+ parsed_file: &ParsedFile,
+ ) -> Option {
+ trace!(class = %class_name, "Searching for create method");
+
+ let create_method = self.find_create_method(class)?;
+ let return_type = self.extract_return_type(create_method, parsed_file)?;
+
+ Some(ContextInfo {
+ class_name: class_name.to_string(),
+ file_path: parsed_file.file_path.clone(),
+ return_type,
+ })
+ }
+
+ #[allow(clippy::unused_self)]
+ fn find_create_method<'a>(&self, class: &'a Class) -> Option<&'a ClassMethod> {
+ let method = class
+ .body
+ .iter()
+ .find_map(|member| filter_create_method(member));
+
+ if method.is_some() {
+ trace!("Found create method");
+ }
+
+ method
+ }
+
+ fn extract_return_type(
+ &self,
+ method: &ClassMethod,
+ _parsed_file: &ParsedFile,
+ ) -> Option {
+ let body = method.function.body.as_ref()?;
+ let return_expression = self.find_return_expression(body)?;
+
+ let return_type = self.expression_to_type_string(return_expression);
+ trace!(return_type = %return_type, "Extracted return type");
+
+ Some(return_type)
+ }
+
+ fn expression_to_type_string(&self, expression: &Expr) -> String {
+ match expression {
+ Expr::Object(object) => self.object_to_type_string(object),
+ Expr::Array(_) => "unknown[]".to_string(),
+ Expr::Lit(literal) => self.literal_to_type_string(literal),
+ Expr::Ident(_) | Expr::Member(_) | Expr::Call(_) | Expr::Await(_) => {
+ "unknown".to_string()
+ }
+ _ => "unknown".to_string(),
+ }
+ }
+
+ fn object_to_type_string(&self, object: &ObjectLit) -> String {
+ let properties: Vec = object
+ .props
+ .iter()
+ .filter_map(|prop| self.property_to_type_string(prop))
+ .collect();
+
+ format!("{{ {} }}", properties.join("; "))
+ }
+
+ fn property_to_type_string(&self, property: &PropOrSpread) -> Option {
+ let PropOrSpread::Prop(property_box) = property else {
+ return None;
+ };
+
+ match &**property_box {
+ Prop::KeyValue(key_value) => {
+ let name = self.get_property_key_name(&key_value.key)?;
+ let value_type = self.expression_to_type_string(&key_value.value);
+ Some(format!("{name}: {value_type}"))
+ }
+ Prop::Shorthand(identifier) => {
+ let name = identifier.sym.to_string();
+ Some(format!("{name}: unknown"))
+ }
+ _ => None,
+ }
+ }
+
+ #[allow(clippy::unused_self)]
+ fn get_property_key_name(&self, key: &PropName) -> Option {
+ match key {
+ PropName::Ident(identifier) => Some(identifier.sym.to_string()),
+ PropName::Str(string) => Some(string.value.to_string_lossy().into_owned()),
+ _ => None,
+ }
+ }
+
+ #[allow(clippy::unused_self)]
+ fn literal_to_type_string(&self, literal: &Lit) -> String {
+ match literal {
+ Lit::Str(_) | Lit::JSXText(_) => "string".to_string(),
+ Lit::Num(_) => "number".to_string(),
+ Lit::Bool(_) => "boolean".to_string(),
+ Lit::Null(_) => "null".to_string(),
+ Lit::BigInt(_) => "bigint".to_string(),
+ Lit::Regex(_) => "RegExp".to_string(),
+ }
+ }
+
+ fn find_return_expression<'a>(&self, body: &'a BlockStmt) -> Option<&'a Expr> {
+ body.stmts
+ .iter()
+ .find_map(|statement| self.find_return_in_statement(statement))
+ }
+
+ fn find_return_in_statement<'a>(&self, statement: &'a Stmt) -> Option<&'a Expr> {
+ match statement {
+ Stmt::Return(ReturnStmt {
+ arg: Some(argument),
+ ..
+ }) => Some(argument),
+ Stmt::Block(block) => self.find_return_expression(block),
+ Stmt::If(if_statement) => self.find_return_in_if_statement(if_statement),
+ Stmt::Try(try_statement) => self.find_return_in_try_statement(try_statement),
+ _ => None,
+ }
+ }
+
+ fn find_return_in_if_statement<'a>(
+ &self,
+ if_statement: &'a swc_ecma_ast::IfStmt,
+ ) -> Option<&'a Expr> {
+ self.find_return_in_statement(&if_statement.cons)
+ .or_else(|| {
+ if_statement
+ .alt
+ .as_ref()
+ .and_then(|alt| self.find_return_in_statement(alt))
+ })
+ }
+
+ fn find_return_in_try_statement<'a>(
+ &self,
+ try_statement: &'a swc_ecma_ast::TryStmt,
+ ) -> Option<&'a Expr> {
+ self.find_return_expression(&try_statement.block)
+ .or_else(|| {
+ try_statement
+ .handler
+ .as_ref()
+ .and_then(|catch| self.find_return_expression(&catch.body))
+ })
+ }
+}
+
+#[must_use]
+pub fn extract_context(parsed_file: &ParsedFile, context_class_name: &str) -> Option {
+ ContextParser::new().extract_context(parsed_file, context_class_name)
+}
+
+#[cfg(test)]
+mod tests {
+ use super::*;
+ use crate::parser::TsParser;
+ use std::fs;
+ use tempfile::TempDir;
+
+ fn create_temp_file(content: &str) -> (TempDir, PathBuf) {
+ let temp_directory = TempDir::new().expect("Failed to create temp dir");
+ let file_path = temp_directory.path().join("app.context.ts");
+ fs::write(&file_path, content).expect("Failed to write test file");
+ (temp_directory, file_path)
+ }
+
+ fn parse_and_extract(source: &str, class_name: &str) -> Option {
+ let (_temp, path) = create_temp_file(source);
+ let parser = TsParser::new();
+ let parsed = parser.parse_file(&path).expect("Failed to parse");
+ ContextParser::new().extract_context(&parsed, class_name)
+ }
+
+ #[test]
+ fn test_extract_context_with_object_return() {
+ let source = r"
+ import { Injectable } from '@nestjs/common';
+ import { ContextOptions, TRPCContext } from 'nestjs-trpc';
+
+ @Injectable()
+ export class AppContext implements TRPCContext {
+ async create(opts: ContextOptions): Promise> {
+ return {
+ req: opts.req,
+ auth: {
+ user: { id: '1', name: 'Test' },
+ },
+ };
+ }
+ }
+ ";
+
+ let info = parse_and_extract(source, "AppContext");
+ assert!(info.is_some());
+
+ let info = info.unwrap();
+ assert_eq!(info.class_name, "AppContext");
+ assert!(info.return_type.contains("req: unknown"));
+ assert!(info
+ .return_type
+ .contains("auth: { user: { id: string; name: string } }"));
+ }
+
+ #[test]
+ fn test_extract_context_simple_return() {
+ let source = r"
+ export class SimpleContext {
+ async create(opts: any) {
+ return { userId: '123' };
+ }
+ }
+ ";
+
+ let info = parse_and_extract(source, "SimpleContext");
+ assert!(info.is_some());
+
+ let info = info.unwrap();
+ assert_eq!(info.class_name, "SimpleContext");
+ assert!(info.return_type.contains("userId: string"));
+ }
+
+ #[test]
+ fn test_extract_context_class_not_found() {
+ let source = r"
+ export class SomeOtherClass {
+ async create(opts: any) {
+ return {};
+ }
+ }
+ ";
+
+ let info = parse_and_extract(source, "AppContext");
+ assert!(info.is_none());
+ }
+
+ #[test]
+ fn test_extract_context_no_create_method() {
+ let source = r"
+ export class AppContext {
+ async initialize(opts: any) {
+ return {};
+ }
+ }
+ ";
+
+ let info = parse_and_extract(source, "AppContext");
+ assert!(info.is_none());
+ }
+
+ #[test]
+ fn test_extract_context_non_exported() {
+ let source = r"
+ class AppContext {
+ async create(opts: any) {
+ return { private: true };
+ }
+ }
+ ";
+
+ let info = parse_and_extract(source, "AppContext");
+ assert!(info.is_some());
+ assert!(info.unwrap().return_type.contains("private: boolean"));
+ }
+
+ #[test]
+ fn test_convenience_function() {
+ let source = r"
+ export class AppContext {
+ async create() {
+ return { test: true };
+ }
+ }
+ ";
+
+ let (_temp, path) = create_temp_file(source);
+ let parser = TsParser::new();
+ let parsed = parser.parse_file(&path).expect("Failed to parse");
+
+ let info = extract_context(&parsed, "AppContext");
+ assert!(info.is_some());
+ }
+}
diff --git a/packages/nestjs-trpc/cli/src/parser/decorator.rs b/packages/nestjs-trpc/cli/src/parser/decorator.rs
new file mode 100644
index 0000000..0c96fa2
--- /dev/null
+++ b/packages/nestjs-trpc/cli/src/parser/decorator.rs
@@ -0,0 +1,714 @@
+use crate::parser::ParsedFile;
+use crate::ProcedureType;
+use swc_ecma_ast::{
+ CallExpr, Callee, Decorator, Expr, ExprOrSpread, ObjectLit, Prop, PropName, PropOrSpread,
+};
+use tracing::{debug, trace, warn};
+
+#[derive(Debug, Clone, PartialEq, Eq)]
+pub struct ProcedureDecoratorInfo {
+ pub procedure_type: ProcedureType,
+ pub input: Option,
+ pub output: Option,
+ pub input_ref: Option,
+ pub output_ref: Option,
+}
+
+#[derive(Debug, Clone, Default)]
+pub struct DecoratorArguments {
+ pub input: Option,
+ pub output: Option,
+ pub input_ref: Option,
+ pub output_ref: Option,
+}
+
+#[derive(Debug, Clone, Default)]
+pub struct DecoratorParser;
+
+impl DecoratorParser {
+ #[must_use]
+ pub const fn new() -> Self {
+ Self
+ }
+
+ #[must_use]
+ pub fn extract_procedure_decorators(
+ &self,
+ decorators: &[Decorator],
+ parsed_file: &ParsedFile,
+ ) -> Vec {
+ decorators
+ .iter()
+ .filter_map(|decorator| {
+ let info = Self::extract_procedure_decorator(decorator, parsed_file)?;
+ debug!(
+ procedure_type = ?info.procedure_type,
+ has_input = info.input.is_some(),
+ has_output = info.output.is_some(),
+ "Extracted procedure decorator"
+ );
+ Some(info)
+ })
+ .collect()
+ }
+
+ fn extract_procedure_decorator(
+ decorator: &Decorator,
+ parsed_file: &ParsedFile,
+ ) -> Option {
+ match &*decorator.expr {
+ Expr::Call(call_expr) => Self::extract_from_call_expr(call_expr, parsed_file),
+ Expr::Ident(ident) => Self::extract_ident_procedure(ident.sym.as_ref()),
+ _ => None,
+ }
+ }
+
+ fn extract_ident_procedure(name: &str) -> Option {
+ let procedure_type = match name {
+ "Query" => ProcedureType::Query,
+ "Mutation" => ProcedureType::Mutation,
+ _ => return None,
+ };
+
+ trace!("Found @{} decorator without arguments", name);
+ Some(ProcedureDecoratorInfo {
+ procedure_type,
+ input: None,
+ output: None,
+ input_ref: None,
+ output_ref: None,
+ })
+ }
+
+ fn extract_from_call_expr(
+ call_expression: &CallExpr,
+ parsed_file: &ParsedFile,
+ ) -> Option {
+ let procedure_type = Self::get_procedure_type_from_callee(&call_expression.callee)?;
+
+ trace!(procedure_type = ?procedure_type, "Found procedure decorator call expression");
+
+ if call_expression.args.is_empty() {
+ return Some(ProcedureDecoratorInfo {
+ procedure_type,
+ input: None,
+ output: None,
+ input_ref: None,
+ output_ref: None,
+ });
+ }
+
+ let first_argument = &call_expression.args[0];
+ let arguments = Self::extract_arguments_from_argument(first_argument, parsed_file);
+
+ Some(ProcedureDecoratorInfo {
+ procedure_type,
+ input: arguments.input,
+ output: arguments.output,
+ input_ref: arguments.input_ref,
+ output_ref: arguments.output_ref,
+ })
+ }
+
+ fn get_procedure_type_from_callee(callee: &Callee) -> Option {
+ let Callee::Expr(expression) = callee else {
+ return None;
+ };
+
+ let Expr::Ident(identifier) = &**expression else {
+ return None;
+ };
+
+ match identifier.sym.as_ref() {
+ "Query" => Some(ProcedureType::Query),
+ "Mutation" => Some(ProcedureType::Mutation),
+ _ => None,
+ }
+ }
+
+ fn extract_arguments_from_argument(
+ argument: &ExprOrSpread,
+ parsed_file: &ParsedFile,
+ ) -> DecoratorArguments {
+ let Expr::Object(object_literal) = &*argument.expr else {
+ warn!("Procedure decorator argument is not an object literal");
+ return DecoratorArguments::default();
+ };
+
+ Self::extract_arguments_from_object(object_literal, parsed_file)
+ }
+
+ fn extract_arguments_from_object(
+ object: &ObjectLit,
+ parsed_file: &ParsedFile,
+ ) -> DecoratorArguments {
+ let mut arguments = DecoratorArguments::default();
+
+ for property_or_spread in &object.props {
+ Self::extract_property_into_arguments(property_or_spread, parsed_file, &mut arguments);
+ }
+
+ arguments
+ }
+
+ fn extract_property_into_arguments(
+ property_or_spread: &PropOrSpread,
+ parsed_file: &ParsedFile,
+ arguments: &mut DecoratorArguments,
+ ) {
+ let PropOrSpread::Prop(property) = property_or_spread else {
+ return;
+ };
+
+ let Prop::KeyValue(key_value) = &**property else {
+ return;
+ };
+
+ let Some(property_name) = Self::get_property_name(&key_value.key) else {
+ return;
+ };
+
+ match property_name.as_str() {
+ "input" => {
+ arguments.input = Some(Self::extract_value_text(&key_value.value, parsed_file));
+ arguments.input_ref = Self::extract_identifier_name(&key_value.value);
+ trace!(input = ?arguments.input, input_ref = ?arguments.input_ref, "Extracted input property");
+ }
+ "output" => {
+ arguments.output = Some(Self::extract_value_text(&key_value.value, parsed_file));
+ arguments.output_ref = Self::extract_identifier_name(&key_value.value);
+ trace!(output = ?arguments.output, output_ref = ?arguments.output_ref, "Extracted output property");
+ }
+ _ => {}
+ }
+ }
+
+ fn get_property_name(key: &PropName) -> Option {
+ match key {
+ PropName::Ident(ident) => Some(ident.sym.to_string()),
+ PropName::Str(s) => Some(s.value.to_string_lossy().into_owned()),
+ _ => None,
+ }
+ }
+
+ fn extract_value_text(expr: &Expr, parsed_file: &ParsedFile) -> String {
+ let span = match expr {
+ Expr::Call(call) => call.span,
+ Expr::Ident(ident) => ident.span,
+ Expr::Object(obj) => obj.span,
+ Expr::Member(member) => member.span,
+ Expr::Array(arr) => arr.span,
+ _ => Self::get_expr_span(expr),
+ };
+
+ parsed_file.get_source_text(span)
+ }
+
+ fn extract_identifier_name(expr: &Expr) -> Option {
+ match expr {
+ Expr::Ident(ident) => Some(ident.sym.to_string()),
+ _ => None,
+ }
+ }
+
+ fn get_expr_span(expr: &Expr) -> swc_common::Span {
+ use swc_ecma_ast::{Expr, Lit};
+ match expr {
+ Expr::This(e) => e.span,
+ Expr::Array(e) => e.span,
+ Expr::Object(e) => e.span,
+ Expr::Fn(e) => e.function.span,
+ Expr::Unary(e) => e.span,
+ Expr::Update(e) => e.span,
+ Expr::Bin(e) => e.span,
+ Expr::Assign(e) => e.span,
+ Expr::Member(e) => e.span,
+ Expr::SuperProp(e) => e.span,
+ Expr::Cond(e) => e.span,
+ Expr::Call(e) => e.span,
+ Expr::New(e) => e.span,
+ Expr::Seq(e) => e.span,
+ Expr::Ident(e) => e.span,
+ Expr::Lit(e) => match e {
+ Lit::Str(s) => s.span,
+ Lit::Bool(b) => b.span,
+ Lit::Null(n) => n.span,
+ Lit::Num(n) => n.span,
+ Lit::BigInt(b) => b.span,
+ Lit::Regex(r) => r.span,
+ Lit::JSXText(j) => j.span,
+ },
+ Expr::Tpl(e) => e.span,
+ Expr::TaggedTpl(e) => e.span,
+ Expr::Arrow(e) => e.span,
+ Expr::Class(e) => e.class.span,
+ Expr::Yield(e) => e.span,
+ Expr::MetaProp(e) => e.span,
+ Expr::Await(e) => e.span,
+ Expr::Paren(e) => e.span,
+ Expr::JSXMember(e) => e.prop.span,
+ Expr::JSXNamespacedName(e) => e.name.span,
+ Expr::JSXEmpty(e) => e.span,
+ Expr::JSXElement(e) => e.span,
+ Expr::JSXFragment(e) => e.span,
+ Expr::TsTypeAssertion(e) => e.span,
+ Expr::TsConstAssertion(e) => e.span,
+ Expr::TsNonNull(e) => e.span,
+ Expr::TsAs(e) => e.span,
+ Expr::TsInstantiation(e) => e.span,
+ Expr::TsSatisfies(e) => e.span,
+ Expr::PrivateName(e) => e.span,
+ Expr::OptChain(e) => e.span,
+ Expr::Invalid(e) => e.span,
+ }
+ }
+}
+
+#[must_use]
+pub fn is_procedure_decorator(decorator: &Decorator) -> bool {
+ match &*decorator.expr {
+ Expr::Call(call_expr) => is_procedure_call(call_expr),
+ Expr::Ident(ident) => is_procedure_name(ident.sym.as_ref()),
+ _ => false,
+ }
+}
+
+fn is_procedure_call(call_expression: &CallExpr) -> bool {
+ let Callee::Expr(expression) = &call_expression.callee else {
+ return false;
+ };
+ let Expr::Ident(ident) = &**expression else {
+ return false;
+ };
+ is_procedure_name(ident.sym.as_ref())
+}
+
+fn is_procedure_name(name: &str) -> bool {
+ name == "Query" || name == "Mutation"
+}
+
+#[cfg(test)]
+fn extract_class_from_module_item(item: &swc_ecma_ast::ModuleItem) -> Option<&swc_ecma_ast::Class> {
+ use swc_ecma_ast::{Decl, ModuleDecl, ModuleItem, Stmt};
+ if let ModuleItem::ModuleDecl(ModuleDecl::ExportDecl(export)) = item {
+ if let Decl::Class(class_decl) = &export.decl {
+ return Some(&class_decl.class);
+ }
+ }
+ if let ModuleItem::Stmt(Stmt::Decl(Decl::Class(class_decl))) = item {
+ return Some(&class_decl.class);
+ }
+ None
+}
+
+#[cfg(test)]
+fn extract_method_if_named<'a>(
+ member: &'a swc_ecma_ast::ClassMember,
+ name: &str,
+) -> Option<&'a Vec> {
+ use swc_ecma_ast::ClassMember;
+ let ClassMember::Method(method) = member else {
+ return None;
+ };
+ let ident = method.key.as_ident()?;
+ if ident.sym.as_ref() == name {
+ return Some(&method.function.decorators);
+ }
+ None
+}
+
+#[cfg(test)]
+mod tests {
+ use super::*;
+ use crate::parser::TsParser;
+ use std::fs;
+ use std::path::PathBuf;
+ use tempfile::TempDir;
+
+ fn create_temp_file(content: &str) -> (TempDir, PathBuf) {
+ let temp_dir = TempDir::new().expect("Failed to create temp dir");
+ let file_path = temp_dir.path().join("test.router.ts");
+ fs::write(&file_path, content).expect("Failed to write test file");
+ (temp_dir, file_path)
+ }
+
+ fn parse_file(source: &str) -> (TempDir, ParsedFile) {
+ let (temp_dir, path) = create_temp_file(source);
+ let parser = TsParser::new();
+ let parsed = parser.parse_file(&path).expect("Failed to parse");
+ (temp_dir, parsed)
+ }
+
+ fn get_method_decorators<'a>(
+ parsed: &'a ParsedFile,
+ method_name: &str,
+ ) -> Option<&'a Vec> {
+ parsed
+ .module
+ .body
+ .iter()
+ .filter_map(extract_class_from_module_item)
+ .flat_map(|class| &class.body)
+ .find_map(|member| extract_method_if_named(member, method_name))
+ }
+
+ #[test]
+ fn test_decorator_parser_creation() {
+ let parser = DecoratorParser::new();
+ assert_eq!(std::mem::size_of_val(&parser), 0);
+ }
+
+ #[test]
+ fn test_decorator_parser_default() {
+ let parser = DecoratorParser;
+ assert_eq!(std::mem::size_of_val(&parser), 0);
+ }
+
+ #[test]
+ fn test_extract_query_decorator_with_input() {
+ let source = r"
+ function Query(opts?: { input?: any }): MethodDecorator {
+ return (target, key, desc) => desc;
+ }
+
+ export class UserRouter {
+ @Query({ input: z.object({ userId: z.string() }) })
+ async getUserById() {}
+ }
+ ";
+
+ let (_temp, parsed) = parse_file(source);
+ let decorators = get_method_decorators(&parsed, "getUserById").expect("Method not found");
+ let decorator_parser = DecoratorParser::new();
+ let results = decorator_parser.extract_procedure_decorators(decorators, &parsed);
+
+ assert_eq!(results.len(), 1);
+ assert_eq!(results[0].procedure_type, ProcedureType::Query);
+ assert!(results[0].input.is_some());
+ assert!(results[0].input.as_ref().unwrap().contains("z.object"));
+ assert!(results[0].input.as_ref().unwrap().contains("userId"));
+ assert!(results[0].output.is_none());
+ }
+
+ #[test]
+ fn test_extract_query_decorator_with_input_and_output() {
+ let source = r"
+ function Query(opts?: { input?: any; output?: any }): MethodDecorator {
+ return (target, key, desc) => desc;
+ }
+
+ export class UserRouter {
+ @Query({
+ input: z.object({ userId: z.string() }),
+ output: z.object({ name: z.string() })
+ })
+ async getUserById() {}
+ }
+ ";
+
+ let (_temp, parsed) = parse_file(source);
+ let decorators = get_method_decorators(&parsed, "getUserById").expect("Method not found");
+ let decorator_parser = DecoratorParser::new();
+ let results = decorator_parser.extract_procedure_decorators(decorators, &parsed);
+
+ assert_eq!(results.len(), 1);
+ assert_eq!(results[0].procedure_type, ProcedureType::Query);
+ assert!(results[0].input.is_some());
+ assert!(results[0].output.is_some());
+ assert!(results[0].output.as_ref().unwrap().contains("name"));
+ }
+
+ #[test]
+ fn test_extract_mutation_decorator() {
+ let source = r"
+ function Mutation(opts?: { input?: any }): MethodDecorator {
+ return (target, key, desc) => desc;
+ }
+
+ export class UserRouter {
+ @Mutation({ input: z.object({ name: z.string() }) })
+ async createUser() {}
+ }
+ ";
+
+ let (_temp, parsed) = parse_file(source);
+ let decorators = get_method_decorators(&parsed, "createUser").expect("Method not found");
+ let decorator_parser = DecoratorParser::new();
+ let results = decorator_parser.extract_procedure_decorators(decorators, &parsed);
+
+ assert_eq!(results.len(), 1);
+ assert_eq!(results[0].procedure_type, ProcedureType::Mutation);
+ assert!(results[0].input.is_some());
+ }
+
+ #[test]
+ fn test_extract_query_without_arguments() {
+ let source = r"
+ function Query(opts?: any): MethodDecorator {
+ return (target, key, desc) => desc;
+ }
+
+ export class UserRouter {
+ @Query()
+ async getAll() {}
+ }
+ ";
+
+ let (_temp, parsed) = parse_file(source);
+ let decorators = get_method_decorators(&parsed, "getAll").expect("Method not found");
+ let decorator_parser = DecoratorParser::new();
+ let results = decorator_parser.extract_procedure_decorators(decorators, &parsed);
+
+ assert_eq!(results.len(), 1);
+ assert_eq!(results[0].procedure_type, ProcedureType::Query);
+ assert!(results[0].input.is_none());
+ assert!(results[0].output.is_none());
+ }
+
+ #[test]
+ fn test_extract_query_no_parentheses() {
+ let source = r"
+ function Query(target: any, key: string, desc: PropertyDescriptor): PropertyDescriptor {
+ return desc;
+ }
+
+ export class UserRouter {
+ @Query
+ async getAll() {}
+ }
+ ";
+
+ let (_temp, parsed) = parse_file(source);
+ let decorators = get_method_decorators(&parsed, "getAll").expect("Method not found");
+ let decorator_parser = DecoratorParser::new();
+ let results = decorator_parser.extract_procedure_decorators(decorators, &parsed);
+
+ assert_eq!(results.len(), 1);
+ assert_eq!(results[0].procedure_type, ProcedureType::Query);
+ assert!(results[0].input.is_none());
+ }
+
+ #[test]
+ fn test_ignore_non_procedure_decorators() {
+ let source = r"
+ function Query(opts?: any): MethodDecorator {
+ return (target, key, desc) => desc;
+ }
+
+ function UseGuards(guard: any): MethodDecorator {
+ return (target, key, desc) => desc;
+ }
+
+ export class UserRouter {
+ @UseGuards('admin')
+ @Query({ input: z.string() })
+ async adminOnly() {}
+ }
+ ";
+
+ let (_temp, parsed) = parse_file(source);
+ let decorators = get_method_decorators(&parsed, "adminOnly").expect("Method not found");
+ let decorator_parser = DecoratorParser::new();
+ let results = decorator_parser.extract_procedure_decorators(decorators, &parsed);
+
+ // Should only extract @Query, not @UseGuards
+ assert_eq!(results.len(), 1);
+ assert_eq!(results[0].procedure_type, ProcedureType::Query);
+ }
+
+ #[test]
+ fn test_extract_with_variable_reference() {
+ let source = r"
+ function Query(opts?: any): MethodDecorator {
+ return (target, key, desc) => desc;
+ }
+
+ export class UserRouter {
+ @Query({ input: userInputSchema, output: userSchema })
+ async getUser() {}
+ }
+ ";
+
+ let (_temp, parsed) = parse_file(source);
+ let decorators = get_method_decorators(&parsed, "getUser").expect("Method not found");
+ let decorator_parser = DecoratorParser::new();
+ let results = decorator_parser.extract_procedure_decorators(decorators, &parsed);
+
+ assert_eq!(results.len(), 1);
+ // Variable references should be extracted as the identifier name
+ assert_eq!(results[0].input, Some("userInputSchema".to_string()));
+ assert_eq!(results[0].output, Some("userSchema".to_string()));
+ }
+
+ #[test]
+ fn test_extract_output_only() {
+ let source = r"
+ function Query(opts?: { output?: any }): MethodDecorator {
+ return (target, key, desc) => desc;
+ }
+
+ export class UserRouter {
+ @Query({ output: z.array(z.string()) })
+ async getNames() {}
+ }
+ ";
+
+ let (_temp, parsed) = parse_file(source);
+ let decorators = get_method_decorators(&parsed, "getNames").expect("Method not found");
+ let decorator_parser = DecoratorParser::new();
+ let results = decorator_parser.extract_procedure_decorators(decorators, &parsed);
+
+ assert_eq!(results.len(), 1);
+ assert!(results[0].input.is_none());
+ assert!(results[0].output.is_some());
+ assert!(results[0].output.as_ref().unwrap().contains("z.array"));
+ }
+
+ #[test]
+ fn test_extract_multiple_methods() {
+ let source = r"
+ function Query(opts?: any): MethodDecorator {
+ return (target, key, desc) => desc;
+ }
+
+ function Mutation(opts?: any): MethodDecorator {
+ return (target, key, desc) => desc;
+ }
+
+ export class UserRouter {
+ @Query({ input: z.string() })
+ async getUser() {}
+
+ @Mutation({ input: z.object({ name: z.string() }) })
+ async createUser() {}
+ }
+ ";
+
+ let (_temp, parsed) = parse_file(source);
+ let decorator_parser = DecoratorParser::new();
+
+ // Check getUser method
+ let decorators1 = get_method_decorators(&parsed, "getUser").expect("Method not found");
+ let results1 = decorator_parser.extract_procedure_decorators(decorators1, &parsed);
+ assert_eq!(results1.len(), 1);
+ assert_eq!(results1[0].procedure_type, ProcedureType::Query);
+
+ // Check createUser method
+ let decorators2 = get_method_decorators(&parsed, "createUser").expect("Method not found");
+ let results2 = decorator_parser.extract_procedure_decorators(decorators2, &parsed);
+ assert_eq!(results2.len(), 1);
+ assert_eq!(results2[0].procedure_type, ProcedureType::Mutation);
+ }
+
+ #[test]
+ fn test_is_procedure_decorator() {
+ let source = r"
+ function Query(opts?: any): MethodDecorator {
+ return (target, key, desc) => desc;
+ }
+
+ function Injectable(): ClassDecorator {
+ return (target) => target;
+ }
+
+ export class UserRouter {
+ @Query({ input: z.string() })
+ async getUser() {}
+ }
+ ";
+
+ let (_temp, parsed) = parse_file(source);
+ let decorators = get_method_decorators(&parsed, "getUser").expect("Method not found");
+
+ assert!(!decorators.is_empty());
+ assert!(is_procedure_decorator(&decorators[0]));
+ }
+
+ #[test]
+ fn test_complex_zod_schema() {
+ let source = r"
+ function Query(opts?: any): MethodDecorator {
+ return (target, key, desc) => desc;
+ }
+
+ export class UserRouter {
+ @Query({
+ input: z.object({
+ userId: z.string().uuid(),
+ options: z.object({
+ includeProfile: z.boolean().optional(),
+ limit: z.number().min(1).max(100)
+ }).optional()
+ }),
+ output: z.object({
+ id: z.string(),
+ name: z.string(),
+ email: z.string().email()
+ })
+ })
+ async getUser() {}
+ }
+ ";
+
+ let (_temp, parsed) = parse_file(source);
+ let decorators = get_method_decorators(&parsed, "getUser").expect("Method not found");
+ let decorator_parser = DecoratorParser::new();
+ let results = decorator_parser.extract_procedure_decorators(decorators, &parsed);
+
+ assert_eq!(results.len(), 1);
+ let input = results[0].input.as_ref().unwrap();
+ assert!(input.contains("userId"));
+ assert!(input.contains("uuid"));
+ assert!(input.contains("includeProfile"));
+ assert!(input.contains("boolean"));
+
+ let output = results[0].output.as_ref().unwrap();
+ assert!(output.contains("email"));
+ }
+
+ #[test]
+ fn test_procedure_decorator_info_equality() {
+ let info1 = ProcedureDecoratorInfo {
+ procedure_type: ProcedureType::Query,
+ input: Some("z.string()".to_string()),
+ output: None,
+ input_ref: None,
+ output_ref: None,
+ };
+ let info2 = ProcedureDecoratorInfo {
+ procedure_type: ProcedureType::Query,
+ input: Some("z.string()".to_string()),
+ output: None,
+ input_ref: None,
+ output_ref: None,
+ };
+ assert_eq!(info1, info2);
+ }
+
+ #[test]
+ fn test_procedure_decorator_info_clone() {
+ let info = ProcedureDecoratorInfo {
+ procedure_type: ProcedureType::Mutation,
+ input: Some("z.object({})".to_string()),
+ output: Some("z.void()".to_string()),
+ input_ref: None,
+ output_ref: None,
+ };
+ let cloned = info.clone();
+ assert_eq!(info, cloned);
+ }
+
+ #[test]
+ fn test_procedure_decorator_info_debug() {
+ let info = ProcedureDecoratorInfo {
+ procedure_type: ProcedureType::Query,
+ input: Some("test".to_string()),
+ output: None,
+ input_ref: None,
+ output_ref: None,
+ };
+ let debug_str = format!("{info:?}");
+ assert!(debug_str.contains("Query"));
+ assert!(debug_str.contains("test"));
+ }
+}
diff --git a/packages/nestjs-trpc/cli/src/parser/imports/barrel.rs b/packages/nestjs-trpc/cli/src/parser/imports/barrel.rs
new file mode 100644
index 0000000..cb4599d
--- /dev/null
+++ b/packages/nestjs-trpc/cli/src/parser/imports/barrel.rs
@@ -0,0 +1,130 @@
+use super::module_path::resolve_module_path;
+use std::path::{Path, PathBuf};
+use swc_ecma_ast::{
+ ExportNamedSpecifier, ExportSpecifier, ModuleDecl, ModuleExportName, ModuleItem,
+};
+use tracing::trace;
+
+/// Information about a named export found in a barrel file.
+pub struct BarrelExport {
+ pub original_name: String,
+ #[allow(dead_code)] // Available for future use when tracking export aliasing
+ pub exported_name: String,
+ pub source_path: PathBuf,
+}
+
+/// Information about a star export (export * from './module').
+pub struct StarExport {
+ pub source_path: PathBuf,
+}
+
+/// Result of scanning a barrel file for exports.
+pub enum BarrelExportMatch {
+ Named(BarrelExport),
+ Star(StarExport),
+ None,
+}
+
+/// Checks if a module item contains an export matching the given name.
+/// Returns information needed to resolve the export.
+pub fn find_export_in_barrel_item(
+ item: &ModuleItem,
+ target_name: &str,
+ barrel_directory: &Path,
+) -> BarrelExportMatch {
+ match item {
+ ModuleItem::ModuleDecl(ModuleDecl::ExportNamed(export_named)) => {
+ find_in_named_export(export_named, target_name, barrel_directory)
+ }
+ ModuleItem::ModuleDecl(ModuleDecl::ExportAll(export_all)) => {
+ find_in_star_export(export_all, barrel_directory)
+ }
+ _ => BarrelExportMatch::None,
+ }
+}
+
+fn find_in_named_export(
+ export_named: &swc_ecma_ast::NamedExport,
+ target_name: &str,
+ barrel_directory: &Path,
+) -> BarrelExportMatch {
+ let Some(source) = &export_named.src else {
+ return BarrelExportMatch::None;
+ };
+
+ let module_specifier = source.value.to_string_lossy().into_owned();
+ if !is_relative_path(&module_specifier) {
+ return BarrelExportMatch::None;
+ }
+
+ let Some(resolved_path) = resolve_module_path(barrel_directory, &module_specifier) else {
+ return BarrelExportMatch::None;
+ };
+
+ export_named
+ .specifiers
+ .iter()
+ .find_map(|specifier| match_named_export_specifier(specifier, target_name, &resolved_path))
+ .map_or(BarrelExportMatch::None, BarrelExportMatch::Named)
+}
+
+fn find_in_star_export(
+ export_all: &swc_ecma_ast::ExportAll,
+ barrel_directory: &Path,
+) -> BarrelExportMatch {
+ let module_specifier = export_all.src.value.to_string_lossy().into_owned();
+ if !is_relative_path(&module_specifier) {
+ return BarrelExportMatch::None;
+ }
+
+ let Some(resolved_path) = resolve_module_path(barrel_directory, &module_specifier) else {
+ return BarrelExportMatch::None;
+ };
+
+ BarrelExportMatch::Star(StarExport {
+ source_path: resolved_path,
+ })
+}
+
+fn is_relative_path(specifier: &str) -> bool {
+ specifier.starts_with('.') || specifier.starts_with('/')
+}
+
+fn match_named_export_specifier(
+ specifier: &ExportSpecifier,
+ target_name: &str,
+ resolved_path: &Path,
+) -> Option {
+ let ExportSpecifier::Named(ExportNamedSpecifier { orig, exported, .. }) = specifier else {
+ return None;
+ };
+
+ let original_name = get_module_export_name(orig);
+ let exported_name = exported
+ .as_ref()
+ .map_or_else(|| original_name.clone(), get_module_export_name);
+
+ if exported_name != target_name {
+ return None;
+ }
+
+ trace!(
+ original = %original_name,
+ exported = %exported_name,
+ path = ?resolved_path,
+ "Found matching barrel export"
+ );
+
+ Some(BarrelExport {
+ original_name,
+ exported_name,
+ source_path: resolved_path.to_path_buf(),
+ })
+}
+
+fn get_module_export_name(name: &ModuleExportName) -> String {
+ match name {
+ ModuleExportName::Ident(identifier) => identifier.sym.to_string(),
+ ModuleExportName::Str(string) => string.value.to_string_lossy().into_owned(),
+ }
+}
diff --git a/packages/nestjs-trpc/cli/src/parser/imports/circular.rs b/packages/nestjs-trpc/cli/src/parser/imports/circular.rs
new file mode 100644
index 0000000..6963db6
--- /dev/null
+++ b/packages/nestjs-trpc/cli/src/parser/imports/circular.rs
@@ -0,0 +1,91 @@
+use super::module_path::resolve_module_path;
+use crate::parser::ParsedFile;
+use std::collections::HashSet;
+use std::path::{Path, PathBuf};
+use swc_ecma_ast::{ModuleDecl, ModuleItem};
+
+/// Tracks state during circular import detection traversal.
+pub struct CircularImportTracker {
+ pub visited: HashSet,
+ pub path_stack: Vec,
+ pub cycles: Vec,
+}
+
+impl CircularImportTracker {
+ pub fn new() -> Self {
+ Self {
+ visited: HashSet::new(),
+ path_stack: Vec::new(),
+ cycles: Vec::new(),
+ }
+ }
+
+ /// Returns true if the path is already in the current traversal stack (cycle detected).
+ pub fn is_in_current_path(&self, file_path: &Path) -> bool {
+ self.path_stack.contains(&file_path.to_path_buf())
+ }
+
+ /// Returns true if the path has already been fully visited.
+ pub fn is_visited(&self, file_path: &Path) -> bool {
+ self.visited.contains(file_path)
+ }
+
+ /// Records a cycle starting from the given path.
+ pub fn record_cycle(&mut self, file_path: &Path) {
+ let cycle_start = self
+ .path_stack
+ .iter()
+ .position(|path| path == file_path)
+ .unwrap_or(0);
+
+ let cycle: Vec<_> = self.path_stack[cycle_start..]
+ .iter()
+ .map(|path| path.display().to_string())
+ .collect();
+
+ self.cycles
+ .push(format!("{} -> {}", cycle.join(" -> "), file_path.display()));
+ }
+
+ /// Pushes a path onto the current traversal stack.
+ pub fn push_path(&mut self, file_path: &Path) {
+ self.path_stack.push(file_path.to_path_buf());
+ }
+
+ /// Pops a path from the traversal stack and marks it as visited.
+ pub fn pop_and_mark_visited(&mut self, file_path: &Path) {
+ self.path_stack.pop();
+ self.visited.insert(file_path.to_path_buf());
+ }
+}
+
+impl Default for CircularImportTracker {
+ fn default() -> Self {
+ Self::new()
+ }
+}
+
+/// Extracts import paths from a parsed file.
+/// Returns only relative imports (starting with . or /).
+pub fn extract_import_paths(parsed: &ParsedFile, source_directory: &Path) -> Vec {
+ let mut import_paths = Vec::new();
+
+ for item in &parsed.module.body {
+ let ModuleItem::ModuleDecl(ModuleDecl::Import(import_declaration)) = item else {
+ continue;
+ };
+
+ let module_specifier = import_declaration.src.value.to_string_lossy().into_owned();
+ let is_relative = module_specifier.starts_with('.') || module_specifier.starts_with('/');
+
+ if !is_relative {
+ continue;
+ }
+
+ if let Some(resolved_path) = resolve_module_path(source_directory, &module_specifier) {
+ import_paths.push(resolved_path);
+ }
+ }
+
+ import_paths
+}
diff --git a/packages/nestjs-trpc/cli/src/parser/imports/declarations.rs b/packages/nestjs-trpc/cli/src/parser/imports/declarations.rs
new file mode 100644
index 0000000..f3ae7ae
--- /dev/null
+++ b/packages/nestjs-trpc/cli/src/parser/imports/declarations.rs
@@ -0,0 +1,168 @@
+use super::types::{DeclarationType, ResolvedImport};
+use crate::parser::ParsedFile;
+use swc_common::Span;
+use swc_ecma_ast::{Decl, ExportDecl, ModuleDecl, ModuleItem, Stmt, VarDecl};
+
+/// Finds a declaration by name in a parsed file.
+/// Searches through all module items for matching declarations.
+pub fn find_declaration_in_file(parsed: &ParsedFile, name: &str) -> Option {
+ parsed
+ .module
+ .body
+ .iter()
+ .find_map(|item| match_declaration_item(item, parsed, name))
+}
+
+fn match_declaration_item(
+ item: &ModuleItem,
+ parsed: &ParsedFile,
+ name: &str,
+) -> Option {
+ match item {
+ ModuleItem::Stmt(Stmt::Decl(Decl::Var(variable_declaration)))
+ | ModuleItem::ModuleDecl(ModuleDecl::ExportDecl(ExportDecl {
+ decl: Decl::Var(variable_declaration),
+ ..
+ })) => find_variable_declaration(variable_declaration, parsed, name),
+
+ ModuleItem::Stmt(Stmt::Decl(Decl::Class(class_declaration)))
+ | ModuleItem::ModuleDecl(ModuleDecl::ExportDecl(ExportDecl {
+ decl: Decl::Class(class_declaration),
+ ..
+ })) => match_class_declaration(class_declaration, parsed, name),
+
+ ModuleItem::Stmt(Stmt::Decl(Decl::Fn(function_declaration)))
+ | ModuleItem::ModuleDecl(ModuleDecl::ExportDecl(ExportDecl {
+ decl: Decl::Fn(function_declaration),
+ ..
+ })) => match_function_declaration(function_declaration, parsed, name),
+
+ ModuleItem::Stmt(Stmt::Decl(Decl::TsInterface(interface_declaration)))
+ | ModuleItem::ModuleDecl(ModuleDecl::ExportDecl(ExportDecl {
+ decl: Decl::TsInterface(interface_declaration),
+ ..
+ })) => match_interface_declaration(interface_declaration, parsed, name),
+
+ ModuleItem::Stmt(Stmt::Decl(Decl::TsEnum(enum_declaration)))
+ | ModuleItem::ModuleDecl(ModuleDecl::ExportDecl(ExportDecl {
+ decl: Decl::TsEnum(enum_declaration),
+ ..
+ })) => match_enum_declaration(enum_declaration, parsed, name),
+
+ ModuleItem::Stmt(Stmt::Decl(Decl::TsTypeAlias(type_declaration)))
+ | ModuleItem::ModuleDecl(ModuleDecl::ExportDecl(ExportDecl {
+ decl: Decl::TsTypeAlias(type_declaration),
+ ..
+ })) => match_type_alias_declaration(type_declaration, parsed, name),
+
+ _ => None,
+ }
+}
+
+fn find_variable_declaration(
+ variable_declaration: &VarDecl,
+ parsed: &ParsedFile,
+ name: &str,
+) -> Option {
+ let span = find_variable_declaration_span(variable_declaration, name)?;
+ Some(ResolvedImport {
+ name: name.to_string(),
+ source_file: parsed.file_path.clone(),
+ declaration_span: span,
+ declaration_type: DeclarationType::Variable,
+ })
+}
+
+/// Finds a variable declaration by name and returns its span.
+pub fn find_variable_declaration_span(variable_declaration: &VarDecl, name: &str) -> Option {
+ let has_name = variable_declaration.decls.iter().any(|declarator| {
+ matches!(&declarator.name, swc_ecma_ast::Pat::Ident(identifier) if identifier.id.sym.as_ref() == name)
+ });
+
+ has_name.then_some(variable_declaration.span)
+}
+
+fn match_class_declaration(
+ class_declaration: &swc_ecma_ast::ClassDecl,
+ parsed: &ParsedFile,
+ name: &str,
+) -> Option {
+ if class_declaration.ident.sym.as_ref() != name {
+ return None;
+ }
+
+ Some(ResolvedImport {
+ name: name.to_string(),
+ source_file: parsed.file_path.clone(),
+ declaration_span: class_declaration.class.span,
+ declaration_type: DeclarationType::Class,
+ })
+}
+
+fn match_function_declaration(
+ function_declaration: &swc_ecma_ast::FnDecl,
+ parsed: &ParsedFile,
+ name: &str,
+) -> Option {
+ if function_declaration.ident.sym.as_ref() != name {
+ return None;
+ }
+
+ Some(ResolvedImport {
+ name: name.to_string(),
+ source_file: parsed.file_path.clone(),
+ declaration_span: function_declaration.function.span,
+ declaration_type: DeclarationType::Function,
+ })
+}
+
+fn match_interface_declaration(
+ interface_declaration: &swc_ecma_ast::TsInterfaceDecl,
+ parsed: &ParsedFile,
+ name: &str,
+) -> Option {
+ if interface_declaration.id.sym.as_ref() != name {
+ return None;
+ }
+
+ Some(ResolvedImport {
+ name: name.to_string(),
+ source_file: parsed.file_path.clone(),
+ declaration_span: interface_declaration.span,
+ declaration_type: DeclarationType::Interface,
+ })
+}
+
+fn match_enum_declaration(
+ enum_declaration: &swc_ecma_ast::TsEnumDecl,
+ parsed: &ParsedFile,
+ name: &str,
+) -> Option {
+ if enum_declaration.id.sym.as_ref() != name {
+ return None;
+ }
+
+ Some(ResolvedImport {
+ name: name.to_string(),
+ source_file: parsed.file_path.clone(),
+ declaration_span: enum_declaration.span,
+ declaration_type: DeclarationType::Enum,
+ })
+}
+
+fn match_type_alias_declaration(
+ type_declaration: &swc_ecma_ast::TsTypeAliasDecl,
+ parsed: &ParsedFile,
+ name: &str,
+) -> Option {
+ if type_declaration.id.sym.as_ref() != name {
+ return None;
+ }
+
+ Some(ResolvedImport {
+ name: name.to_string(),
+ source_file: parsed.file_path.clone(),
+ declaration_span: type_declaration.span,
+ declaration_type: DeclarationType::TypeAlias,
+ })
+}
diff --git a/packages/nestjs-trpc/cli/src/parser/imports/mod.rs b/packages/nestjs-trpc/cli/src/parser/imports/mod.rs
new file mode 100644
index 0000000..fca86dd
--- /dev/null
+++ b/packages/nestjs-trpc/cli/src/parser/imports/mod.rs
@@ -0,0 +1,9 @@
+mod barrel;
+mod circular;
+mod declarations;
+pub mod module_path;
+mod resolver;
+mod types;
+
+pub use resolver::{build_imports_map, ImportResolver};
+pub use types::{DeclarationType, ImportResult, ResolvedImport};
diff --git a/packages/nestjs-trpc/cli/src/parser/imports/module_path.rs b/packages/nestjs-trpc/cli/src/parser/imports/module_path.rs
new file mode 100644
index 0000000..b8905f9
--- /dev/null
+++ b/packages/nestjs-trpc/cli/src/parser/imports/module_path.rs
@@ -0,0 +1,106 @@
+use std::path::{Path, PathBuf};
+use tracing::trace;
+
+/// Resolves a module specifier to an actual file path.
+/// Tries multiple extensions (.ts, .tsx) and index files.
+pub fn resolve_module_path(source_directory: &Path, specifier: &str) -> Option {
+ let base_path = source_directory.join(specifier);
+
+ let ts_path = PathBuf::from(format!("{}.ts", base_path.display()));
+ trace!(checking = ?ts_path, exists = ts_path.exists(), "Checking with .ts appended");
+ if ts_path.exists() {
+ return Some(ts_path);
+ }
+
+ let tsx_path = PathBuf::from(format!("{}.tsx", base_path.display()));
+ if tsx_path.exists() {
+ return Some(tsx_path);
+ }
+
+ let with_ts = base_path.with_extension("ts");
+ trace!(checking = ?with_ts, exists = with_ts.exists(), "Checking with .ts replacing extension");
+ if with_ts.exists() {
+ return Some(with_ts);
+ }
+
+ let with_tsx = base_path.with_extension("tsx");
+ if with_tsx.exists() {
+ return Some(with_tsx);
+ }
+
+ let index_ts = base_path.join("index.ts");
+ if index_ts.exists() {
+ return Some(index_ts);
+ }
+
+ if base_path.exists() {
+ return Some(base_path);
+ }
+
+ None
+}
+
+#[cfg(test)]
+mod tests {
+ use super::*;
+ use std::fs;
+ use tempfile::TempDir;
+
+ fn create_temp_directory() -> TempDir {
+ TempDir::new().expect("Failed to create temp dir")
+ }
+
+ fn write_file(directory: &Path, name: &str, content: &str) -> PathBuf {
+ let path = directory.join(name);
+ if let Some(parent) = path.parent() {
+ fs::create_dir_all(parent).expect("Failed to create parent dir");
+ }
+ fs::write(&path, content).expect("Failed to write file");
+ path
+ }
+
+ #[test]
+ fn test_resolve_with_ts_extension() {
+ let temp_directory = create_temp_directory();
+ let base = temp_directory.path();
+
+ write_file(base, "schema.ts", "export const x = 1;");
+
+ let resolved = resolve_module_path(base, "./schema");
+ assert!(resolved.is_some());
+ assert!(resolved.unwrap().ends_with("schema.ts"));
+ }
+
+ #[test]
+ fn test_resolve_with_tsx_extension() {
+ let temp_directory = create_temp_directory();
+ let base = temp_directory.path();
+
+ write_file(base, "component.tsx", "export const x = 1;");
+
+ let resolved = resolve_module_path(base, "./component");
+ assert!(resolved.is_some());
+ assert!(resolved.unwrap().ends_with("component.tsx"));
+ }
+
+ #[test]
+ fn test_resolve_index_file() {
+ let temp_directory = create_temp_directory();
+ let base = temp_directory.path();
+
+ write_file(base, "schemas/index.ts", "export const x = 1;");
+
+ let resolved = resolve_module_path(base, "./schemas");
+ assert!(resolved.is_some());
+ assert!(resolved.unwrap().ends_with("index.ts"));
+ }
+
+ #[test]
+ fn test_resolve_nonexistent() {
+ let temp_directory = create_temp_directory();
+ let base = temp_directory.path();
+
+ let resolved = resolve_module_path(base, "./nonexistent");
+ assert!(resolved.is_none());
+ }
+}
diff --git a/packages/nestjs-trpc/cli/src/parser/imports/resolver.rs b/packages/nestjs-trpc/cli/src/parser/imports/resolver.rs
new file mode 100644
index 0000000..4c29d33
--- /dev/null
+++ b/packages/nestjs-trpc/cli/src/parser/imports/resolver.rs
@@ -0,0 +1,962 @@
+use super::barrel::{find_export_in_barrel_item, BarrelExportMatch};
+use super::circular::{extract_import_paths, CircularImportTracker};
+use super::declarations::find_declaration_in_file;
+use super::module_path::resolve_module_path;
+use super::types::{ImportResult, ResolvedImport};
+use crate::error::ImportError;
+use crate::parser::{ParsedFile, TsParser};
+use std::collections::HashMap;
+use std::path::{Path, PathBuf};
+use swc_ecma_ast::{ModuleDecl, ModuleExportName, ModuleItem};
+use tracing::{debug, trace, warn};
+
+const DEFAULT_MAX_IMPORT_DEPTH: usize = 10;
+
+#[derive(Debug)]
+pub struct ImportResolver<'a> {
+ parser: &'a TsParser,
+ parsed_cache: HashMap,
+ max_depth: usize,
+}
+
+impl<'a> ImportResolver<'a> {
+ #[must_use]
+ pub fn new(parser: &'a TsParser) -> Self {
+ Self {
+ parser,
+ parsed_cache: HashMap::new(),
+ max_depth: DEFAULT_MAX_IMPORT_DEPTH,
+ }
+ }
+
+ #[must_use]
+ pub const fn with_max_depth(mut self, max_depth: usize) -> Self {
+ self.max_depth = max_depth;
+ self
+ }
+
+ pub fn build_imports_map(
+ &mut self,
+ source_file: &ParsedFile,
+ base_directory: &Path,
+ ) -> ImportResult> {
+ let mut imports_map = HashMap::new();
+ let source_directory = source_file.file_path.parent().unwrap_or(base_directory);
+
+ debug!(path = ?source_file.file_path, "Building imports map");
+
+ for item in &source_file.module.body {
+ self.process_module_item(item, source_directory, base_directory, &mut imports_map);
+ }
+
+ debug!(
+ path = ?source_file.file_path,
+ count = imports_map.len(),
+ "Built imports map"
+ );
+
+ Ok(imports_map)
+ }
+
+ fn process_module_item(
+ &mut self,
+ item: &ModuleItem,
+ source_directory: &Path,
+ base_directory: &Path,
+ imports_map: &mut HashMap,
+ ) {
+ let ModuleItem::ModuleDecl(ModuleDecl::Import(import_declaration)) = item else {
+ return;
+ };
+
+ let module_specifier = import_declaration.src.value.to_string_lossy().into_owned();
+ if !is_relative_path(&module_specifier) {
+ trace!(module = %module_specifier, "Skipping external import");
+ return;
+ }
+
+ let Some(resolved_path) = resolve_module_path(source_directory, &module_specifier) else {
+ trace!(module = %module_specifier, "Could not resolve module path");
+ return;
+ };
+
+ self.process_import_specifiers(
+ &import_declaration.specifiers,
+ &resolved_path,
+ base_directory,
+ imports_map,
+ );
+ }
+
+ fn process_import_specifiers(
+ &mut self,
+ specifiers: &[swc_ecma_ast::ImportSpecifier],
+ resolved_path: &Path,
+ base_directory: &Path,
+ imports_map: &mut HashMap,
+ ) {
+ for specifier in specifiers {
+ self.process_single_specifier(specifier, resolved_path, base_directory, imports_map);
+ }
+ }
+
+ fn process_single_specifier(
+ &mut self,
+ specifier: &swc_ecma_ast::ImportSpecifier,
+ resolved_path: &Path,
+ base_directory: &Path,
+ imports_map: &mut HashMap,
+ ) {
+ let swc_ecma_ast::ImportSpecifier::Named(named) = specifier else {
+ return;
+ };
+
+ let local_name = named.local.sym.to_string();
+ let imported_name = named
+ .imported
+ .as_ref()
+ .map_or_else(|| local_name.clone(), get_module_export_name);
+
+ trace!(
+ name = %imported_name,
+ local = %local_name,
+ path = ?resolved_path,
+ "Resolving named import"
+ );
+
+ match self.resolve_import(resolved_path, &imported_name, base_directory, 0) {
+ Ok(resolved) => {
+ imports_map.insert(local_name, resolved);
+ }
+ Err(error) => {
+ warn!(
+ name = %imported_name,
+ error = %error,
+ "Failed to resolve import"
+ );
+ }
+ }
+ }
+
+ fn resolve_import(
+ &mut self,
+ file_path: &Path,
+ name: &str,
+ base_directory: &Path,
+ depth: usize,
+ ) -> ImportResult {
+ if depth >= self.max_depth {
+ return Err(ImportError::CircularImport {
+ cycle: format!(
+ "Maximum resolution depth ({}) exceeded while resolving '{}'",
+ self.max_depth, name
+ ),
+ });
+ }
+
+ trace!(path = ?file_path, name = %name, depth, "Resolving import");
+
+ let parsed = self.get_or_parse_file(file_path)?;
+
+ if let Some(resolved) = find_declaration_in_file(&parsed, name) {
+ return Ok(resolved);
+ }
+
+ let is_barrel_file = file_path
+ .file_name()
+ .is_some_and(|filename| filename == "index.ts" || filename == "index.tsx");
+
+ let barrel_result = is_barrel_file
+ .then(|| self.resolve_barrel_file_import(&parsed, name, base_directory, depth + 1))
+ .transpose()?
+ .flatten();
+
+ barrel_result.map_or_else(
+ || {
+ Err(ImportError::Unresolved {
+ name: name.to_string(),
+ source_path: file_path.to_path_buf(),
+ })
+ },
+ Ok,
+ )
+ }
+
+ fn get_or_parse_file(&mut self, file_path: &Path) -> ImportResult {
+ if let Some(cached) = self.parsed_cache.get(file_path) {
+ return Ok(cached.clone());
+ }
+
+ let parsed =
+ self.parser
+ .parse_file(file_path)
+ .map_err(|_error| ImportError::ModuleNotFound {
+ module: file_path.display().to_string(),
+ source_path: file_path.to_path_buf(),
+ })?;
+
+ self.parsed_cache
+ .insert(file_path.to_path_buf(), parsed.clone());
+ Ok(parsed)
+ }
+
+ fn resolve_barrel_file_import(
+ &mut self,
+ barrel_file: &ParsedFile,
+ name: &str,
+ base_directory: &Path,
+ depth: usize,
+ ) -> ImportResult> {
+ let barrel_directory = barrel_file.file_path.parent().unwrap_or(base_directory);
+
+ trace!(
+ barrel = ?barrel_file.file_path,
+ name = %name,
+ "Resolving through barrel file"
+ );
+
+ self.search_barrel_items(
+ &barrel_file.module.body,
+ name,
+ barrel_directory,
+ base_directory,
+ depth,
+ )
+ }
+
+ #[allow(clippy::excessive_nesting)]
+ fn search_barrel_items(
+ &mut self,
+ items: &[ModuleItem],
+ name: &str,
+ barrel_directory: &Path,
+ base_directory: &Path,
+ depth: usize,
+ ) -> ImportResult > {
+ for item in items {
+ let result =
+ self.try_resolve_barrel_item(item, name, barrel_directory, base_directory, depth)?;
+ if result.is_some() {
+ return Ok(result);
+ }
+ }
+ Ok(None)
+ }
+
+ fn try_resolve_barrel_item(
+ &mut self,
+ item: &ModuleItem,
+ name: &str,
+ barrel_directory: &Path,
+ base_directory: &Path,
+ depth: usize,
+ ) -> ImportResult > {
+ match find_export_in_barrel_item(item, name, barrel_directory) {
+ BarrelExportMatch::Named(export) => {
+ let resolved = self.resolve_import(
+ &export.source_path,
+ &export.original_name,
+ base_directory,
+ depth,
+ )?;
+ Ok(Some(resolved))
+ }
+ BarrelExportMatch::Star(export) => {
+ let resolved =
+ self.resolve_import(&export.source_path, name, base_directory, depth);
+ Ok(resolved.ok())
+ }
+ BarrelExportMatch::None => Ok(None),
+ }
+ }
+
+ pub fn detect_circular_imports(
+ &mut self,
+ source_file: &ParsedFile,
+ base_directory: &Path,
+ ) -> Vec {
+ let mut tracker = CircularImportTracker::new();
+ self.check_circular_imports_recursive(&source_file.file_path, base_directory, &mut tracker);
+ tracker.cycles
+ }
+
+ fn check_circular_imports_recursive(
+ &mut self,
+ file_path: &Path,
+ base_directory: &Path,
+ tracker: &mut CircularImportTracker,
+ ) {
+ if tracker.is_in_current_path(file_path) {
+ tracker.record_cycle(file_path);
+ return;
+ }
+
+ if tracker.is_visited(file_path) {
+ return;
+ }
+
+ let Ok(parsed) = self.get_or_parse_file(file_path) else {
+ return;
+ };
+
+ tracker.push_path(file_path);
+
+ let source_directory = file_path.parent().unwrap_or(base_directory);
+ let import_paths = extract_import_paths(&parsed, source_directory);
+
+ for import_path in import_paths {
+ self.check_circular_imports_recursive(&import_path, base_directory, tracker);
+ }
+
+ tracker.pop_and_mark_visited(file_path);
+ }
+}
+
+fn is_relative_path(specifier: &str) -> bool {
+ specifier.starts_with('.') || specifier.starts_with('/')
+}
+
+fn get_module_export_name(name: &ModuleExportName) -> String {
+ match name {
+ ModuleExportName::Ident(identifier) => identifier.sym.to_string(),
+ ModuleExportName::Str(string) => string.value.to_string_lossy().into_owned(),
+ }
+}
+
+pub fn build_imports_map(
+ parser: &TsParser,
+ source_file: &ParsedFile,
+ base_directory: &Path,
+) -> ImportResult> {
+ let mut resolver = ImportResolver::new(parser);
+ resolver.build_imports_map(source_file, base_directory)
+}
+
+#[cfg(test)]
+mod tests {
+ use super::*;
+ use crate::parser::imports::types::DeclarationType;
+ use std::fs;
+ use tempfile::TempDir;
+
+ fn create_temp_project() -> TempDir {
+ TempDir::new().expect("Failed to create temp dir")
+ }
+
+ fn write_file(directory: &Path, name: &str, content: &str) -> PathBuf {
+ let path = directory.join(name);
+ if let Some(parent) = path.parent() {
+ fs::create_dir_all(parent).expect("Failed to create parent dir");
+ }
+ fs::write(&path, content).expect("Failed to write file");
+ path
+ }
+
+ #[test]
+ fn test_resolver_creation() {
+ let parser = TsParser::new();
+ let resolver = ImportResolver::new(&parser);
+ assert_eq!(resolver.max_depth, DEFAULT_MAX_IMPORT_DEPTH);
+ }
+
+ #[test]
+ fn test_resolver_with_max_depth() {
+ let parser = TsParser::new();
+ let resolver = ImportResolver::new(&parser).with_max_depth(5);
+ assert_eq!(resolver.max_depth, 5);
+ }
+
+ #[test]
+ fn test_resolve_direct_import() {
+ let temp_directory = create_temp_project();
+ let base = temp_directory.path();
+
+ write_file(
+ base,
+ "schema.ts",
+ r"
+ import { z } from 'zod';
+ export const userSchema = z.object({ name: z.string() });
+ ",
+ );
+
+ let main_path = write_file(
+ base,
+ "main.ts",
+ r"
+ import { userSchema } from './schema';
+ export const x = userSchema;
+ ",
+ );
+
+ let parser = TsParser::new();
+ let parsed = parser.parse_file(&main_path).expect("Failed to parse");
+
+ let mut resolver = ImportResolver::new(&parser);
+ let imports = resolver
+ .build_imports_map(&parsed, base)
+ .expect("Failed to build imports map");
+
+ assert!(imports.contains_key("userSchema"));
+ let import_info = imports.get("userSchema").unwrap();
+ assert_eq!(import_info.name, "userSchema");
+ assert_eq!(import_info.declaration_type, DeclarationType::Variable);
+ assert!(import_info.source_file.ends_with("schema.ts"));
+ }
+
+ #[test]
+ fn test_resolve_barrel_file_import() {
+ let temp_directory = create_temp_project();
+ let base = temp_directory.path();
+
+ write_file(
+ base,
+ "schemas/user.ts",
+ r"
+ import { z } from 'zod';
+ export const userSchema = z.object({ name: z.string() });
+ ",
+ );
+
+ write_file(
+ base,
+ "schemas/index.ts",
+ r"
+ export { userSchema } from './user';
+ ",
+ );
+
+ let main_path = write_file(
+ base,
+ "main.ts",
+ r"
+ import { userSchema } from './schemas';
+ export const x = userSchema;
+ ",
+ );
+
+ let parser = TsParser::new();
+ let parsed = parser.parse_file(&main_path).expect("Failed to parse");
+
+ let mut resolver = ImportResolver::new(&parser);
+ let imports = resolver
+ .build_imports_map(&parsed, base)
+ .expect("Failed to build imports map");
+
+ assert!(imports.contains_key("userSchema"));
+ let import_info = imports.get("userSchema").unwrap();
+ assert!(import_info.source_file.ends_with("user.ts"));
+ }
+
+ #[test]
+ fn test_resolve_star_export() {
+ let temp_directory = create_temp_project();
+ let base = temp_directory.path();
+
+ write_file(
+ base,
+ "schemas/user.ts",
+ r"
+ import { z } from 'zod';
+ export const userSchema = z.object({ name: z.string() });
+ ",
+ );
+
+ write_file(
+ base,
+ "schemas/index.ts",
+ r"
+ export * from './user';
+ ",
+ );
+
+ let main_path = write_file(
+ base,
+ "main.ts",
+ r"
+ import { userSchema } from './schemas';
+ export const x = userSchema;
+ ",
+ );
+
+ let parser = TsParser::new();
+ let parsed = parser.parse_file(&main_path).expect("Failed to parse");
+
+ let mut resolver = ImportResolver::new(&parser);
+ let imports = resolver
+ .build_imports_map(&parsed, base)
+ .expect("Failed to build imports map");
+
+ assert!(imports.contains_key("userSchema"));
+ let import_info = imports.get("userSchema").unwrap();
+ assert!(import_info.source_file.ends_with("user.ts"));
+ }
+
+ #[test]
+ fn test_resolve_nested_barrel_files() {
+ let temp_directory = create_temp_project();
+ let base = temp_directory.path();
+
+ write_file(
+ base,
+ "schemas/user/model.ts",
+ r"
+ import { z } from 'zod';
+ export const userSchema = z.object({ name: z.string() });
+ ",
+ );
+
+ write_file(
+ base,
+ "schemas/user/index.ts",
+ r"
+ export * from './model';
+ ",
+ );
+
+ write_file(
+ base,
+ "schemas/index.ts",
+ r"
+ export * from './user';
+ ",
+ );
+
+ let main_path = write_file(
+ base,
+ "main.ts",
+ r"
+ import { userSchema } from './schemas';
+ export const x = userSchema;
+ ",
+ );
+
+ let parser = TsParser::new();
+ let parsed = parser.parse_file(&main_path).expect("Failed to parse");
+
+ let mut resolver = ImportResolver::new(&parser);
+ let imports = resolver
+ .build_imports_map(&parsed, base)
+ .expect("Failed to build imports map");
+
+ assert!(imports.contains_key("userSchema"));
+ let import_info = imports.get("userSchema").unwrap();
+ assert!(import_info.source_file.ends_with("model.ts"));
+ }
+
+ #[test]
+ fn test_resolve_class_declaration() {
+ let temp_directory = create_temp_project();
+ let base = temp_directory.path();
+
+ write_file(
+ base,
+ "service.ts",
+ r"
+ export class UserService {
+ getUser(id: string) {}
+ }
+ ",
+ );
+
+ let main_path = write_file(
+ base,
+ "main.ts",
+ r"
+ import { UserService } from './service';
+ export const svc = new UserService();
+ ",
+ );
+
+ let parser = TsParser::new();
+ let parsed = parser.parse_file(&main_path).expect("Failed to parse");
+
+ let mut resolver = ImportResolver::new(&parser);
+ let imports = resolver
+ .build_imports_map(&parsed, base)
+ .expect("Failed to build imports map");
+
+ assert!(imports.contains_key("UserService"));
+ let import_info = imports.get("UserService").unwrap();
+ assert_eq!(import_info.declaration_type, DeclarationType::Class);
+ }
+
+ #[test]
+ fn test_resolve_interface_declaration() {
+ let temp_directory = create_temp_project();
+ let base = temp_directory.path();
+
+ write_file(
+ base,
+ "types.ts",
+ r"
+ export interface User {
+ name: string;
+ email: string;
+ }
+ ",
+ );
+
+ let main_path = write_file(
+ base,
+ "main.ts",
+ r"
+ import { User } from './types';
+ export const user: User = { name: '', email: '' };
+ ",
+ );
+
+ let parser = TsParser::new();
+ let parsed = parser.parse_file(&main_path).expect("Failed to parse");
+
+ let mut resolver = ImportResolver::new(&parser);
+ let imports = resolver
+ .build_imports_map(&parsed, base)
+ .expect("Failed to build imports map");
+
+ assert!(imports.contains_key("User"));
+ let import_info = imports.get("User").unwrap();
+ assert_eq!(import_info.declaration_type, DeclarationType::Interface);
+ }
+
+ #[test]
+ fn test_resolve_enum_declaration() {
+ let temp_directory = create_temp_project();
+ let base = temp_directory.path();
+
+ write_file(
+ base,
+ "enums.ts",
+ r"
+ export enum Status {
+ Active = 'ACTIVE',
+ Inactive = 'INACTIVE',
+ }
+ ",
+ );
+
+ let main_path = write_file(
+ base,
+ "main.ts",
+ r"
+ import { Status } from './enums';
+ export const status = Status.Active;
+ ",
+ );
+
+ let parser = TsParser::new();
+ let parsed = parser.parse_file(&main_path).expect("Failed to parse");
+
+ let mut resolver = ImportResolver::new(&parser);
+ let imports = resolver
+ .build_imports_map(&parsed, base)
+ .expect("Failed to build imports map");
+
+ assert!(imports.contains_key("Status"));
+ let import_info = imports.get("Status").unwrap();
+ assert_eq!(import_info.declaration_type, DeclarationType::Enum);
+ }
+
+ #[test]
+ fn test_resolve_function_declaration() {
+ let temp_directory = create_temp_project();
+ let base = temp_directory.path();
+
+ write_file(
+ base,
+ "utils.ts",
+ r"
+ export function formatDate(date: Date): string {
+ return date.toISOString();
+ }
+ ",
+ );
+
+ let main_path = write_file(
+ base,
+ "main.ts",
+ r"
+ import { formatDate } from './utils';
+ export const date = formatDate(new Date());
+ ",
+ );
+
+ let parser = TsParser::new();
+ let parsed = parser.parse_file(&main_path).expect("Failed to parse");
+
+ let mut resolver = ImportResolver::new(&parser);
+ let imports = resolver
+ .build_imports_map(&parsed, base)
+ .expect("Failed to build imports map");
+
+ assert!(imports.contains_key("formatDate"));
+ let import_info = imports.get("formatDate").unwrap();
+ assert_eq!(import_info.declaration_type, DeclarationType::Function);
+ }
+
+ #[test]
+ fn test_skip_external_imports() {
+ let temp_directory = create_temp_project();
+ let base = temp_directory.path();
+
+ let main_path = write_file(
+ base,
+ "main.ts",
+ r"
+ import { z } from 'zod';
+ import { Injectable } from '@nestjs/common';
+ export const schema = z.string();
+ ",
+ );
+
+ let parser = TsParser::new();
+ let parsed = parser.parse_file(&main_path).expect("Failed to parse");
+
+ let mut resolver = ImportResolver::new(&parser);
+ let imports = resolver
+ .build_imports_map(&parsed, base)
+ .expect("Failed to build imports map");
+
+ assert!(!imports.contains_key("z"));
+ assert!(!imports.contains_key("Injectable"));
+ }
+
+ #[test]
+ fn test_aliased_import() {
+ let temp_directory = create_temp_project();
+ let base = temp_directory.path();
+
+ write_file(
+ base,
+ "schema.ts",
+ r"
+ import { z } from 'zod';
+ export const userSchema = z.object({ name: z.string() });
+ ",
+ );
+
+ let main_path = write_file(
+ base,
+ "main.ts",
+ r"
+ import { userSchema as UserSchema } from './schema';
+ export const x = UserSchema;
+ ",
+ );
+
+ let parser = TsParser::new();
+ let parsed = parser.parse_file(&main_path).expect("Failed to parse");
+
+ let mut resolver = ImportResolver::new(&parser);
+ let imports = resolver
+ .build_imports_map(&parsed, base)
+ .expect("Failed to build imports map");
+
+ assert!(imports.contains_key("UserSchema"));
+ assert!(!imports.contains_key("userSchema"));
+ }
+
+ #[test]
+ fn test_unresolved_import() {
+ let temp_directory = create_temp_project();
+ let base = temp_directory.path();
+
+ let main_path = write_file(
+ base,
+ "main.ts",
+ r"
+ import { something } from './nonexistent';
+ export const x = something;
+ ",
+ );
+
+ let parser = TsParser::new();
+ let parsed = parser.parse_file(&main_path).expect("Failed to parse");
+
+ let mut resolver = ImportResolver::new(&parser);
+ let imports = resolver
+ .build_imports_map(&parsed, base)
+ .expect("Failed to build imports map");
+
+ assert!(!imports.contains_key("something"));
+ }
+
+ #[test]
+ fn test_max_depth_exceeded() {
+ let parser = TsParser::new();
+ let resolver = ImportResolver::new(&parser).with_max_depth(2);
+ assert_eq!(resolver.max_depth, 2);
+ }
+
+ #[test]
+ fn test_declaration_type_display() {
+ assert_eq!(format!("{}", DeclarationType::Variable), "variable");
+ assert_eq!(format!("{}", DeclarationType::Class), "class");
+ assert_eq!(format!("{}", DeclarationType::Interface), "interface");
+ assert_eq!(format!("{}", DeclarationType::Enum), "enum");
+ assert_eq!(format!("{}", DeclarationType::Function), "function");
+ assert_eq!(format!("{}", DeclarationType::TypeAlias), "type alias");
+ assert_eq!(format!("{}", DeclarationType::Unknown), "unknown");
+ }
+
+ #[test]
+ fn test_build_imports_map_convenience() {
+ let temp_directory = create_temp_project();
+ let base = temp_directory.path();
+
+ write_file(
+ base,
+ "schema.ts",
+ r"
+ import { z } from 'zod';
+ export const userSchema = z.object({ name: z.string() });
+ ",
+ );
+
+ let main_path = write_file(
+ base,
+ "main.ts",
+ r"
+ import { userSchema } from './schema';
+ export const x = userSchema;
+ ",
+ );
+
+ let parser = TsParser::new();
+ let parsed = parser.parse_file(&main_path).expect("Failed to parse");
+
+ let imports =
+ build_imports_map(&parser, &parsed, base).expect("Failed to build imports map");
+
+ assert!(imports.contains_key("userSchema"));
+ }
+
+ #[test]
+ fn test_resolve_type_alias() {
+ let temp_directory = create_temp_project();
+ let base = temp_directory.path();
+
+ write_file(
+ base,
+ "types.ts",
+ r"
+ export type UserId = string;
+ ",
+ );
+
+ let main_path = write_file(
+ base,
+ "main.ts",
+ r"
+ import { UserId } from './types';
+ export const id: UserId = 'abc';
+ ",
+ );
+
+ let parser = TsParser::new();
+ let parsed = parser.parse_file(&main_path).expect("Failed to parse");
+
+ let mut resolver = ImportResolver::new(&parser);
+ let imports = resolver
+ .build_imports_map(&parsed, base)
+ .expect("Failed to build imports map");
+
+ assert!(imports.contains_key("UserId"));
+ let import_info = imports.get("UserId").unwrap();
+ assert_eq!(import_info.declaration_type, DeclarationType::TypeAlias);
+ }
+
+ #[test]
+ fn test_multiple_imports_from_same_file() {
+ let temp_directory = create_temp_project();
+ let base = temp_directory.path();
+
+ write_file(
+ base,
+ "schemas.ts",
+ r"
+ import { z } from 'zod';
+ export const userSchema = z.object({ name: z.string() });
+ export const postSchema = z.object({ title: z.string() });
+ ",
+ );
+
+ let main_path = write_file(
+ base,
+ "main.ts",
+ r"
+ import { userSchema, postSchema } from './schemas';
+ export const x = userSchema;
+ export const y = postSchema;
+ ",
+ );
+
+ let parser = TsParser::new();
+ let parsed = parser.parse_file(&main_path).expect("Failed to parse");
+
+ let mut resolver = ImportResolver::new(&parser);
+ let imports = resolver
+ .build_imports_map(&parsed, base)
+ .expect("Failed to build imports map");
+
+ assert!(imports.contains_key("userSchema"));
+ assert!(imports.contains_key("postSchema"));
+ }
+
+ #[test]
+ fn test_mixed_barrel_and_direct_exports() {
+ let temp_directory = create_temp_project();
+ let base = temp_directory.path();
+
+ write_file(
+ base,
+ "schemas/user.ts",
+ r"
+ import { z } from 'zod';
+ export const userSchema = z.object({ name: z.string() });
+ ",
+ );
+
+ write_file(
+ base,
+ "schemas/index.ts",
+ r"
+ import { z } from 'zod';
+ export { userSchema } from './user';
+ export const config = { version: '1.0' };
+ ",
+ );
+
+ let main_path = write_file(
+ base,
+ "main.ts",
+ r"
+ import { userSchema, config } from './schemas';
+ export const x = userSchema;
+ export const y = config;
+ ",
+ );
+
+ let parser = TsParser::new();
+ let parsed = parser.parse_file(&main_path).expect("Failed to parse");
+
+ let mut resolver = ImportResolver::new(&parser);
+ let imports = resolver
+ .build_imports_map(&parsed, base)
+ .expect("Failed to build imports map");
+
+ assert!(imports.contains_key("userSchema"));
+ assert!(imports
+ .get("userSchema")
+ .unwrap()
+ .source_file
+ .ends_with("user.ts"));
+
+ assert!(imports.contains_key("config"));
+ assert!(imports
+ .get("config")
+ .unwrap()
+ .source_file
+ .ends_with("index.ts"));
+ }
+}
diff --git a/packages/nestjs-trpc/cli/src/parser/imports/types.rs b/packages/nestjs-trpc/cli/src/parser/imports/types.rs
new file mode 100644
index 0000000..e53c896
--- /dev/null
+++ b/packages/nestjs-trpc/cli/src/parser/imports/types.rs
@@ -0,0 +1,38 @@
+use crate::error::ImportError;
+use std::path::PathBuf;
+use swc_common::Span;
+
+pub type ImportResult = std::result::Result;
+
+#[derive(Debug, Clone)]
+pub struct ResolvedImport {
+ pub name: String,
+ pub source_file: PathBuf,
+ pub declaration_span: Span,
+ pub declaration_type: DeclarationType,
+}
+
+#[derive(Debug, Clone, Copy, PartialEq, Eq)]
+pub enum DeclarationType {
+ Variable,
+ Class,
+ Interface,
+ Enum,
+ Function,
+ TypeAlias,
+ Unknown,
+}
+
+impl std::fmt::Display for DeclarationType {
+ fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+ match self {
+ Self::Variable => write!(f, "variable"),
+ Self::Class => write!(f, "class"),
+ Self::Interface => write!(f, "interface"),
+ Self::Enum => write!(f, "enum"),
+ Self::Function => write!(f, "function"),
+ Self::TypeAlias => write!(f, "type alias"),
+ Self::Unknown => write!(f, "unknown"),
+ }
+ }
+}
diff --git a/packages/nestjs-trpc/cli/src/parser/middleware/extraction.rs b/packages/nestjs-trpc/cli/src/parser/middleware/extraction.rs
new file mode 100644
index 0000000..bb5e4c2
--- /dev/null
+++ b/packages/nestjs-trpc/cli/src/parser/middleware/extraction.rs
@@ -0,0 +1,255 @@
+use crate::parser::ParsedFile;
+use swc_common::Spanned;
+use swc_ecma_ast::{
+ BlockStmt, CallExpr, Callee, Expr, Lit, MemberExpr, MemberProp, ObjectLit, Prop, PropName,
+ PropOrSpread, Stmt,
+};
+use tracing::trace;
+
+use super::{ContextProperty, MiddlewareParser};
+
+impl MiddlewareParser {
+ pub(super) fn find_next_call<'a>(&self, body: &'a BlockStmt) -> Option<&'a CallExpr> {
+ body.stmts
+ .iter()
+ .find_map(|statement| find_next_call_in_statement(statement, self))
+ }
+}
+
+fn find_next_call_in_statement<'a>(
+ statement: &'a Stmt,
+ parser: &MiddlewareParser,
+) -> Option<&'a CallExpr> {
+ match statement {
+ Stmt::Return(return_statement) => return_statement
+ .arg
+ .as_ref()
+ .and_then(|arg| find_next_call_in_expression(arg, parser)),
+ Stmt::Expr(expression_statement) => {
+ find_next_call_in_expression(&expression_statement.expr, parser)
+ }
+ Stmt::Block(block) => parser.find_next_call(block),
+ _ => None,
+ }
+}
+
+fn find_next_call_in_expression<'a>(
+ expression: &'a Expr,
+ parser: &MiddlewareParser,
+) -> Option<&'a CallExpr> {
+ match expression {
+ Expr::Call(call) => find_next_call_in_call_expr(call, parser),
+ Expr::Await(await_expression) => {
+ find_next_call_in_expression(&await_expression.arg, parser)
+ }
+ Expr::Paren(paren_expression) => {
+ find_next_call_in_expression(&paren_expression.expr, parser)
+ }
+ _ => None,
+ }
+}
+
+fn find_next_call_in_call_expr<'a>(
+ call: &'a CallExpr,
+ parser: &MiddlewareParser,
+) -> Option<&'a CallExpr> {
+ if parser.is_opts_next_call(call) {
+ return Some(call);
+ }
+
+ call.args
+ .iter()
+ .find_map(|argument| find_next_call_in_expression(&argument.expr, parser))
+}
+
+fn extract_ctx_object(property: &PropOrSpread) -> Option<&ObjectLit> {
+ let PropOrSpread::Prop(property_box) = property else {
+ return None;
+ };
+ let Prop::KeyValue(key_value) = &**property_box else {
+ return None;
+ };
+
+ let is_ctx = is_property_named(&key_value.key, "ctx");
+ if !is_ctx {
+ return None;
+ }
+
+ let Expr::Object(context_object) = &*key_value.value else {
+ return None;
+ };
+
+ Some(context_object)
+}
+
+fn is_property_named(key: &PropName, expected_name: &str) -> bool {
+ match key {
+ PropName::Ident(identifier) => identifier.sym.as_ref() == expected_name,
+ PropName::Str(string) => string.value.to_string_lossy() == expected_name,
+ _ => false,
+ }
+}
+
+impl MiddlewareParser {
+ fn is_opts_next_call(&self, call: &CallExpr) -> bool {
+ let Callee::Expr(callee) = &call.callee else {
+ return false;
+ };
+
+ let Expr::Member(member) = &**callee else {
+ return false;
+ };
+
+ self.is_opts_next_member(member)
+ }
+
+ #[allow(clippy::unused_self)]
+ fn is_opts_next_member(&self, member: &MemberExpr) -> bool {
+ let Expr::Ident(object) = &*member.obj else {
+ return false;
+ };
+
+ if object.sym.as_ref() != "opts" {
+ return false;
+ }
+
+ let MemberProp::Ident(property) = &member.prop else {
+ return false;
+ };
+
+ property.sym.as_ref() == "next"
+ }
+
+ pub(super) fn extract_context_properties(
+ &self,
+ call: &CallExpr,
+ parsed_file: &ParsedFile,
+ ) -> Vec {
+ let Some(first_argument) = call.args.first() else {
+ return Vec::new();
+ };
+
+ let Expr::Object(options_object) = &*first_argument.expr else {
+ return Vec::new();
+ };
+
+ let Some(context_object) = self.find_ctx_property(options_object) else {
+ return Vec::new();
+ };
+
+ self.extract_properties_from_object(context_object, parsed_file)
+ }
+
+ #[allow(clippy::unused_self)]
+ fn find_ctx_property<'a>(&self, object: &'a ObjectLit) -> Option<&'a ObjectLit> {
+ let result = object
+ .props
+ .iter()
+ .find_map(|property| extract_ctx_object(property));
+
+ if result.is_some() {
+ trace!("Found ctx property in opts.next() call");
+ }
+
+ result
+ }
+
+ fn extract_properties_from_object(
+ &self,
+ object: &ObjectLit,
+ parsed_file: &ParsedFile,
+ ) -> Vec {
+ object
+ .props
+ .iter()
+ .filter_map(|property| self.extract_single_property(property, parsed_file))
+ .collect()
+ }
+
+ fn extract_single_property(
+ &self,
+ property: &PropOrSpread,
+ parsed_file: &ParsedFile,
+ ) -> Option {
+ let PropOrSpread::Prop(property_box) = property else {
+ return None;
+ };
+
+ match &**property_box {
+ Prop::KeyValue(key_value) => {
+ let name = self.get_property_key_name(&key_value.key)?;
+ let type_string = self.infer_type_from_expression(&key_value.value, parsed_file);
+ Some(ContextProperty { name, type_string })
+ }
+ Prop::Shorthand(identifier) => {
+ let name = identifier.sym.to_string();
+ Some(ContextProperty {
+ name,
+ type_string: "unknown".to_string(),
+ })
+ }
+ _ => None,
+ }
+ }
+
+ #[allow(clippy::unused_self)]
+ fn get_property_key_name(&self, key: &PropName) -> Option {
+ match key {
+ PropName::Ident(identifier) => Some(identifier.sym.to_string()),
+ PropName::Str(string) => Some(string.value.to_string_lossy().into_owned()),
+ _ => None,
+ }
+ }
+
+ fn infer_type_from_expression(&self, expression: &Expr, parsed_file: &ParsedFile) -> String {
+ match expression {
+ Expr::Lit(literal) => self.type_from_literal(literal),
+ Expr::Object(_) => parsed_file.get_source_text(expression.span()),
+ Expr::Array(_) => "unknown[]".to_string(),
+ Expr::Arrow(_) | Expr::Fn(_) => "Function".to_string(),
+ Expr::Ident(identifier) => identifier.sym.to_string(),
+ _ => "unknown".to_string(),
+ }
+ }
+
+ #[allow(clippy::unused_self)]
+ fn type_from_literal(&self, literal: &Lit) -> String {
+ match literal {
+ Lit::Str(_) | Lit::JSXText(_) => "string".to_string(),
+ Lit::Num(_) => "number".to_string(),
+ Lit::Bool(_) => "boolean".to_string(),
+ Lit::Null(_) => "null".to_string(),
+ Lit::BigInt(_) => "bigint".to_string(),
+ Lit::Regex(_) => "RegExp".to_string(),
+ }
+ }
+}
+
+#[must_use]
+pub fn extract_use_middlewares_names(decorator: &swc_ecma_ast::Decorator) -> Option> {
+ let Expr::Call(call_expression) = &*decorator.expr else {
+ return None;
+ };
+
+ let Callee::Expr(callee) = &call_expression.callee else {
+ return None;
+ };
+
+ let Expr::Ident(identifier) = &**callee else {
+ return None;
+ };
+
+ if identifier.sym.as_ref() != "UseMiddlewares" {
+ return None;
+ }
+
+ let mut names = Vec::new();
+
+ for argument in &call_expression.args {
+ if let Expr::Ident(identifier) = &*argument.expr {
+ names.push(identifier.sym.to_string());
+ }
+ }
+
+ Some(names)
+}
diff --git a/packages/nestjs-trpc/cli/src/parser/middleware/mod.rs b/packages/nestjs-trpc/cli/src/parser/middleware/mod.rs
new file mode 100644
index 0000000..735d3b2
--- /dev/null
+++ b/packages/nestjs-trpc/cli/src/parser/middleware/mod.rs
@@ -0,0 +1,384 @@
+mod extraction;
+
+use crate::parser::ParsedFile;
+use std::path::PathBuf;
+use swc_ecma_ast::{Class, ClassMember, ClassMethod, Decl, ModuleDecl, ModuleItem, PropName, Stmt};
+use tracing::{debug, trace};
+
+pub use extraction::extract_use_middlewares_names;
+
+fn filter_use_method(member: &ClassMember) -> Option<&ClassMethod> {
+ let ClassMember::Method(method) = member else {
+ return None;
+ };
+ let method_name = get_method_name(method);
+ (method_name.as_deref() == Some("use")).then_some(method)
+}
+
+fn get_method_name(method: &ClassMethod) -> Option {
+ match &method.key {
+ PropName::Ident(identifier) => Some(identifier.sym.to_string()),
+ PropName::Str(string) => Some(string.value.to_string_lossy().into_owned()),
+ _ => None,
+ }
+}
+
+#[derive(Debug, Clone)]
+pub struct MiddlewareInfo {
+ pub class_name: String,
+ pub file_path: PathBuf,
+ pub context_properties: Vec,
+}
+
+#[derive(Debug, Clone)]
+pub struct ContextProperty {
+ pub name: String,
+ pub type_string: String,
+}
+
+#[derive(Debug, Clone, Default)]
+pub struct MiddlewareParser;
+
+impl MiddlewareParser {
+ #[must_use]
+ pub const fn new() -> Self {
+ Self
+ }
+
+ pub fn extract_middleware(
+ &self,
+ parsed_file: &ParsedFile,
+ middleware_class_name: &str,
+ ) -> Option {
+ debug!(
+ path = ?parsed_file.file_path,
+ class = %middleware_class_name,
+ "Extracting middleware class info"
+ );
+
+ let info = parsed_file.module.body.iter().find_map(|item| {
+ self.extract_from_module_item(item, middleware_class_name, parsed_file)
+ });
+
+ if let Some(ref info) = info {
+ debug!(
+ class = %info.class_name,
+ properties = info.context_properties.len(),
+ "Extracted middleware info"
+ );
+ } else {
+ debug!(
+ class = %middleware_class_name,
+ "Middleware class not found"
+ );
+ }
+
+ info
+ }
+
+ fn extract_from_module_item(
+ &self,
+ item: &ModuleItem,
+ middleware_class_name: &str,
+ parsed_file: &ParsedFile,
+ ) -> Option {
+ match item {
+ ModuleItem::ModuleDecl(ModuleDecl::ExportDecl(export_declaration)) => self
+ .extract_from_export_declaration(
+ &export_declaration.decl,
+ middleware_class_name,
+ parsed_file,
+ ),
+ ModuleItem::Stmt(Stmt::Decl(Decl::Class(class_declaration))) => self
+ .extract_from_class_if_matches(
+ class_declaration,
+ middleware_class_name,
+ parsed_file,
+ ),
+ _ => None,
+ }
+ }
+
+ fn extract_from_export_declaration(
+ &self,
+ declaration: &Decl,
+ middleware_class_name: &str,
+ parsed_file: &ParsedFile,
+ ) -> Option {
+ let Decl::Class(class_declaration) = declaration else {
+ return None;
+ };
+
+ self.extract_from_class_if_matches(class_declaration, middleware_class_name, parsed_file)
+ }
+
+ fn extract_from_class_if_matches(
+ &self,
+ class_declaration: &swc_ecma_ast::ClassDecl,
+ middleware_class_name: &str,
+ parsed_file: &ParsedFile,
+ ) -> Option {
+ let class_name = class_declaration.ident.sym.as_ref();
+ let is_target_class = class_name == middleware_class_name;
+
+ if !is_target_class {
+ return None;
+ }
+
+ self.extract_from_class(class_name, &class_declaration.class, parsed_file)
+ }
+
+ fn extract_from_class(
+ &self,
+ class_name: &str,
+ class: &Class,
+ parsed_file: &ParsedFile,
+ ) -> Option {
+ trace!(class = %class_name, "Searching for use method");
+
+ let use_method = self.find_use_method(class)?;
+ let body = use_method.function.body.as_ref()?;
+
+ let context_properties = self
+ .find_next_call(body)
+ .map(|next_call| self.extract_context_properties(next_call, parsed_file))
+ .unwrap_or_default();
+
+ Some(MiddlewareInfo {
+ class_name: class_name.to_string(),
+ file_path: parsed_file.file_path.clone(),
+ context_properties,
+ })
+ }
+
+ #[allow(clippy::unused_self)]
+ fn find_use_method<'a>(&self, class: &'a Class) -> Option<&'a ClassMethod> {
+ let method = class
+ .body
+ .iter()
+ .find_map(|member| filter_use_method(member));
+
+ if method.is_some() {
+ trace!("Found use method");
+ }
+
+ method
+ }
+}
+
+#[must_use]
+pub fn extract_middleware(
+ parsed_file: &ParsedFile,
+ middleware_class_name: &str,
+) -> Option {
+ MiddlewareParser::new().extract_middleware(parsed_file, middleware_class_name)
+}
+
+#[must_use]
+pub fn extract_middleware_names_from_class(class: &Class) -> Vec {
+ let class_middlewares = extract_class_level_middlewares(class);
+ let method_middlewares = extract_method_level_middlewares(class);
+ class_middlewares.chain(method_middlewares).collect()
+}
+
+fn extract_class_level_middlewares(class: &Class) -> impl Iterator- + '_ {
+ class
+ .decorators
+ .iter()
+ .filter_map(extract_use_middlewares_names)
+ .flatten()
+}
+
+fn extract_method_level_middlewares(class: &Class) -> impl Iterator
- + '_ {
+ class
+ .body
+ .iter()
+ .filter_map(extract_method_decorator_names)
+ .flatten()
+}
+
+fn extract_method_decorator_names(member: &ClassMember) -> Option
> {
+ let ClassMember::Method(method) = member else {
+ return None;
+ };
+
+ let names: Vec = method
+ .function
+ .decorators
+ .iter()
+ .filter_map(extract_use_middlewares_names)
+ .flatten()
+ .collect();
+
+ (!names.is_empty()).then_some(names)
+}
+
+#[cfg(test)]
+mod tests {
+ use super::*;
+ use crate::parser::TsParser;
+ use std::fs;
+ use tempfile::TempDir;
+
+ fn create_temp_file(content: &str) -> (TempDir, PathBuf) {
+ let temp_directory = TempDir::new().expect("Failed to create temp dir");
+ let file_path = temp_directory.path().join("protected.middleware.ts");
+ fs::write(&file_path, content).expect("Failed to write test file");
+ (temp_directory, file_path)
+ }
+
+ fn parse_and_extract(source: &str, class_name: &str) -> Option {
+ let (_temp, path) = create_temp_file(source);
+ let parser = TsParser::new();
+ let parsed = parser.parse_file(&path).expect("Failed to parse");
+ MiddlewareParser::new().extract_middleware(&parsed, class_name)
+ }
+
+ #[test]
+ fn test_extract_middleware_with_context() {
+ let source = r"
+ import { MiddlewareOptions, MiddlewareResponse, TRPCMiddleware } from 'nestjs-trpc';
+ import { Injectable } from '@nestjs/common';
+
+ @Injectable()
+ export class ProtectedMiddleware implements TRPCMiddleware {
+ async use(opts: MiddlewareOptions): Promise {
+ return opts.next({
+ ctx: {
+ ben: 1,
+ },
+ });
+ }
+ }
+ ";
+
+ let info = parse_and_extract(source, "ProtectedMiddleware");
+ assert!(info.is_some());
+
+ let info = info.unwrap();
+ assert_eq!(info.class_name, "ProtectedMiddleware");
+ assert_eq!(info.context_properties.len(), 1);
+ assert_eq!(info.context_properties[0].name, "ben");
+ assert_eq!(info.context_properties[0].type_string, "number");
+ }
+
+ #[test]
+ fn test_extract_middleware_multiple_properties() {
+ let source = r"
+ export class AuthMiddleware {
+ async use(opts) {
+ return opts.next({
+ ctx: {
+ userId: '123',
+ isAdmin: true,
+ permissions: ['read', 'write'],
+ },
+ });
+ }
+ }
+ ";
+
+ let info = parse_and_extract(source, "AuthMiddleware");
+ assert!(info.is_some());
+
+ let info = info.unwrap();
+ assert_eq!(info.context_properties.len(), 3);
+
+ let names: Vec<&str> = info
+ .context_properties
+ .iter()
+ .map(|p| p.name.as_str())
+ .collect();
+ assert!(names.contains(&"userId"));
+ assert!(names.contains(&"isAdmin"));
+ assert!(names.contains(&"permissions"));
+ }
+
+ #[test]
+ fn test_extract_middleware_no_context() {
+ let source = r"
+ export class LoggingMiddleware {
+ async use(opts) {
+ let start = Date.now();
+ let result = await opts.next();
+ return result;
+ }
+ }
+ ";
+
+ let info = parse_and_extract(source, "LoggingMiddleware");
+ assert!(info.is_some());
+
+ let info = info.unwrap();
+ assert!(info.context_properties.is_empty());
+ }
+
+ #[test]
+ fn test_extract_middleware_class_not_found() {
+ let source = r"
+ export class SomeOtherClass {
+ async use(opts) {
+ return opts.next({ ctx: { test: true } });
+ }
+ }
+ ";
+
+ let info = parse_and_extract(source, "ProtectedMiddleware");
+ assert!(info.is_none());
+ }
+
+ #[test]
+ fn test_extract_middleware_no_use_method() {
+ let source = r"
+ export class ProtectedMiddleware {
+ async handle(opts) {
+ return opts.next({ ctx: {} });
+ }
+ }
+ ";
+
+ let info = parse_and_extract(source, "ProtectedMiddleware");
+ assert!(info.is_none());
+ }
+
+ #[test]
+ fn test_extract_middleware_nested_object() {
+ let source = r"
+ export class AuthMiddleware {
+ async use(opts) {
+ return opts.next({
+ ctx: {
+ user: { id: '1', name: 'Test' },
+ },
+ });
+ }
+ }
+ ";
+
+ let info = parse_and_extract(source, "AuthMiddleware");
+ assert!(info.is_some());
+
+ let info = info.unwrap();
+ assert_eq!(info.context_properties.len(), 1);
+ assert_eq!(info.context_properties[0].name, "user");
+ assert!(info.context_properties[0].type_string.contains("id:"));
+ }
+
+ #[test]
+ fn test_convenience_function() {
+ let source = r"
+ export class TestMiddleware {
+ async use(opts) {
+ return opts.next({ ctx: { test: 'value' } });
+ }
+ }
+ ";
+
+ let (_temp, path) = create_temp_file(source);
+ let parser = TsParser::new();
+ let parsed = parser.parse_file(&path).expect("Failed to parse");
+
+ let info = extract_middleware(&parsed, "TestMiddleware");
+ assert!(info.is_some());
+ }
+}
diff --git a/packages/nestjs-trpc/cli/src/parser/mod.rs b/packages/nestjs-trpc/cli/src/parser/mod.rs
new file mode 100644
index 0000000..9e76df1
--- /dev/null
+++ b/packages/nestjs-trpc/cli/src/parser/mod.rs
@@ -0,0 +1,696 @@
+pub mod context;
+pub mod decorator;
+pub mod imports;
+pub mod middleware;
+pub mod module;
+pub mod procedure;
+pub mod router;
+pub mod schema;
+
+use crate::error::ParserError;
+use std::path::{Path, PathBuf};
+use swc_common::comments::SingleThreadedComments;
+use swc_common::input::StringInput;
+use swc_common::sync::Lrc;
+use swc_common::{FileName, SourceFile, SourceMap, SourceMapper, Spanned};
+use swc_ecma_ast::Module;
+use swc_ecma_parser::lexer::Lexer;
+use swc_ecma_parser::{Parser, Syntax, TsSyntax};
+use tracing::{debug, trace, warn};
+
+pub type ParserResult = std::result::Result;
+
+#[derive(Clone)]
+pub struct ParsedFile {
+ pub file_path: PathBuf,
+ pub module: Module,
+ pub source_map: Lrc,
+ pub comments: SingleThreadedComments,
+ pub source_file: Lrc,
+}
+
+impl std::fmt::Debug for ParsedFile {
+ fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+ f.debug_struct("ParsedFile")
+ .field("file_path", &self.file_path)
+ .field("module", &self.module)
+ .field("source_map", &"")
+ .field("comments", &"")
+ .field("source_file", &"")
+ .finish()
+ }
+}
+
+impl ParsedFile {
+ #[must_use]
+ pub fn get_source_text(&self, span: swc_common::Span) -> String {
+ self.source_map
+ .span_to_snippet(span)
+ .unwrap_or_else(|_| String::new())
+ }
+
+ #[must_use]
+ pub fn get_line_col(&self, span: swc_common::Span) -> (usize, usize) {
+ let loc = self.source_map.lookup_char_pos(span.lo);
+ (loc.line, loc.col_display + 1)
+ }
+}
+
+#[derive(Debug, Clone)]
+pub struct TsParser {
+ syntax: TsSyntax,
+}
+
+impl Default for TsParser {
+ fn default() -> Self {
+ Self::new()
+ }
+}
+
+impl TsParser {
+ // Configured with `decorators: true` which is CRITICAL for parsing NestJS decorators
+ #[must_use]
+ pub fn new() -> Self {
+ let syntax = TsSyntax {
+ tsx: false,
+ decorators: true,
+ dts: false,
+ no_early_errors: false,
+ disallow_ambiguous_jsx_like: true,
+ };
+
+ debug!("Created TsParser with decorator support enabled");
+
+ Self { syntax }
+ }
+
+ #[must_use]
+ pub const fn with_tsx(mut self) -> Self {
+ self.syntax.tsx = true;
+ self
+ }
+
+ #[must_use]
+ pub const fn with_dts(mut self) -> Self {
+ self.syntax.dts = true;
+ self
+ }
+
+ pub fn parse_file>(&self, path: P) -> ParserResult {
+ let path = path.as_ref();
+ debug!(path = ?path, "Parsing TypeScript file");
+
+ let source = std::fs::read_to_string(path).map_err(|e| ParserError::ReadFailed {
+ path: path.to_path_buf(),
+ source: e,
+ })?;
+
+ let source = source.strip_prefix('\u{feff}').unwrap_or(&source);
+
+ self.parse_source(path, source)
+ }
+
+ pub fn parse_source>(&self, path: P, source: &str) -> ParserResult {
+ let path = path.as_ref();
+ trace!(path = ?path, source_len = source.len(), "Parsing source");
+
+ let source_map: Lrc = Lrc::default();
+ let source_file = source_map.new_source_file(
+ FileName::Real(path.to_path_buf()).into(),
+ source.to_string(),
+ );
+
+ let comments = SingleThreadedComments::default();
+
+ let lexer = Lexer::new(
+ Syntax::Typescript(self.syntax),
+ swc_ecma_ast::EsVersion::EsNext,
+ StringInput::from(&*source_file),
+ Some(&comments),
+ );
+
+ let mut parser = Parser::new_from(lexer);
+
+ let mut has_errors = false;
+ for error in parser.take_errors() {
+ has_errors = true;
+ let span = error.span();
+ let loc = source_map.lookup_char_pos(span.lo);
+ warn!(
+ path = ?path,
+ line = loc.line,
+ column = loc.col_display + 1,
+ "Parse error: {}",
+ error.kind().msg()
+ );
+ }
+
+ let module = parser.parse_module().map_err(|e| {
+ let span = e.span();
+ let loc = source_map.lookup_char_pos(span.lo);
+ ParserError::SyntaxError {
+ path: path.to_path_buf(),
+ line: loc.line,
+ column: loc.col_display + 1,
+ message: e.kind().msg().to_string(),
+ }
+ })?;
+
+ for error in parser.take_errors() {
+ let span = error.span();
+ let loc = source_map.lookup_char_pos(span.lo);
+ warn!(
+ path = ?path,
+ line = loc.line,
+ column = loc.col_display + 1,
+ "Parse warning: {}",
+ error.kind().msg()
+ );
+ }
+
+ if has_errors {
+ trace!(path = ?path, "Parsed with recoverable errors");
+ } else {
+ trace!(path = ?path, "Parsed successfully");
+ }
+
+ debug!(
+ path = ?path,
+ items = module.body.len(),
+ "Parsed module successfully"
+ );
+
+ Ok(ParsedFile {
+ file_path: path.to_path_buf(),
+ module,
+ source_map,
+ comments,
+ source_file: Lrc::clone(&source_file),
+ })
+ }
+
+ pub fn parse_files(&self, paths: I) -> (Vec, Vec)
+ where
+ I: IntoIterator- ,
+ P: AsRef
,
+ {
+ let mut parsed = Vec::new();
+ let mut errors = Vec::new();
+
+ for path in paths {
+ match self.parse_file(path) {
+ Ok(file) => parsed.push(file),
+ Err(e) => errors.push(e),
+ }
+ }
+
+ (parsed, errors)
+ }
+}
+
+pub fn parse_typescript_file>(path: P) -> ParserResult {
+ let parser = TsParser::new();
+ parser.parse_file(path)
+}
+
+pub fn parse_typescript_source(source: &str) -> ParserResult {
+ let parser = TsParser::new();
+ parser.parse_source(" ", source)
+}
+
+pub use context::{extract_context, ContextInfo, ContextParser};
+pub use decorator::{is_procedure_decorator, DecoratorParser, ProcedureDecoratorInfo};
+pub use middleware::{
+ extract_middleware, extract_middleware_names_from_class, ContextProperty, MiddlewareInfo,
+ MiddlewareParser,
+};
+pub use module::{extract_trpc_options, resolve_context_file, ModuleParser, TrpcModuleOptions};
+pub use procedure::extract_procedures_from_class;
+pub use router::{extract_routers, RouterInfo, RouterParser};
+pub use schema::{flatten_zod_schema, ZodFlattener, ZodResult};
+
+#[cfg(test)]
+mod tests {
+ use super::*;
+ use std::fs;
+ use swc_ecma_ast::{Decl, ModuleItem, Stmt};
+ use tempfile::TempDir;
+
+ fn create_temp_file(content: &str) -> (TempDir, PathBuf) {
+ let temp_dir = TempDir::new().expect("Failed to create temp dir");
+ let file_path = temp_dir.path().join("test.ts");
+ fs::write(&file_path, content).expect("Failed to write test file");
+ (temp_dir, file_path)
+ }
+
+ #[test]
+ fn test_parser_creation() {
+ let parser = TsParser::new();
+ assert!(parser.syntax.decorators, "Decorators should be enabled");
+ assert!(!parser.syntax.tsx, "TSX should be disabled by default");
+ }
+
+ #[test]
+ fn test_parser_with_tsx() {
+ let parser = TsParser::new().with_tsx();
+ assert!(parser.syntax.tsx, "TSX should be enabled");
+ assert!(
+ parser.syntax.decorators,
+ "Decorators should still be enabled"
+ );
+ }
+
+ #[test]
+ fn test_parse_simple_file() {
+ let source = r#"
+ const x: number = 42;
+ export function hello(): string {
+ return "world";
+ }
+ "#;
+ let (_temp, path) = create_temp_file(source);
+
+ let parser = TsParser::new();
+ let result = parser.parse_file(&path);
+
+ assert!(result.is_ok());
+ let parsed = result.unwrap();
+ assert_eq!(parsed.file_path, path);
+ assert!(!parsed.module.body.is_empty());
+ }
+
+ #[test]
+ fn test_parse_with_decorators() {
+ let source = r"
+ function Router(options?: any) {
+ return (target: any) => target;
+ }
+
+ @Router({ alias: 'users' })
+ export class UserRouter {
+ constructor() {}
+ }
+ ";
+ let (_temp, path) = create_temp_file(source);
+
+ let parser = TsParser::new();
+ let result = parser.parse_file(&path);
+
+ assert!(result.is_ok(), "Should parse decorators successfully");
+ let parsed = result.unwrap();
+
+ let has_class = parsed.module.body.iter().any(|item| {
+ matches!(
+ item,
+ ModuleItem::Stmt(Stmt::Decl(Decl::Class(_)))
+ | ModuleItem::ModuleDecl(swc_ecma_ast::ModuleDecl::ExportDecl(
+ swc_ecma_ast::ExportDecl {
+ decl: Decl::Class(_),
+ ..
+ }
+ ))
+ )
+ });
+ assert!(has_class, "Should have a class declaration");
+ }
+
+ #[test]
+ fn test_parse_query_decorator() {
+ let source = r"
+ import { Query } from 'nestjs-trpc';
+ import { z } from 'zod';
+
+ export class UserRouter {
+ @Query({
+ input: z.object({ userId: z.string() }),
+ output: z.object({ name: z.string() }),
+ })
+ async getUserById(): Promise {
+ return {};
+ }
+ }
+ ";
+ let (_temp, path) = create_temp_file(source);
+
+ let parser = TsParser::new();
+ let result = parser.parse_file(&path);
+
+ assert!(result.is_ok(), "Should parse @Query decorator");
+ }
+
+ #[test]
+ fn test_parse_source_directly() {
+ let source = r#"
+ export const message: string = "hello";
+ "#;
+
+ let parser = TsParser::new();
+ let result = parser.parse_source("virtual.ts", source);
+
+ assert!(result.is_ok());
+ let parsed = result.unwrap();
+ assert_eq!(parsed.file_path, PathBuf::from("virtual.ts"));
+ }
+
+ #[test]
+ fn test_parse_file_not_found() {
+ let parser = TsParser::new();
+ let result = parser.parse_file("/nonexistent/path/file.ts");
+
+ assert!(matches!(result, Err(ParserError::ReadFailed { .. })));
+ }
+
+ #[test]
+ fn test_parse_syntax_error() {
+ let source = r#"
+ export function broken(: string {
+ return "missing param name";
+ }
+ "#;
+ let (_temp, path) = create_temp_file(source);
+
+ let parser = TsParser::new();
+ let result = parser.parse_file(&path);
+
+ assert!(matches!(result, Err(ParserError::SyntaxError { .. })));
+ }
+
+ #[test]
+ fn test_parse_with_utf8_bom() {
+ let source = "\u{feff}const x: number = 1;";
+ let (_temp, path) = create_temp_file(source);
+
+ let parser = TsParser::new();
+ let result = parser.parse_file(&path);
+
+ assert!(result.is_ok(), "Should handle UTF-8 BOM");
+ }
+
+ #[test]
+ fn test_parse_multiple_files() {
+ let source1 = "const a: number = 1;";
+ let source2 = "const b: string = 'hello';";
+ let source3 = "invalid syntax {{{";
+
+ let temp_dir = TempDir::new().expect("Failed to create temp dir");
+ let path1 = temp_dir.path().join("file1.ts");
+ let path2 = temp_dir.path().join("file2.ts");
+ let path3 = temp_dir.path().join("file3.ts");
+
+ fs::write(&path1, source1).unwrap();
+ fs::write(&path2, source2).unwrap();
+ fs::write(&path3, source3).unwrap();
+
+ let parser = TsParser::new();
+ let (parsed, errors) = parser.parse_files(vec![&path1, &path2, &path3]);
+
+ assert_eq!(parsed.len(), 2, "Should have 2 successfully parsed files");
+ assert_eq!(errors.len(), 1, "Should have 1 error");
+ }
+
+ #[test]
+ fn test_get_source_text() {
+ let source = "const x: number = 42;";
+ let parser = TsParser::new();
+ let parsed = parser.parse_source("test.ts", source).unwrap();
+
+ assert!(!parsed.module.body.is_empty());
+ }
+
+ #[test]
+ fn test_convenience_function_parse_file() {
+ let source = "export const value: number = 100;";
+ let (_temp, path) = create_temp_file(source);
+
+ let result = parse_typescript_file(&path);
+ assert!(result.is_ok());
+ }
+
+ #[test]
+ fn test_convenience_function_parse_source() {
+ let source = "export const value: number = 100;";
+ let result = parse_typescript_source(source);
+
+ assert!(result.is_ok());
+ let parsed = result.unwrap();
+ assert_eq!(parsed.file_path, PathBuf::from(" "));
+ }
+
+ #[test]
+ fn test_parse_complex_router() {
+ let source = r"
+ import { Inject } from '@nestjs/common';
+ import { Router, Query, Mutation, Input, Ctx } from 'nestjs-trpc';
+ import { z } from 'zod';
+
+ @Router({ alias: 'users' })
+ export class UserRouter {
+ constructor(@Inject('UserService') private readonly userService: any) {}
+
+ @Query({
+ input: z.object({ userId: z.string() }),
+ output: z.object({ name: z.string(), email: z.string() }),
+ })
+ async getUserById(@Input('userId') userId: string): Promise {
+ return this.userService.getUser(userId);
+ }
+
+ @Mutation({
+ input: z.object({ name: z.string(), email: z.string() }),
+ })
+ async createUser(@Input() input: any): Promise {
+ return this.userService.createUser(input);
+ }
+ }
+ ";
+ let (_temp, path) = create_temp_file(source);
+
+ let parser = TsParser::new();
+ let result = parser.parse_file(&path);
+
+ assert!(
+ result.is_ok(),
+ "Should parse complex router with decorators"
+ );
+ let parsed = result.unwrap();
+
+ assert!(parsed.module.body.len() >= 2);
+ }
+
+ #[test]
+ fn test_parse_zod_schemas() {
+ let source = r"
+ import { z } from 'zod';
+
+ export const userSchema = z.object({
+ name: z.string(),
+ email: z.string().email(),
+ age: z.number().optional(),
+ });
+
+ export const userArraySchema = z.array(userSchema);
+
+ export type User = z.infer;
+ ";
+ let (_temp, path) = create_temp_file(source);
+
+ let parser = TsParser::new();
+ let result = parser.parse_file(&path);
+
+ assert!(result.is_ok(), "Should parse Zod schema definitions");
+ }
+
+ #[test]
+ fn test_default_parser() {
+ let parser = TsParser::default();
+ assert!(
+ parser.syntax.decorators,
+ "Default parser should have decorators enabled"
+ );
+ }
+
+ // ========================================================================
+ // Additional Result propagation tests (TEST-02)
+ // ========================================================================
+
+ #[test]
+ fn test_parse_empty_file_returns_ok_with_empty_body() {
+ let source = "";
+ let parser = TsParser::new();
+ let result = parser.parse_source("empty.ts", source);
+
+ assert!(result.is_ok(), "Empty file should parse successfully");
+ let parsed = result.unwrap();
+ assert!(
+ parsed.module.body.is_empty(),
+ "Empty file should have empty body"
+ );
+ }
+
+ #[test]
+ fn test_parse_file_with_only_whitespace_returns_ok() {
+ let source = " \n\n\t\t \n ";
+ let parser = TsParser::new();
+ let result = parser.parse_source("whitespace.ts", source);
+
+ assert!(
+ result.is_ok(),
+ "Whitespace-only file should parse successfully"
+ );
+ }
+
+ #[test]
+ fn test_parse_file_with_only_comments_returns_ok() {
+ let source = r"
+ // This is a comment
+ /* Block comment */
+ /**
+ * JSDoc comment
+ */
+ ";
+ let parser = TsParser::new();
+ let result = parser.parse_source("comments.ts", source);
+
+ assert!(
+ result.is_ok(),
+ "Comments-only file should parse successfully"
+ );
+ assert!(result.unwrap().module.body.is_empty());
+ }
+
+ #[test]
+ fn test_parse_syntax_error_contains_line_and_column() {
+ let source = "const x: = 42;";
+ let parser = TsParser::new();
+ let result = parser.parse_source("bad.ts", source);
+
+ match result {
+ Err(ParserError::SyntaxError {
+ path,
+ line,
+ column,
+ message,
+ }) => {
+ assert_eq!(path, PathBuf::from("bad.ts"));
+ assert!(line > 0, "Line should be positive");
+ assert!(column > 0, "Column should be positive");
+ assert!(!message.is_empty(), "Message should not be empty");
+ }
+ _ => panic!("Expected SyntaxError"),
+ }
+ }
+
+ #[test]
+ fn test_parse_read_failed_contains_path() {
+ let parser = TsParser::new();
+ let result = parser.parse_file("/nonexistent/deeply/nested/path/file.ts");
+
+ match result {
+ Err(ParserError::ReadFailed { path, .. }) => {
+ assert_eq!(
+ path,
+ PathBuf::from("/nonexistent/deeply/nested/path/file.ts")
+ );
+ }
+ _ => panic!("Expected ReadFailed"),
+ }
+ }
+
+ #[test]
+ fn test_parse_files_separates_successes_and_failures() {
+ let temp_dir = TempDir::new().expect("Failed to create temp dir");
+
+ let valid_content = "const x: number = 1;";
+ let invalid_content = "const :::";
+
+ let valid_path = temp_dir.path().join("valid.ts");
+ let invalid_path = temp_dir.path().join("invalid.ts");
+ let missing_path = temp_dir.path().join("missing.ts");
+
+ fs::write(&valid_path, valid_content).unwrap();
+ fs::write(&invalid_path, invalid_content).unwrap();
+
+ let parser = TsParser::new();
+ let (parsed, errors) = parser.parse_files([&valid_path, &invalid_path, &missing_path]);
+
+ assert_eq!(parsed.len(), 1, "Should have 1 successfully parsed file");
+ assert_eq!(
+ errors.len(),
+ 2,
+ "Should have 2 errors (1 syntax, 1 missing)"
+ );
+
+ let has_syntax_error = errors
+ .iter()
+ .any(|e| matches!(e, ParserError::SyntaxError { .. }));
+ let has_read_error = errors
+ .iter()
+ .any(|e| matches!(e, ParserError::ReadFailed { .. }));
+
+ assert!(has_syntax_error, "Should have syntax error");
+ assert!(has_read_error, "Should have read error");
+ }
+
+ #[test]
+ fn test_parse_recovers_from_minor_syntax_issues() {
+ let source = r#"
+ const x: number = 1;
+ const y: string = "hello";
+ "#;
+ let parser = TsParser::new();
+ let result = parser.parse_source("partial.ts", source);
+
+ assert!(result.is_ok(), "Should parse valid code");
+ assert_eq!(result.unwrap().module.body.len(), 2);
+ }
+
+ #[test]
+ fn test_parse_with_dts_mode() {
+ let source = r"
+ declare const x: number;
+ declare function foo(): void;
+ declare class Bar {}
+ ";
+ let parser = TsParser::new().with_dts();
+ let result = parser.parse_source("types.d.ts", source);
+
+ assert!(result.is_ok(), "Should parse .d.ts content");
+ }
+
+ #[test]
+ fn test_parse_tsx_content() {
+ let source = r"
+ const Component = () => Hello
;
+ export default Component;
+ ";
+ let parser = TsParser::new().with_tsx();
+ let result = parser.parse_source("component.tsx", source);
+
+ assert!(result.is_ok(), "Should parse TSX content");
+ }
+
+ #[test]
+ fn test_get_line_col_from_span() {
+ let source = "const x = 1;\nconst y = 2;";
+ let parser = TsParser::new();
+ let parsed = parser.parse_source("test.ts", source).unwrap();
+
+ assert!(!parsed.module.body.is_empty());
+ if let Some(item) = parsed.module.body.first() {
+ let (line, col) = parsed.get_line_col(item.span());
+ assert!(line >= 1, "Line should be at least 1");
+ assert!(col >= 1, "Column should be at least 1");
+ }
+ }
+
+ #[test]
+ fn test_get_source_text_returns_empty_for_invalid_span() {
+ let source = "const x = 1;";
+ let parser = TsParser::new();
+ let parsed = parser.parse_source("test.ts", source).unwrap();
+
+ let invalid_span = swc_common::Span::default();
+ let text = parsed.get_source_text(invalid_span);
+ assert!(text.is_empty() || !text.is_empty(), "Should not panic");
+ }
+}
diff --git a/packages/nestjs-trpc/cli/src/parser/module.rs b/packages/nestjs-trpc/cli/src/parser/module.rs
new file mode 100644
index 0000000..31f37b9
--- /dev/null
+++ b/packages/nestjs-trpc/cli/src/parser/module.rs
@@ -0,0 +1,758 @@
+use crate::parser::ParsedFile;
+use std::path::PathBuf;
+use swc_ecma_ast::{
+ CallExpr, Callee, Class, Decl, Decorator, Expr, ExprOrSpread, Lit, MemberExpr, MemberProp,
+ ModuleDecl, ModuleItem, ObjectLit, Prop, PropName, PropOrSpread, Stmt,
+};
+use tracing::{debug, trace};
+
+#[derive(Debug, Clone, Default)]
+pub struct TrpcModuleOptions {
+ pub context_class_name: Option,
+ pub auto_schema_file: Option,
+}
+
+fn extract_class_from_module_item(item: &ModuleItem) -> Option<&Class> {
+ match item {
+ ModuleItem::ModuleDecl(ModuleDecl::ExportDecl(export_declaration)) => {
+ let Decl::Class(class_declaration) = &export_declaration.decl else {
+ return None;
+ };
+ Some(&class_declaration.class)
+ }
+ ModuleItem::Stmt(Stmt::Decl(Decl::Class(class_declaration))) => {
+ Some(&class_declaration.class)
+ }
+ _ => None,
+ }
+}
+
+fn extract_imports_array(property: &PropOrSpread) -> Option<&[Option]> {
+ let PropOrSpread::Prop(property_box) = property else {
+ return None;
+ };
+ let Prop::KeyValue(key_value) = &**property_box else {
+ return None;
+ };
+
+ let is_imports_key = is_property_named(&key_value.key, "imports");
+ if !is_imports_key {
+ return None;
+ }
+
+ let Expr::Array(array_literal) = &*key_value.value else {
+ return None;
+ };
+
+ Some(array_literal.elems.as_slice())
+}
+
+fn is_property_named(key: &PropName, expected_name: &str) -> bool {
+ match key {
+ PropName::Ident(identifier) => identifier.sym.as_ref() == expected_name,
+ PropName::Str(string) => string.value.to_string_lossy() == expected_name,
+ _ => false,
+ }
+}
+
+#[derive(Debug, Clone, Default)]
+pub struct ModuleParser;
+
+impl ModuleParser {
+ #[must_use]
+ pub const fn new() -> Self {
+ Self
+ }
+
+ pub fn extract_trpc_options(&self, parsed_file: &ParsedFile) -> Option {
+ debug!(path = ?parsed_file.file_path, "Extracting TRPC module options");
+
+ let options = parsed_file
+ .module
+ .body
+ .iter()
+ .find_map(|item| self.extract_from_module_item(item));
+
+ if let Some(ref options) = options {
+ debug!(
+ context = ?options.context_class_name,
+ auto_schema = ?options.auto_schema_file,
+ "Found TRPC module options"
+ );
+ } else {
+ debug!(path = ?parsed_file.file_path, "No TRPC module options found");
+ }
+
+ options
+ }
+
+ fn extract_from_module_item(&self, item: &ModuleItem) -> Option {
+ let decorators = self.extract_class_decorators(item)?;
+ self.extract_from_class_decorators(decorators)
+ }
+
+ #[allow(clippy::unused_self)]
+ fn extract_class_decorators<'a>(&self, item: &'a ModuleItem) -> Option<&'a [Decorator]> {
+ extract_class_from_module_item(item).map(|class| class.decorators.as_slice())
+ }
+
+ fn extract_from_class_decorators(&self, decorators: &[Decorator]) -> Option {
+ decorators
+ .iter()
+ .find_map(|decorator| self.extract_from_decorator(decorator))
+ }
+
+ fn extract_from_decorator(&self, decorator: &Decorator) -> Option {
+ let Expr::Call(call_expression) = &*decorator.expr else {
+ return None;
+ };
+
+ let is_module_decorator = self.is_module_call(call_expression);
+ if !is_module_decorator {
+ return None;
+ }
+
+ trace!("Found @Module decorator");
+ self.extract_trpc_from_module_options(call_expression)
+ }
+
+ #[allow(clippy::unused_self)]
+ fn is_module_call(&self, call_expression: &CallExpr) -> bool {
+ let Callee::Expr(callee_expression) = &call_expression.callee else {
+ return false;
+ };
+
+ matches!(&**callee_expression, Expr::Ident(identifier) if identifier.sym.as_ref() == "Module")
+ }
+
+ fn extract_trpc_from_module_options(
+ &self,
+ call_expression: &CallExpr,
+ ) -> Option {
+ let first_argument = call_expression.args.first()?;
+ let Expr::Object(module_options) = &*first_argument.expr else {
+ return None;
+ };
+
+ let imports_array = self.find_imports_property(module_options)?;
+ self.find_trpc_module_in_imports(imports_array)
+ }
+
+ #[allow(clippy::unused_self)]
+ fn find_imports_property<'a>(
+ &self,
+ object: &'a ObjectLit,
+ ) -> Option<&'a [Option]> {
+ object
+ .props
+ .iter()
+ .find_map(|property| extract_imports_array(property))
+ }
+
+ fn find_trpc_module_in_imports(
+ &self,
+ imports: &[Option],
+ ) -> Option {
+ imports
+ .iter()
+ .flatten()
+ .find_map(|import_element| self.extract_trpc_for_root(&import_element.expr))
+ }
+
+ fn extract_trpc_for_root(&self, expression: &Expr) -> Option {
+ let Expr::Call(call_expression) = expression else {
+ return None;
+ };
+
+ let is_trpc_for_root = self.is_trpc_module_for_root_call(call_expression);
+ if !is_trpc_for_root {
+ return None;
+ }
+
+ trace!("Found TRPCModule.forRoot() call");
+ self.extract_options_from_for_root(call_expression)
+ }
+
+ fn is_trpc_module_for_root_call(&self, call_expression: &CallExpr) -> bool {
+ let Callee::Expr(callee_expression) = &call_expression.callee else {
+ return false;
+ };
+
+ let Expr::Member(member_expression) = &**callee_expression else {
+ return false;
+ };
+
+ self.is_trpc_module_member(member_expression)
+ }
+
+ #[allow(clippy::unused_self)]
+ fn is_trpc_module_member(&self, member: &MemberExpr) -> bool {
+ let Expr::Ident(object_identifier) = &*member.obj else {
+ return false;
+ };
+
+ let is_trpc_module = object_identifier.sym.as_ref() == "TRPCModule";
+ if !is_trpc_module {
+ return false;
+ }
+
+ let MemberProp::Ident(property_identifier) = &member.prop else {
+ return false;
+ };
+
+ property_identifier.sym.as_ref() == "forRoot"
+ }
+
+ fn extract_options_from_for_root(
+ &self,
+ call_expression: &CallExpr,
+ ) -> Option {
+ let first_argument = call_expression.args.first()?;
+ let Expr::Object(options_object) = &*first_argument.expr else {
+ return None;
+ };
+
+ let mut result = TrpcModuleOptions::default();
+
+ options_object
+ .props
+ .iter()
+ .filter_map(|property| self.extract_key_value_property(property))
+ .for_each(|key_value| self.extract_option_value(key_value, &mut result));
+
+ Some(result)
+ }
+
+ #[allow(clippy::unused_self)]
+ fn extract_key_value_property<'a>(
+ &self,
+ property: &'a PropOrSpread,
+ ) -> Option<&'a swc_ecma_ast::KeyValueProp> {
+ let PropOrSpread::Prop(property_box) = property else {
+ return None;
+ };
+ let Prop::KeyValue(key_value) = &**property_box else {
+ return None;
+ };
+ Some(key_value)
+ }
+
+ fn extract_option_value(
+ &self,
+ key_value: &swc_ecma_ast::KeyValueProp,
+ result: &mut TrpcModuleOptions,
+ ) {
+ let Some(key_name) = self.get_property_key_name(&key_value.key) else {
+ return;
+ };
+
+ match key_name.as_str() {
+ "context" => self.extract_context_option(key_value, result),
+ "autoSchemaFile" => self.extract_auto_schema_option(key_value, result),
+ _ => {}
+ }
+ }
+
+ #[allow(clippy::unused_self)]
+ fn extract_context_option(
+ &self,
+ key_value: &swc_ecma_ast::KeyValueProp,
+ result: &mut TrpcModuleOptions,
+ ) {
+ let Expr::Ident(identifier) = &*key_value.value else {
+ return;
+ };
+ result.context_class_name = Some(identifier.sym.to_string());
+ trace!(context = %identifier.sym, "Found context class name");
+ }
+
+ #[allow(clippy::unused_self)]
+ fn extract_auto_schema_option(
+ &self,
+ key_value: &swc_ecma_ast::KeyValueProp,
+ result: &mut TrpcModuleOptions,
+ ) {
+ let Expr::Lit(Lit::Str(string)) = &*key_value.value else {
+ return;
+ };
+ let auto_schema_value = string.value.to_string_lossy().into_owned();
+ trace!(auto_schema = %auto_schema_value, "Found autoSchemaFile");
+ result.auto_schema_file = Some(auto_schema_value);
+ }
+
+ #[allow(clippy::unused_self)]
+ fn get_property_key_name(&self, key: &PropName) -> Option {
+ match key {
+ PropName::Ident(identifier) => Some(identifier.sym.to_string()),
+ PropName::Str(string) => Some(string.value.to_string_lossy().into_owned()),
+ _ => None,
+ }
+ }
+}
+
+#[must_use]
+pub fn extract_trpc_options(parsed_file: &ParsedFile) -> Option {
+ ModuleParser::new().extract_trpc_options(parsed_file)
+}
+
+pub fn resolve_context_file(parsed_file: &ParsedFile, context_class_name: &str) -> Option {
+ let source_directory = parsed_file.file_path.parent()?;
+
+ let resolved = parsed_file
+ .module
+ .body
+ .iter()
+ .find_map(|item| find_context_import(item, context_class_name, source_directory));
+
+ if let Some(ref path) = resolved {
+ trace!(
+ context = %context_class_name,
+ path = ?path,
+ "Resolved context file"
+ );
+ }
+
+ resolved
+}
+
+fn find_context_import(
+ item: &ModuleItem,
+ context_class_name: &str,
+ source_directory: &std::path::Path,
+) -> Option {
+ use swc_ecma_ast::ImportSpecifier;
+
+ let ModuleItem::ModuleDecl(ModuleDecl::Import(import_declaration)) = item else {
+ return None;
+ };
+
+ let module_specifier = import_declaration.src.value.to_string_lossy();
+ if !module_specifier.starts_with('.') {
+ return None;
+ }
+
+ let has_matching_specifier = import_declaration.specifiers.iter().any(|specifier| {
+ let ImportSpecifier::Named(named) = specifier else {
+ return false;
+ };
+ named.local.sym.as_ref() == context_class_name
+ });
+
+ if !has_matching_specifier {
+ return None;
+ }
+
+ crate::parser::imports::module_path::resolve_module_path(source_directory, &module_specifier)
+}
+
+#[cfg(test)]
+mod tests {
+ use super::*;
+ use crate::parser::TsParser;
+ use std::fs;
+ use tempfile::TempDir;
+
+ fn create_temp_file(content: &str) -> (TempDir, PathBuf) {
+ let temp_directory = TempDir::new().expect("Failed to create temp dir");
+ let file_path = temp_directory.path().join("app.module.ts");
+ fs::write(&file_path, content).expect("Failed to write test file");
+ (temp_directory, file_path)
+ }
+
+ fn parse_and_extract(source: &str) -> Option {
+ let (_temp, path) = create_temp_file(source);
+ let parser = TsParser::new();
+ let parsed = parser.parse_file(&path).expect("Failed to parse");
+ ModuleParser::new().extract_trpc_options(&parsed)
+ }
+
+ #[test]
+ fn test_extract_trpc_options_with_context() {
+ let source = r"
+ import { Module } from '@nestjs/common';
+ import { TRPCModule } from 'nestjs-trpc';
+ import { AppContext } from './app.context';
+
+ @Module({
+ imports: [
+ TRPCModule.forRoot({
+ autoSchemaFile: './src/@generated',
+ context: AppContext,
+ }),
+ ],
+ })
+ export class AppModule {}
+ ";
+
+ let options = parse_and_extract(source);
+ assert!(options.is_some());
+
+ let options = options.unwrap();
+ assert_eq!(options.context_class_name, Some("AppContext".to_string()));
+ assert_eq!(
+ options.auto_schema_file,
+ Some("./src/@generated".to_string())
+ );
+ }
+
+ #[test]
+ fn test_extract_trpc_options_without_context() {
+ let source = r"
+ import { Module } from '@nestjs/common';
+ import { TRPCModule } from 'nestjs-trpc';
+
+ @Module({
+ imports: [
+ TRPCModule.forRoot({
+ autoSchemaFile: './src/@generated',
+ }),
+ ],
+ })
+ export class AppModule {}
+ ";
+
+ let options = parse_and_extract(source);
+ assert!(options.is_some());
+
+ let options = options.unwrap();
+ assert_eq!(options.context_class_name, None);
+ assert_eq!(
+ options.auto_schema_file,
+ Some("./src/@generated".to_string())
+ );
+ }
+
+ #[test]
+ fn test_no_trpc_module() {
+ let source = r"
+ import { Module } from '@nestjs/common';
+
+ @Module({
+ imports: [],
+ })
+ export class AppModule {}
+ ";
+
+ let options = parse_and_extract(source);
+ assert!(options.is_none());
+ }
+
+ #[test]
+ fn test_module_with_multiple_imports() {
+ let source = r"
+ import { Module } from '@nestjs/common';
+ import { TRPCModule } from 'nestjs-trpc';
+ import { TypeOrmModule } from '@nestjs/typeorm';
+ import { AppContext } from './app.context';
+
+ @Module({
+ imports: [
+ TypeOrmModule.forRoot({}),
+ TRPCModule.forRoot({
+ autoSchemaFile: './generated',
+ context: AppContext,
+ }),
+ ],
+ })
+ export class AppModule {}
+ ";
+
+ let options = parse_and_extract(source);
+ assert!(options.is_some());
+
+ let options = options.unwrap();
+ assert_eq!(options.context_class_name, Some("AppContext".to_string()));
+ }
+
+ #[test]
+ fn test_non_exported_module() {
+ let source = r"
+ import { Module } from '@nestjs/common';
+ import { TRPCModule } from 'nestjs-trpc';
+ import { AppContext } from './app.context';
+
+ @Module({
+ imports: [
+ TRPCModule.forRoot({
+ context: AppContext,
+ }),
+ ],
+ })
+ class AppModule {}
+ ";
+
+ let options = parse_and_extract(source);
+ assert!(options.is_some());
+ assert_eq!(
+ options.unwrap().context_class_name,
+ Some("AppContext".to_string())
+ );
+ }
+
+ #[test]
+ fn test_resolve_context_file() {
+ let temp_directory = TempDir::new().expect("Failed to create temp dir");
+ let base = temp_directory.path();
+
+ fs::write(
+ base.join("app.context.ts"),
+ r"
+ export class AppContext {}
+ ",
+ )
+ .unwrap();
+
+ let module_path = base.join("app.module.ts");
+ fs::write(
+ &module_path,
+ r"
+ import { Module } from '@nestjs/common';
+ import { TRPCModule } from 'nestjs-trpc';
+ import { AppContext } from './app.context';
+
+ @Module({
+ imports: [
+ TRPCModule.forRoot({
+ context: AppContext,
+ }),
+ ],
+ })
+ export class AppModule {}
+ ",
+ )
+ .unwrap();
+
+ let parser = TsParser::new();
+ let parsed = parser.parse_file(&module_path).expect("Failed to parse");
+
+ let resolved = resolve_context_file(&parsed, "AppContext");
+ assert!(resolved.is_some());
+ assert!(resolved.unwrap().ends_with("app.context.ts"));
+ }
+
+ // ========================================================================
+ // Additional Option propagation tests (TEST-02)
+ // ========================================================================
+
+ #[test]
+ fn test_empty_module_returns_none() {
+ let source = "";
+ let options = parse_and_extract(source);
+ assert!(options.is_none(), "Empty module should return None");
+ }
+
+ #[test]
+ fn test_module_without_decorator_returns_none() {
+ let source = r"
+ export class AppModule {}
+ ";
+
+ let options = parse_and_extract(source);
+ assert!(options.is_none(), "Class without @Module returns None");
+ }
+
+ #[test]
+ fn test_module_with_empty_imports_returns_none() {
+ let source = r"
+ import { Module } from '@nestjs/common';
+
+ @Module({
+ imports: [],
+ })
+ export class AppModule {}
+ ";
+
+ let options = parse_and_extract(source);
+ assert!(options.is_none(), "Empty imports array returns None");
+ }
+
+ #[test]
+ fn test_module_with_non_trpc_imports_returns_none() {
+ let source = r"
+ import { Module } from '@nestjs/common';
+ import { TypeOrmModule } from '@nestjs/typeorm';
+
+ @Module({
+ imports: [
+ TypeOrmModule.forRoot({}),
+ ],
+ })
+ export class AppModule {}
+ ";
+
+ let options = parse_and_extract(source);
+ assert!(options.is_none(), "Module without TRPCModule returns None");
+ }
+
+ #[test]
+ fn test_trpc_module_with_empty_options() {
+ let source = r"
+ import { Module } from '@nestjs/common';
+ import { TRPCModule } from 'nestjs-trpc';
+
+ @Module({
+ imports: [
+ TRPCModule.forRoot({}),
+ ],
+ })
+ export class AppModule {}
+ ";
+
+ let options = parse_and_extract(source);
+ assert!(
+ options.is_some(),
+ "TRPCModule.forRoot(empty) should return Some"
+ );
+ let opts = options.unwrap();
+ assert!(opts.context_class_name.is_none());
+ assert!(opts.auto_schema_file.is_none());
+ }
+
+ #[test]
+ fn test_trpc_module_only_context() {
+ let source = r"
+ import { Module } from '@nestjs/common';
+ import { TRPCModule } from 'nestjs-trpc';
+ import { AppContext } from './app.context';
+
+ @Module({
+ imports: [
+ TRPCModule.forRoot({
+ context: AppContext,
+ }),
+ ],
+ })
+ export class AppModule {}
+ ";
+
+ let options = parse_and_extract(source);
+ assert!(options.is_some());
+ let opts = options.unwrap();
+ assert_eq!(opts.context_class_name, Some("AppContext".to_string()));
+ assert!(opts.auto_schema_file.is_none());
+ }
+
+ #[test]
+ fn test_trpc_module_only_auto_schema() {
+ let source = r"
+ import { Module } from '@nestjs/common';
+ import { TRPCModule } from 'nestjs-trpc';
+
+ @Module({
+ imports: [
+ TRPCModule.forRoot({
+ autoSchemaFile: './generated',
+ }),
+ ],
+ })
+ export class AppModule {}
+ ";
+
+ let options = parse_and_extract(source);
+ assert!(options.is_some());
+ let opts = options.unwrap();
+ assert!(opts.context_class_name.is_none());
+ assert_eq!(opts.auto_schema_file, Some("./generated".to_string()));
+ }
+
+ #[test]
+ fn test_resolve_context_file_missing_import() {
+ let temp_directory = TempDir::new().expect("Failed to create temp dir");
+ let module_path = temp_directory.path().join("app.module.ts");
+
+ fs::write(
+ &module_path,
+ r"
+ import { Module } from '@nestjs/common';
+ import { TRPCModule } from 'nestjs-trpc';
+
+ @Module({
+ imports: [
+ TRPCModule.forRoot({
+ context: UnimportedContext,
+ }),
+ ],
+ })
+ export class AppModule {}
+ ",
+ )
+ .unwrap();
+
+ let parser = TsParser::new();
+ let parsed = parser.parse_file(&module_path).expect("Failed to parse");
+
+ let resolved = resolve_context_file(&parsed, "UnimportedContext");
+ assert!(
+ resolved.is_none(),
+ "Should return None for unimported context"
+ );
+ }
+
+ #[test]
+ fn test_resolve_context_file_external_module() {
+ let temp_directory = TempDir::new().expect("Failed to create temp dir");
+ let module_path = temp_directory.path().join("app.module.ts");
+
+ fs::write(
+ &module_path,
+ r"
+ import { Module } from '@nestjs/common';
+ import { TRPCModule } from 'nestjs-trpc';
+ import { SomeContext } from 'some-external-package';
+
+ @Module({
+ imports: [
+ TRPCModule.forRoot({
+ context: SomeContext,
+ }),
+ ],
+ })
+ export class AppModule {}
+ ",
+ )
+ .unwrap();
+
+ let parser = TsParser::new();
+ let parsed = parser.parse_file(&module_path).expect("Failed to parse");
+
+ let resolved = resolve_context_file(&parsed, "SomeContext");
+ assert!(
+ resolved.is_none(),
+ "Should return None for external module imports"
+ );
+ }
+
+ #[test]
+ fn test_resolve_context_file_nonexistent_file() {
+ let temp_directory = TempDir::new().expect("Failed to create temp dir");
+ let module_path = temp_directory.path().join("app.module.ts");
+
+ fs::write(
+ &module_path,
+ r"
+ import { Module } from '@nestjs/common';
+ import { TRPCModule } from 'nestjs-trpc';
+ import { MissingContext } from './nonexistent.context';
+
+ @Module({
+ imports: [
+ TRPCModule.forRoot({
+ context: MissingContext,
+ }),
+ ],
+ })
+ export class AppModule {}
+ ",
+ )
+ .unwrap();
+
+ let parser = TsParser::new();
+ let parsed = parser.parse_file(&module_path).expect("Failed to parse");
+
+ let resolved = resolve_context_file(&parsed, "MissingContext");
+ assert!(
+ resolved.is_none(),
+ "Should return None when imported file doesn't exist"
+ );
+ }
+}
diff --git a/packages/nestjs-trpc/cli/src/parser/procedure.rs b/packages/nestjs-trpc/cli/src/parser/procedure.rs
new file mode 100644
index 0000000..1eaf965
--- /dev/null
+++ b/packages/nestjs-trpc/cli/src/parser/procedure.rs
@@ -0,0 +1,417 @@
+use super::{DecoratorParser, ParsedFile};
+use crate::ProcedureMetadata;
+use swc_ecma_ast::{Class, ClassMember, Decl, ModuleDecl, ModuleItem, Stmt};
+
+#[must_use]
+pub fn extract_procedures_from_class(
+ parsed_file: &ParsedFile,
+ class_name: &str,
+ decorator_parser: &DecoratorParser,
+) -> Vec {
+ let Some(class) = find_class_by_name(&parsed_file.module.body, class_name) else {
+ return Vec::new();
+ };
+
+ extract_procedures_from_class_body(class, decorator_parser, parsed_file)
+}
+
+fn find_class_by_name<'a>(body: &'a [ModuleItem], target_name: &str) -> Option<&'a Class> {
+ body.iter()
+ .find_map(|item| match_class_in_item(item, target_name))
+}
+
+fn match_class_in_item<'a>(item: &'a ModuleItem, target_name: &str) -> Option<&'a Class> {
+ match item {
+ ModuleItem::ModuleDecl(ModuleDecl::ExportDecl(export_declaration)) => {
+ match_exported_class(&export_declaration.decl, target_name)
+ }
+ ModuleItem::Stmt(Stmt::Decl(Decl::Class(class_declaration))) => {
+ match_class_declaration(class_declaration, target_name)
+ }
+ ModuleItem::ModuleDecl(ModuleDecl::ExportDefaultDecl(export_default)) => {
+ match_default_exported_class(&export_default.decl, target_name)
+ }
+ _ => None,
+ }
+}
+
+fn match_exported_class<'a>(declaration: &'a Decl, target_name: &str) -> Option<&'a Class> {
+ let Decl::Class(class_declaration) = declaration else {
+ return None;
+ };
+
+ match_class_declaration(class_declaration, target_name)
+}
+
+fn match_class_declaration<'a>(
+ class_declaration: &'a swc_ecma_ast::ClassDecl,
+ target_name: &str,
+) -> Option<&'a Class> {
+ let class_matches = class_declaration.ident.sym.as_ref() == target_name;
+
+ if !class_matches {
+ return None;
+ }
+
+ Some(&class_declaration.class)
+}
+
+fn match_default_exported_class<'a>(
+ declaration: &'a swc_ecma_ast::DefaultDecl,
+ target_name: &str,
+) -> Option<&'a Class> {
+ let swc_ecma_ast::DefaultDecl::Class(class_expression) = declaration else {
+ return None;
+ };
+
+ let class_matches = class_expression
+ .ident
+ .as_ref()
+ .is_some_and(|identifier| identifier.sym.as_ref() == target_name);
+
+ if !class_matches {
+ return None;
+ }
+
+ Some(&class_expression.class)
+}
+
+fn extract_procedures_from_class_body(
+ class: &Class,
+ decorator_parser: &DecoratorParser,
+ parsed_file: &ParsedFile,
+) -> Vec {
+ let mut procedures = Vec::new();
+
+ for member in &class.body {
+ let ClassMember::Method(method) = member else {
+ continue;
+ };
+
+ let Some(method_name) = method
+ .key
+ .as_ident()
+ .map(|identifier| identifier.sym.to_string())
+ else {
+ continue;
+ };
+
+ let decorator_infos =
+ decorator_parser.extract_procedure_decorators(&method.function.decorators, parsed_file);
+
+ for info in decorator_infos {
+ procedures.push(ProcedureMetadata {
+ name: method_name.clone(),
+ procedure_type: info.procedure_type,
+ input_schema: info.input,
+ output_schema: info.output,
+ input_schema_ref: info.input_ref,
+ output_schema_ref: info.output_ref,
+ });
+ }
+ }
+
+ procedures
+}
+
+#[cfg(test)]
+mod tests {
+ use super::*;
+ use crate::parser::TsParser;
+ use crate::ProcedureType;
+ use std::fs;
+ use tempfile::TempDir;
+
+ fn create_temp_file(content: &str) -> (TempDir, std::path::PathBuf) {
+ let temp_dir = TempDir::new().expect("Failed to create temp dir");
+ let file_path = temp_dir.path().join("test.ts");
+ fs::write(&file_path, content).expect("Failed to write test file");
+ (temp_dir, file_path)
+ }
+
+ #[test]
+ fn test_extract_procedures_from_exported_class() {
+ let source = r"
+ import { Router, Query, Mutation } from 'nestjs-trpc';
+ import { z } from 'zod';
+
+ @Router()
+ export class UserRouter {
+ @Query({
+ input: z.object({ id: z.string() }),
+ output: z.object({ name: z.string() }),
+ })
+ async getUser() {}
+
+ @Mutation({
+ input: z.object({ name: z.string() }),
+ })
+ async createUser() {}
+ }
+ ";
+ let (_temp, path) = create_temp_file(source);
+
+ let parser = TsParser::new();
+ let parsed = parser.parse_file(&path).expect("Failed to parse");
+ let decorator_parser = DecoratorParser::new();
+
+ let procedures = extract_procedures_from_class(&parsed, "UserRouter", &decorator_parser);
+
+ assert_eq!(procedures.len(), 2);
+ assert_eq!(procedures[0].name, "getUser");
+ assert_eq!(procedures[0].procedure_type, ProcedureType::Query);
+ assert!(procedures[0].input_schema.is_some());
+ assert!(procedures[0].output_schema.is_some());
+
+ assert_eq!(procedures[1].name, "createUser");
+ assert_eq!(procedures[1].procedure_type, ProcedureType::Mutation);
+ assert!(procedures[1].input_schema.is_some());
+ }
+
+ #[test]
+ fn test_extract_procedures_from_non_exported_class() {
+ let source = r"
+ import { Router, Query } from 'nestjs-trpc';
+ import { z } from 'zod';
+
+ @Router()
+ class PostRouter {
+ @Query({
+ input: z.object({ id: z.string() }),
+ })
+ async getPost() {}
+ }
+ ";
+ let (_temp, path) = create_temp_file(source);
+
+ let parser = TsParser::new();
+ let parsed = parser.parse_file(&path).expect("Failed to parse");
+ let decorator_parser = DecoratorParser::new();
+
+ let procedures = extract_procedures_from_class(&parsed, "PostRouter", &decorator_parser);
+
+ assert_eq!(procedures.len(), 1);
+ assert_eq!(procedures[0].name, "getPost");
+ assert_eq!(procedures[0].procedure_type, ProcedureType::Query);
+ }
+
+ #[test]
+ fn test_extract_procedures_from_default_export() {
+ let source = r"
+ import { Router, Query } from 'nestjs-trpc';
+ import { z } from 'zod';
+
+ @Router()
+ export default class CommentRouter {
+ @Query({
+ input: z.object({ id: z.string() }),
+ })
+ async getComment() {}
+ }
+ ";
+ let (_temp, path) = create_temp_file(source);
+
+ let parser = TsParser::new();
+ let parsed = parser.parse_file(&path).expect("Failed to parse");
+ let decorator_parser = DecoratorParser::new();
+
+ let procedures = extract_procedures_from_class(&parsed, "CommentRouter", &decorator_parser);
+
+ assert_eq!(procedures.len(), 1);
+ assert_eq!(procedures[0].name, "getComment");
+ }
+
+ #[test]
+ fn test_extract_procedures_class_not_found() {
+ let source = r"
+ import { Router, Query } from 'nestjs-trpc';
+ import { z } from 'zod';
+
+ @Router()
+ export class UserRouter {
+ @Query({
+ input: z.object({ id: z.string() }),
+ })
+ async getUser() {}
+ }
+ ";
+ let (_temp, path) = create_temp_file(source);
+
+ let parser = TsParser::new();
+ let parsed = parser.parse_file(&path).expect("Failed to parse");
+ let decorator_parser = DecoratorParser::new();
+
+ let procedures =
+ extract_procedures_from_class(&parsed, "NonExistentRouter", &decorator_parser);
+
+ assert_eq!(procedures.len(), 0);
+ }
+
+ #[test]
+ fn test_extract_procedures_no_decorators() {
+ let source = r"
+ import { Router } from 'nestjs-trpc';
+
+ @Router()
+ export class EmptyRouter {
+ async regularMethod() {}
+ }
+ ";
+ let (_temp, path) = create_temp_file(source);
+
+ let parser = TsParser::new();
+ let parsed = parser.parse_file(&path).expect("Failed to parse");
+ let decorator_parser = DecoratorParser::new();
+
+ let procedures = extract_procedures_from_class(&parsed, "EmptyRouter", &decorator_parser);
+
+ assert_eq!(procedures.len(), 0);
+ }
+
+ #[test]
+ fn test_extract_procedures_multiple_decorators_on_same_method() {
+ let source = r"
+ import { Router, Query } from 'nestjs-trpc';
+ import { z } from 'zod';
+
+ @Router()
+ export class TestRouter {
+ @Query({
+ input: z.object({ id: z.string() }),
+ })
+ @Query({
+ input: z.object({ email: z.string() }),
+ })
+ async getUser() {}
+ }
+ ";
+ let (_temp, path) = create_temp_file(source);
+
+ let parser = TsParser::new();
+ let parsed = parser.parse_file(&path).expect("Failed to parse");
+ let decorator_parser = DecoratorParser::new();
+
+ let procedures = extract_procedures_from_class(&parsed, "TestRouter", &decorator_parser);
+
+ assert_eq!(procedures.len(), 2);
+ assert_eq!(procedures[0].name, "getUser");
+ assert_eq!(procedures[1].name, "getUser");
+ }
+
+ #[test]
+ fn test_extract_procedures_mixed_queries_and_mutations() {
+ let source = r"
+ import { Router, Query, Mutation } from 'nestjs-trpc';
+ import { z } from 'zod';
+
+ @Router()
+ export class MixedRouter {
+ @Query({ input: z.string() })
+ async query1() {}
+
+ @Mutation({ input: z.string() })
+ async mutation1() {}
+
+ @Query({ input: z.string() })
+ async query2() {}
+
+ @Mutation({ input: z.string() })
+ async mutation2() {}
+ }
+ ";
+ let (_temp, path) = create_temp_file(source);
+
+ let parser = TsParser::new();
+ let parsed = parser.parse_file(&path).expect("Failed to parse");
+ let decorator_parser = DecoratorParser::new();
+
+ let procedures = extract_procedures_from_class(&parsed, "MixedRouter", &decorator_parser);
+
+ assert_eq!(procedures.len(), 4);
+ assert_eq!(procedures[0].procedure_type, ProcedureType::Query);
+ assert_eq!(procedures[1].procedure_type, ProcedureType::Mutation);
+ assert_eq!(procedures[2].procedure_type, ProcedureType::Query);
+ assert_eq!(procedures[3].procedure_type, ProcedureType::Mutation);
+ }
+
+ #[test]
+ fn test_extract_procedures_with_constructor_and_properties() {
+ let source = r"
+ import { Router, Query } from 'nestjs-trpc';
+ import { z } from 'zod';
+
+ @Router()
+ export class ComplexRouter {
+ private service: any;
+
+ constructor(service: any) {
+ this.service = service;
+ }
+
+ @Query({ input: z.string() })
+ async getData() {}
+ }
+ ";
+ let (_temp, path) = create_temp_file(source);
+
+ let parser = TsParser::new();
+ let parsed = parser.parse_file(&path).expect("Failed to parse");
+ let decorator_parser = DecoratorParser::new();
+
+ let procedures = extract_procedures_from_class(&parsed, "ComplexRouter", &decorator_parser);
+
+ assert_eq!(procedures.len(), 1);
+ assert_eq!(procedures[0].name, "getData");
+ }
+
+ #[test]
+ fn test_extract_procedures_only_output_schema() {
+ let source = r"
+ import { Router, Query } from 'nestjs-trpc';
+ import { z } from 'zod';
+
+ @Router()
+ export class OutputRouter {
+ @Query({
+ output: z.object({ data: z.string() }),
+ })
+ async getData() {}
+ }
+ ";
+ let (_temp, path) = create_temp_file(source);
+
+ let parser = TsParser::new();
+ let parsed = parser.parse_file(&path).expect("Failed to parse");
+ let decorator_parser = DecoratorParser::new();
+
+ let procedures = extract_procedures_from_class(&parsed, "OutputRouter", &decorator_parser);
+
+ assert_eq!(procedures.len(), 1);
+ assert!(procedures[0].input_schema.is_none());
+ assert!(procedures[0].output_schema.is_some());
+ }
+
+ #[test]
+ fn test_extract_procedures_computed_method_names() {
+ let source = r"
+ import { Router, Query } from 'nestjs-trpc';
+ import { z } from 'zod';
+
+ @Router()
+ export class TestRouter {
+ @Query({ input: z.string() })
+ async normalMethod() {}
+ }
+ ";
+ let (_temp, path) = create_temp_file(source);
+
+ let parser = TsParser::new();
+ let parsed = parser.parse_file(&path).expect("Failed to parse");
+ let decorator_parser = DecoratorParser::new();
+
+ let procedures = extract_procedures_from_class(&parsed, "TestRouter", &decorator_parser);
+
+ assert_eq!(procedures.len(), 1);
+ assert_eq!(procedures[0].name, "normalMethod");
+ }
+}
diff --git a/packages/nestjs-trpc/cli/src/parser/router.rs b/packages/nestjs-trpc/cli/src/parser/router.rs
new file mode 100644
index 0000000..dfbd5ae
--- /dev/null
+++ b/packages/nestjs-trpc/cli/src/parser/router.rs
@@ -0,0 +1,609 @@
+use crate::parser::ParsedFile;
+use std::path::{Path, PathBuf};
+use swc_ecma_ast::{
+ CallExpr, Callee, Class, Decl, Decorator, Expr, ExprOrSpread, Lit, ModuleDecl, ModuleItem,
+ ObjectLit, Prop, PropName, PropOrSpread, Stmt,
+};
+use tracing::{debug, trace};
+
+#[derive(Debug, Clone, PartialEq, Eq)]
+pub struct RouterInfo {
+ pub class_name: String,
+
+ pub alias: Option,
+
+ pub file_path: PathBuf,
+}
+
+#[derive(Debug, Clone, Default)]
+pub struct RouterParser;
+
+impl RouterParser {
+ #[must_use]
+ pub const fn new() -> Self {
+ Self
+ }
+
+ pub fn extract_routers(&self, parsed_file: &ParsedFile) -> Vec {
+ debug!(path = ?parsed_file.file_path, "Extracting routers from file");
+
+ let routers: Vec = parsed_file
+ .module
+ .body
+ .iter()
+ .filter_map(|item| {
+ let router_info = Self::extract_router_from_item(item, &parsed_file.file_path)?;
+ debug!(
+ class = %router_info.class_name,
+ alias = ?router_info.alias,
+ "Found router class"
+ );
+ Some(router_info)
+ })
+ .collect();
+
+ debug!(
+ path = ?parsed_file.file_path,
+ count = routers.len(),
+ "Extracted routers"
+ );
+
+ routers
+ }
+
+ fn extract_router_from_item(item: &ModuleItem, file_path: &Path) -> Option {
+ match item {
+ ModuleItem::ModuleDecl(ModuleDecl::ExportDecl(export_declaration)) => {
+ Self::extract_from_export_declaration(&export_declaration.decl, file_path)
+ }
+ ModuleItem::Stmt(Stmt::Decl(Decl::Class(class_declaration))) => {
+ Self::extract_router_from_class(
+ &class_declaration.ident.sym,
+ &class_declaration.class,
+ file_path,
+ )
+ }
+ ModuleItem::ModuleDecl(ModuleDecl::ExportDefaultDecl(export_default)) => {
+ Self::extract_from_default_export(&export_default.decl, file_path)
+ }
+ _ => None,
+ }
+ }
+
+ fn extract_from_export_declaration(declaration: &Decl, file_path: &Path) -> Option {
+ let Decl::Class(class_declaration) = declaration else {
+ return None;
+ };
+
+ Self::extract_router_from_class(
+ &class_declaration.ident.sym,
+ &class_declaration.class,
+ file_path,
+ )
+ }
+
+ fn extract_from_default_export(
+ declaration: &swc_ecma_ast::DefaultDecl,
+ file_path: &Path,
+ ) -> Option {
+ let swc_ecma_ast::DefaultDecl::Class(class_expression) = declaration else {
+ return None;
+ };
+
+ let class_name = class_expression.ident.as_ref().map_or_else(
+ || "default".to_string(),
+ |identifier| identifier.sym.to_string(),
+ );
+
+ Self::extract_router_from_class(&class_name, &class_expression.class, file_path)
+ }
+
+ fn extract_router_from_class(
+ class_name: &str,
+ class: &Class,
+ file_path: &Path,
+ ) -> Option {
+ trace!(class = %class_name, "Checking class for @Router decorator");
+
+ class
+ .decorators
+ .iter()
+ .find_map(Self::extract_router_decorator_info)
+ .map(|alias| RouterInfo {
+ class_name: class_name.to_string(),
+ alias,
+ file_path: file_path.to_path_buf(),
+ })
+ }
+
+ #[allow(clippy::option_option)] // Intentional: None=not Router, Some(None)=no alias, Some(Some)=alias
+ fn extract_router_decorator_info(decorator: &Decorator) -> Option> {
+ match &*decorator.expr {
+ Expr::Call(call_expr) => Self::extract_from_call_expr(call_expr),
+ Expr::Ident(ident) if ident.sym.as_ref() == "Router" => {
+ trace!("Found @Router decorator without arguments");
+ Some(None)
+ }
+ _ => None,
+ }
+ }
+
+ #[allow(clippy::option_option)]
+ fn extract_from_call_expr(call_expression: &CallExpr) -> Option > {
+ let is_router_call = Self::is_router_callee(&call_expression.callee);
+
+ if !is_router_call {
+ return None;
+ }
+
+ trace!("Found @Router() call expression");
+
+ if call_expression.args.is_empty() {
+ return Some(None);
+ }
+
+ let first_argument = &call_expression.args[0];
+ Some(Self::extract_alias_from_argument(first_argument))
+ }
+
+ fn is_router_callee(callee: &Callee) -> bool {
+ let Callee::Expr(expression) = callee else {
+ return false;
+ };
+
+ let Expr::Ident(identifier) = &**expression else {
+ return false;
+ };
+
+ identifier.sym.as_ref() == "Router"
+ }
+
+ fn extract_alias_from_argument(argument: &ExprOrSpread) -> Option {
+ let Expr::Object(object_literal) = &*argument.expr else {
+ return None;
+ };
+
+ Self::extract_alias_from_object(object_literal)
+ }
+
+ fn extract_alias_from_object(object: &ObjectLit) -> Option {
+ object
+ .props
+ .iter()
+ .filter_map(extract_property_box)
+ .find_map(extract_alias_from_property)
+ }
+}
+
+fn extract_property_box(property_or_spread: &PropOrSpread) -> Option<&Prop> {
+ let PropOrSpread::Prop(property) = property_or_spread else {
+ return None;
+ };
+ Some(property)
+}
+
+fn extract_alias_from_property(property: &Prop) -> Option {
+ match property {
+ Prop::KeyValue(key_value) => extract_alias_from_key_value(key_value),
+ Prop::Shorthand(identifier) if identifier.sym.as_ref() == "alias" => {
+ trace!("Found shorthand alias property (variable reference)");
+ None
+ }
+ _ => None,
+ }
+}
+
+fn extract_alias_from_key_value(key_value: &swc_ecma_ast::KeyValueProp) -> Option {
+ let is_alias_key = is_alias_key(&key_value.key);
+ if !is_alias_key {
+ return None;
+ }
+ extract_string_value(&key_value.value)
+}
+
+fn is_alias_key(key: &PropName) -> bool {
+ match key {
+ PropName::Ident(ident) => &*ident.sym == "alias",
+ PropName::Str(s) => &*s.value.to_string_lossy() == "alias",
+ _ => false,
+ }
+}
+
+fn extract_string_value(expr: &Expr) -> Option {
+ match expr {
+ Expr::Lit(Lit::Str(s)) => {
+ let value = s.value.to_string_lossy().into_owned();
+ trace!(alias = %value, "Extracted alias value");
+ Some(value)
+ }
+ Expr::Tpl(tpl) if tpl.exprs.is_empty() && tpl.quasis.len() == 1 => {
+ let value = tpl.quasis[0].raw.to_string();
+ trace!(alias = %value, "Extracted alias from template literal");
+ Some(value)
+ }
+ _ => {
+ trace!("Alias is not a string literal");
+ None
+ }
+ }
+}
+
+#[must_use]
+pub fn extract_routers(parsed_file: &ParsedFile) -> Vec {
+ RouterParser::new().extract_routers(parsed_file)
+}
+
+#[cfg(test)]
+mod tests {
+ use super::*;
+ use crate::parser::TsParser;
+ use std::fs;
+ use tempfile::TempDir;
+
+ fn create_temp_file(content: &str) -> (TempDir, PathBuf) {
+ let temp_dir = TempDir::new().expect("Failed to create temp dir");
+ let file_path = temp_dir.path().join("test.router.ts");
+ fs::write(&file_path, content).expect("Failed to write test file");
+ (temp_dir, file_path)
+ }
+
+ fn parse_and_extract(source: &str) -> Vec {
+ let (_temp, path) = create_temp_file(source);
+ let parser = TsParser::new();
+ let parsed = parser.parse_file(&path).expect("Failed to parse");
+ RouterParser::new().extract_routers(&parsed)
+ }
+
+ #[test]
+ fn test_router_parser_creation() {
+ let parser = RouterParser::new();
+ assert_eq!(std::mem::size_of_val(&parser), 0);
+ }
+
+ #[test]
+ fn test_router_parser_default() {
+ let parser = RouterParser;
+ assert_eq!(std::mem::size_of_val(&parser), 0);
+ }
+
+ #[test]
+ fn test_extract_router_with_alias() {
+ let source = r"
+ function Router(opts?: { alias?: string }): ClassDecorator {
+ return (target) => target;
+ }
+
+ @Router({ alias: 'users' })
+ export class UserRouter {
+ constructor() {}
+ }
+ ";
+
+ let routers = parse_and_extract(source);
+
+ assert_eq!(routers.len(), 1);
+ assert_eq!(routers[0].class_name, "UserRouter");
+ assert_eq!(routers[0].alias, Some("users".to_string()));
+ }
+
+ #[test]
+ fn test_extract_router_without_alias() {
+ let source = r"
+ function Router(opts?: { alias?: string }): ClassDecorator {
+ return (target) => target;
+ }
+
+ @Router()
+ export class UserRouter {
+ constructor() {}
+ }
+ ";
+
+ let routers = parse_and_extract(source);
+
+ assert_eq!(routers.len(), 1);
+ assert_eq!(routers[0].class_name, "UserRouter");
+ assert_eq!(routers[0].alias, None);
+ }
+
+ #[test]
+ fn test_extract_router_no_parentheses() {
+ let source = r"
+ function Router(target: any): any {
+ return target;
+ }
+
+ @Router
+ export class UserRouter {
+ constructor() {}
+ }
+ ";
+
+ let routers = parse_and_extract(source);
+
+ assert_eq!(routers.len(), 1);
+ assert_eq!(routers[0].class_name, "UserRouter");
+ assert_eq!(routers[0].alias, None);
+ }
+
+ #[test]
+ fn test_extract_router_non_exported() {
+ let source = r"
+ function Router(opts?: { alias?: string }): ClassDecorator {
+ return (target) => target;
+ }
+
+ @Router({ alias: 'internal' })
+ class InternalRouter {
+ constructor() {}
+ }
+ ";
+
+ let routers = parse_and_extract(source);
+
+ assert_eq!(routers.len(), 1);
+ assert_eq!(routers[0].class_name, "InternalRouter");
+ assert_eq!(routers[0].alias, Some("internal".to_string()));
+ }
+
+ #[test]
+ fn test_extract_multiple_routers() {
+ let source = r"
+ function Router(opts?: { alias?: string }): ClassDecorator {
+ return (target) => target;
+ }
+
+ @Router({ alias: 'users' })
+ export class UserRouter {}
+
+ @Router({ alias: 'posts' })
+ export class PostRouter {}
+
+ @Router()
+ export class CommentRouter {}
+ ";
+
+ let routers = parse_and_extract(source);
+
+ assert_eq!(routers.len(), 3);
+
+ let user_router = routers.iter().find(|r| r.class_name == "UserRouter");
+ assert!(user_router.is_some());
+ assert_eq!(user_router.unwrap().alias, Some("users".to_string()));
+
+ let post_router = routers.iter().find(|r| r.class_name == "PostRouter");
+ assert!(post_router.is_some());
+ assert_eq!(post_router.unwrap().alias, Some("posts".to_string()));
+
+ let comment_router = routers.iter().find(|r| r.class_name == "CommentRouter");
+ assert!(comment_router.is_some());
+ assert_eq!(comment_router.unwrap().alias, None);
+ }
+
+ #[test]
+ fn test_ignore_non_router_decorators() {
+ let source = r"
+ function Injectable(): ClassDecorator {
+ return (target) => target;
+ }
+
+ function Controller(path: string): ClassDecorator {
+ return (target) => target;
+ }
+
+ @Injectable()
+ @Controller('/users')
+ export class UserController {}
+ ";
+
+ let routers = parse_and_extract(source);
+
+ assert_eq!(routers.len(), 0);
+ }
+
+ #[test]
+ fn test_no_routers_in_file() {
+ let source = r"
+ export class PlainClass {
+ constructor() {}
+ }
+
+ export const value = 42;
+
+ export function helper() {}
+ ";
+
+ let routers = parse_and_extract(source);
+
+ assert_eq!(routers.len(), 0);
+ }
+
+ #[test]
+ fn test_router_with_other_decorators() {
+ let source = r"
+ function Router(opts?: { alias?: string }): ClassDecorator {
+ return (target) => target;
+ }
+
+ function Injectable(): ClassDecorator {
+ return (target) => target;
+ }
+
+ @Injectable()
+ @Router({ alias: 'users' })
+ export class UserRouter {}
+ ";
+
+ let routers = parse_and_extract(source);
+
+ assert_eq!(routers.len(), 1);
+ assert_eq!(routers[0].class_name, "UserRouter");
+ assert_eq!(routers[0].alias, Some("users".to_string()));
+ }
+
+ #[test]
+ fn test_router_with_empty_object() {
+ let source = r"
+ function Router(opts?: { alias?: string }): ClassDecorator {
+ return (target) => target;
+ }
+
+ @Router({})
+ export class UserRouter {}
+ ";
+
+ let routers = parse_and_extract(source);
+
+ assert_eq!(routers.len(), 1);
+ assert_eq!(routers[0].class_name, "UserRouter");
+ assert_eq!(routers[0].alias, None);
+ }
+
+ #[test]
+ fn test_router_with_string_key() {
+ let source = r"
+ function Router(opts?: { alias?: string }): ClassDecorator {
+ return (target) => target;
+ }
+
+ @Router({ 'alias': 'quoted' })
+ export class UserRouter {}
+ ";
+
+ let routers = parse_and_extract(source);
+
+ assert_eq!(routers.len(), 1);
+ assert_eq!(routers[0].alias, Some("quoted".to_string()));
+ }
+
+ #[test]
+ fn test_extract_routers_convenience_function() {
+ let source = r"
+ function Router(opts?: { alias?: string }): ClassDecorator {
+ return (target) => target;
+ }
+
+ @Router({ alias: 'test' })
+ export class TestRouter {}
+ ";
+
+ let (_temp, path) = create_temp_file(source);
+ let parser = TsParser::new();
+ let parsed = parser.parse_file(&path).expect("Failed to parse");
+
+ let routers = extract_routers(&parsed);
+
+ assert_eq!(routers.len(), 1);
+ assert_eq!(routers[0].class_name, "TestRouter");
+ }
+
+ #[test]
+ fn test_router_info_equality() {
+ let info1 = RouterInfo {
+ class_name: "Test".to_string(),
+ alias: Some("test".to_string()),
+ file_path: PathBuf::from("test.ts"),
+ };
+ let info2 = RouterInfo {
+ class_name: "Test".to_string(),
+ alias: Some("test".to_string()),
+ file_path: PathBuf::from("test.ts"),
+ };
+ assert_eq!(info1, info2);
+ }
+
+ #[test]
+ fn test_router_info_clone() {
+ let info = RouterInfo {
+ class_name: "Test".to_string(),
+ alias: Some("test".to_string()),
+ file_path: PathBuf::from("test.ts"),
+ };
+ let cloned = info.clone();
+ assert_eq!(info, cloned);
+ }
+
+ #[test]
+ fn test_router_info_debug() {
+ let info = RouterInfo {
+ class_name: "Test".to_string(),
+ alias: Some("test".to_string()),
+ file_path: PathBuf::from("test.ts"),
+ };
+ let debug_str = format!("{info:?}");
+ assert!(debug_str.contains("Test"));
+ assert!(debug_str.contains("test"));
+ }
+
+ #[test]
+ fn test_complex_router_file() {
+ let source = r"
+ import { Inject } from '@nestjs/common';
+ import { Router, Query, Mutation } from 'nestjs-trpc';
+ import { z } from 'zod';
+
+ @Router({ alias: 'users' })
+ export class UserRouter {
+ constructor(
+ @Inject('UserService') private readonly userService: any
+ ) {}
+
+ @Query({
+ input: z.object({ userId: z.string() }),
+ output: z.object({ name: z.string() }),
+ })
+ async getUserById(userId: string): Promise {
+ return this.userService.getUser(userId);
+ }
+
+ @Mutation({
+ input: z.object({ name: z.string() }),
+ })
+ async createUser(input: any): Promise {
+ return this.userService.createUser(input);
+ }
+ }
+ ";
+
+ let routers = parse_and_extract(source);
+
+ assert_eq!(routers.len(), 1);
+ assert_eq!(routers[0].class_name, "UserRouter");
+ assert_eq!(routers[0].alias, Some("users".to_string()));
+ }
+
+ #[test]
+ fn test_router_with_other_properties() {
+ let source = r"
+ function Router(opts?: { alias?: string; version?: number }): ClassDecorator {
+ return (target) => target;
+ }
+
+ @Router({ alias: 'users', version: 2 })
+ export class UserRouter {}
+ ";
+
+ let routers = parse_and_extract(source);
+
+ assert_eq!(routers.len(), 1);
+ assert_eq!(routers[0].alias, Some("users".to_string()));
+ }
+
+ #[test]
+ fn test_export_default_class_with_router() {
+ let source = r"
+ function Router(opts?: { alias?: string }): ClassDecorator {
+ return (target) => target;
+ }
+
+ @Router({ alias: 'default' })
+ export default class DefaultRouter {}
+ ";
+
+ let routers = parse_and_extract(source);
+
+ assert_eq!(routers.len(), 1);
+ assert_eq!(routers[0].class_name, "DefaultRouter");
+ assert_eq!(routers[0].alias, Some("default".to_string()));
+ }
+}
diff --git a/packages/nestjs-trpc/cli/src/parser/schema/flatten/expression.rs b/packages/nestjs-trpc/cli/src/parser/schema/flatten/expression.rs
new file mode 100644
index 0000000..7a388c4
--- /dev/null
+++ b/packages/nestjs-trpc/cli/src/parser/schema/flatten/expression.rs
@@ -0,0 +1,252 @@
+use super::ZodFlattener;
+use super::ZodResult;
+use crate::parser::imports::ResolvedImport;
+use crate::parser::schema::helpers::ZodHelpers;
+use crate::parser::ParsedFile;
+use std::collections::HashMap;
+use swc_ecma_ast::{Callee, Expr, Prop, PropOrSpread};
+
+impl ZodFlattener<'_> {
+ pub(super) fn flatten_object(
+ &mut self,
+ object_literal: &swc_ecma_ast::ObjectLit,
+ source_file: &ParsedFile,
+ imports_map: &HashMap,
+ mut schema: String,
+ depth: usize,
+ ) -> ZodResult {
+ for property_or_spread in &object_literal.props {
+ schema = self.flatten_object_property(
+ property_or_spread,
+ source_file,
+ imports_map,
+ schema,
+ depth,
+ )?;
+ }
+ Ok(schema)
+ }
+
+ fn flatten_object_property(
+ &mut self,
+ property_or_spread: &PropOrSpread,
+ source_file: &ParsedFile,
+ imports_map: &HashMap,
+ mut schema: String,
+ depth: usize,
+ ) -> ZodResult {
+ let PropOrSpread::Prop(property) = property_or_spread else {
+ return Ok(schema);
+ };
+ let Prop::KeyValue(key_value) = &**property else {
+ return Ok(schema);
+ };
+
+ let property_text = self.get_source_text(source_file, self.get_key_value_span(key_value));
+ let property_initializer_text =
+ self.get_source_text(source_file, self.get_expression_span(&key_value.value));
+
+ let flattened = self.flatten_expression(
+ &key_value.value,
+ source_file,
+ imports_map,
+ property_initializer_text.clone(),
+ depth + 1,
+ )?;
+
+ if flattened == property_initializer_text {
+ return Ok(schema);
+ }
+
+ let key_text = self.get_property_key_text(&key_value.key, source_file);
+ let new_property_text = format!("{key_text}: {flattened}");
+ schema = schema.replace(&property_text, &new_property_text);
+ Ok(schema)
+ }
+
+ pub(super) fn flatten_array(
+ &mut self,
+ array_literal: &swc_ecma_ast::ArrayLit,
+ source_file: &ParsedFile,
+ imports_map: &HashMap,
+ mut schema: String,
+ depth: usize,
+ ) -> ZodResult {
+ for element in array_literal.elems.iter().flatten() {
+ schema =
+ self.flatten_array_element(element, source_file, imports_map, schema, depth)?;
+ }
+ Ok(schema)
+ }
+
+ fn flatten_array_element(
+ &mut self,
+ element: &swc_ecma_ast::ExprOrSpread,
+ source_file: &ParsedFile,
+ imports_map: &HashMap,
+ mut schema: String,
+ depth: usize,
+ ) -> ZodResult {
+ let element_text = self.get_expression_text_for_replacement(&element.expr, source_file);
+
+ let flattened = self.flatten_expression(
+ &element.expr,
+ source_file,
+ imports_map,
+ element_text.clone(),
+ depth + 1,
+ )?;
+
+ if flattened != element_text {
+ schema = schema.replace(&element_text, &flattened);
+ }
+ Ok(schema)
+ }
+
+ pub(super) fn flatten_call(
+ &mut self,
+ call_expression: &swc_ecma_ast::CallExpr,
+ source_file: &ParsedFile,
+ imports_map: &HashMap,
+ mut schema: String,
+ depth: usize,
+ ) -> ZodResult {
+ schema = self.flatten_callee_member_if_needed(
+ &call_expression.callee,
+ source_file,
+ imports_map,
+ schema,
+ depth,
+ )?;
+
+ schema = self.flatten_call_arguments(
+ &call_expression.args,
+ source_file,
+ imports_map,
+ schema,
+ depth,
+ )?;
+
+ Ok(schema)
+ }
+
+ fn flatten_callee_member_if_needed(
+ &mut self,
+ callee: &Callee,
+ source_file: &ParsedFile,
+ imports_map: &HashMap,
+ mut schema: String,
+ depth: usize,
+ ) -> ZodResult {
+ let Callee::Expr(callee_expression) = callee else {
+ return Ok(schema);
+ };
+
+ let Expr::Member(member) = &**callee_expression else {
+ return Ok(schema);
+ };
+
+ let member_text = self.get_expression_text_for_replacement(&member.obj, source_file);
+ let is_zod_prefix = member_text.starts_with("z.") || member_text.starts_with("z[");
+
+ if is_zod_prefix {
+ return Ok(schema);
+ }
+
+ let base_flattened = self.flatten_expression(
+ &member.obj,
+ source_file,
+ imports_map,
+ member_text.clone(),
+ depth + 1,
+ )?;
+
+ if base_flattened != member_text {
+ schema = schema.replace(&member_text, &base_flattened);
+ }
+
+ Ok(schema)
+ }
+
+ fn flatten_call_arguments(
+ &mut self,
+ arguments: &[swc_ecma_ast::ExprOrSpread],
+ source_file: &ParsedFile,
+ imports_map: &HashMap,
+ mut schema: String,
+ depth: usize,
+ ) -> ZodResult {
+ for argument in arguments {
+ schema =
+ self.flatten_single_argument(argument, source_file, imports_map, schema, depth)?;
+ }
+
+ Ok(schema)
+ }
+
+ fn flatten_single_argument(
+ &mut self,
+ argument: &swc_ecma_ast::ExprOrSpread,
+ source_file: &ParsedFile,
+ imports_map: &HashMap,
+ mut schema: String,
+ depth: usize,
+ ) -> ZodResult {
+ if let Expr::Array(array_literal) = &*argument.expr {
+ return self.flatten_array(array_literal, source_file, imports_map, schema, depth + 1);
+ }
+
+ let argument_text = self.get_expression_text_for_replacement(&argument.expr, source_file);
+
+ let flattened = self.flatten_expression(
+ &argument.expr,
+ source_file,
+ imports_map,
+ argument_text.clone(),
+ depth + 1,
+ )?;
+
+ if flattened != argument_text {
+ schema = schema.replace(&argument_text, &flattened);
+ }
+
+ Ok(schema)
+ }
+
+ pub(super) fn flatten_member(
+ &mut self,
+ member_expression: &swc_ecma_ast::MemberExpr,
+ source_file: &ParsedFile,
+ imports_map: &HashMap,
+ mut schema: String,
+ depth: usize,
+ ) -> ZodResult {
+ let object_text =
+ self.get_expression_text_for_replacement(&member_expression.obj, source_file);
+
+ let flattened = self.flatten_expression(
+ &member_expression.obj,
+ source_file,
+ imports_map,
+ object_text.clone(),
+ depth + 1,
+ )?;
+
+ if flattened != object_text {
+ schema = schema.replace(&object_text, &flattened);
+ }
+
+ Ok(schema)
+ }
+
+ pub(super) fn get_expression_text_for_replacement(
+ &self,
+ expression: &Expr,
+ source_file: &ParsedFile,
+ ) -> String {
+ match expression {
+ Expr::Ident(identifier) => identifier.sym.to_string(),
+ _ => self.get_source_text(source_file, self.get_expression_span(expression)),
+ }
+ }
+}
diff --git a/packages/nestjs-trpc/cli/src/parser/schema/flatten/identifier.rs b/packages/nestjs-trpc/cli/src/parser/schema/flatten/identifier.rs
new file mode 100644
index 0000000..37cebef
--- /dev/null
+++ b/packages/nestjs-trpc/cli/src/parser/schema/flatten/identifier.rs
@@ -0,0 +1,231 @@
+use super::ZodFlattener;
+use super::ZodResult;
+use crate::error::GeneratorError;
+use crate::parser::imports::{ImportResolver, ResolvedImport};
+use crate::parser::schema::helpers::ZodHelpers;
+use crate::parser::ParsedFile;
+use std::collections::HashMap;
+use std::path::Path;
+use swc_ecma_ast::{Decl, Expr, ModuleDecl, ModuleItem, Pat, Stmt};
+use tracing::{trace, warn};
+
+impl ZodFlattener<'_> {
+ pub(super) fn flatten_identifier(
+ &mut self,
+ identifier: &swc_ecma_ast::Ident,
+ source_file: &ParsedFile,
+ imports_map: &HashMap,
+ schema: String,
+ depth: usize,
+ ) -> ZodResult {
+ let name = identifier.sym.to_string();
+ trace!(identifier = %name, "Processing identifier");
+
+ if self.resolving.contains(&name) {
+ warn!(identifier = %name, "Circular schema reference detected");
+ return Ok(schema);
+ }
+
+ if name == "z" {
+ return Ok(schema);
+ }
+
+ self.try_resolve_identifier(&name, source_file, imports_map, schema, depth)
+ }
+
+ fn try_resolve_identifier(
+ &mut self,
+ name: &str,
+ source_file: &ParsedFile,
+ imports_map: &HashMap,
+ schema: String,
+ depth: usize,
+ ) -> ZodResult