diff --git a/.github/copilot-instructions.md b/.github/copilot-instructions.md new file mode 100644 index 0000000..11dced5 --- /dev/null +++ b/.github/copilot-instructions.md @@ -0,0 +1,134 @@ +# GitHub Copilot Instructions + +## Role and Context + +You are acting as a senior Fastify developer with expertise in: + +- Fastify framework and its ecosystem +- Bun runtime environment +- Drizzle ORM with PostgreSQL +- Redis for caching +- BullMQ for job queues + +## Code Style Requirements + +### No Icons Policy + +Do not use any icons, emojis, or decorative symbols in code, comments, documentation, or commit messages. + +### Comment Style + +- Write comments for documentation purposes only +- Use descriptive block comments to explain what functions, classes, or complex logic blocks do +- Do not comment every 2-3 lines +- Do not explain what individual lines do +- Focus on the "why" and "what" at a high level, not the "how" line-by-line + +Example of good commenting: + +```typescript +/** + * Handles user authentication by validating credentials against the database. + * Returns JWT tokens if authentication is successful. + */ +async function authenticateUser(credentials: LoginCredentials) { + // implementation +} + +/** + * This condition checks if the user has the required permissions + * to access protected resources based on their role + */ +if (hasRequiredPermissions(user, resource)) { + // implementation +} +``` + +Example of bad commenting (avoid this): + +```typescript +// Set user to null +const user = null; +// Check if email exists +if (email) { + // Find user by email + user = await findUser(email); +} +``` + +### Documentation Policy + +- Do not create separate documentation files, README updates, example files, or change logs unless explicitly requested +- Do not explain how changes work in separate docs +- Provide a brief summary in chat when asked +- Keep responses concise and focused on the code implementation + +### Fastify Clean Code Practices + +- Use Fastify plugins from `src/libs/fastify/plugins` +- Leverage utilities from `src/libs` folder structure +- Use Redis for caching when appropriate +- Follow the established folder structure: + - Routes in `src/routes` + - Services in `src/services` + - Database logic in `src/libs/database` + - Utilities in `src/libs/utils` +- Use dependency injection with tsyringe (container in `src/libs/fastify/di`) +- Implement proper error handling using custom error classes from `src/libs/fastify/error` +- Use Zod for validation with fastify-type-provider-zod +- Follow repository pattern for database operations + +### Code Organization + +- Keep routes thin, delegate business logic to services +- Use repository pattern for database access +- Implement services with single responsibility +- Use TypeScript strict mode +- Prefer async/await over promises +- Use proper typing, avoid `any` type + +### Response Handling + +- Use utility functions from `src/libs/utils/fastify/response.ts` +- Return consistent response formats +- Implement proper error responses using custom error classes + +### Database Operations + +- Use Drizzle ORM for all database operations +- Keep migrations in `src/libs/database/postgres/migrations` +- Keep schema definitions in `src/libs/database/postgres/schema` +- Use repositories from `src/libs/database/postgres/repositories` +- Leverage connection pooling settings from config + +### Queue and Background Jobs + +- Use BullMQ for async job processing +- Define queues in `src/bull/queue` +- Implement workers in `src/bull/worker` +- Use Redis for queue backend + +### Configuration + +- Use config files from `src/libs/config` +- Validate environment variables with envalid +- Keep secrets in environment variables + +### Security + +- Use utilities from `src/libs/utils/security` for encryption and hashing +- Implement JWT authentication with @fastify/jwt +- Use rate limiting and helmet plugins +- Validate all inputs with Zod schemas + +## Expected Behavior + +When generating code: + +1. Follow the existing project structure +2. Use established patterns from the codebase +3. Import from the correct modules in `src/libs` +4. Apply clean architecture principles +5. Write minimal but meaningful comments +6. Focus on implementation, not documentation +7. Keep code DRY and maintainable diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 51baf2f..72883f4 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -15,6 +15,31 @@ jobs: name: "Lint and Build" runs-on: ubuntu-latest + services: + postgres: + image: postgres:18-alpine + env: + POSTGRES_USER: postgres + POSTGRES_PASSWORD: postgres + POSTGRES_DB: clean_fastify_test + ports: + - 5432:5432 + options: >- + --health-cmd pg_isready + --health-interval 10s + --health-timeout 5s + --health-retries 5 + + redis: + image: redis:8-alpine + ports: + - 6379:6379 + options: >- + --health-cmd "redis-cli ping" + --health-interval 10s + --health-timeout 5s + --health-retries 5 + steps: - name: "Checkout Repository" uses: actions/checkout@v4 @@ -27,6 +52,16 @@ jobs: - name: "Install Dependencies" run: bun install --frozen-lockfile + - name: "Run Database Migrations" + run: bunx --bun drizzle-kit push + env: + DATABASE_URL: postgresql://postgres:postgres@localhost:5432/clean_fastify_test + + - name: "Run Database Seeders" + run: bun run ./src/libs/database/seed/index.ts + env: + DATABASE_URL: postgresql://postgres:postgres@localhost:5432/clean_fastify_test + - name: "Run Lint" run: bun run lint @@ -39,5 +74,5 @@ jobs: - name: "Verify Build Output" run: | ls -lh dist/ - test -f dist/serve.js || exit 1 - test -f dist/index.js || exit 1 + test -f dist/server/serve.js || exit 1 + test -f dist/worker/index.js || exit 1 diff --git a/Makefile b/Makefile index be83bc7..7c9aaa7 100644 --- a/Makefile +++ b/Makefile @@ -70,13 +70,13 @@ format: bun run format db-seed: - bun run infra/seed/index.ts + bun run ./src/libs/database/seed/index.ts migrate-clickhouse: - bun run infra/clickhouse/scripts/migrate.ts migrate + bun run ./src/libs/database/clickhouse/scripts/migrate.ts migrate migrate-clickhouse-status: - bun run infra/clickhouse/scripts/migrate.ts status + bun run ./src/libs/database/clickhouse/scripts/migrate.ts status db-generate: bunx --bun drizzle-kit generate diff --git a/README.md b/README.md index ea542c3..c4555e2 100644 --- a/README.md +++ b/README.md @@ -1,15 +1,223 @@ # clean-fastify -To install dependencies: +A production-ready Fastify application built with clean architecture principles, featuring Bun runtime, Drizzle ORM, Redis caching, and BullMQ job queues. + +## Features + +- **Fastify Framework** - High-performance web framework +- **Bun Runtime** - Fast JavaScript runtime with built-in bundler +- **Drizzle ORM** - Type-safe SQL ORM with PostgreSQL +- **Redis** - In-memory caching and session storage +- **BullMQ** - Robust queue system for background jobs +- **ClickHouse** - Analytics database support +- **JWT Authentication** - Secure token-based authentication +- **Role-Based Access Control (RBAC)** - Permission management system +- **TypeScript** - Full type safety +- **Clean Architecture** - Organized, maintainable codebase + +## Prerequisites + +- [Bun](https://bun.sh) >= 1.0 +- PostgreSQL >= 14 +- Redis >= 7 +- ClickHouse (optional) + +## Getting Started + +### Installation ```bash bun install ``` -To run: +### Environment Configuration + +Copy the example environment file and configure it: ```bash -bun run index.ts +cp .env.example .env +``` + +Edit `.env` with your configuration: + +```env +DATABASE_URL="postgresql://postgres:postgres@localhost:5432/your_database" +REDIS_HOST="localhost" +REDIS_PORT=6379 +APP_SECRET="your-secret-key" +APP_JWT_SECRET="your-jwt-secret" ``` -This project was created using `bun init` in bun v1.3.1. [Bun](https://bun.com) is a fast all-in-one JavaScript runtime. +### Database Setup + +```bash +# Generate migration files +make db-generate + +# Run migrations +make db-migrate + +# Or push schema directly (development only) +make db-push + +# Run seeders +make db-seed +``` + +### Development + +Start the development server: + +```bash +# Start API server only +make dev-server + +# Start worker only +make dev-worker + +# Start both server and worker +make dev-all +``` + +The API will be available at `http://localhost:8001` + +## Project Structure + +``` +src/ +├── app.ts # Fastify app initialization +├── serve.ts # Server entry point +├── bull/ # Queue jobs and workers +│ ├── queue/ # Job queue definitions +│ └── worker/ # Job processors +├── libs/ # Shared libraries +│ ├── cache/ # Redis cache utilities +│ ├── config/ # Configuration files +│ ├── database/ # Database setup and migrations +│ │ ├── postgres/ # PostgreSQL with Drizzle +│ │ ├── clickhouse/ # ClickHouse setup +│ │ └── seed/ # Database seeders +│ ├── fastify/ # Fastify plugins and utilities +│ │ ├── plugins/ # Custom plugins +│ │ ├── error/ # Error handlers +│ │ └── di/ # Dependency injection +│ ├── mail/ # Email service +│ ├── types/ # TypeScript types +│ └── utils/ # Utility functions +├── routes/ # API route handlers +│ ├── auth/ # Authentication routes +│ ├── profile/ # User profile routes +│ └── settings/ # Settings routes +└── services/ # Business logic layer +``` + +## Available Commands + +### Development + +```bash +make dev-server # Start server with hot reload +make dev-worker # Start worker with hot reload +make dev-all # Start server and worker concurrently +``` + +### Production Build + +```bash +make build-server # Build server +make build-worker # Build worker +make build-all # Build both server and worker +make start-server # Start production server +make start-worker # Start production worker +make start-all # Start both in production +``` + +### Code Quality + +```bash +make lint # Run ESLint +make format # Format code with Prettier +bun run typecheck # Run TypeScript type checking +``` + +### Database (PostgreSQL) + +```bash +make db-generate # Generate migration files from schema +make db-migrate # Run pending migrations +make db-push # Push schema to database (dev only) +make db-pull # Pull schema from database +make db-studio # Open Drizzle Studio UI +make db-drop # Drop all tables (dangerous!) +make db-seed # Run database seeders +``` + +### Database (ClickHouse) + +```bash +make migrate-clickhouse # Run ClickHouse migrations +make migrate-clickhouse-status # Check migration status +``` + +### Quick Workflows + +```bash +make fresh # Drop, push schema, and seed +make reset # Generate, migrate, and seed +``` + +## API Documentation + +Once the server is running, visit: + +- Swagger UI: `http://localhost:8001/documentation` +- Scalar API Reference: `http://localhost:8001/reference` + +## Authentication + +The application uses JWT-based authentication: + +1. Register: `POST /auth/register` +2. Login: `POST /auth/login` +3. Use returned token in Authorization header: `Bearer ` + +## Environment Variables + +| Variable | Description | Default | +| ---------------- | ---------------------------- | ----------- | +| `APP_PORT` | Server port | 8001 | +| `APP_HOST` | Server host | localhost | +| `APP_ENV` | Environment | development | +| `DATABASE_URL` | PostgreSQL connection string | - | +| `REDIS_HOST` | Redis host | localhost | +| `REDIS_PORT` | Redis port | 6379 | +| `APP_JWT_SECRET` | JWT signing secret | - | +| `APP_SECRET` | Application secret key | - | + +## Testing + +Run the test suite: + +```bash +bun test +``` + +## CI/CD + +The project includes GitHub Actions workflow for: + +- Linting +- Building server and worker +- Running database migrations +- Running seeders + +## Contributing + +1. Follow the existing code structure +2. Use TypeScript strict mode +3. Write meaningful commit messages +4. Ensure all tests pass before submitting PR + +## License + +See [LICENSE](LICENSE) file for details. diff --git a/apps/api/services/index.ts b/apps/api/services/index.ts deleted file mode 100644 index 2ab33e8..0000000 --- a/apps/api/services/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from "./auth.service"; diff --git a/apps/worker/index.ts b/apps/worker/index.ts deleted file mode 100644 index 2c02230..0000000 --- a/apps/worker/index.ts +++ /dev/null @@ -1,7 +0,0 @@ -import "reflect-metadata"; - -// eslint-disable-next-line no-console -console.log(`Starting worker...`); -import "@app/worker/worker/send-email.worker"; -// eslint-disable-next-line no-console -console.log(`Worker started.`); diff --git a/bun.lock b/bun.lock index e595ac3..98fc624 100644 --- a/bun.lock +++ b/bun.lock @@ -1,57 +1,58 @@ { "lockfileVersion": 1, - "configVersion": 0, + "configVersion": 1, "workspaces": { "": { "name": "clean-fastify", "dependencies": { - "@clickhouse/client": "^1.12.1", + "@clickhouse/client": "^1.16.0", "@fastify/autoload": "^6.3.1", - "@fastify/cors": "^11.1.0", + "@fastify/cors": "^11.2.0", "@fastify/helmet": "^13.0.2", "@fastify/jwt": "^10.0.0", "@fastify/rate-limit": "^10.3.0", - "@fastify/redis": "^7.1.0", + "@fastify/redis": "^7.2.0", "@fastify/swagger": "^9.6.1", - "@scalar/fastify-api-reference": "^1.43.1", + "@scalar/fastify-api-reference": "^1.44.9", "ajv": "^8.17.1", - "bcryptjs": "^3.0.2", - "bullmq": "^5.61.0", + "bcryptjs": "^3.0.3", + "bullmq": "^5.67.2", "crypto-js": "^4.2.0", - "dayjs": "^1.11.18", + "dayjs": "^1.11.19", "dotenv": "^17.2.3", - "drizzle-orm": "^0.44.6", + "drizzle-orm": "^0.45.1", "envalid": "^8.1.1", - "fastify": "^5.6.1", + "fastify": "^5.7.4", "fastify-plugin": "^5.1.0", "fastify-type-provider-zod": "^6.1.0", - "ioredis": "^5.8.1", - "nodemailer": "^7.0.10", - "pg": "^8.16.3", - "pino": "^10.0.0", - "pino-pretty": "^13.1.2", + "ioredis": "^5.9.2", + "nodemailer": "^7.0.13", + "pg": "^8.18.0", + "pino": "^10.3.0", + "pino-pretty": "^13.1.3", "reflect-metadata": "^0.2.2", "tsyringe": "^4.10.0", - "zod": "^4.3.5", + "zod": "^4.3.6", }, "devDependencies": { "@types/bcryptjs": "^3.0.0", - "@types/bun": "latest", + "@types/bun": "^1.3.8", "@types/crypto-js": "^4.2.2", - "@types/node": "^24.7.2", - "@types/nodemailer": "^7.0.3", - "@types/pg": "^8.15.5", - "@typescript-eslint/eslint-plugin": "^8.15.0", - "@typescript-eslint/parser": "^8.15.0", + "@types/node": "^25.2.0", + "@types/nodemailer": "^7.0.9", + "@types/pg": "^8.16.0", + "@typescript-eslint/eslint-plugin": "^8.54.0", + "@typescript-eslint/parser": "^8.54.0", "concurrently": "^9.2.1", - "drizzle-kit": "^0.31.5", - "eslint": "^9.15.0", - "eslint-config-prettier": "^9.1.0", - "eslint-plugin-prettier": "^5.2.1", + "drizzle-kit": "^0.31.8", + "eslint": "^9.39.2", + "eslint-config-prettier": "^10.1.8", + "eslint-plugin-prettier": "^5.5.5", "husky": "^9.1.7", - "prettier": "^3.3.3", - "tsx": "^4.20.6", - "typescript-eslint": "^8.46.0", + "lint-staged": "^16.2.7", + "prettier": "^3.8.1", + "tsx": "^4.21.0", + "typescript-eslint": "^8.54.0", }, "peerDependencies": { "typescript": "^5", @@ -59,71 +60,9 @@ }, }, "packages": { - "@aws-crypto/sha256-browser": ["@aws-crypto/sha256-browser@5.2.0", "", { "dependencies": { "@aws-crypto/sha256-js": "^5.2.0", "@aws-crypto/supports-web-crypto": "^5.2.0", "@aws-crypto/util": "^5.2.0", "@aws-sdk/types": "^3.222.0", "@aws-sdk/util-locate-window": "^3.0.0", "@smithy/util-utf8": "^2.0.0", "tslib": "^2.6.2" } }, "sha512-AXfN/lGotSQwu6HNcEsIASo7kWXZ5HYWvfOmSNKDsEqC4OashTp8alTmaz+F7TC2L083SFv5RdB+qU3Vs1kZqw=="], + "@clickhouse/client": ["@clickhouse/client@1.16.0", "", { "dependencies": { "@clickhouse/client-common": "1.16.0" } }, "sha512-ThPhoRMsKsf/hmBEgWlUsGxFecsr3i+k3JI8JV0Od7UpH2BSmk9VKMGJoyPCrTL0vPUs5rJH+7o4iCqBF09Xvg=="], - "@aws-crypto/sha256-js": ["@aws-crypto/sha256-js@5.2.0", "", { "dependencies": { "@aws-crypto/util": "^5.2.0", "@aws-sdk/types": "^3.222.0", "tslib": "^2.6.2" } }, "sha512-FFQQyu7edu4ufvIZ+OadFpHHOt+eSTBaYaki44c+akjg7qZg9oOQeLlk77F6tSYqjDAFClrHJk9tMf0HdVyOvA=="], - - "@aws-crypto/supports-web-crypto": ["@aws-crypto/supports-web-crypto@5.2.0", "", { "dependencies": { "tslib": "^2.6.2" } }, "sha512-iAvUotm021kM33eCdNfwIN//F77/IADDSs58i+MDaOqFrVjZo9bAal0NK7HurRuWLLpF1iLX7gbWrjHjeo+YFg=="], - - "@aws-crypto/util": ["@aws-crypto/util@5.2.0", "", { "dependencies": { "@aws-sdk/types": "^3.222.0", "@smithy/util-utf8": "^2.0.0", "tslib": "^2.6.2" } }, "sha512-4RkU9EsI6ZpBve5fseQlGNUWKMa1RLPQ1dnjnQoe07ldfIzcsGb5hC5W0Dm7u423KWzawlrpbjXBrXCEv9zazQ=="], - - "@aws-sdk/client-sesv2": ["@aws-sdk/client-sesv2@3.922.0", "", { "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", "@aws-sdk/core": "3.922.0", "@aws-sdk/credential-provider-node": "3.922.0", "@aws-sdk/middleware-host-header": "3.922.0", "@aws-sdk/middleware-logger": "3.922.0", "@aws-sdk/middleware-recursion-detection": "3.922.0", "@aws-sdk/middleware-user-agent": "3.922.0", "@aws-sdk/region-config-resolver": "3.922.0", "@aws-sdk/signature-v4-multi-region": "3.922.0", "@aws-sdk/types": "3.922.0", "@aws-sdk/util-endpoints": "3.922.0", "@aws-sdk/util-user-agent-browser": "3.922.0", "@aws-sdk/util-user-agent-node": "3.922.0", "@smithy/config-resolver": "^4.4.1", "@smithy/core": "^3.17.2", "@smithy/fetch-http-handler": "^5.3.5", "@smithy/hash-node": "^4.2.4", "@smithy/invalid-dependency": "^4.2.4", "@smithy/middleware-content-length": "^4.2.4", "@smithy/middleware-endpoint": "^4.3.6", "@smithy/middleware-retry": "^4.4.6", "@smithy/middleware-serde": "^4.2.4", "@smithy/middleware-stack": "^4.2.4", "@smithy/node-config-provider": "^4.3.4", "@smithy/node-http-handler": "^4.4.4", "@smithy/protocol-http": "^5.3.4", "@smithy/smithy-client": "^4.9.2", "@smithy/types": "^4.8.1", "@smithy/url-parser": "^4.2.4", "@smithy/util-base64": "^4.3.0", "@smithy/util-body-length-browser": "^4.2.0", "@smithy/util-body-length-node": "^4.2.1", "@smithy/util-defaults-mode-browser": "^4.3.5", "@smithy/util-defaults-mode-node": "^4.2.7", "@smithy/util-endpoints": "^3.2.4", "@smithy/util-middleware": "^4.2.4", "@smithy/util-retry": "^4.2.4", "@smithy/util-utf8": "^4.2.0", "tslib": "^2.6.2" } }, "sha512-cowHCdzir4KmT/MoRyp2RV3BAebjcpiyKU1pidu2D1lI87iGXlxNG7KXJ0W8mjQoGpKa2XcihDY/mtqd/6uVlA=="], - - "@aws-sdk/client-sso": ["@aws-sdk/client-sso@3.922.0", "", { "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", "@aws-sdk/core": "3.922.0", "@aws-sdk/middleware-host-header": "3.922.0", "@aws-sdk/middleware-logger": "3.922.0", "@aws-sdk/middleware-recursion-detection": "3.922.0", "@aws-sdk/middleware-user-agent": "3.922.0", "@aws-sdk/region-config-resolver": "3.922.0", "@aws-sdk/types": "3.922.0", "@aws-sdk/util-endpoints": "3.922.0", "@aws-sdk/util-user-agent-browser": "3.922.0", "@aws-sdk/util-user-agent-node": "3.922.0", "@smithy/config-resolver": "^4.4.1", "@smithy/core": "^3.17.2", "@smithy/fetch-http-handler": "^5.3.5", "@smithy/hash-node": "^4.2.4", "@smithy/invalid-dependency": "^4.2.4", "@smithy/middleware-content-length": "^4.2.4", "@smithy/middleware-endpoint": "^4.3.6", "@smithy/middleware-retry": "^4.4.6", "@smithy/middleware-serde": "^4.2.4", "@smithy/middleware-stack": "^4.2.4", "@smithy/node-config-provider": "^4.3.4", "@smithy/node-http-handler": "^4.4.4", "@smithy/protocol-http": "^5.3.4", "@smithy/smithy-client": "^4.9.2", "@smithy/types": "^4.8.1", "@smithy/url-parser": "^4.2.4", "@smithy/util-base64": "^4.3.0", "@smithy/util-body-length-browser": "^4.2.0", "@smithy/util-body-length-node": "^4.2.1", "@smithy/util-defaults-mode-browser": "^4.3.5", "@smithy/util-defaults-mode-node": "^4.2.7", "@smithy/util-endpoints": "^3.2.4", "@smithy/util-middleware": "^4.2.4", "@smithy/util-retry": "^4.2.4", "@smithy/util-utf8": "^4.2.0", "tslib": "^2.6.2" } }, "sha512-jdHs7uy7cSpiMvrxhYmqHyJxgK7hyqw4plG8OQ4YTBpq0SbfAxdoOuOkwJ1IVUUQho4otR1xYYjiX/8e8J8qwQ=="], - - "@aws-sdk/core": ["@aws-sdk/core@3.922.0", "", { "dependencies": { "@aws-sdk/types": "3.922.0", "@aws-sdk/xml-builder": "3.921.0", "@smithy/core": "^3.17.2", "@smithy/node-config-provider": "^4.3.4", "@smithy/property-provider": "^4.2.4", "@smithy/protocol-http": "^5.3.4", "@smithy/signature-v4": "^5.3.4", "@smithy/smithy-client": "^4.9.2", "@smithy/types": "^4.8.1", "@smithy/util-base64": "^4.3.0", "@smithy/util-middleware": "^4.2.4", "@smithy/util-utf8": "^4.2.0", "tslib": "^2.6.2" } }, "sha512-EvfP4cqJfpO3L2v5vkIlTkMesPtRwWlMfsaW6Tpfm7iYfBOuTi6jx60pMDMTyJNVfh6cGmXwh/kj1jQdR+w99Q=="], - - "@aws-sdk/credential-provider-env": ["@aws-sdk/credential-provider-env@3.922.0", "", { "dependencies": { "@aws-sdk/core": "3.922.0", "@aws-sdk/types": "3.922.0", "@smithy/property-provider": "^4.2.4", "@smithy/types": "^4.8.1", "tslib": "^2.6.2" } }, "sha512-WikGQpKkROJSK3D3E7odPjZ8tU7WJp5/TgGdRuZw3izsHUeH48xMv6IznafpRTmvHcjAbDQj4U3CJZNAzOK/OQ=="], - - "@aws-sdk/credential-provider-http": ["@aws-sdk/credential-provider-http@3.922.0", "", { "dependencies": { "@aws-sdk/core": "3.922.0", "@aws-sdk/types": "3.922.0", "@smithy/fetch-http-handler": "^5.3.5", "@smithy/node-http-handler": "^4.4.4", "@smithy/property-provider": "^4.2.4", "@smithy/protocol-http": "^5.3.4", "@smithy/smithy-client": "^4.9.2", "@smithy/types": "^4.8.1", "@smithy/util-stream": "^4.5.5", "tslib": "^2.6.2" } }, "sha512-i72DgHMK7ydAEqdzU0Duqh60Q8W59EZmRJ73y0Y5oFmNOqnYsAI+UXyOoCsubp+Dkr6+yOwAn1gPt1XGE9Aowg=="], - - "@aws-sdk/credential-provider-ini": ["@aws-sdk/credential-provider-ini@3.922.0", "", { "dependencies": { "@aws-sdk/core": "3.922.0", "@aws-sdk/credential-provider-env": "3.922.0", "@aws-sdk/credential-provider-http": "3.922.0", "@aws-sdk/credential-provider-process": "3.922.0", "@aws-sdk/credential-provider-sso": "3.922.0", "@aws-sdk/credential-provider-web-identity": "3.922.0", "@aws-sdk/nested-clients": "3.922.0", "@aws-sdk/types": "3.922.0", "@smithy/credential-provider-imds": "^4.2.4", "@smithy/property-provider": "^4.2.4", "@smithy/shared-ini-file-loader": "^4.3.4", "@smithy/types": "^4.8.1", "tslib": "^2.6.2" } }, "sha512-bVF+pI5UCLNkvbiZr/t2fgTtv84s8FCdOGAPxQiQcw5qOZywNuuCCY3wIIchmQr6GJr8YFkEp5LgDCac5EC5aQ=="], - - "@aws-sdk/credential-provider-node": ["@aws-sdk/credential-provider-node@3.922.0", "", { "dependencies": { "@aws-sdk/credential-provider-env": "3.922.0", "@aws-sdk/credential-provider-http": "3.922.0", "@aws-sdk/credential-provider-ini": "3.922.0", "@aws-sdk/credential-provider-process": "3.922.0", "@aws-sdk/credential-provider-sso": "3.922.0", "@aws-sdk/credential-provider-web-identity": "3.922.0", "@aws-sdk/types": "3.922.0", "@smithy/credential-provider-imds": "^4.2.4", "@smithy/property-provider": "^4.2.4", "@smithy/shared-ini-file-loader": "^4.3.4", "@smithy/types": "^4.8.1", "tslib": "^2.6.2" } }, "sha512-agCwaD6mBihToHkjycL8ObIS2XOnWypWZZWhJSoWyHwFrhEKz1zGvgylK9Dc711oUfU+zU6J8e0JPKNJMNb3BQ=="], - - "@aws-sdk/credential-provider-process": ["@aws-sdk/credential-provider-process@3.922.0", "", { "dependencies": { "@aws-sdk/core": "3.922.0", "@aws-sdk/types": "3.922.0", "@smithy/property-provider": "^4.2.4", "@smithy/shared-ini-file-loader": "^4.3.4", "@smithy/types": "^4.8.1", "tslib": "^2.6.2" } }, "sha512-1DZOYezT6okslpvMW7oA2q+y17CJd4fxjNFH0jtThfswdh9CtG62+wxenqO+NExttq0UMaKisrkZiVrYQBTShw=="], - - "@aws-sdk/credential-provider-sso": ["@aws-sdk/credential-provider-sso@3.922.0", "", { "dependencies": { "@aws-sdk/client-sso": "3.922.0", "@aws-sdk/core": "3.922.0", "@aws-sdk/token-providers": "3.922.0", "@aws-sdk/types": "3.922.0", "@smithy/property-provider": "^4.2.4", "@smithy/shared-ini-file-loader": "^4.3.4", "@smithy/types": "^4.8.1", "tslib": "^2.6.2" } }, "sha512-nbD3G3hShTYxLCkKMqLkLPtKwAAfxdY/k9jHtZmVBFXek2T6tQrqZHKxlAu+fd23Ga4/Aik7DLQQx1RA1a5ipg=="], - - "@aws-sdk/credential-provider-web-identity": ["@aws-sdk/credential-provider-web-identity@3.922.0", "", { "dependencies": { "@aws-sdk/core": "3.922.0", "@aws-sdk/nested-clients": "3.922.0", "@aws-sdk/types": "3.922.0", "@smithy/property-provider": "^4.2.4", "@smithy/shared-ini-file-loader": "^4.3.4", "@smithy/types": "^4.8.1", "tslib": "^2.6.2" } }, "sha512-wjGIhgMHGGQfQTdFaJphNOKyAL8wZs6znJdHADPVURmgR+EWLyN/0fDO1u7wx8xaLMZpbHIFWBEvf9TritR/cQ=="], - - "@aws-sdk/middleware-host-header": ["@aws-sdk/middleware-host-header@3.922.0", "", { "dependencies": { "@aws-sdk/types": "3.922.0", "@smithy/protocol-http": "^5.3.4", "@smithy/types": "^4.8.1", "tslib": "^2.6.2" } }, "sha512-HPquFgBnq/KqKRVkiuCt97PmWbKtxQ5iUNLEc6FIviqOoZTmaYG3EDsIbuFBz9C4RHJU4FKLmHL2bL3FEId6AA=="], - - "@aws-sdk/middleware-logger": ["@aws-sdk/middleware-logger@3.922.0", "", { "dependencies": { "@aws-sdk/types": "3.922.0", "@smithy/types": "^4.8.1", "tslib": "^2.6.2" } }, "sha512-AkvYO6b80FBm5/kk2E636zNNcNgjztNNUxpqVx+huyGn9ZqGTzS4kLqW2hO6CBe5APzVtPCtiQsXL24nzuOlAg=="], - - "@aws-sdk/middleware-recursion-detection": ["@aws-sdk/middleware-recursion-detection@3.922.0", "", { "dependencies": { "@aws-sdk/types": "3.922.0", "@aws/lambda-invoke-store": "^0.1.1", "@smithy/protocol-http": "^5.3.4", "@smithy/types": "^4.8.1", "tslib": "^2.6.2" } }, "sha512-TtSCEDonV/9R0VhVlCpxZbp/9sxQvTTRKzIf8LxW3uXpby6Wl8IxEciBJlxmSkoqxh542WRcko7NYODlvL/gDA=="], - - "@aws-sdk/middleware-sdk-s3": ["@aws-sdk/middleware-sdk-s3@3.922.0", "", { "dependencies": { "@aws-sdk/core": "3.922.0", "@aws-sdk/types": "3.922.0", "@aws-sdk/util-arn-parser": "3.893.0", "@smithy/core": "^3.17.2", "@smithy/node-config-provider": "^4.3.4", "@smithy/protocol-http": "^5.3.4", "@smithy/signature-v4": "^5.3.4", "@smithy/smithy-client": "^4.9.2", "@smithy/types": "^4.8.1", "@smithy/util-config-provider": "^4.2.0", "@smithy/util-middleware": "^4.2.4", "@smithy/util-stream": "^4.5.5", "@smithy/util-utf8": "^4.2.0", "tslib": "^2.6.2" } }, "sha512-ygg8lME1oFAbsH42ed2wtGqfHLoT5irgx6VC4X98j79fV1qXEwwwbqMsAiMQ/HJehpjqAFRVsHox3MHLN48Z5A=="], - - "@aws-sdk/middleware-user-agent": ["@aws-sdk/middleware-user-agent@3.922.0", "", { "dependencies": { "@aws-sdk/core": "3.922.0", "@aws-sdk/types": "3.922.0", "@aws-sdk/util-endpoints": "3.922.0", "@smithy/core": "^3.17.2", "@smithy/protocol-http": "^5.3.4", "@smithy/types": "^4.8.1", "tslib": "^2.6.2" } }, "sha512-N4Qx/9KP3oVQBJOrSghhz8iZFtUC2NNeSZt88hpPhbqAEAtuX8aD8OzVcpnAtrwWqy82Yd2YTxlkqMGkgqnBsQ=="], - - "@aws-sdk/nested-clients": ["@aws-sdk/nested-clients@3.922.0", "", { "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", "@aws-sdk/core": "3.922.0", "@aws-sdk/middleware-host-header": "3.922.0", "@aws-sdk/middleware-logger": "3.922.0", "@aws-sdk/middleware-recursion-detection": "3.922.0", "@aws-sdk/middleware-user-agent": "3.922.0", "@aws-sdk/region-config-resolver": "3.922.0", "@aws-sdk/types": "3.922.0", "@aws-sdk/util-endpoints": "3.922.0", "@aws-sdk/util-user-agent-browser": "3.922.0", "@aws-sdk/util-user-agent-node": "3.922.0", "@smithy/config-resolver": "^4.4.1", "@smithy/core": "^3.17.2", "@smithy/fetch-http-handler": "^5.3.5", "@smithy/hash-node": "^4.2.4", "@smithy/invalid-dependency": "^4.2.4", "@smithy/middleware-content-length": "^4.2.4", "@smithy/middleware-endpoint": "^4.3.6", "@smithy/middleware-retry": "^4.4.6", "@smithy/middleware-serde": "^4.2.4", "@smithy/middleware-stack": "^4.2.4", "@smithy/node-config-provider": "^4.3.4", "@smithy/node-http-handler": "^4.4.4", "@smithy/protocol-http": "^5.3.4", "@smithy/smithy-client": "^4.9.2", "@smithy/types": "^4.8.1", "@smithy/url-parser": "^4.2.4", "@smithy/util-base64": "^4.3.0", "@smithy/util-body-length-browser": "^4.2.0", "@smithy/util-body-length-node": "^4.2.1", "@smithy/util-defaults-mode-browser": "^4.3.5", "@smithy/util-defaults-mode-node": "^4.2.7", "@smithy/util-endpoints": "^3.2.4", "@smithy/util-middleware": "^4.2.4", "@smithy/util-retry": "^4.2.4", "@smithy/util-utf8": "^4.2.0", "tslib": "^2.6.2" } }, "sha512-uYvKCF1TGh/MuJ4TMqmUM0Csuao02HawcseG4LUDyxdUsd/EFuxalWq1Cx4fKZQ2K8F504efZBjctMAMNY+l7A=="], - - "@aws-sdk/region-config-resolver": ["@aws-sdk/region-config-resolver@3.922.0", "", { "dependencies": { "@aws-sdk/types": "3.922.0", "@smithy/config-resolver": "^4.4.1", "@smithy/node-config-provider": "^4.3.4", "@smithy/types": "^4.8.1", "tslib": "^2.6.2" } }, "sha512-44Y/rNNwhngR2KHp6gkx//TOr56/hx6s4l+XLjOqH7EBCHL7XhnrT1y92L+DLiroVr1tCSmO8eHQwBv0Y2+mvw=="], - - "@aws-sdk/signature-v4-multi-region": ["@aws-sdk/signature-v4-multi-region@3.922.0", "", { "dependencies": { "@aws-sdk/middleware-sdk-s3": "3.922.0", "@aws-sdk/types": "3.922.0", "@smithy/protocol-http": "^5.3.4", "@smithy/signature-v4": "^5.3.4", "@smithy/types": "^4.8.1", "tslib": "^2.6.2" } }, "sha512-mmsgEEL5pE+A7gFYiJMDBCLVciaXq4EFI5iAP7bPpnHvOplnNOYxVy2IreKMllGvrfjVyLnwxzZYlo5zZ65FWg=="], - - "@aws-sdk/token-providers": ["@aws-sdk/token-providers@3.922.0", "", { "dependencies": { "@aws-sdk/core": "3.922.0", "@aws-sdk/nested-clients": "3.922.0", "@aws-sdk/types": "3.922.0", "@smithy/property-provider": "^4.2.4", "@smithy/shared-ini-file-loader": "^4.3.4", "@smithy/types": "^4.8.1", "tslib": "^2.6.2" } }, "sha512-/inmPnjZE0ZBE16zaCowAvouSx05FJ7p6BQYuzlJ8vxEU0sS0Hf8fvhuiRnN9V9eDUPIBY+/5EjbMWygXL4wlQ=="], - - "@aws-sdk/types": ["@aws-sdk/types@3.922.0", "", { "dependencies": { "@smithy/types": "^4.8.1", "tslib": "^2.6.2" } }, "sha512-eLA6XjVobAUAMivvM7DBL79mnHyrm+32TkXNWZua5mnxF+6kQCfblKKJvxMZLGosO53/Ex46ogim8IY5Nbqv2w=="], - - "@aws-sdk/util-arn-parser": ["@aws-sdk/util-arn-parser@3.893.0", "", { "dependencies": { "tslib": "^2.6.2" } }, "sha512-u8H4f2Zsi19DGnwj5FSZzDMhytYF/bCh37vAtBsn3cNDL3YG578X5oc+wSX54pM3tOxS+NY7tvOAo52SW7koUA=="], - - "@aws-sdk/util-endpoints": ["@aws-sdk/util-endpoints@3.922.0", "", { "dependencies": { "@aws-sdk/types": "3.922.0", "@smithy/types": "^4.8.1", "@smithy/url-parser": "^4.2.4", "@smithy/util-endpoints": "^3.2.4", "tslib": "^2.6.2" } }, "sha512-4ZdQCSuNMY8HMlR1YN4MRDdXuKd+uQTeKIr5/pIM+g3TjInZoj8imvXudjcrFGA63UF3t92YVTkBq88mg58RXQ=="], - - "@aws-sdk/util-locate-window": ["@aws-sdk/util-locate-window@3.893.0", "", { "dependencies": { "tslib": "^2.6.2" } }, "sha512-T89pFfgat6c8nMmpI8eKjBcDcgJq36+m9oiXbcUzeU55MP9ZuGgBomGjGnHaEyF36jenW9gmg3NfZDm0AO2XPg=="], - - "@aws-sdk/util-user-agent-browser": ["@aws-sdk/util-user-agent-browser@3.922.0", "", { "dependencies": { "@aws-sdk/types": "3.922.0", "@smithy/types": "^4.8.1", "bowser": "^2.11.0", "tslib": "^2.6.2" } }, "sha512-qOJAERZ3Plj1st7M4Q5henl5FRpE30uLm6L9edZqZXGR6c7ry9jzexWamWVpQ4H4xVAVmiO9dIEBAfbq4mduOA=="], - - "@aws-sdk/util-user-agent-node": ["@aws-sdk/util-user-agent-node@3.922.0", "", { "dependencies": { "@aws-sdk/middleware-user-agent": "3.922.0", "@aws-sdk/types": "3.922.0", "@smithy/node-config-provider": "^4.3.4", "@smithy/types": "^4.8.1", "tslib": "^2.6.2" }, "peerDependencies": { "aws-crt": ">=1.0.0" }, "optionalPeers": ["aws-crt"] }, "sha512-NrPe/Rsr5kcGunkog0eBV+bY0inkRELsD2SacC4lQZvZiXf8VJ2Y7j+Yq1tB+h+FPLsdt3v9wItIvDf/laAm0Q=="], - - "@aws-sdk/xml-builder": ["@aws-sdk/xml-builder@3.921.0", "", { "dependencies": { "@smithy/types": "^4.8.1", "fast-xml-parser": "5.2.5", "tslib": "^2.6.2" } }, "sha512-LVHg0jgjyicKKvpNIEMXIMr1EBViESxcPkqfOlT+X1FkmUMTNZEEVF18tOJg4m4hV5vxtkWcqtr4IEeWa1C41Q=="], - - "@aws/lambda-invoke-store": ["@aws/lambda-invoke-store@0.1.1", "", {}, "sha512-RcLam17LdlbSOSp9VxmUu1eI6Mwxp+OwhD2QhiSNmNCzoDb0EeUXTD2n/WbcnrAYMGlmf05th6QYq23VqvJqpA=="], - - "@clickhouse/client": ["@clickhouse/client@1.12.1", "", { "dependencies": { "@clickhouse/client-common": "1.12.1" } }, "sha512-7ORY85rphRazqHzImNXMrh4vsaPrpetFoTWpZYueCO2bbO6PXYDXp/GQ4DgxnGIqbWB/Di1Ai+Xuwq2o7DJ36A=="], - - "@clickhouse/client-common": ["@clickhouse/client-common@1.12.1", "", {}, "sha512-ccw1N6hB4+MyaAHIaWBwGZ6O2GgMlO99FlMj0B0UEGfjxM9v5dYVYql6FpP19rMwrVAroYs/IgX2vyZEBvzQLg=="], + "@clickhouse/client-common": ["@clickhouse/client-common@1.16.0", "", {}, "sha512-qMzkI1NmV29ZjFkNpVSvGNfA0c7sCExlufAQMv+V+5xtNeYXnRfdqzmBLIQoq6Pf1ij0kw/wGLD3HQrl7pTFLA=="], "@drizzle-team/brocli": ["@drizzle-team/brocli@0.10.2", "", {}, "sha512-z33Il7l5dKjUgGULTqBsQBQwckHh5AbIuxhdsIxDDiZAzBOrZO6q9ogcWC65kU382AfynTfgNumVcNIjuIua6w=="], @@ -183,7 +122,7 @@ "@esbuild/win32-x64": ["@esbuild/win32-x64@0.25.12", "", { "os": "win32", "cpu": "x64" }, "sha512-alJC0uCZpTFrSL0CCDjcgleBXPnCrEAhTBILpeAp7M/OFgoqtAetfBzX0xM00MUsVVPpVjlPuMbREqnZCXaTnA=="], - "@eslint-community/eslint-utils": ["@eslint-community/eslint-utils@4.9.0", "", { "dependencies": { "eslint-visitor-keys": "^3.4.3" }, "peerDependencies": { "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" } }, "sha512-ayVFHdtZ+hsq1t2Dy24wCmGXGe4q9Gu3smhLYALJrr473ZH27MsnSL+LKUlimp4BWJqMDMLmPpx/Q9R3OAlL4g=="], + "@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=="], @@ -193,9 +132,9 @@ "@eslint/core": ["@eslint/core@0.17.0", "", { "dependencies": { "@types/json-schema": "^7.0.15" } }, "sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ=="], - "@eslint/eslintrc": ["@eslint/eslintrc@3.3.1", "", { "dependencies": { "ajv": "^6.12.4", "debug": "^4.3.2", "espree": "^10.0.1", "globals": "^14.0.0", "ignore": "^5.2.0", "import-fresh": "^3.2.1", "js-yaml": "^4.1.0", "minimatch": "^3.1.2", "strip-json-comments": "^3.1.1" } }, "sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ=="], + "@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.1", "", {}, "sha512-S26Stp4zCy88tH94QbBv3XCuzRQiZ9yXofEILmglYTh/Ug/a9/umqvgFtYBAo3Lp0nsI/5/qH1CCrbdK3AP1Tw=="], + "@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=="], @@ -205,7 +144,7 @@ "@fastify/autoload": ["@fastify/autoload@6.3.1", "", {}, "sha512-0fsG+lO3m5yEZVjXKpltCe+2eHhM6rfAPQhvlGUgLUFTw/N2wA9WqPTObMtrF3oUCUrxbSDv60HlUIoh+aFM1A=="], - "@fastify/cors": ["@fastify/cors@11.1.0", "", { "dependencies": { "fastify-plugin": "^5.0.0", "toad-cache": "^3.7.0" } }, "sha512-sUw8ed8wP2SouWZTIbA7V2OQtMNpLj2W6qJOYhNdcmINTu6gsxVYXjQiM9mdi8UUDlcoDDJ/W2syPo1WB2QjYA=="], + "@fastify/cors": ["@fastify/cors@11.2.0", "", { "dependencies": { "fastify-plugin": "^5.0.0", "toad-cache": "^3.7.0" } }, "sha512-LbLHBuSAdGdSFZYTLVA3+Ch2t+sA6nq3Ejc6XLAKiQ6ViS2qFnvicpj0htsx03FyYeLs04HfRNBsz/a8SvbcUw=="], "@fastify/error": ["@fastify/error@4.2.0", "", {}, "sha512-RSo3sVDXfHskiBZKBPRgnQTtIqpi/7zhJOEmAxCiBcM7d0uwdGdxLlsCaLzGs8v8NnxIRlfG0N51p5yFaOentQ=="], @@ -223,7 +162,7 @@ "@fastify/rate-limit": ["@fastify/rate-limit@10.3.0", "", { "dependencies": { "@lukeed/ms": "^2.0.2", "fastify-plugin": "^5.0.0", "toad-cache": "^3.7.0" } }, "sha512-eIGkG9XKQs0nyynatApA3EVrojHOuq4l6fhB4eeCk4PIOeadvOJz9/4w3vGI44Go17uaXOWEcPkaD8kuKm7g6Q=="], - "@fastify/redis": ["@fastify/redis@7.1.0", "", { "dependencies": { "fastify-plugin": "^5.0.0", "ioredis": "^5.3.2" } }, "sha512-S5GUxv8Rp5dlCuB/BXuWYc7a+anhDdHzrPPeCfPd/YGMr/khpFUQEhDkJdmnkwwnebGJrT2mYapq+ugvPV4qVg=="], + "@fastify/redis": ["@fastify/redis@7.2.0", "", { "dependencies": { "fastify-plugin": "^5.0.0", "ioredis": "^5.3.2" } }, "sha512-Ql8emmkajVBCCz0pRjPFZRFI2069Jrp/iufKb5TJwgBeu7B+oZp+GeZIgf+4WX3EX7Vi/h3KTyGf+5DUWI1oFw=="], "@fastify/swagger": ["@fastify/swagger@9.6.1", "", { "dependencies": { "fastify-plugin": "^5.0.0", "json-schema-resolver": "^3.0.0", "openapi-types": "^12.1.3", "rfdc": "^1.3.1", "yaml": "^2.4.2" } }, "sha512-fKlpJqFMWoi4H3EdUkDaMteEYRCfQMEkK0HJJ0eaf4aRlKd8cbq0pVkOfXDXmtvMTXYcnx3E+l023eFDBsA1HA=="], @@ -235,7 +174,7 @@ "@humanwhocodes/retry": ["@humanwhocodes/retry@0.4.3", "", {}, "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ=="], - "@ioredis/commands": ["@ioredis/commands@1.4.0", "", {}, "sha512-aFT2yemJJo+TZCmieA7qnYGQooOS7QfNmYrzGtsYd3g9j5iDP8AimYYAesf79ohjbLG12XxC4nG5DyEnC88AsQ=="], + "@ioredis/commands": ["@ioredis/commands@1.5.0", "", {}, "sha512-eUgLqrMf8nJkZxT24JvVRrQya1vZkQh8BBeYNwGDqa5I0VUi8ACx7uFvAaLxintokpTenkK6DASvo/bvNbBGow=="], "@lukeed/ms": ["@lukeed/ms@2.0.2", "", {}, "sha512-9I2Zn6+NJLfaGoz9jN3lpwDgAYvfGeNYdbAIjJOqzs4Tpc+VU3Jqq4IofSUBKajiDS8k9fZIg18/z13mpk1bsA=="], @@ -251,117 +190,29 @@ "@msgpackr-extract/msgpackr-extract-win32-x64": ["@msgpackr-extract/msgpackr-extract-win32-x64@3.0.3", "", { "os": "win32", "cpu": "x64" }, "sha512-x0fWaQtYp4E6sktbsdAqnehxDgEc/VwM7uLsRCYWaiGu0ykYdZPiS8zCWdnjHwyiumousxfBm4SO31eXqwEZhQ=="], - "@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=="], - - "@opentelemetry/api": ["@opentelemetry/api@1.9.0", "", {}, "sha512-3giAOQvZiH5F9bMlMiv8+GSPMeqg0dbaeo58/0SlA9sxSqZhnUtxzX9/2FzyhS9sWQf5S0GJE0AKBrFqjpeYcg=="], - "@pinojs/redact": ["@pinojs/redact@0.4.0", "", {}, "sha512-k2ENnmBugE/rzQfEcdWHcCY+/FM3VLzH9cYEsbdsoqrvzAKRhUZeRNhAZvB8OitQJ1TBed3yqWtdjzS6wJKBwg=="], "@pkgr/core": ["@pkgr/core@0.2.9", "", {}, "sha512-QNqXyfVS2wm9hweSYD2O7F0G06uurj9kZ96TRQE5Y9hU7+tgdZwIkbAKc5Ocy1HxEY2kuDQa6cQ1WRs/O5LFKA=="], - "@scalar/core": ["@scalar/core@0.3.30", "", { "dependencies": { "@scalar/types": "0.5.6" } }, "sha512-eBp1phI8u/GZR+yy9SwRTr07n3+Va+xoZJVT6tczG799eynpXiQJuUQ4S2S1cb0cmOV0ZkwHRNG3ldMQHdJgWQ=="], + "@scalar/core": ["@scalar/core@0.3.36", "", { "dependencies": { "@scalar/types": "0.6.1" } }, "sha512-gdgoF/XP2RkvhqGlI0l2MWTR/2522GPdaiQkWwS348Po8oCkJy2npxFuZbC2jtp6DIrWDrOD6qYgHssyzMmcrA=="], - "@scalar/fastify-api-reference": ["@scalar/fastify-api-reference@1.43.1", "", { "dependencies": { "@scalar/core": "0.3.30", "@scalar/openapi-parser": "0.23.11", "@scalar/openapi-types": "0.5.3", "fastify-plugin": "^4.5.1", "github-slugger": "^2.0.0" } }, "sha512-0KKlh+ZRvrupcinK31iL50hhiE2xXO3Zwx03/xmfupHU/nFM6dazOE0z5oBRpbQHmIvOTdAuULqi4OP638RMcQ=="], + "@scalar/fastify-api-reference": ["@scalar/fastify-api-reference@1.44.9", "", { "dependencies": { "@scalar/core": "0.3.36", "@scalar/openapi-parser": "0.24.6", "@scalar/openapi-types": "0.5.3", "fastify-plugin": "^4.5.1", "github-slugger": "^2.0.0" } }, "sha512-qGA7dNRN38B8y8a2mOSPYX3tJtL0knVUN7YCNlSjmOm8flCQh4wchE5qKBf0R2KFFiwrc9Hd0QkEBLiT9EAc2w=="], - "@scalar/helpers": ["@scalar/helpers@0.2.6", "", {}, "sha512-A471YFBCj7ZOlGIkAYnU8oYgeyts82ZNX+4UicrlmKv3eAQ+kwboN3Dy0R6u1lcA/+I/zzeXi/fBObsT7P9qTA=="], + "@scalar/helpers": ["@scalar/helpers@0.2.10", "", {}, "sha512-VS32setBEAGY9JifuDZKHIq8SUCUWLEfL1V+h3s5V4wcmE8OZVkzaJemsMq/YAM9e7gb9ZbkvJLL4zzEvPSrVg=="], - "@scalar/json-magic": ["@scalar/json-magic@0.8.10", "", { "dependencies": { "@scalar/helpers": "0.2.6", "yaml": "^2.8.0" } }, "sha512-TWdKQ/hcy4erFQDp2MVlFoPesFep2VY96Q69cjLHmx5hxM0ZUBfmNB4lA8Uh3klgx5JmCDfSNIGjPFIpxlosUw=="], + "@scalar/json-magic": ["@scalar/json-magic@0.9.5", "", { "dependencies": { "@scalar/helpers": "0.2.10", "yaml": "^2.8.0" } }, "sha512-+IZngReH0P+ima7y9u/f5QJD60AdISG81ezhwEVrYhsp46PiJp7YyOd0z1YLiOgwV0jkPlPo74T/FVBcM2ejuw=="], - "@scalar/openapi-parser": ["@scalar/openapi-parser@0.23.11", "", { "dependencies": { "@scalar/json-magic": "0.8.10", "@scalar/openapi-types": "0.5.3", "@scalar/openapi-upgrader": "0.1.6", "ajv": "^8.17.1", "ajv-draft-04": "^1.0.0", "ajv-formats": "^3.0.1", "jsonpointer": "^5.0.1", "leven": "^4.0.0", "yaml": "^2.8.0" } }, "sha512-C3+04WqQRG6mqC2DbV1PRmHutJHNcnaBGVD2mnGDyZyK5iusVjGLhL+yuqVPkOBv6PuEzscGqbJQ0yfvVa5WtA=="], + "@scalar/openapi-parser": ["@scalar/openapi-parser@0.24.6", "", { "dependencies": { "@scalar/helpers": "0.2.10", "@scalar/json-magic": "0.9.5", "@scalar/openapi-types": "0.5.3", "@scalar/openapi-upgrader": "0.1.8", "ajv": "^8.17.1", "ajv-draft-04": "^1.0.0", "ajv-formats": "^3.0.1", "jsonpointer": "^5.0.1", "leven": "^4.0.0", "yaml": "^2.8.0" } }, "sha512-5QJhxm7pfUc1bxq45LdqeU23pgNP/J0aBKc+XlNd6n5eUsnW2ZynVldd0D2G8E/8NSjwb6T8xyO5JAbkZXkYog=="], "@scalar/openapi-types": ["@scalar/openapi-types@0.5.3", "", { "dependencies": { "zod": "^4.1.11" } }, "sha512-m4n/Su3K01d15dmdWO1LlqecdSPKuNjuokrJLdiQ485kW/hRHbXW1QP6tJL75myhw/XhX5YhYAR+jrwnGjXiMw=="], - "@scalar/openapi-upgrader": ["@scalar/openapi-upgrader@0.1.6", "", { "dependencies": { "@scalar/openapi-types": "0.5.3" } }, "sha512-XdrNZUr0ASLfR89OS2zP6enbq9f7UGQQxov+a3WF1Wz9DClniAL2ChJ2fbGOrqL5F2kjbV6Fw/iO3bsBTMyLZA=="], - - "@scalar/types": ["@scalar/types@0.5.6", "", { "dependencies": { "@scalar/helpers": "0.2.6", "nanoid": "5.1.5", "type-fest": "5.0.0", "zod": "^4.1.11" } }, "sha512-yvTXYdSQPq8qmJ1zZPBRRB3RkkE2c0J3gIIMirX997yyVixrhtb0jmfM+9EZ2ZWXGx2JGLquGP10zY0nmnu75w=="], - - "@smithy/abort-controller": ["@smithy/abort-controller@4.2.4", "", { "dependencies": { "@smithy/types": "^4.8.1", "tslib": "^2.6.2" } }, "sha512-Z4DUr/AkgyFf1bOThW2HwzREagee0sB5ycl+hDiSZOfRLW8ZgrOjDi6g8mHH19yyU5E2A/64W3z6SMIf5XiUSQ=="], - - "@smithy/config-resolver": ["@smithy/config-resolver@4.4.2", "", { "dependencies": { "@smithy/node-config-provider": "^4.3.4", "@smithy/types": "^4.8.1", "@smithy/util-config-provider": "^4.2.0", "@smithy/util-endpoints": "^3.2.4", "@smithy/util-middleware": "^4.2.4", "tslib": "^2.6.2" } }, "sha512-4Jys0ni2tB2VZzgslbEgszZyMdTkPOFGA8g+So/NjR8oy6Qwaq4eSwsrRI+NMtb0Dq4kqCzGUu/nGUx7OM/xfw=="], - - "@smithy/core": ["@smithy/core@3.17.2", "", { "dependencies": { "@smithy/middleware-serde": "^4.2.4", "@smithy/protocol-http": "^5.3.4", "@smithy/types": "^4.8.1", "@smithy/util-base64": "^4.3.0", "@smithy/util-body-length-browser": "^4.2.0", "@smithy/util-middleware": "^4.2.4", "@smithy/util-stream": "^4.5.5", "@smithy/util-utf8": "^4.2.0", "@smithy/uuid": "^1.1.0", "tslib": "^2.6.2" } }, "sha512-n3g4Nl1Te+qGPDbNFAYf+smkRVB+JhFsGy9uJXXZQEufoP4u0r+WLh6KvTDolCswaagysDc/afS1yvb2jnj1gQ=="], - - "@smithy/credential-provider-imds": ["@smithy/credential-provider-imds@4.2.4", "", { "dependencies": { "@smithy/node-config-provider": "^4.3.4", "@smithy/property-provider": "^4.2.4", "@smithy/types": "^4.8.1", "@smithy/url-parser": "^4.2.4", "tslib": "^2.6.2" } }, "sha512-YVNMjhdz2pVto5bRdux7GMs0x1m0Afz3OcQy/4Yf9DH4fWOtroGH7uLvs7ZmDyoBJzLdegtIPpXrpJOZWvUXdw=="], - - "@smithy/fetch-http-handler": ["@smithy/fetch-http-handler@5.3.5", "", { "dependencies": { "@smithy/protocol-http": "^5.3.4", "@smithy/querystring-builder": "^4.2.4", "@smithy/types": "^4.8.1", "@smithy/util-base64": "^4.3.0", "tslib": "^2.6.2" } }, "sha512-mg83SM3FLI8Sa2ooTJbsh5MFfyMTyNRwxqpKHmE0ICRIa66Aodv80DMsTQI02xBLVJ0hckwqTRr5IGAbbWuFLQ=="], - - "@smithy/hash-node": ["@smithy/hash-node@4.2.4", "", { "dependencies": { "@smithy/types": "^4.8.1", "@smithy/util-buffer-from": "^4.2.0", "@smithy/util-utf8": "^4.2.0", "tslib": "^2.6.2" } }, "sha512-kKU0gVhx/ppVMntvUOZE7WRMFW86HuaxLwvqileBEjL7PoILI8/djoILw3gPQloGVE6O0oOzqafxeNi2KbnUJw=="], - - "@smithy/invalid-dependency": ["@smithy/invalid-dependency@4.2.4", "", { "dependencies": { "@smithy/types": "^4.8.1", "tslib": "^2.6.2" } }, "sha512-z6aDLGiHzsMhbS2MjetlIWopWz//K+mCoPXjW6aLr0mypF+Y7qdEh5TyJ20Onf9FbWHiWl4eC+rITdizpnXqOw=="], - - "@smithy/is-array-buffer": ["@smithy/is-array-buffer@4.2.0", "", { "dependencies": { "tslib": "^2.6.2" } }, "sha512-DZZZBvC7sjcYh4MazJSGiWMI2L7E0oCiRHREDzIxi/M2LY79/21iXt6aPLHge82wi5LsuRF5A06Ds3+0mlh6CQ=="], - - "@smithy/middleware-content-length": ["@smithy/middleware-content-length@4.2.4", "", { "dependencies": { "@smithy/protocol-http": "^5.3.4", "@smithy/types": "^4.8.1", "tslib": "^2.6.2" } }, "sha512-hJRZuFS9UsElX4DJSJfoX4M1qXRH+VFiLMUnhsWvtOOUWRNvvOfDaUSdlNbjwv1IkpVjj/Rd/O59Jl3nhAcxow=="], - - "@smithy/middleware-endpoint": ["@smithy/middleware-endpoint@4.3.6", "", { "dependencies": { "@smithy/core": "^3.17.2", "@smithy/middleware-serde": "^4.2.4", "@smithy/node-config-provider": "^4.3.4", "@smithy/shared-ini-file-loader": "^4.3.4", "@smithy/types": "^4.8.1", "@smithy/url-parser": "^4.2.4", "@smithy/util-middleware": "^4.2.4", "tslib": "^2.6.2" } }, "sha512-PXehXofGMFpDqr933rxD8RGOcZ0QBAWtuzTgYRAHAL2BnKawHDEdf/TnGpcmfPJGwonhginaaeJIKluEojiF/w=="], - - "@smithy/middleware-retry": ["@smithy/middleware-retry@4.4.6", "", { "dependencies": { "@smithy/node-config-provider": "^4.3.4", "@smithy/protocol-http": "^5.3.4", "@smithy/service-error-classification": "^4.2.4", "@smithy/smithy-client": "^4.9.2", "@smithy/types": "^4.8.1", "@smithy/util-middleware": "^4.2.4", "@smithy/util-retry": "^4.2.4", "@smithy/uuid": "^1.1.0", "tslib": "^2.6.2" } }, "sha512-OhLx131znrEDxZPAvH/OYufR9d1nB2CQADyYFN4C3V/NQS7Mg4V6uvxHC/Dr96ZQW8IlHJTJ+vAhKt6oxWRndA=="], - - "@smithy/middleware-serde": ["@smithy/middleware-serde@4.2.4", "", { "dependencies": { "@smithy/protocol-http": "^5.3.4", "@smithy/types": "^4.8.1", "tslib": "^2.6.2" } }, "sha512-jUr3x2CDhV15TOX2/Uoz4gfgeqLrRoTQbYAuhLS7lcVKNev7FeYSJ1ebEfjk+l9kbb7k7LfzIR/irgxys5ZTOg=="], - - "@smithy/middleware-stack": ["@smithy/middleware-stack@4.2.4", "", { "dependencies": { "@smithy/types": "^4.8.1", "tslib": "^2.6.2" } }, "sha512-Gy3TKCOnm9JwpFooldwAboazw+EFYlC+Bb+1QBsSi5xI0W5lX81j/P5+CXvD/9ZjtYKRgxq+kkqd/KOHflzvgA=="], - - "@smithy/node-config-provider": ["@smithy/node-config-provider@4.3.4", "", { "dependencies": { "@smithy/property-provider": "^4.2.4", "@smithy/shared-ini-file-loader": "^4.3.4", "@smithy/types": "^4.8.1", "tslib": "^2.6.2" } }, "sha512-3X3w7qzmo4XNNdPKNS4nbJcGSwiEMsNsRSunMA92S4DJLLIrH5g1AyuOA2XKM9PAPi8mIWfqC+fnfKNsI4KvHw=="], - - "@smithy/node-http-handler": ["@smithy/node-http-handler@4.4.4", "", { "dependencies": { "@smithy/abort-controller": "^4.2.4", "@smithy/protocol-http": "^5.3.4", "@smithy/querystring-builder": "^4.2.4", "@smithy/types": "^4.8.1", "tslib": "^2.6.2" } }, "sha512-VXHGfzCXLZeKnFp6QXjAdy+U8JF9etfpUXD1FAbzY1GzsFJiDQRQIt2CnMUvUdz3/YaHNqT3RphVWMUpXTIODA=="], - - "@smithy/property-provider": ["@smithy/property-provider@4.2.4", "", { "dependencies": { "@smithy/types": "^4.8.1", "tslib": "^2.6.2" } }, "sha512-g2DHo08IhxV5GdY3Cpt/jr0mkTlAD39EJKN27Jb5N8Fb5qt8KG39wVKTXiTRCmHHou7lbXR8nKVU14/aRUf86w=="], - - "@smithy/protocol-http": ["@smithy/protocol-http@5.3.4", "", { "dependencies": { "@smithy/types": "^4.8.1", "tslib": "^2.6.2" } }, "sha512-3sfFd2MAzVt0Q/klOmjFi3oIkxczHs0avbwrfn1aBqtc23WqQSmjvk77MBw9WkEQcwbOYIX5/2z4ULj8DuxSsw=="], - - "@smithy/querystring-builder": ["@smithy/querystring-builder@4.2.4", "", { "dependencies": { "@smithy/types": "^4.8.1", "@smithy/util-uri-escape": "^4.2.0", "tslib": "^2.6.2" } }, "sha512-KQ1gFXXC+WsbPFnk7pzskzOpn4s+KheWgO3dzkIEmnb6NskAIGp/dGdbKisTPJdtov28qNDohQrgDUKzXZBLig=="], - - "@smithy/querystring-parser": ["@smithy/querystring-parser@4.2.4", "", { "dependencies": { "@smithy/types": "^4.8.1", "tslib": "^2.6.2" } }, "sha512-aHb5cqXZocdzEkZ/CvhVjdw5l4r1aU/9iMEyoKzH4eXMowT6M0YjBpp7W/+XjkBnY8Xh0kVd55GKjnPKlCwinQ=="], - - "@smithy/service-error-classification": ["@smithy/service-error-classification@4.2.4", "", { "dependencies": { "@smithy/types": "^4.8.1" } }, "sha512-fdWuhEx4+jHLGeew9/IvqVU/fxT/ot70tpRGuOLxE3HzZOyKeTQfYeV1oaBXpzi93WOk668hjMuuagJ2/Qs7ng=="], - - "@smithy/shared-ini-file-loader": ["@smithy/shared-ini-file-loader@4.3.4", "", { "dependencies": { "@smithy/types": "^4.8.1", "tslib": "^2.6.2" } }, "sha512-y5ozxeQ9omVjbnJo9dtTsdXj9BEvGx2X8xvRgKnV+/7wLBuYJQL6dOa/qMY6omyHi7yjt1OA97jZLoVRYi8lxA=="], - - "@smithy/signature-v4": ["@smithy/signature-v4@5.3.4", "", { "dependencies": { "@smithy/is-array-buffer": "^4.2.0", "@smithy/protocol-http": "^5.3.4", "@smithy/types": "^4.8.1", "@smithy/util-hex-encoding": "^4.2.0", "@smithy/util-middleware": "^4.2.4", "@smithy/util-uri-escape": "^4.2.0", "@smithy/util-utf8": "^4.2.0", "tslib": "^2.6.2" } }, "sha512-ScDCpasxH7w1HXHYbtk3jcivjvdA1VICyAdgvVqKhKKwxi+MTwZEqFw0minE+oZ7F07oF25xh4FGJxgqgShz0A=="], - - "@smithy/smithy-client": ["@smithy/smithy-client@4.9.2", "", { "dependencies": { "@smithy/core": "^3.17.2", "@smithy/middleware-endpoint": "^4.3.6", "@smithy/middleware-stack": "^4.2.4", "@smithy/protocol-http": "^5.3.4", "@smithy/types": "^4.8.1", "@smithy/util-stream": "^4.5.5", "tslib": "^2.6.2" } }, "sha512-gZU4uAFcdrSi3io8U99Qs/FvVdRxPvIMToi+MFfsy/DN9UqtknJ1ais+2M9yR8e0ASQpNmFYEKeIKVcMjQg3rg=="], - - "@smithy/types": ["@smithy/types@4.8.1", "", { "dependencies": { "tslib": "^2.6.2" } }, "sha512-N0Zn0OT1zc+NA+UVfkYqQzviRh5ucWwO7mBV3TmHHprMnfcJNfhlPicDkBHi0ewbh+y3evR6cNAW0Raxvb01NA=="], - - "@smithy/url-parser": ["@smithy/url-parser@4.2.4", "", { "dependencies": { "@smithy/querystring-parser": "^4.2.4", "@smithy/types": "^4.8.1", "tslib": "^2.6.2" } }, "sha512-w/N/Iw0/PTwJ36PDqU9PzAwVElo4qXxCC0eCTlUtIz/Z5V/2j/cViMHi0hPukSBHp4DVwvUlUhLgCzqSJ6plrg=="], - - "@smithy/util-base64": ["@smithy/util-base64@4.3.0", "", { "dependencies": { "@smithy/util-buffer-from": "^4.2.0", "@smithy/util-utf8": "^4.2.0", "tslib": "^2.6.2" } }, "sha512-GkXZ59JfyxsIwNTWFnjmFEI8kZpRNIBfxKjv09+nkAWPt/4aGaEWMM04m4sxgNVWkbt2MdSvE3KF/PfX4nFedQ=="], - - "@smithy/util-body-length-browser": ["@smithy/util-body-length-browser@4.2.0", "", { "dependencies": { "tslib": "^2.6.2" } }, "sha512-Fkoh/I76szMKJnBXWPdFkQJl2r9SjPt3cMzLdOB6eJ4Pnpas8hVoWPYemX/peO0yrrvldgCUVJqOAjUrOLjbxg=="], - - "@smithy/util-body-length-node": ["@smithy/util-body-length-node@4.2.1", "", { "dependencies": { "tslib": "^2.6.2" } }, "sha512-h53dz/pISVrVrfxV1iqXlx5pRg3V2YWFcSQyPyXZRrZoZj4R4DeWRDo1a7dd3CPTcFi3kE+98tuNyD2axyZReA=="], - - "@smithy/util-buffer-from": ["@smithy/util-buffer-from@4.2.0", "", { "dependencies": { "@smithy/is-array-buffer": "^4.2.0", "tslib": "^2.6.2" } }, "sha512-kAY9hTKulTNevM2nlRtxAG2FQ3B2OR6QIrPY3zE5LqJy1oxzmgBGsHLWTcNhWXKchgA0WHW+mZkQrng/pgcCew=="], - - "@smithy/util-config-provider": ["@smithy/util-config-provider@4.2.0", "", { "dependencies": { "tslib": "^2.6.2" } }, "sha512-YEjpl6XJ36FTKmD+kRJJWYvrHeUvm5ykaUS5xK+6oXffQPHeEM4/nXlZPe+Wu0lsgRUcNZiliYNh/y7q9c2y6Q=="], - - "@smithy/util-defaults-mode-browser": ["@smithy/util-defaults-mode-browser@4.3.5", "", { "dependencies": { "@smithy/property-provider": "^4.2.4", "@smithy/smithy-client": "^4.9.2", "@smithy/types": "^4.8.1", "tslib": "^2.6.2" } }, "sha512-GwaGjv/QLuL/QHQaqhf/maM7+MnRFQQs7Bsl6FlaeK6lm6U7mV5AAnVabw68cIoMl5FQFyKK62u7RWRzWL25OQ=="], - - "@smithy/util-defaults-mode-node": ["@smithy/util-defaults-mode-node@4.2.8", "", { "dependencies": { "@smithy/config-resolver": "^4.4.2", "@smithy/credential-provider-imds": "^4.2.4", "@smithy/node-config-provider": "^4.3.4", "@smithy/property-provider": "^4.2.4", "@smithy/smithy-client": "^4.9.2", "@smithy/types": "^4.8.1", "tslib": "^2.6.2" } }, "sha512-gIoTf9V/nFSIZ0TtgDNLd+Ws59AJvijmMDYrOozoMHPJaG9cMRdqNO50jZTlbM6ydzQYY8L/mQ4tKSw/TB+s6g=="], - - "@smithy/util-endpoints": ["@smithy/util-endpoints@3.2.4", "", { "dependencies": { "@smithy/node-config-provider": "^4.3.4", "@smithy/types": "^4.8.1", "tslib": "^2.6.2" } }, "sha512-f+nBDhgYRCmUEDKEQb6q0aCcOTXRDqH5wWaFHJxt4anB4pKHlgGoYP3xtioKXH64e37ANUkzWf6p4Mnv1M5/Vg=="], - - "@smithy/util-hex-encoding": ["@smithy/util-hex-encoding@4.2.0", "", { "dependencies": { "tslib": "^2.6.2" } }, "sha512-CCQBwJIvXMLKxVbO88IukazJD9a4kQ9ZN7/UMGBjBcJYvatpWk+9g870El4cB8/EJxfe+k+y0GmR9CAzkF+Nbw=="], - - "@smithy/util-middleware": ["@smithy/util-middleware@4.2.4", "", { "dependencies": { "@smithy/types": "^4.8.1", "tslib": "^2.6.2" } }, "sha512-fKGQAPAn8sgV0plRikRVo6g6aR0KyKvgzNrPuM74RZKy/wWVzx3BMk+ZWEueyN3L5v5EDg+P582mKU+sH5OAsg=="], - - "@smithy/util-retry": ["@smithy/util-retry@4.2.4", "", { "dependencies": { "@smithy/service-error-classification": "^4.2.4", "@smithy/types": "^4.8.1", "tslib": "^2.6.2" } }, "sha512-yQncJmj4dtv/isTXxRb4AamZHy4QFr4ew8GxS6XLWt7sCIxkPxPzINWd7WLISEFPsIan14zrKgvyAF+/yzfwoA=="], - - "@smithy/util-stream": ["@smithy/util-stream@4.5.5", "", { "dependencies": { "@smithy/fetch-http-handler": "^5.3.5", "@smithy/node-http-handler": "^4.4.4", "@smithy/types": "^4.8.1", "@smithy/util-base64": "^4.3.0", "@smithy/util-buffer-from": "^4.2.0", "@smithy/util-hex-encoding": "^4.2.0", "@smithy/util-utf8": "^4.2.0", "tslib": "^2.6.2" } }, "sha512-7M5aVFjT+HPilPOKbOmQfCIPchZe4DSBc1wf1+NvHvSoFTiFtauZzT+onZvCj70xhXd0AEmYnZYmdJIuwxOo4w=="], + "@scalar/openapi-upgrader": ["@scalar/openapi-upgrader@0.1.8", "", { "dependencies": { "@scalar/openapi-types": "0.5.3" } }, "sha512-2xuYLLs0fBadLIk4I1ObjMiCnOyLPEMPf24A1HtHQvhKGDnGlvT63F2rU2Xw8lxCjgHnzveMPnOJEbwIy64RCg=="], - "@smithy/util-uri-escape": ["@smithy/util-uri-escape@4.2.0", "", { "dependencies": { "tslib": "^2.6.2" } }, "sha512-igZpCKV9+E/Mzrpq6YacdTQ0qTiLm85gD6N/IrmyDvQFA4UnU3d5g3m8tMT/6zG/vVkWSU+VxeUyGonL62DuxA=="], - - "@smithy/util-utf8": ["@smithy/util-utf8@4.2.0", "", { "dependencies": { "@smithy/util-buffer-from": "^4.2.0", "tslib": "^2.6.2" } }, "sha512-zBPfuzoI8xyBtR2P6WQj63Rz8i3AmfAaJLuNG8dWsfvPe8lO4aCPYLn879mEgHndZH1zQ2oXmG8O1GGzzaoZiw=="], - - "@smithy/uuid": ["@smithy/uuid@1.1.0", "", { "dependencies": { "tslib": "^2.6.2" } }, "sha512-4aUIteuyxtBUhVdiQqcDhKFitwfd9hqoSDYY2KRXiWtgoWJ9Bmise+KfEPDiVHWeJepvF8xJO9/9+WDIciMFFw=="], + "@scalar/types": ["@scalar/types@0.6.1", "", { "dependencies": { "@scalar/helpers": "0.2.10", "nanoid": "^5.1.6", "type-fest": "^5.3.1", "zod": "^4.3.5" } }, "sha512-2u/pZTauRLoUDD2PpJF8XDflZX3PgaYSD72cFDBL1WVM/jb0IxoWggxWKm34OR03LnNYbTvXlwfyr2QZ0hm3Xg=="], "@types/bcryptjs": ["@types/bcryptjs@3.0.0", "", { "dependencies": { "bcryptjs": "*" } }, "sha512-WRZOuCuaz8UcZZE4R5HXTco2goQSI2XxjGY3hbM/xDvwmqFWd4ivooImsMx65OKM6CtNKbnZ5YL+YwAwK7c1dg=="], - "@types/bun": ["@types/bun@1.3.1", "", { "dependencies": { "bun-types": "1.3.1" } }, "sha512-4jNMk2/K9YJtfqwoAa28c8wK+T7nvJFOjxI4h/7sORWcypRNxBpr+TPNaCfVWq70tLCJsqoFwcf0oI0JU/fvMQ=="], + "@types/bun": ["@types/bun@1.3.8", "", { "dependencies": { "bun-types": "1.3.8" } }, "sha512-3LvWJ2q5GerAXYxO2mffLTqOzEu5qnhEAlh48Vnu8WQfnmSwbgagjGZV6BoHKJztENYEDn6QmVd949W4uESRJA=="], "@types/crypto-js": ["@types/crypto-js@4.2.2", "", {}, "sha512-sDOLlVbHhXpAUAL0YHDUUwDZf3iN4Bwi4W6a0W0b+QcAezUbRtH4FVb+9J4h+XFPW7l/gQ9F8qC7P+Ec4k8QVQ=="], @@ -369,33 +220,31 @@ "@types/json-schema": ["@types/json-schema@7.0.15", "", {}, "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA=="], - "@types/node": ["@types/node@24.10.0", "", { "dependencies": { "undici-types": "~7.16.0" } }, "sha512-qzQZRBqkFsYyaSWXuEHc2WR9c0a0CXwiE5FWUvn7ZM+vdy1uZLfCunD38UzhuB7YN/J11ndbDBcTmOdxJo9Q7A=="], - - "@types/nodemailer": ["@types/nodemailer@7.0.3", "", { "dependencies": { "@aws-sdk/client-sesv2": "^3.839.0", "@types/node": "*" } }, "sha512-fC8w49YQ868IuPWRXqPfLf+MuTRex5Z1qxMoG8rr70riqqbOp2F5xgOKE9fODEBPzpnvjkJXFgK6IL2xgMSTnA=="], + "@types/node": ["@types/node@25.2.0", "", { "dependencies": { "undici-types": "~7.16.0" } }, "sha512-DZ8VwRFUNzuqJ5khrvwMXHmvPe+zGayJhr2CDNiKB1WBE1ST8Djl00D0IC4vvNmHMdj6DlbYRIaFE7WHjlDl5w=="], - "@types/pg": ["@types/pg@8.15.6", "", { "dependencies": { "@types/node": "*", "pg-protocol": "*", "pg-types": "^2.2.0" } }, "sha512-NoaMtzhxOrubeL/7UZuNTrejB4MPAJ0RpxZqXQf2qXuVlTPuG6Y8p4u9dKRaue4yjmC7ZhzVO2/Yyyn25znrPQ=="], + "@types/nodemailer": ["@types/nodemailer@7.0.9", "", { "dependencies": { "@types/node": "*" } }, "sha512-vI8oF1M+8JvQhsId0Pc38BdUP2evenIIys7c7p+9OZXSPOH5c1dyINP1jT8xQ2xPuBUXmIC87s+91IZMDjH8Ow=="], - "@types/react": ["@types/react@19.2.2", "", { "dependencies": { "csstype": "^3.0.2" } }, "sha512-6mDvHUFSjyT2B2yeNx2nUgMxh9LtOWvkhIU3uePn2I2oyNymUAX1NIsdgviM4CH+JSrp2D2hsMvJOkxY+0wNRA=="], + "@types/pg": ["@types/pg@8.16.0", "", { "dependencies": { "@types/node": "*", "pg-protocol": "*", "pg-types": "^2.2.0" } }, "sha512-RmhMd/wD+CF8Dfo+cVIy3RR5cl8CyfXQ0tGgW6XBL8L4LM/UTEbNXYRbLwU6w+CgrKBNbrQWt4FUtTfaU5jSYQ=="], - "@typescript-eslint/eslint-plugin": ["@typescript-eslint/eslint-plugin@8.46.3", "", { "dependencies": { "@eslint-community/regexpp": "^4.10.0", "@typescript-eslint/scope-manager": "8.46.3", "@typescript-eslint/type-utils": "8.46.3", "@typescript-eslint/utils": "8.46.3", "@typescript-eslint/visitor-keys": "8.46.3", "graphemer": "^1.4.0", "ignore": "^7.0.0", "natural-compare": "^1.4.0", "ts-api-utils": "^2.1.0" }, "peerDependencies": { "@typescript-eslint/parser": "^8.46.3", "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <6.0.0" } }, "sha512-sbaQ27XBUopBkRiuY/P9sWGOWUW4rl8fDoHIUmLpZd8uldsTyB4/Zg6bWTegPoTLnKj9Hqgn3QD6cjPNB32Odw=="], + "@typescript-eslint/eslint-plugin": ["@typescript-eslint/eslint-plugin@8.54.0", "", { "dependencies": { "@eslint-community/regexpp": "^4.12.2", "@typescript-eslint/scope-manager": "8.54.0", "@typescript-eslint/type-utils": "8.54.0", "@typescript-eslint/utils": "8.54.0", "@typescript-eslint/visitor-keys": "8.54.0", "ignore": "^7.0.5", "natural-compare": "^1.4.0", "ts-api-utils": "^2.4.0" }, "peerDependencies": { "@typescript-eslint/parser": "^8.54.0", "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <6.0.0" } }, "sha512-hAAP5io/7csFStuOmR782YmTthKBJ9ND3WVL60hcOjvtGFb+HJxH4O5huAcmcZ9v9G8P+JETiZ/G1B8MALnWZQ=="], - "@typescript-eslint/parser": ["@typescript-eslint/parser@8.46.3", "", { "dependencies": { "@typescript-eslint/scope-manager": "8.46.3", "@typescript-eslint/types": "8.46.3", "@typescript-eslint/typescript-estree": "8.46.3", "@typescript-eslint/visitor-keys": "8.46.3", "debug": "^4.3.4" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <6.0.0" } }, "sha512-6m1I5RmHBGTnUGS113G04DMu3CpSdxCAU/UvtjNWL4Nuf3MW9tQhiJqRlHzChIkhy6kZSAQmc+I1bcGjE3yNKg=="], + "@typescript-eslint/parser": ["@typescript-eslint/parser@8.54.0", "", { "dependencies": { "@typescript-eslint/scope-manager": "8.54.0", "@typescript-eslint/types": "8.54.0", "@typescript-eslint/typescript-estree": "8.54.0", "@typescript-eslint/visitor-keys": "8.54.0", "debug": "^4.4.3" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <6.0.0" } }, "sha512-BtE0k6cjwjLZoZixN0t5AKP0kSzlGu7FctRXYuPAm//aaiZhmfq1JwdYpYr1brzEspYyFeF+8XF5j2VK6oalrA=="], - "@typescript-eslint/project-service": ["@typescript-eslint/project-service@8.46.3", "", { "dependencies": { "@typescript-eslint/tsconfig-utils": "^8.46.3", "@typescript-eslint/types": "^8.46.3", "debug": "^4.3.4" }, "peerDependencies": { "typescript": ">=4.8.4 <6.0.0" } }, "sha512-Fz8yFXsp2wDFeUElO88S9n4w1I4CWDTXDqDr9gYvZgUpwXQqmZBr9+NTTql5R3J7+hrJZPdpiWaB9VNhAKYLuQ=="], + "@typescript-eslint/project-service": ["@typescript-eslint/project-service@8.54.0", "", { "dependencies": { "@typescript-eslint/tsconfig-utils": "^8.54.0", "@typescript-eslint/types": "^8.54.0", "debug": "^4.4.3" }, "peerDependencies": { "typescript": ">=4.8.4 <6.0.0" } }, "sha512-YPf+rvJ1s7MyiWM4uTRhE4DvBXrEV+d8oC3P9Y2eT7S+HBS0clybdMIPnhiATi9vZOYDc7OQ1L/i6ga6NFYK/g=="], - "@typescript-eslint/scope-manager": ["@typescript-eslint/scope-manager@8.46.3", "", { "dependencies": { "@typescript-eslint/types": "8.46.3", "@typescript-eslint/visitor-keys": "8.46.3" } }, "sha512-FCi7Y1zgrmxp3DfWfr+3m9ansUUFoy8dkEdeQSgA9gbm8DaHYvZCdkFRQrtKiedFf3Ha6VmoqoAaP68+i+22kg=="], + "@typescript-eslint/scope-manager": ["@typescript-eslint/scope-manager@8.54.0", "", { "dependencies": { "@typescript-eslint/types": "8.54.0", "@typescript-eslint/visitor-keys": "8.54.0" } }, "sha512-27rYVQku26j/PbHYcVfRPonmOlVI6gihHtXFbTdB5sb6qA0wdAQAbyXFVarQ5t4HRojIz64IV90YtsjQSSGlQg=="], - "@typescript-eslint/tsconfig-utils": ["@typescript-eslint/tsconfig-utils@8.46.3", "", { "peerDependencies": { "typescript": ">=4.8.4 <6.0.0" } }, "sha512-GLupljMniHNIROP0zE7nCcybptolcH8QZfXOpCfhQDAdwJ/ZTlcaBOYebSOZotpti/3HrHSw7D3PZm75gYFsOA=="], + "@typescript-eslint/tsconfig-utils": ["@typescript-eslint/tsconfig-utils@8.54.0", "", { "peerDependencies": { "typescript": ">=4.8.4 <6.0.0" } }, "sha512-dRgOyT2hPk/JwxNMZDsIXDgyl9axdJI3ogZ2XWhBPsnZUv+hPesa5iuhdYt2gzwA9t8RE5ytOJ6xB0moV0Ujvw=="], - "@typescript-eslint/type-utils": ["@typescript-eslint/type-utils@8.46.3", "", { "dependencies": { "@typescript-eslint/types": "8.46.3", "@typescript-eslint/typescript-estree": "8.46.3", "@typescript-eslint/utils": "8.46.3", "debug": "^4.3.4", "ts-api-utils": "^2.1.0" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <6.0.0" } }, "sha512-ZPCADbr+qfz3aiTTYNNkCbUt+cjNwI/5McyANNrFBpVxPt7GqpEYz5ZfdwuFyGUnJ9FdDXbGODUu6iRCI6XRXw=="], + "@typescript-eslint/type-utils": ["@typescript-eslint/type-utils@8.54.0", "", { "dependencies": { "@typescript-eslint/types": "8.54.0", "@typescript-eslint/typescript-estree": "8.54.0", "@typescript-eslint/utils": "8.54.0", "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-hiLguxJWHjjwL6xMBwD903ciAwd7DmK30Y9Axs/etOkftC3ZNN9K44IuRD/EB08amu+Zw6W37x9RecLkOo3pMA=="], - "@typescript-eslint/types": ["@typescript-eslint/types@8.46.3", "", {}, "sha512-G7Ok9WN/ggW7e/tOf8TQYMaxgID3Iujn231hfi0Pc7ZheztIJVpO44ekY00b7akqc6nZcvregk0Jpah3kep6hA=="], + "@typescript-eslint/types": ["@typescript-eslint/types@8.54.0", "", {}, "sha512-PDUI9R1BVjqu7AUDsRBbKMtwmjWcn4J3le+5LpcFgWULN3LvHC5rkc9gCVxbrsrGmO1jfPybN5s6h4Jy+OnkAA=="], - "@typescript-eslint/typescript-estree": ["@typescript-eslint/typescript-estree@8.46.3", "", { "dependencies": { "@typescript-eslint/project-service": "8.46.3", "@typescript-eslint/tsconfig-utils": "8.46.3", "@typescript-eslint/types": "8.46.3", "@typescript-eslint/visitor-keys": "8.46.3", "debug": "^4.3.4", "fast-glob": "^3.3.2", "is-glob": "^4.0.3", "minimatch": "^9.0.4", "semver": "^7.6.0", "ts-api-utils": "^2.1.0" }, "peerDependencies": { "typescript": ">=4.8.4 <6.0.0" } }, "sha512-f/NvtRjOm80BtNM5OQtlaBdM5BRFUv7gf381j9wygDNL+qOYSNOgtQ/DCndiYi80iIOv76QqaTmp4fa9hwI0OA=="], + "@typescript-eslint/typescript-estree": ["@typescript-eslint/typescript-estree@8.54.0", "", { "dependencies": { "@typescript-eslint/project-service": "8.54.0", "@typescript-eslint/tsconfig-utils": "8.54.0", "@typescript-eslint/types": "8.54.0", "@typescript-eslint/visitor-keys": "8.54.0", "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-BUwcskRaPvTk6fzVWgDPdUndLjB87KYDrN5EYGetnktoeAvPtO4ONHlAZDnj5VFnUANg0Sjm7j4usBlnoVMHwA=="], - "@typescript-eslint/utils": ["@typescript-eslint/utils@8.46.3", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.7.0", "@typescript-eslint/scope-manager": "8.46.3", "@typescript-eslint/types": "8.46.3", "@typescript-eslint/typescript-estree": "8.46.3" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <6.0.0" } }, "sha512-VXw7qmdkucEx9WkmR3ld/u6VhRyKeiF1uxWwCy/iuNfokjJ7VhsgLSOTjsol8BunSw190zABzpwdNsze2Kpo4g=="], + "@typescript-eslint/utils": ["@typescript-eslint/utils@8.54.0", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.9.1", "@typescript-eslint/scope-manager": "8.54.0", "@typescript-eslint/types": "8.54.0", "@typescript-eslint/typescript-estree": "8.54.0" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <6.0.0" } }, "sha512-9Cnda8GS57AQakvRyG0PTejJNlA2xhvyNtEVIMlDWOOeEyBkYWhGPnfrIAnqxLMTSTo6q8g12XVjjev5l1NvMA=="], - "@typescript-eslint/visitor-keys": ["@typescript-eslint/visitor-keys@8.46.3", "", { "dependencies": { "@typescript-eslint/types": "8.46.3", "eslint-visitor-keys": "^4.2.1" } }, "sha512-uk574k8IU0rOF/AjniX8qbLSGURJVUCeM5e4MIMKBFFi8weeiLrG1fyQejyLXQpRZbU/1BuQasleV/RfHC3hHg=="], + "@typescript-eslint/visitor-keys": ["@typescript-eslint/visitor-keys@8.54.0", "", { "dependencies": { "@typescript-eslint/types": "8.54.0", "eslint-visitor-keys": "^4.2.1" } }, "sha512-VFlhGSl4opC0bprJiItPQ1RfUhGDIBokcPwaFH4yiBCaNPeld/9VeXbiPO1cLyorQi1G1vL+ecBk1x8o1axORA=="], "abstract-logging": ["abstract-logging@2.0.1", "", {}, "sha512-2BjRTZxTPvheOvGbBslFSYOUkr+SjPtOnrLP33f+VIWLzezQpZcqVg7ja3L4dBXmzzgwT+a029jRx5PCi3JuiA=="], @@ -409,6 +258,8 @@ "ajv-formats": ["ajv-formats@3.0.1", "", { "dependencies": { "ajv": "^8.0.0" } }, "sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ=="], + "ansi-escapes": ["ansi-escapes@7.2.0", "", { "dependencies": { "environment": "^1.0.0" } }, "sha512-g6LhBsl+GBPRWGWsBtutpzBYuIIdBkLEvad5C/va/74Db018+5TZiyA26cZJAr3Rft5lprVqOIPxf5Vid6tqAw=="], + "ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="], "ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="], @@ -427,22 +278,24 @@ "bn.js": ["bn.js@4.12.2", "", {}, "sha512-n4DSx829VRTRByMRGdjQ9iqsN0Bh4OolPsFnaZBLcbi8iXcB+kJ9s7EnRt4wILZNV3kPLHkRVfOc/HvhC3ovDw=="], - "bowser": ["bowser@2.12.1", "", {}, "sha512-z4rE2Gxh7tvshQ4hluIT7XcFrgLIQaw9X3A+kTTRdovCz5PMukm/0QC/BKSYPj3omF5Qfypn9O/c5kgpmvYUCw=="], - "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=="], "buffer-from": ["buffer-from@1.1.2", "", {}, "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ=="], - "bullmq": ["bullmq@5.63.0", "", { "dependencies": { "cron-parser": "^4.9.0", "ioredis": "^5.4.1", "msgpackr": "^1.11.2", "node-abort-controller": "^3.1.1", "semver": "^7.5.4", "tslib": "^2.0.0", "uuid": "^11.1.0" } }, "sha512-HT1iM3Jt4bZeg3Ru/MxrOy2iIItxcl1Pz5Ync1Vrot70jBpVguMxFEiSaDU57BwYwR4iwnObDnzct2lirKkX5A=="], + "bullmq": ["bullmq@5.67.2", "", { "dependencies": { "cron-parser": "4.9.0", "ioredis": "5.9.2", "msgpackr": "1.11.5", "node-abort-controller": "3.1.1", "semver": "7.7.3", "tslib": "2.8.1", "uuid": "11.1.0" } }, "sha512-3KYqNqQptKcgksACO1li4YW9/jxEh6XWa1lUg4OFrHa80Pf0C7H9zeb6ssbQQDfQab/K3QCXopbZ40vrvcyrLw=="], - "bun-types": ["bun-types@1.3.1", "", { "dependencies": { "@types/node": "*" }, "peerDependencies": { "@types/react": "^19" } }, "sha512-NMrcy7smratanWJ2mMXdpatalovtxVggkj11bScuWuiOoXTiKIu2eVS1/7qbyI/4yHedtsn175n4Sm4JcdHLXw=="], + "bun-types": ["bun-types@1.3.8", "", { "dependencies": { "@types/node": "*" } }, "sha512-fL99nxdOWvV4LqjmC+8Q9kW3M4QTtTR1eePs94v5ctGqU8OeceWrSUaRw3JYb7tU3FkMIAjkueehrHPPPGKi5Q=="], "callsites": ["callsites@3.1.0", "", {}, "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ=="], "chalk": ["chalk@4.1.2", "", { "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA=="], + "cli-cursor": ["cli-cursor@5.0.0", "", { "dependencies": { "restore-cursor": "^5.0.0" } }, "sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw=="], + + "cli-truncate": ["cli-truncate@5.1.1", "", { "dependencies": { "slice-ansi": "^7.1.0", "string-width": "^8.0.0" } }, "sha512-SroPvNHxUnk+vIW/dOSfNqdy1sPEFkrTk6TUtqLCnBlo3N7TNYYkzzN7uSD6+jVjrdO4+p8nH7JzH6cIvUem6A=="], + "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=="], "cluster-key-slot": ["cluster-key-slot@1.1.2", "", {}, "sha512-RMr0FhtfXemyinomL4hrWcYJxmX6deFdCxpJzhDttxgO1+bcCnkk+9drydLVDmAMG7NE6aN/fl4F7ucU/90gAA=="], @@ -453,11 +306,13 @@ "colorette": ["colorette@2.0.20", "", {}, "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w=="], + "commander": ["commander@14.0.3", "", {}, "sha512-H+y0Jo/T1RZ9qPP4Eh1pkcQcLRglraJaSLoyOtHxu6AapkjWVCy2Sit1QQ4x3Dng8qDlSsZEet7g5Pq06MvTgw=="], + "concat-map": ["concat-map@0.0.1", "", {}, "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg=="], "concurrently": ["concurrently@9.2.1", "", { "dependencies": { "chalk": "4.1.2", "rxjs": "7.8.2", "shell-quote": "1.8.3", "supports-color": "8.1.1", "tree-kill": "1.2.2", "yargs": "17.7.2" }, "bin": { "conc": "dist/bin/concurrently.js", "concurrently": "dist/bin/concurrently.js" } }, "sha512-fsfrO0MxV64Znoy8/l1vVIjjHa29SZyyqPgQBwhiDcaW8wJc2W3XWVOGx4M3oJBnv/zdUZIIp1gDeS98GzP8Ng=="], - "cookie": ["cookie@1.0.2", "", {}, "sha512-9Kr/j4O16ISv8zBBhJoi4bXOYNTkFLOqSL3UDB0njXxCXNezjeyVrJyGOWtgfs/q2km1gwBcfH8q1yEGoMYunA=="], + "cookie": ["cookie@1.1.1", "", {}, "sha512-ei8Aos7ja0weRpFzJnEA9UHJ/7XQmqglbRwnf2ATjcB9Wq874VKH9kfjjirM6UhU2/E5fFYadylyhFldcqSidQ=="], "cron-parser": ["cron-parser@4.9.0", "", { "dependencies": { "luxon": "^3.2.1" } }, "sha512-p0SaNjrHOnQeR8/VnfGbmg9te2kfyYSQ7Sc/j/6DtPL3JQvKxmjO9TSjNFpujqV3vEYYBvNNvXSxzyksBWAx1Q=="], @@ -465,8 +320,6 @@ "crypto-js": ["crypto-js@4.2.0", "", {}, "sha512-KALDyEYgpY+Rlob/iriUtjV6d5Eq+Y191A5g4UqLAi8CyGP9N1+FdVbkc1SxKc2r4YAYqG8JzO2KGL+AizD70Q=="], - "csstype": ["csstype@3.1.3", "", {}, "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw=="], - "dateformat": ["dateformat@4.6.3", "", {}, "sha512-2P0p0pFGzHS5EMnhdxQi7aJN+iMheud0UhG4dlE1DLAlvL8JHjJJTX/CSm4JXwV0Ka5nGk3zC5mcb5bUQUxxMA=="], "dayjs": ["dayjs@1.11.19", "", {}, "sha512-t5EcLVS6QPBNqM2z8fakk/NKel+Xzshgt8FFKAn+qwlD1pzZWxh0nVCrvFK7ZDb6XucZeF9z8C7CBWTRIVApAw=="], @@ -483,9 +336,9 @@ "dotenv": ["dotenv@17.2.3", "", {}, "sha512-JVUnt+DUIzu87TABbhPmNfVdBDt18BLOWjMUFJMSi/Qqg7NTYtabbvSNJGOJ7afbRuv9D/lngizHtP7QyLQ+9w=="], - "drizzle-kit": ["drizzle-kit@0.31.6", "", { "dependencies": { "@drizzle-team/brocli": "^0.10.2", "@esbuild-kit/esm-loader": "^2.5.5", "esbuild": "^0.25.4", "esbuild-register": "^3.5.0" }, "bin": { "drizzle-kit": "bin.cjs" } }, "sha512-/B4e/4pwnx25QwD5xXgdpo1S+077a2VZdosXbItE/oNmUgQwZydGDz9qJYmnQl/b+5IX0rLfwRhrPnroGtrg8Q=="], + "drizzle-kit": ["drizzle-kit@0.31.8", "", { "dependencies": { "@drizzle-team/brocli": "^0.10.2", "@esbuild-kit/esm-loader": "^2.5.5", "esbuild": "^0.25.4", "esbuild-register": "^3.5.0" }, "bin": { "drizzle-kit": "bin.cjs" } }, "sha512-O9EC/miwdnRDY10qRxM8P3Pg8hXe3LyU4ZipReKOgTwn4OqANmftj8XJz1UPUAS6NMHf0E2htjsbQujUTkncCg=="], - "drizzle-orm": ["drizzle-orm@0.44.7", "", { "peerDependencies": { "@aws-sdk/client-rds-data": ">=3", "@cloudflare/workers-types": ">=4", "@electric-sql/pglite": ">=0.2.0", "@libsql/client": ">=0.10.0", "@libsql/client-wasm": ">=0.10.0", "@neondatabase/serverless": ">=0.10.0", "@op-engineering/op-sqlite": ">=2", "@opentelemetry/api": "^1.4.1", "@planetscale/database": ">=1.13", "@prisma/client": "*", "@tidbcloud/serverless": "*", "@types/better-sqlite3": "*", "@types/pg": "*", "@types/sql.js": "*", "@upstash/redis": ">=1.34.7", "@vercel/postgres": ">=0.8.0", "@xata.io/client": "*", "better-sqlite3": ">=7", "bun-types": "*", "expo-sqlite": ">=14.0.0", "gel": ">=2", "knex": "*", "kysely": "*", "mysql2": ">=2", "pg": ">=8", "postgres": ">=3", "sql.js": ">=1", "sqlite3": ">=5" }, "optionalPeers": ["@aws-sdk/client-rds-data", "@cloudflare/workers-types", "@electric-sql/pglite", "@libsql/client", "@libsql/client-wasm", "@neondatabase/serverless", "@op-engineering/op-sqlite", "@opentelemetry/api", "@planetscale/database", "@prisma/client", "@tidbcloud/serverless", "@types/better-sqlite3", "@types/pg", "@types/sql.js", "@upstash/redis", "@vercel/postgres", "@xata.io/client", "better-sqlite3", "bun-types", "expo-sqlite", "gel", "knex", "kysely", "mysql2", "pg", "postgres", "sql.js", "sqlite3"] }, "sha512-quIpnYznjU9lHshEOAYLoZ9s3jweleHlZIAWR/jX9gAWNg/JhQ1wj0KGRf7/Zm+obRrYd9GjPVJg790QY9N5AQ=="], + "drizzle-orm": ["drizzle-orm@0.45.1", "", { "peerDependencies": { "@aws-sdk/client-rds-data": ">=3", "@cloudflare/workers-types": ">=4", "@electric-sql/pglite": ">=0.2.0", "@libsql/client": ">=0.10.0", "@libsql/client-wasm": ">=0.10.0", "@neondatabase/serverless": ">=0.10.0", "@op-engineering/op-sqlite": ">=2", "@opentelemetry/api": "^1.4.1", "@planetscale/database": ">=1.13", "@prisma/client": "*", "@tidbcloud/serverless": "*", "@types/better-sqlite3": "*", "@types/pg": "*", "@types/sql.js": "*", "@upstash/redis": ">=1.34.7", "@vercel/postgres": ">=0.8.0", "@xata.io/client": "*", "better-sqlite3": ">=7", "bun-types": "*", "expo-sqlite": ">=14.0.0", "gel": ">=2", "knex": "*", "kysely": "*", "mysql2": ">=2", "pg": ">=8", "postgres": ">=3", "sql.js": ">=1", "sqlite3": ">=5" }, "optionalPeers": ["@aws-sdk/client-rds-data", "@cloudflare/workers-types", "@electric-sql/pglite", "@libsql/client", "@libsql/client-wasm", "@neondatabase/serverless", "@op-engineering/op-sqlite", "@opentelemetry/api", "@planetscale/database", "@prisma/client", "@tidbcloud/serverless", "@types/better-sqlite3", "@types/pg", "@types/sql.js", "@upstash/redis", "@vercel/postgres", "@xata.io/client", "better-sqlite3", "bun-types", "expo-sqlite", "gel", "knex", "kysely", "mysql2", "pg", "postgres", "sql.js", "sqlite3"] }, "sha512-Te0FOdKIistGNPMq2jscdqngBRfBpC8uMFVwqjf6gtTVJHIQ/dosgV/CLBU2N4ZJBsXL5savCba9b0YJskKdcA=="], "ecdsa-sig-formatter": ["ecdsa-sig-formatter@1.0.11", "", { "dependencies": { "safe-buffer": "^5.0.1" } }, "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ=="], @@ -495,6 +348,8 @@ "envalid": ["envalid@8.1.1", "", { "dependencies": { "tslib": "2.8.1" } }, "sha512-vOUfHxAFFvkBjbVQbBfgnCO9d3GcNfMMTtVfgqSU2rQGMFEVqWy9GBuoSfHnwGu7EqR0/GeukQcL3KjFBaga9w=="], + "environment": ["environment@1.1.0", "", {}, "sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q=="], + "esbuild": ["esbuild@0.25.12", "", { "optionalDependencies": { "@esbuild/aix-ppc64": "0.25.12", "@esbuild/android-arm": "0.25.12", "@esbuild/android-arm64": "0.25.12", "@esbuild/android-x64": "0.25.12", "@esbuild/darwin-arm64": "0.25.12", "@esbuild/darwin-x64": "0.25.12", "@esbuild/freebsd-arm64": "0.25.12", "@esbuild/freebsd-x64": "0.25.12", "@esbuild/linux-arm": "0.25.12", "@esbuild/linux-arm64": "0.25.12", "@esbuild/linux-ia32": "0.25.12", "@esbuild/linux-loong64": "0.25.12", "@esbuild/linux-mips64el": "0.25.12", "@esbuild/linux-ppc64": "0.25.12", "@esbuild/linux-riscv64": "0.25.12", "@esbuild/linux-s390x": "0.25.12", "@esbuild/linux-x64": "0.25.12", "@esbuild/netbsd-arm64": "0.25.12", "@esbuild/netbsd-x64": "0.25.12", "@esbuild/openbsd-arm64": "0.25.12", "@esbuild/openbsd-x64": "0.25.12", "@esbuild/openharmony-arm64": "0.25.12", "@esbuild/sunos-x64": "0.25.12", "@esbuild/win32-arm64": "0.25.12", "@esbuild/win32-ia32": "0.25.12", "@esbuild/win32-x64": "0.25.12" }, "bin": { "esbuild": "bin/esbuild" } }, "sha512-bbPBYYrtZbkt6Os6FiTLCTFxvq4tt3JKall1vRwshA3fdVztsLAatFaZobhkBC8/BrPetoa0oksYoKXoG4ryJg=="], "esbuild-register": ["esbuild-register@3.6.0", "", { "dependencies": { "debug": "^4.3.4" }, "peerDependencies": { "esbuild": ">=0.12 <1" } }, "sha512-H2/S7Pm8a9CL1uhp9OvjwrBh5Pvx0H8qVOxNu8Wed9Y7qv56MPtq+GGM8RJpq6glYJn9Wspr8uw7l55uyinNeg=="], @@ -503,11 +358,11 @@ "escape-string-regexp": ["escape-string-regexp@4.0.0", "", {}, "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA=="], - "eslint": ["eslint@9.39.1", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.8.0", "@eslint-community/regexpp": "^4.12.1", "@eslint/config-array": "^0.21.1", "@eslint/config-helpers": "^0.4.2", "@eslint/core": "^0.17.0", "@eslint/eslintrc": "^3.3.1", "@eslint/js": "9.39.1", "@eslint/plugin-kit": "^0.4.1", "@humanfs/node": "^0.16.6", "@humanwhocodes/module-importer": "^1.0.1", "@humanwhocodes/retry": "^0.4.2", "@types/estree": "^1.0.6", "ajv": "^6.12.4", "chalk": "^4.0.0", "cross-spawn": "^7.0.6", "debug": "^4.3.2", "escape-string-regexp": "^4.0.0", "eslint-scope": "^8.4.0", "eslint-visitor-keys": "^4.2.1", "espree": "^10.4.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", "json-stable-stringify-without-jsonify": "^1.0.1", "lodash.merge": "^4.6.2", "minimatch": "^3.1.2", "natural-compare": "^1.4.0", "optionator": "^0.9.3" }, "peerDependencies": { "jiti": "*" }, "optionalPeers": ["jiti"], "bin": { "eslint": "bin/eslint.js" } }, "sha512-BhHmn2yNOFA9H9JmmIVKJmd288g9hrVRDkdoIgRCRuSySRUHH7r/DI6aAXW9T1WwUuY3DFgrcaqB+deURBLR5g=="], + "eslint": ["eslint@9.39.2", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.8.0", "@eslint-community/regexpp": "^4.12.1", "@eslint/config-array": "^0.21.1", "@eslint/config-helpers": "^0.4.2", "@eslint/core": "^0.17.0", "@eslint/eslintrc": "^3.3.1", "@eslint/js": "9.39.2", "@eslint/plugin-kit": "^0.4.1", "@humanfs/node": "^0.16.6", "@humanwhocodes/module-importer": "^1.0.1", "@humanwhocodes/retry": "^0.4.2", "@types/estree": "^1.0.6", "ajv": "^6.12.4", "chalk": "^4.0.0", "cross-spawn": "^7.0.6", "debug": "^4.3.2", "escape-string-regexp": "^4.0.0", "eslint-scope": "^8.4.0", "eslint-visitor-keys": "^4.2.1", "espree": "^10.4.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", "json-stable-stringify-without-jsonify": "^1.0.1", "lodash.merge": "^4.6.2", "minimatch": "^3.1.2", "natural-compare": "^1.4.0", "optionator": "^0.9.3" }, "peerDependencies": { "jiti": "*" }, "optionalPeers": ["jiti"], "bin": { "eslint": "bin/eslint.js" } }, "sha512-LEyamqS7W5HB3ujJyvi0HQK/dtVINZvd5mAAp9eT5S/ujByGjiZLCzPcHVzuXbpJDJF/cxwHlfceVUDZ2lnSTw=="], - "eslint-config-prettier": ["eslint-config-prettier@9.1.2", "", { "peerDependencies": { "eslint": ">=7.0.0" }, "bin": { "eslint-config-prettier": "bin/cli.js" } }, "sha512-iI1f+D2ViGn+uvv5HuHVUamg8ll4tN+JRHGc6IJi4TP9Kl976C57fzPXgseXNs8v0iA8aSJpHsTWjDb9QJamGQ=="], + "eslint-config-prettier": ["eslint-config-prettier@10.1.8", "", { "peerDependencies": { "eslint": ">=7.0.0" }, "bin": { "eslint-config-prettier": "bin/cli.js" } }, "sha512-82GZUjRS0p/jganf6q1rEO25VSoHH0hKPCTrgillPjdI/3bgBhAE1QzHrHTizjpRvy6pGAvKjDJtk2pF9NDq8w=="], - "eslint-plugin-prettier": ["eslint-plugin-prettier@5.5.4", "", { "dependencies": { "prettier-linter-helpers": "^1.0.0", "synckit": "^0.11.7" }, "peerDependencies": { "@types/eslint": ">=8.0.0", "eslint": ">=8.0.0", "eslint-config-prettier": ">= 7.0.0 <10.0.0 || >=10.1.0", "prettier": ">=3.0.0" }, "optionalPeers": ["@types/eslint", "eslint-config-prettier"] }, "sha512-swNtI95SToIz05YINMA6Ox5R057IMAmWZ26GqPxusAp1TZzj+IdY9tXNWWD3vkF/wEqydCONcwjTFpxybBqZsg=="], + "eslint-plugin-prettier": ["eslint-plugin-prettier@5.5.5", "", { "dependencies": { "prettier-linter-helpers": "^1.0.1", "synckit": "^0.11.12" }, "peerDependencies": { "@types/eslint": ">=8.0.0", "eslint": ">=8.0.0", "eslint-config-prettier": ">= 7.0.0 <10.0.0 || >=10.1.0", "prettier": ">=3.0.0" }, "optionalPeers": ["@types/eslint", "eslint-config-prettier"] }, "sha512-hscXkbqUZ2sPithAuLm5MXL+Wph+U7wHngPBv9OMWwlP8iaflyxpjTYZkmdgB4/vPIhemRlBEoLrH7UC1n7aUw=="], "eslint-scope": ["eslint-scope@8.4.0", "", { "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^5.2.0" } }, "sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg=="], @@ -515,7 +370,7 @@ "espree": ["espree@10.4.0", "", { "dependencies": { "acorn": "^8.15.0", "acorn-jsx": "^5.3.2", "eslint-visitor-keys": "^4.2.1" } }, "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ=="], - "esquery": ["esquery@1.6.0", "", { "dependencies": { "estraverse": "^5.1.0" } }, "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg=="], + "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=="], @@ -523,7 +378,9 @@ "esutils": ["esutils@2.0.3", "", {}, "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g=="], - "fast-copy": ["fast-copy@3.0.2", "", {}, "sha512-dl0O9Vhju8IrcLndv2eU4ldt1ftXMqqfgN4H1cpmGV7P6jeB9FwpN9a2c8DPGE1Ys88rNUJVYDHq73CGAGOPfQ=="], + "eventemitter3": ["eventemitter3@5.0.4", "", {}, "sha512-mlsTRyGaPBjPedk6Bvw+aqbsXDtoAyAzm5MO7JgU+yVRyMQ5O8bD4Kcci7BS85f93veegeCPkL8R4GLClnjLFw=="], + + "fast-copy": ["fast-copy@4.0.2", "", {}, "sha512-ybA6PDXIXOXivLJK/z9e+Otk7ve13I4ckBvGO5I2RRmBU1gMHLVDJYEuJYhGwez7YNlYji2M2DvVU+a9mSFDlw=="], "fast-decode-uri-component": ["fast-decode-uri-component@1.0.1", "", {}, "sha512-WKgKWg5eUxvRZGwW8FvfbaH7AXSh2cL+3j5fMGzUMCxWBJ3dV3a7Wz8y2f/uQ0e3B6WmodD3oS54jTQ9HVTIIg=="], @@ -531,13 +388,11 @@ "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.1.1", "", { "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-DbgptncYEXZqDUOEl4krff4mUiVrTZZVI7BBrQR/T3BqMj/eM1flTC1Uk2uUoLcWCxjT95xKulV/Lc6hhOZsBQ=="], + "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-jwt": ["fast-jwt@6.0.2", "", { "dependencies": { "@lukeed/ms": "^2.0.2", "asn1.js": "^5.4.1", "ecdsa-sig-formatter": "^1.0.11", "mnemonist": "^0.40.0" } }, "sha512-dTF4bhYnuXhZYQUaxsHKqAyA5y/L/kQc4fUu0wQ0BSA0dMfcNrcv0aqR2YnVi4f7e1OnzDVU7sDsNdzl1O5EVA=="], + "fast-jwt": ["fast-jwt@6.1.0", "", { "dependencies": { "@lukeed/ms": "^2.0.2", "asn1.js": "^5.4.1", "ecdsa-sig-formatter": "^1.0.11", "mnemonist": "^0.40.0" } }, "sha512-cGK/TXlud8INL49Iv7yRtZy0PHzNJId1shfqNCqdF0gOlWiy+1FPgjxX+ZHp/CYxFYDaoNnxeYEGzcXSkahUEQ=="], "fast-levenshtein": ["fast-levenshtein@2.0.6", "", {}, "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw=="], @@ -547,11 +402,9 @@ "fast-uri": ["fast-uri@3.1.0", "", {}, "sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA=="], - "fast-xml-parser": ["fast-xml-parser@5.2.5", "", { "dependencies": { "strnum": "^2.1.0" }, "bin": { "fxparser": "src/cli/cli.js" } }, "sha512-pfX9uG9Ki0yekDHx2SiuRIyFdyAr1kMIMitPvb0YBo8SUfKvia7w7FIyd/l6av85pFYRhZscS75MwMnbvY+hcQ=="], - "fastfall": ["fastfall@1.5.1", "", { "dependencies": { "reusify": "^1.0.0" } }, "sha512-KH6p+Z8AKPXnmA7+Iz2Lh8ARCMr+8WNPVludm1LGkZoD2MjY6LVnRMtTKhkdzI+jr0RzQWXKzKyBJm1zoHEL4Q=="], - "fastify": ["fastify@5.6.1", "", { "dependencies": { "@fastify/ajv-compiler": "^4.0.0", "@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": "^9.0.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-WjjlOciBF0K8pDUPZoGPhqhKrQJ02I8DKaDIfO51EL0kbSMwQFl85cRwhOvmSDWoukNOdTo27gLN549pLCcH7Q=="], + "fastify": ["fastify@5.7.4", "", { "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-e6l5NsRdaEP8rdD8VR0ErJASeyaRbzXYpmkrpr2SuvuMq6Si3lvsaVy5C+7gLanEkvjpMDzBXWE5HPeb/hgTxA=="], "fastify-plugin": ["fastify-plugin@5.1.0", "", {}, "sha512-FAIDA8eovSt5qcDgcBvDuX/v0Cjz0ohGhENZ/wpc3y+oZCY2afZ9Baqql3g/lC+OHRnciQol4ww7tuthOb9idw=="], @@ -559,15 +412,17 @@ "fastparallel": ["fastparallel@2.4.1", "", { "dependencies": { "reusify": "^1.0.4", "xtend": "^4.0.2" } }, "sha512-qUmhxPgNHmvRjZKBFUNI0oZuuH9OlSIOXmJ98lhKPxMZZ7zS/Fi0wRHOihDSz0R1YiIOjxzOY4bq65YTcdBi2Q=="], - "fastq": ["fastq@1.19.1", "", { "dependencies": { "reusify": "^1.0.4" } }, "sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ=="], + "fastq": ["fastq@1.20.1", "", { "dependencies": { "reusify": "^1.0.4" } }, "sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw=="], "fastseries": ["fastseries@1.7.2", "", { "dependencies": { "reusify": "^1.0.0", "xtend": "^4.0.0" } }, "sha512-dTPFrPGS8SNSzAt7u/CbMKCJ3s01N04s4JFbORHcmyvVfVKmbhMD1VtRbh5enGHxkaQDqWyLefiKOGGmohGDDQ=="], + "fdir": ["fdir@6.5.0", "", { "peerDependencies": { "picomatch": "^3 || ^4" }, "optionalPeers": ["picomatch"] }, "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg=="], + "file-entry-cache": ["file-entry-cache@8.0.0", "", { "dependencies": { "flat-cache": "^4.0.0" } }, "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ=="], "fill-range": ["fill-range@7.1.1", "", { "dependencies": { "to-regex-range": "^5.0.1" } }, "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg=="], - "find-my-way": ["find-my-way@9.3.0", "", { "dependencies": { "fast-deep-equal": "^3.1.3", "fast-querystring": "^1.0.0", "safe-regex2": "^5.0.0" } }, "sha512-eRoFWQw+Yv2tuYlK2pjFS2jGXSxSppAs3hSQjfxVKxM5amECzIgYYc1FEI8ZmhSh/Ig+FrKEz43NLRKJjYCZVg=="], + "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=="], @@ -579,7 +434,9 @@ "get-caller-file": ["get-caller-file@2.0.5", "", {}, "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg=="], - "get-tsconfig": ["get-tsconfig@4.13.0", "", { "dependencies": { "resolve-pkg-maps": "^1.0.0" } }, "sha512-1VKTZJCwBrvbd+Wn3AOgQP/2Av+TfTCOlE4AcRJE72W1ksZXbAx8PPBR9RzgTeSPzlPMHrbANMH3LbltH73wxQ=="], + "get-east-asian-width": ["get-east-asian-width@1.4.0", "", {}, "sha512-QZjmEOC+IT1uk6Rx0sX22V6uHWVwbdbxf1faPqJ1QhLdGgsRGCZoyaQBm/piRdJy/D2um6hM1UP7ZEeQ4EkP+Q=="], + + "get-tsconfig": ["get-tsconfig@4.13.1", "", { "dependencies": { "resolve-pkg-maps": "^1.0.0" } }, "sha512-EoY1N2xCn44xU6750Sx7OjOIT59FkmstNc3X6y5xpz7D5cBtZRe/3pSlTkDJgqsOk3WwZPkWfonhhUJfttQo3w=="], "github-slugger": ["github-slugger@2.0.0", "", {}, "sha512-IaOQ9puYtjrkq7Y0Ygl9KDZnrf/aiUJYUpVf89y8kyaxbRG7Y1SrX/jaumrv81vc61+kiMempujsM3Yw7w5qcw=="], @@ -587,8 +444,6 @@ "globals": ["globals@14.0.0", "", {}, "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ=="], - "graphemer": ["graphemer@1.4.0", "", {}, "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag=="], - "has-flag": ["has-flag@4.0.0", "", {}, "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="], "helmet": ["helmet@8.1.0", "", {}, "sha512-jOiHyAZsmnr8LqoPGmCjYAaiuWwjAPLgY8ZX2XrmHawt99/u1y6RgrZMTeoPfpUbV96HOalYgz1qzkRbw54Pmg=="], @@ -605,9 +460,9 @@ "inherits": ["inherits@2.0.4", "", {}, "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="], - "ioredis": ["ioredis@5.8.2", "", { "dependencies": { "@ioredis/commands": "1.4.0", "cluster-key-slot": "^1.1.0", "debug": "^4.3.4", "denque": "^2.1.0", "lodash.defaults": "^4.2.0", "lodash.isarguments": "^3.1.0", "redis-errors": "^1.2.0", "redis-parser": "^3.0.0", "standard-as-callback": "^2.1.0" } }, "sha512-C6uC+kleiIMmjViJINWk80sOQw5lEzse1ZmvD+S/s8p8CWapftSaC+kocGTx6xrbrJ4WmYQGC08ffHLr6ToR6Q=="], + "ioredis": ["ioredis@5.9.2", "", { "dependencies": { "@ioredis/commands": "1.5.0", "cluster-key-slot": "^1.1.0", "debug": "^4.3.4", "denque": "^2.1.0", "lodash.defaults": "^4.2.0", "lodash.isarguments": "^3.1.0", "redis-errors": "^1.2.0", "redis-parser": "^3.0.0", "standard-as-callback": "^2.1.0" } }, "sha512-tAAg/72/VxOUW7RQSX1pIxJVucYKcjFjfvj60L57jrZpYCHC3XN0WCQ3sNYL4Gmvv+7GPvTAjc+KSdeNuE8oWQ=="], - "ipaddr.js": ["ipaddr.js@2.2.0", "", {}, "sha512-Ag3wB2o37wslZS19hZqorUnrnzSkpOVy+IiiDEiTqNubEYpYuHWIf6K4psgN2ZWKExS4xhVCrRVfb/wfW8fWJA=="], + "ipaddr.js": ["ipaddr.js@2.3.0", "", {}, "sha512-Zv/pA+ciVFbCSBBjGfaKUya/CcGmUHzTydLMaTwrUUEM2DIEO3iZvueGxmacvmN50fGpGVKeTXpb2LcYQxeVdg=="], "is-extglob": ["is-extglob@2.1.1", "", {}, "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ=="], @@ -621,7 +476,7 @@ "joycon": ["joycon@3.1.1", "", {}, "sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw=="], - "js-yaml": ["js-yaml@4.1.0", "", { "dependencies": { "argparse": "^2.0.1" }, "bin": { "js-yaml": "bin/js-yaml.js" } }, "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA=="], + "js-yaml": ["js-yaml@4.1.1", "", { "dependencies": { "argparse": "^2.0.1" }, "bin": { "js-yaml": "bin/js-yaml.js" } }, "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA=="], "json-buffer": ["json-buffer@3.0.1", "", {}, "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ=="], @@ -643,6 +498,10 @@ "light-my-request": ["light-my-request@6.6.0", "", { "dependencies": { "cookie": "^1.0.1", "process-warning": "^4.0.0", "set-cookie-parser": "^2.6.0" } }, "sha512-CHYbu8RtboSIoVsHZ6Ye4cj4Aw/yg2oAFimlF7mNvfDV192LR7nDiKtSIfCuLT7KokPSTn/9kfVLm5OGN0A28A=="], + "lint-staged": ["lint-staged@16.2.7", "", { "dependencies": { "commander": "^14.0.2", "listr2": "^9.0.5", "micromatch": "^4.0.8", "nano-spawn": "^2.0.0", "pidtree": "^0.6.0", "string-argv": "^0.3.2", "yaml": "^2.8.1" }, "bin": { "lint-staged": "bin/lint-staged.js" } }, "sha512-lDIj4RnYmK7/kXMya+qJsmkRFkGolciXjrsZ6PC25GdTfWOAWetR0ZbsNXRAj1EHHImRSalc+whZFg56F5DVow=="], + + "listr2": ["listr2@9.0.5", "", { "dependencies": { "cli-truncate": "^5.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-ME4Fb83LgEgwNw96RKNvKV4VTLuXfoKudAmm2lP8Kk87KaMK0/Xrx/aAkMWmT8mDb+3MlFDspfbCs7adjRxA2g=="], + "locate-path": ["locate-path@6.0.0", "", { "dependencies": { "p-locate": "^5.0.0" } }, "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw=="], "lodash.defaults": ["lodash.defaults@4.2.0", "", {}, "sha512-qjxPLHd3r5DnsdGacqOMU6pb/avJzdh9tFX2ymgoZE27BmjXrNy/y4LoaiTeAb+O3gL8AfpJGtqfX/ae2leYYQ=="], @@ -651,12 +510,14 @@ "lodash.merge": ["lodash.merge@4.6.2", "", {}, "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ=="], - "luxon": ["luxon@3.7.2", "", {}, "sha512-vtEhXh/gNjI9Yg1u4jX/0YVPMvxzHuGgCm6tC5kZyb08yjGWGnqAjGJvcXbqQR2P3MyMEFnRbpcdFS6PBcLqew=="], + "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=="], - "merge2": ["merge2@1.4.1", "", {}, "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg=="], + "luxon": ["luxon@3.7.2", "", {}, "sha512-vtEhXh/gNjI9Yg1u4jX/0YVPMvxzHuGgCm6tC5kZyb08yjGWGnqAjGJvcXbqQR2P3MyMEFnRbpcdFS6PBcLqew=="], "micromatch": ["micromatch@4.0.8", "", { "dependencies": { "braces": "^3.0.3", "picomatch": "^2.3.1" } }, "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA=="], + "mimic-function": ["mimic-function@5.0.1", "", {}, "sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA=="], + "minimalistic-assert": ["minimalistic-assert@1.0.1", "", {}, "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A=="], "minimatch": ["minimatch@3.1.2", "", { "dependencies": { "brace-expansion": "^1.1.7" } }, "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw=="], @@ -671,7 +532,9 @@ "msgpackr-extract": ["msgpackr-extract@3.0.3", "", { "dependencies": { "node-gyp-build-optional-packages": "5.2.2" }, "optionalDependencies": { "@msgpackr-extract/msgpackr-extract-darwin-arm64": "3.0.3", "@msgpackr-extract/msgpackr-extract-darwin-x64": "3.0.3", "@msgpackr-extract/msgpackr-extract-linux-arm": "3.0.3", "@msgpackr-extract/msgpackr-extract-linux-arm64": "3.0.3", "@msgpackr-extract/msgpackr-extract-linux-x64": "3.0.3", "@msgpackr-extract/msgpackr-extract-win32-x64": "3.0.3" }, "bin": { "download-msgpackr-prebuilds": "bin/download-prebuilds.js" } }, "sha512-P0efT1C9jIdVRefqjzOQ9Xml57zpOXnIuS+csaB4MdZbTdmGDLo8XhzBG1N7aO11gKDDkJvBLULeFTo46wwreA=="], - "nanoid": ["nanoid@5.1.5", "", { "bin": { "nanoid": "bin/nanoid.js" } }, "sha512-Ir/+ZpE9fDsNH0hQ3C68uyThDXzYcim2EqcZ8zn8Chtt1iylPT9xXJB0kPCnqzgcEGikO9RxSrh63MsmVCU7Fw=="], + "nano-spawn": ["nano-spawn@2.0.0", "", {}, "sha512-tacvGzUY5o2D8CBh2rrwxyNojUsZNU2zjNTzKQrkgGJQTbGAfArVWXSKMBokBeeg6C7OLRGUEyoFlYbfeWQIqw=="], + + "nanoid": ["nanoid@5.1.6", "", { "bin": { "nanoid": "bin/nanoid.js" } }, "sha512-c7+7RQ+dMB5dPwwCp4ee1/iV/q2P6aK1mTZcfr1BTuVlyW9hJYiMPybJCcnBlQtuSmTIWNeazm/zqNoZSSElBg=="], "natural-compare": ["natural-compare@1.4.0", "", {}, "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw=="], @@ -679,7 +542,7 @@ "node-gyp-build-optional-packages": ["node-gyp-build-optional-packages@5.2.2", "", { "dependencies": { "detect-libc": "^2.0.1" }, "bin": { "node-gyp-build-optional-packages": "bin.js", "node-gyp-build-optional-packages-optional": "optional.js", "node-gyp-build-optional-packages-test": "build-test.js" } }, "sha512-s+w+rBWnpTMwSFbaE0UXsRlg7hU4FjekKU4eyAih5T8nJuNZT1nNsskXpxmeqSK9UzkBl6UgRlnKc8hz8IEqOw=="], - "nodemailer": ["nodemailer@7.0.10", "", {}, "sha512-Us/Se1WtT0ylXgNFfyFSx4LElllVLJXQjWi2Xz17xWw7amDKO2MLtFnVp1WACy7GkVGs+oBlRopVNUzlrGSw1w=="], + "nodemailer": ["nodemailer@7.0.13", "", {}, "sha512-PNDFSJdP+KFgdsG3ZzMXCgquO7I6McjY2vlqILjtJd0hy8wEvtugS9xKRF2NWlPNGxvLCXlTNIae4serI7dinw=="], "obliterator": ["obliterator@2.0.5", "", {}, "sha512-42CPE9AhahZRsMNslczq0ctAEtqk8Eka26QofnqC346BZdHDySk3LWka23LI7ULIw11NmltpiLagIq8gBozxTw=="], @@ -687,6 +550,8 @@ "once": ["once@1.4.0", "", { "dependencies": { "wrappy": "1" } }, "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w=="], + "onetime": ["onetime@7.0.0", "", { "dependencies": { "mimic-function": "^5.0.0" } }, "sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ=="], + "openapi-types": ["openapi-types@12.1.3", "", {}, "sha512-N4YtSYJqghVu4iek2ZUvcN/0aqH1kRDuNqzcycDxhOUpg7GdvLa2F3DgS6yBNhInhv2r/6I0Flkn7CqL8+nIcw=="], "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=="], @@ -701,17 +566,17 @@ "path-key": ["path-key@3.1.1", "", {}, "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q=="], - "pg": ["pg@8.16.3", "", { "dependencies": { "pg-connection-string": "^2.9.1", "pg-pool": "^3.10.1", "pg-protocol": "^1.10.3", "pg-types": "2.2.0", "pgpass": "1.0.5" }, "optionalDependencies": { "pg-cloudflare": "^1.2.7" }, "peerDependencies": { "pg-native": ">=3.0.1" }, "optionalPeers": ["pg-native"] }, "sha512-enxc1h0jA/aq5oSDMvqyW3q89ra6XIIDZgCX9vkMrnz5DFTw/Ny3Li2lFQ+pt3L6MCgm/5o2o8HW9hiJji+xvw=="], + "pg": ["pg@8.18.0", "", { "dependencies": { "pg-connection-string": "^2.11.0", "pg-pool": "^3.11.0", "pg-protocol": "^1.11.0", "pg-types": "2.2.0", "pgpass": "1.0.5" }, "optionalDependencies": { "pg-cloudflare": "^1.3.0" }, "peerDependencies": { "pg-native": ">=3.0.1" }, "optionalPeers": ["pg-native"] }, "sha512-xqrUDL1b9MbkydY/s+VZ6v+xiMUmOUk7SS9d/1kpyQxoJ6U9AO1oIJyUWVZojbfe5Cc/oluutcgFG4L9RDP1iQ=="], - "pg-cloudflare": ["pg-cloudflare@1.2.7", "", {}, "sha512-YgCtzMH0ptvZJslLM1ffsY4EuGaU0cx4XSdXLRFae8bPP4dS5xL1tNB3k2o/N64cHJpwU7dxKli/nZ2lUa5fLg=="], + "pg-cloudflare": ["pg-cloudflare@1.3.0", "", {}, "sha512-6lswVVSztmHiRtD6I8hw4qP/nDm1EJbKMRhf3HCYaqud7frGysPv7FYJ5noZQdhQtN2xJnimfMtvQq21pdbzyQ=="], - "pg-connection-string": ["pg-connection-string@2.9.1", "", {}, "sha512-nkc6NpDcvPVpZXxrreI/FOtX3XemeLl8E0qFr6F2Lrm/I8WOnaWNhIPK2Z7OHpw7gh5XJThi6j6ppgNoaT1w4w=="], + "pg-connection-string": ["pg-connection-string@2.11.0", "", {}, "sha512-kecgoJwhOpxYU21rZjULrmrBJ698U2RxXofKVzOn5UDj61BPj/qMb7diYUR1nLScCDbrztQFl1TaQZT0t1EtzQ=="], "pg-int8": ["pg-int8@1.0.1", "", {}, "sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw=="], - "pg-pool": ["pg-pool@3.10.1", "", { "peerDependencies": { "pg": ">=8.0" } }, "sha512-Tu8jMlcX+9d8+QVzKIvM/uJtp07PKr82IUOYEphaWcoBhIYkoHpLXN3qO59nAI11ripznDsEzEv8nUxBVWajGg=="], + "pg-pool": ["pg-pool@3.11.0", "", { "peerDependencies": { "pg": ">=8.0" } }, "sha512-MJYfvHwtGp870aeusDh+hg9apvOe2zmpZJpyt+BMtzUWlVqbhFmMK6bOBXLBUPd7iRtIF9fZplDc7KrPN3PN7w=="], - "pg-protocol": ["pg-protocol@1.10.3", "", {}, "sha512-6DIBgBQaTKDJyxnXaLiLR8wBpQQcGWuAESkRBX/t6OwA8YsqP+iVSiond2EDy6Y/dsGk8rh/jtax3js5NeV7JQ=="], + "pg-protocol": ["pg-protocol@1.11.0", "", {}, "sha512-pfsxk2M9M3BuGgDOfuy37VNRRX3jmKgMjcvAcWqNDpZSf4cUmv8HSOl5ViRQFsfARFn0KuUQTgLxVMbNq5NW3g=="], "pg-types": ["pg-types@2.2.0", "", { "dependencies": { "pg-int8": "1.0.1", "postgres-array": "~2.0.0", "postgres-bytea": "~1.0.0", "postgres-date": "~1.0.4", "postgres-interval": "^1.1.0" } }, "sha512-qTAAlrEsl8s4OiEQY69wDvcMIdQN6wdz5ojQiOy6YRMuynxenON0O5oCpJI6lshc6scgAY8qvJ2On/p+CXY0GA=="], @@ -719,17 +584,19 @@ "picomatch": ["picomatch@2.3.1", "", {}, "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA=="], - "pino": ["pino@10.1.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-0zZC2ygfdqvqK8zJIr1e+wT1T/L+LF6qvqvbzEQ6tiMAoTqEVK9a1K3YRu8HEUvGEvNqZyPJTtb2sNIoTkB83w=="], + "pidtree": ["pidtree@0.6.0", "", { "bin": { "pidtree": "bin/pidtree.js" } }, "sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g=="], - "pino-abstract-transport": ["pino-abstract-transport@2.0.0", "", { "dependencies": { "split2": "^4.0.0" } }, "sha512-F63x5tizV6WCh4R6RHyi2Ml+M70DNRXt/+HANowMflpgGFMAym/VKm6G7ZOQRjqN7XbGxK1Lg9t6ZrtzOaivMw=="], + "pino": ["pino@10.3.0", "", { "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-0GNPNzHXBKw6U/InGe79A3Crzyk9bcSyObF9/Gfo9DLEf5qj5RF50RSjsu0W1rZ6ZqRGdzDFCRBQvi9/rSGPtA=="], - "pino-pretty": ["pino-pretty@13.1.2", "", { "dependencies": { "colorette": "^2.0.7", "dateformat": "^4.6.3", "fast-copy": "^3.0.2", "fast-safe-stringify": "^2.1.1", "help-me": "^5.0.0", "joycon": "^3.1.1", "minimist": "^1.2.6", "on-exit-leak-free": "^2.1.0", "pino-abstract-transport": "^2.0.0", "pump": "^3.0.0", "secure-json-parse": "^4.0.0", "sonic-boom": "^4.0.1", "strip-json-comments": "^5.0.2" }, "bin": { "pino-pretty": "bin.js" } }, "sha512-3cN0tCakkT4f3zo9RXDIhy6GTvtYD6bK4CRBLN9j3E/ePqN1tugAXD5rGVfoChW6s0hiek+eyYlLNqc/BG7vBQ=="], + "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.0.0", "", {}, "sha512-e906FRY0+tV27iq4juKzSYPbUj2do2X2JX4EzSca1631EB2QJQUqGbDuERal7LCtOpxl6x3+nvo9NPZcmjkiFA=="], + "pino-pretty": ["pino-pretty@13.1.3", "", { "dependencies": { "colorette": "^2.0.7", "dateformat": "^4.6.3", "fast-copy": "^4.0.0", "fast-safe-stringify": "^2.1.1", "help-me": "^5.0.0", "joycon": "^3.1.1", "minimist": "^1.2.6", "on-exit-leak-free": "^2.1.0", "pino-abstract-transport": "^3.0.0", "pump": "^3.0.0", "secure-json-parse": "^4.0.0", "sonic-boom": "^4.0.1", "strip-json-comments": "^5.0.2" }, "bin": { "pino-pretty": "bin.js" } }, "sha512-ttXRkkOz6WWC95KeY9+xxWL6AtImwbyMHrL1mSwqwW9u+vLp/WIElvHvCSDg0xO/Dzrggz1zv3rN5ovTRVowKg=="], + + "pino-std-serializers": ["pino-std-serializers@7.1.0", "", {}, "sha512-BndPH67/JxGExRgiX1dX0w1FvZck5Wa4aal9198SrRhZjH3GxKQUKIBnYJTdj2HDN3UQAS06HlfcSbQj2OHmaw=="], "postgres-array": ["postgres-array@2.0.0", "", {}, "sha512-VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA=="], - "postgres-bytea": ["postgres-bytea@1.0.0", "", {}, "sha512-xy3pmLuQqRBZBXDULy7KbaitYqLcmxigw14Q5sj8QBVLqEwXfeybIKVWiqAXTlcvdvb0+xkOtDbfQMOf4lST1w=="], + "postgres-bytea": ["postgres-bytea@1.0.1", "", {}, "sha512-5+5HqXnsZPE65IJZSMkZtURARZelel2oXUEO8rH83VS/hxH5vv1uHquPg5wZs8yMAfdv971IU+kcPUczi7NVBQ=="], "postgres-date": ["postgres-date@1.0.7", "", {}, "sha512-suDmjLVQg78nMK2UZ454hAG+OAW+HQPZ6n++TNDUX+L0+uUlLywnoxJKDou51Zm+zTCjrCl0Nq6J9C5hP9vK/Q=="], @@ -737,9 +604,9 @@ "prelude-ls": ["prelude-ls@1.2.1", "", {}, "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g=="], - "prettier": ["prettier@3.6.2", "", { "bin": { "prettier": "bin/prettier.cjs" } }, "sha512-I7AIg5boAr5R0FFtJ6rCfD+LFsWHp81dolrFD8S79U9tb8Az2nGrJncnMSnys+bpQJfRUzqs9hnA81OAA3hCuQ=="], + "prettier": ["prettier@3.8.1", "", { "bin": { "prettier": "bin/prettier.cjs" } }, "sha512-UOnG6LftzbdaHZcKoPFtOcCKztrQ57WkHDeRD9t/PTQtmT0NHSeWWepj6pS0z/N7+08BHFDQVUrfmfMRcZwbMg=="], - "prettier-linter-helpers": ["prettier-linter-helpers@1.0.0", "", { "dependencies": { "fast-diff": "^1.1.2" } }, "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w=="], + "prettier-linter-helpers": ["prettier-linter-helpers@1.0.1", "", { "dependencies": { "fast-diff": "^1.1.2" } }, "sha512-SxToR7P8Y2lWmv/kTzVLC1t/GDI2WGjMwNhLLE9qtH8Q13C+aEmuRlzDst4Up4s0Wc8sF2M+J57iB3cMLqftfg=="], "process-warning": ["process-warning@5.0.0", "", {}, "sha512-a39t9ApHNx2L4+HBnQKqxxHNs1r7KF+Intd8Q/g1bUh6q0WIp9voPXJ/x0j+ZL45KF1pJd9+q2jLIRMfvEshkA=="], @@ -747,8 +614,6 @@ "punycode": ["punycode@2.3.1", "", {}, "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg=="], - "queue-microtask": ["queue-microtask@1.2.3", "", {}, "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A=="], - "quick-format-unescaped": ["quick-format-unescaped@4.0.4", "", {}, "sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg=="], "real-require": ["real-require@0.2.0", "", {}, "sha512-57frrGM/OCTLqLOAh0mhVA9VBMHd+9U7Zb2THMGdBUoZVOtGbJzjxsYGDJ3A9AYYCP4hn6y1TVbaOfzWtm5GFg=="], @@ -767,14 +632,14 @@ "resolve-pkg-maps": ["resolve-pkg-maps@1.0.0", "", {}, "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw=="], + "restore-cursor": ["restore-cursor@5.1.0", "", { "dependencies": { "onetime": "^7.0.0", "signal-exit": "^4.1.0" } }, "sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA=="], + "ret": ["ret@0.5.0", "", {}, "sha512-I1XxrZSQ+oErkRR4jYbAyEEu2I0avBvvMM5JN+6EBprOGRCs63ENqZ3vjavq8fBw2+62G5LF5XelKwuJpcvcxw=="], "reusify": ["reusify@1.1.0", "", {}, "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw=="], "rfdc": ["rfdc@1.4.1", "", {}, "sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA=="], - "run-parallel": ["run-parallel@1.2.0", "", { "dependencies": { "queue-microtask": "^1.2.2" } }, "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA=="], - "rxjs": ["rxjs@7.8.2", "", { "dependencies": { "tslib": "^2.1.0" } }, "sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA=="], "safe-buffer": ["safe-buffer@5.2.1", "", {}, "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ=="], @@ -797,6 +662,10 @@ "shell-quote": ["shell-quote@1.8.3", "", {}, "sha512-ObmnIF4hXNg1BqhnHmgbDETF8dLPCggZWBjkQfhZpbszZnYur5DUljTcCHii5LC3J5E0yeO/1LIMyH+UvHQgyw=="], + "signal-exit": ["signal-exit@4.1.0", "", {}, "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw=="], + + "slice-ansi": ["slice-ansi@7.1.2", "", { "dependencies": { "ansi-styles": "^6.2.1", "is-fullwidth-code-point": "^5.0.0" } }, "sha512-iOBWFgUX7caIZiuutICxVgX1SdxwAVFFKwt1EvMYYec/NWO5meOJ6K5uQxhrYBdQJne4KxiqZc+KptFOWFSI9w=="], + "sonic-boom": ["sonic-boom@4.2.0", "", { "dependencies": { "atomic-sleep": "^1.0.0" } }, "sha512-INb7TM37/mAcsGmc9hyyI6+QR3rR1zVRu36B0NeGXKnOOLiZOfER5SA+N7X7k3yUYRzLWafduTDvJAfDswwEww=="], "source-map": ["source-map@0.6.1", "", {}, "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="], @@ -809,21 +678,23 @@ "steed": ["steed@1.1.3", "", { "dependencies": { "fastfall": "^1.5.0", "fastparallel": "^2.2.0", "fastq": "^1.3.0", "fastseries": "^1.7.0", "reusify": "^1.0.0" } }, "sha512-EUkci0FAUiE4IvGTSKcDJIQ/eRUP2JJb56+fvZ4sdnguLTqIdKjSxUe138poW8mkvKWXW2sFPrgTsxqoISnmoA=="], + "string-argv": ["string-argv@0.3.2", "", {}, "sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q=="], + "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=="], "strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], "strip-json-comments": ["strip-json-comments@5.0.3", "", {}, "sha512-1tB5mhVo7U+ETBKNf92xT4hrQa3pm0MZ0PQvuDnWgAAGHDsfp4lPSpiS6psrSiet87wyGPh9ft6wmhOMQ0hDiw=="], - "strnum": ["strnum@2.1.1", "", {}, "sha512-7ZvoFTiCnGxBtDqJ//Cu6fWtZtc7Y3x+QOirG15wztbdngGSkht27o2pyGWrVy0b4WAy3jbKmnoK6g5VlVNUUw=="], - "supports-color": ["supports-color@8.1.1", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q=="], - "synckit": ["synckit@0.11.11", "", { "dependencies": { "@pkgr/core": "^0.2.9" } }, "sha512-MeQTA1r0litLUf0Rp/iisCaL8761lKAZHaimlbGK4j0HysC4PLfqygQj9srcs0m2RdtDYnF8UuYyKpbjHYp7Jw=="], + "synckit": ["synckit@0.11.12", "", { "dependencies": { "@pkgr/core": "^0.2.9" } }, "sha512-Bh7QjT8/SuKUIfObSXNHNSK6WHo6J1tHCqJsuaFDP7gP0fkzSfTxI8y85JrppZ0h8l0maIgc2tfuZQ6/t3GtnQ=="], "tagged-tag": ["tagged-tag@1.0.0", "", {}, "sha512-yEFYrVhod+hdNyx7g5Bnkkb0G6si8HJurOoOEgC8B/O0uXLHlaey/65KRv6cuWBNhBgHKAROVpc7QyYqE5gFng=="], - "thread-stream": ["thread-stream@3.1.0", "", { "dependencies": { "real-require": "^0.2.0" } }, "sha512-OqyPZ9u96VohAyMfJykzmivOrY2wfMSf3C5TtFJVgN+Hm6aj+voFhlK+kZEIv2FBh1X6Xp3DlnCOfEQ3B2J86A=="], + "thread-stream": ["thread-stream@4.0.0", "", { "dependencies": { "real-require": "^0.2.0" } }, "sha512-4iMVL6HAINXWf1ZKZjIPcz5wYaOdPhtO8ATvZ+Xqp3BTdaqtAwQkNmKORqcIo5YkQqGXq5cwfswDwMqqQNrpJA=="], + + "tinyglobby": ["tinyglobby@0.2.15", "", { "dependencies": { "fdir": "^6.5.0", "picomatch": "^4.0.3" } }, "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ=="], "to-regex-range": ["to-regex-range@5.0.1", "", { "dependencies": { "is-number": "^7.0.0" } }, "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ=="], @@ -831,21 +702,21 @@ "tree-kill": ["tree-kill@1.2.2", "", { "bin": { "tree-kill": "cli.js" } }, "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A=="], - "ts-api-utils": ["ts-api-utils@2.1.0", "", { "peerDependencies": { "typescript": ">=4.8.4" } }, "sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ=="], + "ts-api-utils": ["ts-api-utils@2.4.0", "", { "peerDependencies": { "typescript": ">=4.8.4" } }, "sha512-3TaVTaAv2gTiMB35i3FiGJaRfwb3Pyn/j3m/bfAvGe8FB7CF6u+LMYqYlDh7reQf7UNvoTvdfAqHGmPGOSsPmA=="], "tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], - "tsx": ["tsx@4.20.6", "", { "dependencies": { "esbuild": "~0.25.0", "get-tsconfig": "^4.7.5" }, "optionalDependencies": { "fsevents": "~2.3.3" }, "bin": { "tsx": "dist/cli.mjs" } }, "sha512-ytQKuwgmrrkDTFP4LjR0ToE2nqgy886GpvRSpU0JAnrdBYppuY5rLkRUYPU1yCryb24SsKBTL/hlDQAEFVwtZg=="], + "tsx": ["tsx@4.21.0", "", { "dependencies": { "esbuild": "~0.27.0", "get-tsconfig": "^4.7.5" }, "optionalDependencies": { "fsevents": "~2.3.3" }, "bin": { "tsx": "dist/cli.mjs" } }, "sha512-5C1sg4USs1lfG0GFb2RLXsdpXqBSEhAaA/0kPL01wxzpMqLILNxIxIOKiILz+cdg/pLnOUxFYOR5yhHU666wbw=="], "tsyringe": ["tsyringe@4.10.0", "", { "dependencies": { "tslib": "^1.9.3" } }, "sha512-axr3IdNuVIxnaK5XGEUFTu3YmAQ6lllgrvqfEoR16g/HGnYY/6We4oWENtAnzK6/LpJ2ur9PAb80RBt7/U4ugw=="], "type-check": ["type-check@0.4.0", "", { "dependencies": { "prelude-ls": "^1.2.1" } }, "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew=="], - "type-fest": ["type-fest@5.0.0", "", { "dependencies": { "tagged-tag": "^1.0.0" } }, "sha512-GeJop7+u7BYlQ6yQCAY1nBQiRSHR+6OdCEtd8Bwp9a3NK3+fWAVjOaPKJDteB9f6cIJ0wt4IfnScjLG450EpXA=="], + "type-fest": ["type-fest@5.4.3", "", { "dependencies": { "tagged-tag": "^1.0.0" } }, "sha512-AXSAQJu79WGc79/3e9/CR77I/KQgeY1AhNvcShIH4PTcGYyC4xv6H4R4AUOwkPS5799KlVDAu8zExeCrkGquiA=="], "typescript": ["typescript@5.9.3", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw=="], - "typescript-eslint": ["typescript-eslint@8.46.3", "", { "dependencies": { "@typescript-eslint/eslint-plugin": "8.46.3", "@typescript-eslint/parser": "8.46.3", "@typescript-eslint/typescript-estree": "8.46.3", "@typescript-eslint/utils": "8.46.3" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <6.0.0" } }, "sha512-bAfgMavTuGo+8n6/QQDVQz4tZ4f7Soqg53RbrlZQEoAltYop/XR4RAts/I0BrO3TTClTSTFJ0wYbla+P8cEWJA=="], + "typescript-eslint": ["typescript-eslint@8.54.0", "", { "dependencies": { "@typescript-eslint/eslint-plugin": "8.54.0", "@typescript-eslint/parser": "8.54.0", "@typescript-eslint/typescript-estree": "8.54.0", "@typescript-eslint/utils": "8.54.0" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <6.0.0" } }, "sha512-CKsJ+g53QpsNPqbzUsfKVgd3Lny4yKZ1pP4qN3jdMOg/sisIDLGyDMezycquXLE5JsEU0wp3dGNdzig0/fmSVQ=="], "undici-types": ["undici-types@7.16.0", "", {}, "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw=="], @@ -857,7 +728,7 @@ "word-wrap": ["word-wrap@1.2.5", "", {}, "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA=="], - "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=="], + "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=="], "wrappy": ["wrappy@1.0.2", "", {}, "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ=="], @@ -873,11 +744,7 @@ "yocto-queue": ["yocto-queue@0.1.0", "", {}, "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q=="], - "zod": ["zod@4.3.5", "", {}, "sha512-k7Nwx6vuWx1IJ9Bjuf4Zt1PEllcwe7cls3VNzm4CQ1/hgtFUK2bRNG3rvnpPUhFjmqJKAKtjV576KnUkHocg/g=="], - - "@aws-crypto/sha256-browser/@smithy/util-utf8": ["@smithy/util-utf8@2.3.0", "", { "dependencies": { "@smithy/util-buffer-from": "^2.2.0", "tslib": "^2.6.2" } }, "sha512-R8Rdn8Hy72KKcebgLiv8jQcQkXoLMOGGv5uI1/k0l+snqkOzQ1R0ChUBCxWMlBsFMekWjq0wRudIweFs7sKT5A=="], - - "@aws-crypto/util/@smithy/util-utf8": ["@smithy/util-utf8@2.3.0", "", { "dependencies": { "@smithy/util-buffer-from": "^2.2.0", "tslib": "^2.6.2" } }, "sha512-R8Rdn8Hy72KKcebgLiv8jQcQkXoLMOGGv5uI1/k0l+snqkOzQ1R0ChUBCxWMlBsFMekWjq0wRudIweFs7sKT5A=="], + "zod": ["zod@4.3.6", "", {}, "sha512-rftlrkhHZOcjDwkGlnUtZZkvaPHCsDATp4pGpuOOMDaTdDDXF91wuVDJoWoPsKX/3YPQ5fHuF3STjcYyKr+Qhg=="], "@esbuild-kit/core-utils/esbuild": ["esbuild@0.18.20", "", { "optionalDependencies": { "@esbuild/android-arm": "0.18.20", "@esbuild/android-arm64": "0.18.20", "@esbuild/android-x64": "0.18.20", "@esbuild/darwin-arm64": "0.18.20", "@esbuild/darwin-x64": "0.18.20", "@esbuild/freebsd-arm64": "0.18.20", "@esbuild/freebsd-x64": "0.18.20", "@esbuild/linux-arm": "0.18.20", "@esbuild/linux-arm64": "0.18.20", "@esbuild/linux-ia32": "0.18.20", "@esbuild/linux-loong64": "0.18.20", "@esbuild/linux-mips64el": "0.18.20", "@esbuild/linux-ppc64": "0.18.20", "@esbuild/linux-riscv64": "0.18.20", "@esbuild/linux-s390x": "0.18.20", "@esbuild/linux-x64": "0.18.20", "@esbuild/netbsd-x64": "0.18.20", "@esbuild/openbsd-x64": "0.18.20", "@esbuild/sunos-x64": "0.18.20", "@esbuild/win32-arm64": "0.18.20", "@esbuild/win32-ia32": "0.18.20", "@esbuild/win32-x64": "0.18.20" }, "bin": { "esbuild": "bin/esbuild" } }, "sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA=="], @@ -895,21 +762,35 @@ "chalk/supports-color": ["supports-color@7.2.0", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw=="], + "cli-truncate/string-width": ["string-width@8.1.1", "", { "dependencies": { "get-east-asian-width": "^1.3.0", "strip-ansi": "^7.1.0" } }, "sha512-KpqHIdDL9KwYk22wEOg/VIqYbrnLeSApsKT/bSj6Ez7pn3CftUiLAv2Lccpq1ALcpLV9UX1Ppn92npZWu2w/aw=="], + + "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=="], + "eslint/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=="], "eslint/ignore": ["ignore@5.3.2", "", {}, "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g=="], - "fast-glob/glob-parent": ["glob-parent@5.1.2", "", { "dependencies": { "is-glob": "^4.0.1" } }, "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow=="], - - "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=="], + "fdir/picomatch": ["picomatch@4.0.3", "", {}, "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q=="], "light-my-request/process-warning": ["process-warning@4.0.1", "", {}, "sha512-3c2LzQ3rY9d0hc1emcsHhfT9Jwz0cChib/QN89oME2R451w5fy3f0afAhERFZAwrbDU43wk12d0ORBpDVME50Q=="], + "log-update/strip-ansi": ["strip-ansi@7.1.2", "", { "dependencies": { "ansi-regex": "^6.0.1" } }, "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA=="], + + "slice-ansi/ansi-styles": ["ansi-styles@6.2.3", "", {}, "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg=="], + + "slice-ansi/is-fullwidth-code-point": ["is-fullwidth-code-point@5.1.0", "", { "dependencies": { "get-east-asian-width": "^1.3.1" } }, "sha512-5XHYaSyiqADb4RnZ1Bdad6cPp8Toise4TzEjcOYDHZkTCbKgiUl7WTUCpNWHuxmDt91wnsZBc9xinNzopv3JMQ=="], + + "tinyglobby/picomatch": ["picomatch@4.0.3", "", {}, "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q=="], + + "tsx/esbuild": ["esbuild@0.27.2", "", { "optionalDependencies": { "@esbuild/aix-ppc64": "0.27.2", "@esbuild/android-arm": "0.27.2", "@esbuild/android-arm64": "0.27.2", "@esbuild/android-x64": "0.27.2", "@esbuild/darwin-arm64": "0.27.2", "@esbuild/darwin-x64": "0.27.2", "@esbuild/freebsd-arm64": "0.27.2", "@esbuild/freebsd-x64": "0.27.2", "@esbuild/linux-arm": "0.27.2", "@esbuild/linux-arm64": "0.27.2", "@esbuild/linux-ia32": "0.27.2", "@esbuild/linux-loong64": "0.27.2", "@esbuild/linux-mips64el": "0.27.2", "@esbuild/linux-ppc64": "0.27.2", "@esbuild/linux-riscv64": "0.27.2", "@esbuild/linux-s390x": "0.27.2", "@esbuild/linux-x64": "0.27.2", "@esbuild/netbsd-arm64": "0.27.2", "@esbuild/netbsd-x64": "0.27.2", "@esbuild/openbsd-arm64": "0.27.2", "@esbuild/openbsd-x64": "0.27.2", "@esbuild/openharmony-arm64": "0.27.2", "@esbuild/sunos-x64": "0.27.2", "@esbuild/win32-arm64": "0.27.2", "@esbuild/win32-ia32": "0.27.2", "@esbuild/win32-x64": "0.27.2" }, "bin": { "esbuild": "bin/esbuild" } }, "sha512-HyNQImnsOC7X9PMNaCIeAm4ISCQXs5a5YasTXVliKv4uuBo1dKrG0A+uQS8M5eXjVMnLg3WgXaKvprHlFJQffw=="], + "tsyringe/tslib": ["tslib@1.14.1", "", {}, "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg=="], - "@aws-crypto/sha256-browser/@smithy/util-utf8/@smithy/util-buffer-from": ["@smithy/util-buffer-from@2.2.0", "", { "dependencies": { "@smithy/is-array-buffer": "^2.2.0", "tslib": "^2.6.2" } }, "sha512-IJdWBbTcMQ6DA0gdNhh/BwrLkDR+ADW5Kr1aZmd4k3DIF6ezMV4R2NIAmT08wQJ3yUK82thHWmC/TnK/wpMMIA=="], + "wrap-ansi/ansi-styles": ["ansi-styles@6.2.3", "", {}, "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg=="], + + "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=="], - "@aws-crypto/util/@smithy/util-utf8/@smithy/util-buffer-from": ["@smithy/util-buffer-from@2.2.0", "", { "dependencies": { "@smithy/is-array-buffer": "^2.2.0", "tslib": "^2.6.2" } }, "sha512-IJdWBbTcMQ6DA0gdNhh/BwrLkDR+ADW5Kr1aZmd4k3DIF6ezMV4R2NIAmT08wQJ3yUK82thHWmC/TnK/wpMMIA=="], + "wrap-ansi/strip-ansi": ["strip-ansi@7.1.2", "", { "dependencies": { "ansi-regex": "^6.0.1" } }, "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA=="], "@esbuild-kit/core-utils/esbuild/@esbuild/android-arm": ["@esbuild/android-arm@0.18.20", "", { "os": "android", "cpu": "arm" }, "sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw=="], @@ -959,10 +840,68 @@ "@typescript-eslint/typescript-estree/minimatch/brace-expansion": ["brace-expansion@2.0.2", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ=="], + "cli-truncate/string-width/strip-ansi": ["strip-ansi@7.1.2", "", { "dependencies": { "ansi-regex": "^6.0.1" } }, "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA=="], + "eslint/ajv/json-schema-traverse": ["json-schema-traverse@0.4.1", "", {}, "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg=="], - "@aws-crypto/sha256-browser/@smithy/util-utf8/@smithy/util-buffer-from/@smithy/is-array-buffer": ["@smithy/is-array-buffer@2.2.0", "", { "dependencies": { "tslib": "^2.6.2" } }, "sha512-GGP3O9QFD24uGeAXYUjwSTXARoqpZykHadOmA8G5vfJPK0/DC67qa//0qvqrJzL1xc8WQWX7/yc7fwudjPHPhA=="], + "log-update/strip-ansi/ansi-regex": ["ansi-regex@6.2.2", "", {}, "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg=="], + + "tsx/esbuild/@esbuild/aix-ppc64": ["@esbuild/aix-ppc64@0.27.2", "", { "os": "aix", "cpu": "ppc64" }, "sha512-GZMB+a0mOMZs4MpDbj8RJp4cw+w1WV5NYD6xzgvzUJ5Ek2jerwfO2eADyI6ExDSUED+1X8aMbegahsJi+8mgpw=="], + + "tsx/esbuild/@esbuild/android-arm": ["@esbuild/android-arm@0.27.2", "", { "os": "android", "cpu": "arm" }, "sha512-DVNI8jlPa7Ujbr1yjU2PfUSRtAUZPG9I1RwW4F4xFB1Imiu2on0ADiI/c3td+KmDtVKNbi+nffGDQMfcIMkwIA=="], + + "tsx/esbuild/@esbuild/android-arm64": ["@esbuild/android-arm64@0.27.2", "", { "os": "android", "cpu": "arm64" }, "sha512-pvz8ZZ7ot/RBphf8fv60ljmaoydPU12VuXHImtAs0XhLLw+EXBi2BLe3OYSBslR4rryHvweW5gmkKFwTiFy6KA=="], + + "tsx/esbuild/@esbuild/android-x64": ["@esbuild/android-x64@0.27.2", "", { "os": "android", "cpu": "x64" }, "sha512-z8Ank4Byh4TJJOh4wpz8g2vDy75zFL0TlZlkUkEwYXuPSgX8yzep596n6mT7905kA9uHZsf/o2OJZubl2l3M7A=="], + + "tsx/esbuild/@esbuild/darwin-arm64": ["@esbuild/darwin-arm64@0.27.2", "", { "os": "darwin", "cpu": "arm64" }, "sha512-davCD2Zc80nzDVRwXTcQP/28fiJbcOwvdolL0sOiOsbwBa72kegmVU0Wrh1MYrbuCL98Omp5dVhQFWRKR2ZAlg=="], + + "tsx/esbuild/@esbuild/darwin-x64": ["@esbuild/darwin-x64@0.27.2", "", { "os": "darwin", "cpu": "x64" }, "sha512-ZxtijOmlQCBWGwbVmwOF/UCzuGIbUkqB1faQRf5akQmxRJ1ujusWsb3CVfk/9iZKr2L5SMU5wPBi1UWbvL+VQA=="], + + "tsx/esbuild/@esbuild/freebsd-arm64": ["@esbuild/freebsd-arm64@0.27.2", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-lS/9CN+rgqQ9czogxlMcBMGd+l8Q3Nj1MFQwBZJyoEKI50XGxwuzznYdwcav6lpOGv5BqaZXqvBSiB/kJ5op+g=="], + + "tsx/esbuild/@esbuild/freebsd-x64": ["@esbuild/freebsd-x64@0.27.2", "", { "os": "freebsd", "cpu": "x64" }, "sha512-tAfqtNYb4YgPnJlEFu4c212HYjQWSO/w/h/lQaBK7RbwGIkBOuNKQI9tqWzx7Wtp7bTPaGC6MJvWI608P3wXYA=="], + + "tsx/esbuild/@esbuild/linux-arm": ["@esbuild/linux-arm@0.27.2", "", { "os": "linux", "cpu": "arm" }, "sha512-vWfq4GaIMP9AIe4yj1ZUW18RDhx6EPQKjwe7n8BbIecFtCQG4CfHGaHuh7fdfq+y3LIA2vGS/o9ZBGVxIDi9hw=="], + + "tsx/esbuild/@esbuild/linux-arm64": ["@esbuild/linux-arm64@0.27.2", "", { "os": "linux", "cpu": "arm64" }, "sha512-hYxN8pr66NsCCiRFkHUAsxylNOcAQaxSSkHMMjcpx0si13t1LHFphxJZUiGwojB1a/Hd5OiPIqDdXONia6bhTw=="], + + "tsx/esbuild/@esbuild/linux-ia32": ["@esbuild/linux-ia32@0.27.2", "", { "os": "linux", "cpu": "ia32" }, "sha512-MJt5BRRSScPDwG2hLelYhAAKh9imjHK5+NE/tvnRLbIqUWa+0E9N4WNMjmp/kXXPHZGqPLxggwVhz7QP8CTR8w=="], + + "tsx/esbuild/@esbuild/linux-loong64": ["@esbuild/linux-loong64@0.27.2", "", { "os": "linux", "cpu": "none" }, "sha512-lugyF1atnAT463aO6KPshVCJK5NgRnU4yb3FUumyVz+cGvZbontBgzeGFO1nF+dPueHD367a2ZXe1NtUkAjOtg=="], + + "tsx/esbuild/@esbuild/linux-mips64el": ["@esbuild/linux-mips64el@0.27.2", "", { "os": "linux", "cpu": "none" }, "sha512-nlP2I6ArEBewvJ2gjrrkESEZkB5mIoaTswuqNFRv/WYd+ATtUpe9Y09RnJvgvdag7he0OWgEZWhviS1OTOKixw=="], + + "tsx/esbuild/@esbuild/linux-ppc64": ["@esbuild/linux-ppc64@0.27.2", "", { "os": "linux", "cpu": "ppc64" }, "sha512-C92gnpey7tUQONqg1n6dKVbx3vphKtTHJaNG2Ok9lGwbZil6DrfyecMsp9CrmXGQJmZ7iiVXvvZH6Ml5hL6XdQ=="], + + "tsx/esbuild/@esbuild/linux-riscv64": ["@esbuild/linux-riscv64@0.27.2", "", { "os": "linux", "cpu": "none" }, "sha512-B5BOmojNtUyN8AXlK0QJyvjEZkWwy/FKvakkTDCziX95AowLZKR6aCDhG7LeF7uMCXEJqwa8Bejz5LTPYm8AvA=="], + + "tsx/esbuild/@esbuild/linux-s390x": ["@esbuild/linux-s390x@0.27.2", "", { "os": "linux", "cpu": "s390x" }, "sha512-p4bm9+wsPwup5Z8f4EpfN63qNagQ47Ua2znaqGH6bqLlmJ4bx97Y9JdqxgGZ6Y8xVTixUnEkoKSHcpRlDnNr5w=="], + + "tsx/esbuild/@esbuild/linux-x64": ["@esbuild/linux-x64@0.27.2", "", { "os": "linux", "cpu": "x64" }, "sha512-uwp2Tip5aPmH+NRUwTcfLb+W32WXjpFejTIOWZFw/v7/KnpCDKG66u4DLcurQpiYTiYwQ9B7KOeMJvLCu/OvbA=="], + + "tsx/esbuild/@esbuild/netbsd-arm64": ["@esbuild/netbsd-arm64@0.27.2", "", { "os": "none", "cpu": "arm64" }, "sha512-Kj6DiBlwXrPsCRDeRvGAUb/LNrBASrfqAIok+xB0LxK8CHqxZ037viF13ugfsIpePH93mX7xfJp97cyDuTZ3cw=="], + + "tsx/esbuild/@esbuild/netbsd-x64": ["@esbuild/netbsd-x64@0.27.2", "", { "os": "none", "cpu": "x64" }, "sha512-HwGDZ0VLVBY3Y+Nw0JexZy9o/nUAWq9MlV7cahpaXKW6TOzfVno3y3/M8Ga8u8Yr7GldLOov27xiCnqRZf0tCA=="], + + "tsx/esbuild/@esbuild/openbsd-arm64": ["@esbuild/openbsd-arm64@0.27.2", "", { "os": "openbsd", "cpu": "arm64" }, "sha512-DNIHH2BPQ5551A7oSHD0CKbwIA/Ox7+78/AWkbS5QoRzaqlev2uFayfSxq68EkonB+IKjiuxBFoV8ESJy8bOHA=="], + + "tsx/esbuild/@esbuild/openbsd-x64": ["@esbuild/openbsd-x64@0.27.2", "", { "os": "openbsd", "cpu": "x64" }, "sha512-/it7w9Nb7+0KFIzjalNJVR5bOzA9Vay+yIPLVHfIQYG/j+j9VTH84aNB8ExGKPU4AzfaEvN9/V4HV+F+vo8OEg=="], + + "tsx/esbuild/@esbuild/openharmony-arm64": ["@esbuild/openharmony-arm64@0.27.2", "", { "os": "none", "cpu": "arm64" }, "sha512-LRBbCmiU51IXfeXk59csuX/aSaToeG7w48nMwA6049Y4J4+VbWALAuXcs+qcD04rHDuSCSRKdmY63sruDS5qag=="], + + "tsx/esbuild/@esbuild/sunos-x64": ["@esbuild/sunos-x64@0.27.2", "", { "os": "sunos", "cpu": "x64" }, "sha512-kMtx1yqJHTmqaqHPAzKCAkDaKsffmXkPHThSfRwZGyuqyIeBvf08KSsYXl+abf5HDAPMJIPnbBfXvP2ZC2TfHg=="], + + "tsx/esbuild/@esbuild/win32-arm64": ["@esbuild/win32-arm64@0.27.2", "", { "os": "win32", "cpu": "arm64" }, "sha512-Yaf78O/B3Kkh+nKABUF++bvJv5Ijoy9AN1ww904rOXZFLWVc5OLOfL56W+C8F9xn5JQZa3UX6m+IktJnIb1Jjg=="], + + "tsx/esbuild/@esbuild/win32-ia32": ["@esbuild/win32-ia32@0.27.2", "", { "os": "win32", "cpu": "ia32" }, "sha512-Iuws0kxo4yusk7sw70Xa2E2imZU5HoixzxfGCdxwBdhiDgt9vX9VUCBhqcwY7/uh//78A1hMkkROMJq9l27oLQ=="], + + "tsx/esbuild/@esbuild/win32-x64": ["@esbuild/win32-x64@0.27.2", "", { "os": "win32", "cpu": "x64" }, "sha512-sRdU18mcKf7F+YgheI/zGf5alZatMUTKj/jNS6l744f9u3WFu4v7twcUI9vu4mknF4Y9aDlblIie0IM+5xxaqQ=="], + + "wrap-ansi/string-width/emoji-regex": ["emoji-regex@10.6.0", "", {}, "sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A=="], + + "wrap-ansi/strip-ansi/ansi-regex": ["ansi-regex@6.2.2", "", {}, "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg=="], - "@aws-crypto/util/@smithy/util-utf8/@smithy/util-buffer-from/@smithy/is-array-buffer": ["@smithy/is-array-buffer@2.2.0", "", { "dependencies": { "tslib": "^2.6.2" } }, "sha512-GGP3O9QFD24uGeAXYUjwSTXARoqpZykHadOmA8G5vfJPK0/DC67qa//0qvqrJzL1xc8WQWX7/yc7fwudjPHPhA=="], + "cli-truncate/string-width/strip-ansi/ansi-regex": ["ansi-regex@6.2.2", "", {}, "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg=="], } } diff --git a/drizzle.config.ts b/drizzle.config.ts index 63799b7..2efe9b9 100644 --- a/drizzle.config.ts +++ b/drizzle.config.ts @@ -2,8 +2,8 @@ import "dotenv/config"; import { defineConfig } from "drizzle-kit"; export default defineConfig({ - out: "./infra/postgres/migrations", - schema: "./infra/postgres/schema", + out: "./src/libs/database/postgres/migrations", + schema: "./src/libs/database/postgres/schema", dialect: "postgresql", dbCredentials: { url: process.env.DATABASE_URL!, diff --git a/package.json b/package.json index 364eb0a..9ca0de7 100644 --- a/package.json +++ b/package.json @@ -3,82 +3,85 @@ "module": "index.ts", "type": "module", "private": true, + "author": { + "name": "Aolus Software" + }, "scripts": { - "start:server": "bun run apps/api/serve.ts", - "dev:server": "bun run --hot --watch apps/api/serve.ts", - "build:server": "bun build apps/api/serve.ts --outdir=dist --target=node", - "start:worker": "bun run apps/worker/index.ts", - "dev:worker": "bun run --hot --watch apps/worker/index.ts", - "build:worker": "bun build apps/worker/index.ts --outdir=dist --target=node", - "start:api": "bun run apps/api/serve.ts", - "dev:api": "bun run --hot --watch apps/api/serve.ts", - "build:api": "bun build apps/api/serve.ts --outdir=dist --target=node", + "dev:api": "bun --watch src/serve.ts", + "dev:server": "bun --watch src/serve.ts", + "dev:worker": "bun --watch src/bull/index.ts", + "dev:all": "concurrently \"bun run dev:server\" \"bun run dev:worker\"", + "build:api": "bun build src/serve.ts --outdir ./dist/api --target bun", + "build:server": "bun build src/serve.ts --outdir ./dist/server --target bun", + "build:worker": "bun build src/bull/index.ts --outdir ./dist/worker --target bun", + "build:all": "concurrently \"bun run build:server\" \"bun run build:worker\"", + "start:api": "NODE_ENV=production bun dist/api/serve.js", + "start:server": "NODE_ENV=production bun dist/server/serve.js", + "start:worker": "NODE_ENV=production bun dist/worker/index.js", + "start:all": "concurrently \"bun run start:server\" \"bun run start:worker\"", "lint": "bun run eslint . --ext .ts,.js", + "link:fix": "bun run eslint . --ext .ts,.js --fix", "format": "bun run prettier --write .", - "prepare": "husky install", - "dev:all": "concurrently --names \"server,worker\" --prefix-colors \"blue,magenta\" \"bun run dev:server\" \"bun run dev:worker\"", - "build:all": "concurrently --names \"server,worker\" --prefix-colors \"blue,magenta\" \"bun run build:server\" \"bun run build:worker\"", - "start:all": "concurrently --names \"server,worker\" --prefix-colors \"blue,magenta\" \"bun run start:server\" \"bun run start:worker\"", - "db:postgres:seed": "bun run ./infra/seed/index.ts", - "migrate:clickhouse": "bun run infra/clickhouse/scripts/migrate.ts migrate", - "migrate:clickhouse:status": "bun run infra/clickhouse/scripts/migrate.ts status" + "typecheck": "bun run tsc --noEmit", + "prepare": "husky install" }, "devDependencies": { "@types/bcryptjs": "^3.0.0", - "@types/bun": "latest", + "@types/bun": "^1.3.8", "@types/crypto-js": "^4.2.2", - "@types/node": "^24.7.2", - "@types/nodemailer": "^7.0.3", - "@types/pg": "^8.15.5", - "@typescript-eslint/eslint-plugin": "^8.15.0", - "@typescript-eslint/parser": "^8.15.0", + "@types/node": "^25.2.0", + "@types/nodemailer": "^7.0.9", + "@types/pg": "^8.16.0", + "@typescript-eslint/eslint-plugin": "^8.54.0", + "@typescript-eslint/parser": "^8.54.0", "concurrently": "^9.2.1", - "drizzle-kit": "^0.31.5", - "eslint": "^9.15.0", - "eslint-config-prettier": "^9.1.0", - "eslint-plugin-prettier": "^5.2.1", + "drizzle-kit": "^0.31.8", + "eslint": "^9.39.2", + "eslint-config-prettier": "^10.1.8", + "eslint-plugin-prettier": "^5.5.5", "husky": "^9.1.7", - "prettier": "^3.3.3", - "tsx": "^4.20.6", - "typescript-eslint": "^8.46.0" + "lint-staged": "^16.2.7", + "prettier": "^3.8.1", + "tsx": "^4.21.0", + "typescript-eslint": "^8.54.0" }, "peerDependencies": { "typescript": "^5" }, "dependencies": { - "@clickhouse/client": "^1.12.1", + "@clickhouse/client": "^1.16.0", "@fastify/autoload": "^6.3.1", - "@fastify/cors": "^11.1.0", + "@fastify/cors": "^11.2.0", "@fastify/helmet": "^13.0.2", "@fastify/jwt": "^10.0.0", "@fastify/rate-limit": "^10.3.0", - "@fastify/redis": "^7.1.0", + "@fastify/redis": "^7.2.0", "@fastify/swagger": "^9.6.1", - "@scalar/fastify-api-reference": "^1.43.1", + "@scalar/fastify-api-reference": "^1.44.9", "ajv": "^8.17.1", - "bcryptjs": "^3.0.2", - "bullmq": "^5.61.0", + "bcryptjs": "^3.0.3", + "bullmq": "^5.67.2", "crypto-js": "^4.2.0", - "dayjs": "^1.11.18", + "dayjs": "^1.11.19", "dotenv": "^17.2.3", - "drizzle-orm": "^0.44.6", + "drizzle-orm": "^0.45.1", "envalid": "^8.1.1", - "fastify": "^5.6.1", + "fastify": "^5.7.4", "fastify-plugin": "^5.1.0", "fastify-type-provider-zod": "^6.1.0", - "ioredis": "^5.8.1", - "nodemailer": "^7.0.10", - "pg": "^8.16.3", - "pino": "^10.0.0", - "pino-pretty": "^13.1.2", + "ioredis": "^5.9.2", + "nodemailer": "^7.0.13", + "pg": "^8.18.0", + "pino": "^10.3.0", + "pino-pretty": "^13.1.3", "reflect-metadata": "^0.2.2", "tsyringe": "^4.10.0", - "zod": "^4.3.5" + "zod": "^4.3.6" }, "lint-staged": { - "*.{js,ts,jsx,tsx}": [ - "eslint --fix", - "prettier --write" + "*.(ts|js)": [ + "bun run format", + "bun run lint" ] } } diff --git a/packages/error/custom.errors.ts b/packages/error/custom.errors.ts deleted file mode 100644 index 1c42819..0000000 --- a/packages/error/custom.errors.ts +++ /dev/null @@ -1,56 +0,0 @@ -export class HttpError extends Error { - constructor( - public _statusCode: number, - _message: string, - public _code?: string, - ) { - super(_message); - this.name = this.constructor.name; - Error.captureStackTrace(this, this.constructor); - } -} - -export class BadRequestError extends HttpError { - constructor(message: string = "Bad Request") { - super(400, message, "BAD_REQUEST"); - } -} - -export class UnauthorizedError extends HttpError { - constructor(message: string = "Unauthorized") { - super(401, message, "UNAUTHORIZED"); - } -} - -export class ForbiddenError extends HttpError { - constructor(message: string = "Forbidden") { - super(403, message, "FORBIDDEN"); - } -} - -export class NotFoundError extends HttpError { - constructor(message: string = "Not Found") { - super(404, message, "NOT_FOUND"); - } -} - -export class UnprocessableEntityError extends HttpError { - constructor( - message: string = "Validation error", - public validationErrors?: Array<{ field: string; message: string }>, - ) { - super(422, message, "UNPROCESSABLE_ENTITY"); - } -} - -export class InternalServerError extends HttpError { - constructor(message: string = "Internal Server Error") { - super(500, message, "INTERNAL_SERVER_ERROR"); - } -} - -export class ConflictError extends HttpError { - constructor(message: string = "Conflict") { - super(409, message, "CONFLICT"); - } -} diff --git a/packages/index.ts b/packages/index.ts deleted file mode 100644 index 194c56d..0000000 --- a/packages/index.ts +++ /dev/null @@ -1,18 +0,0 @@ -export { createLogger, logger } from "./logger/logger"; - -export * from "./default/index"; - -export * from "./security/encrypt"; -export * from "./security/hash"; - -export * from "./toolkit/index"; - -export * from "./mail/mail.service"; -export * from "./mail/transport.mail"; - -export * from "./plugins/index"; - -export * from "./types/UserInformation"; -export * from "./types/datatable"; -export * from "./types/pagination"; -export * from "./types/sort-direction"; diff --git a/packages/services/index.ts b/packages/services/index.ts deleted file mode 100644 index a569eed..0000000 --- a/packages/services/index.ts +++ /dev/null @@ -1 +0,0 @@ -// for shared services (order,) diff --git a/packages/types/UserInformation.ts b/packages/types/UserInformation.ts deleted file mode 100644 index d79d11f..0000000 --- a/packages/types/UserInformation.ts +++ /dev/null @@ -1,10 +0,0 @@ -export interface UserInformation { - id: string; - name: string; - email: string; - roles: string[]; - permissions: { - name: string; - permissions: string[]; - }[]; -} diff --git a/apps/api/app.ts b/src/app.ts similarity index 90% rename from apps/api/app.ts rename to src/app.ts index 85ce13c..b11c046 100644 --- a/apps/api/app.ts +++ b/src/app.ts @@ -5,7 +5,7 @@ import fastifyRedis from "@fastify/redis"; import fastifyAutoload from "@fastify/autoload"; import { fileURLToPath } from "url"; import { dirname, join } from "path"; -import { createLoggerConfig } from "@packages/logger/logger"; +import { createLoggerConfig } from "@utils"; import { RedisConfig } from "@config/redis.config"; import { serializerCompiler, @@ -39,7 +39,7 @@ export function createAppInstance() { // SECURITY & EXTERNAL PLUGINS (Helmet, CORS, Rate Limiting, Swagger) === app.register(fastifyAutoload, { - dir: join(__dirname, "../../packages/plugins/externals"), + dir: join(__dirname, "./libs/fastify/plugins/externals"), cascadeHooks: true, autoHooks: true, options: { @@ -49,7 +49,7 @@ export function createAppInstance() { // APPLICATION PLUGINS (Auth, Authorization, DI, Error Handling) ======== app.register(fastifyAutoload, { - dir: join(__dirname, "../../packages/plugins/app"), + dir: join(__dirname, "./libs/fastify/plugins/app"), cascadeHooks: true, autoHooks: true, }); diff --git a/src/bull/index.ts b/src/bull/index.ts new file mode 100644 index 0000000..d996071 --- /dev/null +++ b/src/bull/index.ts @@ -0,0 +1,5 @@ +import "reflect-metadata"; +import "./worker/send-email.worker"; + +// eslint-disable-next-line no-console +console.log(`Worker started.`); diff --git a/apps/worker/queue/send-email.queue.ts b/src/bull/queue/send-email.queue.ts similarity index 75% rename from apps/worker/queue/send-email.queue.ts rename to src/bull/queue/send-email.queue.ts index 9e960aa..b067c3d 100644 --- a/apps/worker/queue/send-email.queue.ts +++ b/src/bull/queue/send-email.queue.ts @@ -1,5 +1,5 @@ import { Queue } from "bullmq"; -import { RedisClient } from "infra/redis/redis-client"; +import { RedisClient } from "@database"; const queueRedis = RedisClient.getQueueRedisClient(); diff --git a/apps/worker/worker/send-email.worker.ts b/src/bull/worker/send-email.worker.ts similarity index 76% rename from apps/worker/worker/send-email.worker.ts rename to src/bull/worker/send-email.worker.ts index 39aba0d..6e0b7e1 100644 --- a/apps/worker/worker/send-email.worker.ts +++ b/src/bull/worker/send-email.worker.ts @@ -1,7 +1,7 @@ import { Worker } from "bullmq"; -import { EmailOptions, EmailService } from "@packages/mail/mail.service"; -import { RedisClient } from "infra/redis/redis-client"; -import { logger } from "@packages"; +import { EmailOptions, EmailService } from "@libs/mail/mail.service"; +import { RedisClient } from "@database"; +import { logger } from "@utils"; const queueRedis = RedisClient.getQueueRedisClient(); diff --git a/packages/cache/cache.ts b/src/libs/cache/cache.ts similarity index 96% rename from packages/cache/cache.ts rename to src/libs/cache/cache.ts index 41a896a..dc40261 100644 --- a/packages/cache/cache.ts +++ b/src/libs/cache/cache.ts @@ -1,6 +1,6 @@ import Redis from "ioredis"; -import { logger } from "@packages"; -import { RedisClient } from "infra/redis/redis-client"; +import { logger } from "@utils"; +import { RedisClient } from "@database"; class Cache { private static redis: Redis | null = null; diff --git a/packages/cache/const.ts b/src/libs/cache/const.ts similarity index 100% rename from packages/cache/const.ts rename to src/libs/cache/const.ts diff --git a/packages/cache/index.ts b/src/libs/cache/index.ts similarity index 100% rename from packages/cache/index.ts rename to src/libs/cache/index.ts diff --git a/config/app.config.ts b/src/libs/config/app.config.ts similarity index 100% rename from config/app.config.ts rename to src/libs/config/app.config.ts diff --git a/config/clickhouse.config.ts b/src/libs/config/clickhouse.config.ts similarity index 100% rename from config/clickhouse.config.ts rename to src/libs/config/clickhouse.config.ts diff --git a/config/cors.config.ts b/src/libs/config/cors.config.ts similarity index 100% rename from config/cors.config.ts rename to src/libs/config/cors.config.ts diff --git a/config/database.config.ts b/src/libs/config/database.config.ts similarity index 100% rename from config/database.config.ts rename to src/libs/config/database.config.ts diff --git a/config/index.ts b/src/libs/config/index.ts similarity index 100% rename from config/index.ts rename to src/libs/config/index.ts diff --git a/config/mail.config.ts b/src/libs/config/mail.config.ts similarity index 100% rename from config/mail.config.ts rename to src/libs/config/mail.config.ts diff --git a/config/redis.config.ts b/src/libs/config/redis.config.ts similarity index 100% rename from config/redis.config.ts rename to src/libs/config/redis.config.ts diff --git a/infra/clickhouse/client/clickhouse-client.ts b/src/libs/database/clickhouse/client/clickhouse-client.ts similarity index 100% rename from infra/clickhouse/client/clickhouse-client.ts rename to src/libs/database/clickhouse/client/clickhouse-client.ts diff --git a/infra/clickhouse/index.ts b/src/libs/database/clickhouse/index.ts similarity index 100% rename from infra/clickhouse/index.ts rename to src/libs/database/clickhouse/index.ts diff --git a/infra/clickhouse/migrations/00001.sql b/src/libs/database/clickhouse/migrations/00001.sql similarity index 100% rename from infra/clickhouse/migrations/00001.sql rename to src/libs/database/clickhouse/migrations/00001.sql diff --git a/infra/clickhouse/repositories/auth-events.repository.ts b/src/libs/database/clickhouse/repositories/auth-events.repository.ts similarity index 100% rename from infra/clickhouse/repositories/auth-events.repository.ts rename to src/libs/database/clickhouse/repositories/auth-events.repository.ts diff --git a/infra/clickhouse/repositories/base.repository.ts b/src/libs/database/clickhouse/repositories/base.repository.ts similarity index 100% rename from infra/clickhouse/repositories/base.repository.ts rename to src/libs/database/clickhouse/repositories/base.repository.ts diff --git a/infra/clickhouse/repositories/index.ts b/src/libs/database/clickhouse/repositories/index.ts similarity index 100% rename from infra/clickhouse/repositories/index.ts rename to src/libs/database/clickhouse/repositories/index.ts diff --git a/infra/clickhouse/repositories/interfaces/auth-events.interface.ts b/src/libs/database/clickhouse/repositories/interfaces/auth-events.interface.ts similarity index 100% rename from infra/clickhouse/repositories/interfaces/auth-events.interface.ts rename to src/libs/database/clickhouse/repositories/interfaces/auth-events.interface.ts diff --git a/infra/clickhouse/repositories/interfaces/user-activities.interface.ts b/src/libs/database/clickhouse/repositories/interfaces/user-activities.interface.ts similarity index 100% rename from infra/clickhouse/repositories/interfaces/user-activities.interface.ts rename to src/libs/database/clickhouse/repositories/interfaces/user-activities.interface.ts diff --git a/infra/clickhouse/repositories/user-activities.repository.ts b/src/libs/database/clickhouse/repositories/user-activities.repository.ts similarity index 100% rename from infra/clickhouse/repositories/user-activities.repository.ts rename to src/libs/database/clickhouse/repositories/user-activities.repository.ts diff --git a/infra/clickhouse/scripts/migrate.ts b/src/libs/database/clickhouse/scripts/migrate.ts similarity index 97% rename from infra/clickhouse/scripts/migrate.ts rename to src/libs/database/clickhouse/scripts/migrate.ts index a621f83..377fb60 100644 --- a/infra/clickhouse/scripts/migrate.ts +++ b/src/libs/database/clickhouse/scripts/migrate.ts @@ -11,7 +11,10 @@ interface IMigrationFile { class ClickHouseMigrator { private client; - private migrationsDir = join(process.cwd(), "infra/clickhouse/migrations"); + private migrationsDir = join( + process.cwd(), + "src/libs/database/clickhouse/migrations", + ); constructor() { this.client = createClient({ diff --git a/infra/clickhouse/services/user-activities.service.ts b/src/libs/database/clickhouse/services/user-activities.service.ts similarity index 100% rename from infra/clickhouse/services/user-activities.service.ts rename to src/libs/database/clickhouse/services/user-activities.service.ts diff --git a/src/libs/database/index.ts b/src/libs/database/index.ts new file mode 100644 index 0000000..a65455b --- /dev/null +++ b/src/libs/database/index.ts @@ -0,0 +1,3 @@ +export * from "./clickhouse/index"; +export * from "./postgres/index"; +export * from "./redis/redis-client"; diff --git a/infra/postgres/index.ts b/src/libs/database/postgres/index.ts similarity index 86% rename from infra/postgres/index.ts rename to src/libs/database/postgres/index.ts index 8096b75..122c3f0 100644 --- a/infra/postgres/index.ts +++ b/src/libs/database/postgres/index.ts @@ -1,6 +1,6 @@ import { drizzle } from "drizzle-orm/node-postgres"; import { Pool } from "pg"; -import { DatabaseConfig } from "config/database.config"; +import { DatabaseConfig } from "@config"; import { schema } from "./schema"; const client = new Pool({ @@ -16,3 +16,4 @@ const db = drizzle(client, { schema }); export { db, client }; export * from "./schema"; +export * from "./repositories"; diff --git a/infra/postgres/migrations/0000_perfect_crusher_hogan.sql b/src/libs/database/postgres/migrations/0000_perfect_crusher_hogan.sql similarity index 100% rename from infra/postgres/migrations/0000_perfect_crusher_hogan.sql rename to src/libs/database/postgres/migrations/0000_perfect_crusher_hogan.sql diff --git a/infra/postgres/migrations/meta/0000_snapshot.json b/src/libs/database/postgres/migrations/meta/0000_snapshot.json similarity index 100% rename from infra/postgres/migrations/meta/0000_snapshot.json rename to src/libs/database/postgres/migrations/meta/0000_snapshot.json diff --git a/infra/postgres/migrations/meta/_journal.json b/src/libs/database/postgres/migrations/meta/_journal.json similarity index 100% rename from infra/postgres/migrations/meta/_journal.json rename to src/libs/database/postgres/migrations/meta/_journal.json diff --git a/infra/postgres/repositories/forgot-password.repository.ts b/src/libs/database/postgres/repositories/forgot-password.repository.ts similarity index 86% rename from infra/postgres/repositories/forgot-password.repository.ts rename to src/libs/database/postgres/repositories/forgot-password.repository.ts index 4c1993e..9ffa215 100644 --- a/infra/postgres/repositories/forgot-password.repository.ts +++ b/src/libs/database/postgres/repositories/forgot-password.repository.ts @@ -1,7 +1,7 @@ -import { db, password_reset_tokensTable } from "infra/postgres/index"; +import { db, password_reset_tokensTable } from "@database"; import { eq } from "drizzle-orm"; import { DbTransaction } from "."; -import { injectable } from "@packages/di"; +import { injectable } from "@fastify-libs"; @injectable() export class ForgotPasswordRepository { diff --git a/infra/postgres/repositories/index.ts b/src/libs/database/postgres/repositories/index.ts similarity index 91% rename from infra/postgres/repositories/index.ts rename to src/libs/database/postgres/repositories/index.ts index 9ebdece..41f7ee2 100644 --- a/infra/postgres/repositories/index.ts +++ b/src/libs/database/postgres/repositories/index.ts @@ -1,4 +1,4 @@ -import { schema } from "@postgres/schema"; +import { schema } from "@database"; import { ExtractTablesWithRelations } from "drizzle-orm"; import { PgTransaction } from "drizzle-orm/pg-core"; import { PostgresJsQueryResultHKT } from "drizzle-orm/postgres-js"; diff --git a/infra/postgres/repositories/permission.repository.ts b/src/libs/database/postgres/repositories/permission.repository.ts similarity index 87% rename from infra/postgres/repositories/permission.repository.ts rename to src/libs/database/postgres/repositories/permission.repository.ts index d79055f..45c3fa3 100644 --- a/infra/postgres/repositories/permission.repository.ts +++ b/src/libs/database/postgres/repositories/permission.repository.ts @@ -1,28 +1,17 @@ -import { db, permissionsTable } from "infra/postgres/index"; -import { defaultSort } from "@default/sort"; +import { db, permissionsTable } from "@database"; +import { defaultSort } from "@/libs/fastify/default/sort"; import { and, asc, desc, eq, ilike, not, or, SQL } from "drizzle-orm"; import { DbTransaction } from "."; -import { DatatableType, PaginationResponse, SortDirection } from "@packages"; -import { NotFoundError, UnprocessableEntityError } from "@error/custom.errors"; +import { + DatatableType, + PaginationResponse, + PermissionList, + PermissionSelectOptions, + SortDirection, +} from "@types"; +import { NotFoundError, UnprocessableEntityError } from "@fastify-libs"; import { injectable } from "tsyringe"; -export type PermissionList = { - id: string; - name: string; - group: string; - created_at: Date; - updated_at: Date; -}; - -export type PermissionSelectOptions = { - group: string; - permissions: { - id: string; - name: string; - group: string; - }[]; -}; - @injectable() export class PermissionRepository { private dbInstance = db; @@ -87,8 +76,8 @@ export class PermissionRepository { id: permissionsTable.id, name: permissionsTable.name, group: permissionsTable.group, - created_at: permissionsTable.createdAt, - updated_at: permissionsTable.updatedAt, + created_at: permissionsTable.created_at, + updated_at: permissionsTable.updated_at, }; type OrderableKey = keyof typeof validateOrderBy; @@ -107,8 +96,8 @@ export class PermissionRepository { id: true, name: true, group: true, - createdAt: true, - updatedAt: true, + created_at: true, + updated_at: true, }, limit, offset, @@ -118,8 +107,8 @@ export class PermissionRepository { id: item.id, name: item.name, group: item.group, - created_at: item.createdAt, - updated_at: item.updatedAt, + created_at: item.created_at, + updated_at: item.updated_at, })); const totalCount = await database.$count( @@ -145,8 +134,8 @@ export class PermissionRepository { id: true, name: true, group: true, - createdAt: true, - updatedAt: true, + created_at: true, + updated_at: true, }, }); @@ -158,8 +147,8 @@ export class PermissionRepository { id: permission.id, name: permission.name, group: permission.group, - created_at: permission.createdAt, - updated_at: permission.updatedAt, + created_at: permission.created_at, + updated_at: permission.updated_at, }; } diff --git a/infra/postgres/repositories/role.repository.ts b/src/libs/database/postgres/repositories/role.repository.ts similarity index 86% rename from infra/postgres/repositories/role.repository.ts rename to src/libs/database/postgres/repositories/role.repository.ts index 2e5a716..3fc08c7 100644 --- a/infra/postgres/repositories/role.repository.ts +++ b/src/libs/database/postgres/repositories/role.repository.ts @@ -1,34 +1,17 @@ -import { db, role_permissionsTable, rolesTable } from "infra/postgres/index"; +import { db, role_permissionsTable, rolesTable } from "@database"; import { and, asc, desc, eq, ilike, ne, not, or, SQL } from "drizzle-orm"; -import { defaultSort } from "@default/sort"; -import { DatatableToolkit } from "@toolkit/datatable"; +import { defaultSort } from "@/libs/fastify/default/sort"; +import { DatatableToolkit } from "@utils"; import { DbTransaction } from "."; -import { DatatableType, PaginationResponse, SortDirection } from "@packages"; -import { NotFoundError, UnprocessableEntityError } from "@error/custom.errors"; +import { + DatatableType, + PaginationResponse, + RoleDetail, + RoleList, + SortDirection, +} from "@types"; +import { NotFoundError, UnprocessableEntityError } from "@fastify-libs"; import { injectable } from "tsyringe"; - -export type RoleList = { - id: string; - name: string; - created_at: Date; - updated_at: Date; -}; - -export type RoleDetail = { - id: string; - name: string; - created_at: Date; - updated_at: Date; - permissions: { - group: string; - names: { - id: string; - name: string; - is_assigned: boolean; - }[]; - }[]; -}; - @injectable() export class RoleRepository { private dbInstance = db; @@ -77,8 +60,8 @@ export class RoleRepository { { id: rolesTable.id, name: rolesTable.name, - createdAt: rolesTable.createdAt, - updatedAt: rolesTable.updatedAt, + created_at: rolesTable.created_at, + updated_at: rolesTable.updated_at, }, orderBy, ); @@ -88,8 +71,8 @@ export class RoleRepository { columns: { id: true, name: true, - createdAt: true, - updatedAt: true, + created_at: true, + updated_at: true, }, limit, offset, @@ -99,8 +82,8 @@ export class RoleRepository { data: roles.map((role) => ({ id: role.id, name: role.name, - created_at: role.createdAt, - updated_at: role.updatedAt, + created_at: role.created_at, + updated_at: role.updated_at, })), meta: { page, @@ -158,8 +141,8 @@ export class RoleRepository { columns: { id: true, name: true, - createdAt: true, - updatedAt: true, + created_at: true, + updated_at: true, }, with: { @@ -192,8 +175,8 @@ export class RoleRepository { return { id: role.id, name: role.name, - created_at: role.createdAt, - updated_at: role.updatedAt, + created_at: role.created_at, + updated_at: role.updated_at, permissions: allPermissions.reduce( ( acc: { diff --git a/infra/postgres/repositories/user.repository.ts b/src/libs/database/postgres/repositories/user.repository.ts similarity index 90% rename from infra/postgres/repositories/user.repository.ts rename to src/libs/database/postgres/repositories/user.repository.ts index b379369..23707db 100644 --- a/infra/postgres/repositories/user.repository.ts +++ b/src/libs/database/postgres/repositories/user.repository.ts @@ -1,4 +1,4 @@ -import { db, user_rolesTable, usersTable } from "infra/postgres/index"; +import { db, user_rolesTable, usersTable, UserStatusEnum } from "@database"; import { and, eq, @@ -10,64 +10,25 @@ import { desc, exists, } from "drizzle-orm"; -import { defaultSort } from "@default/sort"; -import { Hash } from "@security/hash"; +import { Hash } from "@utils"; import { DbTransaction } from "."; import { NotFoundError, UnauthorizedError, UnprocessableEntityError, -} from "@error/custom.errors"; -import { UserStatusEnum } from "@postgres/schema/user"; + defaultSort, +} from "@fastify-libs"; import { DatatableType, PaginationResponse, SortDirection, + UserCreate, + UserDetail, + UserForAuth, UserInformation, -} from "@packages"; -import { injectable } from "@packages/di"; - -export type UserList = { - id: string; - name: string; - email: string; - status: UserStatusEnum | null; - roles: string[] | null; - created_at: Date | null; - updated_at: Date | null; -}; - -export type UserCreate = { - name: string; - email: string; - password: string; - status?: UserStatusEnum; - remark?: string; - roleIds?: string[]; -}; - -export type UserDetail = { - id: string; - name: string; - email: string; - status: UserStatusEnum | null; - remark: string | null; - roles: { - id: string; - name: string; - }[]; - created_at: Date | null; - updated_at: Date | null; -}; - -export type UserForAuth = { - id: string; - name: string; - email: string; - password: string; - status: UserStatusEnum | null; - email_verified_at: Date | null; -}; + UserList, +} from "@types"; +import { injectable } from "@fastify-libs"; @injectable() export class UserRepository { diff --git a/infra/postgres/schema/email_verification.ts b/src/libs/database/postgres/schema/email_verification.ts similarity index 82% rename from infra/postgres/schema/email_verification.ts rename to src/libs/database/postgres/schema/email_verification.ts index 7b0c034..e1f9918 100644 --- a/infra/postgres/schema/email_verification.ts +++ b/src/libs/database/postgres/schema/email_verification.ts @@ -28,3 +28,8 @@ export const email_verificationsRelations = relations( }), }), ); + +// Type exports +export type EmailVerification = typeof email_verificationsTable.$inferSelect; +export type InsertEmailVerification = + typeof email_verificationsTable.$inferInsert; diff --git a/infra/postgres/schema/index.ts b/src/libs/database/postgres/schema/index.ts similarity index 71% rename from infra/postgres/schema/index.ts rename to src/libs/database/postgres/schema/index.ts index e80648e..bc4ca67 100644 --- a/infra/postgres/schema/index.ts +++ b/src/libs/database/postgres/schema/index.ts @@ -47,3 +47,24 @@ export { email_verificationsTable, password_reset_tokensTable, }; + +// Export all types +export type { User, InsertUser, UserStatusEnum } from "./user"; +export type { + Role, + Permission, + RolePermission, + UserRole, + InsertRole, + InsertPermission, + InsertRolePermission, + InsertUserRole, +} from "./rbac"; +export type { + EmailVerification, + InsertEmailVerification, +} from "./email_verification"; +export type { + PasswordResetToken, + InsertPasswordResetToken, +} from "./password_reset_token"; diff --git a/infra/postgres/schema/password_reset_token.ts b/src/libs/database/postgres/schema/password_reset_token.ts similarity index 81% rename from infra/postgres/schema/password_reset_token.ts rename to src/libs/database/postgres/schema/password_reset_token.ts index bb8035d..73ecfd9 100644 --- a/infra/postgres/schema/password_reset_token.ts +++ b/src/libs/database/postgres/schema/password_reset_token.ts @@ -27,3 +27,8 @@ export const password_reset_tokensRelations = relations( }), }), ); + +// Type exports +export type PasswordResetToken = typeof password_reset_tokensTable.$inferSelect; +export type InsertPasswordResetToken = + typeof password_reset_tokensTable.$inferInsert; diff --git a/infra/postgres/schema/rbac.ts b/src/libs/database/postgres/schema/rbac.ts similarity index 87% rename from infra/postgres/schema/rbac.ts rename to src/libs/database/postgres/schema/rbac.ts index 243262a..340393d 100644 --- a/infra/postgres/schema/rbac.ts +++ b/src/libs/database/postgres/schema/rbac.ts @@ -11,8 +11,11 @@ import { usersTable } from "./user"; export const rolesTable = pgTable("roles", { id: uuid("id").defaultRandom().primaryKey(), name: varchar("name", { length: 100 }).notNull().unique(), - createdAt: timestamp("created_at").defaultNow().notNull(), - updatedAt: timestamp("updated_at").defaultNow().notNull(), + created_at: timestamp("created_at").defaultNow().notNull(), + updated_at: timestamp("updated_at") + .defaultNow() + .notNull() + .$onUpdate(() => new Date()), }); export const rolesRelations = relations(rolesTable, ({ many }) => ({ @@ -24,8 +27,11 @@ export const permissionsTable = pgTable("permissions", { id: uuid("id").defaultRandom().primaryKey(), name: varchar("name", { length: 255 }).notNull().unique(), group: varchar("group", { length: 100 }).notNull(), - createdAt: timestamp("created_at").defaultNow().notNull(), - updatedAt: timestamp("updated_at").defaultNow().notNull(), + created_at: timestamp("created_at").defaultNow().notNull(), + updated_at: timestamp("updated_at") + .defaultNow() + .notNull() + .$onUpdate(() => new Date()), }); export const permissionsRelations = relations(permissionsTable, ({ many }) => ({ @@ -70,7 +76,7 @@ export const user_rolesTable = pgTable( roleId: uuid("role_id") .notNull() .references(() => rolesTable.id, { onDelete: "cascade" }), - assignedAt: timestamp("assigned_at").defaultNow().notNull(), + assigned_at: timestamp("assigned_at").defaultNow().notNull(), }, (table) => ({ pk: primaryKey({ columns: [table.userId, table.roleId] }), diff --git a/infra/postgres/schema/user.ts b/src/libs/database/postgres/schema/user.ts similarity index 91% rename from infra/postgres/schema/user.ts rename to src/libs/database/postgres/schema/user.ts index 3e94751..41c2a6e 100644 --- a/infra/postgres/schema/user.ts +++ b/src/libs/database/postgres/schema/user.ts @@ -50,3 +50,7 @@ export const usersRelations = relations(usersTable, ({ many }) => ({ password_reset_tokens: many(password_reset_tokensTable), user_roles: many(user_rolesTable), })); + +// Type exports +export type User = typeof usersTable.$inferSelect; +export type InsertUser = typeof usersTable.$inferInsert; diff --git a/infra/redis/redis-client.ts b/src/libs/database/redis/redis-client.ts similarity index 100% rename from infra/redis/redis-client.ts rename to src/libs/database/redis/redis-client.ts diff --git a/infra/seed/index.ts b/src/libs/database/seed/index.ts similarity index 93% rename from infra/seed/index.ts rename to src/libs/database/seed/index.ts index b3b8659..7b62b0c 100644 --- a/infra/seed/index.ts +++ b/src/libs/database/seed/index.ts @@ -1,3 +1,4 @@ +import "reflect-metadata"; import { RBACSeeder } from "./rbac.seed"; import { UserSeeder } from "./user.seed"; diff --git a/infra/seed/rbac.seed.ts b/src/libs/database/seed/rbac.seed.ts similarity index 90% rename from infra/seed/rbac.seed.ts rename to src/libs/database/seed/rbac.seed.ts index 8c24933..2041190 100644 --- a/infra/seed/rbac.seed.ts +++ b/src/libs/database/seed/rbac.seed.ts @@ -1,4 +1,4 @@ -import { db, permissionsTable, rolesTable } from "infra/postgres"; +import { db, permissionsTable, rolesTable } from "@database"; export const RBACSeeder = () => { return db.transaction(async (tx) => { diff --git a/infra/seed/user.seed.ts b/src/libs/database/seed/user.seed.ts similarity index 91% rename from infra/seed/user.seed.ts rename to src/libs/database/seed/user.seed.ts index f374614..0c916ed 100644 --- a/infra/seed/user.seed.ts +++ b/src/libs/database/seed/user.seed.ts @@ -1,10 +1,5 @@ -import { - db, - rolesTable, - user_rolesTable, - usersTable, -} from "infra/postgres/index"; -import { Hash } from "@security/hash"; +import { db, rolesTable, user_rolesTable, usersTable } from "@database"; +import { Hash } from "@utils"; import { eq } from "drizzle-orm"; export const UserSeeder = async () => { diff --git a/packages/default/allowed-file-uploads.ts b/src/libs/fastify/default/allowed-file-uploads.ts similarity index 100% rename from packages/default/allowed-file-uploads.ts rename to src/libs/fastify/default/allowed-file-uploads.ts diff --git a/packages/default/index.ts b/src/libs/fastify/default/index.ts similarity index 100% rename from packages/default/index.ts rename to src/libs/fastify/default/index.ts diff --git a/packages/default/max-upload-file.ts b/src/libs/fastify/default/max-upload-file.ts similarity index 100% rename from packages/default/max-upload-file.ts rename to src/libs/fastify/default/max-upload-file.ts diff --git a/packages/default/pagination-length.ts b/src/libs/fastify/default/pagination-length.ts similarity index 100% rename from packages/default/pagination-length.ts rename to src/libs/fastify/default/pagination-length.ts diff --git a/packages/default/sort.ts b/src/libs/fastify/default/sort.ts similarity index 100% rename from packages/default/sort.ts rename to src/libs/fastify/default/sort.ts diff --git a/packages/default/strong-password.ts b/src/libs/fastify/default/strong-password.ts similarity index 100% rename from packages/default/strong-password.ts rename to src/libs/fastify/default/strong-password.ts diff --git a/packages/default/token-lifetime.ts b/src/libs/fastify/default/token-lifetime.ts similarity index 86% rename from packages/default/token-lifetime.ts rename to src/libs/fastify/default/token-lifetime.ts index c953bd5..2d13635 100644 --- a/packages/default/token-lifetime.ts +++ b/src/libs/fastify/default/token-lifetime.ts @@ -1,4 +1,4 @@ -import { DateToolkit } from "@toolkit/date"; +import { DateToolkit } from "@utils"; export const accessTokenLifetime = DateToolkit.addHours( DateToolkit.now(), diff --git a/packages/di/container.ts b/src/libs/fastify/di/container.ts similarity index 100% rename from packages/di/container.ts rename to src/libs/fastify/di/container.ts diff --git a/packages/di/index.ts b/src/libs/fastify/di/index.ts similarity index 100% rename from packages/di/index.ts rename to src/libs/fastify/di/index.ts diff --git a/src/libs/fastify/error/bad-request.error.ts b/src/libs/fastify/error/bad-request.error.ts new file mode 100644 index 0000000..12909d2 --- /dev/null +++ b/src/libs/fastify/error/bad-request.error.ts @@ -0,0 +1,7 @@ +import { HttpError } from "./http.error"; + +export class BadRequestError extends HttpError { + constructor(message: string = "Bad Request") { + super(400, message, "BAD_REQUEST"); + } +} diff --git a/src/libs/fastify/error/conflict.error.ts b/src/libs/fastify/error/conflict.error.ts new file mode 100644 index 0000000..c01203a --- /dev/null +++ b/src/libs/fastify/error/conflict.error.ts @@ -0,0 +1,7 @@ +import { HttpError } from "./http.error"; + +export class ConflictError extends HttpError { + constructor(message: string = "Conflict") { + super(409, message, "CONFLICT"); + } +} diff --git a/src/libs/fastify/error/forbidden.error.ts b/src/libs/fastify/error/forbidden.error.ts new file mode 100644 index 0000000..d44e030 --- /dev/null +++ b/src/libs/fastify/error/forbidden.error.ts @@ -0,0 +1,7 @@ +import { HttpError } from "./http.error"; + +export class ForbiddenError extends HttpError { + constructor(message: string = "Forbidden") { + super(403, message, "FORBIDDEN"); + } +} diff --git a/src/libs/fastify/error/http.error.ts b/src/libs/fastify/error/http.error.ts new file mode 100644 index 0000000..2a65f45 --- /dev/null +++ b/src/libs/fastify/error/http.error.ts @@ -0,0 +1,11 @@ +export class HttpError extends Error { + constructor( + public _statusCode: number, + _message: string, + public _code?: string, + ) { + super(_message); + this.name = this.constructor.name; + Error.captureStackTrace(this, this.constructor); + } +} diff --git a/src/libs/fastify/error/index.ts b/src/libs/fastify/error/index.ts new file mode 100644 index 0000000..82680ed --- /dev/null +++ b/src/libs/fastify/error/index.ts @@ -0,0 +1,8 @@ +export { HttpError } from "./http.error"; +export { BadRequestError } from "./bad-request.error"; +export { UnauthorizedError } from "./unauthorized.error"; +export { ForbiddenError } from "./forbidden.error"; +export { NotFoundError } from "./not-found.error"; +export { ConflictError } from "./conflict.error"; +export { UnprocessableEntityError } from "./unprocessable-entity.error"; +export { InternalServerError } from "./internal-server.error"; diff --git a/src/libs/fastify/error/internal-server.error.ts b/src/libs/fastify/error/internal-server.error.ts new file mode 100644 index 0000000..f72724c --- /dev/null +++ b/src/libs/fastify/error/internal-server.error.ts @@ -0,0 +1,7 @@ +import { HttpError } from "./http.error"; + +export class InternalServerError extends HttpError { + constructor(message: string = "Internal Server Error") { + super(500, message, "INTERNAL_SERVER_ERROR"); + } +} diff --git a/src/libs/fastify/error/not-found.error.ts b/src/libs/fastify/error/not-found.error.ts new file mode 100644 index 0000000..a41a657 --- /dev/null +++ b/src/libs/fastify/error/not-found.error.ts @@ -0,0 +1,7 @@ +import { HttpError } from "./http.error"; + +export class NotFoundError extends HttpError { + constructor(message: string = "Not Found") { + super(404, message, "NOT_FOUND"); + } +} diff --git a/src/libs/fastify/error/unauthorized.error.ts b/src/libs/fastify/error/unauthorized.error.ts new file mode 100644 index 0000000..ab603b7 --- /dev/null +++ b/src/libs/fastify/error/unauthorized.error.ts @@ -0,0 +1,7 @@ +import { HttpError } from "./http.error"; + +export class UnauthorizedError extends HttpError { + constructor(message: string = "Unauthorized") { + super(401, message, "UNAUTHORIZED"); + } +} diff --git a/src/libs/fastify/error/unprocessable-entity.error.ts b/src/libs/fastify/error/unprocessable-entity.error.ts new file mode 100644 index 0000000..9bb944b --- /dev/null +++ b/src/libs/fastify/error/unprocessable-entity.error.ts @@ -0,0 +1,10 @@ +import { HttpError } from "./http.error"; + +export class UnprocessableEntityError extends HttpError { + constructor( + message: string = "Validation error", + public validationErrors?: Array<{ field: string; message: string }>, + ) { + super(422, message, "UNPROCESSABLE_ENTITY"); + } +} diff --git a/src/libs/fastify/index.ts b/src/libs/fastify/index.ts new file mode 100644 index 0000000..372cc14 --- /dev/null +++ b/src/libs/fastify/index.ts @@ -0,0 +1,4 @@ +export * from "./default/index"; +export * from "./di/index"; +export * from "./error/index"; +export * from "./plugins/index"; diff --git a/packages/plugins/app/auth.plugin.ts b/src/libs/fastify/plugins/app/auth.plugin.ts similarity index 87% rename from packages/plugins/app/auth.plugin.ts rename to src/libs/fastify/plugins/app/auth.plugin.ts index 256c0ab..74d5270 100644 --- a/packages/plugins/app/auth.plugin.ts +++ b/src/libs/fastify/plugins/app/auth.plugin.ts @@ -1,8 +1,8 @@ -import { UserInformationCacheKey } from "@packages/cache"; -import { UserRepository } from "@postgres/repositories"; +import { UserInformationCacheKey } from "@cache"; +import { UserRepository } from "@database"; import { FastifyReply, FastifyRequest } from "fastify"; import fp from "fastify-plugin"; -import { UserInformation } from "packages/types/UserInformation"; +import { UserInformation } from "@types"; declare module "fastify" { interface FastifyInstance { diff --git a/packages/plugins/app/authorization.plugin.ts b/src/libs/fastify/plugins/app/authorization.plugin.ts similarity index 100% rename from packages/plugins/app/authorization.plugin.ts rename to src/libs/fastify/plugins/app/authorization.plugin.ts diff --git a/packages/plugins/app/di.plugin.ts b/src/libs/fastify/plugins/app/di.plugin.ts similarity index 93% rename from packages/plugins/app/di.plugin.ts rename to src/libs/fastify/plugins/app/di.plugin.ts index 9c0136d..44fafbc 100644 --- a/packages/plugins/app/di.plugin.ts +++ b/src/libs/fastify/plugins/app/di.plugin.ts @@ -1,6 +1,6 @@ import { FastifyInstance } from "fastify"; import fp from "fastify-plugin"; -import { container } from "@packages/di"; +import { container } from "@fastify-libs"; declare module "fastify" { interface FastifyInstance { diff --git a/packages/plugins/app/error.plugin.ts b/src/libs/fastify/plugins/app/error.plugin.ts similarity index 80% rename from packages/plugins/app/error.plugin.ts rename to src/libs/fastify/plugins/app/error.plugin.ts index 5319c9d..f99ea8e 100644 --- a/packages/plugins/app/error.plugin.ts +++ b/src/libs/fastify/plugins/app/error.plugin.ts @@ -1,14 +1,22 @@ -import { ResponseToolkit } from "@toolkit/response"; +import { ResponseToolkit } from "@utils"; import fp from "fastify-plugin"; -import Fastify from "fastify"; -import { - HttpError, - UnprocessableEntityError, -} from "packages/error/custom.errors"; +import Fastify, { FastifyError } from "fastify"; +import { HttpError, UnprocessableEntityError } from "@fastify-libs"; + +interface ValidationError { + instancePath: string; + schemaPath?: string; + message?: string; +} + +interface ErrorWithStatusCode { + statusCode?: number; + message: string; +} // eslint-disable-next-line @typescript-eslint/require-await export default fp(async function (fastify) { - fastify.setErrorHandler(function (error, request, reply) { + fastify.setErrorHandler(function (error: FastifyError, request, reply) { // Custom HTTP errors if (error instanceof UnprocessableEntityError) { ResponseToolkit.validationError(reply, error.validationErrors || []); @@ -16,7 +24,7 @@ export default fp(async function (fastify) { } if (error.validation) { - const errors = error.validation.map((err) => ({ + const errors = error.validation.map((err: ValidationError) => ({ [err.instancePath.replace(/^\//, "") || err.schemaPath || "body"]: err.message || "Invalid value", })); @@ -110,8 +118,12 @@ export default fp(async function (fastify) { return; } - if (error.statusCode && error.statusCode >= 400 && error.statusCode < 500) { - ResponseToolkit.error(reply, error.message, error.statusCode); + if ( + (error as ErrorWithStatusCode).statusCode && + (error as ErrorWithStatusCode).statusCode! >= 400 && + (error as ErrorWithStatusCode).statusCode! < 500 + ) { + ResponseToolkit.error(reply, error.message, error.statusCode ?? 400); return; } diff --git a/packages/plugins/app/superuser.plugin.ts b/src/libs/fastify/plugins/app/superuser.plugin.ts similarity index 100% rename from packages/plugins/app/superuser.plugin.ts rename to src/libs/fastify/plugins/app/superuser.plugin.ts diff --git a/packages/plugins/externals/cors.plugin.ts b/src/libs/fastify/plugins/externals/cors.plugin.ts similarity index 100% rename from packages/plugins/externals/cors.plugin.ts rename to src/libs/fastify/plugins/externals/cors.plugin.ts diff --git a/packages/plugins/externals/helmet.plugin.ts b/src/libs/fastify/plugins/externals/helmet.plugin.ts similarity index 100% rename from packages/plugins/externals/helmet.plugin.ts rename to src/libs/fastify/plugins/externals/helmet.plugin.ts diff --git a/packages/plugins/externals/rate-limiting.plugin.ts b/src/libs/fastify/plugins/externals/rate-limiting.plugin.ts similarity index 97% rename from packages/plugins/externals/rate-limiting.plugin.ts rename to src/libs/fastify/plugins/externals/rate-limiting.plugin.ts index 53638bb..925f885 100644 --- a/packages/plugins/externals/rate-limiting.plugin.ts +++ b/src/libs/fastify/plugins/externals/rate-limiting.plugin.ts @@ -1,6 +1,6 @@ import fastifyRateLimit from "@fastify/rate-limit"; import fp from "fastify-plugin"; -import { RedisConfig } from "@config/redis.config"; +import { RedisConfig } from "@config"; import type { FastifyRequest } from "fastify"; export default fp( diff --git a/packages/plugins/externals/swagger.plugin.ts b/src/libs/fastify/plugins/externals/swagger.plugin.ts similarity index 95% rename from packages/plugins/externals/swagger.plugin.ts rename to src/libs/fastify/plugins/externals/swagger.plugin.ts index e30d88c..317ae35 100644 --- a/packages/plugins/externals/swagger.plugin.ts +++ b/src/libs/fastify/plugins/externals/swagger.plugin.ts @@ -1,7 +1,7 @@ import fastifySwagger from "@fastify/swagger"; import fp from "fastify-plugin"; import ScalarApiReference from "@scalar/fastify-api-reference"; -import { AppConfig } from "@config/app.config"; +import { AppConfig } from "@config"; import { jsonSchemaTransform } from "fastify-type-provider-zod"; export default fp( diff --git a/packages/plugins/index.ts b/src/libs/fastify/plugins/index.ts similarity index 100% rename from packages/plugins/index.ts rename to src/libs/fastify/plugins/index.ts diff --git a/packages/mail/mail.service.ts b/src/libs/mail/mail.service.ts similarity index 97% rename from packages/mail/mail.service.ts rename to src/libs/mail/mail.service.ts index 4bb7670..96d4a53 100644 --- a/packages/mail/mail.service.ts +++ b/src/libs/mail/mail.service.ts @@ -2,7 +2,7 @@ import fs from "fs"; import path from "path"; import { transporter } from "./transport.mail"; import { AppConfig, MailConfig } from "@config"; -import { logger } from "packages/logger/logger"; +import { logger } from "@utils"; export interface EmailOptions { to: string; diff --git a/packages/mail/templates/auth/email-verification.html b/src/libs/mail/templates/auth/email-verification.html similarity index 100% rename from packages/mail/templates/auth/email-verification.html rename to src/libs/mail/templates/auth/email-verification.html diff --git a/packages/mail/templates/auth/forgot-password.html b/src/libs/mail/templates/auth/forgot-password.html similarity index 100% rename from packages/mail/templates/auth/forgot-password.html rename to src/libs/mail/templates/auth/forgot-password.html diff --git a/packages/mail/transport.mail.ts b/src/libs/mail/transport.mail.ts similarity index 100% rename from packages/mail/transport.mail.ts rename to src/libs/mail/transport.mail.ts diff --git a/packages/types/datatable.ts b/src/libs/types/datatable/datatable.ts similarity index 100% rename from packages/types/datatable.ts rename to src/libs/types/datatable/datatable.ts diff --git a/src/libs/types/datatable/index.ts b/src/libs/types/datatable/index.ts new file mode 100644 index 0000000..33b69a1 --- /dev/null +++ b/src/libs/types/datatable/index.ts @@ -0,0 +1,3 @@ +export * from "./datatable"; +export * from "./pagination"; +export * from "./sort-direction"; diff --git a/packages/types/pagination.ts b/src/libs/types/datatable/pagination.ts similarity index 100% rename from packages/types/pagination.ts rename to src/libs/types/datatable/pagination.ts diff --git a/packages/types/sort-direction.ts b/src/libs/types/datatable/sort-direction.ts similarity index 100% rename from packages/types/sort-direction.ts rename to src/libs/types/datatable/sort-direction.ts diff --git a/src/libs/types/index.ts b/src/libs/types/index.ts new file mode 100644 index 0000000..8dcc700 --- /dev/null +++ b/src/libs/types/index.ts @@ -0,0 +1,2 @@ +export * from "./repositories/index"; +export * from "./datatable/index"; diff --git a/src/libs/types/repositories/index.ts b/src/libs/types/repositories/index.ts new file mode 100644 index 0000000..885f900 --- /dev/null +++ b/src/libs/types/repositories/index.ts @@ -0,0 +1,6 @@ +export * from "./user"; +export * from "./permission"; +export * from "./role"; + +// Re-export common database types +export type { DbTransaction } from "@database"; diff --git a/src/libs/types/repositories/permission.ts b/src/libs/types/repositories/permission.ts new file mode 100644 index 0000000..ee5e5e5 --- /dev/null +++ b/src/libs/types/repositories/permission.ts @@ -0,0 +1,16 @@ +export type PermissionList = { + id: string; + name: string; + group: string; + created_at: Date; + updated_at: Date; +}; + +export type PermissionSelectOptions = { + group: string; + permissions: { + id: string; + name: string; + group: string; + }[]; +}; diff --git a/src/libs/types/repositories/role.ts b/src/libs/types/repositories/role.ts new file mode 100644 index 0000000..f0b6dfe --- /dev/null +++ b/src/libs/types/repositories/role.ts @@ -0,0 +1,21 @@ +export type RoleList = { + id: string; + name: string; + created_at: Date; + updated_at: Date; +}; + +export type RoleDetail = { + id: string; + name: string; + created_at: Date; + updated_at: Date; + permissions: { + group: string; + names: { + id: string; + name: string; + is_assigned: boolean; + }[]; + }[]; +}; diff --git a/src/libs/types/repositories/user.ts b/src/libs/types/repositories/user.ts new file mode 100644 index 0000000..27e8765 --- /dev/null +++ b/src/libs/types/repositories/user.ts @@ -0,0 +1,54 @@ +import { UserStatusEnum } from "@database"; + +export type UserInformation = { + id: string; + name: string; + email: string; + roles: string[]; + permissions: { + name: string; + permissions: string[]; + }[]; +}; + +export type UserList = { + id: string; + name: string; + email: string; + status: UserStatusEnum | null; + roles: string[] | null; + created_at: Date | null; + updated_at: Date | null; +}; + +export type UserCreate = { + name: string; + email: string; + password: string; + status?: UserStatusEnum; + remark?: string; + roleIds?: string[]; +}; + +export type UserDetail = { + id: string; + name: string; + email: string; + status: UserStatusEnum | null; + remark: string | null; + roles: { + id: string; + name: string; + }[]; + created_at: Date | null; + updated_at: Date | null; +}; + +export type UserForAuth = { + id: string; + name: string; + email: string; + password: string; + status: UserStatusEnum | null; + email_verified_at: Date | null; +}; diff --git a/packages/toolkit/datatable.ts b/src/libs/utils/fastify/datatable.ts similarity index 87% rename from packages/toolkit/datatable.ts rename to src/libs/utils/fastify/datatable.ts index 99837b3..af6e398 100644 --- a/packages/toolkit/datatable.ts +++ b/src/libs/utils/fastify/datatable.ts @@ -1,9 +1,8 @@ -import { paginationLength } from "@default/pagination-length"; -import { defaultSort } from "@default/sort"; +import { paginationLength } from "@/libs/fastify/default/pagination-length"; +import { defaultSort } from "@/libs/fastify/default/sort"; import { PgColumn } from "drizzle-orm/pg-core"; import { FastifyRequest } from "fastify"; -import { DatatableType } from "packages/types/datatable"; -import { SortDirection } from "packages/types/sort-direction"; +import { DatatableType, SortDirection } from "@types"; export class DatatableToolkit { static parseFilter(request: FastifyRequest): DatatableType { diff --git a/packages/toolkit/index.ts b/src/libs/utils/fastify/index.ts similarity index 54% rename from packages/toolkit/index.ts rename to src/libs/utils/fastify/index.ts index d45f7ae..bbe39b5 100644 --- a/packages/toolkit/index.ts +++ b/src/libs/utils/fastify/index.ts @@ -1,6 +1,4 @@ -export * from "./date"; export * from "./datatable"; -export * from "./number"; -export * from "./response"; +export * from "./logger"; export * from "./response-schema"; -export * from "./string"; +export * from "./response"; diff --git a/packages/logger/logger.ts b/src/libs/utils/fastify/logger.ts similarity index 98% rename from packages/logger/logger.ts rename to src/libs/utils/fastify/logger.ts index 3c64d87..9272a3f 100644 --- a/packages/logger/logger.ts +++ b/src/libs/utils/fastify/logger.ts @@ -1,4 +1,4 @@ -import { DateToolkit } from "@toolkit/date"; +import { DateToolkit } from "../toolkit/date"; import pino from "pino"; interface LoggerOptions { diff --git a/packages/toolkit/response-schema.ts b/src/libs/utils/fastify/response-schema.ts similarity index 100% rename from packages/toolkit/response-schema.ts rename to src/libs/utils/fastify/response-schema.ts diff --git a/packages/toolkit/response.ts b/src/libs/utils/fastify/response.ts similarity index 100% rename from packages/toolkit/response.ts rename to src/libs/utils/fastify/response.ts diff --git a/src/libs/utils/index.ts b/src/libs/utils/index.ts new file mode 100644 index 0000000..87198ec --- /dev/null +++ b/src/libs/utils/index.ts @@ -0,0 +1,3 @@ +export * from "./fastify"; +export * from "./security"; +export * from "./toolkit"; diff --git a/packages/security/encrypt.ts b/src/libs/utils/security/encrypt.ts similarity index 100% rename from packages/security/encrypt.ts rename to src/libs/utils/security/encrypt.ts diff --git a/packages/security/hash.ts b/src/libs/utils/security/hash.ts similarity index 100% rename from packages/security/hash.ts rename to src/libs/utils/security/hash.ts diff --git a/src/libs/utils/security/index.ts b/src/libs/utils/security/index.ts new file mode 100644 index 0000000..51532af --- /dev/null +++ b/src/libs/utils/security/index.ts @@ -0,0 +1,2 @@ +export * from "./encrypt"; +export * from "./hash"; diff --git a/packages/toolkit/date.ts b/src/libs/utils/toolkit/date.ts similarity index 100% rename from packages/toolkit/date.ts rename to src/libs/utils/toolkit/date.ts diff --git a/src/libs/utils/toolkit/index.ts b/src/libs/utils/toolkit/index.ts new file mode 100644 index 0000000..2f96d32 --- /dev/null +++ b/src/libs/utils/toolkit/index.ts @@ -0,0 +1,3 @@ +export * from "./date"; +export * from "./number"; +export * from "./string"; diff --git a/packages/toolkit/number.ts b/src/libs/utils/toolkit/number.ts similarity index 100% rename from packages/toolkit/number.ts rename to src/libs/utils/toolkit/number.ts diff --git a/packages/toolkit/string.ts b/src/libs/utils/toolkit/string.ts similarity index 100% rename from packages/toolkit/string.ts rename to src/libs/utils/toolkit/string.ts diff --git a/apps/api/routes/auth/index.ts b/src/routes/auth/index.ts similarity index 95% rename from apps/api/routes/auth/index.ts rename to src/routes/auth/index.ts index e6733c0..cbdfe5c 100644 --- a/apps/api/routes/auth/index.ts +++ b/src/routes/auth/index.ts @@ -14,12 +14,11 @@ import { ValidationErrorResponseSchema, ServerErrorResponseSchema, } from "./schema"; -import { AuthService } from "@app/api/services/auth.service"; -import { ResponseToolkit } from "@packages/toolkit"; -import { UserInformation } from "@packages/index"; -import { AppConfig } from "@config/app.config"; -import { StrToolkit } from "@toolkit/string"; -import { UnprocessableEntityError } from "@packages/error/custom.errors"; +import { AuthService } from "@services"; +import { ResponseToolkit, StrToolkit } from "@utils"; +import { UserInformation } from "@types"; +import { AppConfig } from "@config"; +import { UnprocessableEntityError } from "@fastify-libs"; export default function (fastify: FastifyInstance) { // ====================== diff --git a/apps/api/routes/auth/schema.ts b/src/routes/auth/schema.ts similarity index 95% rename from apps/api/routes/auth/schema.ts rename to src/routes/auth/schema.ts index a1e53f7..24c195e 100644 --- a/apps/api/routes/auth/schema.ts +++ b/src/routes/auth/schema.ts @@ -1,11 +1,11 @@ -import { StrongPassword } from "@packages/default"; +import { StrongPassword } from "@fastify-libs"; import { z } from "zod"; import { createSuccessResponseSchema, UnauthorizedResponseSchema, ValidationErrorResponseSchema, ServerErrorResponseSchema, -} from "@packages/toolkit/response-schema"; +} from "@utils"; // Body Schemas export const LoginBodySchema = z.object({ diff --git a/apps/api/routes/health/index.ts b/src/routes/health/index.ts similarity index 91% rename from apps/api/routes/health/index.ts rename to src/routes/health/index.ts index 80d7aab..845ee5d 100644 --- a/apps/api/routes/health/index.ts +++ b/src/routes/health/index.ts @@ -1,6 +1,5 @@ -import { db } from "@infra/postgres"; -import { ClickHouseClientManager } from "@infra/clickhouse/client/clickhouse-client"; -import { ResponseToolkit } from "@packages/toolkit"; +import { ClickHouseClientManager, db } from "@database"; +import { ResponseToolkit } from "@utils"; import { FastifyInstance } from "fastify"; import { ZodTypeProvider } from "fastify-type-provider-zod"; import { z } from "zod"; @@ -49,17 +48,17 @@ export default function (fastify: FastifyInstance) { async (_request, reply) => { const serviceStatus = { database: { - status: "healthy" as const, + status: "healthy", responseTime: 0, remarks: "PostgreSQL is operational", }, redis: { - status: "healthy" as const, + status: "healthy", responseTime: 0, remarks: "Redis cache is operational", }, clickhouse: { - status: "healthy" as const, + status: "healthy", responseTime: 0, remarks: "ClickHouse is operational", }, diff --git a/apps/api/routes/index.ts b/src/routes/index.ts similarity index 95% rename from apps/api/routes/index.ts rename to src/routes/index.ts index 59e6904..74be97d 100644 --- a/apps/api/routes/index.ts +++ b/src/routes/index.ts @@ -1,5 +1,5 @@ import { AppConfig } from "@config/app.config"; -import { DateToolkit, ResponseToolkit } from "@packages/toolkit"; +import { DateToolkit, ResponseToolkit } from "@utils"; import { FastifyInstance, FastifyReply, FastifyRequest } from "fastify"; import { ZodTypeProvider } from "fastify-type-provider-zod"; import { z } from "zod"; diff --git a/apps/api/routes/profile/index.ts b/src/routes/profile/index.ts similarity index 94% rename from apps/api/routes/profile/index.ts rename to src/routes/profile/index.ts index 4370d9a..cc11953 100644 --- a/apps/api/routes/profile/index.ts +++ b/src/routes/profile/index.ts @@ -1,7 +1,7 @@ import { FastifyInstance } from "fastify"; -import { ProfileService } from "@app/api/services/profile.service"; -import { ResponseToolkit } from "@packages/toolkit"; -import { UserInformation } from "@packages/index"; +import { ProfileService } from "@services"; +import { ResponseToolkit } from "@utils"; +import { UserInformation } from "@types"; import { UpdateProfileBodySchema, UpdatePasswordBodySchema, diff --git a/apps/api/routes/profile/schema.ts b/src/routes/profile/schema.ts similarity index 92% rename from apps/api/routes/profile/schema.ts rename to src/routes/profile/schema.ts index 22f2ff6..4d69f1d 100644 --- a/apps/api/routes/profile/schema.ts +++ b/src/routes/profile/schema.ts @@ -1,11 +1,11 @@ -import { StrongPassword } from "@packages/default"; +import { StrongPassword } from "@fastify-libs"; import { z } from "zod"; import { createSuccessResponseSchema, UnauthorizedResponseSchema, ValidationErrorResponseSchema, ServerErrorResponseSchema, -} from "@packages/toolkit/response-schema"; +} from "@utils"; // Body Schemas export const UpdateProfileBodySchema = z.object({ diff --git a/apps/api/routes/settings/permission/index.ts.ts b/src/routes/settings/permission/index.ts.ts similarity index 98% rename from apps/api/routes/settings/permission/index.ts.ts rename to src/routes/settings/permission/index.ts.ts index a164763..249460d 100644 --- a/apps/api/routes/settings/permission/index.ts.ts +++ b/src/routes/settings/permission/index.ts.ts @@ -1,4 +1,4 @@ -import { PermissionService } from "@app/api/services/settings/permission.service"; +import { PermissionService } from "@services"; import { BadRequestResponseSchema, buildDatatableQueryParamsSchema, @@ -9,7 +9,7 @@ import { ResponseToolkit, ServerErrorResponseSchema, UnauthorizedResponseSchema, -} from "@packages/toolkit"; +} from "@utils"; import { FastifyInstance } from "fastify"; import { z } from "zod"; import { diff --git a/apps/api/routes/settings/permission/schema.ts b/src/routes/settings/permission/schema.ts similarity index 100% rename from apps/api/routes/settings/permission/schema.ts rename to src/routes/settings/permission/schema.ts diff --git a/apps/api/routes/settings/role/index.ts b/src/routes/settings/role/index.ts similarity index 98% rename from apps/api/routes/settings/role/index.ts rename to src/routes/settings/role/index.ts index 19ed767..12e0fbb 100644 --- a/apps/api/routes/settings/role/index.ts +++ b/src/routes/settings/role/index.ts @@ -1,4 +1,4 @@ -import { RoleService } from "@app/api/services/settings/role.service"; +import { RoleService } from "@services"; import { BadRequestResponseSchema, buildDatatableQueryParamsSchema, @@ -10,7 +10,7 @@ import { ResponseToolkit, ServerErrorResponseSchema, UnauthorizedResponseSchema, -} from "@packages/toolkit"; +} from "@utils"; import { FastifyInstance } from "fastify"; import { CreateRoleSchema, diff --git a/apps/api/routes/settings/role/schema.ts b/src/routes/settings/role/schema.ts similarity index 100% rename from apps/api/routes/settings/role/schema.ts rename to src/routes/settings/role/schema.ts diff --git a/apps/api/routes/settings/select/index.ts b/src/routes/settings/select/index.ts similarity index 94% rename from apps/api/routes/settings/select/index.ts rename to src/routes/settings/select/index.ts index f078844..6745bda 100644 --- a/apps/api/routes/settings/select/index.ts +++ b/src/routes/settings/select/index.ts @@ -1,14 +1,11 @@ -import { - PermissionRepository, - RoleRepository, -} from "@infra/postgres/repositories"; +import { PermissionRepository, RoleRepository } from "@database"; import { createSuccessResponseSchema, ForbiddenResponseSchema, ResponseToolkit, ServerErrorResponseSchema, UnauthorizedResponseSchema, -} from "@packages/toolkit"; +} from "@utils"; import { FastifyInstance } from "fastify"; import { SelectPermissionResponseSchema, diff --git a/apps/api/routes/settings/select/schema.ts b/src/routes/settings/select/schema.ts similarity index 100% rename from apps/api/routes/settings/select/schema.ts rename to src/routes/settings/select/schema.ts diff --git a/apps/api/routes/settings/user/index.ts b/src/routes/settings/user/index.ts similarity index 98% rename from apps/api/routes/settings/user/index.ts rename to src/routes/settings/user/index.ts index 94b9e19..73a0b21 100644 --- a/apps/api/routes/settings/user/index.ts +++ b/src/routes/settings/user/index.ts @@ -8,7 +8,7 @@ import { ResponseToolkit, ServerErrorResponseSchema, UnauthorizedResponseSchema, -} from "@packages/toolkit"; +} from "@utils"; import { FastifyInstance } from "fastify"; import { ChangeUserPasswordSchema, @@ -17,7 +17,7 @@ import { UserDetailResponseSchema, UserResponseSchema, } from "./schema"; -import { UserService } from "@app/api/services/settings/user.service"; +import { UserService } from "@services"; import { z } from "zod"; export default function (fastify: FastifyInstance) { diff --git a/apps/api/routes/settings/user/schema.ts b/src/routes/settings/user/schema.ts similarity index 95% rename from apps/api/routes/settings/user/schema.ts rename to src/routes/settings/user/schema.ts index f92de6d..e400c83 100644 --- a/apps/api/routes/settings/user/schema.ts +++ b/src/routes/settings/user/schema.ts @@ -1,4 +1,4 @@ -import { StrongPassword } from "@packages/default"; +import { StrongPassword } from "@fastify-libs"; import { z } from "zod"; export const UserResponseSchema = z.object({ diff --git a/apps/api/serve.ts b/src/serve.ts similarity index 97% rename from apps/api/serve.ts rename to src/serve.ts index b94e2df..cdd200d 100644 --- a/apps/api/serve.ts +++ b/src/serve.ts @@ -1,5 +1,5 @@ import "reflect-metadata"; -import { AppConfig } from "config/app.config"; +import { AppConfig } from "@config"; import { createAppInstance } from "./app"; const app = createAppInstance(); diff --git a/apps/api/services/auth.service.ts b/src/services/auth.service.ts similarity index 91% rename from apps/api/services/auth.service.ts rename to src/services/auth.service.ts index b25be84..9c189c6 100644 --- a/apps/api/services/auth.service.ts +++ b/src/services/auth.service.ts @@ -1,23 +1,22 @@ -import { Hash } from "@security/hash"; -import { UnprocessableEntityError } from "@packages/error/custom.errors"; +import { Hash, StrToolkit } from "@utils"; +import { UnprocessableEntityError } from "@fastify-libs"; import { ForgotPasswordRepository, UserRepository, -} from "@infra/postgres/repositories"; -import { UserInformation } from "@packages"; -import { usersTable } from "@postgres/schema"; + RedisClient, +} from "@database"; +import { UserInformation } from "@types"; import { + usersTable, db, email_verificationsTable, password_reset_tokensTable, -} from "@postgres/index"; +} from "@database"; import { and, eq, isNull } from "drizzle-orm"; -import { StrToolkit } from "@toolkit/string"; -import { verificationTokenLifetime } from "@default/token-lifetime"; -import { AppConfig } from "config/app.config"; -import { sendEmailQueue } from "@app/worker/queue/send-email.queue"; -import { injectable } from "@packages/di"; -import { RedisClient } from "@infra/redis/redis-client"; +import { verificationTokenLifetime } from "@fastify-libs"; +import { AppConfig } from "@config"; +import { sendEmailQueue } from "@bull/queue/send-email.queue"; +import { injectable } from "@fastify-libs"; @injectable() export class AuthService { diff --git a/src/services/index.ts b/src/services/index.ts new file mode 100644 index 0000000..430b02a --- /dev/null +++ b/src/services/index.ts @@ -0,0 +1,3 @@ +export * from "./auth.service"; +export * from "./profile.service"; +export * from "./settings"; diff --git a/apps/api/services/profile.service.ts b/src/services/profile.service.ts similarity index 84% rename from apps/api/services/profile.service.ts rename to src/services/profile.service.ts index cbd9917..b7e6dc2 100644 --- a/apps/api/services/profile.service.ts +++ b/src/services/profile.service.ts @@ -1,13 +1,8 @@ import { and, eq, isNull } from "drizzle-orm"; -import { Hash } from "@security/hash"; - -import { UserRepository } from "@infra/postgres/repositories"; -import { usersTable } from "@infra/postgres"; -import { - UnauthorizedError, - UnprocessableEntityError, -} from "@packages/error/custom.errors"; -import { UserInformation } from "@packages/index"; +import { Hash } from "@utils"; +import { UserRepository, usersTable } from "@database"; +import { UnauthorizedError, UnprocessableEntityError } from "@fastify-libs"; +import { UserInformation } from "@types"; import { injectable } from "tsyringe"; @injectable() diff --git a/src/services/settings/index.ts b/src/services/settings/index.ts new file mode 100644 index 0000000..f9ae7ee --- /dev/null +++ b/src/services/settings/index.ts @@ -0,0 +1,3 @@ +export * from "./permission.service"; +export * from "./role.service"; +export * from "./user.service"; diff --git a/apps/api/services/settings/permission.service.ts b/src/services/settings/permission.service.ts similarity index 83% rename from apps/api/services/settings/permission.service.ts rename to src/services/settings/permission.service.ts index c2aab5a..31e9be5 100644 --- a/apps/api/services/settings/permission.service.ts +++ b/src/services/settings/permission.service.ts @@ -1,9 +1,5 @@ -import { db } from "@infra/postgres"; -import { - PermissionList, - PermissionRepository, -} from "@infra/postgres/repositories"; -import { DatatableType, PaginationResponse } from "@packages/index"; +import { db, PermissionRepository } from "@database"; +import { DatatableType, PaginationResponse, PermissionList } from "@types"; import { injectable } from "tsyringe"; @injectable() diff --git a/apps/api/services/settings/role.service.ts b/src/services/settings/role.service.ts similarity index 86% rename from apps/api/services/settings/role.service.ts rename to src/services/settings/role.service.ts index 4a73dfa..c82df44 100644 --- a/apps/api/services/settings/role.service.ts +++ b/src/services/settings/role.service.ts @@ -1,13 +1,12 @@ -import { UnprocessableEntityError } from "packages/error/custom.errors"; -import { DatatableType } from "packages/types/datatable"; -import { PaginationResponse } from "packages/types/pagination"; -import { db, permissionsTable } from "@postgres/index"; -import { inArray } from "drizzle-orm"; +import { UnprocessableEntityError } from "@fastify-libs"; import { + DatatableType, + PaginationResponse, RoleDetail, RoleList, - RoleRepository, -} from "@infra/postgres/repositories"; +} from "@types"; +import { db, permissionsTable, RoleRepository } from "@database"; +import { inArray } from "drizzle-orm"; import { injectable } from "tsyringe"; @injectable() diff --git a/apps/api/services/settings/user.service.ts b/src/services/settings/user.service.ts similarity index 87% rename from apps/api/services/settings/user.service.ts rename to src/services/settings/user.service.ts index f0dd239..44e73ee 100644 --- a/apps/api/services/settings/user.service.ts +++ b/src/services/settings/user.service.ts @@ -1,17 +1,20 @@ -import { UnprocessableEntityError } from "packages/error/custom.errors"; +import { UnprocessableEntityError } from "@fastify-libs"; +import { + UserRepository, + db, + rolesTable, + usersTable, + UserStatusEnum, +} from "@database"; import { UserDetail, UserList, - UserRepository, -} from "@infra/postgres/repositories"; -import { DatatableType } from "packages/types/datatable"; -import { PaginationResponse } from "packages/types/pagination"; -import { db, rolesTable } from "@postgres/index"; + DatatableType, + PaginationResponse, +} from "@types"; import { and, eq, inArray, isNull, not } from "drizzle-orm"; -import { usersTable } from "@infra/postgres"; -import { Hash } from "@security/hash"; +import { Hash } from "@utils"; import { injectable } from "tsyringe"; -import { UserStatusEnum } from "@infra/postgres/schema/user"; @injectable() export class UserService { diff --git a/tsconfig.json b/tsconfig.json index 0eb55f8..270f038 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -30,42 +30,6 @@ // "rootDir": "./", /* Specify the root folder within your source files. */ "moduleResolution": "bundler" /* Specify how TypeScript looks up a file from a given module specifier. */, "baseUrl": "." /* Specify the base directory to resolve non-relative module names. */, - "paths": { - "@app/*": ["apps/*"], - "@api/*": ["apps/api/*"], - "@worker/*": ["apps/worker/*"], - - "@packages/*": ["packages/*"], - "@packages": ["packages/index.ts"], - - "@config/*": ["config/*"], - "@config": ["config/index.ts"], - - "@plugins/*": ["packages/plugins/*"], - "@plugins": ["packages/plugins/index.ts"], - - "@error/*": ["packages/error/*"], - "@error": ["packages/error"], - - "@infra/*": ["infra/*"], - "@infra": ["infra/index.ts"], - - "@db/*": ["infra/db/*"], - "@cache/*": ["packages/cache/*"], - "@event/*": ["packages/event/*"], - - "@postgres/*": ["infra/postgres/*"], - "@postgres": ["infra/postgres/index.ts"], - - "@toolkit/*": ["packages/toolkit/*"], - "@toolkit": ["packages/toolkit/index.ts"], - - "@security/*": ["packages/security/*"], - "@security": ["packages/security/index.ts"], - - "@default/*": ["packages/default/*"], - "@default": ["packages/default/index.ts"] - }, /* Specify a set of entries that re-map imports to additional lookup locations. */ // "rootDirs": [], /* Allow multiple folders to be treated as one when resolving modules. */ // "typeRoots": [], /* Specify multiple folders that act like './node_modules/@types'. */ "types": [ @@ -139,15 +103,32 @@ /* Completeness */ // "skipDefaultLibCheck": true, /* Skip type checking .d.ts files that are included with TypeScript. */ - "skipLibCheck": true /* Skip type checking all .d.ts files. */ + "skipLibCheck": true /* Skip type checking all .d.ts files. */, + + "paths": { + "@/*": ["src/*"], + "@libs/*": ["./src/libs/*"], + "@libs": ["./src/libs", "./src/libs/index.ts"], + "@cache/*": ["./src/libs/cache/*"], + "@cache": ["./src/libs/cache", "./src/libs/cache/index.ts"], + "@config/*": ["./src/libs/config/*"], + "@config": ["./src/libs/config", "./src/libs/config/index.ts"], + "@database/*": ["./src/libs/database/*"], + "@database": ["./src/libs/database", "./src/libs/database/index.ts"], + "@fastify-libs/*": ["./src/libs/fastify/*"], + "@fastify-libs": ["./src/libs/fastify", "./src/libs/fastify/index.ts"], + "@utils/*": ["./src/libs/utils/*"], + "@utils": ["./src/libs/utils", "./src/libs/utils/index.ts"], + "@bull/*": ["./src/bull/*"], + "@bull": ["./src/bull", "./src/bull/index.ts"], + "@types/*": ["./src/libs/types/*"], + "@types": ["./src/libs/types", "./src/libs/types/index.ts"], + "@routes/*": ["./src/routes/*"], + "@routes": ["./src/routes", "./src/routes/index.ts"], + "@services/*": ["./src/services/*"], + "@services": ["./src/services", "./src/services/index.ts"] + } }, - "include": [ - "apps/**/*", - "config/**/*", - "infra/**/*", - "packages/**/*", - "types/**/*", - "drizzle.config.ts" - ], + "include": ["src", "eslint.config.mjs", "drizzle.config.ts"], "exclude": ["node_modules", "dist"] }