diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index 1e19f66b..758102ac 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -20,7 +20,7 @@ jobs: - name: ⎔ Setup node uses: actions/setup-node@v4 with: - node-version: 18 + node-version: 20 - name: 📥 Install pnpm run: npm install -g pnpm @@ -44,7 +44,7 @@ jobs: - name: ⎔ Setup node uses: actions/setup-node@v4 with: - node-version: 18 + node-version: 20 - name: 📥 Install pnpm run: npm install -g pnpm @@ -68,7 +68,7 @@ jobs: - name: ⎔ Setup node uses: actions/setup-node@v4 with: - node-version: 18 + node-version: 20 - name: 📥 Install pnpm run: npm install -g pnpm diff --git a/.vscode/extensions.json b/.vscode/extensions.json new file mode 100644 index 00000000..eaff8c8f --- /dev/null +++ b/.vscode/extensions.json @@ -0,0 +1,5 @@ +{ + "recommendations": [ + "pavittarx.moleculer-snippets" + ] +} diff --git a/README.md b/README.md index c36528f5..3fb41c53 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@ # Welcome to moleculer-typescript-template 👋 -![Version](https://img.shields.io/badge/version-0.1.1-blue.svg?cacheSeconds=2592000) -![Prerequisite](https://img.shields.io/badge/node-%3E%3D%2014.x.x-blue.svg) +![Version](https://img.shields.io/badge/version-0.3.0-blue.svg?cacheSeconds=2592000) +![Prerequisite](https://img.shields.io/badge/node-%3E%3D%2020.x.x-blue.svg) [![Twitter: jellydn](https://img.shields.io/twitter/follow/jellydn.svg?style=social)](https://twitter.com/jellydn) > My Moleculer-based microservices project @@ -18,7 +18,7 @@ ## Prerequisites -- node >= 18.17.x +- node >= 20.0.0 ## Init new project @@ -36,6 +36,10 @@ npx degit jellydn/moleculer-typescript-template [PROJECT-NAME] - ✨ [moleculer-zod-validator](https://github.com/TheAppleFreak/moleculer-zod-validator) - A validator for the Moleculer microservice framework to allow the use of [Zod](https://zod.dev/). - 🔏 [asteasolutions/zod-to-openapi](https://github.com/asteasolutions/zod-to-openapi#defining-schemas) - A library that generates OpenAPI (Swagger) docs from Zod schemas. - 🪄 [hey-api/openapi-ts](https://github.com/hey-api/openapi-ts) - Turn your OpenAPI specification into a beautiful TypeScript client. +- 🔐 **Enhanced Validation** - Shared validation utilities with Zod schemas for consistent parameter validation across all services. +- 📝 **Comprehensive Documentation** - Auto-generated Swagger documentation with complete error handling (200, 422, 500 responses). +- 🎯 **Type Safety** - Strong TypeScript typing throughout the application with proper service interfaces. +- 📊 **Structured Responses** - Consistent JSON response format with `success`, `message`, and `data` fields. ## Install @@ -51,7 +55,7 @@ cp .env.example .env pnpm dev ``` -After starting, open the http://localhost:3000/ URL in your browser. +After starting, open the URL in your browser. On the welcome page you can test the generated services via API Gateway and check the nodes & services. ![https://gyazo.com/c8a8c8b05319504d36922458d9807db2.gif](https://gyazo.com/c8a8c8b05319504d36922458d9807db2.gif) @@ -72,6 +76,17 @@ In the terminal, try the following commands: This project uses [hygen](http://www.hygen.io/) to generate code templates, saving you time and ensuring consistency across your codebase. +## Code Generation + +All generated templates include modern best practices: + +- ✅ **Automatic validation** with shared `validateParams` utility +- ✅ **Complete Swagger documentation** with error responses +- ✅ **Strong TypeScript typing** with proper service interfaces +- ✅ **Structured JSON responses** with consistent format +- ✅ **Validation hooks** for all actions +- ✅ **Comprehensive logging** throughout the application + ### Adding a New Service To add a new service to your project, use the following command: @@ -80,6 +95,14 @@ To add a new service to your project, use the following command: pnpm generate:service [service-name] ``` +This generates a basic service with: + +- Two sample actions (`hello` and `welcome`) +- Validation hooks with `validateParams` integration +- Complete Swagger documentation +- Strong TypeScript typing +- Structured error handling + ### Adding a New Action to a Service To add a new action to an existing service, use the following command: @@ -88,6 +111,13 @@ To add a new action to an existing service, use the following command: pnpm generate:action [action-name] --service [service-name] ``` +Generated actions include: + +- Parameter validation with Zod schemas +- Complete Swagger documentation with error codes +- Structured JSON response format +- TypeScript interfaces for parameters and responses + ### Generating CRUD Services To generate a service with Create, Read, Update, and Delete (CRUD) operations, use the following command: @@ -96,6 +126,150 @@ To generate a service with Create, Read, Update, and Delete (CRUD) operations, u pnpm generate:crud [service-name] ``` +This creates a complete CRUD service with: + +- **5 actions**: `create`, `list`, `view`, `update`, `delete` +- **Pagination support** in list actions +- **Validation hooks** in all actions +- **Complete Swagger documentation** for all endpoints +- **Structured responses** with success/error handling +- **Authentication** and **authorization** ready + +### Generating Data Transfer Objects (DTOs) + +To generate Zod schemas with OpenAPI documentation, use: + +```sh +pnpm generate:dto [dto-name] +``` + +This generates: + +- **Zod schemas** with OpenAPI annotations +- **Automatic YAML generation** for Swagger integration +- **Type-safe validation** for request/response data +- **Reusable schemas** across services + +## Enhanced Template Features + +### 🔐 Automatic Parameter Validation + +All generated actions include automatic parameter validation using Zod schemas: + +```typescript +// Generated validation hook in every action +hooks: { + before(ctx) { + this.logger.info('Validating parameters for [action] action'); + validateParams(ctx, yourSchema); // Automatically included + }, +} +``` + +### 📖 Complete Swagger Documentation + +Every generated action includes comprehensive Swagger documentation: + +- **Request/Response schemas** with examples +- **Error response codes** (422 for validation, 500 for server errors) +- **Parameter descriptions** and constraints +- **Security requirements** for protected endpoints + +### 🎯 Type-Safe Development + +All templates generate strongly-typed TypeScript code: + +- **Service interfaces** with proper method signatures +- **Context typing** for action parameters +- **Response type definitions** for consistent returns +- **Generic repository interfaces** for data access + +### 📊 Structured JSON Responses + +Consistent response format across all services: + +```json +{ + "success": true, + "message": "Operation completed successfully", + "data": {}, + "pagination": { + "page": 1, + "limit": 10, + "total": 0 + } +} +``` + +## Architecture & Patterns + +This template implements several architectural patterns and best practices: + +### Shared Validation Utilities + +All services use a shared validation utility (`services/common/validation.utils.ts`) that provides: + +- **Consistent validation** across all services +- **Zod schema integration** with Moleculer context +- **Automatic error handling** with structured error responses +- **TypeScript type safety** for validation parameters + +```typescript +// Usage in any service action +hooks: { + before(ctx) { + validateParams(ctx, yourZodSchema); + }, +} +``` + +### Structured Response Format + +All actions return a consistent JSON structure: + +```typescript +// Success Response +{ + "success": true, + "message": "Operation completed successfully", + "data": { /* your data here */ } +} + +// Error Response +{ + "error": "Parameters validation error!", + "code": "VALIDATION_ERROR" +} +``` + +### Repository Pattern + +The template includes an example repository pattern implementation for data access: + +- **Interface-based design** for easy testing and swapping implementations +- **Type-safe operations** with TypeScript +- **Separation of concerns** between business logic and data access + +### Service Organization + +Services are organized with a clear structure: + +```text +services/ +├── common/ # Shared utilities and interfaces +│ ├── index.ts +│ ├── validation.utils.ts +│ └── repository.interface.ts +├── dtos/ # Data Transfer Objects with Zod schemas +│ ├── [name].dto.ts +│ └── [name]-dto.swagger.yaml +└── [service]/ # Individual service folders + ├── [service].service.ts + ├── [service].repository.ts + └── actions/ # Action implementations + └── [action].action.ts +``` + ## API Documentation This template also reads your [JSDoc-annotated](https://github.com/Surnet/swagger-jsdoc/blob/v6/docs/README.md) source code and generates an OpenAPI (Swagger) specification. @@ -106,7 +280,7 @@ Run the following command to generate the Swagger documentation: pnpm generate:swagger ``` -Open the http://localhost:3000/docs URL in your browser, you will see the Swagger UI as +Open the URL in your browser, you will see the Swagger UI as ![https://gyazo.com/a4fe2413414c94dde636a531eee1a4a0.gif](https://gyazo.com/a4fe2413414c94dde636a531eee1a4a0.gif) @@ -149,8 +323,8 @@ We use GitHub Actions for continuous integration and deployment. Anything that g ## Useful links -- Moleculer website: https://moleculer.services/ -- Moleculer Documentation: https://moleculer.services/docs/0.14/ +- Moleculer website: +- Moleculer Documentation: ## NPM scripts @@ -162,6 +336,15 @@ We use GitHub Actions for continuous integration and deployment. Anything that g - `pnpm dc:up`: Start the stack with Docker Compose - `pnpm dc:down`: Stop the stack with Docker Compose +### Code Generation Scripts + +- `pnpm generate:service [name]`: Generate a new basic service with validation and documentation +- `pnpm generate:crud [name]`: Generate a complete CRUD service with all operations +- `pnpm generate:action [name] --service [service]`: Add a new action to an existing service +- `pnpm generate:dto [name]`: Generate Zod schemas with OpenAPI documentation +- `pnpm generate:swagger`: Generate OpenAPI documentation from JSDoc comments +- `pnpm generate:sdk`: Generate TypeScript client from OpenAPI specification + ## Pre-commit hooks This template uses [Pre-commit](https://pre-commit.com/) to run checks before you commit your code. This ensures that your code is formatted correctly and passes all tests before you push it to your repository. @@ -180,7 +363,7 @@ pre-commit run --all-files 👤 **Dung Huynh** -- Website: https://productsway.com/ +- Website: - Twitter: [@jellydn](https://twitter.com/jellydn) - Github: [@jellydn](https://github.com/jellydn) diff --git a/_templates/action/new/hello.ejs.t b/_templates/action/new/hello.ejs.t index 4dcf4ce5..06f2507d 100644 --- a/_templates/action/new/hello.ejs.t +++ b/_templates/action/new/hello.ejs.t @@ -2,14 +2,17 @@ to: services/<%= service %>/actions/<%= name %>.action.ts --- import type { Context, ServiceActionsSchema } from "moleculer"; +import { validateParams } from "../../common"; /** * The <%= name %> action. * * @swagger - * /welcome: + * /api/<%= service %>/<%= name %>: * get: * summary: Returns a greeting and calculates the age in days. + * tags: + * - <%= service %> * parameters: * - in: query * name: name @@ -27,20 +30,43 @@ import type { Context, ServiceActionsSchema } from "moleculer"; * 200: * description: A greeting message and the age in days. * content: - * text/plain: + * application/json: * schema: - * type: string - * example: "Hello John, you are 10950 days old!" + * type: object + * properties: + * message: + * type: string + * example: "Hello John, you are 10950 days old!" + * success: + * type: boolean + * example: true + * 422: + * description: Validation error + * content: + * application/json: + * schema: + * type: object + * properties: + * error: + * type: string + * example: Parameters validation error! */ const <%= name %>Action: ServiceActionsSchema = { rest: { method: "GET", - path: "/welcome", + path: "/<%= name %>", }, params: { name: "string", age: "number", }, + hooks: { + before(ctx) { + this.logger.info('Validating parameters for <%= name %> action'); + // Add your validation schema here + // validateParams(ctx, your<%= h.capitalize(name) %>Schema); + }, + }, handler: <%= name %>Handler, }; @@ -52,11 +78,14 @@ function <%= name %>Handler( name: string; age: number; }>, -): string { +): { message: string; success: boolean } { // Calculate the age in days const ageInDays = ctx.params.age * 365; - return `Hello ${ctx.params.name}, you are ${ageInDays} days old!`; + return { + message: `Hello ${ctx.params.name}, you are ${ageInDays} days old!`, + success: true, + }; } export default <%= name %>Action; diff --git a/_templates/dto/new/hello.ejs.t b/_templates/dto/new/hello.ejs.t new file mode 100644 index 00000000..76c42ff4 --- /dev/null +++ b/_templates/dto/new/hello.ejs.t @@ -0,0 +1,80 @@ +--- +to: services/dtos/<%= name %>.dto.ts +--- +import { + extendZodWithOpenApi, + OpenApiGeneratorV3, +} from "@asteasolutions/zod-to-openapi"; +import { writeFileSync } from "node:fs"; +import { resolve } from "node:path"; +import yaml from "yaml"; +import { z } from "zod"; + +extendZodWithOpenApi(z); + +// Define your <%= name %> schema here +const <%= name %>RawSchema = { + name: z.string().min(1).max(100).openapi({ + description: "<%= h.capitalize(name) %> name", + example: "Sample <%= name %>", + }), + description: z.string().min(1).max(500).openapi({ + description: "<%= h.capitalize(name) %> description", + example: "This is a sample <%= name %>", + }), +}; + +// Write to same folder with the DTO file +const outputDirectory = __dirname; + +export const <%= h.capitalize(name) %>Schema = z.object(<%= name %>RawSchema).openapi("<%= name %>DTO", { + description: "<%= h.capitalize(name) %> DTO", +}); + +export const <%= h.capitalize(name) %>ResponseSchema = z.object({ + success: z.boolean().openapi({ + description: "Operation success status", + example: true, + }), + message: z.string().openapi({ + description: "Response message", + example: "<%= h.capitalize(name) %> operation completed successfully", + }), + data: <%= h.capitalize(name) %>Schema.optional().openapi({ + description: "<%= h.capitalize(name) %> data", + }), +}).openapi("<%= name %>ResponseDTO", { + description: "<%= h.capitalize(name) %> response DTO", +}); + +export const ErrorResponseSchema = z.object({ + error: z.string().openapi({ + description: "Error message", + example: "Parameters validation error!", + }), + code: z.string().optional().openapi({ + description: "Error code", + example: "VALIDATION_ERROR", + }), +}).openapi("errorResponseDTO", { + description: "Error response DTO", +}); + +const generator = new OpenApiGeneratorV3([ + <%= h.capitalize(name) %>Schema, + <%= h.capitalize(name) %>ResponseSchema, + ErrorResponseSchema, +]); +const components = generator.generateComponents(); + +// Write to YAML file +try { + writeFileSync( + resolve(outputDirectory, "<%= name %>-dto.swagger.yaml"), + yaml.stringify(components) + ); + console.log("✅ Successfully generated <%= name %>-dto.swagger.yaml"); +} catch (error) { + console.error("❌ Error writing <%= name %>-dto.swagger.yaml:", error); + throw error; +} diff --git a/_templates/service/crud/create.ejs.t b/_templates/service/crud/create.ejs.t index 802a8def..19ac8446 100644 --- a/_templates/service/crud/create.ejs.t +++ b/_templates/service/crud/create.ejs.t @@ -3,6 +3,7 @@ to: services/<%= name %>/actions/create<%= h.capitalize(name) %>.action.ts --- import type { Context, ServiceActionsSchema } from 'moleculer'; +import { validateParams } from '../../common'; /** * Handler for the create action. @@ -13,13 +14,14 @@ function createHandler( }>, ) { return { - message: 'Created successfully', + success: true, + message: '<%= h.capitalize(name) %> created successfully', data: ctx.params, }; } /** - * The create project action. + * The create <%= name %> action. * * @swagger * /api/<%= name %>: @@ -38,13 +40,38 @@ function createHandler( * properties: * name: * type: string - * description: The name to greet. - * age: - * type: number - * description: The age of the person to calculate the days. + * description: The name of the <%= name %>. + * description: + * type: string + * description: Description of the <%= name %>. * responses: - * 200: + * 201: * description: <%= name %> created successfully. + * content: + * application/json: + * schema: + * type: object + * properties: + * success: + * type: boolean + * example: true + * message: + * type: string + * example: <%= h.capitalize(name) %> created successfully + * data: + * type: object + * 422: + * description: Validation error + * content: + * application/json: + * schema: + * type: object + * properties: + * error: + * type: string + * example: Parameters validation error! + * 500: + * description: Internal server error */ const create<%= h.capitalize(name) %>Action: ServiceActionsSchema = { rest: { @@ -56,6 +83,13 @@ const create<%= h.capitalize(name) %>Action: ServiceActionsSchema = { params: { <%= name %>: { type: "object" } }, + hooks: { + before(ctx) { + this.logger.info('Validating parameters for create<%= h.capitalize(name) %> action'); + // Add your validation schema here + // validateParams(ctx, your<%= h.capitalize(name) %>Schema); + }, + }, handler: createHandler, }; diff --git a/_templates/service/crud/list.ejs.t b/_templates/service/crud/list.ejs.t index 13129d93..1c4cbca7 100644 --- a/_templates/service/crud/list.ejs.t +++ b/_templates/service/crud/list.ejs.t @@ -2,13 +2,47 @@ to: services/<%= name %>/actions/list<%= h.capitalize(name) %>.action.ts --- -import type { ServiceActionsSchema } from 'moleculer'; +import type { Context, ServiceActionsSchema } from 'moleculer'; +import { z } from 'zod'; +import { validateParams } from '../../common'; + +/** + * List parameters validation schema + */ +const listParamsSchema = z.object({ + page: z.string().optional().default('1').transform((val) => { + const parsed = parseInt(val, 10); + if (isNaN(parsed) || parsed < 1) { + throw new Error('Page must be a positive integer'); + } + return parsed; + }), + limit: z.string().optional().default('10').transform((val) => { + const parsed = parseInt(val, 10); + if (isNaN(parsed) || parsed < 1 || parsed > 100) { + throw new Error('Limit must be a positive integer between 1 and 100'); + } + return parsed; + }), +}); /** * Handler for the list action. */ -function listHandler() { - return []; +function listHandler( + ctx: Context> +) { + const { page, limit } = ctx.params; + + return { + success: true, + data: [], + pagination: { + page, + limit, + total: 0, + }, + }; } /** @@ -27,13 +61,38 @@ function listHandler() { * name: page * schema: * type: string + * description: Page number for pagination * - in: query * name: limit * schema: * type: string + * description: Number of items per page * responses: * 200: * description: The <%= name %> list. + * content: + * application/json: + * schema: + * type: object + * properties: + * success: + * type: boolean + * example: true + * data: + * type: array + * items: + * type: object + * pagination: + * type: object + * properties: + * page: + * type: number + * limit: + * type: number + * total: + * type: number + * 422: + * description: Validation error */ const list<%= h.capitalize(name) %>Action: ServiceActionsSchema = { rest: { @@ -42,9 +101,11 @@ const list<%= h.capitalize(name) %>Action: ServiceActionsSchema = { }, auth: true, permissions: [], - params: { - page: 'string', - limit: 'string', + hooks: { + before(ctx) { + this.logger.info('Validating parameters for list<%= h.capitalize(name) %> action'); + validateParams(ctx, listParamsSchema); + }, }, handler: listHandler, }; diff --git a/_templates/service/crud/service.ejs.t b/_templates/service/crud/service.ejs.t index f26e1d89..8b639f9c 100644 --- a/_templates/service/crud/service.ejs.t +++ b/_templates/service/crud/service.ejs.t @@ -1,7 +1,7 @@ --- to: services/<%= name %>/<%= name %>.service.ts --- -import type { ServiceSchema } from "moleculer"; +import type { Service, ServiceSchema } from "moleculer"; import createAction from "./actions/create<%= h.capitalize(name) %>.action"; import editAction from "./actions/update<%= h.capitalize(name) %>.action"; @@ -13,6 +13,12 @@ type ServiceSettings = { defaultName: string; }; +type ServiceMethods = { + uppercase(str: string): string; +}; + +type ServiceThis = Service & ServiceMethods; + /** * Define common components for the <%= name %> service. * @@ -24,7 +30,7 @@ type ServiceSettings = { * scheme: bearer * bearerFormat: JWT */ -const <%= name %>Service: ServiceSchema = { +const <%= name %>Service: ServiceSchema = { name: "<%= name %>", /** @@ -81,14 +87,14 @@ const <%= name %>Service: ServiceSchema = { /** * Service started lifecycle event handler */ - started() { + async started() { this.logger.info(`The ${this.name} service started.`); }, /** * Service stopped lifecycle event handler */ - stopped() { + async stopped() { this.logger.info(`The ${this.name} service stopped.`); }, }; diff --git a/_templates/service/new/hello.ejs.t b/_templates/service/new/hello.ejs.t index b93524e1..96f1ca47 100644 --- a/_templates/service/new/hello.ejs.t +++ b/_templates/service/new/hello.ejs.t @@ -2,6 +2,9 @@ to: services/<%= name %>.service.ts --- import type { Context, Service, ServiceSchema } from "moleculer"; +import { ZodParams } from "moleculer-zod-validator"; + +import { validateParams } from "./common"; export type ActionHelloParams = { name: string; @@ -38,8 +41,20 @@ const <%= name %>Service: ServiceSchema = { actions: { /** * Say a 'Hello' action. - * - * @returns + * @swagger + * /api/<%= name %>/hello: + * get: + * description: Returns a greeting message + * tags: + * - <%= name %> + * responses: + * 200: + * description: Hello message + * content: + * text/plain: + * schema: + * type: string + * example: Hello Moleculer */ hello: { rest: { @@ -53,18 +68,50 @@ const <%= name %>Service: ServiceSchema = { /** * Welcome, a username - * - * @param {String} name - User name + * @swagger + * /api/<%= name %>/welcome/{name}: + * get: + * description: Returns a welcome message for a user + * tags: + * - <%= name %> + * parameters: + * - in: path + * name: name + * required: true + * schema: + * type: string + * description: User name + * responses: + * 200: + * description: Welcome message + * content: + * text/plain: + * schema: + * type: string + * example: Welcome, John + * 422: + * description: Validation error */ welcome: { rest: "GET /welcome/:name", params: { name: "string", }, + hooks: { + before(ctx) { + this.logger.info("Validating parameters for welcome action"); + // Add your validation schema here if needed + // validateParams(ctx, yourSchema); + }, + }, handler( this: ServiceThis, ctx: Context, ): string { + this.logger.info( + "welcome action called with parameters: %o", + ctx.params + ); return `Welcome, ${ctx.params.name}`; }, }, diff --git a/deta.json b/deta.json deleted file mode 100644 index 6d4cc364..00000000 --- a/deta.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "name": "moleculer-typescript-template", - "description": "My Moleculer-based microservices project", - "runtime": "nodejs14.x", - "env": [] -} diff --git a/package.json b/package.json index 64cc4ada..ed4398c4 100644 --- a/package.json +++ b/package.json @@ -2,14 +2,18 @@ "name": "moleculer-typescript-template", "version": "0.3.0", "description": "My Moleculer-based microservices project", - "keywords": ["microservices", "moleculer", "moleculer typescript template"], + "keywords": [ + "microservices", + "moleculer", + "moleculer typescript template" + ], "license": "MIT", "author": "Huynh Duc Dung", "scripts": { "dev": "run-p -l dev:*", "dev:api": "npx tsx watch ./server.ts | npx pino-pretty", "logdy": "npx tsx watch ./server.ts | logdy --no-analytics --port 4567", - "dev:swagger": "wait-on -c ./wait-on.config.cjs -l && npm run generate:swagger", + "dev:swagger": "wait-on -c ./wait-on.config.cjs -l && pnpm generate:swagger", "start": "npx tsx ./server.ts", "cli": "NODE_OPTIONS='--import tsx' moleculer-connect --env --config moleculer.config.ts --transporter NATS", "ci": "biome ci .", @@ -26,15 +30,16 @@ "dc:logs": "docker compose logs -f", "dc:down": "docker compose down", "generate:service": "hygen service new --name", + "generate:dto": "hygen dto new --name", "generate:crud": "hygen service crud --name", "generate:action": "hygen action new --name", "generate:swagger": "npx tsx cli.ts", "generate:sdk": "openapi-ts", - "typecheck": "npm run generate:sdk && tsc -b" + "typecheck": "pnpm generate:sdk && tsc -b" }, "dependencies": { - "@asteasolutions/zod-to-openapi": "7.3.0", - "dotenv": "16.5.0", + "@asteasolutions/zod-to-openapi": "7.3.4", + "dotenv": "17.0.0", "helmet": "8.1.0", "lodash.defaultsdeep": "4.6.1", "moleculer": "0.14.35", @@ -42,47 +47,51 @@ "moleculer-zod-validator": "3.3.1", "nats": "2.29.3", "openapi-types": "12.1.3", - "pino": "9.6.0", + "pino": "9.7.0", "swagger-jsdoc": "6.2.8", - "yaml": "2.7.1", - "zod": "3.24.3" + "yaml": "2.8.0", + "zod": "3.25.67" }, "devDependencies": { - "@biomejs/biome": "1.9.4", + "@biomejs/biome": "2.0.6", "@flydotio/dockerfile": "0.7.10", - "@hey-api/openapi-ts": "0.66.6", - "@types/express": "5.0.1", - "@types/jest": "29.5.14", - "@types/lodash": "4.17.16", - "@types/node": "22.15.2", + "@hey-api/openapi-ts": "0.77.0", + "@types/express": "5.0.3", + "@types/jest": "30.0.0", + "@types/lodash": "4.17.19", + "@types/node": "24.0.6", "@types/swagger-jsdoc": "6.0.4", "@types/ws": "8.18.1", - "@vitest/ui": "3.1.2", + "@vitest/coverage-v8": "3.2.4", + "@vitest/ui": "3.2.4", "c8": "10.1.3", "cleye": "1.3.4", "express": "5.1.0", "graphql": "16.11.0", - "graphql-ws": "6.0.4", + "graphql-ws": "6.0.5", "hygen": "6.2.11", "moleculer-connect": "0.2.2", "moleculer-io": "2.2.0", "moleculer-repl": "0.7.4", - "npm-run-all2": "7.0.2", + "npm-run-all2": "8.0.4", "pino-pretty": "13.0.0", - "sort-package-json": "3.0.0", - "tsup": "8.4.0", - "tsx": "4.19.3", + "sort-package-json": "3.3.1", + "tsup": "8.5.0", + "tsx": "4.20.3", "typescript": "5.8.3", - "vite": "6.3.3", - "vitest": "3.1.2", + "vite": "7.0.0", + "vitest": "3.2.4", "wait-on": "8.0.3", - "ws": "8.18.1" + "ws": "8.18.2" }, "packageManager": "pnpm@10.9.0", "engines": { - "node": ">= 18.17.x" + "node": ">= 20.0.0" }, "pnpm": { - "onlyBuiltDependencies": ["esbuild"] + "onlyBuiltDependencies": [ + "es5-ext", + "esbuild" + ] } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 8ce3e665..3e442f38 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -9,11 +9,11 @@ importers: .: dependencies: '@asteasolutions/zod-to-openapi': - specifier: 7.3.0 - version: 7.3.0(zod@3.24.3) + specifier: 7.3.4 + version: 7.3.4(zod@3.25.67) dotenv: - specifier: 16.5.0 - version: 16.5.0 + specifier: 17.0.0 + version: 17.0.0 helmet: specifier: 8.1.0 version: 8.1.0 @@ -22,13 +22,13 @@ importers: version: 4.6.1 moleculer: specifier: 0.14.35 - version: 0.14.35(debug@4.4.0)(nats@2.29.3)(pino@9.6.0) + version: 0.14.35(debug@4.4.1)(nats@2.29.3)(pino@9.7.0) moleculer-web: specifier: 0.10.8 - version: 0.10.8(moleculer@0.14.35(debug@4.4.0)(nats@2.29.3)(pino@9.6.0)) + version: 0.10.8(moleculer@0.14.35(debug@4.4.1)(nats@2.29.3)(pino@9.7.0)) moleculer-zod-validator: specifier: 3.3.1 - version: 3.3.1(moleculer@0.14.35(debug@4.4.0)(nats@2.29.3)(pino@9.6.0))(zod@3.24.3) + version: 3.3.1(moleculer@0.14.35(debug@4.4.1)(nats@2.29.3)(pino@9.7.0))(zod@3.25.67) nats: specifier: 2.29.3 version: 2.29.3 @@ -36,48 +36,51 @@ importers: specifier: 12.1.3 version: 12.1.3 pino: - specifier: 9.6.0 - version: 9.6.0 + specifier: 9.7.0 + version: 9.7.0 swagger-jsdoc: specifier: 6.2.8 version: 6.2.8(openapi-types@12.1.3) yaml: - specifier: 2.7.1 - version: 2.7.1 + specifier: 2.8.0 + version: 2.8.0 zod: - specifier: 3.24.3 - version: 3.24.3 + specifier: 3.25.67 + version: 3.25.67 devDependencies: '@biomejs/biome': - specifier: 1.9.4 - version: 1.9.4 + specifier: 2.0.6 + version: 2.0.6 '@flydotio/dockerfile': specifier: 0.7.10 - version: 0.7.10(@types/node@22.15.2) + version: 0.7.10(@types/node@24.0.6) '@hey-api/openapi-ts': - specifier: 0.66.6 - version: 0.66.6(typescript@5.8.3) + specifier: 0.77.0 + version: 0.77.0(magicast@0.3.5)(typescript@5.8.3) '@types/express': - specifier: 5.0.1 - version: 5.0.1 + specifier: 5.0.3 + version: 5.0.3 '@types/jest': - specifier: 29.5.14 - version: 29.5.14 + specifier: 30.0.0 + version: 30.0.0 '@types/lodash': - specifier: 4.17.16 - version: 4.17.16 + specifier: 4.17.19 + version: 4.17.19 '@types/node': - specifier: 22.15.2 - version: 22.15.2 + specifier: 24.0.6 + version: 24.0.6 '@types/swagger-jsdoc': specifier: 6.0.4 version: 6.0.4 '@types/ws': specifier: 8.18.1 version: 8.18.1 + '@vitest/coverage-v8': + specifier: 3.2.4 + version: 3.2.4(vitest@3.2.4) '@vitest/ui': - specifier: 3.1.2 - version: 3.1.2(vitest@3.1.2) + specifier: 3.2.4 + version: 3.2.4(vitest@3.2.4) c8: specifier: 10.1.3 version: 10.1.3 @@ -91,53 +94,57 @@ importers: specifier: 16.11.0 version: 16.11.0 graphql-ws: - specifier: 6.0.4 - version: 6.0.4(graphql@16.11.0)(ws@8.18.1) + specifier: 6.0.5 + version: 6.0.5(graphql@16.11.0)(ws@8.18.2) hygen: specifier: 6.2.11 version: 6.2.11 moleculer-connect: specifier: 0.2.2 - version: 0.2.2(debug@4.4.0)(moleculer-repl@0.7.4) + version: 0.2.2(debug@4.4.1)(moleculer-repl@0.7.4) moleculer-io: specifier: 2.2.0 - version: 2.2.0(moleculer@0.14.35(debug@4.4.0)(nats@2.29.3)(pino@9.6.0)) + version: 2.2.0(moleculer@0.14.35(debug@4.4.1)(nats@2.29.3)(pino@9.7.0)) moleculer-repl: specifier: 0.7.4 version: 0.7.4 npm-run-all2: - specifier: 7.0.2 - version: 7.0.2 + specifier: 8.0.4 + version: 8.0.4 pino-pretty: specifier: 13.0.0 version: 13.0.0 sort-package-json: - specifier: 3.0.0 - version: 3.0.0 + specifier: 3.3.1 + version: 3.3.1 tsup: - specifier: 8.4.0 - version: 8.4.0(jiti@2.4.2)(postcss@8.5.3)(tsx@4.19.3)(typescript@5.8.3)(yaml@2.7.1) + specifier: 8.5.0 + version: 8.5.0(jiti@2.4.2)(postcss@8.5.6)(tsx@4.20.3)(typescript@5.8.3)(yaml@2.8.0) tsx: - specifier: 4.19.3 - version: 4.19.3 + specifier: 4.20.3 + version: 4.20.3 typescript: specifier: 5.8.3 version: 5.8.3 vite: - specifier: 6.3.3 - version: 6.3.3(@types/node@22.15.2)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.7.1) + specifier: 7.0.0 + version: 7.0.0(@types/node@24.0.6)(jiti@2.4.2)(tsx@4.20.3)(yaml@2.8.0) vitest: - specifier: 3.1.2 - version: 3.1.2(@types/node@22.15.2)(@vitest/ui@3.1.2)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.7.1) + specifier: 3.2.4 + version: 3.2.4(@types/node@24.0.6)(@vitest/ui@3.2.4)(jiti@2.4.2)(tsx@4.20.3)(yaml@2.8.0) wait-on: specifier: 8.0.3 - version: 8.0.3(debug@4.4.0) + version: 8.0.3(debug@4.4.1) ws: - specifier: 8.18.1 - version: 8.18.1 + specifier: 8.18.2 + version: 8.18.2 packages: + '@ampproject/remapping@2.3.0': + resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} + engines: {node: '>=6.0.0'} + '@apidevtools/json-schema-ref-parser@9.1.2': resolution: {integrity: sha512-r1w81DpR+KyRWd3f+rk6TNqMgedmAxZP5v5KWlXQWlgMUUtyEJch0DKEci1SorPMiSeM8XPl7MZ3miJ60JIpQg==} @@ -153,222 +160,235 @@ packages: peerDependencies: openapi-types: '>=7' - '@asteasolutions/zod-to-openapi@7.3.0': - resolution: {integrity: sha512-7tE/r1gXwMIvGnXVUdIqUhCU1RevEFC4Jk6Bussa0fk1ecbnnINkZzj1EOAJyE/M3AI25DnHT/zKQL1/FPFi8Q==} + '@asteasolutions/zod-to-openapi@7.3.4': + resolution: {integrity: sha512-/2rThQ5zPi9OzVwes6U7lK1+Yvug0iXu25olp7S0XsYmOqnyMfxH7gdSQjn/+DSOHRg7wnotwGJSyL+fBKdnEA==} peerDependencies: zod: ^3.20.2 - '@babel/code-frame@7.26.2': - resolution: {integrity: sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==} + '@babel/code-frame@7.27.1': + resolution: {integrity: sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==} engines: {node: '>=6.9.0'} - '@babel/helper-validator-identifier@7.25.9': - resolution: {integrity: sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==} + '@babel/helper-string-parser@7.27.1': + resolution: {integrity: sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==} + engines: {node: '>=6.9.0'} + + '@babel/helper-validator-identifier@7.27.1': + resolution: {integrity: sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==} + engines: {node: '>=6.9.0'} + + '@babel/parser@7.28.0': + resolution: {integrity: sha512-jVZGvOxOuNSsuQuLRTh13nU0AogFlw32w/MT+LV6D3sP5WdbW61E77RnkbaO2dUvmPAYrBDJXGn5gGS6tH4j8g==} + engines: {node: '>=6.0.0'} + hasBin: true + + '@babel/types@7.28.0': + resolution: {integrity: sha512-jYnje+JyZG5YThjHiF28oT4SIZLnYOcSBb6+SDaFIyzDVSkXQmQQYclJ2R+YxcdmK0AX6x1E5OQNtuh3jHDrUg==} engines: {node: '>=6.9.0'} '@bcoe/v8-coverage@1.0.2': resolution: {integrity: sha512-6zABk/ECA/QYSCQ1NGiVwwbQerUCZ+TQbp64Q3AgmfNvurHH0j8TtXa1qbShXA6qqkpAj4V5W8pP6mLe1mcMqA==} engines: {node: '>=18'} - '@biomejs/biome@1.9.4': - resolution: {integrity: sha512-1rkd7G70+o9KkTn5KLmDYXihGoTaIGO9PIIN2ZB7UJxFrWw04CZHPYiMRjYsaDvVV7hP1dYNRLxSANLaBFGpog==} + '@biomejs/biome@2.0.6': + resolution: {integrity: sha512-RRP+9cdh5qwe2t0gORwXaa27oTOiQRQvrFf49x2PA1tnpsyU7FIHX4ZOFMtBC4QNtyWsN7Dqkf5EDbg4X+9iqA==} engines: {node: '>=14.21.3'} hasBin: true - '@biomejs/cli-darwin-arm64@1.9.4': - resolution: {integrity: sha512-bFBsPWrNvkdKrNCYeAp+xo2HecOGPAy9WyNyB/jKnnedgzl4W4Hb9ZMzYNbf8dMCGmUdSavlYHiR01QaYR58cw==} + '@biomejs/cli-darwin-arm64@2.0.6': + resolution: {integrity: sha512-AzdiNNjNzsE6LfqWyBvcL29uWoIuZUkndu+wwlXW13EKcBHbbKjNQEZIJKYDc6IL+p7bmWGx3v9ZtcRyIoIz5A==} engines: {node: '>=14.21.3'} cpu: [arm64] os: [darwin] - '@biomejs/cli-darwin-x64@1.9.4': - resolution: {integrity: sha512-ngYBh/+bEedqkSevPVhLP4QfVPCpb+4BBe2p7Xs32dBgs7rh9nY2AIYUL6BgLw1JVXV8GlpKmb/hNiuIxfPfZg==} + '@biomejs/cli-darwin-x64@2.0.6': + resolution: {integrity: sha512-wJjjP4E7bO4WJmiQaLnsdXMa516dbtC6542qeRkyJg0MqMXP0fvs4gdsHhZ7p9XWTAmGIjZHFKXdsjBvKGIJJQ==} engines: {node: '>=14.21.3'} cpu: [x64] os: [darwin] - '@biomejs/cli-linux-arm64-musl@1.9.4': - resolution: {integrity: sha512-v665Ct9WCRjGa8+kTr0CzApU0+XXtRgwmzIf1SeKSGAv+2scAlW6JR5PMFo6FzqqZ64Po79cKODKf3/AAmECqA==} + '@biomejs/cli-linux-arm64-musl@2.0.6': + resolution: {integrity: sha512-CVPEMlin3bW49sBqLBg2x016Pws7eUXA27XYDFlEtponD0luYjg2zQaMJ2nOqlkKG9fqzzkamdYxHdMDc2gZFw==} engines: {node: '>=14.21.3'} cpu: [arm64] os: [linux] - '@biomejs/cli-linux-arm64@1.9.4': - resolution: {integrity: sha512-fJIW0+LYujdjUgJJuwesP4EjIBl/N/TcOX3IvIHJQNsAqvV2CHIogsmA94BPG6jZATS4Hi+xv4SkBBQSt1N4/g==} + '@biomejs/cli-linux-arm64@2.0.6': + resolution: {integrity: sha512-ZSVf6TYo5rNMUHIW1tww+rs/krol7U5A1Is/yzWyHVZguuB0lBnIodqyFuwCNqG9aJGyk7xIMS8HG0qGUPz0SA==} engines: {node: '>=14.21.3'} cpu: [arm64] os: [linux] - '@biomejs/cli-linux-x64-musl@1.9.4': - resolution: {integrity: sha512-gEhi/jSBhZ2m6wjV530Yy8+fNqG8PAinM3oV7CyO+6c3CEh16Eizm21uHVsyVBEB6RIM8JHIl6AGYCv6Q6Q9Tg==} + '@biomejs/cli-linux-x64-musl@2.0.6': + resolution: {integrity: sha512-mKHE/e954hR/hSnAcJSjkf4xGqZc/53Kh39HVW1EgO5iFi0JutTN07TSjEMg616julRtfSNJi0KNyxvc30Y4rQ==} engines: {node: '>=14.21.3'} cpu: [x64] os: [linux] - '@biomejs/cli-linux-x64@1.9.4': - resolution: {integrity: sha512-lRCJv/Vi3Vlwmbd6K+oQ0KhLHMAysN8lXoCI7XeHlxaajk06u7G+UsFSO01NAs5iYuWKmVZjmiOzJ0OJmGsMwg==} + '@biomejs/cli-linux-x64@2.0.6': + resolution: {integrity: sha512-geM1MkHTV1Kh2Cs/Xzot9BOF3WBacihw6bkEmxkz4nSga8B9/hWy5BDiOG3gHDGIBa8WxT0nzsJs2f/hPqQIQw==} engines: {node: '>=14.21.3'} cpu: [x64] os: [linux] - '@biomejs/cli-win32-arm64@1.9.4': - resolution: {integrity: sha512-tlbhLk+WXZmgwoIKwHIHEBZUwxml7bRJgk0X2sPyNR3S93cdRq6XulAZRQJ17FYGGzWne0fgrXBKpl7l4M87Hg==} + '@biomejs/cli-win32-arm64@2.0.6': + resolution: {integrity: sha512-290V4oSFoKaprKE1zkYVsDfAdn0An5DowZ+GIABgjoq1ndhvNxkJcpxPsiYtT7slbVe3xmlT0ncdfOsN7KruzA==} engines: {node: '>=14.21.3'} cpu: [arm64] os: [win32] - '@biomejs/cli-win32-x64@1.9.4': - resolution: {integrity: sha512-8Y5wMhVIPaWe6jw2H+KlEm4wP/f7EW3810ZLmDlrEEy5KvBsb9ECEfu/kMWD484ijfQ8+nIi0giMgu9g1UAuuA==} + '@biomejs/cli-win32-x64@2.0.6': + resolution: {integrity: sha512-bfM1Bce0d69Ao7pjTjUS+AWSZ02+5UHdiAP85Th8e9yV5xzw6JrHXbL5YWlcEKQ84FIZMdDc7ncuti1wd2sdbw==} engines: {node: '>=14.21.3'} cpu: [x64] os: [win32] - '@esbuild/aix-ppc64@0.25.1': - resolution: {integrity: sha512-kfYGy8IdzTGy+z0vFGvExZtxkFlA4zAxgKEahG9KE1ScBjpQnFsNOX8KTU5ojNru5ed5CVoJYXFtoxaq5nFbjQ==} + '@esbuild/aix-ppc64@0.25.5': + resolution: {integrity: sha512-9o3TMmpmftaCMepOdA5k/yDw8SfInyzWWTjYTFCX3kPSDJMROQTb8jg+h9Cnwnmm1vOzvxN7gIfB5V2ewpjtGA==} engines: {node: '>=18'} cpu: [ppc64] os: [aix] - '@esbuild/android-arm64@0.25.1': - resolution: {integrity: sha512-50tM0zCJW5kGqgG7fQ7IHvQOcAn9TKiVRuQ/lN0xR+T2lzEFvAi1ZcS8DiksFcEpf1t/GYOeOfCAgDHFpkiSmA==} + '@esbuild/android-arm64@0.25.5': + resolution: {integrity: sha512-VGzGhj4lJO+TVGV1v8ntCZWJktV7SGCs3Pn1GRWI1SBFtRALoomm8k5E9Pmwg3HOAal2VDc2F9+PM/rEY6oIDg==} engines: {node: '>=18'} cpu: [arm64] os: [android] - '@esbuild/android-arm@0.25.1': - resolution: {integrity: sha512-dp+MshLYux6j/JjdqVLnMglQlFu+MuVeNrmT5nk6q07wNhCdSnB7QZj+7G8VMUGh1q+vj2Bq8kRsuyA00I/k+Q==} + '@esbuild/android-arm@0.25.5': + resolution: {integrity: sha512-AdJKSPeEHgi7/ZhuIPtcQKr5RQdo6OO2IL87JkianiMYMPbCtot9fxPbrMiBADOWWm3T2si9stAiVsGbTQFkbA==} engines: {node: '>=18'} cpu: [arm] os: [android] - '@esbuild/android-x64@0.25.1': - resolution: {integrity: sha512-GCj6WfUtNldqUzYkN/ITtlhwQqGWu9S45vUXs7EIYf+7rCiiqH9bCloatO9VhxsL0Pji+PF4Lz2XXCES+Q8hDw==} + '@esbuild/android-x64@0.25.5': + resolution: {integrity: sha512-D2GyJT1kjvO//drbRT3Hib9XPwQeWd9vZoBJn+bu/lVsOZ13cqNdDeqIF/xQ5/VmWvMduP6AmXvylO/PIc2isw==} engines: {node: '>=18'} cpu: [x64] os: [android] - '@esbuild/darwin-arm64@0.25.1': - resolution: {integrity: sha512-5hEZKPf+nQjYoSr/elb62U19/l1mZDdqidGfmFutVUjjUZrOazAtwK+Kr+3y0C/oeJfLlxo9fXb1w7L+P7E4FQ==} + '@esbuild/darwin-arm64@0.25.5': + resolution: {integrity: sha512-GtaBgammVvdF7aPIgH2jxMDdivezgFu6iKpmT+48+F8Hhg5J/sfnDieg0aeG/jfSvkYQU2/pceFPDKlqZzwnfQ==} engines: {node: '>=18'} cpu: [arm64] os: [darwin] - '@esbuild/darwin-x64@0.25.1': - resolution: {integrity: sha512-hxVnwL2Dqs3fM1IWq8Iezh0cX7ZGdVhbTfnOy5uURtao5OIVCEyj9xIzemDi7sRvKsuSdtCAhMKarxqtlyVyfA==} + '@esbuild/darwin-x64@0.25.5': + resolution: {integrity: sha512-1iT4FVL0dJ76/q1wd7XDsXrSW+oLoquptvh4CLR4kITDtqi2e/xwXwdCVH8hVHU43wgJdsq7Gxuzcs6Iq/7bxQ==} engines: {node: '>=18'} cpu: [x64] os: [darwin] - '@esbuild/freebsd-arm64@0.25.1': - resolution: {integrity: sha512-1MrCZs0fZa2g8E+FUo2ipw6jw5qqQiH+tERoS5fAfKnRx6NXH31tXBKI3VpmLijLH6yriMZsxJtaXUyFt/8Y4A==} + '@esbuild/freebsd-arm64@0.25.5': + resolution: {integrity: sha512-nk4tGP3JThz4La38Uy/gzyXtpkPW8zSAmoUhK9xKKXdBCzKODMc2adkB2+8om9BDYugz+uGV7sLmpTYzvmz6Sw==} engines: {node: '>=18'} cpu: [arm64] os: [freebsd] - '@esbuild/freebsd-x64@0.25.1': - resolution: {integrity: sha512-0IZWLiTyz7nm0xuIs0q1Y3QWJC52R8aSXxe40VUxm6BB1RNmkODtW6LHvWRrGiICulcX7ZvyH6h5fqdLu4gkww==} + '@esbuild/freebsd-x64@0.25.5': + resolution: {integrity: sha512-PrikaNjiXdR2laW6OIjlbeuCPrPaAl0IwPIaRv+SMV8CiM8i2LqVUHFC1+8eORgWyY7yhQY+2U2fA55mBzReaw==} engines: {node: '>=18'} cpu: [x64] os: [freebsd] - '@esbuild/linux-arm64@0.25.1': - resolution: {integrity: sha512-jaN3dHi0/DDPelk0nLcXRm1q7DNJpjXy7yWaWvbfkPvI+7XNSc/lDOnCLN7gzsyzgu6qSAmgSvP9oXAhP973uQ==} + '@esbuild/linux-arm64@0.25.5': + resolution: {integrity: sha512-Z9kfb1v6ZlGbWj8EJk9T6czVEjjq2ntSYLY2cw6pAZl4oKtfgQuS4HOq41M/BcoLPzrUbNd+R4BXFyH//nHxVg==} engines: {node: '>=18'} cpu: [arm64] os: [linux] - '@esbuild/linux-arm@0.25.1': - resolution: {integrity: sha512-NdKOhS4u7JhDKw9G3cY6sWqFcnLITn6SqivVArbzIaf3cemShqfLGHYMx8Xlm/lBit3/5d7kXvriTUGa5YViuQ==} + '@esbuild/linux-arm@0.25.5': + resolution: {integrity: sha512-cPzojwW2okgh7ZlRpcBEtsX7WBuqbLrNXqLU89GxWbNt6uIg78ET82qifUy3W6OVww6ZWobWub5oqZOVtwolfw==} engines: {node: '>=18'} cpu: [arm] os: [linux] - '@esbuild/linux-ia32@0.25.1': - resolution: {integrity: sha512-OJykPaF4v8JidKNGz8c/q1lBO44sQNUQtq1KktJXdBLn1hPod5rE/Hko5ugKKZd+D2+o1a9MFGUEIUwO2YfgkQ==} + '@esbuild/linux-ia32@0.25.5': + resolution: {integrity: sha512-sQ7l00M8bSv36GLV95BVAdhJ2QsIbCuCjh/uYrWiMQSUuV+LpXwIqhgJDcvMTj+VsQmqAHL2yYaasENvJ7CDKA==} engines: {node: '>=18'} cpu: [ia32] os: [linux] - '@esbuild/linux-loong64@0.25.1': - resolution: {integrity: sha512-nGfornQj4dzcq5Vp835oM/o21UMlXzn79KobKlcs3Wz9smwiifknLy4xDCLUU0BWp7b/houtdrgUz7nOGnfIYg==} + '@esbuild/linux-loong64@0.25.5': + resolution: {integrity: sha512-0ur7ae16hDUC4OL5iEnDb0tZHDxYmuQyhKhsPBV8f99f6Z9KQM02g33f93rNH5A30agMS46u2HP6qTdEt6Q1kg==} engines: {node: '>=18'} cpu: [loong64] os: [linux] - '@esbuild/linux-mips64el@0.25.1': - resolution: {integrity: sha512-1osBbPEFYwIE5IVB/0g2X6i1qInZa1aIoj1TdL4AaAb55xIIgbg8Doq6a5BzYWgr+tEcDzYH67XVnTmUzL+nXg==} + '@esbuild/linux-mips64el@0.25.5': + resolution: {integrity: sha512-kB/66P1OsHO5zLz0i6X0RxlQ+3cu0mkxS3TKFvkb5lin6uwZ/ttOkP3Z8lfR9mJOBk14ZwZ9182SIIWFGNmqmg==} engines: {node: '>=18'} cpu: [mips64el] os: [linux] - '@esbuild/linux-ppc64@0.25.1': - resolution: {integrity: sha512-/6VBJOwUf3TdTvJZ82qF3tbLuWsscd7/1w+D9LH0W/SqUgM5/JJD0lrJ1fVIfZsqB6RFmLCe0Xz3fmZc3WtyVg==} + '@esbuild/linux-ppc64@0.25.5': + resolution: {integrity: sha512-UZCmJ7r9X2fe2D6jBmkLBMQetXPXIsZjQJCjgwpVDz+YMcS6oFR27alkgGv3Oqkv07bxdvw7fyB71/olceJhkQ==} engines: {node: '>=18'} cpu: [ppc64] os: [linux] - '@esbuild/linux-riscv64@0.25.1': - resolution: {integrity: sha512-nSut/Mx5gnilhcq2yIMLMe3Wl4FK5wx/o0QuuCLMtmJn+WeWYoEGDN1ipcN72g1WHsnIbxGXd4i/MF0gTcuAjQ==} + '@esbuild/linux-riscv64@0.25.5': + resolution: {integrity: sha512-kTxwu4mLyeOlsVIFPfQo+fQJAV9mh24xL+y+Bm6ej067sYANjyEw1dNHmvoqxJUCMnkBdKpvOn0Ahql6+4VyeA==} engines: {node: '>=18'} cpu: [riscv64] os: [linux] - '@esbuild/linux-s390x@0.25.1': - resolution: {integrity: sha512-cEECeLlJNfT8kZHqLarDBQso9a27o2Zd2AQ8USAEoGtejOrCYHNtKP8XQhMDJMtthdF4GBmjR2au3x1udADQQQ==} + '@esbuild/linux-s390x@0.25.5': + resolution: {integrity: sha512-K2dSKTKfmdh78uJ3NcWFiqyRrimfdinS5ErLSn3vluHNeHVnBAFWC8a4X5N+7FgVE1EjXS1QDZbpqZBjfrqMTQ==} engines: {node: '>=18'} cpu: [s390x] os: [linux] - '@esbuild/linux-x64@0.25.1': - resolution: {integrity: sha512-xbfUhu/gnvSEg+EGovRc+kjBAkrvtk38RlerAzQxvMzlB4fXpCFCeUAYzJvrnhFtdeyVCDANSjJvOvGYoeKzFA==} + '@esbuild/linux-x64@0.25.5': + resolution: {integrity: sha512-uhj8N2obKTE6pSZ+aMUbqq+1nXxNjZIIjCjGLfsWvVpy7gKCOL6rsY1MhRh9zLtUtAI7vpgLMK6DxjO8Qm9lJw==} engines: {node: '>=18'} cpu: [x64] os: [linux] - '@esbuild/netbsd-arm64@0.25.1': - resolution: {integrity: sha512-O96poM2XGhLtpTh+s4+nP7YCCAfb4tJNRVZHfIE7dgmax+yMP2WgMd2OecBuaATHKTHsLWHQeuaxMRnCsH8+5g==} + '@esbuild/netbsd-arm64@0.25.5': + resolution: {integrity: sha512-pwHtMP9viAy1oHPvgxtOv+OkduK5ugofNTVDilIzBLpoWAM16r7b/mxBvfpuQDpRQFMfuVr5aLcn4yveGvBZvw==} engines: {node: '>=18'} cpu: [arm64] os: [netbsd] - '@esbuild/netbsd-x64@0.25.1': - resolution: {integrity: sha512-X53z6uXip6KFXBQ+Krbx25XHV/NCbzryM6ehOAeAil7X7oa4XIq+394PWGnwaSQ2WRA0KI6PUO6hTO5zeF5ijA==} + '@esbuild/netbsd-x64@0.25.5': + resolution: {integrity: sha512-WOb5fKrvVTRMfWFNCroYWWklbnXH0Q5rZppjq0vQIdlsQKuw6mdSihwSo4RV/YdQ5UCKKvBy7/0ZZYLBZKIbwQ==} engines: {node: '>=18'} cpu: [x64] os: [netbsd] - '@esbuild/openbsd-arm64@0.25.1': - resolution: {integrity: sha512-Na9T3szbXezdzM/Kfs3GcRQNjHzM6GzFBeU1/6IV/npKP5ORtp9zbQjvkDJ47s6BCgaAZnnnu/cY1x342+MvZg==} + '@esbuild/openbsd-arm64@0.25.5': + resolution: {integrity: sha512-7A208+uQKgTxHd0G0uqZO8UjK2R0DDb4fDmERtARjSHWxqMTye4Erz4zZafx7Di9Cv+lNHYuncAkiGFySoD+Mw==} engines: {node: '>=18'} cpu: [arm64] os: [openbsd] - '@esbuild/openbsd-x64@0.25.1': - resolution: {integrity: sha512-T3H78X2h1tszfRSf+txbt5aOp/e7TAz3ptVKu9Oyir3IAOFPGV6O9c2naym5TOriy1l0nNf6a4X5UXRZSGX/dw==} + '@esbuild/openbsd-x64@0.25.5': + resolution: {integrity: sha512-G4hE405ErTWraiZ8UiSoesH8DaCsMm0Cay4fsFWOOUcz8b8rC6uCvnagr+gnioEjWn0wC+o1/TAHt+It+MpIMg==} engines: {node: '>=18'} cpu: [x64] os: [openbsd] - '@esbuild/sunos-x64@0.25.1': - resolution: {integrity: sha512-2H3RUvcmULO7dIE5EWJH8eubZAI4xw54H1ilJnRNZdeo8dTADEZ21w6J22XBkXqGJbe0+wnNJtw3UXRoLJnFEg==} + '@esbuild/sunos-x64@0.25.5': + resolution: {integrity: sha512-l+azKShMy7FxzY0Rj4RCt5VD/q8mG/e+mDivgspo+yL8zW7qEwctQ6YqKX34DTEleFAvCIUviCFX1SDZRSyMQA==} engines: {node: '>=18'} cpu: [x64] os: [sunos] - '@esbuild/win32-arm64@0.25.1': - resolution: {integrity: sha512-GE7XvrdOzrb+yVKB9KsRMq+7a2U/K5Cf/8grVFRAGJmfADr/e/ODQ134RK2/eeHqYV5eQRFxb1hY7Nr15fv1NQ==} + '@esbuild/win32-arm64@0.25.5': + resolution: {integrity: sha512-O2S7SNZzdcFG7eFKgvwUEZ2VG9D/sn/eIiz8XRZ1Q/DO5a3s76Xv0mdBzVM5j5R639lXQmPmSo0iRpHqUUrsxw==} engines: {node: '>=18'} cpu: [arm64] os: [win32] - '@esbuild/win32-ia32@0.25.1': - resolution: {integrity: sha512-uOxSJCIcavSiT6UnBhBzE8wy3n0hOkJsBOzy7HDAuTDE++1DJMRRVCPGisULScHL+a/ZwdXPpXD3IyFKjA7K8A==} + '@esbuild/win32-ia32@0.25.5': + resolution: {integrity: sha512-onOJ02pqs9h1iMJ1PQphR+VZv8qBMQ77Klcsqv9CNW2w6yLqoURLcgERAIurY6QE63bbLuqgP9ATqajFLK5AMQ==} engines: {node: '>=18'} cpu: [ia32] os: [win32] - '@esbuild/win32-x64@0.25.1': - resolution: {integrity: sha512-Y1EQdcfwMSeQN/ujR5VayLOJ1BHaK+ssyk0AEzPjC+t1lITgsnccPqFjb6V+LsTp/9Iov4ysfjxLaGJ9RPtkVg==} + '@esbuild/win32-x64@0.25.5': + resolution: {integrity: sha512-TXv6YnJ8ZMVdX+SXWVBo/0p8LTcrUYngpWjvm91TMjjBQii7Oz11Lw5lbDV5Y0TzuhSJHwiH4hEtC1I42mMS0g==} engines: {node: '>=18'} cpu: [x64] os: [win32] @@ -388,19 +408,19 @@ packages: '@hapi/topo@5.1.0': resolution: {integrity: sha512-foQZKJig7Ob0BMAYBfcJk8d77QtOe7Wo4ox7ff1lQYoNNAb6jwcY1ncdoy2e9wQZzvNy7ODZCYJkK8kzmcAnAg==} - '@hey-api/json-schema-ref-parser@1.0.5': - resolution: {integrity: sha512-bWUV9ICwvU5I3YKVZqWIUXFC2SIXznUi/u+LqurJx6ILiyImfZD5+g/lj3w4EiyXxmjqyaxptzUz/1IgK3vVtw==} + '@hey-api/json-schema-ref-parser@1.0.6': + resolution: {integrity: sha512-yktiFZoWPtEW8QKS65eqKwA5MTKp88CyiL8q72WynrBs/73SAaxlSWlA2zW/DZlywZ5hX1OYzrCC0wFdvO9c2w==} engines: {node: '>= 16'} - '@hey-api/openapi-ts@0.66.6': - resolution: {integrity: sha512-EmZHVqfHuGNoyBDPcL+3vGHLb/qEbjIix3dnQ/CzfZQ+xm4vnOecpR7JaaaR9u2W8Ldeyqnk7NwmEqOBgkgG4Q==} + '@hey-api/openapi-ts@0.77.0': + resolution: {integrity: sha512-HAJbd8QfxeBPZ788Ghiw7bzzzTKxW+wW+34foleEztyZJnRV20barvevu8YAK1BtyiIGIpEtAfoqO8KUj4VuBw==} engines: {node: ^18.18.0 || ^20.9.0 || >=22.10.0} hasBin: true peerDependencies: typescript: ^5.5.3 - '@inquirer/checkbox@4.1.3': - resolution: {integrity: sha512-KU1MGwf24iABJjGESxhyj+/rlQYSRoCfcuHDEHXfZ1DENmbuSRfyrUb+LLjHoee5TNOFKwaFxDXc5/zRwJUPMQ==} + '@inquirer/checkbox@4.1.8': + resolution: {integrity: sha512-d/QAsnwuHX2OPolxvYcgSj7A9DO9H6gVOy2DvBTx+P2LH2iRTo/RSGV3iwCzW024nP9hw98KIuDmdyhZQj1UQg==} engines: {node: '>=18'} peerDependencies: '@types/node': '>=18' @@ -408,8 +428,8 @@ packages: '@types/node': optional: true - '@inquirer/confirm@5.1.7': - resolution: {integrity: sha512-Xrfbrw9eSiHb+GsesO8TQIeHSMTP0xyvTCeeYevgZ4sKW+iz9w/47bgfG9b0niQm+xaLY2EWPBINUPldLwvYiw==} + '@inquirer/confirm@5.1.12': + resolution: {integrity: sha512-dpq+ielV9/bqgXRUbNH//KsY6WEw9DrGPmipkpmgC1Y46cwuBTNx7PXFWTjc3MQ+urcc0QxoVHcMI0FW4Ok0hg==} engines: {node: '>=18'} peerDependencies: '@types/node': '>=18' @@ -417,8 +437,8 @@ packages: '@types/node': optional: true - '@inquirer/core@10.1.8': - resolution: {integrity: sha512-HpAqR8y715zPpM9e/9Q+N88bnGwqqL8ePgZ0SMv/s3673JLMv3bIkoivGmjPqXlEgisUksSXibweQccUwEx4qQ==} + '@inquirer/core@10.1.13': + resolution: {integrity: sha512-1viSxebkYN2nJULlzCxES6G9/stgHSepZ9LqqfdIGPHj5OHhiBUXVS0a6R0bEC2A+VL4D9w6QB66ebCr6HGllA==} engines: {node: '>=18'} peerDependencies: '@types/node': '>=18' @@ -426,8 +446,8 @@ packages: '@types/node': optional: true - '@inquirer/editor@4.2.8': - resolution: {integrity: sha512-UkGKbMFlQw5k4ZLjDwEi5z8NIVlP/3DAlLHta0o0pSsdpPThNmPtUL8mvGCHUaQtR+QrxR9yRYNWgKMsHkfIUA==} + '@inquirer/editor@4.2.13': + resolution: {integrity: sha512-WbicD9SUQt/K8O5Vyk9iC2ojq5RHoCLK6itpp2fHsWe44VxxcA9z3GTWlvjSTGmMQpZr+lbVmrxdHcumJoLbMA==} engines: {node: '>=18'} peerDependencies: '@types/node': '>=18' @@ -435,8 +455,8 @@ packages: '@types/node': optional: true - '@inquirer/expand@4.0.10': - resolution: {integrity: sha512-leyBouGJ77ggv51Jb/OJmLGGnU2HYc13MZ2iiPNLwe2VgFgZPVqsrRWSa1RAHKyazjOyvSNKLD1B2K7A/iWi1g==} + '@inquirer/expand@4.0.15': + resolution: {integrity: sha512-4Y+pbr/U9Qcvf+N/goHzPEXiHH8680lM3Dr3Y9h9FFw4gHS+zVpbj8LfbKWIb/jayIB4aSO4pWiBTrBYWkvi5A==} engines: {node: '>=18'} peerDependencies: '@types/node': '>=18' @@ -444,12 +464,12 @@ packages: '@types/node': optional: true - '@inquirer/figures@1.0.11': - resolution: {integrity: sha512-eOg92lvrn/aRUqbxRyvpEWnrvRuTYRifixHkYVpJiygTgVSBIHDqLh0SrMQXkafvULg3ck11V7xvR+zcgvpHFw==} + '@inquirer/figures@1.0.12': + resolution: {integrity: sha512-MJttijd8rMFcKJC8NYmprWr6hD3r9Gd9qUC0XwPNwoEPWSMVJwA2MlXxF+nhZZNMY+HXsWa+o7KY2emWYIn0jQ==} engines: {node: '>=18'} - '@inquirer/input@4.1.7': - resolution: {integrity: sha512-rCQAipJNA14UTH84df/z4jDJ9LZ54H6zzuCAi7WZ0qVqx3CSqLjfXAMd5cpISIxbiHVJCPRB81gZksq6CZsqDg==} + '@inquirer/input@4.1.12': + resolution: {integrity: sha512-xJ6PFZpDjC+tC1P8ImGprgcsrzQRsUh9aH3IZixm1lAZFK49UGHxM3ltFfuInN2kPYNfyoPRh+tU4ftsjPLKqQ==} engines: {node: '>=18'} peerDependencies: '@types/node': '>=18' @@ -457,8 +477,8 @@ packages: '@types/node': optional: true - '@inquirer/number@3.0.10': - resolution: {integrity: sha512-GLsdnxzNefjCJUmWyjaAuNklHgDpCTL4RMllAVhVvAzBwRW9g38eZ5tWgzo1lirtSDTpsh593hqXVhxvdrjfwA==} + '@inquirer/number@3.0.15': + resolution: {integrity: sha512-xWg+iYfqdhRiM55MvqiTCleHzszpoigUpN5+t1OMcRkJrUrw7va3AzXaxvS+Ak7Gny0j2mFSTv2JJj8sMtbV2g==} engines: {node: '>=18'} peerDependencies: '@types/node': '>=18' @@ -466,8 +486,8 @@ packages: '@types/node': optional: true - '@inquirer/password@4.0.10': - resolution: {integrity: sha512-JC538ujqeYKkFqLoWZ0ILBteIUO2yajBMVEUZSxjl9x6fiEQtM+I5Rca7M2D8edMDbyHLnXifGH1hJZdh8V5rA==} + '@inquirer/password@4.0.15': + resolution: {integrity: sha512-75CT2p43DGEnfGTaqFpbDC2p2EEMrq0S+IRrf9iJvYreMy5mAWj087+mdKyLHapUEPLjN10mNvABpGbk8Wdraw==} engines: {node: '>=18'} peerDependencies: '@types/node': '>=18' @@ -475,8 +495,8 @@ packages: '@types/node': optional: true - '@inquirer/prompts@7.3.3': - resolution: {integrity: sha512-QS1AQgJ113iE/nmym03yKZKHvGjVWwkGZT3B1yKrrMG0bJKQg1jUkntFP8aPd2FUQzu/nga7QU2eDpzIP5it0Q==} + '@inquirer/prompts@7.5.3': + resolution: {integrity: sha512-8YL0WiV7J86hVAxrh3fE5mDCzcTDe1670unmJRz6ArDgN+DBK1a0+rbnNWp4DUB5rPMwqD5ZP6YHl9KK1mbZRg==} engines: {node: '>=18'} peerDependencies: '@types/node': '>=18' @@ -484,8 +504,8 @@ packages: '@types/node': optional: true - '@inquirer/rawlist@4.0.10': - resolution: {integrity: sha512-vOQbQkmhaCsF2bUmjoyRSZJBz77UnIF/F3ZS2LMgwbgyaG2WgwKHh0WKNj0APDB72WDbZijhW5nObQbk+TnbcA==} + '@inquirer/rawlist@4.1.3': + resolution: {integrity: sha512-7XrV//6kwYumNDSsvJIPeAqa8+p7GJh7H5kRuxirct2cgOcSWwwNGoXDRgpNFbY/MG2vQ4ccIWCi8+IXXyFMZA==} engines: {node: '>=18'} peerDependencies: '@types/node': '>=18' @@ -493,8 +513,8 @@ packages: '@types/node': optional: true - '@inquirer/search@3.0.10': - resolution: {integrity: sha512-EAVKAz6P1LajZOdoL+R+XC3HJYSU261fbJzO4fCkJJ7UPFcm+nP+gzC+DDZWsb2WK9PQvKsnaKiNKsY8B6dBWQ==} + '@inquirer/search@3.0.15': + resolution: {integrity: sha512-YBMwPxYBrADqyvP4nNItpwkBnGGglAvCLVW8u4pRmmvOsHUtCAUIMbUrLX5B3tFL1/WsLGdQ2HNzkqswMs5Uaw==} engines: {node: '>=18'} peerDependencies: '@types/node': '>=18' @@ -502,8 +522,8 @@ packages: '@types/node': optional: true - '@inquirer/select@4.0.10': - resolution: {integrity: sha512-Tg8S9nESnCfISu5tCZSuXpXq0wHuDVimj7xyHstABgR34zcJnLdq/VbjB2mdZvNAMAehYBnNzSjxB06UE8LLAA==} + '@inquirer/select@4.2.3': + resolution: {integrity: sha512-OAGhXU0Cvh0PhLz9xTF/kx6g6x+sP+PcyTiLvCrewI99P3BBeexD+VbuwkNDvqGkk3y2h5ZiWLeRP7BFlhkUDg==} engines: {node: '>=18'} peerDependencies: '@types/node': '>=18' @@ -511,8 +531,8 @@ packages: '@types/node': optional: true - '@inquirer/type@3.0.5': - resolution: {integrity: sha512-ZJpeIYYueOz/i/ONzrfof8g89kNdO2hjGuvULROo3O8rlB2CRtSseE5KeirnyE4t/thAn/EwvS/vuQeJCn+NZg==} + '@inquirer/type@3.0.7': + resolution: {integrity: sha512-PfunHQcjwnju84L+ycmcMKB/pTPIngjUJvfnRhKY6FKPuYXlM4aQCb/nIdTFR6BEhMjFvngzvng/vBAJMZpLSA==} engines: {node: '>=18'} peerDependencies: '@types/node': '>=18' @@ -528,17 +548,29 @@ packages: resolution: {integrity: sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==} engines: {node: '>=8'} - '@jest/expect-utils@29.7.0': - resolution: {integrity: sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + '@jest/diff-sequences@30.0.1': + resolution: {integrity: sha512-n5H8QLDJ47QqbCNn5SuFjCRDrOLEZ0h8vAHCK5RL9Ls7Xa8AQLa/YxAc9UjFqoEDM48muwtBGjtMY5cr0PLDCw==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + '@jest/expect-utils@30.0.3': + resolution: {integrity: sha512-SMtBvf2sfX2agcT0dA9pXwcUrKvOSDqBY4e4iRfT+Hya33XzV35YVg+98YQFErVGA/VR1Gto5Y2+A6G9LSQ3Yg==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + '@jest/get-type@30.0.1': + resolution: {integrity: sha512-AyYdemXCptSRFirI5EPazNxyPwAL0jXt3zceFjaj8NFiKP9pOi0bfXonf6qkf82z2t3QWPeLCWWw4stPBzctLw==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + '@jest/pattern@30.0.1': + resolution: {integrity: sha512-gWp7NfQW27LaBQz3TITS8L7ZCQ0TLvtmI//4OwlQRx4rnWxcPNIYjxZpDcN4+UlGxgm3jS5QPz8IPTCkb59wZA==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - '@jest/schemas@29.6.3': - resolution: {integrity: sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + '@jest/schemas@30.0.1': + resolution: {integrity: sha512-+g/1TKjFuGrf1Hh0QPCv0gISwBxJ+MQSNXmG9zjHy7BmFhtoJ9fdNhWJp3qUKRi93AOZHXtdxZgJ1vAtz6z65w==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - '@jest/types@29.6.3': - resolution: {integrity: sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + '@jest/types@30.0.1': + resolution: {integrity: sha512-HGwoYRVF0QSKJu1ZQX0o5ZrUrrhj0aOOFA8hXrumD7SIzjouevhawbTjmXdwOmURdGluU9DM/XvGm3NyFoiQjw==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} '@jridgewell/gen-mapping@0.3.8': resolution: {integrity: sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==} @@ -565,101 +597,106 @@ packages: resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} engines: {node: '>=14'} - '@polka/url@1.0.0-next.28': - resolution: {integrity: sha512-8LduaNlMZGwdZ6qWrKlfa+2M4gahzFkprZiAt2TF8uS0qQgBizKXpXURqvTJ4WtmupWxaLqjRb2UCTe72mu+Aw==} + '@polka/url@1.0.0-next.29': + resolution: {integrity: sha512-wwQAWhWSuHaag8c4q/KN/vCoeOJYshAIvMQwD4GpSb3OiZklFfvAgmj0VCBBImRpuF/aFgIRzllXlVX93Jevww==} - '@rollup/rollup-android-arm-eabi@4.35.0': - resolution: {integrity: sha512-uYQ2WfPaqz5QtVgMxfN6NpLD+no0MYHDBywl7itPYd3K5TjjSghNKmX8ic9S8NU8w81NVhJv/XojcHptRly7qQ==} + '@rollup/rollup-android-arm-eabi@4.44.1': + resolution: {integrity: sha512-JAcBr1+fgqx20m7Fwe1DxPUl/hPkee6jA6Pl7n1v2EFiktAHenTaXl5aIFjUIEsfn9w3HE4gK1lEgNGMzBDs1w==} cpu: [arm] os: [android] - '@rollup/rollup-android-arm64@4.35.0': - resolution: {integrity: sha512-FtKddj9XZudurLhdJnBl9fl6BwCJ3ky8riCXjEw3/UIbjmIY58ppWwPEvU3fNu+W7FUsAsB1CdH+7EQE6CXAPA==} + '@rollup/rollup-android-arm64@4.44.1': + resolution: {integrity: sha512-RurZetXqTu4p+G0ChbnkwBuAtwAbIwJkycw1n6GvlGlBuS4u5qlr5opix8cBAYFJgaY05TWtM+LaoFggUmbZEQ==} cpu: [arm64] os: [android] - '@rollup/rollup-darwin-arm64@4.35.0': - resolution: {integrity: sha512-Uk+GjOJR6CY844/q6r5DR/6lkPFOw0hjfOIzVx22THJXMxktXG6CbejseJFznU8vHcEBLpiXKY3/6xc+cBm65Q==} + '@rollup/rollup-darwin-arm64@4.44.1': + resolution: {integrity: sha512-fM/xPesi7g2M7chk37LOnmnSTHLG/v2ggWqKj3CCA1rMA4mm5KVBT1fNoswbo1JhPuNNZrVwpTvlCVggv8A2zg==} cpu: [arm64] os: [darwin] - '@rollup/rollup-darwin-x64@4.35.0': - resolution: {integrity: sha512-3IrHjfAS6Vkp+5bISNQnPogRAW5GAV1n+bNCrDwXmfMHbPl5EhTmWtfmwlJxFRUCBZ+tZ/OxDyU08aF6NI/N5Q==} + '@rollup/rollup-darwin-x64@4.44.1': + resolution: {integrity: sha512-gDnWk57urJrkrHQ2WVx9TSVTH7lSlU7E3AFqiko+bgjlh78aJ88/3nycMax52VIVjIm3ObXnDL2H00e/xzoipw==} cpu: [x64] os: [darwin] - '@rollup/rollup-freebsd-arm64@4.35.0': - resolution: {integrity: sha512-sxjoD/6F9cDLSELuLNnY0fOrM9WA0KrM0vWm57XhrIMf5FGiN8D0l7fn+bpUeBSU7dCgPV2oX4zHAsAXyHFGcQ==} + '@rollup/rollup-freebsd-arm64@4.44.1': + resolution: {integrity: sha512-wnFQmJ/zPThM5zEGcnDcCJeYJgtSLjh1d//WuHzhf6zT3Md1BvvhJnWoy+HECKu2bMxaIcfWiu3bJgx6z4g2XA==} cpu: [arm64] os: [freebsd] - '@rollup/rollup-freebsd-x64@4.35.0': - resolution: {integrity: sha512-2mpHCeRuD1u/2kruUiHSsnjWtHjqVbzhBkNVQ1aVD63CcexKVcQGwJ2g5VphOd84GvxfSvnnlEyBtQCE5hxVVw==} + '@rollup/rollup-freebsd-x64@4.44.1': + resolution: {integrity: sha512-uBmIxoJ4493YATvU2c0upGz87f99e3wop7TJgOA/bXMFd2SvKCI7xkxY/5k50bv7J6dw1SXT4MQBQSLn8Bb/Uw==} cpu: [x64] os: [freebsd] - '@rollup/rollup-linux-arm-gnueabihf@4.35.0': - resolution: {integrity: sha512-mrA0v3QMy6ZSvEuLs0dMxcO2LnaCONs1Z73GUDBHWbY8tFFocM6yl7YyMu7rz4zS81NDSqhrUuolyZXGi8TEqg==} + '@rollup/rollup-linux-arm-gnueabihf@4.44.1': + resolution: {integrity: sha512-n0edDmSHlXFhrlmTK7XBuwKlG5MbS7yleS1cQ9nn4kIeW+dJH+ExqNgQ0RrFRew8Y+0V/x6C5IjsHrJmiHtkxQ==} cpu: [arm] os: [linux] - '@rollup/rollup-linux-arm-musleabihf@4.35.0': - resolution: {integrity: sha512-DnYhhzcvTAKNexIql8pFajr0PiDGrIsBYPRvCKlA5ixSS3uwo/CWNZxB09jhIapEIg945KOzcYEAGGSmTSpk7A==} + '@rollup/rollup-linux-arm-musleabihf@4.44.1': + resolution: {integrity: sha512-8WVUPy3FtAsKSpyk21kV52HCxB+me6YkbkFHATzC2Yd3yuqHwy2lbFL4alJOLXKljoRw08Zk8/xEj89cLQ/4Nw==} cpu: [arm] os: [linux] - '@rollup/rollup-linux-arm64-gnu@4.35.0': - resolution: {integrity: sha512-uagpnH2M2g2b5iLsCTZ35CL1FgyuzzJQ8L9VtlJ+FckBXroTwNOaD0z0/UF+k5K3aNQjbm8LIVpxykUOQt1m/A==} + '@rollup/rollup-linux-arm64-gnu@4.44.1': + resolution: {integrity: sha512-yuktAOaeOgorWDeFJggjuCkMGeITfqvPgkIXhDqsfKX8J3jGyxdDZgBV/2kj/2DyPaLiX6bPdjJDTu9RB8lUPQ==} cpu: [arm64] os: [linux] - '@rollup/rollup-linux-arm64-musl@4.35.0': - resolution: {integrity: sha512-XQxVOCd6VJeHQA/7YcqyV0/88N6ysSVzRjJ9I9UA/xXpEsjvAgDTgH3wQYz5bmr7SPtVK2TsP2fQ2N9L4ukoUg==} + '@rollup/rollup-linux-arm64-musl@4.44.1': + resolution: {integrity: sha512-W+GBM4ifET1Plw8pdVaecwUgxmiH23CfAUj32u8knq0JPFyK4weRy6H7ooxYFD19YxBulL0Ktsflg5XS7+7u9g==} cpu: [arm64] os: [linux] - '@rollup/rollup-linux-loongarch64-gnu@4.35.0': - resolution: {integrity: sha512-5pMT5PzfgwcXEwOaSrqVsz/LvjDZt+vQ8RT/70yhPU06PTuq8WaHhfT1LW+cdD7mW6i/J5/XIkX/1tCAkh1W6g==} + '@rollup/rollup-linux-loongarch64-gnu@4.44.1': + resolution: {integrity: sha512-1zqnUEMWp9WrGVuVak6jWTl4fEtrVKfZY7CvcBmUUpxAJ7WcSowPSAWIKa/0o5mBL/Ij50SIf9tuirGx63Ovew==} cpu: [loong64] os: [linux] - '@rollup/rollup-linux-powerpc64le-gnu@4.35.0': - resolution: {integrity: sha512-c+zkcvbhbXF98f4CtEIP1EBA/lCic5xB0lToneZYvMeKu5Kamq3O8gqrxiYYLzlZH6E3Aq+TSW86E4ay8iD8EA==} + '@rollup/rollup-linux-powerpc64le-gnu@4.44.1': + resolution: {integrity: sha512-Rl3JKaRu0LHIx7ExBAAnf0JcOQetQffaw34T8vLlg9b1IhzcBgaIdnvEbbsZq9uZp3uAH+JkHd20Nwn0h9zPjA==} cpu: [ppc64] os: [linux] - '@rollup/rollup-linux-riscv64-gnu@4.35.0': - resolution: {integrity: sha512-s91fuAHdOwH/Tad2tzTtPX7UZyytHIRR6V4+2IGlV0Cej5rkG0R61SX4l4y9sh0JBibMiploZx3oHKPnQBKe4g==} + '@rollup/rollup-linux-riscv64-gnu@4.44.1': + resolution: {integrity: sha512-j5akelU3snyL6K3N/iX7otLBIl347fGwmd95U5gS/7z6T4ftK288jKq3A5lcFKcx7wwzb5rgNvAg3ZbV4BqUSw==} cpu: [riscv64] os: [linux] - '@rollup/rollup-linux-s390x-gnu@4.35.0': - resolution: {integrity: sha512-hQRkPQPLYJZYGP+Hj4fR9dDBMIM7zrzJDWFEMPdTnTy95Ljnv0/4w/ixFw3pTBMEuuEuoqtBINYND4M7ujcuQw==} + '@rollup/rollup-linux-riscv64-musl@4.44.1': + resolution: {integrity: sha512-ppn5llVGgrZw7yxbIm8TTvtj1EoPgYUAbfw0uDjIOzzoqlZlZrLJ/KuiE7uf5EpTpCTrNt1EdtzF0naMm0wGYg==} + cpu: [riscv64] + os: [linux] + + '@rollup/rollup-linux-s390x-gnu@4.44.1': + resolution: {integrity: sha512-Hu6hEdix0oxtUma99jSP7xbvjkUM/ycke/AQQ4EC5g7jNRLLIwjcNwaUy95ZKBJJwg1ZowsclNnjYqzN4zwkAw==} cpu: [s390x] os: [linux] - '@rollup/rollup-linux-x64-gnu@4.35.0': - resolution: {integrity: sha512-Pim1T8rXOri+0HmV4CdKSGrqcBWX0d1HoPnQ0uw0bdp1aP5SdQVNBy8LjYncvnLgu3fnnCt17xjWGd4cqh8/hA==} + '@rollup/rollup-linux-x64-gnu@4.44.1': + resolution: {integrity: sha512-EtnsrmZGomz9WxK1bR5079zee3+7a+AdFlghyd6VbAjgRJDbTANJ9dcPIPAi76uG05micpEL+gPGmAKYTschQw==} cpu: [x64] os: [linux] - '@rollup/rollup-linux-x64-musl@4.35.0': - resolution: {integrity: sha512-QysqXzYiDvQWfUiTm8XmJNO2zm9yC9P/2Gkrwg2dH9cxotQzunBHYr6jk4SujCTqnfGxduOmQcI7c2ryuW8XVg==} + '@rollup/rollup-linux-x64-musl@4.44.1': + resolution: {integrity: sha512-iAS4p+J1az6Usn0f8xhgL4PaU878KEtutP4hqw52I4IO6AGoyOkHCxcc4bqufv1tQLdDWFx8lR9YlwxKuv3/3g==} cpu: [x64] os: [linux] - '@rollup/rollup-win32-arm64-msvc@4.35.0': - resolution: {integrity: sha512-OUOlGqPkVJCdJETKOCEf1mw848ZyJ5w50/rZ/3IBQVdLfR5jk/6Sr5m3iO2tdPgwo0x7VcncYuOvMhBWZq8ayg==} + '@rollup/rollup-win32-arm64-msvc@4.44.1': + resolution: {integrity: sha512-NtSJVKcXwcqozOl+FwI41OH3OApDyLk3kqTJgx8+gp6On9ZEt5mYhIsKNPGuaZr3p9T6NWPKGU/03Vw4CNU9qg==} cpu: [arm64] os: [win32] - '@rollup/rollup-win32-ia32-msvc@4.35.0': - resolution: {integrity: sha512-2/lsgejMrtwQe44glq7AFFHLfJBPafpsTa6JvP2NGef/ifOa4KBoglVf7AKN7EV9o32evBPRqfg96fEHzWo5kw==} + '@rollup/rollup-win32-ia32-msvc@4.44.1': + resolution: {integrity: sha512-JYA3qvCOLXSsnTR3oiyGws1Dm0YTuxAAeaYGVlGpUsHqloPcFjPg+X0Fj2qODGLNwQOAcCiQmHub/V007kiH5A==} cpu: [ia32] os: [win32] - '@rollup/rollup-win32-x64-msvc@4.35.0': - resolution: {integrity: sha512-PIQeY5XDkrOysbQblSW7v3l1MDZzkTEzAfTPkj5VAu3FW8fS4ynyLg2sINp0fp3SjZ8xkRYpLqoKcYqAkhU1dw==} + '@rollup/rollup-win32-x64-msvc@4.44.1': + resolution: {integrity: sha512-J8o22LuF0kTe7m+8PvW9wk3/bRq5+mRo5Dqo6+vXb7otCm3TPhYOJqOaQtGU9YMWQSL3krMnoOxMr0+9E6F3Ug==} cpu: [x64] os: [win32] @@ -672,32 +709,38 @@ packages: '@sideway/pinpoint@2.0.0': resolution: {integrity: sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ==} - '@sinclair/typebox@0.27.8': - resolution: {integrity: sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==} + '@sinclair/typebox@0.34.37': + resolution: {integrity: sha512-2TRuQVgQYfy+EzHRTIvkhv2ADEouJ2xNS/Vq+W5EuuewBdOrvATvljZTxHWZSTYr2sTjTHpGvucaGAt67S2akw==} '@socket.io/component-emitter@3.1.2': resolution: {integrity: sha512-9BCxFwvbGg/RsZK9tjXd8s4UcwR0MWeFQ1XEKIQVVvAGJyINdrqKMcTRyLoK8Rse1GjzLV9cwjWV1olXRWEXVA==} - '@types/body-parser@1.19.5': - resolution: {integrity: sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==} + '@types/body-parser@1.19.6': + resolution: {integrity: sha512-HLFeCYgz89uk22N5Qg3dvGvsv46B8GLvKKo1zKG4NybA8U2DiEO3w9lqGg29t/tfLRJpJ6iQxnVw4OnB7MoM9g==} + + '@types/chai@5.2.2': + resolution: {integrity: sha512-8kB30R7Hwqf40JPiKhVzodJs2Qc1ZJ5zuT3uzw5Hq/dhNCl3G3l83jfpdI1e20BP348+fV7VIL/+FxaXkqBmWg==} '@types/connect@3.4.38': resolution: {integrity: sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==} - '@types/cors@2.8.17': - resolution: {integrity: sha512-8CGDvrBj1zgo2qE+oS3pOCyYNqCPryMWY2bGfwA0dcfopWGgxs+78df0Rs3rc9THP4JkOhLsAa+15VdpAqkcUA==} + '@types/cors@2.8.19': + resolution: {integrity: sha512-mFNylyeyqN93lfe/9CSxOGREz8cpzAhH+E93xJ4xWQf62V8sQ/24reV2nyzUWM6H6Xji+GGHpkbLe7pVoUEskg==} + + '@types/deep-eql@4.0.2': + resolution: {integrity: sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==} - '@types/estree@1.0.6': - resolution: {integrity: sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==} + '@types/estree@1.0.8': + resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==} '@types/express-serve-static-core@5.0.6': resolution: {integrity: sha512-3xhRnjJPkULekpSzgtoNYYcTWgEZkp4myc+Saevii5JPnHNvHMRlBSHDbs7Bh1iPPoVTERHEZXyhyLbMEsExsA==} - '@types/express@5.0.1': - resolution: {integrity: sha512-UZUw8vjpWFXuDnjFTh7/5c2TWDlQqeXHi6hcN7F2XSVT5P+WmUnnbFS3KA6Jnc6IsEqI2qCVu2bK0R0J4A8ZQQ==} + '@types/express@5.0.3': + resolution: {integrity: sha512-wGA0NX93b19/dZC1J18tKWVIYWyyF2ZjT9vin/NRu0qzzvfVzWjs04iq2rQ3H65vCTQYlRqs3YHfY7zjdV+9Kw==} - '@types/http-errors@2.0.4': - resolution: {integrity: sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA==} + '@types/http-errors@2.0.5': + resolution: {integrity: sha512-r8Tayk8HJnX0FztbZN7oVqGccWgw98T/0neJphO91KkmOzug1KkofZURD4UaD5uH8AqcFLfdPErnBod0u71/qg==} '@types/istanbul-lib-coverage@2.0.6': resolution: {integrity: sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==} @@ -708,14 +751,14 @@ packages: '@types/istanbul-reports@3.0.4': resolution: {integrity: sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==} - '@types/jest@29.5.14': - resolution: {integrity: sha512-ZN+4sdnLUbo8EVvVc2ao0GFW6oVrQRPn4K2lglySj7APvSrgzxHiNNK99us4WDMi57xxA2yggblIAMNhXOotLQ==} + '@types/jest@30.0.0': + resolution: {integrity: sha512-XTYugzhuwqWjws0CVz8QpM36+T+Dz5mTEBKhNs/esGLnCIlGdRy+Dq78NRjd7ls7r8BC8ZRMOrKlkO1hU0JOwA==} '@types/json-schema@7.0.15': resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} - '@types/lodash@4.17.16': - resolution: {integrity: sha512-HX7Em5NYQAXKW+1T+FiuG27NGwzJfCX3s1GjOa7ujxZa52kjJLOr4FUxT+giF6Tgxv1e+/czV/iTtBw27WTU9g==} + '@types/lodash@4.17.19': + resolution: {integrity: sha512-NYqRyg/hIQrYPT9lbOeYc3kIRabJDn/k4qQHIXUpx88CBDww2fD15Sg5kbXlW86zm2XEW4g0QxkTI3/Kfkc7xQ==} '@types/mime@1.3.5': resolution: {integrity: sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==} @@ -723,20 +766,20 @@ packages: '@types/node@17.0.45': resolution: {integrity: sha512-w+tIMs3rq2afQdsPJlODhoUEKzFP1ayaoyl1CcnwtIlsVe7K7bA1NGm4s3PraqTLlXnbIN84zuBlxBWo1u9BLw==} - '@types/node@22.15.2': - resolution: {integrity: sha512-uKXqKN9beGoMdBfcaTY1ecwz6ctxuJAcUlwE55938g0ZJ8lRxwAZqRz2AJ4pzpt5dHdTPMB863UZ0ESiFUcP7A==} + '@types/node@24.0.6': + resolution: {integrity: sha512-ZOyn+gOs749xU7ovp+Ibj0g1o3dFRqsfPnT22C2t5JzcRvgsEDpGawPbCISGKLudJk9Y0wiu9sYd6kUh0pc9TA==} - '@types/qs@6.9.18': - resolution: {integrity: sha512-kK7dgTYDyGqS+e2Q4aK9X3D7q234CIZ1Bv0q/7Z5IwRDoADNU81xXJK/YVyLbLTZCoIwUoDoffFeF+p/eIklAA==} + '@types/qs@6.14.0': + resolution: {integrity: sha512-eOunJqu0K1923aExK6y8p6fsihYEn/BYuQ4g0CxAAgFc4b/ZLN4CrsRZ55srTdqoiLzU2B2evC+apEIxprEzkQ==} '@types/range-parser@1.2.7': resolution: {integrity: sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==} - '@types/send@0.17.4': - resolution: {integrity: sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==} + '@types/send@0.17.5': + resolution: {integrity: sha512-z6F2D3cOStZvuk2SaP6YrwkNO65iTZcwA2ZkSABegdkAh/lf+Aa/YQndZVfmEXT5vgAp6zv06VQ3ejSVjAny4w==} - '@types/serve-static@1.15.7': - resolution: {integrity: sha512-W8Ym+h8nhuRwaKPaDw34QUkwsGi6Rc4yYqvKFo5rm2FUEhCFbzVWrxXUxuKK8TASjWsysJY0nsmNCGhCOIsrOw==} + '@types/serve-static@1.15.8': + resolution: {integrity: sha512-roei0UY3LhpOJvjbIP6ZZFngyLKl5dskOtDhxY5THRSpO+ZI+nzJ+m5yUMzGrp89YRa7lvknKkMYjqQFGwA7Sg==} '@types/stack-utils@2.0.3': resolution: {integrity: sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==} @@ -753,39 +796,48 @@ packages: '@types/yargs@17.0.33': resolution: {integrity: sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA==} - '@vitest/expect@3.1.2': - resolution: {integrity: sha512-O8hJgr+zREopCAqWl3uCVaOdqJwZ9qaDwUP7vy3Xigad0phZe9APxKhPcDNqYYi0rX5oMvwJMSCAXY2afqeTSA==} + '@vitest/coverage-v8@3.2.4': + resolution: {integrity: sha512-EyF9SXU6kS5Ku/U82E259WSnvg6c8KTjppUncuNdm5QHpe17mwREHnjDzozC8x9MZ0xfBUFSaLkRv4TMA75ALQ==} + peerDependencies: + '@vitest/browser': 3.2.4 + vitest: 3.2.4 + peerDependenciesMeta: + '@vitest/browser': + optional: true + + '@vitest/expect@3.2.4': + resolution: {integrity: sha512-Io0yyORnB6sikFlt8QW5K7slY4OjqNX9jmJQ02QDda8lyM6B5oNgVWoSoKPac8/kgnCUzuHQKrSLtu/uOqqrig==} - '@vitest/mocker@3.1.2': - resolution: {integrity: sha512-kOtd6K2lc7SQ0mBqYv/wdGedlqPdM/B38paPY+OwJ1XiNi44w3Fpog82UfOibmHaV9Wod18A09I9SCKLyDMqgw==} + '@vitest/mocker@3.2.4': + resolution: {integrity: sha512-46ryTE9RZO/rfDd7pEqFl7etuyzekzEhUbTW3BvmeO/BcCMEgq59BKhek3dXDWgAj4oMK6OZi+vRr1wPW6qjEQ==} peerDependencies: msw: ^2.4.9 - vite: ^5.0.0 || ^6.0.0 + vite: ^5.0.0 || ^6.0.0 || ^7.0.0-0 peerDependenciesMeta: msw: optional: true vite: optional: true - '@vitest/pretty-format@3.1.2': - resolution: {integrity: sha512-R0xAiHuWeDjTSB3kQ3OQpT8Rx3yhdOAIm/JM4axXxnG7Q/fS8XUwggv/A4xzbQA+drYRjzkMnpYnOGAc4oeq8w==} + '@vitest/pretty-format@3.2.4': + resolution: {integrity: sha512-IVNZik8IVRJRTr9fxlitMKeJeXFFFN0JaB9PHPGQ8NKQbGpfjlTx9zO4RefN8gp7eqjNy8nyK3NZmBzOPeIxtA==} - '@vitest/runner@3.1.2': - resolution: {integrity: sha512-bhLib9l4xb4sUMPXnThbnhX2Yi8OutBMA8Yahxa7yavQsFDtwY/jrUZwpKp2XH9DhRFJIeytlyGpXCqZ65nR+g==} + '@vitest/runner@3.2.4': + resolution: {integrity: sha512-oukfKT9Mk41LreEW09vt45f8wx7DordoWUZMYdY/cyAk7w5TWkTRCNZYF7sX7n2wB7jyGAl74OxgwhPgKaqDMQ==} - '@vitest/snapshot@3.1.2': - resolution: {integrity: sha512-Q1qkpazSF/p4ApZg1vfZSQ5Yw6OCQxVMVrLjslbLFA1hMDrT2uxtqMaw8Tc/jy5DLka1sNs1Y7rBcftMiaSH/Q==} + '@vitest/snapshot@3.2.4': + resolution: {integrity: sha512-dEYtS7qQP2CjU27QBC5oUOxLE/v5eLkGqPE0ZKEIDGMs4vKWe7IjgLOeauHsR0D5YuuycGRO5oSRXnwnmA78fQ==} - '@vitest/spy@3.1.2': - resolution: {integrity: sha512-OEc5fSXMws6sHVe4kOFyDSj/+4MSwst0ib4un0DlcYgQvRuYQ0+M2HyqGaauUMnjq87tmUaMNDxKQx7wNfVqPA==} + '@vitest/spy@3.2.4': + resolution: {integrity: sha512-vAfasCOe6AIK70iP5UD11Ac4siNUNJ9i/9PZ3NKx07sG6sUxeag1LWdNrMWeKKYBLlzuK+Gn65Yd5nyL6ds+nw==} - '@vitest/ui@3.1.2': - resolution: {integrity: sha512-+YPgKiLpFEyBVJNHDkRcSDcLrrnr20lyU4HQoI9Jtq1MdvoX8usql9h38mQw82MBU1Zo5BPC6sw+sXZ6NS18CQ==} + '@vitest/ui@3.2.4': + resolution: {integrity: sha512-hGISOaP18plkzbWEcP/QvtRW1xDXF2+96HbEX6byqQhAUbiS5oH6/9JwW+QsQCIYON2bI6QZBF+2PvOmrRZ9wA==} peerDependencies: - vitest: 3.1.2 + vitest: 3.2.4 - '@vitest/utils@3.1.2': - resolution: {integrity: sha512-5GGd0ytZ7BH3H6JTj9Kw7Prn1Nbg0wZVrIvou+UWxm54d+WoXXgAgjFJ8wn3LdagWLFSEfpPeyYrByZaGEZHLg==} + '@vitest/utils@3.2.4': + resolution: {integrity: sha512-fB2V0JFrQSMsCo9HiSq3Ezpdv4iYaXRG1Sx8edX3MwxfyNn83mKiGzOcH+Fkxt4MHxr3y42fQi1oeAInqgX2QA==} abort-controller@3.0.0: resolution: {integrity: sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==} @@ -799,8 +851,8 @@ packages: resolution: {integrity: sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==} engines: {node: '>= 0.6'} - acorn@8.14.1: - resolution: {integrity: sha512-OvQ/2pUDKmgfCg++xsTX1wGxfTaszcHVcTctW4UJB4hibJx2HXxxO5UmVgyjMa+ZDsiaf5wWLXYpRWMmBI0QHg==} + acorn@8.15.0: + resolution: {integrity: sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==} engines: {node: '>=0.4.0'} hasBin: true @@ -856,6 +908,9 @@ packages: resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==} engines: {node: '>=12'} + ast-v8-to-istanbul@0.3.3: + resolution: {integrity: sha512-MuXMrSLVVoA6sYN/6Hke18vMzrT4TZNbZIj/hvh0fnYFpO+/kFXcLIaiPwXXWaQUPg4yJD8fj+lfJ7/1EBconw==} + astral-regex@2.0.0: resolution: {integrity: sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==} engines: {node: '>=8'} @@ -870,8 +925,8 @@ packages: resolution: {integrity: sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ==} engines: {node: '>=8.0.0'} - axios@1.8.2: - resolution: {integrity: sha512-ls4GYBm5aig9vWx8AWDSGLpnpDQRtWAfrjU+EuytuODrFBkqesN2RkOQCBzrA1RQNHw1SmRMSDDDSwzNAYQ6Rg==} + axios@1.10.0: + resolution: {integrity: sha512-/1xYAC4MP/HEG+3duIhFr4ZQXR4sQXOIe+o6sdqzeykGLx6Upp/1p8MHqhINOvGeP7xyNHe7tsiJByc4SSVUxw==} balanced-match@1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} @@ -894,11 +949,11 @@ packages: resolution: {integrity: sha512-02qvAaxv8tp7fBa/mw1ga98OGm+eCbqzJOKoRt70sLmfEEi+jyBYVTDGfCL/k06/4EMk/z01gCe7HoCH/f2LTg==} engines: {node: '>=18'} - brace-expansion@1.1.11: - resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} + brace-expansion@1.1.12: + resolution: {integrity: sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==} - brace-expansion@2.0.1: - resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} + brace-expansion@2.0.2: + resolution: {integrity: sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==} braces@3.0.3: resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} @@ -910,6 +965,10 @@ packages: buffer@6.0.3: resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==} + bundle-name@4.1.0: + resolution: {integrity: sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q==} + engines: {node: '>=18'} + bundle-require@5.1.0: resolution: {integrity: sha512-3WrrOuZiyaaZPWiEt4G3+IffISVC9HYlWueJEBWED4ZH4aIAC2PnkdnuRrR94M+w6yGWn4AglWtJtBI8YqvgoA==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} @@ -994,8 +1053,8 @@ packages: resolution: {integrity: sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==} engines: {node: '>=10'} - ci-info@3.9.0: - resolution: {integrity: sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==} + ci-info@4.2.0: + resolution: {integrity: sha512-cYY9mypksY8NRqgDB1XD1RiJL338v/551niynFTGkZOO2LHuB2OmOYxDIe/ttN9AHwrqdum1360G3ald0W9kCg==} engines: {node: '>=8'} citty@0.1.6: @@ -1043,6 +1102,10 @@ packages: color-name@1.1.4: resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + color-support@1.1.3: + resolution: {integrity: sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==} + hasBin: true + colorette@2.0.20: resolution: {integrity: sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==} @@ -1072,8 +1135,8 @@ packages: confbox@0.1.8: resolution: {integrity: sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==} - consola@3.4.0: - resolution: {integrity: sha512-EiPU8G6dQG0GFHNR8ljnZFki/8a+cQwEQ+7wpxdChl02Q8HXlwEZWD5lqAF8vC2sEC3Tehr8hy7vErz88LHyUA==} + consola@3.4.2: + resolution: {integrity: sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA==} engines: {node: ^14.18.0 || >=16.10.0} constant-case@2.0.0: @@ -1133,8 +1196,8 @@ packages: supports-color: optional: true - debug@4.4.0: - resolution: {integrity: sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==} + debug@4.4.1: + resolution: {integrity: sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==} engines: {node: '>=6.0'} peerDependencies: supports-color: '*' @@ -1146,9 +1209,21 @@ packages: resolution: {integrity: sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==} engines: {node: '>=6'} + default-browser-id@5.0.0: + resolution: {integrity: sha512-A6p/pu/6fyBcA1TRz/GqWYPViplrftcW2gZC9q79ngNCKAeR/X3gcEdXQHl4KNXV+3wgIJ1CPkJQ3IHM6lcsyA==} + engines: {node: '>=18'} + + default-browser@5.2.1: + resolution: {integrity: sha512-WY/3TUME0x3KPYdRRxEJJvXRHV4PyPoUsxtZa78lwItwRQRHhd2U9xOscaT/YTf8uCXIAjeJOFBVEh/7FtD8Xg==} + engines: {node: '>=18'} + defaults@1.0.4: resolution: {integrity: sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==} + define-lazy-prop@3.0.0: + resolution: {integrity: sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==} + engines: {node: '>=12'} + defu@6.1.4: resolution: {integrity: sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg==} @@ -1165,8 +1240,8 @@ packages: resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} engines: {node: '>= 0.8'} - destr@2.0.3: - resolution: {integrity: sha512-2N3BOUU4gYMpTP24s5rF5iP7BDr7uNTCs4ozw3kf/eKfvWSIu93GEBi5m427YoyJoeOzQ5smuu4nNAPGb8idSQ==} + destr@2.0.5: + resolution: {integrity: sha512-ugFTXCtDZunbzasqBxrK93Ik/DRYsO6S/fedkWEMKqt04xZ4csmnmwGDBAb07QWNaGMAmnTIemsYZCksjATwsA==} destroy@1.2.0: resolution: {integrity: sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==} @@ -1180,10 +1255,6 @@ packages: resolution: {integrity: sha512-qE3Veg1YXzGHQhlA6jzebZN2qVf6NX+A7m7qlhCGG30dJixrAQhYOsJjsnBjJkCSmuOPpCk30145fr8FV0bzog==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - diff-sequences@29.6.3: - resolution: {integrity: sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - diff@7.0.0: resolution: {integrity: sha512-PJWHUb1RFevKCwaFA9RlG5tCd+FO5iRh9A8HEtkmBH2Li03iJriB6m6JIN4rGz3K3JLawI7/veA1xzRKP6ISBw==} engines: {node: '>=0.3.1'} @@ -1199,6 +1270,10 @@ packages: resolution: {integrity: sha512-m/C+AwOAr9/W1UOIZUo232ejMNnJAJtYQjUbHoNTBNTJSvqzzDh7vnrei3o3r3m9blf6ZoDkvcw0VmozNRFJxg==} engines: {node: '>=12'} + dotenv@17.0.0: + resolution: {integrity: sha512-A0BJ5lrpJVSfnMMXjmeO0xUnoxqsBHWCoqqTnGwGYVdnctqXXUEhJOO7LxmgxJon9tEZFGpe0xPRX0h2v3AANQ==} + engines: {node: '>=12'} + dunder-proto@1.0.1: resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} engines: {node: '>= 0.4'} @@ -1228,8 +1303,8 @@ packages: resolution: {integrity: sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==} engines: {node: '>= 0.8'} - end-of-stream@1.4.4: - resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} + end-of-stream@1.4.5: + resolution: {integrity: sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==} engine.io-parser@5.2.3: resolution: {integrity: sha512-HqD3yTBfnBxIrbnM1DoD6Pcq8NECnh8d4As1Qgh0z5Gg3jRRIqijury0CL3ghu/edArpUYiYqQiDUQBIs4np3Q==} @@ -1251,8 +1326,8 @@ packages: resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} engines: {node: '>= 0.4'} - es-module-lexer@1.6.0: - resolution: {integrity: sha512-qqnD1yMU6tk/jnaMosogGySTZP8YtUgAffA9nMN+E/rjxcfRQ6IEk7IiozUjgxKoFHBGjTLnrHB/YC45r/59EQ==} + es-module-lexer@1.7.0: + resolution: {integrity: sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==} es-object-atoms@1.1.1: resolution: {integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==} @@ -1285,8 +1360,8 @@ packages: es6-weak-map@0.1.4: resolution: {integrity: sha512-P+N5Cd2TXeb7G59euFiM7snORspgbInS29Nbf3KNO2JQp/DyhvMCDWd58nsVAXwYJ6W3Bx7qDdy6QQ3PCJ7jKQ==} - esbuild@0.25.1: - resolution: {integrity: sha512-BGO5LtrGC7vxnqucAe/rmvKdJllfGaYWdyABvyMoXQlfYMb2bbRuReWR5tEGE//4LcNJj9XrkovTqNYRFZHAMQ==} + esbuild@0.25.5: + resolution: {integrity: sha512-P8OtKZRv/5J5hhz0cUAdu/cLuPIKXpQl1R9pZtvmHWQvrAUVd0UNIPT4IB4W3rNOqVO0rlqHmCIbSwxh/c9yUQ==} engines: {node: '>=18'} hasBin: true @@ -1347,9 +1422,9 @@ packages: resolution: {integrity: sha512-/kP8CAwxzLVEeFrMm4kMmy4CCDlpipyA7MYLVrdJIkV0fYF0UaigQHRsxHiuY/GEea+bh4KSv3TIlgr+2UL6bw==} engines: {node: '>=12.0.0'} - expect@29.7.0: - resolution: {integrity: sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + expect@30.0.3: + resolution: {integrity: sha512-HXg6NvK35/cSYZCUKAtmlgCFyqKM4frEPbzrav5hRqb0GMz0E0lS5hfzYjSaiaE5ysnp/qI2aeZkeyeIAOeXzQ==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} express@5.1.0: resolution: {integrity: sha512-DT9ck5YIRU+8GYzzU5kT3eHGA5iL+1Zd0EutOmTE9Dtk+Tvuzd23VBU+ec7HPNSTxXYO55gPV/hq4pSBJDjFpA==} @@ -1378,19 +1453,11 @@ packages: fast-uri@3.0.6: resolution: {integrity: sha512-Atfo14OibSv5wAp4VWNsFYE1AchQRTv9cBGWET4pZWHzYshFSS9NQI6I57rdKn9croWVMbYFbLhJ+yJvmZIIHw==} - fastest-validator@1.19.0: - resolution: {integrity: sha512-wUfJBrXmccVz4kARAiWTkuqsC6EFeqbNxwfysCDk+maExBPP8KxyBwaWtayrWjKIaBIbaz+rqI2kel6ecayxcg==} + fastest-validator@1.19.1: + resolution: {integrity: sha512-eXiPCYOsuS5OWI+OVH9whu4LDGqO4cE7jUnZyQ8jV3rXfmC0OghQACOtYjTDxsVnblzvXIHGuizjFg0csiLE6g==} - fdir@6.4.3: - resolution: {integrity: sha512-PMXmW2y1hDDfTSRc9gaXIuCCRpuoz3Kaz8cUelp3smouvfT632ozg2vrT6lJsHKKOF59YLbOGfAWGUcKEfRMQw==} - peerDependencies: - picomatch: ^3 || ^4 - peerDependenciesMeta: - picomatch: - optional: true - - fdir@6.4.4: - resolution: {integrity: sha512-1NZP+GK4GfuAv3PqKvxQRDMjdSRZjnkq7KfhlNrCNNlZ0ygQFpebfrnfnq/W7fpUnAv9aGWmY1zKx7FYL3gwhg==} + fdir@6.4.6: + resolution: {integrity: sha512-hiFoqpyZcfNm1yc4u8oWCf9A2c4D3QjCrks3zmoVKVxpQRzmPNar1hUJcBG2RQHvEVGDN+Jm81ZheVLAQMK6+w==} peerDependencies: picomatch: ^3 || ^4 peerDependenciesMeta: @@ -1415,6 +1482,9 @@ packages: resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} engines: {node: '>=10'} + fix-dts-default-cjs-exports@1.0.1: + resolution: {integrity: sha512-pVIECanWFC61Hzl2+oOCtoJ3F17kglZC/6N94eRWycFgBH35hHx0Li604ZIzhseh97mf2p0cv7vVrOZGoqhlEg==} + flatted@3.3.3: resolution: {integrity: sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==} @@ -1431,8 +1501,8 @@ packages: resolution: {integrity: sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==} engines: {node: '>=14'} - form-data@4.0.2: - resolution: {integrity: sha512-hGfm/slu0ZabnNt4oaRZ6uREyfCj6P4fT/n6A1rGV+Z0VdGXjfOhVUpkn6qVQONHGIFwmveGXyDs75+nr6FM8w==} + form-data@4.0.3: + resolution: {integrity: sha512-qsITQPfmvMOSAdeyZ+12I1c+CKSstAFAwu+97zrnWAbIr5u8wfsExUzCesVLC8NgHuRUqNN4Zy6UPWUTRGslcA==} engines: {node: '>= 6'} forwarded@0.2.0: @@ -1481,23 +1551,19 @@ packages: resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==} engines: {node: '>= 0.4'} - get-stdin@9.0.0: - resolution: {integrity: sha512-dVKBjfWisLAicarI2Sf+JuBE/DghV4UzNAVe9yhEJuzeREd3JhOTE9cUaJTeSa77fsbQUK3pcOpJfM59+VKZaA==} - engines: {node: '>=12'} - get-stream@6.0.1: resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} engines: {node: '>=10'} - get-tsconfig@4.10.0: - resolution: {integrity: sha512-kGzZ3LWWQcGIAmg6iWvXn0ei6WDtV26wzHRMwDSzmAbcXrTEXxHy6IehI6/4eT6VRKyMP1eF1VqwrVUmE/LR7A==} + get-tsconfig@4.10.1: + resolution: {integrity: sha512-auHyJ4AgMz7vgS8Hp3N6HXSmlMdUyhSUrfBF16w153rxtLIEOE+HGqaBppczZvnHLqQJfiHotCYpNhl0lUROFQ==} giget@1.2.5: resolution: {integrity: sha512-r1ekGw/Bgpi3HLV3h1MRBIlSAdHoIMklpaQ3OQLFcRw9PwAj2rqigvIbg+dBUI51OxVI2jsEtDywDBjSiuf7Ug==} hasBin: true - git-hooks-list@3.2.0: - resolution: {integrity: sha512-ZHG9a1gEhUMX1TvGrLdyWb9kDopCBbTnI8z4JgRMYxsijWipgjSEYoPWqBuIB0DnRnvqlQSEeVmzpeuPm7NdFQ==} + git-hooks-list@4.1.1: + resolution: {integrity: sha512-cmP497iLq54AZnv4YRAEMnEyQ1eIn4tGKbmswqwmFV4GBnAqE8NLtWxxdXa++AalfgL5EBH4IxTPyquEuGY/jA==} glob@10.4.5: resolution: {integrity: sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==} @@ -1518,17 +1584,20 @@ packages: graceful-fs@4.2.11: resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} - graphql-ws@6.0.4: - resolution: {integrity: sha512-8b4OZtNOvv8+NZva8HXamrc0y1jluYC0+13gdh7198FKjVzXyTvVc95DCwGzaKEfn3YuWZxUqjJlHe3qKM/F2g==} + graphql-ws@6.0.5: + resolution: {integrity: sha512-HzYw057ch0hx2gZjkbgk1pur4kAtgljlWRP+Gccudqm3BRrTpExjWCQ9OHdIsq47Y6lHL++1lTvuQHhgRRcevw==} engines: {node: '>=20'} peerDependencies: '@fastify/websocket': ^10 || ^11 + crossws: ~0.3 graphql: ^15.10.1 || ^16 uWebSockets.js: ^20 ws: ^8 peerDependenciesMeta: '@fastify/websocket': optional: true + crossws: + optional: true uWebSockets.js: optional: true ws: @@ -1614,8 +1683,8 @@ packages: inherits@2.0.4: resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} - inquirer@12.4.3: - resolution: {integrity: sha512-p9+jcDKhFHKTunvpffCk7I9eKt8+NPNWO8hMSSoLPv5vahP5Vhr78qWzDtA+6FBWQtFTuLFUWmxTyhC6G2Xz/Q==} + inquirer@12.6.3: + resolution: {integrity: sha512-eX9beYAjr1MqYsIjx1vAheXsRk1jbZRvHLcBu5nA9wX0rXR1IfCZLnVLp4Ym4mrhqmh7AuANwcdtgQ291fZDfQ==} engines: {node: '>=18'} peerDependencies: '@types/node': '>=18' @@ -1631,10 +1700,20 @@ packages: resolution: {integrity: sha512-Ag3wB2o37wslZS19hZqorUnrnzSkpOVy+IiiDEiTqNubEYpYuHWIf6K4psgN2ZWKExS4xhVCrRVfb/wfW8fWJA==} engines: {node: '>= 10'} + is-docker@3.0.0: + resolution: {integrity: sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + hasBin: true + is-fullwidth-code-point@3.0.0: resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} engines: {node: '>=8'} + is-inside-container@1.0.0: + resolution: {integrity: sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==} + engines: {node: '>=14.16'} + hasBin: true + is-interactive@1.0.0: resolution: {integrity: sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==} engines: {node: '>=8'} @@ -1664,6 +1743,10 @@ packages: is-upper-case@1.1.2: resolution: {integrity: sha512-GQYSJMgfeAmVwh9ixyk888l7OIhNAGKtY6QA+IrWlu9MDTCaXmeozOZ2S9Knj7bQwBO/H6J2kb+pbyTUiMNbsw==} + is-wsl@3.1.0: + resolution: {integrity: sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw==} + engines: {node: '>=16'} + isexe@2.0.0: resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} @@ -1682,6 +1765,10 @@ packages: resolution: {integrity: sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==} engines: {node: '>=10'} + istanbul-lib-source-maps@5.0.6: + resolution: {integrity: sha512-yg2d+Em4KizZC5niWhQaIomgf5WlL4vOOjZ5xGCmF8SnPE/mDWWXgvRExdcpCgh9lLRRa1/fSYp2ymmbJ1pI+A==} + engines: {node: '>=10'} + istanbul-reports@3.1.7: resolution: {integrity: sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==} engines: {node: '>=8'} @@ -1694,25 +1781,29 @@ packages: engines: {node: '>=10'} hasBin: true - jest-diff@29.7.0: - resolution: {integrity: sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + jest-diff@30.0.3: + resolution: {integrity: sha512-Q1TAV0cUcBTic57SVnk/mug0/ASyAqtSIOkr7RAlxx97llRYsM74+E8N5WdGJUlwCKwgxPAkVjKh653h1+HA9A==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + + jest-matcher-utils@30.0.3: + resolution: {integrity: sha512-hMpVFGFOhYmIIRGJ0HgM9htC5qUiJ00famcc9sRFchJJiLZbbVKrAztcgE6VnXLRxA3XZ0bvNA7hQWh3oHXo/A==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - jest-get-type@29.6.3: - resolution: {integrity: sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + jest-message-util@30.0.2: + resolution: {integrity: sha512-vXywcxmr0SsKXF/bAD7t7nMamRvPuJkras00gqYeB1V0WllxZrbZ0paRr3XqpFU2sYYjD0qAaG2fRyn/CGZ0aw==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - jest-matcher-utils@29.7.0: - resolution: {integrity: sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + jest-mock@30.0.2: + resolution: {integrity: sha512-PnZOHmqup/9cT/y+pXIVbbi8ID6U1XHRmbvR7MvUy4SLqhCbwpkmXhLbsWbGewHrV5x/1bF7YDjs+x24/QSvFA==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - jest-message-util@29.7.0: - resolution: {integrity: sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + jest-regex-util@30.0.1: + resolution: {integrity: sha512-jHEQgBXAgc+Gh4g0p3bCevgRCVRkB4VB70zhoAE48gxeSr1hfUOsM/C2WoJgVL7Eyg//hudYENbm3Ne+/dRVVA==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - jest-util@29.7.0: - resolution: {integrity: sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + jest-util@30.0.2: + resolution: {integrity: sha512-8IyqfKS4MqprBuUpZNlFB5l+WFehc8bfCe1HSZFHzft2mOuND8Cvi9r1musli+u6F3TqanCZ/Ik4H4pXUolZIg==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} jiti@2.4.2: resolution: {integrity: sha512-rg9zJN+G4n2nfJl5MW3BMygZX56zKPNVEYYqq7adpmMh4Jn2QNEwhvQlFy6jPVdcod7txZtKHWnyZiA3a0zP7A==} @@ -1728,6 +1819,9 @@ packages: js-tokens@4.0.0: resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + js-tokens@9.0.1: + resolution: {integrity: sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ==} + js-yaml@3.14.1: resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==} hasBin: true @@ -1796,8 +1890,8 @@ packages: resolution: {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==} engines: {node: '>=10'} - loupe@3.1.3: - resolution: {integrity: sha512-kkIp7XSkP78ZxJEsSxW3712C6teJVoeHHwgo9zJ380de7IYyJ2ISlxojcH2pC5OFLewESmnRi/+XCDIEEVyoug==} + loupe@3.1.4: + resolution: {integrity: sha512-wJzkKwJrheKtknCOKNEtDK4iqg/MxmZheEMtSTYvnzRdEYaZzmgH976nenp8WdJRdx5Vc1X/9MO0Oszl6ezeXg==} lower-case-first@1.0.2: resolution: {integrity: sha512-UuxaYakO7XeONbKrZf5FEgkantPf5DUqDayzP5VXZrtRPdH86s4kN47I8B3TW10S4QKiE3ziHNf3kRN//okHjA==} @@ -1818,6 +1912,9 @@ packages: magic-string@0.30.17: resolution: {integrity: sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==} + magicast@0.3.5: + resolution: {integrity: sha512-L0WhttDl+2BOsybvEOLK7fW3UA0OQ0IQ2d6Zl2x/a6vVRs3bAY0ECOSHHeL5jD+SbOpOCUEi0y1DgHEn9Qn1AQ==} + make-dir@4.0.0: resolution: {integrity: sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==} engines: {node: '>=10'} @@ -2038,8 +2135,8 @@ packages: mz@2.7.0: resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==} - nanoid@3.3.9: - resolution: {integrity: sha512-SppoicMGpZvbF1l3z4x7No3OlIjP7QJvC9XR7AhZr1kL133KHnKPztkKDc+Ir4aJ/1VhTySrtKhrsycmrMQfvg==} + nanoid@3.3.11: + resolution: {integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==} engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} hasBin: true @@ -2087,9 +2184,9 @@ packages: resolution: {integrity: sha512-TZKxPvItzai9kN9H/TkmCtx/ZN/hvr3vUycjlfmH0ootY9yFBzNOpiXAdIn1Iteqsvk4lQn6B5PTrt+n6h8k/w==} engines: {node: ^18.17.0 || >=20.5.0} - npm-run-all2@7.0.2: - resolution: {integrity: sha512-7tXR+r9hzRNOPNTvXegM+QzCuMjzUIIq66VDunL6j60O4RrExx32XUhlrS7UK4VcdGw5/Wxzb3kfNcFix9JKDA==} - engines: {node: ^18.17.0 || >=20.5.0, npm: '>= 9'} + npm-run-all2@8.0.4: + resolution: {integrity: sha512-wdbB5My48XKp2ZfJUlhnLVihzeuA1hgBnqB2J9ahV77wLS+/YAJAlN8I+X3DIFIPZ3m5L7nplmlbhNiFDmXRDA==} + engines: {node: ^20.5.0 || >=22.0.0, npm: '>= 10'} hasBin: true npm-run-path@4.0.1: @@ -2127,11 +2224,15 @@ packages: resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} engines: {node: '>=6'} + open@10.1.2: + resolution: {integrity: sha512-cxN6aIDPz6rm8hbebcP7vrQNhvRcveZoJU72Y7vskh4oIm+BZwBECnx5nTmrlres1Qapvx27Qo1Auukpf8PKXw==} + engines: {node: '>=18'} + openapi-types@12.1.3: resolution: {integrity: sha512-N4YtSYJqghVu4iek2ZUvcN/0aqH1kRDuNqzcycDxhOUpg7GdvLa2F3DgS6yBNhInhv2r/6I0Flkn7CqL8+nIcw==} - openapi3-ts@4.4.0: - resolution: {integrity: sha512-9asTNB9IkKEzWMcHmVZE7Ts3kC9G7AFHfs8i7caD8HbI76gEjdkId4z/AkP83xdZsH7PLAnnbl47qZkXuxpArw==} + openapi3-ts@4.5.0: + resolution: {integrity: sha512-jaL+HgTq2Gj5jRcfdutgRGLosCy/hT8sQf6VOy+P+g36cZOjI1iukdPnijC+4CmeRzg/jEllJUboEic2FhxhtQ==} ora@5.4.1: resolution: {integrity: sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==} @@ -2194,8 +2295,8 @@ packages: pathe@2.0.3: resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==} - pathval@2.0.0: - resolution: {integrity: sha512-vE7JKRyES09KiunauX7nd2Q9/L7lhok4smP9RZTDeD4MVs72Dp2qNFVz39Nz5a0FVEW0BJR6C0DYrq6unoziZA==} + pathval@2.0.1: + resolution: {integrity: sha512-//nshmD55c46FuFw26xV/xFAaB5HF9Xdap7HJBBnrKdAd6/GxDBaNA1870O79+9ueg61cZLSVc+OaFlfmObYVQ==} engines: {node: '>= 14.16'} perfect-debounce@1.0.0: @@ -2237,12 +2338,12 @@ packages: resolution: {integrity: sha512-ip4qdzjkAyDDZklUaZkcRFb2iA118H9SgRh8yzTkSQK8HilsOJF7rSY8HoW5+I0M46AZgX/pxbprf2vvzQCE0Q==} hasBin: true - pino@9.6.0: - resolution: {integrity: sha512-i85pKRCt4qMjZ1+L7sy2Ag4t1atFcdbEt76+7iRJn1g2BvsnRMGu9p8pivl9fs63M2kF/A0OacFZhTub+m/qMg==} + pino@9.7.0: + resolution: {integrity: sha512-vnMCM6xZTb1WDmLvtG2lE/2p+t9hDEIvTWJsu6FejkE62vB7gDhvzrpFR4Cw2to+9JNQxVnkAKVPA1KPB98vWg==} hasBin: true - pirates@4.0.6: - resolution: {integrity: sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==} + pirates@4.0.7: + resolution: {integrity: sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==} engines: {node: '>= 6'} pkg-types@1.3.1: @@ -2266,23 +2367,23 @@ packages: yaml: optional: true - postcss@8.5.3: - resolution: {integrity: sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A==} + postcss@8.5.6: + resolution: {integrity: sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==} engines: {node: ^10 || ^12 || >=14} pretty-bytes@5.6.0: resolution: {integrity: sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==} engines: {node: '>=6'} - pretty-format@29.7.0: - resolution: {integrity: sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + pretty-format@30.0.2: + resolution: {integrity: sha512-yC5/EBSOrTtqhCKfLHqoUIAXVRZnukHPwWBJWR7h84Q3Be1DRQZLncwcfLoPA5RPQ65qfiCMqgYwdUuQ//eVpg==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} process-warning@3.0.0: resolution: {integrity: sha512-mqn0kFRl0EoqhnL0GQ0veqFHyIN1yig9RHh/InzORTUiZHFRAur+aMtRkELNwGs9aNwKS6tg/An4NYBPGwvtzQ==} - process-warning@4.0.1: - resolution: {integrity: sha512-3c2LzQ3rY9d0hc1emcsHhfT9Jwz0cChib/QN89oME2R451w5fy3f0afAhERFZAwrbDU43wk12d0ORBpDVME50Q==} + process-warning@5.0.0: + resolution: {integrity: sha512-a39t9ApHNx2L4+HBnQKqxxHNs1r7KF+Intd8Q/g1bUh6q0WIp9voPXJ/x0j+ZL45KF1pJd9+q2jLIRMfvEshkA==} process@0.11.10: resolution: {integrity: sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==} @@ -2295,8 +2396,8 @@ packages: proxy-from-env@1.1.0: resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} - pump@3.0.2: - resolution: {integrity: sha512-tUPXtzlGM8FE3P0ZL6DVs/3P58k9nk8/jZeQCurTJylQA8qFYzHFfhBJkuqyE0FifOsQ0uKWekiZ5g8wtr28cw==} + pump@3.0.3: + resolution: {integrity: sha512-todwxLMY7/heScKmntwQG8CXVkWUOdYxIvY2s0VWAAMh/nd8SoYiRaKjlr7+iCs984f2P8zvrfWcDDYVb73NfA==} punycode@2.3.1: resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} @@ -2378,8 +2479,8 @@ packages: resolution: {integrity: sha512-l0OE8wL34P4nJH/H2ffoaniAokM2qSmrtXHmlpvYr5AVVX8msAyW0l8NVJFDxlSK4u3Uh/f41cQheDVdnYijwQ==} hasBin: true - rollup@4.35.0: - resolution: {integrity: sha512-kg6oI4g+vc41vePJyO6dHt/yl0Rz3Thv0kJeVQ3D1kS3E5XSuKbPc29G4IpT/Kv1KQwgHVcN+HtyS+HYLNSvQg==} + rollup@4.44.1: + resolution: {integrity: sha512-x8H8aPvD+xbl0Do8oez5f5o8eMS3trfCghc4HhLAnCkj7Vl0d1JWGs0UF/D886zLW2rOj2QymV/JcSSsw+XDNg==} engines: {node: '>=18.0.0', npm: '>=8.0.0'} hasBin: true @@ -2387,6 +2488,10 @@ packages: resolution: {integrity: sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ==} engines: {node: '>= 18'} + run-applescript@7.0.0: + resolution: {integrity: sha512-9by4Ij99JUr/MCFBUkDKLWK3G9HVXmabKz9U5MlIAIuvuzkiOicRYs8XJLxX+xahD+mLiiCYDqF9dKAgtzKP1A==} + engines: {node: '>=18'} + run-async@3.0.0: resolution: {integrity: sha512-540WwVDOMxA6dN6We19EcT9sc3hkXPw5mzRNGM3FkdN/vtE9NFvj5lFAPNwUDmJjXidm3v7TC1cTE7t17Ulm1Q==} engines: {node: '>=0.12.0'} @@ -2407,8 +2512,8 @@ packages: secure-json-parse@2.7.0: resolution: {integrity: sha512-6aU+Rwsezw7VR8/nyvKTx8QpWH9FrcYiXXlqC4z5d5XQBDRqtbfsRjnwGyqbi3gddNtWHuEk9OANUotL26qKUw==} - semver@7.7.1: - resolution: {integrity: sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==} + semver@7.7.2: + resolution: {integrity: sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==} engines: {node: '>=10'} hasBin: true @@ -2442,8 +2547,8 @@ packages: resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} engines: {node: '>=8'} - shell-quote@1.8.2: - resolution: {integrity: sha512-AzqKpGKjrj7EM6rKVQEPpB288oCfnrEIuyoT9cyF4nmGa7V8Zk6f7RRqYisX8X9m+Q7bd632aZW4ky7EhbQztA==} + shell-quote@1.8.3: + resolution: {integrity: sha512-ObmnIF4hXNg1BqhnHmgbDETF8dLPCggZWBjkQfhZpbszZnYur5DUljTcCHii5LC3J5E0yeO/1LIMyH+UvHQgyw==} engines: {node: '>= 0.4'} side-channel-list@1.0.0: @@ -2507,8 +2612,9 @@ packages: sort-object-keys@1.1.3: resolution: {integrity: sha512-855pvK+VkU7PaKYPc+Jjnmt4EzejQHyhhF33q31qG8x7maDzkeFhAAThdCYay11CISO+qAMwjOBP+fPZe0IPyg==} - sort-package-json@3.0.0: - resolution: {integrity: sha512-vfZWx4DnFNB8R9Vg4Dnx21s20auNzWH15ZaCBfADAiyrCwemRmhWstTgvLjMek1DW3+MHcNaqkp86giCF24rMA==} + sort-package-json@3.3.1: + resolution: {integrity: sha512-awjhQR2Iy5UN3NuguAK5+RezcEuUg9Ra4O8y2Aj+DlJa7MywyHaipAPf9bu4qqFj0hsYHHoT9sS3aV7Ucu728g==} + engines: {node: '>=20'} hasBin: true source-map-js@1.2.1: @@ -2541,6 +2647,10 @@ packages: resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==} engines: {node: '>= 0.8'} + statuses@2.0.2: + resolution: {integrity: sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==} + engines: {node: '>= 0.8'} + std-env@3.9.0: resolution: {integrity: sha512-UGvjygr6F6tpH7o2qyqR6QYpwraIjKSdtzyBdyytFOHmPZY917kwdwLG0RbOjWOnKmnm3PeHjaoLLMie7kPLQw==} @@ -2575,6 +2685,9 @@ packages: resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} engines: {node: '>=8'} + strip-literal@3.0.0: + resolution: {integrity: sha512-TcccoMhJOM3OebGhSBEmp3UZ2SfDMZUEBdRA/9ynfLi8yYajyWX3JiXArcJt4Umh4vISpspkQIY8ZZoCqjbviA==} + sucrase@3.35.0: resolution: {integrity: sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==} engines: {node: '>=16 || 14 >=14.17'} @@ -2645,24 +2758,20 @@ packages: tinyexec@0.3.2: resolution: {integrity: sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==} - tinyglobby@0.2.12: - resolution: {integrity: sha512-qkf4trmKSIiMTs/E63cxH+ojC2unam7rJ0WrauAzpT3ECNTxGRMlaXxVbfxMUC/w0LaYk6jQ4y/nGR9uBO3tww==} + tinyglobby@0.2.14: + resolution: {integrity: sha512-tX5e7OM1HnYr2+a2C/4V0htOcSQcoSTH9KgJnVvNm5zm/cyEWKJ7j7YutsH9CxMdtOkkLFy2AHrMci9IM8IPZQ==} engines: {node: '>=12.0.0'} - tinyglobby@0.2.13: - resolution: {integrity: sha512-mEwzpUgrLySlveBwEVDMKk5B57bhLPYovRfPAXD5gA/98Opn0rCDj3GtLwFvCvH5RK9uPCExUROW5NjDwvqkxw==} - engines: {node: '>=12.0.0'} - - tinypool@1.0.2: - resolution: {integrity: sha512-al6n+QEANGFOMf/dmUMsuS5/r9B06uwlyNjZZql/zv8J7ybHCgoihBNORZCY2mzUuAnomQa2JdhyHKzZxPCrFA==} + tinypool@1.1.1: + resolution: {integrity: sha512-Zba82s87IFq9A9XmjiX5uZA/ARWDrB03OHlq+Vw1fSdt0I+4/Kutwy8BP4Y/y/aORMo61FQ0vIb5j44vSo5Pkg==} engines: {node: ^18.0.0 || >=20.0.0} tinyrainbow@2.0.0: resolution: {integrity: sha512-op4nsTR47R6p0vMUUoYl/a+ljLFVtlfaXkLQmqfLR1qHma1h/ysYk4hEXZ880bf2CYgTskvTa/e196Vd5dDQXw==} engines: {node: '>=14.0.0'} - tinyspy@3.0.2: - resolution: {integrity: sha512-n1cw8k1k0x4pgA2+9XrOkFydTerNcJ1zWCO5Nn9scWHTD+5tp8dghT2x1uduQePZTZgd3Tupf+x9BxJjeJi77Q==} + tinyspy@4.0.3: + resolution: {integrity: sha512-t2T/WLB2WRgZ9EpE4jgPJ9w+i66UZfDc8wHh0xrwiRNN+UwH98GIJkTeZqX9rg0i0ptwzqW+uYeIF0T4F8LR7A==} engines: {node: '>=14.0.0'} title-case@2.1.1: @@ -2700,8 +2809,8 @@ packages: tslib@2.8.1: resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} - tsup@8.4.0: - resolution: {integrity: sha512-b+eZbPCjz10fRryaAA7C8xlIHnf8VnsaRqydheLIqwG/Mcpfk8Z5zp3HayX7GaTygkigHl5cBUs+IhcySiIexQ==} + tsup@8.5.0: + resolution: {integrity: sha512-VmBp77lWNQq6PfuMqCHD3xWl22vEoWsKajkF8t+yMBawlUS8JzEI+vOVMeuNZIuMML8qXRizFKi9oD5glKQVcQ==} engines: {node: '>=18'} hasBin: true peerDependencies: @@ -2719,8 +2828,8 @@ packages: typescript: optional: true - tsx@4.19.3: - resolution: {integrity: sha512-4H8vUNGNjQ4V2EOoGw005+c+dGuPSnhpPBPHBtsZdGZBk/iJb4kguGlPWaZTZ3q5nMtFOEsY0nRDlh9PJyd6SQ==} + tsx@4.20.3: + resolution: {integrity: sha512-qjbnuR9Tr+FJOMBqJCW5ehvIo/buZq7vH7qD7JziU98h6l3qGy0a/yPFjwO+y0/T7GFpNgNAvEcPPVfyT8rrPQ==} engines: {node: '>=18.0.0'} hasBin: true @@ -2753,16 +2862,16 @@ packages: engines: {node: '>=14.17'} hasBin: true - ufo@1.5.4: - resolution: {integrity: sha512-UsUk3byDzKd04EyoZ7U4DOlxQaD14JUKQl6/P7wiX4FNvUfm3XL246n9W5AmqwW5RSFJ27NAuM0iLscAOYUiGQ==} + ufo@1.6.1: + resolution: {integrity: sha512-9a4/uxlTWJ4+a5i0ooc1rU7C7YOw3wT+UGqdeNNHWnOF9qcMBgLRS+4IYUqbczewFx4mLEig6gawh7X6mFlEkA==} uglify-js@3.19.3: resolution: {integrity: sha512-v3Xu+yuwBXisp6QYTcH4UbH+xYJXqnq2m/LtQVWKWzYc1iehYnLixoQDN9FH6/j9/oybfd6W9Ghwkl8+UMKTKQ==} engines: {node: '>=0.8.0'} hasBin: true - undici-types@6.21.0: - resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==} + undici-types@7.8.0: + resolution: {integrity: sha512-9UJ2xGDvQ43tYyVMpuHlsgApydB8ZKfVYTsLDhXkFL/6gfkp+U8xTGdh8pMJv1SpZna0zxG1DwsKZsreLbXBxw==} universalify@2.0.1: resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==} @@ -2785,32 +2894,32 @@ packages: resolution: {integrity: sha512-kiGUalWN+rgBJ/1OHZsBtU4rXZOfj/7rKQxULKlIzwzQSvMJUUNgPwJEEh7gU6xEVxC0ahoOBvN2YI8GH6FNgA==} engines: {node: '>=10.12.0'} - validator@13.12.0: - resolution: {integrity: sha512-c1Q0mCiPlgdTVVVIJIrBuxNicYE+t/7oKeI9MWLj3fh/uq2Pxh/3eeWbVZ4OcGW1TUf53At0njHw5SMdA3tmMg==} + validator@13.15.15: + resolution: {integrity: sha512-BgWVbCI72aIQy937xbawcs+hrVaN/CZ2UwutgaJ36hGqRrLNM+f5LUT/YPRbo8IV/ASeFzXszezV+y2+rq3l8A==} engines: {node: '>= 0.10'} vary@1.1.2: resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} engines: {node: '>= 0.8'} - vite-node@3.1.2: - resolution: {integrity: sha512-/8iMryv46J3aK13iUXsei5G/A3CUlW4665THCPS+K8xAaqrVWiGB4RfXMQXCLjpK9P2eK//BczrVkn5JLAk6DA==} + vite-node@3.2.4: + resolution: {integrity: sha512-EbKSKh+bh1E1IFxeO0pg1n4dvoOTt0UDiXMd/qn++r98+jPO1xtJilvXldeuQ8giIB5IkpjCgMleHMNEsGH6pg==} engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} hasBin: true - vite@6.3.3: - resolution: {integrity: sha512-5nXH+QsELbFKhsEfWLkHrvgRpTdGJzqOZ+utSdmPTvwHmvU6ITTm3xx+mRusihkcI8GeC7lCDyn3kDtiki9scw==} - engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} + vite@7.0.0: + resolution: {integrity: sha512-ixXJB1YRgDIw2OszKQS9WxGHKwLdCsbQNkpJN171udl6szi/rIySHL6/Os3s2+oE4P/FLD4dxg4mD7Wust+u5g==} + engines: {node: ^20.19.0 || >=22.12.0} hasBin: true peerDependencies: - '@types/node': ^18.0.0 || ^20.0.0 || >=22.0.0 + '@types/node': ^20.19.0 || >=22.12.0 jiti: '>=1.21.0' - less: '*' + less: ^4.0.0 lightningcss: ^1.21.0 - sass: '*' - sass-embedded: '*' - stylus: '*' - sugarss: '*' + sass: ^1.70.0 + sass-embedded: ^1.70.0 + stylus: '>=0.54.8' + sugarss: ^5.0.0 terser: ^5.16.0 tsx: ^4.8.1 yaml: ^2.4.2 @@ -2838,16 +2947,16 @@ packages: yaml: optional: true - vitest@3.1.2: - resolution: {integrity: sha512-WaxpJe092ID1C0mr+LH9MmNrhfzi8I65EX/NRU/Ld016KqQNRgxSOlGNP1hHN+a/F8L15Mh8klwaF77zR3GeDQ==} + vitest@3.2.4: + resolution: {integrity: sha512-LUCP5ev3GURDysTWiP47wRRUpLKMOfPh+yKTx3kVIEiu5KOMeqzpnYNsKyOoVrULivR8tLcks4+lga33Whn90A==} engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} hasBin: true peerDependencies: '@edge-runtime/vm': '*' '@types/debug': ^4.1.12 '@types/node': ^18.0.0 || ^20.0.0 || >=22.0.0 - '@vitest/browser': 3.1.2 - '@vitest/ui': 3.1.2 + '@vitest/browser': 3.2.4 + '@vitest/ui': 3.2.4 happy-dom: '*' jsdom: '*' peerDependenciesMeta: @@ -2931,8 +3040,8 @@ packages: utf-8-validate: optional: true - ws@8.18.1: - resolution: {integrity: sha512-RKW2aJZMXeMxVpnZ6bck+RswznaxmzdULiBr6KY7XkTnW8uvt0iT9H5DkHUChXrc+uurzwa0rVI16n/Xzjdz1w==} + ws@8.18.2: + resolution: {integrity: sha512-DMricUmwGZUVr++AEAe2uiVM7UoO9MAVZMDu05UQOaUII0lp+zOzLLU4Xqh/JvTqklB1T4uELaaPBKyjE1r4fQ==} engines: {node: '>=10.0.0'} peerDependencies: bufferutil: ^4.0.1 @@ -2954,9 +3063,9 @@ packages: resolution: {integrity: sha512-W7h5dEhywMKenDJh2iX/LABkbFnBxasD27oyXWDS/feDsxiw0dD5ncXdYXgkvAsXIY2MpW/ZKkr9IU30DBdMNQ==} engines: {node: '>= 6'} - yaml@2.7.1: - resolution: {integrity: sha512-10ULxpnOCQXxJvBgxsn9ptjq6uviG/htZKk9veJGhlqn3w/DxQ631zFF+nlQXLwmImeS5amR2dl2U8sg6U9jsQ==} - engines: {node: '>= 14'} + yaml@2.8.0: + resolution: {integrity: sha512-4lLa/EcQCB0cJkyts+FpIRx5G/llPxfP6VQU5KByHEhLxY3IJCH0f0Hy1MHI8sClTvsIb8qwRJ6R/ZdlDJ/leQ==} + engines: {node: '>= 14.6'} hasBin: true yargs-parser@21.1.1: @@ -2980,11 +3089,16 @@ packages: engines: {node: '>=8.0.0'} hasBin: true - zod@3.24.3: - resolution: {integrity: sha512-HhY1oqzWCQWuUqvBFnsyrtZRhyPeR7SUGv+C4+MsisMuVfSPx8HpwWqH8tRahSlt6M3PiFAcoeFhZAqIXTxoSg==} + zod@3.25.67: + resolution: {integrity: sha512-idA2YXwpCdqUSKRCACDE6ItZD9TZzy3OZMtpfLoh6oPR47lipysRrJfjzMqFxQ3uJuUPyUeWe1r9vLH33xO/Qw==} snapshots: + '@ampproject/remapping@2.3.0': + dependencies: + '@jridgewell/gen-mapping': 0.3.8 + '@jridgewell/trace-mapping': 0.3.25 + '@apidevtools/json-schema-ref-parser@9.1.2': dependencies: '@jsdevtools/ono': 7.1.3 @@ -3006,142 +3120,153 @@ snapshots: openapi-types: 12.1.3 z-schema: 5.0.5 - '@asteasolutions/zod-to-openapi@7.3.0(zod@3.24.3)': + '@asteasolutions/zod-to-openapi@7.3.4(zod@3.25.67)': dependencies: - openapi3-ts: 4.4.0 - zod: 3.24.3 + openapi3-ts: 4.5.0 + zod: 3.25.67 - '@babel/code-frame@7.26.2': + '@babel/code-frame@7.27.1': dependencies: - '@babel/helper-validator-identifier': 7.25.9 + '@babel/helper-validator-identifier': 7.27.1 js-tokens: 4.0.0 picocolors: 1.1.1 - '@babel/helper-validator-identifier@7.25.9': {} + '@babel/helper-string-parser@7.27.1': {} + + '@babel/helper-validator-identifier@7.27.1': {} + + '@babel/parser@7.28.0': + dependencies: + '@babel/types': 7.28.0 + + '@babel/types@7.28.0': + dependencies: + '@babel/helper-string-parser': 7.27.1 + '@babel/helper-validator-identifier': 7.27.1 '@bcoe/v8-coverage@1.0.2': {} - '@biomejs/biome@1.9.4': + '@biomejs/biome@2.0.6': optionalDependencies: - '@biomejs/cli-darwin-arm64': 1.9.4 - '@biomejs/cli-darwin-x64': 1.9.4 - '@biomejs/cli-linux-arm64': 1.9.4 - '@biomejs/cli-linux-arm64-musl': 1.9.4 - '@biomejs/cli-linux-x64': 1.9.4 - '@biomejs/cli-linux-x64-musl': 1.9.4 - '@biomejs/cli-win32-arm64': 1.9.4 - '@biomejs/cli-win32-x64': 1.9.4 - - '@biomejs/cli-darwin-arm64@1.9.4': + '@biomejs/cli-darwin-arm64': 2.0.6 + '@biomejs/cli-darwin-x64': 2.0.6 + '@biomejs/cli-linux-arm64': 2.0.6 + '@biomejs/cli-linux-arm64-musl': 2.0.6 + '@biomejs/cli-linux-x64': 2.0.6 + '@biomejs/cli-linux-x64-musl': 2.0.6 + '@biomejs/cli-win32-arm64': 2.0.6 + '@biomejs/cli-win32-x64': 2.0.6 + + '@biomejs/cli-darwin-arm64@2.0.6': optional: true - '@biomejs/cli-darwin-x64@1.9.4': + '@biomejs/cli-darwin-x64@2.0.6': optional: true - '@biomejs/cli-linux-arm64-musl@1.9.4': + '@biomejs/cli-linux-arm64-musl@2.0.6': optional: true - '@biomejs/cli-linux-arm64@1.9.4': + '@biomejs/cli-linux-arm64@2.0.6': optional: true - '@biomejs/cli-linux-x64-musl@1.9.4': + '@biomejs/cli-linux-x64-musl@2.0.6': optional: true - '@biomejs/cli-linux-x64@1.9.4': + '@biomejs/cli-linux-x64@2.0.6': optional: true - '@biomejs/cli-win32-arm64@1.9.4': + '@biomejs/cli-win32-arm64@2.0.6': optional: true - '@biomejs/cli-win32-x64@1.9.4': + '@biomejs/cli-win32-x64@2.0.6': optional: true - '@esbuild/aix-ppc64@0.25.1': + '@esbuild/aix-ppc64@0.25.5': optional: true - '@esbuild/android-arm64@0.25.1': + '@esbuild/android-arm64@0.25.5': optional: true - '@esbuild/android-arm@0.25.1': + '@esbuild/android-arm@0.25.5': optional: true - '@esbuild/android-x64@0.25.1': + '@esbuild/android-x64@0.25.5': optional: true - '@esbuild/darwin-arm64@0.25.1': + '@esbuild/darwin-arm64@0.25.5': optional: true - '@esbuild/darwin-x64@0.25.1': + '@esbuild/darwin-x64@0.25.5': optional: true - '@esbuild/freebsd-arm64@0.25.1': + '@esbuild/freebsd-arm64@0.25.5': optional: true - '@esbuild/freebsd-x64@0.25.1': + '@esbuild/freebsd-x64@0.25.5': optional: true - '@esbuild/linux-arm64@0.25.1': + '@esbuild/linux-arm64@0.25.5': optional: true - '@esbuild/linux-arm@0.25.1': + '@esbuild/linux-arm@0.25.5': optional: true - '@esbuild/linux-ia32@0.25.1': + '@esbuild/linux-ia32@0.25.5': optional: true - '@esbuild/linux-loong64@0.25.1': + '@esbuild/linux-loong64@0.25.5': optional: true - '@esbuild/linux-mips64el@0.25.1': + '@esbuild/linux-mips64el@0.25.5': optional: true - '@esbuild/linux-ppc64@0.25.1': + '@esbuild/linux-ppc64@0.25.5': optional: true - '@esbuild/linux-riscv64@0.25.1': + '@esbuild/linux-riscv64@0.25.5': optional: true - '@esbuild/linux-s390x@0.25.1': + '@esbuild/linux-s390x@0.25.5': optional: true - '@esbuild/linux-x64@0.25.1': + '@esbuild/linux-x64@0.25.5': optional: true - '@esbuild/netbsd-arm64@0.25.1': + '@esbuild/netbsd-arm64@0.25.5': optional: true - '@esbuild/netbsd-x64@0.25.1': + '@esbuild/netbsd-x64@0.25.5': optional: true - '@esbuild/openbsd-arm64@0.25.1': + '@esbuild/openbsd-arm64@0.25.5': optional: true - '@esbuild/openbsd-x64@0.25.1': + '@esbuild/openbsd-x64@0.25.5': optional: true - '@esbuild/sunos-x64@0.25.1': + '@esbuild/sunos-x64@0.25.5': optional: true - '@esbuild/win32-arm64@0.25.1': + '@esbuild/win32-arm64@0.25.5': optional: true - '@esbuild/win32-ia32@0.25.1': + '@esbuild/win32-ia32@0.25.5': optional: true - '@esbuild/win32-x64@0.25.1': + '@esbuild/win32-x64@0.25.5': optional: true '@fastify/busboy@1.2.1': dependencies: text-decoding: 1.0.0 - '@flydotio/dockerfile@0.7.10(@types/node@22.15.2)': + '@flydotio/dockerfile@0.7.10(@types/node@24.0.6)': dependencies: chalk: 5.4.1 diff: 7.0.0 ejs: 3.1.10 - inquirer: 12.4.3(@types/node@22.15.2) - shell-quote: 1.8.2 + inquirer: 12.6.3(@types/node@24.0.6) + shell-quote: 1.8.3 yargs: 17.7.2 transitivePeerDependencies: - '@types/node' @@ -3152,44 +3277,47 @@ snapshots: dependencies: '@hapi/hoek': 9.3.0 - '@hey-api/json-schema-ref-parser@1.0.5': + '@hey-api/json-schema-ref-parser@1.0.6': dependencies: '@jsdevtools/ono': 7.1.3 '@types/json-schema': 7.0.15 js-yaml: 4.1.0 lodash: 4.17.21 - '@hey-api/openapi-ts@0.66.6(typescript@5.8.3)': + '@hey-api/openapi-ts@0.77.0(magicast@0.3.5)(typescript@5.8.3)': dependencies: - '@hey-api/json-schema-ref-parser': 1.0.5 - c12: 2.0.1 + '@hey-api/json-schema-ref-parser': 1.0.6 + ansi-colors: 4.1.3 + c12: 2.0.1(magicast@0.3.5) + color-support: 1.1.3 commander: 13.0.0 handlebars: 4.7.8 + open: 10.1.2 typescript: 5.8.3 transitivePeerDependencies: - magicast - '@inquirer/checkbox@4.1.3(@types/node@22.15.2)': + '@inquirer/checkbox@4.1.8(@types/node@24.0.6)': dependencies: - '@inquirer/core': 10.1.8(@types/node@22.15.2) - '@inquirer/figures': 1.0.11 - '@inquirer/type': 3.0.5(@types/node@22.15.2) + '@inquirer/core': 10.1.13(@types/node@24.0.6) + '@inquirer/figures': 1.0.12 + '@inquirer/type': 3.0.7(@types/node@24.0.6) ansi-escapes: 4.3.2 yoctocolors-cjs: 2.1.2 optionalDependencies: - '@types/node': 22.15.2 + '@types/node': 24.0.6 - '@inquirer/confirm@5.1.7(@types/node@22.15.2)': + '@inquirer/confirm@5.1.12(@types/node@24.0.6)': dependencies: - '@inquirer/core': 10.1.8(@types/node@22.15.2) - '@inquirer/type': 3.0.5(@types/node@22.15.2) + '@inquirer/core': 10.1.13(@types/node@24.0.6) + '@inquirer/type': 3.0.7(@types/node@24.0.6) optionalDependencies: - '@types/node': 22.15.2 + '@types/node': 24.0.6 - '@inquirer/core@10.1.8(@types/node@22.15.2)': + '@inquirer/core@10.1.13(@types/node@24.0.6)': dependencies: - '@inquirer/figures': 1.0.11 - '@inquirer/type': 3.0.5(@types/node@22.15.2) + '@inquirer/figures': 1.0.12 + '@inquirer/type': 3.0.7(@types/node@24.0.6) ansi-escapes: 4.3.2 cli-width: 4.1.0 mute-stream: 2.0.0 @@ -3197,93 +3325,93 @@ snapshots: wrap-ansi: 6.2.0 yoctocolors-cjs: 2.1.2 optionalDependencies: - '@types/node': 22.15.2 + '@types/node': 24.0.6 - '@inquirer/editor@4.2.8(@types/node@22.15.2)': + '@inquirer/editor@4.2.13(@types/node@24.0.6)': dependencies: - '@inquirer/core': 10.1.8(@types/node@22.15.2) - '@inquirer/type': 3.0.5(@types/node@22.15.2) + '@inquirer/core': 10.1.13(@types/node@24.0.6) + '@inquirer/type': 3.0.7(@types/node@24.0.6) external-editor: 3.1.0 optionalDependencies: - '@types/node': 22.15.2 + '@types/node': 24.0.6 - '@inquirer/expand@4.0.10(@types/node@22.15.2)': + '@inquirer/expand@4.0.15(@types/node@24.0.6)': dependencies: - '@inquirer/core': 10.1.8(@types/node@22.15.2) - '@inquirer/type': 3.0.5(@types/node@22.15.2) + '@inquirer/core': 10.1.13(@types/node@24.0.6) + '@inquirer/type': 3.0.7(@types/node@24.0.6) yoctocolors-cjs: 2.1.2 optionalDependencies: - '@types/node': 22.15.2 + '@types/node': 24.0.6 - '@inquirer/figures@1.0.11': {} + '@inquirer/figures@1.0.12': {} - '@inquirer/input@4.1.7(@types/node@22.15.2)': + '@inquirer/input@4.1.12(@types/node@24.0.6)': dependencies: - '@inquirer/core': 10.1.8(@types/node@22.15.2) - '@inquirer/type': 3.0.5(@types/node@22.15.2) + '@inquirer/core': 10.1.13(@types/node@24.0.6) + '@inquirer/type': 3.0.7(@types/node@24.0.6) optionalDependencies: - '@types/node': 22.15.2 + '@types/node': 24.0.6 - '@inquirer/number@3.0.10(@types/node@22.15.2)': + '@inquirer/number@3.0.15(@types/node@24.0.6)': dependencies: - '@inquirer/core': 10.1.8(@types/node@22.15.2) - '@inquirer/type': 3.0.5(@types/node@22.15.2) + '@inquirer/core': 10.1.13(@types/node@24.0.6) + '@inquirer/type': 3.0.7(@types/node@24.0.6) optionalDependencies: - '@types/node': 22.15.2 + '@types/node': 24.0.6 - '@inquirer/password@4.0.10(@types/node@22.15.2)': + '@inquirer/password@4.0.15(@types/node@24.0.6)': dependencies: - '@inquirer/core': 10.1.8(@types/node@22.15.2) - '@inquirer/type': 3.0.5(@types/node@22.15.2) + '@inquirer/core': 10.1.13(@types/node@24.0.6) + '@inquirer/type': 3.0.7(@types/node@24.0.6) ansi-escapes: 4.3.2 optionalDependencies: - '@types/node': 22.15.2 - - '@inquirer/prompts@7.3.3(@types/node@22.15.2)': - dependencies: - '@inquirer/checkbox': 4.1.3(@types/node@22.15.2) - '@inquirer/confirm': 5.1.7(@types/node@22.15.2) - '@inquirer/editor': 4.2.8(@types/node@22.15.2) - '@inquirer/expand': 4.0.10(@types/node@22.15.2) - '@inquirer/input': 4.1.7(@types/node@22.15.2) - '@inquirer/number': 3.0.10(@types/node@22.15.2) - '@inquirer/password': 4.0.10(@types/node@22.15.2) - '@inquirer/rawlist': 4.0.10(@types/node@22.15.2) - '@inquirer/search': 3.0.10(@types/node@22.15.2) - '@inquirer/select': 4.0.10(@types/node@22.15.2) + '@types/node': 24.0.6 + + '@inquirer/prompts@7.5.3(@types/node@24.0.6)': + dependencies: + '@inquirer/checkbox': 4.1.8(@types/node@24.0.6) + '@inquirer/confirm': 5.1.12(@types/node@24.0.6) + '@inquirer/editor': 4.2.13(@types/node@24.0.6) + '@inquirer/expand': 4.0.15(@types/node@24.0.6) + '@inquirer/input': 4.1.12(@types/node@24.0.6) + '@inquirer/number': 3.0.15(@types/node@24.0.6) + '@inquirer/password': 4.0.15(@types/node@24.0.6) + '@inquirer/rawlist': 4.1.3(@types/node@24.0.6) + '@inquirer/search': 3.0.15(@types/node@24.0.6) + '@inquirer/select': 4.2.3(@types/node@24.0.6) optionalDependencies: - '@types/node': 22.15.2 + '@types/node': 24.0.6 - '@inquirer/rawlist@4.0.10(@types/node@22.15.2)': + '@inquirer/rawlist@4.1.3(@types/node@24.0.6)': dependencies: - '@inquirer/core': 10.1.8(@types/node@22.15.2) - '@inquirer/type': 3.0.5(@types/node@22.15.2) + '@inquirer/core': 10.1.13(@types/node@24.0.6) + '@inquirer/type': 3.0.7(@types/node@24.0.6) yoctocolors-cjs: 2.1.2 optionalDependencies: - '@types/node': 22.15.2 + '@types/node': 24.0.6 - '@inquirer/search@3.0.10(@types/node@22.15.2)': + '@inquirer/search@3.0.15(@types/node@24.0.6)': dependencies: - '@inquirer/core': 10.1.8(@types/node@22.15.2) - '@inquirer/figures': 1.0.11 - '@inquirer/type': 3.0.5(@types/node@22.15.2) + '@inquirer/core': 10.1.13(@types/node@24.0.6) + '@inquirer/figures': 1.0.12 + '@inquirer/type': 3.0.7(@types/node@24.0.6) yoctocolors-cjs: 2.1.2 optionalDependencies: - '@types/node': 22.15.2 + '@types/node': 24.0.6 - '@inquirer/select@4.0.10(@types/node@22.15.2)': + '@inquirer/select@4.2.3(@types/node@24.0.6)': dependencies: - '@inquirer/core': 10.1.8(@types/node@22.15.2) - '@inquirer/figures': 1.0.11 - '@inquirer/type': 3.0.5(@types/node@22.15.2) + '@inquirer/core': 10.1.13(@types/node@24.0.6) + '@inquirer/figures': 1.0.12 + '@inquirer/type': 3.0.7(@types/node@24.0.6) ansi-escapes: 4.3.2 yoctocolors-cjs: 2.1.2 optionalDependencies: - '@types/node': 22.15.2 + '@types/node': 24.0.6 - '@inquirer/type@3.0.5(@types/node@22.15.2)': + '@inquirer/type@3.0.7(@types/node@24.0.6)': optionalDependencies: - '@types/node': 22.15.2 + '@types/node': 24.0.6 '@isaacs/cliui@8.0.2': dependencies: @@ -3296,20 +3424,30 @@ snapshots: '@istanbuljs/schema@0.1.3': {} - '@jest/expect-utils@29.7.0': + '@jest/diff-sequences@30.0.1': {} + + '@jest/expect-utils@30.0.3': + dependencies: + '@jest/get-type': 30.0.1 + + '@jest/get-type@30.0.1': {} + + '@jest/pattern@30.0.1': dependencies: - jest-get-type: 29.6.3 + '@types/node': 24.0.6 + jest-regex-util: 30.0.1 - '@jest/schemas@29.6.3': + '@jest/schemas@30.0.1': dependencies: - '@sinclair/typebox': 0.27.8 + '@sinclair/typebox': 0.34.37 - '@jest/types@29.6.3': + '@jest/types@30.0.1': dependencies: - '@jest/schemas': 29.6.3 + '@jest/pattern': 30.0.1 + '@jest/schemas': 30.0.1 '@types/istanbul-lib-coverage': 2.0.6 '@types/istanbul-reports': 3.0.4 - '@types/node': 22.15.2 + '@types/node': 24.0.6 '@types/yargs': 17.0.33 chalk: 4.1.2 @@ -3335,63 +3473,66 @@ snapshots: '@pkgjs/parseargs@0.11.0': optional: true - '@polka/url@1.0.0-next.28': {} + '@polka/url@1.0.0-next.29': {} - '@rollup/rollup-android-arm-eabi@4.35.0': + '@rollup/rollup-android-arm-eabi@4.44.1': optional: true - '@rollup/rollup-android-arm64@4.35.0': + '@rollup/rollup-android-arm64@4.44.1': optional: true - '@rollup/rollup-darwin-arm64@4.35.0': + '@rollup/rollup-darwin-arm64@4.44.1': optional: true - '@rollup/rollup-darwin-x64@4.35.0': + '@rollup/rollup-darwin-x64@4.44.1': optional: true - '@rollup/rollup-freebsd-arm64@4.35.0': + '@rollup/rollup-freebsd-arm64@4.44.1': optional: true - '@rollup/rollup-freebsd-x64@4.35.0': + '@rollup/rollup-freebsd-x64@4.44.1': optional: true - '@rollup/rollup-linux-arm-gnueabihf@4.35.0': + '@rollup/rollup-linux-arm-gnueabihf@4.44.1': optional: true - '@rollup/rollup-linux-arm-musleabihf@4.35.0': + '@rollup/rollup-linux-arm-musleabihf@4.44.1': optional: true - '@rollup/rollup-linux-arm64-gnu@4.35.0': + '@rollup/rollup-linux-arm64-gnu@4.44.1': optional: true - '@rollup/rollup-linux-arm64-musl@4.35.0': + '@rollup/rollup-linux-arm64-musl@4.44.1': optional: true - '@rollup/rollup-linux-loongarch64-gnu@4.35.0': + '@rollup/rollup-linux-loongarch64-gnu@4.44.1': optional: true - '@rollup/rollup-linux-powerpc64le-gnu@4.35.0': + '@rollup/rollup-linux-powerpc64le-gnu@4.44.1': optional: true - '@rollup/rollup-linux-riscv64-gnu@4.35.0': + '@rollup/rollup-linux-riscv64-gnu@4.44.1': optional: true - '@rollup/rollup-linux-s390x-gnu@4.35.0': + '@rollup/rollup-linux-riscv64-musl@4.44.1': optional: true - '@rollup/rollup-linux-x64-gnu@4.35.0': + '@rollup/rollup-linux-s390x-gnu@4.44.1': optional: true - '@rollup/rollup-linux-x64-musl@4.35.0': + '@rollup/rollup-linux-x64-gnu@4.44.1': optional: true - '@rollup/rollup-win32-arm64-msvc@4.35.0': + '@rollup/rollup-linux-x64-musl@4.44.1': optional: true - '@rollup/rollup-win32-ia32-msvc@4.35.0': + '@rollup/rollup-win32-arm64-msvc@4.44.1': optional: true - '@rollup/rollup-win32-x64-msvc@4.35.0': + '@rollup/rollup-win32-ia32-msvc@4.44.1': + optional: true + + '@rollup/rollup-win32-x64-msvc@4.44.1': optional: true '@sideway/address@4.1.5': @@ -3402,39 +3543,45 @@ snapshots: '@sideway/pinpoint@2.0.0': {} - '@sinclair/typebox@0.27.8': {} + '@sinclair/typebox@0.34.37': {} '@socket.io/component-emitter@3.1.2': {} - '@types/body-parser@1.19.5': + '@types/body-parser@1.19.6': dependencies: '@types/connect': 3.4.38 - '@types/node': 22.15.2 + '@types/node': 24.0.6 + + '@types/chai@5.2.2': + dependencies: + '@types/deep-eql': 4.0.2 '@types/connect@3.4.38': dependencies: - '@types/node': 22.15.2 + '@types/node': 24.0.6 - '@types/cors@2.8.17': + '@types/cors@2.8.19': dependencies: - '@types/node': 22.15.2 + '@types/node': 24.0.6 - '@types/estree@1.0.6': {} + '@types/deep-eql@4.0.2': {} + + '@types/estree@1.0.8': {} '@types/express-serve-static-core@5.0.6': dependencies: - '@types/node': 22.15.2 - '@types/qs': 6.9.18 + '@types/node': 24.0.6 + '@types/qs': 6.14.0 '@types/range-parser': 1.2.7 - '@types/send': 0.17.4 + '@types/send': 0.17.5 - '@types/express@5.0.1': + '@types/express@5.0.3': dependencies: - '@types/body-parser': 1.19.5 + '@types/body-parser': 1.19.6 '@types/express-serve-static-core': 5.0.6 - '@types/serve-static': 1.15.7 + '@types/serve-static': 1.15.8 - '@types/http-errors@2.0.4': {} + '@types/http-errors@2.0.5': {} '@types/istanbul-lib-coverage@2.0.6': {} @@ -3446,37 +3593,37 @@ snapshots: dependencies: '@types/istanbul-lib-report': 3.0.3 - '@types/jest@29.5.14': + '@types/jest@30.0.0': dependencies: - expect: 29.7.0 - pretty-format: 29.7.0 + expect: 30.0.3 + pretty-format: 30.0.2 '@types/json-schema@7.0.15': {} - '@types/lodash@4.17.16': {} + '@types/lodash@4.17.19': {} '@types/mime@1.3.5': {} '@types/node@17.0.45': {} - '@types/node@22.15.2': + '@types/node@24.0.6': dependencies: - undici-types: 6.21.0 + undici-types: 7.8.0 - '@types/qs@6.9.18': {} + '@types/qs@6.14.0': {} '@types/range-parser@1.2.7': {} - '@types/send@0.17.4': + '@types/send@0.17.5': dependencies: '@types/mime': 1.3.5 - '@types/node': 22.15.2 + '@types/node': 24.0.6 - '@types/serve-static@1.15.7': + '@types/serve-static@1.15.8': dependencies: - '@types/http-errors': 2.0.4 - '@types/node': 22.15.2 - '@types/send': 0.17.4 + '@types/http-errors': 2.0.5 + '@types/node': 24.0.6 + '@types/send': 0.17.5 '@types/stack-utils@2.0.3': {} @@ -3484,7 +3631,7 @@ snapshots: '@types/ws@8.18.1': dependencies: - '@types/node': 22.15.2 + '@types/node': 24.0.6 '@types/yargs-parser@21.0.3': {} @@ -3492,55 +3639,76 @@ snapshots: dependencies: '@types/yargs-parser': 21.0.3 - '@vitest/expect@3.1.2': + '@vitest/coverage-v8@3.2.4(vitest@3.2.4)': dependencies: - '@vitest/spy': 3.1.2 - '@vitest/utils': 3.1.2 + '@ampproject/remapping': 2.3.0 + '@bcoe/v8-coverage': 1.0.2 + ast-v8-to-istanbul: 0.3.3 + debug: 4.4.1 + istanbul-lib-coverage: 3.2.2 + istanbul-lib-report: 3.0.1 + istanbul-lib-source-maps: 5.0.6 + istanbul-reports: 3.1.7 + magic-string: 0.30.17 + magicast: 0.3.5 + std-env: 3.9.0 + test-exclude: 7.0.1 + tinyrainbow: 2.0.0 + vitest: 3.2.4(@types/node@24.0.6)(@vitest/ui@3.2.4)(jiti@2.4.2)(tsx@4.20.3)(yaml@2.8.0) + transitivePeerDependencies: + - supports-color + + '@vitest/expect@3.2.4': + dependencies: + '@types/chai': 5.2.2 + '@vitest/spy': 3.2.4 + '@vitest/utils': 3.2.4 chai: 5.2.0 tinyrainbow: 2.0.0 - '@vitest/mocker@3.1.2(vite@6.3.3(@types/node@22.15.2)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.7.1))': + '@vitest/mocker@3.2.4(vite@7.0.0(@types/node@24.0.6)(jiti@2.4.2)(tsx@4.20.3)(yaml@2.8.0))': dependencies: - '@vitest/spy': 3.1.2 + '@vitest/spy': 3.2.4 estree-walker: 3.0.3 magic-string: 0.30.17 optionalDependencies: - vite: 6.3.3(@types/node@22.15.2)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.7.1) + vite: 7.0.0(@types/node@24.0.6)(jiti@2.4.2)(tsx@4.20.3)(yaml@2.8.0) - '@vitest/pretty-format@3.1.2': + '@vitest/pretty-format@3.2.4': dependencies: tinyrainbow: 2.0.0 - '@vitest/runner@3.1.2': + '@vitest/runner@3.2.4': dependencies: - '@vitest/utils': 3.1.2 + '@vitest/utils': 3.2.4 pathe: 2.0.3 + strip-literal: 3.0.0 - '@vitest/snapshot@3.1.2': + '@vitest/snapshot@3.2.4': dependencies: - '@vitest/pretty-format': 3.1.2 + '@vitest/pretty-format': 3.2.4 magic-string: 0.30.17 pathe: 2.0.3 - '@vitest/spy@3.1.2': + '@vitest/spy@3.2.4': dependencies: - tinyspy: 3.0.2 + tinyspy: 4.0.3 - '@vitest/ui@3.1.2(vitest@3.1.2)': + '@vitest/ui@3.2.4(vitest@3.2.4)': dependencies: - '@vitest/utils': 3.1.2 + '@vitest/utils': 3.2.4 fflate: 0.8.2 flatted: 3.3.3 pathe: 2.0.3 sirv: 3.0.1 - tinyglobby: 0.2.13 + tinyglobby: 0.2.14 tinyrainbow: 2.0.0 - vitest: 3.1.2(@types/node@22.15.2)(@vitest/ui@3.1.2)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.7.1) + vitest: 3.2.4(@types/node@24.0.6)(@vitest/ui@3.2.4)(jiti@2.4.2)(tsx@4.20.3)(yaml@2.8.0) - '@vitest/utils@3.1.2': + '@vitest/utils@3.2.4': dependencies: - '@vitest/pretty-format': 3.1.2 - loupe: 3.1.3 + '@vitest/pretty-format': 3.2.4 + loupe: 3.1.4 tinyrainbow: 2.0.0 abort-controller@3.0.0: @@ -3557,7 +3725,7 @@ snapshots: mime-types: 3.0.1 negotiator: 1.0.0 - acorn@8.14.1: {} + acorn@8.15.0: {} ajv@8.17.1: dependencies: @@ -3605,6 +3773,12 @@ snapshots: assertion-error@2.0.1: {} + ast-v8-to-istanbul@0.3.3: + dependencies: + '@jridgewell/trace-mapping': 0.3.25 + estree-walker: 3.0.3 + js-tokens: 9.0.1 + astral-regex@2.0.0: {} async@3.2.6: {} @@ -3613,10 +3787,10 @@ snapshots: atomic-sleep@1.0.0: {} - axios@1.8.2(debug@4.4.0): + axios@1.10.0(debug@4.4.1): dependencies: - follow-redirects: 1.15.9(debug@4.4.0) - form-data: 4.0.2 + follow-redirects: 1.15.9(debug@4.4.1) + form-data: 4.0.3 proxy-from-env: 1.1.0 transitivePeerDependencies: - debug @@ -3654,7 +3828,7 @@ snapshots: dependencies: bytes: 3.1.2 content-type: 1.0.5 - debug: 4.4.0 + debug: 4.4.1 http-errors: 2.0.0 iconv-lite: 0.6.3 on-finished: 2.4.1 @@ -3664,12 +3838,12 @@ snapshots: transitivePeerDependencies: - supports-color - brace-expansion@1.1.11: + brace-expansion@1.1.12: dependencies: balanced-match: 1.0.2 concat-map: 0.0.1 - brace-expansion@2.0.1: + brace-expansion@2.0.2: dependencies: balanced-match: 1.0.2 @@ -3687,14 +3861,18 @@ snapshots: base64-js: 1.5.1 ieee754: 1.2.1 - bundle-require@5.1.0(esbuild@0.25.1): + bundle-name@4.1.0: dependencies: - esbuild: 0.25.1 + run-applescript: 7.0.0 + + bundle-require@5.1.0(esbuild@0.25.5): + dependencies: + esbuild: 0.25.5 load-tsconfig: 0.2.5 bytes@3.1.2: {} - c12@2.0.1: + c12@2.0.1(magicast@0.3.5): dependencies: chokidar: 4.0.3 confbox: 0.1.8 @@ -3708,6 +3886,8 @@ snapshots: perfect-debounce: 1.0.0 pkg-types: 1.3.1 rc9: 2.1.2 + optionalDependencies: + magicast: 0.3.5 c8@10.1.3: dependencies: @@ -3749,8 +3929,8 @@ snapshots: assertion-error: 2.0.1 check-error: 2.1.1 deep-eql: 5.0.2 - loupe: 3.1.3 - pathval: 2.0.0 + loupe: 3.1.4 + pathval: 2.0.1 chalk@2.4.2: dependencies: @@ -3796,11 +3976,11 @@ snapshots: chownr@2.0.0: {} - ci-info@3.9.0: {} + ci-info@4.2.0: {} citty@0.1.6: dependencies: - consola: 3.4.0 + consola: 3.4.2 cleye@1.3.4: dependencies: @@ -3846,6 +4026,8 @@ snapshots: color-name@1.1.4: {} + color-support@1.1.3: {} + colorette@2.0.20: {} combined-stream@1.0.8: @@ -3864,7 +4046,7 @@ snapshots: confbox@0.1.8: {} - consola@3.4.0: {} + consola@3.4.2: {} constant-case@2.0.0: dependencies: @@ -3913,16 +4095,25 @@ snapshots: dependencies: ms: 2.1.3 - debug@4.4.0: + debug@4.4.1: dependencies: ms: 2.1.3 deep-eql@5.0.2: {} + default-browser-id@5.0.0: {} + + default-browser@5.2.1: + dependencies: + bundle-name: 4.1.0 + default-browser-id: 5.0.0 + defaults@1.0.4: dependencies: clone: 1.0.4 + define-lazy-prop@3.0.0: {} + defu@6.1.4: {} degit@2.8.4: {} @@ -3931,7 +4122,7 @@ snapshots: depd@2.0.0: {} - destr@2.0.3: {} + destr@2.0.5: {} destroy@1.2.0: {} @@ -3939,8 +4130,6 @@ snapshots: detect-newline@4.0.1: {} - diff-sequences@29.6.3: {} - diff@7.0.0: {} doctrine@3.0.0: @@ -3953,6 +4142,8 @@ snapshots: dotenv@16.5.0: {} + dotenv@17.0.0: {} + dunder-proto@1.0.1: dependencies: call-bind-apply-helpers: 1.0.2 @@ -3975,7 +4166,7 @@ snapshots: encodeurl@2.0.0: {} - end-of-stream@1.4.4: + end-of-stream@1.4.5: dependencies: once: 1.4.0 @@ -3983,8 +4174,8 @@ snapshots: engine.io@6.6.4: dependencies: - '@types/cors': 2.8.17 - '@types/node': 22.15.2 + '@types/cors': 2.8.19 + '@types/node': 24.0.6 accepts: 1.3.8 base64id: 2.0.0 cookie: 0.7.2 @@ -4006,7 +4197,7 @@ snapshots: es-errors@1.3.0: {} - es-module-lexer@1.6.0: {} + es-module-lexer@1.7.0: {} es-object-atoms@1.1.1: dependencies: @@ -4057,33 +4248,33 @@ snapshots: es6-iterator: 0.1.3 es6-symbol: 2.0.1 - esbuild@0.25.1: + esbuild@0.25.5: optionalDependencies: - '@esbuild/aix-ppc64': 0.25.1 - '@esbuild/android-arm': 0.25.1 - '@esbuild/android-arm64': 0.25.1 - '@esbuild/android-x64': 0.25.1 - '@esbuild/darwin-arm64': 0.25.1 - '@esbuild/darwin-x64': 0.25.1 - '@esbuild/freebsd-arm64': 0.25.1 - '@esbuild/freebsd-x64': 0.25.1 - '@esbuild/linux-arm': 0.25.1 - '@esbuild/linux-arm64': 0.25.1 - '@esbuild/linux-ia32': 0.25.1 - '@esbuild/linux-loong64': 0.25.1 - '@esbuild/linux-mips64el': 0.25.1 - '@esbuild/linux-ppc64': 0.25.1 - '@esbuild/linux-riscv64': 0.25.1 - '@esbuild/linux-s390x': 0.25.1 - '@esbuild/linux-x64': 0.25.1 - '@esbuild/netbsd-arm64': 0.25.1 - '@esbuild/netbsd-x64': 0.25.1 - '@esbuild/openbsd-arm64': 0.25.1 - '@esbuild/openbsd-x64': 0.25.1 - '@esbuild/sunos-x64': 0.25.1 - '@esbuild/win32-arm64': 0.25.1 - '@esbuild/win32-ia32': 0.25.1 - '@esbuild/win32-x64': 0.25.1 + '@esbuild/aix-ppc64': 0.25.5 + '@esbuild/android-arm': 0.25.5 + '@esbuild/android-arm64': 0.25.5 + '@esbuild/android-x64': 0.25.5 + '@esbuild/darwin-arm64': 0.25.5 + '@esbuild/darwin-x64': 0.25.5 + '@esbuild/freebsd-arm64': 0.25.5 + '@esbuild/freebsd-x64': 0.25.5 + '@esbuild/linux-arm': 0.25.5 + '@esbuild/linux-arm64': 0.25.5 + '@esbuild/linux-ia32': 0.25.5 + '@esbuild/linux-loong64': 0.25.5 + '@esbuild/linux-mips64el': 0.25.5 + '@esbuild/linux-ppc64': 0.25.5 + '@esbuild/linux-riscv64': 0.25.5 + '@esbuild/linux-s390x': 0.25.5 + '@esbuild/linux-x64': 0.25.5 + '@esbuild/netbsd-arm64': 0.25.5 + '@esbuild/netbsd-x64': 0.25.5 + '@esbuild/openbsd-arm64': 0.25.5 + '@esbuild/openbsd-x64': 0.25.5 + '@esbuild/sunos-x64': 0.25.5 + '@esbuild/win32-arm64': 0.25.5 + '@esbuild/win32-ia32': 0.25.5 + '@esbuild/win32-x64': 0.25.5 escalade@3.2.0: {} @@ -4104,7 +4295,7 @@ snapshots: estree-walker@3.0.3: dependencies: - '@types/estree': 1.0.6 + '@types/estree': 1.0.8 esutils@2.0.3: {} @@ -4135,13 +4326,14 @@ snapshots: expect-type@1.2.1: {} - expect@29.7.0: + expect@30.0.3: dependencies: - '@jest/expect-utils': 29.7.0 - jest-get-type: 29.6.3 - jest-matcher-utils: 29.7.0 - jest-message-util: 29.7.0 - jest-util: 29.7.0 + '@jest/expect-utils': 30.0.3 + '@jest/get-type': 30.0.1 + jest-matcher-utils: 30.0.3 + jest-message-util: 30.0.2 + jest-mock: 30.0.2 + jest-util: 30.0.2 express@5.1.0: dependencies: @@ -4151,7 +4343,7 @@ snapshots: content-type: 1.0.5 cookie: 0.7.2 cookie-signature: 1.2.2 - debug: 4.4.0 + debug: 4.4.1 encodeurl: 2.0.0 escape-html: 1.0.3 etag: 1.8.1 @@ -4169,7 +4361,7 @@ snapshots: router: 2.2.0 send: 1.2.0 serve-static: 2.2.0 - statuses: 2.0.1 + statuses: 2.0.2 type-is: 2.0.1 vary: 1.1.2 transitivePeerDependencies: @@ -4195,13 +4387,9 @@ snapshots: fast-uri@3.0.6: {} - fastest-validator@1.19.0: {} - - fdir@6.4.3(picomatch@4.0.2): - optionalDependencies: - picomatch: 4.0.2 + fastest-validator@1.19.1: {} - fdir@6.4.4(picomatch@4.0.2): + fdir@6.4.6(picomatch@4.0.2): optionalDependencies: picomatch: 4.0.2 @@ -4217,12 +4405,12 @@ snapshots: finalhandler@2.1.0: dependencies: - debug: 4.4.0 + debug: 4.4.1 encodeurl: 2.0.0 escape-html: 1.0.3 on-finished: 2.4.1 parseurl: 1.3.3 - statuses: 2.0.1 + statuses: 2.0.2 transitivePeerDependencies: - supports-color @@ -4231,22 +4419,29 @@ snapshots: locate-path: 6.0.0 path-exists: 4.0.0 + fix-dts-default-cjs-exports@1.0.1: + dependencies: + magic-string: 0.30.17 + mlly: 1.7.4 + rollup: 4.44.1 + flatted@3.3.3: {} - follow-redirects@1.15.9(debug@4.4.0): + follow-redirects@1.15.9(debug@4.4.1): optionalDependencies: - debug: 4.4.0 + debug: 4.4.1 foreground-child@3.3.1: dependencies: cross-spawn: 7.0.6 signal-exit: 4.1.0 - form-data@4.0.2: + form-data@4.0.3: dependencies: asynckit: 0.4.0 combined-stream: 1.0.8 es-set-tostringtag: 2.1.0 + hasown: 2.0.2 mime-types: 2.1.35 forwarded@0.2.0: {} @@ -4296,25 +4491,23 @@ snapshots: dunder-proto: 1.0.1 es-object-atoms: 1.1.1 - get-stdin@9.0.0: {} - get-stream@6.0.1: {} - get-tsconfig@4.10.0: + get-tsconfig@4.10.1: dependencies: resolve-pkg-maps: 1.0.0 giget@1.2.5: dependencies: citty: 0.1.6 - consola: 3.4.0 + consola: 3.4.2 defu: 6.1.4 node-fetch-native: 1.6.6 nypm: 0.5.4 pathe: 2.0.3 tar: 6.2.1 - git-hooks-list@3.2.0: {} + git-hooks-list@4.1.1: {} glob@10.4.5: dependencies: @@ -4347,11 +4540,11 @@ snapshots: graceful-fs@4.2.11: {} - graphql-ws@6.0.4(graphql@16.11.0)(ws@8.18.1): + graphql-ws@6.0.5(graphql@16.11.0)(ws@8.18.2): dependencies: graphql: 16.11.0 optionalDependencies: - ws: 8.18.1 + ws: 8.18.2 graphql@16.11.0: {} @@ -4404,7 +4597,7 @@ snapshots: '@types/node': 17.0.45 chalk: 4.1.2 change-case: 3.1.0 - debug: 4.4.0 + debug: 4.4.1 degit: 2.8.4 ejs: 3.1.10 enquirer: 2.4.1 @@ -4441,24 +4634,30 @@ snapshots: inherits@2.0.4: {} - inquirer@12.4.3(@types/node@22.15.2): + inquirer@12.6.3(@types/node@24.0.6): dependencies: - '@inquirer/core': 10.1.8(@types/node@22.15.2) - '@inquirer/prompts': 7.3.3(@types/node@22.15.2) - '@inquirer/type': 3.0.5(@types/node@22.15.2) + '@inquirer/core': 10.1.13(@types/node@24.0.6) + '@inquirer/prompts': 7.5.3(@types/node@24.0.6) + '@inquirer/type': 3.0.7(@types/node@24.0.6) ansi-escapes: 4.3.2 mute-stream: 2.0.0 run-async: 3.0.0 rxjs: 7.8.2 optionalDependencies: - '@types/node': 22.15.2 + '@types/node': 24.0.6 ipaddr.js@1.9.1: {} ipaddr.js@2.2.0: {} + is-docker@3.0.0: {} + is-fullwidth-code-point@3.0.0: {} + is-inside-container@1.0.0: + dependencies: + is-docker: 3.0.0 + is-interactive@1.0.0: {} is-lower-case@1.1.3: @@ -4479,6 +4678,10 @@ snapshots: dependencies: upper-case: 1.1.3 + is-wsl@3.1.0: + dependencies: + is-inside-container: 1.0.0 + isexe@2.0.0: {} isexe@3.1.1: {} @@ -4493,6 +4696,14 @@ snapshots: make-dir: 4.0.0 supports-color: 7.2.0 + istanbul-lib-source-maps@5.0.6: + dependencies: + '@jridgewell/trace-mapping': 0.3.25 + debug: 4.4.1 + istanbul-lib-coverage: 3.2.2 + transitivePeerDependencies: + - supports-color + istanbul-reports@3.1.7: dependencies: html-escaper: 2.0.2 @@ -4511,42 +4722,48 @@ snapshots: filelist: 1.0.4 minimatch: 3.1.2 - jest-diff@29.7.0: + jest-diff@30.0.3: dependencies: + '@jest/diff-sequences': 30.0.1 + '@jest/get-type': 30.0.1 chalk: 4.1.2 - diff-sequences: 29.6.3 - jest-get-type: 29.6.3 - pretty-format: 29.7.0 - - jest-get-type@29.6.3: {} + pretty-format: 30.0.2 - jest-matcher-utils@29.7.0: + jest-matcher-utils@30.0.3: dependencies: + '@jest/get-type': 30.0.1 chalk: 4.1.2 - jest-diff: 29.7.0 - jest-get-type: 29.6.3 - pretty-format: 29.7.0 + jest-diff: 30.0.3 + pretty-format: 30.0.2 - jest-message-util@29.7.0: + jest-message-util@30.0.2: dependencies: - '@babel/code-frame': 7.26.2 - '@jest/types': 29.6.3 + '@babel/code-frame': 7.27.1 + '@jest/types': 30.0.1 '@types/stack-utils': 2.0.3 chalk: 4.1.2 graceful-fs: 4.2.11 micromatch: 4.0.8 - pretty-format: 29.7.0 + pretty-format: 30.0.2 slash: 3.0.0 stack-utils: 2.0.6 - jest-util@29.7.0: + jest-mock@30.0.2: dependencies: - '@jest/types': 29.6.3 - '@types/node': 22.15.2 + '@jest/types': 30.0.1 + '@types/node': 24.0.6 + jest-util: 30.0.2 + + jest-regex-util@30.0.1: {} + + jest-util@30.0.2: + dependencies: + '@jest/types': 30.0.1 + '@types/node': 24.0.6 chalk: 4.1.2 - ci-info: 3.9.0 + ci-info: 4.2.0 graceful-fs: 4.2.11 - picomatch: 2.3.1 + picomatch: 4.0.2 jiti@2.4.2: {} @@ -4562,6 +4779,8 @@ snapshots: js-tokens@4.0.0: {} + js-tokens@9.0.1: {} + js-yaml@3.14.1: dependencies: argparse: 1.0.10 @@ -4614,7 +4833,7 @@ snapshots: chalk: 4.1.2 is-unicode-supported: 0.1.0 - loupe@3.1.3: {} + loupe@3.1.4: {} lower-case-first@1.0.2: dependencies: @@ -4636,9 +4855,15 @@ snapshots: dependencies: '@jridgewell/sourcemap-codec': 1.5.0 + magicast@0.3.5: + dependencies: + '@babel/parser': 7.28.0 + '@babel/types': 7.28.0 + source-map-js: 1.2.1 + make-dir@4.0.0: dependencies: - semver: 7.7.1 + semver: 7.7.2 math-intrinsics@1.1.0: {} @@ -4685,15 +4910,15 @@ snapshots: minimatch@3.1.2: dependencies: - brace-expansion: 1.1.11 + brace-expansion: 1.1.12 minimatch@5.1.6: dependencies: - brace-expansion: 2.0.1 + brace-expansion: 2.0.2 minimatch@9.0.5: dependencies: - brace-expansion: 2.0.1 + brace-expansion: 2.0.2 minimist@1.2.8: {} @@ -4714,16 +4939,16 @@ snapshots: mlly@1.7.4: dependencies: - acorn: 8.14.1 + acorn: 8.15.0 pathe: 2.0.3 pkg-types: 1.3.1 - ufo: 1.5.4 + ufo: 1.6.1 - moleculer-connect@0.2.2(debug@4.4.0)(moleculer-repl@0.7.4): + moleculer-connect@0.2.2(debug@4.4.1)(moleculer-repl@0.7.4): dependencies: glob: 10.4.5 lodash: 4.17.21 - moleculer: 0.14.35(debug@4.4.0)(nats@2.29.3)(pino@8.21.0) + moleculer: 0.14.35(debug@4.4.1)(nats@2.29.3)(pino@8.21.0) moleculer-repl: 0.7.4 nats: 2.29.3 pino: 8.21.0 @@ -4752,11 +4977,11 @@ snapshots: - thrift - winston - moleculer-io@2.2.0(moleculer@0.14.35(debug@4.4.0)(nats@2.29.3)(pino@9.6.0)): + moleculer-io@2.2.0(moleculer@0.14.35(debug@4.4.1)(nats@2.29.3)(pino@9.7.0)): dependencies: kleur: 4.1.5 lodash: 4.17.21 - moleculer: 0.14.35(debug@4.4.0)(nats@2.29.3)(pino@9.6.0) + moleculer: 0.14.35(debug@4.4.1)(nats@2.29.3)(pino@9.7.0) socket.io: 4.8.1 transitivePeerDependencies: - bufferutil @@ -4777,7 +5002,7 @@ snapshots: tiny-human-time: 1.2.0 yargs-parser: 21.1.1 - moleculer-web@0.10.8(moleculer@0.14.35(debug@4.4.0)(nats@2.29.3)(pino@9.6.0)): + moleculer-web@0.10.8(moleculer@0.14.35(debug@4.4.1)(nats@2.29.3)(pino@9.7.0)): dependencies: '@fastify/busboy': 1.2.1 body-parser: 1.20.3 @@ -4787,23 +5012,23 @@ snapshots: isstream: 0.1.2 kleur: 4.1.5 lodash: 4.17.21 - moleculer: 0.14.35(debug@4.4.0)(nats@2.29.3)(pino@9.6.0) + moleculer: 0.14.35(debug@4.4.1)(nats@2.29.3)(pino@9.7.0) path-to-regexp: 3.3.0 qs: 6.14.0 serve-static: 1.16.2 transitivePeerDependencies: - supports-color - moleculer-zod-validator@3.3.1(moleculer@0.14.35(debug@4.4.0)(nats@2.29.3)(pino@9.6.0))(zod@3.24.3): + moleculer-zod-validator@3.3.1(moleculer@0.14.35(debug@4.4.1)(nats@2.29.3)(pino@9.7.0))(zod@3.25.67): dependencies: - moleculer: 0.14.35(debug@4.4.0)(nats@2.29.3)(pino@9.6.0) - zod: 3.24.3 + moleculer: 0.14.35(debug@4.4.1)(nats@2.29.3)(pino@9.7.0) + zod: 3.25.67 - moleculer@0.14.35(debug@4.4.0)(nats@2.29.3)(pino@8.21.0): + moleculer@0.14.35(debug@4.4.1)(nats@2.29.3)(pino@8.21.0): dependencies: args: 5.0.3 eventemitter2: 6.4.9 - fastest-validator: 1.19.0 + fastest-validator: 1.19.1 glob: 7.2.3 ipaddr.js: 2.2.0 kleur: 4.1.5 @@ -4812,17 +5037,17 @@ snapshots: node-fetch: 2.7.0 recursive-watch: 1.1.4 optionalDependencies: - debug: 4.4.0 + debug: 4.4.1 nats: 2.29.3 pino: 8.21.0 transitivePeerDependencies: - encoding - moleculer@0.14.35(debug@4.4.0)(nats@2.29.3)(pino@9.6.0): + moleculer@0.14.35(debug@4.4.1)(nats@2.29.3)(pino@9.7.0): dependencies: args: 5.0.3 eventemitter2: 6.4.9 - fastest-validator: 1.19.0 + fastest-validator: 1.19.1 glob: 7.2.3 ipaddr.js: 2.2.0 kleur: 4.1.5 @@ -4831,9 +5056,9 @@ snapshots: node-fetch: 2.7.0 recursive-watch: 1.1.4 optionalDependencies: - debug: 4.4.0 + debug: 4.4.1 nats: 2.29.3 - pino: 9.6.0 + pino: 9.7.0 transitivePeerDependencies: - encoding @@ -4853,7 +5078,7 @@ snapshots: object-assign: 4.1.1 thenify-all: 1.6.0 - nanoid@3.3.9: {} + nanoid@3.3.11: {} nats@2.29.3: dependencies: @@ -4885,15 +5110,15 @@ snapshots: npm-normalize-package-bin@4.0.0: {} - npm-run-all2@7.0.2: + npm-run-all2@8.0.4: dependencies: ansi-styles: 6.2.1 cross-spawn: 7.0.6 memorystream: 0.3.1 - minimatch: 9.0.5 + picomatch: 4.0.2 pidtree: 0.6.0 read-package-json-fast: 4.0.0 - shell-quote: 1.8.2 + shell-quote: 1.8.3 which: 5.0.0 npm-run-path@4.0.1: @@ -4903,11 +5128,11 @@ snapshots: nypm@0.5.4: dependencies: citty: 0.1.6 - consola: 3.4.0 + consola: 3.4.2 pathe: 2.0.3 pkg-types: 1.3.1 tinyexec: 0.3.2 - ufo: 1.5.4 + ufo: 1.6.1 object-assign@4.1.1: {} @@ -4929,11 +5154,18 @@ snapshots: dependencies: mimic-fn: 2.1.0 + open@10.1.2: + dependencies: + default-browser: 5.2.1 + define-lazy-prop: 3.0.0 + is-inside-container: 1.0.0 + is-wsl: 3.1.0 + openapi-types@12.1.3: {} - openapi3-ts@4.4.0: + openapi3-ts@4.5.0: dependencies: - yaml: 2.7.1 + yaml: 2.8.0 ora@5.4.1: dependencies: @@ -4993,7 +5225,7 @@ snapshots: pathe@2.0.3: {} - pathval@2.0.0: {} + pathval@2.0.1: {} perfect-debounce@1.0.0: {} @@ -5025,7 +5257,7 @@ snapshots: minimist: 1.2.8 on-exit-leak-free: 2.1.2 pino-abstract-transport: 2.0.0 - pump: 3.0.2 + pump: 3.0.3 secure-json-parse: 2.7.0 sonic-boom: 4.2.0 strip-json-comments: 3.1.1 @@ -5048,21 +5280,21 @@ snapshots: sonic-boom: 3.8.1 thread-stream: 2.7.0 - pino@9.6.0: + pino@9.7.0: dependencies: atomic-sleep: 1.0.0 fast-redact: 3.5.0 on-exit-leak-free: 2.1.2 pino-abstract-transport: 2.0.0 pino-std-serializers: 7.0.0 - process-warning: 4.0.1 + process-warning: 5.0.0 quick-format-unescaped: 4.0.4 real-require: 0.2.0 safe-stable-stringify: 2.5.0 sonic-boom: 4.2.0 thread-stream: 3.1.0 - pirates@4.0.6: {} + pirates@4.0.7: {} pkg-types@1.3.1: dependencies: @@ -5070,32 +5302,32 @@ snapshots: mlly: 1.7.4 pathe: 2.0.3 - postcss-load-config@6.0.1(jiti@2.4.2)(postcss@8.5.3)(tsx@4.19.3)(yaml@2.7.1): + postcss-load-config@6.0.1(jiti@2.4.2)(postcss@8.5.6)(tsx@4.20.3)(yaml@2.8.0): dependencies: lilconfig: 3.1.3 optionalDependencies: jiti: 2.4.2 - postcss: 8.5.3 - tsx: 4.19.3 - yaml: 2.7.1 + postcss: 8.5.6 + tsx: 4.20.3 + yaml: 2.8.0 - postcss@8.5.3: + postcss@8.5.6: dependencies: - nanoid: 3.3.9 + nanoid: 3.3.11 picocolors: 1.1.1 source-map-js: 1.2.1 pretty-bytes@5.6.0: {} - pretty-format@29.7.0: + pretty-format@30.0.2: dependencies: - '@jest/schemas': 29.6.3 + '@jest/schemas': 30.0.1 ansi-styles: 5.2.0 react-is: 18.3.1 process-warning@3.0.0: {} - process-warning@4.0.1: {} + process-warning@5.0.0: {} process@0.11.10: {} @@ -5106,9 +5338,9 @@ snapshots: proxy-from-env@1.1.0: {} - pump@3.0.2: + pump@3.0.3: dependencies: - end-of-stream: 1.4.4 + end-of-stream: 1.4.5 once: 1.4.0 punycode@2.3.1: {} @@ -5142,7 +5374,7 @@ snapshots: rc9@2.1.2: dependencies: defu: 6.1.4 - destr: 2.0.3 + destr: 2.0.5 react-is@18.3.1: {} @@ -5190,34 +5422,35 @@ snapshots: dependencies: glob: 10.4.5 - rollup@4.35.0: + rollup@4.44.1: dependencies: - '@types/estree': 1.0.6 + '@types/estree': 1.0.8 optionalDependencies: - '@rollup/rollup-android-arm-eabi': 4.35.0 - '@rollup/rollup-android-arm64': 4.35.0 - '@rollup/rollup-darwin-arm64': 4.35.0 - '@rollup/rollup-darwin-x64': 4.35.0 - '@rollup/rollup-freebsd-arm64': 4.35.0 - '@rollup/rollup-freebsd-x64': 4.35.0 - '@rollup/rollup-linux-arm-gnueabihf': 4.35.0 - '@rollup/rollup-linux-arm-musleabihf': 4.35.0 - '@rollup/rollup-linux-arm64-gnu': 4.35.0 - '@rollup/rollup-linux-arm64-musl': 4.35.0 - '@rollup/rollup-linux-loongarch64-gnu': 4.35.0 - '@rollup/rollup-linux-powerpc64le-gnu': 4.35.0 - '@rollup/rollup-linux-riscv64-gnu': 4.35.0 - '@rollup/rollup-linux-s390x-gnu': 4.35.0 - '@rollup/rollup-linux-x64-gnu': 4.35.0 - '@rollup/rollup-linux-x64-musl': 4.35.0 - '@rollup/rollup-win32-arm64-msvc': 4.35.0 - '@rollup/rollup-win32-ia32-msvc': 4.35.0 - '@rollup/rollup-win32-x64-msvc': 4.35.0 + '@rollup/rollup-android-arm-eabi': 4.44.1 + '@rollup/rollup-android-arm64': 4.44.1 + '@rollup/rollup-darwin-arm64': 4.44.1 + '@rollup/rollup-darwin-x64': 4.44.1 + '@rollup/rollup-freebsd-arm64': 4.44.1 + '@rollup/rollup-freebsd-x64': 4.44.1 + '@rollup/rollup-linux-arm-gnueabihf': 4.44.1 + '@rollup/rollup-linux-arm-musleabihf': 4.44.1 + '@rollup/rollup-linux-arm64-gnu': 4.44.1 + '@rollup/rollup-linux-arm64-musl': 4.44.1 + '@rollup/rollup-linux-loongarch64-gnu': 4.44.1 + '@rollup/rollup-linux-powerpc64le-gnu': 4.44.1 + '@rollup/rollup-linux-riscv64-gnu': 4.44.1 + '@rollup/rollup-linux-riscv64-musl': 4.44.1 + '@rollup/rollup-linux-s390x-gnu': 4.44.1 + '@rollup/rollup-linux-x64-gnu': 4.44.1 + '@rollup/rollup-linux-x64-musl': 4.44.1 + '@rollup/rollup-win32-arm64-msvc': 4.44.1 + '@rollup/rollup-win32-ia32-msvc': 4.44.1 + '@rollup/rollup-win32-x64-msvc': 4.44.1 fsevents: 2.3.3 router@2.2.0: dependencies: - debug: 4.4.0 + debug: 4.4.1 depd: 2.0.0 is-promise: 4.0.0 parseurl: 1.3.3 @@ -5225,6 +5458,8 @@ snapshots: transitivePeerDependencies: - supports-color + run-applescript@7.0.0: {} + run-async@3.0.0: {} rxjs@7.8.2: @@ -5239,7 +5474,7 @@ snapshots: secure-json-parse@2.7.0: {} - semver@7.7.1: {} + semver@7.7.2: {} send@0.19.0: dependencies: @@ -5261,7 +5496,7 @@ snapshots: send@1.2.0: dependencies: - debug: 4.4.0 + debug: 4.4.1 encodeurl: 2.0.0 escape-html: 1.0.3 etag: 1.8.1 @@ -5271,7 +5506,7 @@ snapshots: ms: 2.1.3 on-finished: 2.4.1 range-parser: 1.2.1 - statuses: 2.0.1 + statuses: 2.0.2 transitivePeerDependencies: - supports-color @@ -5306,7 +5541,7 @@ snapshots: shebang-regex@3.0.0: {} - shell-quote@1.8.2: {} + shell-quote@1.8.3: {} side-channel-list@1.0.0: dependencies: @@ -5344,7 +5579,7 @@ snapshots: sirv@3.0.1: dependencies: - '@polka/url': 1.0.0-next.28 + '@polka/url': 1.0.0-next.29 mrmime: 2.0.1 totalist: 3.0.1 @@ -5400,16 +5635,15 @@ snapshots: sort-object-keys@1.1.3: {} - sort-package-json@3.0.0: + sort-package-json@3.3.1: dependencies: detect-indent: 7.0.1 detect-newline: 4.0.1 - get-stdin: 9.0.0 - git-hooks-list: 3.2.0 + git-hooks-list: 4.1.1 is-plain-obj: 4.1.0 - semver: 7.7.1 + semver: 7.7.2 sort-object-keys: 1.1.3 - tinyglobby: 0.2.12 + tinyglobby: 0.2.14 source-map-js@1.2.1: {} @@ -5431,6 +5665,8 @@ snapshots: statuses@2.0.1: {} + statuses@2.0.2: {} + std-env@3.9.0: {} string-argv@0.3.2: {} @@ -5463,6 +5699,10 @@ snapshots: strip-json-comments@3.1.1: {} + strip-literal@3.0.0: + dependencies: + js-tokens: 9.0.1 + sucrase@3.35.0: dependencies: '@jridgewell/gen-mapping': 0.3.8 @@ -5470,7 +5710,7 @@ snapshots: glob: 10.4.5 lines-and-columns: 1.2.4 mz: 2.7.0 - pirates: 4.0.6 + pirates: 4.0.7 ts-interface-checker: 0.1.13 supports-color@5.5.0: @@ -5557,21 +5797,16 @@ snapshots: tinyexec@0.3.2: {} - tinyglobby@0.2.12: + tinyglobby@0.2.14: dependencies: - fdir: 6.4.3(picomatch@4.0.2) + fdir: 6.4.6(picomatch@4.0.2) picomatch: 4.0.2 - tinyglobby@0.2.13: - dependencies: - fdir: 6.4.4(picomatch@4.0.2) - picomatch: 4.0.2 - - tinypool@1.0.2: {} + tinypool@1.1.1: {} tinyrainbow@2.0.0: {} - tinyspy@3.0.2: {} + tinyspy@4.0.3: {} title-case@2.1.1: dependencies: @@ -5602,26 +5837,27 @@ snapshots: tslib@2.8.1: {} - tsup@8.4.0(jiti@2.4.2)(postcss@8.5.3)(tsx@4.19.3)(typescript@5.8.3)(yaml@2.7.1): + tsup@8.5.0(jiti@2.4.2)(postcss@8.5.6)(tsx@4.20.3)(typescript@5.8.3)(yaml@2.8.0): dependencies: - bundle-require: 5.1.0(esbuild@0.25.1) + bundle-require: 5.1.0(esbuild@0.25.5) cac: 6.7.14 chokidar: 4.0.3 - consola: 3.4.0 - debug: 4.4.0 - esbuild: 0.25.1 + consola: 3.4.2 + debug: 4.4.1 + esbuild: 0.25.5 + fix-dts-default-cjs-exports: 1.0.1 joycon: 3.1.1 picocolors: 1.1.1 - postcss-load-config: 6.0.1(jiti@2.4.2)(postcss@8.5.3)(tsx@4.19.3)(yaml@2.7.1) + postcss-load-config: 6.0.1(jiti@2.4.2)(postcss@8.5.6)(tsx@4.20.3)(yaml@2.8.0) resolve-from: 5.0.0 - rollup: 4.35.0 + rollup: 4.44.1 source-map: 0.8.0-beta.0 sucrase: 3.35.0 tinyexec: 0.3.2 - tinyglobby: 0.2.12 + tinyglobby: 0.2.14 tree-kill: 1.2.2 optionalDependencies: - postcss: 8.5.3 + postcss: 8.5.6 typescript: 5.8.3 transitivePeerDependencies: - jiti @@ -5629,10 +5865,10 @@ snapshots: - tsx - yaml - tsx@4.19.3: + tsx@4.20.3: dependencies: - esbuild: 0.25.1 - get-tsconfig: 4.10.0 + esbuild: 0.25.5 + get-tsconfig: 4.10.1 optionalDependencies: fsevents: 2.3.3 @@ -5659,12 +5895,12 @@ snapshots: typescript@5.8.3: {} - ufo@1.5.4: {} + ufo@1.6.1: {} uglify-js@3.19.3: optional: true - undici-types@6.21.0: {} + undici-types@7.8.0: {} universalify@2.0.1: {} @@ -5684,17 +5920,17 @@ snapshots: '@types/istanbul-lib-coverage': 2.0.6 convert-source-map: 2.0.0 - validator@13.12.0: {} + validator@13.15.15: {} vary@1.1.2: {} - vite-node@3.1.2(@types/node@22.15.2)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.7.1): + vite-node@3.2.4(@types/node@24.0.6)(jiti@2.4.2)(tsx@4.20.3)(yaml@2.8.0): dependencies: cac: 6.7.14 - debug: 4.4.0 - es-module-lexer: 1.6.0 + debug: 4.4.1 + es-module-lexer: 1.7.0 pathe: 2.0.3 - vite: 6.3.3(@types/node@22.15.2)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.7.1) + vite: 7.0.0(@types/node@24.0.6)(jiti@2.4.2)(tsx@4.20.3)(yaml@2.8.0) transitivePeerDependencies: - '@types/node' - jiti @@ -5709,47 +5945,49 @@ snapshots: - tsx - yaml - vite@6.3.3(@types/node@22.15.2)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.7.1): + vite@7.0.0(@types/node@24.0.6)(jiti@2.4.2)(tsx@4.20.3)(yaml@2.8.0): dependencies: - esbuild: 0.25.1 - fdir: 6.4.4(picomatch@4.0.2) + esbuild: 0.25.5 + fdir: 6.4.6(picomatch@4.0.2) picomatch: 4.0.2 - postcss: 8.5.3 - rollup: 4.35.0 - tinyglobby: 0.2.13 + postcss: 8.5.6 + rollup: 4.44.1 + tinyglobby: 0.2.14 optionalDependencies: - '@types/node': 22.15.2 + '@types/node': 24.0.6 fsevents: 2.3.3 jiti: 2.4.2 - tsx: 4.19.3 - yaml: 2.7.1 - - vitest@3.1.2(@types/node@22.15.2)(@vitest/ui@3.1.2)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.7.1): - dependencies: - '@vitest/expect': 3.1.2 - '@vitest/mocker': 3.1.2(vite@6.3.3(@types/node@22.15.2)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.7.1)) - '@vitest/pretty-format': 3.1.2 - '@vitest/runner': 3.1.2 - '@vitest/snapshot': 3.1.2 - '@vitest/spy': 3.1.2 - '@vitest/utils': 3.1.2 + tsx: 4.20.3 + yaml: 2.8.0 + + vitest@3.2.4(@types/node@24.0.6)(@vitest/ui@3.2.4)(jiti@2.4.2)(tsx@4.20.3)(yaml@2.8.0): + dependencies: + '@types/chai': 5.2.2 + '@vitest/expect': 3.2.4 + '@vitest/mocker': 3.2.4(vite@7.0.0(@types/node@24.0.6)(jiti@2.4.2)(tsx@4.20.3)(yaml@2.8.0)) + '@vitest/pretty-format': 3.2.4 + '@vitest/runner': 3.2.4 + '@vitest/snapshot': 3.2.4 + '@vitest/spy': 3.2.4 + '@vitest/utils': 3.2.4 chai: 5.2.0 - debug: 4.4.0 + debug: 4.4.1 expect-type: 1.2.1 magic-string: 0.30.17 pathe: 2.0.3 + picomatch: 4.0.2 std-env: 3.9.0 tinybench: 2.9.0 tinyexec: 0.3.2 - tinyglobby: 0.2.13 - tinypool: 1.0.2 + tinyglobby: 0.2.14 + tinypool: 1.1.1 tinyrainbow: 2.0.0 - vite: 6.3.3(@types/node@22.15.2)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.7.1) - vite-node: 3.1.2(@types/node@22.15.2)(jiti@2.4.2)(tsx@4.19.3)(yaml@2.7.1) + vite: 7.0.0(@types/node@24.0.6)(jiti@2.4.2)(tsx@4.20.3)(yaml@2.8.0) + vite-node: 3.2.4(@types/node@24.0.6)(jiti@2.4.2)(tsx@4.20.3)(yaml@2.8.0) why-is-node-running: 2.3.0 optionalDependencies: - '@types/node': 22.15.2 - '@vitest/ui': 3.1.2(vitest@3.1.2) + '@types/node': 24.0.6 + '@vitest/ui': 3.2.4(vitest@3.2.4) transitivePeerDependencies: - jiti - less @@ -5764,9 +6002,9 @@ snapshots: - tsx - yaml - wait-on@8.0.3(debug@4.4.0): + wait-on@8.0.3(debug@4.4.1): dependencies: - axios: 1.8.2(debug@4.4.0) + axios: 1.10.0(debug@4.4.1) joi: 17.13.3 lodash: 4.17.21 minimist: 1.2.8 @@ -5830,7 +6068,7 @@ snapshots: ws@8.17.1: {} - ws@8.18.1: {} + ws@8.18.2: {} y18n@5.0.8: {} @@ -5838,7 +6076,7 @@ snapshots: yaml@2.0.0-1: {} - yaml@2.7.1: {} + yaml@2.8.0: {} yargs-parser@21.1.1: {} @@ -5860,8 +6098,8 @@ snapshots: dependencies: lodash.get: 4.4.2 lodash.isequal: 4.5.0 - validator: 13.12.0 + validator: 13.15.15 optionalDependencies: commander: 9.5.0 - zod@3.24.3: {} + zod@3.25.67: {} diff --git a/public/docs/open-api.json b/public/docs/open-api.json index 578b5bda..f241011c 100644 --- a/public/docs/open-api.json +++ b/public/docs/open-api.json @@ -15,7 +15,9 @@ "/api/greeter/hello": { "get": { "description": "Returns the Hello Moleculer", - "tags": ["greeter"], + "tags": [ + "greeter" + ], "responses": { "200": { "description": "Hello Moleculer", @@ -34,7 +36,9 @@ "/api/greeter/welcome": { "get": { "description": "Returns Welcome, a username", - "tags": ["greeter"], + "tags": [ + "greeter" + ], "parameters": [ { "$ref": "#/components/parameters/username", @@ -61,7 +65,9 @@ "/api/product/cart": { "post": { "description": "Add a product to the cart", - "tags": ["product"], + "tags": [ + "product" + ], "requestBody": { "required": true, "content": { @@ -88,13 +94,100 @@ } } } + }, + "/api/product": { + "post": { + "description": "Create a new product", + "tags": [ + "product" + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/addCartDTO" + } + } + } + }, + "responses": { + "201": { + "description": "Product created successfully", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CreateProductResponseSchemaDTO" + } + } + } + }, + "422": { + "description": "Validation error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/errorResponseDTO" + } + } + } + }, + "500": { + "description": "Internal server error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/errorResponseDTO" + } + } + } + } + } + }, + "get": { + "description": "Get all products", + "tags": [ + "product" + ], + "responses": { + "200": { + "description": "List of products", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/ProductSchemaDTO" + } + } + } + } + } + } + } } }, "components": { "schemas": { "welcomeResponseDTO": { "type": "string", - "example": "Welcome, dunghd" + "example": "Welcome, Alex" + }, + "welcomeDTO": { + "type": "object", + "properties": { + "username": { + "type": "string", + "minLength": 4, + "maxLength": 25, + "description": "User name", + "example": "John Doe" + } + }, + "required": [ + "username" + ], + "description": "Welcome DTO" }, "addCartDTO": { "type": "object", @@ -130,10 +223,17 @@ "type": "string" } }, - "required": ["city", "zip", "country"] + "required": [ + "city", + "zip", + "country" + ] } }, - "required": ["name", "qty"], + "required": [ + "name", + "qty" + ], "description": "Add cart DTO" }, "addCartResponseDTO": { @@ -150,8 +250,137 @@ "example": "Product added to cart" } }, - "required": ["success", "message"], + "required": [ + "success", + "message" + ], "description": "Add cart response DTO" + }, + "CreateProductResponseSchemaDTO": { + "type": "object", + "properties": { + "success": { + "type": "boolean", + "description": "Success flag", + "example": true + }, + "message": { + "type": "string", + "description": "Message", + "example": "Product created successfully" + }, + "product": { + "type": "object", + "properties": { + "id": { + "type": "string", + "description": "ID of the created product", + "example": "12345" + }, + "name": { + "type": "string", + "description": "Name of the product", + "example": "Iphone" + }, + "qty": { + "type": "number", + "description": "Quantity of the product", + "example": 1 + }, + "price": { + "type": "number", + "description": "Price of the product", + "example": 1000 + }, + "billing": { + "type": "object", + "properties": { + "address": { + "type": "string" + }, + "city": { + "type": "string", + "description": "City of the billing address", + "example": "New York" + }, + "zip": { + "type": "number", + "description": "ZIP code of the billing address", + "example": 10001 + }, + "country": { + "type": "string", + "description": "Country of the billing address", + "example": "USA" + } + }, + "required": [ + "city", + "zip", + "country" + ] + } + }, + "required": [ + "id", + "name", + "qty" + ] + } + }, + "required": [ + "success", + "message", + "product" + ], + "description": "Create product response DTO" + }, + "ProductSchemaDTO": { + "type": "object", + "properties": { + "name": { + "type": "string", + "description": "Name of the product", + "example": "Iphone" + }, + "qty": { + "type": "number", + "description": "Quantity of the product", + "example": 1 + }, + "price": { + "type": "number", + "description": "Price of the product", + "example": 1000 + }, + "billing": { + "type": "object", + "properties": { + "address": { + "type": "string" + }, + "city": { + "type": "string" + }, + "zip": { + "type": "number" + }, + "country": { + "type": "string" + } + }, + "required": [ + "city", + "zip", + "country" + ] + } + }, + "required": [ + "name", + "qty" + ], + "description": "Product schema" } }, "parameters": { @@ -169,4 +398,4 @@ } }, "tags": [] -} +} \ No newline at end of file diff --git a/public/index.html b/public/index.html index 6e9c91ab..d715b667 100644 --- a/public/index.html +++ b/public/index.html @@ -1,4 +1,4 @@ - + @@ -111,9 +111,7 @@ font-weight: 300; font-size: 1.25em; border-bottom: 2px solid transparent; - transition: - color 0.1s linear, - border-bottom 0.1s linear; + transition: color 0.1s linear, border-bottom 0.1s linear; } nav ul li.active { @@ -695,7 +693,7 @@

}, fields: { - welcomeName: "dunghd", + welcomeName: "devalexanderdaza", name: "iPhone", quantity: 1, }, @@ -712,7 +710,7 @@

