From e6ce74e48534790d16541e63c4e0865cec21ccff Mon Sep 17 00:00:00 2001 From: sunlei Date: Thu, 4 Jun 2026 13:13:13 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=8E=A5=E5=85=A5=E7=B3=BB=E7=BB=9F?= =?UTF-8?q?=E6=97=A5=E5=BF=97=E4=B8=8E=E7=BB=9F=E4=B8=80=E6=97=B6=E9=97=B4?= =?UTF-8?q?=E6=A0=BC=E5=BC=8F=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .env.example | 19 + API.md | 29 + dockerfile | 12 + package.json | 47 +- pnpm-lock.yaml | 2611 +++++++++-------- sql/fix-admin-menu-meta.sql | 2 + sql/system-log-menu.sql | 50 + sql/vben-admin-init.sql | 1 + src/admin/admin.module.ts | 4 + src/admin/component/component.controller.ts | 4 +- src/admin/component/component.entity.ts | 9 +- src/admin/dept/admin-dept.entity.ts | 4 +- src/admin/dict/admin-dict.entity.ts | 4 +- src/admin/dict/dict.dto.ts | 7 +- src/admin/example/admin-example.controller.ts | 6 +- src/admin/menu/admin-menu.entity.ts | 4 +- src/admin/role/admin-role.entity.ts | 4 +- src/admin/system-log/system-log.controller.ts | 74 + src/admin/system-log/system-log.dto.ts | 107 + src/admin/system-log/system-log.service.ts | 454 +++ src/admin/user/admin-user.entity.ts | 4 +- src/app.module.ts | 8 + .../decorators/format-date-time.decorator.ts | 103 + src/common/filters/api-exception.filter.ts | 50 +- src/common/index.ts | 2 + src/common/logger/pino-logger.config.ts | 219 ++ src/common/swagger/swagger-response.ts | 12 +- src/main.ts | 4 +- src/minio/minio.controller.ts | 17 +- src/minio/minio.dto.ts | 4 +- .../account/qqbot-account-ability.entity.ts | 4 +- src/qqbot/account/qqbot-account.entity.ts | 6 +- src/qqbot/command/qqbot-command-log.entity.ts | 4 +- src/qqbot/command/qqbot-command.entity.ts | 5 +- src/qqbot/config/qqbot-config.entity.ts | 4 +- .../connection/qqbot-reverse-ws.service.ts | 2 +- src/qqbot/dedupe/qqbot-dedupe.entity.ts | 5 +- .../message/qqbot-conversation.entity.ts | 5 +- src/qqbot/message/qqbot-message.entity.ts | 5 +- .../napcat/qqbot-account-napcat.entity.ts | 5 +- .../napcat/qqbot-napcat-container.entity.ts | 6 +- .../permission/qqbot-allowlist.entity.ts | 4 +- .../permission/qqbot-blocklist.entity.ts | 4 +- .../qqbot-event-plugin-registry.service.ts | 4 +- .../plugin/qqbot-plugin-registry.service.ts | 4 +- .../ff14Market/qqbot-ff14-client.service.ts | 3 +- .../ff14Market/qqbot-ff14-market.plugin.ts | 4 +- .../plugins/fflogs/qqbot-fflogs.plugin.ts | 4 +- src/qqbot/rule/qqbot-rule.entity.ts | 5 +- src/qqbot/send/qqbot-send-log.entity.ts | 4 +- .../system-log/system-log.controller.spec.ts | 73 + test/app.e2e-spec.ts | 135 +- .../common/format-date-time.decorator.spec.ts | 50 + .../qqbot-napcat-login.service.spec.ts | 21 +- .../qqbot-command-parser.service.spec.ts | 14 + .../qqbot-fflogs-client.service.spec.ts | 14 + test/test.types.ts | 2 +- tsconfig.json | 1 - 58 files changed, 3012 insertions(+), 1260 deletions(-) create mode 100644 sql/system-log-menu.sql create mode 100644 src/admin/system-log/system-log.controller.ts create mode 100644 src/admin/system-log/system-log.dto.ts create mode 100644 src/admin/system-log/system-log.service.ts create mode 100644 src/common/decorators/format-date-time.decorator.ts create mode 100644 src/common/logger/pino-logger.config.ts create mode 100644 test/admin/system-log/system-log.controller.spec.ts create mode 100644 test/common/format-date-time.decorator.spec.ts diff --git a/.env.example b/.env.example index 97f6c1d..fd5c13e 100644 --- a/.env.example +++ b/.env.example @@ -23,6 +23,25 @@ ADMIN_COOKIE_SECURE=false SNOWFLAKE_WORKER_ID=1 SNOWFLAKE_DATACENTER_ID=1 +LOG_LEVEL=info +LOG_APP_NAME=kt-template-online-api +LOG_PRETTY=true +LOKI_URL= +LOKI_QUERY_HOST= +LOKI_ENV=development +LOKI_TENANT_ID= +LOKI_USERNAME= +LOKI_PASSWORD= +LOKI_PUSH_ENDPOINT=/loki/api/v1/push +LOKI_QUERY_ENDPOINT=/loki/api/v1/query_range +LOKI_PUSH_TIMEOUT_MS=30000 +LOKI_QUERY_TIMEOUT_MS=10000 +LOKI_BATCH_INTERVAL_SECONDS=5 +LOKI_BATCH_MAX_BUFFER_SIZE=10000 +LOKI_QUERY_MAX_LIMIT=1000 +LOKI_QUERY_SELECTOR= +LOKI_SILENCE_ERRORS=true + QQBOT_ENABLED=false QQBOT_EVENT_BUS=mqtt QQBOT_REVERSE_WS_PATH=/qqbot/onebot/reverse diff --git a/API.md b/API.md index 912336f..98f0cbf 100644 --- a/API.md +++ b/API.md @@ -32,6 +32,7 @@ | MinIO | Bucket 检查/创建、文件上传、列表、临时访问地址、下载和删除 | | WordPress | WordPress 文章、标签、分类管理,复用客户端 WordPress 登录态访问 REST API | | Common | 统一响应 Swagger 注解、字典翻译注解、`POST */save` 请求体规范化拦截器 | +| Logging | 基于 Pino 的结构化日志、可选 Loki 直推,以及 Admin 系统日志查询代理 | ## 通用规则 @@ -85,6 +86,29 @@ WordPress 侧只使用客户端登录态,后端不走 BasicAuth。当前 WordP Admin 主登录不依赖 WordPress 可用性:本系统账号验证通过后会先写入 Admin token;WordPress 自动认证失败时登录仍返回成功,`wordpressAuth` 为 `null`、`wordpressAvailable=false`,并清理旧 WordPress cookie。随后 `/menu/all` 与 `/auth/codes` 会基于最近一次 WordPress 可用性状态过滤 `Blog*` 菜单和 `Blog:*` 按钮权限码,避免前端展示不可用的文章、分类、标签管理入口。 +### 系统日志 + +后端使用 `nestjs-pino` 输出结构化 JSON 日志。生产环境默认写 stdout;配置 `LOKI_URL` 或 `LOKI_HOST` 后,会同时通过 `pino-loki` 批量推送到 Loki。Admin 不直接连接 Loki,统一通过后端 `/system/logs/*` 查询代理访问,避免 Loki 地址和凭据暴露到浏览器。 + +环境变量: + +| 变量 | 说明 | +| ---------------------------- | ---------------------------------------------------------------------------------------- | +| `LOG_LEVEL` | 日志级别,默认生产 `info`、开发 `debug` | +| `LOG_APP_NAME` | Loki `app` 标签,默认 `kt-template-online-api` | +| `LOG_PRETTY` | 开发环境是否使用 `pino-pretty`,默认 `true` | +| `LOKI_URL` / `LOKI_HOST` | Loki HTTP 地址,例如 `http://loki:3100`;为空时仅输出 stdout | +| `LOKI_QUERY_HOST` | 查询专用 Loki 地址;为空时复用 `LOKI_HOST/LOKI_URL` | +| `LOKI_ENV` | Loki `env` 标签,默认跟随 `NODE_ENV` | +| `LOKI_TENANT_ID` | Loki 多租户 `X-Scope-OrgID`,没有多租户时留空 | +| `LOKI_USERNAME` / `LOKI_PASSWORD` | Loki Basic Auth,仅放真实 env,不提交到仓库 | +| `LOKI_PUSH_ENDPOINT` | Loki push 路径,默认 `/loki/api/v1/push` | +| `LOKI_QUERY_ENDPOINT` | Loki query_range 路径,默认 `/loki/api/v1/query_range` | +| `LOKI_QUERY_SELECTOR` | 查询默认 selector;为空时使用 `{app="",env=""}` | +| `LOKI_BATCH_INTERVAL_SECONDS` | pino-loki 批量发送间隔,默认 `5` | +| `LOKI_BATCH_MAX_BUFFER_SIZE` | Loki 不可用时最大内存缓冲条数,默认 `10000`,超过会丢弃旧日志避免 OOM | +| `LOKI_QUERY_MAX_LIMIT` | Admin 单次查询最大拉取条数,默认 `1000` | + ### 数据库字典翻译 组件数据维护在 `admin_component` 表中,字典数据维护在新的 `admin_dict` 表中。`Component.typeMsg`、`Component.componentTypeMsg` 会在 TypeORM `AfterLoad` 阶段根据字典缓存自动映射;旧 `/dict/*` 接口路径保持兼容,但仍需要登录态。 @@ -349,6 +373,10 @@ Query: | POST | `/system/dept` | 新增部门 | | PUT | `/system/dept/:id` | 更新部门 | | DELETE | `/system/dept/:id` | 删除部门 | +| GET | `/system/logs` | 查询 Loki 系统日志 | +| GET | `/system/logs/summary` | 查询日志级别统计 | +| GET | `/system/logs/levels` | 查询日志级别选项 | +| GET | `/system/logs/status` | 查询 Loki 配置状态 | | GET | `/timezone/getTimezoneOptions` | 获取时区选项 | | GET | `/timezone/getTimezone` | 获取当前用户时区 | | POST | `/timezone/setTimezone` | 设置当前用户时区 | @@ -360,6 +388,7 @@ Query: 初始化 SQL: - `sql/vben-admin-init.sql`:创建 `admin_*` 表并导入基础用户、角色、菜单、部门、字典数据,同时创建空的 `admin_component` 表。 +- `sql/system-log-menu.sql`:为已有库增量补齐系统日志菜单及管理员角色授权。 - `sql/migrate-dict-to-admin-dict.sql`:将旧 `dict` 表数据迁移到 `admin_dict`。 - `sql/migrate-component-to-admin-component.sql`:将旧 `component` 表数据迁移到 `admin_component`,并把旧表改名为备份表。 - `sql/fix-admin-menu-meta.sql`:修复基础后台菜单 `meta` 被旧数据或错误保存覆盖为空的问题。 diff --git a/dockerfile b/dockerfile index 342eee8..ae3656c 100644 --- a/dockerfile +++ b/dockerfile @@ -4,6 +4,18 @@ WORKDIR /app ENV NODE_ENV=production ENV APP_PORT=48085 +ENV LOG_LEVEL=info +ENV LOG_APP_NAME=kt-template-online-api +ENV LOG_PRETTY=false +ENV LOKI_ENV=production +ENV LOKI_PUSH_ENDPOINT=/loki/api/v1/push +ENV LOKI_QUERY_ENDPOINT=/loki/api/v1/query_range +ENV LOKI_PUSH_TIMEOUT_MS=30000 +ENV LOKI_QUERY_TIMEOUT_MS=10000 +ENV LOKI_BATCH_INTERVAL_SECONDS=5 +ENV LOKI_BATCH_MAX_BUFFER_SIZE=10000 +ENV LOKI_QUERY_MAX_LIMIT=1000 +ENV LOKI_SILENCE_ERRORS=true ENV FFLOGS_BASE_URL=https://www.fflogs.com ENV FFLOGS_WEB_BASE_URL=https://cn.fflogs.com ENV FFLOGS_GRAPHQL_URL=https://www.fflogs.com/api/v2/client diff --git a/package.json b/package.json index 5bc57ca..80450db 100644 --- a/package.json +++ b/package.json @@ -27,50 +27,55 @@ }, "dependencies": { "@kwitsukasa/knife4j-swagger-vue3": "0.1.2", - "@nestjs/common": "^9.4.3", - "@nestjs/config": "^2.3.4", - "@nestjs/core": "^9.4.3", - "@nestjs/platform-express": "^9.4.3", - "@nestjs/swagger": "^7.4.2", - "@nestjs/typeorm": "^9.0.1", + "@nestjs/common": "^11.1.24", + "@nestjs/config": "^4.0.4", + "@nestjs/core": "^11.1.24", + "@nestjs/platform-express": "^11.1.24", + "@nestjs/swagger": "^11.4.4", + "@nestjs/typeorm": "^11.0.1", "cross-env": "^7.0.3", - "express": "4.18.2", + "express": "5.2.1", "lodash": "^4.17.21", "mqtt": "^5.15.1", "mysql2": "^3.22.3", "nestjs-minio-client": "^2.2.0", - "reflect-metadata": "^0.1.14", + "nestjs-pino": "^4.6.1", + "pino": "^10.3.1", + "pino-http": "^11.0.0", + "pino-loki": "^3.0.0", + "reflect-metadata": "^0.2.2", "rxjs": "^7.8.2", "svg-captcha": "^1.4.0", "typeorm": "^0.3.28", "ws": "^8.21.0" }, "devDependencies": { - "@nestjs/cli": "^9.5.0", - "@nestjs/schematics": "^9.2.0", - "@nestjs/testing": "^9.4.3", - "@types/express": "^4.17.25", + "@nestjs/cli": "^11.0.21", + "@nestjs/schematics": "^11.1.0", + "@nestjs/testing": "^11.1.24", + "@types/express": "^5.0.6", "@types/jest": "29.2.4", "@types/lodash": "^4.17.24", - "@types/node": "18.11.18", + "@types/node": "22.19.19", "@types/supertest": "^2.0.16", "@types/ws": "^8.18.1", - "@typescript-eslint/eslint-plugin": "^5.62.0", - "@typescript-eslint/parser": "^5.62.0", + "@typescript-eslint/eslint-plugin": "^8.60.1", + "@typescript-eslint/parser": "^8.60.1", "eslint": "^8.57.1", - "eslint-config-prettier": "^8.10.2", - "eslint-plugin-prettier": "^4.2.5", + "eslint-config-prettier": "^10.1.8", + "eslint-plugin-prettier": "^5.5.6", "eslint-plugin-typeorm": "0.0.19", "husky": "^9.1.7", "jest": "29.3.1", - "prettier": "^2.8.8", + "pino-pretty": "^13.1.3", + "prettier": "^3.8.3", "source-map-support": "^0.5.21", "supertest": "^6.3.4", - "ts-jest": "29.0.3", - "ts-loader": "^9.5.7", + "ts-jest": "29.4.11", + "ts-loader": "^9.5.4", "ts-node": "^10.9.2", "tsconfig-paths": "4.1.1", - "typescript": "^4.9.5" + "typescript": "^5.9.3" }, "jest": { "moduleFileExtensions": [ diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index cd89dc0..93624a7 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -10,31 +10,31 @@ importers: dependencies: '@kwitsukasa/knife4j-swagger-vue3': specifier: 0.1.2 - version: 0.1.2(@nestjs/common@9.4.3(reflect-metadata@0.1.14)(rxjs@7.8.2)) + version: 0.1.2(@nestjs/common@11.1.24(reflect-metadata@0.2.2)(rxjs@7.8.2)) '@nestjs/common': - specifier: ^9.4.3 - version: 9.4.3(reflect-metadata@0.1.14)(rxjs@7.8.2) + specifier: ^11.1.24 + version: 11.1.24(reflect-metadata@0.2.2)(rxjs@7.8.2) '@nestjs/config': - specifier: ^2.3.4 - version: 2.3.4(@nestjs/common@9.4.3(reflect-metadata@0.1.14)(rxjs@7.8.2))(reflect-metadata@0.1.14)(rxjs@7.8.2) + specifier: ^4.0.4 + version: 4.0.4(@nestjs/common@11.1.24(reflect-metadata@0.2.2)(rxjs@7.8.2))(rxjs@7.8.2) '@nestjs/core': - specifier: ^9.4.3 - version: 9.4.3(@nestjs/common@9.4.3(reflect-metadata@0.1.14)(rxjs@7.8.2))(@nestjs/platform-express@9.4.3)(reflect-metadata@0.1.14)(rxjs@7.8.2) + specifier: ^11.1.24 + version: 11.1.24(@nestjs/common@11.1.24(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/platform-express@11.1.24)(reflect-metadata@0.2.2)(rxjs@7.8.2) '@nestjs/platform-express': - specifier: ^9.4.3 - version: 9.4.3(@nestjs/common@9.4.3(reflect-metadata@0.1.14)(rxjs@7.8.2))(@nestjs/core@9.4.3) + specifier: ^11.1.24 + version: 11.1.24(@nestjs/common@11.1.24(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@11.1.24) '@nestjs/swagger': - specifier: ^7.4.2 - version: 7.4.2(@nestjs/common@9.4.3(reflect-metadata@0.1.14)(rxjs@7.8.2))(@nestjs/core@9.4.3)(reflect-metadata@0.1.14) + specifier: ^11.4.4 + version: 11.4.4(@nestjs/common@11.1.24(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@11.1.24)(reflect-metadata@0.2.2) '@nestjs/typeorm': - specifier: ^9.0.1 - version: 9.0.1(@nestjs/common@9.4.3(reflect-metadata@0.1.14)(rxjs@7.8.2))(@nestjs/core@9.4.3)(reflect-metadata@0.1.14)(rxjs@7.8.2)(typeorm@0.3.28(mssql@9.3.2(@azure/core-client@1.10.1))(mysql2@3.22.3(@types/node@18.11.18))(ts-node@10.9.2(@types/node@18.11.18)(typescript@4.9.5))) + specifier: ^11.0.1 + version: 11.0.1(@nestjs/common@11.1.24(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@11.1.24)(reflect-metadata@0.2.2)(rxjs@7.8.2)(typeorm@0.3.28(mssql@9.3.2(@azure/core-client@1.10.1))(mysql2@3.22.3(@types/node@22.19.19))(ts-node@10.9.2(@types/node@22.19.19)(typescript@5.9.3))) cross-env: specifier: ^7.0.3 version: 7.0.3 express: - specifier: 4.18.2 - version: 4.18.2 + specifier: 5.2.1 + version: 5.2.1 lodash: specifier: ^4.17.21 version: 4.17.21 @@ -43,13 +43,25 @@ importers: version: 5.15.1 mysql2: specifier: ^3.22.3 - version: 3.22.3(@types/node@18.11.18) + version: 3.22.3(@types/node@22.19.19) nestjs-minio-client: specifier: ^2.2.0 - version: 2.2.0(@nestjs/common@9.4.3(reflect-metadata@0.1.14)(rxjs@7.8.2))(@nestjs/core@9.4.3) + version: 2.2.0(@nestjs/common@11.1.24(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@11.1.24) + nestjs-pino: + specifier: ^4.6.1 + version: 4.6.1(@nestjs/common@11.1.24(reflect-metadata@0.2.2)(rxjs@7.8.2))(pino-http@11.0.0)(pino@10.3.1)(rxjs@7.8.2) + pino: + specifier: ^10.3.1 + version: 10.3.1 + pino-http: + specifier: ^11.0.0 + version: 11.0.0 + pino-loki: + specifier: ^3.0.0 + version: 3.0.0 reflect-metadata: - specifier: ^0.1.14 - version: 0.1.14 + specifier: ^0.2.2 + version: 0.2.2 rxjs: specifier: ^7.8.2 version: 7.8.2 @@ -58,23 +70,23 @@ importers: version: 1.4.0 typeorm: specifier: ^0.3.28 - version: 0.3.28(mssql@9.3.2(@azure/core-client@1.10.1))(mysql2@3.22.3(@types/node@18.11.18))(ts-node@10.9.2(@types/node@18.11.18)(typescript@4.9.5)) + version: 0.3.28(mssql@9.3.2(@azure/core-client@1.10.1))(mysql2@3.22.3(@types/node@22.19.19))(ts-node@10.9.2(@types/node@22.19.19)(typescript@5.9.3)) ws: specifier: ^8.21.0 version: 8.21.0 devDependencies: '@nestjs/cli': - specifier: ^9.5.0 - version: 9.5.0 + specifier: ^11.0.21 + version: 11.0.21(@types/node@22.19.19)(prettier@3.8.3) '@nestjs/schematics': - specifier: ^9.2.0 - version: 9.2.0(chokidar@3.5.3)(typescript@4.9.5) + specifier: ^11.1.0 + version: 11.1.0(chokidar@4.0.3)(prettier@3.8.3)(typescript@5.9.3) '@nestjs/testing': - specifier: ^9.4.3 - version: 9.4.3(@nestjs/common@9.4.3(reflect-metadata@0.1.14)(rxjs@7.8.2))(@nestjs/core@9.4.3)(@nestjs/platform-express@9.4.3) + specifier: ^11.1.24 + version: 11.1.24(@nestjs/common@11.1.24(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@11.1.24)(@nestjs/platform-express@11.1.24) '@types/express': - specifier: ^4.17.25 - version: 4.17.25 + specifier: ^5.0.6 + version: 5.0.6 '@types/jest': specifier: 29.2.4 version: 29.2.4 @@ -82,8 +94,8 @@ importers: specifier: ^4.17.24 version: 4.17.24 '@types/node': - specifier: 18.11.18 - version: 18.11.18 + specifier: 22.19.19 + version: 22.19.19 '@types/supertest': specifier: ^2.0.16 version: 2.0.16 @@ -91,20 +103,20 @@ importers: specifier: ^8.18.1 version: 8.18.1 '@typescript-eslint/eslint-plugin': - specifier: ^5.62.0 - version: 5.62.0(@typescript-eslint/parser@5.62.0(eslint@8.57.1)(typescript@4.9.5))(eslint@8.57.1)(typescript@4.9.5) + specifier: ^8.60.1 + version: 8.60.1(@typescript-eslint/parser@8.60.1(eslint@8.57.1)(typescript@5.9.3))(eslint@8.57.1)(typescript@5.9.3) '@typescript-eslint/parser': - specifier: ^5.62.0 - version: 5.62.0(eslint@8.57.1)(typescript@4.9.5) + specifier: ^8.60.1 + version: 8.60.1(eslint@8.57.1)(typescript@5.9.3) eslint: specifier: ^8.57.1 version: 8.57.1 eslint-config-prettier: - specifier: ^8.10.2 - version: 8.10.2(eslint@8.57.1) + specifier: ^10.1.8 + version: 10.1.8(eslint@8.57.1) eslint-plugin-prettier: - specifier: ^4.2.5 - version: 4.2.5(eslint-config-prettier@8.10.2(eslint@8.57.1))(eslint@8.57.1)(prettier@2.8.8) + specifier: ^5.5.6 + version: 5.5.6(@types/eslint@9.6.1)(eslint-config-prettier@10.1.8(eslint@8.57.1))(eslint@8.57.1)(prettier@3.8.3) eslint-plugin-typeorm: specifier: 0.0.19 version: 0.0.19 @@ -113,10 +125,13 @@ importers: version: 9.1.7 jest: specifier: 29.3.1 - version: 29.3.1(@types/node@18.11.18)(ts-node@10.9.2(@types/node@18.11.18)(typescript@4.9.5)) + version: 29.3.1(@types/node@22.19.19)(ts-node@10.9.2(@types/node@22.19.19)(typescript@5.9.3)) + pino-pretty: + specifier: ^13.1.3 + version: 13.1.3 prettier: - specifier: ^2.8.8 - version: 2.8.8 + specifier: ^3.8.3 + version: 3.8.3 source-map-support: specifier: ^0.5.21 version: 0.5.21 @@ -124,40 +139,40 @@ importers: specifier: ^6.3.4 version: 6.3.4 ts-jest: - specifier: 29.0.3 - version: 29.0.3(@babel/core@7.29.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.29.0))(jest@29.3.1(@types/node@18.11.18)(ts-node@10.9.2(@types/node@18.11.18)(typescript@4.9.5)))(typescript@4.9.5) + specifier: 29.4.11 + version: 29.4.11(@babel/core@7.29.0)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.29.0))(jest-util@29.7.0)(jest@29.3.1(@types/node@22.19.19)(ts-node@10.9.2(@types/node@22.19.19)(typescript@5.9.3)))(typescript@5.9.3) ts-loader: - specifier: ^9.5.7 - version: 9.5.7(typescript@4.9.5)(webpack@5.82.1) + specifier: ^9.5.4 + version: 9.5.7(typescript@5.9.3)(webpack@5.106.0) ts-node: specifier: ^10.9.2 - version: 10.9.2(@types/node@18.11.18)(typescript@4.9.5) + version: 10.9.2(@types/node@22.19.19)(typescript@5.9.3) tsconfig-paths: specifier: 4.1.1 version: 4.1.1 typescript: - specifier: ^4.9.5 - version: 4.9.5 + specifier: ^5.9.3 + version: 5.9.3 packages: - '@angular-devkit/core@16.0.1': - resolution: {integrity: sha512-2uz98IqkKJlgnHbWQ7VeL4pb+snGAZXIama2KXi+k9GsRntdcw+udX8rL3G9SdUGUF+m6+147Y1oRBMHsO/v4w==} - engines: {node: ^16.14.0 || >=18.10.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: '>= 1.13.0'} + '@angular-devkit/core@19.2.24': + resolution: {integrity: sha512-Kd49warf6U/EyWe5BszF/eebN3zQ3bk7tgfEljAw8q/rX95UUtriJubWvp6pgzHfzBA4jwq8f+QiNZB8eBEXPA==} + engines: {node: ^18.19.1 || ^20.11.1 || >=22.0.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: '>= 1.13.0'} peerDependencies: - chokidar: ^3.5.2 + chokidar: ^4.0.0 peerDependenciesMeta: chokidar: optional: true - '@angular-devkit/schematics-cli@16.0.1': - resolution: {integrity: sha512-6KLA125dpgd6oJGtiO2JpZAb92uOG3njQGIt7NFcuQGW/5GO7J41vMXH9cBAfdtbV8SIggSmR/cIEE9ijfj6YQ==} - engines: {node: ^16.14.0 || >=18.10.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: '>= 1.13.0'} + '@angular-devkit/schematics-cli@19.2.24': + resolution: {integrity: sha512-bsStZQG67J1HBqTmWxtIcobvgrn32L4UOdL7hGyOru5VxDWPNA8pRnDYavT3hnJeBkJYPoQIw8u7Dm0ecoQprw==} + engines: {node: ^18.19.1 || ^20.11.1 || >=22.0.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: '>= 1.13.0'} hasBin: true - '@angular-devkit/schematics@16.0.1': - resolution: {integrity: sha512-A9D0LTYmiqiBa90GKcSuWb7hUouGIbm/AHbJbjL85WLLRbQA2PwKl7P5Mpd6nS/ZC0kfG4VQY3VOaDvb3qpI9g==} - engines: {node: ^16.14.0 || >=18.10.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: '>= 1.13.0'} + '@angular-devkit/schematics@19.2.24': + resolution: {integrity: sha512-lnw+ZM1Io+cJAkReC0NPDjqObL8NtKzKIkdgEEKC8CUmkhurYhedbicN8Y8NYHgG1uLd2GozW3+/QqPRZaN+Lw==} + engines: {node: ^18.19.1 || ^20.11.1 || >=22.0.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: '>= 1.13.0'} '@azure-rest/core-client@2.6.0': resolution: {integrity: sha512-iuFKDm8XPzNxPfRjhyU5/xKZmcRDzSuEghXDHHk4MjBV/wFL34GmYVBZnn9wmuoLBeS1qAw9ceMdaeJBPcB1QQ==} @@ -412,6 +427,9 @@ packages: '@bcoe/v8-coverage@0.2.3': resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==} + '@borewit/text-codec@0.2.2': + resolution: {integrity: sha512-DDaRehssg1aNrH4+2hnj1B7vnUGEjU6OIlyRdkMd0aUdIUvKXrJfXsy8LVtXAy7DRvYVluWbMspsRhz2lcW0mQ==} + '@colors/colors@1.5.0': resolution: {integrity: sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==} engines: {node: '>=0.1.90'} @@ -451,6 +469,149 @@ packages: resolution: {integrity: sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==} deprecated: Use @eslint/object-schema instead + '@inquirer/ansi@1.0.2': + resolution: {integrity: sha512-S8qNSZiYzFd0wAcyG5AXCvUHC5Sr7xpZ9wZ2py9XR88jUz8wooStVx5M6dRzczbBWjic9NP7+rY0Xi7qqK/aMQ==} + engines: {node: '>=18'} + + '@inquirer/checkbox@4.3.2': + resolution: {integrity: sha512-VXukHf0RR1doGe6Sm4F0Em7SWYLTHSsbGfJdS9Ja2bX5/D5uwVOEjr07cncLROdBvmnvCATYEWlHqYmXv2IlQA==} + engines: {node: '>=18'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + + '@inquirer/confirm@5.1.21': + resolution: {integrity: sha512-KR8edRkIsUayMXV+o3Gv+q4jlhENF9nMYUZs9PA2HzrXeHI8M5uDag70U7RJn9yyiMZSbtF5/UexBtAVtZGSbQ==} + engines: {node: '>=18'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + + '@inquirer/core@10.3.2': + resolution: {integrity: sha512-43RTuEbfP8MbKzedNqBrlhhNKVwoK//vUFNW3Q3vZ88BLcrs4kYpGg+B2mm5p2K/HfygoCxuKwJJiv8PbGmE0A==} + engines: {node: '>=18'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + + '@inquirer/editor@4.2.23': + resolution: {integrity: sha512-aLSROkEwirotxZ1pBaP8tugXRFCxW94gwrQLxXfrZsKkfjOYC1aRvAZuhpJOb5cu4IBTJdsCigUlf2iCOu4ZDQ==} + engines: {node: '>=18'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + + '@inquirer/expand@4.0.23': + resolution: {integrity: sha512-nRzdOyFYnpeYTTR2qFwEVmIWypzdAx/sIkCMeTNTcflFOovfqUk+HcFhQQVBftAh9gmGrpFj6QcGEqrDMDOiew==} + engines: {node: '>=18'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + + '@inquirer/external-editor@1.0.3': + resolution: {integrity: sha512-RWbSrDiYmO4LbejWY7ttpxczuwQyZLBUyygsA9Nsv95hpzUWwnNTVQmAq3xuh7vNwCp07UTmE5i11XAEExx4RA==} + engines: {node: '>=18'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + + '@inquirer/figures@1.0.15': + resolution: {integrity: sha512-t2IEY+unGHOzAaVM5Xx6DEWKeXlDDcNPeDyUpsRc6CUhBfU3VQOEl+Vssh7VNp1dR8MdUJBWhuObjXCsVpjN5g==} + engines: {node: '>=18'} + + '@inquirer/input@4.3.1': + resolution: {integrity: sha512-kN0pAM4yPrLjJ1XJBjDxyfDduXOuQHrBB8aLDMueuwUGn+vNpF7Gq7TvyVxx8u4SHlFFj4trmj+a2cbpG4Jn1g==} + engines: {node: '>=18'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + + '@inquirer/number@3.0.23': + resolution: {integrity: sha512-5Smv0OK7K0KUzUfYUXDXQc9jrf8OHo4ktlEayFlelCjwMXz0299Y8OrI+lj7i4gCBY15UObk76q0QtxjzFcFcg==} + engines: {node: '>=18'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + + '@inquirer/password@4.0.23': + resolution: {integrity: sha512-zREJHjhT5vJBMZX/IUbyI9zVtVfOLiTO66MrF/3GFZYZ7T4YILW5MSkEYHceSii/KtRk+4i3RE7E1CUXA2jHcA==} + engines: {node: '>=18'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + + '@inquirer/prompts@7.10.1': + resolution: {integrity: sha512-Dx/y9bCQcXLI5ooQ5KyvA4FTgeo2jYj/7plWfV5Ak5wDPKQZgudKez2ixyfz7tKXzcJciTxqLeK7R9HItwiByg==} + engines: {node: '>=18'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + + '@inquirer/prompts@7.3.2': + resolution: {integrity: sha512-G1ytyOoHh5BphmEBxSwALin3n1KGNYB6yImbICcRQdzXfOGbuJ9Jske/Of5Sebk339NSGGNfUshnzK8YWkTPsQ==} + engines: {node: '>=18'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + + '@inquirer/rawlist@4.1.11': + resolution: {integrity: sha512-+LLQB8XGr3I5LZN/GuAHo+GpDJegQwuPARLChlMICNdwW7OwV2izlCSCxN6cqpL0sMXmbKbFcItJgdQq5EBXTw==} + engines: {node: '>=18'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + + '@inquirer/search@3.2.2': + resolution: {integrity: sha512-p2bvRfENXCZdWF/U2BXvnSI9h+tuA8iNqtUKb9UWbmLYCRQxd8WkvwWvYn+3NgYaNwdUkHytJMGG4MMLucI1kA==} + engines: {node: '>=18'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + + '@inquirer/select@4.4.2': + resolution: {integrity: sha512-l4xMuJo55MAe+N7Qr4rX90vypFwCajSakx59qe/tMaC1aEHWLyw68wF4o0A4SLAY4E0nd+Vt+EyskeDIqu1M6w==} + engines: {node: '>=18'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + + '@inquirer/type@3.0.10': + resolution: {integrity: sha512-BvziSRxfz5Ov8ch0z/n3oijRSEcEsHnhggm4xFZe93DHcUCTlutlq9Ox4SVENAfcRD22UQq7T/atg9Wr3k09eA==} + engines: {node: '>=18'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + '@isaacs/cliui@8.0.2': resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} engines: {node: '>=12'} @@ -563,45 +724,50 @@ packages: resolution: {integrity: sha512-Z7C/xXCiGWsg0KuKsHTKJxbWhpI3Vs5GwLfOean7MGyVFGqdRgBbAjOCh6u4bbjPc/8MJ2pZmK/0DLdCbivLDA==} engines: {node: '>=8'} - '@microsoft/tsdoc@0.15.1': - resolution: {integrity: sha512-4aErSrCR/On/e5G2hDP0wjooqDdauzEbIq8hIkIe5pXV0rtWJZvdCEKL0ykZxex+IxIwBp0eGeV48hQN07dXtw==} + '@microsoft/tsdoc@0.16.0': + resolution: {integrity: sha512-xgAyonlVVS+q7Vc7qLW0UrJU7rSFcETRWsqdXZtjzRU8dF+6CkozTK4V4y1LwOX7j8r/vHphjDeMeGI4tNGeGA==} - '@nestjs/cli@9.5.0': - resolution: {integrity: sha512-Z7q+3vNsQSG2d2r2Hl/OOj5EpfjVx3OfnJ9+KuAsOdw1sKLm7+Zc6KbhMFTd/eIvfx82ww3Nk72xdmfPYCulWA==} - engines: {node: '>= 12.9.0'} + '@nestjs/cli@11.0.21': + resolution: {integrity: sha512-F8mV0Sj/zVEouzR3NxBuJy08YHTUOmC5Xdcx3qIIaJWzrm8Vw86CHkhkaPBJ5ewRMHPDCShPmhsfwhpCcjts3A==} + engines: {node: '>= 20.11'} hasBin: true - - '@nestjs/common@9.4.3': - resolution: {integrity: sha512-Gd6D4IaYj01o14Bwv81ukidn4w3bPHCblMUq+SmUmWLyosK+XQmInCS09SbDDZyL8jy86PngtBLTdhJ2bXSUig==} peerDependencies: - cache-manager: <=5 - class-transformer: '*' - class-validator: '*' - reflect-metadata: ^0.1.12 + '@swc/cli': ^0.1.62 || ^0.3.0 || ^0.4.0 || ^0.5.0 || ^0.6.0 || ^0.7.0 || ^0.8.0 + '@swc/core': ^1.3.62 + peerDependenciesMeta: + '@swc/cli': + optional: true + '@swc/core': + optional: true + + '@nestjs/common@11.1.24': + resolution: {integrity: sha512-9zHxaDDM+oXW9As6UsP5yYB+UqczBmpeSCIFWdPEtEukMnZhxODG1BBjaUcdBB8Sc1uzojSJSJlp3yFp853t1g==} + peerDependencies: + class-transformer: '>=0.4.1' + class-validator: '>=0.13.2' + reflect-metadata: ^0.1.12 || ^0.2.0 rxjs: ^7.1.0 peerDependenciesMeta: - cache-manager: - optional: true class-transformer: optional: true class-validator: optional: true - '@nestjs/config@2.3.4': - resolution: {integrity: sha512-IGdSF+0F9MJO6dCRTEahdxPz4iVijjtolcFBxnY+2QYM3bXYQvAgzskGZi+WkAFJN/VzR3TEp60gN5sI74GxPA==} + '@nestjs/config@4.0.4': + resolution: {integrity: sha512-CJPjNitr0bAufSEnRe2N+JbnVmMmDoo6hvKCPzXgZoGwJSmp/dZPk9f/RMbuD/+Q1ZJPjwsRpq0vxna++Knwow==} peerDependencies: - '@nestjs/common': ^7.0.0 || ^8.0.0 || ^9.0.0 - reflect-metadata: ^0.1.13 - rxjs: ^6.0.0 || ^7.2.0 + '@nestjs/common': ^10.0.0 || ^11.0.0 + rxjs: ^7.1.0 - '@nestjs/core@9.4.3': - resolution: {integrity: sha512-Qi63+wi55Jh4sDyaj5Hhx2jOpKqT386aeo+VOKsxnd+Ql9VvkO/FjmuwBGUyzkJt29ENYc+P0Sx/k5LtstNpPQ==} + '@nestjs/core@11.1.24': + resolution: {integrity: sha512-K4bzT+lEdd0Hhcsw3jtk56QAW6s6skK3ViN7hIROSN0kUf4ROwWEAKopJID6yhPQxB45kDtP2wEcjzE8171J3g==} + engines: {node: '>= 20'} peerDependencies: - '@nestjs/common': ^9.0.0 - '@nestjs/microservices': ^9.0.0 - '@nestjs/platform-express': ^9.0.0 - '@nestjs/websockets': ^9.0.0 - reflect-metadata: ^0.1.12 + '@nestjs/common': ^11.0.0 + '@nestjs/microservices': ^11.0.0 + '@nestjs/platform-express': ^11.0.0 + '@nestjs/websockets': ^11.0.0 + reflect-metadata: ^0.1.12 || ^0.2.0 rxjs: ^7.1.0 peerDependenciesMeta: '@nestjs/microservices': @@ -611,12 +777,12 @@ packages: '@nestjs/websockets': optional: true - '@nestjs/mapped-types@2.0.5': - resolution: {integrity: sha512-bSJv4pd6EY99NX9CjBIyn4TVDoSit82DUZlL4I3bqNfy5Gt+gXTa86i3I/i0iIV9P4hntcGM5GyO+FhZAhxtyg==} + '@nestjs/mapped-types@2.1.1': + resolution: {integrity: sha512-SCCoMEJ6jdeI5h/N+KCVF1+pmg/hmEkNA5nHTS8Gvww7T/LCl4o1gFLinw2iQ60w7slFkszHcGLKGdazVI4F8A==} peerDependencies: - '@nestjs/common': ^8.0.0 || ^9.0.0 || ^10.0.0 + '@nestjs/common': ^10.0.0 || ^11.0.0 class-transformer: ^0.4.0 || ^0.5.0 - class-validator: ^0.13.0 || ^0.14.0 + class-validator: ^0.13.0 || ^0.14.0 || ^0.15.0 reflect-metadata: ^0.1.12 || ^0.2.0 peerDependenciesMeta: class-transformer: @@ -624,23 +790,27 @@ packages: class-validator: optional: true - '@nestjs/platform-express@9.4.3': - resolution: {integrity: sha512-FpdczWoRSC0zz2dNL9u2AQLXKXRVtq4HgHklAhbL59X0uy+mcxhlSThG7DHzDMkoSnuuHY8ojDVf7mDxk+GtCw==} + '@nestjs/platform-express@11.1.24': + resolution: {integrity: sha512-CeMKbRBm05aOBiWhIHWO2xDeHbxynBF9ySQv3gRjObz2N5+uJnYriAYkHvVqvC4JIydmMPmT5VdICFNlNz3qyA==} peerDependencies: - '@nestjs/common': ^9.0.0 - '@nestjs/core': ^9.0.0 + '@nestjs/common': ^11.0.0 + '@nestjs/core': ^11.0.0 - '@nestjs/schematics@9.2.0': - resolution: {integrity: sha512-wHpNJDPzM6XtZUOB3gW0J6mkFCSJilzCM3XrHI1o0C8vZmFE1snbmkIXNyoi1eV0Nxh1BMymcgz5vIMJgQtTqw==} + '@nestjs/schematics@11.1.0': + resolution: {integrity: sha512-lVxGZ46tcdItFMoXr6vyKWlnOsm1SZm/GUqAEDvy2RL4Q4O+3bkziAhrO7Y8JLssFUUvNFEGqAizI52WAxhjDw==} peerDependencies: - typescript: '>=4.3.5' + prettier: ^3.0.0 + typescript: '>=4.8.2' + peerDependenciesMeta: + prettier: + optional: true - '@nestjs/swagger@7.4.2': - resolution: {integrity: sha512-Mu6TEn1M/owIvAx2B4DUQObQXqo2028R2s9rSZ/hJEgBK95+doTwS0DjmVA2wTeZTyVtXOoN7CsoM5pONBzvKQ==} + '@nestjs/swagger@11.4.4': + resolution: {integrity: sha512-VaIo1ruV2G7b+f2zPzkBSUNy9a/WQ9sg8TLKhWlrTfg4O6U10M/PA7Xi6XMXadOVhwOqoesijba8jH3i/3adrA==} peerDependencies: - '@fastify/static': ^6.0.0 || ^7.0.0 - '@nestjs/common': ^9.0.0 || ^10.0.0 - '@nestjs/core': ^9.0.0 || ^10.0.0 + '@fastify/static': ^8.0.0 || ^9.0.0 + '@nestjs/common': ^11.0.1 + '@nestjs/core': ^11.0.1 class-transformer: '*' class-validator: '*' reflect-metadata: ^0.1.12 || ^0.2.0 @@ -652,27 +822,27 @@ packages: class-validator: optional: true - '@nestjs/testing@9.4.3': - resolution: {integrity: sha512-LDT8Ai2eKnTzvnPaJwWOK03qTaFap5uHHsJCv6dL0uKWk6hyF9jms8DjyVaGsaujCaXDG8izl1mDEER0OmxaZA==} + '@nestjs/testing@11.1.24': + resolution: {integrity: sha512-+4M4UAnhtprBQN0J2uI6IP0wDqhy9aH8XCMu5SO8oCi0oB04YXA4a4PAEkxmsPn7gHW4dj1u4GFteNQOWgvTJw==} peerDependencies: - '@nestjs/common': ^9.0.0 - '@nestjs/core': ^9.0.0 - '@nestjs/microservices': ^9.0.0 - '@nestjs/platform-express': ^9.0.0 + '@nestjs/common': ^11.0.0 + '@nestjs/core': ^11.0.0 + '@nestjs/microservices': ^11.0.0 + '@nestjs/platform-express': ^11.0.0 peerDependenciesMeta: '@nestjs/microservices': optional: true '@nestjs/platform-express': optional: true - '@nestjs/typeorm@9.0.1': - resolution: {integrity: sha512-A2BgLIPsMtmMI0bPKEf4bmzgFPsnvHqNBx3KkvaJ7hJrBQy0OqYOb+Rr06ifblKWDWS2tUPNrAFQbZjtk3PI+g==} + '@nestjs/typeorm@11.0.1': + resolution: {integrity: sha512-8rw/nKT0S+L+MkzgE9F2/mox7mAgsPlwfzmW9gsESN1lmQtIrVEfiiBwC2O8+guS1jBfQehJIdcdUj2OAp4VUQ==} peerDependencies: - '@nestjs/common': ^8.0.0 || ^9.0.0 - '@nestjs/core': ^8.0.0 || ^9.0.0 - reflect-metadata: ^0.1.13 + '@nestjs/common': ^10.0.0 || ^11.0.0 + '@nestjs/core': ^10.0.0 || ^11.0.0 + reflect-metadata: ^0.1.13 || ^0.2.0 rxjs: ^7.2.0 - typeorm: ^0.3.0 + typeorm: ^0.3.0 || ^1.0.0-dev '@noble/hashes@1.8.0': resolution: {integrity: sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A==} @@ -690,18 +860,28 @@ packages: resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} engines: {node: '>= 8'} - '@nuxtjs/opencollective@0.3.2': - resolution: {integrity: sha512-um0xL3fO7Mf4fDxcqx9KryrB7zgRM5JSlvGN5AGkP6JLM5XEKyjeAiPbNxdXVXQ16isuAhYpvP88NgL2BGd6aA==} - engines: {node: '>=8.0.0', npm: '>=5.0.0'} + '@nuxt/opencollective@0.4.1': + resolution: {integrity: sha512-GXD3wy50qYbxCJ652bDrDzgMr3NFEkIS374+IgFQKkCvk9yiYcLvX2XDYr7UyQxf4wK0e+yqDYRubZ0DtOxnmQ==} + engines: {node: ^14.18.0 || >=16.10.0, npm: '>=5.10.0'} hasBin: true '@paralleldrive/cuid2@2.3.1': resolution: {integrity: sha512-XO7cAxhnTZl0Yggq6jOgjiOHhbgcO4NqFqwSmQpjK3b6TEE6Uj/jfSk6wzYyemh3+I0sHirKSetjQwn5cZktFw==} + '@pinojs/redact@0.4.0': + resolution: {integrity: sha512-k2ENnmBugE/rzQfEcdWHcCY+/FM3VLzH9cYEsbdsoqrvzAKRhUZeRNhAZvB8OitQJ1TBed3yqWtdjzS6wJKBwg==} + '@pkgjs/parseargs@0.11.0': resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} engines: {node: '>=14'} + '@pkgr/core@0.3.6': + resolution: {integrity: sha512-SEeaJLb3qBNF/OaXnaR1NmmBbFYk1zC0ZH/52fATcRPLFg/p791YrcyFFy44Bo9sLaGuSuLp5Q6axbb/O+v/RA==} + engines: {node: ^14.18.0 || >=16.0.0} + + '@scarf/scarf@1.4.0': + resolution: {integrity: sha512-xxeapPiUXdZAE3che6f3xogoJPeZgig6omHEy1rIY5WVsB3H2BHNnZH+gHG6x91SCWyQCzWGsuL2Hh3ClO5/qQ==} + '@sinclair/typebox@0.27.10': resolution: {integrity: sha512-MTBk/3jGLNB2tVxv6uLlFh1iu64iYOQ2PbdOSK3NW8JZsmlaOh2q6sdtKowBhfw8QFLmYNzTW4/oK4uATIi6ZA==} @@ -717,6 +897,13 @@ packages: '@tediousjs/connection-string@0.5.0': resolution: {integrity: sha512-7qSgZbincDDDFyRweCIEvZULFAw5iz/DeunhvuxpL31nfntX3P4Yd4HkHBRg9H8CdqY1e5WFN1PZIz/REL9MVQ==} + '@tokenizer/inflate@0.4.1': + resolution: {integrity: sha512-2mAv+8pkG6GIZiF1kNg1jAjh27IDxEPKwdGul3snfztFerfPGI1LjDezZp3i7BElXompqEtPmoPx6c2wgtWsOA==} + engines: {node: '>=18'} + + '@tokenizer/token@0.3.0': + resolution: {integrity: sha512-OvjF+z51L3ov0OyAU0duzsYuvO01PH7x4t6DJx+guahgTnBHkhJdG7soQeTSFLWN3efnHyibZ4Z8l2EuWwJN3A==} + '@tsconfig/node10@1.0.12': resolution: {integrity: sha512-UCYBaeFvM11aU2y3YPZ//O5Rhj+xKyzy7mvcIoAjASbigy8mHMryP5cK7dgjlz2hWxh1g5pLw084E0a/wlUSFQ==} @@ -759,11 +946,11 @@ packages: '@types/estree@1.0.9': resolution: {integrity: sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==} - '@types/express-serve-static-core@4.19.8': - resolution: {integrity: sha512-02S5fmqeoKzVZCHPZid4b8JH2eM5HzQLZWN2FohQEy/0eXTq8VXZfSN6Pcr3F6N9R/vNrj7cpgbhjie6m/1tCA==} + '@types/express-serve-static-core@5.1.1': + resolution: {integrity: sha512-v4zIMr/cX7/d2BpAEX3KNKL/JrT1s43s96lLvvdTmza1oEvDudCqK9aF/djc/SWgy8Yh0h30TZx5VpzqFCxk5A==} - '@types/express@4.17.25': - resolution: {integrity: sha512-dVd04UKsfpINUnK0yBoYHDF3xu7xVH4BuDotC/xGuycx4CgbP48X/KF/586bcObxT0HENHXEU8Nqtu6NR+eKhw==} + '@types/express@5.0.6': + resolution: {integrity: sha512-sKYVuV7Sv9fbPIt/442koC7+IIwK5olP1KWeD88e/idgoJqDm3JV/YUiPwkoKK92ylff2MGxSz1CSjsXelx0YA==} '@types/graceful-fs@4.1.9': resolution: {integrity: sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==} @@ -792,14 +979,8 @@ packages: '@types/methods@1.1.4': resolution: {integrity: sha512-ymXWVrDiCxTBE3+RIrrP533E70eA+9qu7zdWoHuOmGujkYtzf4HQF96b8nwHLqhuf4ykX61IGRIB38CC6/sImQ==} - '@types/mime@1.3.5': - resolution: {integrity: sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==} - - '@types/node@18.11.18': - resolution: {integrity: sha512-DHQpWGjyQKSHj3ebjFI/wRKcqQcdR+MoFBygntYOZytCqNfkd2ZC4ARDJ2DQqhjH5p85Nnd3jhUJIXrszFX/JA==} - - '@types/parse-json@4.0.2': - resolution: {integrity: sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==} + '@types/node@22.19.19': + resolution: {integrity: sha512-dyh/xO2Fh5bYrfWaaqGrRQQGkNdmYw6AmaAUvYeUMNTWQtvb796ikLdmTchRmOlOiIJ1TDXfWgVx1QkUlQ6Hew==} '@types/qs@6.15.1': resolution: {integrity: sha512-GZHUBZR9hckSUhrxmp1nG6NwdpM9fCunJwyThLW1X3AyHgd9IlHb6VANpQQqDr2o/qQp6McZ3y/IA2rVzKzSbw==} @@ -810,17 +991,11 @@ packages: '@types/readable-stream@4.0.23': resolution: {integrity: sha512-wwXrtQvbMHxCbBgjHaMGEmImFTQxxpfMOR/ZoQnXxB1woqkUbdLGFDgauo00Py9IudiaqSeiBiulSV9i6XIPig==} - '@types/semver@7.7.1': - resolution: {integrity: sha512-FmgJfu+MOcQ370SD0ev7EI8TlCAfKYU+B4m5T3yXc1CiRN94g/SZPtsCkk506aUDtlMnFZvasDwHHUcZUEaYuA==} - - '@types/send@0.17.6': - resolution: {integrity: sha512-Uqt8rPBE8SY0RK8JB1EzVOIZ32uqy8HwdxCnoCOsYrvnswqmFZ/k+9Ikidlk/ImhsdvBsloHbAlewb2IEBV/Og==} - '@types/send@1.2.1': resolution: {integrity: sha512-arsCikDvlU99zl1g69TcAB3mzZPpxgw0UQnaHeC1Nwb015xp8bknZv5rIfri9xTOcMuaVgvabfIRA7PSZVuZIQ==} - '@types/serve-static@1.15.10': - resolution: {integrity: sha512-tRs1dB+g8Itk72rlSI2ZrW6vZg0YrLI81iQSTkMmOqnqCaNr/8Ek4VwWcN5vZgCYWbg/JJSGBlUaYGAOP73qBw==} + '@types/serve-static@2.2.0': + resolution: {integrity: sha512-8mam4H1NHLtu7nmtalF7eyBH14QyOASmcxHhSfEoRyr0nP/YdoesEtU+uSRvMe96TW/HPTtkoKqQLl53N7UXMQ==} '@types/stack-utils@2.0.3': resolution: {integrity: sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==} @@ -840,63 +1015,64 @@ packages: '@types/yargs@17.0.35': resolution: {integrity: sha512-qUHkeCyQFxMXg79wQfTtfndEC+N9ZZg76HJftDJp+qH2tV7Gj4OJi7l+PiWwJ+pWtW8GwSmqsDj/oymhrTWXjg==} - '@typescript-eslint/eslint-plugin@5.62.0': - resolution: {integrity: sha512-TiZzBSJja/LbhNPvk6yc0JrX9XqhQ0hdh6M2svYfsHGejaKFIAGd9MQ+ERIMzLGlN/kZoYIgdxFV0PuljTKXag==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + '@typescript-eslint/eslint-plugin@8.60.1': + resolution: {integrity: sha512-JQ4S5GB0tfjO8BuJ4fcX+HodkzJjYBV+7OJ+wLygaX7OGQ7FudyHL4NSCA6ob+w3Yn+5MkKIozOwQhXeM7opVg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - '@typescript-eslint/parser': ^5.0.0 - eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true + '@typescript-eslint/parser': ^8.60.1 + eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 + typescript: '>=4.8.4 <6.1.0' - '@typescript-eslint/parser@5.62.0': - resolution: {integrity: sha512-VlJEV0fOQ7BExOsHYAGrgbEiZoi8D+Bl2+f6V2RrXerRSylnp+ZBHmPvaIa8cz0Ajx7WO7Z5RqfgYg7ED1nRhA==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + '@typescript-eslint/parser@8.60.1': + resolution: {integrity: sha512-A0M6ua6H252bVjPvvtSgl2QA4+ET9S5Mtkb2GDyTxIhH/C4qDItT7RQNO5PhMC6NXGYXOR9dIalcDDgBKT7oFA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true + eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 + typescript: '>=4.8.4 <6.1.0' - '@typescript-eslint/scope-manager@5.62.0': - resolution: {integrity: sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - - '@typescript-eslint/type-utils@5.62.0': - resolution: {integrity: sha512-xsSQreu+VnfbqQpW5vnCJdq1Z3Q0U31qiWmRhr98ONQmcp/yhiPJFPq8MXiJVLiksmOKSjIldZzkebzHuCGzew==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + '@typescript-eslint/project-service@8.60.1': + resolution: {integrity: sha512-eXkTH2bxmXlqD1RnOPmLZ9ZM9D3VwSx04JOwBnP9RQ+yUA5a2Mu7SfW8uaV2Aon53NJzZlZYuX7tn91Izf+xaw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - eslint: '*' - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true + typescript: '>=4.8.4 <6.1.0' - '@typescript-eslint/types@5.62.0': - resolution: {integrity: sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + '@typescript-eslint/scope-manager@8.60.1': + resolution: {integrity: sha512-gvI5OQoptnxQnchOirukCuQ55svJSTuD/4k5+pC267xyBtYry748R9/c3tYUzb/iE6RZfllRz2lVulLCHkTm4w==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/typescript-estree@5.62.0': - resolution: {integrity: sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + '@typescript-eslint/tsconfig-utils@8.60.1': + resolution: {integrity: sha512-nh8w4qAteiKuZu3pSSzG/yGKpw0OlkrKnzFmbVRenKaD4qc+7i1GrmZaLVkr8rk4uipiPGMOW4YsM6WmKZ5CvA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true + typescript: '>=4.8.4 <6.1.0' - '@typescript-eslint/utils@5.62.0': - resolution: {integrity: sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + '@typescript-eslint/type-utils@8.60.1': + resolution: {integrity: sha512-sdwTrpjosW7ANQYJ39ZBF1ZyEMEGVB2UsikrserVM/30a/F1dTLnu9bGxEdosugyu5caigjLrR2qiD11asjI1A==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 + typescript: '>=4.8.4 <6.1.0' - '@typescript-eslint/visitor-keys@5.62.0': - resolution: {integrity: sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + '@typescript-eslint/types@8.60.1': + resolution: {integrity: sha512-4h0tY8ppCkdCzcrl2YM5M3my0xsE1Tf8om3owEu5oPWmXwkKRmk0j0LGDzYBGUcAlesEbxBhazqu/K4cu3Ug7w==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@typescript-eslint/typescript-estree@8.60.1': + resolution: {integrity: sha512-alpRkfG8hlVE5kdJW2GkfgDgXxold3e8e4l6EnmhRmRLbekgAPCCGDVD++sABy9FcgPFroq+uFcCSM1vR57Cew==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '>=4.8.4 <6.1.0' + + '@typescript-eslint/utils@8.60.1': + resolution: {integrity: sha512-h2MPBLoNtjc3qZWfY3Tl51yPorQ2McHn8pJfcMNTcIvrrZrr90Ykffit0yjrPFWQcRcUxzH20+6OcVdW4yHtUg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 + typescript: '>=4.8.4 <6.1.0' + + '@typescript-eslint/visitor-keys@8.60.1': + resolution: {integrity: sha512-EbGRQg4FhrmwLodl+t3JNAnXHWVr9Vp+Zl1QBZVPY4ByfkzIT8cX3K6QWODHtkIZqqJVEWvhHSx3v5PDHsaQag==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@typespec/ts-http-runtime@0.3.5': resolution: {integrity: sha512-yURCknZhvywvQItHMMmFSo+fq5arCUIyz/CVk7jD89MSai7dkaX8ufjCWp3NttLojoTVbcE72ri+be/TnEbMHw==} @@ -963,15 +1139,15 @@ packages: resolution: {integrity: sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==} engines: {node: '>=6.5'} - accepts@1.3.8: - resolution: {integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==} + accepts@2.0.0: + resolution: {integrity: sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==} engines: {node: '>= 0.6'} - acorn-import-assertions@1.9.0: - resolution: {integrity: sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==} - deprecated: package has been renamed to acorn-import-attributes + acorn-import-phases@1.0.4: + resolution: {integrity: sha512-wKmbr/DDiIXzEOiWrTTUcDm24kQ2vGfZQvM2fwg2vXqR5uW6aapr7ObPtj1th32b9u90/Pf4AItvdTh42fBmVQ==} + engines: {node: '>=10.13.0'} peerDependencies: - acorn: ^8 + acorn: ^8.14.0 acorn-jsx@5.3.2: resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} @@ -999,6 +1175,14 @@ packages: ajv: optional: true + ajv-formats@3.0.1: + resolution: {integrity: sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==} + peerDependencies: + ajv: ^8.0.0 + peerDependenciesMeta: + ajv: + optional: true + ajv-keywords@3.5.2: resolution: {integrity: sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==} peerDependencies: @@ -1012,8 +1196,8 @@ packages: ajv@6.15.0: resolution: {integrity: sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==} - ajv@8.12.0: - resolution: {integrity: sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==} + ajv@8.18.0: + resolution: {integrity: sha512-PlXPeEWMXMZ7sPYOHqmDyCJzcfNrUr3fGNKtezX14ykXOEIvyK81d+qydx89KY5O71FKMPaQ2vBfBFI5NHR63A==} ajv@8.20.0: resolution: {integrity: sha512-Thbli+OlOj+iMPYFBVBfJ3OmCAnaSyNn4M1vz9T6Gka5Jt9ba/HIR56joy65tY6kx/FCF5VXNB819Y7/GUrBGA==} @@ -1074,12 +1258,8 @@ packages: resolution: {integrity: sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==} engines: {node: '>= 0.4'} - array-flatten@1.1.1: - resolution: {integrity: sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==} - - array-union@2.1.0: - resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} - engines: {node: '>=8'} + array-timsort@1.0.3: + resolution: {integrity: sha512-/+3GRL7dDAGEfM6TseQk/U+mi18TU2Ms9I3UlLdUMhz2hbvGNTKdj9xniwXfUqgYhHxRx0+8UnKkvlNwVU+cWQ==} arraybuffer.prototype.slice@1.0.4: resolution: {integrity: sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==} @@ -1098,6 +1278,10 @@ packages: asynckit@0.4.0: resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} + atomic-sleep@1.0.0: + resolution: {integrity: sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ==} + engines: {node: '>=8.0.0'} + available-typed-arrays@1.0.7: resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==} engines: {node: '>= 0.4'} @@ -1134,6 +1318,10 @@ packages: balanced-match@1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + balanced-match@4.0.4: + resolution: {integrity: sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==} + engines: {node: 18 || 20 || >=22} + base64-js@1.5.1: resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} @@ -1142,10 +1330,6 @@ packages: engines: {node: '>=6.0.0'} hasBin: true - binary-extensions@2.3.0: - resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} - engines: {node: '>=8'} - bl@4.1.0: resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==} @@ -1158,13 +1342,9 @@ packages: block-stream2@2.1.0: resolution: {integrity: sha512-suhjmLI57Ewpmq00qaygS8UgEq2ly2PCItenIyhMqVjo4t4pGzqMvfgJuX8iWTeSDdfSSqS6j38fL4ToNL7Pfg==} - body-parser@1.20.1: - resolution: {integrity: sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==} - engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} - - body-parser@1.20.2: - resolution: {integrity: sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==} - engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} + body-parser@2.2.2: + resolution: {integrity: sha512-oP5VkATKlNwcgvxi0vM0p/D3n2C3EReYVX+DNYs5TjZFn/oQt2j+4sVJtSMr18pdRr8wjTcBl6LoV+FUwzPmNA==} + engines: {node: '>=18'} brace-expansion@1.1.14: resolution: {integrity: sha512-MWPGfDxnyzKU7rNOW9SP/c50vi3xrmrua/+6hfPbCS2ABNWfx24vPidzvC7krjU/RTo235sV776ymlsMtGKj8g==} @@ -1172,6 +1352,10 @@ packages: brace-expansion@2.1.0: resolution: {integrity: sha512-TN1kCZAgdgweJhWWpgKYrQaMNHcDULHkWwQIspdtjV4Y5aurRdZpjAqn6yX3FPqTA9ngHCc4hJxMAMgGfve85w==} + brace-expansion@5.0.6: + resolution: {integrity: sha512-kLpxurY4Z4r9sgMsyG0Z9uzsBlgiU/EFKhj/h91/8yHu0edo7XuixOIH3VcJ8kkxs6/jPzoI6U9Vj3WqbMQ94g==} + engines: {node: 18 || 20 || >=22} + braces@3.0.3: resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} engines: {node: '>=8'} @@ -1252,12 +1436,12 @@ packages: resolution: {integrity: sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==} engines: {node: '>=10'} - chardet@0.7.0: - resolution: {integrity: sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==} + chardet@2.1.1: + resolution: {integrity: sha512-PsezH1rqdV9VvyNhxxOW32/d75r01NY7TQCmOqomRo15ZSOKbpTFVsfjghxo6JloQUCGnH4k1LGu0R4yCLlWQQ==} - chokidar@3.5.3: - resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==} - engines: {node: '>= 8.10.0'} + chokidar@4.0.3: + resolution: {integrity: sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==} + engines: {node: '>= 14.16.0'} chrome-trace-event@1.0.4: resolution: {integrity: sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==} @@ -1278,13 +1462,13 @@ packages: resolution: {integrity: sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==} engines: {node: '>=6'} - cli-table3@0.6.3: - resolution: {integrity: sha512-w5Jac5SykAeZJKntOxJCrm63Eg5/4dhMWIcuTbo9rpE+brgaSZo0RuNJZeOyMgsUdhDeojvgyQLmjI+K50ZGyg==} + cli-table3@0.6.5: + resolution: {integrity: sha512-+W/5efTR7y5HRD7gACw9yQjqMVvEMLBHmboM/kPWam+H+Hmyrgjh6YncVKK122YZkXrLudzTuAukUw9FnMf7IQ==} engines: {node: 10.* || >= 12.*} - cli-width@3.0.0: - resolution: {integrity: sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==} - engines: {node: '>= 10'} + cli-width@4.1.0: + resolution: {integrity: sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==} + engines: {node: '>= 12'} cliui@8.0.1: resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} @@ -1308,6 +1492,9 @@ packages: color-name@1.1.4: resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + colorette@2.0.20: + resolution: {integrity: sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==} + combined-stream@1.0.8: resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} engines: {node: '>= 0.8'} @@ -1323,6 +1510,10 @@ packages: resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==} engines: {node: '>= 6'} + comment-json@5.0.0: + resolution: {integrity: sha512-uiqLcOiVDJtBP8WGkZHEP+FZIhTzP1dxvn59EfoYUi9gqupjrBWVQkO2atDrbnKPwLeotFYDsuNb26uBMqB+hw==} + engines: {node: '>= 6'} + commist@3.2.0: resolution: {integrity: sha512-4PIMoPniho+LqXmpS5d3NuGYncG6XWlkBSVGiWycL22dd42OYdUGil2CWuzklaJoNxyxUSpO4MKIBU94viWNAw==} @@ -1332,48 +1523,52 @@ packages: concat-map@0.0.1: resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} - concat-stream@1.6.2: - resolution: {integrity: sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==} - engines: {'0': node >= 0.8} - concat-stream@2.0.0: resolution: {integrity: sha512-MWufYdFw53ccGjCA+Ol7XJYpAlW6/prSMzuPOTRnJGcGzuhLn4Scrz7qf6o8bROZ514ltazcIFJZevcfbo0x7A==} engines: {'0': node >= 6.0} - consola@2.15.3: - resolution: {integrity: sha512-9vAdYbHj6x2fLKC4+oPH0kFzY/orMZyG2Aj+kNylHxKGJ/Ed4dpNyAQYwJOdqO4zdM7XpVHmyejQDcQHrnuXbw==} + consola@3.4.2: + resolution: {integrity: sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA==} + engines: {node: ^14.18.0 || >=16.10.0} - content-disposition@0.5.4: - resolution: {integrity: sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==} - engines: {node: '>= 0.6'} + content-disposition@1.1.0: + resolution: {integrity: sha512-5jRCH9Z/+DRP7rkvY83B+yGIGX96OYdJmzngqnw2SBSxqCFPd0w2km3s5iawpGX8krnwSGmF0FW5Nhr0Hfai3g==} + engines: {node: '>=18'} content-type@1.0.5: resolution: {integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==} engines: {node: '>= 0.6'} + content-type@2.0.0: + resolution: {integrity: sha512-j/O/d7GcZCyNl7/hwZAb606rzqkyvaDctLmckbxLzHvFBzTJHuGEdodATcP3yIRoDrLHkIATJuvzbFlp/ki2cQ==} + engines: {node: '>=18'} + convert-source-map@2.0.0: resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} - cookie-signature@1.0.6: - resolution: {integrity: sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==} + cookie-signature@1.2.2: + resolution: {integrity: sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==} + engines: {node: '>=6.6.0'} - cookie@0.5.0: - resolution: {integrity: sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==} + cookie@0.7.2: + resolution: {integrity: sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==} engines: {node: '>= 0.6'} cookiejar@2.1.4: resolution: {integrity: sha512-LDx6oHrK+PhzLKJU9j5S7/Y3jM/mUHvD/DeI1WQmJn652iPC5Y4TBzC9l+5OMOXlyTTA+SmVUPm0HQUwpD5Jqw==} - core-util-is@1.0.3: - resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} - - cors@2.8.5: - resolution: {integrity: sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==} + cors@2.8.6: + resolution: {integrity: sha512-tJtZBBHA6vjIAaF6EnIaq6laBBP9aq/Y3ouVJjEfoHbRBcHBAHYcMh/w8LDrk2PvIMMq8gmopa5D4V8RmbrxGw==} engines: {node: '>= 0.10'} - cosmiconfig@7.1.0: - resolution: {integrity: sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==} - engines: {node: '>=10'} + cosmiconfig@8.3.6: + resolution: {integrity: sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==} + engines: {node: '>=14'} + peerDependencies: + typescript: '>=4.9.5' + peerDependenciesMeta: + typescript: + optional: true create-jest@29.7.0: resolution: {integrity: sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q==} @@ -1404,17 +1599,12 @@ packages: resolution: {integrity: sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==} engines: {node: '>= 0.4'} + dateformat@4.6.3: + resolution: {integrity: sha512-2P0p0pFGzHS5EMnhdxQi7aJN+iMheud0UhG4dlE1DLAlvL8JHjJJTX/CSm4JXwV0Ka5nGk3zC5mcb5bUQUxxMA==} + dayjs@1.11.20: resolution: {integrity: sha512-YbwwqR/uYpeoP4pu043q+LTDLFBLApUP6VxRihdfNTqu4ubqMlGDLd6ErXhEgsyvY0K6nCs7nggYumAN+9uEuQ==} - debug@2.6.9: - resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true - debug@4.4.3: resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==} engines: {node: '>=6.0'} @@ -1470,10 +1660,6 @@ packages: resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} engines: {node: '>= 0.8'} - destroy@1.2.0: - resolution: {integrity: sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==} - engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} - detect-newline@3.1.0: resolution: {integrity: sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==} engines: {node: '>=8'} @@ -1489,26 +1675,22 @@ packages: resolution: {integrity: sha512-X07nttJQkwkfKfvTPG/KSnE2OMdcUCao6+eXF3wmnIQRn2aPAHH3VxDbDOdegkd6JbPsXqShpvEOHfAT+nCNwQ==} engines: {node: '>=0.3.1'} - dir-glob@3.0.1: - resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} - engines: {node: '>=8'} - doctrine@3.0.0: resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} engines: {node: '>=6.0.0'} - dotenv-expand@10.0.0: - resolution: {integrity: sha512-GopVGCpVS1UKH75VKHGuQFqS1Gusej0z4FyQkPdwjil2gNIv+LNsqBlboOzpJFZKVT95GkCyWJbBSdFEFUWI2A==} - engines: {node: '>=12'} - - dotenv@16.1.4: - resolution: {integrity: sha512-m55RtE8AsPeJBpOIFKihEmqUcoVncQIwo7x9U8ZwLEZw9ZpXboz2c+rvog+jUaJvVrZ5kBOeYQBX5+8Aa/OZQw==} + dotenv-expand@12.0.3: + resolution: {integrity: sha512-uc47g4b+4k/M/SeaW1y4OApx+mtLWl92l5LMPP0GNXctZqELk+YGgOPIIC5elYmUH4OuoK3JLhuRUYegeySiFA==} engines: {node: '>=12'} dotenv@16.6.1: resolution: {integrity: sha512-uBq4egWHTcTt33a72vpSG0z3HnPuIl6NqYcTrKEg2azoEyl2hpW0zqlxysq2pK9HlDIHyHyakeYaYnSAwd8bow==} engines: {node: '>=12'} + dotenv@17.4.1: + resolution: {integrity: sha512-k8DaKGP6r1G30Lx8V4+pCsLzKr8vLmV2paqEj1Y55GdAgJuIqpRp5FfajGF8KtwMxCz9qJc6wUIJnm053d/WCw==} + engines: {node: '>=12'} + dunder-proto@1.0.1: resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} engines: {node: '>= 0.4'} @@ -1535,8 +1717,8 @@ packages: emoji-regex@9.2.2: resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} - encodeurl@1.0.2: - resolution: {integrity: sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==} + encodeurl@2.0.0: + resolution: {integrity: sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==} engines: {node: '>= 0.8'} end-of-stream@1.4.5: @@ -1565,8 +1747,8 @@ packages: resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} engines: {node: '>= 0.4'} - es-module-lexer@1.7.0: - resolution: {integrity: sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==} + es-module-lexer@2.1.0: + resolution: {integrity: sha512-n27zTYMjYu1aj4MjCWzSP7G9r75utsaoc8m61weK+W8JMBGGQybd43GstCXZ3WNmSFtGT9wi59qQTW6mhTR5LQ==} es-object-atoms@1.1.1: resolution: {integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==} @@ -1591,10 +1773,6 @@ packages: escape-html@1.0.3: resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==} - escape-string-regexp@1.0.5: - resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} - engines: {node: '>=0.8.0'} - escape-string-regexp@2.0.0: resolution: {integrity: sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==} engines: {node: '>=8'} @@ -1603,20 +1781,23 @@ packages: resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} engines: {node: '>=10'} - eslint-config-prettier@8.10.2: - resolution: {integrity: sha512-/IGJ6+Dka158JnP5n5YFMOszjDWrXggGz1LaK/guZq9vZTmniaKlHcsscvkAhn9y4U+BU3JuUdYvtAMcv30y4A==} + eslint-config-prettier@10.1.8: + resolution: {integrity: sha512-82GZUjRS0p/jganf6q1rEO25VSoHH0hKPCTrgillPjdI/3bgBhAE1QzHrHTizjpRvy6pGAvKjDJtk2pF9NDq8w==} hasBin: true peerDependencies: eslint: '>=7.0.0' - eslint-plugin-prettier@4.2.5: - resolution: {integrity: sha512-9Ni+xgemM2IWLq6aXEpP2+V/V30GeA/46Ar629vcMqVPodFFWC9skHu/D1phvuqtS8bJCFnNf01/qcmqYEwNfg==} - engines: {node: '>=12.0.0'} + eslint-plugin-prettier@5.5.6: + resolution: {integrity: sha512-ifetmTcxWfz+4qRW3pH/ujdTq2jQIj59AxJMIN26K5avYgU8dxycUETQonWiW+wPrYXA0j3Try0l1CnwVQtDqQ==} + engines: {node: ^14.18.0 || >=16.0.0} peerDependencies: - eslint: '>=7.28.0' - eslint-config-prettier: '*' - prettier: '>=2.0.0' + '@types/eslint': '>=8.0.0' + eslint: '>=8.0.0' + eslint-config-prettier: '>= 7.0.0 <10.0.0 || >=10.1.0' + prettier: '>=3.0.0' peerDependenciesMeta: + '@types/eslint': + optional: true eslint-config-prettier: optional: true @@ -1636,6 +1817,10 @@ packages: resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + eslint-visitor-keys@5.0.1: + resolution: {integrity: sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} + eslint@8.57.1: resolution: {integrity: sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -1683,10 +1868,6 @@ packages: resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==} engines: {node: '>=0.8.x'} - execa@4.1.0: - resolution: {integrity: sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA==} - engines: {node: '>=10'} - execa@5.1.1: resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} engines: {node: '>=10'} @@ -1699,13 +1880,12 @@ packages: resolution: {integrity: sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - express@4.18.2: - resolution: {integrity: sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==} - engines: {node: '>= 0.10.0'} + express@5.2.1: + resolution: {integrity: sha512-hIS4idWWai69NezIdRt2xFVofaF4j+6INOpJlVOLDO8zXGpUVEVzIYk12UUi2JzjEzWL3IOAxcTubgz9Po0yXw==} + engines: {node: '>= 18'} - external-editor@3.1.0: - resolution: {integrity: sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==} - engines: {node: '>=4'} + fast-copy@4.0.3: + resolution: {integrity: sha512-58apWr0GUiDFM8+3afrO6eYwJBn9ZAhDOzG3L+/9llab/haCARS2UIfffmOurYLwbgDRs8n0rfr6qAAPEAuAQw==} fast-deep-equal@3.1.3: resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} @@ -1713,10 +1893,6 @@ packages: fast-diff@1.3.0: resolution: {integrity: sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==} - fast-glob@3.3.3: - resolution: {integrity: sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==} - engines: {node: '>=8.6.0'} - fast-json-stable-stringify@2.1.0: resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} @@ -1743,14 +1919,23 @@ packages: fb-watchman@2.0.2: resolution: {integrity: sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==} - figures@3.2.0: - resolution: {integrity: sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==} - engines: {node: '>=8'} + fdir@6.5.0: + resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==} + engines: {node: '>=12.0.0'} + peerDependencies: + picomatch: ^3 || ^4 + peerDependenciesMeta: + picomatch: + optional: true file-entry-cache@6.0.1: resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} engines: {node: ^10.12.0 || >=12.0.0} + file-type@21.3.4: + resolution: {integrity: sha512-Ievi/yy8DS3ygGvT47PjSfdFoX+2isQueoYP1cntFW1JLYAuS4GD7NUPGg4zv2iZfV52uDyk5w5Z0TdpRS6Q1g==} + engines: {node: '>=20'} + fill-range@7.1.1: resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} engines: {node: '>=8'} @@ -1759,9 +1944,9 @@ packages: resolution: {integrity: sha512-8rXg1ZnX7xzy2NGDVkBVaAy+lSlPNwad13BtgSlLuxfIslyt5Vg64U7tFcCt4WS1R0hvtnQybT/IyCkGZ3DpXQ==} engines: {node: '>=0.10.0'} - finalhandler@1.2.0: - resolution: {integrity: sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==} - engines: {node: '>= 0.8'} + finalhandler@2.1.1: + resolution: {integrity: sha512-S8KoZgRZN+a5rNwqTxlZZePjT/4cnm0ROV70LedRHZ0p8u9fRID0hJUZQpkKLzro8LfmC8sx23bY6tVNxv8pQA==} + engines: {node: '>= 18.0.0'} find-up@4.1.0: resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} @@ -1786,9 +1971,9 @@ packages: resolution: {integrity: sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==} engines: {node: '>=14'} - fork-ts-checker-webpack-plugin@8.0.0: - resolution: {integrity: sha512-mX3qW3idpueT2klaQXBzrIM/pHw+T0B/V9KHEvNrqijTq9NFnMZU6oreVxDYcf33P8a5cW+67PjodNHthGnNVg==} - engines: {node: '>=12.13.0', yarn: '>=1.0.0'} + fork-ts-checker-webpack-plugin@9.1.0: + resolution: {integrity: sha512-mpafl89VFPJmhnJ1ssH+8wmM2b50n+Rew5x42NeI2U78aRWgtkEtGmctp7iT16UjquJTjorEmIfESj3DxdW84Q==} + engines: {node: '>=14.21.3'} peerDependencies: typescript: '>3.6.0' webpack: ^5.11.0 @@ -1804,9 +1989,9 @@ packages: resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==} engines: {node: '>= 0.6'} - fresh@0.5.2: - resolution: {integrity: sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==} - engines: {node: '>= 0.6'} + fresh@2.0.0: + resolution: {integrity: sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==} + engines: {node: '>= 0.8'} fs-extra@10.1.0: resolution: {integrity: sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==} @@ -1860,10 +2045,6 @@ packages: resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==} engines: {node: '>= 0.4'} - get-stream@5.2.0: - resolution: {integrity: sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==} - engines: {node: '>=8'} - get-stream@6.0.1: resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} engines: {node: '>=10'} @@ -1872,10 +2053,6 @@ packages: resolution: {integrity: sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==} engines: {node: '>= 0.4'} - glob-parent@5.1.2: - resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} - engines: {node: '>= 6'} - glob-parent@6.0.2: resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} engines: {node: '>=10.13.0'} @@ -1888,15 +2065,14 @@ packages: deprecated: Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me hasBin: true + glob@13.0.6: + resolution: {integrity: sha512-Wjlyrolmm8uDpm/ogGyXZXb1Z+Ca2B8NbJwqBVg0axK9GbBeoS7yGV6vjXnYdGm6X53iehEuxxbyiKp8QmN4Vw==} + engines: {node: 18 || 20 || >=22} + glob@7.2.3: resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} deprecated: Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me - glob@9.3.5: - resolution: {integrity: sha512-e1LleDykUz2Iu+MTYdkSsuWX8lvAjAcs0Xef0lNIu0S2wOAzuTxCJtcd9S3cijlwYF18EsU3rzb8jPVobxDh9Q==} - engines: {node: '>=16 || 14 >=14.17'} - deprecated: Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me - globals@13.24.0: resolution: {integrity: sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==} engines: {node: '>=8'} @@ -1905,10 +2081,6 @@ packages: resolution: {integrity: sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==} engines: {node: '>= 0.4'} - globby@11.1.0: - resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} - engines: {node: '>=10'} - gopd@1.2.0: resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} engines: {node: '>= 0.4'} @@ -1919,6 +2091,11 @@ packages: graphemer@1.4.0: resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} + handlebars@4.7.9: + resolution: {integrity: sha512-4E71E0rpOaQuJR2A3xDZ+GM1HyWYv1clR58tC8emQNeQe3RH7MAzSbat+V0wG78LQBo6m6bzSG/L4pBuCsgnUQ==} + engines: {node: '>=0.4.7'} + hasBin: true + has-bigints@1.1.0: resolution: {integrity: sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==} engines: {node: '>= 0.4'} @@ -1956,8 +2133,8 @@ packages: html-escaper@2.0.2: resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==} - http-errors@2.0.0: - resolution: {integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==} + http-errors@2.0.1: + resolution: {integrity: sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==} engines: {node: '>= 0.8'} http-proxy-agent@7.0.2: @@ -1968,10 +2145,6 @@ packages: resolution: {integrity: sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==} engines: {node: '>= 14'} - human-signals@1.1.1: - resolution: {integrity: sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==} - engines: {node: '>=8.12.0'} - human-signals@2.1.0: resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} engines: {node: '>=10.17.0'} @@ -1981,10 +2154,6 @@ packages: engines: {node: '>=18'} hasBin: true - iconv-lite@0.4.24: - resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} - engines: {node: '>=0.10.0'} - iconv-lite@0.6.3: resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} engines: {node: '>=0.10.0'} @@ -2000,6 +2169,10 @@ packages: resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} engines: {node: '>= 4'} + ignore@7.0.5: + resolution: {integrity: sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==} + engines: {node: '>= 4'} + import-fresh@3.3.1: resolution: {integrity: sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==} engines: {node: '>=6'} @@ -2020,22 +2193,10 @@ packages: inherits@2.0.4: resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} - inquirer@8.2.4: - resolution: {integrity: sha512-nn4F01dxU8VeKfq192IjLsxu0/OmMZ4Lg3xKAns148rCaXP6ntAoEkVYZThWjwON8AlzdZZi6oqnhNbxUG9hVg==} - engines: {node: '>=12.0.0'} - - inquirer@8.2.5: - resolution: {integrity: sha512-QAgPDQMEgrDssk1XiwwHoOGYF9BAbUcc1+j+FhEvaOt8/cKRqyLn0U5qA6F74fGhTMGxf92pOvPBeh29jQJDTQ==} - engines: {node: '>=12.0.0'} - internal-slot@1.1.0: resolution: {integrity: sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==} engines: {node: '>= 0.4'} - interpret@1.4.0: - resolution: {integrity: sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==} - engines: {node: '>= 0.10'} - ip-address@10.2.0: resolution: {integrity: sha512-/+S6j4E9AHvW9SWMSEY9Xfy66O5PWvVEJ08O0y5JGyEKQpojb0K0GKpz/v5HJ/G0vi3D2sjGK78119oXZeE0qA==} engines: {node: '>= 12'} @@ -2067,10 +2228,6 @@ packages: resolution: {integrity: sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==} engines: {node: '>= 0.4'} - is-binary-path@2.1.0: - resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} - engines: {node: '>=8'} - is-boolean-object@1.2.2: resolution: {integrity: sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==} engines: {node: '>= 0.4'} @@ -2144,6 +2301,9 @@ packages: resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} engines: {node: '>=8'} + is-promise@4.0.0: + resolution: {integrity: sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==} + is-property@1.0.2: resolution: {integrity: sha512-Ks/IoX00TtClbGQr4TWXemAnktAQvYB7HzcCxDGqEZU6oCmb2INHuOoKxbtR+HFkmYWBKv/dOZtGRiAjDhj92g==} @@ -2195,9 +2355,6 @@ packages: resolution: {integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==} engines: {node: '>=8'} - isarray@1.0.0: - resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} - isarray@2.0.5: resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} @@ -2368,6 +2525,10 @@ packages: node-notifier: optional: true + joycon@3.1.1: + resolution: {integrity: sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw==} + engines: {node: '>=10'} + js-md4@0.3.2: resolution: {integrity: sha512-/GDnfQYsltsjRswQhN9fhv3EMw2sCpUdrdxyWDOUK7eyD++r3gRhzgiQgc/x4MAv2i1iuQ4lxO5mvqM3vj4bwA==} @@ -2381,10 +2542,6 @@ packages: resolution: {integrity: sha512-PMSmkqxr106Xa156c2M265Z+FTrPl+oxd/rgOQy2tijQeK5TxQ43psO1ZCwhVOSdnn+RzkzlRz/eY4BgJBYVpg==} hasBin: true - js-yaml@4.1.0: - resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} - hasBin: true - js-yaml@4.1.1: resolution: {integrity: sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==} hasBin: true @@ -2420,8 +2577,8 @@ packages: engines: {node: '>=6'} hasBin: true - jsonc-parser@3.2.0: - resolution: {integrity: sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==} + jsonc-parser@3.3.1: + resolution: {integrity: sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ==} jsonfile@6.2.1: resolution: {integrity: sha512-zwOTdL3rFQ/lRdBnntKVOX6k5cKJwEc1HdilT71BWEu7J41gXIB2MRp+vxduPSwZJPWBxEzv4yH1wYLJGUHX4Q==} @@ -2454,6 +2611,10 @@ packages: lines-and-columns@1.2.4: resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} + load-esm@1.0.3: + resolution: {integrity: sha512-v5xlu8eHD1+6r8EHTg6hfmO97LN8ugKtiXcy5e6oN72iD2r6u0RPfLl6fxM+7Wnh2ZRq15o0russMst44WauPA==} + engines: {node: '>=13.2.0'} + loader-runner@4.3.2: resolution: {integrity: sha512-DFEqQ3ihfS9blba08cLfYf1NRAIEm+dDjic073DRDc3/JspI/8wYmtDsHwd3+4hwvdxSK7PGaElfTmm0awWJ4w==} engines: {node: '>=6.11.5'} @@ -2509,6 +2670,10 @@ packages: lru-cache@10.4.3: resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} + lru-cache@11.5.1: + resolution: {integrity: sha512-RPimw/7aMdv2oqRrxKwvZXcPfwBrn/JZ2xYcY9Hus/6LaS3VOAKVWKWgNLCFSiOm1ESXinjsDlidVU7JlnCN2A==} + engines: {node: 20 || >=22} + lru-cache@5.1.1: resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} @@ -2516,13 +2681,8 @@ packages: resolution: {integrity: sha512-DqC6n3QQ77zdFpCMASA1a3Jlb64Hv2N2DciFGkO/4L9+q/IpIAuRlKOvCXabtRW6cQf8usbmM6BE/TOPysCdIA==} engines: {bun: '>=1.0.0', deno: '>=1.30.0', node: '>=8.0.0'} - macos-release@2.5.1: - resolution: {integrity: sha512-DXqXhEM7gW59OjZO8NIjBCz9AQ1BEMrfiOAl4AYByHCtVHRF4KoGNO8mqQeM8lRCtQe/UnJ4imO/d2HdkKsd+A==} - engines: {node: '>=6'} - - magic-string@0.30.0: - resolution: {integrity: sha512-LA+31JYDJLs82r2ScLrlz1GjSgu66ZV518eyWT+S8VhyQn/JL0u9MeBOvQMGYiPk1DBiSN9DDMOcXvigJZaViQ==} - engines: {node: '>=12'} + magic-string@0.30.17: + resolution: {integrity: sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==} make-dir@4.0.0: resolution: {integrity: sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==} @@ -2542,20 +2702,21 @@ packages: resolution: {integrity: sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==} engines: {node: '>= 0.6'} + media-typer@1.1.0: + resolution: {integrity: sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==} + engines: {node: '>= 0.8'} + memfs@3.5.3: resolution: {integrity: sha512-UERzLsxzllchadvbPs5aolHh65ISpKpM+ccLbOJ8/vvpBKmAWf+la7dXFy7Mr0ySHbdHrFv5kGFCUHHe6GFEmw==} engines: {node: '>= 4.0.0'} - merge-descriptors@1.0.1: - resolution: {integrity: sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==} + merge-descriptors@2.0.0: + resolution: {integrity: sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g==} + engines: {node: '>=18'} merge-stream@2.0.0: resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} - merge2@1.4.1: - resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} - engines: {node: '>= 8'} - methods@1.1.2: resolution: {integrity: sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==} engines: {node: '>= 0.6'} @@ -2568,14 +2729,17 @@ packages: resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} engines: {node: '>= 0.6'} + mime-db@1.54.0: + resolution: {integrity: sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==} + engines: {node: '>= 0.6'} + mime-types@2.1.35: resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} engines: {node: '>= 0.6'} - mime@1.6.0: - resolution: {integrity: sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==} - engines: {node: '>=4'} - hasBin: true + mime-types@3.0.2: + resolution: {integrity: sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A==} + engines: {node: '>=18'} mime@2.6.0: resolution: {integrity: sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==} @@ -2586,13 +2750,13 @@ packages: resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} engines: {node: '>=6'} + minimatch@10.2.5: + resolution: {integrity: sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==} + engines: {node: 18 || 20 || >=22} + minimatch@3.1.5: resolution: {integrity: sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==} - minimatch@8.0.7: - resolution: {integrity: sha512-V+1uQNdzybxa14e/p00HZnQNNcTjnRJjDxg2V8wtkjFctq4M7hXFws4oekyTP0Jebeq7QYtpFyOeBAjc88zvYg==} - engines: {node: '>=16 || 14 >=14.17'} - minimatch@9.0.9: resolution: {integrity: sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==} engines: {node: '>=16 || 14 >=14.17'} @@ -2604,18 +2768,10 @@ packages: resolution: {integrity: sha512-xPrLjWkTT5E7H7VnzOjF//xBp9I40jYB4aWhb2xTFopXXfw+Wo82DDWngdUju7Doy3Wk7R8C4LAgwhLHHnf0wA==} engines: {node: ^16 || ^18 || >=20} - minipass@4.2.8: - resolution: {integrity: sha512-fNzuVyifolSLFL4NzpF+wEF4qrgqaaKX0haXPQEdQ7NKAN+WecoKMHV09YcuL/DHxrUsYQOK3MiuDf7Ip2OXfQ==} - engines: {node: '>=8'} - minipass@7.1.3: resolution: {integrity: sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==} engines: {node: '>=16 || 14 >=14.17'} - mkdirp@0.5.6: - resolution: {integrity: sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==} - hasBin: true - mqtt-packet@9.0.2: resolution: {integrity: sha512-MvIY0B8/qjq7bKxdN1eD+nrljoeaai+qjLJgfRn3TiMuz0pamsIWY2bFODPZMSNmabsLANXsLl4EMoWvlaTZWA==} @@ -2624,9 +2780,6 @@ packages: engines: {node: '>=16.0.0'} hasBin: true - ms@2.0.0: - resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==} - ms@2.1.3: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} @@ -2635,13 +2788,13 @@ packages: engines: {node: '>=10'} hasBin: true - multer@1.4.4-lts.1: - resolution: {integrity: sha512-WeSGziVj6+Z2/MwQo3GvqzgR+9Uc+qt8SwHKh3gvNPiISKfsMfG4SvCOFYlxxgkXt7yIV2i1yczehm0EOKIxIg==} - engines: {node: '>= 6.0.0'} - deprecated: Multer 1.x is impacted by a number of vulnerabilities, which have been patched in 2.x. You should upgrade to the latest 2.x version. + multer@2.1.1: + resolution: {integrity: sha512-mo+QTzKlx8R7E5ylSXxWzGoXoZbOsRMpyitcht8By2KHvMbf3tjwosZ/Mu/XYU6UuJ3VZnODIrak5ZrPiPyB6A==} + engines: {node: '>= 10.16.0'} - mute-stream@0.0.8: - resolution: {integrity: sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==} + mute-stream@2.0.0: + resolution: {integrity: sha512-WWdIxpyjEn+FhQJQQv9aQAYlHoNVdzIzUySNV1gHUPDSdZJ3yZn7pAAbQcV7B56Mvu881q9FZV+0Vx2xC44VWA==} + engines: {node: ^18.17.0 || >=20.5.0} mysql2@3.22.3: resolution: {integrity: sha512-uWWxvZSRvRhtBdh2CdcuK83YcOfPdmEeEYB069bAmPnV93QApDGVPuvCQOLjlh7tYHEWdgQPrn6kosDxHBVLkA==} @@ -2656,14 +2809,11 @@ packages: native-duplexpair@1.0.0: resolution: {integrity: sha512-E7QQoM+3jvNtlmyfqRZ0/U75VFgCls+fSkbml2MpgWkWyz3ox8Y58gNhfuziuQYGNNQAbFZJQck55LHCnCK6CA==} - natural-compare-lite@1.4.0: - resolution: {integrity: sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==} - natural-compare@1.4.0: resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} - negotiator@0.6.3: - resolution: {integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==} + negotiator@1.0.0: + resolution: {integrity: sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==} engines: {node: '>= 0.6'} neo-async@2.6.2: @@ -2675,21 +2825,21 @@ packages: '@nestjs/common': '>=9.0.0' '@nestjs/core': '>=9.0.0' + nestjs-pino@4.6.1: + resolution: {integrity: sha512-nuARXa0xpdJ1lY2+fgycIQr6H3g0VgqAWNK3xMYjOFcj2DoPETNXj0lV3Y86nRuI7BUfQp5PGiVoZvT4dTWbpQ==} + engines: {node: '>= 14'} + peerDependencies: + '@nestjs/common': ^8.0.0 || ^9.0.0 || ^10.0.0 || ^11.0.0 + pino: ^7.5.0 || ^8.0.0 || ^9.0.0 || ^10.0.0 + pino-http: ^6.4.0 || ^7.0.0 || ^8.0.0 || ^9.0.0 || ^10.0.0 || ^11.0.0 + rxjs: ^7.1.0 + node-abort-controller@3.1.1: resolution: {integrity: sha512-AGK2yQKIjRuqnc6VkX2Xj5d+QW8xZ87pa1UK6yA6ouUyuxfHuMP6umE5QK7UmTeOAymo+Zx1Fxiuw9rVx8taHQ==} node-emoji@1.11.0: resolution: {integrity: sha512-wo2DpQkQp7Sjm2A0cq+sN7EHKO6Sl0ctXeBdFZrL9T9+UywORbufTcTZxom8YqpLQt/FqNMUkOpkZrJVYSKD3A==} - node-fetch@2.7.0: - resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==} - engines: {node: 4.x || >=6.0.0} - peerDependencies: - encoding: ^0.1.0 - peerDependenciesMeta: - encoding: - optional: true - node-int64@0.4.0: resolution: {integrity: sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==} @@ -2723,6 +2873,10 @@ packages: resolution: {integrity: sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==} engines: {node: '>= 0.4'} + on-exit-leak-free@2.1.2: + resolution: {integrity: sha512-0eJJY6hXLGf1udHwfNftBqH+g73EU4B504nZeKpz1sYRKafAghwxEJunB2O7rDZkL4PGfsMVnTXZ2EjibbqcsA==} + engines: {node: '>=14.0.0'} + on-finished@2.4.1: resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==} engines: {node: '>= 0.8'} @@ -2750,14 +2904,6 @@ packages: resolution: {integrity: sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==} engines: {node: '>=10'} - os-name@4.0.1: - resolution: {integrity: sha512-xl9MAoU97MH1Xt5K9ERft2YfCAoaO6msy1OBA0ozxEC0x0TmIoE6K3QvgJMMZA9yKGLmHXNY/YZoDbiGDj4zYw==} - engines: {node: '>=10'} - - os-tmpdir@1.0.2: - resolution: {integrity: sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==} - engines: {node: '>=0.10.0'} - own-keys@1.0.1: resolution: {integrity: sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==} engines: {node: '>= 0.4'} @@ -2816,14 +2962,12 @@ packages: resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==} engines: {node: '>=16 || 14 >=14.18'} - path-to-regexp@0.1.7: - resolution: {integrity: sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==} + path-scurry@2.0.2: + resolution: {integrity: sha512-3O/iVVsJAPsOnpwWIeD+d6z/7PmqApyQePUtCndjatj/9I5LylHvt5qluFaBT3I5h3r1ejfR056c+FCv+NnNXg==} + engines: {node: 18 || 20 || >=22} - path-to-regexp@3.2.0: - resolution: {integrity: sha512-jczvQbCUS7XmS7o+y1aEO9OBVFeZBQ1MDSEqmO7xSoPgOPoowY/SxLpZ6Vh97/8qHZOteiCKb7gkG9gA2ZUxJA==} - - path-to-regexp@3.3.0: - resolution: {integrity: sha512-qyCH421YQPS2WFDxDjftfc1ZR5WKQzVzqsp4n9M2kQhVOo/ByahFoUNJfl58kOcEGfQ//7weFTDhm+ss8Ecxgw==} + path-to-regexp@8.4.2: + resolution: {integrity: sha512-qRcuIdP69NPm4qbACK+aDogI5CBDMi1jKe0ry5rSQJz8JVLsC7jV8XpiJjGRLLol3N+R5ihGYcrPLTno6pAdBA==} path-type@4.0.0: resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} @@ -2836,6 +2980,32 @@ packages: resolution: {integrity: sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==} engines: {node: '>=8.6'} + picomatch@4.0.4: + resolution: {integrity: sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==} + engines: {node: '>=12'} + + pino-abstract-transport@3.0.0: + resolution: {integrity: sha512-wlfUczU+n7Hy/Ha5j9a/gZNy7We5+cXp8YL+X+PG8S0KXxw7n/JXA3c46Y0zQznIJ83URJiwy7Lh56WLokNuxg==} + + pino-http@11.0.0: + resolution: {integrity: sha512-wqg5XIAGRRIWtTk8qPGxkbrfiwEWz1lgedVLvhLALudKXvg1/L2lTFgTGPJ4Z2e3qcRmxoFxDuSdMdMGNM6I1g==} + + pino-loki@3.0.0: + resolution: {integrity: sha512-9TyUW5syTjp2nT70QcijJtIWUzdYUj+olQ7+fWNfm1/HrDGEWt86Q4ACzClH6DM6GBwtQimRDgneNczP+p4ypA==} + engines: {node: '>=20'} + hasBin: true + + pino-pretty@13.1.3: + resolution: {integrity: sha512-ttXRkkOz6WWC95KeY9+xxWL6AtImwbyMHrL1mSwqwW9u+vLp/WIElvHvCSDg0xO/Dzrggz1zv3rN5ovTRVowKg==} + hasBin: true + + pino-std-serializers@7.1.0: + resolution: {integrity: sha512-BndPH67/JxGExRgiX1dX0w1FvZck5Wa4aal9198SrRhZjH3GxKQUKIBnYJTdj2HDN3UQAS06HlfcSbQj2OHmaw==} + + pino@10.3.1: + resolution: {integrity: sha512-r34yH/GlQpKZbU1BvFFqOjhISRo1MNx1tWYsYvmj6KIRHSPMT2+yHOEb1SG6NMvRoHRF0a07kCOox/9yakl1vg==} + hasBin: true + pirates@4.0.7: resolution: {integrity: sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==} engines: {node: '>= 6'} @@ -2860,9 +3030,9 @@ packages: resolution: {integrity: sha512-SxToR7P8Y2lWmv/kTzVLC1t/GDI2WGjMwNhLLE9qtH8Q13C+aEmuRlzDst4Up4s0Wc8sF2M+J57iB3cMLqftfg==} engines: {node: '>=6.0.0'} - prettier@2.8.8: - resolution: {integrity: sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==} - engines: {node: '>=10.13.0'} + prettier@3.8.3: + resolution: {integrity: sha512-7igPTM53cGHMW8xWuVTydi2KO233VFiTNyF5hLJqpilHfmn8C8gPf+PS7dUT64YcXFbiMGZxS9pCSxL/Dxm/Jw==} + engines: {node: '>=14'} hasBin: true pretty-format@29.7.0: @@ -2872,6 +3042,9 @@ packages: process-nextick-args@2.0.1: resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} + 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==} engines: {node: '>= 0.6.0'} @@ -2894,10 +3067,6 @@ packages: pure-rand@6.1.0: resolution: {integrity: sha512-bVWawvoZoBYpp6yIoQtQXHZjmz35RSVHnUOTefl8Vcjr8snTPY1wnpSPMWekcFwbxI6gtmT7rSYPFvz71ldiOA==} - qs@6.11.0: - resolution: {integrity: sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==} - engines: {node: '>=0.6'} - qs@6.15.1: resolution: {integrity: sha512-6YHEFRL9mfgcAvql/XhwTvf5jKcOiiupt2FiJxHkiX1z4j7WL8J/jRHYLluORvc1XxB5rV20KoeK00gVJamspg==} engines: {node: '>=0.6'} @@ -2909,24 +3078,20 @@ packages: queue-microtask@1.2.3: resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + quick-format-unescaped@4.0.4: + resolution: {integrity: sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg==} + range-parser@1.2.1: resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==} engines: {node: '>= 0.6'} - raw-body@2.5.1: - resolution: {integrity: sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==} - engines: {node: '>= 0.8'} - - raw-body@2.5.2: - resolution: {integrity: sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==} - engines: {node: '>= 0.8'} + raw-body@3.0.2: + resolution: {integrity: sha512-K5zQjDllxWkf7Z5xJdV0/B0WTNqx6vxG70zJE4N0kBs4LovmEYWJzQGxC9bS9RAKu3bgM40lrd5zoLJ12MQ5BA==} + engines: {node: '>= 0.10'} react-is@18.3.1: resolution: {integrity: sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==} - readable-stream@2.3.8: - resolution: {integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==} - readable-stream@3.6.2: resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} engines: {node: '>= 6'} @@ -2935,13 +3100,16 @@ packages: resolution: {integrity: sha512-oIGGmcpTLwPga8Bn6/Z75SVaH1z5dUut2ibSyAMVhmUggWpmDn2dapB0n7f8nwaSiRtepAsfJyfXIO5DCVAODg==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - readdirp@3.6.0: - resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} - engines: {node: '>=8.10.0'} + readdirp@4.1.2: + resolution: {integrity: sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==} + engines: {node: '>= 14.18.0'} - rechoir@0.6.2: - resolution: {integrity: sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==} - engines: {node: '>= 0.10'} + real-require@0.2.0: + resolution: {integrity: sha512-57frrGM/OCTLqLOAh0mhVA9VBMHd+9U7Zb2THMGdBUoZVOtGbJzjxsYGDJ3A9AYYCP4hn6y1TVbaOfzWtm5GFg==} + engines: {node: '>= 12.13.0'} + + real-require@1.0.0: + resolution: {integrity: sha512-P4nbQYQfePJxRSmY+v/KINxVucm4NF3p3s7pJveMTtom52FR4YGltUQLB8idDXwDDWW+eYrWDFbuzUnjoWHF7g==} reflect-metadata@0.1.14: resolution: {integrity: sha512-ZhYeb6nRaXCfhnndflDK8qI6ZQ/YcWZCISRAWICW9XYqMUwjZM9Z0DveWX/ABN01oxSHwVxKQmxeYZSsm0jh5A==} @@ -3006,14 +3174,9 @@ packages: deprecated: Rimraf versions prior to v4 are no longer supported hasBin: true - rimraf@4.4.1: - resolution: {integrity: sha512-Gk8NlF062+T9CqNGn6h4tls3k6T1+/nXdOcSZVikNVtlRdYpA7wRJJMoXmuvOnLW844rPjdQ7JgXCYM6PPC/og==} - engines: {node: '>=14'} - hasBin: true - - run-async@2.4.1: - resolution: {integrity: sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==} - engines: {node: '>=0.12.0'} + router@2.2.0: + resolution: {integrity: sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ==} + engines: {node: '>= 18'} run-parallel@1.2.0: resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} @@ -3028,9 +3191,6 @@ packages: resolution: {integrity: sha512-wtZlHyOje6OZTGqAoaDKxFkgRtkF9CnHAVnCHKfuj200wAgL+bSJhdsCD2l0Qx/2ekEXjPWcyKkfGb5CPboslg==} engines: {node: '>=0.4'} - safe-buffer@5.1.2: - resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} - safe-buffer@5.2.1: resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} @@ -3042,6 +3202,10 @@ packages: resolution: {integrity: sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==} engines: {node: '>= 0.4'} + safe-stable-stringify@2.5.0: + resolution: {integrity: sha512-b3rppTKm9T+PsVCBEOUR46GWI7fdOs00VKZ1+9c1EWDaDMvjQc6tUwuFyIprgGgTcWoVHSKrU8H31ZHA2e0RHA==} + engines: {node: '>=10'} + safer-buffer@2.1.2: resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} @@ -3057,6 +3221,9 @@ packages: resolution: {integrity: sha512-eflK8wEtyOE6+hsaRVPxvUKYCpRgzLqDTb8krvAsRIwOGlHoSgYLgBXoubGgLd2fT41/OUYdb48v4k4WWHQurA==} engines: {node: '>= 10.13.0'} + secure-json-parse@4.1.0: + resolution: {integrity: sha512-l4KnYfEyqYJxDwlNVyRfO2E4NTHfMKAWdUuA8J0yve2Dz/E/PdBepY03RvyJpssIpRFwJoCD55wA+mEDs6ByWA==} + semver@6.3.1: resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} hasBin: true @@ -3071,13 +3238,13 @@ packages: engines: {node: '>=10'} hasBin: true - send@0.18.0: - resolution: {integrity: sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==} - engines: {node: '>= 0.8.0'} + send@1.2.1: + resolution: {integrity: sha512-1gnZf7DFcoIcajTjTwjwuDjzuz4PPcY2StKPlsGAQ1+YH20IRVrBaXSWmdjowTJ6u8Rc01PoYOGHXfP1mYcZNQ==} + engines: {node: '>= 18'} - serve-static@1.15.0: - resolution: {integrity: sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==} - engines: {node: '>= 0.8.0'} + serve-static@2.2.1: + resolution: {integrity: sha512-xRXBn0pPqQTVQiC8wyQrKs2MOlX24zQ0POGaj0kultvoOCstBQM5yvOhAVSUwOMjQtTvsPWoNCHfPGwaaQJhTw==} + engines: {node: '>= 18'} set-function-length@1.2.2: resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} @@ -3107,11 +3274,6 @@ packages: resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} engines: {node: '>=8'} - shelljs@0.8.5: - resolution: {integrity: sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==} - engines: {node: '>=4'} - hasBin: true - side-channel-list@1.0.1: resolution: {integrity: sha512-mjn/0bi/oUURjc5Xl7IaWi/OJJJumuoJFQJfDDyO46+hBWsfaVM65TBHq2eoZBhzl9EchxOijpkbRC8SVBQU0w==} engines: {node: '>= 0.4'} @@ -3150,6 +3312,9 @@ packages: resolution: {integrity: sha512-LJhUYUvItdQ0LkJTmPeaEObWXAqFyfmP85x0tch/ez9cahmhlBBLbIqDFnvBnUJGagb0JbIQrkBs1wJ+yRYpEw==} engines: {node: '>= 10.0.0', npm: '>= 3.0.0'} + sonic-boom@4.2.1: + resolution: {integrity: sha512-w6AxtubXa2wTXAUsZMMWERrsIRAdrK0Sc+FUytWvYAhBJLyuI4llrMIC1DtlNSdI99EI86KZum2MMq3EAZlF9Q==} + source-map-support@0.5.13: resolution: {integrity: sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==} @@ -3194,8 +3359,8 @@ packages: resolution: {integrity: sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==} engines: {node: '>=10'} - statuses@2.0.1: - resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==} + statuses@2.0.2: + resolution: {integrity: sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==} engines: {node: '>= 0.8'} stop-iteration-iterator@1.1.0: @@ -3238,9 +3403,6 @@ packages: resolution: {integrity: sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==} engines: {node: '>= 0.4'} - string_decoder@1.1.1: - resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==} - string_decoder@1.3.0: resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} @@ -3268,9 +3430,17 @@ packages: resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} engines: {node: '>=8'} + strip-json-comments@5.0.3: + resolution: {integrity: sha512-1tB5mhVo7U+ETBKNf92xT4hrQa3pm0MZ0PQvuDnWgAAGHDsfp4lPSpiS6psrSiet87wyGPh9ft6wmhOMQ0hDiw==} + engines: {node: '>=14.16'} + strnum@1.1.2: resolution: {integrity: sha512-vrN+B7DBIoTTZjnPNewwhx6cBA/H+IS7rfW68n7XxC1y7uoiGQBxaKzqucGUgavX15dJgiGztLJ8vxuEzwqBdA==} + strtok3@10.3.5: + resolution: {integrity: sha512-ki4hZQfh5rX0QDLLkOCj+h+CVNkqmp/CMf8v8kZpkNVK6jGQooMytqzLZYUVYIZcFZ6yDB70EfD8POcFXiF5oA==} + engines: {node: '>=18'} + superagent@8.1.2: resolution: {integrity: sha512-6WTxW1EB6yCxV5VFOIPQruWGHqc3yI7hEmZK6h+pyk69Lk/Ut7rLUY6W/ONF2MjBuGjvmMiIpsrVJ2vjrHlslA==} engines: {node: '>=6.4.0 <13 || >=14'} @@ -3297,13 +3467,17 @@ packages: resolution: {integrity: sha512-/fkkhavXPE57zRRCjNqAP3txRCSncpMx3NnNZL7iEoyAtYwUjPhJxW6FQTQPG5UPEmCrbFoXS10C3YdJlW7PDg==} engines: {node: '>=4.x'} - swagger-ui-dist@5.17.14: - resolution: {integrity: sha512-CVbSfaLpstV65OnSjbXfVd6Sta3q3F7Cj/yYuvHMp1P90LztOLs6PfUnKEVAeiIVQt9u2SaPwv0LiH/OyMjHRw==} + swagger-ui-dist@5.32.6: + resolution: {integrity: sha512-75ttZNaYCLoFPnozPZcTUU6mS3wKT8l7WLjU5zJSHFeJa23i5vtnze6IiCl4jDMPeQTXVXIgovq4M11NNfQvSA==} symbol-observable@4.0.0: resolution: {integrity: sha512-b19dMThMV4HVFynSAM1++gBHAbk2Tc/osgLIBZMKsyqh34jb2e8Os7T6ZW/Bt3pJFdBTd2JwAnAAEQV7rSNvcQ==} engines: {node: '>=0.10'} + synckit@0.11.13: + resolution: {integrity: sha512-eNRKgb3z66Yp3D2CixVujOUvXLFUTij/zVnV8KRyvFdQwpz7I5DS8UfRkTeLzb64u+dkzDSdelE24izu+zSSUg==} + engines: {node: ^14.18.0 || >=16.0.0} + tapable@2.3.3: resolution: {integrity: sha512-uxc/zpqFg6x7C8vOE7lh6Lbda8eEL9zmVm/PLeTPBRhh1xCgdWaQ+J1CUieGpIfm2HdtsUpRv+HshiasBMcc6A==} engines: {node: '>=6'} @@ -3344,18 +3518,19 @@ packages: text-table@0.2.0: resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} + thread-stream@4.2.0: + resolution: {integrity: sha512-e2zZ96wSChazBsbENf/Pcm/4swHt2cEKQ92rhUjkL9GCKiTDJIaTBenjE/m9DXi0QBmTMDkFDdOomUy20A1tDQ==} + engines: {node: '>=20'} + through2@4.0.2: resolution: {integrity: sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==} - through@2.3.8: - resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==} - tiny-inflate@1.0.3: resolution: {integrity: sha512-pkY1fj1cKHb2seWDy0B16HeWyczlJA9/WW3u3c4z/NiWDsO3DOU5D7nhTLE9CF0yXv/QZFY7sEJmj24dK+Rrqw==} - tmp@0.0.33: - resolution: {integrity: sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==} - engines: {node: '>=0.6.0'} + tinyglobby@0.2.17: + resolution: {integrity: sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==} + engines: {node: '>=12.0.0'} tmpl@1.0.5: resolution: {integrity: sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==} @@ -3372,33 +3547,42 @@ packages: resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} engines: {node: '>=0.6'} - tr46@0.0.3: - resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} + token-types@6.1.2: + resolution: {integrity: sha512-dRXchy+C0IgK8WPC6xvCHFRIWYUbqqdEIKPaKo/AcTUNzwLTK6AH7RjdLWsEZcAN/TBdtfUw3PYEgPr5VPr6ww==} + engines: {node: '>=14.16'} - tree-kill@1.2.2: - resolution: {integrity: sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==} - hasBin: true + ts-api-utils@2.5.0: + resolution: {integrity: sha512-OJ/ibxhPlqrMM0UiNHJ/0CKQkoKF243/AEmplt3qpRgkW8VG7IfOS41h7V8TjITqdByHzrjcS/2si+y4lIh8NA==} + engines: {node: '>=18.12'} + peerDependencies: + typescript: '>=4.8.4' - ts-jest@29.0.3: - resolution: {integrity: sha512-Ibygvmuyq1qp/z3yTh9QTwVVAbFdDy/+4BtIQR2sp6baF2SJU/8CKK/hhnGIDY2L90Az2jIqTwZPnN2p+BweiQ==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + ts-jest@29.4.11: + resolution: {integrity: sha512-IrFl7l9AuB/qrNw5quqvAv/hmKMb8dhWOH4jQOGo0Oq8tCeo1O86/iTFG1FaRimgUkF13l4PcepO8ATFT6Ns4g==} + engines: {node: ^14.15.0 || ^16.10.0 || ^18.0.0 || >=20.0.0} hasBin: true peerDependencies: '@babel/core': '>=7.0.0-beta.0 <8' - '@jest/types': ^29.0.0 - babel-jest: ^29.0.0 + '@jest/transform': ^29.0.0 || ^30.0.0 + '@jest/types': ^29.0.0 || ^30.0.0 + babel-jest: ^29.0.0 || ^30.0.0 esbuild: '*' - jest: ^29.0.0 - typescript: '>=4.3' + jest: ^29.0.0 || ^30.0.0 + jest-util: ^29.0.0 || ^30.0.0 + typescript: '>=4.3 <7' peerDependenciesMeta: '@babel/core': optional: true + '@jest/transform': + optional: true '@jest/types': optional: true babel-jest: optional: true esbuild: optional: true + jest-util: + optional: true ts-loader@9.5.7: resolution: {integrity: sha512-/ZNrKgA3K3PtpMYOC71EeMWIloGw3IYEa5/t1cyz2r5/PyUwTXGzYJvcD3kfUvmhlfpz1rhV8B2O6IVTQ0avsg==} @@ -3421,8 +3605,8 @@ packages: '@swc/wasm': optional: true - tsconfig-paths-webpack-plugin@4.0.1: - resolution: {integrity: sha512-m5//KzLoKmqu2MVix+dgLKq70MnFi8YL8sdzQZ6DblmCdfuq/y3OqvJd5vMndg2KEVCOeNz8Es4WVZhYInteLw==} + tsconfig-paths-webpack-plugin@4.2.0: + resolution: {integrity: sha512-zbem3rfRS8BgeNK50Zz5SIQgXzLafiHjOwUAvk/38/o1jHn/V5QAgVUcz884or7WYcPaH3N2CIfUc2u0ul7UcA==} engines: {node: '>=10.13.0'} tsconfig-paths@4.1.1: @@ -3433,21 +3617,9 @@ packages: resolution: {integrity: sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg==} engines: {node: '>=6'} - tslib@1.14.1: - resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==} - - tslib@2.5.3: - resolution: {integrity: sha512-mSxlJJwl3BMEQCUNnxXBU9jP4JBktcEGhURcPR6VQVlnP0FdDEsIaz0C35dXNGLyRfrATNofF0F5p2KPxQgB+w==} - tslib@2.8.1: resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} - tsutils@3.21.0: - resolution: {integrity: sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==} - engines: {node: '>= 6'} - peerDependencies: - typescript: '>=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta' - type-check@0.4.0: resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} engines: {node: '>= 0.8.0'} @@ -3464,10 +3636,18 @@ packages: resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==} engines: {node: '>=10'} + type-fest@4.41.0: + resolution: {integrity: sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==} + engines: {node: '>=16'} + type-is@1.6.18: resolution: {integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==} engines: {node: '>= 0.6'} + type-is@2.1.0: + resolution: {integrity: sha512-faYHw0anBbc/kWF3zFTEnxSFOAGUX9GFbOBthvDdLsIlEoWOFOtS0zgCiQYwIskL9iGXZL3kAXD8OoZ4GmMATA==} + engines: {node: '>= 18'} + typed-array-buffer@1.0.3: resolution: {integrity: sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==} engines: {node: '>= 0.4'} @@ -3542,19 +3722,31 @@ packages: typeorm-aurora-data-api-driver: optional: true - typescript@4.9.5: - resolution: {integrity: sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==} - engines: {node: '>=4.2.0'} + typescript@5.9.3: + resolution: {integrity: sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==} + engines: {node: '>=14.17'} + hasBin: true + + uglify-js@3.19.3: + resolution: {integrity: sha512-v3Xu+yuwBXisp6QYTcH4UbH+xYJXqnq2m/LtQVWKWzYc1iehYnLixoQDN9FH6/j9/oybfd6W9Ghwkl8+UMKTKQ==} + engines: {node: '>=0.8.0'} hasBin: true uid@2.0.2: resolution: {integrity: sha512-u3xV3X7uzvi5b1MncmZo3i2Aw222Zk1keqLA1YkHldREkAhAqi65wuPfe7lHx8H/Wzy+8CE7S7uS3jekIM5s8g==} engines: {node: '>=8'} + uint8array-extras@1.5.0: + resolution: {integrity: sha512-rvKSBiC5zqCCiDZ9kAOszZcDvdAHwwIKJG33Ykj43OKcWsnmcBRL09YTU4nOeHZ8Y2a7l1MgTd08SBe9A8Qj6A==} + engines: {node: '>=18'} + unbox-primitive@1.1.0: resolution: {integrity: sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==} engines: {node: '>= 0.4'} + undici-types@6.21.0: + resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==} + universalify@2.0.1: resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==} engines: {node: '>= 10.0.0'} @@ -3578,10 +3770,6 @@ packages: util@0.12.5: resolution: {integrity: sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==} - utils-merge@1.0.1: - resolution: {integrity: sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==} - engines: {node: '>= 0.4.0'} - uuid@11.1.1: resolution: {integrity: sha512-vIYxrBCC/N/K+Js3qSN88go7kIfNPssr/hHCesKCQNAjmgvYS2oqr69kIufEG+O4+PfezOH4EbIeHCfFov8ZgQ==} hasBin: true @@ -3591,11 +3779,6 @@ packages: deprecated: uuid@10 and below is no longer supported. For ESM codebases, update to uuid@latest. For CommonJS codebases, use uuid@11 (but be aware this version will likely be deprecated in 2028). hasBin: true - uuid@9.0.0: - resolution: {integrity: sha512-MXcSTerfPa4uqyzStbRoTgt5XIe3x5+42+q1sDuy3R5MDk66URdLMOZe5aPX/SQd+kuYAh0FdP/pO28IkQyTeg==} - deprecated: uuid@10 and below is no longer supported. For ESM codebases, update to uuid@latest. For CommonJS codebases, use uuid@11 (but be aware this version will likely be deprecated in 2028). - hasBin: true - v8-compile-cache-lib@3.0.1: resolution: {integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==} @@ -3620,9 +3803,6 @@ packages: web-encoding@1.1.5: resolution: {integrity: sha512-HYLeVCdJ0+lBYV2FvNZmv3HJ2Nt0QYXqZojk3d9FJOLkwnuhzM9tmamh8d7HPM8QqjKH8DeHkFTx+CFlWpZZDA==} - webidl-conversions@3.0.1: - resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} - webpack-node-externals@3.0.0: resolution: {integrity: sha512-LnL6Z3GGDPht/AigwRh2dvL9PQPFQ8skEpVrWZXLWBYmqcaojHNN0onvHzie6rq7EWKrrBfPYqNEzTJgiwEQDQ==} engines: {node: '>=6'} @@ -3631,8 +3811,8 @@ packages: resolution: {integrity: sha512-eACpxRN02yaawnt+uUNIF7Qje6A9zArxBbcAJjK1PK3S9Ycg5jIuJ8pW4q8EMnwNZCEGltcjkRx1QzOxOkKD8A==} engines: {node: '>=10.13.0'} - webpack@5.82.1: - resolution: {integrity: sha512-C6uiGQJ+Gt4RyHXXYt+v9f+SN1v83x68URwgxNQ98cvH8kxiuywWGP4XeNZ1paOzZ63aY3cTciCEQJNFUljlLw==} + webpack@5.106.0: + resolution: {integrity: sha512-Pkx5joZ9RrdgO5LBkyX1L2ZAJeK/Taz3vqZ9CbcP0wS5LEMx5QkKsEwLl29QJfihZ+DKRBFldzy1O30pJ1MDpA==} engines: {node: '>=10.13.0'} hasBin: true peerDependencies: @@ -3641,9 +3821,6 @@ packages: webpack-cli: optional: true - whatwg-url@5.0.0: - resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} - which-boxed-primitive@1.1.1: resolution: {integrity: sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==} engines: {node: '>= 0.4'} @@ -3669,14 +3846,13 @@ packages: engines: {node: '>= 8'} hasBin: true - windows-release@4.0.0: - resolution: {integrity: sha512-OxmV4wzDKB1x7AZaZgXMVsdJ1qER1ed83ZrTYd5Bwq2HfJVg3DJS8nqlAG4sMoJ7mu8cuRmLEYyU13BKwctRAg==} - engines: {node: '>=10'} - word-wrap@1.2.5: resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} engines: {node: '>=0.10.0'} + wordwrap@1.0.0: + resolution: {integrity: sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==} + worker-factory@7.0.49: resolution: {integrity: sha512-lW7tpgy6aUv2dFsQhv1yv+XFzdkCf/leoKRTGMPVK5/die6RrUjqgJHJf556qO+ZfytNG6wPXc17E8zzsOLUDw==} @@ -3689,6 +3865,10 @@ packages: worker-timers@8.0.31: resolution: {integrity: sha512-ngkq5S6JuZyztom8tDgBzorLo9byhBMko/sXfgiUD945AuzKGg1GCgDMCC3NaYkicLpGKXutONM36wEX8UbBCA==} + wrap-ansi@6.2.0: + resolution: {integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==} + engines: {node: '>=8'} + wrap-ansi@7.0.0: resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} engines: {node: '>=10'} @@ -3727,10 +3907,6 @@ packages: resolution: {integrity: sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==} engines: {node: '>=4.0'} - xtend@4.0.2: - resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==} - engines: {node: '>=0.4'} - y18n@5.0.8: resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} engines: {node: '>=10'} @@ -3738,10 +3914,6 @@ packages: yallist@3.1.1: resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} - yaml@1.10.3: - resolution: {integrity: sha512-vIYeF1u3CjlhAFekPPAk2h/Kv4T3mAkMox5OymRiJQB0spDP10LHvt+K7G9Ny6NuuMAb25/6n1qyUjAcGNf/AA==} - engines: {node: '>= 6'} - yargs-parser@21.1.1: resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} engines: {node: '>=12'} @@ -3758,34 +3930,40 @@ packages: resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} engines: {node: '>=10'} + yoctocolors-cjs@2.1.3: + resolution: {integrity: sha512-U/PBtDf35ff0D8X8D0jfdzHYEPFxAI7jJlxZXwCSez5M3190m+QobIfh+sWDWSHMCWWJN2AWamkegn6vr6YBTw==} + engines: {node: '>=18'} + snapshots: - '@angular-devkit/core@16.0.1(chokidar@3.5.3)': + '@angular-devkit/core@19.2.24(chokidar@4.0.3)': dependencies: - ajv: 8.12.0 - ajv-formats: 2.1.1(ajv@8.12.0) - jsonc-parser: 3.2.0 + ajv: 8.18.0 + ajv-formats: 3.0.1(ajv@8.18.0) + jsonc-parser: 3.3.1 + picomatch: 4.0.4 rxjs: 7.8.1 source-map: 0.7.4 optionalDependencies: - chokidar: 3.5.3 + chokidar: 4.0.3 - '@angular-devkit/schematics-cli@16.0.1(chokidar@3.5.3)': + '@angular-devkit/schematics-cli@19.2.24(@types/node@22.19.19)(chokidar@4.0.3)': dependencies: - '@angular-devkit/core': 16.0.1(chokidar@3.5.3) - '@angular-devkit/schematics': 16.0.1(chokidar@3.5.3) + '@angular-devkit/core': 19.2.24(chokidar@4.0.3) + '@angular-devkit/schematics': 19.2.24(chokidar@4.0.3) + '@inquirer/prompts': 7.3.2(@types/node@22.19.19) ansi-colors: 4.1.3 - inquirer: 8.2.4 symbol-observable: 4.0.0 yargs-parser: 21.1.1 transitivePeerDependencies: + - '@types/node' - chokidar - '@angular-devkit/schematics@16.0.1(chokidar@3.5.3)': + '@angular-devkit/schematics@19.2.24(chokidar@4.0.3)': dependencies: - '@angular-devkit/core': 16.0.1(chokidar@3.5.3) - jsonc-parser: 3.2.0 - magic-string: 0.30.0 + '@angular-devkit/core': 19.2.24(chokidar@4.0.3) + jsonc-parser: 3.3.1 + magic-string: 0.30.17 ora: 5.4.1 rxjs: 7.8.1 transitivePeerDependencies: @@ -4159,6 +4337,8 @@ snapshots: '@bcoe/v8-coverage@0.2.3': {} + '@borewit/text-codec@0.2.2': {} + '@colors/colors@1.5.0': optional: true @@ -4201,6 +4381,146 @@ snapshots: '@humanwhocodes/object-schema@2.0.3': {} + '@inquirer/ansi@1.0.2': {} + + '@inquirer/checkbox@4.3.2(@types/node@22.19.19)': + dependencies: + '@inquirer/ansi': 1.0.2 + '@inquirer/core': 10.3.2(@types/node@22.19.19) + '@inquirer/figures': 1.0.15 + '@inquirer/type': 3.0.10(@types/node@22.19.19) + yoctocolors-cjs: 2.1.3 + optionalDependencies: + '@types/node': 22.19.19 + + '@inquirer/confirm@5.1.21(@types/node@22.19.19)': + dependencies: + '@inquirer/core': 10.3.2(@types/node@22.19.19) + '@inquirer/type': 3.0.10(@types/node@22.19.19) + optionalDependencies: + '@types/node': 22.19.19 + + '@inquirer/core@10.3.2(@types/node@22.19.19)': + dependencies: + '@inquirer/ansi': 1.0.2 + '@inquirer/figures': 1.0.15 + '@inquirer/type': 3.0.10(@types/node@22.19.19) + cli-width: 4.1.0 + mute-stream: 2.0.0 + signal-exit: 4.1.0 + wrap-ansi: 6.2.0 + yoctocolors-cjs: 2.1.3 + optionalDependencies: + '@types/node': 22.19.19 + + '@inquirer/editor@4.2.23(@types/node@22.19.19)': + dependencies: + '@inquirer/core': 10.3.2(@types/node@22.19.19) + '@inquirer/external-editor': 1.0.3(@types/node@22.19.19) + '@inquirer/type': 3.0.10(@types/node@22.19.19) + optionalDependencies: + '@types/node': 22.19.19 + + '@inquirer/expand@4.0.23(@types/node@22.19.19)': + dependencies: + '@inquirer/core': 10.3.2(@types/node@22.19.19) + '@inquirer/type': 3.0.10(@types/node@22.19.19) + yoctocolors-cjs: 2.1.3 + optionalDependencies: + '@types/node': 22.19.19 + + '@inquirer/external-editor@1.0.3(@types/node@22.19.19)': + dependencies: + chardet: 2.1.1 + iconv-lite: 0.7.2 + optionalDependencies: + '@types/node': 22.19.19 + + '@inquirer/figures@1.0.15': {} + + '@inquirer/input@4.3.1(@types/node@22.19.19)': + dependencies: + '@inquirer/core': 10.3.2(@types/node@22.19.19) + '@inquirer/type': 3.0.10(@types/node@22.19.19) + optionalDependencies: + '@types/node': 22.19.19 + + '@inquirer/number@3.0.23(@types/node@22.19.19)': + dependencies: + '@inquirer/core': 10.3.2(@types/node@22.19.19) + '@inquirer/type': 3.0.10(@types/node@22.19.19) + optionalDependencies: + '@types/node': 22.19.19 + + '@inquirer/password@4.0.23(@types/node@22.19.19)': + dependencies: + '@inquirer/ansi': 1.0.2 + '@inquirer/core': 10.3.2(@types/node@22.19.19) + '@inquirer/type': 3.0.10(@types/node@22.19.19) + optionalDependencies: + '@types/node': 22.19.19 + + '@inquirer/prompts@7.10.1(@types/node@22.19.19)': + dependencies: + '@inquirer/checkbox': 4.3.2(@types/node@22.19.19) + '@inquirer/confirm': 5.1.21(@types/node@22.19.19) + '@inquirer/editor': 4.2.23(@types/node@22.19.19) + '@inquirer/expand': 4.0.23(@types/node@22.19.19) + '@inquirer/input': 4.3.1(@types/node@22.19.19) + '@inquirer/number': 3.0.23(@types/node@22.19.19) + '@inquirer/password': 4.0.23(@types/node@22.19.19) + '@inquirer/rawlist': 4.1.11(@types/node@22.19.19) + '@inquirer/search': 3.2.2(@types/node@22.19.19) + '@inquirer/select': 4.4.2(@types/node@22.19.19) + optionalDependencies: + '@types/node': 22.19.19 + + '@inquirer/prompts@7.3.2(@types/node@22.19.19)': + dependencies: + '@inquirer/checkbox': 4.3.2(@types/node@22.19.19) + '@inquirer/confirm': 5.1.21(@types/node@22.19.19) + '@inquirer/editor': 4.2.23(@types/node@22.19.19) + '@inquirer/expand': 4.0.23(@types/node@22.19.19) + '@inquirer/input': 4.3.1(@types/node@22.19.19) + '@inquirer/number': 3.0.23(@types/node@22.19.19) + '@inquirer/password': 4.0.23(@types/node@22.19.19) + '@inquirer/rawlist': 4.1.11(@types/node@22.19.19) + '@inquirer/search': 3.2.2(@types/node@22.19.19) + '@inquirer/select': 4.4.2(@types/node@22.19.19) + optionalDependencies: + '@types/node': 22.19.19 + + '@inquirer/rawlist@4.1.11(@types/node@22.19.19)': + dependencies: + '@inquirer/core': 10.3.2(@types/node@22.19.19) + '@inquirer/type': 3.0.10(@types/node@22.19.19) + yoctocolors-cjs: 2.1.3 + optionalDependencies: + '@types/node': 22.19.19 + + '@inquirer/search@3.2.2(@types/node@22.19.19)': + dependencies: + '@inquirer/core': 10.3.2(@types/node@22.19.19) + '@inquirer/figures': 1.0.15 + '@inquirer/type': 3.0.10(@types/node@22.19.19) + yoctocolors-cjs: 2.1.3 + optionalDependencies: + '@types/node': 22.19.19 + + '@inquirer/select@4.4.2(@types/node@22.19.19)': + dependencies: + '@inquirer/ansi': 1.0.2 + '@inquirer/core': 10.3.2(@types/node@22.19.19) + '@inquirer/figures': 1.0.15 + '@inquirer/type': 3.0.10(@types/node@22.19.19) + yoctocolors-cjs: 2.1.3 + optionalDependencies: + '@types/node': 22.19.19 + + '@inquirer/type@3.0.10(@types/node@22.19.19)': + optionalDependencies: + '@types/node': 22.19.19 + '@isaacs/cliui@8.0.2': dependencies: string-width: 5.1.2 @@ -4223,27 +4543,27 @@ snapshots: '@jest/console@29.7.0': dependencies: '@jest/types': 29.6.3 - '@types/node': 18.11.18 + '@types/node': 22.19.19 chalk: 4.1.2 jest-message-util: 29.7.0 jest-util: 29.7.0 slash: 3.0.0 - '@jest/core@29.7.0(ts-node@10.9.2(@types/node@18.11.18)(typescript@4.9.5))': + '@jest/core@29.7.0(ts-node@10.9.2(@types/node@22.19.19)(typescript@5.9.3))': dependencies: '@jest/console': 29.7.0 '@jest/reporters': 29.7.0 '@jest/test-result': 29.7.0 '@jest/transform': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 18.11.18 + '@types/node': 22.19.19 ansi-escapes: 4.3.2 chalk: 4.1.2 ci-info: 3.9.0 exit: 0.1.2 graceful-fs: 4.2.11 jest-changed-files: 29.7.0 - jest-config: 29.7.0(@types/node@18.11.18)(ts-node@10.9.2(@types/node@18.11.18)(typescript@4.9.5)) + jest-config: 29.7.0(@types/node@22.19.19)(ts-node@10.9.2(@types/node@22.19.19)(typescript@5.9.3)) jest-haste-map: 29.7.0 jest-message-util: 29.7.0 jest-regex-util: 29.6.3 @@ -4268,7 +4588,7 @@ snapshots: dependencies: '@jest/fake-timers': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 18.11.18 + '@types/node': 22.19.19 jest-mock: 29.7.0 '@jest/expect-utils@29.7.0': @@ -4286,7 +4606,7 @@ snapshots: dependencies: '@jest/types': 29.6.3 '@sinonjs/fake-timers': 10.3.0 - '@types/node': 18.11.18 + '@types/node': 22.19.19 jest-message-util: 29.7.0 jest-mock: 29.7.0 jest-util: 29.7.0 @@ -4308,7 +4628,7 @@ snapshots: '@jest/transform': 29.7.0 '@jest/types': 29.6.3 '@jridgewell/trace-mapping': 0.3.31 - '@types/node': 18.11.18 + '@types/node': 22.19.19 chalk: 4.1.2 collect-v8-coverage: 1.0.3 exit: 0.1.2 @@ -4378,7 +4698,7 @@ snapshots: '@jest/schemas': 29.6.3 '@types/istanbul-lib-coverage': 2.0.6 '@types/istanbul-reports': 3.0.4 - '@types/node': 18.11.18 + '@types/node': 22.19.19 '@types/yargs': 17.0.35 chalk: 4.1.2 @@ -4414,133 +4734,132 @@ snapshots: '@js-joda/core@5.7.0': optional: true - '@kwitsukasa/knife4j-swagger-vue3@0.1.2(@nestjs/common@9.4.3(reflect-metadata@0.1.14)(rxjs@7.8.2))': + '@kwitsukasa/knife4j-swagger-vue3@0.1.2(@nestjs/common@11.1.24(reflect-metadata@0.2.2)(rxjs@7.8.2))': dependencies: - '@nestjs/common': 9.4.3(reflect-metadata@0.1.14)(rxjs@7.8.2) + '@nestjs/common': 11.1.24(reflect-metadata@0.2.2)(rxjs@7.8.2) '@lukeed/csprng@1.1.0': {} - '@microsoft/tsdoc@0.15.1': {} + '@microsoft/tsdoc@0.16.0': {} - '@nestjs/cli@9.5.0': + '@nestjs/cli@11.0.21(@types/node@22.19.19)(prettier@3.8.3)': dependencies: - '@angular-devkit/core': 16.0.1(chokidar@3.5.3) - '@angular-devkit/schematics': 16.0.1(chokidar@3.5.3) - '@angular-devkit/schematics-cli': 16.0.1(chokidar@3.5.3) - '@nestjs/schematics': 9.2.0(chokidar@3.5.3)(typescript@4.9.5) - chalk: 4.1.2 - chokidar: 3.5.3 - cli-table3: 0.6.3 + '@angular-devkit/core': 19.2.24(chokidar@4.0.3) + '@angular-devkit/schematics': 19.2.24(chokidar@4.0.3) + '@angular-devkit/schematics-cli': 19.2.24(@types/node@22.19.19)(chokidar@4.0.3) + '@inquirer/prompts': 7.10.1(@types/node@22.19.19) + '@nestjs/schematics': 11.1.0(chokidar@4.0.3)(prettier@3.8.3)(typescript@5.9.3) + ansis: 4.2.0 + chokidar: 4.0.3 + cli-table3: 0.6.5 commander: 4.1.1 - fork-ts-checker-webpack-plugin: 8.0.0(typescript@4.9.5)(webpack@5.82.1) - inquirer: 8.2.5 + fork-ts-checker-webpack-plugin: 9.1.0(typescript@5.9.3)(webpack@5.106.0) + glob: 13.0.6 node-emoji: 1.11.0 ora: 5.4.1 - os-name: 4.0.1 - rimraf: 4.4.1 - shelljs: 0.8.5 - source-map-support: 0.5.21 - tree-kill: 1.2.2 tsconfig-paths: 4.2.0 - tsconfig-paths-webpack-plugin: 4.0.1 - typescript: 4.9.5 - webpack: 5.82.1 + tsconfig-paths-webpack-plugin: 4.2.0 + typescript: 5.9.3 + webpack: 5.106.0 webpack-node-externals: 3.0.0 transitivePeerDependencies: - - '@swc/core' + - '@types/node' - esbuild + - prettier - uglify-js - webpack-cli - '@nestjs/common@9.4.3(reflect-metadata@0.1.14)(rxjs@7.8.2)': + '@nestjs/common@11.1.24(reflect-metadata@0.2.2)(rxjs@7.8.2)': dependencies: + file-type: 21.3.4 iterare: 1.2.1 - reflect-metadata: 0.1.14 + load-esm: 1.0.3 + reflect-metadata: 0.2.2 rxjs: 7.8.2 - tslib: 2.5.3 + tslib: 2.8.1 uid: 2.0.2 - - '@nestjs/config@2.3.4(@nestjs/common@9.4.3(reflect-metadata@0.1.14)(rxjs@7.8.2))(reflect-metadata@0.1.14)(rxjs@7.8.2)': - dependencies: - '@nestjs/common': 9.4.3(reflect-metadata@0.1.14)(rxjs@7.8.2) - dotenv: 16.1.4 - dotenv-expand: 10.0.0 - lodash: 4.17.21 - reflect-metadata: 0.1.14 - rxjs: 7.8.2 - uuid: 9.0.0 - - '@nestjs/core@9.4.3(@nestjs/common@9.4.3(reflect-metadata@0.1.14)(rxjs@7.8.2))(@nestjs/platform-express@9.4.3)(reflect-metadata@0.1.14)(rxjs@7.8.2)': - dependencies: - '@nestjs/common': 9.4.3(reflect-metadata@0.1.14)(rxjs@7.8.2) - '@nuxtjs/opencollective': 0.3.2 - fast-safe-stringify: 2.1.1 - iterare: 1.2.1 - path-to-regexp: 3.2.0 - reflect-metadata: 0.1.14 - rxjs: 7.8.2 - tslib: 2.5.3 - uid: 2.0.2 - optionalDependencies: - '@nestjs/platform-express': 9.4.3(@nestjs/common@9.4.3(reflect-metadata@0.1.14)(rxjs@7.8.2))(@nestjs/core@9.4.3) - transitivePeerDependencies: - - encoding - - '@nestjs/mapped-types@2.0.5(@nestjs/common@9.4.3(reflect-metadata@0.1.14)(rxjs@7.8.2))(reflect-metadata@0.1.14)': - dependencies: - '@nestjs/common': 9.4.3(reflect-metadata@0.1.14)(rxjs@7.8.2) - reflect-metadata: 0.1.14 - - '@nestjs/platform-express@9.4.3(@nestjs/common@9.4.3(reflect-metadata@0.1.14)(rxjs@7.8.2))(@nestjs/core@9.4.3)': - dependencies: - '@nestjs/common': 9.4.3(reflect-metadata@0.1.14)(rxjs@7.8.2) - '@nestjs/core': 9.4.3(@nestjs/common@9.4.3(reflect-metadata@0.1.14)(rxjs@7.8.2))(@nestjs/platform-express@9.4.3)(reflect-metadata@0.1.14)(rxjs@7.8.2) - body-parser: 1.20.2 - cors: 2.8.5 - express: 4.18.2 - multer: 1.4.4-lts.1 - tslib: 2.5.3 transitivePeerDependencies: - supports-color - '@nestjs/schematics@9.2.0(chokidar@3.5.3)(typescript@4.9.5)': + '@nestjs/config@4.0.4(@nestjs/common@11.1.24(reflect-metadata@0.2.2)(rxjs@7.8.2))(rxjs@7.8.2)': dependencies: - '@angular-devkit/core': 16.0.1(chokidar@3.5.3) - '@angular-devkit/schematics': 16.0.1(chokidar@3.5.3) - jsonc-parser: 3.2.0 + '@nestjs/common': 11.1.24(reflect-metadata@0.2.2)(rxjs@7.8.2) + dotenv: 17.4.1 + dotenv-expand: 12.0.3 + lodash: 4.18.1 + rxjs: 7.8.2 + + '@nestjs/core@11.1.24(@nestjs/common@11.1.24(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/platform-express@11.1.24)(reflect-metadata@0.2.2)(rxjs@7.8.2)': + dependencies: + '@nestjs/common': 11.1.24(reflect-metadata@0.2.2)(rxjs@7.8.2) + '@nuxt/opencollective': 0.4.1 + fast-safe-stringify: 2.1.1 + iterare: 1.2.1 + path-to-regexp: 8.4.2 + reflect-metadata: 0.2.2 + rxjs: 7.8.2 + tslib: 2.8.1 + uid: 2.0.2 + optionalDependencies: + '@nestjs/platform-express': 11.1.24(@nestjs/common@11.1.24(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@11.1.24) + + '@nestjs/mapped-types@2.1.1(@nestjs/common@11.1.24(reflect-metadata@0.2.2)(rxjs@7.8.2))(reflect-metadata@0.2.2)': + dependencies: + '@nestjs/common': 11.1.24(reflect-metadata@0.2.2)(rxjs@7.8.2) + reflect-metadata: 0.2.2 + + '@nestjs/platform-express@11.1.24(@nestjs/common@11.1.24(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@11.1.24)': + dependencies: + '@nestjs/common': 11.1.24(reflect-metadata@0.2.2)(rxjs@7.8.2) + '@nestjs/core': 11.1.24(@nestjs/common@11.1.24(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/platform-express@11.1.24)(reflect-metadata@0.2.2)(rxjs@7.8.2) + cors: 2.8.6 + express: 5.2.1 + multer: 2.1.1 + path-to-regexp: 8.4.2 + tslib: 2.8.1 + transitivePeerDependencies: + - supports-color + + '@nestjs/schematics@11.1.0(chokidar@4.0.3)(prettier@3.8.3)(typescript@5.9.3)': + dependencies: + '@angular-devkit/core': 19.2.24(chokidar@4.0.3) + '@angular-devkit/schematics': 19.2.24(chokidar@4.0.3) + comment-json: 5.0.0 + jsonc-parser: 3.3.1 pluralize: 8.0.0 - typescript: 4.9.5 + typescript: 5.9.3 + optionalDependencies: + prettier: 3.8.3 transitivePeerDependencies: - chokidar - '@nestjs/swagger@7.4.2(@nestjs/common@9.4.3(reflect-metadata@0.1.14)(rxjs@7.8.2))(@nestjs/core@9.4.3)(reflect-metadata@0.1.14)': + '@nestjs/swagger@11.4.4(@nestjs/common@11.1.24(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@11.1.24)(reflect-metadata@0.2.2)': dependencies: - '@microsoft/tsdoc': 0.15.1 - '@nestjs/common': 9.4.3(reflect-metadata@0.1.14)(rxjs@7.8.2) - '@nestjs/core': 9.4.3(@nestjs/common@9.4.3(reflect-metadata@0.1.14)(rxjs@7.8.2))(@nestjs/platform-express@9.4.3)(reflect-metadata@0.1.14)(rxjs@7.8.2) - '@nestjs/mapped-types': 2.0.5(@nestjs/common@9.4.3(reflect-metadata@0.1.14)(rxjs@7.8.2))(reflect-metadata@0.1.14) - js-yaml: 4.1.0 - lodash: 4.17.21 - path-to-regexp: 3.3.0 - reflect-metadata: 0.1.14 - swagger-ui-dist: 5.17.14 + '@microsoft/tsdoc': 0.16.0 + '@nestjs/common': 11.1.24(reflect-metadata@0.2.2)(rxjs@7.8.2) + '@nestjs/core': 11.1.24(@nestjs/common@11.1.24(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/platform-express@11.1.24)(reflect-metadata@0.2.2)(rxjs@7.8.2) + '@nestjs/mapped-types': 2.1.1(@nestjs/common@11.1.24(reflect-metadata@0.2.2)(rxjs@7.8.2))(reflect-metadata@0.2.2) + js-yaml: 4.1.1 + lodash: 4.18.1 + path-to-regexp: 8.4.2 + reflect-metadata: 0.2.2 + swagger-ui-dist: 5.32.6 - '@nestjs/testing@9.4.3(@nestjs/common@9.4.3(reflect-metadata@0.1.14)(rxjs@7.8.2))(@nestjs/core@9.4.3)(@nestjs/platform-express@9.4.3)': + '@nestjs/testing@11.1.24(@nestjs/common@11.1.24(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@11.1.24)(@nestjs/platform-express@11.1.24)': dependencies: - '@nestjs/common': 9.4.3(reflect-metadata@0.1.14)(rxjs@7.8.2) - '@nestjs/core': 9.4.3(@nestjs/common@9.4.3(reflect-metadata@0.1.14)(rxjs@7.8.2))(@nestjs/platform-express@9.4.3)(reflect-metadata@0.1.14)(rxjs@7.8.2) - tslib: 2.5.3 + '@nestjs/common': 11.1.24(reflect-metadata@0.2.2)(rxjs@7.8.2) + '@nestjs/core': 11.1.24(@nestjs/common@11.1.24(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/platform-express@11.1.24)(reflect-metadata@0.2.2)(rxjs@7.8.2) + tslib: 2.8.1 optionalDependencies: - '@nestjs/platform-express': 9.4.3(@nestjs/common@9.4.3(reflect-metadata@0.1.14)(rxjs@7.8.2))(@nestjs/core@9.4.3) + '@nestjs/platform-express': 11.1.24(@nestjs/common@11.1.24(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@11.1.24) - '@nestjs/typeorm@9.0.1(@nestjs/common@9.4.3(reflect-metadata@0.1.14)(rxjs@7.8.2))(@nestjs/core@9.4.3)(reflect-metadata@0.1.14)(rxjs@7.8.2)(typeorm@0.3.28(mssql@9.3.2(@azure/core-client@1.10.1))(mysql2@3.22.3(@types/node@18.11.18))(ts-node@10.9.2(@types/node@18.11.18)(typescript@4.9.5)))': + '@nestjs/typeorm@11.0.1(@nestjs/common@11.1.24(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@11.1.24)(reflect-metadata@0.2.2)(rxjs@7.8.2)(typeorm@0.3.28(mssql@9.3.2(@azure/core-client@1.10.1))(mysql2@3.22.3(@types/node@22.19.19))(ts-node@10.9.2(@types/node@22.19.19)(typescript@5.9.3)))': dependencies: - '@nestjs/common': 9.4.3(reflect-metadata@0.1.14)(rxjs@7.8.2) - '@nestjs/core': 9.4.3(@nestjs/common@9.4.3(reflect-metadata@0.1.14)(rxjs@7.8.2))(@nestjs/platform-express@9.4.3)(reflect-metadata@0.1.14)(rxjs@7.8.2) - reflect-metadata: 0.1.14 + '@nestjs/common': 11.1.24(reflect-metadata@0.2.2)(rxjs@7.8.2) + '@nestjs/core': 11.1.24(@nestjs/common@11.1.24(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/platform-express@11.1.24)(reflect-metadata@0.2.2)(rxjs@7.8.2) + reflect-metadata: 0.2.2 rxjs: 7.8.2 - typeorm: 0.3.28(mssql@9.3.2(@azure/core-client@1.10.1))(mysql2@3.22.3(@types/node@18.11.18))(ts-node@10.9.2(@types/node@18.11.18)(typescript@4.9.5)) - uuid: 8.3.2 + typeorm: 0.3.28(mssql@9.3.2(@azure/core-client@1.10.1))(mysql2@3.22.3(@types/node@22.19.19))(ts-node@10.9.2(@types/node@22.19.19)(typescript@5.9.3)) '@noble/hashes@1.8.0': {} @@ -4556,21 +4875,23 @@ snapshots: '@nodelib/fs.scandir': 2.1.5 fastq: 1.20.1 - '@nuxtjs/opencollective@0.3.2': + '@nuxt/opencollective@0.4.1': dependencies: - chalk: 4.1.2 - consola: 2.15.3 - node-fetch: 2.7.0 - transitivePeerDependencies: - - encoding + consola: 3.4.2 '@paralleldrive/cuid2@2.3.1': dependencies: '@noble/hashes': 1.8.0 + '@pinojs/redact@0.4.0': {} + '@pkgjs/parseargs@0.11.0': optional: true + '@pkgr/core@0.3.6': {} + + '@scarf/scarf@1.4.0': {} + '@sinclair/typebox@0.27.10': {} '@sinonjs/commons@3.0.1': @@ -4586,6 +4907,15 @@ snapshots: '@tediousjs/connection-string@0.5.0': optional: true + '@tokenizer/inflate@0.4.1': + dependencies: + debug: 4.4.3 + token-types: 6.1.2 + transitivePeerDependencies: + - supports-color + + '@tokenizer/token@0.3.0': {} + '@tsconfig/node10@1.0.12': {} '@tsconfig/node12@1.0.11': {} @@ -4618,11 +4948,11 @@ snapshots: '@types/body-parser@1.19.6': dependencies: '@types/connect': 3.4.38 - '@types/node': 18.11.18 + '@types/node': 22.19.19 '@types/connect@3.4.38': dependencies: - '@types/node': 18.11.18 + '@types/node': 22.19.19 '@types/cookiejar@2.1.5': {} @@ -4638,23 +4968,22 @@ snapshots: '@types/estree@1.0.9': {} - '@types/express-serve-static-core@4.19.8': + '@types/express-serve-static-core@5.1.1': dependencies: - '@types/node': 18.11.18 + '@types/node': 22.19.19 '@types/qs': 6.15.1 '@types/range-parser': 1.2.7 '@types/send': 1.2.1 - '@types/express@4.17.25': + '@types/express@5.0.6': dependencies: '@types/body-parser': 1.19.6 - '@types/express-serve-static-core': 4.19.8 - '@types/qs': 6.15.1 - '@types/serve-static': 1.15.10 + '@types/express-serve-static-core': 5.1.1 + '@types/serve-static': 2.2.0 '@types/graceful-fs@4.1.9': dependencies: - '@types/node': 18.11.18 + '@types/node': 22.19.19 '@types/http-errors@2.0.5': {} @@ -4679,11 +5008,9 @@ snapshots: '@types/methods@1.1.4': {} - '@types/mime@1.3.5': {} - - '@types/node@18.11.18': {} - - '@types/parse-json@4.0.2': {} + '@types/node@22.19.19': + dependencies: + undici-types: 6.21.0 '@types/qs@6.15.1': {} @@ -4691,24 +5018,16 @@ snapshots: '@types/readable-stream@4.0.23': dependencies: - '@types/node': 18.11.18 - - '@types/semver@7.7.1': {} - - '@types/send@0.17.6': - dependencies: - '@types/mime': 1.3.5 - '@types/node': 18.11.18 + '@types/node': 22.19.19 '@types/send@1.2.1': dependencies: - '@types/node': 18.11.18 + '@types/node': 22.19.19 - '@types/serve-static@1.15.10': + '@types/serve-static@2.2.0': dependencies: '@types/http-errors': 2.0.5 - '@types/node': 18.11.18 - '@types/send': 0.17.6 + '@types/node': 22.19.19 '@types/stack-utils@2.0.3': {} @@ -4716,7 +5035,7 @@ snapshots: dependencies: '@types/cookiejar': 2.1.5 '@types/methods': 1.1.4 - '@types/node': 18.11.18 + '@types/node': 22.19.19 form-data: 4.0.5 '@types/supertest@2.0.16': @@ -4725,7 +5044,7 @@ snapshots: '@types/ws@8.18.1': dependencies: - '@types/node': 18.11.18 + '@types/node': 22.19.19 '@types/yargs-parser@21.0.3': {} @@ -4733,89 +5052,96 @@ snapshots: dependencies: '@types/yargs-parser': 21.0.3 - '@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0(eslint@8.57.1)(typescript@4.9.5))(eslint@8.57.1)(typescript@4.9.5)': + '@typescript-eslint/eslint-plugin@8.60.1(@typescript-eslint/parser@8.60.1(eslint@8.57.1)(typescript@5.9.3))(eslint@8.57.1)(typescript@5.9.3)': dependencies: '@eslint-community/regexpp': 4.12.2 - '@typescript-eslint/parser': 5.62.0(eslint@8.57.1)(typescript@4.9.5) - '@typescript-eslint/scope-manager': 5.62.0 - '@typescript-eslint/type-utils': 5.62.0(eslint@8.57.1)(typescript@4.9.5) - '@typescript-eslint/utils': 5.62.0(eslint@8.57.1)(typescript@4.9.5) + '@typescript-eslint/parser': 8.60.1(eslint@8.57.1)(typescript@5.9.3) + '@typescript-eslint/scope-manager': 8.60.1 + '@typescript-eslint/type-utils': 8.60.1(eslint@8.57.1)(typescript@5.9.3) + '@typescript-eslint/utils': 8.60.1(eslint@8.57.1)(typescript@5.9.3) + '@typescript-eslint/visitor-keys': 8.60.1 + eslint: 8.57.1 + ignore: 7.0.5 + natural-compare: 1.4.0 + ts-api-utils: 2.5.0(typescript@5.9.3) + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/parser@8.60.1(eslint@8.57.1)(typescript@5.9.3)': + dependencies: + '@typescript-eslint/scope-manager': 8.60.1 + '@typescript-eslint/types': 8.60.1 + '@typescript-eslint/typescript-estree': 8.60.1(typescript@5.9.3) + '@typescript-eslint/visitor-keys': 8.60.1 debug: 4.4.3 eslint: 8.57.1 - graphemer: 1.4.0 - ignore: 5.3.2 - natural-compare-lite: 1.4.0 - semver: 7.7.4 - tsutils: 3.21.0(typescript@4.9.5) - optionalDependencies: - typescript: 4.9.5 + typescript: 5.9.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@5.62.0(eslint@8.57.1)(typescript@4.9.5)': + '@typescript-eslint/project-service@8.60.1(typescript@5.9.3)': dependencies: - '@typescript-eslint/scope-manager': 5.62.0 - '@typescript-eslint/types': 5.62.0 - '@typescript-eslint/typescript-estree': 5.62.0(typescript@4.9.5) + '@typescript-eslint/tsconfig-utils': 8.60.1(typescript@5.9.3) + '@typescript-eslint/types': 8.60.1 + debug: 4.4.3 + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/scope-manager@8.60.1': + dependencies: + '@typescript-eslint/types': 8.60.1 + '@typescript-eslint/visitor-keys': 8.60.1 + + '@typescript-eslint/tsconfig-utils@8.60.1(typescript@5.9.3)': + dependencies: + typescript: 5.9.3 + + '@typescript-eslint/type-utils@8.60.1(eslint@8.57.1)(typescript@5.9.3)': + dependencies: + '@typescript-eslint/types': 8.60.1 + '@typescript-eslint/typescript-estree': 8.60.1(typescript@5.9.3) + '@typescript-eslint/utils': 8.60.1(eslint@8.57.1)(typescript@5.9.3) debug: 4.4.3 eslint: 8.57.1 - optionalDependencies: - typescript: 4.9.5 + ts-api-utils: 2.5.0(typescript@5.9.3) + typescript: 5.9.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/scope-manager@5.62.0': - dependencies: - '@typescript-eslint/types': 5.62.0 - '@typescript-eslint/visitor-keys': 5.62.0 + '@typescript-eslint/types@8.60.1': {} - '@typescript-eslint/type-utils@5.62.0(eslint@8.57.1)(typescript@4.9.5)': + '@typescript-eslint/typescript-estree@8.60.1(typescript@5.9.3)': dependencies: - '@typescript-eslint/typescript-estree': 5.62.0(typescript@4.9.5) - '@typescript-eslint/utils': 5.62.0(eslint@8.57.1)(typescript@4.9.5) + '@typescript-eslint/project-service': 8.60.1(typescript@5.9.3) + '@typescript-eslint/tsconfig-utils': 8.60.1(typescript@5.9.3) + '@typescript-eslint/types': 8.60.1 + '@typescript-eslint/visitor-keys': 8.60.1 debug: 4.4.3 - eslint: 8.57.1 - tsutils: 3.21.0(typescript@4.9.5) - optionalDependencies: - typescript: 4.9.5 + minimatch: 10.2.5 + semver: 7.8.1 + tinyglobby: 0.2.17 + ts-api-utils: 2.5.0(typescript@5.9.3) + typescript: 5.9.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/types@5.62.0': {} - - '@typescript-eslint/typescript-estree@5.62.0(typescript@4.9.5)': - dependencies: - '@typescript-eslint/types': 5.62.0 - '@typescript-eslint/visitor-keys': 5.62.0 - debug: 4.4.3 - globby: 11.1.0 - is-glob: 4.0.3 - semver: 7.7.4 - tsutils: 3.21.0(typescript@4.9.5) - optionalDependencies: - typescript: 4.9.5 - transitivePeerDependencies: - - supports-color - - '@typescript-eslint/utils@5.62.0(eslint@8.57.1)(typescript@4.9.5)': + '@typescript-eslint/utils@8.60.1(eslint@8.57.1)(typescript@5.9.3)': dependencies: '@eslint-community/eslint-utils': 4.9.1(eslint@8.57.1) - '@types/json-schema': 7.0.15 - '@types/semver': 7.7.1 - '@typescript-eslint/scope-manager': 5.62.0 - '@typescript-eslint/types': 5.62.0 - '@typescript-eslint/typescript-estree': 5.62.0(typescript@4.9.5) + '@typescript-eslint/scope-manager': 8.60.1 + '@typescript-eslint/types': 8.60.1 + '@typescript-eslint/typescript-estree': 8.60.1(typescript@5.9.3) eslint: 8.57.1 - eslint-scope: 5.1.1 - semver: 7.7.4 + typescript: 5.9.3 transitivePeerDependencies: - supports-color - - typescript - '@typescript-eslint/visitor-keys@5.62.0': + '@typescript-eslint/visitor-keys@8.60.1': dependencies: - '@typescript-eslint/types': 5.62.0 - eslint-visitor-keys: 3.4.3 + '@typescript-eslint/types': 8.60.1 + eslint-visitor-keys: 5.0.1 '@typespec/ts-http-runtime@0.3.5': dependencies: @@ -4915,12 +5241,12 @@ snapshots: dependencies: event-target-shim: 5.0.1 - accepts@1.3.8: + accepts@2.0.0: dependencies: - mime-types: 2.1.35 - negotiator: 0.6.3 + mime-types: 3.0.2 + negotiator: 1.0.0 - acorn-import-assertions@1.9.0(acorn@8.16.0): + acorn-import-phases@1.0.4(acorn@8.16.0): dependencies: acorn: 8.16.0 @@ -4937,14 +5263,14 @@ snapshots: agent-base@7.1.4: optional: true - ajv-formats@2.1.1(ajv@8.12.0): - optionalDependencies: - ajv: 8.12.0 - ajv-formats@2.1.1(ajv@8.20.0): optionalDependencies: ajv: 8.20.0 + ajv-formats@3.0.1(ajv@8.18.0): + optionalDependencies: + ajv: 8.18.0 + ajv-keywords@3.5.2(ajv@6.15.0): dependencies: ajv: 6.15.0 @@ -4961,12 +5287,12 @@ snapshots: json-schema-traverse: 0.4.1 uri-js: 4.4.1 - ajv@8.12.0: + ajv@8.18.0: dependencies: fast-deep-equal: 3.1.3 + fast-uri: 3.1.2 json-schema-traverse: 1.0.0 require-from-string: 2.0.2 - uri-js: 4.4.1 ajv@8.20.0: dependencies: @@ -5018,9 +5344,7 @@ snapshots: is-array-buffer: 3.0.5 optional: true - array-flatten@1.1.1: {} - - array-union@2.1.0: {} + array-timsort@1.0.3: {} arraybuffer.prototype.slice@1.0.4: dependencies: @@ -5042,6 +5366,8 @@ snapshots: asynckit@0.4.0: {} + atomic-sleep@1.0.0: {} + available-typed-arrays@1.0.7: dependencies: possible-typed-array-names: 1.1.0 @@ -5105,12 +5431,12 @@ snapshots: balanced-match@1.0.2: {} + balanced-match@4.0.4: {} + base64-js@1.5.1: {} baseline-browser-mapping@2.10.27: {} - binary-extensions@2.3.0: {} - bl@4.1.0: dependencies: buffer: 5.7.1 @@ -5135,37 +5461,17 @@ snapshots: dependencies: readable-stream: 3.6.2 - body-parser@1.20.1: + body-parser@2.2.2: dependencies: bytes: 3.1.2 content-type: 1.0.5 - debug: 2.6.9 - depd: 2.0.0 - destroy: 1.2.0 - http-errors: 2.0.0 - iconv-lite: 0.4.24 + debug: 4.4.3 + http-errors: 2.0.1 + iconv-lite: 0.7.2 on-finished: 2.4.1 - qs: 6.11.0 - raw-body: 2.5.1 - type-is: 1.6.18 - unpipe: 1.0.0 - transitivePeerDependencies: - - supports-color - - body-parser@1.20.2: - dependencies: - bytes: 3.1.2 - content-type: 1.0.5 - debug: 2.6.9 - depd: 2.0.0 - destroy: 1.2.0 - http-errors: 2.0.0 - iconv-lite: 0.4.24 - on-finished: 2.4.1 - qs: 6.11.0 - raw-body: 2.5.2 - type-is: 1.6.18 - unpipe: 1.0.0 + qs: 6.15.1 + raw-body: 3.0.2 + type-is: 2.1.0 transitivePeerDependencies: - supports-color @@ -5178,6 +5484,10 @@ snapshots: dependencies: balanced-match: 1.0.2 + brace-expansion@5.0.6: + dependencies: + balanced-match: 4.0.4 + braces@3.0.3: dependencies: fill-range: 7.1.1 @@ -5262,19 +5572,11 @@ snapshots: char-regex@1.0.2: {} - chardet@0.7.0: {} + chardet@2.1.1: {} - chokidar@3.5.3: + chokidar@4.0.3: dependencies: - anymatch: 3.1.3 - braces: 3.0.3 - glob-parent: 5.1.2 - is-binary-path: 2.1.0 - is-glob: 4.0.3 - normalize-path: 3.0.0 - readdirp: 3.6.0 - optionalDependencies: - fsevents: 2.3.3 + readdirp: 4.1.2 chrome-trace-event@1.0.4: {} @@ -5288,13 +5590,13 @@ snapshots: cli-spinners@2.9.2: {} - cli-table3@0.6.3: + cli-table3@0.6.5: dependencies: string-width: 4.2.3 optionalDependencies: '@colors/colors': 1.5.0 - cli-width@3.0.0: {} + cli-width@4.1.0: {} cliui@8.0.1: dependencies: @@ -5314,6 +5616,8 @@ snapshots: color-name@1.1.4: {} + colorette@2.0.20: {} + combined-stream@1.0.8: dependencies: delayed-stream: 1.0.0 @@ -5325,19 +5629,17 @@ snapshots: commander@4.1.1: {} + comment-json@5.0.0: + dependencies: + array-timsort: 1.0.3 + esprima: 4.0.1 + commist@3.2.0: {} component-emitter@1.3.1: {} concat-map@0.0.1: {} - concat-stream@1.6.2: - dependencies: - buffer-from: 1.1.2 - inherits: 2.0.4 - readable-stream: 2.3.8 - typedarray: 0.0.6 - concat-stream@2.0.0: dependencies: buffer-from: 1.1.2 @@ -5345,44 +5647,43 @@ snapshots: readable-stream: 3.6.2 typedarray: 0.0.6 - consola@2.15.3: {} + consola@3.4.2: {} - content-disposition@0.5.4: - dependencies: - safe-buffer: 5.2.1 + content-disposition@1.1.0: {} content-type@1.0.5: {} + content-type@2.0.0: {} + convert-source-map@2.0.0: {} - cookie-signature@1.0.6: {} + cookie-signature@1.2.2: {} - cookie@0.5.0: {} + cookie@0.7.2: {} cookiejar@2.1.4: {} - core-util-is@1.0.3: {} - - cors@2.8.5: + cors@2.8.6: dependencies: object-assign: 4.1.1 vary: 1.1.2 - cosmiconfig@7.1.0: + cosmiconfig@8.3.6(typescript@5.9.3): dependencies: - '@types/parse-json': 4.0.2 import-fresh: 3.3.1 + js-yaml: 4.1.1 parse-json: 5.2.0 path-type: 4.0.0 - yaml: 1.10.3 + optionalDependencies: + typescript: 5.9.3 - create-jest@29.7.0(@types/node@18.11.18)(ts-node@10.9.2(@types/node@18.11.18)(typescript@4.9.5)): + create-jest@29.7.0(@types/node@22.19.19)(ts-node@10.9.2(@types/node@22.19.19)(typescript@5.9.3)): dependencies: '@jest/types': 29.6.3 chalk: 4.1.2 exit: 0.1.2 graceful-fs: 4.2.11 - jest-config: 29.7.0(@types/node@18.11.18)(ts-node@10.9.2(@types/node@18.11.18)(typescript@4.9.5)) + jest-config: 29.7.0(@types/node@22.19.19)(ts-node@10.9.2(@types/node@22.19.19)(typescript@5.9.3)) jest-util: 29.7.0 prompts: 2.4.2 transitivePeerDependencies: @@ -5424,11 +5725,9 @@ snapshots: is-data-view: 1.0.2 optional: true - dayjs@1.11.20: {} + dateformat@4.6.3: {} - debug@2.6.9: - dependencies: - ms: 2.0.0 + dayjs@1.11.20: {} debug@4.4.3: dependencies: @@ -5468,8 +5767,6 @@ snapshots: depd@2.0.0: {} - destroy@1.2.0: {} - detect-newline@3.1.0: {} dezalgo@1.0.4: @@ -5481,20 +5778,18 @@ snapshots: diff@4.0.4: {} - dir-glob@3.0.1: - dependencies: - path-type: 4.0.0 - doctrine@3.0.0: dependencies: esutils: 2.0.3 - dotenv-expand@10.0.0: {} - - dotenv@16.1.4: {} + dotenv-expand@12.0.3: + dependencies: + dotenv: 16.6.1 dotenv@16.6.1: {} + dotenv@17.4.1: {} + dunder-proto@1.0.1: dependencies: call-bind-apply-helpers: 1.0.2 @@ -5518,7 +5813,7 @@ snapshots: emoji-regex@9.2.2: {} - encodeurl@1.0.2: {} + encodeurl@2.0.0: {} end-of-stream@1.4.5: dependencies: @@ -5607,7 +5902,7 @@ snapshots: es-errors@1.3.0: {} - es-module-lexer@1.7.0: {} + es-module-lexer@2.1.0: {} es-object-atoms@1.1.1: dependencies: @@ -5636,23 +5931,23 @@ snapshots: escape-html@1.0.3: {} - escape-string-regexp@1.0.5: {} - escape-string-regexp@2.0.0: {} escape-string-regexp@4.0.0: {} - eslint-config-prettier@8.10.2(eslint@8.57.1): + eslint-config-prettier@10.1.8(eslint@8.57.1): dependencies: eslint: 8.57.1 - eslint-plugin-prettier@4.2.5(eslint-config-prettier@8.10.2(eslint@8.57.1))(eslint@8.57.1)(prettier@2.8.8): + eslint-plugin-prettier@5.5.6(@types/eslint@9.6.1)(eslint-config-prettier@10.1.8(eslint@8.57.1))(eslint@8.57.1)(prettier@3.8.3): dependencies: eslint: 8.57.1 - prettier: 2.8.8 + prettier: 3.8.3 prettier-linter-helpers: 1.0.1 + synckit: 0.11.13 optionalDependencies: - eslint-config-prettier: 8.10.2(eslint@8.57.1) + '@types/eslint': 9.6.1 + eslint-config-prettier: 10.1.8(eslint@8.57.1) eslint-plugin-typeorm@0.0.19: dependencies: @@ -5670,6 +5965,8 @@ snapshots: eslint-visitor-keys@3.4.3: {} + eslint-visitor-keys@5.0.1: {} + eslint@8.57.1: dependencies: '@eslint-community/eslint-utils': 4.9.1(eslint@8.57.1) @@ -5741,18 +6038,6 @@ snapshots: events@3.3.0: {} - execa@4.1.0: - dependencies: - cross-spawn: 7.0.6 - get-stream: 5.2.0 - human-signals: 1.1.1 - is-stream: 2.0.1 - merge-stream: 2.0.0 - npm-run-path: 4.0.1 - onetime: 5.1.2 - signal-exit: 3.0.7 - strip-final-newline: 2.0.0 - execa@5.1.1: dependencies: cross-spawn: 7.0.6 @@ -5775,60 +6060,45 @@ snapshots: jest-message-util: 29.7.0 jest-util: 29.7.0 - express@4.18.2: + express@5.2.1: dependencies: - accepts: 1.3.8 - array-flatten: 1.1.1 - body-parser: 1.20.1 - content-disposition: 0.5.4 + accepts: 2.0.0 + body-parser: 2.2.2 + content-disposition: 1.1.0 content-type: 1.0.5 - cookie: 0.5.0 - cookie-signature: 1.0.6 - debug: 2.6.9 + cookie: 0.7.2 + cookie-signature: 1.2.2 + debug: 4.4.3 depd: 2.0.0 - encodeurl: 1.0.2 + encodeurl: 2.0.0 escape-html: 1.0.3 etag: 1.8.1 - finalhandler: 1.2.0 - fresh: 0.5.2 - http-errors: 2.0.0 - merge-descriptors: 1.0.1 - methods: 1.1.2 + finalhandler: 2.1.1 + fresh: 2.0.0 + http-errors: 2.0.1 + merge-descriptors: 2.0.0 + mime-types: 3.0.2 on-finished: 2.4.1 + once: 1.4.0 parseurl: 1.3.3 - path-to-regexp: 0.1.7 proxy-addr: 2.0.7 - qs: 6.11.0 + qs: 6.15.1 range-parser: 1.2.1 - safe-buffer: 5.2.1 - send: 0.18.0 - serve-static: 1.15.0 - setprototypeof: 1.2.0 - statuses: 2.0.1 - type-is: 1.6.18 - utils-merge: 1.0.1 + router: 2.2.0 + send: 1.2.1 + serve-static: 2.2.1 + statuses: 2.0.2 + type-is: 2.1.0 vary: 1.1.2 transitivePeerDependencies: - supports-color - external-editor@3.1.0: - dependencies: - chardet: 0.7.0 - iconv-lite: 0.4.24 - tmp: 0.0.33 + fast-copy@4.0.3: {} fast-deep-equal@3.1.3: {} fast-diff@1.3.0: {} - fast-glob@3.3.3: - dependencies: - '@nodelib/fs.stat': 2.0.5 - '@nodelib/fs.walk': 1.2.8 - glob-parent: 5.1.2 - merge2: 1.4.1 - micromatch: 4.0.8 - fast-json-stable-stringify@2.1.0: {} fast-levenshtein@2.0.6: {} @@ -5854,29 +6124,37 @@ snapshots: dependencies: bser: 2.1.1 - figures@3.2.0: - dependencies: - escape-string-regexp: 1.0.5 + fdir@6.5.0(picomatch@4.0.4): + optionalDependencies: + picomatch: 4.0.4 file-entry-cache@6.0.1: dependencies: flat-cache: 3.2.0 + file-type@21.3.4: + dependencies: + '@tokenizer/inflate': 0.4.1 + strtok3: 10.3.5 + token-types: 6.1.2 + uint8array-extras: 1.5.0 + transitivePeerDependencies: + - supports-color + fill-range@7.1.1: dependencies: to-regex-range: 5.0.1 filter-obj@1.1.0: {} - finalhandler@1.2.0: + finalhandler@2.1.1: dependencies: - debug: 2.6.9 - encodeurl: 1.0.2 + debug: 4.4.3 + encodeurl: 2.0.0 escape-html: 1.0.3 on-finished: 2.4.1 parseurl: 1.3.3 - statuses: 2.0.1 - unpipe: 1.0.0 + statuses: 2.0.2 transitivePeerDependencies: - supports-color @@ -5907,22 +6185,22 @@ snapshots: cross-spawn: 7.0.6 signal-exit: 4.1.0 - fork-ts-checker-webpack-plugin@8.0.0(typescript@4.9.5)(webpack@5.82.1): + fork-ts-checker-webpack-plugin@9.1.0(typescript@5.9.3)(webpack@5.106.0): dependencies: '@babel/code-frame': 7.29.0 chalk: 4.1.2 - chokidar: 3.5.3 - cosmiconfig: 7.1.0 + chokidar: 4.0.3 + cosmiconfig: 8.3.6(typescript@5.9.3) deepmerge: 4.3.1 fs-extra: 10.1.0 memfs: 3.5.3 minimatch: 3.1.5 node-abort-controller: 3.1.1 schema-utils: 3.3.0 - semver: 7.7.4 + semver: 7.8.1 tapable: 2.3.3 - typescript: 4.9.5 - webpack: 5.82.1 + typescript: 5.9.3 + webpack: 5.106.0 form-data@4.0.5: dependencies: @@ -5941,7 +6219,7 @@ snapshots: forwarded@0.2.0: {} - fresh@0.5.2: {} + fresh@2.0.0: {} fs-extra@10.1.0: dependencies: @@ -6001,10 +6279,6 @@ snapshots: dunder-proto: 1.0.1 es-object-atoms: 1.1.1 - get-stream@5.2.0: - dependencies: - pump: 3.0.4 - get-stream@6.0.1: {} get-symbol-description@1.1.0: @@ -6014,10 +6288,6 @@ snapshots: get-intrinsic: 1.3.0 optional: true - glob-parent@5.1.2: - dependencies: - is-glob: 4.0.3 - glob-parent@6.0.2: dependencies: is-glob: 4.0.3 @@ -6033,6 +6303,12 @@ snapshots: package-json-from-dist: 1.0.1 path-scurry: 1.11.1 + glob@13.0.6: + dependencies: + minimatch: 10.2.5 + minipass: 7.1.3 + path-scurry: 2.0.2 + glob@7.2.3: dependencies: fs.realpath: 1.0.0 @@ -6042,13 +6318,6 @@ snapshots: once: 1.4.0 path-is-absolute: 1.0.1 - glob@9.3.5: - dependencies: - fs.realpath: 1.0.0 - minimatch: 8.0.7 - minipass: 4.2.8 - path-scurry: 1.11.1 - globals@13.24.0: dependencies: type-fest: 0.20.2 @@ -6059,21 +6328,21 @@ snapshots: gopd: 1.2.0 optional: true - globby@11.1.0: - dependencies: - array-union: 2.1.0 - dir-glob: 3.0.1 - fast-glob: 3.3.3 - ignore: 5.3.2 - merge2: 1.4.1 - slash: 3.0.0 - gopd@1.2.0: {} graceful-fs@4.2.11: {} graphemer@1.4.0: {} + handlebars@4.7.9: + dependencies: + minimist: 1.2.8 + neo-async: 2.6.2 + source-map: 0.6.1 + wordwrap: 1.0.0 + optionalDependencies: + uglify-js: 3.19.3 + has-bigints@1.1.0: optional: true @@ -6107,12 +6376,12 @@ snapshots: html-escaper@2.0.2: {} - http-errors@2.0.0: + http-errors@2.0.1: dependencies: depd: 2.0.0 inherits: 2.0.4 setprototypeof: 1.2.0 - statuses: 2.0.1 + statuses: 2.0.2 toidentifier: 1.0.1 http-proxy-agent@7.0.2: @@ -6131,16 +6400,10 @@ snapshots: - supports-color optional: true - human-signals@1.1.1: {} - human-signals@2.1.0: {} husky@9.1.7: {} - iconv-lite@0.4.24: - dependencies: - safer-buffer: 2.1.2 - iconv-lite@0.6.3: dependencies: safer-buffer: 2.1.2 @@ -6154,6 +6417,8 @@ snapshots: ignore@5.3.2: {} + ignore@7.0.5: {} + import-fresh@3.3.1: dependencies: parent-module: 1.0.1 @@ -6173,42 +6438,6 @@ snapshots: inherits@2.0.4: {} - inquirer@8.2.4: - dependencies: - ansi-escapes: 4.3.2 - chalk: 4.1.2 - cli-cursor: 3.1.0 - cli-width: 3.0.0 - external-editor: 3.1.0 - figures: 3.2.0 - lodash: 4.18.1 - mute-stream: 0.0.8 - ora: 5.4.1 - run-async: 2.4.1 - rxjs: 7.8.2 - string-width: 4.2.3 - strip-ansi: 6.0.1 - through: 2.3.8 - wrap-ansi: 7.0.0 - - inquirer@8.2.5: - dependencies: - ansi-escapes: 4.3.2 - chalk: 4.1.2 - cli-cursor: 3.1.0 - cli-width: 3.0.0 - external-editor: 3.1.0 - figures: 3.2.0 - lodash: 4.18.1 - mute-stream: 0.0.8 - ora: 5.4.1 - run-async: 2.4.1 - rxjs: 7.8.2 - string-width: 4.2.3 - strip-ansi: 6.0.1 - through: 2.3.8 - wrap-ansi: 7.0.0 - internal-slot@1.1.0: dependencies: es-errors: 1.3.0 @@ -6216,8 +6445,6 @@ snapshots: side-channel: 1.1.0 optional: true - interpret@1.4.0: {} - ip-address@10.2.0: {} ipaddr.js@1.9.1: {} @@ -6252,10 +6479,6 @@ snapshots: has-bigints: 1.1.0 optional: true - is-binary-path@2.1.0: - dependencies: - binary-extensions: 2.3.0 - is-boolean-object@1.2.2: dependencies: call-bound: 1.0.4 @@ -6325,6 +6548,8 @@ snapshots: is-path-inside@3.0.3: {} + is-promise@4.0.0: {} + is-property@1.0.2: {} is-regex@1.2.1: @@ -6382,8 +6607,6 @@ snapshots: is-docker: 2.2.1 optional: true - isarray@1.0.0: {} - isarray@2.0.5: {} isexe@2.0.0: {} @@ -6406,7 +6629,7 @@ snapshots: '@babel/parser': 7.29.3 '@istanbuljs/schema': 0.1.6 istanbul-lib-coverage: 3.2.2 - semver: 7.7.4 + semver: 7.8.1 transitivePeerDependencies: - supports-color @@ -6449,7 +6672,7 @@ snapshots: '@jest/expect': 29.7.0 '@jest/test-result': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 18.11.18 + '@types/node': 22.19.19 chalk: 4.1.2 co: 4.6.0 dedent: 1.7.2 @@ -6469,16 +6692,16 @@ snapshots: - babel-plugin-macros - supports-color - jest-cli@29.7.0(@types/node@18.11.18)(ts-node@10.9.2(@types/node@18.11.18)(typescript@4.9.5)): + jest-cli@29.7.0(@types/node@22.19.19)(ts-node@10.9.2(@types/node@22.19.19)(typescript@5.9.3)): dependencies: - '@jest/core': 29.7.0(ts-node@10.9.2(@types/node@18.11.18)(typescript@4.9.5)) + '@jest/core': 29.7.0(ts-node@10.9.2(@types/node@22.19.19)(typescript@5.9.3)) '@jest/test-result': 29.7.0 '@jest/types': 29.6.3 chalk: 4.1.2 - create-jest: 29.7.0(@types/node@18.11.18)(ts-node@10.9.2(@types/node@18.11.18)(typescript@4.9.5)) + create-jest: 29.7.0(@types/node@22.19.19)(ts-node@10.9.2(@types/node@22.19.19)(typescript@5.9.3)) exit: 0.1.2 import-local: 3.2.0 - jest-config: 29.7.0(@types/node@18.11.18)(ts-node@10.9.2(@types/node@18.11.18)(typescript@4.9.5)) + jest-config: 29.7.0(@types/node@22.19.19)(ts-node@10.9.2(@types/node@22.19.19)(typescript@5.9.3)) jest-util: 29.7.0 jest-validate: 29.7.0 yargs: 17.7.2 @@ -6488,7 +6711,7 @@ snapshots: - supports-color - ts-node - jest-config@29.7.0(@types/node@18.11.18)(ts-node@10.9.2(@types/node@18.11.18)(typescript@4.9.5)): + jest-config@29.7.0(@types/node@22.19.19)(ts-node@10.9.2(@types/node@22.19.19)(typescript@5.9.3)): dependencies: '@babel/core': 7.29.0 '@jest/test-sequencer': 29.7.0 @@ -6513,8 +6736,8 @@ snapshots: slash: 3.0.0 strip-json-comments: 3.1.1 optionalDependencies: - '@types/node': 18.11.18 - ts-node: 10.9.2(@types/node@18.11.18)(typescript@4.9.5) + '@types/node': 22.19.19 + ts-node: 10.9.2(@types/node@22.19.19)(typescript@5.9.3) transitivePeerDependencies: - babel-plugin-macros - supports-color @@ -6543,7 +6766,7 @@ snapshots: '@jest/environment': 29.7.0 '@jest/fake-timers': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 18.11.18 + '@types/node': 22.19.19 jest-mock: 29.7.0 jest-util: 29.7.0 @@ -6553,7 +6776,7 @@ snapshots: dependencies: '@jest/types': 29.6.3 '@types/graceful-fs': 4.1.9 - '@types/node': 18.11.18 + '@types/node': 22.19.19 anymatch: 3.1.3 fb-watchman: 2.0.2 graceful-fs: 4.2.11 @@ -6592,7 +6815,7 @@ snapshots: jest-mock@29.7.0: dependencies: '@jest/types': 29.6.3 - '@types/node': 18.11.18 + '@types/node': 22.19.19 jest-util: 29.7.0 jest-pnp-resolver@1.2.3(jest-resolve@29.7.0): @@ -6627,7 +6850,7 @@ snapshots: '@jest/test-result': 29.7.0 '@jest/transform': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 18.11.18 + '@types/node': 22.19.19 chalk: 4.1.2 emittery: 0.13.1 graceful-fs: 4.2.11 @@ -6655,7 +6878,7 @@ snapshots: '@jest/test-result': 29.7.0 '@jest/transform': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 18.11.18 + '@types/node': 22.19.19 chalk: 4.1.2 cjs-module-lexer: 1.4.3 collect-v8-coverage: 1.0.3 @@ -6694,14 +6917,14 @@ snapshots: jest-util: 29.7.0 natural-compare: 1.4.0 pretty-format: 29.7.0 - semver: 7.7.4 + semver: 7.8.1 transitivePeerDependencies: - supports-color jest-util@29.7.0: dependencies: '@jest/types': 29.6.3 - '@types/node': 18.11.18 + '@types/node': 22.19.19 chalk: 4.1.2 ci-info: 3.9.0 graceful-fs: 4.2.11 @@ -6720,7 +6943,7 @@ snapshots: dependencies: '@jest/test-result': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 18.11.18 + '@types/node': 22.19.19 ansi-escapes: 4.3.2 chalk: 4.1.2 emittery: 0.13.1 @@ -6729,29 +6952,31 @@ snapshots: jest-worker@27.5.1: dependencies: - '@types/node': 18.11.18 + '@types/node': 22.19.19 merge-stream: 2.0.0 supports-color: 8.1.1 jest-worker@29.7.0: dependencies: - '@types/node': 18.11.18 + '@types/node': 22.19.19 jest-util: 29.7.0 merge-stream: 2.0.0 supports-color: 8.1.1 - jest@29.3.1(@types/node@18.11.18)(ts-node@10.9.2(@types/node@18.11.18)(typescript@4.9.5)): + jest@29.3.1(@types/node@22.19.19)(ts-node@10.9.2(@types/node@22.19.19)(typescript@5.9.3)): dependencies: - '@jest/core': 29.7.0(ts-node@10.9.2(@types/node@18.11.18)(typescript@4.9.5)) + '@jest/core': 29.7.0(ts-node@10.9.2(@types/node@22.19.19)(typescript@5.9.3)) '@jest/types': 29.6.3 import-local: 3.2.0 - jest-cli: 29.7.0(@types/node@18.11.18)(ts-node@10.9.2(@types/node@18.11.18)(typescript@4.9.5)) + jest-cli: 29.7.0(@types/node@22.19.19)(ts-node@10.9.2(@types/node@22.19.19)(typescript@5.9.3)) transitivePeerDependencies: - '@types/node' - babel-plugin-macros - supports-color - ts-node + joycon@3.1.1: {} + js-md4@0.3.2: optional: true @@ -6764,10 +6989,6 @@ snapshots: argparse: 1.0.10 esprima: 4.0.1 - js-yaml@4.1.0: - dependencies: - argparse: 2.0.1 - js-yaml@4.1.1: dependencies: argparse: 2.0.1 @@ -6791,7 +7012,7 @@ snapshots: json5@2.2.3: {} - jsonc-parser@3.2.0: {} + jsonc-parser@3.3.1: {} jsonfile@6.2.1: dependencies: @@ -6841,6 +7062,8 @@ snapshots: lines-and-columns@1.2.4: {} + load-esm@1.0.3: {} + loader-runner@4.3.2: {} locate-path@5.0.0: @@ -6889,21 +7112,21 @@ snapshots: lru-cache@10.4.3: {} + lru-cache@11.5.1: {} + lru-cache@5.1.1: dependencies: yallist: 3.1.1 lru.min@1.1.4: {} - macos-release@2.5.1: {} - - magic-string@0.30.0: + magic-string@0.30.17: dependencies: '@jridgewell/sourcemap-codec': 1.5.5 make-dir@4.0.0: dependencies: - semver: 7.7.4 + semver: 7.8.1 make-error@1.3.6: {} @@ -6915,16 +7138,16 @@ snapshots: media-typer@0.3.0: {} + media-typer@1.1.0: {} + memfs@3.5.3: dependencies: fs-monkey: 1.1.0 - merge-descriptors@1.0.1: {} + merge-descriptors@2.0.0: {} merge-stream@2.0.0: {} - merge2@1.4.1: {} - methods@1.1.2: {} micromatch@4.0.8: @@ -6934,24 +7157,28 @@ snapshots: mime-db@1.52.0: {} + mime-db@1.54.0: {} + mime-types@2.1.35: dependencies: mime-db: 1.52.0 - mime@1.6.0: {} + mime-types@3.0.2: + dependencies: + mime-db: 1.54.0 mime@2.6.0: {} mimic-fn@2.1.0: {} + minimatch@10.2.5: + dependencies: + brace-expansion: 5.0.6 + minimatch@3.1.5: dependencies: brace-expansion: 1.1.14 - minimatch@8.0.7: - dependencies: - brace-expansion: 2.1.0 - minimatch@9.0.9: dependencies: brace-expansion: 2.1.0 @@ -6975,14 +7202,8 @@ snapshots: xml: 1.0.1 xml2js: 0.5.0 - minipass@4.2.8: {} - minipass@7.1.3: {} - mkdirp@0.5.6: - dependencies: - minimist: 1.2.8 - mqtt-packet@9.0.2: dependencies: bl: 6.1.6 @@ -7014,8 +7235,6 @@ snapshots: - supports-color - utf-8-validate - ms@2.0.0: {} - ms@2.1.3: {} mssql@9.3.2(@azure/core-client@1.10.1): @@ -7031,21 +7250,18 @@ snapshots: - supports-color optional: true - multer@1.4.4-lts.1: + multer@2.1.1: dependencies: append-field: 1.0.0 busboy: 1.6.0 - concat-stream: 1.6.2 - mkdirp: 0.5.6 - object-assign: 4.1.1 + concat-stream: 2.0.0 type-is: 1.6.18 - xtend: 4.0.2 - mute-stream@0.0.8: {} + mute-stream@2.0.0: {} - mysql2@3.22.3(@types/node@18.11.18): + mysql2@3.22.3(@types/node@22.19.19): dependencies: - '@types/node': 18.11.18 + '@types/node': 22.19.19 aws-ssl-profiles: 1.1.2 denque: 2.1.0 generate-function: 2.3.1 @@ -7062,32 +7278,33 @@ snapshots: native-duplexpair@1.0.0: optional: true - natural-compare-lite@1.4.0: {} - natural-compare@1.4.0: {} - negotiator@0.6.3: {} + negotiator@1.0.0: {} neo-async@2.6.2: {} - nestjs-minio-client@2.2.0(@nestjs/common@9.4.3(reflect-metadata@0.1.14)(rxjs@7.8.2))(@nestjs/core@9.4.3): + nestjs-minio-client@2.2.0(@nestjs/common@11.1.24(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/core@11.1.24): dependencies: - '@nestjs/common': 9.4.3(reflect-metadata@0.1.14)(rxjs@7.8.2) - '@nestjs/core': 9.4.3(@nestjs/common@9.4.3(reflect-metadata@0.1.14)(rxjs@7.8.2))(@nestjs/platform-express@9.4.3)(reflect-metadata@0.1.14)(rxjs@7.8.2) + '@nestjs/common': 11.1.24(reflect-metadata@0.2.2)(rxjs@7.8.2) + '@nestjs/core': 11.1.24(@nestjs/common@11.1.24(reflect-metadata@0.2.2)(rxjs@7.8.2))(@nestjs/platform-express@11.1.24)(reflect-metadata@0.2.2)(rxjs@7.8.2) minio: 7.1.3 reflect-metadata: 0.1.14 rxjs: 7.8.2 + nestjs-pino@4.6.1(@nestjs/common@11.1.24(reflect-metadata@0.2.2)(rxjs@7.8.2))(pino-http@11.0.0)(pino@10.3.1)(rxjs@7.8.2): + dependencies: + '@nestjs/common': 11.1.24(reflect-metadata@0.2.2)(rxjs@7.8.2) + pino: 10.3.1 + pino-http: 11.0.0 + rxjs: 7.8.2 + node-abort-controller@3.1.1: {} node-emoji@1.11.0: dependencies: lodash: 4.18.1 - node-fetch@2.7.0: - dependencies: - whatwg-url: 5.0.0 - node-int64@0.4.0: {} node-releases@2.0.38: {} @@ -7122,6 +7339,8 @@ snapshots: object-keys: 1.1.1 optional: true + on-exit-leak-free@2.1.2: {} + on-finished@2.4.1: dependencies: ee-first: 1.1.1 @@ -7166,13 +7385,6 @@ snapshots: strip-ansi: 6.0.1 wcwidth: 1.0.1 - os-name@4.0.1: - dependencies: - macos-release: 2.5.1 - windows-release: 4.0.0 - - os-tmpdir@1.0.2: {} - own-keys@1.0.1: dependencies: get-intrinsic: 1.3.0 @@ -7226,11 +7438,12 @@ snapshots: lru-cache: 10.4.3 minipass: 7.1.3 - path-to-regexp@0.1.7: {} + path-scurry@2.0.2: + dependencies: + lru-cache: 11.5.1 + minipass: 7.1.3 - path-to-regexp@3.2.0: {} - - path-to-regexp@3.3.0: {} + path-to-regexp@8.4.2: {} path-type@4.0.0: {} @@ -7238,6 +7451,56 @@ snapshots: picomatch@2.3.2: {} + picomatch@4.0.4: {} + + pino-abstract-transport@3.0.0: + dependencies: + split2: 4.2.0 + + pino-http@11.0.0: + dependencies: + get-caller-file: 2.0.5 + pino: 10.3.1 + pino-std-serializers: 7.1.0 + process-warning: 5.0.0 + + pino-loki@3.0.0: + dependencies: + pino-abstract-transport: 3.0.0 + pump: 3.0.4 + + pino-pretty@13.1.3: + dependencies: + colorette: 2.0.20 + dateformat: 4.6.3 + fast-copy: 4.0.3 + fast-safe-stringify: 2.1.1 + help-me: 5.0.0 + joycon: 3.1.1 + minimist: 1.2.8 + on-exit-leak-free: 2.1.2 + pino-abstract-transport: 3.0.0 + pump: 3.0.4 + secure-json-parse: 4.1.0 + sonic-boom: 4.2.1 + strip-json-comments: 5.0.3 + + pino-std-serializers@7.1.0: {} + + pino@10.3.1: + dependencies: + '@pinojs/redact': 0.4.0 + atomic-sleep: 1.0.0 + on-exit-leak-free: 2.1.2 + pino-abstract-transport: 3.0.0 + pino-std-serializers: 7.1.0 + process-warning: 5.0.0 + quick-format-unescaped: 4.0.4 + real-require: 0.2.0 + safe-stable-stringify: 2.5.0 + sonic-boom: 4.2.1 + thread-stream: 4.2.0 + pirates@4.0.7: {} pkg-dir@4.2.0: @@ -7254,7 +7517,7 @@ snapshots: dependencies: fast-diff: 1.3.0 - prettier@2.8.8: {} + prettier@3.8.3: {} pretty-format@29.7.0: dependencies: @@ -7264,6 +7527,8 @@ snapshots: process-nextick-args@2.0.1: {} + process-warning@5.0.0: {} + process@0.11.10: {} prompts@2.4.2: @@ -7285,10 +7550,6 @@ snapshots: pure-rand@6.1.0: {} - qs@6.11.0: - dependencies: - side-channel: 1.1.0 - qs@6.15.1: dependencies: side-channel: 1.1.0 @@ -7302,34 +7563,19 @@ snapshots: queue-microtask@1.2.3: {} + quick-format-unescaped@4.0.4: {} + range-parser@1.2.1: {} - raw-body@2.5.1: + raw-body@3.0.2: dependencies: bytes: 3.1.2 - http-errors: 2.0.0 - iconv-lite: 0.4.24 - unpipe: 1.0.0 - - raw-body@2.5.2: - dependencies: - bytes: 3.1.2 - http-errors: 2.0.0 - iconv-lite: 0.4.24 + http-errors: 2.0.1 + iconv-lite: 0.7.2 unpipe: 1.0.0 react-is@18.3.1: {} - readable-stream@2.3.8: - dependencies: - core-util-is: 1.0.3 - inherits: 2.0.4 - isarray: 1.0.0 - process-nextick-args: 2.0.1 - safe-buffer: 5.1.2 - string_decoder: 1.1.1 - util-deprecate: 1.0.2 - readable-stream@3.6.2: dependencies: inherits: 2.0.4 @@ -7344,13 +7590,11 @@ snapshots: process: 0.11.10 string_decoder: 1.3.0 - readdirp@3.6.0: - dependencies: - picomatch: 2.3.2 + readdirp@4.1.2: {} - rechoir@0.6.2: - dependencies: - resolve: 1.22.12 + real-require@0.2.0: {} + + real-require@1.0.0: {} reflect-metadata@0.1.14: {} @@ -7414,11 +7658,15 @@ snapshots: dependencies: glob: 7.2.3 - rimraf@4.4.1: + router@2.2.0: dependencies: - glob: 9.3.5 - - run-async@2.4.1: {} + debug: 4.4.3 + depd: 2.0.0 + is-promise: 4.0.0 + parseurl: 1.3.3 + path-to-regexp: 8.4.2 + transitivePeerDependencies: + - supports-color run-parallel@1.2.0: dependencies: @@ -7441,8 +7689,6 @@ snapshots: isarray: 2.0.5 optional: true - safe-buffer@5.1.2: {} - safe-buffer@5.2.1: {} safe-push-apply@1.0.0: @@ -7457,6 +7703,8 @@ snapshots: es-errors: 1.3.0 is-regex: 1.2.1 + safe-stable-stringify@2.5.0: {} + safer-buffer@2.1.2: {} sax@1.6.0: {} @@ -7474,37 +7722,36 @@ snapshots: ajv-formats: 2.1.1(ajv@8.20.0) ajv-keywords: 5.1.0(ajv@8.20.0) + secure-json-parse@4.1.0: {} + semver@6.3.1: {} semver@7.7.4: {} - semver@7.8.1: - optional: true + semver@7.8.1: {} - send@0.18.0: + send@1.2.1: dependencies: - debug: 2.6.9 - depd: 2.0.0 - destroy: 1.2.0 - encodeurl: 1.0.2 + debug: 4.4.3 + encodeurl: 2.0.0 escape-html: 1.0.3 etag: 1.8.1 - fresh: 0.5.2 - http-errors: 2.0.0 - mime: 1.6.0 + fresh: 2.0.0 + http-errors: 2.0.1 + mime-types: 3.0.2 ms: 2.1.3 on-finished: 2.4.1 range-parser: 1.2.1 - statuses: 2.0.1 + statuses: 2.0.2 transitivePeerDependencies: - supports-color - serve-static@1.15.0: + serve-static@2.2.1: dependencies: - encodeurl: 1.0.2 + encodeurl: 2.0.0 escape-html: 1.0.3 parseurl: 1.3.3 - send: 0.18.0 + send: 1.2.1 transitivePeerDependencies: - supports-color @@ -7546,12 +7793,6 @@ snapshots: shebang-regex@3.0.0: {} - shelljs@0.8.5: - dependencies: - glob: 7.2.3 - interpret: 1.4.0 - rechoir: 0.6.2 - side-channel-list@1.0.1: dependencies: es-errors: 1.3.0 @@ -7595,6 +7836,10 @@ snapshots: ip-address: 10.2.0 smart-buffer: 4.2.0 + sonic-boom@4.2.1: + dependencies: + atomic-sleep: 1.0.0 + source-map-support@0.5.13: dependencies: buffer-from: 1.1.2 @@ -7628,7 +7873,7 @@ snapshots: dependencies: escape-string-regexp: 2.0.0 - statuses@2.0.1: {} + statuses@2.0.2: {} stop-iteration-iterator@1.1.0: dependencies: @@ -7686,10 +7931,6 @@ snapshots: es-object-atoms: 1.1.2 optional: true - string_decoder@1.1.1: - dependencies: - safe-buffer: 5.1.2 - string_decoder@1.3.0: dependencies: safe-buffer: 5.2.1 @@ -7710,8 +7951,14 @@ snapshots: strip-json-comments@3.1.1: {} + strip-json-comments@5.0.3: {} + strnum@1.1.2: {} + strtok3@10.3.5: + dependencies: + '@tokenizer/token': 0.3.0 + superagent@8.1.2: dependencies: component-emitter: 1.3.1 @@ -7748,10 +7995,16 @@ snapshots: dependencies: opentype.js: 0.7.3 - swagger-ui-dist@5.17.14: {} + swagger-ui-dist@5.32.6: + dependencies: + '@scarf/scarf': 1.4.0 symbol-observable@4.0.0: {} + synckit@0.11.13: + dependencies: + '@pkgr/core': 0.3.6 + tapable@2.3.3: {} tarn@3.0.2: @@ -7776,13 +8029,13 @@ snapshots: - supports-color optional: true - terser-webpack-plugin@5.5.0(webpack@5.82.1): + terser-webpack-plugin@5.5.0(webpack@5.106.0): dependencies: '@jridgewell/trace-mapping': 0.3.31 jest-worker: 27.5.1 schema-utils: 4.3.3 terser: 5.47.0 - webpack: 5.82.1 + webpack: 5.106.0 terser@5.47.0: dependencies: @@ -7799,17 +8052,20 @@ snapshots: text-table@0.2.0: {} + thread-stream@4.2.0: + dependencies: + real-require: 1.0.0 + through2@4.0.2: dependencies: readable-stream: 3.6.2 - through@2.3.8: {} - tiny-inflate@1.0.3: {} - tmp@0.0.33: + tinyglobby@0.2.17: dependencies: - os-tmpdir: 1.0.2 + fdir: 6.5.0(picomatch@4.0.4) + picomatch: 4.0.4 tmpl@1.0.5: {} @@ -7825,59 +8081,69 @@ snapshots: toidentifier@1.0.1: {} - tr46@0.0.3: {} + token-types@6.1.2: + dependencies: + '@borewit/text-codec': 0.2.2 + '@tokenizer/token': 0.3.0 + ieee754: 1.2.1 - tree-kill@1.2.2: {} + ts-api-utils@2.5.0(typescript@5.9.3): + dependencies: + typescript: 5.9.3 - ts-jest@29.0.3(@babel/core@7.29.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.29.0))(jest@29.3.1(@types/node@18.11.18)(ts-node@10.9.2(@types/node@18.11.18)(typescript@4.9.5)))(typescript@4.9.5): + ts-jest@29.4.11(@babel/core@7.29.0)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.29.0))(jest-util@29.7.0)(jest@29.3.1(@types/node@22.19.19)(ts-node@10.9.2(@types/node@22.19.19)(typescript@5.9.3)))(typescript@5.9.3): dependencies: bs-logger: 0.2.6 fast-json-stable-stringify: 2.1.0 - jest: 29.3.1(@types/node@18.11.18)(ts-node@10.9.2(@types/node@18.11.18)(typescript@4.9.5)) - jest-util: 29.7.0 + handlebars: 4.7.9 + jest: 29.3.1(@types/node@22.19.19)(ts-node@10.9.2(@types/node@22.19.19)(typescript@5.9.3)) json5: 2.2.3 lodash.memoize: 4.1.2 make-error: 1.3.6 - semver: 7.7.4 - typescript: 4.9.5 + semver: 7.8.1 + type-fest: 4.41.0 + typescript: 5.9.3 yargs-parser: 21.1.1 optionalDependencies: '@babel/core': 7.29.0 + '@jest/transform': 29.7.0 '@jest/types': 29.6.3 babel-jest: 29.7.0(@babel/core@7.29.0) + jest-util: 29.7.0 - ts-loader@9.5.7(typescript@4.9.5)(webpack@5.82.1): + ts-loader@9.5.7(typescript@5.9.3)(webpack@5.106.0): dependencies: chalk: 4.1.2 enhanced-resolve: 5.21.0 micromatch: 4.0.8 semver: 7.7.4 source-map: 0.7.6 - typescript: 4.9.5 - webpack: 5.82.1 + typescript: 5.9.3 + webpack: 5.106.0 - ts-node@10.9.2(@types/node@18.11.18)(typescript@4.9.5): + ts-node@10.9.2(@types/node@22.19.19)(typescript@5.9.3): dependencies: '@cspotcode/source-map-support': 0.8.1 '@tsconfig/node10': 1.0.12 '@tsconfig/node12': 1.0.11 '@tsconfig/node14': 1.0.3 '@tsconfig/node16': 1.0.4 - '@types/node': 18.11.18 + '@types/node': 22.19.19 acorn: 8.16.0 acorn-walk: 8.3.5 arg: 4.1.3 create-require: 1.1.1 diff: 4.0.4 make-error: 1.3.6 - typescript: 4.9.5 + typescript: 5.9.3 v8-compile-cache-lib: 3.0.1 yn: 3.1.1 - tsconfig-paths-webpack-plugin@4.0.1: + tsconfig-paths-webpack-plugin@4.2.0: dependencies: chalk: 4.1.2 enhanced-resolve: 5.21.0 + tapable: 2.3.3 tsconfig-paths: 4.2.0 tsconfig-paths@4.1.1: @@ -7892,17 +8158,8 @@ snapshots: minimist: 1.2.8 strip-bom: 3.0.0 - tslib@1.14.1: {} - - tslib@2.5.3: {} - tslib@2.8.1: {} - tsutils@3.21.0(typescript@4.9.5): - dependencies: - tslib: 1.14.1 - typescript: 4.9.5 - type-check@0.4.0: dependencies: prelude-ls: 1.2.1 @@ -7913,11 +8170,19 @@ snapshots: type-fest@0.21.3: {} + type-fest@4.41.0: {} + type-is@1.6.18: dependencies: media-typer: 0.3.0 mime-types: 2.1.35 + type-is@2.1.0: + dependencies: + content-type: 2.0.0 + media-typer: 1.1.0 + mime-types: 3.0.2 + typed-array-buffer@1.0.3: dependencies: call-bound: 1.0.4 @@ -7956,7 +8221,7 @@ snapshots: typedarray@0.0.6: {} - typeorm@0.3.28(mssql@9.3.2(@azure/core-client@1.10.1))(mysql2@3.22.3(@types/node@18.11.18))(ts-node@10.9.2(@types/node@18.11.18)(typescript@4.9.5)): + typeorm@0.3.28(mssql@9.3.2(@azure/core-client@1.10.1))(mysql2@3.22.3(@types/node@22.19.19))(ts-node@10.9.2(@types/node@22.19.19)(typescript@5.9.3)): dependencies: '@sqltools/formatter': 1.2.5 ansis: 4.2.0 @@ -7975,18 +8240,23 @@ snapshots: yargs: 17.7.2 optionalDependencies: mssql: 9.3.2(@azure/core-client@1.10.1) - mysql2: 3.22.3(@types/node@18.11.18) - ts-node: 10.9.2(@types/node@18.11.18)(typescript@4.9.5) + mysql2: 3.22.3(@types/node@22.19.19) + ts-node: 10.9.2(@types/node@22.19.19)(typescript@5.9.3) transitivePeerDependencies: - babel-plugin-macros - supports-color - typescript@4.9.5: {} + typescript@5.9.3: {} + + uglify-js@3.19.3: + optional: true uid@2.0.2: dependencies: '@lukeed/csprng': 1.1.0 + uint8array-extras@1.5.0: {} + unbox-primitive@1.1.0: dependencies: call-bound: 1.0.4 @@ -7995,6 +8265,8 @@ snapshots: which-boxed-primitive: 1.1.1 optional: true + undici-types@6.21.0: {} + universalify@2.0.1: {} unpipe@1.0.0: {} @@ -8019,13 +8291,10 @@ snapshots: is-typed-array: 1.1.15 which-typed-array: 1.1.20 - utils-merge@1.0.1: {} - uuid@11.1.1: {} - uuid@8.3.2: {} - - uuid@9.0.0: {} + uuid@8.3.2: + optional: true v8-compile-cache-lib@3.0.1: {} @@ -8056,25 +8325,24 @@ snapshots: optionalDependencies: '@zxing/text-encoding': 0.9.0 - webidl-conversions@3.0.1: {} - webpack-node-externals@3.0.0: {} webpack-sources@3.4.1: {} - webpack@5.82.1: + webpack@5.106.0: dependencies: '@types/eslint-scope': 3.7.7 '@types/estree': 1.0.9 + '@types/json-schema': 7.0.15 '@webassemblyjs/ast': 1.14.1 '@webassemblyjs/wasm-edit': 1.14.1 '@webassemblyjs/wasm-parser': 1.14.1 acorn: 8.16.0 - acorn-import-assertions: 1.9.0(acorn@8.16.0) + acorn-import-phases: 1.0.4(acorn@8.16.0) browserslist: 4.28.2 chrome-trace-event: 1.0.4 enhanced-resolve: 5.21.0 - es-module-lexer: 1.7.0 + es-module-lexer: 2.1.0 eslint-scope: 5.1.1 events: 3.3.0 glob-to-regexp: 0.4.1 @@ -8083,9 +8351,9 @@ snapshots: loader-runner: 4.3.2 mime-types: 2.1.35 neo-async: 2.6.2 - schema-utils: 3.3.0 + schema-utils: 4.3.3 tapable: 2.3.3 - terser-webpack-plugin: 5.5.0(webpack@5.82.1) + terser-webpack-plugin: 5.5.0(webpack@5.106.0) watchpack: 2.5.1 webpack-sources: 3.4.1 transitivePeerDependencies: @@ -8093,11 +8361,6 @@ snapshots: - esbuild - uglify-js - whatwg-url@5.0.0: - dependencies: - tr46: 0.0.3 - webidl-conversions: 3.0.1 - which-boxed-primitive@1.1.1: dependencies: is-bigint: 1.1.0 @@ -8157,12 +8420,10 @@ snapshots: dependencies: isexe: 2.0.0 - windows-release@4.0.0: - dependencies: - execa: 4.1.0 - word-wrap@1.2.5: {} + wordwrap@1.0.0: {} + worker-factory@7.0.49: dependencies: '@babel/runtime': 7.29.7 @@ -8190,6 +8451,12 @@ snapshots: worker-timers-broker: 8.0.16 worker-timers-worker: 9.0.14 + wrap-ansi@6.2.0: + dependencies: + ansi-styles: 4.3.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi@7.0.0: dependencies: ansi-styles: 4.3.0 @@ -8220,14 +8487,10 @@ snapshots: xmlbuilder@11.0.1: {} - xtend@4.0.2: {} - y18n@5.0.8: {} yallist@3.1.1: {} - yaml@1.10.3: {} - yargs-parser@21.1.1: {} yargs@17.7.2: @@ -8243,3 +8506,5 @@ snapshots: yn@3.1.1: {} yocto-queue@0.1.0: {} + + yoctocolors-cjs@2.1.3: {} diff --git a/sql/fix-admin-menu-meta.sql b/sql/fix-admin-menu-meta.sql index 64f2b1a..904af73 100644 --- a/sql/fix-admin-menu-meta.sql +++ b/sql/fix-admin-menu-meta.sql @@ -21,6 +21,7 @@ SET `meta` = CASE `name` WHEN 'SystemDeptCreate' THEN '{"title":"common.create"}' WHEN 'SystemDeptEdit' THEN '{"title":"common.edit"}' WHEN 'SystemDeptDelete' THEN '{"title":"common.delete"}' + WHEN 'SystemLog' THEN '{"icon":"lucide:scroll-text","title":"system.log.title"}' WHEN 'Project' THEN '{"badgeType":"dot","icon":"carbon:data-center","order":9998,"title":"demos.vben.title"}' WHEN 'VbenDocument' THEN '{"icon":"carbon:book","iframeSrc":"https://doc.vben.pro","title":"demos.vben.document"}' WHEN 'VbenGithub' THEN '{"icon":"carbon:logo-github","link":"https://github.com/vbenjs/vue-vben-admin","title":"Github"}' @@ -44,6 +45,7 @@ WHERE `name` IN ( 'SystemDeptCreate', 'SystemDeptEdit', 'SystemDeptDelete', + 'SystemLog', 'Project', 'VbenDocument', 'VbenGithub', diff --git a/sql/system-log-menu.sql b/sql/system-log-menu.sql new file mode 100644 index 0000000..7af1f0d --- /dev/null +++ b/sql/system-log-menu.sql @@ -0,0 +1,50 @@ +-- 增量补齐系统日志菜单。 +-- 用途:已有库不需要重跑完整 vben-admin-init.sql 时,可单独执行本文件。 + +SET NAMES utf8mb4; + +INSERT INTO `admin_menu` ( + `id`, + `pid`, + `name`, + `path`, + `component`, + `redirect`, + `auth_code`, + `type`, + `meta`, + `status`, + `sort` +) +VALUES ( + 2041700000000100205, + 2041700000000100002, + 'SystemLog', + '/system/logs', + '/system/log/list', + NULL, + 'System:Log:List', + 'menu', + '{"icon":"lucide:scroll-text","title":"system.log.title"}', + 1, + 6 +) +ON DUPLICATE KEY UPDATE + `pid` = VALUES(`pid`), + `path` = VALUES(`path`), + `component` = VALUES(`component`), + `redirect` = VALUES(`redirect`), + `auth_code` = VALUES(`auth_code`), + `type` = VALUES(`type`), + `meta` = VALUES(`meta`), + `status` = VALUES(`status`), + `sort` = VALUES(`sort`), + `is_deleted` = 0; + +INSERT IGNORE INTO `admin_role_menu` (`role_id`, `menu_id`) +SELECT role.`id`, menu.`id` +FROM `admin_role` role +JOIN `admin_menu` menu ON menu.`name` = 'SystemLog' +WHERE role.`role_code` IN ('super', 'admin') + AND role.`is_deleted` = 0 + AND menu.`is_deleted` = 0; diff --git a/sql/vben-admin-init.sql b/sql/vben-admin-init.sql index 5923e78..70ec778 100644 --- a/sql/vben-admin-init.sql +++ b/sql/vben-admin-init.sql @@ -183,6 +183,7 @@ VALUES (2041700000000120204, 2041700000000100203, 'SystemKtTableDemoCreate', NULL, NULL, NULL, 'System:KtTableDemo:Create', 'button', '{"title":"common.create"}', 1, 0), (2041700000000120205, 2041700000000100203, 'SystemKtTableDemoEdit', NULL, NULL, NULL, 'System:KtTableDemo:Edit', 'button', '{"title":"common.edit"}', 1, 0), (2041700000000120206, 2041700000000100203, 'SystemKtTableDemoDelete', NULL, NULL, NULL, 'System:KtTableDemo:Delete', 'button', '{"title":"common.delete"}', 1, 0), + (2041700000000100205, 2041700000000100002, 'SystemLog', '/system/logs', '/system/log/list', NULL, 'System:Log:List', 'menu', '{"icon":"lucide:scroll-text","title":"system.log.title"}', 1, 6), (2041700000000100300, 0, 'Blog', '/blog', NULL, '/blog/article', NULL, 'catalog', '{"icon":"lucide:newspaper","order":100,"title":"博客管理"}', 1, 100), (2041700000000100301, 2041700000000100300, 'BlogArticle', '/blog/article', '/blog/article/list', NULL, 'Blog:Article:List', 'menu', '{"icon":"lucide:file-text","title":"文章管理"}', 1, 0), (2041700000000120301, 2041700000000100301, 'BlogArticleCreate', NULL, NULL, NULL, 'Blog:Article:Create', 'button', '{"title":"common.create"}', 1, 0), diff --git a/src/admin/admin.module.ts b/src/admin/admin.module.ts index dcad556..bd327a2 100644 --- a/src/admin/admin.module.ts +++ b/src/admin/admin.module.ts @@ -16,6 +16,8 @@ import { AdminMenuService } from './menu/admin-menu.service'; import { AdminRoleController } from './role/admin-role.controller'; import { AdminRole } from './role/admin-role.entity'; import { AdminRoleService } from './role/admin-role.service'; +import { SystemLogController } from './system-log/system-log.controller'; +import { SystemLogService } from './system-log/system-log.service'; import { AdminTimezoneController } from './timezone/admin-timezone.controller'; import { AdminTimezoneService } from './timezone/admin-timezone.service'; import { AdminUserManageController } from './user/admin-user-manage.controller'; @@ -47,6 +49,7 @@ import { WordpressModule } from '@/wordpress/wordpress.module'; AdminRoleController, AdminDeptController, ComponentController, + SystemLogController, AdminTimezoneController, AdminExampleController, ], @@ -55,6 +58,7 @@ import { WordpressModule } from '@/wordpress/wordpress.module'; AdminDeptService, AdminMenuService, AdminRoleService, + SystemLogService, AdminTimezoneService, AdminUserService, ], diff --git a/src/admin/component/component.controller.ts b/src/admin/component/component.controller.ts index ecab7fa..699f564 100644 --- a/src/admin/component/component.controller.ts +++ b/src/admin/component/component.controller.ts @@ -39,8 +39,8 @@ const componentExample = { componentTypeMsg: '折线图', image: '', template: '%7B%22version%22%3A%221.0%22%7D', - createTime: '2026-05-13T02:30:00.000Z', - updateTime: '2026-05-13T02:30:00.000Z', + createTime: '2026-05-13 10:30:00', + updateTime: '2026-05-13 10:30:00', is_deleted: false, }; diff --git a/src/admin/component/component.entity.ts b/src/admin/component/component.entity.ts index 948aeaa..aee4537 100644 --- a/src/admin/component/component.entity.ts +++ b/src/admin/component/component.entity.ts @@ -8,7 +8,12 @@ import { UpdateDateColumn, } from 'typeorm'; import { ApiProperty, ApiPropertyOptional } from '@nestjs/swagger'; -import { DecodeDictKey, decodeDictKeys, ensureSnowflakeId } from '@/common'; +import { + DecodeDictKey, + decodeDictKeys, + ensureSnowflakeId, + FormatDateTime, +} from '@/common'; @Entity('admin_component') export class Component { @@ -67,11 +72,13 @@ export class Component { @CreateDateColumn({ name: 'create_time', }) + @FormatDateTime() createTime: Date; @UpdateDateColumn({ name: 'update_time', }) + @FormatDateTime() updateTime: Date; @Column({ diff --git a/src/admin/dept/admin-dept.entity.ts b/src/admin/dept/admin-dept.entity.ts index a366a54..9af32a3 100644 --- a/src/admin/dept/admin-dept.entity.ts +++ b/src/admin/dept/admin-dept.entity.ts @@ -6,7 +6,7 @@ import { PrimaryColumn, UpdateDateColumn, } from 'typeorm'; -import { ensureSnowflakeId } from '@/common'; +import { ensureSnowflakeId, FormatDateTime } from '@/common'; @Entity('admin_dept') export class AdminDept { @@ -43,11 +43,13 @@ export class AdminDept { @CreateDateColumn({ name: 'create_time', }) + @FormatDateTime() createTime: Date; @UpdateDateColumn({ name: 'update_time', }) + @FormatDateTime() updateTime: Date; @BeforeInsert() diff --git a/src/admin/dict/admin-dict.entity.ts b/src/admin/dict/admin-dict.entity.ts index 97f4f37..21d23c1 100644 --- a/src/admin/dict/admin-dict.entity.ts +++ b/src/admin/dict/admin-dict.entity.ts @@ -7,7 +7,7 @@ import { UpdateDateColumn, } from 'typeorm'; import { ApiProperty, ApiPropertyOptional } from '@nestjs/swagger'; -import { ensureSnowflakeId } from '@/common'; +import { ensureSnowflakeId, FormatDateTime } from '@/common'; @Entity('admin_dict') export class AdminDict { @@ -68,11 +68,13 @@ export class AdminDict { @CreateDateColumn({ name: 'create_time', }) + @FormatDateTime() createTime: Date; @UpdateDateColumn({ name: 'update_time', }) + @FormatDateTime() updateTime: Date; @BeforeInsert() diff --git a/src/admin/dict/dict.dto.ts b/src/admin/dict/dict.dto.ts index 394ebbf..9310454 100644 --- a/src/admin/dict/dict.dto.ts +++ b/src/admin/dict/dict.dto.ts @@ -1,5 +1,6 @@ import { PartialType } from '@nestjs/swagger'; import { ApiProperty, ApiPropertyOptional } from '@nestjs/swagger'; +import { FormatDateTime } from '@/common'; export class DictDto { @ApiProperty({ @@ -56,13 +57,15 @@ export class AdminDictDto { status?: number; @ApiPropertyOptional({ - example: '2026-06-03T12:00:00.000Z', + example: '2026-06-03 20:00:00', }) + @FormatDateTime() createTime?: Date; @ApiPropertyOptional({ - example: '2026-06-03T12:00:00.000Z', + example: '2026-06-03 20:00:00', }) + @FormatDateTime() updateTime?: Date; } diff --git a/src/admin/example/admin-example.controller.ts b/src/admin/example/admin-example.controller.ts index 2722068..2b4c596 100644 --- a/src/admin/example/admin-example.controller.ts +++ b/src/admin/example/admin-example.controller.ts @@ -12,7 +12,7 @@ import { FileInterceptor } from '@nestjs/platform-express'; import { ApiOperation, ApiTags } from '@nestjs/swagger'; import type { Response } from 'express'; import { JwtAuthGuard } from '../auth/jwt-auth.guard'; -import { Public, vbenPage, vbenSuccess } from '@/common'; +import { formatKtDateTime, Public, vbenPage, vbenSuccess } from '@/common'; import { MinioClientService } from '@/minio/minio.service'; import type { MinioUploadFile } from '@/minio/minio.types'; import type { AdminDemoTableRow } from '../admin.types'; @@ -42,7 +42,9 @@ const DEMO_ROWS: AdminDemoTableRow[] = Array.from( productName: `KT Admin 模板能力 ${sequence}`, quantity: 10 + sequence, rating: Number((3 + (sequence % 20) / 10).toFixed(1)), - releaseDate: new Date(2026, index % 12, (index % 28) + 1).toISOString(), + releaseDate: formatKtDateTime( + new Date(2026, index % 12, (index % 28) + 1), + ), status: statuses[index % statuses.length], tags: [ 'kt', diff --git a/src/admin/menu/admin-menu.entity.ts b/src/admin/menu/admin-menu.entity.ts index 4cf022f..942cfbc 100644 --- a/src/admin/menu/admin-menu.entity.ts +++ b/src/admin/menu/admin-menu.entity.ts @@ -7,7 +7,7 @@ import { PrimaryColumn, UpdateDateColumn, } from 'typeorm'; -import { ensureSnowflakeId } from '@/common'; +import { ensureSnowflakeId, FormatDateTime } from '@/common'; import { AdminRole } from '../role/admin-role.entity'; import type { AdminMenuMeta, AdminMenuType } from '../admin.types'; @@ -86,11 +86,13 @@ export class AdminMenu { @CreateDateColumn({ name: 'create_time', }) + @FormatDateTime() createTime: Date; @UpdateDateColumn({ name: 'update_time', }) + @FormatDateTime() updateTime: Date; @ManyToMany(() => AdminRole, (role) => role.menus) diff --git a/src/admin/role/admin-role.entity.ts b/src/admin/role/admin-role.entity.ts index 87ea023..fcebffb 100644 --- a/src/admin/role/admin-role.entity.ts +++ b/src/admin/role/admin-role.entity.ts @@ -8,7 +8,7 @@ import { PrimaryColumn, UpdateDateColumn, } from 'typeorm'; -import { ensureSnowflakeId } from '@/common'; +import { ensureSnowflakeId, FormatDateTime } from '@/common'; import { AdminMenu } from '../menu/admin-menu.entity'; import { AdminUser } from '../user/admin-user.entity'; @@ -47,11 +47,13 @@ export class AdminRole { @CreateDateColumn({ name: 'create_time', }) + @FormatDateTime() createTime: Date; @UpdateDateColumn({ name: 'update_time', }) + @FormatDateTime() updateTime: Date; @ManyToMany(() => AdminMenu, (menu) => menu.roles) diff --git a/src/admin/system-log/system-log.controller.ts b/src/admin/system-log/system-log.controller.ts new file mode 100644 index 0000000..8c0ecd3 --- /dev/null +++ b/src/admin/system-log/system-log.controller.ts @@ -0,0 +1,74 @@ +import { Controller, Get, Query, UseGuards } from '@nestjs/common'; +import { ApiOperation, ApiTags } from '@nestjs/swagger'; +import { + ApiArrayResponse, + ApiModelResponse, + ApiPageResponse, + vbenPage, + vbenSuccess, +} from '@/common'; +import { JwtAuthGuard } from '../auth/jwt-auth.guard'; +import { + SystemLogDto, + SystemLogQueryDto, + SystemLogStatusDto, + SystemLogSummaryDto, +} from './system-log.dto'; +import { SystemLogService } from './system-log.service'; + +@ApiTags('Admin - 系统日志') +@Controller('system/logs') +@UseGuards(JwtAuthGuard) +export class SystemLogController { + constructor(private readonly systemLogService: SystemLogService) {} + + @Get() + @ApiOperation({ summary: '查询系统日志' }) + @ApiPageResponse(SystemLogDto, [ + { + id: '1760000000000000000-0-0', + timestamp: '2026-06-04 08:00:00', + timestampNs: '1760000000000000000', + level: 'info', + context: 'RouterExplorer', + message: 'Mapped route', + method: 'GET', + path: '/system/logs', + statusCode: 200, + durationMs: 12, + requestId: 'd9ac19e3-9e0d-4e19-b48e-6a6b4a31a2d2', + hostname: 'kt-template-online-api', + raw: '{"level":30,"msg":"Mapped route"}', + }, + ]) + async list(@Query() query: SystemLogQueryDto) { + const page = await this.systemLogService.page(query); + return vbenPage(page.items, page.total); + } + + @Get('summary') + @ApiOperation({ summary: '查询系统日志级别统计' }) + @ApiArrayResponse(SystemLogSummaryDto, [{ level: 'error', count: 2 }]) + async summary(@Query() query: SystemLogQueryDto) { + return vbenSuccess(await this.systemLogService.summary(query)); + } + + @Get('levels') + @ApiOperation({ summary: '查询系统日志级别选项' }) + async levels() { + return vbenSuccess(this.systemLogService.levels()); + } + + @Get('status') + @ApiOperation({ summary: '查询系统日志配置状态' }) + @ApiModelResponse(SystemLogStatusDto, { + app: 'kt-template-online-api', + configured: true, + env: 'production', + host: 'http://loki:3100', + selector: '{app="kt-template-online-api",env="production"}', + }) + async status() { + return vbenSuccess(this.systemLogService.status()); + } +} diff --git a/src/admin/system-log/system-log.dto.ts b/src/admin/system-log/system-log.dto.ts new file mode 100644 index 0000000..f436741 --- /dev/null +++ b/src/admin/system-log/system-log.dto.ts @@ -0,0 +1,107 @@ +import { ApiPropertyOptional } from '@nestjs/swagger'; +import { FormatDateTime } from '@/common'; + +export class SystemLogQueryDto { + @ApiPropertyOptional({ description: '日志级别:debug/info/warning/error/critical' }) + level?: string; + + @ApiPropertyOptional({ description: '全文关键字' }) + keyword?: string; + + @ApiPropertyOptional({ description: 'Nest 日志上下文' }) + context?: string; + + @ApiPropertyOptional({ description: '请求路径关键字' }) + path?: string; + + @ApiPropertyOptional({ description: '请求 ID' }) + requestId?: string; + + @ApiPropertyOptional({ description: '开始时间 ISO 字符串或时间戳' }) + startTime?: string; + + @ApiPropertyOptional({ description: '结束时间 ISO 字符串或时间戳' }) + endTime?: string; + + @ApiPropertyOptional({ description: '相对结束时间向前查询分钟数' }) + rangeMinutes?: number | string; + + @ApiPropertyOptional({ description: '页码' }) + page?: number | string; + + @ApiPropertyOptional({ description: '页码' }) + pageNo?: number | string; + + @ApiPropertyOptional({ description: '每页条数' }) + pageSize?: number | string; + + @ApiPropertyOptional({ description: 'Loki 单次查询最大拉取条数' }) + limit?: number | string; +} + +export class SystemLogDto { + @ApiPropertyOptional({ description: '唯一行 ID' }) + id: string; + + @ApiPropertyOptional({ description: '日志时间' }) + @FormatDateTime() + timestamp: string; + + @ApiPropertyOptional({ description: 'Loki 纳秒时间戳' }) + timestampNs: string; + + @ApiPropertyOptional({ description: '日志级别' }) + level: string; + + @ApiPropertyOptional({ description: '日志上下文' }) + context?: string; + + @ApiPropertyOptional({ description: '消息' }) + message: string; + + @ApiPropertyOptional({ description: 'HTTP 方法' }) + method?: string; + + @ApiPropertyOptional({ description: '请求路径' }) + path?: string; + + @ApiPropertyOptional({ description: 'HTTP 状态码' }) + statusCode?: number; + + @ApiPropertyOptional({ description: '耗时,毫秒' }) + durationMs?: number; + + @ApiPropertyOptional({ description: '请求 ID' }) + requestId?: string; + + @ApiPropertyOptional({ description: '主机名' }) + hostname?: string; + + @ApiPropertyOptional({ description: '原始日志行' }) + raw: string; +} + +export class SystemLogSummaryDto { + @ApiPropertyOptional({ description: '日志级别' }) + level: string; + + @ApiPropertyOptional({ description: '数量' }) + count: number; +} + +export class SystemLogStatusDto { + @ApiPropertyOptional({ description: '是否已配置 Loki 查询地址' }) + configured: boolean; + + @ApiPropertyOptional({ description: '默认 LogQL selector' }) + selector: string; + + @ApiPropertyOptional({ description: '日志应用标签' }) + app: string; + + @ApiPropertyOptional({ description: '日志环境标签' }) + env: string; + + @ApiPropertyOptional({ description: 'Loki 地址脱敏展示' }) + host?: string; +} diff --git a/src/admin/system-log/system-log.service.ts b/src/admin/system-log/system-log.service.ts new file mode 100644 index 0000000..a0dfff3 --- /dev/null +++ b/src/admin/system-log/system-log.service.ts @@ -0,0 +1,454 @@ +import { HttpStatus, Injectable } from '@nestjs/common'; +import { ConfigService } from '@nestjs/config'; +import * as http from 'node:http'; +import * as https from 'node:https'; +import { URL } from 'node:url'; +import { + getAppName, + getLokiEnvironment, + formatDateTimeFields, + throwVbenError, + ToolsService, +} from '@/common'; +import { SystemLogDto } from './system-log.dto'; +import type { + SystemLogQueryDto, + SystemLogStatusDto, + SystemLogSummaryDto, +} from './system-log.dto'; + +type LokiStreamResult = { + stream?: Record; + values?: Array<[string, string, Record?]>; +}; + +type LokiQueryRangeResponse = { + data?: { + result?: LokiStreamResult[]; + resultType?: string; + }; + status?: string; +}; + +const DEFAULT_LEVELS = ['debug', 'info', 'warning', 'error', 'critical']; +const PINO_LEVEL_MAP: Record = { + '10': 'debug', + '20': 'debug', + '30': 'info', + '40': 'warning', + '50': 'error', + '60': 'critical', +}; + +@Injectable() +export class SystemLogService { + private readonly appName: string; + private readonly environment: string; + private readonly host: string; + + constructor( + private readonly configService: ConfigService, + private readonly toolsService: ToolsService, + ) { + this.appName = getAppName(configService); + this.environment = getLokiEnvironment(configService); + this.host = this.normalizeUrl( + this.getConfig('LOKI_QUERY_HOST') || + this.getConfig('LOKI_HOST') || + this.getConfig('LOKI_URL'), + ); + } + + status(): SystemLogStatusDto { + return { + app: this.appName, + configured: !!this.host, + env: this.environment, + host: this.maskHost(this.host), + selector: this.getBaseSelector(), + }; + } + + levels() { + return DEFAULT_LEVELS.map((level) => ({ + label: level, + value: level, + })); + } + + async page(query: SystemLogQueryDto = {}) { + if (!this.host) { + return { + items: [], + total: 0, + }; + } + + const { pageNo, pageSize } = this.toolsService.getPageParams( + query, + 1, + 20, + ); + const requestLimit = Math.min( + this.toolsService.toPositiveNumber(query.limit, pageNo * pageSize), + this.getNumberConfig('LOKI_QUERY_MAX_LIMIT', 1000), + ); + const logs = await this.queryLogs(query, Math.max(requestLimit, pageSize)); + const filteredLogs = logs.filter((item) => this.matchesQuery(item, query)); + const startIndex = (pageNo - 1) * pageSize; + + return { + items: filteredLogs.slice(startIndex, startIndex + pageSize), + total: filteredLogs.length, + }; + } + + async summary( + query: SystemLogQueryDto = {}, + ): Promise { + if (!this.host) { + return DEFAULT_LEVELS.map((level) => ({ count: 0, level })); + } + + const logs = await this.queryLogs( + { + ...query, + level: undefined, + }, + this.toolsService.toPositiveNumber(query.limit, 1000), + ); + const filteredLogs = logs.filter((item) => this.matchesQuery(item, query)); + const countMap = new Map(DEFAULT_LEVELS.map((level) => [level, 0])); + filteredLogs.forEach((item) => { + const level = this.normalizeLevel(item.level) || 'info'; + countMap.set(level, (countMap.get(level) || 0) + 1); + }); + + return DEFAULT_LEVELS.map((level) => ({ + count: countMap.get(level) || 0, + level, + })); + } + + private async queryLogs(query: SystemLogQueryDto, limit: number) { + const url = new URL( + this.getConfig('LOKI_QUERY_ENDPOINT', '/loki/api/v1/query_range'), + this.host, + ); + const { start, end } = this.getTimeRange(query); + url.searchParams.set('query', this.buildLogQL(query)); + url.searchParams.set('start', this.toNanoseconds(start)); + url.searchParams.set('end', this.toNanoseconds(end)); + url.searchParams.set('limit', `${limit}`); + url.searchParams.set('direction', 'backward'); + + let response: LokiQueryRangeResponse; + try { + response = await this.requestJson(url); + } catch (error) { + throwVbenError( + this.toolsService.getErrorMessage(error, 'Loki 查询失败'), + HttpStatus.BAD_GATEWAY, + ); + } + if (response.status && response.status !== 'success') { + throwVbenError('Loki 查询失败', HttpStatus.BAD_GATEWAY, response.status); + } + + return this.flattenLogs(response.data?.result || []); + } + + private buildLogQL(query: SystemLogQueryDto) { + const selector = this.withLevelSelector( + this.getBaseSelector(), + this.normalizeLevel(query.level), + ); + const lineFilters = [ + query.keyword, + query.context, + query.path, + query.requestId, + ] + .map((value) => this.toolsService.toTrimmedString(value)) + .filter(Boolean) + .map((value) => `|= "${this.escapeLogqlString(value)}"`); + + return [selector, ...lineFilters].join(' '); + } + + private withLevelSelector(selector: string, level?: string) { + if (!level || selector.includes('level=')) return selector; + return selector.replace(/}\s*$/, `,level="${this.escapeLabelValue(level)}"}`); + } + + private getBaseSelector() { + const selector = this.getConfig('LOKI_QUERY_SELECTOR'); + if (selector) return selector; + + return `{app="${this.escapeLabelValue( + this.appName, + )}",env="${this.escapeLabelValue(this.environment)}"}`; + } + + private flattenLogs(streams: LokiStreamResult[]): SystemLogDto[] { + return streams + .flatMap((stream, streamIndex) => + (stream.values || []).map(([timestampNs, line, metadata], rowIndex) => + this.serializeLog({ + line, + metadata, + rowIndex, + stream: stream.stream || {}, + streamIndex, + timestampNs, + }), + ), + ) + .sort((prev, next) => + this.compareTimestamp(next.timestampNs, prev.timestampNs), + ); + } + + private serializeLog(params: { + line: string; + metadata?: Record; + rowIndex: number; + stream: Record; + streamIndex: number; + timestampNs: string; + }): SystemLogDto { + const parsed = this.parseLogLine(params.line); + const req = this.asRecord(parsed.req); + const res = this.asRecord(parsed.res); + const meta = this.asRecord(parsed.meta); + const level = + this.normalizeLevel(params.stream.level) || + this.normalizeLevel(parsed.level) || + 'info'; + const requestId = + this.pickText(params.metadata?.requestId, meta.requestId, req.id) || + undefined; + const path = this.pickText(parsed.path, req.url, req.originalUrl) || undefined; + + return formatDateTimeFields( + Object.assign(new SystemLogDto(), { + context: + this.pickText(parsed.context, params.stream.context) || undefined, + durationMs: this.toOptionalNumber( + parsed.durationMs, + parsed.responseTime, + ), + hostname: params.stream.hostname, + id: `${params.timestampNs}-${params.streamIndex}-${params.rowIndex}`, + level, + message: + this.pickText(parsed.msg, parsed.message, parsed.err?.message) || + params.line, + method: this.pickText(parsed.method, req.method) || undefined, + path, + raw: params.line, + requestId, + statusCode: this.toOptionalNumber(parsed.statusCode, res.statusCode), + timestamp: this.timestampNsToDate(params.timestampNs), + timestampNs: params.timestampNs, + }), + ); + } + + private matchesQuery(item: SystemLogDto, query: SystemLogQueryDto) { + const level = this.normalizeLevel(query.level); + if (level && item.level !== level) return false; + if ( + !this.includes(item.raw, query.keyword) && + !this.includes(item.message, query.keyword) + ) { + return false; + } + if (!this.includes(item.context, query.context)) return false; + if (!this.includes(item.path, query.path)) return false; + if (!this.includes(item.requestId, query.requestId)) return false; + return true; + } + + private includes(value: unknown, keyword: unknown) { + const normalizedKeyword = this.toolsService.toTrimmedString(keyword); + if (!normalizedKeyword) return true; + return this.toolsService.includesText(value, normalizedKeyword); + } + + private getTimeRange(query: SystemLogQueryDto) { + const end = this.toDate(query.endTime) || new Date(); + const start = + this.toDate(query.startTime) || + new Date( + end.getTime() - + this.toolsService.toPositiveNumber(query.rangeMinutes, 60) * + 60 * + 1000, + ); + return { end, start }; + } + + private requestJson(url: URL) { + return new Promise((resolve, reject) => { + const client = url.protocol === 'http:' ? http : https; + const request = client.request( + url, + { + headers: { + Accept: 'application/json', + 'User-Agent': 'kt-template-online-api/admin-system-log', + ...this.getHeaders(), + }, + method: 'GET', + timeout: this.getNumberConfig('LOKI_QUERY_TIMEOUT_MS', 10000), + }, + (response) => { + let body = ''; + response.setEncoding('utf8'); + response.on('data', (chunk) => { + body += chunk; + }); + response.on('end', () => { + if ((response.statusCode || 500) >= 400) { + reject(new Error(`Loki 查询失败:${response.statusCode}`)); + return; + } + try { + resolve(JSON.parse(body) as T); + } catch { + reject(new Error('Loki 返回不是合法 JSON')); + } + }); + }, + ); + + request.on('timeout', () => { + request.destroy(new Error('Loki 查询超时')); + }); + request.on('error', reject); + request.end(); + }); + } + + private getHeaders() { + const headers: Record = {}; + const tenantId = this.getConfig('LOKI_TENANT_ID'); + const username = this.getConfig('LOKI_USERNAME'); + const password = this.getConfig('LOKI_PASSWORD'); + + if (tenantId) headers['X-Scope-OrgID'] = tenantId; + if (username && password) { + headers.Authorization = `Basic ${Buffer.from( + `${username}:${password}`, + ).toString('base64')}`; + } + + return headers; + } + + private parseLogLine(line: string): Record { + try { + const parsed = JSON.parse(line); + return parsed && typeof parsed === 'object' ? parsed : {}; + } catch { + return {}; + } + } + + private asRecord(value: unknown): Record { + return value && typeof value === 'object' ? (value as Record) : {}; + } + + private pickText(...values: unknown[]) { + return this.toolsService.pickFirstText(...values); + } + + private normalizeLevel(value: unknown) { + const text = this.toolsService.toTrimmedString(value).toLowerCase(); + if (!text) return ''; + if (PINO_LEVEL_MAP[text]) return PINO_LEVEL_MAP[text]; + if (text === 'warn') return 'warning'; + return DEFAULT_LEVELS.includes(text) ? text : ''; + } + + private toDate(value: unknown) { + const text = this.toolsService.toTrimmedString(value); + if (!text) return null; + const timestamp = /^\d+$/.test(text) ? this.normalizeTimestamp(text) : Date.parse(text); + const date = new Date(timestamp); + return Number.isNaN(date.getTime()) ? null : date; + } + + private toNanoseconds(date: Date) { + return `${BigInt(date.getTime()) * 1000000n}`; + } + + private timestampNsToDate(value: string) { + try { + return new Date(Number(BigInt(value) / 1000000n)); + } catch { + return new Date(); + } + } + + private compareTimestamp(left: string, right: string) { + try { + const diff = BigInt(left) - BigInt(right); + return diff > 0n ? 1 : diff < 0n ? -1 : 0; + } catch { + return left.localeCompare(right); + } + } + + private toOptionalNumber(...values: unknown[]) { + for (const value of values) { + const nextValue = Number(value); + if (Number.isFinite(nextValue)) return nextValue; + } + return undefined; + } + + private escapeLogqlString(value: string) { + return value.replace(/\\/g, '\\\\').replace(/"/g, '\\"'); + } + + private escapeLabelValue(value: string) { + return this.escapeLogqlString(value); + } + + private getConfig(key: string, fallback = '') { + const value = this.configService.get(key); + return this.toolsService.toTrimmedString(value || fallback); + } + + private getNumberConfig(key: string, fallback: number) { + const value = Number(this.configService.get(key)); + return Number.isFinite(value) && value > 0 ? value : fallback; + } + + private normalizeUrl(value: string) { + return value.replace(/\/+$/g, ''); + } + + private maskHost(host: string) { + if (!host) return undefined; + try { + const url = new URL(host); + if (url.username || url.password) { + url.username = '***'; + url.password = '***'; + } + return url.toString().replace(/\/+$/g, ''); + } catch { + return host; + } + } + + private normalizeTimestamp(value: string) { + if (value.length === 10) return Number(value) * 1000; + if (value.length === 16) return Math.floor(Number(value) / 1000); + if (value.length >= 19) return Number(BigInt(value) / 1000000n); + return Number(value); + } +} diff --git a/src/admin/user/admin-user.entity.ts b/src/admin/user/admin-user.entity.ts index cf15447..fe6a672 100644 --- a/src/admin/user/admin-user.entity.ts +++ b/src/admin/user/admin-user.entity.ts @@ -10,7 +10,7 @@ import { PrimaryColumn, UpdateDateColumn, } from 'typeorm'; -import { ensureSnowflakeId } from '@/common'; +import { ensureSnowflakeId, FormatDateTime } from '@/common'; import { AdminDept } from '../dept/admin-dept.entity'; import { AdminRole } from '../role/admin-role.entity'; @@ -66,11 +66,13 @@ export class AdminUser { @CreateDateColumn({ name: 'create_time', }) + @FormatDateTime() createTime: Date; @UpdateDateColumn({ name: 'update_time', }) + @FormatDateTime() updateTime: Date; @ManyToMany(() => AdminRole, (role) => role.users, { diff --git a/src/app.module.ts b/src/app.module.ts index 5a874f7..5a97df5 100644 --- a/src/app.module.ts +++ b/src/app.module.ts @@ -2,6 +2,7 @@ import { Module } from '@nestjs/common'; import { ConfigModule } from '@nestjs/config'; import { ConfigService } from '@nestjs/config'; import { APP_FILTER, APP_INTERCEPTOR } from '@nestjs/core'; +import { LoggerModule } from 'nestjs-pino'; import { AppService } from './app.service'; import { TypeOrmModule } from '@nestjs/typeorm'; import { MinioModule } from 'nestjs-minio-client'; @@ -9,6 +10,7 @@ import { MinioClientModule } from './minio/minio.module'; import { ApiExceptionFilter, CommonModule, + createPinoLoggerParams, SaveBodyInterceptor, } from './common'; import { AdminModule } from './admin/admin.module'; @@ -21,6 +23,12 @@ import { QqbotModule } from './qqbot/qqbot.module'; isGlobal: true, envFilePath: `.env.${process.env.NODE_ENV || 'development'}`, }), + LoggerModule.forRootAsync({ + imports: [ConfigModule], + inject: [ConfigService], + useFactory: (configService: ConfigService) => + createPinoLoggerParams(configService), + }), TypeOrmModule.forRootAsync({ imports: [ConfigModule], useFactory: async (configService: ConfigService) => { diff --git a/src/common/decorators/format-date-time.decorator.ts b/src/common/decorators/format-date-time.decorator.ts new file mode 100644 index 0000000..ee7bdc5 --- /dev/null +++ b/src/common/decorators/format-date-time.decorator.ts @@ -0,0 +1,103 @@ +import { AfterLoad } from 'typeorm'; + +export const KT_DATETIME_FORMAT = 'YYYY-MM-DD HH:mm:ss'; + +const DATE_TIME_FORMAT_RULES = Symbol('DATE_TIME_FORMAT_RULES'); +const DATE_TIME_FORMAT_HOOK_REGISTERED = Symbol( + 'DATE_TIME_FORMAT_HOOK_REGISTERED', +); +const DATE_TIME_FORMAT_HOOK = '__ktFormatDateTimeFields'; +const ISO_DATE_TIME_PATTERN = + /^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(?:\.\d{1,6})?(?:Z|[+-]\d{2}:\d{2})?$/; +const DATE_TIME_TEXT_PATTERN = + /^\d{4}-\d{2}-\d{2}[ T]\d{2}:\d{2}:\d{2}$/; + +type DateTimeFormatRule = { + sourceKey: string; + targetKey: string; +}; + +type DateTimeFormatTarget = Record & { + [DATE_TIME_FORMAT_HOOK_REGISTERED]?: boolean; + [DATE_TIME_FORMAT_RULES]?: DateTimeFormatRule[]; +}; + +const padDateUnit = (value: number) => `${value}`.padStart(2, '0'); + +export const formatKtDateTime = (value: Date | number | string): string => { + const date = value instanceof Date ? value : new Date(value); + if (Number.isNaN(date.getTime())) return ''; + + return [ + `${date.getFullYear()}-${padDateUnit(date.getMonth() + 1)}-${padDateUnit( + date.getDate(), + )}`, + `${padDateUnit(date.getHours())}:${padDateUnit( + date.getMinutes(), + )}:${padDateUnit(date.getSeconds())}`, + ].join(' '); +}; + +const formatDateTimeFieldValue = (value: unknown) => { + if (value instanceof Date) { + return formatKtDateTime(value); + } + + if (typeof value === 'number' && Number.isFinite(value)) { + return formatKtDateTime(value); + } + + if (typeof value === 'string' && isDateTimeText(value)) { + const formatted = formatKtDateTime(value); + return formatted || value; + } + + return value; +}; + +const isDateTimeText = (value: string) => + ISO_DATE_TIME_PATTERN.test(value) || DATE_TIME_TEXT_PATTERN.test(value); + +const getDateTimeFormatRules = (target: object): DateTimeFormatRule[] => { + const prototype = Object.getPrototypeOf(target); + + return prototype?.[DATE_TIME_FORMAT_RULES] || []; +}; + +const ensureDateTimeFormatHook = (target: DateTimeFormatTarget) => { + if (target[DATE_TIME_FORMAT_HOOK_REGISTERED]) return; + + Object.defineProperty(target, DATE_TIME_FORMAT_HOOK, { + configurable: true, + value: function (this: object) { + formatDateTimeFields(this); + }, + }); + + AfterLoad()(target, DATE_TIME_FORMAT_HOOK); + target[DATE_TIME_FORMAT_HOOK_REGISTERED] = true; +}; + +export const FormatDateTime = (): PropertyDecorator => { + return (target, propertyKey) => { + const fieldKey = propertyKey.toString(); + const rules = target[DATE_TIME_FORMAT_RULES] || []; + + target[DATE_TIME_FORMAT_RULES] = [ + ...rules.filter(({ targetKey }) => targetKey !== fieldKey), + { + sourceKey: fieldKey, + targetKey: fieldKey, + }, + ]; + ensureDateTimeFormatHook(target as DateTimeFormatTarget); + }; +}; + +export function formatDateTimeFields(target: T): T { + getDateTimeFormatRules(target).forEach(({ sourceKey, targetKey }) => { + target[targetKey] = formatDateTimeFieldValue(target[sourceKey]); + }); + + return target; +} diff --git a/src/common/filters/api-exception.filter.ts b/src/common/filters/api-exception.filter.ts index a72a90d..e2342e3 100644 --- a/src/common/filters/api-exception.filter.ts +++ b/src/common/filters/api-exception.filter.ts @@ -5,26 +5,64 @@ import { HttpException, HttpStatus, } from '@nestjs/common'; -import { Response } from 'express'; +import { Request, Response } from 'express'; +import { PinoLogger } from 'nestjs-pino'; import { normalizeVbenErrorText } from '../response/vben-response'; import type { ExceptionBody, KtErrorResponse } from '../types'; @Catch() export class ApiExceptionFilter implements ExceptionFilter { + constructor(private readonly logger: PinoLogger) { + this.logger.setContext(ApiExceptionFilter.name); + } + catch(exception: unknown, host: ArgumentsHost) { const ctx = host.switchToHttp(); + const request = ctx.getRequest(); const response = ctx.getResponse(); const status = this.getStatus(exception); const body = this.getBody(exception); const msg = this.getMessage(status, body, exception); + const err = this.getErr(status, body, exception, msg); + + this.logException({ + err, + exception, + msg, + request, + status, + }); response.status(status).json({ code: status, msg, - err: this.getErr(status, body, exception, msg), + err, } satisfies KtErrorResponse); } + private logException(params: { + err: string; + exception: unknown; + msg: string; + request: Request; + status: number; + }) { + const payload = { + err: this.getLogError(params.exception, params.err), + method: params.request.method, + path: params.request.originalUrl || params.request.url, + requestId: `${(params.request as any).id || ''}`, + statusCode: params.status, + }; + + if (params.status >= 500) { + this.logger.error(payload, params.msg); + return; + } + + this.logger.warn(payload, params.msg); + } + private getStatus(exception: unknown) { if (exception instanceof HttpException) { return exception.getStatus(); @@ -78,4 +116,12 @@ export class ApiExceptionFilter implements ExceptionFilter { private stringifyMessage(message: unknown) { return normalizeVbenErrorText(message); } + + private getLogError(exception: unknown, fallback: string) { + if (exception instanceof Error) return exception; + return { + message: fallback, + raw: normalizeVbenErrorText(exception, fallback), + }; + } } diff --git a/src/common/index.ts b/src/common/index.ts index 2f89687..23e0934 100644 --- a/src/common/index.ts +++ b/src/common/index.ts @@ -1,9 +1,11 @@ export * from './common.module'; export * from './decorators/current-admin-user.decorator'; export * from './decorators/decode-dict.decorator'; +export * from './decorators/format-date-time.decorator'; export * from './decorators/public.decorator'; export * from './filters/api-exception.filter'; export * from './interceptors/save-body.interceptor'; +export * from './logger/pino-logger.config'; export * from './response/vben-response'; export * from './services/tool.service'; export * from './snowflake/snowflake-id'; diff --git a/src/common/logger/pino-logger.config.ts b/src/common/logger/pino-logger.config.ts new file mode 100644 index 0000000..9463a6c --- /dev/null +++ b/src/common/logger/pino-logger.config.ts @@ -0,0 +1,219 @@ +import { randomUUID } from 'node:crypto'; +import type { Request, Response } from 'express'; +import type { Params } from 'nestjs-pino'; +import type { ConfigService } from '@nestjs/config'; + +const DEFAULT_APP_NAME = 'kt-template-online-api'; +const REDACT_PATHS = [ + 'req.headers.authorization', + 'req.headers.cookie', + 'req.headers["x-admin-token"]', + 'req.headers["x-token"]', + 'body.accessToken', + 'body.adminToken', + 'body.authorization', + 'body.cookie', + 'body.password', + 'body.refreshToken', + 'body.secret', + 'body.token', + '*.clientSecret', + '*.password', + '*.secret', + '*.token', +]; + +export function createPinoLoggerParams( + configService: ConfigService, +): Params { + const nodeEnv = getString(configService, 'NODE_ENV', 'development'); + const appName = getAppName(configService); + const lokiHost = normalizeUrl( + getString(configService, 'LOKI_HOST') || getString(configService, 'LOKI_URL'), + ); + const logLevel = getString( + configService, + 'LOG_LEVEL', + nodeEnv === 'production' ? 'info' : 'debug', + ); + + return { + pinoHttp: { + autoLogging: { + ignore: (req: Request) => + ['/favicon.ico'].includes(req.url) || req.url.startsWith('/api-json'), + }, + base: { + app: appName, + env: nodeEnv, + }, + customAttributeKeys: { + responseTime: 'durationMs', + }, + customProps: (req: Request) => ({ + meta: { + requestId: getRequestId(req), + }, + }), + genReqId: (req: Request, res: Response) => { + const requestId = + getHeader(req, 'x-request-id') || + getHeader(req, 'x-correlation-id') || + randomUUID(); + res.setHeader('x-request-id', requestId); + return requestId; + }, + level: logLevel, + redact: { + censor: '[Redacted]', + paths: REDACT_PATHS, + }, + transport: createTransport(configService, { + appName, + logLevel, + lokiHost, + nodeEnv, + }), + }, + }; +} + +export function getAppName(configService: ConfigService) { + return getString(configService, 'LOG_APP_NAME', DEFAULT_APP_NAME); +} + +export function getLokiEnvironment(configService: ConfigService) { + return getString(configService, 'LOKI_ENV', getString(configService, 'NODE_ENV', 'development')); +} + +function createTransport( + configService: ConfigService, + options: { + appName: string; + logLevel: string; + lokiHost: string; + nodeEnv: string; + }, +) { + if (options.lokiHost) { + return { + targets: [ + { + level: options.logLevel, + options: { + destination: 1, + }, + target: 'pino/file', + }, + { + level: options.logLevel, + options: { + batching: { + interval: getNumber( + configService, + 'LOKI_BATCH_INTERVAL_SECONDS', + 5, + ), + maxBufferSize: getNumber( + configService, + 'LOKI_BATCH_MAX_BUFFER_SIZE', + 10000, + ), + }, + basicAuth: getBasicAuth(configService), + endpoint: getString( + configService, + 'LOKI_PUSH_ENDPOINT', + '/loki/api/v1/push', + ), + headers: getLokiHeaders(configService), + host: options.lokiHost, + labels: { + app: options.appName, + env: getLokiEnvironment(configService), + service: 'api', + }, + propsToLabels: ['context'], + silenceErrors: getBoolean(configService, 'LOKI_SILENCE_ERRORS', true), + timeout: getNumber(configService, 'LOKI_PUSH_TIMEOUT_MS', 30000), + }, + target: 'pino-loki', + }, + ], + }; + } + + if ( + options.nodeEnv !== 'production' && + getBoolean(configService, 'LOG_PRETTY', true) + ) { + return { + options: { + colorize: true, + ignore: 'pid,hostname', + singleLine: false, + translateTime: 'SYS:standard', + }, + target: 'pino-pretty', + }; + } + + return undefined; +} + +function getLokiHeaders(configService: ConfigService) { + const tenantId = getString(configService, 'LOKI_TENANT_ID'); + return tenantId + ? { + 'X-Scope-OrgID': tenantId, + } + : undefined; +} + +function getBasicAuth(configService: ConfigService) { + const username = getString(configService, 'LOKI_USERNAME'); + const password = getString(configService, 'LOKI_PASSWORD'); + return username && password ? { password, username } : undefined; +} + +function getHeader(req: Request, name: string) { + const value = req.headers[name.toLowerCase()]; + return Array.isArray(value) ? value[0] : `${value || ''}`.trim(); +} + +function getRequestId(req: Request) { + return `${(req as any).id || getHeader(req, 'x-request-id') || ''}`.trim(); +} + +function getString( + configService: ConfigService, + key: string, + fallback = '', +) { + const value = configService.get(key); + const normalized = `${value ?? ''}`.trim(); + return normalized || fallback; +} + +function getNumber( + configService: ConfigService, + key: string, + fallback: number, +) { + const value = Number(configService.get(key)); + return Number.isFinite(value) && value > 0 ? value : fallback; +} + +function getBoolean( + configService: ConfigService, + key: string, + fallback: boolean, +) { + const value = configService.get(key); + if (value === undefined || value === null || value === '') return fallback; + return ['1', 'true', 'yes'].includes(`${value}`.toLowerCase()); +} + +function normalizeUrl(value: string) { + return value.replace(/\/+$/g, ''); +} diff --git a/src/common/swagger/swagger-response.ts b/src/common/swagger/swagger-response.ts index 7d1498f..a7e7ad4 100644 --- a/src/common/swagger/swagger-response.ts +++ b/src/common/swagger/swagger-response.ts @@ -758,8 +758,8 @@ function adminDictExample() { childrenCode: 'CHART', sort: 1, status: 1, - createTime: '2026-06-03T12:00:00.000Z', - updateTime: '2026-06-03T12:00:00.000Z', + createTime: '2026-06-03 20:00:00', + updateTime: '2026-06-03 20:00:00', }; } @@ -819,13 +819,13 @@ function qqbotAccountExample() { connectionMode: 'reverse-ws', enabled: true, id: '1000000000000000001', - lastHeartbeatAt: '2026-06-02T12:00:00.000Z', + lastHeartbeatAt: '2026-06-02 20:00:00', name: '主账号', napcat: { bindStatus: 'bound', containerName: 'kt-qqbot-napcat-1914728559', containerStatus: 'running', - lastLoginAt: '2026-06-02T11:55:00.000Z', + lastLoginAt: '2026-06-02 19:55:00', webuiPort: 6100, }, selfId: '1914728559', @@ -911,7 +911,7 @@ function qqbotScanExample() { sessionId: 'KT_SCAN_20260602120000', qrcode: 'data:image/png;base64,MOCK_QRCODE', status: 'waiting', - expireAt: '2026-06-02T12:05:00.000Z', + expireAt: '2026-06-02 20:05:00', }; } @@ -964,7 +964,7 @@ function minioObjectExample() { name: 'uploads/demo.png', size: 2048, etag: '9b2cf535f27731c974343645a3985328', - lastModified: '2026-06-02T12:00:00.000Z', + lastModified: '2026-06-02 20:00:00', }; } diff --git a/src/main.ts b/src/main.ts index e4f3c48..b35f4be 100644 --- a/src/main.ts +++ b/src/main.ts @@ -1,6 +1,7 @@ import { NestFactory } from '@nestjs/core'; import { AppModule } from './app.module'; import { DocumentBuilder, SwaggerModule } from '@nestjs/swagger'; +import { Logger } from 'nestjs-pino'; import type { OpenAPIObject } from '@nestjs/swagger'; import { urlencoded, json } from 'express'; import { knife4jSetup } from '@kwitsukasa/knife4j-swagger-vue3'; @@ -47,7 +48,8 @@ const swaggerGroups: SwaggerDocumentGroup[] = [ ]; async function bootstrap() { - const app = await NestFactory.create(AppModule); + const app = await NestFactory.create(AppModule, { bufferLogs: true }); + app.useLogger(app.get(Logger)); app.use(json({ limit: '50mb' })); app.use(urlencoded({ extended: true, limit: '50mb' })); diff --git a/src/minio/minio.controller.ts b/src/minio/minio.controller.ts index 317e547..c1bc662 100644 --- a/src/minio/minio.controller.ts +++ b/src/minio/minio.controller.ts @@ -28,6 +28,7 @@ import { ApiArrayResponse, ApiModelResponse, ApiSuccessResponse, + formatDateTimeFields, ToolsService, } from '@/common'; import { @@ -142,7 +143,7 @@ export class MinioClientController { name: 'uploads/demo.png', size: 2048, etag: '9b2cf535f27731c974343645a3985328', - lastModified: '2026-05-13T02:30:00.000Z', + lastModified: '2026-05-13 10:30:00', }, ]) async list( @@ -151,11 +152,15 @@ export class MinioClientController { @Query('prefix') prefix?: string, @Query('recursive') recursive?: string, ) { - const result = await this.minioClientService.listObjects({ - bucketName, - prefix, - recursive: recursive !== 'false', - }); + const result = ( + (await this.minioClientService.listObjects({ + bucketName, + prefix, + recursive: recursive !== 'false', + })) as Record[] + ).map((item) => + formatDateTimeFields(Object.assign(new MinioObjectDto(), item)), + ); res.send(this.toolsService.res(HttpStatus.OK, '操作成功', result)); } diff --git a/src/minio/minio.dto.ts b/src/minio/minio.dto.ts index 86c1dcf..1e0281f 100644 --- a/src/minio/minio.dto.ts +++ b/src/minio/minio.dto.ts @@ -1,4 +1,5 @@ import { ApiProperty } from '@nestjs/swagger'; +import { FormatDateTime } from '@/common'; export class MinioBucketStatusDto { @ApiProperty({ @@ -61,7 +62,8 @@ export class MinioObjectDto { etag: string; @ApiProperty({ - example: '2026-05-13T02:30:00.000Z', + example: '2026-05-13 10:30:00', }) + @FormatDateTime() lastModified: string; } diff --git a/src/qqbot/account/qqbot-account-ability.entity.ts b/src/qqbot/account/qqbot-account-ability.entity.ts index 40ab68d..afb4f3f 100644 --- a/src/qqbot/account/qqbot-account-ability.entity.ts +++ b/src/qqbot/account/qqbot-account-ability.entity.ts @@ -7,7 +7,7 @@ import { PrimaryColumn, UpdateDateColumn, } from 'typeorm'; -import { ensureSnowflakeId } from '@/common'; +import { ensureSnowflakeId, FormatDateTime } from '@/common'; import type { QqbotAccountAbilityType } from '../qqbot.types'; @Entity('qqbot_account_ability') @@ -35,9 +35,11 @@ export class QqbotAccountAbility { isDeleted: boolean; @CreateDateColumn({ name: 'create_time' }) + @FormatDateTime() createTime: Date; @UpdateDateColumn({ name: 'update_time' }) + @FormatDateTime() updateTime: Date; @BeforeInsert() diff --git a/src/qqbot/account/qqbot-account.entity.ts b/src/qqbot/account/qqbot-account.entity.ts index 45d3d33..6768a1d 100644 --- a/src/qqbot/account/qqbot-account.entity.ts +++ b/src/qqbot/account/qqbot-account.entity.ts @@ -6,7 +6,7 @@ import { PrimaryColumn, UpdateDateColumn, } from 'typeorm'; -import { ensureSnowflakeId } from '@/common'; +import { ensureSnowflakeId, FormatDateTime } from '@/common'; import type { QqbotConnectionMode, QqbotConnectionRole, @@ -51,6 +51,7 @@ export class QqbotAccount { nullable: true, type: 'datetime', }) + @FormatDateTime() lastConnectedAt: Date | null; @Column({ @@ -59,6 +60,7 @@ export class QqbotAccount { nullable: true, type: 'datetime', }) + @FormatDateTime() lastHeartbeatAt: Date | null; @Column({ default: null, length: 500, name: 'last_error', nullable: true }) @@ -71,9 +73,11 @@ export class QqbotAccount { isDeleted: boolean; @CreateDateColumn({ name: 'create_time' }) + @FormatDateTime() createTime: Date; @UpdateDateColumn({ name: 'update_time' }) + @FormatDateTime() updateTime: Date; @BeforeInsert() diff --git a/src/qqbot/command/qqbot-command-log.entity.ts b/src/qqbot/command/qqbot-command-log.entity.ts index 2d85e3d..d3cfb01 100644 --- a/src/qqbot/command/qqbot-command-log.entity.ts +++ b/src/qqbot/command/qqbot-command-log.entity.ts @@ -6,7 +6,7 @@ import { PrimaryColumn, UpdateDateColumn, } from 'typeorm'; -import { ensureSnowflakeId } from '@/common'; +import { ensureSnowflakeId, FormatDateTime } from '@/common'; import type { QqbotMessageType } from '../qqbot.types'; import type { QqbotCommandLogStatus } from '../qqbot.types'; @@ -60,9 +60,11 @@ export class QqbotCommandLog { errorMessage: string | null; @CreateDateColumn({ name: 'create_time' }) + @FormatDateTime() createTime: Date; @UpdateDateColumn({ name: 'update_time' }) + @FormatDateTime() updateTime: Date; @BeforeInsert() diff --git a/src/qqbot/command/qqbot-command.entity.ts b/src/qqbot/command/qqbot-command.entity.ts index 5a7b1d6..e62f6aa 100644 --- a/src/qqbot/command/qqbot-command.entity.ts +++ b/src/qqbot/command/qqbot-command.entity.ts @@ -6,7 +6,7 @@ import { PrimaryColumn, UpdateDateColumn, } from 'typeorm'; -import { ensureSnowflakeId } from '@/common'; +import { ensureSnowflakeId, FormatDateTime } from '@/common'; import type { QqbotCommandParserType, QqbotRuleTargetType } from '../qqbot.types'; @Entity('qqbot_command') @@ -62,6 +62,7 @@ export class QqbotCommand { nullable: true, type: 'datetime', }) + @FormatDateTime() lastHitAt: Date | null; @Column({ default: '', length: 255 }) @@ -71,9 +72,11 @@ export class QqbotCommand { isDeleted: boolean; @CreateDateColumn({ name: 'create_time' }) + @FormatDateTime() createTime: Date; @UpdateDateColumn({ name: 'update_time' }) + @FormatDateTime() updateTime: Date; @BeforeInsert() diff --git a/src/qqbot/config/qqbot-config.entity.ts b/src/qqbot/config/qqbot-config.entity.ts index a971693..4e7557e 100644 --- a/src/qqbot/config/qqbot-config.entity.ts +++ b/src/qqbot/config/qqbot-config.entity.ts @@ -7,7 +7,7 @@ import { PrimaryColumn, UpdateDateColumn, } from 'typeorm'; -import { ensureSnowflakeId } from '@/common'; +import { ensureSnowflakeId, FormatDateTime } from '@/common'; @Entity('qqbot_config') @Index('uk_qqbot_config_key', ['configKey'], { unique: true }) @@ -25,9 +25,11 @@ export class QqbotConfig { remark: string; @CreateDateColumn({ name: 'create_time' }) + @FormatDateTime() createTime: Date; @UpdateDateColumn({ name: 'update_time' }) + @FormatDateTime() updateTime: Date; @BeforeInsert() diff --git a/src/qqbot/connection/qqbot-reverse-ws.service.ts b/src/qqbot/connection/qqbot-reverse-ws.service.ts index 518ce66..3bd0e24 100644 --- a/src/qqbot/connection/qqbot-reverse-ws.service.ts +++ b/src/qqbot/connection/qqbot-reverse-ws.service.ts @@ -8,7 +8,7 @@ import { } from '@nestjs/common'; import { ConfigService } from '@nestjs/config'; import { HttpAdapterHost, ModuleRef } from '@nestjs/core'; -import WebSocket = require('ws'); +import WebSocket from 'ws'; import { ToolsService } from '@/common'; import { QQBOT_MQTT_TOPICS, QQBOT_REVERSE_WS_PATH } from '../qqbot.constants'; import type { diff --git a/src/qqbot/dedupe/qqbot-dedupe.entity.ts b/src/qqbot/dedupe/qqbot-dedupe.entity.ts index 47723e0..56acd8c 100644 --- a/src/qqbot/dedupe/qqbot-dedupe.entity.ts +++ b/src/qqbot/dedupe/qqbot-dedupe.entity.ts @@ -6,7 +6,7 @@ import { PrimaryColumn, UpdateDateColumn, } from 'typeorm'; -import { ensureSnowflakeId } from '@/common'; +import { ensureSnowflakeId, FormatDateTime } from '@/common'; @Entity('qqbot_dedupe') export class QqbotDedupe { @@ -22,12 +22,15 @@ export class QqbotDedupe { nullable: true, type: 'datetime', }) + @FormatDateTime() expireAt: Date | null; @CreateDateColumn({ name: 'create_time' }) + @FormatDateTime() createTime: Date; @UpdateDateColumn({ name: 'update_time' }) + @FormatDateTime() updateTime: Date; @BeforeInsert() diff --git a/src/qqbot/message/qqbot-conversation.entity.ts b/src/qqbot/message/qqbot-conversation.entity.ts index b4745c0..f126aed 100644 --- a/src/qqbot/message/qqbot-conversation.entity.ts +++ b/src/qqbot/message/qqbot-conversation.entity.ts @@ -7,7 +7,7 @@ import { PrimaryColumn, UpdateDateColumn, } from 'typeorm'; -import { ensureSnowflakeId } from '@/common'; +import { ensureSnowflakeId, FormatDateTime } from '@/common'; import type { QqbotMessageType } from '../qqbot.types'; @Entity('qqbot_conversation') @@ -45,6 +45,7 @@ export class QqbotConversation { nullable: true, type: 'datetime', }) + @FormatDateTime() lastMessageTime: Date | null; @Column({ default: 0, name: 'message_count' }) @@ -54,9 +55,11 @@ export class QqbotConversation { isDeleted: boolean; @CreateDateColumn({ name: 'create_time' }) + @FormatDateTime() createTime: Date; @UpdateDateColumn({ name: 'update_time' }) + @FormatDateTime() updateTime: Date; @BeforeInsert() diff --git a/src/qqbot/message/qqbot-message.entity.ts b/src/qqbot/message/qqbot-message.entity.ts index 5ebc4be..a9d2537 100644 --- a/src/qqbot/message/qqbot-message.entity.ts +++ b/src/qqbot/message/qqbot-message.entity.ts @@ -7,7 +7,7 @@ import { PrimaryColumn, UpdateDateColumn, } from 'typeorm'; -import { ensureSnowflakeId } from '@/common'; +import { ensureSnowflakeId, FormatDateTime } from '@/common'; import type { QqbotMessageDirection, QqbotMessageType } from '../qqbot.types'; @Entity('qqbot_message') @@ -58,12 +58,15 @@ export class QqbotMessage { rawEvent: Record; @Column({ name: 'event_time', type: 'datetime' }) + @FormatDateTime() eventTime: Date; @CreateDateColumn({ name: 'create_time' }) + @FormatDateTime() createTime: Date; @UpdateDateColumn({ name: 'update_time' }) + @FormatDateTime() updateTime: Date; @BeforeInsert() diff --git a/src/qqbot/napcat/qqbot-account-napcat.entity.ts b/src/qqbot/napcat/qqbot-account-napcat.entity.ts index ff09c94..d46cf8c 100644 --- a/src/qqbot/napcat/qqbot-account-napcat.entity.ts +++ b/src/qqbot/napcat/qqbot-account-napcat.entity.ts @@ -7,7 +7,7 @@ import { PrimaryColumn, UpdateDateColumn, } from 'typeorm'; -import { ensureSnowflakeId } from '@/common'; +import { ensureSnowflakeId, FormatDateTime } from '@/common'; import type { QqbotAccountNapcatBindStatus } from '../qqbot.types'; @Entity('qqbot_account_napcat') @@ -35,6 +35,7 @@ export class QqbotAccountNapcat { nullable: true, type: 'datetime', }) + @FormatDateTime() lastLoginAt: Date | null; @Column({ default: '', length: 255 }) @@ -44,9 +45,11 @@ export class QqbotAccountNapcat { isDeleted: boolean; @CreateDateColumn({ name: 'create_time' }) + @FormatDateTime() createTime: Date; @UpdateDateColumn({ name: 'update_time' }) + @FormatDateTime() updateTime: Date; @BeforeInsert() diff --git a/src/qqbot/napcat/qqbot-napcat-container.entity.ts b/src/qqbot/napcat/qqbot-napcat-container.entity.ts index a2a1694..903bd2f 100644 --- a/src/qqbot/napcat/qqbot-napcat-container.entity.ts +++ b/src/qqbot/napcat/qqbot-napcat-container.entity.ts @@ -7,7 +7,7 @@ import { PrimaryColumn, UpdateDateColumn, } from 'typeorm'; -import { ensureSnowflakeId } from '@/common'; +import { ensureSnowflakeId, FormatDateTime } from '@/common'; import type { QqbotNapcatContainerStatus } from '../qqbot.types'; @Entity('qqbot_napcat_container') @@ -53,6 +53,7 @@ export class QqbotNapcatContainer { nullable: true, type: 'datetime', }) + @FormatDateTime() lastStartedAt: Date | null; @Column({ @@ -61,6 +62,7 @@ export class QqbotNapcatContainer { nullable: true, type: 'datetime', }) + @FormatDateTime() lastCheckedAt: Date | null; @Column({ default: null, length: 500, name: 'last_error', nullable: true }) @@ -73,9 +75,11 @@ export class QqbotNapcatContainer { isDeleted: boolean; @CreateDateColumn({ name: 'create_time' }) + @FormatDateTime() createTime: Date; @UpdateDateColumn({ name: 'update_time' }) + @FormatDateTime() updateTime: Date; @BeforeInsert() diff --git a/src/qqbot/permission/qqbot-allowlist.entity.ts b/src/qqbot/permission/qqbot-allowlist.entity.ts index 363161a..ed2bb07 100644 --- a/src/qqbot/permission/qqbot-allowlist.entity.ts +++ b/src/qqbot/permission/qqbot-allowlist.entity.ts @@ -6,7 +6,7 @@ import { PrimaryColumn, UpdateDateColumn, } from 'typeorm'; -import { ensureSnowflakeId } from '@/common'; +import { ensureSnowflakeId, FormatDateTime } from '@/common'; import type { QqbotPermissionTargetType } from '../qqbot.types'; @Entity('qqbot_allowlist') @@ -39,9 +39,11 @@ export class QqbotAllowlist { isDeleted: boolean; @CreateDateColumn({ name: 'create_time' }) + @FormatDateTime() createTime: Date; @UpdateDateColumn({ name: 'update_time' }) + @FormatDateTime() updateTime: Date; @BeforeInsert() diff --git a/src/qqbot/permission/qqbot-blocklist.entity.ts b/src/qqbot/permission/qqbot-blocklist.entity.ts index b8b3794..1620599 100644 --- a/src/qqbot/permission/qqbot-blocklist.entity.ts +++ b/src/qqbot/permission/qqbot-blocklist.entity.ts @@ -6,7 +6,7 @@ import { PrimaryColumn, UpdateDateColumn, } from 'typeorm'; -import { ensureSnowflakeId } from '@/common'; +import { ensureSnowflakeId, FormatDateTime } from '@/common'; import type { QqbotPermissionTargetType } from '../qqbot.types'; @Entity('qqbot_blocklist') @@ -39,9 +39,11 @@ export class QqbotBlocklist { isDeleted: boolean; @CreateDateColumn({ name: 'create_time' }) + @FormatDateTime() createTime: Date; @UpdateDateColumn({ name: 'update_time' }) + @FormatDateTime() updateTime: Date; @BeforeInsert() diff --git a/src/qqbot/plugin/qqbot-event-plugin-registry.service.ts b/src/qqbot/plugin/qqbot-event-plugin-registry.service.ts index 9ca3c5f..faa99a1 100644 --- a/src/qqbot/plugin/qqbot-event-plugin-registry.service.ts +++ b/src/qqbot/plugin/qqbot-event-plugin-registry.service.ts @@ -1,5 +1,5 @@ import { Injectable } from '@nestjs/common'; -import { throwVbenError } from '@/common'; +import { formatKtDateTime, throwVbenError } from '@/common'; import { QqbotAccountService } from '../account/qqbot-account.service'; import { QqbotRepeaterPluginService } from '../plugins/repeater/qqbot-repeater.plugin'; import type { @@ -52,7 +52,7 @@ export class QqbotEventPluginRegistryService { async health(pluginKey?: string): Promise { return this.getDefinitions(pluginKey).map((definition) => ({ - checkedAt: new Date().toISOString(), + checkedAt: formatKtDateTime(new Date()), message: definition.remark || '事件插件由账号配置绑定后触发', name: definition.name, pluginKey: definition.key, diff --git a/src/qqbot/plugin/qqbot-plugin-registry.service.ts b/src/qqbot/plugin/qqbot-plugin-registry.service.ts index 3fc5b6a..2483934 100644 --- a/src/qqbot/plugin/qqbot-plugin-registry.service.ts +++ b/src/qqbot/plugin/qqbot-plugin-registry.service.ts @@ -1,5 +1,5 @@ import { Injectable, OnModuleInit } from '@nestjs/common'; -import { throwVbenError } from '@/common'; +import { formatKtDateTime, throwVbenError } from '@/common'; import { QqbotFf14MarketPluginService } from '../plugins/ff14Market/qqbot-ff14-market.plugin'; import { QqbotFflogsPluginService } from '../plugins/fflogs/qqbot-fflogs.plugin'; import type { @@ -63,7 +63,7 @@ export class QqbotPluginRegistryService implements OnModuleInit { plugins.map(async (plugin) => { if (!plugin.healthCheck) { return { - checkedAt: new Date().toISOString(), + checkedAt: formatKtDateTime(new Date()), message: '插件未提供健康检查', name: plugin.name, pluginKey: plugin.key, diff --git a/src/qqbot/plugins/ff14Market/qqbot-ff14-client.service.ts b/src/qqbot/plugins/ff14Market/qqbot-ff14-client.service.ts index eccdc5a..8c7ae0d 100644 --- a/src/qqbot/plugins/ff14Market/qqbot-ff14-client.service.ts +++ b/src/qqbot/plugins/ff14Market/qqbot-ff14-client.service.ts @@ -2,6 +2,7 @@ import { Injectable } from '@nestjs/common'; import { ConfigService } from '@nestjs/config'; import * as http from 'node:http'; import * as https from 'node:https'; +import { formatKtDateTime } from '@/common'; import { DictService } from '../../../admin/dict/dict.service'; import { buildQqbotFf14MarketCatalog, @@ -110,7 +111,7 @@ export class QqbotFf14ClientService { listings, ); const updatedAt = data.lastUploadTime - ? new Date(data.lastUploadTime).toISOString() + ? formatKtDateTime(data.lastUploadTime) : undefined; return { diff --git a/src/qqbot/plugins/ff14Market/qqbot-ff14-market.plugin.ts b/src/qqbot/plugins/ff14Market/qqbot-ff14-market.plugin.ts index 2b8848c..066600a 100644 --- a/src/qqbot/plugins/ff14Market/qqbot-ff14-market.plugin.ts +++ b/src/qqbot/plugins/ff14Market/qqbot-ff14-market.plugin.ts @@ -1,5 +1,5 @@ import { Injectable } from '@nestjs/common'; -import { ToolsService } from '@/common'; +import { formatKtDateTime, ToolsService } from '@/common'; import type { QqbotIntegrationPlugin } from '../../qqbot.types'; import { QqbotFf14ClientService } from './qqbot-ff14-client.service'; @@ -15,7 +15,7 @@ export class QqbotFf14MarketPluginService { description: '对接 XIVAPI v2 与 Universalis,提供 FF14 物品解析和市场价格查询能力。', healthCheck: async () => { - const checkedAt = new Date().toISOString(); + const checkedAt = formatKtDateTime(new Date()); try { await this.ff14ClientService.resolveItem({ itemId: 2, diff --git a/src/qqbot/plugins/fflogs/qqbot-fflogs.plugin.ts b/src/qqbot/plugins/fflogs/qqbot-fflogs.plugin.ts index db9f933..ddd19c7 100644 --- a/src/qqbot/plugins/fflogs/qqbot-fflogs.plugin.ts +++ b/src/qqbot/plugins/fflogs/qqbot-fflogs.plugin.ts @@ -1,5 +1,5 @@ import { Injectable } from '@nestjs/common'; -import { ToolsService } from '@/common'; +import { formatKtDateTime, ToolsService } from '@/common'; import type { QqbotIntegrationPlugin } from '../../qqbot.types'; import { QqbotFflogsClientService } from './qqbot-fflogs-client.service'; @@ -15,7 +15,7 @@ export class QqbotFflogsPluginService { description: '对接 FFLogs v2 GraphQL,提供 FF14 角色公开排名和指定高难最近记录查询能力。', healthCheck: async () => { - const checkedAt = new Date().toISOString(); + const checkedAt = formatKtDateTime(new Date()); try { await this.fflogsClientService.checkHealth(); return { diff --git a/src/qqbot/rule/qqbot-rule.entity.ts b/src/qqbot/rule/qqbot-rule.entity.ts index ce5f8f1..04da10d 100644 --- a/src/qqbot/rule/qqbot-rule.entity.ts +++ b/src/qqbot/rule/qqbot-rule.entity.ts @@ -6,7 +6,7 @@ import { PrimaryColumn, UpdateDateColumn, } from 'typeorm'; -import { ensureSnowflakeId } from '@/common'; +import { ensureSnowflakeId, FormatDateTime } from '@/common'; import type { QqbotRuleMatchType, QqbotRuleTargetType } from '../qqbot.types'; @Entity('qqbot_rule') @@ -44,6 +44,7 @@ export class QqbotRule { nullable: true, type: 'datetime', }) + @FormatDateTime() lastHitAt: Date | null; @Column({ default: '', length: 255 }) @@ -53,9 +54,11 @@ export class QqbotRule { isDeleted: boolean; @CreateDateColumn({ name: 'create_time' }) + @FormatDateTime() createTime: Date; @UpdateDateColumn({ name: 'update_time' }) + @FormatDateTime() updateTime: Date; @BeforeInsert() diff --git a/src/qqbot/send/qqbot-send-log.entity.ts b/src/qqbot/send/qqbot-send-log.entity.ts index 36f73e5..9f13198 100644 --- a/src/qqbot/send/qqbot-send-log.entity.ts +++ b/src/qqbot/send/qqbot-send-log.entity.ts @@ -7,7 +7,7 @@ import { PrimaryColumn, UpdateDateColumn, } from 'typeorm'; -import { ensureSnowflakeId } from '@/common'; +import { ensureSnowflakeId, FormatDateTime } from '@/common'; import type { QqbotMessageType, QqbotSendStatus } from '../qqbot.types'; @Entity('qqbot_send_log') @@ -50,9 +50,11 @@ export class QqbotSendLog { response: Record; @CreateDateColumn({ name: 'create_time' }) + @FormatDateTime() createTime: Date; @UpdateDateColumn({ name: 'update_time' }) + @FormatDateTime() updateTime: Date; @BeforeInsert() diff --git a/test/admin/system-log/system-log.controller.spec.ts b/test/admin/system-log/system-log.controller.spec.ts new file mode 100644 index 0000000..9b6a3fd --- /dev/null +++ b/test/admin/system-log/system-log.controller.spec.ts @@ -0,0 +1,73 @@ +import { INestApplication } from '@nestjs/common'; +import { ConfigService } from '@nestjs/config'; +import { Test } from '@nestjs/testing'; +import * as request from 'supertest'; +import { JwtAuthGuard } from '../../../src/admin/auth/jwt-auth.guard'; +import { SystemLogController } from '../../../src/admin/system-log/system-log.controller'; +import { SystemLogService } from '../../../src/admin/system-log/system-log.service'; +import { ToolsService } from '../../../src/common'; + +describe('SystemLogController', () => { + let app: INestApplication; + + beforeAll(async () => { + const moduleRef = await Test.createTestingModule({ + controllers: [SystemLogController], + providers: [ + SystemLogService, + ToolsService, + { + provide: ConfigService, + useValue: { + get: jest.fn(), + }, + }, + ], + }) + .overrideGuard(JwtAuthGuard) + .useValue({ + canActivate: jest.fn(() => true), + }) + .compile(); + + app = moduleRef.createNestApplication(); + await app.init(); + }); + + afterAll(async () => { + await app?.close(); + }); + + it('returns Loki status with the real system log service fallback', async () => { + const response = await request(app.getHttpServer()) + .get('/system/logs/status') + .expect(200); + + expect(response.body).toEqual({ + code: 200, + data: { + app: 'kt-template-online-api', + configured: false, + env: 'development', + selector: '{app="kt-template-online-api",env="development"}', + }, + msg: '操作成功', + }); + }); + + it('returns an empty page when Loki is not configured', async () => { + const response = await request(app.getHttpServer()) + .get('/system/logs') + .query({ pageNo: 1, pageSize: 20 }) + .expect(200); + + expect(response.body).toEqual({ + code: 200, + data: { + items: [], + total: 0, + }, + msg: '操作成功', + }); + }); +}); diff --git a/test/app.e2e-spec.ts b/test/app.e2e-spec.ts index 1baf5cd..27d3a3b 100644 --- a/test/app.e2e-spec.ts +++ b/test/app.e2e-spec.ts @@ -1,7 +1,7 @@ import { HttpException, HttpStatus, INestApplication } from '@nestjs/common'; import { APP_FILTER, APP_INTERCEPTOR, Reflector } from '@nestjs/core'; import { Test, TestingModule } from '@nestjs/testing'; -import request = require('supertest'); +import * as request from 'supertest'; import { Readable } from 'stream'; import { AppController } from '../src/app.controller'; import { AppService } from '../src/app.service'; @@ -11,6 +11,8 @@ import { ComponentController } from '../src/admin/component/component.controller import { ComponentService } from '../src/admin/component/component.service'; import { DictController } from '../src/admin/dict/dict.controller'; import { DictService } from '../src/admin/dict/dict.service'; +import { SystemLogController } from '../src/admin/system-log/system-log.controller'; +import { SystemLogService } from '../src/admin/system-log/system-log.service'; import { ApiExceptionFilter, SaveBodyInterceptor, @@ -23,6 +25,7 @@ import { WordpressAuthController } from '../src/wordpress/wordpress-auth.control import { WordpressCategoryController } from '../src/wordpress/wordpress-category.controller'; import { WordpressService } from '../src/wordpress/wordpress.service'; import { WordpressTagController } from '../src/wordpress/wordpress-tag.controller'; +import { PinoLogger } from 'nestjs-pino'; import { collectControllerRoutes, routeKey, @@ -38,8 +41,8 @@ const component = { componentTypeMsg: '折线图', image: '', template: '{}', - createTime: '2026-05-13T02:30:00.000Z', - updateTime: '2026-05-13T02:30:00.000Z', + createTime: '2026-05-13 10:30:00', + updateTime: '2026-05-13 10:30:00', is_deleted: false, }; @@ -92,6 +95,22 @@ const dictGroupItem = { value: 'COMPONENT_TYPE', }; +const systemLogItem = { + context: 'ApiExceptionFilter', + durationMs: 12, + hostname: 'kt-template-online-api', + id: '1760000000000000000-0-0', + level: 'error', + message: 'Loki smoke log', + method: 'GET', + path: '/system/logs', + raw: '{"level":50,"msg":"Loki smoke log"}', + requestId: 'request-id', + statusCode: 500, + timestamp: '2026-06-04 08:00:00', + timestampNs: '1760000000000000000', +}; + const uploadResult = { bucketName: 'kt-template-online', objectName: 'uploads/demo.txt', @@ -105,7 +124,7 @@ const objectStat = { name: 'uploads/demo.txt', size: 4, etag: 'etag', - lastModified: '2026-05-13T02:30:00.000Z', + lastModified: '2026-05-13 10:30:00', }; const wordpressAuthContext = { @@ -177,6 +196,19 @@ const dictServiceMock = { update: jest.fn(), }; +const systemLogServiceMock = { + levels: jest.fn(), + page: jest.fn(), + status: jest.fn(), + summary: jest.fn(), +}; + +const pinoLoggerMock = { + error: jest.fn(), + setContext: jest.fn(), + warn: jest.fn(), +}; + const minioServiceMock = { checkConnection: jest.fn(), ensureBucket: jest.fn(), @@ -214,6 +246,7 @@ const controllerClasses = [ AppController, ComponentController, DictController, + SystemLogController, MinioClientController, WordpressAuthController, WordpressArticleController, @@ -565,6 +598,92 @@ const routeTestCases: Record = { }); }, + 'GET /system/logs': async (server) => { + systemLogServiceMock.page.mockResolvedValue({ + items: [systemLogItem], + total: 1, + }); + + const response = await request(server) + .get('/system/logs') + .query({ level: 'error', pageNo: 1, pageSize: 20 }) + .expect(200); + + expect(systemLogServiceMock.page).toHaveBeenCalledWith({ + level: 'error', + pageNo: '1', + pageSize: '20', + }); + expect(response.body).toEqual({ + code: 200, + msg: '操作成功', + data: { + items: [systemLogItem], + total: 1, + }, + }); + }, + + 'GET /system/logs/levels': async (server) => { + systemLogServiceMock.levels.mockReturnValue([ + { label: 'error', value: 'error' }, + ]); + + const response = await request(server).get('/system/logs/levels').expect(200); + + expect(systemLogServiceMock.levels).toHaveBeenCalledWith(); + expect(response.body).toEqual({ + code: 200, + msg: '操作成功', + data: [{ label: 'error', value: 'error' }], + }); + }, + + 'GET /system/logs/status': async (server) => { + systemLogServiceMock.status.mockReturnValue({ + app: 'kt-template-online-api', + configured: true, + env: 'test', + host: 'http://loki:3100', + selector: '{app="kt-template-online-api",env="test"}', + }); + + const response = await request(server).get('/system/logs/status').expect(200); + + expect(systemLogServiceMock.status).toHaveBeenCalledWith(); + expect(response.body).toEqual({ + code: 200, + msg: '操作成功', + data: { + app: 'kt-template-online-api', + configured: true, + env: 'test', + host: 'http://loki:3100', + selector: '{app="kt-template-online-api",env="test"}', + }, + }); + }, + + 'GET /system/logs/summary': async (server) => { + systemLogServiceMock.summary.mockResolvedValue([ + { count: 1, level: 'error' }, + ]); + + const response = await request(server) + .get('/system/logs/summary') + .query({ rangeMinutes: 30 }) + .expect(200); + + expect(systemLogServiceMock.summary).toHaveBeenCalledWith({ + rangeMinutes: '30', + }); + expect(response.body).toEqual({ + code: 200, + msg: '操作成功', + data: [{ count: 1, level: 'error' }], + }); + }, + 'GET /minio/check': async (server) => { minioServiceMock.checkConnection.mockResolvedValue({ bucketName: 'demo-bucket', @@ -1209,6 +1328,10 @@ describe('KT Template Online API (e2e)', () => { provide: DictService, useValue: dictServiceMock, }, + { + provide: SystemLogService, + useValue: systemLogServiceMock, + }, { provide: MinioClientService, useValue: minioServiceMock, @@ -1217,6 +1340,10 @@ describe('KT Template Online API (e2e)', () => { provide: WordpressService, useValue: wordpressServiceMock, }, + { + provide: PinoLogger, + useValue: pinoLoggerMock, + }, { provide: APP_INTERCEPTOR, useClass: SaveBodyInterceptor, diff --git a/test/common/format-date-time.decorator.spec.ts b/test/common/format-date-time.decorator.spec.ts new file mode 100644 index 0000000..c557b6f --- /dev/null +++ b/test/common/format-date-time.decorator.spec.ts @@ -0,0 +1,50 @@ +import { + FormatDateTime, + formatDateTimeFields, + formatKtDateTime, + vbenSuccess, +} from '../../src/common'; + +class DateTimeFormatFixture { + @FormatDateTime() + createTime!: Date; + + @FormatDateTime() + updateTime!: string; +} + +describe('FormatDateTime', () => { + it('formats decorated fields as YYYY-MM-DD HH:mm:ss', () => { + const data = new DateTimeFormatFixture(); + data.createTime = new Date(2026, 4, 13, 10, 30, 0); + data.updateTime = '2026-05-13T10:31:00'; + + expect(formatDateTimeFields(data)).toEqual({ + createTime: '2026-05-13 10:30:00', + updateTime: '2026-05-13 10:31:00', + }); + }); + + it('does not recursively format response payloads', () => { + const createTime = new Date(2026, 4, 13, 10, 30, 0); + const response = vbenSuccess({ + createTime, + nested: { + updateTime: '2026-05-13T10:31:00', + }, + }); + + expect(response.data).toEqual({ + createTime, + nested: { + updateTime: '2026-05-13T10:31:00', + }, + }); + }); + + it('exposes the configured formatter', () => { + expect(formatKtDateTime(new Date(2026, 4, 13, 10, 30, 0))).toBe( + '2026-05-13 10:30:00', + ); + }); +}); diff --git a/test/qqbot/account/qqbot-napcat-login.service.spec.ts b/test/qqbot/account/qqbot-napcat-login.service.spec.ts index 72f6bed..7c75a24 100644 --- a/test/qqbot/account/qqbot-napcat-login.service.spec.ts +++ b/test/qqbot/account/qqbot-napcat-login.service.spec.ts @@ -1,11 +1,16 @@ -jest.mock('@/common', () => ({ - ToolsService: jest.requireActual('@/common').ToolsService, - ensureSnowflakeId: jest.fn(), - setDictDecodeCache: jest.fn(), - throwVbenError: (message: string) => { - throw new Error(message); - }, -})); +jest.mock('@/common', () => { + const actualCommon = jest.requireActual('@/common'); + return { + FormatDateTime: actualCommon.FormatDateTime, + ToolsService: actualCommon.ToolsService, + ensureSnowflakeId: jest.fn(), + formatKtDateTime: actualCommon.formatKtDateTime, + setDictDecodeCache: jest.fn(), + throwVbenError: (message: string) => { + throw new Error(message); + }, + }; +}); import { ConfigService } from '@nestjs/config'; import { ToolsService } from '@/common'; diff --git a/test/qqbot/command/qqbot-command-parser.service.spec.ts b/test/qqbot/command/qqbot-command-parser.service.spec.ts index 00ea858..1e624a3 100644 --- a/test/qqbot/command/qqbot-command-parser.service.spec.ts +++ b/test/qqbot/command/qqbot-command-parser.service.spec.ts @@ -2,6 +2,20 @@ jest.mock( '@/common', () => ({ ensureSnowflakeId: jest.fn(), + FormatDateTime: () => () => undefined, + formatKtDateTime: (value: Date | number | string) => { + const date = value instanceof Date ? value : new Date(value); + return [ + `${date.getFullYear()}-${`${date.getMonth() + 1}`.padStart( + 2, + '0', + )}-${`${date.getDate()}`.padStart(2, '0')}`, + `${`${date.getHours()}`.padStart(2, '0')}:${`${date.getMinutes()}`.padStart( + 2, + '0', + )}:${`${date.getSeconds()}`.padStart(2, '0')}`, + ].join(' '); + }, setDictDecodeCache: jest.fn(), }), { virtual: true }, diff --git a/test/qqbot/plugins/fflogs/qqbot-fflogs-client.service.spec.ts b/test/qqbot/plugins/fflogs/qqbot-fflogs-client.service.spec.ts index 4b08157..05e8d5c 100644 --- a/test/qqbot/plugins/fflogs/qqbot-fflogs-client.service.spec.ts +++ b/test/qqbot/plugins/fflogs/qqbot-fflogs-client.service.spec.ts @@ -2,6 +2,20 @@ jest.mock( '@/common', () => ({ ensureSnowflakeId: jest.fn(), + FormatDateTime: () => () => undefined, + formatKtDateTime: (value: Date | number | string) => { + const date = value instanceof Date ? value : new Date(value); + return [ + `${date.getFullYear()}-${`${date.getMonth() + 1}`.padStart( + 2, + '0', + )}-${`${date.getDate()}`.padStart(2, '0')}`, + `${`${date.getHours()}`.padStart(2, '0')}:${`${date.getMinutes()}`.padStart( + 2, + '0', + )}:${`${date.getSeconds()}`.padStart(2, '0')}`, + ].join(' '); + }, setDictDecodeCache: jest.fn(), }), { virtual: true }, diff --git a/test/test.types.ts b/test/test.types.ts index 8b42438..db8f94a 100644 --- a/test/test.types.ts +++ b/test/test.types.ts @@ -1,4 +1,4 @@ -import request = require('supertest'); +import type request from 'supertest'; export type ControllerRoute = { controllerName: string; diff --git a/tsconfig.json b/tsconfig.json index 1494043..ad4f8a6 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,7 +1,6 @@ { "compilerOptions": { "module": "commonjs", - "ignoreDeprecations": "6.0", "declaration": true, "removeComments": true, "emitDecoratorMetadata": true,