computed: { filteredServices() { return this.services.filter( - (svc) => !svc.name.startsWith("$"), + (svc) => !svc.name.startsWith("$") ); }, }, @@ -748,7 +746,7 @@

getActionParams(action, maxLen) { if (action.action && action.action.params) { const s = Object.keys(action.action.params).join( - ", ", + ", " ); return s.length > maxLen ? s.substr(0, maxLen) + "…" @@ -859,14 +857,14 @@

.then((res) => { this.services = res; res.sort((a, b) => - a.name.localeCompare(b.name), + a.name.localeCompare(b.name) ); res.forEach((svc) => svc.nodes.sort()); }) .then(() => this.req("/api/~node/actions", null)) .then((res) => { res.sort((a, b) => - a.name.localeCompare(b.name), + a.name.localeCompare(b.name) ); const actions = res.reduce((a, b) => { a[b.name] = b; diff --git a/services/common/index.ts b/services/common/index.ts new file mode 100644 index 00000000..692476e3 --- /dev/null +++ b/services/common/index.ts @@ -0,0 +1 @@ +export * from "./validation.utils"; diff --git a/services/common/validation.utils.ts b/services/common/validation.utils.ts new file mode 100644 index 00000000..1b701888 --- /dev/null +++ b/services/common/validation.utils.ts @@ -0,0 +1,31 @@ +import { type Context, Errors, type GenericObject } from "moleculer"; +import { z } from "zod"; + +import { logger } from "../../logger"; + +/** + * Validates request parameters using a Zod schema + * @param ctx - Moleculer context containing the parameters to validate + * @param schema - Zod schema object to validate against + * @throws {Errors.ValidationError} When validation fails + */ +export const validateParams = ( + ctx: Context, GenericObject>, + schema: T +): void => { + const compiled = z.object(schema).strict(); + try { + const parsedParams = compiled.parse(ctx.params); + logger.info("Validated parameters: %o", parsedParams); + } catch (err) { + if (err instanceof z.ZodError) { + throw new Errors.ValidationError( + "Parameters validation error!", + "VALIDATION_ERROR", + err.issues + ); + } + + throw err; + } +}; diff --git a/services/dtos/greeter-dto.swagger.yaml b/services/dtos/greeter-dto.swagger.yaml new file mode 100644 index 00000000..24e190ae --- /dev/null +++ b/services/dtos/greeter-dto.swagger.yaml @@ -0,0 +1,18 @@ +components: + schemas: + welcomeDTO: + type: object + properties: + username: + type: string + minLength: 4 + maxLength: 25 + description: User name + example: John Doe + required: + - username + description: Welcome DTO + welcomeResponseDTO: + type: string + example: Welcome, Alex + parameters: {} diff --git a/services/dtos/greeter.dto.ts b/services/dtos/greeter.dto.ts new file mode 100644 index 00000000..4f49b42f --- /dev/null +++ b/services/dtos/greeter.dto.ts @@ -0,0 +1,40 @@ +import { + extendZodWithOpenApi, + OpenApiGeneratorV3, +} from "@asteasolutions/zod-to-openapi"; +import { writeFileSync } from "node:fs"; +import { resolve } from "node:path"; +import yaml from "yaml"; +import { z } from "zod"; + +extendZodWithOpenApi(z); + +export const welcomeSchema = { + username: z.string().min(4).max(25).openapi({ + description: "User name", + example: "John Doe", + }), +}; + +// Write to same folder with the DTO file +const outputDirectory = __dirname; + +export const WelcomeSchema = z.object(welcomeSchema).openapi("welcomeDTO", { + description: "Welcome DTO", +}); + +export const WelcomeResponseSchema = z.string().openapi("welcomeResponseDTO", { + example: "Welcome, Alex", +}); + +const generator = new OpenApiGeneratorV3([ + WelcomeSchema, + WelcomeResponseSchema, +]); +const components = generator.generateComponents(); + +// Write to YAML file +writeFileSync( + resolve(outputDirectory, "greeter-dto.swagger.yaml"), + yaml.stringify(components) +); diff --git a/services/dtos/index.ts b/services/dtos/index.ts new file mode 100644 index 00000000..ed24c311 --- /dev/null +++ b/services/dtos/index.ts @@ -0,0 +1,2 @@ +export * from "./greeter.dto"; +export * from "./product.dto"; diff --git a/services/dtos/product-dto.swagger.yaml b/services/dtos/product-dto.swagger.yaml index caa0af4a..9edb9e57 100644 --- a/services/dtos/product-dto.swagger.yaml +++ b/services/dtos/product-dto.swagger.yaml @@ -49,4 +49,98 @@ components: - success - message description: Add cart response DTO + CreateProductResponseSchemaDTO: + type: object + properties: + success: + type: boolean + description: Success flag + example: true + message: + type: string + description: Message + example: Product created successfully + product: + type: object + properties: + id: + type: string + description: ID of the created product + example: "12345" + name: + type: string + description: Name of the product + example: Iphone + qty: + type: number + description: Quantity of the product + example: 1 + price: + type: number + description: Price of the product + example: 1000 + billing: + type: object + properties: + address: + type: string + city: + type: string + description: City of the billing address + example: New York + zip: + type: number + description: ZIP code of the billing address + example: 10001 + country: + type: string + description: Country of the billing address + example: USA + required: + - city + - zip + - country + required: + - id + - name + - qty + required: + - success + - message + - product + description: Create product response DTO + ProductSchemaDTO: + type: object + properties: + name: + type: string + description: Name of the product + example: Iphone + qty: + type: number + description: Quantity of the product + example: 1 + price: + type: number + description: Price of the product + example: 1000 + billing: + type: object + properties: + address: + type: string + city: + type: string + zip: + type: number + country: + type: string + required: + - city + - zip + - country + required: + - name + - qty + description: Product schema parameters: {} diff --git a/services/dtos/product.dto.ts b/services/dtos/product.dto.ts index f2f2a2f2..f70b23cb 100644 --- a/services/dtos/product.dto.ts +++ b/services/dtos/product.dto.ts @@ -1,6 +1,9 @@ +import { + OpenApiGeneratorV3, + extendZodWithOpenApi, +} from "@asteasolutions/zod-to-openapi"; import { writeFileSync } from "node:fs"; import { resolve } from "node:path"; -import { OpenApiGeneratorV3, extendZodWithOpenApi } from "@asteasolutions/zod-to-openapi"; import yaml from "yaml"; import { z } from "zod"; @@ -8,41 +11,134 @@ import { z } from "zod"; extendZodWithOpenApi(z); export const addCartSchema = { - name: z.string().openapi({ description: "Name of the product", example: "Iphone" }), - qty: z.number().openapi({ - description: "Quantity of the product", - example: 1, - }), - price: z.number().optional().openapi({ - description: "Price of the product", - example: 1000, - }), - billing: z - .object({ - address: z.string().optional(), - city: z.string(), - zip: z.number(), - country: z.string(), - }) - .optional(), + name: z + .string() + .openapi({ description: "Name of the product", example: "Iphone" }), + qty: z.number().openapi({ + description: "Quantity of the product", + example: 1, + }), + price: z.number().optional().openapi({ + description: "Price of the product", + example: 1000, + }), + billing: z + .object({ + address: z.string().optional(), + city: z.string(), + zip: z.number(), + country: z.string(), + }) + .optional(), }; // Write to same folder with the DTO file const outputDirectory = __dirname; const Schema = z.object(addCartSchema).openapi("addCartDTO", { - description: "Add cart DTO", + description: "Add cart DTO", }); const ResponseSchema = z - .object({ - success: z.boolean().openapi({ description: "Success flag", example: true }), - message: z.string().openapi({ description: "Message", example: "Product added to cart" }), - }) - .openapi("addCartResponseDTO", { - description: "Add cart response DTO", - }); -const generator = new OpenApiGeneratorV3([Schema, ResponseSchema]); + .object({ + success: z + .boolean() + .openapi({ description: "Success flag", example: true }), + message: z.string().openapi({ + description: "Message", + example: "Product added to cart", + }), + }) + .openapi("addCartResponseDTO", { + description: "Add cart response DTO", + }); + +const CreateProductResponseSchemaDTO = z + .object({ + success: z.boolean().openapi({ + description: "Success flag", + example: true, + }), + message: z.string().openapi({ + description: "Message", + example: "Product created successfully", + }), + product: z.object({ + id: z.string().openapi({ + description: "ID of the created product", + example: "12345", + }), + name: z.string().openapi({ + description: "Name of the product", + example: "Iphone", + }), + qty: z.number().openapi({ + description: "Quantity of the product", + example: 1, + }), + price: z.number().optional().openapi({ + description: "Price of the product", + example: 1000, + }), + billing: z + .object({ + address: z.string().optional(), + city: z.string().openapi({ + description: "City of the billing address", + example: "New York", + }), + zip: z.number().openapi({ + description: "ZIP code of the billing address", + example: 10001, + }), + country: z.string().openapi({ + description: "Country of the billing address", + example: "USA", + }), + }) + .optional(), + }), + }) + .openapi("CreateProductResponseSchemaDTO", { + description: "Create product response DTO", + }); + +const ProductSchema = z + .object({ + name: z.string().openapi({ + description: "Name of the product", + example: "Iphone", + }), + qty: z.number().openapi({ + description: "Quantity of the product", + example: 1, + }), + price: z.number().optional().openapi({ + description: "Price of the product", + example: 1000, + }), + billing: z + .object({ + address: z.string().optional(), + city: z.string(), + zip: z.number(), + country: z.string(), + }) + .optional(), + }) + .openapi("ProductSchemaDTO", { + description: "Product schema", + }); + +const generator = new OpenApiGeneratorV3([ + Schema, + ResponseSchema, + CreateProductResponseSchemaDTO, + ProductSchema, +]); const components = generator.generateComponents(); // Write to YAML file -writeFileSync(resolve(outputDirectory, "product-dto.swagger.yaml"), yaml.stringify(components)); +writeFileSync( + resolve(outputDirectory, "product-dto.swagger.yaml"), + yaml.stringify(components) +); diff --git a/services/greeter.service.ts b/services/greeter.service.ts index a5211820..0089ec47 100644 --- a/services/greeter.service.ts +++ b/services/greeter.service.ts @@ -1,21 +1,27 @@ -import type { Context, Service, ServiceSchema } from "moleculer"; +import { type Context, type Service, type ServiceSchema } from "moleculer"; +import { ZodParams } from "moleculer-zod-validator"; +import { logger } from "../logger"; +import { validateParams } from "./common"; +import { welcomeSchema } from "./dtos"; type GreeterSettings = { - defaultName: string; + defaultName: string; }; type GreeterMethods = { - /** - * Say a 'Hello' to a user. - * @example - * sayHello("John Doe"); - * // Hello John Doe - **/ - sayHello(name: string): string; + /** + * Say a 'Hello' to a user. + * @example + * sayHello("John Doe"); + * // Hello John Doe + **/ + sayHello(name: string): string; }; type GreeterThis = Service & GreeterMethods; +const getterValidator = new ZodParams(welcomeSchema); + /** * @swagger * components: @@ -35,126 +41,142 @@ type GreeterThis = Service & GreeterMethods; * maxLength: 25 */ const greeterService: ServiceSchema = { - name: "greeter", + name: "greeter", - /** - * Settings - */ - settings: { - defaultName: "Moleculer", - }, + /** + * Settings + */ + settings: { + defaultName: "Moleculer", + }, - /** - * Dependencies - */ - dependencies: [], + /** + * Dependencies + */ + dependencies: [], - /** - * Actions - */ - actions: { - /** - * @swagger - * /api/greeter/hello: - * get: - * description: Returns the Hello Moleculer - * tags: - * - greeter - * responses: - * 200: - * description: Hello Moleculer - * content: - * text/plain: - * schema: - * type: string - * example: Hello Moleculer - */ - hello: { - rest: { - method: "GET", - path: "/hello", - }, - async handler(this: GreeterThis) { - return this.sayHello(this.settings.defaultName); - }, - }, + /** + * Actions + */ + actions: { + /** + * @swagger + * /api/greeter/hello: + * get: + * description: Returns the Hello Moleculer + * tags: + * - greeter + * responses: + * 200: + * description: Hello Moleculer + * content: + * text/plain: + * schema: + * type: string + * example: Hello Moleculer + */ + hello: { + rest: { + method: "GET", + path: "/hello", + }, + /** + * @returns Hello Moleculer + */ + async handler(this: GreeterThis) { + return this.sayHello(this.settings.defaultName); + }, + }, - /** - * Welcome, a username - * - * @param name - User name - * @swagger - * /api/greeter/welcome: - * get: - * description: Returns Welcome, a username - * tags: - * - greeter - * parameters: - * - $ref: '#/components/parameters/username' - * in: query - * responses: - * 200: - * description: Welcome, a username - * content: - * text/plain: - * schema: - * $ref: '#/components/schemas/welcomeResponseDTO' - * 422: - * description: Invalid username - */ - welcome: { - rest: "/welcome", - params: { - username: { type: "string", min: 6, max: 25 }, - }, - /** - * @param ctx - Request context - * @returns Welcome, a username - */ - async handler( - ctx: Context<{ - username: string; - }>, - ) { - return `Welcome, ${ctx.params.username}`; - }, - }, - }, + /** + * Welcome, a username + * + * @param name - User name + * @swagger + * /api/greeter/welcome: + * get: + * description: Returns Welcome, a username + * tags: + * - greeter + * parameters: + * - $ref: '#/components/parameters/username' + * in: query + * responses: + * 200: + * description: Welcome, a username + * content: + * text/plain: + * schema: + * $ref: '#/components/schemas/welcomeResponseDTO' + * 422: + * description: Invalid username + */ + welcome: { + rest: "/welcome", + params: { + username: { type: "string", min: 6, max: 25 }, + }, + hooks: { + before: [ + (ctx: Context) => { + logger.info("Validating parameters for welcome action"); + validateParams(ctx, welcomeSchema); + }, + ], + }, + /** + * @param ctx - Request context + * @returns Welcome, a username + */ + async handler( + this: GreeterThis, + ctx: Context + ) { + this.logger.info( + "welcome action called with parameters: %o", + ctx.params + ); + // Validate parameters + const { username } = ctx.params; + return `Welcome, ${username}`; + }, + }, + }, - /** - * Events - */ - events: {}, + /** + * Events + */ + events: {}, - /** - * Methods - */ - methods: { - sayHello(name: string) { - return `Hello ${name}`; - }, - }, + /** + * Methods + */ + methods: { + sayHello(name: string) { + return `Hello ${name}`; + }, + }, - /** - * Service created lifecycle event handler - */ - created() { - this.logger.info("[greeter] The service was created"); - }, + /** + * Service created lifecycle event handler + */ + created() { + this.logger.info("[greeter] The service was created"); + }, - /** - * Service started lifecycle event handler - */ - async started() { - this.logger.info("[greeter] The service was started"); - }, + /** + * Service started lifecycle event handler + */ + async started() { + this.logger.info("[greeter] The service was started"); + }, - /** - * Service stopped lifecycle event handler - */ - async stopped() { - this.logger.info("[greeter] The service was stopped"); - }, + /** + * Service stopped lifecycle event handler + */ + async stopped() { + this.logger.info("[greeter] The service was stopped"); + }, }; export default greeterService; diff --git a/services/interfaces/index.ts b/services/interfaces/index.ts new file mode 100644 index 00000000..fa66b99c --- /dev/null +++ b/services/interfaces/index.ts @@ -0,0 +1 @@ +export * from "./repository.interface"; diff --git a/services/interfaces/repository.interface.ts b/services/interfaces/repository.interface.ts new file mode 100644 index 00000000..b17882e5 --- /dev/null +++ b/services/interfaces/repository.interface.ts @@ -0,0 +1,19 @@ +/** + * Interface for a generic repository + * @template T - The type of the entity the repository manages + */ +export interface IRepository { + findById(id: string): Promise; + findAll(): Promise; + create(data: Omit): Promise; + update(id: string, data: Partial): Promise; + delete(id: string): Promise; + count(): Promise; + exists(id: string): Promise; + findByField(field: keyof T, value: any): Promise; + findAllByField(field: keyof T, value: any): Promise; + findOneAndUpdate(filter: Partial, update: Partial): Promise; + findOneAndDelete(filter: Partial): Promise; + findOneAndReplace(filter: Partial, replacement: T): Promise; + aggregate(pipeline: any[]): Promise; +} diff --git a/services/product.service.ts b/services/product.service.ts deleted file mode 100644 index f3867518..00000000 --- a/services/product.service.ts +++ /dev/null @@ -1,139 +0,0 @@ -import { - type Context, - Errors, - type GenericObject, - type Service, - type ServiceSchema, -} from "moleculer"; -import { ZodParams } from "moleculer-zod-validator"; -import { z } from "zod"; - -import { logger } from "../logger"; -import { addCartSchema } from "./dtos/product.dto"; - -type ServiceSettings = Record; - -type ServiceMethods = Record; - -type ServiceThis = Service & ServiceMethods; - -const orderItemValidator = new ZodParams(addCartSchema); - -// TODO: Move this to a shared utility -const validateParams = ( - ctx: Context, GenericObject>, - schema: typeof addCartSchema, -) => { - const compiled = z.object(schema).strict(); - try { - const parsedParams = compiled.parse(ctx.params); - logger.info("Validated parameters: %o", parsedParams); - } catch (err) { - if (err instanceof z.ZodError) - throw new Errors.ValidationError( - "Parameters validation error!", - "VALIDATION_ERROR", - err.issues, - ); - - throw err; - } -}; - -const productService: ServiceSchema = { - name: "product", - - /** - * Settings - */ - settings: {}, - - /** - * Dependencies - */ - dependencies: [], - - /** - * Actions - */ - actions: { - /** - * Add a product to the cart - * @swagger - * /api/product/cart: - * post: - * description: Add a product to the cart - * tags: - * - product - * requestBody: - * required: true - * content: - * application/json: - * schema: - * $ref: '#/components/schemas/addCartDTO' - * responses: - * 200: - * description: Product added to cart - * content: - * application/json: - * schema: - * $ref: '#/components/schemas/addCartResponseDTO' - * 422: - * description: Validation error - */ - addToCart: { - rest: { - method: "POST", - path: "/cart", - }, - hooks: { - before(ctx) { - this.logger.info("Validating parameters for addToCart action"); - validateParams(ctx, addCartSchema); - }, - }, - handler(this: ServiceThis, ctx: Context) { - this.logger.info("addToCart action called with parameters: %o", ctx.params); - const { name, qty, billing } = ctx.params; - return { - success: true, - message: `You added ${qty} ${name} to your cart`, - billing, - }; - }, - }, - }, - - /** - * Events - */ - events: {}, - - /** - * Methods - */ - methods: {}, - - /** - * Service created lifecycle event handler - */ - created() { - this.logger.info(`The ${this.name} service created.`); - }, - - /** - * Service started lifecycle event handler - */ - async started() { - this.logger.info(`The ${this.name} service started.`); - }, - - /** - * Service stopped lifecycle event handler - */ - async stopped() { - this.logger.info(`The ${this.name} service stopped.`); - }, -}; - -export default productService; diff --git a/services/product/product.repository.ts b/services/product/product.repository.ts new file mode 100644 index 00000000..35b5c28b --- /dev/null +++ b/services/product/product.repository.ts @@ -0,0 +1,154 @@ +import { randomUUID } from "node:crypto"; +import { IRepository } from "../interfaces"; + +// Product interface definition +export interface Product { + id: string; + name: string; + qty: number; +} + +export class InMemoryProductRepository implements IRepository { + public async update( + id: string, + data: Partial + ): Promise { + const existingProduct = this.products.get(id); + if (!existingProduct) { + return null; + } + const updatedProduct: Product = { ...existingProduct, ...data, id }; + this.products.set(id, updatedProduct); + return updatedProduct; + } + + public async delete(id: string): Promise { + return this.products.delete(id); + } + + public async count(): Promise { + return this.products.size; + } + + public async exists(id: string): Promise { + return this.products.has(id); + } + + public async findByField( + field: keyof Product, + value: any + ): Promise { + for (const product of this.products.values()) { + if (product[field] === value) { + return product; + } + } + return null; + } + + public async findAllByField( + field: keyof Product, + value: any + ): Promise { + const results: Product[] = []; + for (const product of this.products.values()) { + if (product[field] === value) { + results.push(product); + } + } + return results; + } + + public async findOneAndUpdate( + filter: Partial, + update: Partial + ): Promise { + for (const [id, product] of this.products.entries()) { + if (this.matchesFilter(product, filter)) { + const updatedProduct: Product = { ...product, ...update }; + this.products.set(id, updatedProduct); + return updatedProduct; + } + } + return null; + } + + public async findOneAndDelete( + filter: Partial + ): Promise { + for (const [id, product] of this.products.entries()) { + if (this.matchesFilter(product, filter)) { + this.products.delete(id); + return product; + } + } + return null; + } + + public async findOneAndReplace( + filter: Partial, + replacement: Product + ): Promise { + for (const [id, product] of this.products.entries()) { + if (this.matchesFilter(product, filter)) { + this.products.set(id, replacement); + return replacement; + } + } + return null; + } + + public async aggregate(pipeline: any[]): Promise { + let results = Array.from(this.products.values()); + + for (const stage of pipeline) { + if (stage.$match) { + results = results.filter((product) => + this.matchesFilter(product, stage.$match) + ); + } + if (stage.$sort) { + const sortField = Object.keys(stage.$sort)[0] as keyof Product; + const sortOrder = stage.$sort[sortField]; + results.sort((a, b) => { + if (a[sortField] < b[sortField]) + return sortOrder === 1 ? -1 : 1; + if (a[sortField] > b[sortField]) + return sortOrder === 1 ? 1 : -1; + return 0; + }); + } + if (stage.$limit) { + results = results.slice(0, stage.$limit); + } + } + + return results; + } + + private matchesFilter(product: Product, filter: Partial): boolean { + for (const [key, value] of Object.entries(filter)) { + if (product[key as keyof Product] !== value) { + return false; + } + } + return true; + } + + private products: Map = new Map(); + + public async findById(id: string): Promise { + return this.products.get(id) || null; + } + + public async findAll(): Promise { + return Array.from(this.products.values()); + } + + public async create(data: Omit): Promise { + const id = randomUUID(); + const newProduct: Product = { id, ...data }; + this.products.set(id, newProduct); + return newProduct; + } +} diff --git a/services/product/product.service.ts b/services/product/product.service.ts new file mode 100644 index 00000000..2d0a82f7 --- /dev/null +++ b/services/product/product.service.ts @@ -0,0 +1,211 @@ +import type { Context, Service, ServiceSchema } from "moleculer"; +import { ZodParams } from "moleculer-zod-validator"; + +import { validateParams } from "../common"; +import { addCartSchema } from "../dtos"; +import { InMemoryProductRepository } from "./product.repository"; + +type ServiceSettings = Record; + +type ServiceMethods = Record; + +type ServiceThis = Service & + ServiceMethods & { repository: InMemoryProductRepository }; + +const orderItemValidator = new ZodParams(addCartSchema); + +const productService: ServiceSchema = { + name: "product", + + /** + * Settings + */ + settings: {}, + + /** + * Dependencies + */ + dependencies: [], + + /** + * Actions + */ + actions: { + /** + * Add a product to the cart + * @swagger + * /api/product/cart: + * post: + * description: Add a product to the cart + * tags: + * - product + * requestBody: + * required: true + * content: + * application/json: + * schema: + * $ref: '#/components/schemas/addCartDTO' + * responses: + * 200: + * description: Product added to cart + * content: + * application/json: + * schema: + * $ref: '#/components/schemas/addCartResponseDTO' + * 422: + * description: Validation error + */ + addToCart: { + rest: { + method: "POST", + path: "/cart", + }, + hooks: { + before(ctx) { + this.logger.info( + "Validating parameters for addToCart action" + ); + validateParams(ctx, addCartSchema); + }, + }, + handler( + this: ServiceThis, + ctx: Context + ) { + this.logger.info( + "addToCart action called with parameters: %o", + ctx.params + ); + const { name, qty, billing } = ctx.params; + return { + success: true, + message: `You added ${qty} ${name} to your cart`, + billing, + }; + }, + }, + /** + * Create a new product + * @swagger + * /api/product: + * post: + * description: Create a new product + * tags: + * - product + * requestBody: + * required: true + * content: + * application/json: + * schema: + * $ref: '#/components/schemas/addCartDTO' + * responses: + * 201: + * description: Product created successfully + * content: + * application/json: + * schema: + * $ref: '#/components/schemas/CreateProductResponseSchemaDTO' + * 422: + * description: Validation error + * content: + * application/json: + * schema: + * $ref: '#/components/schemas/errorResponseDTO' + * 500: + * description: Internal server error + * content: + * application/json: + * schema: + * $ref: '#/components/schemas/errorResponseDTO' + */ + create: { + // Example of a new action + rest: "POST /", + hooks: { + before(ctx) { + this.logger.info("Validating parameters for create action"); + validateParams(ctx, addCartSchema); + }, + }, + async handler( + this: ServiceThis, + ctx: Context + ) { + const newProduct = await this.repository.create(ctx.params); + return { + success: true, + message: "Product created successfully", + product: newProduct, + }; + }, + }, + /** + * Get all products + * @swagger + * /api/product: + * get: + * description: Get all products + * tags: + * - product + * responses: + * 200: + * description: List of products + * content: + * application/json: + * schema: + * type: array + * items: + * $ref: '#/components/schemas/ProductSchemaDTO' + */ + getAll: { + rest: "GET /", + async handler(this: ServiceThis) { + const products = await this.repository.findAll(); + return products; + }, + }, + }, + + /** + * Events + */ + events: {}, + + /** + * Methods + */ + methods: {}, + + /** + * Service created lifecycle event handler + */ + created() { + try { + this.repository = new InMemoryProductRepository(); + this.logger.info("Product repository initialized."); + this.logger.info(`The ${this.name} service created.`); + } catch (error) { + this.logger.error( + "Failed to initialize product repository:", + error + ); + throw error; + } + }, + + /** + * Service started lifecycle event handler + */ + async started() { + this.logger.info(`The ${this.name} service started.`); + }, + + /** + * Service stopped lifecycle event handler + */ + async stopped() { + this.logger.info(`The ${this.name} service stopped.`); + }, +}; + +export default productService; diff --git a/test/unit/services/product.spec.ts b/test/unit/services/product.spec.ts index 576b7b99..849f5835 100644 --- a/test/unit/services/product.spec.ts +++ b/test/unit/services/product.spec.ts @@ -1,40 +1,40 @@ import { Errors, ServiceBroker, type ServiceSchema } from "moleculer"; import { ZodValidator } from "moleculer-zod-validator"; -import TestService from "../../../services/product.service"; +import TestService from "../../../services/product/product.service"; // eslint-disable-next-line @typescript-eslint/naming-convention const { ValidationError } = Errors; describe("Test 'product' service", () => { - const broker = new ServiceBroker({ - logger: false, - validator: new ZodValidator(), - }); - broker.createService(TestService as unknown as ServiceSchema); + const broker = new ServiceBroker({ + logger: false, + validator: new ZodValidator(), + }); + broker.createService(TestService as unknown as ServiceSchema); - beforeAll(async () => broker.start()); - afterAll(async () => broker.stop()); + beforeAll(async () => broker.start()); + afterAll(async () => broker.stop()); - describe("Test 'product.addToCart' action", () => { - it("should return success message", async () => { - const response = await broker.call("product.addToCart", { - name: "iPhone", - qty: 1, - }); - expect(response).toEqual({ - success: true, - message: "You added 1 iPhone to your cart", - }); - }); + describe("Test 'product.addToCart' action", () => { + it("should return success message", async () => { + const response = await broker.call("product.addToCart", { + name: "iPhone", + qty: 1, + }); + expect(response).toEqual({ + success: true, + message: "You added 1 iPhone to your cart", + }); + }); - it("should reject an ValidationError", async () => { - expect.assertions(1); - try { - await broker.call("product.addToCart"); - } catch (error: unknown) { - expect(error).toBeInstanceOf(ValidationError); - } - }); - }); + it("should reject an ValidationError", async () => { + expect.assertions(1); + try { + await broker.call("product.addToCart"); + } catch (error: unknown) { + expect(error).toBeInstanceOf(ValidationError); + } + }); + }); });