From 7fa683efeb951924baf9186845d230f2ad7976ef Mon Sep 17 00:00:00 2001 From: dev-callgent Date: Mon, 27 May 2024 21:10:04 +0800 Subject: [PATCH 001/183] refactor: rename to callgent Signed-off-by: dev-callgent --- .env.dev | 6 +- .env.test | 6 +- .github/ISSUE_TEMPLATE/config.yml | 16 ++-- CODE_OF_CONDUCT.md | 2 +- CONTRIBUTING.md | 4 +- DEVLOG.md | 20 ++-- README.md | 34 +++---- SECURITY.md | 2 +- docker-compose-mail.yml | 2 +- package.json | 2 +- .../row_level_security/migration.sql | 8 +- prisma/schema.prisma | 42 ++++----- prisma/seed.ts | 58 ++++++------ src/agents/agents.service.ts | 24 ++--- .../events/progressive-request.event.ts | 2 +- src/agents/llm.service.ts | 4 +- src/app.controller.ts | 18 ++-- src/app.module.ts | 8 +- src/bootstrap.ts | 4 +- .../botlet-functions.controller.spec.ts | 18 ---- .../botlet-functions.module.ts | 14 --- .../botlet-functions.service.spec.ts | 18 ---- src/botlets/botlets.module.ts | 10 -- src/botlets/events/botlet-created.event.ts | 7 -- .../callgent-functions.controller.spec.ts | 18 ++++ .../callgent-functions.controller.ts} | 50 +++++----- .../callgent-functions.module.ts | 14 +++ .../callgent-functions.service.spec.ts | 18 ++++ .../callgent-functions.service.ts} | 56 +++++------ .../callgents.controller.spec.ts} | 10 +- .../callgents.controller.ts} | 48 +++++----- src/callgents/callgents.module.ts | 10 ++ .../callgents.service.spec.ts} | 10 +- .../callgents.service.ts} | 92 +++++++++---------- .../events/callgent-created.event.ts | 7 ++ .../builtin/restapi/restapi.adaptor.ts | 8 +- .../builtin/restapi/restapi.controller.ts | 36 ++++---- .../adaptors/builtin/web/webpage.adaptor.ts | 4 +- .../adaptors/endpoint-adaptor.decorator.ts | 4 +- .../adaptors/endpoint-adaptor.interface.ts | 2 +- src/endpoints/endpoints.controller.ts | 2 +- src/endpoints/endpoints.module.ts | 8 +- src/endpoints/endpoints.service.ts | 12 +-- src/endpoints/events/client-request.event.ts | 8 +- ...stener.ts => callgent-created.listener.ts} | 24 ++--- .../event-listeners.service.ts | 6 +- src/event-listeners/event-object.ts | 2 +- src/executions/command.schema.ts | 20 ++-- src/executions/executions.service.ts | 50 +++++----- src/infra/repo/prisma.middlewares.ts | 4 +- src/task-actions/task-actions.module.ts | 6 +- src/task-actions/task-actions.service.ts | 44 ++++----- src/tasks/events/task-created.event.ts | 2 +- src/tasks/tasks.controller.ts | 6 +- src/tasks/tasks.service.ts | 12 +-- src/users/users.service.ts | 4 +- ...spec.ts => callgent-functions.e2e-spec.ts} | 10 +- ...lets.e2e-spec.ts => callgents.e2e-spec.ts} | 34 +++---- test/e2e/endpoints.e2e-spec.ts | 40 ++++---- 59 files changed, 506 insertions(+), 504 deletions(-) delete mode 100644 src/botlet-functions/botlet-functions.controller.spec.ts delete mode 100644 src/botlet-functions/botlet-functions.module.ts delete mode 100644 src/botlet-functions/botlet-functions.service.spec.ts delete mode 100644 src/botlets/botlets.module.ts delete mode 100644 src/botlets/events/botlet-created.event.ts create mode 100644 src/callgent-functions/callgent-functions.controller.spec.ts rename src/{botlet-functions/botlet-functions.controller.ts => callgent-functions/callgent-functions.controller.ts} (69%) create mode 100644 src/callgent-functions/callgent-functions.module.ts create mode 100644 src/callgent-functions/callgent-functions.service.spec.ts rename src/{botlet-functions/botlet-functions.service.ts => callgent-functions/callgent-functions.service.ts} (74%) rename src/{botlets/botlets.controller.spec.ts => callgents/callgents.controller.spec.ts} (50%) rename src/{botlets/botlets.controller.ts => callgents/callgents.controller.ts} (63%) create mode 100644 src/callgents/callgents.module.ts rename src/{botlets/botlets.service.spec.ts => callgents/callgents.service.spec.ts} (53%) rename src/{botlets/botlets.service.ts => callgents/callgents.service.ts} (62%) create mode 100644 src/callgents/events/callgent-created.event.ts rename src/endpoints/listeners/{botlet-created.listener.ts => callgent-created.listener.ts} (64%) rename test/e2e/{botlet-functions.e2e-spec.ts => callgent-functions.e2e-spec.ts} (59%) rename test/e2e/{botlets.e2e-spec.ts => callgents.e2e-spec.ts} (54%) diff --git a/.env.dev b/.env.dev index 8e9d986..d8caa5b 100644 --- a/.env.dev +++ b/.env.dev @@ -16,7 +16,7 @@ ALLOW_CORS=1 POSTGRES_USER=postgres POSTGRES_PASSWORD=postgres -POSTGRES_DB=botlet +POSTGRES_DB=callgent # See https://www.prisma.io/docs/concepts/database-connectors/postgres DATABASE_URL=postgresql://${POSTGRES_USER}:${POSTGRES_PASSWORD}@nest-postgres:5432/${POSTGRES_DB}?schema=public&timezone=UTC @@ -44,8 +44,8 @@ GOOGLE_OAUTH_CLIENT_SECRET = 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 LLM_MODEL=mistralai/mistral-small LLM_CACHE_ENABLE=1 OPENROUTER_API_KEY=sk-or-v1-your-api-key -BOTLET_SITE_URL=https://botlet.io -BOTLET_SITE_NAME=Botlet.IO +CALLGENT_SITE_URL=https://callgent.com +CALLGENT_SITE_NAME=Callgent.com EMAIL_DEFAULT_SENDER={"name": "Callgent", "email": "noreply@callgent.com"} # https://app.brevo.com/settings/keys/api diff --git a/.env.test b/.env.test index a7b8cf7..82235a4 100644 --- a/.env.test +++ b/.env.test @@ -15,7 +15,7 @@ LOG_LEVELS_PRISMA=["query","info","warn","error"] POSTGRES_USER=postgres POSTGRES_PASSWORD=postgres -POSTGRES_DB=botlet +POSTGRES_DB=callgent # See https://www.prisma.io/docs/concepts/database-connectors/postgres DATABASE_URL=postgresql://${POSTGRES_USER}:${POSTGRES_PASSWORD}@nest-postgres:5432/${POSTGRES_DB}?schema=public&timezone=UTC @@ -45,8 +45,8 @@ TEST_CANNY_IO_API_KEY=567b9c2f-9708-3ccb-4189-e0a5f4e130ba LLM_MODEL=mistralai/mistral-small LLM_CACHE_ENABLE=1 OPENROUTER_API_KEY=sk-or-v1-your-api-key -BOTLET_SITE_URL=https://botlet.io -BOTLET_SITE_NAME=Botlet.IO +CALLGENT_SITE_URL=https://callgent.com +CALLGENT_SITE_NAME=Callgent.com EMAIL_DEFAULT_SENDER={"name": "Callgent", "email": "noreply@callgent.com"} # https://app.brevo.com/settings/keys/api diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml index 7dd0b96..016d516 100644 --- a/.github/ISSUE_TEMPLATE/config.yml +++ b/.github/ISSUE_TEMPLATE/config.yml @@ -1,17 +1,17 @@ blank_issues_enabled: false contact_links: - name: Product Feature Request - url: https://botlet.canny.io/feature-requests - about: Provide feedback to the Botlet team and ask for new features or enhancements! + url: https://callgent.canny.io/feature-requests + about: Provide feedback to the Callgent team and ask for new features or enhancements! - name: Documentation Bug Report - url: https://github.com/botlet/botlet-doc/issues/new?template=BUG_REPORT.md&title%5B%5D=BUG - about: Create a report to help us improve the Botlet documentation. + url: https://github.com/callgent/callgent-doc/issues/new?template=BUG_REPORT.md&title%5B%5D=BUG + about: Create a report to help us improve the Callgent documentation. # - name: Documentation Request - # url: https://feedback.botlet.io/documentation + # url: https://feedback.callgent.com/documentation # about: Suggest a new part of the documentation we are missing! - # - name: Botlet Questions and Discussions - # url: https://forum.botlet.io + # - name: Callgent Questions and Discussions + # url: https://forum.callgent.com # about: Please ask and answer questions on the community forums. - name: Join the Community Discord - url: https://botlet.io/discord + url: https://callgent.com/discord about: Come and chat with other community members! \ No newline at end of file diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md index 4bcf61b..35b6e37 100644 --- a/CODE_OF_CONDUCT.md +++ b/CODE_OF_CONDUCT.md @@ -34,7 +34,7 @@ This Code of Conduct applies both within project spaces and in public spaces whe ## Enforcement -Instances of abusive, harassing, or otherwise unacceptable behavior may be reported by contacting the project team at [support@botlet.io](mailto:support@botlet.io). All complaints will be reviewed and investigated and will result in a response that is deemed necessary and appropriate to the circumstances. The project team is obligated to maintain confidentiality with regard to the reporter of an incident. Further details of specific enforcement policies may be posted separately. +Instances of abusive, harassing, or otherwise unacceptable behavior may be reported by contacting the project team at [support@callgent.com](mailto:support@callgent.com). All complaints will be reviewed and investigated and will result in a response that is deemed necessary and appropriate to the circumstances. The project team is obligated to maintain confidentiality with regard to the reporter of an incident. Further details of specific enforcement policies may be posted separately. Project maintainers who do not follow or enforce the Code of Conduct in good faith may face temporary or permanent repercussions as determined by other members of the project's leadership. diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index b327a36..46b6350 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -1,6 +1,6 @@ # Contributing Guide -Thank you for considering contributing to Botlet.IO! We appreciate your time and effort. This document provides guidelines to contribute to the project. +Thank you for considering contributing to Callgent.com! We appreciate your time and effort. This document provides guidelines to contribute to the project. ## Table of Contents @@ -34,7 +34,7 @@ There are several ways you can contribute to the project: ### Reporting Bugs -If you encounter any issues, please [open an issue](https://github.com/botlet-io/botlet-api/issues) on the GitHub repository. Provide as much detail as possible, including steps to reproduce the issue if applicable. +If you encounter any issues, please [open an issue](https://github.com/Callgent/callgent-api/issues) on the GitHub repository. Provide as much detail as possible, including steps to reproduce the issue if applicable. ### Suggesting Enhancements diff --git a/DEVLOG.md b/DEVLOG.md index 3d42509..13c0a19 100644 --- a/DEVLOG.md +++ b/DEVLOG.md @@ -37,8 +37,8 @@ ```shell pnpm i -g @nestjs/cli - nest new botlet-api - cd botlet-api + nest new callgent-api + cd callgent-api ``` ### add dependencies @@ -207,9 +207,9 @@ You may annotate it to your DTO property like this: export class CreateTaskDto { // ... - // automatically validation check if the botlet exists in db on controller requesting - @EntityIdExists('botlet', 'uuid') // @EntityIdExists('entityType', 'fieldName') - botletUuid: string; + // automatically validation check if the callgent exists in db on controller requesting + @EntityIdExists('callgent', 'uuid') // @EntityIdExists('entityType', 'fieldName') + callgentUuid: string; } ``` @@ -220,8 +220,8 @@ Based on `prisma-generator-nestjs-dto`, you may also annotate this decorator in ```prisma model Task { // ... - /// @CustomValidator(EntityIdExists, 'botlet', 'uuid', ../../infra/repo/validators/entity-exists.validator) - botletUuid String @db.VarChar(36) + /// @CustomValidator(EntityIdExists, 'callgent', 'uuid', ../../infra/repo/validators/entity-exists.validator) + callgentUuid String @db.VarChar(36) } ``` @@ -229,10 +229,10 @@ This makes the generated DTO to be annotated with `@EntityIdExists` decorator. #### Retrieves the entity instance -This makes sure the `botletUuid` field is a valid UUID of a botlet in the database. +This makes sure the `callgentUuid` field is a valid UUID of a callgent in the database. you can retrieve the entity instance directly from the dto: ```typescript -const botlet = EntityIdExists.entity(dto, 'botletUuid') || - (await prisma.botlet.findUnique({ where: {uuid: dto.botletUuid} })); +const callgent = EntityIdExists.entity(dto, 'callgentUuid') || + (await prisma.callgent.findUnique({ where: {uuid: dto.callgentUuid} })); ``` diff --git a/README.md b/README.md index 33c7dd0..480a60d 100644 --- a/README.md +++ b/README.md @@ -1,8 +1,8 @@ -# Botlet API +# Callgent API

- - Static Badge + + Static Badge chat on Discord @@ -11,20 +11,20 @@ alt="follow on Twitter"> - - - -GitHub issues - -GitHub pull requests + + + +GitHub issues + +GitHub pull requests

-Botlet API is an open-source SaaS project built using NestJS, Prisma, PostgreSQL, and Swagger. It is licensed under the Apache-2.0 License. +Callgent API is an open-source SaaS project built using NestJS, Prisma, PostgreSQL, and Swagger. It is licensed under the Apache-2.0 License. ## Table of Contents -- [Botlet API](#botlet-api) +- [Callgent API](#callgent-api) - [Table of Contents](#table-of-contents) - [Introduction](#introduction) - [Features](#features) @@ -39,7 +39,7 @@ Botlet API is an open-source SaaS project built using NestJS, Prisma, PostgreSQL ## Introduction -Botlet API is a powerful, scalable, and extensible platform designed to help developers create, manage, and deploy bots across various channels. It provides a robust set of features, enabling seamless integration with popular messaging platforms and services. +Callgent API is a powerful, scalable, and extensible platform designed to help developers create, manage, and deploy bots across various channels. It provides a robust set of features, enabling seamless integration with popular messaging platforms and services. ## Features @@ -52,7 +52,7 @@ Botlet API is a powerful, scalable, and extensible platform designed to help dev ## Prerequisites -Before you start using Botlet API, ensure you have the following tools installed: +Before you start using Callgent API, ensure you have the following tools installed: - Node.js (>= 14.0.0) - npm (>= 6.0.0) @@ -64,13 +64,13 @@ Before you start using Botlet API, ensure you have the following tools installed 1. Clone the repository: ``` - git clone https://github.com/botlet-io/botlet-api.git + git clone https://github.com/Callgent/callgent-api.git ``` 2. Change to the project directory: ``` - cd botlet-api + cd callgent-api ``` 3. Install the dependencies: @@ -117,8 +117,8 @@ We welcome contributions from the community! Before submitting a pull request, p ## License -Botlet.IO is licensed under the Apache-2.0 License. See the [LICENSE](LICENSE) file for more information. +Callgent.com is licensed under the Apache-2.0 License. See the [LICENSE](LICENSE) file for more information. --- -For more information, please visit our [documentation](https://docs.botlet.io/) or join our [community](https://botlet.io/discord). +For more information, please visit our [documentation](https://docs.callgent.com/) or join our [community](https://callgent.com/discord). diff --git a/SECURITY.md b/SECURITY.md index 43ecaa8..4d201ab 100644 --- a/SECURITY.md +++ b/SECURITY.md @@ -4,7 +4,7 @@ The security of our project is of the utmost importance to us. This document out ## Reporting a Vulnerability -We appreciate the efforts of security researchers and the community who help us keep our projects safe. If you believe you've discovered a security vulnerability in one of our projects, please send an email to security@botlet.io. +We appreciate the efforts of security researchers and the community who help us keep our projects safe. If you believe you've discovered a security vulnerability in one of our projects, please send an email to security@callgent.com. In your report, please include: diff --git a/docker-compose-mail.yml b/docker-compose-mail.yml index 266c5d3..e48e799 100644 --- a/docker-compose-mail.yml +++ b/docker-compose-mail.yml @@ -51,7 +51,7 @@ services: - SMTP_USER=admin - SMTP_PASSWORD=adminpassword - SMTP_TLS=false - - DOMAIN=botlet.io + - DOMAIN=callgent.com networks: default: diff --git a/package.json b/package.json index e2b394c..229e4df 100644 --- a/package.json +++ b/package.json @@ -1,5 +1,5 @@ { - "name": "botlet-api", + "name": "callgent-api", "version": "0.0.1", "description": "", "author": "", diff --git a/prisma/migrations/row_level_security/migration.sql b/prisma/migrations/row_level_security/migration.sql index d061350..e7cb310 100644 --- a/prisma/migrations/row_level_security/migration.sql +++ b/prisma/migrations/row_level_security/migration.sql @@ -1,19 +1,19 @@ -- Enable Row Level Security ALTER TABLE "User" ENABLE ROW LEVEL SECURITY; ALTER TABLE "UserIdentity" ENABLE ROW LEVEL SECURITY; -ALTER TABLE "Botlet" ENABLE ROW LEVEL SECURITY; +ALTER TABLE "Callgent" ENABLE ROW LEVEL SECURITY; -- Force Row Level Security for table owners ALTER TABLE "User" FORCE ROW LEVEL SECURITY; ALTER TABLE "UserIdentity" FORCE ROW LEVEL SECURITY; -ALTER TABLE "Botlet" FORCE ROW LEVEL SECURITY; +ALTER TABLE "Callgent" FORCE ROW LEVEL SECURITY; -- Create row security policies CREATE POLICY tenant_isolation_policy ON "User" USING (("tenantId" = 0) OR ("tenantId" = current_setting('tenancy.tenantId', TRUE)::int)); CREATE POLICY tenant_isolation_policy ON "UserIdentity" USING (("tenantId" = 0) OR ("tenantId" = current_setting('tenancy.tenantId', TRUE)::int)); -CREATE POLICY tenant_isolation_policy ON "Botlet" USING (("tenantId" = 0) OR ("tenantId" = current_setting('tenancy.tenantId', TRUE)::int)); +CREATE POLICY tenant_isolation_policy ON "Callgent" USING (("tenantId" = 0) OR ("tenantId" = current_setting('tenancy.tenantId', TRUE)::int)); -- Create policies to bypass RLS (optional) CREATE POLICY bypass_rls_policy ON "User" USING (current_setting('tenancy.bypass_rls', TRUE)::text = 'on'); CREATE POLICY bypass_rls_policy ON "UserIdentity" USING (current_setting('tenancy.bypass_rls', TRUE)::text = 'on'); -CREATE POLICY bypass_rls_policy ON "Botlet" USING (current_setting('tenancy.bypass_rls', TRUE)::text = 'on'); +CREATE POLICY bypass_rls_policy ON "Callgent" USING (current_setting('tenancy.bypass_rls', TRUE)::text = 'on'); diff --git a/prisma/schema.prisma b/prisma/schema.prisma index e8e8389..6d53ff5 100644 --- a/prisma/schema.prisma +++ b/prisma/schema.prisma @@ -139,9 +139,9 @@ model PublicMailHost { createdAt DateTime @default(now()) } -//////////////////// Botlet //////////////////////////// +//////////////////// Callgent //////////////////////////// -model Botlet { +model Callgent { /// @DtoEntityHidden id Int @id @default(autoincrement()) /// @DtoCreateApiResponse @@ -173,7 +173,7 @@ model Botlet { @@index([tenantId]) } -model BotletFunction { +model CallgentFunction { /// @DtoEntityHidden id Int @id @default(autoincrement()) /// @DtoCreateApiResponse @@ -186,19 +186,19 @@ model BotletFunction { tenantId Int @default(dbgenerated("(current_setting('tenancy.tenantId')::int)")) name String @db.VarChar(255) - /// @description js function name to invoke this botlet function + /// @description js function name to invoke this callgent function funName String @db.VarChar(255) params String[] @db.VarChar(31) /// @description js function api docs documents String @db.VarChar(4095) - /// @description js actual code to invoke this botlet function + /// @description js actual code to invoke this callgent function fullCode String @db.VarChar(1023) /// @description endpoint uuid or command or code content Json @db.Json // @DtoReadOnly - /// @CustomValidator(EntityIdExists, 'botlet', 'uuid', ../../infra/repo/validators/entity-exists.validator) - botletUuid String @db.VarChar(36) + /// @CustomValidator(EntityIdExists, 'callgent', 'uuid', ../../infra/repo/validators/entity-exists.validator) + callgentUuid String @db.VarChar(36) /// @description actual server endpoint, when action type is `ENDPOINT` /// @CustomValidator(EntityIdExists, 'endpoint', 'uuid', ../../infra/repo/validators/entity-exists.validator) endpointUuid String? @db.VarChar(36) @@ -213,9 +213,9 @@ model BotletFunction { /// @DtoEntityHidden deletedAt DateTime? /// @description logical deletion. - @@unique([botletUuid, name]) + @@unique([callgentUuid, name]) @@index([tenantId]) - @@index([botletUuid]) + @@index([callgentUuid]) } model Task { @@ -261,12 +261,12 @@ model TaskAction { tenantId Int @default(dbgenerated("(current_setting('tenancy.tenantId')::int)")) // client side information - /// @description action owner botlet uuid, responsible for progressive response + /// @description action owner callgent uuid, responsible for progressive response cepUuid String? @db.VarChar(36) /// @description client endpoint uuid - funName String? @db.VarChar(255) /// @description optional botlet function name + funName String? @db.VarChar(255) /// @description optional callgent function name cAdaptor String @db.VarChar(36) /// @description client adaptor key - callback Json? @db.Json /// @description callback url template or botlet function - progressive String? @db.VarChar(36) /// @description progressive requesting url template or botlet function + callback Json? @db.Json /// @description callback url template or callgent function + progressive String? @db.VarChar(36) /// @description progressive requesting url template or callgent function // processing returns Boolean @default(false) /// @description whether action has response object @@ -277,7 +277,7 @@ model TaskAction { message String? @db.VarChar(255) /// @description error message // @DtoReadOnly - /// @CustomValidator(EntityIdExists, 'botlet', 'uuid', ../../infra/repo/validators/entity-exists.validator) + /// @CustomValidator(EntityIdExists, 'callgent', 'uuid', ../../infra/repo/validators/entity-exists.validator) taskUuid String @db.VarChar(36) /// @DtoReadOnly @@ -316,7 +316,7 @@ enum EndpointType { EVENT } -/// @description a botlet may have multiple endpoints, including receiver & sender +/// @description a callgent may have multiple endpoints, including receiver & sender model Endpoint { /// @DtoEntityHidden id Int @id @default(autoincrement()) @@ -336,7 +336,7 @@ model Endpoint { /// @DtoUpdateApiResponse /// @DtoPlainApiResponse adaptorKey String @db.VarChar(127) /// @description endpoint adaptor key - priority Int @default(0) /// @description priority in the botlet + priority Int @default(0) /// @description priority in the callgent host Json @db.Json /// @description host address & configs initParams Json? @db.Json /// @description initializing parameters @@ -344,8 +344,8 @@ model Endpoint { /// @DtoUpdateApiResponse /// @DtoPlainApiResponse - /// @CustomValidator(EntityIdExists, 'botlet', 'uuid', ../../infra/repo/validators/entity-exists.validator) - botletUuid String @db.VarChar(36) /// @description botlet owning the endpoint + /// @CustomValidator(EntityIdExists, 'callgent', 'uuid', ../../infra/repo/validators/entity-exists.validator) + callgentUuid String @db.VarChar(36) /// @description callgent owning the endpoint /// @DtoReadOnly /// @DtoEntityHidden @@ -358,7 +358,7 @@ model Endpoint { deletedAt DateTime? /// @description logical deletion. @@index([tenantId]) - @@index([botletUuid]) + @@index([callgentUuid]) } enum EndpointAuthType { @@ -439,7 +439,7 @@ model PersistedAsync { enum ServiceType { SERVICE - BOTLET + CALLGENT } model EventListener { @@ -460,7 +460,7 @@ model EventListener { dataType String @db.VarChar(36) priority Int? @default(0) - serviceType ServiceType // botlet, service + serviceType ServiceType // callgent, service serviceName String @db.VarChar(255) funName String @db.VarChar(255) // TODO add the listener's input/output props in event.context, for automatic checking diff --git a/prisma/seed.ts b/prisma/seed.ts index 1ed67d7..c91c5f0 100644 --- a/prisma/seed.ts +++ b/prisma/seed.ts @@ -51,7 +51,7 @@ function initEventListeners() { eventType: 'CLIENT_REQUEST', dataType: '*', serviceType: 'SERVICE', - serviceName: 'BotletFunctionsService', + serviceName: 'CallgentFunctionsService', funName: 'loadFunctions', createdBy: 'GLOBAL', priority: (priority += 100), @@ -140,7 +140,7 @@ please generate the js function with **full implementation and error handling**! id: 2, name: 'map2Function', prompt: `given below service functions: -class {{=it.botletName}} {{{~ it.botletFunctions :fun }} +class {{=it.callgentName}} {{{~ it.callgentFunctions :fun }} "function name: {{=fun.name}}": {"params":[{{=fun.params}}], "documents":"{{=fun.documents}}"}, {{~}} } @@ -189,13 +189,13 @@ function initTestData() { id: 1, tenantId: 1, provider: 'local', - uid: 'test@botlet.io', + uid: 'test@callgent.com', // password123 credentials: '$2b$10$JmQ5gwQevEGI6t.HLrCw3ugQNf9.8KaqC1OaaC5mCMClii.zKveYm', name: 'test-user', - email: 'test@botlet.io', + email: 'test@callgent.com', email_verified: true, - userId: 0, + userId: 1, userUuid, }; @@ -209,10 +209,10 @@ function initTestData() { }, }; - const botletDto: Prisma.BotletUncheckedCreateInput = { + const callgentDto: Prisma.CallgentUncheckedCreateInput = { id: 1, - uuid: 'TEST_BOTLET_UUID', - name: 'test-botlet', + uuid: 'TEST_CALLGENT_UUID', + name: 'test-callgent', tenantId: 1, createdBy: userUuid, }; @@ -220,7 +220,7 @@ function initTestData() { const cepDto: Prisma.EndpointUncheckedCreateInput = { id: 1, uuid: 'TEST_CEP_UUID', - botletUuid: 'TEST_BOTLET_UUID', + callgentUuid: 'TEST_CALLGENT_UUID', type: 'CLIENT', adaptorKey: 'restAPI', host: {}, @@ -235,23 +235,25 @@ function initTestData() { update: tenant, create: tenant, }) - .then((tenant) => console.log({ tenant })), - prisma.user - .upsert({ - where: { id: 1 }, - update: u, - create: u, - }) - .then((user) => { - (ui as any).id = 1; - (ui as any).userId = user.id; - prisma.userIdentity + .then((tenant) => { + console.log({ tenant }); + prisma.user .upsert({ where: { id: 1 }, - update: ui, - create: ui, + update: u, + create: u, }) - .then((userIdentity) => console.log({ user, userIdentity })); + .then((user) => { + (ui as any).id = 1; + (ui as any).userId = user.id; + prisma.userIdentity + .upsert({ + where: { id: 1 }, + update: ui, + create: ui, + }) + .then((userIdentity) => console.log({ user, userIdentity })); + }); }), prisma.authToken .upsert({ @@ -260,13 +262,13 @@ function initTestData() { create: authTokenDto, }) .then((authToken) => console.log({ authToken })), - prisma.botlet + prisma.callgent .upsert({ where: { id: 1 }, - update: botletDto, - create: botletDto, + update: callgentDto, + create: callgentDto, }) - .then((botlet) => console.log({ botlet })), + .then((callgent) => console.log({ callgent })), prisma.endpoint .upsert({ where: { id: 1 }, @@ -295,7 +297,7 @@ function initTestData() { addLlmCache( 4, 'map2Function', - 'given below service functions:\nclass new-test-botlet {\n "function name: POST:/boards/list": {"params":[invoker,apiKey], "documents":"This function lists all boards.\n\n@param {Function} invoker - A function that makes the actual API call.\n@param {string} apiKey - Your secret API key.\n\n@returns {Promise} A promise that resolves to an object containing the API result.\n@property {Array} boards - An array of board objects.\n@property {string} boards[].id - A unique identifier for the board.\n@property {string} boards[].created - Time at which the board was created, in ISO 8601 format.\n@property {boolean} boards[].isPrivate - Whether or not the board is set as private in the administrative settings.\n@property {string} boards[].name - The board\'s name.\n@property {number} boards[].postCount - The number of non-deleted posts associated with the board. This number includes posts that are marked as closed or complete.\n@property {boolean} boards[].privateComments - Whether or not comments left on posts can be viewed by other end-users.\n@property {string} boards[].url - The URL to the board\'s page.\n@property {boolean} hasMore - Specifies whether this query returns more boards than the limit."},\n\n}\nand an service `invoker` function.\n\nPlease choose one function to fulfill below request:\n{\n"requesting function": "POST:/boards/list",\n"request from": "restAPI",\n"request_object": {"url":"/boards/list","method":"POST","headers":{"host":"127.0.0.1:3300","connection":"close","content-length":"0"},"query":{}},\n}\nand code for request_object to chosen function args mapping. if any data missing/unclear/ambiguous from request_object to invocation args, please ask question to the caller in below json.question field.\n\noutput a single-line json object:\n{ "funName": "the function name to be invoked", "params":"param names of the chosen function", "mapping": "the js function (invoker, request_object)=>{...;return functionArgsArray;}, full implementation to return the **real** args from request_object to invoke the chosen service function. don\'t use data not exist or ambiguous in request", "question": "question to ask the caller if anything not sure or missing for request to args mapping, *no* guess or assumption of the mapping. null if the mapping is crystal clear." }"}', + 'given below service functions:\nclass new-test-callgent {\n "function name: POST:/boards/list": {"params":[invoker,apiKey], "documents":"This function lists all boards.\n\n@param {Function} invoker - A function that makes the actual API call.\n@param {string} apiKey - Your secret API key.\n\n@returns {Promise} A promise that resolves to an object containing the API result.\n@property {Array} boards - An array of board objects.\n@property {string} boards[].id - A unique identifier for the board.\n@property {string} boards[].created - Time at which the board was created, in ISO 8601 format.\n@property {boolean} boards[].isPrivate - Whether or not the board is set as private in the administrative settings.\n@property {string} boards[].name - The board\'s name.\n@property {number} boards[].postCount - The number of non-deleted posts associated with the board. This number includes posts that are marked as closed or complete.\n@property {boolean} boards[].privateComments - Whether or not comments left on posts can be viewed by other end-users.\n@property {string} boards[].url - The URL to the board\'s page.\n@property {boolean} hasMore - Specifies whether this query returns more boards than the limit."},\n\n}\nand an service `invoker` function.\n\nPlease choose one function to fulfill below request:\n{\n"requesting function": "POST:/boards/list",\n"request from": "restAPI",\n"request_object": {"url":"/boards/list","method":"POST","headers":{"host":"127.0.0.1:3300","connection":"close","content-length":"0"},"query":{}},\n}\nand code for request_object to chosen function args mapping. if any data missing/unclear/ambiguous from request_object to invocation args, please ask question to the caller in below json.question field.\n\noutput a single-line json object:\n{ "funName": "the function name to be invoked", "params":"param names of the chosen function", "mapping": "the js function (invoker, request_object)=>{...;return functionArgsArray;}, full implementation to return the **real** args from request_object to invoke the chosen service function. don\'t use data not exist or ambiguous in request", "question": "question to ask the caller if anything not sure or missing for request to args mapping, *no* guess or assumption of the mapping. null if the mapping is crystal clear." }"}', '{"funName":"POST:/boards/list","params":["invoker","apiKey"],"mapping":"(invoker, request_object)=>{ let apiKey = request_object.params.uuids; return [invoker, apiKey]; }","question":"What is the API key for this request? It is not provided in the request_object."}', ), ]; diff --git a/src/agents/agents.service.ts b/src/agents/agents.service.ts index 754fc8c..21cf9c1 100644 --- a/src/agents/agents.service.ts +++ b/src/agents/agents.service.ts @@ -1,5 +1,5 @@ import { BadRequestException, HttpException, Injectable } from '@nestjs/common'; -import { BotletFunctionDto } from '../botlet-functions/dto/botlet-function.dto'; +import { CallgentFunctionDto } from '../callgent-functions/dto/callgent-function.dto'; import { AdaptedDataSource } from '../endpoints/adaptors/endpoint-adaptor.interface'; import { TaskActionDto } from '../task-actions/dto/task-action.dto'; import { LLMService } from './llm.service'; @@ -38,12 +38,12 @@ export class AgentsService { uuid, srcId, dataType: cepAdaptor, - data: { botletName, req, funName, progressive }, + data: { callgentName, req, funName, progressive }, context: { tgtEvents }, } = reqEvent; - const botletFunctions = reqEvent.context - .functions as unknown as BotletFunctionDto[]; - if (!botletFunctions?.length) + const callgentFunctions = reqEvent.context + .functions as unknown as CallgentFunctionDto[]; + if (!callgentFunctions?.length) throw new BadRequestException( 'No functions for mapping, ClientRequestEvent#' + uuid, ); @@ -55,12 +55,12 @@ export class AgentsService { { req, funName, - botletName, + callgentName, cepAdaptor, - botletFunctions, + callgentFunctions, }, { funName: '', mapping: '', question: '' }, - ); // TODO check `funName` exists in botletFunctions, validating `mapping` + ); // TODO check `funName` exists in callgentFunctions, validating `mapping` reqEvent.context.function = mapped; if (mapped.question) { @@ -90,10 +90,10 @@ export class AgentsService { } async genScript( - BotletFunctions: { [botletName: string]: BotletFunctionDto[] }, + CallgentFunctions: { [callgentName: string]: CallgentFunctionDto[] }, taskAction: TaskActionDto, ) { - const ms = Object.values(BotletFunctions)?.flat(); + const ms = Object.values(CallgentFunctions)?.flat(); if (ms.length > 1) { // routing @@ -111,11 +111,11 @@ export class AgentsService { } async genPseudoCmd( - botlets: { uuid: string; name: string; summary: string }[], + callgents: { uuid: string; name: string; summary: string }[], taskaAction: TaskActionDto, ) {} - async routeAction(actions: BotletFunctionDto[], req: AdaptedDataSource) { + async routeAction(actions: CallgentFunctionDto[], req: AdaptedDataSource) { if (!actions?.length) return; // FIXME:是否需要task上下文来决定路由, return actions[0]; diff --git a/src/agents/events/progressive-request.event.ts b/src/agents/events/progressive-request.event.ts index b232b92..068fb9d 100644 --- a/src/agents/events/progressive-request.event.ts +++ b/src/agents/events/progressive-request.event.ts @@ -7,7 +7,7 @@ export class ProgressiveRequestEvent extends EventObject { fromEvent: string, dataType: string, public readonly data: { - /** url template for progressive requesting, `botlet:funName[@botlet]` to invoke botlet */ + /** url template for progressive requesting, `callgent:funName[@callgent]` to invoke callgent */ progressive: string; }, ) { diff --git a/src/agents/llm.service.ts b/src/agents/llm.service.ts index ec66650..a11e7b6 100644 --- a/src/agents/llm.service.ts +++ b/src/agents/llm.service.ts @@ -118,8 +118,8 @@ export class LLMService { Authorization: `Bearer ${this.configService.get( 'OPENROUTER_API_KEY', )}`, - 'HTTP-Referer': `${this.configService.get('BOTLET_SITE_URL')}`, - 'X-Title': `${this.configService.get('BOTLET_SITE_NAME')}`, + 'HTTP-Referer': `${this.configService.get('CALLGENT_SITE_URL')}`, + 'X-Title': `${this.configService.get('CALLGENT_SITE_NAME')}`, 'Content-Type': 'application/json', }, body: JSON.stringify(req), diff --git a/src/app.controller.ts b/src/app.controller.ts index 2fe9eae..ac5fc12 100644 --- a/src/app.controller.ts +++ b/src/app.controller.ts @@ -23,11 +23,11 @@ export class AppController { Name: 'JamesP', MailboxHash: '', }, - To: '"ddsfskldfjds+334rfgg@call.botlet.io" ', + To: '"ddsfskldfjds+334rfgg@my.callgent.com" ', ToFull: [ { - Email: 'ddsfskldfjds+334rfgg@call.botlet.io', - Name: 'ddsfskldfjds+334rfgg@call.botlet.io', + Email: 'ddsfskldfjds+334rfgg@my.callgent.com', + Name: 'ddsfskldfjds+334rfgg@my.callgent.com', MailboxHash: '334rfgg', }, ], @@ -35,18 +35,18 @@ export class AppController { CcFull: [], Bcc: '', BccFull: [], - OriginalRecipient: 'ddsfskldfjds+334rfgg@call.botlet.io', + OriginalRecipient: 'ddsfskldfjds+334rfgg@my.callgent.com', Subject: 'Re: sfddsf', MessageID: '3e157239-b8c7-4a88-9cba-51c3a5690a15', ReplyTo: '', MailboxHash: '334rfgg', Date: 'Fri, 01 Mar 2024 22:46:07 +0800', TextBody: - 'Sdfsdf sddfds\nAppController\n\nddsfskldfjds+334rfgg@call.botlet.io\n\n\nsdf\n> From: "JamesP"\n> Date: Fri, Mar 1, 2024, 22:43\n> Subject: sfddsf\n> To: "ddsfskldfjds+334rfgg@call.botlet.io"\n> Sdfsdfsdfdsvbbf df', + 'Sdfsdf sddfds\nAppController\n\nddsfskldfjds+334rfgg@my.callgent.com\n\n\nsdf\n> From: "JamesP"\n> Date: Fri, Mar 1, 2024, 22:43\n> Subject: sfddsf\n> To: "ddsfskldfjds+334rfgg@my.callgent.com"\n> Sdfsdfsdfdsvbbf df', HtmlBody: - '
Sdfsdf <a href="dfd">sddfds</a>
AppController



sdf
From: "JamesP"<pang.ju@roles.chat>
Date: Fri, Mar 1, 2024, 22:43
Subject: sfddsf
Sdfsdfsdfdsvbbf df
', + '
Sdfsdf <a href="dfd">sddfds</a>
AppController



sdf
From: "JamesP"<pang.ju@roles.chat>
Date: Fri, Mar 1, 2024, 22:43
Subject: sfddsf
Sdfsdfsdfdsvbbf df
', StrippedTextReply: - 'Sdfsdf sddfds\nAppController\n\nddsfskldfjds+334rfgg@call.botlet.io\n\n\nsdf', + 'Sdfsdf sddfds\nAppController\n\nddsfskldfjds+334rfgg@my.callgent.com\n\n\nsdf', Tag: '', Headers: [ { Name: 'Return-Path', Value: '' }, @@ -75,7 +75,7 @@ export class AppController { { Name: 'Received', Value: - 'from va-1-15.ptr.blmpb.com (va-1-15.ptr.blmpb.com [209.127.230.15])\t(using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits))\t(No client certificate requested)\tby p-pm-inboundg03c-aws-useast1c.inbound.postmarkapp.com (Postfix) with ESMTPS id E14E9405106\tfor ; Fri, 1 Mar 2024 14:46:14 +0000 (UTC)', + 'from va-1-15.ptr.blmpb.com (va-1-15.ptr.blmpb.com [209.127.230.15])\t(using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits))\t(No client certificate requested)\tby p-pm-inboundg03c-aws-useast1c.inbound.postmarkapp.com (Postfix) with ESMTPS id E14E9405106\tfor ; Fri, 1 Mar 2024 14:46:14 +0000 (UTC)', }, { Name: 'DKIM-Signature', @@ -100,7 +100,7 @@ export class AppController { { Name: 'Mime-Version', Value: '1.0' }, { Name: 'X-Lms-Return-Path', - Value: '', + Value: '', }, ], Attachments: [], diff --git a/src/app.module.ts b/src/app.module.ts index d57a48e..9fe4bed 100644 --- a/src/app.module.ts +++ b/src/app.module.ts @@ -5,8 +5,8 @@ import { AgentsModule } from './agents/agents.module'; import { AppController } from './app.controller'; import { AppService } from './app.service'; import { AuthTokensModule } from './auth-tokens/auth-tokens.module'; -import { BotletFunctionsModule } from './botlet-functions/botlet-functions.module'; -import { BotletsModule } from './botlets/botlets.module'; +import { CallgentFunctionsModule } from './callgent-functions/callgent-functions.module'; +import { CallgentsModule } from './callgents/callgents.module'; import { EmailsModule } from './emails/emails.module'; import { EndpointsModule } from './endpoints/endpoints.module'; import { EventListenersModule } from './event-listeners/event-listeners.module'; @@ -31,11 +31,11 @@ import { UsersModule } from './users/users.module'; ReposModule, AuthModule, UsersModule, - BotletsModule, + CallgentsModule, TasksModule, AuthTokensModule, EndpointsModule, - BotletFunctionsModule, + CallgentFunctionsModule, AgentsModule, TaskActionsModule, EventListenersModule, diff --git a/src/bootstrap.ts b/src/bootstrap.ts index 4c1a9d1..f026b72 100644 --- a/src/bootstrap.ts +++ b/src/bootstrap.ts @@ -51,8 +51,8 @@ async function bootstrap(app: NestFastifyApplication, port: string) { const { devDocVersion } = registerApi( app, 1, - 'Botlet APIs', - 'The Botlet APIs', + 'Callgent APIs', + 'The Callgent APIs', logger, ); diff --git a/src/botlet-functions/botlet-functions.controller.spec.ts b/src/botlet-functions/botlet-functions.controller.spec.ts deleted file mode 100644 index 62ee4ef..0000000 --- a/src/botlet-functions/botlet-functions.controller.spec.ts +++ /dev/null @@ -1,18 +0,0 @@ -import { Test, TestingModule } from '@nestjs/testing'; -import { BotletFunctionsController } from './botlet-functions.controller'; - -describe('BotletFunctionsController', () => { - let controller: BotletFunctionsController; - - beforeEach(async () => { - const module: TestingModule = await Test.createTestingModule({ - controllers: [BotletFunctionsController], - }).compile(); - - controller = module.get(BotletFunctionsController); - }); - - it('should be defined', () => { - expect(controller).toBeDefined(); - }); -}); diff --git a/src/botlet-functions/botlet-functions.module.ts b/src/botlet-functions/botlet-functions.module.ts deleted file mode 100644 index 79b7a44..0000000 --- a/src/botlet-functions/botlet-functions.module.ts +++ /dev/null @@ -1,14 +0,0 @@ -import { Module } from '@nestjs/common'; -import { EndpointsModule } from '../endpoints/endpoints.module'; -import { BotletFunctionsController } from './botlet-functions.controller'; -import { BotletFunctionsService } from './botlet-functions.service'; - -@Module({ - imports: [EndpointsModule], - providers: [ - { provide: 'BotletFunctionsService', useClass: BotletFunctionsService }, - ], - controllers: [BotletFunctionsController], - exports: ['BotletFunctionsService'], -}) -export class BotletFunctionsModule {} diff --git a/src/botlet-functions/botlet-functions.service.spec.ts b/src/botlet-functions/botlet-functions.service.spec.ts deleted file mode 100644 index b8e6267..0000000 --- a/src/botlet-functions/botlet-functions.service.spec.ts +++ /dev/null @@ -1,18 +0,0 @@ -import { Test, TestingModule } from '@nestjs/testing'; -import { BotletFunctionsService } from './botlet-functions.service'; - -describe('BotletFunctionsService', () => { - let service: BotletFunctionsService; - - beforeEach(async () => { - const module: TestingModule = await Test.createTestingModule({ - providers: [BotletFunctionsService], - }).compile(); - - service = module.get(BotletFunctionsService); - }); - - it('should be defined', () => { - expect(service).toBeDefined(); - }); -}); diff --git a/src/botlets/botlets.module.ts b/src/botlets/botlets.module.ts deleted file mode 100644 index 60e53d5..0000000 --- a/src/botlets/botlets.module.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { Module } from '@nestjs/common'; -import { BotletsController } from './botlets.controller'; -import { BotletsService } from './botlets.service'; - -@Module({ - controllers: [BotletsController], - providers: [BotletsService], - exports: [BotletsService], -}) -export class BotletsModule {} diff --git a/src/botlets/events/botlet-created.event.ts b/src/botlets/events/botlet-created.event.ts deleted file mode 100644 index 5e9ff92..0000000 --- a/src/botlets/events/botlet-created.event.ts +++ /dev/null @@ -1,7 +0,0 @@ -import { Botlet } from '@prisma/client'; - -export class BotletCreatedEvent { - public static readonly eventName = 'botlet.created' as const; - - constructor(public readonly botlet: Botlet) {} -} diff --git a/src/callgent-functions/callgent-functions.controller.spec.ts b/src/callgent-functions/callgent-functions.controller.spec.ts new file mode 100644 index 0000000..c66a529 --- /dev/null +++ b/src/callgent-functions/callgent-functions.controller.spec.ts @@ -0,0 +1,18 @@ +import { Test, TestingModule } from '@nestjs/testing'; +import { CallgentFunctionsController } from './callgent-functions.controller'; + +describe('CallgentFunctionsController', () => { + let controller: CallgentFunctionsController; + + beforeEach(async () => { + const module: TestingModule = await Test.createTestingModule({ + controllers: [CallgentFunctionsController], + }).compile(); + + controller = module.get(CallgentFunctionsController); + }); + + it('should be defined', () => { + expect(controller).toBeDefined(); + }); +}); diff --git a/src/botlet-functions/botlet-functions.controller.ts b/src/callgent-functions/callgent-functions.controller.ts similarity index 69% rename from src/botlet-functions/botlet-functions.controller.ts rename to src/callgent-functions/callgent-functions.controller.ts index 18ed698..b97661c 100644 --- a/src/botlet-functions/botlet-functions.controller.ts +++ b/src/callgent-functions/callgent-functions.controller.ts @@ -27,16 +27,16 @@ import { EndpointDto } from '../endpoints/dto/endpoint.dto'; import { JwtGuard } from '../infra/auth/jwt/jwt.guard'; import { EntityIdExists } from '../infra/repo/validators/entity-exists.validator'; import { RestApiResponse } from '../restapi/response.interface'; -import { BotletFunctionsService } from './botlet-functions.service'; -import { BotletFunctionDto } from './dto/botlet-function.dto'; -import { UpdateBotletFunctionDto } from './dto/update-botlet-function.dto'; +import { CallgentFunctionsService } from './callgent-functions.service'; +import { CallgentFunctionDto } from './dto/callgent-function.dto'; +import { UpdateCallgentFunctionDto } from './dto/update-callgent-function.dto'; -export class BotletApis extends ApiSpec { +export class CallgentApis extends ApiSpec { @EntityIdExists('endpoint', 'uuid') endpoint: string; } -export class BotletApiText { +export class CallgentApiText { @EntityIdExists('endpoint', 'uuid') endpoint: string; @ApiProperty({ @@ -53,31 +53,31 @@ export class BotletApiText { format?: string; } -@ApiTags('BotletFunctions') +@ApiTags('CallgentFunctions') @ApiSecurity('defaultBearerAuth') -@ApiExtraModels(RestApiResponse, BotletFunctionDto) +@ApiExtraModels(RestApiResponse, CallgentFunctionDto) @UseGuards(JwtGuard) -@Controller('botlet-functions') -export class BotletFunctionsController { +@Controller('callgent-functions') +export class CallgentFunctionsController { constructor( - @Inject('BotletFunctionsService') - private readonly BotletFunctionService: BotletFunctionsService, + @Inject('CallgentFunctionsService') + private readonly CallgentFunctionService: CallgentFunctionsService, ) {} @ApiOperation({ summary: - 'Create batch of new BotletFunction. Exception if existing one with same name in the same botlet', + 'Create batch of new CallgentFunction. Exception if existing one with same name in the same callgent', description: 'return { data: count } on success', }) @Post() async createBatch( @Req() req, @Body() - apis: BotletApis, + apis: CallgentApis, ) { const endpoint = EntityIdExists.entity(apis, 'endpoint'); return { - data: await this.BotletFunctionService.createBatch( + data: await this.CallgentFunctionService.createBatch( endpoint, apis, req.user?.sub, @@ -93,11 +93,11 @@ export class BotletFunctionsController { async importBatch( @Req() req, @Body() - apiTxt: BotletApiText, + apiTxt: CallgentApiText, ) { const endpoint = EntityIdExists.entity(apiTxt, 'endpoint'); return { - data: await this.BotletFunctionService.importBatch( + data: await this.CallgentFunctionService.importBatch( endpoint, apiTxt, req.user?.sub, @@ -111,7 +111,7 @@ export class BotletFunctionsController { { $ref: getSchemaPath(RestApiResponse) }, { properties: { - data: { $ref: getSchemaPath(BotletFunctionDto) }, + data: { $ref: getSchemaPath(CallgentFunctionDto) }, }, }, ], @@ -119,7 +119,7 @@ export class BotletFunctionsController { }) @Get('/:uuid') async findOne(@Param('uuid') uuid: string) { - return { data: await this.BotletFunctionService.findOne(uuid) }; + return { data: await this.CallgentFunctionService.findOne(uuid) }; } @ApiQuery({ name: 'query', required: false, type: String }) @@ -133,7 +133,7 @@ export class BotletFunctionsController { properties: { data: { type: 'array', - items: { $ref: getSchemaPath(BotletFunctionDto) }, + items: { $ref: getSchemaPath(CallgentFunctionDto) }, }, }, }, @@ -149,7 +149,7 @@ export class BotletFunctionsController { name: { contains: query.queryString }, } : undefined; - return this.BotletFunctionService.findAll({ + return this.CallgentFunctionService.findAll({ page: query.page, perPage: query.perPage, where, @@ -160,17 +160,17 @@ export class BotletFunctionsController { schema: { allOf: [ { $ref: getSchemaPath(RestApiResponse) }, - { properties: { data: { $ref: getSchemaPath(BotletFunctionDto) } } }, + { properties: { data: { $ref: getSchemaPath(CallgentFunctionDto) } } }, ], }, }) @Put('/:uuid') async update( @Param('uuid') uuid: string, - @Body() dto: UpdateBotletFunctionDto, + @Body() dto: UpdateCallgentFunctionDto, ) { dto.uuid = uuid; - return { data: await this.BotletFunctionService.update(dto) }; + return { data: await this.CallgentFunctionService.update(dto) }; } @ApiOkResponse({ @@ -179,7 +179,7 @@ export class BotletFunctionsController { { $ref: getSchemaPath(RestApiResponse) }, { properties: { - data: { $ref: getSchemaPath(BotletFunctionDto) }, + data: { $ref: getSchemaPath(CallgentFunctionDto) }, }, }, ], @@ -187,6 +187,6 @@ export class BotletFunctionsController { }) @Delete('/:uuid') async delete(@Param('uuid') uuid: string) { - return { data: await this.BotletFunctionService.delete(uuid) }; + return { data: await this.CallgentFunctionService.delete(uuid) }; } } diff --git a/src/callgent-functions/callgent-functions.module.ts b/src/callgent-functions/callgent-functions.module.ts new file mode 100644 index 0000000..7458865 --- /dev/null +++ b/src/callgent-functions/callgent-functions.module.ts @@ -0,0 +1,14 @@ +import { Module } from '@nestjs/common'; +import { EndpointsModule } from '../endpoints/endpoints.module'; +import { CallgentFunctionsController } from './callgent-functions.controller'; +import { CallgentFunctionsService } from './callgent-functions.service'; + +@Module({ + imports: [EndpointsModule], + providers: [ + { provide: 'CallgentFunctionsService', useClass: CallgentFunctionsService }, + ], + controllers: [CallgentFunctionsController], + exports: ['CallgentFunctionsService'], +}) +export class CallgentFunctionsModule {} diff --git a/src/callgent-functions/callgent-functions.service.spec.ts b/src/callgent-functions/callgent-functions.service.spec.ts new file mode 100644 index 0000000..ca48c6d --- /dev/null +++ b/src/callgent-functions/callgent-functions.service.spec.ts @@ -0,0 +1,18 @@ +import { Test, TestingModule } from '@nestjs/testing'; +import { CallgentFunctionsService } from './callgent-functions.service'; + +describe('CallgentFunctionsService', () => { + let service: CallgentFunctionsService; + + beforeEach(async () => { + const module: TestingModule = await Test.createTestingModule({ + providers: [CallgentFunctionsService], + }).compile(); + + service = module.get(CallgentFunctionsService); + }); + + it('should be defined', () => { + expect(service).toBeDefined(); + }); +}); diff --git a/src/botlet-functions/botlet-functions.service.ts b/src/callgent-functions/callgent-functions.service.ts similarity index 74% rename from src/botlet-functions/botlet-functions.service.ts rename to src/callgent-functions/callgent-functions.service.ts index 962b5af..17f5ab1 100644 --- a/src/botlet-functions/botlet-functions.service.ts +++ b/src/callgent-functions/callgent-functions.service.ts @@ -2,25 +2,25 @@ import { TransactionHost, Transactional } from '@nestjs-cls/transactional'; import { TransactionalAdapterPrisma } from '@nestjs-cls/transactional-adapter-prisma'; import { BadRequestException, Inject, Injectable } from '@nestjs/common'; import { PaginatorTypes, paginator } from '@nodeteam/nestjs-prisma-pagination'; -import { BotletFunction, Prisma, PrismaClient } from '@prisma/client'; +import { CallgentFunction, Prisma, PrismaClient } from '@prisma/client'; import { ApiSpec } from '../endpoints/adaptors/endpoint-adaptor.interface'; import { EndpointDto } from '../endpoints/dto/endpoint.dto'; import { EndpointsService } from '../endpoints/endpoints.service'; import { ClientRequestEvent } from '../endpoints/events/client-request.event'; import { Utils } from '../infra/libs/utils'; import { selectHelper } from '../infra/repo/select.helper'; -import { UpdateBotletFunctionDto } from './dto/update-botlet-function.dto'; +import { UpdateCallgentFunctionDto } from './dto/update-callgent-function.dto'; const paginate: PaginatorTypes.PaginateFunction = paginator({ perPage: 10 }); @Injectable() -export class BotletFunctionsService { +export class CallgentFunctionsService { constructor( private readonly txHost: TransactionHost, @Inject('EndpointsService') private readonly endpointsService: EndpointsService, ) {} - protected readonly defSelect: Prisma.BotletFunctionSelect = { + protected readonly defSelect: Prisma.CallgentFunctionSelect = { id: false, tenantId: false, createdBy: false, @@ -31,17 +31,17 @@ export class BotletFunctionsService { async loadFunctions( reqEvent: ClientRequestEvent, ): Promise { - const { funName, botletId } = reqEvent.data; + const { funName, callgentId } = reqEvent.data; // TODO if too many functions, use summary first const { data: funcs } = await this.findAll({ select: { createdAt: false, updatedAt: false }, - where: { botletUuid: botletId, name: funName }, + where: { callgentUuid: callgentId, name: funName }, perPage: Number.MAX_SAFE_INTEGER, }); if (!funcs.length) throw new BadRequestException( - `No function found on botlet#${botletId}${ + `No function found on callgent#${callgentId}${ funName ? 'name=' + funName : '' }`, ); @@ -50,19 +50,19 @@ export class BotletFunctionsService { /** * a single function invocation. simple with no vars/flow controls/lambdas/parallels. - * system botlets are involved: collection functions, timer, etc. + * system callgents are involved: collection functions, timer, etc. */ // protected async _invoke( // taskAction: TaskActionDto, - // botlet: BotletDto, - // botletFunctions: BotletFunctionDto[], + // callgent: CallgentDto, + // callgentFunctions: CallgentFunctionDto[], // ) { // // FIXME task ctx msgs // // 生成args映射方法, // const { funName, mapping, question } = await this._mapping( // taskAction, - // botlet.name, - // botletFunctions, + // callgent.name, + // callgentFunctions, // ); // if (question) { // // invoke event owner for more request info @@ -73,7 +73,7 @@ export class BotletFunctionsService { // // ); // } - // const fun = botletFunctions.find((f) => f.name === funName); + // const fun = callgentFunctions.find((f) => f.name === funName); // if (!fun) return; // FIXME // // doInvoke @@ -88,18 +88,18 @@ export class BotletFunctionsService { const { apis } = spec; // validation - const actMap = apis.map((e) => { + const actMap = apis.map((e) => { return { ...e, uuid: Utils.uuid(), endpointUuid: endpoint.uuid, - botletUuid: endpoint.botletUuid, + callgentUuid: endpoint.callgentUuid, createdBy: createdBy, }; }); const prisma = this.txHost.tx as PrismaClient; - const { count: actionsCount } = await prisma.botletFunction.createMany({ + const { count: actionsCount } = await prisma.callgentFunction.createMany({ data: actMap, }); return actionsCount; @@ -122,9 +122,9 @@ export class BotletFunctionsService { page, perPage, }: { - select?: Prisma.BotletFunctionSelect; - where?: Prisma.BotletFunctionWhereInput; - orderBy?: Prisma.BotletFunctionOrderByWithRelationInput; + select?: Prisma.CallgentFunctionSelect; + where?: Prisma.CallgentFunctionWhereInput; + orderBy?: Prisma.CallgentFunctionOrderByWithRelationInput; page?: number; perPage?: number; }) { @@ -133,7 +133,7 @@ export class BotletFunctionsService { select, async (select) => { const result = paginate( - prisma.botletFunction, + prisma.callgentFunction, { select, where, @@ -152,28 +152,28 @@ export class BotletFunctionsService { } findMany(args: { - select?: Prisma.BotletFunctionSelect; - where?: Prisma.BotletFunctionWhereInput; - orderBy?: Prisma.BotletFunctionOrderByWithRelationInput; + select?: Prisma.CallgentFunctionSelect; + where?: Prisma.CallgentFunctionWhereInput; + orderBy?: Prisma.CallgentFunctionOrderByWithRelationInput; }) { const prisma = this.txHost.tx as PrismaClient; - return prisma.botletFunction.findMany({ ...args }); + return prisma.callgentFunction.findMany({ ...args }); } @Transactional() delete(uuid: string) { const prisma = this.txHost.tx as PrismaClient; return selectHelper(this.defSelect, (select) => - prisma.botletFunction.delete({ select, where: { uuid } }), + prisma.callgentFunction.delete({ select, where: { uuid } }), ); } @Transactional() - update(dto: UpdateBotletFunctionDto) { + update(dto: UpdateCallgentFunctionDto) { if (!dto.uuid) return; const prisma = this.txHost.tx as PrismaClient; return selectHelper(this.defSelect, (select) => - prisma.botletFunction.update({ + prisma.callgentFunction.update({ select, where: { uuid: dto.uuid }, data: dto, @@ -184,7 +184,7 @@ export class BotletFunctionsService { findOne(uuid: string) { const prisma = this.txHost.tx as PrismaClient; return selectHelper(this.defSelect, (select) => - prisma.botletFunction.findUnique({ + prisma.callgentFunction.findUnique({ select, where: { uuid }, }), diff --git a/src/botlets/botlets.controller.spec.ts b/src/callgents/callgents.controller.spec.ts similarity index 50% rename from src/botlets/botlets.controller.spec.ts rename to src/callgents/callgents.controller.spec.ts index 3b44264..ec9bff6 100644 --- a/src/botlets/botlets.controller.spec.ts +++ b/src/callgents/callgents.controller.spec.ts @@ -1,15 +1,15 @@ import { Test, TestingModule } from '@nestjs/testing'; -import { BotletsController } from './botlets.controller'; +import { CallgentsController } from './callgents.controller'; -describe('BotletsController', () => { - let controller: BotletsController; +describe('CallgentsController', () => { + let controller: CallgentsController; beforeEach(async () => { const module: TestingModule = await Test.createTestingModule({ - controllers: [BotletsController], + controllers: [CallgentsController], }).compile(); - controller = module.get(BotletsController); + controller = module.get(CallgentsController); }); it('should be defined', () => { diff --git a/src/botlets/botlets.controller.ts b/src/callgents/callgents.controller.ts similarity index 63% rename from src/botlets/botlets.controller.ts rename to src/callgents/callgents.controller.ts index c7790bc..18e73f5 100644 --- a/src/botlets/botlets.controller.ts +++ b/src/callgents/callgents.controller.ts @@ -21,31 +21,31 @@ import { } from '@nestjs/swagger'; import { JwtGuard } from '../infra/auth/jwt/jwt.guard'; import { RestApiResponse } from '../restapi/response.interface'; -import { BotletsService } from './botlets.service'; -import { BotletDto } from './dto/botlet.dto'; -import { CreateBotletDto } from './dto/create-botlet.dto'; -import { UpdateBotletDto } from './dto/update-botlet.dto'; +import { CallgentsService } from './callgents.service'; +import { CallgentDto } from './dto/callgent.dto'; +import { CreateCallgentDto } from './dto/create-callgent.dto'; +import { UpdateCallgentDto } from './dto/update-callgent.dto'; -@ApiTags('Botlets') +@ApiTags('Callgents') @ApiSecurity('defaultBearerAuth') -@ApiExtraModels(RestApiResponse, BotletDto) +@ApiExtraModels(RestApiResponse, CallgentDto) @UseGuards(JwtGuard) -@Controller('botlets') -export class BotletsController { - constructor(private readonly botletService: BotletsService) {} +@Controller('callgents') +export class CallgentsController { + constructor(private readonly callgentService: CallgentsService) {} @ApiCreatedResponse({ schema: { allOf: [ { $ref: getSchemaPath(RestApiResponse) }, - { properties: { data: { $ref: getSchemaPath(BotletDto) } } }, + { properties: { data: { $ref: getSchemaPath(CallgentDto) } } }, ], }, }) @Post() - async create(@Req() req, @Body() dto: CreateBotletDto) { + async create(@Req() req, @Body() dto: CreateCallgentDto) { return { - data: await this.botletService.create(dto, req.user.sub), + data: await this.callgentService.create(dto, req.user.sub), }; } @@ -53,13 +53,13 @@ export class BotletsController { schema: { allOf: [ { $ref: getSchemaPath(RestApiResponse) }, - { properties: { data: { $ref: getSchemaPath(BotletDto) } } }, + { properties: { data: { $ref: getSchemaPath(CallgentDto) } } }, ], }, }) @Get('/:uuid') async findOne(@Param('uuid') uuid: string) { - return { data: await this.botletService.findOne(uuid) }; + return { data: await this.callgentService.findOne(uuid) }; } @ApiQuery({ name: 'query', required: false, type: String }) @@ -71,7 +71,7 @@ export class BotletsController { { $ref: getSchemaPath(RestApiResponse) }, { properties: { - data: { type: 'array', items: { $ref: getSchemaPath(BotletDto) } }, + data: { type: 'array', items: { $ref: getSchemaPath(CallgentDto) } }, }, }, ], @@ -86,7 +86,7 @@ export class BotletsController { name: { contains: query.queryString }, } : undefined; - return this.botletService.findAll({ + return this.callgentService.findAll({ page: query.page, perPage: query.perPage, where, @@ -97,14 +97,14 @@ export class BotletsController { schema: { allOf: [ { $ref: getSchemaPath(RestApiResponse) }, - { properties: { data: { $ref: getSchemaPath(BotletDto) } } }, + { properties: { data: { $ref: getSchemaPath(CallgentDto) } } }, ], }, }) @Put('/:uuid') - async update(@Param('uuid') uuid: string, @Body() dto: UpdateBotletDto) { + async update(@Param('uuid') uuid: string, @Body() dto: UpdateCallgentDto) { dto.uuid = uuid; - return { data: await this.botletService.update(dto) }; + return { data: await this.callgentService.update(dto) }; } @ApiOkResponse({ @@ -113,7 +113,7 @@ export class BotletsController { { $ref: getSchemaPath(RestApiResponse) }, { properties: { - data: { $ref: getSchemaPath(BotletDto) }, + data: { $ref: getSchemaPath(CallgentDto) }, }, }, ], @@ -121,14 +121,14 @@ export class BotletsController { }) @Delete('/:uuid') async delete(@Param('uuid') uuid: string) { - return { data: await this.botletService.delete(uuid) }; + return { data: await this.callgentService.delete(uuid) }; } @ApiCreatedResponse({ schema: { allOf: [ { $ref: getSchemaPath(RestApiResponse) }, - { properties: { data: { $ref: getSchemaPath(BotletDto) } } }, + { properties: { data: { $ref: getSchemaPath(CallgentDto) } } }, ], }, }) @@ -136,10 +136,10 @@ export class BotletsController { async duplicateOverTenancy( @Param('uuid') uuid: string, @Req() req, - @Body() dto: CreateBotletDto, + @Body() dto: CreateCallgentDto, ) { return { - data: await this.botletService.duplicateOverTenancy( + data: await this.callgentService.duplicateOverTenancy( uuid, dto, req.user.sub, diff --git a/src/callgents/callgents.module.ts b/src/callgents/callgents.module.ts new file mode 100644 index 0000000..956e43d --- /dev/null +++ b/src/callgents/callgents.module.ts @@ -0,0 +1,10 @@ +import { Module } from '@nestjs/common'; +import { CallgentsController } from './callgents.controller'; +import { CallgentsService } from './callgents.service'; + +@Module({ + controllers: [CallgentsController], + providers: [CallgentsService], + exports: [CallgentsService], +}) +export class CallgentsModule {} diff --git a/src/botlets/botlets.service.spec.ts b/src/callgents/callgents.service.spec.ts similarity index 53% rename from src/botlets/botlets.service.spec.ts rename to src/callgents/callgents.service.spec.ts index 5d97c0b..7f8980f 100644 --- a/src/botlets/botlets.service.spec.ts +++ b/src/callgents/callgents.service.spec.ts @@ -1,15 +1,15 @@ import { Test, TestingModule } from '@nestjs/testing'; -import { BotletsService } from './botlets.service'; +import { CallgentsService } from './callgents.service'; -describe('BotletsService', () => { - let service: BotletsService; +describe('CallgentsService', () => { + let service: CallgentsService; beforeEach(async () => { const module: TestingModule = await Test.createTestingModule({ - providers: [BotletsService], + providers: [CallgentsService], }).compile(); - service = module.get(BotletsService); + service = module.get(CallgentsService); }); it('should be defined', () => { diff --git a/src/botlets/botlets.service.ts b/src/callgents/callgents.service.ts similarity index 62% rename from src/botlets/botlets.service.ts rename to src/callgents/callgents.service.ts index 0132456..046cc4a 100644 --- a/src/botlets/botlets.service.ts +++ b/src/callgents/callgents.service.ts @@ -3,25 +3,25 @@ import { TransactionalAdapterPrisma } from '@nestjs-cls/transactional-adapter-pr import { Injectable, Logger, NotFoundException } from '@nestjs/common'; import { EventEmitter2 } from '@nestjs/event-emitter'; import { PaginatorTypes, paginator } from '@nodeteam/nestjs-prisma-pagination'; -import { Botlet, Prisma, PrismaClient } from '@prisma/client'; +import { Callgent, Prisma, PrismaClient } from '@prisma/client'; import { Utils } from '../infra/libs/utils'; import { selectHelper } from '../infra/repo/select.helper'; import { PrismaTenancyService } from '../infra/repo/tenancy/prisma-tenancy.service'; -import { CreateBotletDto } from './dto/create-botlet.dto'; -import { UpdateBotletDto } from './dto/update-botlet.dto'; -import { BotletCreatedEvent } from './events/botlet-created.event'; +import { CreateCallgentDto } from './dto/create-callgent.dto'; +import { UpdateCallgentDto } from './dto/update-callgent.dto'; +import { CallgentCreatedEvent } from './events/callgent-created.event'; const paginate: PaginatorTypes.PaginateFunction = paginator({ perPage: 10 }); @Injectable() -export class BotletsService { - private readonly logger = new Logger(BotletsService.name); +export class CallgentsService { + private readonly logger = new Logger(CallgentsService.name); constructor( private readonly txHost: TransactionHost, private readonly eventEmitter: EventEmitter2, private readonly tenancyService: PrismaTenancyService, ) {} - protected readonly defSelect: Prisma.BotletSelect = { + protected readonly defSelect: Prisma.CallgentSelect = { id: false, tenantId: false, createdBy: false, @@ -30,22 +30,22 @@ export class BotletsService { @Transactional() async create( - dto: CreateBotletDto, + dto: CreateCallgentDto, createdBy: string, - select?: Prisma.BotletSelect, + select?: Prisma.CallgentSelect, ) { - const data = dto as Prisma.BotletUncheckedCreateInput; + const data = dto as Prisma.CallgentUncheckedCreateInput; (data.uuid = Utils.uuid()), (data.createdBy = createdBy); const prisma = this.txHost.tx as PrismaClient; - const ret: Botlet = await selectHelper( + const ret: Callgent = await selectHelper( select, - (select) => prisma.botlet.create({ select, data }), + (select) => prisma.callgent.create({ select, data }), this.defSelect, ); await this.eventEmitter.emitAsync( - BotletCreatedEvent.eventName, - new BotletCreatedEvent({ ...data, ...ret }), + CallgentCreatedEvent.eventName, + new CallgentCreatedEvent({ ...data, ...ret }), ); return ret; } @@ -58,9 +58,9 @@ export class BotletsService { page, perPage, }: { - select?: Prisma.BotletSelect; - where?: Prisma.BotletWhereInput; - orderBy?: Prisma.BotletOrderByWithRelationInput; + select?: Prisma.CallgentSelect; + where?: Prisma.CallgentWhereInput; + orderBy?: Prisma.CallgentOrderByWithRelationInput; page?: number; perPage?: number; }) { @@ -69,7 +69,7 @@ export class BotletsService { select, async (select) => { const result = paginate( - prisma.botlet, + prisma.callgent, { select, where, @@ -88,42 +88,42 @@ export class BotletsService { } @Transactional() - async findMany(uuids: string[], select?: Prisma.BotletSelect) { + async findMany(uuids: string[], select?: Prisma.CallgentSelect) { const prisma = this.txHost.tx as PrismaClient; - const botlets = await selectHelper( + const callgents = await selectHelper( select, async (select) => - await prisma.botlet.findMany({ + await prisma.callgent.findMany({ where: { uuid: { in: uuids } }, select, }), this.defSelect, ); - if (botlets.length != uuids.length) + if (callgents.length != uuids.length) throw new NotFoundException( - `Botlet not found, uuid=${uuids - .filter((x) => !botlets.find((y) => y.uuid == x)) + `Callgent not found, uuid=${uuids + .filter((x) => !callgents.find((y) => y.uuid == x)) .join(', ')}`, ); - return botlets; + return callgents; } @Transactional() delete(uuid: string) { const prisma = this.txHost.tx as PrismaClient; return selectHelper(this.defSelect, (select) => - prisma.botlet.delete({ select, where: { uuid } }), + prisma.callgent.delete({ select, where: { uuid } }), ); } @Transactional() - update(dto: UpdateBotletDto) { + update(dto: UpdateCallgentDto) { if (!dto.uuid) return; const prisma = this.txHost.tx as PrismaClient; return selectHelper(this.defSelect, (select) => - prisma.botlet.update({ + prisma.callgent.update({ select, where: { uuid: dto.uuid }, data: dto, @@ -132,12 +132,12 @@ export class BotletsService { } @Transactional() - findOne(uuid: string, select?: Prisma.BotletSelect) { + findOne(uuid: string, select?: Prisma.CallgentSelect) { const prisma = this.txHost.tx as PrismaClient; return selectHelper( select, (select) => - prisma.botlet.findUnique({ + prisma.callgent.findUnique({ select, where: { uuid }, }), @@ -148,23 +148,23 @@ export class BotletsService { @Transactional() async duplicateOverTenancy( dupUuid: string, - dto: CreateBotletDto, + dto: CreateCallgentDto, createdBy: string, ) { const prisma = this.txHost.tx as PrismaClient; await this.tenancyService.bypassTenancy(prisma); - const dup = await prisma.botlet.findUnique({ where: { uuid: dupUuid } }); + const dup = await prisma.callgent.findUnique({ where: { uuid: dupUuid } }); if (!dup) - throw new NotFoundException('botlet to duplicate not found: ' + dupUuid); + throw new NotFoundException('callgent to duplicate not found: ' + dupUuid); await this.tenancyService.bypassTenancy(prisma, false); - const botlet = await this.create(dto, createdBy, { id: null }); + const callgent = await this.create(dto, createdBy, { id: null }); } /** * Cross tenancy execution when client endpoint is provided. - * [endpoint://]botlet.please('act', with_args) + * [endpoint://]callgent.please('act', with_args) * @param act API action name * @param endpoint client endpoint to call API. unnecessary in internal calls */ @@ -172,38 +172,38 @@ export class BotletsService { async please( act: string, args: any[], - endpoint: { botletUuid: string; uuid?: string; adaptorKey?: string }, + endpoint: { callgentUuid: string; uuid?: string; adaptorKey?: string }, ) { - // invoke botlet action api, through endpoint + // invoke callgent action api, through endpoint const prisma = this.txHost.tx as PrismaClient; const withEndpoint = endpoint?.uuid || endpoint?.adaptorKey; // load targets if (withEndpoint) this.tenancyService.bypassTenancy(prisma); - const [botlet, actions, epClient] = await Promise.all([ - prisma.botlet.findUnique({ where: { uuid: endpoint.botletUuid } }), - prisma.botletFunction.findMany({ - where: { name: act, botletUuid: endpoint.botletUuid }, + const [callgent, actions, epClient] = await Promise.all([ + prisma.callgent.findUnique({ where: { uuid: endpoint.callgentUuid } }), + prisma.callgentFunction.findMany({ + where: { name: act, callgentUuid: endpoint.callgentUuid }, }), withEndpoint && prisma.endpoint.findFirst({ where: { ...endpoint, type: 'CLIENT' } }), ]); // check targets - if (!botlet) - throw new NotFoundException('botlet not found: ' + endpoint.botletUuid); + if (!callgent) + throw new NotFoundException('callgent not found: ' + endpoint.callgentUuid); if (actions.length === 0) throw new NotFoundException( - `botlet=${endpoint.botletUuid} API action not found: ${act}`, + `callgent=${endpoint.callgentUuid} API action not found: ${act}`, ); if (withEndpoint) { if (!epClient) throw new NotFoundException( - `Client endpoint not found for botlet=${endpoint.botletUuid}: ${ + `Client endpoint not found for callgent=${endpoint.callgentUuid}: ${ endpoint.uuid || endpoint.adaptorKey }`, ); - this.tenancyService.setTenantId(botlet.tenantId); + this.tenancyService.setTenantId(callgent.tenantId); this.tenancyService.bypassTenancy(prisma, false); } diff --git a/src/callgents/events/callgent-created.event.ts b/src/callgents/events/callgent-created.event.ts new file mode 100644 index 0000000..df88852 --- /dev/null +++ b/src/callgents/events/callgent-created.event.ts @@ -0,0 +1,7 @@ +import { Callgent } from '@prisma/client'; + +export class CallgentCreatedEvent { + public static readonly eventName = 'callgent.created' as const; + + constructor(public readonly callgent: Callgent) {} +} diff --git a/src/endpoints/adaptors/builtin/restapi/restapi.adaptor.ts b/src/endpoints/adaptors/builtin/restapi/restapi.adaptor.ts index 64f0457..5b8a521 100644 --- a/src/endpoints/adaptors/builtin/restapi/restapi.adaptor.ts +++ b/src/endpoints/adaptors/builtin/restapi/restapi.adaptor.ts @@ -85,7 +85,7 @@ export class RestAPIAdaptor implements EndpointAdaptor { name: 'Download Chrome Plugin', position: 'bottom', value: - 'Before continue, please confirm this automation does NOT violate any ToS or regulations of the target website! \nYour need to install the [Botlet Web Page](https://chrome.google.com/webstore/detail/botlet-web-page/pefjgjgjgjgjgjgjgjgjgjgjgjgjgjgj) Chrome plugin, as the operation client. \n> Note: You need to keep the Chrome open to perform tasks.', + 'Before continue, please confirm this automation does NOT violate any ToS or regulations of the target website! \nYour need to install the [Callgent Web Page](https://chrome.google.com/webstore/detail/callgent-web-page/pefjgjgjgjgjgjgjgjgjgjgjgjgjgjgj) Chrome plugin, as the operation client. \n> Note: You need to keep the Chrome open to perform tasks.', }, ], }, @@ -94,7 +94,7 @@ export class RestAPIAdaptor implements EndpointAdaptor { address: { type: 'domain', name: 'Custom Domain', - value: 'page.botlet.io', + value: 'page.callgent.com', placeholder: 'Not applicable in Free plan.', }, }, @@ -218,7 +218,7 @@ export class RestAPIAdaptor implements EndpointAdaptor { const { method, headers: rawHeaders, query, body, raw } = request; if (request.url.indexOf('/invoke/api/') < 0) throw new Error( - 'Unsupported URL, should be /botlets/:uuids/:endpoint/invoke/api/*', + 'Unsupported URL, should be /callgents/:uuids/:endpoint/invoke/api/*', ); const url = request.url.substr(request.url.indexOf('/invoke/api/') + 11); @@ -243,7 +243,7 @@ export class RestAPIAdaptor implements EndpointAdaptor { return { url, method, - headers: { ...headers }, // filter botlet authorization + headers: { ...headers }, // filter callgent authorization query, files, [type]: body, diff --git a/src/endpoints/adaptors/builtin/restapi/restapi.controller.ts b/src/endpoints/adaptors/builtin/restapi/restapi.controller.ts index 0054347..5a49cdc 100644 --- a/src/endpoints/adaptors/builtin/restapi/restapi.controller.ts +++ b/src/endpoints/adaptors/builtin/restapi/restapi.controller.ts @@ -17,32 +17,32 @@ import { JwtGuard } from '../../../../infra/auth/jwt/jwt.guard'; import { EndpointsService } from '../../../endpoints.service'; import { ClientRequestEvent } from '../../../events/client-request.event'; import { RestAPIAdaptor } from './restapi.adaptor'; -import { BotletsService } from '../../../../botlets/botlets.service'; +import { CallgentsService } from '../../../../callgents/callgents.service'; /** global rest-api endpoint entry */ @ApiTags('Client Endpoint: Rest-API') @UseGuards(new JwtGuard(true)) -@Controller('botlets') +@Controller('callgents') export class RestApiController { constructor( - protected readonly botletsService: BotletsService, + protected readonly callgentsService: CallgentsService, @Inject('EndpointsService') protected readonly endpointsService: EndpointsService, protected readonly eventListenersService: EventListenersService, ) {} @ApiOperation({ - description: 'rest-api client endpoint entry of multiple botlets', + description: 'rest-api client endpoint entry of multiple callgents', }) @ApiParam({ name: 'uuid', required: true, - description: "comma separated botlet uuids, eg: 'uuid1,uuid2,uuid3'. ", + description: "comma separated callgent uuids, eg: 'uuid1,uuid2,uuid3'. ", }) @ApiParam({ name: 'endpoint', required: false, - description: 'endpoint uuid, optional: "/botlets/the-uuid`//`invoke/api/"', + description: 'endpoint uuid, optional: "/callgents/the-uuid`//`invoke/api/"', }) @ApiParam({ name: 'NOTE: swagger does not support wildcard param. Just document here', @@ -60,32 +60,32 @@ export class RestApiController { @All(':uuid/:endpoint/invoke/api/*') async execute( @Req() req, - @Param('uuid') botletId: string, + @Param('uuid') callgentId: string, @Param('endpoint') endpoint?: string, @Headers('x-callgent-taskId') taskId?: string, @Headers('x-callgent-progressive') progressive?: string, @Headers('x-callgent-callback') callback?: string, ) { - const basePath = `${botletId}/${endpoint}/invoke/api/`; + const basePath = `${callgentId}/${endpoint}/invoke/api/`; let funName = req.url.substr(req.url.indexOf(basePath) + basePath.length); if (funName) funName = RestAPIAdaptor.formalActionName(req.method, '/' + funName); const caller = req.user?.sub || req.ip || req.socket.remoteAddress; - // TODO owner defaults to caller botlet - // find botlet cep, then set tenantId + // TODO owner defaults to caller callgent + // find callgent cep, then set tenantId const cep = await this.endpointsService.$findFirstByType( EndpointType.CLIENT, - botletId, + callgentId, 'restAPI', endpoint, ); if (!cep) throw new NotFoundException( - 'restAPI endpoint not found for botlet: ' + botletId, + 'restAPI endpoint not found for callgent: ' + callgentId, ); - const botlet = await this.botletsService.findOne(botletId, { name: true }); - if (!botlet) throw new NotFoundException('botlet not found: ' + botletId); + const callgent = await this.callgentsService.findOne(callgentId, { name: true }); + if (!callgent) throw new NotFoundException('callgent not found: ' + callgentId); const { event, statusCode, message } = await this.eventListenersService.emit( @@ -96,8 +96,8 @@ export class RestApiController { req, callback, { - botletId, - botletName: botlet.name, + callgentId, + callgentName: callgent.name, caller, progressive, funName, @@ -151,8 +151,8 @@ export class RestApiController { // if (!caller) throw new UnauthorizedException(); // const dto = await this.convertToTask(callerType, body, caller); - // if (!dto?.botlet) - // throw new BadRequestException('botlet uuid is missing'); + // if (!dto?.callgent) + // throw new BadRequestException('callgent uuid is missing'); // const [task] = await this.tasksService.create(dto); diff --git a/src/endpoints/adaptors/builtin/web/webpage.adaptor.ts b/src/endpoints/adaptors/builtin/web/webpage.adaptor.ts index 8fa3f3b..2a9fa16 100644 --- a/src/endpoints/adaptors/builtin/web/webpage.adaptor.ts +++ b/src/endpoints/adaptors/builtin/web/webpage.adaptor.ts @@ -36,7 +36,7 @@ export class WebpageAdaptor implements EndpointAdaptor { name: 'Download Chrome Plugin', position: 'bottom', value: - 'Before continue, please confirm this automation does NOT violate any ToS or regulations of the target website! \nYour need to install the [Botlet Web Page](https://chrome.google.com/webstore/detail/botlet-web-page/pefjgjgjgjgjgjgjgjgjgjgjgjgjgjgj) Chrome plugin, as the operation client. \n> Note: You need to keep the Chrome open to perform tasks.', + 'Before continue, please confirm this automation does NOT violate any ToS or regulations of the target website! \nYour need to install the [Callgent Web Page](https://chrome.google.com/webstore/detail/callgent-web-page/pefjgjgjgjgjgjgjgjgjgjgjgjgjgjgj) Chrome plugin, as the operation client. \n> Note: You need to keep the Chrome open to perform tasks.', }, ], }, @@ -45,7 +45,7 @@ export class WebpageAdaptor implements EndpointAdaptor { address: { type: 'domain', name: 'Custom Domain', - value: 'page.botlet.io', + value: 'page.callgent.com', placeholder: 'Not applicable in Free plan.', }, }, diff --git a/src/endpoints/adaptors/endpoint-adaptor.decorator.ts b/src/endpoints/adaptors/endpoint-adaptor.decorator.ts index 7ad2cad..40cc625 100644 --- a/src/endpoints/adaptors/endpoint-adaptor.decorator.ts +++ b/src/endpoints/adaptors/endpoint-adaptor.decorator.ts @@ -1,7 +1,7 @@ import { SetMetadata } from '@nestjs/common'; -export const IS_BOTLET_ENDPOINT_ADAPTOR = 'isBotletEndpointAdaptor'; +export const IS_CALLGENT_ENDPOINT_ADAPTOR = 'isCallgentEndpointAdaptor'; export const EndpointAdaptorName = ( name: string, type: 'receiver' | 'sender' | 'both', -) => SetMetadata(IS_BOTLET_ENDPOINT_ADAPTOR, `${name}:${type}`); +) => SetMetadata(IS_CALLGENT_ENDPOINT_ADAPTOR, `${name}:${type}`); diff --git a/src/endpoints/adaptors/endpoint-adaptor.interface.ts b/src/endpoints/adaptors/endpoint-adaptor.interface.ts index b3ab3f5..59c501c 100644 --- a/src/endpoints/adaptors/endpoint-adaptor.interface.ts +++ b/src/endpoints/adaptors/endpoint-adaptor.interface.ts @@ -98,7 +98,7 @@ export class EndpointParam { class EndpointHost { @ApiProperty({ description: 'host address', - example: 'task+sdfhjw4349fe@c.botlet.io', + example: 'task+sdfhjw4349fe@my.callgent.com', }) address: EndpointParam; diff --git a/src/endpoints/endpoints.controller.ts b/src/endpoints/endpoints.controller.ts index 16e4576..a9c49fe 100644 --- a/src/endpoints/endpoints.controller.ts +++ b/src/endpoints/endpoints.controller.ts @@ -40,7 +40,7 @@ export class EndpointsController { // return adaptor.getConfig(); // } - @Post(':adaptorKey/botlets') + @Post(':adaptorKey/callgents') async createEndpoint( @Req() req, @Param('adaptorKey') adaptorKey: string, diff --git a/src/endpoints/endpoints.module.ts b/src/endpoints/endpoints.module.ts index f8c4b7e..63f397a 100644 --- a/src/endpoints/endpoints.module.ts +++ b/src/endpoints/endpoints.module.ts @@ -5,14 +5,14 @@ import { RestApiController } from './adaptors/builtin/restapi/restapi.controller import { WebpageAdaptor } from './adaptors/builtin/web/webpage.adaptor'; import { EndpointsController } from './endpoints.controller'; import { EndpointsService } from './endpoints.service'; -import { BotletCreatedListener } from './listeners/botlet-created.listener'; -import { BotletsModule } from '../botlets/botlets.module'; +import { CallgentCreatedListener } from './listeners/callgent-created.listener'; +import { CallgentsModule } from '../callgents/callgents.module'; @Module({ - imports: [BotletsModule], + imports: [CallgentsModule], providers: [ { provide: 'EndpointsService', useClass: EndpointsService }, - BotletCreatedListener, + CallgentCreatedListener, { provide: 'restAPI-EndpointAdaptor', useClass: RestAPIAdaptor, diff --git a/src/endpoints/endpoints.service.ts b/src/endpoints/endpoints.service.ts index 32435ed..81f54fd 100644 --- a/src/endpoints/endpoints.service.ts +++ b/src/endpoints/endpoints.service.ts @@ -12,7 +12,7 @@ import { EndpointType, Prisma, PrismaClient } from '@prisma/client'; import { Utils } from '../infra/libs/utils'; import { selectHelper } from '../infra/repo/select.helper'; import { PrismaTenancyService } from '../infra/repo/tenancy/prisma-tenancy.service'; -import { IS_BOTLET_ENDPOINT_ADAPTOR } from './adaptors/endpoint-adaptor.decorator'; +import { IS_CALLGENT_ENDPOINT_ADAPTOR } from './adaptors/endpoint-adaptor.decorator'; import { EndpointAdaptor } from './adaptors/endpoint-adaptor.interface'; import { EndpointDto } from './dto/endpoint.dto'; import { UpdateEndpointDto } from './dto/update-endpoint.dto'; @@ -43,7 +43,7 @@ export class EndpointsService { for (const [serviceKey, provider] of nestModule.providers) { if (!provider.metatype) continue; const name = Reflect.getMetadata( - IS_BOTLET_ENDPOINT_ADAPTOR, + IS_CALLGENT_ENDPOINT_ADAPTOR, provider.metatype, ); if (name?.indexOf(':') > 0) { @@ -85,14 +85,14 @@ export class EndpointsService { @Transactional() findFirstByType( type: EndpointType, - botletUuid: string, + callgentUuid: string, adaptorKey: string, uuid?: string, ) { uuid || (uuid = undefined); const prisma = this.txHost.tx as PrismaClient; return prisma.endpoint.findFirst({ - where: { botletUuid, adaptorKey, type, uuid }, + where: { callgentUuid, adaptorKey, type, uuid }, orderBy: { priority: 'desc' }, }); } @@ -101,13 +101,13 @@ export class EndpointsService { @Transactional() async $findFirstByType( type: EndpointType, - botletUuid: string, + callgentUuid: string, adaptorKey: string, endpoint?: string, ) { const prisma = this.txHost.tx as PrismaClient; return this.tenancyService.bypassTenancy(prisma).then(() => - this.findFirstByType(type, botletUuid, adaptorKey, endpoint).then( + this.findFirstByType(type, callgentUuid, adaptorKey, endpoint).then( async (v) => { v && this.tenancyService.setTenantId(v.tenantId); await this.tenancyService.bypassTenancy(prisma, false); diff --git a/src/endpoints/events/client-request.event.ts b/src/endpoints/events/client-request.event.ts index e6cc515..5be12b8 100644 --- a/src/endpoints/events/client-request.event.ts +++ b/src/endpoints/events/client-request.event.ts @@ -20,14 +20,14 @@ export class ClientRequestEvent extends EventObject { public readonly rawReq: any, callback: string, public readonly data: { - botletId: string; - botletName: string; + callgentId: string; + callgentName: string; /** empty means anonymous */ caller?: string; req?: JsonValue; - /** requested botlet function name */ + /** requested callgent function name */ funName?: string; - /** url template for progressive requesting, `botlet:funName[@botlet]` to invoke botlet */ + /** url template for progressive requesting, `callgent:funName[@callgent]` to invoke callgent */ progressive?: string; }, ) { diff --git a/src/endpoints/listeners/botlet-created.listener.ts b/src/endpoints/listeners/callgent-created.listener.ts similarity index 64% rename from src/endpoints/listeners/botlet-created.listener.ts rename to src/endpoints/listeners/callgent-created.listener.ts index 1361b9d..39a78dc 100644 --- a/src/endpoints/listeners/botlet-created.listener.ts +++ b/src/endpoints/listeners/callgent-created.listener.ts @@ -1,35 +1,35 @@ import { Transactional } from '@nestjs-cls/transactional'; import { Inject, Injectable, Logger } from '@nestjs/common'; import { OnEvent } from '@nestjs/event-emitter'; -import { BotletCreatedEvent } from '../../botlets/events/botlet-created.event'; +import { CallgentCreatedEvent } from '../../callgents/events/callgent-created.event'; import { EndpointsService } from '../endpoints.service'; @Injectable() -export class BotletCreatedListener { - private readonly logger = new Logger(BotletCreatedListener.name); +export class CallgentCreatedListener { + private readonly logger = new Logger(CallgentCreatedListener.name); constructor( @Inject('EndpointsService') private readonly endpointsService: EndpointsService, ) {} - /** create a botlet with default api receiver endpoint, and mail receiver/sender endpoint */ + /** create a callgent with default api receiver endpoint, and mail receiver/sender endpoint */ @Transactional() - @OnEvent(BotletCreatedEvent.eventName, { async: false }) - async handleEvent(event: BotletCreatedEvent) { + @OnEvent(CallgentCreatedEvent.eventName, { async: false }) + async handleEvent(event: CallgentCreatedEvent) { this.logger.debug('Handling event: %j', event); - const botlet = event.botlet; + const callgent = event.callgent; // add default endpoints const results = await Promise.all([ // API client endpoint this.endpointsService .create({ - botletUuid: botlet.uuid, + callgentUuid: callgent.uuid, type: 'CLIENT', adaptorKey: 'restAPI', host: {}, - createdBy: botlet.createdBy, + createdBy: callgent.createdBy, }) .then((endpoint) => { // no await init, it may be slow @@ -42,11 +42,11 @@ export class BotletCreatedListener { // mail client endpoint this.endpointsService .create({ - botletUuid: botlet.uuid, + callgentUuid: callgent.uuid, type: 'CLIENT', adaptorKey: 'mail', - host: { mail: `botlet+${botlet.uuid}@c.botlet.io` }, - createdBy: botlet.createdBy, + host: { mail: `callgent+${callgent.uuid}@my.callgent.com` }, + createdBy: callgent.createdBy, }) .then((endpoint) => { // no await init, it may be slow diff --git a/src/event-listeners/event-listeners.service.ts b/src/event-listeners/event-listeners.service.ts index ff8608f..f265076 100644 --- a/src/event-listeners/event-listeners.service.ts +++ b/src/event-listeners/event-listeners.service.ts @@ -198,8 +198,8 @@ export class EventListenersService { event: T, funName?: string, ): Promise<{ event: T; funName?: string }> { - if (listener.serviceType == ServiceType.BOTLET) { - return this._invokeBotlet(listener, event, funName); + if (listener.serviceType == ServiceType.CALLGENT) { + return this._invokeCallgent(listener, event, funName); } else { return this._invokeService(listener, event, funName); } @@ -223,7 +223,7 @@ export class EventListenersService { return fun.apply(service, [event]); } - protected async _invokeBotlet( + protected async _invokeCallgent( target: { uuid: string; serviceName: string; funName: string }, event: T, funName?: string, diff --git a/src/event-listeners/event-object.ts b/src/event-listeners/event-object.ts index 94522d3..f43e0cf 100644 --- a/src/event-listeners/event-object.ts +++ b/src/event-listeners/event-object.ts @@ -10,7 +10,7 @@ export class EventObject { public readonly dataType: string, /** target uuid to relate several events */ public targetId: string, - /** url template for response callback, `botlet:funName[@botlet]` to invoke botlet */ + /** url template for response callback, `callgent:funName[@callgent]` to invoke callgent */ public callback?: string, public readonly callbackType: EventCallbackType = 'EVENT', ) { diff --git a/src/executions/command.schema.ts b/src/executions/command.schema.ts index b13520b..9651580 100644 --- a/src/executions/command.schema.ts +++ b/src/executions/command.schema.ts @@ -1,9 +1,9 @@ -/** through `botlet` to call method/assignee, with args */ +/** through `callgent` to call method/assignee, with args */ export class Invocation { - /** botlet */ - botlet: { uuid: string; name: string }; + /** callgent */ + callgent: { uuid: string; name: string }; func: string; - /** expression referring to botlet response data */ + /** expression referring to callgent response data */ args?: { [key: string]: string }; } @@ -36,21 +36,21 @@ export class Command { // invocation refer to data by expressions, // list of instructions as a command -// ask a botlet to do sth, on some event: -// botlet.register event do: botlet.act(args) -// ask a botlet to do sth, on some condition: -// when resp.?, then botlet.act(args) +// ask a callgent to do sth, on some event: +// callgent.register event do: callgent.act(args) +// ask a callgent to do sth, on some condition: +// when resp.?, then callgent.act(args) // guys, please send a mail at 3pm to xx, ask him whether and where want to go // if yes, book a table at where he want to go -// TODO botlet routing +// TODO callgent routing // @b.observe('time event', '3pm', [ // b_mail_send = @b_mail.act('send', { to: 'xx', subject: 'ask whether and where want to go' }), // if b_mail_send.resp.yes, then b_table_book = @b_table.act('book', { where: b_mail_send.resp.where }) // ]) -// 1. botlet routing +// 1. callgent routing // 2. entry routing // 3. args mapping/generation, progressively // 4. invocation diff --git a/src/executions/executions.service.ts b/src/executions/executions.service.ts index 2c1f047..1db4710 100644 --- a/src/executions/executions.service.ts +++ b/src/executions/executions.service.ts @@ -7,7 +7,7 @@ import { NotFoundException, } from '@nestjs/common'; import { EndpointType, PrismaClient } from '@prisma/client'; -import { BotletsService } from '../botlets/botlets.service'; +import { CallgentsService } from '../callgents/callgents.service'; import { EndpointDto } from '../endpoints/dto/endpoint.dto'; import { EndpointsService } from '../endpoints/endpoints.service'; import { JwtPayload } from '../infra/auth/jwt/jwt.service'; @@ -15,33 +15,33 @@ import { CommandExecutor } from './command.executor'; /** * An execution belongs to a task. Triggered by an external user or system, - * to one or more botlets. + * to one or more callgents. */ @Injectable() export class ExecutionsService { constructor( private readonly txHost: TransactionHost, - private readonly botletsService: BotletsService, + private readonly callgentsService: CallgentsService, @Inject('EndpointsService') private readonly endpointsService: EndpointsService, private readonly commandExecutor: CommandExecutor, ) {} /** - * external client call in to a group of botlets. - * @param action ignored if multiple botlets + * external client call in to a group of callgents. + * @param action ignored if multiple callgents */ @Transactional() async execute( - botletUuids: string[], + callgentUuids: string[], rawReq: object, reqAdaptorKey: string, ctx: { taskId?: string; caller?: JwtPayload; callback?: string } = {}, reqEndpointUuid?: string, action?: string, ) { - if (!botletUuids?.length) - throw new BadRequestException('botletUuids must be specified'); + if (!callgentUuids?.length) + throw new BadRequestException('callgentUuids must be specified'); // client adaptor const reqAdaptor = this.endpointsService.getAdaptor( @@ -60,23 +60,23 @@ export class ExecutionsService { !reqEndpoint || reqEndpoint.type != EndpointType.CLIENT || reqEndpoint.adaptorKey != reqAdaptorKey || - !botletUuids.includes(reqEndpoint.botletUuid) + !callgentUuids.includes(reqEndpoint.callgentUuid) ) throw new NotFoundException( `Endpoint not found, uuid=${reqEndpointUuid}`, ); } - // load botlets + // load callgents const prisma = this.txHost.tx as PrismaClient; - const botlets = await prisma.botlet.findMany({ - where: { uuid: { in: botletUuids } }, + const callgents = await prisma.callgent.findMany({ + where: { uuid: { in: callgentUuids } }, select: { uuid: true, name: true, summary: true }, }); - if (botlets.length != botletUuids.length) + if (callgents.length != callgentUuids.length) throw new NotFoundException( - `Botlet not found, uuid=${botletUuids - .filter((x) => !botlets.find((y) => y.uuid == x)) + `Callgent not found, uuid=${callgentUuids + .filter((x) => !callgents.find((y) => y.uuid == x)) .join(', ')}`, ); @@ -86,10 +86,10 @@ export class ExecutionsService { // FIXME task ctx, and vars stack const stateCtx = { stack: [ctx] }; - // FIXME merge system botlets, e.g., system event register, cmd entry creation + // FIXME merge system callgents, e.g., system event register, cmd entry creation // generate pseudo-command, and upserted vars stack - // const cmd = await this.agentsService.genPseudoCmd(botlets, stateCtx as any); + // const cmd = await this.agentsService.genPseudoCmd(callgents, stateCtx as any); // create a temp server endpoint to execute the cmd @@ -98,7 +98,7 @@ export class ExecutionsService { // return this._invocationFlow( // { endpoint: reqEndpoint, adaptor: reqAdaptor, req: rawReq }, - // botletUuids[0], + // callgentUuids[0], // action, // ); } @@ -106,23 +106,23 @@ export class ExecutionsService { /** invocation flow, and lifecycle events */ // protected async _invocationFlow( // req: any, - // botletUuid: string, + // callgentUuid: string, // actionName?: string, // ) { // const prisma = this.txHost.tx as PrismaClient; // // specific/AI routing from req, get action params/code, TODO: [and specific mapping] // const where = actionName - // ? { AND: [{ name: actionName }, { botletUuid }] } - // : { botletUuid }; + // ? { AND: [{ name: actionName }, { callgentUuid }] } + // : { callgentUuid }; // const take = actionName ? 1 : undefined; - // const actions = await prisma.botletFunction.findMany({ where, take }); + // const actions = await prisma.callgentFunction.findMany({ where, take }); // const action = actionName // ? actions.find((a) => a.name == actionName) // : await this._routing(req, actions); // if (!action) // throw new BadRequestException( - // 'Action entry not found on botlet: ' + botletUuid, + // 'Action entry not found on callgent: ' + callgentUuid, // ); // // may reply ack to client directly, async result @@ -132,14 +132,14 @@ export class ExecutionsService { // // response to client or next cmd // } - // protected async _routing(req: any, actions: BotletFunctionDto[]) { + // protected async _routing(req: any, actions: CallgentFunctionDto[]) { // return this.agentsService.routeAction(actions, req); // } /** call out to server */ /** invoke with callback */ // @Transactional() - // async callout(action: BotletFunctionDto, req: any) { + // async callout(action: CallgentFunctionDto, req: any) { // // get server endpoint(sep), and sAdaptor // const sEndpoint = null; // await this.findOne(action.endpointUuid); // if (!sEndpoint) diff --git a/src/infra/repo/prisma.middlewares.ts b/src/infra/repo/prisma.middlewares.ts index 5c8f60e..df3315d 100644 --- a/src/infra/repo/prisma.middlewares.ts +++ b/src/infra/repo/prisma.middlewares.ts @@ -25,8 +25,8 @@ export const mainPrismaServiceOptions = ( Tenant: deleteHandle, User: deleteHandle, UserIdentity: deleteHandle, - Botlet: deleteHandle, - BotletFunction: deleteHandle, + Callgent: deleteHandle, + CallgentFunction: deleteHandle, Endpoint: deleteHandle, Task: deleteHandle, TaskAction: deleteHandle, diff --git a/src/task-actions/task-actions.module.ts b/src/task-actions/task-actions.module.ts index 3e2050d..90dda99 100644 --- a/src/task-actions/task-actions.module.ts +++ b/src/task-actions/task-actions.module.ts @@ -1,13 +1,13 @@ import { Module } from '@nestjs/common'; -import { BotletFunctionsModule } from '../botlet-functions/botlet-functions.module'; -import { BotletsModule } from '../botlets/botlets.module'; +import { CallgentFunctionsModule } from '../callgent-functions/callgent-functions.module'; +import { CallgentsModule } from '../callgents/callgents.module'; import { EndpointsModule } from '../endpoints/endpoints.module'; import { TasksModule } from '../tasks/tasks.module'; import { TaskActionsService } from './task-actions.service'; @Module({ providers: [{ provide: 'TaskActionsService', useClass: TaskActionsService }], - imports: [BotletsModule, EndpointsModule, BotletFunctionsModule, TasksModule], + imports: [CallgentsModule, EndpointsModule, CallgentFunctionsModule, TasksModule], exports: ['TaskActionsService'], }) export class TaskActionsModule {} diff --git a/src/task-actions/task-actions.service.ts b/src/task-actions/task-actions.service.ts index 489c8e2..2e447e1 100644 --- a/src/task-actions/task-actions.service.ts +++ b/src/task-actions/task-actions.service.ts @@ -2,8 +2,8 @@ import { TransactionHost, Transactional } from '@nestjs-cls/transactional'; import { TransactionalAdapterPrisma } from '@nestjs-cls/transactional-adapter-prisma'; import { Injectable, NotFoundException } from '@nestjs/common'; import { PrismaClient } from '@prisma/client'; -import { BotletFunctionDto } from '../botlet-functions/dto/botlet-function.dto'; -import { BotletDto } from '../botlets/dto/botlet.dto'; +import { CallgentFunctionDto } from '../callgent-functions/dto/callgent-function.dto'; +import { CallgentDto } from '../callgents/dto/callgent.dto'; import { ClientRequestEvent } from '../endpoints/events/client-request.event'; import { Utils } from '../infra/libs/utils'; import { TasksService } from '../tasks/tasks.service'; @@ -11,7 +11,7 @@ import { TaskActionDto } from './dto/task-action.dto'; /** * A task action belongs to a task. Triggered by an external user or system, - * to one or more botlets. + * to one or more callgents. */ @Injectable() export class TaskActionsService { @@ -53,13 +53,13 @@ export class TaskActionsService { async __createTaskAction(e: ClientRequestEvent) { // init task action - // const { taskAction, botlets, reqEndpoint, reqAdaptor } = + // const { taskAction, callgents, reqEndpoint, reqAdaptor } = // await this._$createTaskAction(e); // sync respond in time limit let raceWinner = -1; - // const respPromise = this._execute(botlets, taskAction).then((resp) => { + // const respPromise = this._execute(callgents, taskAction).then((resp) => { // if (raceWinner < 0) raceWinner = 0; // // load task stage to respond // // if stage done, callback @@ -84,20 +84,20 @@ export class TaskActionsService { // ]); } - protected async _execute(botlets: BotletDto[], taskAction: TaskActionDto) { - // FIXME merge system botlets, e.g., system event register, timer, cmd entry creation + protected async _execute(callgents: CallgentDto[], taskAction: TaskActionDto) { + // FIXME merge system callgents, e.g., system event register, timer, cmd entry creation // load task context vars const taskVars = {}; // may get sync response - // return this._interpret(taskAction, botlets, botletFunctions, taskVars); + // return this._interpret(taskAction, callgents, callgentFunctions, taskVars); } protected async _interpret( taskAction: TaskActionDto, - botlets: BotletDto[], - botletFunctions: { [botletName: string]: BotletFunctionDto[] }, + callgents: CallgentDto[], + callgentFunctions: { [callgentName: string]: CallgentFunctionDto[] }, taskVars: { [name: string]: any }, ) { let resp, @@ -105,7 +105,7 @@ export class TaskActionsService { // interpret request, execute step by step for (;;) { const { funName, mapping, progressive, vars } = await this._routing( - botletFunctions, + callgentFunctions, taskAction, resp, { ...taskVars, ...reqVars }, @@ -124,14 +124,14 @@ export class TaskActionsService { } protected async _routing( - BotletFunctions: { [botletName: string]: BotletFunctionDto[] }, + CallgentFunctions: { [callgentName: string]: CallgentFunctionDto[] }, taskAction: TaskActionDto, resp: any, vars: { [name: string]: any }, ): Promise<{ funName; mapping; progressive; vars }> { - // const botNames = Object.keys(BotletFunctions); - // if (botNames.length == 1 && BotletFunctions[botNames[0]].length == 1) - // return BotletFunctions[botNames[0]]; + // const botNames = Object.keys(CallgentFunctions); + // if (botNames.length == 1 && CallgentFunctions[botNames[0]].length == 1) + // return CallgentFunctions[botNames[0]]; // 根据req请求,在给定的方法集中,匹配需要用到的方法子集 // 可能用到多个, @@ -141,23 +141,23 @@ export class TaskActionsService { /** invocation flow, and lifecycle events */ // protected async _invocationFlow( // req: RequestPack, - // botletUuid: string, + // callgentUuid: string, // actionName?: string, // ) { // const prisma = this.txHost.tx as PrismaClient; // // specific/AI routing from req, get action params/code, TODO: [and specific mapping] // const where = actionName - // ? { AND: [{ name: actionName }, { botletUuid }] } - // : { botletUuid }; + // ? { AND: [{ name: actionName }, { callgentUuid }] } + // : { callgentUuid }; // const take = actionName ? 1 : undefined; - // const actions = await prisma.botletFunction.findMany({ where, take }); + // const actions = await prisma.callgentFunction.findMany({ where, take }); // const action = actionName // ? actions.find((a) => a.name == actionName) // : await this._routing(req, actions); // if (!action) // throw new BadRequestException( - // 'Action entry not found on botlet: ' + botletUuid, + // 'Action entry not found on callgent: ' + callgentUuid, // ); // // may reply ack to client directly, async result @@ -167,14 +167,14 @@ export class TaskActionsService { // // response to client or next cmd // } - // protected async _routing(req: RequestPack, actions: BotletFunctionDto[]) { + // protected async _routing(req: RequestPack, actions: CallgentFunctionDto[]) { // return this.agentsService.routeAction(actions, req); // } /** call out to server */ /** invoke with callback */ // @Transactional() - // async callout(action: BotletFunctionDto, req: RequestPack) { + // async callout(action: CallgentFunctionDto, req: RequestPack) { // // get server endpoint(sep), and sAdaptor // const sEndpoint = await this.findOne(action.endpointUuid); // if (!sEndpoint) diff --git a/src/tasks/events/task-created.event.ts b/src/tasks/events/task-created.event.ts index 48a7cff..4fa3bf1 100644 --- a/src/tasks/events/task-created.event.ts +++ b/src/tasks/events/task-created.event.ts @@ -8,6 +8,6 @@ export class TaskCreatedEvent { */ constructor( public readonly task: Prisma.TaskUncheckedCreateInput, - ) // public readonly receiver?: BotletReceiver, + ) // public readonly receiver?: CallgentReceiver, {} } diff --git a/src/tasks/tasks.controller.ts b/src/tasks/tasks.controller.ts index 6e849bc..dd607ce 100644 --- a/src/tasks/tasks.controller.ts +++ b/src/tasks/tasks.controller.ts @@ -29,7 +29,7 @@ import { TasksService } from './tasks.service'; @ApiSecurity('defaultBearerAuth') @ApiExtraModels(RestApiResponse, TaskDto) @UseGuards(JwtGuard) -@Controller(':botlet/tasks') +@Controller(':callgent/tasks') export class TasksController { constructor(private readonly taskService: TasksService) {} @@ -57,13 +57,13 @@ export class TasksController { @Post() async create( @Req() req, - @Param('botlet') botletUuid: string, + @Param('callgent') callgentUuid: string, @Body() dto: CreateTaskDto, ) { const user: JwtPayload = req.user; // const [task, syncResult] = await this.taskService.create({ // ...dto, - // botletUuid, + // callgentUuid, // callerType: user.aud, // // assignees are set when processing the task // createdBy: user.sub, diff --git a/src/tasks/tasks.service.ts b/src/tasks/tasks.service.ts index 9839f05..4ba9e29 100644 --- a/src/tasks/tasks.service.ts +++ b/src/tasks/tasks.service.ts @@ -3,7 +3,7 @@ import { TransactionalAdapterPrisma } from '@nestjs-cls/transactional-adapter-pr import { Injectable } from '@nestjs/common'; import { EventEmitter2 } from '@nestjs/event-emitter'; import { PaginatorTypes, paginator } from '@nodeteam/nestjs-prisma-pagination'; -import { Botlet, Prisma, PrismaClient, Task } from '@prisma/client'; +import { Callgent, Prisma, PrismaClient, Task } from '@prisma/client'; import { Utils } from '../infra/libs/utils'; import { selectHelper } from '../infra/repo/select.helper'; import { CreateTaskDto } from './dto/create-task.dto'; @@ -36,7 +36,7 @@ export class TasksService { createdBy: string, select?: Prisma.TaskSelect, ) { - const data = dto as Prisma.BotletUncheckedCreateInput; + const data = dto as Prisma.CallgentUncheckedCreateInput; (data.uuid = Utils.uuid()), (data.createdBy = createdBy); const prisma = this.txHost.tx as PrismaClient; @@ -55,17 +55,17 @@ export class TasksService { async evalTaskReceiver( prisma: PrismaClient, - botlet: Partial, + callgent: Partial, preferredReceiverType?: string, ) { // const receiverType = - // preferredReceiverType || botlet.receiverType || undefined; + // preferredReceiverType || callgent.receiverType || undefined; // TODO: cache synced types for quick check const r = 0; - // await prisma.botletReceiver.findFirst({ + // await prisma.callgentReceiver.findFirst({ // where: { - // botletUuid: botlet.uuid, + // callgentUuid: callgent.uuid, // receiverType, // }, // orderBy: { diff --git a/src/users/users.service.ts b/src/users/users.service.ts index 9ceb79d..6676d7a 100644 --- a/src/users/users.service.ts +++ b/src/users/users.service.ts @@ -21,7 +21,7 @@ import { PrismaTenancyService } from '../infra/repo/tenancy/prisma-tenancy.servi import { CreateUserIdentityDto } from '../user-identities/dto/create-user-identity.dto'; import { ValidationEmailVo } from './dto/validation-email.vo'; -/** FIXME CreateUserEvent: init a botlet with sep for user */ +/** FIXME CreateUserEvent: init a callgent with sep for user */ @Injectable() export class UsersService { private readonly logger = new Logger(UsersService.name); @@ -32,7 +32,7 @@ export class UsersService { private readonly authTokensService: AuthTokensService, private readonly eventEmitter: EventEmitter2, ) {} - protected readonly defSelect: Prisma.BotletSelect = { + protected readonly defSelect: Prisma.CallgentSelect = { id: false, tenantId: false, createdBy: false, diff --git a/test/e2e/botlet-functions.e2e-spec.ts b/test/e2e/callgent-functions.e2e-spec.ts similarity index 59% rename from test/e2e/botlet-functions.e2e-spec.ts rename to test/e2e/callgent-functions.e2e-spec.ts index 456dec1..707e4ef 100644 --- a/test/e2e/botlet-functions.e2e-spec.ts +++ b/test/e2e/callgent-functions.e2e-spec.ts @@ -1,5 +1,5 @@ import * as pactum from 'pactum'; -import { BotletApiText } from '../../src/botlet-functions/botlet-functions.controller'; +import { CallgentApiText } from '../../src/callgent-functions/callgent-functions.controller'; import { afterAllFn, afterEachFn, @@ -8,19 +8,19 @@ import { } from '../app-init.e2e'; import { TestConstant } from '../test-constants'; -describe('BotletFunctionsController (e2e)', () => { +describe('CallgentFunctionsController (e2e)', () => { beforeAll(beforeAllFn); afterAll(afterAllFn); beforeEach(beforeEachFnTenanted); afterEach(afterEachFn); - it('should add botlet functions', () => {}); + it('should add callgent functions', () => {}); }); -export const addBotletFunctions = (apiTxt: BotletApiText) => { +export const addCallgentFunctions = (apiTxt: CallgentApiText) => { return pactum .spec() - .post('/api/botlet-functions/import') + .post('/api/callgent-functions/import') .withHeaders('x-callgent-authorization', TestConstant.authToken) .withBody(apiTxt) .expectStatus(201); diff --git a/test/e2e/botlets.e2e-spec.ts b/test/e2e/callgents.e2e-spec.ts similarity index 54% rename from test/e2e/botlets.e2e-spec.ts rename to test/e2e/callgents.e2e-spec.ts index 352455f..ef26504 100644 --- a/test/e2e/botlets.e2e-spec.ts +++ b/test/e2e/callgents.e2e-spec.ts @@ -1,5 +1,5 @@ import * as pactum from 'pactum'; -import { CreateBotletDto } from '../../src/botlets/dto/create-botlet.dto'; +import { CreateCallgentDto } from '../../src/callgents/dto/create-callgent.dto'; import { afterAllFn, afterEachFn, @@ -8,33 +8,33 @@ import { } from '../app-init.e2e'; import { TestConstant } from '../test-constants'; -describe('BotletsController (e2e)', () => { +describe('CallgentsController (e2e)', () => { beforeAll(beforeAllFn); afterAll(afterAllFn); beforeEach(beforeEachFnTenanted); afterEach(afterEachFn); - const endpoint = '/api/botlets'; - it(`${endpoint} (POST): create new botlet no auth, 401`, async () => { - await createBotlet({}, false); + const endpoint = '/api/callgents'; + it(`${endpoint} (POST): create new callgent no auth, 401`, async () => { + await createCallgent({}, false); }); - it(`${endpoint} (POST): create new botlet.`, async () => { - await createBotlet(); + it(`${endpoint} (POST): create new callgent.`, async () => { + await createCallgent(); }); }); -export const createBotlet = ( - botletDto?: Partial, +export const createCallgent = ( + callgentDto?: Partial, auth = true, ) => { const dto = { - name: 'new-test-botlet', - ...botletDto, + name: 'new-test-callgent', + ...callgentDto, }; return pactum .spec() - .post('/api/botlets') + .post('/api/callgents') .withHeaders( 'x-callgent-authorization', auth ? TestConstant.authToken : 'invalid auth token', @@ -43,17 +43,17 @@ export const createBotlet = ( .expectStatus(auth ? 201 : 401); }; -export const invokeBotlet = ( - botletDto?: Partial, +export const invokeCallgent = ( + callgentDto?: Partial, auth = true, ) => { const dto = { - name: 'new-test-botlet', - ...botletDto, + name: 'new-test-callgent', + ...callgentDto, }; return pactum .spec() - .post('/api/botlets') + .post('/api/callgents') .withHeaders( 'x-callgent-authorization', auth ? TestConstant.authToken : 'invalid auth token', diff --git a/test/e2e/endpoints.e2e-spec.ts b/test/e2e/endpoints.e2e-spec.ts index a201803..f893424 100644 --- a/test/e2e/endpoints.e2e-spec.ts +++ b/test/e2e/endpoints.e2e-spec.ts @@ -9,11 +9,11 @@ import { beforeEachFnTenanted, } from '../app-init.e2e'; import { TestConstant } from '../test-constants'; -import { addBotletFunctions } from './botlet-functions.e2e-spec'; -import { createBotlet } from './botlets.e2e-spec'; +import { addCallgentFunctions } from './callgent-functions.e2e-spec'; +import { createCallgent } from './callgents.e2e-spec'; /** - * - create a botlet, + * - create a callgent, * - choose webpage receiver endpoint, * - config entry, params * - config init params @@ -21,40 +21,40 @@ import { createBotlet } from './botlets.e2e-spec'; * - confirm * - progressive request */ -describe('Botlet Endpoint (e2e)', () => { +describe('Callgent Endpoint (e2e)', () => { beforeAll(beforeAllFn); afterAll(afterAllFn); beforeEach(beforeEachFnTenanted); afterEach(afterEachFn); it(`(POST): add a new canny.io rest-api server endpoint to invoke 400`, async () => { - const botlet = await prepareCannyBotlet(); + const callgent = await prepareCannyCallgent(); - // request for task by botlet api - await invokeBotletByApi(botlet.uuid).expectStatus(400); + // request for task by callgent api + await invokeCallgentByApi(callgent.uuid).expectStatus(400); }); it(`(POST): add a new canny.io rest-api server endpoint to invoke 200`, async () => { - const botlet = await prepareCannyBotlet(); + const callgent = await prepareCannyCallgent(); // mount server endpoint auth - // request for task by botlet api - await invokeBotletByApi(botlet.uuid).expectStatus(400); + // request for task by callgent api + await invokeCallgentByApi(callgent.uuid).expectStatus(400); }); }); -export const prepareCannyBotlet = async () => { - // create the botlet +export const prepareCannyCallgent = async () => { + // create the callgent const { - json: { data: botlet }, - } = await createBotlet(); + json: { data: callgent }, + } = await createCallgent(); // add api server endpoint const { json: { data: serverEndpoint }, } = await createEndpoint('restAPI', { - botletUuid: botlet.uuid, + callgentUuid: callgent.uuid, type: 'SERVER', host: { url: 'https://canny.io/api/v1' }, }); @@ -62,14 +62,14 @@ export const prepareCannyBotlet = async () => { const jsonData = await fs.readFile('./test/e2e/data/canny-apis.json', 'utf8'); const { json: { data: functionCount }, - } = await addBotletFunctions({ + } = await addCallgentFunctions({ endpoint: serverEndpoint.uuid, text: jsonData, format: 'openAPI', }); console.log({ serverEndpoint, functionCount }); - return botlet; + return callgent; }; export const createEndpoint = ( @@ -78,7 +78,7 @@ export const createEndpoint = ( ) => { return pactum .spec() - .post(`/api/endpoints/${adaptorKey}/botlets`) + .post(`/api/endpoints/${adaptorKey}/callgents`) .withHeaders('x-callgent-authorization', TestConstant.authToken) .withBody(endpointDto) .expectStatus(201); @@ -93,10 +93,10 @@ export const addEndpointAuth = (endpointAuthDto: CreateEndpointAuthDto) => { .expectStatus(200); }; -export const invokeBotletByApi = (botletUuid, body?: any) => { +export const invokeCallgentByApi = (callgentUuid, body?: any) => { return pactum .spec() - .post(`/api/botlets/${botletUuid}//invoke/api/boards/list`) + .post(`/api/callgents/${callgentUuid}//invoke/api/boards/list`) .withHeaders('x-callgent-authorization', TestConstant.authToken) .withBody(body) .expectStatus(200); From 0bfea1255f2617c85f78ac321af59ff62b4e4564 Mon Sep 17 00:00:00 2001 From: dev-callgent Date: Tue, 28 May 2024 17:48:24 +0800 Subject: [PATCH 002/183] docs: uaas, import api Signed-off-by: dev-callgent --- src/bootstrap.ts | 9 +++++--- .../callgent-functions.controller.ts | 7 ++++++ .../callgent-functions.service.ts | 22 ++++++++++--------- 3 files changed, 25 insertions(+), 13 deletions(-) diff --git a/src/bootstrap.ts b/src/bootstrap.ts index f026b72..1a3d5c9 100644 --- a/src/bootstrap.ts +++ b/src/bootstrap.ts @@ -199,10 +199,13 @@ function registerApi( }, }, }); + + logger.log( + `API Documentation: http://localhost:${ + process.env.PORT || 3000 + }/docs/api`, + ); } - logger.log( - `API Documentation: http://localhost:${process.env.PORT || 3000}/docs/api`, - ); return { defaultApiVersion, devDocVersion }; } diff --git a/src/callgent-functions/callgent-functions.controller.ts b/src/callgent-functions/callgent-functions.controller.ts index b97661c..f463b20 100644 --- a/src/callgent-functions/callgent-functions.controller.ts +++ b/src/callgent-functions/callgent-functions.controller.ts @@ -37,14 +37,21 @@ export class CallgentApis extends ApiSpec { } export class CallgentApiText { + @ApiProperty({ + required: true, + description: 'The callgent server-endpoint uuid', + }) + @IsNotEmpty() @EntityIdExists('endpoint', 'uuid') endpoint: string; + @ApiProperty({ required: true, description: 'The api content text to parse', }) @IsNotEmpty() text: string; + @ApiProperty({ required: false, description: 'The format of the api content text', diff --git a/src/callgent-functions/callgent-functions.service.ts b/src/callgent-functions/callgent-functions.service.ts index 17f5ab1..3a360a2 100644 --- a/src/callgent-functions/callgent-functions.service.ts +++ b/src/callgent-functions/callgent-functions.service.ts @@ -2,7 +2,7 @@ import { TransactionHost, Transactional } from '@nestjs-cls/transactional'; import { TransactionalAdapterPrisma } from '@nestjs-cls/transactional-adapter-prisma'; import { BadRequestException, Inject, Injectable } from '@nestjs/common'; import { PaginatorTypes, paginator } from '@nodeteam/nestjs-prisma-pagination'; -import { CallgentFunction, Prisma, PrismaClient } from '@prisma/client'; +import { Prisma, PrismaClient } from '@prisma/client'; import { ApiSpec } from '../endpoints/adaptors/endpoint-adaptor.interface'; import { EndpointDto } from '../endpoints/dto/endpoint.dto'; import { EndpointsService } from '../endpoints/endpoints.service'; @@ -88,15 +88,17 @@ export class CallgentFunctionsService { const { apis } = spec; // validation - const actMap = apis.map((e) => { - return { - ...e, - uuid: Utils.uuid(), - endpointUuid: endpoint.uuid, - callgentUuid: endpoint.callgentUuid, - createdBy: createdBy, - }; - }); + const actMap = apis.map( + (e) => { + return { + ...e, + uuid: Utils.uuid(), + endpointUuid: endpoint.uuid, + callgentUuid: endpoint.callgentUuid, + createdBy: createdBy, + }; + }, + ); const prisma = this.txHost.tx as PrismaClient; const { count: actionsCount } = await prisma.callgentFunction.createMany({ From a47ebc16f18d7c9b83e8e689103c8dd902df6923 Mon Sep 17 00:00:00 2001 From: dev-callgent Date: Wed, 29 May 2024 13:47:09 +0800 Subject: [PATCH 003/183] build: seed:test Signed-off-by: dev-callgent --- package.json | 1 + src/callgent-functions/callgent-functions.controller.ts | 4 ++-- src/endpoints/listeners/callgent-created.listener.ts | 2 +- 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/package.json b/package.json index 229e4df..e9c8b29 100644 --- a/package.json +++ b/package.json @@ -24,6 +24,7 @@ "prisma:generate": "npx prisma generate", "prisma:studio": "npx prisma studio", "prisma:seed": "npx prisma db seed", + "prisma:seed:test": "SEED_TEST_DATA=1 npx prisma db seed", "prepare": "husky", "commit": "git-cz", "release": "standard-version" diff --git a/src/callgent-functions/callgent-functions.controller.ts b/src/callgent-functions/callgent-functions.controller.ts index f463b20..3cd8ca3 100644 --- a/src/callgent-functions/callgent-functions.controller.ts +++ b/src/callgent-functions/callgent-functions.controller.ts @@ -74,7 +74,7 @@ export class CallgentFunctionsController { @ApiOperation({ summary: 'Create batch of new CallgentFunction. Exception if existing one with same name in the same callgent', - description: 'return { data: count } on success', + description: 'return { data: imported_functions_count } on success', }) @Post() async createBatch( @@ -94,7 +94,7 @@ export class CallgentFunctionsController { @ApiOperation({ summary: 'Parse import text and create batch.', - description: 'return { data: count } on success', + description: 'return { data: imported_functions_count } on success', }) @Post('import') async importBatch( diff --git a/src/endpoints/listeners/callgent-created.listener.ts b/src/endpoints/listeners/callgent-created.listener.ts index 39a78dc..d53aed5 100644 --- a/src/endpoints/listeners/callgent-created.listener.ts +++ b/src/endpoints/listeners/callgent-created.listener.ts @@ -32,7 +32,7 @@ export class CallgentCreatedListener { createdBy: callgent.createdBy, }) .then((endpoint) => { - // no await init, it may be slow + // no await init, it may be slow, TODO: tx invalid this.endpointsService.init(endpoint.uuid, []); return endpoint; }), From a61658db982ca2a3e87604cc0c20a5c78c8dde48 Mon Sep 17 00:00:00 2001 From: dev-callgent Date: Wed, 29 May 2024 13:51:41 +0800 Subject: [PATCH 004/183] ci: prebuild for render.com Signed-off-by: dev-callgent --- package.json | 1 + 1 file changed, 1 insertion(+) diff --git a/package.json b/package.json index e9c8b29..91d1718 100644 --- a/package.json +++ b/package.json @@ -6,6 +6,7 @@ "private": true, "license": "UNLICENSED", "scripts": { + "prebuild": "prisma generate", "build": "nest build", "format": "prettier --write \"src/**/*.ts\" \"test/**/*.ts\"", "start": "nest start", From 0fd440d06582ec653b9b54a3c10d495580bea415 Mon Sep 17 00:00:00 2001 From: dev-callgent Date: Wed, 29 May 2024 17:32:17 +0800 Subject: [PATCH 005/183] fix: prisma init rls Signed-off-by: dev-callgent --- .../0_row_level_security/migration.sql | 212 ++++++++++++++++++ .../row_level_security/migration.sql | 19 -- 2 files changed, 212 insertions(+), 19 deletions(-) create mode 100644 prisma/migrations/0_row_level_security/migration.sql delete mode 100644 prisma/migrations/row_level_security/migration.sql diff --git a/prisma/migrations/0_row_level_security/migration.sql b/prisma/migrations/0_row_level_security/migration.sql new file mode 100644 index 0000000..8c8adac --- /dev/null +++ b/prisma/migrations/0_row_level_security/migration.sql @@ -0,0 +1,212 @@ +-- CreateEnum +CREATE TYPE "EndpointType" AS ENUM ('CLIENT', 'SERVER', 'EVENT'); + +-- CreateEnum +CREATE TYPE "ServiceType" AS ENUM ('SERVICE', 'CALLGENT'); + +-- CreateEnum +CREATE TYPE "EventCallbackType" AS ENUM ('URL', 'EVENT'); + + + + +-- CreateTable +CREATE TABLE "User" ( + "id" SERIAL NOT NULL, + "uuid" VARCHAR(36) NOT NULL, + "name" VARCHAR(36) NOT NULL, + "email" VARCHAR(255), + "avatar" VARCHAR(1023), + "locale" VARCHAR(10) DEFAULT 'en_US', + "tenantId" INTEGER NOT NULL DEFAULT (current_setting('tenancy.tenantId')::int), + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updatedAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "deletedAt" TIMESTAMP(3), + + CONSTRAINT "User_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "UserIdentity" ( + "id" SERIAL NOT NULL, + "tenantId" INTEGER NOT NULL DEFAULT (current_setting('tenancy.tenantId')::int), + "provider" VARCHAR(36) NOT NULL, + "uid" VARCHAR(255) NOT NULL, + "credentials" VARCHAR(2048) NOT NULL, + "name" VARCHAR(255), + "email" VARCHAR(255), + "email_verified" BOOLEAN NOT NULL DEFAULT false, + "avatar" VARCHAR(1023), + "info" JSONB, + "userId" INTEGER NOT NULL, + "userUuid" VARCHAR(36) NOT NULL, + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updatedAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "deletedAt" TIMESTAMP(3), + + CONSTRAINT "UserIdentity_pkey" PRIMARY KEY ("id") +); + + +-- CreateTable +CREATE TABLE "Callgent" ( + "id" SERIAL NOT NULL, + "uuid" VARCHAR(36) NOT NULL, + "tenantId" INTEGER NOT NULL DEFAULT (current_setting('tenancy.tenantId')::int), + "name" VARCHAR(255) NOT NULL, + "summary" VARCHAR(4095), + "createdBy" VARCHAR(36) NOT NULL, + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updatedAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "deletedAt" TIMESTAMP(3), + + CONSTRAINT "Callgent_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "CallgentFunction" ( + "id" SERIAL NOT NULL, + "uuid" VARCHAR(36) NOT NULL, + "tenantId" INTEGER NOT NULL DEFAULT (current_setting('tenancy.tenantId')::int), + "name" VARCHAR(255) NOT NULL, + "funName" VARCHAR(255) NOT NULL, + "params" VARCHAR(31)[], + "documents" VARCHAR(4095) NOT NULL, + "fullCode" VARCHAR(1023) NOT NULL, + "content" JSON NOT NULL, + "callgentUuid" VARCHAR(36) NOT NULL, + "endpointUuid" VARCHAR(36), + "createdBy" VARCHAR(36) NOT NULL, + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updatedAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "deletedAt" TIMESTAMP(3), + + CONSTRAINT "CallgentFunction_pkey" PRIMARY KEY ("id") +); + + +-- CreateTable +CREATE TABLE "Endpoint" ( + "id" SERIAL NOT NULL, + "uuid" VARCHAR(36) NOT NULL, + "tenantId" INTEGER NOT NULL DEFAULT (current_setting('tenancy.tenantId')::int), + "type" "EndpointType" NOT NULL, + "adaptorKey" VARCHAR(127) NOT NULL, + "priority" INTEGER NOT NULL DEFAULT 0, + "host" JSON NOT NULL, + "initParams" JSON, + "content" JSON, + "callgentUuid" VARCHAR(36) NOT NULL, + "createdBy" VARCHAR(36) NOT NULL, + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updatedAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "deletedAt" TIMESTAMP(3), + + CONSTRAINT "Endpoint_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "EndpointAuth" ( + "id" SERIAL NOT NULL, + "tenantId" INTEGER NOT NULL DEFAULT (current_setting('tenancy.tenantId')::int), + "endpointUuid" VARCHAR(36) NOT NULL, + "userKey" VARCHAR(63), + "credentials" JSON NOT NULL, + "createdBy" VARCHAR(36) NOT NULL, + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updatedAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + + CONSTRAINT "EndpointAuth_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "EventStore" ( + "id" SERIAL NOT NULL, + "uuid" VARCHAR(36) NOT NULL, + "tenantId" INTEGER NOT NULL DEFAULT (current_setting('tenancy.tenantId')::int), + "srcId" VARCHAR(36) NOT NULL, + "targetId" VARCHAR(36), + "eventType" VARCHAR(36) NOT NULL, + "dataType" VARCHAR(36) NOT NULL, + "callback" VARCHAR(1023), + "callbackType" "EventCallbackType" NOT NULL DEFAULT 'EVENT', + "data" JSON, + "context" JSON, + "statusCode" INTEGER NOT NULL DEFAULT -1, + "message" VARCHAR(255), + "stopPropagation" BOOLEAN NOT NULL, + "defaultPrevented" BOOLEAN NOT NULL, + "listenerUuid" VARCHAR(36), + "funName" VARCHAR(255), + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updatedAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "deletedAt" TIMESTAMP(3), + + CONSTRAINT "EventStore_pkey" PRIMARY KEY ("id") +); + + +-- CreateTable +CREATE TABLE "EventListener" ( + "id" SERIAL NOT NULL, + "uuid" VARCHAR(36) NOT NULL, + "tenantId" INTEGER NOT NULL DEFAULT (current_setting('tenancy.tenantId')::int), + "srcUuid" VARCHAR(36) NOT NULL, + "eventType" VARCHAR(36) NOT NULL, + "dataType" VARCHAR(36) NOT NULL, + "priority" INTEGER DEFAULT 0, + "serviceType" "ServiceType" NOT NULL, + "serviceName" VARCHAR(255) NOT NULL, + "funName" VARCHAR(255) NOT NULL, + "createdBy" VARCHAR(36) NOT NULL, + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updatedAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "deletedAt" TIMESTAMP(3), + + CONSTRAINT "EventListener_pkey" PRIMARY KEY ("id") +); + + + + + + +-- Enable Row Level Security +ALTER TABLE "User" ENABLE ROW LEVEL SECURITY; +ALTER TABLE "UserIdentity" ENABLE ROW LEVEL SECURITY; +ALTER TABLE "Callgent" ENABLE ROW LEVEL SECURITY; +ALTER TABLE "CallgentFunction" ENABLE ROW LEVEL SECURITY; +ALTER TABLE "Endpoint" ENABLE ROW LEVEL SECURITY; +ALTER TABLE "EndpointAuth" ENABLE ROW LEVEL SECURITY; +ALTER TABLE "EventListener" ENABLE ROW LEVEL SECURITY; +ALTER TABLE "EventStore" ENABLE ROW LEVEL SECURITY; + +-- Force Row Level Security for table owners +ALTER TABLE "User" FORCE ROW LEVEL SECURITY; +ALTER TABLE "UserIdentity" FORCE ROW LEVEL SECURITY; +ALTER TABLE "Callgent" FORCE ROW LEVEL SECURITY; +ALTER TABLE "CallgentFunction" FORCE ROW LEVEL SECURITY; +ALTER TABLE "Endpoint" FORCE ROW LEVEL SECURITY; +ALTER TABLE "EndpointAuth" FORCE ROW LEVEL SECURITY; +ALTER TABLE "EventListener" FORCE ROW LEVEL SECURITY; +ALTER TABLE "EventStore" FORCE ROW LEVEL SECURITY; + +-- Create row security policies +CREATE POLICY tenant_isolation_policy ON "User" USING (("tenantId" = 0) OR ("tenantId" = current_setting('tenancy.tenantId', TRUE)::int)); +CREATE POLICY tenant_isolation_policy ON "UserIdentity" USING (("tenantId" = 0) OR ("tenantId" = current_setting('tenancy.tenantId', TRUE)::int)); +CREATE POLICY tenant_isolation_policy ON "Callgent" USING (("tenantId" = 0) OR ("tenantId" = current_setting('tenancy.tenantId', TRUE)::int)); +CREATE POLICY tenant_isolation_policy ON "CallgentFunction" USING (("tenantId" = 0) OR ("tenantId" = current_setting('tenancy.tenantId', TRUE)::int)); +CREATE POLICY tenant_isolation_policy ON "Endpoint" USING (("tenantId" = 0) OR ("tenantId" = current_setting('tenancy.tenantId', TRUE)::int)); +CREATE POLICY tenant_isolation_policy ON "EndpointAuth" USING (("tenantId" = 0) OR ("tenantId" = current_setting('tenancy.tenantId', TRUE)::int)); +CREATE POLICY tenant_isolation_policy ON "EventListener" USING (("tenantId" = 0) OR ("tenantId" = current_setting('tenancy.tenantId', TRUE)::int)); +CREATE POLICY tenant_isolation_policy ON "EventStore" USING (("tenantId" = 0) OR ("tenantId" = current_setting('tenancy.tenantId', TRUE)::int)); + +-- Create policies to bypass RLS (optional) +CREATE POLICY bypass_rls_policy ON "User" USING (current_setting('tenancy.bypass_rls', TRUE)::text = 'on'); +CREATE POLICY bypass_rls_policy ON "UserIdentity" USING (current_setting('tenancy.bypass_rls', TRUE)::text = 'on'); +CREATE POLICY bypass_rls_policy ON "Callgent" USING (current_setting('tenancy.bypass_rls', TRUE)::text = 'on'); +CREATE POLICY bypass_rls_policy ON "CallgentFunction" USING (current_setting('tenancy.bypass_rls', TRUE)::text = 'on'); +CREATE POLICY bypass_rls_policy ON "Endpoint" USING (current_setting('tenancy.bypass_rls', TRUE)::text = 'on'); +CREATE POLICY bypass_rls_policy ON "EndpointAuth" USING (current_setting('tenancy.bypass_rls', TRUE)::text = 'on'); +CREATE POLICY bypass_rls_policy ON "EventListener" USING (current_setting('tenancy.bypass_rls', TRUE)::text = 'on'); +CREATE POLICY bypass_rls_policy ON "EventStore" USING (current_setting('tenancy.bypass_rls', TRUE)::text = 'on'); diff --git a/prisma/migrations/row_level_security/migration.sql b/prisma/migrations/row_level_security/migration.sql deleted file mode 100644 index e7cb310..0000000 --- a/prisma/migrations/row_level_security/migration.sql +++ /dev/null @@ -1,19 +0,0 @@ --- Enable Row Level Security -ALTER TABLE "User" ENABLE ROW LEVEL SECURITY; -ALTER TABLE "UserIdentity" ENABLE ROW LEVEL SECURITY; -ALTER TABLE "Callgent" ENABLE ROW LEVEL SECURITY; - --- Force Row Level Security for table owners -ALTER TABLE "User" FORCE ROW LEVEL SECURITY; -ALTER TABLE "UserIdentity" FORCE ROW LEVEL SECURITY; -ALTER TABLE "Callgent" FORCE ROW LEVEL SECURITY; - --- Create row security policies -CREATE POLICY tenant_isolation_policy ON "User" USING (("tenantId" = 0) OR ("tenantId" = current_setting('tenancy.tenantId', TRUE)::int)); -CREATE POLICY tenant_isolation_policy ON "UserIdentity" USING (("tenantId" = 0) OR ("tenantId" = current_setting('tenancy.tenantId', TRUE)::int)); -CREATE POLICY tenant_isolation_policy ON "Callgent" USING (("tenantId" = 0) OR ("tenantId" = current_setting('tenancy.tenantId', TRUE)::int)); - --- Create policies to bypass RLS (optional) -CREATE POLICY bypass_rls_policy ON "User" USING (current_setting('tenancy.bypass_rls', TRUE)::text = 'on'); -CREATE POLICY bypass_rls_policy ON "UserIdentity" USING (current_setting('tenancy.bypass_rls', TRUE)::text = 'on'); -CREATE POLICY bypass_rls_policy ON "Callgent" USING (current_setting('tenancy.bypass_rls', TRUE)::text = 'on'); From 49838c0c2c1cfc1fd35124d724a054072373bc30 Mon Sep 17 00:00:00 2001 From: ZhaoYongChao <16632301768@163.com> Date: Wed, 29 May 2024 20:13:58 +0800 Subject: [PATCH 006/183] fix: cors Signed-off-by: ZhaoYongChao <16632301768@163.com> --- .env.dev | 1 + .env.test | 1 + src/bootstrap.ts | 2 +- 3 files changed, 3 insertions(+), 1 deletion(-) diff --git a/.env.dev b/.env.dev index d8caa5b..2e0c018 100644 --- a/.env.dev +++ b/.env.dev @@ -3,6 +3,7 @@ SITE_ROOT_DOMAIN=localhost SITE_ROOT_URL=http://localhost:3000 SITE_API_URL=${SITE_ROOT_URL}/api FRONTEND_SITE_URL=http://localhost:3030 +FRONTEND_DOCS_URL=http://localhost:4000 LOG_LEVEL=debug # default to stdout diff --git a/.env.test b/.env.test index 82235a4..32aa5fb 100644 --- a/.env.test +++ b/.env.test @@ -3,6 +3,7 @@ SITE_ROOT_DOMAIN=localhost SITE_ROOT_URL=http://localhost:3000 SITE_API_URL=${SITE_ROOT_URL}/api FRONTEND_SITE_URL=http://localhost:3030 +FRONTEND_DOCS_URL=http://localhost:4000 LOG_LEVEL=debug # default to stdout diff --git a/src/bootstrap.ts b/src/bootstrap.ts index 1a3d5c9..c58eb88 100644 --- a/src/bootstrap.ts +++ b/src/bootstrap.ts @@ -78,7 +78,7 @@ async function bootstrap(app: NestFastifyApplication, port: string) { const configService = app.get(ConfigService); if (configService.get('ALLOW_CORS')) app.register(fastifyCors, { - origin: '*', // allow all + origin: [process.env.FRONTEND_SITE_URL, process.env.FRONTEND_DOCS_URL], methods: ['GET', 'POST', 'PUT', 'PATCH', 'DELETE'], allowedHeaders: ['Content-Type', 'Authorization'], credentials: true, // allow cookie From 1ca67b424545063deab0f18eed195ef73a0f42eb Mon Sep 17 00:00:00 2001 From: dev-callgent Date: Thu, 30 May 2024 12:35:15 +0800 Subject: [PATCH 007/183] refactor: seed-test Signed-off-by: dev-callgent --- package.json | 2 +- prisma/seed-test.ts | 169 ++++++++++++++++++++++++++++++++++++++++++++ prisma/seed.ts | 154 +--------------------------------------- 3 files changed, 171 insertions(+), 154 deletions(-) create mode 100644 prisma/seed-test.ts diff --git a/package.json b/package.json index 91d1718..24d363a 100644 --- a/package.json +++ b/package.json @@ -25,7 +25,7 @@ "prisma:generate": "npx prisma generate", "prisma:studio": "npx prisma studio", "prisma:seed": "npx prisma db seed", - "prisma:seed:test": "SEED_TEST_DATA=1 npx prisma db seed", + "prisma:seed:test": "ts-node prisma/seed-test.ts", "prepare": "husky", "commit": "git-cz", "release": "standard-version" diff --git a/prisma/seed-test.ts b/prisma/seed-test.ts new file mode 100644 index 0000000..d5514ad --- /dev/null +++ b/prisma/seed-test.ts @@ -0,0 +1,169 @@ +import { Prisma, PrismaClient } from '@prisma/client'; + +const prisma = new PrismaClient({ + log: ['query', 'info', 'warn', 'error'], +}); + +async function main() { + return await Promise.all(initTestData()); +} + +// execute the main function +main() + .catch((e) => { + console.error(e); + process.exit(1); + }) + .finally(async () => { + // close Prisma Client at the end + await prisma.$disconnect(); + }); + +function initTestData() { + const tenant: Prisma.TenantUncheckedCreateInput = { + id: 1, + uuid: 'TEST_TENANT_UUID', + statusCode: 1, + }; + + const userUuid = 'TEST_USER_UUID'; + const u: Prisma.UserUncheckedCreateInput = { + id: 1, + uuid: userUuid, + name: 'test-user', + tenantId: 1, + }; + + const ui: Prisma.UserIdentityUncheckedCreateInput = { + id: 1, + tenantId: 1, + provider: 'local', + uid: 'test@callgent.com', + // password123 + credentials: '$2b$10$JmQ5gwQevEGI6t.HLrCw3ugQNf9.8KaqC1OaaC5mCMClii.zKveYm', + name: 'test-user', + email: 'test@callgent.com', + email_verified: true, + userId: 1, + userUuid, + }; + + const authTokenDto: Prisma.AuthTokenUncheckedCreateInput = { + id: 1, + token: 'TEST-ONLY-API_KEY', + type: 'API_KEY', + payload: { + sub: userUuid, + aud: 'appKey', + }, + }; + + const callgentDto: Prisma.CallgentUncheckedCreateInput = { + id: 1, + uuid: 'TEST_CALLGENT_UUID', + name: 'test-callgent', + tenantId: 1, + createdBy: userUuid, + }; + + const cepDto: Prisma.EndpointUncheckedCreateInput = { + id: 1, + uuid: 'TEST_CEP_UUID', + callgentUuid: 'TEST_CALLGENT_UUID', + type: 'CLIENT', + adaptorKey: 'restAPI', + host: {}, + tenantId: 1, + createdBy: userUuid, + }; + + return [ + prisma.tenant + .upsert({ + where: { id: 1 }, + update: tenant, + create: tenant, + }) + .then((tenant) => { + console.log({ tenant }); + prisma.user + .upsert({ + where: { id: 1 }, + update: u, + create: u, + }) + .then((user) => { + (ui as any).id = 1; + (ui as any).userId = user.id; + prisma.userIdentity + .upsert({ + where: { id: 1 }, + update: ui, + create: ui, + }) + .then((userIdentity) => console.log({ user, userIdentity })); + }); + }), + prisma.authToken + .upsert({ + where: { id: 1 }, + update: authTokenDto, + create: authTokenDto, + }) + .then((authToken) => console.log({ authToken })), + prisma.callgent + .upsert({ + where: { id: 1 }, + update: callgentDto, + create: callgentDto, + }) + .then((callgent) => console.log({ callgent })), + prisma.endpoint + .upsert({ + where: { id: 1 }, + update: cepDto, + create: cepDto, + }) + .then((cep) => console.log({ cep })), + addLlmCache( + 1, + 'api2Function', + 'Please convert below API doc of format restAPI:\n{ "POST:/boards/list": {"summary":"List all boards","requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"apiKey":{"type":"string","description":"Your secret API key."}},"required":["apiKey"]}}},"required":true},"responses":{"200":{"description":"A dictionary with a \\"boards\\" property that contains an array of board objects.","content":{"application/json":{"schema":{"type":"object","properties":{"boards":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","description":"A unique identifier for the board."},"created":{"type":"string","description":"Time at which the board was created, in ISO 8601 format."},"isPrivate":{"type":"boolean","description":"Whether or not the board is set as private in the administrative settings."},"name":{"type":"string","description":"The board\'s name."},"postCount":{"type":"integer","description":"The number of non-deleted posts associated with the board. This number includes posts that are marked as closed or complete."},"privateComments":{"type":"boolean","description":"Whether or not comments left on posts can be viewed by other end-users."},"url":{"type":"string","description":"The URL to the board\'s page."}}}},"hasMore":{"type":"boolean","description":"Specifies whether this query returns more boards than the limit."}}}}}}}} }\n\ninto a js function, the function must be as follows:\n// the `invoker` function do the real invocation\nasync (invoker: (req:{ path: string; method: string; headers?: { [key: string]: string }; query?: { [key: string]: string }; params?: { [key: string]: string }; files?: { [key: string]: any }; body?: any; form?: any;})=>Promise<{ apiResult: any; headers?: { [key: string]: string }; status?: number; statusText?: string;}>, ...apiParams) {...; const json = await invoker(...); ...; return apiResult; }\n\nplease generate the js function with **full implementation and error handling**! output a single-line json object:\n{"funName":"function name", "params":["invoker", ...apiParams]"documents":"formal js function documentation with description of params and response object with **all properties elaborated** exactly same as the API doc", "fullCode":"(invoker, ...)=>{...; const json = await invoker(...); ...; return apiResult;}"}', + '{"funName":"listBoards","params":["invoker","apiKey"],"documents":"This function lists all boards.\\n\\n@param {Function} invoker - A function that makes the actual API call.\\n@param {string} apiKey - Your secret API key.\\n\\n@returns {Promise} A promise that resolves to an object containing the API result.\\n@property {Array} boards - An array of board objects.\\n@property {string} boards[].id - A unique identifier for the board.\\n@property {string} boards[].created - Time at which the board was created, in ISO 8601 format.\\n@property {boolean} boards[].isPrivate - Whether or not the board is set as private in the administrative settings.\\n@property {string} boards[].name - The board\'s name.\\n@property {number} boards[].postCount - The number of non-deleted posts associated with the board. This number includes posts that are marked as closed or complete.\\n@property {boolean} boards[].privateComments - Whether or not comments left on posts can be viewed by other end-users.\\n@property {string} boards[].url - The URL to the board\'s page.\\n@property {boolean} hasMore - Specifies whether this query returns more boards than the limit.","fullCode":"(invoker, apiKey) => {\\n const requestBody = {\\n apiKey\\n };\\n const options = {\\n method: \'POST\',\\n path: \'/boards/list\',\\n body: JSON.stringify(requestBody),\\n headers: {\'Content-Type\': \'application/json\'},\\n };\\n try {\\n const json = await invoker(options);\\n if (json.status !== 200) {\\n throw new Error(Request failed with status ${json.status});\\n }\\n return json.apiResult;\\n } catch (error) {\\n console.error(error);\\n throw error;\\n }\\n}"}', + ), + addLlmCache( + 2, + 'api2Function', + 'Please convert below API doc of format restAPI:\n{ "POST:/boards/retrieve": {"summary":"Retrieve board","requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"apiKey":{"type":"string","description":"Your secret API key."},"id":{"type":"string","description":"The board\'s unique identifier."}},"required":["apiKey","id"]}}},"required":true},"responses":{"200":{"description":"Returns a board object, if a valid id was supplied.","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string","description":"A unique identifier for the board."},"created":{"type":"string","description":"Time at which the board was created, in ISO 8601 format."},"isPrivate":{"type":"boolean","description":"Whether or not the board is set as private in the administrative settings."},"name":{"type":"string","description":"The board\'s name."},"postCount":{"type":"integer","description":"The number of non-deleted posts associated with the board. This number includes posts that are marked as closed or complete."},"privateComments":{"type":"boolean","description":"Whether or not comments left on posts can be viewed by other end-users."},"url":{"type":"string","description":"The URL to the board\'s page."}}}}}}}} }\n\ninto a js function, the function must be as follows:\n// the `invoker` function do the real invocation\nasync (invoker: (req:{ path: string; method: string; headers?: { [key: string]: string }; query?: { [key: string]: string }; params?: { [key: string]: string }; files?: { [key: string]: any }; body?: any; form?: any;})=>Promise<{ apiResult: any; headers?: { [key: string]: string }; status?: number; statusText?: string;}>, ...apiParams) {...; const json = await invoker(...); ...; return apiResult; }\n\nplease generate the js function with **full implementation and error handling**! output a single-line json object:\n{"funName":"function name", "params":["invoker", ...apiParams]"documents":"formal js function documentation with description of params and response object with **all properties elaborated** exactly same as the API doc", "fullCode":"(invoker, ...)=>{...; const json = await invoker(...); ...; return apiResult;}"}', + '{"funName":"retrieveBoard","params":["invoker","apiKey","id"],"documents":"This function retrieves a board object given a valid API key and board ID.\\n\\nParameters:\\n- invoker: A function that performs the actual API call.\\n- apiKey: Your secret API key.\\n- id: The board\'s unique identifier.\\n\\nReturns:\\nAn object containing the board details if a valid id was supplied. The object properties are:\\n- id: A unique identifier for the board.\\n- created: Time at which the board was created, in ISO 8601 format.\\n- isPrivate: Whether or not the board is set as private in the administrative settings.\\n- name: The board\'s name.\\n- postCount: The number of non-deleted posts associated with the board. This number includes posts that are marked as closed or complete.\\n- privateComments: Whether or not comments left on posts can be viewed by other end-users.\\n- url: The URL to the board\'s page.","fullCode":"(invoker, apiKey, id) => {\\n const req = {\\n path: \'/boards/retrieve\',\\n method: \'POST\',\\n headers: { \'Content-Type\': \'application/json\' },\\n body: JSON.stringify({\\n apiKey, id\\n })\\n };\\n try {\\n const resp = await invoker(req);\\n if (resp.status !== 200) {\\n throw new Error(`Failed to retrieve board. Status: ${resp.status}`);\\n }\\n return resp.result;\\n } catch (error) {\\n console.error(error);\\n throw error;\\n }\\n}"}', + ), + addLlmCache( + 3, + 'api2Function', + 'Please convert below API doc of format restAPI:\n{ "POST:/categories/list": {"summary":"List categories","requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"apiKey":{"type":"string","description":"Your secret API key."},"boardID":{"type":"string","description":"The id of the board you\'d like to fetch categories for."},"limit":{"type":"integer","description":"The number of categories you\'d like to fetch. Defaults to 10 if not specified. Max of 10000."},"skip":{"type":"integer","description":"The number of categories you\'d like to skip before starting to fetch. Defaults to 0 if not specified."}},"required":["apiKey"]}}},"required":true},"responses":{"200":{"description":"A dictionary with a \\"categories\\" property that contains an array of tag objects. There\'s also a \\"hasMore\\" property that specifies whether this query returns more categories than the limit.","content":{"application/json":{"schema":{"type":"object","properties":{"categories":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","description":"A unique identifier for the category."},"board":{"type":"object","properties":{"id":{"type":"string","description":"A unique identifier for the board."},"created":{"type":"string","description":"Time at which the board was created, in ISO 8601 format."},"isPrivate":{"type":"boolean","description":"Whether or not the board is set as private in the administrative settings."},"name":{"type":"string","description":"The board\'s name."},"postCount":{"type":"integer","description":"The number of non-deleted posts associated with the board. This number includes posts that are marked as closed or complete."},"privateComments":{"type":"boolean","description":"Whether or not comments left on posts can be viewed by other end-users."},"url":{"type":"string","description":"The URL to the board\'s page."}},"description":"The board this category is associated with."},"created":{"type":"string","description":"Time at which the category was created, in ISO 8601 format."},"name":{"type":"string","description":"The name of the category."},"parentID":{"type":"string","description":"The id of the parent category. If this category is not a sub category, this field will be null."},"postCount":{"type":"integer","description":"The number of posts that have been assigned this category."},"url":{"type":"string","description":"The URL to the board, filtered to just posts that have been assigned this category."}}}},"hasMore":{"type":"boolean","description":"Specifies whether this query returns more categories than the limit."}}}}}}}} }\n\ninto a js function, the function must be as follows:\n// the `invoker` function do the real invocation\nasync (invoker: (req:{ path: string; method: string; headers?: { [key: string]: string }; query?: { [key: string]: string }; params?: { [key: string]: string }; files?: { [key: string]: any }; body?: any; form?: any;})=>Promise<{ apiResult: any; headers?: { [key: string]: string }; status?: number; statusText?: string;}>, ...apiParams) {...; const json = await invoker(...); ...; return apiResult; }\n\nplease generate the js function with **full implementation and error handling**! output a single-line json object:\n{"funName":"function name", "params":["invoker", ...apiParams]"documents":"formal js function documentation with description of params and response object with **all properties elaborated** exactly same as the API doc", "fullCode":"(invoker, ...)=>{...; const json = await invoker(...); ...; return apiResult;}"}', + '{"funName":"listCategories","params":["invoker","apiKey","boardID","limit","skip"],"documents":"This function lists categories based on the provided API key, board ID, limit, and skip parameters.\\n\\nParameters:\\n- `invoker`: A function that performs the actual API call.\\n- `apiKey`: Your secret API key.\\n- `boardID`: The id of the board you\'d like to fetch categories for.\\n- `limit`: The number of categories you\'d like to fetch. Defaults to 10 if not specified. Max of 10000.\\n- `skip`: The number of categories you\'d like to skip before starting to fetch. Defaults to 0 if not specified.\\n\\nReturns:\\nAn object containing the categories and a hasMore property that specifies whether this query returns more categories than the limit.","fullCode":"(invoker, apiKey, boardID, limit = 10, skip = 0) => {\\n const reqBody = {\\n apiKey, boardID,\\n limit: Math.min(Math.max(limit, 0), 10000),\\n skip: Math.max(skip, 0)\\n };\\n const resp = await invoker({\\n path: \'/categories/list\',\\n method: \'POST\',\\n body: reqBody\\n });\\n if (resp.status !== 200) {\\n throw new Error(`API request failed with status ${resp.status}: ${resp.statusText}`);\\n }\\n return resp.result;\\n}"}', + ), + addLlmCache( + 4, + 'map2Function', + 'given below service functions:\nclass new-test-callgent {\n "function name: POST:/boards/list": {"params":[invoker,apiKey], "documents":"This function lists all boards.\n\n@param {Function} invoker - A function that makes the actual API call.\n@param {string} apiKey - Your secret API key.\n\n@returns {Promise} A promise that resolves to an object containing the API result.\n@property {Array} boards - An array of board objects.\n@property {string} boards[].id - A unique identifier for the board.\n@property {string} boards[].created - Time at which the board was created, in ISO 8601 format.\n@property {boolean} boards[].isPrivate - Whether or not the board is set as private in the administrative settings.\n@property {string} boards[].name - The board\'s name.\n@property {number} boards[].postCount - The number of non-deleted posts associated with the board. This number includes posts that are marked as closed or complete.\n@property {boolean} boards[].privateComments - Whether or not comments left on posts can be viewed by other end-users.\n@property {string} boards[].url - The URL to the board\'s page.\n@property {boolean} hasMore - Specifies whether this query returns more boards than the limit."},\n\n}\nand an service `invoker` function.\n\nPlease choose one function to fulfill below request:\n{\n"requesting function": "POST:/boards/list",\n"request from": "restAPI",\n"request_object": {"url":"/boards/list","method":"POST","headers":{"host":"127.0.0.1:3300","connection":"close","content-length":"0"},"query":{}},\n}\nand code for request_object to chosen function args mapping. if any data missing/unclear/ambiguous from request_object to invocation args, please ask question to the caller in below json.question field.\n\noutput a single-line json object:\n{ "funName": "the function name to be invoked", "params":"param names of the chosen function", "mapping": "the js function (invoker, request_object)=>{...;return functionArgsArray;}, full implementation to return the **real** args from request_object to invoke the chosen service function. don\'t use data not exist or ambiguous in request", "question": "question to ask the caller if anything not sure or missing for request to args mapping, *no* guess or assumption of the mapping. null if the mapping is crystal clear." }"}', + '{"funName":"POST:/boards/list","params":["invoker","apiKey"],"mapping":"(invoker, request_object)=>{ let apiKey = request_object.params.uuids; return [invoker, apiKey]; }","question":"What is the API key for this request? It is not provided in the request_object."}', + ), + ]; +} + +async function addLlmCache( + id: number, + name: string, + prompt: string, + result: string, +) { + const llmCacheDto = { id, name, prompt, result }; + return prisma.llmCache + .upsert({ + where: { id }, + update: llmCacheDto, + create: llmCacheDto, + }) + .then((lmCache) => console.log({ lmCache })); +} diff --git a/prisma/seed.ts b/prisma/seed.ts index c91c5f0..a2f562e 100644 --- a/prisma/seed.ts +++ b/prisma/seed.ts @@ -5,10 +5,7 @@ const prisma = new PrismaClient({ }); async function main() { - const promises = []; - promises.push(...initData()); - if (process.env.SEED_TEST_DATA) promises.push(...initTestData()); - return Promise.all(promises); + return await Promise.all(initData()); } // execute the main function @@ -169,152 +166,3 @@ output a single-line json object: .then((llmTpl) => console.log({ llmTpl })), ); } - -function initTestData() { - const tenant: Prisma.TenantUncheckedCreateInput = { - id: 1, - uuid: 'TEST_TENANT_UUID', - statusCode: 1, - }; - - const userUuid = 'TEST_USER_UUID'; - const u: Prisma.UserUncheckedCreateInput = { - id: 1, - uuid: userUuid, - name: 'test-user', - tenantId: 1, - }; - - const ui: Prisma.UserIdentityUncheckedCreateInput = { - id: 1, - tenantId: 1, - provider: 'local', - uid: 'test@callgent.com', - // password123 - credentials: '$2b$10$JmQ5gwQevEGI6t.HLrCw3ugQNf9.8KaqC1OaaC5mCMClii.zKveYm', - name: 'test-user', - email: 'test@callgent.com', - email_verified: true, - userId: 1, - userUuid, - }; - - const authTokenDto: Prisma.AuthTokenUncheckedCreateInput = { - id: 1, - token: 'TEST-ONLY-API_KEY', - type: 'API_KEY', - payload: { - sub: userUuid, - aud: 'appKey', - }, - }; - - const callgentDto: Prisma.CallgentUncheckedCreateInput = { - id: 1, - uuid: 'TEST_CALLGENT_UUID', - name: 'test-callgent', - tenantId: 1, - createdBy: userUuid, - }; - - const cepDto: Prisma.EndpointUncheckedCreateInput = { - id: 1, - uuid: 'TEST_CEP_UUID', - callgentUuid: 'TEST_CALLGENT_UUID', - type: 'CLIENT', - adaptorKey: 'restAPI', - host: {}, - tenantId: 1, - createdBy: userUuid, - }; - - return [ - prisma.tenant - .upsert({ - where: { id: 1 }, - update: tenant, - create: tenant, - }) - .then((tenant) => { - console.log({ tenant }); - prisma.user - .upsert({ - where: { id: 1 }, - update: u, - create: u, - }) - .then((user) => { - (ui as any).id = 1; - (ui as any).userId = user.id; - prisma.userIdentity - .upsert({ - where: { id: 1 }, - update: ui, - create: ui, - }) - .then((userIdentity) => console.log({ user, userIdentity })); - }); - }), - prisma.authToken - .upsert({ - where: { id: 1 }, - update: authTokenDto, - create: authTokenDto, - }) - .then((authToken) => console.log({ authToken })), - prisma.callgent - .upsert({ - where: { id: 1 }, - update: callgentDto, - create: callgentDto, - }) - .then((callgent) => console.log({ callgent })), - prisma.endpoint - .upsert({ - where: { id: 1 }, - update: cepDto, - create: cepDto, - }) - .then((cep) => console.log({ cep })), - addLlmCache( - 1, - 'api2Function', - 'Please convert below API doc of format restAPI:\n{ "POST:/boards/list": {"summary":"List all boards","requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"apiKey":{"type":"string","description":"Your secret API key."}},"required":["apiKey"]}}},"required":true},"responses":{"200":{"description":"A dictionary with a \\"boards\\" property that contains an array of board objects.","content":{"application/json":{"schema":{"type":"object","properties":{"boards":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","description":"A unique identifier for the board."},"created":{"type":"string","description":"Time at which the board was created, in ISO 8601 format."},"isPrivate":{"type":"boolean","description":"Whether or not the board is set as private in the administrative settings."},"name":{"type":"string","description":"The board\'s name."},"postCount":{"type":"integer","description":"The number of non-deleted posts associated with the board. This number includes posts that are marked as closed or complete."},"privateComments":{"type":"boolean","description":"Whether or not comments left on posts can be viewed by other end-users."},"url":{"type":"string","description":"The URL to the board\'s page."}}}},"hasMore":{"type":"boolean","description":"Specifies whether this query returns more boards than the limit."}}}}}}}} }\n\ninto a js function, the function must be as follows:\n// the `invoker` function do the real invocation\nasync (invoker: (req:{ path: string; method: string; headers?: { [key: string]: string }; query?: { [key: string]: string }; params?: { [key: string]: string }; files?: { [key: string]: any }; body?: any; form?: any;})=>Promise<{ apiResult: any; headers?: { [key: string]: string }; status?: number; statusText?: string;}>, ...apiParams) {...; const json = await invoker(...); ...; return apiResult; }\n\nplease generate the js function with **full implementation and error handling**! output a single-line json object:\n{"funName":"function name", "params":["invoker", ...apiParams]"documents":"formal js function documentation with description of params and response object with **all properties elaborated** exactly same as the API doc", "fullCode":"(invoker, ...)=>{...; const json = await invoker(...); ...; return apiResult;}"}', - '{"funName":"listBoards","params":["invoker","apiKey"],"documents":"This function lists all boards.\\n\\n@param {Function} invoker - A function that makes the actual API call.\\n@param {string} apiKey - Your secret API key.\\n\\n@returns {Promise} A promise that resolves to an object containing the API result.\\n@property {Array} boards - An array of board objects.\\n@property {string} boards[].id - A unique identifier for the board.\\n@property {string} boards[].created - Time at which the board was created, in ISO 8601 format.\\n@property {boolean} boards[].isPrivate - Whether or not the board is set as private in the administrative settings.\\n@property {string} boards[].name - The board\'s name.\\n@property {number} boards[].postCount - The number of non-deleted posts associated with the board. This number includes posts that are marked as closed or complete.\\n@property {boolean} boards[].privateComments - Whether or not comments left on posts can be viewed by other end-users.\\n@property {string} boards[].url - The URL to the board\'s page.\\n@property {boolean} hasMore - Specifies whether this query returns more boards than the limit.","fullCode":"(invoker, apiKey) => {\\n const requestBody = {\\n apiKey\\n };\\n const options = {\\n method: \'POST\',\\n path: \'/boards/list\',\\n body: JSON.stringify(requestBody),\\n headers: {\'Content-Type\': \'application/json\'},\\n };\\n try {\\n const json = await invoker(options);\\n if (json.status !== 200) {\\n throw new Error(Request failed with status ${json.status});\\n }\\n return json.apiResult;\\n } catch (error) {\\n console.error(error);\\n throw error;\\n }\\n}"}', - ), - addLlmCache( - 2, - 'api2Function', - 'Please convert below API doc of format restAPI:\n{ "POST:/boards/retrieve": {"summary":"Retrieve board","requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"apiKey":{"type":"string","description":"Your secret API key."},"id":{"type":"string","description":"The board\'s unique identifier."}},"required":["apiKey","id"]}}},"required":true},"responses":{"200":{"description":"Returns a board object, if a valid id was supplied.","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string","description":"A unique identifier for the board."},"created":{"type":"string","description":"Time at which the board was created, in ISO 8601 format."},"isPrivate":{"type":"boolean","description":"Whether or not the board is set as private in the administrative settings."},"name":{"type":"string","description":"The board\'s name."},"postCount":{"type":"integer","description":"The number of non-deleted posts associated with the board. This number includes posts that are marked as closed or complete."},"privateComments":{"type":"boolean","description":"Whether or not comments left on posts can be viewed by other end-users."},"url":{"type":"string","description":"The URL to the board\'s page."}}}}}}}} }\n\ninto a js function, the function must be as follows:\n// the `invoker` function do the real invocation\nasync (invoker: (req:{ path: string; method: string; headers?: { [key: string]: string }; query?: { [key: string]: string }; params?: { [key: string]: string }; files?: { [key: string]: any }; body?: any; form?: any;})=>Promise<{ apiResult: any; headers?: { [key: string]: string }; status?: number; statusText?: string;}>, ...apiParams) {...; const json = await invoker(...); ...; return apiResult; }\n\nplease generate the js function with **full implementation and error handling**! output a single-line json object:\n{"funName":"function name", "params":["invoker", ...apiParams]"documents":"formal js function documentation with description of params and response object with **all properties elaborated** exactly same as the API doc", "fullCode":"(invoker, ...)=>{...; const json = await invoker(...); ...; return apiResult;}"}', - '{"funName":"retrieveBoard","params":["invoker","apiKey","id"],"documents":"This function retrieves a board object given a valid API key and board ID.\\n\\nParameters:\\n- invoker: A function that performs the actual API call.\\n- apiKey: Your secret API key.\\n- id: The board\'s unique identifier.\\n\\nReturns:\\nAn object containing the board details if a valid id was supplied. The object properties are:\\n- id: A unique identifier for the board.\\n- created: Time at which the board was created, in ISO 8601 format.\\n- isPrivate: Whether or not the board is set as private in the administrative settings.\\n- name: The board\'s name.\\n- postCount: The number of non-deleted posts associated with the board. This number includes posts that are marked as closed or complete.\\n- privateComments: Whether or not comments left on posts can be viewed by other end-users.\\n- url: The URL to the board\'s page.","fullCode":"(invoker, apiKey, id) => {\\n const req = {\\n path: \'/boards/retrieve\',\\n method: \'POST\',\\n headers: { \'Content-Type\': \'application/json\' },\\n body: JSON.stringify({\\n apiKey, id\\n })\\n };\\n try {\\n const resp = await invoker(req);\\n if (resp.status !== 200) {\\n throw new Error(`Failed to retrieve board. Status: ${resp.status}`);\\n }\\n return resp.result;\\n } catch (error) {\\n console.error(error);\\n throw error;\\n }\\n}"}', - ), - addLlmCache( - 3, - 'api2Function', - 'Please convert below API doc of format restAPI:\n{ "POST:/categories/list": {"summary":"List categories","requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"apiKey":{"type":"string","description":"Your secret API key."},"boardID":{"type":"string","description":"The id of the board you\'d like to fetch categories for."},"limit":{"type":"integer","description":"The number of categories you\'d like to fetch. Defaults to 10 if not specified. Max of 10000."},"skip":{"type":"integer","description":"The number of categories you\'d like to skip before starting to fetch. Defaults to 0 if not specified."}},"required":["apiKey"]}}},"required":true},"responses":{"200":{"description":"A dictionary with a \\"categories\\" property that contains an array of tag objects. There\'s also a \\"hasMore\\" property that specifies whether this query returns more categories than the limit.","content":{"application/json":{"schema":{"type":"object","properties":{"categories":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","description":"A unique identifier for the category."},"board":{"type":"object","properties":{"id":{"type":"string","description":"A unique identifier for the board."},"created":{"type":"string","description":"Time at which the board was created, in ISO 8601 format."},"isPrivate":{"type":"boolean","description":"Whether or not the board is set as private in the administrative settings."},"name":{"type":"string","description":"The board\'s name."},"postCount":{"type":"integer","description":"The number of non-deleted posts associated with the board. This number includes posts that are marked as closed or complete."},"privateComments":{"type":"boolean","description":"Whether or not comments left on posts can be viewed by other end-users."},"url":{"type":"string","description":"The URL to the board\'s page."}},"description":"The board this category is associated with."},"created":{"type":"string","description":"Time at which the category was created, in ISO 8601 format."},"name":{"type":"string","description":"The name of the category."},"parentID":{"type":"string","description":"The id of the parent category. If this category is not a sub category, this field will be null."},"postCount":{"type":"integer","description":"The number of posts that have been assigned this category."},"url":{"type":"string","description":"The URL to the board, filtered to just posts that have been assigned this category."}}}},"hasMore":{"type":"boolean","description":"Specifies whether this query returns more categories than the limit."}}}}}}}} }\n\ninto a js function, the function must be as follows:\n// the `invoker` function do the real invocation\nasync (invoker: (req:{ path: string; method: string; headers?: { [key: string]: string }; query?: { [key: string]: string }; params?: { [key: string]: string }; files?: { [key: string]: any }; body?: any; form?: any;})=>Promise<{ apiResult: any; headers?: { [key: string]: string }; status?: number; statusText?: string;}>, ...apiParams) {...; const json = await invoker(...); ...; return apiResult; }\n\nplease generate the js function with **full implementation and error handling**! output a single-line json object:\n{"funName":"function name", "params":["invoker", ...apiParams]"documents":"formal js function documentation with description of params and response object with **all properties elaborated** exactly same as the API doc", "fullCode":"(invoker, ...)=>{...; const json = await invoker(...); ...; return apiResult;}"}', - '{"funName":"listCategories","params":["invoker","apiKey","boardID","limit","skip"],"documents":"This function lists categories based on the provided API key, board ID, limit, and skip parameters.\\n\\nParameters:\\n- `invoker`: A function that performs the actual API call.\\n- `apiKey`: Your secret API key.\\n- `boardID`: The id of the board you\'d like to fetch categories for.\\n- `limit`: The number of categories you\'d like to fetch. Defaults to 10 if not specified. Max of 10000.\\n- `skip`: The number of categories you\'d like to skip before starting to fetch. Defaults to 0 if not specified.\\n\\nReturns:\\nAn object containing the categories and a hasMore property that specifies whether this query returns more categories than the limit.","fullCode":"(invoker, apiKey, boardID, limit = 10, skip = 0) => {\\n const reqBody = {\\n apiKey, boardID,\\n limit: Math.min(Math.max(limit, 0), 10000),\\n skip: Math.max(skip, 0)\\n };\\n const resp = await invoker({\\n path: \'/categories/list\',\\n method: \'POST\',\\n body: reqBody\\n });\\n if (resp.status !== 200) {\\n throw new Error(`API request failed with status ${resp.status}: ${resp.statusText}`);\\n }\\n return resp.result;\\n}"}', - ), - addLlmCache( - 4, - 'map2Function', - 'given below service functions:\nclass new-test-callgent {\n "function name: POST:/boards/list": {"params":[invoker,apiKey], "documents":"This function lists all boards.\n\n@param {Function} invoker - A function that makes the actual API call.\n@param {string} apiKey - Your secret API key.\n\n@returns {Promise} A promise that resolves to an object containing the API result.\n@property {Array} boards - An array of board objects.\n@property {string} boards[].id - A unique identifier for the board.\n@property {string} boards[].created - Time at which the board was created, in ISO 8601 format.\n@property {boolean} boards[].isPrivate - Whether or not the board is set as private in the administrative settings.\n@property {string} boards[].name - The board\'s name.\n@property {number} boards[].postCount - The number of non-deleted posts associated with the board. This number includes posts that are marked as closed or complete.\n@property {boolean} boards[].privateComments - Whether or not comments left on posts can be viewed by other end-users.\n@property {string} boards[].url - The URL to the board\'s page.\n@property {boolean} hasMore - Specifies whether this query returns more boards than the limit."},\n\n}\nand an service `invoker` function.\n\nPlease choose one function to fulfill below request:\n{\n"requesting function": "POST:/boards/list",\n"request from": "restAPI",\n"request_object": {"url":"/boards/list","method":"POST","headers":{"host":"127.0.0.1:3300","connection":"close","content-length":"0"},"query":{}},\n}\nand code for request_object to chosen function args mapping. if any data missing/unclear/ambiguous from request_object to invocation args, please ask question to the caller in below json.question field.\n\noutput a single-line json object:\n{ "funName": "the function name to be invoked", "params":"param names of the chosen function", "mapping": "the js function (invoker, request_object)=>{...;return functionArgsArray;}, full implementation to return the **real** args from request_object to invoke the chosen service function. don\'t use data not exist or ambiguous in request", "question": "question to ask the caller if anything not sure or missing for request to args mapping, *no* guess or assumption of the mapping. null if the mapping is crystal clear." }"}', - '{"funName":"POST:/boards/list","params":["invoker","apiKey"],"mapping":"(invoker, request_object)=>{ let apiKey = request_object.params.uuids; return [invoker, apiKey]; }","question":"What is the API key for this request? It is not provided in the request_object."}', - ), - ]; -} - -async function addLlmCache( - id: number, - name: string, - prompt: string, - result: string, -) { - const llmCacheDto = { id, name, prompt, result }; - return prisma.llmCache - .upsert({ - where: { id }, - update: llmCacheDto, - create: llmCacheDto, - }) - .then((lmCache) => console.log({ lmCache })); -} From b30d57ac9bf212e51c26e57e7ff85599d3bc4d52 Mon Sep 17 00:00:00 2001 From: dev-callgent Date: Thu, 30 May 2024 16:24:50 +0800 Subject: [PATCH 008/183] ci: add render.yaml Signed-off-by: dev-callgent --- render.yaml | 53 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 53 insertions(+) create mode 100644 render.yaml diff --git a/render.yaml b/render.yaml new file mode 100644 index 0000000..05a1013 --- /dev/null +++ b/render.yaml @@ -0,0 +1,53 @@ +# Exported from Render on 2024-05-30T08:21:36Z +services: +- type: web + name: callgent-api-docker + runtime: docker + repo: https://github.com/Callgent/callgent-api + plan: free + envVars: + - key: GOOGLE_OAUTH_CLIENT_SECRET + sync: false + - key: GOOGLE_OAUTH_CLIENT_ID + sync: false + - key: GITHUB_OAUTH_CLIENT_SECRET + sync: false + - key: GITHUB_OAUTH_CLIENT_ID + sync: false + - key: EMAIL_DEFAULT_SENDER + sync: false + - key: EMAIL_BREVO_API_KEY + sync: false + - key: EMAIL_SPARKPOST_API_KEY + sync: false + - key: NOT_HTTP_ONLY + sync: false + - key: DATABASE_URL + sync: false + - key: POSTGRES_DB + sync: false + - key: POSTGRES_USER + sync: false + - key: POSTGRES_PASSWORD + sync: false + - key: POSTGRES_PORT + sync: false + - key: POSTGRES_HOST + sync: false + - key: FRONTEND_SITE_URL + sync: false + - key: SITE_API_URL + sync: false + - key: SITE_ROOT_URL + sync: false + - key: SITE_ROOT_DOMAIN + sync: false + - key: JWT_COOKIE_NAME + sync: false + region: oregon + dockerContext: . + dockerfilePath: ./Dockerfile + domains: + - api.callgent.com + pullRequestPreviewsEnabled: true +version: "1" \ No newline at end of file From 52dc524693c9be6687cb603b833160fffacdf23f Mon Sep 17 00:00:00 2001 From: dev-callgent Date: Thu, 30 May 2024 16:24:50 +0800 Subject: [PATCH 009/183] ci: add render.yaml Signed-off-by: dev-callgent --- DEVLOG.md | 94 +- pnpm-lock.yaml | 11020 +++++++++++++++++++++++++++-------------------- render.yaml | 53 + 3 files changed, 6398 insertions(+), 4769 deletions(-) create mode 100644 render.yaml diff --git a/DEVLOG.md b/DEVLOG.md index 13c0a19..0768f40 100644 --- a/DEVLOG.md +++ b/DEVLOG.md @@ -1,84 +1,90 @@ # Developer Guide +Before you start to get prepared for the develop environment, you need to make sure your basic tools are installed correctly. -## Development Setup +* Nodejs (Notice: To build the project, the right version is needed, otherwise installation can not be corrected, see .node-version) +* pnpm +* docker +## Development Setup - copy `.env.dev` to `.env` -- install postgres with vector plugin - ```shell - docker pull ankane/pgvector - ``` +- install dependencies +```shell +pnpm i +``` -- init db +- install dababase postgres with vector plugin +```shell +docker pull ankane/pgvector +``` - ```shell - npx prisma generate # generate PrismaClient - npx prisma migrate dev # init db schema - npx prisma db seed # init db data - ``` +- start postgres db in docker +```shell +docker run --name callgent-postgres -p 5432:5432 -e POSTGRES_PASSWORD=postgres -e PG_VECTOR_EXTENSION=true -d ankane/pgvector +``` - - init db test data +- init db +```shell +npx prisma generate # generate PrismaClient +npx prisma migrate dev # init db schema +npx prisma db seed # init db data +``` - ```shell - SEED_TEST_DATA=1 npx prisma db seed - ``` +- init db test data +```shell +pnpm run prisma:seed:test # init db test data +``` - start server +```shell +pnpm run start:dev +``` - ```shell - pnpm run start:dev - ``` +If all the above steps are done, and nothing failed, you can access the API at `http://localhost:3000/api` ## Development Logs ### init project - - init project - - ```shell - pnpm i -g @nestjs/cli - nest new callgent-api - cd callgent-api - ``` +```shell +pnpm i -g @nestjs/cli +nest new callgent-api +cd callgent-api +``` ### add dependencies ### integrate prisma - - automatically setup the library, scripts and Docker files - - ```shell - nest add nestjs-prisma - ``` +```shell +nest add nestjs-prisma +``` - integrate prisma plugins + - ReposModule -- init db - ```shell - npx prisma init - ``` +- init db +```shell +npx prisma init +``` - create prisma schema, then init db - - ```shell - npx prisma migrate dev --name init - ``` +```shell +npx prisma migrate dev --name init +``` ### multi-tenancy - 1. write default value for `tenancy.tenantId` in db - - ```text - tenantId Int @default(dbgenerated("(current_setting('tenancy.tenantId'))::int")) - ``` + ```text + tenantId Int @default(dbgenerated("(current_setting('tenancy.tenantId'))::int")) + ``` 2. enable postgres row level security(RLS), so that we can filter data by `tenantId` automatically: config in prisma/migrations/01_row_level_security/migration.sql, @see 3. set `tenantId` into `cls` context: - ```ts cls.set('TENANT_ID', .. ``` diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 23be625..364358e 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1,274 +1,5085 @@ -lockfileVersion: '6.0' - -dependencies: - '@apidevtools/json-schema-ref-parser': - specifier: ^11.5.4 - version: 11.5.4 - '@fastify/compress': - specifier: ^7.0.0 - version: 7.0.0 - '@fastify/cookie': - specifier: ^9.3.1 - version: 9.3.1 - '@fastify/cors': - specifier: ^9.0.1 - version: 9.0.1 - '@fastify/helmet': - specifier: ^11.1.1 - version: 11.1.1 - '@fastify/static': - specifier: ^6.12.0 - version: 6.12.0 - '@nestjs-cls/transactional': - specifier: ^2.2.0 - version: 2.2.0(@nestjs/common@10.0.0)(@nestjs/core@10.0.0)(nestjs-cls@4.2.0)(reflect-metadata@0.1.13)(rxjs@7.8.1) - '@nestjs-cls/transactional-adapter-prisma': - specifier: ^1.1.0 - version: 1.1.0(@nestjs-cls/transactional@2.2.0)(@prisma/client@5.10.2)(nestjs-cls@4.2.0)(prisma@5.10.2) - '@nestjs/cache-manager': - specifier: ^2.2.0 - version: 2.2.0(@nestjs/common@10.0.0)(@nestjs/core@10.0.0)(cache-manager@5.4.0)(reflect-metadata@0.1.13)(rxjs@7.8.1) - '@nestjs/common': - specifier: ^10.0.0 - version: 10.0.0(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.1.13)(rxjs@7.8.1) - '@nestjs/config': - specifier: ^3.1.1 - version: 3.1.1(@nestjs/common@10.0.0)(reflect-metadata@0.1.13) - '@nestjs/core': - specifier: ^10.0.0 - version: 10.0.0(@nestjs/common@10.0.0)(reflect-metadata@0.1.13)(rxjs@7.8.1) - '@nestjs/event-emitter': - specifier: ^2.0.3 - version: 2.0.3(@nestjs/common@10.0.0)(@nestjs/core@10.0.0)(reflect-metadata@0.1.13) - '@nestjs/jwt': - specifier: ^10.2.0 - version: 10.2.0(@nestjs/common@10.0.0) - '@nestjs/passport': - specifier: ^10.0.3 - version: 10.0.3(@nestjs/common@10.0.0)(passport@0.7.0) - '@nestjs/platform-fastify': - specifier: ^10.3.4 - version: 10.3.4(@fastify/static@6.12.0)(@nestjs/common@10.0.0)(@nestjs/core@10.0.0) - '@nestjs/swagger': - specifier: ^7.3.0 - version: 7.3.0(@fastify/static@6.12.0)(@nestjs/common@10.0.0)(@nestjs/core@10.0.0)(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.1.13) - '@nodeteam/nestjs-prisma-pagination': - specifier: ^1.0.6 - version: 1.0.6(@babel/core@7.23.9)(@nestjs/core@10.0.0)(@types/node@20.3.1)(cache-manager@5.4.0)(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.1.13)(rxjs@7.8.1)(ts-node@10.9.1) - '@prisma/client': - specifier: 5.10.2 - version: 5.10.2(prisma@5.10.2) - axios: - specifier: ^1.6.7 - version: 1.6.7(debug@2.6.9) - bcrypt: - specifier: ^5.1.1 - version: 5.1.1 - class-transformer: - specifier: ^0.5.1 - version: 0.5.1 - class-validator: - specifier: ^0.14.1 - version: 0.14.1 - dot: - specifier: ^1.1.3 - version: 1.1.3 - fastify: - specifier: 4.26.2 - version: 4.26.2 - fastify-ip: - specifier: ^1.0.0 - version: 1.0.0 - glob: - specifier: ^10.3.10 - version: 10.3.10 - jsonrepair: - specifier: ^3.7.0 - version: 3.7.0 - module: - specifier: ^1.2.5 - version: 1.2.5 - ms: - specifier: ^2.1.3 - version: 2.1.3 - nanoid: - specifier: 3.3.7 - version: 3.3.7 - nestjs-cls: - specifier: ^4.2.0 - version: 4.2.0(@nestjs/common@10.0.0)(@nestjs/core@10.0.0)(reflect-metadata@0.1.13)(rxjs@7.8.1) - nestjs-oauth2: - specifier: ^0.0.7 - version: 0.0.7(@nestjs/common@10.0.0)(rxjs@7.8.1) - nestjs-pino: - specifier: ^4.0.0 - version: 4.0.0(@nestjs/common@10.0.0)(pino-http@9.0.0) - nestjs-prisma: - specifier: ^0.23.0 - version: 0.23.0(@nestjs/common@10.0.0)(@prisma/client@5.10.2)(prisma@5.10.2) - passport-jwt: - specifier: ^4.0.1 - version: 4.0.1 - passport-local: - specifier: ^1.0.0 - version: 1.0.0 - pino: - specifier: ^8.18.0 - version: 8.18.0 - pino-http: - specifier: ^9.0.0 - version: 9.0.0 - pino-pretty: - specifier: ^10.3.1 - version: 10.3.1 - prisma-soft-delete-middleware: - specifier: ^1.3.1 - version: 1.3.1(@prisma/client@5.10.2) - reflect-metadata: - specifier: ^0.1.13 - version: 0.1.13 - rxjs: - specifier: ^7.8.1 - version: 7.8.1 - v8-sandbox: - specifier: ^3.2.10 - version: 3.2.10(debug@2.6.9) - -devDependencies: - '@chax-at/transactional-prisma-testing': - specifier: ^1.1.0 - version: 1.1.0(@prisma/client@5.10.2) - '@commitlint/cli': - specifier: ^19.2.0 - version: 19.2.0(@types/node@20.3.1)(typescript@5.1.3) - '@commitlint/config-angular': - specifier: ^19.1.0 - version: 19.1.0 - '@nestjs/cli': - specifier: ^10.0.0 - version: 10.0.0 - '@nestjs/schematics': - specifier: ^10.0.0 - version: 10.0.0(chokidar@3.5.3)(typescript@5.1.3) - '@nestjs/testing': - specifier: ^10.0.0 - version: 10.0.0(@nestjs/common@10.0.0)(@nestjs/core@10.0.0) - '@pond918/prisma-generator-nestjs-dto': - specifier: ^1.17.513 - version: 1.17.513 - '@types/bcrypt': - specifier: ^5.0.2 - version: 5.0.2 - '@types/dot': - specifier: ^1.1.7 - version: 1.1.7 - '@types/express': - specifier: ^4.17.17 - version: 4.17.17 - '@types/jest': - specifier: ^29.5.2 - version: 29.5.2 - '@types/ms': - specifier: ^0.7.34 - version: 0.7.34 - '@types/node': - specifier: ^20.3.1 - version: 20.3.1 - '@types/passport-jwt': - specifier: ^4.0.1 - version: 4.0.1 - '@types/passport-local': - specifier: ^1.0.38 - version: 1.0.38 - '@types/supertest': - specifier: ^6.0.0 - version: 6.0.0 - '@typescript-eslint/eslint-plugin': - specifier: ^6.0.0 - version: 6.0.0(@typescript-eslint/parser@6.0.0)(eslint@8.42.0)(typescript@5.1.3) - '@typescript-eslint/parser': - specifier: ^6.0.0 - version: 6.0.0(eslint@8.42.0)(typescript@5.1.3) - commitizen: - specifier: ^4.3.0 - version: 4.3.0(@types/node@20.3.1)(typescript@5.1.3) - cz-conventional-changelog: - specifier: ^3.3.0 - version: 3.3.0(@types/node@20.3.1)(typescript@5.1.3) - eslint: - specifier: ^8.42.0 - version: 8.42.0 - eslint-config-prettier: - specifier: ^9.0.0 - version: 9.0.0(eslint@8.42.0) - eslint-plugin-prettier: - specifier: ^5.0.0 - version: 5.0.0(eslint-config-prettier@9.0.0)(eslint@8.42.0)(prettier@3.0.0) - husky: - specifier: ^9.0.11 - version: 9.0.11 - jest: - specifier: ^29.5.0 - version: 29.5.0(@types/node@20.3.1)(ts-node@10.9.1) - pactum: - specifier: ^3.6.3 - version: 3.6.3 - pactum-matchers: - specifier: ^1.1.6 - version: 1.1.6 - prettier: - specifier: ^3.0.0 - version: 3.0.0 - prisma: - specifier: ^5.10.2 - version: 5.10.2 - source-map-support: - specifier: ^0.5.21 - version: 0.5.21 - standard-version: - specifier: ^9.5.0 - version: 9.5.0 - supertest: - specifier: ^6.3.3 - version: 6.3.3 - ts-jest: - specifier: ^29.1.0 - version: 29.1.0(@babel/core@7.23.9)(jest@29.5.0)(typescript@5.1.3) - ts-loader: - specifier: ^9.4.3 - version: 9.4.3(typescript@5.1.3)(webpack@5.90.1) - ts-node: - specifier: ^10.9.1 - version: 10.9.1(@types/node@20.3.1)(typescript@5.1.3) - tsconfig-paths: - specifier: ^4.2.0 - version: 4.2.0 - typescript: - specifier: ^5.1.3 - version: 5.1.3 +lockfileVersion: '9.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +importers: + + .: + dependencies: + '@apidevtools/json-schema-ref-parser': + specifier: ^11.5.4 + version: 11.5.4 + '@fastify/compress': + specifier: ^7.0.0 + version: 7.0.0 + '@fastify/cookie': + specifier: ^9.3.1 + version: 9.3.1 + '@fastify/cors': + specifier: ^9.0.1 + version: 9.0.1 + '@fastify/helmet': + specifier: ^11.1.1 + version: 11.1.1 + '@fastify/static': + specifier: ^6.12.0 + version: 6.12.0 + '@nestjs-cls/transactional': + specifier: ^2.2.0 + version: 2.2.0(@nestjs/common@10.0.0)(@nestjs/core@10.0.0)(nestjs-cls@4.2.0)(reflect-metadata@0.1.13)(rxjs@7.8.1) + '@nestjs-cls/transactional-adapter-prisma': + specifier: ^1.1.0 + version: 1.1.0(@nestjs-cls/transactional@2.2.0)(@prisma/client@5.10.2)(nestjs-cls@4.2.0)(prisma@5.10.2) + '@nestjs/cache-manager': + specifier: ^2.2.0 + version: 2.2.0(@nestjs/common@10.0.0)(@nestjs/core@10.0.0)(cache-manager@5.4.0)(reflect-metadata@0.1.13)(rxjs@7.8.1) + '@nestjs/common': + specifier: ^10.0.0 + version: 10.0.0(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.1.13)(rxjs@7.8.1) + '@nestjs/config': + specifier: ^3.1.1 + version: 3.1.1(@nestjs/common@10.0.0)(reflect-metadata@0.1.13) + '@nestjs/core': + specifier: ^10.0.0 + version: 10.0.0(@nestjs/common@10.0.0)(reflect-metadata@0.1.13)(rxjs@7.8.1) + '@nestjs/event-emitter': + specifier: ^2.0.3 + version: 2.0.3(@nestjs/common@10.0.0)(@nestjs/core@10.0.0)(reflect-metadata@0.1.13) + '@nestjs/jwt': + specifier: ^10.2.0 + version: 10.2.0(@nestjs/common@10.0.0) + '@nestjs/passport': + specifier: ^10.0.3 + version: 10.0.3(@nestjs/common@10.0.0)(passport@0.7.0) + '@nestjs/platform-fastify': + specifier: ^10.3.4 + version: 10.3.4(@fastify/static@6.12.0)(@nestjs/common@10.0.0)(@nestjs/core@10.0.0) + '@nestjs/swagger': + specifier: ^7.3.0 + version: 7.3.0(@fastify/static@6.12.0)(@nestjs/common@10.0.0)(@nestjs/core@10.0.0)(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.1.13) + '@nodeteam/nestjs-prisma-pagination': + specifier: ^1.0.6 + version: 1.0.6(@babel/core@7.23.9)(@nestjs/core@10.0.0)(@types/node@20.3.1)(cache-manager@5.4.0)(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.1.13)(rxjs@7.8.1)(ts-node@10.9.1) + '@prisma/client': + specifier: 5.10.2 + version: 5.10.2(prisma@5.10.2) + axios: + specifier: ^1.6.7 + version: 1.6.7(debug@2.6.9) + bcrypt: + specifier: ^5.1.1 + version: 5.1.1 + class-transformer: + specifier: ^0.5.1 + version: 0.5.1 + class-validator: + specifier: ^0.14.1 + version: 0.14.1 + dot: + specifier: ^1.1.3 + version: 1.1.3 + fastify: + specifier: 4.26.2 + version: 4.26.2 + fastify-ip: + specifier: ^1.0.0 + version: 1.0.0 + glob: + specifier: ^10.3.10 + version: 10.3.10 + jsonrepair: + specifier: ^3.7.0 + version: 3.7.0 + module: + specifier: ^1.2.5 + version: 1.2.5 + ms: + specifier: ^2.1.3 + version: 2.1.3 + nanoid: + specifier: 3.3.7 + version: 3.3.7 + nestjs-cls: + specifier: ^4.2.0 + version: 4.2.0(@nestjs/common@10.0.0)(@nestjs/core@10.0.0)(reflect-metadata@0.1.13)(rxjs@7.8.1) + nestjs-oauth2: + specifier: ^0.0.7 + version: 0.0.7(@nestjs/common@10.0.0)(rxjs@7.8.1) + nestjs-pino: + specifier: ^4.0.0 + version: 4.0.0(@nestjs/common@10.0.0)(pino-http@9.0.0) + nestjs-prisma: + specifier: ^0.23.0 + version: 0.23.0(@nestjs/common@10.0.0)(@prisma/client@5.10.2)(prisma@5.10.2) + passport-jwt: + specifier: ^4.0.1 + version: 4.0.1 + passport-local: + specifier: ^1.0.0 + version: 1.0.0 + pino: + specifier: ^8.18.0 + version: 8.18.0 + pino-http: + specifier: ^9.0.0 + version: 9.0.0 + pino-pretty: + specifier: ^10.3.1 + version: 10.3.1 + prisma-soft-delete-middleware: + specifier: ^1.3.1 + version: 1.3.1(@prisma/client@5.10.2) + reflect-metadata: + specifier: ^0.1.13 + version: 0.1.13 + rxjs: + specifier: ^7.8.1 + version: 7.8.1 + v8-sandbox: + specifier: ^3.2.10 + version: 3.2.10(debug@2.6.9) + devDependencies: + '@chax-at/transactional-prisma-testing': + specifier: ^1.1.0 + version: 1.1.0(@prisma/client@5.10.2) + '@commitlint/cli': + specifier: ^19.2.0 + version: 19.2.0(@types/node@20.3.1)(typescript@5.1.3) + '@commitlint/config-angular': + specifier: ^19.1.0 + version: 19.1.0 + '@nestjs/cli': + specifier: ^10.0.0 + version: 10.0.0 + '@nestjs/schematics': + specifier: ^10.0.0 + version: 10.0.0(chokidar@3.5.3)(typescript@5.1.3) + '@nestjs/testing': + specifier: ^10.0.0 + version: 10.0.0(@nestjs/common@10.0.0)(@nestjs/core@10.0.0) + '@pond918/prisma-generator-nestjs-dto': + specifier: ^1.17.513 + version: 1.17.513 + '@types/bcrypt': + specifier: ^5.0.2 + version: 5.0.2 + '@types/dot': + specifier: ^1.1.7 + version: 1.1.7 + '@types/express': + specifier: ^4.17.17 + version: 4.17.17 + '@types/jest': + specifier: ^29.5.2 + version: 29.5.2 + '@types/ms': + specifier: ^0.7.34 + version: 0.7.34 + '@types/node': + specifier: ^20.3.1 + version: 20.3.1 + '@types/passport-jwt': + specifier: ^4.0.1 + version: 4.0.1 + '@types/passport-local': + specifier: ^1.0.38 + version: 1.0.38 + '@types/supertest': + specifier: ^6.0.0 + version: 6.0.0 + '@typescript-eslint/eslint-plugin': + specifier: ^6.0.0 + version: 6.0.0(@typescript-eslint/parser@6.0.0)(eslint@8.42.0)(typescript@5.1.3) + '@typescript-eslint/parser': + specifier: ^6.0.0 + version: 6.0.0(eslint@8.42.0)(typescript@5.1.3) + commitizen: + specifier: ^4.3.0 + version: 4.3.0(@types/node@20.3.1)(typescript@5.1.3) + cz-conventional-changelog: + specifier: ^3.3.0 + version: 3.3.0(@types/node@20.3.1)(typescript@5.1.3) + eslint: + specifier: ^8.42.0 + version: 8.42.0 + eslint-config-prettier: + specifier: ^9.0.0 + version: 9.0.0(eslint@8.42.0) + eslint-plugin-prettier: + specifier: ^5.0.0 + version: 5.0.0(eslint-config-prettier@9.0.0)(eslint@8.42.0)(prettier@3.0.0) + husky: + specifier: ^9.0.11 + version: 9.0.11 + jest: + specifier: ^29.5.0 + version: 29.5.0(@types/node@20.3.1)(ts-node@10.9.1) + pactum: + specifier: ^3.6.3 + version: 3.6.3 + pactum-matchers: + specifier: ^1.1.6 + version: 1.1.6 + prettier: + specifier: ^3.0.0 + version: 3.0.0 + prisma: + specifier: ^5.10.2 + version: 5.10.2 + source-map-support: + specifier: ^0.5.21 + version: 0.5.21 + standard-version: + specifier: ^9.5.0 + version: 9.5.0 + supertest: + specifier: ^6.3.3 + version: 6.3.3 + ts-jest: + specifier: ^29.1.0 + version: 29.1.0(@babel/core@7.23.9)(jest@29.5.0)(typescript@5.1.3) + ts-loader: + specifier: ^9.4.3 + version: 9.4.3(typescript@5.1.3)(webpack@5.90.1) + ts-node: + specifier: ^10.9.1 + version: 10.9.1(@types/node@20.3.1)(typescript@5.1.3) + tsconfig-paths: + specifier: ^4.2.0 + version: 4.2.0 + typescript: + specifier: ^5.1.3 + version: 5.1.3 + +packages: + + '@aashutoshrathi/word-wrap@1.2.6': + resolution: {integrity: sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==} + engines: {node: '>=0.10.0'} + + '@ampproject/remapping@2.2.1': + resolution: {integrity: sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==} + engines: {node: '>=6.0.0'} + + '@angular-devkit/core@13.3.11': + resolution: {integrity: sha512-rfqoLMRYhlz0wzKlHx7FfyIyQq8dKTsmbCoIVU1cEIH0gyTMVY7PbVzwRRcO6xp5waY+0hA+0Brriujpuhkm4w==} + engines: {node: ^12.20.0 || ^14.15.0 || >=16.10.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: '>= 1.13.0'} + peerDependencies: + chokidar: ^3.5.2 + peerDependenciesMeta: + chokidar: + optional: true + + '@angular-devkit/core@16.1.0': + resolution: {integrity: sha512-mrWpuDvttmhrCGcLc68RIXKtTzUhkBTsE5ZZFZNO1+FSC+vO/ZpyCpPd6C+6coM68NfXYjHlms5XF6KbxeGn/Q==} + engines: {node: ^16.14.0 || >=18.10.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: '>= 1.13.0'} + peerDependencies: + chokidar: ^3.5.2 + peerDependenciesMeta: + chokidar: + optional: true + + '@angular-devkit/schematics-cli@16.1.0': + resolution: {integrity: sha512-siBpRDmMMV7NB+NvaDHeJ4doHoSkFwIywwFj8GXnBCtobyxrBl1EyG1cKK+FHRydYtyYIk8FEoOpJA9oE9S2hg==} + engines: {node: ^16.14.0 || >=18.10.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: '>= 1.13.0'} + hasBin: true + + '@angular-devkit/schematics@13.3.11': + resolution: {integrity: sha512-ben+EGXpCrClnIVAAnEQmhQdKmnnqFhMp5BqMxgOslSYBAmCutLA6rBu5vsc8kZcGian1wt+lueF7G1Uk5cGBg==} + engines: {node: ^12.20.0 || ^14.15.0 || >=16.10.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: '>= 1.13.0'} + + '@angular-devkit/schematics@16.1.0': + resolution: {integrity: sha512-LM35PH9DT3eQRSZgrkk2bx1ZQjjVh8BCByTlr37/c+FnF9mNbeBsa1YkxrlsN/CwO+045OwEwRHnkM9Zcx0U/A==} + engines: {node: ^16.14.0 || >=18.10.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: '>= 1.13.0'} + + '@apidevtools/json-schema-ref-parser@11.5.4': + resolution: {integrity: sha512-o2fsypTGU0WxRxbax8zQoHiIB4dyrkwYfcm8TxZ+bx9pCzcWZbQtiMqpgBvWA/nJ2TrGjK5adCLfTH8wUeU/Wg==} + engines: {node: '>= 16'} + + '@arr/every@1.0.1': + resolution: {integrity: sha512-UQFQ6SgyJ6LX42W8rHCs8KVc0JS0tzVL9ct4XYedJukskYVWTo49tNiMEK9C2HTyarbNiT/RVIRSY82vH+6sTg==} + engines: {node: '>=4'} + + '@babel/code-frame@7.23.5': + resolution: {integrity: sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA==} + engines: {node: '>=6.9.0'} + + '@babel/compat-data@7.23.5': + resolution: {integrity: sha512-uU27kfDRlhfKl+w1U6vp16IuvSLtjAxdArVXPa9BvLkrr7CYIsxH5adpHObeAGY/41+syctUWOZ140a2Rvkgjw==} + engines: {node: '>=6.9.0'} + + '@babel/core@7.23.9': + resolution: {integrity: sha512-5q0175NOjddqpvvzU+kDiSOAk4PfdO6FvwCWoQ6RO7rTzEe8vlo+4HVfcnAREhD4npMs0e9uZypjTwzZPCf/cw==} + engines: {node: '>=6.9.0'} + + '@babel/generator@7.23.6': + resolution: {integrity: sha512-qrSfCYxYQB5owCmGLbl8XRpX1ytXlpueOb0N0UmQwA073KZxejgQTzAmJezxvpwQD9uGtK2shHdi55QT+MbjIw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-compilation-targets@7.23.6': + resolution: {integrity: sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ==} + engines: {node: '>=6.9.0'} + + '@babel/helper-environment-visitor@7.22.20': + resolution: {integrity: sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==} + engines: {node: '>=6.9.0'} + + '@babel/helper-function-name@7.23.0': + resolution: {integrity: sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-hoist-variables@7.22.5': + resolution: {integrity: sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-module-imports@7.22.15': + resolution: {integrity: sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==} + engines: {node: '>=6.9.0'} + + '@babel/helper-module-transforms@7.23.3': + resolution: {integrity: sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/helper-plugin-utils@7.22.5': + resolution: {integrity: sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==} + engines: {node: '>=6.9.0'} + + '@babel/helper-simple-access@7.22.5': + resolution: {integrity: sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==} + engines: {node: '>=6.9.0'} + + '@babel/helper-split-export-declaration@7.22.6': + resolution: {integrity: sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==} + engines: {node: '>=6.9.0'} + + '@babel/helper-string-parser@7.23.4': + resolution: {integrity: sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ==} + engines: {node: '>=6.9.0'} + + '@babel/helper-validator-identifier@7.22.20': + resolution: {integrity: sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==} + engines: {node: '>=6.9.0'} + + '@babel/helper-validator-option@7.23.5': + resolution: {integrity: sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw==} + engines: {node: '>=6.9.0'} + + '@babel/helpers@7.23.9': + resolution: {integrity: sha512-87ICKgU5t5SzOT7sBMfCOZQ2rHjRU+Pcb9BoILMYz600W6DkVRLFBPwQ18gwUVvggqXivaUakpnxWQGbpywbBQ==} + engines: {node: '>=6.9.0'} + + '@babel/highlight@7.23.4': + resolution: {integrity: sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A==} + engines: {node: '>=6.9.0'} + + '@babel/parser@7.23.9': + resolution: {integrity: sha512-9tcKgqKbs3xGJ+NtKF2ndOBBLVwPjl1SHxPQkd36r3Dlirw3xWUeGaTbqr7uGZcTaxkVNwc+03SVP7aCdWrTlA==} + engines: {node: '>=6.0.0'} + hasBin: true + + '@babel/plugin-syntax-async-generators@7.8.4': + resolution: {integrity: sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-bigint@7.8.3': + resolution: {integrity: sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-class-properties@7.12.13': + resolution: {integrity: sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-import-meta@7.10.4': + resolution: {integrity: sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-json-strings@7.8.3': + resolution: {integrity: sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-jsx@7.23.3': + resolution: {integrity: sha512-EB2MELswq55OHUoRZLGg/zC7QWUKfNLpE57m/S2yr1uEneIgsTgrSzXP3NXEsMkVn76OlaVVnzN+ugObuYGwhg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-logical-assignment-operators@7.10.4': + resolution: {integrity: sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-nullish-coalescing-operator@7.8.3': + resolution: {integrity: sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-numeric-separator@7.10.4': + resolution: {integrity: sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-object-rest-spread@7.8.3': + resolution: {integrity: sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-optional-catch-binding@7.8.3': + resolution: {integrity: sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-optional-chaining@7.8.3': + resolution: {integrity: sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-top-level-await@7.14.5': + resolution: {integrity: sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-typescript@7.23.3': + resolution: {integrity: sha512-9EiNjVJOMwCO+43TqoTrgQ8jMwcAd0sWyXi9RPfIsLTj4R2MADDDQXELhffaUx/uJv2AYcxBgPwH6j4TIA4ytQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/template@7.23.9': + resolution: {integrity: sha512-+xrD2BWLpvHKNmX2QbpdpsBaWnRxahMwJjO+KZk2JOElj5nSmKezyS1B4u+QbHMTX69t4ukm6hh9lsYQ7GHCKA==} + engines: {node: '>=6.9.0'} + + '@babel/traverse@7.23.9': + resolution: {integrity: sha512-I/4UJ9vs90OkBtY6iiiTORVMyIhJ4kAVmsKo9KFc8UOxMeUfi2hvtIBsET5u9GizXE6/GFSuKCTNfgCswuEjRg==} + engines: {node: '>=6.9.0'} + + '@babel/types@7.23.9': + resolution: {integrity: sha512-dQjSq/7HaSjRM43FFGnv5keM2HsxpmyV1PfaSVm0nzzjwwTmjOe6J4bC8e3+pTEIgHaHj+1ZlLThRJ2auc/w1Q==} + engines: {node: '>=6.9.0'} + + '@bcoe/v8-coverage@0.2.3': + resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==} + + '@chax-at/transactional-prisma-testing@1.1.0': + resolution: {integrity: sha512-BT2KRg2mfHbjW3gb3u5RtXjwvodywA8uvOX5Szm2J6KotgYJ/vRnCJ8LKp+kb/dbHhnPIrOCTtj6AY1Xku8Wng==} + engines: {node: '>= 14'} + peerDependencies: + '@prisma/client': ^4.7.0 || 5 + + '@colors/colors@1.5.0': + resolution: {integrity: sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==} + engines: {node: '>=0.1.90'} + + '@commitlint/cli@19.2.0': + resolution: {integrity: sha512-8XnQDMyQR+1/ldbmIyhonvnDS2enEw48Wompo/967fsEvy9Vj5/JbDutzmSBKxANWDVeEbR9QQm0yHpw6ArrFw==} + engines: {node: '>=v18'} + hasBin: true + + '@commitlint/config-angular-type-enum@19.1.0': + resolution: {integrity: sha512-eLjt7vSArP62kpDmmIZNdIBjPzbqY8jss6mVOcSDm4t1KfDw4UmPrtPh/7zcIL3GI5uf/7W8d2s3K0qisf9C+g==} + engines: {node: '>=v18'} + + '@commitlint/config-angular@19.1.0': + resolution: {integrity: sha512-qZyG9FHjPoG+VaHxH1OruWI8cmWWRe00sAS73jXAhACimT74k4Dex5jI2cKFcXSH8Ebh1yGwxfjzSgup5O0ykA==} + engines: {node: '>=v18'} + + '@commitlint/config-validator@19.0.3': + resolution: {integrity: sha512-2D3r4PKjoo59zBc2auodrSCaUnCSALCx54yveOFwwP/i2kfEAQrygwOleFWswLqK0UL/F9r07MFi5ev2ohyM4Q==} + engines: {node: '>=v18'} + + '@commitlint/ensure@19.0.3': + resolution: {integrity: sha512-SZEpa/VvBLoT+EFZVb91YWbmaZ/9rPH3ESrINOl0HD2kMYsjvl0tF7nMHh0EpTcv4+gTtZBAe1y/SS6/OhfZzQ==} + engines: {node: '>=v18'} + + '@commitlint/execute-rule@19.0.0': + resolution: {integrity: sha512-mtsdpY1qyWgAO/iOK0L6gSGeR7GFcdW7tIjcNFxcWkfLDF5qVbPHKuGATFqRMsxcO8OUKNj0+3WOHB7EHm4Jdw==} + engines: {node: '>=v18'} + + '@commitlint/format@19.0.3': + resolution: {integrity: sha512-QjjyGyoiVWzx1f5xOteKHNLFyhyweVifMgopozSgx1fGNrGV8+wp7k6n1t6StHdJ6maQJ+UUtO2TcEiBFRyR6Q==} + engines: {node: '>=v18'} + + '@commitlint/is-ignored@19.0.3': + resolution: {integrity: sha512-MqDrxJaRSVSzCbPsV6iOKG/Lt52Y+PVwFVexqImmYYFhe51iVJjK2hRhOG2jUAGiUHk4jpdFr0cZPzcBkSzXDQ==} + engines: {node: '>=v18'} + + '@commitlint/lint@19.1.0': + resolution: {integrity: sha512-ESjaBmL/9cxm+eePyEr6SFlBUIYlYpI80n+Ltm7IA3MAcrmiP05UMhJdAD66sO8jvo8O4xdGn/1Mt2G5VzfZKw==} + engines: {node: '>=v18'} + + '@commitlint/load@19.2.0': + resolution: {integrity: sha512-XvxxLJTKqZojCxaBQ7u92qQLFMMZc4+p9qrIq/9kJDy8DOrEa7P1yx7Tjdc2u2JxIalqT4KOGraVgCE7eCYJyQ==} + engines: {node: '>=v18'} + + '@commitlint/message@19.0.0': + resolution: {integrity: sha512-c9czf6lU+9oF9gVVa2lmKaOARJvt4soRsVmbR7Njwp9FpbBgste5i7l/2l5o8MmbwGh4yE1snfnsy2qyA2r/Fw==} + engines: {node: '>=v18'} + + '@commitlint/parse@19.0.3': + resolution: {integrity: sha512-Il+tNyOb8VDxN3P6XoBBwWJtKKGzHlitEuXA5BP6ir/3loWlsSqDr5aecl6hZcC/spjq4pHqNh0qPlfeWu38QA==} + engines: {node: '>=v18'} + + '@commitlint/read@19.2.0': + resolution: {integrity: sha512-HlGeEd/jyp2a5Fb9mvtsaDm5hFCmj80dJYjLQkpG3DzWneWBc37YU3kM8Za1D1HUazZaTkdsWq73M3XDE4CvCA==} + engines: {node: '>=v18'} + + '@commitlint/resolve-extends@19.1.0': + resolution: {integrity: sha512-z2riI+8G3CET5CPgXJPlzftH+RiWYLMYv4C9tSLdLXdr6pBNimSKukYP9MS27ejmscqCTVA4almdLh0ODD2KYg==} + engines: {node: '>=v18'} + + '@commitlint/rules@19.0.3': + resolution: {integrity: sha512-TspKb9VB6svklxNCKKwxhELn7qhtY1rFF8ls58DcFd0F97XoG07xugPjjbVnLqmMkRjZDbDIwBKt9bddOfLaPw==} + engines: {node: '>=v18'} + + '@commitlint/to-lines@19.0.0': + resolution: {integrity: sha512-vkxWo+VQU5wFhiP9Ub9Sre0FYe019JxFikrALVoD5UGa8/t3yOJEpEhxC5xKiENKKhUkTpEItMTRAjHw2SCpZw==} + engines: {node: '>=v18'} + + '@commitlint/top-level@19.0.0': + resolution: {integrity: sha512-KKjShd6u1aMGNkCkaX4aG1jOGdn7f8ZI8TR1VEuNqUOjWTOdcDSsmglinglJ18JTjuBX5I1PtjrhQCRcixRVFQ==} + engines: {node: '>=v18'} + + '@commitlint/types@19.0.3': + resolution: {integrity: sha512-tpyc+7i6bPG9mvaBbtKUeghfyZSDgWquIDfMgqYtTbmZ9Y9VzEm2je9EYcQ0aoz5o7NvGS+rcDec93yO08MHYA==} + engines: {node: '>=v18'} + + '@cspotcode/source-map-support@0.8.1': + resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==} + engines: {node: '>=12'} + + '@eslint-community/eslint-utils@4.4.0': + resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 + + '@eslint-community/regexpp@4.10.0': + resolution: {integrity: sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==} + engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} + + '@eslint/eslintrc@2.1.4': + resolution: {integrity: sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + '@eslint/js@8.42.0': + resolution: {integrity: sha512-6SWlXpWU5AvId8Ac7zjzmIOqMOba/JWY8XZ4A7q7Gn1Vlfg/SFFIlrtHXt9nPn4op9ZPAkl91Jao+QQv3r/ukw==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + '@exodus/schemasafe@1.3.0': + resolution: {integrity: sha512-5Aap/GaRupgNx/feGBwLLTVv8OQFfv3pq2lPRzPg9R+IOBnDgghTGW7l7EuVXOvg5cc/xSAlRW8rBrjIC3Nvqw==} + + '@fastify/accept-negotiator@1.1.0': + resolution: {integrity: sha512-OIHZrb2ImZ7XG85HXOONLcJWGosv7sIvM2ifAPQVhg9Lv7qdmMBNVaai4QTdyuaqbKM5eO6sLSQOYI7wEQeCJQ==} + engines: {node: '>=14'} + + '@fastify/ajv-compiler@3.5.0': + resolution: {integrity: sha512-ebbEtlI7dxXF5ziNdr05mOY8NnDiPB1XvAlLHctRt/Rc+C3LCOVW5imUVX+mhvUhnNzmPBHewUkOFgGlCxgdAA==} + + '@fastify/compress@7.0.0': + resolution: {integrity: sha512-jo/NaBVHP1OXIf8Kmr3bZyYQB0gAIgcy5c8rRKTPjhklHO7lRs/6ZFckUVT0NtbKSvrTuIcmSkxYpjyv3FNHXA==} + + '@fastify/cookie@9.3.1': + resolution: {integrity: sha512-h1NAEhB266+ZbZ0e9qUE6NnNR07i7DnNXWG9VbbZ8uC6O/hxHpl+Zoe5sw1yfdZ2U6XhToUGDnzQtWJdCaPwfg==} + + '@fastify/cors@9.0.1': + resolution: {integrity: sha512-YY9Ho3ovI+QHIL2hW+9X4XqQjXLjJqsU+sMV/xFsxZkE8p3GNnYVFpoOxF7SsP5ZL76gwvbo3V9L+FIekBGU4Q==} + + '@fastify/error@3.4.1': + resolution: {integrity: sha512-wWSvph+29GR783IhmvdwWnN4bUxTD01Vm5Xad4i7i1VuAOItLvbPAb69sb0IQ2N57yprvhNIwAP5B6xfKTmjmQ==} + + '@fastify/fast-json-stringify-compiler@4.3.0': + resolution: {integrity: sha512-aZAXGYo6m22Fk1zZzEUKBvut/CIIQe/BapEORnxiD5Qr0kPHqqI69NtEMCme74h+at72sPhbkb4ZrLd1W3KRLA==} + + '@fastify/formbody@7.4.0': + resolution: {integrity: sha512-H3C6h1GN56/SMrZS8N2vCT2cZr7mIHzBHzOBa5OPpjfB/D6FzP9mMpE02ZzrFX0ANeh0BAJdoXKOF2e7IbV+Og==} + + '@fastify/helmet@11.1.1': + resolution: {integrity: sha512-pjJxjk6SLEimITWadtYIXt6wBMfFC1I6OQyH/jYVCqSAn36sgAIFjeNiibHtifjCd+e25442pObis3Rjtame6A==} + + '@fastify/merge-json-schemas@0.1.1': + resolution: {integrity: sha512-fERDVz7topgNjtXsJTTW1JKLy0rhuLRcquYqNR9rF7OcVpCa2OVW49ZPDIhaRRCaUuvVxI+N416xUoF76HNSXA==} + + '@fastify/middie@8.3.0': + resolution: {integrity: sha512-h+zBxCzMlkEkh4fM7pZaSGzqS7P9M0Z6rXnWPdUEPfe7x1BCj++wEk/pQ5jpyYY4pF8AknFqb77n7uwh8HdxEA==} + + '@fastify/send@2.1.0': + resolution: {integrity: sha512-yNYiY6sDkexoJR0D8IDy3aRP3+L4wdqCpvx5WP+VtEU58sn7USmKynBzDQex5X42Zzvw2gNzzYgP90UfWShLFA==} + + '@fastify/static@6.12.0': + resolution: {integrity: sha512-KK1B84E6QD/FcQWxDI2aiUCwHxMJBI1KeCUzm1BwYpPY1b742+jeKruGHP2uOluuM6OkBPI8CIANrXcCRtC2oQ==} + + '@gar/promisify@1.1.3': + resolution: {integrity: sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw==} + + '@golevelup/nestjs-modules@0.6.1': + resolution: {integrity: sha512-E0STg8In8fhIivnGDJAA70+XLPHzK5bMTkCnif9FbZ8waTYDQ3T/QQL0h73k+CUFeznn1hmuEW14sNaE+8cd7w==} + peerDependencies: + '@nestjs/common': ^9.x + rxjs: ^7.x + + '@gulp-sourcemaps/map-sources@1.0.0': + resolution: {integrity: sha512-o/EatdaGt8+x2qpb0vFLC/2Gug/xYPRXb6a+ET1wGYKozKN3krDWC/zZFZAtrzxJHuDL12mwdfEFKcKMNvc55A==} + engines: {node: '>= 0.10'} + + '@humanwhocodes/config-array@0.11.14': + resolution: {integrity: sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==} + engines: {node: '>=10.10.0'} + + '@humanwhocodes/module-importer@1.0.1': + resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} + engines: {node: '>=12.22'} + + '@humanwhocodes/object-schema@2.0.2': + resolution: {integrity: sha512-6EwiSjwWYP7pTckG6I5eyFANjPhmPjUX9JRLUSfNPC7FX7zK9gyZAfUEaECL6ALTpGX5AjnBq3C9XmVWPitNpw==} + + '@hutson/parse-repository-url@3.0.2': + resolution: {integrity: sha512-H9XAx3hc0BQHY6l+IFSWHDySypcXsvsuLhgYLUGywmJ5pswRVQJUHpOsobnLYp2ZUaUlKiKDrgWWhosOwAEM8Q==} + engines: {node: '>=6.9.0'} + + '@isaacs/cliui@8.0.2': + resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} + engines: {node: '>=12'} + + '@istanbuljs/load-nyc-config@1.1.0': + resolution: {integrity: sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==} + engines: {node: '>=8'} + + '@istanbuljs/schema@0.1.3': + resolution: {integrity: sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==} + engines: {node: '>=8'} + + '@jest/console@29.7.0': + resolution: {integrity: sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + '@jest/core@29.7.0': + resolution: {integrity: sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + + '@jest/environment@29.7.0': + resolution: {integrity: sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + '@jest/expect-utils@29.7.0': + resolution: {integrity: sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + '@jest/expect@29.7.0': + resolution: {integrity: sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + '@jest/fake-timers@29.7.0': + resolution: {integrity: sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + '@jest/globals@29.7.0': + resolution: {integrity: sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + '@jest/reporters@29.7.0': + resolution: {integrity: sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + + '@jest/schemas@29.6.3': + resolution: {integrity: sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + '@jest/source-map@29.6.3': + resolution: {integrity: sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + '@jest/test-result@29.7.0': + resolution: {integrity: sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + '@jest/test-sequencer@29.7.0': + resolution: {integrity: sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + '@jest/transform@29.7.0': + resolution: {integrity: sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + '@jest/types@29.6.3': + resolution: {integrity: sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + '@jridgewell/gen-mapping@0.3.3': + resolution: {integrity: sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==} + engines: {node: '>=6.0.0'} + + '@jridgewell/resolve-uri@3.1.1': + resolution: {integrity: sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==} + engines: {node: '>=6.0.0'} + + '@jridgewell/set-array@1.1.2': + resolution: {integrity: sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==} + engines: {node: '>=6.0.0'} + + '@jridgewell/source-map@0.3.5': + resolution: {integrity: sha512-UTYAUj/wviwdsMfzoSJspJxbkH5o1snzwX0//0ENX1u/55kkZZkcTZP6u9bwKGkv+dkk9at4m1Cpt0uY80kcpQ==} + + '@jridgewell/sourcemap-codec@1.4.15': + resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} + + '@jridgewell/trace-mapping@0.3.22': + resolution: {integrity: sha512-Wf963MzWtA2sjrNt+g18IAln9lKnlRp+K2eH4jjIoF1wYeq3aMREpG09xhlhdzS0EjwU7qmUJYangWa+151vZw==} + + '@jridgewell/trace-mapping@0.3.9': + resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==} + + '@jsdevtools/ono@7.1.3': + resolution: {integrity: sha512-4JQNk+3mVzK3xh2rqd6RB4J46qUR19azEHBneZyTZM+c456qOrbbM/5xcR8huNCCcbVt7+UmizG6GuUvPvKUYg==} + + '@lukeed/csprng@1.1.0': + resolution: {integrity: sha512-Z7C/xXCiGWsg0KuKsHTKJxbWhpI3Vs5GwLfOean7MGyVFGqdRgBbAjOCh6u4bbjPc/8MJ2pZmK/0DLdCbivLDA==} + engines: {node: '>=8'} + + '@lukeed/ms@2.0.2': + resolution: {integrity: sha512-9I2Zn6+NJLfaGoz9jN3lpwDgAYvfGeNYdbAIjJOqzs4Tpc+VU3Jqq4IofSUBKajiDS8k9fZIg18/z13mpk1bsA==} + engines: {node: '>=8'} + + '@mapbox/node-pre-gyp@1.0.11': + resolution: {integrity: sha512-Yhlar6v9WQgUp/He7BdgzOz8lqMQ8sU+jkCq7Wx8Myc5YFJLbEe7lgui/V7G1qB1DJykHSGwreceSaD60Y0PUQ==} + hasBin: true + + '@microsoft/tsdoc@0.14.2': + resolution: {integrity: sha512-9b8mPpKrfeGRuhFH5iO1iwCLeIIsV6+H1sRfxbkoGXIyQE2BTsPd9zqSqQJ+pv5sJ/hT5M1zvOFL02MnEezFug==} + + '@nestjs-cls/transactional-adapter-prisma@1.1.0': + resolution: {integrity: sha512-iTwt0uN+GTQOM9ZkSnbznWhPmKG10UDetVzZ3MZMdKZMRpkAZUnp5ClrmFUo3e37hUO/EYdfzi/g7wesO9owug==} + engines: {node: '>=18'} + peerDependencies: + '@nestjs-cls/transactional': ^2.2.0 + '@prisma/client': '> 4 < 6' + nestjs-cls: ^4.2.0 + prisma: '> 4 < 6' + + '@nestjs-cls/transactional@2.2.0': + resolution: {integrity: sha512-O3wWCiVjeOPLGPs/sPcAUhSe/xaNx8JuzBtGg4IqnVrZfbjDzeADtlHIO8YkYhHYAVbqvVtGFbfFjL5tDUGWsA==} + engines: {node: '>=16'} + peerDependencies: + '@nestjs/common': '> 7.0.0 < 11' + '@nestjs/core': '> 7.0.0 < 11' + nestjs-cls: ^4.2.0 + reflect-metadata: '*' + rxjs: '>= 7' + + '@nestjs/cache-manager@2.2.0': + resolution: {integrity: sha512-hAcX1f5moiK7B8KnPZVfV/up4nrZnaeN6w0o3M+UzNJNlw6bsIH6bn7jpGqzySAWPD9iYE/rg5IxTe1vSWyWZg==} + peerDependencies: + '@nestjs/common': ^9.0.0 || ^10.0.0 + '@nestjs/core': ^9.0.0 || ^10.0.0 + cache-manager: <=5 + reflect-metadata: ^0.1.12 + rxjs: ^7.0.0 + + '@nestjs/cli@10.0.0': + resolution: {integrity: sha512-14pju3ejAAUpFe1iK99v/b7Bw96phBMV58GXTSm3TcdgaI4O7UTLXTbMiUNyU+LGr/1CPIfThcWqFyKhDIC9VQ==} + engines: {node: '>= 16'} + hasBin: true + peerDependencies: + '@swc/cli': ^0.1.62 + '@swc/core': ^1.3.62 + peerDependenciesMeta: + '@swc/cli': + optional: true + '@swc/core': + optional: true + + '@nestjs/common@10.0.0': + resolution: {integrity: sha512-Fa2GDQJrO5TTTcpISWfm0pdPS62V+8YbxeG5CA01zMUI+dCO3v3oFf+BSjqCGUUo7GDNzDsjAejwGXuqA54RPw==} + peerDependencies: + class-transformer: '*' + class-validator: '*' + reflect-metadata: ^0.1.12 + rxjs: ^7.1.0 + peerDependenciesMeta: + class-transformer: + optional: true + class-validator: + optional: true + + '@nestjs/common@9.4.0': + resolution: {integrity: sha512-RUcVAQsEF4WPrmzFXEOUfZnPwrLTe1UVlzXTlSyfqfqbdWDPKDGlIPVelBLfc5/+RRUQ0I5iE4+CQvpCmkqldw==} + peerDependencies: + cache-manager: <=5 + class-transformer: '*' + class-validator: '*' + reflect-metadata: ^0.1.12 + rxjs: ^7.1.0 + peerDependenciesMeta: + cache-manager: + optional: true + class-transformer: + optional: true + class-validator: + optional: true + + '@nestjs/config@3.1.1': + resolution: {integrity: sha512-qu5QlNiJdqQtOsnB6lx4JCXPQ96jkKUsOGd+JXfXwqJqZcOSAq6heNFg0opW4pq4J/VZoNwoo87TNnx9wthnqQ==} + peerDependencies: + '@nestjs/common': ^8.0.0 || ^9.0.0 || ^10.0.0 + reflect-metadata: ^0.1.13 + + '@nestjs/core@10.0.0': + resolution: {integrity: sha512-HFTdj4vsF+2qOaq97ZPRDle6Q/KyL5lmMah0/ZR0ie+e1/tnlvmlqw589xFACTemLJFFOjZMy763v+icO9u72w==} + peerDependencies: + '@nestjs/common': ^10.0.0 + '@nestjs/microservices': ^10.0.0 + '@nestjs/platform-express': ^10.0.0 + '@nestjs/websockets': ^10.0.0 + reflect-metadata: ^0.1.12 + rxjs: ^7.1.0 + peerDependenciesMeta: + '@nestjs/microservices': + optional: true + '@nestjs/platform-express': + optional: true + '@nestjs/websockets': + optional: true + + '@nestjs/event-emitter@2.0.3': + resolution: {integrity: sha512-Pt7KAERrgK0OjvarSI3wfVhwZ8X1iLq1lXuodyRe+Zx3aLLP7fraFUHirASbFkB6KIQ1Zj+gZ1g8a9eu4GfFhw==} + peerDependencies: + '@nestjs/common': ^8.0.0 || ^9.0.0 || ^10.0.0 + '@nestjs/core': ^8.0.0 || ^9.0.0 || ^10.0.0 + reflect-metadata: ^0.1.12 + + '@nestjs/jwt@10.2.0': + resolution: {integrity: sha512-x8cG90SURkEiLOehNaN2aRlotxT0KZESUliOPKKnjWiyJOcWurkF3w345WOX0P4MgFzUjGoZ1Sy0aZnxeihT0g==} + peerDependencies: + '@nestjs/common': ^8.0.0 || ^9.0.0 || ^10.0.0 + + '@nestjs/mapped-types@2.0.5': + resolution: {integrity: sha512-bSJv4pd6EY99NX9CjBIyn4TVDoSit82DUZlL4I3bqNfy5Gt+gXTa86i3I/i0iIV9P4hntcGM5GyO+FhZAhxtyg==} + peerDependencies: + '@nestjs/common': ^8.0.0 || ^9.0.0 || ^10.0.0 + class-transformer: ^0.4.0 || ^0.5.0 + class-validator: ^0.13.0 || ^0.14.0 + reflect-metadata: ^0.1.12 || ^0.2.0 + peerDependenciesMeta: + class-transformer: + optional: true + class-validator: + optional: true + + '@nestjs/passport@10.0.3': + resolution: {integrity: sha512-znJ9Y4S8ZDVY+j4doWAJ8EuuVO7SkQN3yOBmzxbGaXbvcSwFDAdGJ+OMCg52NdzIO4tQoN4pYKx8W6M0ArfFRQ==} + peerDependencies: + '@nestjs/common': ^8.0.0 || ^9.0.0 || ^10.0.0 + passport: ^0.4.0 || ^0.5.0 || ^0.6.0 || ^0.7.0 + + '@nestjs/platform-fastify@10.3.4': + resolution: {integrity: sha512-rYoAdJ1ybBXPwO+KutWJ4siaqGDdMzwXS4ggJ5soQgD4maN2p1rvKE31MzERd1MqYXWprFIESFHuxkiHMZV6kg==} + peerDependencies: + '@fastify/static': ^6.0.0 || ^7.0.0 + '@fastify/view': ^7.0.0 || ^8.0.0 + '@nestjs/common': ^10.0.0 + '@nestjs/core': ^10.0.0 + peerDependenciesMeta: + '@fastify/static': + optional: true + '@fastify/view': + optional: true + + '@nestjs/schematics@10.0.0': + resolution: {integrity: sha512-gfUy/N1m1paN33BXq4d7HoCM+zM4rFxYjqAb8jkrBfBHiwyEhHHozfX/aRy/kOnAcy/VP8v4Zs4HKKrbRRlHnw==} + peerDependencies: + typescript: '>=4.8.2' + + '@nestjs/swagger@7.3.0': + resolution: {integrity: sha512-zLkfKZ+ioYsIZ3dfv7Bj8YHnZMNAGWFUmx2ZDuLp/fBE4P8BSjB7hldzDueFXsmwaPL90v7lgyd82P+s7KME1Q==} + 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 + class-transformer: '*' + class-validator: '*' + reflect-metadata: ^0.1.12 || ^0.2.0 + peerDependenciesMeta: + '@fastify/static': + optional: true + class-transformer: + optional: true + class-validator: + optional: true + + '@nestjs/testing@10.0.0': + resolution: {integrity: sha512-U5q3+svkddpdSk51ZFCEnFpQuWxAwE4ahsX77FrqqCAYidr7HUtL/BHYOVzI5H9vUH6BvJxMbfo3tiUXQl/2aA==} + peerDependencies: + '@nestjs/common': ^10.0.0 + '@nestjs/core': ^10.0.0 + '@nestjs/microservices': ^10.0.0 + '@nestjs/platform-express': ^10.0.0 + peerDependenciesMeta: + '@nestjs/microservices': + optional: true + '@nestjs/platform-express': + optional: true + + '@nestjs/testing@9.4.0': + resolution: {integrity: sha512-xZWp363P4otcebg++gSjUcdCfTK0RorORzyFq3aLaSAQOlq8kxfFDRIKzEATR4aOUfqTMMsAA8lhnMJWf35N6A==} + peerDependencies: + '@nestjs/common': ^9.0.0 + '@nestjs/core': ^9.0.0 + '@nestjs/microservices': ^9.0.0 + '@nestjs/platform-express': ^9.0.0 + peerDependenciesMeta: + '@nestjs/microservices': + optional: true + '@nestjs/platform-express': + optional: true + + '@nodelib/fs.scandir@2.1.5': + resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} + engines: {node: '>= 8'} + + '@nodelib/fs.stat@2.0.5': + resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} + engines: {node: '>= 8'} + + '@nodelib/fs.walk@1.2.8': + resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} + engines: {node: '>= 8'} + + '@nodeteam/nestjs-prisma-pagination@1.0.6': + resolution: {integrity: sha512-ZTTXIlbnphmtBt4xFlFfV7an5e2EvmC/P4nj7s0nbSgq8bYovjMAbGxlmBh/shxfVaQeYCl78SoSnYWOjIQMCA==} + + '@npmcli/fs@2.1.2': + resolution: {integrity: sha512-yOJKRvohFOaLqipNtwYB9WugyZKhC/DZC4VYPmpaCzDBrA8YpK3qHZ8/HGscMnE4GqbkLNuVcCnxkeQEdGt6LQ==} + engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + + '@npmcli/move-file@2.0.1': + resolution: {integrity: sha512-mJd2Z5TjYWq/ttPLLGqArdtnC74J6bOzg4rMDnN+p1xTacZ2yPRCk2y0oSWQtygLR9YVQXgOcONrwtnk3JupxQ==} + engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + deprecated: This functionality has been moved to @npmcli/fs + + '@nuxtjs/opencollective@0.3.2': + resolution: {integrity: sha512-um0xL3fO7Mf4fDxcqx9KryrB7zgRM5JSlvGN5AGkP6JLM5XEKyjeAiPbNxdXVXQ16isuAhYpvP88NgL2BGd6aA==} + engines: {node: '>=8.0.0', npm: '>=5.0.0'} + hasBin: true + + '@open-draft/deferred-promise@2.2.0': + resolution: {integrity: sha512-CecwLWx3rhxVQF6V4bAgPS5t+So2sTbPgAzafKkVizyi7tlwpcFpdFqq+wqF2OwNBmqFuu6tOyouTuxgpMfzmA==} + + '@pkgjs/parseargs@0.11.0': + resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} + engines: {node: '>=14'} + + '@pkgr/core@0.1.1': + resolution: {integrity: sha512-cq8o4cWH0ibXh9VGi5P20Tu9XF/0fFXl9EUinr9QfTM7a7p0oTA4iJRCQWppXR1Pg8dSM0UCItCkPwsk9qWWYA==} + engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} + + '@polka/url@0.5.0': + resolution: {integrity: sha512-oZLYFEAzUKyi3SKnXvj32ZCEGH6RDnao7COuCVhDydMS9NrCSVXhM79VaKyP5+Zc33m0QXEd2DN3UkU7OsHcfw==} + + '@pond918/prisma-generator-nestjs-dto@1.17.513': + resolution: {integrity: sha512-wq/GSVeVuD8kSm1Q6mC2T1MjNkyhn4wtD+N62Zp4XwV4hbxVNXUgLQsBn1lex8Yhd9DqHlVAawyTwKhLt6xBqg==} + engines: {node: '>=14'} + hasBin: true + + '@prisma/client@5.10.2': + resolution: {integrity: sha512-ef49hzB2yJZCvM5gFHMxSFL9KYrIP9udpT5rYo0CsHD4P9IKj473MbhU1gjKKftiwWBTIyrt9jukprzZXazyag==} + engines: {node: '>=16.13'} + peerDependencies: + prisma: '*' + peerDependenciesMeta: + prisma: + optional: true + + '@prisma/debug@4.16.2': + resolution: {integrity: sha512-7L7WbG0qNNZYgLpsVB8rCHCXEyHFyIycRlRDNwkVfjQmACC2OW6AWCYCbfdjQhkF/t7+S3njj8wAWAocSs+Brw==} + + '@prisma/debug@5.10.2': + resolution: {integrity: sha512-bkBOmH9dpEBbMKFJj8V+Zp8IZHIBjy3fSyhLhxj4FmKGb/UBSt9doyfA6k1UeUREsMJft7xgPYBbHSOYBr8XCA==} + + '@prisma/engines-version@5.10.0-34.5a9203d0590c951969e85a7d07215503f4672eb9': + resolution: {integrity: sha512-uCy/++3Jx/O3ufM+qv2H1L4tOemTNqcP/gyEVOlZqTpBvYJUe0tWtW0y3o2Ueq04mll4aM5X3f6ugQftOSLdFQ==} + + '@prisma/engines@5.10.2': + resolution: {integrity: sha512-HkSJvix6PW8YqEEt3zHfCYYJY69CXsNdhU+wna+4Y7EZ+AwzeupMnUThmvaDA7uqswiHkgm5/SZ6/4CStjaGmw==} + + '@prisma/fetch-engine@5.10.2': + resolution: {integrity: sha512-dSmXcqSt6DpTmMaLQ9K8ZKzVAMH3qwGCmYEZr/uVnzVhxRJ1EbT/w2MMwIdBNq1zT69Rvh0h75WMIi0mrIw7Hg==} + + '@prisma/generator-helper@4.16.2': + resolution: {integrity: sha512-bMOH7y73Ui7gpQrioFeavMQA+Tf8ksaVf8Nhs9rQNzuSg8SSV6E9baczob0L5KGZTSgYoqnrRxuo03kVJYrnIg==} + + '@prisma/get-platform@5.10.2': + resolution: {integrity: sha512-nqXP6vHiY2PIsebBAuDeWiUYg8h8mfjBckHh6Jezuwej0QJNnjDiOq30uesmg+JXxGk99nqyG3B7wpcOODzXvg==} + + '@schematics/angular@13.3.11': + resolution: {integrity: sha512-imKBnKYEse0SBVELZO/753nkpt3eEgpjrYkB+AFWF9YfO/4RGnYXDHoH8CFkzxPH9QQCgNrmsVFNiYGS+P/S1A==} + engines: {node: ^12.20.0 || ^14.15.0 || >=16.10.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: '>= 1.13.0'} + + '@sinclair/typebox@0.27.8': + resolution: {integrity: sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==} + + '@sinonjs/commons@3.0.1': + resolution: {integrity: sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==} + + '@sinonjs/fake-timers@10.3.0': + resolution: {integrity: sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==} + + '@tootallnate/once@2.0.0': + resolution: {integrity: sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==} + engines: {node: '>= 10'} + + '@tsconfig/node10@1.0.9': + resolution: {integrity: sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==} + + '@tsconfig/node12@1.0.11': + resolution: {integrity: sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==} + + '@tsconfig/node14@1.0.3': + resolution: {integrity: sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==} + + '@tsconfig/node16@1.0.4': + resolution: {integrity: sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==} + + '@types/babel__core@7.20.5': + resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==} + + '@types/babel__generator@7.6.8': + resolution: {integrity: sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==} + + '@types/babel__template@7.4.4': + resolution: {integrity: sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==} + + '@types/babel__traverse@7.20.5': + resolution: {integrity: sha512-WXCyOcRtH37HAUkpXhUduaxdm82b4GSlyTqajXviN4EfiuPgNYR109xMCKvpl6zPIpua0DGlMEDCq+g8EdoheQ==} + + '@types/bcrypt@5.0.2': + resolution: {integrity: sha512-6atioO8Y75fNcbmj0G7UjI9lXN2pQ/IGJ2FWT4a/btd0Lk9lQalHLKhkgKVZ3r+spnmWUKfbMi1GEe9wyHQfNQ==} + + '@types/body-parser@1.19.5': + resolution: {integrity: sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==} + + '@types/connect@3.4.38': + resolution: {integrity: sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==} + + '@types/conventional-commits-parser@5.0.0': + resolution: {integrity: sha512-loB369iXNmAZglwWATL+WRe+CRMmmBPtpolYzIebFaX4YA3x+BEfLqhUAV9WanycKI3TG1IMr5bMJDajDKLlUQ==} + + '@types/cookiejar@2.1.5': + resolution: {integrity: sha512-he+DHOWReW0nghN24E1WUqM0efK4kI9oTqDm6XmK8ZPe2djZ90BSNdGnIyCLzCPw7/pogPlGbzI2wHGGmi4O/Q==} + + '@types/cross-spawn@6.0.2': + resolution: {integrity: sha512-KuwNhp3eza+Rhu8IFI5HUXRP0LIhqH5cAjubUvGXXthh4YYBuP2ntwEX+Cz8GJoZUHlKo247wPWOfA9LYEq4cw==} + + '@types/debug@4.1.8': + resolution: {integrity: sha512-/vPO1EPOs306Cvhwv7KfVfYvOJqA/S/AXjaHQiJboCZzcNDb+TIJFN9/2C9DZ//ijSKWioNyUxD792QmDJ+HKQ==} + + '@types/dot@1.1.7': + resolution: {integrity: sha512-RhMcnI18Y+401Nceh2pW5gTGgsdfZdvg9g0P/5HIBJ0jmZEv5KlkYvfQiHhw4/Vnb8NdePi/4UCs92ITExLxuQ==} + + '@types/eslint-scope@3.7.7': + resolution: {integrity: sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==} + + '@types/eslint@8.56.2': + resolution: {integrity: sha512-uQDwm1wFHmbBbCZCqAlq6Do9LYwByNZHWzXppSnay9SuwJ+VRbjkbLABer54kcPnMSlG6Fdiy2yaFXm/z9Z5gw==} + + '@types/estree@1.0.5': + resolution: {integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==} + + '@types/express-serve-static-core@4.17.43': + resolution: {integrity: sha512-oaYtiBirUOPQGSWNGPWnzyAFJ0BP3cwvN4oWZQY+zUBwpVIGsKUkpBpSztp74drYcjavs7SKFZ4DX1V2QeN8rg==} + + '@types/express@4.17.17': + resolution: {integrity: sha512-Q4FmmuLGBG58btUnfS1c1r/NQdlp3DMfGDGig8WhfpA2YRUtEkxAjkZb0yvplJGYdF1fsQ81iMDcH24sSCNC/Q==} + + '@types/graceful-fs@4.1.9': + resolution: {integrity: sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==} + + '@types/http-errors@2.0.4': + resolution: {integrity: sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA==} + + '@types/istanbul-lib-coverage@2.0.6': + resolution: {integrity: sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==} + + '@types/istanbul-lib-report@3.0.3': + resolution: {integrity: sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==} + + '@types/istanbul-reports@3.0.4': + resolution: {integrity: sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==} + + '@types/jest@29.5.2': + resolution: {integrity: sha512-mSoZVJF5YzGVCk+FsDxzDuH7s+SCkzrgKZzf0Z0T2WudhBUPoF6ktoTPC4R0ZoCPCV5xUvuU6ias5NvxcBcMMg==} + + '@types/json-schema@7.0.15': + resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} + + '@types/jsonwebtoken@9.0.5': + resolution: {integrity: sha512-VRLSGzik+Unrup6BsouBeHsf4d1hOEgYWTm/7Nmw1sXoN1+tRly/Gy/po3yeahnP4jfnQWWAhQAqcNfH7ngOkA==} + + '@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/mime@3.0.4': + resolution: {integrity: sha512-iJt33IQnVRkqeqC7PzBHPTC6fDlRNRW8vjrgqtScAhrmMwe8c4Eo7+fUGTa+XdWrpEgpyKWMYmi2dIwMAYRzPw==} + + '@types/minimist@1.2.5': + resolution: {integrity: sha512-hov8bUuiLiyFPGyFPE1lwWhmzYbirOXQNNo40+y3zow8aFVTeyn3VWL0VFFfdNddA8S4Vf0Tc062rzyNr7Paag==} + + '@types/ms@0.7.34': + resolution: {integrity: sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g==} + + '@types/node@20.3.1': + resolution: {integrity: sha512-EhcH/wvidPy1WeML3TtYFGR83UzjxeWRen9V402T8aUGYsCHOmfoisV3ZSg03gAFIbLq8TnWOJ0f4cALtnSEUg==} + + '@types/normalize-package-data@2.4.4': + resolution: {integrity: sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==} + + '@types/parse-json@4.0.2': + resolution: {integrity: sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==} + + '@types/passport-jwt@4.0.1': + resolution: {integrity: sha512-Y0Ykz6nWP4jpxgEUYq8NoVZeCQPo1ZndJLfapI249g1jHChvRfZRO/LS3tqu26YgAS/laI1qx98sYGz0IalRXQ==} + + '@types/passport-local@1.0.38': + resolution: {integrity: sha512-nsrW4A963lYE7lNTv9cr5WmiUD1ibYJvWrpE13oxApFsRt77b0RdtZvKbCdNIY4v/QZ6TRQWaDDEwV1kCTmcXg==} + + '@types/passport-strategy@0.2.38': + resolution: {integrity: sha512-GC6eMqqojOooq993Tmnmp7AUTbbQSgilyvpCYQjT+H6JfG/g6RGc7nXEniZlp0zyKJ0WUdOiZWLBZft9Yug1uA==} + + '@types/passport@1.0.16': + resolution: {integrity: sha512-FD0qD5hbPWQzaM0wHUnJ/T0BBCJBxCeemtnCwc/ThhTg3x9jfrAcRUmj5Dopza+MfFS9acTe3wk7rcVnRIp/0A==} + + '@types/qs@6.9.11': + resolution: {integrity: sha512-oGk0gmhnEJK4Yyk+oI7EfXsLayXatCWPHary1MtcmbAifkobT9cM9yutG/hZKIseOU0MqbIwQ/u2nn/Gb+ltuQ==} + + '@types/range-parser@1.2.7': + resolution: {integrity: sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==} + + '@types/semver@7.5.6': + resolution: {integrity: sha512-dn1l8LaMea/IjDoHNd9J52uBbInB796CDffS6VdIxvqYCPSG0V0DzHp76GpaWnlhg88uYyPbXCDIowa86ybd5A==} + + '@types/send@0.17.4': + resolution: {integrity: sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==} + + '@types/serve-static@1.15.5': + resolution: {integrity: sha512-PDRk21MnK70hja/YF8AHfC7yIsiQHn1rcXx7ijCFBX/k+XQJhQT/gw3xekXKJvx+5SXaMMS8oqQy09Mzvz2TuQ==} + + '@types/stack-utils@2.0.3': + resolution: {integrity: sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==} + + '@types/superagent@8.1.3': + resolution: {integrity: sha512-R/CfN6w2XsixLb1Ii8INfn+BT9sGPvw74OavfkW4SwY+jeUcAwLZv2+bXLJkndnimxjEBm0RPHgcjW9pLCa8cw==} + + '@types/supertest@6.0.0': + resolution: {integrity: sha512-j3/Z2avY+H3yn+xp/ef//QyqqE+dg3rWh14Ewi/QZs6uVK+oOs7lFRXtjp2YHAqHJZ4OFGNmCxZO5vd7AuG/Dg==} + + '@types/validator@13.11.9': + resolution: {integrity: sha512-FCTsikRozryfayPuiI46QzH3fnrOoctTjvOYZkho9BTFLCOZ2rgZJHMOVgCOfttjPJcgOx52EpkY0CMfy87MIw==} + + '@types/yargs-parser@21.0.3': + resolution: {integrity: sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==} + + '@types/yargs@17.0.32': + resolution: {integrity: sha512-xQ67Yc/laOG5uMfX/093MRlGGCIBzZMarVa+gfNKJxWAIgykYpVGkBdbqEzGDDfCrVUj6Hiff4mTZ5BA6TmAog==} + + '@typescript-eslint/eslint-plugin@6.0.0': + resolution: {integrity: sha512-xuv6ghKGoiq856Bww/yVYnXGsKa588kY3M0XK7uUW/3fJNNULKRfZfSBkMTSpqGG/8ZCXCadfh8G/z/B4aqS/A==} + engines: {node: ^16.0.0 || >=18.0.0} + peerDependencies: + '@typescript-eslint/parser': ^6.0.0 || ^6.0.0-alpha + eslint: ^7.0.0 || ^8.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@typescript-eslint/parser@6.0.0': + resolution: {integrity: sha512-TNaufYSPrr1U8n+3xN+Yp9g31vQDJqhXzzPSHfQDLcaO4tU+mCfODPxCwf4H530zo7aUBE3QIdxCXamEnG04Tg==} + engines: {node: ^16.0.0 || >=18.0.0} + peerDependencies: + eslint: ^7.0.0 || ^8.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@typescript-eslint/scope-manager@6.0.0': + resolution: {integrity: sha512-o4q0KHlgCZTqjuaZ25nw5W57NeykZT9LiMEG4do/ovwvOcPnDO1BI5BQdCsUkjxFyrCL0cSzLjvIMfR9uo7cWg==} + engines: {node: ^16.0.0 || >=18.0.0} + + '@typescript-eslint/type-utils@6.0.0': + resolution: {integrity: sha512-ah6LJvLgkoZ/pyJ9GAdFkzeuMZ8goV6BH7eC9FPmojrnX9yNCIsfjB+zYcnex28YO3RFvBkV6rMV6WpIqkPvoQ==} + engines: {node: ^16.0.0 || >=18.0.0} + peerDependencies: + eslint: ^7.0.0 || ^8.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@typescript-eslint/types@6.0.0': + resolution: {integrity: sha512-Zk9KDggyZM6tj0AJWYYKgF0yQyrcnievdhG0g5FqyU3Y2DRxJn4yWY21sJC0QKBckbsdKKjYDV2yVrrEvuTgxg==} + engines: {node: ^16.0.0 || >=18.0.0} + + '@typescript-eslint/typescript-estree@6.0.0': + resolution: {integrity: sha512-2zq4O7P6YCQADfmJ5OTDQTP3ktajnXIRrYAtHM9ofto/CJZV3QfJ89GEaM2BNGeSr1KgmBuLhEkz5FBkS2RQhQ==} + engines: {node: ^16.0.0 || >=18.0.0} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@typescript-eslint/utils@6.0.0': + resolution: {integrity: sha512-SOr6l4NB6HE4H/ktz0JVVWNXqCJTOo/mHnvIte1ZhBQ0Cvd04x5uKZa3zT6tiodL06zf5xxdK8COiDvPnQ27JQ==} + engines: {node: ^16.0.0 || >=18.0.0} + peerDependencies: + eslint: ^7.0.0 || ^8.0.0 + + '@typescript-eslint/visitor-keys@6.0.0': + resolution: {integrity: sha512-cvJ63l8c0yXdeT5POHpL0Q1cZoRcmRKFCtSjNGJxPkcP571EfZMcNbzWAc7oK3D1dRzm/V5EwtkANTZxqvuuUA==} + engines: {node: ^16.0.0 || >=18.0.0} + + '@webassemblyjs/ast@1.11.6': + resolution: {integrity: sha512-IN1xI7PwOvLPgjcf180gC1bqn3q/QaOCwYUahIOhbYUu8KA/3tw2RT/T0Gidi1l7Hhj5D/INhJxiICObqpMu4Q==} + + '@webassemblyjs/floating-point-hex-parser@1.11.6': + resolution: {integrity: sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==} + + '@webassemblyjs/helper-api-error@1.11.6': + resolution: {integrity: sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==} + + '@webassemblyjs/helper-buffer@1.11.6': + resolution: {integrity: sha512-z3nFzdcp1mb8nEOFFk8DrYLpHvhKC3grJD2ardfKOzmbmJvEf/tPIqCY+sNcwZIY8ZD7IkB2l7/pqhUhqm7hLA==} + + '@webassemblyjs/helper-numbers@1.11.6': + resolution: {integrity: sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==} + + '@webassemblyjs/helper-wasm-bytecode@1.11.6': + resolution: {integrity: sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==} + + '@webassemblyjs/helper-wasm-section@1.11.6': + resolution: {integrity: sha512-LPpZbSOwTpEC2cgn4hTydySy1Ke+XEu+ETXuoyvuyezHO3Kjdu90KK95Sh9xTbmjrCsUwvWwCOQQNta37VrS9g==} + + '@webassemblyjs/ieee754@1.11.6': + resolution: {integrity: sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==} + + '@webassemblyjs/leb128@1.11.6': + resolution: {integrity: sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==} + + '@webassemblyjs/utf8@1.11.6': + resolution: {integrity: sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==} + + '@webassemblyjs/wasm-edit@1.11.6': + resolution: {integrity: sha512-Ybn2I6fnfIGuCR+Faaz7YcvtBKxvoLV3Lebn1tM4o/IAJzmi9AWYIPWpyBfU8cC+JxAO57bk4+zdsTjJR+VTOw==} + + '@webassemblyjs/wasm-gen@1.11.6': + resolution: {integrity: sha512-3XOqkZP/y6B4F0PBAXvI1/bky7GryoogUtfwExeP/v7Nzwo1QLcq5oQmpKlftZLbT+ERUOAZVQjuNVak6UXjPA==} + + '@webassemblyjs/wasm-opt@1.11.6': + resolution: {integrity: sha512-cOrKuLRE7PCe6AsOVl7WasYf3wbSo4CeOk6PkrjS7g57MFfVUF9u6ysQBBODX0LdgSvQqRiGz3CXvIDKcPNy4g==} + + '@webassemblyjs/wasm-parser@1.11.6': + resolution: {integrity: sha512-6ZwPeGzMJM3Dqp3hCsLgESxBGtT/OeCvCZ4TA1JUPYgmhAx38tTPR9JaKy0S5H3evQpO/h2uWs2j6Yc/fjkpTQ==} + + '@webassemblyjs/wast-printer@1.11.6': + resolution: {integrity: sha512-JM7AhRcE+yW2GWYaKeHL5vt4xqee5N2WcezptmgyhNS+ScggqcT1OtXykhAb13Sn5Yas0j2uv9tHgrjwvzAP4A==} + + '@xtuc/ieee754@1.2.0': + resolution: {integrity: sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==} + + '@xtuc/long@4.2.2': + resolution: {integrity: sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==} + + JSONStream@1.3.5: + resolution: {integrity: sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==} + hasBin: true + + abbrev@1.1.1: + resolution: {integrity: sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==} + + abort-controller@3.0.0: + resolution: {integrity: sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==} + engines: {node: '>=6.5'} + + abstract-logging@2.0.1: + resolution: {integrity: sha512-2BjRTZxTPvheOvGbBslFSYOUkr+SjPtOnrLP33f+VIWLzezQpZcqVg7ja3L4dBXmzzgwT+a029jRx5PCi3JuiA==} + + acorn-import-assertions@1.9.0: + resolution: {integrity: sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==} + peerDependencies: + acorn: ^8 + + acorn-jsx@5.3.2: + resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} + peerDependencies: + acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + + acorn-walk@8.3.2: + resolution: {integrity: sha512-cjkyv4OtNCIeqhHrfS81QWXoCBPExR/J62oyEqepVw8WaQeSqpW2uhuLPh1m9eWhDuOo/jUXVTlifvesOWp/4A==} + engines: {node: '>=0.4.0'} + + acorn@4.0.13: + resolution: {integrity: sha512-fu2ygVGuMmlzG8ZeRJ0bvR41nsAkxxhbyk8bZ1SS521Z7vmgJFTQQlfz/Mp/nJexGBz+v8sC9bM6+lNgskt4Ug==} + engines: {node: '>=0.4.0'} + hasBin: true + + acorn@8.11.3: + resolution: {integrity: sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==} + engines: {node: '>=0.4.0'} + hasBin: true + + add-stream@1.0.0: + resolution: {integrity: sha512-qQLMr+8o0WC4FZGQTcJiKBVC59JylcPSrTtk6usvmIDFUOCKegapy1VHQwRbFMOFyb/inzUVqHs+eMYKDM1YeQ==} + + agent-base@6.0.2: + resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==} + engines: {node: '>= 6.0.0'} + + agentkeepalive@4.5.0: + resolution: {integrity: sha512-5GG/5IbQQpC9FpkRGsSvZI5QYeSCzlJHdpBQntCsuTOxhKD8lqKhrleg2Yi7yvMIf82Ycmmqln9U8V9qwEiJew==} + engines: {node: '>= 8.0.0'} + + aggregate-error@3.1.0: + resolution: {integrity: sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==} + engines: {node: '>=8'} + + ajv-formats@2.1.1: + resolution: {integrity: sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==} + peerDependencies: + ajv: ^8.0.0 + peerDependenciesMeta: + ajv: + optional: true + + ajv-keywords@3.5.2: + resolution: {integrity: sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==} + peerDependencies: + ajv: ^6.9.1 + + ajv@6.12.6: + resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} + + ajv@8.12.0: + resolution: {integrity: sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==} + + ajv@8.9.0: + resolution: {integrity: sha512-qOKJyNj/h+OWx7s5DePL6Zu1KeM9jPZhwBqs+7DzP6bGOvqzVCSf0xueYmVuaC/oQ/VtS2zLMLHdQFbkka+XDQ==} + + ansi-colors@4.1.3: + resolution: {integrity: sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==} + engines: {node: '>=6'} + + ansi-escapes@4.3.2: + resolution: {integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==} + engines: {node: '>=8'} + + ansi-regex@2.1.1: + resolution: {integrity: sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==} + engines: {node: '>=0.10.0'} + + ansi-regex@5.0.1: + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} + engines: {node: '>=8'} + + ansi-regex@6.0.1: + resolution: {integrity: sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==} + engines: {node: '>=12'} + + ansi-styles@2.2.1: + resolution: {integrity: sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==} + engines: {node: '>=0.10.0'} + + ansi-styles@3.2.1: + resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} + engines: {node: '>=4'} + + ansi-styles@4.3.0: + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + engines: {node: '>=8'} + + ansi-styles@5.2.0: + resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==} + engines: {node: '>=10'} + + ansi-styles@6.2.1: + resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} + engines: {node: '>=12'} + + anymatch@3.1.3: + resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} + engines: {node: '>= 8'} + + aproba@2.0.0: + resolution: {integrity: sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==} + + archy@1.0.0: + resolution: {integrity: sha512-Xg+9RwCg/0p32teKdGMPTPnVXKD0w3DfHnFTficozsAgsvq2XenPJq/MYpzzQ/v8zrOyJn6Ds39VA4JIDwFfqw==} + + are-we-there-yet@2.0.0: + resolution: {integrity: sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==} + engines: {node: '>=10'} + + are-we-there-yet@3.0.1: + resolution: {integrity: sha512-QZW4EDmGwlYur0Yyf/b2uGucHQMa8aFUP7eu9ddR73vvhFyt4V0Vl3QHPcTNJ8l6qYOBdxgXdnBXQrHilfRQBg==} + engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + + arg@4.1.3: + resolution: {integrity: sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==} + + argparse@1.0.10: + resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} + + argparse@2.0.1: + resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + + arr-diff@2.0.0: + resolution: {integrity: sha512-dtXTVMkh6VkEEA7OhXnN1Ecb8aAGFdZ1LFxtOCoqj4qkyOJMt7+qs6Ahdy6p/NQCPYsRSXXivhSB/J5E9jmYKA==} + engines: {node: '>=0.10.0'} + + arr-flatten@1.1.0: + resolution: {integrity: sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==} + engines: {node: '>=0.10.0'} + + array-ify@1.0.0: + resolution: {integrity: sha512-c5AMf34bKdvPhQ7tBGhqkgKNUzMr4WUs+WDtC2ZUGOUncbxKMTvqxYctiseW3+L4bA8ec+GcZ6/A/FW4m8ukng==} + + array-timsort@1.0.3: + resolution: {integrity: sha512-/+3GRL7dDAGEfM6TseQk/U+mi18TU2Ms9I3UlLdUMhz2hbvGNTKdj9xniwXfUqgYhHxRx0+8UnKkvlNwVU+cWQ==} + + array-union@2.1.0: + resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} + engines: {node: '>=8'} + + array-unique@0.2.1: + resolution: {integrity: sha512-G2n5bG5fSUCpnsXz4+8FUkYsGPkNfLn9YvS66U5qbTIXI2Ynnlo4Bi42bWv+omKUCqz+ejzfClwne0alJWJPhg==} + engines: {node: '>=0.10.0'} + + arrify@1.0.1: + resolution: {integrity: sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==} + engines: {node: '>=0.10.0'} + + asap@2.0.6: + resolution: {integrity: sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==} + + async@3.2.5: + resolution: {integrity: sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg==} + + asynckit@0.4.0: + resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} + + at-least-node@1.0.0: + resolution: {integrity: sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==} + engines: {node: '>= 4.0.0'} + + atob@2.1.2: + resolution: {integrity: sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==} + engines: {node: '>= 4.5.0'} + hasBin: true + + atomic-sleep@1.0.0: + resolution: {integrity: sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ==} + engines: {node: '>=8.0.0'} + + avvio@8.3.0: + resolution: {integrity: sha512-VBVH0jubFr9LdFASy/vNtm5giTrnbVquWBhT0fyizuNK2rQ7e7ONU2plZQWUNqtE1EmxFEb+kbSkFRkstiaS9Q==} + + axios@1.6.7: + resolution: {integrity: sha512-/hDJGff6/c7u0hDkvkGxR/oy6CbCs8ziCsC7SqmhjfozqiJGc8Z11wrv9z9lYfY4K8l+H9TpjcMDX0xOZmx+RA==} + + babel-jest@29.7.0: + resolution: {integrity: sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + peerDependencies: + '@babel/core': ^7.8.0 + + babel-plugin-istanbul@6.1.1: + resolution: {integrity: sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==} + engines: {node: '>=8'} + + babel-plugin-jest-hoist@29.6.3: + resolution: {integrity: sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + babel-preset-current-node-syntax@1.0.1: + resolution: {integrity: sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==} + peerDependencies: + '@babel/core': ^7.0.0 + + babel-preset-jest@29.6.3: + resolution: {integrity: sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + peerDependencies: + '@babel/core': ^7.0.0 + + balanced-match@1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + + base64-js@1.5.1: + resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} + + bcrypt@5.1.1: + resolution: {integrity: sha512-AGBHOG5hPYZ5Xl9KXzU5iKq9516yEmvCKDg3ecP5kX2aB6UqTeXZxk2ELnDgDm6BQSMlLt9rDB4LoSMx0rYwww==} + engines: {node: '>= 10.0.0'} + + binary-extensions@2.2.0: + resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==} + engines: {node: '>=8'} + + bindings@1.5.0: + resolution: {integrity: sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==} + + bl@4.1.0: + resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==} + + brace-expansion@1.1.11: + resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} + + brace-expansion@2.0.1: + resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} + + braces@1.8.5: + resolution: {integrity: sha512-xU7bpz2ytJl1bH9cgIurjpg/n8Gohy9GTw81heDYLJQ4RU60dlyJsa+atVF2pI0yMMvKxI9HkKwjePCj5XI1hw==} + engines: {node: '>=0.10.0'} + + braces@3.0.2: + resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} + engines: {node: '>=8'} + + browserslist@4.22.3: + resolution: {integrity: sha512-UAp55yfwNv0klWNapjs/ktHoguxuQNGnOzxYmfnXIS+8AsRDZkSDxg7R1AX3GKzn078SBI5dzwzj/Yx0Or0e3A==} + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} + hasBin: true + + bs-logger@0.2.6: + resolution: {integrity: sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==} + engines: {node: '>= 6'} + + bser@2.1.1: + resolution: {integrity: sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==} + + buffer-equal-constant-time@1.0.1: + resolution: {integrity: sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==} + + buffer-from@1.1.2: + resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} + + buffer@5.7.1: + resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} + + buffer@6.0.3: + resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==} + + cacache@16.1.3: + resolution: {integrity: sha512-/+Emcj9DAXxX4cwlLmRI9c166RuL3w30zp4R7Joiv2cQTtTtA+jeuCAjH3ZlGnYS3tKENSrKhAzVVP9GVyzeYQ==} + engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + + cache-manager@5.4.0: + resolution: {integrity: sha512-FS7o8vqJosnLpu9rh2gQTo8EOzCRJLF1BJ4XDEUDMqcfvs7SJZs5iuoFTXLauzQ3S5v8sBAST1pCwMaurpyi1A==} + + cachedir@2.3.0: + resolution: {integrity: sha512-A+Fezp4zxnit6FanDmv9EqXNAi3vt9DWp51/71UEhXukb7QUuvtv9344h91dyAxuTLoSYJFU299qzR3tzwPAhw==} + engines: {node: '>=6'} + + call-bind@1.0.6: + resolution: {integrity: sha512-Mj50FLHtlsoVfRfnHaZvyrooHcrlceNZdL/QBvJJVd9Ta55qCQK0gs4ss2oZDeV9zFCs6ewzYgVE5yfVmfFpVg==} + engines: {node: '>= 0.4'} + + callsites@3.1.0: + resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} + engines: {node: '>=6'} + + camelcase-keys@6.2.2: + resolution: {integrity: sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==} + engines: {node: '>=8'} + + camelcase@2.1.1: + resolution: {integrity: sha512-DLIsRzJVBQu72meAKPkWQOLcujdXT32hwdfnkI1frSiSRMK1MofjKHf+MEx0SB6fjEFXL8fBDv1dKymBlOp4Qw==} + engines: {node: '>=0.10.0'} + + camelcase@3.0.0: + resolution: {integrity: sha512-4nhGqUkc4BqbBBB4Q6zLuD7lzzrHYrjKGeYaEji/3tFR5VdJu9v+LilhGIVe8wxEJPPOeWo7eg8dwY13TZ1BNg==} + engines: {node: '>=0.10.0'} + + camelcase@5.3.1: + resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==} + engines: {node: '>=6'} + + camelcase@6.3.0: + resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} + engines: {node: '>=10'} + + caniuse-lite@1.0.30001584: + resolution: {integrity: sha512-LOz7CCQ9M1G7OjJOF9/mzmqmj3jE/7VOmrfw6Mgs0E8cjOsbRXQJHsPBfmBOXDskXKrHLyyW3n7kpDW/4BsfpQ==} + + case@1.6.3: + resolution: {integrity: sha512-mzDSXIPaFwVDvZAHqZ9VlbyF4yyXRuX6IvB06WvPYkqJVO24kX1PPhv9bfpKNFZyxYFmmgo03HUiD8iklmJYRQ==} + engines: {node: '>= 0.8.0'} + + centra@2.6.0: + resolution: {integrity: sha512-dgh+YleemrT8u85QL11Z6tYhegAs3MMxsaWAq/oXeAmYJ7VxL3SI9TZtnfaEvNDMAPolj25FXIb3S+HCI4wQaQ==} + deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. + + chalk@1.1.3: + resolution: {integrity: sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==} + engines: {node: '>=0.10.0'} + + chalk@2.4.2: + resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} + engines: {node: '>=4'} + + chalk@4.1.2: + resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} + engines: {node: '>=10'} + + chalk@5.3.0: + resolution: {integrity: sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==} + engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} + + char-regex@1.0.2: + resolution: {integrity: sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==} + engines: {node: '>=10'} + + chardet@0.7.0: + resolution: {integrity: sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==} + + chokidar@3.5.3: + resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==} + engines: {node: '>= 8.10.0'} + + chownr@2.0.0: + resolution: {integrity: sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==} + engines: {node: '>=10'} + + chrome-trace-event@1.0.3: + resolution: {integrity: sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==} + engines: {node: '>=6.0'} + + ci-info@3.9.0: + resolution: {integrity: sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==} + engines: {node: '>=8'} + + cjs-module-lexer@1.2.3: + resolution: {integrity: sha512-0TNiGstbQmCFwt4akjjBg5pLRTSyj/PkWQ1ZoO2zntmg9yLqSRxwEa4iCfQLGjqhiqBfOJa7W/E8wfGrTDmlZQ==} + + class-transformer@0.5.1: + resolution: {integrity: sha512-SQa1Ws6hUbfC98vKGxZH3KFY0Y1lm5Zm0SY8XX9zbK7FJCyVEac3ATW0RIpwzW+oOfmHE5PMPufDG9hCfoEOMw==} + + class-validator@0.14.1: + resolution: {integrity: sha512-2VEG9JICxIqTpoK1eMzZqaV+u/EiwEJkMGzTrZf6sU/fwsnOITVgYJ8yojSy6CaXtO9V0Cc6ZQZ8h8m4UBuLwQ==} + + clean-stack@2.2.0: + resolution: {integrity: sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==} + engines: {node: '>=6'} + + cli-cursor@3.1.0: + resolution: {integrity: sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==} + engines: {node: '>=8'} + + cli-spinners@2.9.2: + resolution: {integrity: sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==} + engines: {node: '>=6'} + + cli-table3@0.6.3: + resolution: {integrity: sha512-w5Jac5SykAeZJKntOxJCrm63Eg5/4dhMWIcuTbo9rpE+brgaSZo0RuNJZeOyMgsUdhDeojvgyQLmjI+K50ZGyg==} + engines: {node: 10.* || >= 12.*} + + cli-width@3.0.0: + resolution: {integrity: sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==} + engines: {node: '>= 10'} + + cliui@3.2.0: + resolution: {integrity: sha512-0yayqDxWQbqk3ojkYqUKqaAQ6AfNKeKWRNA8kR0WXzAsdHpP4BIaOmMAG87JGuO6qcobyW4GjxHd9PmhEd+T9w==} + + cliui@7.0.4: + resolution: {integrity: sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==} + + cliui@8.0.1: + resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} + engines: {node: '>=12'} + + clone-stats@0.0.1: + resolution: {integrity: sha512-dhUqc57gSMCo6TX85FLfe51eC/s+Im2MLkAgJwfaRRexR2tA4dd3eLEW4L6efzHc2iNorrRRXITifnDLlRrhaA==} + + clone@1.0.4: + resolution: {integrity: sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==} + engines: {node: '>=0.8'} + + co@4.6.0: + resolution: {integrity: sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==} + engines: {iojs: '>= 1.0.0', node: '>= 0.12.0'} + + code-point-at@1.1.0: + resolution: {integrity: sha512-RpAVKQA5T63xEj6/giIbUEtZwJ4UFIc3ZtvEkiaUERylqe8xb5IvqcgOurZLahv93CLKfxcw5YI+DZcUBRyLXA==} + engines: {node: '>=0.10.0'} + + collect-v8-coverage@1.0.2: + resolution: {integrity: sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q==} + + color-convert@1.9.3: + resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} + + color-convert@2.0.1: + resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} + engines: {node: '>=7.0.0'} + + color-name@1.1.3: + resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} + + color-name@1.1.4: + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + + color-support@1.1.3: + resolution: {integrity: sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==} + hasBin: true + + 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'} + + commander@2.20.3: + resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} + + commander@4.1.1: + resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==} + engines: {node: '>= 6'} + + comment-json@4.2.3: + resolution: {integrity: sha512-SsxdiOf064DWoZLH799Ata6u7iV658A11PlWtZATDlXPpKGJnbJZ5Z24ybixAi+LUUqJ/GKowAejtC5GFUG7Tw==} + engines: {node: '>= 6'} + + commitizen@4.3.0: + resolution: {integrity: sha512-H0iNtClNEhT0fotHvGV3E9tDejDeS04sN1veIebsKYGMuGscFaswRoYJKmT3eW85eIJAs0F28bG2+a/9wCOfPw==} + engines: {node: '>= 12'} + hasBin: true + + compare-func@2.0.0: + resolution: {integrity: sha512-zHig5N+tPWARooBnb0Zx1MFcdfpyJrfTJ3Y5L+IFvUm8rM74hHz66z0gw0x4tijh5CorKkKUCnW82R2vmpeCRA==} + + component-emitter@1.3.1: + resolution: {integrity: sha512-T0+barUSQRTUQASh8bx02dl+DhF54GtIDY13Y3m9oWTklKbb3Wv974meRpeZ3lp1JpLVECWWNHC4vaG2XHXouQ==} + + concat-map@0.0.1: + resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + + concat-stream@1.5.1: + resolution: {integrity: sha512-eYF1Q4RxUUwq8ApyPD9ebWsYjVrJmTMLGzbGXv4qTZ5iP7FLm+oWN4x2XIzLEZ745xiwRM9DmIB0Ix1Nz8Epmg==} + 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==} + + console-control-strings@1.1.0: + resolution: {integrity: sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==} + + content-disposition@0.5.4: + resolution: {integrity: sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==} + engines: {node: '>= 0.6'} + + conventional-changelog-angular@5.0.13: + resolution: {integrity: sha512-i/gipMxs7s8L/QeuavPF2hLnJgH6pEZAttySB6aiQLWcX3puWDL3ACVmvBhJGxnAy52Qc15ua26BufY6KpmrVA==} + engines: {node: '>=10'} + + conventional-changelog-angular@7.0.0: + resolution: {integrity: sha512-ROjNchA9LgfNMTTFSIWPzebCwOGFdgkEq45EnvvrmSLvCtAw0HSmrCs7/ty+wAeYUZyNay0YMUNYFTRL72PkBQ==} + engines: {node: '>=16'} + + conventional-changelog-atom@2.0.8: + resolution: {integrity: sha512-xo6v46icsFTK3bb7dY/8m2qvc8sZemRgdqLb/bjpBsH2UyOS8rKNTgcb5025Hri6IpANPApbXMg15QLb1LJpBw==} + engines: {node: '>=10'} + + conventional-changelog-codemirror@2.0.8: + resolution: {integrity: sha512-z5DAsn3uj1Vfp7po3gpt2Boc+Bdwmw2++ZHa5Ak9k0UKsYAO5mH1UBTN0qSCuJZREIhX6WU4E1p3IW2oRCNzQw==} + engines: {node: '>=10'} + + conventional-changelog-config-spec@2.1.0: + resolution: {integrity: sha512-IpVePh16EbbB02V+UA+HQnnPIohgXvJRxHcS5+Uwk4AT5LjzCZJm5sp/yqs5C6KZJ1jMsV4paEV13BN1pvDuxQ==} + + conventional-changelog-conventionalcommits@4.6.3: + resolution: {integrity: sha512-LTTQV4fwOM4oLPad317V/QNQ1FY4Hju5qeBIM1uTHbrnCE+Eg4CdRZ3gO2pUeR+tzWdp80M2j3qFFEDWVqOV4g==} + engines: {node: '>=10'} + + conventional-changelog-core@4.2.4: + resolution: {integrity: sha512-gDVS+zVJHE2v4SLc6B0sLsPiloR0ygU7HaDW14aNJE1v4SlqJPILPl/aJC7YdtRE4CybBf8gDwObBvKha8Xlyg==} + engines: {node: '>=10'} + + conventional-changelog-ember@2.0.9: + resolution: {integrity: sha512-ulzIReoZEvZCBDhcNYfDIsLTHzYHc7awh+eI44ZtV5cx6LVxLlVtEmcO+2/kGIHGtw+qVabJYjdI5cJOQgXh1A==} + engines: {node: '>=10'} + + conventional-changelog-eslint@3.0.9: + resolution: {integrity: sha512-6NpUCMgU8qmWmyAMSZO5NrRd7rTgErjrm4VASam2u5jrZS0n38V7Y9CzTtLT2qwz5xEChDR4BduoWIr8TfwvXA==} + engines: {node: '>=10'} + + conventional-changelog-express@2.0.6: + resolution: {integrity: sha512-SDez2f3iVJw6V563O3pRtNwXtQaSmEfTCaTBPCqn0oG0mfkq0rX4hHBq5P7De2MncoRixrALj3u3oQsNK+Q0pQ==} + engines: {node: '>=10'} + + conventional-changelog-jquery@3.0.11: + resolution: {integrity: sha512-x8AWz5/Td55F7+o/9LQ6cQIPwrCjfJQ5Zmfqi8thwUEKHstEn4kTIofXub7plf1xvFA2TqhZlq7fy5OmV6BOMw==} + engines: {node: '>=10'} + + conventional-changelog-jshint@2.0.9: + resolution: {integrity: sha512-wMLdaIzq6TNnMHMy31hql02OEQ8nCQfExw1SE0hYL5KvU+JCTuPaDO+7JiogGT2gJAxiUGATdtYYfh+nT+6riA==} + engines: {node: '>=10'} + + conventional-changelog-preset-loader@2.3.4: + resolution: {integrity: sha512-GEKRWkrSAZeTq5+YjUZOYxdHq+ci4dNwHvpaBC3+ENalzFWuCWa9EZXSuZBpkr72sMdKB+1fyDV4takK1Lf58g==} + engines: {node: '>=10'} + + conventional-changelog-writer@5.0.1: + resolution: {integrity: sha512-5WsuKUfxW7suLblAbFnxAcrvf6r+0b7GvNaWUwUIk0bXMnENP/PEieGKVUQrjPqwPT4o3EPAASBXiY6iHooLOQ==} + engines: {node: '>=10'} + hasBin: true + + conventional-changelog@3.1.25: + resolution: {integrity: sha512-ryhi3fd1mKf3fSjbLXOfK2D06YwKNic1nC9mWqybBHdObPd8KJ2vjaXZfYj1U23t+V8T8n0d7gwnc9XbIdFbyQ==} + engines: {node: '>=10'} + + conventional-commit-types@3.0.0: + resolution: {integrity: sha512-SmmCYnOniSsAa9GqWOeLqc179lfr5TRu5b4QFDkbsrJ5TZjPJx85wtOr3zn+1dbeNiXDKGPbZ72IKbPhLXh/Lg==} + + conventional-commits-filter@2.0.7: + resolution: {integrity: sha512-ASS9SamOP4TbCClsRHxIHXRfcGCnIoQqkvAzCSbZzTFLfcTqJVugB0agRgsEELsqaeWgsXv513eS116wnlSSPA==} + engines: {node: '>=10'} + + conventional-commits-parser@3.2.4: + resolution: {integrity: sha512-nK7sAtfi+QXbxHCYfhpZsfRtaitZLIA6889kFIouLvz6repszQDgxBu7wf2WbU+Dco7sAnNCJYERCwt54WPC2Q==} + engines: {node: '>=10'} + hasBin: true + + conventional-commits-parser@5.0.0: + resolution: {integrity: sha512-ZPMl0ZJbw74iS9LuX9YIAiW8pfM5p3yh2o/NbXHbkFuZzY5jvdi5jFycEOkmBW5H5I7nA+D6f3UcsCLP2vvSEA==} + engines: {node: '>=16'} + hasBin: true + + conventional-recommended-bump@6.1.0: + resolution: {integrity: sha512-uiApbSiNGM/kkdL9GTOLAqC4hbptObFo4wW2QRyHsKciGAfQuLU1ShZ1BIVI/+K2BE/W1AWYQMCXAsv4dyKPaw==} + engines: {node: '>=10'} + hasBin: true + + convert-source-map@1.9.0: + resolution: {integrity: sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==} + + convert-source-map@2.0.0: + resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} + + cookie-signature@1.2.1: + resolution: {integrity: sha512-78KWk9T26NhzXtuL26cIJ8/qNHANyJ/ZYrmEXFzUmhZdjpBv+DlWlOANRTGBt48YcyslsLrj0bMLFTmXvLRCOw==} + engines: {node: '>=6.6.0'} + + cookie@0.6.0: + resolution: {integrity: sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==} + 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==} + + cosmiconfig-typescript-loader@5.0.0: + resolution: {integrity: sha512-+8cK7jRAReYkMwMiG+bxhcNKiHJDM6bR9FD/nGBXOWdMLuYawjF5cGrtLilJ+LGd3ZjCXnJjR5DkfWPoIVlqJA==} + engines: {node: '>=v16'} + peerDependencies: + '@types/node': '*' + cosmiconfig: '>=8.2' + typescript: '>=4' + + cosmiconfig@7.1.0: + resolution: {integrity: sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==} + engines: {node: '>=10'} + + cosmiconfig@9.0.0: + resolution: {integrity: sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==} + engines: {node: '>=14'} + peerDependencies: + typescript: '>=4.9.5' + peerDependenciesMeta: + typescript: + optional: true + + create-jest@29.7.0: + resolution: {integrity: sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + hasBin: true + + create-require@1.1.1: + resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==} + + cross-spawn@7.0.3: + resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} + engines: {node: '>= 8'} + + css@2.2.4: + resolution: {integrity: sha512-oUnjmWpy0niI3x/mPL8dVEI1l7MnG3+HHyRPHf+YFSbK+svOhXpmSOcDURUh2aOCgl2grzrOPt1nHLuCVFULLw==} + + cz-conventional-changelog@3.3.0: + resolution: {integrity: sha512-U466fIzU5U22eES5lTNiNbZ+d8dfcHcssH4o7QsdWaCcRs/feIPCxKYSWkYBNs5mny7MvEfwpTLWjvbm94hecw==} + engines: {node: '>= 10'} + + dargs@7.0.0: + resolution: {integrity: sha512-2iy1EkLdlBzQGvbweYRFxmFath8+K7+AKB0TlhHWkNuH+TmovaMH/Wp7V7R4u7f4SnX3OgLsU9t1NI9ioDnUpg==} + engines: {node: '>=8'} + + dargs@8.1.0: + resolution: {integrity: sha512-wAV9QHOsNbwnWdNW2FYvE1P56wtgSbM+3SZcdGiWQILwVjACCXDCI3Ai8QlCjMDB8YK5zySiXZYBiwGmNY3lnw==} + engines: {node: '>=12'} + + dateformat@3.0.3: + resolution: {integrity: sha512-jyCETtSl3VMZMWeRo7iY1FL19ges1t55hMo5yaam4Jrsm5EPL89UQkoQRyiI+Yf4k8r2ZpdngkV8hr1lIdjb3Q==} + + dateformat@4.6.3: + resolution: {integrity: sha512-2P0p0pFGzHS5EMnhdxQi7aJN+iMheud0UhG4dlE1DLAlvL8JHjJJTX/CSm4JXwV0Ka5nGk3zC5mcb5bUQUxxMA==} + + debug-fabulous@0.0.4: + resolution: {integrity: sha512-mmVKpY/O4UIl6ZDn5Owf8jEauO6uQiuF4Jz9iTuflSmvqNm6/64xARk/qCq5ZJxu141Ic2lCmL1TSMHIYoyiTw==} + + debug@2.6.9: + resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + debug@4.3.4: + resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + decamelize-keys@1.1.1: + resolution: {integrity: sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg==} + engines: {node: '>=0.10.0'} + + decamelize@1.2.0: + resolution: {integrity: sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==} + engines: {node: '>=0.10.0'} + + decode-uri-component@0.2.2: + resolution: {integrity: sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==} + engines: {node: '>=0.10'} + + dedent@0.7.0: + resolution: {integrity: sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==} + + dedent@1.5.1: + resolution: {integrity: sha512-+LxW+KLWxu3HW3M2w2ympwtqPrqYRzU8fqi6Fhd18fBALe15blJPI/I4+UHveMVG6lJqB4JNd4UG0S5cnVHwIg==} + peerDependencies: + babel-plugin-macros: ^3.1.0 + peerDependenciesMeta: + babel-plugin-macros: + optional: true + + deep-is@0.1.4: + resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} + + deep-override@1.0.2: + resolution: {integrity: sha512-+bAuLuYqaVVUWPaq8rmU8NLTX85p4I5k5/cVdhBioEfH7k+5NlGdv4NoJVQcJRByqzzTWWzTpih+pU1wBTmMow==} + + deepmerge@4.3.1: + resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} + engines: {node: '>=0.10.0'} + + defaults@1.0.4: + resolution: {integrity: sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==} + + define-data-property@1.1.2: + resolution: {integrity: sha512-SRtsSqsDbgpJBbW3pABMCOt6rQyeM8s8RiyeSN8jYG8sYmt/kGJejbydttUsnDs1tadr19tvhT4ShwMyoqAm4g==} + engines: {node: '>= 0.4'} + + delayed-stream@1.0.0: + resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} + engines: {node: '>=0.4.0'} + + delegates@1.0.0: + resolution: {integrity: sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==} + + depd@2.0.0: + resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} + engines: {node: '>= 0.8'} + + detect-file@1.0.0: + resolution: {integrity: sha512-DtCOLG98P007x7wiiOmfI0fi3eIKyWiLTGJ2MDnVi/E04lWGbf+JzrRHMm0rgIIZJGtHpKpbVgLWHrv8xXpc3Q==} + engines: {node: '>=0.10.0'} + + detect-indent@6.1.0: + resolution: {integrity: sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==} + engines: {node: '>=8'} + + detect-libc@2.0.2: + resolution: {integrity: sha512-UX6sGumvvqSaXgdKGUsgZWqcUyIXZ/vZTrlRT/iobiKhGL0zL4d3osHj3uqllWJK+i+sixDS/3COVEOFbupFyw==} + engines: {node: '>=8'} + + detect-newline@2.1.0: + resolution: {integrity: sha512-CwffZFvlJffUg9zZA0uqrjQayUTC8ob94pnr5sFwaVv3IOmkfUHcWH+jXaQK3askE51Cqe8/9Ql/0uXNwqZ8Zg==} + engines: {node: '>=0.10.0'} + + detect-newline@3.1.0: + resolution: {integrity: sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==} + engines: {node: '>=8'} + + dezalgo@1.0.4: + resolution: {integrity: sha512-rXSP0bf+5n0Qonsb+SVVfNfIsimO4HEtmnIpPHY8Q1UCzKlQrDMfdobr8nJOOsRgWCyMRqeSBQzmWUMq7zvVig==} + + diff-sequences@29.6.3: + resolution: {integrity: sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + diff@4.0.2: + resolution: {integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==} + 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'} + + dot-prop@5.3.0: + resolution: {integrity: sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==} + engines: {node: '>=8'} + + dot@1.1.3: + resolution: {integrity: sha512-/nt74Rm+PcfnirXGEdhZleTwGC2LMnuKTeeTIlI82xb5loBBoXNYzr2ezCroPSMtilK8EZIfcNZwOcHN+ib1Lg==} + engines: {'0': node >=0.2.6} + hasBin: true + + dotenv-expand@10.0.0: + resolution: {integrity: sha512-GopVGCpVS1UKH75VKHGuQFqS1Gusej0z4FyQkPdwjil2gNIv+LNsqBlboOzpJFZKVT95GkCyWJbBSdFEFUWI2A==} + engines: {node: '>=12'} + + dotenv@16.3.1: + resolution: {integrity: sha512-IPzF4w4/Rd94bA9imS68tZBaYyBWSCE47V1RGuMrB94iyTOIEwRmVL2x/4An+6mETpLrKJ5hQkB8W4kFAadeIQ==} + engines: {node: '>=12'} + + dotgitignore@2.1.0: + resolution: {integrity: sha512-sCm11ak2oY6DglEPpCB8TixLjWAxd3kJTs6UIcSasNYxXdFPV+YKlye92c8H4kKFqV5qYMIh7d+cYecEg0dIkA==} + engines: {node: '>=6'} + + duplexify@3.7.1: + resolution: {integrity: sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==} + + duplexify@4.1.2: + resolution: {integrity: sha512-fz3OjcNCHmRP12MJoZMPglx8m4rrFP8rovnk4vT8Fs+aonZoCwGg10dSsQsfP/E62eZcPTMSMP6686fu9Qlqtw==} + + eastasianwidth@0.2.0: + resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} + + ecdsa-sig-formatter@1.0.11: + resolution: {integrity: sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==} + + electron-to-chromium@1.4.659: + resolution: {integrity: sha512-sRJ3nV3HowrYpBtPF9bASQV7OW49IgZC01Xiq43WfSE3RTCkK0/JidoCmR73Hyc1mN+l/H4Yqx0eNiomvExFZg==} + + emittery@0.13.1: + resolution: {integrity: sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==} + engines: {node: '>=12'} + + emoji-regex@8.0.0: + resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + + emoji-regex@9.2.2: + resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} + + encoding@0.1.13: + resolution: {integrity: sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==} + + end-of-stream@1.4.4: + resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} + + enhanced-resolve@5.15.0: + resolution: {integrity: sha512-LXYT42KJ7lpIKECr2mAXIaMldcNCh/7E0KBKOu4KSfkHmP+mZmSs+8V5gBAqisWBy0OO4W5Oyys0GO1Y8KtdKg==} + engines: {node: '>=10.13.0'} + + env-paths@2.2.1: + resolution: {integrity: sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==} + engines: {node: '>=6'} + + err-code@2.0.3: + resolution: {integrity: sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==} + + error-ex@1.3.2: + resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} + + es-errors@1.3.0: + resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} + engines: {node: '>= 0.4'} + + es-module-lexer@1.4.1: + resolution: {integrity: sha512-cXLGjP0c4T3flZJKQSuziYoq7MlT+rnvfZjfp7h+I7K9BNX54kP9nyWvdbwjQ4u1iWbOL4u96fgeZLToQlZC7w==} + + escalade@3.1.2: + resolution: {integrity: sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==} + engines: {node: '>=6'} + + 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'} + + escape-string-regexp@4.0.0: + resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} + engines: {node: '>=10'} + + eslint-config-prettier@9.0.0: + resolution: {integrity: sha512-IcJsTkJae2S35pRsRAwoCE+925rJJStOdkKnLVgtE+tEpqU0EVVM7OqrwxqgptKdX29NUwC82I5pXsGFIgSevw==} + hasBin: true + peerDependencies: + eslint: '>=7.0.0' + + eslint-plugin-prettier@5.0.0: + resolution: {integrity: sha512-AgaZCVuYDXHUGxj/ZGu1u8H8CYgDY3iG6w5kUFw4AzMVXzB7VvbKgYR4nATIN+OvUrghMbiDLeimVjVY5ilq3w==} + engines: {node: ^14.18.0 || >=16.0.0} + peerDependencies: + '@types/eslint': '>=8.0.0' + eslint: '>=8.0.0' + eslint-config-prettier: '*' + prettier: '>=3.0.0' + peerDependenciesMeta: + '@types/eslint': + optional: true + eslint-config-prettier: + optional: true + + eslint-scope@5.1.1: + resolution: {integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==} + engines: {node: '>=8.0.0'} + + eslint-scope@7.2.2: + resolution: {integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + eslint-visitor-keys@3.4.3: + resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + eslint@8.42.0: + resolution: {integrity: sha512-ulg9Ms6E1WPf67PHaEY4/6E2tEn5/f7FXGzr3t9cBMugOmf1INYvuUwwh1aXQN4MfJ6a5K2iNwP3w4AColvI9A==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + hasBin: true + + espree@9.6.1: + resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + esprima@4.0.1: + resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} + engines: {node: '>=4'} + hasBin: true + + esquery@1.5.0: + resolution: {integrity: sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==} + engines: {node: '>=0.10'} + + esrecurse@4.3.0: + resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} + engines: {node: '>=4.0'} + + estraverse@4.3.0: + resolution: {integrity: sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==} + engines: {node: '>=4.0'} + + estraverse@5.3.0: + resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} + engines: {node: '>=4.0'} + + esutils@2.0.3: + resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} + engines: {node: '>=0.10.0'} + + event-target-shim@5.0.1: + resolution: {integrity: sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==} + engines: {node: '>=6'} + + eventemitter2@6.4.9: + resolution: {integrity: sha512-JEPTiaOt9f04oa6NOkc4aH+nVp5I3wEjpHbIPqfgCdD5v5bUzy7xQqwcVO2aDQgOWhI28da57HksMrzK9HlRxg==} + + events@3.3.0: + 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'} + + execa@8.0.1: + resolution: {integrity: sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==} + engines: {node: '>=16.17'} + + exit@0.1.2: + resolution: {integrity: sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==} + engines: {node: '>= 0.8.0'} + + expand-brackets@0.1.5: + resolution: {integrity: sha512-hxx03P2dJxss6ceIeri9cmYOT4SRs3Zk3afZwWpOsRqLqprhTR8u++SlC+sFGsQr7WGFPdMF7Gjc1njDLDK6UA==} + engines: {node: '>=0.10.0'} + + expand-range@1.8.2: + resolution: {integrity: sha512-AFASGfIlnIbkKPQwX1yHaDjFvh/1gyKJODme52V6IORh69uEYgZp0o9C+qsIGNVEiuuhQU0CSSl++Rlegg1qvA==} + engines: {node: '>=0.10.0'} + + expand-tilde@2.0.2: + resolution: {integrity: sha512-A5EmesHW6rfnZ9ysHQjPdJRni0SRar0tjtG5MNtm9n5TUvsYU8oozprtRD4AqHxcZWWlVuAmQo2nWKfN9oyjTw==} + engines: {node: '>=0.10.0'} + + expect@29.7.0: + resolution: {integrity: sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + exponential-backoff@3.1.1: + resolution: {integrity: sha512-dX7e/LHVJ6W3DE1MHWi9S1EYzDESENfLrYohG2G++ovZrYOkm4Knwa0mc1cn84xJOR4KEU0WSchhLbd0UklbHw==} + + extend-shallow@2.0.1: + resolution: {integrity: sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==} + engines: {node: '>=0.10.0'} + + extend@3.0.2: + resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} + + external-editor@3.1.0: + resolution: {integrity: sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==} + engines: {node: '>=4'} + + extglob@0.3.2: + resolution: {integrity: sha512-1FOj1LOwn42TMrruOHGt18HemVnbwAmAak7krWk+wa93KXxGbK+2jpezm+ytJYDaBX0/SPLZFHKM7m+tKobWGg==} + engines: {node: '>=0.10.0'} + + fast-content-type-parse@1.1.0: + resolution: {integrity: sha512-fBHHqSTFLVnR61C+gltJuE5GkVQMV0S2nqUO8TJ+5Z3qAKG8vAx4FKai1s5jq/inV1+sREynIWSuQ6HgoSXpDQ==} + + fast-copy@3.0.1: + resolution: {integrity: sha512-Knr7NOtK3HWRYGtHoJrjkaWepqT8thIVGAwt0p0aUs1zqkAzXZV4vo9fFNwyb5fcqK1GKYFYxldQdIDVKhUAfA==} + + fast-decode-uri-component@1.0.1: + resolution: {integrity: sha512-WKgKWg5eUxvRZGwW8FvfbaH7AXSh2cL+3j5fMGzUMCxWBJ3dV3a7Wz8y2f/uQ0e3B6WmodD3oS54jTQ9HVTIIg==} + + fast-deep-equal@3.1.3: + resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + + fast-diff@1.3.0: + resolution: {integrity: sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==} + + fast-glob@3.3.2: + resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==} + engines: {node: '>=8.6.0'} + + fast-json-stable-stringify@2.1.0: + resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} + + fast-json-stringify@5.12.0: + resolution: {integrity: sha512-7Nnm9UPa7SfHRbHVA1kJQrGXCRzB7LMlAAqHXQFkEQqueJm1V8owm0FsE/2Do55/4CcdhwiLQERaKomOnKQkyA==} + + fast-levenshtein@2.0.6: + resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} + + fast-querystring@1.1.2: + resolution: {integrity: sha512-g6KuKWmFXc0fID8WWH0jit4g0AGBoJhCkJMb1RmbsSEUNvQ+ZC8D6CUZ+GtF8nMzSPXnhiePyyqqipzNNEnHjg==} + + fast-redact@3.3.0: + resolution: {integrity: sha512-6T5V1QK1u4oF+ATxs1lWUmlEk6P2T9HqJG3e2DnHOdVgZy2rFJBoEnrIedcTXlkAHU/zKC+7KETJ+KGGKwxgMQ==} + engines: {node: '>=6'} + + fast-safe-stringify@2.1.1: + resolution: {integrity: sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==} + + fast-uri@2.3.0: + resolution: {integrity: sha512-eel5UKGn369gGEWOqBShmFJWfq/xSJvsgDzgLYC845GneayWvXBf0lJCBn5qTABfewy1ZDPoaR5OZCP+kssfuw==} + + fastify-ip@1.0.0: + resolution: {integrity: sha512-ht6hS48UDmdHd9jARn2BphJUgw5u/nm8ItO9EceM2uSVhlusrkF07CfNvpuJHxFX8Nx+Eik/VJz0QzxOn3KMJA==} + engines: {node: '>=18.x'} + + fastify-plugin@4.5.1: + resolution: {integrity: sha512-stRHYGeuqpEZTL1Ef0Ovr2ltazUT9g844X5z/zEBFLG8RYlpDiOCIG+ATvYEp+/zmc7sN29mcIMp8gvYplYPIQ==} + + fastify@4.26.2: + resolution: {integrity: sha512-90pjTuPGrfVKtdpLeLzND5nyC4woXZN5VadiNQCicj/iJU4viNHKhsAnb7jmv1vu2IzkLXyBiCzdWuzeXgQ5Ug==} + + fastq@1.17.1: + resolution: {integrity: sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==} + + fb-watchman@2.0.2: + resolution: {integrity: sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==} + + figures@3.2.0: + resolution: {integrity: sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==} + engines: {node: '>=8'} + + file-entry-cache@6.0.1: + resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} + engines: {node: ^10.12.0 || >=12.0.0} + + file-uri-to-path@1.0.0: + resolution: {integrity: sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==} + + filename-regex@2.0.1: + resolution: {integrity: sha512-BTCqyBaWBTsauvnHiE8i562+EdJj+oUpkqWp2R1iCoR8f6oo8STRu3of7WJJ0TqWtxN50a5YFpzYK4Jj9esYfQ==} + engines: {node: '>=0.10.0'} + + fill-range@2.2.4: + resolution: {integrity: sha512-cnrcCbj01+j2gTG921VZPnHbjmdAf8oQV/iGeV2kZxGSyfYjjTyY79ErsK1WJWMpw6DaApEX72binqJE+/d+5Q==} + engines: {node: '>=0.10.0'} + + fill-range@7.0.1: + resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} + engines: {node: '>=8'} + + find-my-way@8.1.0: + resolution: {integrity: sha512-41QwjCGcVTODUmLLqTMeoHeiozbMXYMAE1CKFiDyi9zVZ2Vjh0yz3MF0WQZoIb+cmzP/XlbFjlF2NtJmvZHznA==} + engines: {node: '>=14'} + + find-node-modules@2.1.3: + resolution: {integrity: sha512-UC2I2+nx1ZuOBclWVNdcnbDR5dlrOdVb7xNjmT/lHE+LsgztWks3dG7boJ37yTS/venXw84B/mAW9uHVoC5QRg==} + + find-root@1.1.0: + resolution: {integrity: sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==} + + find-up@1.1.2: + resolution: {integrity: sha512-jvElSjyuo4EMQGoTwo1uJU5pQMwTW5lS1x05zzfJuTIyLR3zwO27LYrxNg+dlvKpGOuGy/MzBdXh80g0ve5+HA==} + engines: {node: '>=0.10.0'} + + find-up@2.1.0: + resolution: {integrity: sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ==} + engines: {node: '>=4'} + + find-up@3.0.0: + resolution: {integrity: sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==} + engines: {node: '>=6'} + + find-up@4.1.0: + resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} + engines: {node: '>=8'} + + find-up@5.0.0: + resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} + engines: {node: '>=10'} + + find-up@7.0.0: + resolution: {integrity: sha512-YyZM99iHrqLKjmt4LJDj58KI+fYyufRLBSYcqycxf//KpBk9FoewoGX0450m9nB44qrZnovzC2oeP5hUibxc/g==} + engines: {node: '>=18'} + + findup-sync@4.0.0: + resolution: {integrity: sha512-6jvvn/12IC4quLBL1KNokxC7wWTvYncaVUYSoxWw7YykPLuRrnv4qdHcSOywOI5RpkOVGeQRtWM8/q+G6W6qfQ==} + engines: {node: '>= 8'} + + first-chunk-stream@1.0.0: + resolution: {integrity: sha512-ArRi5axuv66gEsyl3UuK80CzW7t56hem73YGNYxNWTGNKFJUadSb9Gu9SHijYEUi8ulQMf1bJomYNwSCPHhtTQ==} + engines: {node: '>=0.10.0'} + + flat-cache@3.2.0: + resolution: {integrity: sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==} + engines: {node: ^10.12.0 || >=12.0.0} + + flatted@3.2.9: + resolution: {integrity: sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==} + + follow-redirects@1.15.5: + resolution: {integrity: sha512-vSFWUON1B+yAw1VN4xMfxgn5fTUiaOzAJCKBwIIgT/+7CuGy9+r+5gITvP62j3RmaD5Ph65UaERdOSRGUzZtgw==} + engines: {node: '>=4.0'} + peerDependencies: + debug: '*' + peerDependenciesMeta: + debug: + optional: true + + for-in@1.0.2: + resolution: {integrity: sha512-7EwmXrOjyL+ChxMhmG5lnW9MPt1aIeZEwKhQzoBUdTV0N3zuwWDZYVJatDvZ2OyzPUvdIAZDsCetk3coyMfcnQ==} + engines: {node: '>=0.10.0'} + + for-own@0.1.5: + resolution: {integrity: sha512-SKmowqGTJoPzLO1T0BBJpkfp3EMacCMOuH40hOUbrbzElVktk4DioXVM99QkLCyKoiuOmyjgcWMpVz2xjE7LZw==} + engines: {node: '>=0.10.0'} + + foreground-child@3.1.1: + resolution: {integrity: sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==} + 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'} + peerDependencies: + typescript: '>3.6.0' + webpack: ^5.11.0 + + form-data-lite@1.0.3: + resolution: {integrity: sha512-P7xPqAiOPKzC9Q9aywAZJCQq4QOE5WokPb3HrcWRh7C57RKytueJzoORZAVgHBNvK/lL7E+FxjQjd4X/zbecEQ==} + + form-data@4.0.0: + resolution: {integrity: sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==} + engines: {node: '>= 6'} + + formidable@2.1.2: + resolution: {integrity: sha512-CM3GuJ57US06mlpQ47YcunuUZ9jpm8Vx+P2CGt2j7HpgkKZO/DJYQ0Bobim8G6PFQmK5lOqOOdUXboU+h73A4g==} + + forwarded@0.2.0: + resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==} + engines: {node: '>= 0.6'} + + from2@2.3.0: + resolution: {integrity: sha512-OMcX/4IC/uqEPVgGeyfN22LJk6AZrMkRZHxcHBMBvHScDGgwTm2GT2Wkgtocyd3JfZffjj2kYUDXXII0Fk9W0g==} + + fs-extra@10.1.0: + resolution: {integrity: sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==} + engines: {node: '>=12'} + + fs-extra@9.1.0: + resolution: {integrity: sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==} + engines: {node: '>=10'} + + fs-minipass@2.1.0: + resolution: {integrity: sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==} + engines: {node: '>= 8'} + + fs-monkey@1.0.5: + resolution: {integrity: sha512-8uMbBjrhzW76TYgEV27Y5E//W2f/lTFmx78P2w19FZSxarhI/798APGQyuGCwmkNxgwGRhrLfvWyLBvNtuOmew==} + + fs.realpath@1.0.0: + resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} + + fsevents@2.3.3: + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + + function-bind@1.1.2: + resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} + + gauge@3.0.2: + resolution: {integrity: sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==} + engines: {node: '>=10'} + + gauge@4.0.4: + resolution: {integrity: sha512-f9m+BEN5jkg6a0fZjleidjN51VE1X+mPFQ2DJ0uv1V39oCLCbsGe6yjbBnp7eK7z/+GAon99a3nHuqbuuthyPg==} + engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + + gensync@1.0.0-beta.2: + resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} + engines: {node: '>=6.9.0'} + + get-caller-file@2.0.5: + resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} + engines: {node: 6.* || 8.* || >= 10.*} + + get-intrinsic@1.2.4: + resolution: {integrity: sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==} + engines: {node: '>= 0.4'} + + get-package-type@0.1.0: + resolution: {integrity: sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==} + engines: {node: '>=8.0.0'} + + get-pkg-repo@4.2.1: + resolution: {integrity: sha512-2+QbHjFRfGB74v/pYWjd5OhU3TDIC2Gv/YKUTk/tCvAz0pkn/Mz6P3uByuBimLOcPvN2jYdScl3xGFSrx0jEcA==} + engines: {node: '>=6.9.0'} + hasBin: true + + 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'} + + get-stream@8.0.1: + resolution: {integrity: sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==} + engines: {node: '>=16'} + + git-raw-commits@2.0.11: + resolution: {integrity: sha512-VnctFhw+xfj8Va1xtfEqCUD2XDrbAPSJx+hSrE5K7fGdjZruW7XV+QOrN7LF/RJyvspRiD2I0asWsxFp0ya26A==} + engines: {node: '>=10'} + hasBin: true + + git-raw-commits@4.0.0: + resolution: {integrity: sha512-ICsMM1Wk8xSGMowkOmPrzo2Fgmfo4bMHLNX6ytHjajRJUqvHOw/TFapQ+QG75c3X/tTDDhOSRPGC52dDbNM8FQ==} + engines: {node: '>=16'} + hasBin: true + + git-remote-origin-url@2.0.0: + resolution: {integrity: sha512-eU+GGrZgccNJcsDH5LkXR3PB9M958hxc7sbA8DFJjrv9j4L2P/eZfKhM+QD6wyzpiv+b1BpK0XrYCxkovtjSLw==} + engines: {node: '>=4'} + + git-semver-tags@4.1.1: + resolution: {integrity: sha512-OWyMt5zBe7xFs8vglMmhM9lRQzCWL3WjHtxNNfJTMngGym7pC1kh8sP6jevfydJ6LP3ZvGxfb6ABYgPUM0mtsA==} + engines: {node: '>=10'} + hasBin: true + + gitconfiglocal@1.0.0: + resolution: {integrity: sha512-spLUXeTAVHxDtKsJc8FkFVgFtMdEN9qPGpL23VfSHx4fP4+Ds097IXLvymbnDH8FnmxX5Nr9bPw3A+AQ6mWEaQ==} + + glob-base@0.3.0: + resolution: {integrity: sha512-ab1S1g1EbO7YzauaJLkgLp7DZVAqj9M/dvKlTt8DkXA2tiOIcSMrlVI2J1RZyB5iJVccEscjGn+kpOG9788MHA==} + engines: {node: '>=0.10.0'} + + glob-parent@2.0.0: + resolution: {integrity: sha512-JDYOvfxio/t42HKdxkAYaCiBN7oYiuxykOxKxdaUW5Qn0zaYN3gRQWolrwdnf0shM9/EP0ebuuTmyoXNr1cC5w==} + + glob-parent@3.1.0: + resolution: {integrity: sha512-E8Ak/2+dZY6fnzlR7+ueWvhsH1SjHr4jjss4YS/h4py44jY9MhK/VFdaZJAWDz6BbL21KeteKxFSFpq8OS5gVA==} + + 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'} + + glob-stream@5.3.5: + resolution: {integrity: sha512-piN8XVAO2sNxwVLokL4PswgJvK/uQ6+awwXUVRTGF+rRfgCZpn4hOqxiRuTEbU/k3qgKl0DACYQ/0Sge54UMQg==} + engines: {node: '>= 0.10'} + + glob-to-regexp@0.4.1: + resolution: {integrity: sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==} + + glob@10.3.10: + resolution: {integrity: sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==} + engines: {node: '>=16 || 14 >=14.17'} + hasBin: true + + glob@5.0.15: + resolution: {integrity: sha512-c9IPMazfRITpmAAKi22dK1VKxGDX9ehhqfABDriL/lzO92xcUKEJPQHrVA/2YHSNFB4iFlykVmWvwo48nr3OxA==} + + glob@7.2.3: + resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} + + glob@8.1.0: + resolution: {integrity: sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==} + engines: {node: '>=12'} + + glob@9.3.5: + resolution: {integrity: sha512-e1LleDykUz2Iu+MTYdkSsuWX8lvAjAcs0Xef0lNIu0S2wOAzuTxCJtcd9S3cijlwYF18EsU3rzb8jPVobxDh9Q==} + engines: {node: '>=16 || 14 >=14.17'} + + global-directory@4.0.1: + resolution: {integrity: sha512-wHTUcDUoZ1H5/0iVqEudYW4/kAlN5cZ3j/bXn0Dpbizl9iaUVeWSHqiOjsgk6OW2bkLclbBjzewBz6weQ1zA2Q==} + engines: {node: '>=18'} + + global-modules@1.0.0: + resolution: {integrity: sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==} + engines: {node: '>=0.10.0'} + + global-prefix@1.0.2: + resolution: {integrity: sha512-5lsx1NUDHtSjfg0eHlmYvZKv8/nVqX4ckFbM+FrGcQ+04KWcWFo9P5MxPZYSzUvyzmdTbI7Eix8Q4IbELDqzKg==} + engines: {node: '>=0.10.0'} + + globals@11.12.0: + resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} + engines: {node: '>=4'} + + globals@13.24.0: + resolution: {integrity: sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==} + engines: {node: '>=8'} + + globby@11.1.0: + resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} + engines: {node: '>=10'} + + gopd@1.0.1: + resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==} + + graceful-fs@4.2.11: + resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + + grapheme-splitter@1.0.4: + resolution: {integrity: sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==} + + graphemer@1.4.0: + resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} + + gulp-sourcemaps@1.12.1: + resolution: {integrity: sha512-2NYnMpB67LJhc36sEv+hNY05UOy1lD9DPtLi+en4hbGH+085G9Zzh3cet2VEqrDlQrLk9Eho0MM9dZ3Z+dL0XA==} + engines: {node: '>=0.10.0'} + + handlebars@4.7.8: + resolution: {integrity: sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==} + engines: {node: '>=0.4.7'} + hasBin: true + + hard-rejection@2.1.0: + resolution: {integrity: sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==} + engines: {node: '>=6'} + + has-ansi@2.0.0: + resolution: {integrity: sha512-C8vBJ8DwUCx19vhm7urhTuUsr4/IyP6l4VzNQDv+ryHQObW3TTTp9yB68WpYgRe2bbaGuZ/se74IqFeVnMnLZg==} + engines: {node: '>=0.10.0'} + + has-flag@3.0.0: + resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} + engines: {node: '>=4'} + + has-flag@4.0.0: + resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} + engines: {node: '>=8'} + + has-own-prop@2.0.0: + resolution: {integrity: sha512-Pq0h+hvsVm6dDEa8x82GnLSYHOzNDt7f0ddFa3FqcQlgzEiptPqL+XrOJNavjOzSYiYWIrgeVYYgGlLmnxwilQ==} + engines: {node: '>=8'} + + has-property-descriptors@1.0.1: + resolution: {integrity: sha512-VsX8eaIewvas0xnvinAe9bw4WfIeODpGYikiWYLH+dma0Jw6KHYqWiWfhQlgOVK8D6PvjubK5Uc4P0iIhIcNVg==} + + has-proto@1.0.1: + resolution: {integrity: sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==} + engines: {node: '>= 0.4'} + + has-symbols@1.0.3: + resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==} + engines: {node: '>= 0.4'} + + has-unicode@2.0.1: + resolution: {integrity: sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==} + + hasown@2.0.0: + resolution: {integrity: sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==} + engines: {node: '>= 0.4'} + + helmet@7.1.0: + resolution: {integrity: sha512-g+HZqgfbpXdCkme/Cd/mZkV0aV3BZZZSugecH03kl38m/Kmdx8jKjBikpDj2cr+Iynv4KpYEviojNdTJActJAg==} + engines: {node: '>=16.0.0'} + + help-me@5.0.0: + resolution: {integrity: sha512-7xgomUX6ADmcYzFik0HzAxh/73YlKR9bmFzf51CZwR+b6YtzU2m0u49hQCqV6SvlqIqsaxovfwdvbnsw3b/zpg==} + + hexoid@1.0.0: + resolution: {integrity: sha512-QFLV0taWQOZtvIRIAdBChesmogZrtuXvVWsFHZTk2SU+anspqZ2vMnoLg7IE1+Uk16N19APic1BuF8bC8c2m5g==} + engines: {node: '>=8'} + + homedir-polyfill@1.0.3: + resolution: {integrity: sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==} + engines: {node: '>=0.10.0'} + + hosted-git-info@2.8.9: + resolution: {integrity: sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==} + + hosted-git-info@4.1.0: + resolution: {integrity: sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==} + engines: {node: '>=10'} + + html-escaper@2.0.2: + resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==} + + http-cache-semantics@4.1.1: + resolution: {integrity: sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==} + + http-errors@2.0.0: + resolution: {integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==} + engines: {node: '>= 0.8'} + + http-proxy-agent@5.0.0: + resolution: {integrity: sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==} + engines: {node: '>= 6'} + + https-proxy-agent@5.0.1: + resolution: {integrity: sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==} + engines: {node: '>= 6'} + + 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'} + + human-signals@5.0.0: + resolution: {integrity: sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==} + engines: {node: '>=16.17.0'} + + humanize-ms@1.2.1: + resolution: {integrity: sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==} + + husky@9.0.11: + resolution: {integrity: sha512-AB6lFlbwwyIqMdHYhwPe+kjOC3Oc5P3nThEoW/AaO2BX3vJDjWPFxYLxokUZOo6RNX20He3AaT8sESs9NJcmEw==} + 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'} + + ieee754@1.2.1: + resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} + + ignore@5.3.1: + resolution: {integrity: sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==} + engines: {node: '>= 4'} + + import-fresh@3.3.0: + resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} + engines: {node: '>=6'} + + import-local@3.1.0: + resolution: {integrity: sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==} + engines: {node: '>=8'} + hasBin: true + + import-meta-resolve@4.0.0: + resolution: {integrity: sha512-okYUR7ZQPH+efeuMJGlq4f8ubUgO50kByRPyt/Cy1Io4PSRsPjxME+YlVaCOx+NIToW7hCsZNFJyTPFFKepRSA==} + + imurmurhash@0.1.4: + resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} + engines: {node: '>=0.8.19'} + + indent-string@4.0.0: + resolution: {integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==} + engines: {node: '>=8'} + + infer-owner@1.0.4: + resolution: {integrity: sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==} + + inflight@1.0.6: + resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} + + inherits@2.0.4: + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + + ini@1.3.8: + resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} + + ini@4.1.1: + resolution: {integrity: sha512-QQnnxNyfvmHFIsj7gkPcYymR8Jdw/o7mp5ZFihxn6h8Ci6fh3Dx4E1gPjpQEpIuPo9XVNY/ZUwh4BPMjGyL01g==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + 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'} + + interpret@1.4.0: + resolution: {integrity: sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==} + engines: {node: '>= 0.10'} + + into-stream@6.0.0: + resolution: {integrity: sha512-XHbaOAvP+uFKUFsOgoNPRjLkwB+I22JFPFe5OjTkQ0nwgj6+pSjb4NmB6VMxaPshLiOf+zcpOCBQuLwC1KHhZA==} + engines: {node: '>=10'} + + invert-kv@1.0.0: + resolution: {integrity: sha512-xgs2NH9AE66ucSq4cNG1nhSFghr5l6tdL15Pk+jl46bmmBapgoaY/AacXyaDznAqmGL99TiLSQgO/XazFSKYeQ==} + engines: {node: '>=0.10.0'} + + ip-address@9.0.5: + resolution: {integrity: sha512-zHtQzGojZXTwZTHQqra+ETKd4Sn3vgi7uBmlPoXVWZqYvuKmtI0l/VZTjqGmJY9x88GGOaZ9+G9ES8hC4T4X8g==} + engines: {node: '>= 12'} + + ipaddr.js@1.9.1: + resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==} + engines: {node: '>= 0.10'} + + is-arrayish@0.2.1: + resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} + + is-binary-path@2.1.0: + resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} + engines: {node: '>=8'} + + is-buffer@1.1.6: + resolution: {integrity: sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==} + + is-core-module@2.13.1: + resolution: {integrity: sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==} + + is-dotfile@1.0.3: + resolution: {integrity: sha512-9YclgOGtN/f8zx0Pr4FQYMdibBiTaH3sn52vjYip4ZSf6C4/6RfTEZ+MR4GvKhCxdPh21Bg42/WL55f6KSnKpg==} + engines: {node: '>=0.10.0'} + + is-equal-shallow@0.1.3: + resolution: {integrity: sha512-0EygVC5qPvIyb+gSz7zdD5/AAoS6Qrx1e//6N4yv4oNm30kqvdmG66oZFWVlQHUWe5OjP08FuTw2IdT0EOTcYA==} + engines: {node: '>=0.10.0'} + + is-extendable@0.1.1: + resolution: {integrity: sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==} + engines: {node: '>=0.10.0'} + + is-extglob@1.0.0: + resolution: {integrity: sha512-7Q+VbVafe6x2T+Tu6NcOf6sRklazEPmBoB3IWk3WdGZM2iGUwU/Oe3Wtq5lSEkDTTlpp8yx+5t4pzO/i9Ty1ww==} + engines: {node: '>=0.10.0'} + + is-extglob@2.1.1: + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} + + is-fullwidth-code-point@1.0.0: + resolution: {integrity: sha512-1pqUqRjkhPJ9miNq9SwMfdvi6lBJcd6eFxvfaivQhaH3SgisfiuudvFntdKOmxuee/77l+FPjKrQjWvmPjWrRw==} + engines: {node: '>=0.10.0'} + + is-fullwidth-code-point@3.0.0: + resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} + engines: {node: '>=8'} + + is-generator-fn@2.1.0: + resolution: {integrity: sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==} + engines: {node: '>=6'} + + is-glob@2.0.1: + resolution: {integrity: sha512-a1dBeB19NXsf/E0+FHqkagizel/LQw2DjSQpvQrj3zT+jYPpaUCryPnrQajXKFLCMuf4I6FhRpaGtw4lPrG6Eg==} + engines: {node: '>=0.10.0'} + + is-glob@3.1.0: + resolution: {integrity: sha512-UFpDDrPgM6qpnFNI+rh/p3bUaq9hKLZN8bMUWzxmcnZVS3omf4IPK+BrewlnWjO1WmUsMYuSjKh4UJuV4+Lqmw==} + engines: {node: '>=0.10.0'} + + is-glob@4.0.3: + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} + + is-interactive@1.0.0: + resolution: {integrity: sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==} + engines: {node: '>=8'} + + is-lambda@1.0.1: + resolution: {integrity: sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ==} + + is-number@2.1.0: + resolution: {integrity: sha512-QUzH43Gfb9+5yckcrSA0VBDwEtDUchrk4F6tfJZQuNzDJbEDB9cZNzSfXGQ1jqmdDY/kl41lUOWM9syA8z8jlg==} + engines: {node: '>=0.10.0'} + + is-number@4.0.0: + resolution: {integrity: sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==} + engines: {node: '>=0.10.0'} + + is-number@7.0.0: + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + engines: {node: '>=0.12.0'} + + is-obj@2.0.0: + resolution: {integrity: sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==} + engines: {node: '>=8'} + + is-path-inside@3.0.3: + resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} + engines: {node: '>=8'} + + is-plain-obj@1.1.0: + resolution: {integrity: sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==} + engines: {node: '>=0.10.0'} + + is-posix-bracket@0.1.1: + resolution: {integrity: sha512-Yu68oeXJ7LeWNmZ3Zov/xg/oDBnBK2RNxwYY1ilNJX+tKKZqgPK+qOn/Gs9jEu66KDY9Netf5XLKNGzas/vPfQ==} + engines: {node: '>=0.10.0'} + + is-primitive@2.0.0: + resolution: {integrity: sha512-N3w1tFaRfk3UrPfqeRyD+GYDASU3W5VinKhlORy8EWVf/sIdDL9GAcew85XmktCfH+ngG7SRXEVDoO18WMdB/Q==} + engines: {node: '>=0.10.0'} + + is-stream@1.1.0: + resolution: {integrity: sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==} + engines: {node: '>=0.10.0'} + + is-stream@2.0.1: + resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} + engines: {node: '>=8'} + + is-stream@3.0.0: + resolution: {integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + is-text-path@1.0.1: + resolution: {integrity: sha512-xFuJpne9oFz5qDaodwmmG08e3CawH/2ZV8Qqza1Ko7Sk8POWbkRdwIoAWVhqvq0XeUzANEhKo2n0IXUGBm7A/w==} + engines: {node: '>=0.10.0'} + + is-text-path@2.0.0: + resolution: {integrity: sha512-+oDTluR6WEjdXEJMnC2z6A4FRwFoYuvShVVEGsS7ewc0UTi2QtAKMDJuL4BDEVt+5T7MjFo12RP8ghOM75oKJw==} + engines: {node: '>=8'} + + is-unicode-supported@0.1.0: + resolution: {integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==} + engines: {node: '>=10'} + + is-utf8@0.2.1: + resolution: {integrity: sha512-rMYPYvCzsXywIsldgLaSoPlw5PfoB/ssr7hY4pLfcodrA5M/eArza1a9VmTiNIBNMjOGr1Ow9mTyU2o69U6U9Q==} + + is-valid-glob@0.3.0: + resolution: {integrity: sha512-CvG8EtJZ8FyzVOGPzrDorzyN65W1Ld8BVnqshRCah6pFIsprGx3dKgFtjLn/Vw9kGqR4OlR84U7yhT9ZVTyWIQ==} + engines: {node: '>=0.10.0'} + + is-windows@1.0.2: + resolution: {integrity: sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==} + engines: {node: '>=0.10.0'} + + isarray@0.0.1: + resolution: {integrity: sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==} + + isarray@1.0.0: + resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} + + isexe@2.0.0: + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + + isobject@2.1.0: + resolution: {integrity: sha512-+OUdGJlgjOBZDfxnDjYYG6zp487z0JGNQq3cYQYg5f5hKR+syHMsaztzGeml/4kGG55CSpKSpWTY+jYGgsHLgA==} + engines: {node: '>=0.10.0'} + + istanbul-lib-coverage@3.2.2: + resolution: {integrity: sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==} + engines: {node: '>=8'} + + istanbul-lib-instrument@5.2.1: + resolution: {integrity: sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==} + engines: {node: '>=8'} + + istanbul-lib-instrument@6.0.1: + resolution: {integrity: sha512-EAMEJBsYuyyztxMxW3g7ugGPkrZsV57v0Hmv3mm1uQsmB+QnZuepg731CRaIgeUVSdmsTngOkSnauNF8p7FIhA==} + engines: {node: '>=10'} + + istanbul-lib-report@3.0.1: + resolution: {integrity: sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==} + engines: {node: '>=10'} + + istanbul-lib-source-maps@4.0.1: + resolution: {integrity: sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==} + engines: {node: '>=10'} + + istanbul-reports@3.1.6: + resolution: {integrity: sha512-TLgnMkKg3iTDsQ9PbPTdpfAK2DzjF9mqUG7RMgcQl8oFjad8ob4laGxv5XV5U9MAfx8D6tSJiUyuAwzLicaxlg==} + engines: {node: '>=8'} + + iterare@1.2.1: + resolution: {integrity: sha512-RKYVTCjAnRthyJes037NX/IiqeidgN1xc3j1RjFfECFp28A1GVwK9nA+i0rJPaHqSZwygLzRnFlzUuHFoWWy+Q==} + engines: {node: '>=6'} + + jackspeak@2.3.6: + resolution: {integrity: sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==} + engines: {node: '>=14'} + + jest-changed-files@29.7.0: + resolution: {integrity: sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-circus@29.7.0: + resolution: {integrity: sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-cli@29.7.0: + resolution: {integrity: sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + hasBin: true + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + + jest-config@29.7.0: + resolution: {integrity: sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + peerDependencies: + '@types/node': '*' + ts-node: '>=9.0.0' + peerDependenciesMeta: + '@types/node': + optional: true + ts-node: + optional: true + + jest-diff@29.7.0: + resolution: {integrity: sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-docblock@29.7.0: + resolution: {integrity: sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-each@29.7.0: + resolution: {integrity: sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-environment-node@29.7.0: + resolution: {integrity: sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-get-type@29.6.3: + resolution: {integrity: sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-haste-map@29.7.0: + resolution: {integrity: sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-leak-detector@29.7.0: + resolution: {integrity: sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-matcher-utils@29.7.0: + resolution: {integrity: sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-message-util@29.7.0: + resolution: {integrity: sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-mock@29.7.0: + resolution: {integrity: sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-pnp-resolver@1.2.3: + resolution: {integrity: sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==} + engines: {node: '>=6'} + peerDependencies: + jest-resolve: '*' + peerDependenciesMeta: + jest-resolve: + optional: true + + jest-regex-util@29.6.3: + resolution: {integrity: sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-resolve-dependencies@29.7.0: + resolution: {integrity: sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-resolve@29.7.0: + resolution: {integrity: sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-runner@29.7.0: + resolution: {integrity: sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-runtime@29.7.0: + resolution: {integrity: sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-snapshot@29.7.0: + resolution: {integrity: sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-util@29.7.0: + resolution: {integrity: sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-validate@29.7.0: + resolution: {integrity: sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-watcher@29.7.0: + resolution: {integrity: sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-worker@27.5.1: + resolution: {integrity: sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==} + engines: {node: '>= 10.13.0'} + + jest-worker@29.7.0: + resolution: {integrity: sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest@29.5.0: + resolution: {integrity: sha512-juMg3he2uru1QoXX078zTa7pO85QyB9xajZc6bU+d9yEGwrKX6+vGmJQ3UdVZsvTEUARIdObzH68QItim6OSSQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + hasBin: true + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + + jiti@1.21.0: + resolution: {integrity: sha512-gFqAIbuKyyso/3G2qhiO2OM6shY6EPP/R0+mkDbyspxKazh8BXDC5FiFsUjlczgdNz/vfra0da2y+aHrusLG/Q==} + hasBin: true + + joycon@3.1.1: + resolution: {integrity: sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw==} + engines: {node: '>=10'} + + js-tokens@4.0.0: + resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + + js-yaml@3.14.1: + resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==} + hasBin: true + + js-yaml@4.1.0: + resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} + hasBin: true + + jsbn@1.1.0: + resolution: {integrity: sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A==} + + jsesc@2.5.2: + resolution: {integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==} + engines: {node: '>=4'} + hasBin: true + + json-buffer@3.0.1: + resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} + + json-parse-better-errors@1.0.2: + resolution: {integrity: sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==} + + json-parse-even-better-errors@2.3.1: + resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} + + json-query@2.2.2: + resolution: {integrity: sha512-y+IcVZSdqNmS4fO8t1uZF6RMMs0xh3SrTjJr9bp1X3+v0Q13+7Cyv12dSmKwDswp/H427BVtpkLWhGxYu3ZWRA==} + + json-schema-ref-resolver@1.0.1: + resolution: {integrity: sha512-EJAj1pgHc1hxF6vo2Z3s69fMjO1INq6eGHXZ8Z6wCQeldCuwxGK9Sxf4/cScGn3FZubCVUehfWtcDM/PLteCQw==} + + json-schema-traverse@0.4.1: + resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} + + json-schema-traverse@1.0.0: + resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} + + json-stable-stringify-without-jsonify@1.0.1: + resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} + + json-stringify-safe@5.0.1: + resolution: {integrity: sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==} + + json5@2.2.3: + resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} + engines: {node: '>=6'} + hasBin: true + + jsonc-parser@3.0.0: + resolution: {integrity: sha512-fQzRfAbIBnR0IQvftw9FJveWiHp72Fg20giDrHz6TdfB12UH/uue0D3hm57UB5KgAVuniLMCaS8P1IMj9NR7cA==} + + jsonc-parser@3.2.0: + resolution: {integrity: sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==} + + jsonfile@6.1.0: + resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==} + + jsonparse@1.3.1: + resolution: {integrity: sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==} + engines: {'0': node >= 0.2.0} + + jsonrepair@3.7.0: + resolution: {integrity: sha512-TwE50n4P4gdVfMQF2q+X+IGy4ntFfcuHHE8zjRyBcdtrRK0ORZsjOZD6zmdylk4p277nQBAlHgsEPWtMIQk4LQ==} + hasBin: true + + jsonwebtoken@9.0.2: + resolution: {integrity: sha512-PRp66vJ865SSqOlgqS8hujT5U4AOgMfhrwYIuIhfKaoSCZcirrmASQr8CX7cUg+RMih+hgznrjp99o+W4pJLHQ==} + engines: {node: '>=12', npm: '>=6'} + + jwa@1.4.1: + resolution: {integrity: sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==} + + jws@3.2.2: + resolution: {integrity: sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==} + + keyv@4.5.4: + resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} + + kind-of@3.2.2: + resolution: {integrity: sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==} + engines: {node: '>=0.10.0'} + + kind-of@6.0.3: + resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==} + engines: {node: '>=0.10.0'} + + kleur@3.0.3: + resolution: {integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==} + engines: {node: '>=6'} + + kleur@4.1.5: + resolution: {integrity: sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==} + engines: {node: '>=6'} + + klona@2.0.6: + resolution: {integrity: sha512-dhG34DXATL5hSxJbIexCft8FChFXtmskoZYnoPWjXQuebWYCNkVeV3KkGegCK9CP1oswI/vQibS2GY7Em/sJJA==} + engines: {node: '>= 8'} + + lazy-debug-legacy@0.0.1: + resolution: {integrity: sha512-GFWaIBcBjxWWKI5OghwYEsPOR8JFh2xEcc3ZFV0ONYL0oHz0PHINJCfxJyztUq2XzcHncyO7fsRR550Gtfnk6g==} + peerDependencies: + debug: '*' + + lazystream@1.0.1: + resolution: {integrity: sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw==} + engines: {node: '>= 0.6.3'} + + lcid@1.0.0: + resolution: {integrity: sha512-YiGkH6EnGrDGqLMITnGjXtGmNtjoXw9SVUzcaos8RBi7Ps0VBylkq+vOcY9QE5poLasPCR849ucFUkl0UzUyOw==} + engines: {node: '>=0.10.0'} + + leven@3.1.0: + resolution: {integrity: sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==} + engines: {node: '>=6'} + + levn@0.4.1: + resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} + engines: {node: '>= 0.8.0'} + + libphonenumber-js@1.10.58: + resolution: {integrity: sha512-53A0IpJFL9LdHbpeatwizf8KSwPICrqn9H0g3Y7WQ+Jgeu9cQ4Ew3WrRtrLBu/CX2lXd5+rgT01/tGlkbkzOjw==} + + light-my-request@5.12.0: + resolution: {integrity: sha512-P526OX6E7aeCIfw/9UyJNsAISfcFETghysaWHQAlQYayynShT08MOj4c6fBCvTWBrHXSvqBAKDp3amUPSCQI4w==} + + lightcookie@1.0.25: + resolution: {integrity: sha512-SrY/+eBPaKAMnsn7mCsoOMZzoQyCyHHHZlFCu2fjo28XxSyCLjlooKiTxyrXTg8NPaHp1YzWi0lcGG1gDi6KHw==} + deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. + + lines-and-columns@1.2.4: + resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} + + load-json-file@1.1.0: + resolution: {integrity: sha512-cy7ZdNRXdablkXYNI049pthVeXFurRyb9+hA/dZzerZ0pGTx42z+y+ssxBaVV2l70t1muq5IdKhn4UtcoGUY9A==} + engines: {node: '>=0.10.0'} + + load-json-file@4.0.0: + resolution: {integrity: sha512-Kx8hMakjX03tiGTLAIdJ+lL0htKnXjEZN6hk/tozf/WOuYGdZBJrZ+rCJRbVCugsjB3jMLn9746NsQIf5VjBMw==} + engines: {node: '>=4'} + + loader-runner@4.3.0: + resolution: {integrity: sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==} + engines: {node: '>=6.11.5'} + + locate-path@2.0.0: + resolution: {integrity: sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA==} + engines: {node: '>=4'} + + locate-path@3.0.0: + resolution: {integrity: sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==} + engines: {node: '>=6'} + + locate-path@5.0.0: + resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} + engines: {node: '>=8'} + + locate-path@6.0.0: + resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} + engines: {node: '>=10'} + + locate-path@7.2.0: + resolution: {integrity: sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + lodash._reinterpolate@3.0.0: + resolution: {integrity: sha512-xYHt68QRoYGjeeM/XOE1uJtvXQAgvszfBhjV4yvsQH0u2i9I6cI6c6/eG4Hh3UAOVn0y/xAXwmTzEay49Q//HA==} + + lodash.assign@4.2.0: + resolution: {integrity: sha512-hFuH8TY+Yji7Eja3mGiuAxBqLagejScbG8GbG0j6o9vzn0YL14My+ktnqtZgFTosKymC9/44wP6s7xyuLfnClw==} + + lodash.assigninwith@4.2.0: + resolution: {integrity: sha512-oYOjtZzQnecm7PJcxrDbL20OHv3tTtOQdRBSnlor6s0MO6VOFTOC+JyBIJUNUEzsBi1I0oslWtFAAG6QQbFIWQ==} + + lodash.camelcase@4.3.0: + resolution: {integrity: sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==} + + lodash.clonedeep@4.5.0: + resolution: {integrity: sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ==} + + lodash.includes@4.3.0: + resolution: {integrity: sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w==} + + lodash.isboolean@3.0.3: + resolution: {integrity: sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg==} + + lodash.isequal@4.5.0: + resolution: {integrity: sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==} + + lodash.isinteger@4.0.4: + resolution: {integrity: sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA==} + + lodash.ismatch@4.4.0: + resolution: {integrity: sha512-fPMfXjGQEV9Xsq/8MTSgUf255gawYRbjwMyDbcvDhXgV7enSZA0hynz6vMPnpAb5iONEzBHBPsT+0zes5Z301g==} + + lodash.isnumber@3.0.3: + resolution: {integrity: sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw==} + + lodash.isplainobject@4.0.6: + resolution: {integrity: sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==} + + lodash.isstring@4.0.1: + resolution: {integrity: sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==} + + lodash.kebabcase@4.1.1: + resolution: {integrity: sha512-N8XRTIMMqqDgSy4VLKPnJ/+hpGZN+PHQiJnSenYqPaVV/NCqEogTnAdZLQiGKhxX+JCs8waWq2t1XHWKOmlY8g==} + + lodash.keys@4.2.0: + resolution: {integrity: sha512-J79MkJcp7Df5mizHiVNpjoHXLi4HLjh9VLS/M7lQSGoQ+0oQ+lWEigREkqKyizPB1IawvQLLKY8mzEcm1tkyxQ==} + + lodash.map@4.6.0: + resolution: {integrity: sha512-worNHGKLDetmcEYDvh2stPCrrQRkP20E4l0iIS7F8EvzMqBBi7ltvFN5m1HvTf1P7Jk1txKhvFcmYsCr8O2F1Q==} + + lodash.memoize@4.1.2: + resolution: {integrity: sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==} + + lodash.merge@4.6.2: + resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} + + lodash.mergewith@4.6.2: + resolution: {integrity: sha512-GK3g5RPZWTRSeLSpgP8Xhra+pnjBC56q9FZYe1d5RN3TJ35dbkGy3YqBSMbyCrlbi+CM9Z3Jk5yTL7RCsqboyQ==} + + lodash.once@4.1.1: + resolution: {integrity: sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==} + + lodash.rest@4.0.5: + resolution: {integrity: sha512-hsypEpebNAt0hj1aX9isQqi2CIZoNS1lP6PSWhB3hcMnBivobYzPZRPYq4cr38+RtvrlxQTgaW+sIuHAhBoHrA==} + + lodash.snakecase@4.1.1: + resolution: {integrity: sha512-QZ1d4xoBHYUeuouhEq3lk3Uq7ldgyFXGBhg04+oRLnIz8o9T65Eh+8YdroUwn846zchkA9yDsDl5CVVaV2nqYw==} + + lodash.startcase@4.4.0: + resolution: {integrity: sha512-+WKqsK294HMSc2jEbNgpHpd0JfIBhp7rEV4aqXWqFr6AlXov+SlcgB1Fv01y2kGe3Gc8nMW7VA0SrGuSkRfIEg==} + + lodash.template@4.2.4: + resolution: {integrity: sha512-PmEQ9TtYbeYg6lNwJpSjkp4J4KttYLuKF1C6jeFBidyzbOFu0KvVnLicZBf0sGfScARwgOBqxnV/rWuaqRwang==} + + lodash.templatesettings@4.2.0: + resolution: {integrity: sha512-stgLz+i3Aa9mZgnjr/O+v9ruKZsPsndy7qPZOchbqk2cnTU1ZaldKK+v7m54WoKIyxiuMZTKT2H81F8BeAc3ZQ==} + + lodash.tostring@4.1.4: + resolution: {integrity: sha512-xWHJ0LY7cSz/C/4ghNNiYA1Ong0VLdzAzrjDHvOzN+eJHzDEHme2+k+w/9Pk8dtdwcASMUbxN1/mtj6mFI25Ng==} + + lodash.uniq@4.5.0: + resolution: {integrity: sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==} + + lodash.upperfirst@4.3.1: + resolution: {integrity: sha512-sReKOYJIJf74dhJONhU4e0/shzi1trVbSWDOhKYE5XV2O+H7Sb2Dihwuc7xWxVl+DgFPyTqIN3zMfT9cq5iWDg==} + + lodash@4.17.21: + resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} + + log-symbols@4.1.0: + resolution: {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==} + engines: {node: '>=10'} + + longest@2.0.1: + resolution: {integrity: sha512-Ajzxb8CM6WAnFjgiloPsI3bF+WCxcvhdIG3KNA2KN962+tdBsHcuQ4k4qX/EcS/2CRkcc0iAkR956Nib6aXU/Q==} + engines: {node: '>=0.10.0'} + + lru-cache@10.2.0: + resolution: {integrity: sha512-2bIM8x+VAf6JT4bKAljS1qUWgMsqZRPGJS6FSahIMPVvctcNhyVp7AJu7quxOW9jwkryBReKZY5tY5JYv2n/7Q==} + engines: {node: 14 || >=16.14} + + lru-cache@5.1.1: + resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} + + lru-cache@6.0.0: + resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} + engines: {node: '>=10'} + + lru-cache@7.18.3: + resolution: {integrity: sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==} + engines: {node: '>=12'} + + macos-release@2.5.1: + resolution: {integrity: sha512-DXqXhEM7gW59OjZO8NIjBCz9AQ1BEMrfiOAl4AYByHCtVHRF4KoGNO8mqQeM8lRCtQe/UnJ4imO/d2HdkKsd+A==} + engines: {node: '>=6'} + + magic-string@0.25.7: + resolution: {integrity: sha512-4CrMT5DOHTDk4HYDlzmwu4FVCcIYI8gauveasrdCu2IKIFOJ3f0v/8MDGJCDL9oD2ppz/Av1b0Nj345H9M+XIA==} + + magic-string@0.30.0: + resolution: {integrity: sha512-LA+31JYDJLs82r2ScLrlz1GjSgu66ZV518eyWT+S8VhyQn/JL0u9MeBOvQMGYiPk1DBiSN9DDMOcXvigJZaViQ==} + engines: {node: '>=12'} + + make-dir@3.1.0: + resolution: {integrity: sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==} + engines: {node: '>=8'} + + make-dir@4.0.0: + resolution: {integrity: sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==} + engines: {node: '>=10'} + + make-error@1.3.6: + resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} + + make-fetch-happen@10.2.1: + resolution: {integrity: sha512-NgOPbRiaQM10DYXvN3/hhGVI2M5MtITFryzBGxHM5p4wnFxsVCbxkrBrDsk+EZ5OB4jEOT7AjDxtdF+KVEFT7w==} + engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + + makeerror@1.0.12: + resolution: {integrity: sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==} + + map-obj@1.0.1: + resolution: {integrity: sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==} + engines: {node: '>=0.10.0'} + + map-obj@4.3.0: + resolution: {integrity: sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==} + engines: {node: '>=8'} + + map-stream@0.0.6: + resolution: {integrity: sha512-RG9wAgznUY0foT30MMfnXh4jS0ObmOuxoGKe/ppYvM55RfquNdIvEEf6e+euczNVVzJIVbkgxg7GJBpYDhQ/Zg==} + + matchit@1.1.0: + resolution: {integrity: sha512-+nGYoOlfHmxe5BW5tE0EMJppXEwdSf8uBA1GTZC7Q77kbT35+VKLYJMzVNWCHSsga1ps1tPYFtFyvxvKzWVmMA==} + engines: {node: '>=6'} + + math-random@1.0.4: + resolution: {integrity: sha512-rUxjysqif/BZQH2yhd5Aaq7vXMSx9NdEsQcyA07uEzIvxgI7zIr33gGsh+RU0/XjmQpCW7RsVof1vlkvQVCK5A==} + + memfs@3.5.3: + resolution: {integrity: sha512-UERzLsxzllchadvbPs5aolHh65ISpKpM+ccLbOJ8/vvpBKmAWf+la7dXFy7Mr0ySHbdHrFv5kGFCUHHe6GFEmw==} + engines: {node: '>= 4.0.0'} + + meow@12.1.1: + resolution: {integrity: sha512-BhXM0Au22RwUneMPwSCnyhTOizdWoIEPU9sp0Aqa1PnDMR5Wv2FGXYDjuzJEIX+Eo2Rb8xuYe5jrnm5QowQFkw==} + engines: {node: '>=16.10'} + + meow@8.1.2: + resolution: {integrity: sha512-r85E3NdZ+mpYk1C6RjPFEMSE+s1iZMuHtsHAqY0DT3jZczl0diWUZ8g6oU7h0M9cD2EL+PzaYghhCLzR0ZNn5Q==} + engines: {node: '>=10'} + + merge-stream@1.0.1: + resolution: {integrity: sha512-e6RM36aegd4f+r8BZCcYXlO2P3H6xbUM6ktL2Xmf45GAOit9bI4z6/3VU7JwllVO1L7u0UDSg/EhzQ5lmMLolA==} + + 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'} + + merge@2.1.1: + resolution: {integrity: sha512-jz+Cfrg9GWOZbQAnDQ4hlVnQky+341Yk5ru8bZSe6sIDTCIg8n9i/u7hSQGSVOF3C7lH6mGtqjkiT9G4wFLL0w==} + + methods@1.1.2: + resolution: {integrity: sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==} + engines: {node: '>= 0.6'} + + micromatch@2.3.11: + resolution: {integrity: sha512-LnU2XFEk9xxSJ6rfgAry/ty5qwUTyHYOBU0g4R6tIw5ljwgGIBmiKhRWLw5NpMOnrgUNcDJ4WMp8rl3sYVHLNA==} + engines: {node: '>=0.10.0'} + + micromatch@4.0.5: + resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} + engines: {node: '>=8.6'} + + mime-db@1.52.0: + resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} + engines: {node: '>= 0.6'} + + mime-lite@1.0.3: + resolution: {integrity: sha512-V85l97zJSTG8FEvmdTlmNYb0UMrVBwvRjw7bWTf/aT6KjFwtz3iTz8D2tuFIp7lwiaO2C5ecnrEmSkkMRCrqVw==} + + mime-types@2.1.35: + resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} + engines: {node: '>= 0.6'} + + mime@2.6.0: + resolution: {integrity: sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==} + engines: {node: '>=4.0.0'} + hasBin: true + + mime@3.0.0: + resolution: {integrity: sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==} + engines: {node: '>=10.0.0'} + hasBin: true + + mimic-fn@2.1.0: + resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} + engines: {node: '>=6'} + + mimic-fn@4.0.0: + resolution: {integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==} + engines: {node: '>=12'} + + min-indent@1.0.1: + resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==} + engines: {node: '>=4'} + + minimatch@3.1.2: + resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + + minimatch@5.1.6: + resolution: {integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==} + engines: {node: '>=10'} + + minimatch@8.0.4: + resolution: {integrity: sha512-W0Wvr9HyFXZRGIDgCicunpQ299OKXs9RgZfaukz4qAW/pJhcpUfupc9c+OObPOFueNy8VSrZgEmDtk6Kh4WzDA==} + engines: {node: '>=16 || 14 >=14.17'} + + minimatch@9.0.3: + resolution: {integrity: sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==} + engines: {node: '>=16 || 14 >=14.17'} + + minimist-options@4.1.0: + resolution: {integrity: sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==} + engines: {node: '>= 6'} + + minimist@1.2.7: + resolution: {integrity: sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g==} + + minimist@1.2.8: + resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} + + minipass-collect@1.0.2: + resolution: {integrity: sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==} + engines: {node: '>= 8'} + + minipass-fetch@2.1.2: + resolution: {integrity: sha512-LT49Zi2/WMROHYoqGgdlQIZh8mLPZmOrN2NdJjMXxYe4nkN6FUyuPuOAOedNJDrx0IRGg9+4guZewtp8hE6TxA==} + engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + + minipass-flush@1.0.5: + resolution: {integrity: sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==} + engines: {node: '>= 8'} + + minipass-pipeline@1.2.4: + resolution: {integrity: sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==} + engines: {node: '>=8'} + + minipass-sized@1.0.3: + resolution: {integrity: sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==} + engines: {node: '>=8'} + + minipass@3.3.6: + resolution: {integrity: sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==} + engines: {node: '>=8'} + + minipass@4.2.8: + resolution: {integrity: sha512-fNzuVyifolSLFL4NzpF+wEF4qrgqaaKX0haXPQEdQ7NKAN+WecoKMHV09YcuL/DHxrUsYQOK3MiuDf7Ip2OXfQ==} + engines: {node: '>=8'} + + minipass@5.0.0: + resolution: {integrity: sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==} + engines: {node: '>=8'} + + minipass@7.0.4: + resolution: {integrity: sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==} + engines: {node: '>=16 || 14 >=14.17'} + + minizlib@2.1.2: + resolution: {integrity: sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==} + engines: {node: '>= 8'} + + mkdirp@0.5.6: + resolution: {integrity: sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==} + hasBin: true + + mkdirp@1.0.4: + resolution: {integrity: sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==} + engines: {node: '>=10'} + hasBin: true + + mnemonist@0.39.6: + resolution: {integrity: sha512-A/0v5Z59y63US00cRSLiloEIw3t5G+MiKz4BhX21FI+YBJXBOGW0ohFxTxO08dsOYlzxo87T7vGfZKYp2bcAWA==} + + modify-values@1.0.1: + resolution: {integrity: sha512-xV2bxeN6F7oYjZWTe/YPAy6MN2M+sL4u/Rlm2AHCIVGfo2p1yGmBHQ6vHehl4bRTZBdHu3TSkWdYgkwpYzAGSw==} + engines: {node: '>=0.10.0'} + + module@1.2.5: + resolution: {integrity: sha512-Y+j9HcHf8V6YtNBkLbPmREAUi5xGbAdb9ycXpo2roABDPrJEzd79kmoH5Ib9lpxcNVsHWa1LhRZJcflUq2+N3w==} + hasBin: true + + ms@2.0.0: + resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==} + + ms@2.1.2: + resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} + + ms@2.1.3: + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + + mute-stream@0.0.8: + resolution: {integrity: sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==} + + nan@2.19.0: + resolution: {integrity: sha512-nO1xXxfh/RWNxfd/XPfbIfFk5vgLsAxUR9y5O0cHMJu/AW9U95JLXqthYHjEp+8gQ5p96K9jUp8nbVOxCdRbtw==} + + nanoid@3.3.7: + resolution: {integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + + 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==} + engines: {node: '>= 0.6'} + + neo-async@2.6.2: + resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} + + nestjs-cls@4.2.0: + resolution: {integrity: sha512-sdvdhBmM9eb9d1URtcK7642S3ufD9ZWaKRt4Ouf1gIGmd73YniiKCxxOFwChRqDU+sr7hwxT560JaA27R/7RJQ==} + engines: {node: '>=16'} + peerDependencies: + '@nestjs/common': '> 7.0.0 < 11' + '@nestjs/core': '> 7.0.0 < 11' + reflect-metadata: '*' + rxjs: '>= 7' + + nestjs-oauth2@0.0.7: + resolution: {integrity: sha512-P4HfJziGsMl4+aTclr9vkqfbI84odja1kOjKZw095A+b4ksVczOC4J/AH4BydsIAPVsj/5RJj4aGFoWV90Bu1w==} + peerDependencies: + '@nestjs/common': ^9.0.0 + rxjs: ^7.x + + nestjs-pino@4.0.0: + resolution: {integrity: sha512-XhCg/R+l3w0BFP6MHyR6lU/BHVEV0tV9z24G0vuA9FD3sv+TQNvnO9uVsF1l/oVspgGfQ9Qulmb2UbsfYlI0+g==} + engines: {node: '>= 14'} + peerDependencies: + '@nestjs/common': ^8.0.0 || ^9.0.0 || ^10.0.0 + pino-http: ^6.4.0 || ^7.0.0 || ^8.0.0 || ^9.0.0 + + nestjs-prisma@0.23.0: + resolution: {integrity: sha512-0pIMDasayP+vMFSztcs85zu4WSPTKM85F8vIrqn7GsUBboEcKhI8eCeVghhNyKDGzEBaNAYNJlo2MAWdNuN7Tw==} + peerDependencies: + '@nestjs/common': ^7.0.0 || ^8.0.0 || ^9.0.0 || ^10.0.0 + '@prisma/client': ^2.0.0 || ^3.0.0 || ^4.0.0 || ^5.0.0 + prisma: ^2.0.0 || ^3.0.0 || ^4.0.0 || ^5.0.0 + + node-abort-controller@3.1.1: + resolution: {integrity: sha512-AGK2yQKIjRuqnc6VkX2Xj5d+QW8xZ87pa1UK6yA6ouUyuxfHuMP6umE5QK7UmTeOAymo+Zx1Fxiuw9rVx8taHQ==} + + node-addon-api@5.1.0: + resolution: {integrity: sha512-eh0GgfEkpnoWDq+VY8OyvYhFEzBk6jIYbRKdIlyTiAXIVJ8PyBaKb0rp7oDtoddbdoHWhq8wwr+XZ81F1rpNdA==} + + 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-gyp@9.4.1: + resolution: {integrity: sha512-OQkWKbjQKbGkMf/xqI1jjy3oCTgMKJac58G2+bjZb3fza6gW2YrCSdMQYaoTb70crvE//Gngr4f0AgVHmqHvBQ==} + engines: {node: ^12.13 || ^14.13 || >=16} + hasBin: true + + node-int64@0.4.0: + resolution: {integrity: sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==} + + node-releases@2.0.14: + resolution: {integrity: sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==} + + nopt@5.0.0: + resolution: {integrity: sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==} + engines: {node: '>=6'} + hasBin: true + + nopt@6.0.0: + resolution: {integrity: sha512-ZwLpbTgdhuZUnZzjd7nb1ZV+4DoiC6/sfiVKok72ym/4Tlf+DFdlHYmT2JPmcNNWV6Pi3SDf1kT+A4r9RTuT9g==} + engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + hasBin: true + + normalize-package-data@2.5.0: + resolution: {integrity: sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==} + + normalize-package-data@3.0.3: + resolution: {integrity: sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==} + engines: {node: '>=10'} + + normalize-path@2.1.1: + resolution: {integrity: sha512-3pKJwH184Xo/lnH6oyP1q2pMd7HcypqqmRs91/6/i2CGtWwIKGCkOOMTm/zXbgTEWHw1uNpNi/igc3ePOYHb6w==} + engines: {node: '>=0.10.0'} + + normalize-path@3.0.0: + resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} + engines: {node: '>=0.10.0'} + + npm-run-path@4.0.1: + resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} + engines: {node: '>=8'} + + npm-run-path@5.3.0: + resolution: {integrity: sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + npmlog@5.0.1: + resolution: {integrity: sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==} + + npmlog@6.0.2: + resolution: {integrity: sha512-/vBvz5Jfr9dT/aFWd0FIRf+T/Q2WBsLENygUaFUqstqsycmZAP/t5BvFJTK0viFmSUxiUKTUplWy5vt+rvKIxg==} + engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + + number-is-nan@1.0.1: + resolution: {integrity: sha512-4jbtZXNAsfZbAHiiqjLPBiCl16dES1zI4Hpzzxw61Tk+loF+sBDBKx1ICKKKwIqQ7M0mFn1TmkN7euSncWgHiQ==} + engines: {node: '>=0.10.0'} + + oauth@0.10.0: + resolution: {integrity: sha512-1orQ9MT1vHFGQxhuy7E/0gECD3fd2fCC+PIX+/jgmU/gI3EpRocXtmtvxCO5x3WZ443FLTLFWNDjl5MPJf9u+Q==} + + object-assign@4.1.0: + resolution: {integrity: sha512-Lbc7GfN7XFaK30bzUN3cDYLOkT0dH05S0ax1QikylHUD9+Z9PRF3G1iYwX3kcz+6AlzTFGkUgMxz6l3aUwbwTA==} + engines: {node: '>=0.10.0'} + + object-assign@4.1.1: + resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} + engines: {node: '>=0.10.0'} + + object-inspect@1.13.1: + resolution: {integrity: sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==} + + object.omit@2.0.1: + resolution: {integrity: sha512-UiAM5mhmIuKLsOvrL+B0U2d1hXHF3bFYWIuH1LMpuV2EJEHG1Ntz06PgLEHjm6VFd87NpH8rastvPoyv6UW2fA==} + engines: {node: '>=0.10.0'} + + obliterator@2.0.4: + resolution: {integrity: sha512-lgHwxlxV1qIg1Eap7LgIeoBWIMFibOjbrYPIPJZcI1mmGAI2m3lNYpK12Y+GBdPQ0U1hRwSord7GIaawz962qQ==} + + on-exit-leak-free@2.1.2: + resolution: {integrity: sha512-0eJJY6hXLGf1udHwfNftBqH+g73EU4B504nZeKpz1sYRKafAghwxEJunB2O7rDZkL4PGfsMVnTXZ2EjibbqcsA==} + engines: {node: '>=14.0.0'} + + once@1.4.0: + resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + + onetime@5.1.2: + resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} + engines: {node: '>=6'} + + onetime@6.0.0: + resolution: {integrity: sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==} + engines: {node: '>=12'} + + openapi-fuzzer-core@1.0.6: + resolution: {integrity: sha512-FJNJIfgUFuv4NmVGq9MYdoKra2GrkDy2uhIjE2YGlw30UA1glf4SXLMhI4UwdcJ8jisKdIxi7lXrfej8GvNW5w==} + + optionator@0.9.3: + resolution: {integrity: sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==} + engines: {node: '>= 0.8.0'} + + ora@5.4.1: + resolution: {integrity: sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==} + engines: {node: '>=10'} + + ordered-read-streams@0.3.0: + resolution: {integrity: sha512-xQvd8qvx9U1iYY9aVqPpoF5V9uaWJKV6ZGljkh/jkiNX0DiQsjbWvRumbh10QTMDE8DheaOEU8xi0szbrgjzcw==} + + os-homedir@1.0.2: + resolution: {integrity: sha512-B5JU3cabzk8c67mRRd3ECmROafjYMXbuzlwtqdM8IbS8ktlTix8aFGb2bAGKrSRIlnfKwovGUUr72JUPyOb6kQ==} + engines: {node: '>=0.10.0'} + + os-locale@1.4.0: + resolution: {integrity: sha512-PRT7ZORmwu2MEFt4/fv3Q+mEfN4zetKxufQrkShY2oGvUms9r8otu5HfdyIFHkYXjO7laNsoVGmM2MANfuTA8g==} + engines: {node: '>=0.10.0'} + + 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'} + + p-is-promise@3.0.0: + resolution: {integrity: sha512-Wo8VsW4IRQSKVXsJCn7TomUaVtyfjVDn3nUP7kE967BQk0CwFpdbZs0X0uk5sW9mkBa9eNM7hCMaG93WUAwxYQ==} + engines: {node: '>=8'} + + p-limit@1.3.0: + resolution: {integrity: sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==} + engines: {node: '>=4'} + + p-limit@2.3.0: + resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} + engines: {node: '>=6'} + + p-limit@3.1.0: + resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} + engines: {node: '>=10'} + + p-limit@4.0.0: + resolution: {integrity: sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + p-locate@2.0.0: + resolution: {integrity: sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg==} + engines: {node: '>=4'} + + p-locate@3.0.0: + resolution: {integrity: sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==} + engines: {node: '>=6'} + + p-locate@4.1.0: + resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} + engines: {node: '>=8'} + + p-locate@5.0.0: + resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} + engines: {node: '>=10'} + + p-locate@6.0.0: + resolution: {integrity: sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + p-map@4.0.0: + resolution: {integrity: sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==} + engines: {node: '>=10'} + + p-try@1.0.0: + resolution: {integrity: sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww==} + engines: {node: '>=4'} + + p-try@2.2.0: + resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} + engines: {node: '>=6'} + + pactum-matchers@1.1.6: + resolution: {integrity: sha512-55io32NeOKbLpHKKPzYDOr+N2dseTzMbj1Gj1y+zvOkKK6NDf5BT5pxglfqLN/ra3ig5zvbrKFUqZIWjAWboog==} + + pactum@3.6.3: + resolution: {integrity: sha512-iAizqD9sgJsVVKm0sBzDm2ZjqBMJBr/ZTbKOYawfT014EsoSIzuHIsolpslRKsHlru6MFwlg530XrEpaBmElrA==} + engines: {node: '>=10'} + + parent-module@1.0.1: + resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} + engines: {node: '>=6'} + + parse-glob@3.0.4: + resolution: {integrity: sha512-FC5TeK0AwXzq3tUBFtH74naWkPQCEWs4K+xMxWZBlKDWu0bVHXGZa+KKqxKidd7xwhdZ19ZNuF2uO1M/r196HA==} + engines: {node: '>=0.10.0'} + + parse-graphql@1.0.0: + resolution: {integrity: sha512-NjvQHHaiPCxPZrhm/kKnorxOv7r/eA+tE0VW5E8iJMH9wTqFA1V0YK/7nbpxVu3JdXUxyWTKMez9lsHUtAwa0w==} + + parse-json@2.2.0: + resolution: {integrity: sha512-QR/GGaKCkhwk1ePQNYDRKYZ3mwU9ypsKhB0XyFnLQdomyEqk3e8wpW3V5Jp88zbxK4n5ST1nqo+g9juTpownhQ==} + engines: {node: '>=0.10.0'} + + parse-json@4.0.0: + resolution: {integrity: sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==} + engines: {node: '>=4'} + + parse-json@5.2.0: + resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} + engines: {node: '>=8'} + + parse-passwd@1.0.0: + resolution: {integrity: sha512-1Y1A//QUXEZK7YKz+rD9WydcE1+EuPr6ZBgKecAB8tmoW6UFv0NREVJe1p+jRxtThkcbbKkfwIbWJe/IeE6m2Q==} + engines: {node: '>=0.10.0'} + + passport-jwt@4.0.1: + resolution: {integrity: sha512-UCKMDYhNuGOBE9/9Ycuoyh7vP6jpeTp/+sfMJl7nLff/t6dps+iaeE0hhNkKN8/HZHcJ7lCdOyDxHdDoxoSvdQ==} + + passport-local@1.0.0: + resolution: {integrity: sha512-9wCE6qKznvf9mQYYbgJ3sVOHmCWoUNMVFoZzNoznmISbhnNNPhN9xfY3sLmScHMetEJeoY7CXwfhCe7argfQow==} + engines: {node: '>= 0.4.0'} + + passport-strategy@1.0.0: + resolution: {integrity: sha512-CB97UUvDKJde2V0KDWWB3lyf6PC3FaZP7YxZ2G8OAtn9p4HI9j9JLP9qjOGZFvyl8uwNT8qM+hGnz/n16NI7oA==} + engines: {node: '>= 0.4.0'} + + passport@0.7.0: + resolution: {integrity: sha512-cPLl+qZpSc+ireUvt+IzqbED1cHHkDoVYMo30jbJIdOOjQ1MQYZBPiNvmi8UM6lJuOpTPXJGZQk0DtC4y61MYQ==} + engines: {node: '>= 0.4.0'} + + path-dirname@1.0.2: + resolution: {integrity: sha512-ALzNPpyNq9AqXMBjeymIjFDAkAFH06mHJH/cSBHAgU0s4vfpBn6b2nf8tiRLvagKD8RbTpq2FKTBg7cl9l3c7Q==} + + path-exists@2.1.0: + resolution: {integrity: sha512-yTltuKuhtNeFJKa1PiRzfLAU5182q1y4Eb4XCJ3PBqyzEDkAZRzBrKKBct682ls9reBVHf9udYLN5Nd+K1B9BQ==} + engines: {node: '>=0.10.0'} + + path-exists@3.0.0: + resolution: {integrity: sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==} + engines: {node: '>=4'} + + path-exists@4.0.0: + resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} + engines: {node: '>=8'} + + path-exists@5.0.0: + resolution: {integrity: sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + path-is-absolute@1.0.1: + resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} + engines: {node: '>=0.10.0'} + + path-key@3.1.1: + resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} + engines: {node: '>=8'} + + path-key@4.0.0: + resolution: {integrity: sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==} + engines: {node: '>=12'} + + path-parse@1.0.7: + resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + + path-scurry@1.10.1: + resolution: {integrity: sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ==} + engines: {node: '>=16 || 14 >=14.17'} + + path-to-regexp@3.2.0: + resolution: {integrity: sha512-jczvQbCUS7XmS7o+y1aEO9OBVFeZBQ1MDSEqmO7xSoPgOPoowY/SxLpZ6Vh97/8qHZOteiCKb7gkG9gA2ZUxJA==} + + path-to-regexp@6.2.1: + resolution: {integrity: sha512-JLyh7xT1kizaEvcaXOQwOc2/Yhw6KZOvPf1S8401UyLk86CU79LN3vl7ztXGm/pZ+YjoyAJ4rxmHwbkBXJX+yw==} + + path-type@1.1.0: + resolution: {integrity: sha512-S4eENJz1pkiQn9Znv33Q+deTOKmbl+jj1Fl+qiP/vYezj+S8x+J3Uo0ISrx/QoEvIlOaDWJhPaRd1flJ9HXZqg==} + engines: {node: '>=0.10.0'} + + path-type@3.0.0: + resolution: {integrity: sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==} + engines: {node: '>=4'} + + path-type@4.0.0: + resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} + engines: {node: '>=8'} + + pause@0.0.1: + resolution: {integrity: sha512-KG8UEiEVkR3wGEb4m5yZkVCzigAD+cVEJck2CzYZO37ZGJfctvVptVO192MwrtPhzONn6go8ylnOdMhKqi4nfg==} + + peek-stream@1.1.3: + resolution: {integrity: sha512-FhJ+YbOSBb9/rIl2ZeE/QHEsWn7PqNYt8ARAY3kIgNGOk13g9FGyIY6JIl/xB/3TFRVoTv5as0l11weORrTekA==} + + phin@3.7.0: + resolution: {integrity: sha512-DqnVNrpYhKGBZppNKprD+UJylMeEKOZxHgPB+ZP6mGzf3uA2uox4Ep9tUm+rUc8WLIdHT3HcAE4X8fhwQA9JKg==} + engines: {node: '>= 8'} + deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. + + picocolors@1.0.0: + resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} + + picomatch@2.3.1: + resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} + engines: {node: '>=8.6'} + + pify@2.3.0: + resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==} + engines: {node: '>=0.10.0'} + + pify@3.0.0: + resolution: {integrity: sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==} + engines: {node: '>=4'} + + pinkie-promise@2.0.1: + resolution: {integrity: sha512-0Gni6D4UcLTbv9c57DfxDGdr41XfgUjqWZu492f0cIGr16zDU06BWP/RAEvOuo7CQ0CNjHaLlM59YJJFm3NWlw==} + engines: {node: '>=0.10.0'} + + pinkie@2.0.4: + resolution: {integrity: sha512-MnUuEycAemtSaeFSjXKW/aroV7akBbY+Sv+RkyqFjgAe73F+MR0TBWKBRDkmfWq/HiFmdavfZ1G7h4SPZXaCSg==} + engines: {node: '>=0.10.0'} + + pino-abstract-transport@1.1.0: + resolution: {integrity: sha512-lsleG3/2a/JIWUtf9Q5gUNErBqwIu1tUKTT3dUzaf5DySw9ra1wcqKjJjLX1VTY64Wk1eEOYsVGSaGfCK85ekA==} + + pino-http@9.0.0: + resolution: {integrity: sha512-Q9QDNEz0vQmbJtMFjOVr2c9yL92vHudjmr3s3m6J1hbw3DBGFZJm3TIj9TWyynZ4GEsEA9SOtni4heRUr6lNOg==} + + pino-pretty@10.3.1: + resolution: {integrity: sha512-az8JbIYeN/1iLj2t0jR9DV48/LQ3RC6hZPpapKPkb84Q+yTidMCpgWxIT3N0flnBDilyBQ1luWNpOeJptjdp/g==} + hasBin: true + + pino-std-serializers@6.2.2: + resolution: {integrity: sha512-cHjPPsE+vhj/tnhCy/wiMh3M3z3h/j15zHQX+S9GkTBgqJuTuJzYJ4gUyACLhDaJ7kk9ba9iRDmbH2tJU03OiA==} + + pino@8.18.0: + resolution: {integrity: sha512-Mz/gKiRyuXu4HnpHgi1YWdHQCoWMufapzooisvFn78zl4dZciAxS+YeRkUxXl1ee/SzU80YCz1zpECCh4oC6Aw==} + hasBin: true + + pirates@4.0.6: + resolution: {integrity: sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==} + engines: {node: '>= 6'} + + pkg-conf@1.1.3: + resolution: {integrity: sha512-9hHgE5+Xai/ChrnahNP8Ke0VNF/s41IZIB/d24eMHEaRamdPg+wwlRm2lTb5wMvE8eTIKrYZsrxfuOwt3dpsIQ==} + engines: {node: '>=0.10.0'} + + pkg-dir@4.2.0: + resolution: {integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==} + engines: {node: '>=8'} + + pluralize-esm@9.0.5: + resolution: {integrity: sha512-Kb2dcpMsIutFw2hYrN0EhsAXOUJTd6FVMIxvNAkZCMQLVt9NGZqQczvGpYDxNWCZeCWLHUPxQIBudWzt1h7VVA==} + engines: {node: '>=14.0.0'} + + pluralize@8.0.0: + resolution: {integrity: sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==} + engines: {node: '>=4'} + + polka@0.5.2: + resolution: {integrity: sha512-FVg3vDmCqP80tOrs+OeNlgXYmFppTXdjD5E7I4ET1NjvtNmQrb1/mJibybKkb/d4NA7YWAr1ojxuhpL3FHqdlw==} + + prelude-ls@1.2.1: + resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} + engines: {node: '>= 0.8.0'} + + preserve@0.2.0: + resolution: {integrity: sha512-s/46sYeylUfHNjI+sA/78FAHlmIuKqI9wNnzEOGehAlUUYeObv5C2mOinXBjyUyWmJ2SfcS2/ydApH4hTF4WXQ==} + engines: {node: '>=0.10.0'} + + prettier-linter-helpers@1.0.0: + resolution: {integrity: sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==} + engines: {node: '>=6.0.0'} + + prettier@2.8.8: + resolution: {integrity: sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==} + engines: {node: '>=10.13.0'} + hasBin: true + + prettier@3.0.0: + resolution: {integrity: sha512-zBf5eHpwHOGPC47h0zrPyNn+eAEIdEzfywMoYn2XPi0P44Zp0tSq64rq0xAREh4auw2cJZHo9QUob+NqCQky4g==} + engines: {node: '>=14'} + hasBin: true + + pretty-format@29.7.0: + resolution: {integrity: sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + prisma-nested-middleware@4.0.0: + resolution: {integrity: sha512-WSx0nl7KNXEzGaNC87fuDBOdAjj3V6um/JoQUo24PaMzMy8tvOYfb2Mw25OZhnrMXNTBhqgk4rJTUW3CVcDsHQ==} + peerDependencies: + '@prisma/client': '*' + + prisma-soft-delete-middleware@1.3.1: + resolution: {integrity: sha512-oQ2Ba8wb23ho6PqMXkOSTQTXNKouLmZuILYDHrnKk1Ui3cGIXuj9zNWyJkoaTcWHznsiAaoP1Oy8ytDhwQNQqA==} + peerDependencies: + '@prisma/client': '*' + + prisma@5.10.2: + resolution: {integrity: sha512-hqb/JMz9/kymRE25pMWCxkdyhbnIWrq+h7S6WysJpdnCvhstbJSNP/S6mScEcqiB8Qv2F+0R3yG+osRaWqZacQ==} + engines: {node: '>=16.13'} + hasBin: true + + process-nextick-args@1.0.7: + resolution: {integrity: sha512-yN0WQmuCX63LP/TMvAg31nvT6m4vDqJEiiv2CAZqWOGNWutc9DfDk1NPYYmKUFmaVM2UwDowH4u5AHWYP/jxKw==} + + process-nextick-args@2.0.1: + resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} + + process-warning@3.0.0: + resolution: {integrity: sha512-mqn0kFRl0EoqhnL0GQ0veqFHyIN1yig9RHh/InzORTUiZHFRAur+aMtRkELNwGs9aNwKS6tg/An4NYBPGwvtzQ==} + + process@0.11.10: + resolution: {integrity: sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==} + engines: {node: '>= 0.6.0'} + + promise-coalesce@1.1.2: + resolution: {integrity: sha512-zLaJ9b8hnC564fnJH6NFSOGZYYdzrAJn2JUUIwzoQb32fG2QAakpDNM+CZo1km6keXkRXRM+hml1BFAPVnPkxg==} + engines: {node: '>=16'} + + promise-inflight@1.0.1: + resolution: {integrity: sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==} + peerDependencies: + bluebird: '*' + peerDependenciesMeta: + bluebird: + optional: true + + promise-retry@2.0.1: + resolution: {integrity: sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==} + engines: {node: '>=10'} + + prompts@2.4.2: + resolution: {integrity: sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==} + engines: {node: '>= 6'} + + proxy-addr@2.0.7: + resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==} + engines: {node: '>= 0.10'} + + proxy-from-env@1.1.0: + resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} + + pump@3.0.0: + resolution: {integrity: sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==} + + pumpify@2.0.1: + resolution: {integrity: sha512-m7KOje7jZxrmutanlkS1daj1dS6z6BgslzOXmcSEpIlCxM3VJH7lG5QLeck/6hgF6F4crFf01UtQmNsJfweTAw==} + + punycode@2.3.1: + resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} + engines: {node: '>=6'} + + pure-rand@6.0.4: + resolution: {integrity: sha512-LA0Y9kxMYv47GIPJy6MI84fqTd2HmYZI83W/kM/SkKfDlajnZYfmXFTxkbY+xSBPkLJxltMa9hIkmdc29eguMA==} + + q@1.5.1: + resolution: {integrity: sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==} + engines: {node: '>=0.6.0', teleport: '>=0.2.0'} + + qs@6.11.2: + resolution: {integrity: sha512-tDNIz22aBzCDxLtVH++VnTfzxlfeK5CbqohpSqpJgj1Wg/cQbStNAz3NuqCs5vV+pjBsK4x4pN9HlVh7rcYRiA==} + engines: {node: '>=0.6'} + + queue-microtask@1.2.3: + resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + + quick-format-unescaped@4.0.4: + resolution: {integrity: sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg==} + + quick-lru@4.0.1: + resolution: {integrity: sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==} + engines: {node: '>=8'} + + randomatic@3.1.1: + resolution: {integrity: sha512-TuDE5KxZ0J461RVjrJZCJc+J+zCkTb1MbH9AQUq68sMhOMcy9jLcb3BrZKgp9q9Ncltdg4QVqWrH02W2EFFVYw==} + engines: {node: '>= 0.10.0'} + + randombytes@2.1.0: + resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} + + react-is@18.2.0: + resolution: {integrity: sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==} + + read-pkg-up@1.0.1: + resolution: {integrity: sha512-WD9MTlNtI55IwYUS27iHh9tK3YoIVhxis8yKhLpTqWtml739uXc9NWTpxoHkfZf3+DkCCsXox94/VWZniuZm6A==} + engines: {node: '>=0.10.0'} + + read-pkg-up@3.0.0: + resolution: {integrity: sha512-YFzFrVvpC6frF1sz8psoHDBGF7fLPc+llq/8NB43oagqWkx8ar5zYtsTORtOjw9W2RHLpWP+zTWwBvf1bCmcSw==} + engines: {node: '>=4'} + + read-pkg-up@7.0.1: + resolution: {integrity: sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==} + engines: {node: '>=8'} + + read-pkg@1.1.0: + resolution: {integrity: sha512-7BGwRHqt4s/uVbuyoeejRn4YmFnYZiFl4AuaeXHlgZf3sONF0SOGlxs2Pw8g6hCKupo08RafIO5YXFNOKTfwsQ==} + engines: {node: '>=0.10.0'} + + read-pkg@3.0.0: + resolution: {integrity: sha512-BLq/cCO9two+lBgiTYNqD6GdtK8s4NpaWrl6/rCO9w0TUS8oJl7cmToOZfRYllKTISY6nt1U7jQ53brmKqY6BA==} + engines: {node: '>=4'} + + read-pkg@5.2.0: + resolution: {integrity: sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==} + engines: {node: '>=8'} + + readable-stream@1.0.34: + resolution: {integrity: sha512-ok1qVCJuRkNmvebYikljxJA/UEsKwLl2nI1OmaqAu4/UE+h0wKCHok4XkL/gvi39OacXvw59RJUOFUkDib2rHg==} + + readable-stream@2.0.6: + resolution: {integrity: sha512-TXcFfb63BQe1+ySzsHZI/5v1aJPCShfqvWJ64ayNImXMsN1Cd0YGk/wm8KB7/OeessgPc9QvS9Zou8QTkFzsLw==} + + 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'} + + readable-stream@4.5.2: + resolution: {integrity: sha512-yjavECdqeZ3GLXNgRXgeQEdz9fvDDkNKyHnbHRFtOr7/LcfgBcmct7t/ET+HaCTqfh06OzoAxrkN/IfjJBVe+g==} + 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'} + + real-require@0.2.0: + resolution: {integrity: sha512-57frrGM/OCTLqLOAh0mhVA9VBMHd+9U7Zb2THMGdBUoZVOtGbJzjxsYGDJ3A9AYYCP4hn6y1TVbaOfzWtm5GFg==} + engines: {node: '>= 12.13.0'} + + rechoir@0.6.2: + resolution: {integrity: sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==} + engines: {node: '>= 0.10'} + + redent@3.0.0: + resolution: {integrity: sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==} + engines: {node: '>=8'} + + reflect-metadata@0.1.13: + resolution: {integrity: sha512-Ts1Y/anZELhSsjMcU605fU9RE4Oi3p5ORujwbIKXfWa+0Zxs510Qrmrce5/Jowq3cHSZSJqBjypxmHarc+vEWg==} + + regex-cache@0.4.4: + resolution: {integrity: sha512-nVIZwtCjkC9YgvWkpM55B5rBhBYRZhAaJbgcFYXXsHnbZ9UZI9nnVWYZpBlCqv9ho2eZryPnWrZGsOdPwVWXWQ==} + engines: {node: '>=0.10.0'} + + remove-trailing-separator@1.1.0: + resolution: {integrity: sha512-/hS+Y0u3aOfIETiaiirUFwDBDzmXPvO+jAfKTitUngIPzdKc6Z0LoFjM/CK5PL4C+eKwHohlHAb6H0VFfmmUsw==} + + repeat-element@1.1.4: + resolution: {integrity: sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ==} + engines: {node: '>=0.10.0'} + + repeat-string@1.6.1: + resolution: {integrity: sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==} + engines: {node: '>=0.10'} + + replace-ext@0.0.1: + resolution: {integrity: sha512-AFBWBy9EVRTa/LhEcG8QDP3FvpwZqmvN2QFDuJswFeaVhWnZMp8q3E6Zd90SR04PlIwfGdyVjNyLPyen/ek5CQ==} + engines: {node: '>= 0.4'} + + require-directory@2.1.1: + resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} + engines: {node: '>=0.10.0'} + + require-from-string@2.0.2: + resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} + engines: {node: '>=0.10.0'} + + require-main-filename@1.0.1: + resolution: {integrity: sha512-IqSUtOVP4ksd1C/ej5zeEh/BIP2ajqpn8c5x+q99gvcIG/Qf0cud5raVnE/Dwd0ua9TXYDoDc0RE5hBSdz22Ug==} + + resolve-cwd@3.0.0: + resolution: {integrity: sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==} + engines: {node: '>=8'} + + resolve-dir@1.0.1: + resolution: {integrity: sha512-R7uiTjECzvOsWSfdM0QKFNBVFcK27aHOUwdvK53BcW8zqnGdYp0Fbj82cy54+2A4P2tFM22J5kRfe1R+lM/1yg==} + engines: {node: '>=0.10.0'} + + resolve-from@4.0.0: + resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} + engines: {node: '>=4'} + + resolve-from@5.0.0: + resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} + engines: {node: '>=8'} + + resolve-url@0.2.1: + resolution: {integrity: sha512-ZuF55hVUQaaczgOIwqWzkEcEidmlD/xl44x1UZnhOXcYuFN2S6+rcxpG+C1N3So0wvNI3DmJICUFfu2SxhBmvg==} + deprecated: https://github.com/lydell/resolve-url#deprecated + + resolve.exports@2.0.2: + resolution: {integrity: sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg==} + engines: {node: '>=10'} + + resolve@1.22.8: + resolution: {integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==} + hasBin: true + + restore-cursor@3.1.0: + resolution: {integrity: sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==} + engines: {node: '>=8'} + + ret@0.2.2: + resolution: {integrity: sha512-M0b3YWQs7R3Z917WRQy1HHA7Ba7D8hvZg6UE5mLykJxQVE2ju0IXbGlaHPPlkY+WN7wFP+wUMXmBFA0aV6vYGQ==} + engines: {node: '>=4'} + + retry@0.12.0: + resolution: {integrity: sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==} + engines: {node: '>= 4'} + + reusify@1.0.4: + resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} + engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + + rfdc@1.3.1: + resolution: {integrity: sha512-r5a3l5HzYlIC68TpmYKlxWjmOP6wiPJ1vWv2HeLhNsRZMrCkxeqxiHlQ21oXmQ4F3SiryXBHhAD7JZqvOJjFmg==} + + rimraf@3.0.2: + resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} + 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'} + + run-parallel@1.2.0: + resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + + rxjs@6.6.7: + resolution: {integrity: sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==} + engines: {npm: '>=2.0.0'} + + rxjs@7.8.1: + resolution: {integrity: sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==} + + safe-buffer@5.1.2: + resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} + + safe-buffer@5.2.1: + resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + + safe-regex2@2.0.0: + resolution: {integrity: sha512-PaUSFsUaNNuKwkBijoAPHAK6/eM6VirvyPWlZ7BAQy4D+hCvh4B6lIG+nPdhbFfIbP+gTGBcrdsOaUs0F+ZBOQ==} + + safe-stable-stringify@2.4.3: + resolution: {integrity: sha512-e2bDA2WJT0wxseVd4lsDP4+3ONX6HpMXQa1ZhFQ7SU+GjvORCmShbCMltrtIDfkYhVHrOcPtj+KhmDBdPdZD1g==} + engines: {node: '>=10'} + + safer-buffer@2.1.2: + resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} + + schema-utils@3.3.0: + resolution: {integrity: sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==} + engines: {node: '>= 10.13.0'} + + secure-json-parse@2.7.0: + resolution: {integrity: sha512-6aU+Rwsezw7VR8/nyvKTx8QpWH9FrcYiXXlqC4z5d5XQBDRqtbfsRjnwGyqbi3gddNtWHuEk9OANUotL26qKUw==} + + semver@5.7.2: + resolution: {integrity: sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==} + hasBin: true + + semver@6.3.1: + resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} + hasBin: true + + semver@7.6.0: + resolution: {integrity: sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==} + engines: {node: '>=10'} + hasBin: true + + serialize-javascript@6.0.2: + resolution: {integrity: sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==} + + set-blocking@2.0.0: + resolution: {integrity: sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==} + + set-cookie-parser@2.6.0: + resolution: {integrity: sha512-RVnVQxTXuerk653XfuliOxBP81Sf0+qfQE73LIYKcyMYHG94AuH0kgrQpRDuTZnSmjpysHmzxJXKNfa6PjFhyQ==} + + set-function-length@1.2.1: + resolution: {integrity: sha512-j4t6ccc+VsKwYHso+kElc5neZpjtq9EnRICFZtWyBsLojhmeF/ZBd/elqm22WJh/BziDe/SBiOeAt0m2mfLD0g==} + engines: {node: '>= 0.4'} + + setprototypeof@1.2.0: + resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} + + shebang-command@2.0.0: + resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} + engines: {node: '>=8'} + + shebang-regex@3.0.0: + 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@1.0.5: + resolution: {integrity: sha512-QcgiIWV4WV7qWExbN5llt6frQB/lBven9pqliLXfGPB+K9ZYXxDozp0wLkHS24kWCm+6YXH/f0HhnObZnZOBnQ==} + engines: {node: '>= 0.4'} + + signal-exit@3.0.7: + resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} + + signal-exit@4.1.0: + resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} + engines: {node: '>=14'} + + sisteransi@1.0.5: + resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} + + slash@3.0.0: + resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} + engines: {node: '>=8'} + + smart-buffer@4.2.0: + resolution: {integrity: sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==} + engines: {node: '>= 6.0.0', npm: '>= 3.0.0'} + + socks-proxy-agent@7.0.0: + resolution: {integrity: sha512-Fgl0YPZ902wEsAyiQ+idGd1A7rSFx/ayC1CQVMw5P+EQx2V0SgpGtf6OKFhVjPflPUl9YMmEOnmfjCdMUsygww==} + engines: {node: '>= 10'} + + socks@2.8.3: + resolution: {integrity: sha512-l5x7VUUWbjVFbafGLxPWkYsHIhEvmF85tbIeFZWc8ZPtoMyybuEhL7Jye/ooC4/d48FgOjSJXgsF/AJPYCW8Zw==} + engines: {node: '>= 10.0.0', npm: '>= 3.0.0'} + + sonic-boom@3.8.0: + resolution: {integrity: sha512-ybz6OYOUjoQQCQ/i4LU8kaToD8ACtYP+Cj5qd2AO36bwbdewxWJ3ArmJ2cr6AvxlL2o0PqnCcPGUgkILbfkaCA==} + + source-map-resolve@0.5.3: + resolution: {integrity: sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==} + deprecated: See https://github.com/lydell/source-map-resolve#deprecated + + source-map-support@0.5.13: + resolution: {integrity: sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==} + + source-map-support@0.5.21: + resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} + + source-map-url@0.4.1: + resolution: {integrity: sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw==} + deprecated: See https://github.com/lydell/source-map-url#deprecated + + source-map@0.6.1: + resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} + engines: {node: '>=0.10.0'} + + source-map@0.7.3: + resolution: {integrity: sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==} + engines: {node: '>= 8'} + + source-map@0.7.4: + resolution: {integrity: sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==} + engines: {node: '>= 8'} + + sourcemap-codec@1.4.8: + resolution: {integrity: sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==} + deprecated: Please use @jridgewell/sourcemap-codec instead + + spdx-correct@3.2.0: + resolution: {integrity: sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==} + + spdx-exceptions@2.4.0: + resolution: {integrity: sha512-hcjppoJ68fhxA/cjbN4T8N6uCUejN8yFw69ttpqtBeCbF3u13n7mb31NB9jKwGTTWWnt9IbRA/mf1FprYS8wfw==} + + spdx-expression-parse@3.0.1: + resolution: {integrity: sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==} + + spdx-license-ids@3.0.17: + resolution: {integrity: sha512-sh8PWc/ftMqAAdFiBu6Fy6JUOYjqDJBJvIhpfDMyHrr0Rbp5liZqd4TjtQ/RgfLjKFZb+LMx5hpml5qOWy0qvg==} + + split2@3.2.2: + resolution: {integrity: sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg==} + + split2@4.2.0: + resolution: {integrity: sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==} + engines: {node: '>= 10.x'} + + split@1.0.1: + resolution: {integrity: sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg==} + + sprintf-js@1.0.3: + resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} + + sprintf-js@1.1.3: + resolution: {integrity: sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==} + + ssri@9.0.1: + resolution: {integrity: sha512-o57Wcn66jMQvfHG1FlYbWeZWW/dHZhJXjpIcTfXldXEk5nz5lStPo3mK0OJQfGR3RbZUlbISexbljkJzuEj/8Q==} + engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + + stack-utils@2.0.6: + resolution: {integrity: sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==} + engines: {node: '>=10'} + + standard-version@9.5.0: + resolution: {integrity: sha512-3zWJ/mmZQsOaO+fOlsa0+QK90pwhNd042qEcw6hKFNoLFs7peGyvPffpEBbK/DSGPbyOvli0mUIFv5A4qTjh2Q==} + engines: {node: '>=10'} + hasBin: true + + statuses@2.0.1: + resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==} + engines: {node: '>= 0.8'} + + stream-shift@1.0.3: + resolution: {integrity: sha512-76ORR0DO1o1hlKwTbi/DM3EXWGf3ZJYO8cXX5RJwnul2DEg2oyoZyjLNoQM8WsvZiFKCRfC1O0J7iCvie3RZmQ==} + + string-length@4.0.2: + resolution: {integrity: sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==} + engines: {node: '>=10'} + + string-width@1.0.2: + resolution: {integrity: sha512-0XsVpQLnVCXHJfyEs8tC0zpTVIr5PKKsQtkT29IwupnPTjtPmQ3xT/4yCREF9hYkV/3M3kzcUTSAZT6a6h81tw==} + engines: {node: '>=0.10.0'} + + string-width@4.2.3: + resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} + engines: {node: '>=8'} + + string-width@5.1.2: + resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} + engines: {node: '>=12'} + + string_decoder@0.10.31: + resolution: {integrity: sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==} + + 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==} + + stringify-package@1.0.1: + resolution: {integrity: sha512-sa4DUQsYciMP1xhKWGuFM04fB0LG/9DlluZoSVywUMRNvzid6XucHK0/90xGxRoHrAaROrcHK1aPKaijCtSrhg==} + deprecated: This module is not used anymore, and has been replaced by @npmcli/package-json + + strip-ansi@3.0.1: + resolution: {integrity: sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==} + engines: {node: '>=0.10.0'} + + strip-ansi@6.0.1: + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} + engines: {node: '>=8'} + + strip-ansi@7.1.0: + resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} + engines: {node: '>=12'} + + strip-bom-stream@1.0.0: + resolution: {integrity: sha512-7jfJB9YpI2Z0aH3wu10ZqitvYJaE0s5IzFuWE+0pbb4Q/armTloEUShymkDO47YSLnjAW52mlXT//hs9wXNNJQ==} + engines: {node: '>=0.10.0'} + + strip-bom@2.0.0: + resolution: {integrity: sha512-kwrX1y7czp1E69n2ajbG65mIo9dqvJ+8aBQXOGVxqwvNbsXdFM6Lq37dLAY3mknUwru8CfcCbfOLL/gMo+fi3g==} + engines: {node: '>=0.10.0'} + + strip-bom@3.0.0: + resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} + engines: {node: '>=4'} + + strip-bom@4.0.0: + resolution: {integrity: sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==} + engines: {node: '>=8'} + + strip-final-newline@2.0.0: + resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} + engines: {node: '>=6'} + + strip-final-newline@3.0.0: + resolution: {integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==} + engines: {node: '>=12'} + + strip-indent@3.0.0: + resolution: {integrity: sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==} + engines: {node: '>=8'} + + strip-json-comments@3.1.1: + resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} + engines: {node: '>=8'} + + superagent@8.1.2: + resolution: {integrity: sha512-6WTxW1EB6yCxV5VFOIPQruWGHqc3yI7hEmZK6h+pyk69Lk/Ut7rLUY6W/ONF2MjBuGjvmMiIpsrVJ2vjrHlslA==} + engines: {node: '>=6.4.0 <13 || >=14'} + + supertest@6.3.3: + resolution: {integrity: sha512-EMCG6G8gDu5qEqRQ3JjjPs6+FYT1a7Hv5ApHvtSghmOFJYtsU5S+pSb6Y2EUeCEY3CmEL3mmQ8YWlPOzQomabA==} + engines: {node: '>=6.4.0'} + + supports-color@2.0.0: + resolution: {integrity: sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==} + engines: {node: '>=0.8.0'} + + supports-color@5.5.0: + resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} + engines: {node: '>=4'} + + supports-color@7.2.0: + resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} + engines: {node: '>=8'} + + supports-color@8.1.1: + resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} + engines: {node: '>=10'} + + supports-preserve-symlinks-flag@1.0.0: + resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} + engines: {node: '>= 0.4'} + + swagger-ui-dist@5.11.2: + resolution: {integrity: sha512-jQG0cRgJNMZ7aCoiFofnoojeSaa/+KgWaDlfgs8QN+BXoGMpxeMVY5OEnjq4OlNvF3yjftO8c9GRAgcHlO+u7A==} + + symbol-observable@4.0.0: + resolution: {integrity: sha512-b19dMThMV4HVFynSAM1++gBHAbk2Tc/osgLIBZMKsyqh34jb2e8Os7T6ZW/Bt3pJFdBTd2JwAnAAEQV7rSNvcQ==} + engines: {node: '>=0.10'} + + symbol@0.2.3: + resolution: {integrity: sha512-IUW+ek7apEaW5bFhS6WpYoNtVpNTlNoqB/PH7YiMWQTxSPeXCzG4PILVakwXivJt3ZXWeO1fIJnUd/L9A/VeGA==} + + synckit@0.8.8: + resolution: {integrity: sha512-HwOKAP7Wc5aRGYdKH+dw0PRRpbO841v2DENBtjnR5HFWoiNByAl7vrx3p0G/rCyYXQsrxqtX48TImFtPcIHSpQ==} + engines: {node: ^14.18.0 || >=16.0.0} + + tapable@2.2.1: + resolution: {integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==} + engines: {node: '>=6'} + + tar@6.2.0: + resolution: {integrity: sha512-/Wo7DcT0u5HUV486xg675HtjNd3BXZ6xDbzsCUZPt5iw8bTQ63bP0Raut3mvro9u+CUyq7YQd8Cx55fsZXxqLQ==} + engines: {node: '>=10'} + + terser-webpack-plugin@5.3.10: + resolution: {integrity: sha512-BKFPWlPDndPs+NGGCr1U59t0XScL5317Y0UReNrHaw9/FwhPENlq6bfgs+4yPfyP51vqC1bQ4rp1EfXW5ZSH9w==} + engines: {node: '>= 10.13.0'} + peerDependencies: + '@swc/core': '*' + esbuild: '*' + uglify-js: '*' + webpack: ^5.1.0 + peerDependenciesMeta: + '@swc/core': + optional: true + esbuild: + optional: true + uglify-js: + optional: true + + terser@5.27.0: + resolution: {integrity: sha512-bi1HRwVRskAjheeYl291n3JC4GgO/Ty4z1nVs5AAsmonJulGxpSektecnNedrwK9C7vpvVtcX3cw00VSLt7U2A==} + engines: {node: '>=10'} + hasBin: true + + test-exclude@6.0.0: + resolution: {integrity: sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==} + engines: {node: '>=8'} + + text-extensions@1.9.0: + resolution: {integrity: sha512-wiBrwC1EhBelW12Zy26JeOUkQ5mRu+5o8rpsJk5+2t+Y5vE7e842qtZDQ2g1NpX/29HdyFeJ4nSIhI47ENSxlQ==} + engines: {node: '>=0.10'} + + text-extensions@2.4.0: + resolution: {integrity: sha512-te/NtwBwfiNRLf9Ijqx3T0nlqZiQ2XrrtBvu+cLL8ZRrGkO0NHTug8MYFKyoSrv/sHTaSKfilUkizV6XhxMJ3g==} + engines: {node: '>=8'} + + text-table@0.2.0: + resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} + + thread-stream@2.4.1: + resolution: {integrity: sha512-d/Ex2iWd1whipbT681JmTINKw0ZwOUBZm7+Gjs64DHuX34mmw8vJL2bFAaNacaW72zYiTJxSHi5abUuOi5nsfg==} + + through2-filter@2.0.0: + resolution: {integrity: sha512-miwWajb1B80NvIVKXFPN/o7+vJc4jYUvnZCwvhicRAoTxdD9wbcjri70j+BenCrN/JXEPKDjhpw4iY7yiNsCGg==} + + through2-filter@3.0.0: + resolution: {integrity: sha512-jaRjI2WxN3W1V8/FMZ9HKIBXixtiqs3SQSX4/YGIiP3gL6djW48VoZq9tDqeCWs3MT8YY5wb/zli8VW8snY1CA==} + + through2@0.6.5: + resolution: {integrity: sha512-RkK/CCESdTKQZHdmKICijdKKsCRVHs5KsLZ6pACAmF/1GPUQhonHSXWNERctxEp7RmvjdNbZTL5z9V7nSCXKcg==} + + through2@2.0.5: + resolution: {integrity: sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==} + + through2@4.0.2: + resolution: {integrity: sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==} + + through@2.3.8: + resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==} + + tildify@1.2.0: + resolution: {integrity: sha512-Y9q1GaV/BO65Z9Yf4NOGMuwt3SGdptkZBnaaKfTQakrDyCLiuO1Kc5wxW4xLdsjzunRtqtOdhekiUFmZbklwYQ==} + engines: {node: '>=0.10.0'} + + tmp@0.0.33: + resolution: {integrity: sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==} + engines: {node: '>=0.6.0'} + + tmpl@1.0.5: + resolution: {integrity: sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==} + + to-absolute-glob@0.1.1: + resolution: {integrity: sha512-Vvl5x6zNf9iVG1QTWeknmWrKzZxaeKfIDRibrZCR3b2V/2NlFJuD2HV7P7AVjaKLZNqLPHqyr0jGrW0fTcxCPQ==} + engines: {node: '>=0.10.0'} + + to-fast-properties@2.0.0: + resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==} + engines: {node: '>=4'} + + to-regex-range@5.0.1: + resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} + engines: {node: '>=8.0'} + + toad-cache@3.7.0: + resolution: {integrity: sha512-/m8M+2BJUpoJdgAHoG+baCwBT+tf2VraSfkBgl0Y00qIWt41DJ8R5B8nsEw0I58YwF5IZH6z24/2TobDKnqSWw==} + engines: {node: '>=12'} + + toidentifier@1.0.1: + resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} + engines: {node: '>=0.6'} + + tr46@0.0.3: + resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} + + tree-kill@1.2.2: + resolution: {integrity: sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==} + hasBin: true + + trim-newlines@3.0.1: + resolution: {integrity: sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==} + engines: {node: '>=8'} + + trouter@2.0.1: + resolution: {integrity: sha512-kr8SKKw94OI+xTGOkfsvwZQ8mWoikZDd2n8XZHjJVZUARZT+4/VV6cacRS6CLsH9bNm+HFIPU1Zx4CnNnb4qlQ==} + engines: {node: '>=6'} + + ts-api-utils@1.2.1: + resolution: {integrity: sha512-RIYA36cJn2WiH9Hy77hdF9r7oEwxAtB/TS9/S4Qd90Ap4z5FSiin5zEiTL44OII1Y3IIlEvxwxFUVgrHSZ/UpA==} + engines: {node: '>=16'} + peerDependencies: + typescript: '>=4.2.0' + + ts-jest@29.1.0: + resolution: {integrity: sha512-ZhNr7Z4PcYa+JjMl62ir+zPiNJfXJN6E8hSLnaUKhOgqcn8vb3e537cpkd0FuAfRK3sR1LSqM1MOhliXNgOFPA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + hasBin: true + peerDependencies: + '@babel/core': '>=7.0.0-beta.0 <8' + '@jest/types': ^29.0.0 + babel-jest: ^29.0.0 + esbuild: '*' + jest: ^29.0.0 + typescript: '>=4.3 <6' + peerDependenciesMeta: + '@babel/core': + optional: true + '@jest/types': + optional: true + babel-jest: + optional: true + esbuild: + optional: true + + ts-loader@9.4.3: + resolution: {integrity: sha512-n3hBnm6ozJYzwiwt5YRiJZkzktftRpMiBApHaJPoWLA+qetQBAXkHqCLM6nwSdRDimqVtA5ocIkcTRLMTt7yzA==} + engines: {node: '>=12.0.0'} + peerDependencies: + typescript: '*' + webpack: ^5.0.0 + + ts-node@10.9.1: + resolution: {integrity: sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==} + hasBin: true + peerDependencies: + '@swc/core': '>=1.2.50' + '@swc/wasm': '>=1.2.50' + '@types/node': '*' + typescript: '>=2.7' + peerDependenciesMeta: + '@swc/core': + optional: true + '@swc/wasm': + optional: true + + ts-toolbelt@9.6.0: + resolution: {integrity: sha512-nsZd8ZeNUzukXPlJmTBwUAuABDe/9qtVDelJeT/qW0ow3ZS3BsQJtNkan1802aM9Uf68/Y8ljw86Hu0h5IUW3w==} + + tsconfig-paths-webpack-plugin@4.0.1: + resolution: {integrity: sha512-m5//KzLoKmqu2MVix+dgLKq70MnFi8YL8sdzQZ6DblmCdfuq/y3OqvJd5vMndg2KEVCOeNz8Es4WVZhYInteLw==} + engines: {node: '>=10.13.0'} + + tsconfig-paths@4.2.0: + resolution: {integrity: sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg==} + engines: {node: '>=6'} + + tslib@1.14.1: + resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==} + + tslib@2.5.0: + resolution: {integrity: sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==} + + tslib@2.5.3: + resolution: {integrity: sha512-mSxlJJwl3BMEQCUNnxXBU9jP4JBktcEGhURcPR6VQVlnP0FdDEsIaz0C35dXNGLyRfrATNofF0F5p2KPxQgB+w==} + + tslib@2.6.2: + resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==} + + type-check@0.4.0: + resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} + engines: {node: '>= 0.8.0'} + + type-detect@4.0.8: + resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==} + engines: {node: '>=4'} + + type-fest@0.18.1: + resolution: {integrity: sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==} + engines: {node: '>=10'} + + type-fest@0.20.2: + resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} + engines: {node: '>=10'} + + type-fest@0.21.3: + resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==} + engines: {node: '>=10'} + + type-fest@0.6.0: + resolution: {integrity: sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==} + engines: {node: '>=8'} + + type-fest@0.8.1: + resolution: {integrity: sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==} + engines: {node: '>=8'} + + typedarray@0.0.6: + resolution: {integrity: sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==} + + typedarray@0.0.7: + resolution: {integrity: sha512-ueeb9YybpjhivjbHP2LdFDAjbS948fGEPj+ACAMs4xCMmh72OCOMQWBQKlaN4ZNQ04yfLSDLSx1tGRIoWimObQ==} + + typescript@5.0.4: + resolution: {integrity: sha512-cW9T5W9xY37cc+jfEnaUvX91foxtHkza3Nw3wkoF4sSlKn0MONdkdEndig/qPBWXNkmplh3NzayQzCiHM4/hqw==} + engines: {node: '>=12.20'} + hasBin: true + + typescript@5.1.3: + resolution: {integrity: sha512-XH627E9vkeqhlZFQuL+UsyAXEnibT0kWR2FWONlr4sTjvxyJYnyefgrkyECLzM5NenmKzRAy2rR/OlYLA1HkZw==} + engines: {node: '>=14.17'} + hasBin: true + + uglify-js@3.17.4: + resolution: {integrity: sha512-T9q82TJI9e/C1TAxYvfb16xO120tMVFZrGA3f9/P4424DNu6ypK103y0GPFVa17yotwSyZW5iYXgjYHkGrJW/g==} + engines: {node: '>=0.8.0'} + hasBin: true + + uid@2.0.2: + resolution: {integrity: sha512-u3xV3X7uzvi5b1MncmZo3i2Aw222Zk1keqLA1YkHldREkAhAqi65wuPfe7lHx8H/Wzy+8CE7S7uS3jekIM5s8g==} + engines: {node: '>=8'} + + unicorn-magic@0.1.0: + resolution: {integrity: sha512-lRfVq8fE8gz6QMBuDM6a+LO3IAzTi05H6gCVaUpir2E1Rwpo4ZUog45KpNXKC/Mn3Yb9UDuHumeFTo9iV/D9FQ==} + engines: {node: '>=18'} + + unique-filename@2.0.1: + resolution: {integrity: sha512-ODWHtkkdx3IAR+veKxFV+VBkUMcN+FaqzUUd7IZzt+0zhDZFPFxhlqwPF3YQvMHx1TD0tdgYl+kuPnJ8E6ql7A==} + engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + + unique-slug@3.0.0: + resolution: {integrity: sha512-8EyMynh679x/0gqE9fT9oilG+qEt+ibFyqjuVTsZn1+CMxH+XLlpvr2UZx4nVcCwTpx81nICr2JQFkM+HPLq4w==} + engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + + unique-stream@2.3.1: + resolution: {integrity: sha512-2nY4TnBE70yoxHkDli7DMazpWiP7xMdCYqU2nBRO0UB+ZpEkGsSija7MvmvnZFUeC+mrgiUfcHSr3LmRFIg4+A==} + + universalify@2.0.1: + resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==} + engines: {node: '>= 10.0.0'} + + update-browserslist-db@1.0.13: + resolution: {integrity: sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==} + hasBin: true + peerDependencies: + browserslist: '>= 4.21.0' + + uri-js@4.4.1: + resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} + + urix@0.1.0: + resolution: {integrity: sha512-Am1ousAhSLBeB9cG/7k7r2R0zj50uDRlZHPGbazid5s9rlF1F/QKYObEKSIunSjIOkJZqwRRLpvewjEkM7pSqg==} + deprecated: Please see https://github.com/lydell/urix#deprecated + + util-deprecate@1.0.2: + resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + + utils-merge@1.0.1: + resolution: {integrity: sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==} + engines: {node: '>= 0.4.0'} + + uuid@9.0.0: + resolution: {integrity: sha512-MXcSTerfPa4uqyzStbRoTgt5XIe3x5+42+q1sDuy3R5MDk66URdLMOZe5aPX/SQd+kuYAh0FdP/pO28IkQyTeg==} + hasBin: true + + v8-compile-cache-lib@3.0.1: + resolution: {integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==} + + v8-sandbox@3.2.10: + resolution: {integrity: sha512-BIIohkY8ULJ63o084YCPMVItEurrH8HIiPufbTtI6AD9HXNnC6QmJTvN97CpvakRkSk0isK4a4diSmwVG2pyFQ==} + + v8-to-istanbul@9.2.0: + resolution: {integrity: sha512-/EH/sDgxU2eGxajKdwLCDmQ4FWq+kpi3uCmBGpw1xJtnAxEjlD8j8PEiGWpCIMIs3ciNAgH0d3TTJiUkYzyZjA==} + engines: {node: '>=10.12.0'} + + vali-date@1.0.0: + resolution: {integrity: sha512-sgECfZthyaCKW10N0fm27cg8HYTFK5qMWgypqkXMQ4Wbl/zZKx7xZICgcoxIIE+WFAP/MBL2EFwC/YvLxw3Zeg==} + engines: {node: '>=0.10.0'} + + validate-npm-package-license@3.0.4: + resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==} + + validator@13.11.0: + resolution: {integrity: sha512-Ii+sehpSfZy+At5nPdnyMhx78fEoPDkR2XW/zimHEL3MyGJQOCQ7WeP20jPYRz7ZCpcKLB21NxuXHF3bxjStBQ==} + engines: {node: '>= 0.10'} + + vinyl-fs@2.4.3: + resolution: {integrity: sha512-XxYoy5HpHrVd76tpnI5Vv/+b/xlEVusOmn4LjQ01s2JyiDMNaUm3Rb7Y3xTkRw+YoRBVoUrCs7EAIFNXyIlI8Q==} + engines: {node: '>=0.10'} + + vinyl@1.2.0: + resolution: {integrity: sha512-Ci3wnR2uuSAWFMSglZuB8Z2apBdtOyz8CV7dC6/U1XbltXBC+IuutUkXQISz01P+US2ouBuesSbV6zILZ6BuzQ==} + engines: {node: '>= 0.9'} + + walker@1.0.8: + resolution: {integrity: sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==} + + watchpack@2.4.0: + resolution: {integrity: sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==} + engines: {node: '>=10.13.0'} + + wcwidth@1.0.1: + resolution: {integrity: sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==} -packages: + webidl-conversions@3.0.1: + resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} - /@aashutoshrathi/word-wrap@1.2.6: - resolution: {integrity: sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==} + webpack-node-externals@3.0.0: + resolution: {integrity: sha512-LnL6Z3GGDPht/AigwRh2dvL9PQPFQ8skEpVrWZXLWBYmqcaojHNN0onvHzie6rq7EWKrrBfPYqNEzTJgiwEQDQ==} + engines: {node: '>=6'} + + webpack-sources@3.2.3: + resolution: {integrity: sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==} + engines: {node: '>=10.13.0'} + + webpack@5.87.0: + resolution: {integrity: sha512-GOu1tNbQ7p1bDEoFRs2YPcfyGs8xq52yyPBZ3m2VGnXGtV9MxjrkABHm4V9Ia280OefsSLzvbVoXcfLxjKY/Iw==} + engines: {node: '>=10.13.0'} + hasBin: true + peerDependencies: + webpack-cli: '*' + peerDependenciesMeta: + webpack-cli: + optional: true + + webpack@5.90.1: + resolution: {integrity: sha512-SstPdlAC5IvgFnhiRok8hqJo/+ArAbNv7rhU4fnWGHNVfN59HSQFaxZDSAL3IFG2YmqxuRs+IU33milSxbPlog==} + engines: {node: '>=10.13.0'} + hasBin: true + peerDependencies: + webpack-cli: '*' + peerDependenciesMeta: + webpack-cli: + optional: true + + whatwg-url@5.0.0: + resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} + + which@1.3.1: + resolution: {integrity: sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==} + hasBin: true + + which@2.0.2: + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} + hasBin: true + + wide-align@1.1.5: + resolution: {integrity: sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==} + + window-size@0.2.0: + resolution: {integrity: sha512-UD7d8HFA2+PZsbKyaOCEy8gMh1oDtHgJh1LfgjQ4zVXmYjAT/kvz3PueITKuqDiIXQe7yzpPnxX3lNc+AhQMyw==} + engines: {node: '>= 0.10.0'} + 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'} - dev: true - /@ampproject/remapping@2.2.1: - resolution: {integrity: sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==} - engines: {node: '>=6.0.0'} + wordwrap@1.0.0: + resolution: {integrity: sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==} + + wrap-ansi@2.1.0: + resolution: {integrity: sha512-vAaEaDM946gbNpH5pLVNR+vX2ht6n0Bt3GXwVB1AuAqZosOvHNF3P7wDnh8KLkSqgUh0uh77le7Owgoz+Z9XBw==} + engines: {node: '>=0.10.0'} + + wrap-ansi@7.0.0: + resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} + engines: {node: '>=10'} + + wrap-ansi@8.1.0: + resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} + engines: {node: '>=12'} + + wrappy@1.0.2: + resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + + write-file-atomic@4.0.2: + resolution: {integrity: sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==} + engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + + xtend@4.0.2: + resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==} + engines: {node: '>=0.4'} + + y18n@3.2.2: + resolution: {integrity: sha512-uGZHXkHnhF0XeeAPgnKfPv1bgKAYyVvmNL1xlKsPYZPaIHxGti2hHqvOCQv71XMsLxu1QjergkqogUnms5D3YQ==} + + y18n@5.0.8: + resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} + engines: {node: '>=10'} + + yallist@3.1.1: + resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} + + yallist@4.0.0: + resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} + + yaml@1.10.2: + resolution: {integrity: sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==} + engines: {node: '>= 6'} + + yargs-parser@2.4.1: + resolution: {integrity: sha512-9pIKIJhnI5tonzG6OnCFlz/yln8xHYcGl+pn3xR0Vzff0vzN1PbNRaelgfgRUwZ3s4i3jvxT9WhmUGL4whnasA==} + + yargs-parser@20.2.9: + resolution: {integrity: sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==} + engines: {node: '>=10'} + + yargs-parser@21.1.1: + resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} + engines: {node: '>=12'} + + yargs@16.2.0: + resolution: {integrity: sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==} + engines: {node: '>=10'} + + yargs@17.7.2: + resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} + engines: {node: '>=12'} + + yargs@4.6.0: + resolution: {integrity: sha512-KmjJbWBkYiSRUChcOSa4rtBxDXf0j4ISz+tpeNa4LKIBllgKnkemJ3x4yo4Yydp3wPU4/xJTaKTLLZ8V7zhI7A==} + + yn@3.1.1: + resolution: {integrity: sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==} + engines: {node: '>=6'} + + yocto-queue@0.1.0: + resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} + engines: {node: '>=10'} + + yocto-queue@1.0.0: + resolution: {integrity: sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==} + engines: {node: '>=12.20'} + +snapshots: + + '@aashutoshrathi/word-wrap@1.2.6': {} + + '@ampproject/remapping@2.2.1': dependencies: '@jridgewell/gen-mapping': 0.3.3 '@jridgewell/trace-mapping': 0.3.22 - /@angular-devkit/core@13.3.11: - resolution: {integrity: sha512-rfqoLMRYhlz0wzKlHx7FfyIyQq8dKTsmbCoIVU1cEIH0gyTMVY7PbVzwRRcO6xp5waY+0hA+0Brriujpuhkm4w==} - engines: {node: ^12.20.0 || ^14.15.0 || >=16.10.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: '>= 1.13.0'} - peerDependencies: - chokidar: ^3.5.2 - peerDependenciesMeta: - chokidar: - optional: true + '@angular-devkit/core@13.3.11': dependencies: ajv: 8.9.0 ajv-formats: 2.1.1(ajv@8.9.0) @@ -276,16 +5087,8 @@ packages: magic-string: 0.25.7 rxjs: 6.6.7 source-map: 0.7.3 - dev: false - /@angular-devkit/core@16.1.0(chokidar@3.5.3): - resolution: {integrity: sha512-mrWpuDvttmhrCGcLc68RIXKtTzUhkBTsE5ZZFZNO1+FSC+vO/ZpyCpPd6C+6coM68NfXYjHlms5XF6KbxeGn/Q==} - engines: {node: ^16.14.0 || >=18.10.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: '>= 1.13.0'} - peerDependencies: - chokidar: ^3.5.2 - peerDependenciesMeta: - chokidar: - optional: true + '@angular-devkit/core@16.1.0(chokidar@3.5.3)': dependencies: ajv: 8.12.0 ajv-formats: 2.1.1(ajv@8.12.0) @@ -293,12 +5096,8 @@ packages: jsonc-parser: 3.2.0 rxjs: 7.8.1 source-map: 0.7.4 - dev: true - /@angular-devkit/schematics-cli@16.1.0(chokidar@3.5.3): - resolution: {integrity: sha512-siBpRDmMMV7NB+NvaDHeJ4doHoSkFwIywwFj8GXnBCtobyxrBl1EyG1cKK+FHRydYtyYIk8FEoOpJA9oE9S2hg==} - engines: {node: ^16.14.0 || >=18.10.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: '>= 1.13.0'} - hasBin: true + '@angular-devkit/schematics-cli@16.1.0(chokidar@3.5.3)': dependencies: '@angular-devkit/core': 16.1.0(chokidar@3.5.3) '@angular-devkit/schematics': 16.1.0(chokidar@3.5.3) @@ -308,11 +5107,8 @@ packages: yargs-parser: 21.1.1 transitivePeerDependencies: - chokidar - dev: true - /@angular-devkit/schematics@13.3.11: - resolution: {integrity: sha512-ben+EGXpCrClnIVAAnEQmhQdKmnnqFhMp5BqMxgOslSYBAmCutLA6rBu5vsc8kZcGian1wt+lueF7G1Uk5cGBg==} - engines: {node: ^12.20.0 || ^14.15.0 || >=16.10.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: '>= 1.13.0'} + '@angular-devkit/schematics@13.3.11': dependencies: '@angular-devkit/core': 13.3.11 jsonc-parser: 3.0.0 @@ -321,11 +5117,8 @@ packages: rxjs: 6.6.7 transitivePeerDependencies: - chokidar - dev: false - /@angular-devkit/schematics@16.1.0(chokidar@3.5.3): - resolution: {integrity: sha512-LM35PH9DT3eQRSZgrkk2bx1ZQjjVh8BCByTlr37/c+FnF9mNbeBsa1YkxrlsN/CwO+045OwEwRHnkM9Zcx0U/A==} - 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@16.1.0(chokidar@3.5.3)': dependencies: '@angular-devkit/core': 16.1.0(chokidar@3.5.3) jsonc-parser: 3.2.0 @@ -334,36 +5127,23 @@ packages: rxjs: 7.8.1 transitivePeerDependencies: - chokidar - dev: true - /@apidevtools/json-schema-ref-parser@11.5.4: - resolution: {integrity: sha512-o2fsypTGU0WxRxbax8zQoHiIB4dyrkwYfcm8TxZ+bx9pCzcWZbQtiMqpgBvWA/nJ2TrGjK5adCLfTH8wUeU/Wg==} - engines: {node: '>= 16'} + '@apidevtools/json-schema-ref-parser@11.5.4': dependencies: '@jsdevtools/ono': 7.1.3 '@types/json-schema': 7.0.15 js-yaml: 4.1.0 - dev: false - /@arr/every@1.0.1: - resolution: {integrity: sha512-UQFQ6SgyJ6LX42W8rHCs8KVc0JS0tzVL9ct4XYedJukskYVWTo49tNiMEK9C2HTyarbNiT/RVIRSY82vH+6sTg==} - engines: {node: '>=4'} - dev: true + '@arr/every@1.0.1': {} - /@babel/code-frame@7.23.5: - resolution: {integrity: sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA==} - engines: {node: '>=6.9.0'} + '@babel/code-frame@7.23.5': dependencies: '@babel/highlight': 7.23.4 chalk: 2.4.2 - /@babel/compat-data@7.23.5: - resolution: {integrity: sha512-uU27kfDRlhfKl+w1U6vp16IuvSLtjAxdArVXPa9BvLkrr7CYIsxH5adpHObeAGY/41+syctUWOZ140a2Rvkgjw==} - engines: {node: '>=6.9.0'} + '@babel/compat-data@7.23.5': {} - /@babel/core@7.23.9: - resolution: {integrity: sha512-5q0175NOjddqpvvzU+kDiSOAk4PfdO6FvwCWoQ6RO7rTzEe8vlo+4HVfcnAREhD4npMs0e9uZypjTwzZPCf/cw==} - engines: {node: '>=6.9.0'} + '@babel/core@7.23.9': dependencies: '@ampproject/remapping': 2.2.1 '@babel/code-frame': 7.23.5 @@ -383,18 +5163,14 @@ packages: transitivePeerDependencies: - supports-color - /@babel/generator@7.23.6: - resolution: {integrity: sha512-qrSfCYxYQB5owCmGLbl8XRpX1ytXlpueOb0N0UmQwA073KZxejgQTzAmJezxvpwQD9uGtK2shHdi55QT+MbjIw==} - engines: {node: '>=6.9.0'} + '@babel/generator@7.23.6': dependencies: '@babel/types': 7.23.9 '@jridgewell/gen-mapping': 0.3.3 '@jridgewell/trace-mapping': 0.3.22 jsesc: 2.5.2 - /@babel/helper-compilation-targets@7.23.6: - resolution: {integrity: sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ==} - engines: {node: '>=6.9.0'} + '@babel/helper-compilation-targets@7.23.6': dependencies: '@babel/compat-data': 7.23.5 '@babel/helper-validator-option': 7.23.5 @@ -402,34 +5178,22 @@ packages: lru-cache: 5.1.1 semver: 6.3.1 - /@babel/helper-environment-visitor@7.22.20: - resolution: {integrity: sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==} - engines: {node: '>=6.9.0'} + '@babel/helper-environment-visitor@7.22.20': {} - /@babel/helper-function-name@7.23.0: - resolution: {integrity: sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==} - engines: {node: '>=6.9.0'} + '@babel/helper-function-name@7.23.0': dependencies: '@babel/template': 7.23.9 '@babel/types': 7.23.9 - /@babel/helper-hoist-variables@7.22.5: - resolution: {integrity: sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==} - engines: {node: '>=6.9.0'} + '@babel/helper-hoist-variables@7.22.5': dependencies: '@babel/types': 7.23.9 - /@babel/helper-module-imports@7.22.15: - resolution: {integrity: sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==} - engines: {node: '>=6.9.0'} + '@babel/helper-module-imports@7.22.15': dependencies: '@babel/types': 7.23.9 - /@babel/helper-module-transforms@7.23.3(@babel/core@7.23.9): - resolution: {integrity: sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 + '@babel/helper-module-transforms@7.23.3(@babel/core@7.23.9)': dependencies: '@babel/core': 7.23.9 '@babel/helper-environment-visitor': 7.22.20 @@ -438,37 +5202,23 @@ packages: '@babel/helper-split-export-declaration': 7.22.6 '@babel/helper-validator-identifier': 7.22.20 - /@babel/helper-plugin-utils@7.22.5: - resolution: {integrity: sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==} - engines: {node: '>=6.9.0'} + '@babel/helper-plugin-utils@7.22.5': {} - /@babel/helper-simple-access@7.22.5: - resolution: {integrity: sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==} - engines: {node: '>=6.9.0'} + '@babel/helper-simple-access@7.22.5': dependencies: '@babel/types': 7.23.9 - /@babel/helper-split-export-declaration@7.22.6: - resolution: {integrity: sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==} - engines: {node: '>=6.9.0'} + '@babel/helper-split-export-declaration@7.22.6': dependencies: '@babel/types': 7.23.9 - /@babel/helper-string-parser@7.23.4: - resolution: {integrity: sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ==} - engines: {node: '>=6.9.0'} + '@babel/helper-string-parser@7.23.4': {} - /@babel/helper-validator-identifier@7.22.20: - resolution: {integrity: sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==} - engines: {node: '>=6.9.0'} + '@babel/helper-validator-identifier@7.22.20': {} - /@babel/helper-validator-option@7.23.5: - resolution: {integrity: sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw==} - engines: {node: '>=6.9.0'} + '@babel/helper-validator-option@7.23.5': {} - /@babel/helpers@7.23.9: - resolution: {integrity: sha512-87ICKgU5t5SzOT7sBMfCOZQ2rHjRU+Pcb9BoILMYz600W6DkVRLFBPwQ18gwUVvggqXivaUakpnxWQGbpywbBQ==} - engines: {node: '>=6.9.0'} + '@babel/helpers@7.23.9': dependencies: '@babel/template': 7.23.9 '@babel/traverse': 7.23.9 @@ -476,147 +5226,93 @@ packages: transitivePeerDependencies: - supports-color - /@babel/highlight@7.23.4: - resolution: {integrity: sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A==} - engines: {node: '>=6.9.0'} + '@babel/highlight@7.23.4': dependencies: '@babel/helper-validator-identifier': 7.22.20 chalk: 2.4.2 js-tokens: 4.0.0 - /@babel/parser@7.23.9: - resolution: {integrity: sha512-9tcKgqKbs3xGJ+NtKF2ndOBBLVwPjl1SHxPQkd36r3Dlirw3xWUeGaTbqr7uGZcTaxkVNwc+03SVP7aCdWrTlA==} - engines: {node: '>=6.0.0'} - hasBin: true + '@babel/parser@7.23.9': dependencies: '@babel/types': 7.23.9 - /@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.23.9): - resolution: {integrity: sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.23.9)': dependencies: '@babel/core': 7.23.9 '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-syntax-bigint@7.8.3(@babel/core@7.23.9): - resolution: {integrity: sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-syntax-bigint@7.8.3(@babel/core@7.23.9)': dependencies: '@babel/core': 7.23.9 '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.23.9): - resolution: {integrity: sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.23.9)': dependencies: '@babel/core': 7.23.9 '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.23.9): - resolution: {integrity: sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.23.9)': dependencies: '@babel/core': 7.23.9 '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.23.9): - resolution: {integrity: sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.23.9)': dependencies: '@babel/core': 7.23.9 '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-syntax-jsx@7.23.3(@babel/core@7.23.9): - resolution: {integrity: sha512-EB2MELswq55OHUoRZLGg/zC7QWUKfNLpE57m/S2yr1uEneIgsTgrSzXP3NXEsMkVn76OlaVVnzN+ugObuYGwhg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-syntax-jsx@7.23.3(@babel/core@7.23.9)': dependencies: '@babel/core': 7.23.9 '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.23.9): - resolution: {integrity: sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.23.9)': dependencies: '@babel/core': 7.23.9 '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.23.9): - resolution: {integrity: sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.23.9)': dependencies: '@babel/core': 7.23.9 '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.23.9): - resolution: {integrity: sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.23.9)': dependencies: '@babel/core': 7.23.9 '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.23.9): - resolution: {integrity: sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.23.9)': dependencies: '@babel/core': 7.23.9 '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.23.9): - resolution: {integrity: sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.23.9)': dependencies: '@babel/core': 7.23.9 '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.23.9): - resolution: {integrity: sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.23.9)': dependencies: '@babel/core': 7.23.9 '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.23.9): - resolution: {integrity: sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.23.9)': dependencies: '@babel/core': 7.23.9 '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-syntax-typescript@7.23.3(@babel/core@7.23.9): - resolution: {integrity: sha512-9EiNjVJOMwCO+43TqoTrgQ8jMwcAd0sWyXi9RPfIsLTj4R2MADDDQXELhffaUx/uJv2AYcxBgPwH6j4TIA4ytQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-syntax-typescript@7.23.3(@babel/core@7.23.9)': dependencies: '@babel/core': 7.23.9 '@babel/helper-plugin-utils': 7.22.5 - /@babel/template@7.23.9: - resolution: {integrity: sha512-+xrD2BWLpvHKNmX2QbpdpsBaWnRxahMwJjO+KZk2JOElj5nSmKezyS1B4u+QbHMTX69t4ukm6hh9lsYQ7GHCKA==} - engines: {node: '>=6.9.0'} + '@babel/template@7.23.9': dependencies: '@babel/code-frame': 7.23.5 '@babel/parser': 7.23.9 '@babel/types': 7.23.9 - /@babel/traverse@7.23.9: - resolution: {integrity: sha512-I/4UJ9vs90OkBtY6iiiTORVMyIhJ4kAVmsKo9KFc8UOxMeUfi2hvtIBsET5u9GizXE6/GFSuKCTNfgCswuEjRg==} - engines: {node: '>=6.9.0'} + '@babel/traverse@7.23.9': dependencies: '@babel/code-frame': 7.23.5 '@babel/generator': 7.23.6 @@ -631,37 +5327,22 @@ packages: transitivePeerDependencies: - supports-color - /@babel/types@7.23.9: - resolution: {integrity: sha512-dQjSq/7HaSjRM43FFGnv5keM2HsxpmyV1PfaSVm0nzzjwwTmjOe6J4bC8e3+pTEIgHaHj+1ZlLThRJ2auc/w1Q==} - engines: {node: '>=6.9.0'} + '@babel/types@7.23.9': dependencies: '@babel/helper-string-parser': 7.23.4 '@babel/helper-validator-identifier': 7.22.20 to-fast-properties: 2.0.0 - /@bcoe/v8-coverage@0.2.3: - resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==} + '@bcoe/v8-coverage@0.2.3': {} - /@chax-at/transactional-prisma-testing@1.1.0(@prisma/client@5.10.2): - resolution: {integrity: sha512-BT2KRg2mfHbjW3gb3u5RtXjwvodywA8uvOX5Szm2J6KotgYJ/vRnCJ8LKp+kb/dbHhnPIrOCTtj6AY1Xku8Wng==} - engines: {node: '>= 14'} - peerDependencies: - '@prisma/client': ^4.7.0 || 5 + '@chax-at/transactional-prisma-testing@1.1.0(@prisma/client@5.10.2)': dependencies: '@prisma/client': 5.10.2(prisma@5.10.2) - dev: true - /@colors/colors@1.5.0: - resolution: {integrity: sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==} - engines: {node: '>=0.1.90'} - requiresBuild: true - dev: true + '@colors/colors@1.5.0': optional: true - /@commitlint/cli@19.2.0(@types/node@20.3.1)(typescript@5.1.3): - resolution: {integrity: sha512-8XnQDMyQR+1/ldbmIyhonvnDS2enEw48Wompo/967fsEvy9Vj5/JbDutzmSBKxANWDVeEbR9QQm0yHpw6ArrFw==} - engines: {node: '>=v18'} - hasBin: true + '@commitlint/cli@19.2.0(@types/node@20.3.1)(typescript@5.1.3)': dependencies: '@commitlint/format': 19.0.3 '@commitlint/lint': 19.1.0 @@ -673,31 +5354,19 @@ packages: transitivePeerDependencies: - '@types/node' - typescript - dev: true - /@commitlint/config-angular-type-enum@19.1.0: - resolution: {integrity: sha512-eLjt7vSArP62kpDmmIZNdIBjPzbqY8jss6mVOcSDm4t1KfDw4UmPrtPh/7zcIL3GI5uf/7W8d2s3K0qisf9C+g==} - engines: {node: '>=v18'} - dev: true + '@commitlint/config-angular-type-enum@19.1.0': {} - /@commitlint/config-angular@19.1.0: - resolution: {integrity: sha512-qZyG9FHjPoG+VaHxH1OruWI8cmWWRe00sAS73jXAhACimT74k4Dex5jI2cKFcXSH8Ebh1yGwxfjzSgup5O0ykA==} - engines: {node: '>=v18'} + '@commitlint/config-angular@19.1.0': dependencies: '@commitlint/config-angular-type-enum': 19.1.0 - dev: true - /@commitlint/config-validator@19.0.3: - resolution: {integrity: sha512-2D3r4PKjoo59zBc2auodrSCaUnCSALCx54yveOFwwP/i2kfEAQrygwOleFWswLqK0UL/F9r07MFi5ev2ohyM4Q==} - engines: {node: '>=v18'} + '@commitlint/config-validator@19.0.3': dependencies: '@commitlint/types': 19.0.3 ajv: 8.12.0 - dev: true - /@commitlint/ensure@19.0.3: - resolution: {integrity: sha512-SZEpa/VvBLoT+EFZVb91YWbmaZ/9rPH3ESrINOl0HD2kMYsjvl0tF7nMHh0EpTcv4+gTtZBAe1y/SS6/OhfZzQ==} - engines: {node: '>=v18'} + '@commitlint/ensure@19.0.3': dependencies: '@commitlint/types': 19.0.3 lodash.camelcase: 4.3.0 @@ -705,42 +5374,27 @@ packages: lodash.snakecase: 4.1.1 lodash.startcase: 4.4.0 lodash.upperfirst: 4.3.1 - dev: true - /@commitlint/execute-rule@19.0.0: - resolution: {integrity: sha512-mtsdpY1qyWgAO/iOK0L6gSGeR7GFcdW7tIjcNFxcWkfLDF5qVbPHKuGATFqRMsxcO8OUKNj0+3WOHB7EHm4Jdw==} - engines: {node: '>=v18'} - dev: true + '@commitlint/execute-rule@19.0.0': {} - /@commitlint/format@19.0.3: - resolution: {integrity: sha512-QjjyGyoiVWzx1f5xOteKHNLFyhyweVifMgopozSgx1fGNrGV8+wp7k6n1t6StHdJ6maQJ+UUtO2TcEiBFRyR6Q==} - engines: {node: '>=v18'} + '@commitlint/format@19.0.3': dependencies: '@commitlint/types': 19.0.3 chalk: 5.3.0 - dev: true - /@commitlint/is-ignored@19.0.3: - resolution: {integrity: sha512-MqDrxJaRSVSzCbPsV6iOKG/Lt52Y+PVwFVexqImmYYFhe51iVJjK2hRhOG2jUAGiUHk4jpdFr0cZPzcBkSzXDQ==} - engines: {node: '>=v18'} + '@commitlint/is-ignored@19.0.3': dependencies: '@commitlint/types': 19.0.3 semver: 7.6.0 - dev: true - /@commitlint/lint@19.1.0: - resolution: {integrity: sha512-ESjaBmL/9cxm+eePyEr6SFlBUIYlYpI80n+Ltm7IA3MAcrmiP05UMhJdAD66sO8jvo8O4xdGn/1Mt2G5VzfZKw==} - engines: {node: '>=v18'} + '@commitlint/lint@19.1.0': dependencies: '@commitlint/is-ignored': 19.0.3 '@commitlint/parse': 19.0.3 '@commitlint/rules': 19.0.3 '@commitlint/types': 19.0.3 - dev: true - /@commitlint/load@19.2.0(@types/node@20.3.1)(typescript@5.1.3): - resolution: {integrity: sha512-XvxxLJTKqZojCxaBQ7u92qQLFMMZc4+p9qrIq/9kJDy8DOrEa7P1yx7Tjdc2u2JxIalqT4KOGraVgCE7eCYJyQ==} - engines: {node: '>=v18'} + '@commitlint/load@19.2.0(@types/node@20.3.1)(typescript@5.1.3)': dependencies: '@commitlint/config-validator': 19.0.3 '@commitlint/execute-rule': 19.0.0 @@ -755,36 +5409,24 @@ packages: transitivePeerDependencies: - '@types/node' - typescript - dev: true - - /@commitlint/message@19.0.0: - resolution: {integrity: sha512-c9czf6lU+9oF9gVVa2lmKaOARJvt4soRsVmbR7Njwp9FpbBgste5i7l/2l5o8MmbwGh4yE1snfnsy2qyA2r/Fw==} - engines: {node: '>=v18'} - dev: true - /@commitlint/parse@19.0.3: - resolution: {integrity: sha512-Il+tNyOb8VDxN3P6XoBBwWJtKKGzHlitEuXA5BP6ir/3loWlsSqDr5aecl6hZcC/spjq4pHqNh0qPlfeWu38QA==} - engines: {node: '>=v18'} + '@commitlint/message@19.0.0': {} + + '@commitlint/parse@19.0.3': dependencies: '@commitlint/types': 19.0.3 conventional-changelog-angular: 7.0.0 conventional-commits-parser: 5.0.0 - dev: true - /@commitlint/read@19.2.0: - resolution: {integrity: sha512-HlGeEd/jyp2a5Fb9mvtsaDm5hFCmj80dJYjLQkpG3DzWneWBc37YU3kM8Za1D1HUazZaTkdsWq73M3XDE4CvCA==} - engines: {node: '>=v18'} + '@commitlint/read@19.2.0': dependencies: '@commitlint/top-level': 19.0.0 '@commitlint/types': 19.0.3 execa: 8.0.1 git-raw-commits: 4.0.0 minimist: 1.2.8 - dev: true - /@commitlint/resolve-extends@19.1.0: - resolution: {integrity: sha512-z2riI+8G3CET5CPgXJPlzftH+RiWYLMYv4C9tSLdLXdr6pBNimSKukYP9MS27ejmscqCTVA4almdLh0ODD2KYg==} - engines: {node: '>=v18'} + '@commitlint/resolve-extends@19.1.0': dependencies: '@commitlint/config-validator': 19.0.3 '@commitlint/types': 19.0.3 @@ -792,63 +5434,38 @@ packages: import-meta-resolve: 4.0.0 lodash.mergewith: 4.6.2 resolve-from: 5.0.0 - dev: true - /@commitlint/rules@19.0.3: - resolution: {integrity: sha512-TspKb9VB6svklxNCKKwxhELn7qhtY1rFF8ls58DcFd0F97XoG07xugPjjbVnLqmMkRjZDbDIwBKt9bddOfLaPw==} - engines: {node: '>=v18'} + '@commitlint/rules@19.0.3': dependencies: '@commitlint/ensure': 19.0.3 '@commitlint/message': 19.0.0 '@commitlint/to-lines': 19.0.0 '@commitlint/types': 19.0.3 execa: 8.0.1 - dev: true - /@commitlint/to-lines@19.0.0: - resolution: {integrity: sha512-vkxWo+VQU5wFhiP9Ub9Sre0FYe019JxFikrALVoD5UGa8/t3yOJEpEhxC5xKiENKKhUkTpEItMTRAjHw2SCpZw==} - engines: {node: '>=v18'} - dev: true + '@commitlint/to-lines@19.0.0': {} - /@commitlint/top-level@19.0.0: - resolution: {integrity: sha512-KKjShd6u1aMGNkCkaX4aG1jOGdn7f8ZI8TR1VEuNqUOjWTOdcDSsmglinglJ18JTjuBX5I1PtjrhQCRcixRVFQ==} - engines: {node: '>=v18'} + '@commitlint/top-level@19.0.0': dependencies: find-up: 7.0.0 - dev: true - /@commitlint/types@19.0.3: - resolution: {integrity: sha512-tpyc+7i6bPG9mvaBbtKUeghfyZSDgWquIDfMgqYtTbmZ9Y9VzEm2je9EYcQ0aoz5o7NvGS+rcDec93yO08MHYA==} - engines: {node: '>=v18'} + '@commitlint/types@19.0.3': dependencies: '@types/conventional-commits-parser': 5.0.0 chalk: 5.3.0 - dev: true - /@cspotcode/source-map-support@0.8.1: - resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==} - engines: {node: '>=12'} + '@cspotcode/source-map-support@0.8.1': dependencies: '@jridgewell/trace-mapping': 0.3.9 - /@eslint-community/eslint-utils@4.4.0(eslint@8.42.0): - resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 + '@eslint-community/eslint-utils@4.4.0(eslint@8.42.0)': dependencies: eslint: 8.42.0 eslint-visitor-keys: 3.4.3 - dev: true - /@eslint-community/regexpp@4.10.0: - resolution: {integrity: sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==} - engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} - dev: true + '@eslint-community/regexpp@4.10.0': {} - /@eslint/eslintrc@2.1.4: - resolution: {integrity: sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + '@eslint/eslintrc@2.1.4': dependencies: ajv: 6.12.6 debug: 4.3.4 @@ -861,32 +5478,20 @@ packages: strip-json-comments: 3.1.1 transitivePeerDependencies: - supports-color - dev: true - /@eslint/js@8.42.0: - resolution: {integrity: sha512-6SWlXpWU5AvId8Ac7zjzmIOqMOba/JWY8XZ4A7q7Gn1Vlfg/SFFIlrtHXt9nPn4op9ZPAkl91Jao+QQv3r/ukw==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - dev: true + '@eslint/js@8.42.0': {} - /@exodus/schemasafe@1.3.0: - resolution: {integrity: sha512-5Aap/GaRupgNx/feGBwLLTVv8OQFfv3pq2lPRzPg9R+IOBnDgghTGW7l7EuVXOvg5cc/xSAlRW8rBrjIC3Nvqw==} - dev: true + '@exodus/schemasafe@1.3.0': {} - /@fastify/accept-negotiator@1.1.0: - resolution: {integrity: sha512-OIHZrb2ImZ7XG85HXOONLcJWGosv7sIvM2ifAPQVhg9Lv7qdmMBNVaai4QTdyuaqbKM5eO6sLSQOYI7wEQeCJQ==} - engines: {node: '>=14'} - dev: false + '@fastify/accept-negotiator@1.1.0': {} - /@fastify/ajv-compiler@3.5.0: - resolution: {integrity: sha512-ebbEtlI7dxXF5ziNdr05mOY8NnDiPB1XvAlLHctRt/Rc+C3LCOVW5imUVX+mhvUhnNzmPBHewUkOFgGlCxgdAA==} + '@fastify/ajv-compiler@3.5.0': dependencies: ajv: 8.12.0 ajv-formats: 2.1.1(ajv@8.12.0) fast-uri: 2.3.0 - dev: false - /@fastify/compress@7.0.0: - resolution: {integrity: sha512-jo/NaBVHP1OXIf8Kmr3bZyYQB0gAIgcy5c8rRKTPjhklHO7lRs/6ZFckUVT0NtbKSvrTuIcmSkxYpjyv3FNHXA==} + '@fastify/compress@7.0.0': dependencies: '@fastify/accept-negotiator': 1.1.0 fastify-plugin: 4.5.1 @@ -896,73 +5501,53 @@ packages: peek-stream: 1.1.3 pump: 3.0.0 pumpify: 2.0.1 - dev: false - /@fastify/cookie@9.3.1: - resolution: {integrity: sha512-h1NAEhB266+ZbZ0e9qUE6NnNR07i7DnNXWG9VbbZ8uC6O/hxHpl+Zoe5sw1yfdZ2U6XhToUGDnzQtWJdCaPwfg==} + '@fastify/cookie@9.3.1': dependencies: cookie-signature: 1.2.1 fastify-plugin: 4.5.1 - dev: false - /@fastify/cors@9.0.1: - resolution: {integrity: sha512-YY9Ho3ovI+QHIL2hW+9X4XqQjXLjJqsU+sMV/xFsxZkE8p3GNnYVFpoOxF7SsP5ZL76gwvbo3V9L+FIekBGU4Q==} + '@fastify/cors@9.0.1': dependencies: fastify-plugin: 4.5.1 mnemonist: 0.39.6 - dev: false - /@fastify/error@3.4.1: - resolution: {integrity: sha512-wWSvph+29GR783IhmvdwWnN4bUxTD01Vm5Xad4i7i1VuAOItLvbPAb69sb0IQ2N57yprvhNIwAP5B6xfKTmjmQ==} - dev: false + '@fastify/error@3.4.1': {} - /@fastify/fast-json-stringify-compiler@4.3.0: - resolution: {integrity: sha512-aZAXGYo6m22Fk1zZzEUKBvut/CIIQe/BapEORnxiD5Qr0kPHqqI69NtEMCme74h+at72sPhbkb4ZrLd1W3KRLA==} + '@fastify/fast-json-stringify-compiler@4.3.0': dependencies: fast-json-stringify: 5.12.0 - dev: false - /@fastify/formbody@7.4.0: - resolution: {integrity: sha512-H3C6h1GN56/SMrZS8N2vCT2cZr7mIHzBHzOBa5OPpjfB/D6FzP9mMpE02ZzrFX0ANeh0BAJdoXKOF2e7IbV+Og==} + '@fastify/formbody@7.4.0': dependencies: fast-querystring: 1.1.2 fastify-plugin: 4.5.1 - dev: false - /@fastify/helmet@11.1.1: - resolution: {integrity: sha512-pjJxjk6SLEimITWadtYIXt6wBMfFC1I6OQyH/jYVCqSAn36sgAIFjeNiibHtifjCd+e25442pObis3Rjtame6A==} + '@fastify/helmet@11.1.1': dependencies: fastify-plugin: 4.5.1 helmet: 7.1.0 - dev: false - /@fastify/merge-json-schemas@0.1.1: - resolution: {integrity: sha512-fERDVz7topgNjtXsJTTW1JKLy0rhuLRcquYqNR9rF7OcVpCa2OVW49ZPDIhaRRCaUuvVxI+N416xUoF76HNSXA==} + '@fastify/merge-json-schemas@0.1.1': dependencies: fast-deep-equal: 3.1.3 - dev: false - /@fastify/middie@8.3.0: - resolution: {integrity: sha512-h+zBxCzMlkEkh4fM7pZaSGzqS7P9M0Z6rXnWPdUEPfe7x1BCj++wEk/pQ5jpyYY4pF8AknFqb77n7uwh8HdxEA==} + '@fastify/middie@8.3.0': dependencies: '@fastify/error': 3.4.1 fastify-plugin: 4.5.1 path-to-regexp: 6.2.1 reusify: 1.0.4 - dev: false - /@fastify/send@2.1.0: - resolution: {integrity: sha512-yNYiY6sDkexoJR0D8IDy3aRP3+L4wdqCpvx5WP+VtEU58sn7USmKynBzDQex5X42Zzvw2gNzzYgP90UfWShLFA==} + '@fastify/send@2.1.0': dependencies: '@lukeed/ms': 2.0.2 escape-html: 1.0.3 fast-decode-uri-component: 1.0.1 http-errors: 2.0.0 mime: 3.0.0 - dev: false - /@fastify/static@6.12.0: - resolution: {integrity: sha512-KK1B84E6QD/FcQWxDI2aiUCwHxMJBI1KeCUzm1BwYpPY1b742+jeKruGHP2uOluuM6OkBPI8CIANrXcCRtC2oQ==} + '@fastify/static@6.12.0': dependencies: '@fastify/accept-negotiator': 1.1.0 '@fastify/send': 2.1.0 @@ -970,71 +5555,44 @@ packages: fastify-plugin: 4.5.1 glob: 8.1.0 p-limit: 3.1.0 - dev: false - /@gar/promisify@1.1.3: - resolution: {integrity: sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw==} - dev: false + '@gar/promisify@1.1.3': {} - /@golevelup/nestjs-modules@0.6.1(@nestjs/common@10.0.0)(rxjs@7.8.1): - resolution: {integrity: sha512-E0STg8In8fhIivnGDJAA70+XLPHzK5bMTkCnif9FbZ8waTYDQ3T/QQL0h73k+CUFeznn1hmuEW14sNaE+8cd7w==} - peerDependencies: - '@nestjs/common': ^9.x - rxjs: ^7.x + '@golevelup/nestjs-modules@0.6.1(@nestjs/common@10.0.0)(rxjs@7.8.1)': dependencies: '@nestjs/common': 10.0.0(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.1.13)(rxjs@7.8.1) lodash: 4.17.21 rxjs: 7.8.1 - dev: false - /@gulp-sourcemaps/map-sources@1.0.0: - resolution: {integrity: sha512-o/EatdaGt8+x2qpb0vFLC/2Gug/xYPRXb6a+ET1wGYKozKN3krDWC/zZFZAtrzxJHuDL12mwdfEFKcKMNvc55A==} - engines: {node: '>= 0.10'} + '@gulp-sourcemaps/map-sources@1.0.0': dependencies: normalize-path: 2.1.1 through2: 2.0.5 - dev: false - /@humanwhocodes/config-array@0.11.14: - resolution: {integrity: sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==} - engines: {node: '>=10.10.0'} + '@humanwhocodes/config-array@0.11.14': dependencies: '@humanwhocodes/object-schema': 2.0.2 debug: 4.3.4 minimatch: 3.1.2 transitivePeerDependencies: - supports-color - dev: true - /@humanwhocodes/module-importer@1.0.1: - resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} - engines: {node: '>=12.22'} - dev: true + '@humanwhocodes/module-importer@1.0.1': {} - /@humanwhocodes/object-schema@2.0.2: - resolution: {integrity: sha512-6EwiSjwWYP7pTckG6I5eyFANjPhmPjUX9JRLUSfNPC7FX7zK9gyZAfUEaECL6ALTpGX5AjnBq3C9XmVWPitNpw==} - dev: true + '@humanwhocodes/object-schema@2.0.2': {} - /@hutson/parse-repository-url@3.0.2: - resolution: {integrity: sha512-H9XAx3hc0BQHY6l+IFSWHDySypcXsvsuLhgYLUGywmJ5pswRVQJUHpOsobnLYp2ZUaUlKiKDrgWWhosOwAEM8Q==} - engines: {node: '>=6.9.0'} - dev: true + '@hutson/parse-repository-url@3.0.2': {} - /@isaacs/cliui@8.0.2: - resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} - engines: {node: '>=12'} + '@isaacs/cliui@8.0.2': dependencies: string-width: 5.1.2 - string-width-cjs: /string-width@4.2.3 + string-width-cjs: string-width@4.2.3 strip-ansi: 7.1.0 - strip-ansi-cjs: /strip-ansi@6.0.1 + strip-ansi-cjs: strip-ansi@6.0.1 wrap-ansi: 8.1.0 - wrap-ansi-cjs: /wrap-ansi@7.0.0 - dev: false + wrap-ansi-cjs: wrap-ansi@7.0.0 - /@istanbuljs/load-nyc-config@1.1.0: - resolution: {integrity: sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==} - engines: {node: '>=8'} + '@istanbuljs/load-nyc-config@1.1.0': dependencies: camelcase: 5.3.1 find-up: 4.1.0 @@ -1042,13 +5600,9 @@ packages: js-yaml: 3.14.1 resolve-from: 5.0.0 - /@istanbuljs/schema@0.1.3: - resolution: {integrity: sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==} - engines: {node: '>=8'} + '@istanbuljs/schema@0.1.3': {} - /@jest/console@29.7.0: - resolution: {integrity: sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + '@jest/console@29.7.0': dependencies: '@jest/types': 29.6.3 '@types/node': 20.3.1 @@ -1057,14 +5611,7 @@ packages: jest-util: 29.7.0 slash: 3.0.0 - /@jest/core@29.7.0(ts-node@10.9.1): - resolution: {integrity: sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - peerDependencies: - node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 - peerDependenciesMeta: - node-notifier: - optional: true + '@jest/core@29.7.0(ts-node@10.9.1)': dependencies: '@jest/console': 29.7.0 '@jest/reporters': 29.7.0 @@ -1099,33 +5646,25 @@ packages: - supports-color - ts-node - /@jest/environment@29.7.0: - resolution: {integrity: sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + '@jest/environment@29.7.0': dependencies: '@jest/fake-timers': 29.7.0 '@jest/types': 29.6.3 '@types/node': 20.3.1 jest-mock: 29.7.0 - /@jest/expect-utils@29.7.0: - resolution: {integrity: sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + '@jest/expect-utils@29.7.0': dependencies: jest-get-type: 29.6.3 - /@jest/expect@29.7.0: - resolution: {integrity: sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + '@jest/expect@29.7.0': dependencies: expect: 29.7.0 jest-snapshot: 29.7.0 transitivePeerDependencies: - supports-color - /@jest/fake-timers@29.7.0: - resolution: {integrity: sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + '@jest/fake-timers@29.7.0': dependencies: '@jest/types': 29.6.3 '@sinonjs/fake-timers': 10.3.0 @@ -1134,9 +5673,7 @@ packages: jest-mock: 29.7.0 jest-util: 29.7.0 - /@jest/globals@29.7.0: - resolution: {integrity: sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + '@jest/globals@29.7.0': dependencies: '@jest/environment': 29.7.0 '@jest/expect': 29.7.0 @@ -1145,14 +5682,7 @@ packages: transitivePeerDependencies: - supports-color - /@jest/reporters@29.7.0: - resolution: {integrity: sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - peerDependencies: - node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 - peerDependenciesMeta: - node-notifier: - optional: true + '@jest/reporters@29.7.0': dependencies: '@bcoe/v8-coverage': 0.2.3 '@jest/console': 29.7.0 @@ -1181,41 +5711,31 @@ packages: transitivePeerDependencies: - supports-color - /@jest/schemas@29.6.3: - resolution: {integrity: sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + '@jest/schemas@29.6.3': dependencies: '@sinclair/typebox': 0.27.8 - /@jest/source-map@29.6.3: - resolution: {integrity: sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + '@jest/source-map@29.6.3': dependencies: '@jridgewell/trace-mapping': 0.3.22 callsites: 3.1.0 graceful-fs: 4.2.11 - /@jest/test-result@29.7.0: - resolution: {integrity: sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + '@jest/test-result@29.7.0': dependencies: '@jest/console': 29.7.0 '@jest/types': 29.6.3 '@types/istanbul-lib-coverage': 2.0.6 collect-v8-coverage: 1.0.2 - /@jest/test-sequencer@29.7.0: - resolution: {integrity: sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + '@jest/test-sequencer@29.7.0': dependencies: '@jest/test-result': 29.7.0 graceful-fs: 4.2.11 jest-haste-map: 29.7.0 slash: 3.0.0 - /@jest/transform@29.7.0: - resolution: {integrity: sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + '@jest/transform@29.7.0': dependencies: '@babel/core': 7.23.9 '@jest/types': 29.6.3 @@ -1235,9 +5755,7 @@ packages: transitivePeerDependencies: - supports-color - /@jest/types@29.6.3: - resolution: {integrity: sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + '@jest/types@29.6.3': dependencies: '@jest/schemas': 29.6.3 '@types/istanbul-lib-coverage': 2.0.6 @@ -1246,60 +5764,40 @@ packages: '@types/yargs': 17.0.32 chalk: 4.1.2 - /@jridgewell/gen-mapping@0.3.3: - resolution: {integrity: sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==} - engines: {node: '>=6.0.0'} + '@jridgewell/gen-mapping@0.3.3': dependencies: '@jridgewell/set-array': 1.1.2 '@jridgewell/sourcemap-codec': 1.4.15 '@jridgewell/trace-mapping': 0.3.22 - /@jridgewell/resolve-uri@3.1.1: - resolution: {integrity: sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==} - engines: {node: '>=6.0.0'} + '@jridgewell/resolve-uri@3.1.1': {} - /@jridgewell/set-array@1.1.2: - resolution: {integrity: sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==} - engines: {node: '>=6.0.0'} + '@jridgewell/set-array@1.1.2': {} - /@jridgewell/source-map@0.3.5: - resolution: {integrity: sha512-UTYAUj/wviwdsMfzoSJspJxbkH5o1snzwX0//0ENX1u/55kkZZkcTZP6u9bwKGkv+dkk9at4m1Cpt0uY80kcpQ==} + '@jridgewell/source-map@0.3.5': dependencies: '@jridgewell/gen-mapping': 0.3.3 '@jridgewell/trace-mapping': 0.3.22 - dev: true - /@jridgewell/sourcemap-codec@1.4.15: - resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} + '@jridgewell/sourcemap-codec@1.4.15': {} - /@jridgewell/trace-mapping@0.3.22: - resolution: {integrity: sha512-Wf963MzWtA2sjrNt+g18IAln9lKnlRp+K2eH4jjIoF1wYeq3aMREpG09xhlhdzS0EjwU7qmUJYangWa+151vZw==} + '@jridgewell/trace-mapping@0.3.22': dependencies: '@jridgewell/resolve-uri': 3.1.1 '@jridgewell/sourcemap-codec': 1.4.15 - /@jridgewell/trace-mapping@0.3.9: - resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==} + '@jridgewell/trace-mapping@0.3.9': dependencies: '@jridgewell/resolve-uri': 3.1.1 '@jridgewell/sourcemap-codec': 1.4.15 - /@jsdevtools/ono@7.1.3: - resolution: {integrity: sha512-4JQNk+3mVzK3xh2rqd6RB4J46qUR19azEHBneZyTZM+c456qOrbbM/5xcR8huNCCcbVt7+UmizG6GuUvPvKUYg==} - dev: false + '@jsdevtools/ono@7.1.3': {} - /@lukeed/csprng@1.1.0: - resolution: {integrity: sha512-Z7C/xXCiGWsg0KuKsHTKJxbWhpI3Vs5GwLfOean7MGyVFGqdRgBbAjOCh6u4bbjPc/8MJ2pZmK/0DLdCbivLDA==} - engines: {node: '>=8'} + '@lukeed/csprng@1.1.0': {} - /@lukeed/ms@2.0.2: - resolution: {integrity: sha512-9I2Zn6+NJLfaGoz9jN3lpwDgAYvfGeNYdbAIjJOqzs4Tpc+VU3Jqq4IofSUBKajiDS8k9fZIg18/z13mpk1bsA==} - engines: {node: '>=8'} - dev: false + '@lukeed/ms@2.0.2': {} - /@mapbox/node-pre-gyp@1.0.11: - resolution: {integrity: sha512-Yhlar6v9WQgUp/He7BdgzOz8lqMQ8sU+jkCq7Wx8Myc5YFJLbEe7lgui/V7G1qB1DJykHSGwreceSaD60Y0PUQ==} - hasBin: true + '@mapbox/node-pre-gyp@1.0.11': dependencies: detect-libc: 2.0.2 https-proxy-agent: 5.0.1 @@ -1313,72 +5811,33 @@ packages: transitivePeerDependencies: - encoding - supports-color - dev: false - /@microsoft/tsdoc@0.14.2: - resolution: {integrity: sha512-9b8mPpKrfeGRuhFH5iO1iwCLeIIsV6+H1sRfxbkoGXIyQE2BTsPd9zqSqQJ+pv5sJ/hT5M1zvOFL02MnEezFug==} - dev: false + '@microsoft/tsdoc@0.14.2': {} - /@nestjs-cls/transactional-adapter-prisma@1.1.0(@nestjs-cls/transactional@2.2.0)(@prisma/client@5.10.2)(nestjs-cls@4.2.0)(prisma@5.10.2): - resolution: {integrity: sha512-iTwt0uN+GTQOM9ZkSnbznWhPmKG10UDetVzZ3MZMdKZMRpkAZUnp5ClrmFUo3e37hUO/EYdfzi/g7wesO9owug==} - engines: {node: '>=18'} - peerDependencies: - '@nestjs-cls/transactional': ^2.2.0 - '@prisma/client': '> 4 < 6' - nestjs-cls: ^4.2.0 - prisma: '> 4 < 6' + '@nestjs-cls/transactional-adapter-prisma@1.1.0(@nestjs-cls/transactional@2.2.0)(@prisma/client@5.10.2)(nestjs-cls@4.2.0)(prisma@5.10.2)': dependencies: '@nestjs-cls/transactional': 2.2.0(@nestjs/common@10.0.0)(@nestjs/core@10.0.0)(nestjs-cls@4.2.0)(reflect-metadata@0.1.13)(rxjs@7.8.1) '@prisma/client': 5.10.2(prisma@5.10.2) nestjs-cls: 4.2.0(@nestjs/common@10.0.0)(@nestjs/core@10.0.0)(reflect-metadata@0.1.13)(rxjs@7.8.1) prisma: 5.10.2 - dev: false - /@nestjs-cls/transactional@2.2.0(@nestjs/common@10.0.0)(@nestjs/core@10.0.0)(nestjs-cls@4.2.0)(reflect-metadata@0.1.13)(rxjs@7.8.1): - resolution: {integrity: sha512-O3wWCiVjeOPLGPs/sPcAUhSe/xaNx8JuzBtGg4IqnVrZfbjDzeADtlHIO8YkYhHYAVbqvVtGFbfFjL5tDUGWsA==} - engines: {node: '>=16'} - peerDependencies: - '@nestjs/common': '> 7.0.0 < 11' - '@nestjs/core': '> 7.0.0 < 11' - nestjs-cls: ^4.2.0 - reflect-metadata: '*' - rxjs: '>= 7' + '@nestjs-cls/transactional@2.2.0(@nestjs/common@10.0.0)(@nestjs/core@10.0.0)(nestjs-cls@4.2.0)(reflect-metadata@0.1.13)(rxjs@7.8.1)': dependencies: '@nestjs/common': 10.0.0(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.1.13)(rxjs@7.8.1) '@nestjs/core': 10.0.0(@nestjs/common@10.0.0)(reflect-metadata@0.1.13)(rxjs@7.8.1) nestjs-cls: 4.2.0(@nestjs/common@10.0.0)(@nestjs/core@10.0.0)(reflect-metadata@0.1.13)(rxjs@7.8.1) reflect-metadata: 0.1.13 rxjs: 7.8.1 - dev: false - /@nestjs/cache-manager@2.2.0(@nestjs/common@10.0.0)(@nestjs/core@10.0.0)(cache-manager@5.4.0)(reflect-metadata@0.1.13)(rxjs@7.8.1): - resolution: {integrity: sha512-hAcX1f5moiK7B8KnPZVfV/up4nrZnaeN6w0o3M+UzNJNlw6bsIH6bn7jpGqzySAWPD9iYE/rg5IxTe1vSWyWZg==} - peerDependencies: - '@nestjs/common': ^9.0.0 || ^10.0.0 - '@nestjs/core': ^9.0.0 || ^10.0.0 - cache-manager: <=5 - reflect-metadata: ^0.1.12 - rxjs: ^7.0.0 + '@nestjs/cache-manager@2.2.0(@nestjs/common@10.0.0)(@nestjs/core@10.0.0)(cache-manager@5.4.0)(reflect-metadata@0.1.13)(rxjs@7.8.1)': dependencies: '@nestjs/common': 10.0.0(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.1.13)(rxjs@7.8.1) '@nestjs/core': 10.0.0(@nestjs/common@10.0.0)(reflect-metadata@0.1.13)(rxjs@7.8.1) cache-manager: 5.4.0 reflect-metadata: 0.1.13 rxjs: 7.8.1 - dev: false - /@nestjs/cli@10.0.0: - resolution: {integrity: sha512-14pju3ejAAUpFe1iK99v/b7Bw96phBMV58GXTSm3TcdgaI4O7UTLXTbMiUNyU+LGr/1CPIfThcWqFyKhDIC9VQ==} - engines: {node: '>= 16'} - hasBin: true - peerDependencies: - '@swc/cli': ^0.1.62 - '@swc/core': ^1.3.62 - peerDependenciesMeta: - '@swc/cli': - optional: true - '@swc/core': - optional: true + '@nestjs/cli@10.0.0': dependencies: '@angular-devkit/core': 16.1.0(chokidar@3.5.3) '@angular-devkit/schematics': 16.1.0(chokidar@3.5.3) @@ -1406,20 +5865,8 @@ packages: - esbuild - uglify-js - webpack-cli - dev: true - /@nestjs/common@10.0.0(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.1.13)(rxjs@7.8.1): - resolution: {integrity: sha512-Fa2GDQJrO5TTTcpISWfm0pdPS62V+8YbxeG5CA01zMUI+dCO3v3oFf+BSjqCGUUo7GDNzDsjAejwGXuqA54RPw==} - peerDependencies: - class-transformer: '*' - class-validator: '*' - reflect-metadata: ^0.1.12 - rxjs: ^7.1.0 - peerDependenciesMeta: - class-transformer: - optional: true - class-validator: - optional: true + '@nestjs/common@10.0.0(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.1.13)(rxjs@7.8.1)': dependencies: class-transformer: 0.5.1 class-validator: 0.14.1 @@ -1429,21 +5876,7 @@ packages: tslib: 2.5.3 uid: 2.0.2 - /@nestjs/common@9.4.0(cache-manager@5.4.0)(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.1.13)(rxjs@7.8.1): - resolution: {integrity: sha512-RUcVAQsEF4WPrmzFXEOUfZnPwrLTe1UVlzXTlSyfqfqbdWDPKDGlIPVelBLfc5/+RRUQ0I5iE4+CQvpCmkqldw==} - peerDependencies: - cache-manager: <=5 - class-transformer: '*' - class-validator: '*' - reflect-metadata: ^0.1.12 - rxjs: ^7.1.0 - peerDependenciesMeta: - cache-manager: - optional: true - class-transformer: - optional: true - class-validator: - optional: true + '@nestjs/common@9.4.0(cache-manager@5.4.0)(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.1.13)(rxjs@7.8.1)': dependencies: cache-manager: 5.4.0 class-transformer: 0.5.1 @@ -1453,13 +5886,8 @@ packages: rxjs: 7.8.1 tslib: 2.5.0 uid: 2.0.2 - dev: false - /@nestjs/config@3.1.1(@nestjs/common@10.0.0)(reflect-metadata@0.1.13): - resolution: {integrity: sha512-qu5QlNiJdqQtOsnB6lx4JCXPQ96jkKUsOGd+JXfXwqJqZcOSAq6heNFg0opW4pq4J/VZoNwoo87TNnx9wthnqQ==} - peerDependencies: - '@nestjs/common': ^8.0.0 || ^9.0.0 || ^10.0.0 - reflect-metadata: ^0.1.13 + '@nestjs/config@3.1.1(@nestjs/common@10.0.0)(reflect-metadata@0.1.13)': dependencies: '@nestjs/common': 10.0.0(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.1.13)(rxjs@7.8.1) dotenv: 16.3.1 @@ -1467,25 +5895,8 @@ packages: lodash: 4.17.21 reflect-metadata: 0.1.13 uuid: 9.0.0 - dev: false - /@nestjs/core@10.0.0(@nestjs/common@10.0.0)(reflect-metadata@0.1.13)(rxjs@7.8.1): - resolution: {integrity: sha512-HFTdj4vsF+2qOaq97ZPRDle6Q/KyL5lmMah0/ZR0ie+e1/tnlvmlqw589xFACTemLJFFOjZMy763v+icO9u72w==} - requiresBuild: true - peerDependencies: - '@nestjs/common': ^10.0.0 - '@nestjs/microservices': ^10.0.0 - '@nestjs/platform-express': ^10.0.0 - '@nestjs/websockets': ^10.0.0 - reflect-metadata: ^0.1.12 - rxjs: ^7.1.0 - peerDependenciesMeta: - '@nestjs/microservices': - optional: true - '@nestjs/platform-express': - optional: true - '@nestjs/websockets': - optional: true + '@nestjs/core@10.0.0(@nestjs/common@10.0.0)(reflect-metadata@0.1.13)(rxjs@7.8.1)': dependencies: '@nestjs/common': 10.0.0(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.1.13)(rxjs@7.8.1) '@nuxtjs/opencollective': 0.3.2 @@ -1499,70 +5910,32 @@ packages: transitivePeerDependencies: - encoding - /@nestjs/event-emitter@2.0.3(@nestjs/common@10.0.0)(@nestjs/core@10.0.0)(reflect-metadata@0.1.13): - resolution: {integrity: sha512-Pt7KAERrgK0OjvarSI3wfVhwZ8X1iLq1lXuodyRe+Zx3aLLP7fraFUHirASbFkB6KIQ1Zj+gZ1g8a9eu4GfFhw==} - peerDependencies: - '@nestjs/common': ^8.0.0 || ^9.0.0 || ^10.0.0 - '@nestjs/core': ^8.0.0 || ^9.0.0 || ^10.0.0 - reflect-metadata: ^0.1.12 + '@nestjs/event-emitter@2.0.3(@nestjs/common@10.0.0)(@nestjs/core@10.0.0)(reflect-metadata@0.1.13)': dependencies: '@nestjs/common': 10.0.0(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.1.13)(rxjs@7.8.1) '@nestjs/core': 10.0.0(@nestjs/common@10.0.0)(reflect-metadata@0.1.13)(rxjs@7.8.1) eventemitter2: 6.4.9 reflect-metadata: 0.1.13 - dev: false - /@nestjs/jwt@10.2.0(@nestjs/common@10.0.0): - resolution: {integrity: sha512-x8cG90SURkEiLOehNaN2aRlotxT0KZESUliOPKKnjWiyJOcWurkF3w345WOX0P4MgFzUjGoZ1Sy0aZnxeihT0g==} - peerDependencies: - '@nestjs/common': ^8.0.0 || ^9.0.0 || ^10.0.0 + '@nestjs/jwt@10.2.0(@nestjs/common@10.0.0)': dependencies: '@nestjs/common': 10.0.0(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.1.13)(rxjs@7.8.1) '@types/jsonwebtoken': 9.0.5 jsonwebtoken: 9.0.2 - dev: false - /@nestjs/mapped-types@2.0.5(@nestjs/common@10.0.0)(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.1.13): - resolution: {integrity: sha512-bSJv4pd6EY99NX9CjBIyn4TVDoSit82DUZlL4I3bqNfy5Gt+gXTa86i3I/i0iIV9P4hntcGM5GyO+FhZAhxtyg==} - peerDependencies: - '@nestjs/common': ^8.0.0 || ^9.0.0 || ^10.0.0 - class-transformer: ^0.4.0 || ^0.5.0 - class-validator: ^0.13.0 || ^0.14.0 - reflect-metadata: ^0.1.12 || ^0.2.0 - peerDependenciesMeta: - class-transformer: - optional: true - class-validator: - optional: true + '@nestjs/mapped-types@2.0.5(@nestjs/common@10.0.0)(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.1.13)': dependencies: '@nestjs/common': 10.0.0(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.1.13)(rxjs@7.8.1) class-transformer: 0.5.1 class-validator: 0.14.1 reflect-metadata: 0.1.13 - dev: false - /@nestjs/passport@10.0.3(@nestjs/common@10.0.0)(passport@0.7.0): - resolution: {integrity: sha512-znJ9Y4S8ZDVY+j4doWAJ8EuuVO7SkQN3yOBmzxbGaXbvcSwFDAdGJ+OMCg52NdzIO4tQoN4pYKx8W6M0ArfFRQ==} - peerDependencies: - '@nestjs/common': ^8.0.0 || ^9.0.0 || ^10.0.0 - passport: ^0.4.0 || ^0.5.0 || ^0.6.0 || ^0.7.0 + '@nestjs/passport@10.0.3(@nestjs/common@10.0.0)(passport@0.7.0)': dependencies: '@nestjs/common': 10.0.0(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.1.13)(rxjs@7.8.1) passport: 0.7.0 - dev: false - /@nestjs/platform-fastify@10.3.4(@fastify/static@6.12.0)(@nestjs/common@10.0.0)(@nestjs/core@10.0.0): - resolution: {integrity: sha512-rYoAdJ1ybBXPwO+KutWJ4siaqGDdMzwXS4ggJ5soQgD4maN2p1rvKE31MzERd1MqYXWprFIESFHuxkiHMZV6kg==} - peerDependencies: - '@fastify/static': ^6.0.0 || ^7.0.0 - '@fastify/view': ^7.0.0 || ^8.0.0 - '@nestjs/common': ^10.0.0 - '@nestjs/core': ^10.0.0 - peerDependenciesMeta: - '@fastify/static': - optional: true - '@fastify/view': - optional: true + '@nestjs/platform-fastify@10.3.4(@fastify/static@6.12.0)(@nestjs/common@10.0.0)(@nestjs/core@10.0.0)': dependencies: '@fastify/cors': 9.0.1 '@fastify/formbody': 7.4.0 @@ -1576,12 +5949,8 @@ packages: tslib: 2.6.2 transitivePeerDependencies: - supports-color - dev: false - /@nestjs/schematics@10.0.0(chokidar@3.5.3)(typescript@5.1.3): - resolution: {integrity: sha512-gfUy/N1m1paN33BXq4d7HoCM+zM4rFxYjqAb8jkrBfBHiwyEhHHozfX/aRy/kOnAcy/VP8v4Zs4HKKrbRRlHnw==} - peerDependencies: - typescript: '>=4.8.2' + '@nestjs/schematics@10.0.0(chokidar@3.5.3)(typescript@5.1.3)': dependencies: '@angular-devkit/core': 16.1.0(chokidar@3.5.3) '@angular-devkit/schematics': 16.1.0(chokidar@3.5.3) @@ -1591,24 +5960,8 @@ packages: typescript: 5.1.3 transitivePeerDependencies: - chokidar - dev: true - /@nestjs/swagger@7.3.0(@fastify/static@6.12.0)(@nestjs/common@10.0.0)(@nestjs/core@10.0.0)(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.1.13): - resolution: {integrity: sha512-zLkfKZ+ioYsIZ3dfv7Bj8YHnZMNAGWFUmx2ZDuLp/fBE4P8BSjB7hldzDueFXsmwaPL90v7lgyd82P+s7KME1Q==} - 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 - class-transformer: '*' - class-validator: '*' - reflect-metadata: ^0.1.12 || ^0.2.0 - peerDependenciesMeta: - '@fastify/static': - optional: true - class-transformer: - optional: true - class-validator: - optional: true + '@nestjs/swagger@7.3.0(@fastify/static@6.12.0)(@nestjs/common@10.0.0)(@nestjs/core@10.0.0)(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.1.13)': dependencies: '@fastify/static': 6.12.0 '@microsoft/tsdoc': 0.14.2 @@ -1622,67 +5975,32 @@ packages: path-to-regexp: 3.2.0 reflect-metadata: 0.1.13 swagger-ui-dist: 5.11.2 - dev: false - /@nestjs/testing@10.0.0(@nestjs/common@10.0.0)(@nestjs/core@10.0.0): - resolution: {integrity: sha512-U5q3+svkddpdSk51ZFCEnFpQuWxAwE4ahsX77FrqqCAYidr7HUtL/BHYOVzI5H9vUH6BvJxMbfo3tiUXQl/2aA==} - peerDependencies: - '@nestjs/common': ^10.0.0 - '@nestjs/core': ^10.0.0 - '@nestjs/microservices': ^10.0.0 - '@nestjs/platform-express': ^10.0.0 - peerDependenciesMeta: - '@nestjs/microservices': - optional: true - '@nestjs/platform-express': - optional: true + '@nestjs/testing@10.0.0(@nestjs/common@10.0.0)(@nestjs/core@10.0.0)': dependencies: '@nestjs/common': 10.0.0(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.1.13)(rxjs@7.8.1) '@nestjs/core': 10.0.0(@nestjs/common@10.0.0)(reflect-metadata@0.1.13)(rxjs@7.8.1) tslib: 2.5.3 - dev: true - /@nestjs/testing@9.4.0(@nestjs/common@9.4.0)(@nestjs/core@10.0.0): - resolution: {integrity: sha512-xZWp363P4otcebg++gSjUcdCfTK0RorORzyFq3aLaSAQOlq8kxfFDRIKzEATR4aOUfqTMMsAA8lhnMJWf35N6A==} - peerDependencies: - '@nestjs/common': ^9.0.0 - '@nestjs/core': ^9.0.0 - '@nestjs/microservices': ^9.0.0 - '@nestjs/platform-express': ^9.0.0 - peerDependenciesMeta: - '@nestjs/microservices': - optional: true - '@nestjs/platform-express': - optional: true + '@nestjs/testing@9.4.0(@nestjs/common@9.4.0)(@nestjs/core@10.0.0)': dependencies: '@nestjs/common': 9.4.0(cache-manager@5.4.0)(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.1.13)(rxjs@7.8.1) '@nestjs/core': 10.0.0(@nestjs/common@10.0.0)(reflect-metadata@0.1.13)(rxjs@7.8.1) tslib: 2.5.0 - dev: false - /@nodelib/fs.scandir@2.1.5: - resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} - engines: {node: '>= 8'} + '@nodelib/fs.scandir@2.1.5': dependencies: '@nodelib/fs.stat': 2.0.5 run-parallel: 1.2.0 - dev: true - /@nodelib/fs.stat@2.0.5: - resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} - engines: {node: '>= 8'} - dev: true + '@nodelib/fs.stat@2.0.5': {} - /@nodelib/fs.walk@1.2.8: - resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} - engines: {node: '>= 8'} + '@nodelib/fs.walk@1.2.8': dependencies: '@nodelib/fs.scandir': 2.1.5 fastq: 1.17.1 - dev: true - /@nodeteam/nestjs-prisma-pagination@1.0.6(@babel/core@7.23.9)(@nestjs/core@10.0.0)(@types/node@20.3.1)(cache-manager@5.4.0)(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.1.13)(rxjs@7.8.1)(ts-node@10.9.1): - resolution: {integrity: sha512-ZTTXIlbnphmtBt4xFlFfV7an5e2EvmC/P4nj7s0nbSgq8bYovjMAbGxlmBh/shxfVaQeYCl78SoSnYWOjIQMCA==} + '@nodeteam/nestjs-prisma-pagination@1.0.6(@babel/core@7.23.9)(@nestjs/core@10.0.0)(@types/node@20.3.1)(cache-manager@5.4.0)(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.1.13)(rxjs@7.8.1)(ts-node@10.9.1)': dependencies: '@nestjs/common': 9.4.0(cache-manager@5.4.0)(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.1.13)(rxjs@7.8.1) '@nestjs/testing': 9.4.0(@nestjs/common@9.4.0)(@nestjs/core@10.0.0) @@ -1707,29 +6025,18 @@ packages: - rxjs - supports-color - ts-node - dev: false - /@npmcli/fs@2.1.2: - resolution: {integrity: sha512-yOJKRvohFOaLqipNtwYB9WugyZKhC/DZC4VYPmpaCzDBrA8YpK3qHZ8/HGscMnE4GqbkLNuVcCnxkeQEdGt6LQ==} - engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + '@npmcli/fs@2.1.2': dependencies: '@gar/promisify': 1.1.3 semver: 7.6.0 - dev: false - /@npmcli/move-file@2.0.1: - resolution: {integrity: sha512-mJd2Z5TjYWq/ttPLLGqArdtnC74J6bOzg4rMDnN+p1xTacZ2yPRCk2y0oSWQtygLR9YVQXgOcONrwtnk3JupxQ==} - engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} - deprecated: This functionality has been moved to @npmcli/fs + '@npmcli/move-file@2.0.1': dependencies: mkdirp: 1.0.4 rimraf: 3.0.2 - dev: false - /@nuxtjs/opencollective@0.3.2: - resolution: {integrity: sha512-um0xL3fO7Mf4fDxcqx9KryrB7zgRM5JSlvGN5AGkP6JLM5XEKyjeAiPbNxdXVXQ16isuAhYpvP88NgL2BGd6aA==} - engines: {node: '>=8.0.0', npm: '>=5.0.0'} - hasBin: true + '@nuxtjs/opencollective@0.3.2': dependencies: chalk: 4.1.2 consola: 2.15.3 @@ -1737,30 +6044,16 @@ packages: transitivePeerDependencies: - encoding - /@open-draft/deferred-promise@2.2.0: - resolution: {integrity: sha512-CecwLWx3rhxVQF6V4bAgPS5t+So2sTbPgAzafKkVizyi7tlwpcFpdFqq+wqF2OwNBmqFuu6tOyouTuxgpMfzmA==} - dev: false + '@open-draft/deferred-promise@2.2.0': {} - /@pkgjs/parseargs@0.11.0: - resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} - engines: {node: '>=14'} - requiresBuild: true - dev: false + '@pkgjs/parseargs@0.11.0': optional: true - /@pkgr/core@0.1.1: - resolution: {integrity: sha512-cq8o4cWH0ibXh9VGi5P20Tu9XF/0fFXl9EUinr9QfTM7a7p0oTA4iJRCQWppXR1Pg8dSM0UCItCkPwsk9qWWYA==} - engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} - dev: true + '@pkgr/core@0.1.1': {} - /@polka/url@0.5.0: - resolution: {integrity: sha512-oZLYFEAzUKyi3SKnXvj32ZCEGH6RDnao7COuCVhDydMS9NrCSVXhM79VaKyP5+Zc33m0QXEd2DN3UkU7OsHcfw==} - dev: true + '@polka/url@0.5.0': {} - /@pond918/prisma-generator-nestjs-dto@1.17.513: - resolution: {integrity: sha512-wq/GSVeVuD8kSm1Q6mC2T1MjNkyhn4wtD+N62Zp4XwV4hbxVNXUgLQsBn1lex8Yhd9DqHlVAawyTwKhLt6xBqg==} - engines: {node: '>=14'} - hasBin: true + '@pond918/prisma-generator-nestjs-dto@1.17.513': dependencies: '@prisma/generator-helper': 4.16.2 case: 1.6.3 @@ -1773,54 +6066,37 @@ packages: ts-toolbelt: 9.6.0 transitivePeerDependencies: - supports-color - dev: true - /@prisma/client@5.10.2(prisma@5.10.2): - resolution: {integrity: sha512-ef49hzB2yJZCvM5gFHMxSFL9KYrIP9udpT5rYo0CsHD4P9IKj473MbhU1gjKKftiwWBTIyrt9jukprzZXazyag==} - engines: {node: '>=16.13'} - requiresBuild: true - peerDependencies: - prisma: '*' - peerDependenciesMeta: - prisma: - optional: true + '@prisma/client@5.10.2(prisma@5.10.2)': dependencies: prisma: 5.10.2 - /@prisma/debug@4.16.2: - resolution: {integrity: sha512-7L7WbG0qNNZYgLpsVB8rCHCXEyHFyIycRlRDNwkVfjQmACC2OW6AWCYCbfdjQhkF/t7+S3njj8wAWAocSs+Brw==} + '@prisma/debug@4.16.2': dependencies: '@types/debug': 4.1.8 debug: 4.3.4 strip-ansi: 6.0.1 transitivePeerDependencies: - supports-color - dev: true - /@prisma/debug@5.10.2: - resolution: {integrity: sha512-bkBOmH9dpEBbMKFJj8V+Zp8IZHIBjy3fSyhLhxj4FmKGb/UBSt9doyfA6k1UeUREsMJft7xgPYBbHSOYBr8XCA==} + '@prisma/debug@5.10.2': {} - /@prisma/engines-version@5.10.0-34.5a9203d0590c951969e85a7d07215503f4672eb9: - resolution: {integrity: sha512-uCy/++3Jx/O3ufM+qv2H1L4tOemTNqcP/gyEVOlZqTpBvYJUe0tWtW0y3o2Ueq04mll4aM5X3f6ugQftOSLdFQ==} + '@prisma/engines-version@5.10.0-34.5a9203d0590c951969e85a7d07215503f4672eb9': {} - /@prisma/engines@5.10.2: - resolution: {integrity: sha512-HkSJvix6PW8YqEEt3zHfCYYJY69CXsNdhU+wna+4Y7EZ+AwzeupMnUThmvaDA7uqswiHkgm5/SZ6/4CStjaGmw==} - requiresBuild: true + '@prisma/engines@5.10.2': dependencies: '@prisma/debug': 5.10.2 '@prisma/engines-version': 5.10.0-34.5a9203d0590c951969e85a7d07215503f4672eb9 '@prisma/fetch-engine': 5.10.2 '@prisma/get-platform': 5.10.2 - /@prisma/fetch-engine@5.10.2: - resolution: {integrity: sha512-dSmXcqSt6DpTmMaLQ9K8ZKzVAMH3qwGCmYEZr/uVnzVhxRJ1EbT/w2MMwIdBNq1zT69Rvh0h75WMIi0mrIw7Hg==} + '@prisma/fetch-engine@5.10.2': dependencies: '@prisma/debug': 5.10.2 '@prisma/engines-version': 5.10.0-34.5a9203d0590c951969e85a7d07215503f4672eb9 '@prisma/get-platform': 5.10.2 - /@prisma/generator-helper@4.16.2: - resolution: {integrity: sha512-bMOH7y73Ui7gpQrioFeavMQA+Tf8ksaVf8Nhs9rQNzuSg8SSV6E9baczob0L5KGZTSgYoqnrRxuo03kVJYrnIg==} + '@prisma/generator-helper@4.16.2': dependencies: '@prisma/debug': 4.16.2 '@types/cross-spawn': 6.0.2 @@ -1828,56 +6104,40 @@ packages: kleur: 4.1.5 transitivePeerDependencies: - supports-color - dev: true - /@prisma/get-platform@5.10.2: - resolution: {integrity: sha512-nqXP6vHiY2PIsebBAuDeWiUYg8h8mfjBckHh6Jezuwej0QJNnjDiOq30uesmg+JXxGk99nqyG3B7wpcOODzXvg==} + '@prisma/get-platform@5.10.2': dependencies: '@prisma/debug': 5.10.2 - /@schematics/angular@13.3.11: - resolution: {integrity: sha512-imKBnKYEse0SBVELZO/753nkpt3eEgpjrYkB+AFWF9YfO/4RGnYXDHoH8CFkzxPH9QQCgNrmsVFNiYGS+P/S1A==} - engines: {node: ^12.20.0 || ^14.15.0 || >=16.10.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: '>= 1.13.0'} + '@schematics/angular@13.3.11': dependencies: '@angular-devkit/core': 13.3.11 '@angular-devkit/schematics': 13.3.11 jsonc-parser: 3.0.0 transitivePeerDependencies: - chokidar - dev: false - /@sinclair/typebox@0.27.8: - resolution: {integrity: sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==} + '@sinclair/typebox@0.27.8': {} - /@sinonjs/commons@3.0.1: - resolution: {integrity: sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==} + '@sinonjs/commons@3.0.1': dependencies: type-detect: 4.0.8 - /@sinonjs/fake-timers@10.3.0: - resolution: {integrity: sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==} + '@sinonjs/fake-timers@10.3.0': dependencies: '@sinonjs/commons': 3.0.1 - /@tootallnate/once@2.0.0: - resolution: {integrity: sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==} - engines: {node: '>= 10'} - dev: false + '@tootallnate/once@2.0.0': {} - /@tsconfig/node10@1.0.9: - resolution: {integrity: sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==} + '@tsconfig/node10@1.0.9': {} - /@tsconfig/node12@1.0.11: - resolution: {integrity: sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==} + '@tsconfig/node12@1.0.11': {} - /@tsconfig/node14@1.0.3: - resolution: {integrity: sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==} + '@tsconfig/node14@1.0.3': {} - /@tsconfig/node16@1.0.4: - resolution: {integrity: sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==} + '@tsconfig/node16@1.0.4': {} - /@types/babel__core@7.20.5: - resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==} + '@types/babel__core@7.20.5': dependencies: '@babel/parser': 7.23.9 '@babel/types': 7.23.9 @@ -1885,266 +6145,177 @@ packages: '@types/babel__template': 7.4.4 '@types/babel__traverse': 7.20.5 - /@types/babel__generator@7.6.8: - resolution: {integrity: sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==} + '@types/babel__generator@7.6.8': dependencies: '@babel/types': 7.23.9 - /@types/babel__template@7.4.4: - resolution: {integrity: sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==} + '@types/babel__template@7.4.4': dependencies: '@babel/parser': 7.23.9 '@babel/types': 7.23.9 - /@types/babel__traverse@7.20.5: - resolution: {integrity: sha512-WXCyOcRtH37HAUkpXhUduaxdm82b4GSlyTqajXviN4EfiuPgNYR109xMCKvpl6zPIpua0DGlMEDCq+g8EdoheQ==} + '@types/babel__traverse@7.20.5': dependencies: '@babel/types': 7.23.9 - /@types/bcrypt@5.0.2: - resolution: {integrity: sha512-6atioO8Y75fNcbmj0G7UjI9lXN2pQ/IGJ2FWT4a/btd0Lk9lQalHLKhkgKVZ3r+spnmWUKfbMi1GEe9wyHQfNQ==} + '@types/bcrypt@5.0.2': dependencies: '@types/node': 20.3.1 - dev: true - /@types/body-parser@1.19.5: - resolution: {integrity: sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==} + '@types/body-parser@1.19.5': dependencies: '@types/connect': 3.4.38 '@types/node': 20.3.1 - dev: true - /@types/connect@3.4.38: - resolution: {integrity: sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==} + '@types/connect@3.4.38': dependencies: '@types/node': 20.3.1 - dev: true - /@types/conventional-commits-parser@5.0.0: - resolution: {integrity: sha512-loB369iXNmAZglwWATL+WRe+CRMmmBPtpolYzIebFaX4YA3x+BEfLqhUAV9WanycKI3TG1IMr5bMJDajDKLlUQ==} + '@types/conventional-commits-parser@5.0.0': dependencies: '@types/node': 20.3.1 - dev: true - /@types/cookiejar@2.1.5: - resolution: {integrity: sha512-he+DHOWReW0nghN24E1WUqM0efK4kI9oTqDm6XmK8ZPe2djZ90BSNdGnIyCLzCPw7/pogPlGbzI2wHGGmi4O/Q==} - dev: true + '@types/cookiejar@2.1.5': {} - /@types/cross-spawn@6.0.2: - resolution: {integrity: sha512-KuwNhp3eza+Rhu8IFI5HUXRP0LIhqH5cAjubUvGXXthh4YYBuP2ntwEX+Cz8GJoZUHlKo247wPWOfA9LYEq4cw==} + '@types/cross-spawn@6.0.2': dependencies: '@types/node': 20.3.1 - dev: true - /@types/debug@4.1.8: - resolution: {integrity: sha512-/vPO1EPOs306Cvhwv7KfVfYvOJqA/S/AXjaHQiJboCZzcNDb+TIJFN9/2C9DZ//ijSKWioNyUxD792QmDJ+HKQ==} + '@types/debug@4.1.8': dependencies: '@types/ms': 0.7.34 - dev: true - /@types/dot@1.1.7: - resolution: {integrity: sha512-RhMcnI18Y+401Nceh2pW5gTGgsdfZdvg9g0P/5HIBJ0jmZEv5KlkYvfQiHhw4/Vnb8NdePi/4UCs92ITExLxuQ==} - dev: true + '@types/dot@1.1.7': {} - /@types/eslint-scope@3.7.7: - resolution: {integrity: sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==} + '@types/eslint-scope@3.7.7': dependencies: '@types/eslint': 8.56.2 '@types/estree': 1.0.5 - dev: true - /@types/eslint@8.56.2: - resolution: {integrity: sha512-uQDwm1wFHmbBbCZCqAlq6Do9LYwByNZHWzXppSnay9SuwJ+VRbjkbLABer54kcPnMSlG6Fdiy2yaFXm/z9Z5gw==} + '@types/eslint@8.56.2': dependencies: '@types/estree': 1.0.5 '@types/json-schema': 7.0.15 - dev: true - /@types/estree@1.0.5: - resolution: {integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==} - dev: true + '@types/estree@1.0.5': {} - /@types/express-serve-static-core@4.17.43: - resolution: {integrity: sha512-oaYtiBirUOPQGSWNGPWnzyAFJ0BP3cwvN4oWZQY+zUBwpVIGsKUkpBpSztp74drYcjavs7SKFZ4DX1V2QeN8rg==} + '@types/express-serve-static-core@4.17.43': dependencies: '@types/node': 20.3.1 '@types/qs': 6.9.11 '@types/range-parser': 1.2.7 '@types/send': 0.17.4 - dev: true - /@types/express@4.17.17: - resolution: {integrity: sha512-Q4FmmuLGBG58btUnfS1c1r/NQdlp3DMfGDGig8WhfpA2YRUtEkxAjkZb0yvplJGYdF1fsQ81iMDcH24sSCNC/Q==} + '@types/express@4.17.17': dependencies: '@types/body-parser': 1.19.5 '@types/express-serve-static-core': 4.17.43 '@types/qs': 6.9.11 '@types/serve-static': 1.15.5 - dev: true - /@types/graceful-fs@4.1.9: - resolution: {integrity: sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==} + '@types/graceful-fs@4.1.9': dependencies: '@types/node': 20.3.1 - /@types/http-errors@2.0.4: - resolution: {integrity: sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA==} - dev: true + '@types/http-errors@2.0.4': {} - /@types/istanbul-lib-coverage@2.0.6: - resolution: {integrity: sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==} + '@types/istanbul-lib-coverage@2.0.6': {} - /@types/istanbul-lib-report@3.0.3: - resolution: {integrity: sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==} + '@types/istanbul-lib-report@3.0.3': dependencies: '@types/istanbul-lib-coverage': 2.0.6 - /@types/istanbul-reports@3.0.4: - resolution: {integrity: sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==} + '@types/istanbul-reports@3.0.4': dependencies: '@types/istanbul-lib-report': 3.0.3 - /@types/jest@29.5.2: - resolution: {integrity: sha512-mSoZVJF5YzGVCk+FsDxzDuH7s+SCkzrgKZzf0Z0T2WudhBUPoF6ktoTPC4R0ZoCPCV5xUvuU6ias5NvxcBcMMg==} + '@types/jest@29.5.2': dependencies: expect: 29.7.0 pretty-format: 29.7.0 - dev: true - /@types/json-schema@7.0.15: - resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} + '@types/json-schema@7.0.15': {} - /@types/jsonwebtoken@9.0.5: - resolution: {integrity: sha512-VRLSGzik+Unrup6BsouBeHsf4d1hOEgYWTm/7Nmw1sXoN1+tRly/Gy/po3yeahnP4jfnQWWAhQAqcNfH7ngOkA==} + '@types/jsonwebtoken@9.0.5': dependencies: '@types/node': 20.3.1 - /@types/methods@1.1.4: - resolution: {integrity: sha512-ymXWVrDiCxTBE3+RIrrP533E70eA+9qu7zdWoHuOmGujkYtzf4HQF96b8nwHLqhuf4ykX61IGRIB38CC6/sImQ==} - dev: true + '@types/methods@1.1.4': {} - /@types/mime@1.3.5: - resolution: {integrity: sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==} - dev: true + '@types/mime@1.3.5': {} - /@types/mime@3.0.4: - resolution: {integrity: sha512-iJt33IQnVRkqeqC7PzBHPTC6fDlRNRW8vjrgqtScAhrmMwe8c4Eo7+fUGTa+XdWrpEgpyKWMYmi2dIwMAYRzPw==} - dev: true + '@types/mime@3.0.4': {} - /@types/minimist@1.2.5: - resolution: {integrity: sha512-hov8bUuiLiyFPGyFPE1lwWhmzYbirOXQNNo40+y3zow8aFVTeyn3VWL0VFFfdNddA8S4Vf0Tc062rzyNr7Paag==} - dev: true + '@types/minimist@1.2.5': {} - /@types/ms@0.7.34: - resolution: {integrity: sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g==} - dev: true + '@types/ms@0.7.34': {} - /@types/node@20.3.1: - resolution: {integrity: sha512-EhcH/wvidPy1WeML3TtYFGR83UzjxeWRen9V402T8aUGYsCHOmfoisV3ZSg03gAFIbLq8TnWOJ0f4cALtnSEUg==} + '@types/node@20.3.1': {} - /@types/normalize-package-data@2.4.4: - resolution: {integrity: sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==} - dev: true + '@types/normalize-package-data@2.4.4': {} - /@types/parse-json@4.0.2: - resolution: {integrity: sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==} - dev: true + '@types/parse-json@4.0.2': {} - /@types/passport-jwt@4.0.1: - resolution: {integrity: sha512-Y0Ykz6nWP4jpxgEUYq8NoVZeCQPo1ZndJLfapI249g1jHChvRfZRO/LS3tqu26YgAS/laI1qx98sYGz0IalRXQ==} + '@types/passport-jwt@4.0.1': dependencies: '@types/jsonwebtoken': 9.0.5 '@types/passport-strategy': 0.2.38 - dev: true - /@types/passport-local@1.0.38: - resolution: {integrity: sha512-nsrW4A963lYE7lNTv9cr5WmiUD1ibYJvWrpE13oxApFsRt77b0RdtZvKbCdNIY4v/QZ6TRQWaDDEwV1kCTmcXg==} + '@types/passport-local@1.0.38': dependencies: '@types/express': 4.17.17 '@types/passport': 1.0.16 '@types/passport-strategy': 0.2.38 - dev: true - /@types/passport-strategy@0.2.38: - resolution: {integrity: sha512-GC6eMqqojOooq993Tmnmp7AUTbbQSgilyvpCYQjT+H6JfG/g6RGc7nXEniZlp0zyKJ0WUdOiZWLBZft9Yug1uA==} + '@types/passport-strategy@0.2.38': dependencies: '@types/express': 4.17.17 '@types/passport': 1.0.16 - dev: true - /@types/passport@1.0.16: - resolution: {integrity: sha512-FD0qD5hbPWQzaM0wHUnJ/T0BBCJBxCeemtnCwc/ThhTg3x9jfrAcRUmj5Dopza+MfFS9acTe3wk7rcVnRIp/0A==} + '@types/passport@1.0.16': dependencies: '@types/express': 4.17.17 - dev: true - /@types/qs@6.9.11: - resolution: {integrity: sha512-oGk0gmhnEJK4Yyk+oI7EfXsLayXatCWPHary1MtcmbAifkobT9cM9yutG/hZKIseOU0MqbIwQ/u2nn/Gb+ltuQ==} - dev: true + '@types/qs@6.9.11': {} - /@types/range-parser@1.2.7: - resolution: {integrity: sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==} - dev: true + '@types/range-parser@1.2.7': {} - /@types/semver@7.5.6: - resolution: {integrity: sha512-dn1l8LaMea/IjDoHNd9J52uBbInB796CDffS6VdIxvqYCPSG0V0DzHp76GpaWnlhg88uYyPbXCDIowa86ybd5A==} - dev: true + '@types/semver@7.5.6': {} - /@types/send@0.17.4: - resolution: {integrity: sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==} + '@types/send@0.17.4': dependencies: '@types/mime': 1.3.5 '@types/node': 20.3.1 - dev: true - /@types/serve-static@1.15.5: - resolution: {integrity: sha512-PDRk21MnK70hja/YF8AHfC7yIsiQHn1rcXx7ijCFBX/k+XQJhQT/gw3xekXKJvx+5SXaMMS8oqQy09Mzvz2TuQ==} + '@types/serve-static@1.15.5': dependencies: '@types/http-errors': 2.0.4 '@types/mime': 3.0.4 '@types/node': 20.3.1 - dev: true - /@types/stack-utils@2.0.3: - resolution: {integrity: sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==} + '@types/stack-utils@2.0.3': {} - /@types/superagent@8.1.3: - resolution: {integrity: sha512-R/CfN6w2XsixLb1Ii8INfn+BT9sGPvw74OavfkW4SwY+jeUcAwLZv2+bXLJkndnimxjEBm0RPHgcjW9pLCa8cw==} + '@types/superagent@8.1.3': dependencies: '@types/cookiejar': 2.1.5 '@types/methods': 1.1.4 '@types/node': 20.3.1 - dev: true - /@types/supertest@6.0.0: - resolution: {integrity: sha512-j3/Z2avY+H3yn+xp/ef//QyqqE+dg3rWh14Ewi/QZs6uVK+oOs7lFRXtjp2YHAqHJZ4OFGNmCxZO5vd7AuG/Dg==} + '@types/supertest@6.0.0': dependencies: '@types/cookiejar': 2.1.5 '@types/methods': 1.1.4 '@types/superagent': 8.1.3 - dev: true - /@types/validator@13.11.9: - resolution: {integrity: sha512-FCTsikRozryfayPuiI46QzH3fnrOoctTjvOYZkho9BTFLCOZ2rgZJHMOVgCOfttjPJcgOx52EpkY0CMfy87MIw==} + '@types/validator@13.11.9': {} - /@types/yargs-parser@21.0.3: - resolution: {integrity: sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==} + '@types/yargs-parser@21.0.3': {} - /@types/yargs@17.0.32: - resolution: {integrity: sha512-xQ67Yc/laOG5uMfX/093MRlGGCIBzZMarVa+gfNKJxWAIgykYpVGkBdbqEzGDDfCrVUj6Hiff4mTZ5BA6TmAog==} + '@types/yargs@17.0.32': dependencies: '@types/yargs-parser': 21.0.3 - /@typescript-eslint/eslint-plugin@6.0.0(@typescript-eslint/parser@6.0.0)(eslint@8.42.0)(typescript@5.1.3): - resolution: {integrity: sha512-xuv6ghKGoiq856Bww/yVYnXGsKa588kY3M0XK7uUW/3fJNNULKRfZfSBkMTSpqGG/8ZCXCadfh8G/z/B4aqS/A==} - engines: {node: ^16.0.0 || >=18.0.0} - peerDependencies: - '@typescript-eslint/parser': ^6.0.0 || ^6.0.0-alpha - eslint: ^7.0.0 || ^8.0.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true + '@typescript-eslint/eslint-plugin@6.0.0(@typescript-eslint/parser@6.0.0)(eslint@8.42.0)(typescript@5.1.3)': dependencies: '@eslint-community/regexpp': 4.10.0 '@typescript-eslint/parser': 6.0.0(eslint@8.42.0)(typescript@5.1.3) @@ -2164,17 +6335,8 @@ packages: typescript: 5.1.3 transitivePeerDependencies: - supports-color - dev: true - /@typescript-eslint/parser@6.0.0(eslint@8.42.0)(typescript@5.1.3): - resolution: {integrity: sha512-TNaufYSPrr1U8n+3xN+Yp9g31vQDJqhXzzPSHfQDLcaO4tU+mCfODPxCwf4H530zo7aUBE3QIdxCXamEnG04Tg==} - engines: {node: ^16.0.0 || >=18.0.0} - peerDependencies: - eslint: ^7.0.0 || ^8.0.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true + '@typescript-eslint/parser@6.0.0(eslint@8.42.0)(typescript@5.1.3)': dependencies: '@typescript-eslint/scope-manager': 6.0.0 '@typescript-eslint/types': 6.0.0 @@ -2185,25 +6347,13 @@ packages: typescript: 5.1.3 transitivePeerDependencies: - supports-color - dev: true - /@typescript-eslint/scope-manager@6.0.0: - resolution: {integrity: sha512-o4q0KHlgCZTqjuaZ25nw5W57NeykZT9LiMEG4do/ovwvOcPnDO1BI5BQdCsUkjxFyrCL0cSzLjvIMfR9uo7cWg==} - engines: {node: ^16.0.0 || >=18.0.0} + '@typescript-eslint/scope-manager@6.0.0': dependencies: '@typescript-eslint/types': 6.0.0 '@typescript-eslint/visitor-keys': 6.0.0 - dev: true - /@typescript-eslint/type-utils@6.0.0(eslint@8.42.0)(typescript@5.1.3): - resolution: {integrity: sha512-ah6LJvLgkoZ/pyJ9GAdFkzeuMZ8goV6BH7eC9FPmojrnX9yNCIsfjB+zYcnex28YO3RFvBkV6rMV6WpIqkPvoQ==} - engines: {node: ^16.0.0 || >=18.0.0} - peerDependencies: - eslint: ^7.0.0 || ^8.0.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true + '@typescript-eslint/type-utils@6.0.0(eslint@8.42.0)(typescript@5.1.3)': dependencies: '@typescript-eslint/typescript-estree': 6.0.0(typescript@5.1.3) '@typescript-eslint/utils': 6.0.0(eslint@8.42.0)(typescript@5.1.3) @@ -2213,21 +6363,10 @@ packages: typescript: 5.1.3 transitivePeerDependencies: - supports-color - dev: true - /@typescript-eslint/types@6.0.0: - resolution: {integrity: sha512-Zk9KDggyZM6tj0AJWYYKgF0yQyrcnievdhG0g5FqyU3Y2DRxJn4yWY21sJC0QKBckbsdKKjYDV2yVrrEvuTgxg==} - engines: {node: ^16.0.0 || >=18.0.0} - dev: true + '@typescript-eslint/types@6.0.0': {} - /@typescript-eslint/typescript-estree@6.0.0(typescript@5.1.3): - resolution: {integrity: sha512-2zq4O7P6YCQADfmJ5OTDQTP3ktajnXIRrYAtHM9ofto/CJZV3QfJ89GEaM2BNGeSr1KgmBuLhEkz5FBkS2RQhQ==} - engines: {node: ^16.0.0 || >=18.0.0} - peerDependencies: - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true + '@typescript-eslint/typescript-estree@6.0.0(typescript@5.1.3)': dependencies: '@typescript-eslint/types': 6.0.0 '@typescript-eslint/visitor-keys': 6.0.0 @@ -2239,13 +6378,8 @@ packages: typescript: 5.1.3 transitivePeerDependencies: - supports-color - dev: true - /@typescript-eslint/utils@6.0.0(eslint@8.42.0)(typescript@5.1.3): - resolution: {integrity: sha512-SOr6l4NB6HE4H/ktz0JVVWNXqCJTOo/mHnvIte1ZhBQ0Cvd04x5uKZa3zT6tiodL06zf5xxdK8COiDvPnQ27JQ==} - engines: {node: ^16.0.0 || >=18.0.0} - peerDependencies: - eslint: ^7.0.0 || ^8.0.0 + '@typescript-eslint/utils@6.0.0(eslint@8.42.0)(typescript@5.1.3)': dependencies: '@eslint-community/eslint-utils': 4.4.0(eslint@8.42.0) '@types/json-schema': 7.0.15 @@ -2259,74 +6393,49 @@ packages: transitivePeerDependencies: - supports-color - typescript - dev: true - /@typescript-eslint/visitor-keys@6.0.0: - resolution: {integrity: sha512-cvJ63l8c0yXdeT5POHpL0Q1cZoRcmRKFCtSjNGJxPkcP571EfZMcNbzWAc7oK3D1dRzm/V5EwtkANTZxqvuuUA==} - engines: {node: ^16.0.0 || >=18.0.0} + '@typescript-eslint/visitor-keys@6.0.0': dependencies: '@typescript-eslint/types': 6.0.0 eslint-visitor-keys: 3.4.3 - dev: true - /@webassemblyjs/ast@1.11.6: - resolution: {integrity: sha512-IN1xI7PwOvLPgjcf180gC1bqn3q/QaOCwYUahIOhbYUu8KA/3tw2RT/T0Gidi1l7Hhj5D/INhJxiICObqpMu4Q==} + '@webassemblyjs/ast@1.11.6': dependencies: '@webassemblyjs/helper-numbers': 1.11.6 '@webassemblyjs/helper-wasm-bytecode': 1.11.6 - dev: true - /@webassemblyjs/floating-point-hex-parser@1.11.6: - resolution: {integrity: sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==} - dev: true + '@webassemblyjs/floating-point-hex-parser@1.11.6': {} - /@webassemblyjs/helper-api-error@1.11.6: - resolution: {integrity: sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==} - dev: true + '@webassemblyjs/helper-api-error@1.11.6': {} - /@webassemblyjs/helper-buffer@1.11.6: - resolution: {integrity: sha512-z3nFzdcp1mb8nEOFFk8DrYLpHvhKC3grJD2ardfKOzmbmJvEf/tPIqCY+sNcwZIY8ZD7IkB2l7/pqhUhqm7hLA==} - dev: true + '@webassemblyjs/helper-buffer@1.11.6': {} - /@webassemblyjs/helper-numbers@1.11.6: - resolution: {integrity: sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==} + '@webassemblyjs/helper-numbers@1.11.6': dependencies: '@webassemblyjs/floating-point-hex-parser': 1.11.6 '@webassemblyjs/helper-api-error': 1.11.6 '@xtuc/long': 4.2.2 - dev: true - /@webassemblyjs/helper-wasm-bytecode@1.11.6: - resolution: {integrity: sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==} - dev: true + '@webassemblyjs/helper-wasm-bytecode@1.11.6': {} - /@webassemblyjs/helper-wasm-section@1.11.6: - resolution: {integrity: sha512-LPpZbSOwTpEC2cgn4hTydySy1Ke+XEu+ETXuoyvuyezHO3Kjdu90KK95Sh9xTbmjrCsUwvWwCOQQNta37VrS9g==} + '@webassemblyjs/helper-wasm-section@1.11.6': dependencies: '@webassemblyjs/ast': 1.11.6 '@webassemblyjs/helper-buffer': 1.11.6 '@webassemblyjs/helper-wasm-bytecode': 1.11.6 '@webassemblyjs/wasm-gen': 1.11.6 - dev: true - /@webassemblyjs/ieee754@1.11.6: - resolution: {integrity: sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==} + '@webassemblyjs/ieee754@1.11.6': dependencies: '@xtuc/ieee754': 1.2.0 - dev: true - /@webassemblyjs/leb128@1.11.6: - resolution: {integrity: sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==} + '@webassemblyjs/leb128@1.11.6': dependencies: '@xtuc/long': 4.2.2 - dev: true - /@webassemblyjs/utf8@1.11.6: - resolution: {integrity: sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==} - dev: true + '@webassemblyjs/utf8@1.11.6': {} - /@webassemblyjs/wasm-edit@1.11.6: - resolution: {integrity: sha512-Ybn2I6fnfIGuCR+Faaz7YcvtBKxvoLV3Lebn1tM4o/IAJzmi9AWYIPWpyBfU8cC+JxAO57bk4+zdsTjJR+VTOw==} + '@webassemblyjs/wasm-edit@1.11.6': dependencies: '@webassemblyjs/ast': 1.11.6 '@webassemblyjs/helper-buffer': 1.11.6 @@ -2336,29 +6445,23 @@ packages: '@webassemblyjs/wasm-opt': 1.11.6 '@webassemblyjs/wasm-parser': 1.11.6 '@webassemblyjs/wast-printer': 1.11.6 - dev: true - /@webassemblyjs/wasm-gen@1.11.6: - resolution: {integrity: sha512-3XOqkZP/y6B4F0PBAXvI1/bky7GryoogUtfwExeP/v7Nzwo1QLcq5oQmpKlftZLbT+ERUOAZVQjuNVak6UXjPA==} + '@webassemblyjs/wasm-gen@1.11.6': dependencies: '@webassemblyjs/ast': 1.11.6 '@webassemblyjs/helper-wasm-bytecode': 1.11.6 '@webassemblyjs/ieee754': 1.11.6 '@webassemblyjs/leb128': 1.11.6 '@webassemblyjs/utf8': 1.11.6 - dev: true - /@webassemblyjs/wasm-opt@1.11.6: - resolution: {integrity: sha512-cOrKuLRE7PCe6AsOVl7WasYf3wbSo4CeOk6PkrjS7g57MFfVUF9u6ysQBBODX0LdgSvQqRiGz3CXvIDKcPNy4g==} + '@webassemblyjs/wasm-opt@1.11.6': dependencies: '@webassemblyjs/ast': 1.11.6 '@webassemblyjs/helper-buffer': 1.11.6 '@webassemblyjs/wasm-gen': 1.11.6 '@webassemblyjs/wasm-parser': 1.11.6 - dev: true - /@webassemblyjs/wasm-parser@1.11.6: - resolution: {integrity: sha512-6ZwPeGzMJM3Dqp3hCsLgESxBGtT/OeCvCZ4TA1JUPYgmhAx38tTPR9JaKy0S5H3evQpO/h2uWs2j6Yc/fjkpTQ==} + '@webassemblyjs/wasm-parser@1.11.6': dependencies: '@webassemblyjs/ast': 1.11.6 '@webassemblyjs/helper-api-error': 1.11.6 @@ -2366,317 +6469,175 @@ packages: '@webassemblyjs/ieee754': 1.11.6 '@webassemblyjs/leb128': 1.11.6 '@webassemblyjs/utf8': 1.11.6 - dev: true - /@webassemblyjs/wast-printer@1.11.6: - resolution: {integrity: sha512-JM7AhRcE+yW2GWYaKeHL5vt4xqee5N2WcezptmgyhNS+ScggqcT1OtXykhAb13Sn5Yas0j2uv9tHgrjwvzAP4A==} + '@webassemblyjs/wast-printer@1.11.6': dependencies: '@webassemblyjs/ast': 1.11.6 '@xtuc/long': 4.2.2 - dev: true - /@xtuc/ieee754@1.2.0: - resolution: {integrity: sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==} - dev: true + '@xtuc/ieee754@1.2.0': {} - /@xtuc/long@4.2.2: - resolution: {integrity: sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==} - dev: true + '@xtuc/long@4.2.2': {} - /JSONStream@1.3.5: - resolution: {integrity: sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==} - hasBin: true + JSONStream@1.3.5: dependencies: jsonparse: 1.3.1 through: 2.3.8 - dev: true - /abbrev@1.1.1: - resolution: {integrity: sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==} - dev: false + abbrev@1.1.1: {} - /abort-controller@3.0.0: - resolution: {integrity: sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==} - engines: {node: '>=6.5'} + abort-controller@3.0.0: dependencies: event-target-shim: 5.0.1 - dev: false - /abstract-logging@2.0.1: - resolution: {integrity: sha512-2BjRTZxTPvheOvGbBslFSYOUkr+SjPtOnrLP33f+VIWLzezQpZcqVg7ja3L4dBXmzzgwT+a029jRx5PCi3JuiA==} - dev: false + abstract-logging@2.0.1: {} - /acorn-import-assertions@1.9.0(acorn@8.11.3): - resolution: {integrity: sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==} - peerDependencies: - acorn: ^8 + acorn-import-assertions@1.9.0(acorn@8.11.3): dependencies: acorn: 8.11.3 - dev: true - /acorn-jsx@5.3.2(acorn@8.11.3): - resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} - peerDependencies: - acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + acorn-jsx@5.3.2(acorn@8.11.3): dependencies: acorn: 8.11.3 - dev: true - /acorn-walk@8.3.2: - resolution: {integrity: sha512-cjkyv4OtNCIeqhHrfS81QWXoCBPExR/J62oyEqepVw8WaQeSqpW2uhuLPh1m9eWhDuOo/jUXVTlifvesOWp/4A==} - engines: {node: '>=0.4.0'} + acorn-walk@8.3.2: {} - /acorn@4.0.13: - resolution: {integrity: sha512-fu2ygVGuMmlzG8ZeRJ0bvR41nsAkxxhbyk8bZ1SS521Z7vmgJFTQQlfz/Mp/nJexGBz+v8sC9bM6+lNgskt4Ug==} - engines: {node: '>=0.4.0'} - hasBin: true - dev: false + acorn@4.0.13: {} - /acorn@8.11.3: - resolution: {integrity: sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==} - engines: {node: '>=0.4.0'} - hasBin: true + acorn@8.11.3: {} - /add-stream@1.0.0: - resolution: {integrity: sha512-qQLMr+8o0WC4FZGQTcJiKBVC59JylcPSrTtk6usvmIDFUOCKegapy1VHQwRbFMOFyb/inzUVqHs+eMYKDM1YeQ==} - dev: true + add-stream@1.0.0: {} - /agent-base@6.0.2: - resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==} - engines: {node: '>= 6.0.0'} + agent-base@6.0.2: dependencies: debug: 4.3.4 transitivePeerDependencies: - supports-color - dev: false - /agentkeepalive@4.5.0: - resolution: {integrity: sha512-5GG/5IbQQpC9FpkRGsSvZI5QYeSCzlJHdpBQntCsuTOxhKD8lqKhrleg2Yi7yvMIf82Ycmmqln9U8V9qwEiJew==} - engines: {node: '>= 8.0.0'} + agentkeepalive@4.5.0: dependencies: humanize-ms: 1.2.1 - dev: false - /aggregate-error@3.1.0: - resolution: {integrity: sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==} - engines: {node: '>=8'} + aggregate-error@3.1.0: dependencies: clean-stack: 2.2.0 indent-string: 4.0.0 - dev: false - /ajv-formats@2.1.1(ajv@8.12.0): - resolution: {integrity: sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==} - peerDependencies: - ajv: ^8.0.0 - peerDependenciesMeta: - ajv: - optional: true + ajv-formats@2.1.1(ajv@8.12.0): dependencies: ajv: 8.12.0 - /ajv-formats@2.1.1(ajv@8.9.0): - resolution: {integrity: sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==} - peerDependencies: - ajv: ^8.0.0 - peerDependenciesMeta: - ajv: - optional: true + ajv-formats@2.1.1(ajv@8.9.0): dependencies: ajv: 8.9.0 - dev: false - /ajv-keywords@3.5.2(ajv@6.12.6): - resolution: {integrity: sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==} - peerDependencies: - ajv: ^6.9.1 + ajv-keywords@3.5.2(ajv@6.12.6): dependencies: ajv: 6.12.6 - dev: true - /ajv@6.12.6: - resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} + ajv@6.12.6: dependencies: fast-deep-equal: 3.1.3 fast-json-stable-stringify: 2.1.0 json-schema-traverse: 0.4.1 uri-js: 4.4.1 - dev: true - /ajv@8.12.0: - resolution: {integrity: sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==} + ajv@8.12.0: dependencies: fast-deep-equal: 3.1.3 json-schema-traverse: 1.0.0 require-from-string: 2.0.2 uri-js: 4.4.1 - /ajv@8.9.0: - resolution: {integrity: sha512-qOKJyNj/h+OWx7s5DePL6Zu1KeM9jPZhwBqs+7DzP6bGOvqzVCSf0xueYmVuaC/oQ/VtS2zLMLHdQFbkka+XDQ==} + ajv@8.9.0: dependencies: fast-deep-equal: 3.1.3 json-schema-traverse: 1.0.0 require-from-string: 2.0.2 uri-js: 4.4.1 - dev: false - /ansi-colors@4.1.3: - resolution: {integrity: sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==} - engines: {node: '>=6'} - dev: true + ansi-colors@4.1.3: {} - /ansi-escapes@4.3.2: - resolution: {integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==} - engines: {node: '>=8'} + ansi-escapes@4.3.2: dependencies: type-fest: 0.21.3 - /ansi-regex@2.1.1: - resolution: {integrity: sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==} - engines: {node: '>=0.10.0'} - dev: false + ansi-regex@2.1.1: {} - /ansi-regex@5.0.1: - resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} - engines: {node: '>=8'} + ansi-regex@5.0.1: {} - /ansi-regex@6.0.1: - resolution: {integrity: sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==} - engines: {node: '>=12'} - dev: false + ansi-regex@6.0.1: {} - /ansi-styles@2.2.1: - resolution: {integrity: sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==} - engines: {node: '>=0.10.0'} - dev: false + ansi-styles@2.2.1: {} - /ansi-styles@3.2.1: - resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} - engines: {node: '>=4'} + ansi-styles@3.2.1: dependencies: color-convert: 1.9.3 - /ansi-styles@4.3.0: - resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} - engines: {node: '>=8'} + ansi-styles@4.3.0: dependencies: color-convert: 2.0.1 - /ansi-styles@5.2.0: - resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==} - engines: {node: '>=10'} + ansi-styles@5.2.0: {} - /ansi-styles@6.2.1: - resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} - engines: {node: '>=12'} - dev: false + ansi-styles@6.2.1: {} - /anymatch@3.1.3: - resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} - engines: {node: '>= 8'} + anymatch@3.1.3: dependencies: normalize-path: 3.0.0 picomatch: 2.3.1 - /aproba@2.0.0: - resolution: {integrity: sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==} - dev: false + aproba@2.0.0: {} - /archy@1.0.0: - resolution: {integrity: sha512-Xg+9RwCg/0p32teKdGMPTPnVXKD0w3DfHnFTficozsAgsvq2XenPJq/MYpzzQ/v8zrOyJn6Ds39VA4JIDwFfqw==} - dev: false + archy@1.0.0: {} - /are-we-there-yet@2.0.0: - resolution: {integrity: sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==} - engines: {node: '>=10'} + are-we-there-yet@2.0.0: dependencies: delegates: 1.0.0 readable-stream: 3.6.2 - dev: false - /are-we-there-yet@3.0.1: - resolution: {integrity: sha512-QZW4EDmGwlYur0Yyf/b2uGucHQMa8aFUP7eu9ddR73vvhFyt4V0Vl3QHPcTNJ8l6qYOBdxgXdnBXQrHilfRQBg==} - engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + are-we-there-yet@3.0.1: dependencies: delegates: 1.0.0 readable-stream: 3.6.2 - dev: false - /arg@4.1.3: - resolution: {integrity: sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==} + arg@4.1.3: {} - /argparse@1.0.10: - resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} + argparse@1.0.10: dependencies: sprintf-js: 1.0.3 - /argparse@2.0.1: - resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + argparse@2.0.1: {} - /arr-diff@2.0.0: - resolution: {integrity: sha512-dtXTVMkh6VkEEA7OhXnN1Ecb8aAGFdZ1LFxtOCoqj4qkyOJMt7+qs6Ahdy6p/NQCPYsRSXXivhSB/J5E9jmYKA==} - engines: {node: '>=0.10.0'} + arr-diff@2.0.0: dependencies: arr-flatten: 1.1.0 - dev: false - /arr-flatten@1.1.0: - resolution: {integrity: sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==} - engines: {node: '>=0.10.0'} - dev: false + arr-flatten@1.1.0: {} - /array-ify@1.0.0: - resolution: {integrity: sha512-c5AMf34bKdvPhQ7tBGhqkgKNUzMr4WUs+WDtC2ZUGOUncbxKMTvqxYctiseW3+L4bA8ec+GcZ6/A/FW4m8ukng==} - dev: true + array-ify@1.0.0: {} - /array-timsort@1.0.3: - resolution: {integrity: sha512-/+3GRL7dDAGEfM6TseQk/U+mi18TU2Ms9I3UlLdUMhz2hbvGNTKdj9xniwXfUqgYhHxRx0+8UnKkvlNwVU+cWQ==} - dev: true + array-timsort@1.0.3: {} - /array-union@2.1.0: - resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} - engines: {node: '>=8'} - dev: true + array-union@2.1.0: {} - /array-unique@0.2.1: - resolution: {integrity: sha512-G2n5bG5fSUCpnsXz4+8FUkYsGPkNfLn9YvS66U5qbTIXI2Ynnlo4Bi42bWv+omKUCqz+ejzfClwne0alJWJPhg==} - engines: {node: '>=0.10.0'} - dev: false + array-unique@0.2.1: {} - /arrify@1.0.1: - resolution: {integrity: sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==} - engines: {node: '>=0.10.0'} - dev: true + arrify@1.0.1: {} - /asap@2.0.6: - resolution: {integrity: sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==} - dev: true + asap@2.0.6: {} - /async@3.2.5: - resolution: {integrity: sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg==} - dev: false + async@3.2.5: {} - /asynckit@0.4.0: - resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} + asynckit@0.4.0: {} - /at-least-node@1.0.0: - resolution: {integrity: sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==} - engines: {node: '>= 4.0.0'} - dev: true + at-least-node@1.0.0: {} - /atob@2.1.2: - resolution: {integrity: sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==} - engines: {node: '>= 4.5.0'} - hasBin: true - dev: false + atob@2.1.2: {} - /atomic-sleep@1.0.0: - resolution: {integrity: sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ==} - engines: {node: '>=8.0.0'} - dev: false + atomic-sleep@1.0.0: {} - /avvio@8.3.0: - resolution: {integrity: sha512-VBVH0jubFr9LdFASy/vNtm5giTrnbVquWBhT0fyizuNK2rQ7e7ONU2plZQWUNqtE1EmxFEb+kbSkFRkstiaS9Q==} + avvio@8.3.0: dependencies: '@fastify/error': 3.4.1 archy: 1.0.0 @@ -2684,23 +6645,16 @@ packages: fastq: 1.17.1 transitivePeerDependencies: - supports-color - dev: false - /axios@1.6.7(debug@2.6.9): - resolution: {integrity: sha512-/hDJGff6/c7u0hDkvkGxR/oy6CbCs8ziCsC7SqmhjfozqiJGc8Z11wrv9z9lYfY4K8l+H9TpjcMDX0xOZmx+RA==} + axios@1.6.7(debug@2.6.9): dependencies: follow-redirects: 1.15.5(debug@2.6.9) form-data: 4.0.0 proxy-from-env: 1.1.0 transitivePeerDependencies: - debug - dev: false - /babel-jest@29.7.0(@babel/core@7.23.9): - resolution: {integrity: sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - peerDependencies: - '@babel/core': ^7.8.0 + babel-jest@29.7.0(@babel/core@7.23.9): dependencies: '@babel/core': 7.23.9 '@jest/transform': 29.7.0 @@ -2713,9 +6667,7 @@ packages: transitivePeerDependencies: - supports-color - /babel-plugin-istanbul@6.1.1: - resolution: {integrity: sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==} - engines: {node: '>=8'} + babel-plugin-istanbul@6.1.1: dependencies: '@babel/helper-plugin-utils': 7.22.5 '@istanbuljs/load-nyc-config': 1.1.0 @@ -2725,19 +6677,14 @@ packages: transitivePeerDependencies: - supports-color - /babel-plugin-jest-hoist@29.6.3: - resolution: {integrity: sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + babel-plugin-jest-hoist@29.6.3: dependencies: '@babel/template': 7.23.9 '@babel/types': 7.23.9 '@types/babel__core': 7.20.5 '@types/babel__traverse': 7.20.5 - /babel-preset-current-node-syntax@1.0.1(@babel/core@7.23.9): - resolution: {integrity: sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==} - peerDependencies: - '@babel/core': ^7.0.0 + babel-preset-current-node-syntax@1.0.1(@babel/core@7.23.9): dependencies: '@babel/core': 7.23.9 '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.23.9) @@ -2753,122 +6700,85 @@ packages: '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.23.9) '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.23.9) - /babel-preset-jest@29.6.3(@babel/core@7.23.9): - resolution: {integrity: sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - peerDependencies: - '@babel/core': ^7.0.0 + babel-preset-jest@29.6.3(@babel/core@7.23.9): dependencies: '@babel/core': 7.23.9 babel-plugin-jest-hoist: 29.6.3 babel-preset-current-node-syntax: 1.0.1(@babel/core@7.23.9) - /balanced-match@1.0.2: - resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + balanced-match@1.0.2: {} - /base64-js@1.5.1: - resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} + base64-js@1.5.1: {} - /bcrypt@5.1.1: - resolution: {integrity: sha512-AGBHOG5hPYZ5Xl9KXzU5iKq9516yEmvCKDg3ecP5kX2aB6UqTeXZxk2ELnDgDm6BQSMlLt9rDB4LoSMx0rYwww==} - engines: {node: '>= 10.0.0'} - requiresBuild: true + bcrypt@5.1.1: dependencies: '@mapbox/node-pre-gyp': 1.0.11 node-addon-api: 5.1.0 transitivePeerDependencies: - encoding - supports-color - dev: false - /binary-extensions@2.2.0: - resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==} - engines: {node: '>=8'} - dev: true + binary-extensions@2.2.0: {} - /bindings@1.5.0: - resolution: {integrity: sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==} + bindings@1.5.0: dependencies: file-uri-to-path: 1.0.0 - dev: false - /bl@4.1.0: - resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==} + bl@4.1.0: dependencies: buffer: 5.7.1 inherits: 2.0.4 readable-stream: 3.6.2 - /brace-expansion@1.1.11: - resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} + brace-expansion@1.1.11: dependencies: balanced-match: 1.0.2 concat-map: 0.0.1 - /brace-expansion@2.0.1: - resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} + brace-expansion@2.0.1: dependencies: balanced-match: 1.0.2 - /braces@1.8.5: - resolution: {integrity: sha512-xU7bpz2ytJl1bH9cgIurjpg/n8Gohy9GTw81heDYLJQ4RU60dlyJsa+atVF2pI0yMMvKxI9HkKwjePCj5XI1hw==} - engines: {node: '>=0.10.0'} + braces@1.8.5: dependencies: expand-range: 1.8.2 preserve: 0.2.0 repeat-element: 1.1.4 - dev: false - /braces@3.0.2: - resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} - engines: {node: '>=8'} + braces@3.0.2: dependencies: fill-range: 7.0.1 - /browserslist@4.22.3: - resolution: {integrity: sha512-UAp55yfwNv0klWNapjs/ktHoguxuQNGnOzxYmfnXIS+8AsRDZkSDxg7R1AX3GKzn078SBI5dzwzj/Yx0Or0e3A==} - engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} - hasBin: true + browserslist@4.22.3: dependencies: caniuse-lite: 1.0.30001584 electron-to-chromium: 1.4.659 node-releases: 2.0.14 update-browserslist-db: 1.0.13(browserslist@4.22.3) - /bs-logger@0.2.6: - resolution: {integrity: sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==} - engines: {node: '>= 6'} + bs-logger@0.2.6: dependencies: fast-json-stable-stringify: 2.1.0 - /bser@2.1.1: - resolution: {integrity: sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==} + bser@2.1.1: dependencies: node-int64: 0.4.0 - /buffer-equal-constant-time@1.0.1: - resolution: {integrity: sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==} - dev: false + buffer-equal-constant-time@1.0.1: {} - /buffer-from@1.1.2: - resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} + buffer-from@1.1.2: {} - /buffer@5.7.1: - resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} + buffer@5.7.1: dependencies: base64-js: 1.5.1 ieee754: 1.2.1 - /buffer@6.0.3: - resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==} + buffer@6.0.3: dependencies: base64-js: 1.5.1 ieee754: 1.2.1 - dev: false - /cacache@16.1.3: - resolution: {integrity: sha512-/+Emcj9DAXxX4cwlLmRI9c166RuL3w30zp4R7Joiv2cQTtTtA+jeuCAjH3ZlGnYS3tKENSrKhAzVVP9GVyzeYQ==} - engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + cacache@16.1.3: dependencies: '@npmcli/fs': 2.1.2 '@npmcli/move-file': 2.0.1 @@ -2890,117 +6800,70 @@ packages: unique-filename: 2.0.1 transitivePeerDependencies: - bluebird - dev: false - /cache-manager@5.4.0: - resolution: {integrity: sha512-FS7o8vqJosnLpu9rh2gQTo8EOzCRJLF1BJ4XDEUDMqcfvs7SJZs5iuoFTXLauzQ3S5v8sBAST1pCwMaurpyi1A==} + cache-manager@5.4.0: dependencies: lodash.clonedeep: 4.5.0 lru-cache: 10.2.0 promise-coalesce: 1.1.2 - dev: false - /cachedir@2.3.0: - resolution: {integrity: sha512-A+Fezp4zxnit6FanDmv9EqXNAi3vt9DWp51/71UEhXukb7QUuvtv9344h91dyAxuTLoSYJFU299qzR3tzwPAhw==} - engines: {node: '>=6'} - dev: true + cachedir@2.3.0: {} - /call-bind@1.0.6: - resolution: {integrity: sha512-Mj50FLHtlsoVfRfnHaZvyrooHcrlceNZdL/QBvJJVd9Ta55qCQK0gs4ss2oZDeV9zFCs6ewzYgVE5yfVmfFpVg==} - engines: {node: '>= 0.4'} + call-bind@1.0.6: dependencies: es-errors: 1.3.0 function-bind: 1.1.2 get-intrinsic: 1.2.4 set-function-length: 1.2.1 - dev: true - /callsites@3.1.0: - resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} - engines: {node: '>=6'} + callsites@3.1.0: {} - /camelcase-keys@6.2.2: - resolution: {integrity: sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==} - engines: {node: '>=8'} + camelcase-keys@6.2.2: dependencies: camelcase: 5.3.1 map-obj: 4.3.0 quick-lru: 4.0.1 - dev: true - /camelcase@2.1.1: - resolution: {integrity: sha512-DLIsRzJVBQu72meAKPkWQOLcujdXT32hwdfnkI1frSiSRMK1MofjKHf+MEx0SB6fjEFXL8fBDv1dKymBlOp4Qw==} - engines: {node: '>=0.10.0'} - dev: false + camelcase@2.1.1: {} - /camelcase@3.0.0: - resolution: {integrity: sha512-4nhGqUkc4BqbBBB4Q6zLuD7lzzrHYrjKGeYaEji/3tFR5VdJu9v+LilhGIVe8wxEJPPOeWo7eg8dwY13TZ1BNg==} - engines: {node: '>=0.10.0'} - dev: false + camelcase@3.0.0: {} - /camelcase@5.3.1: - resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==} - engines: {node: '>=6'} + camelcase@5.3.1: {} - /camelcase@6.3.0: - resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} - engines: {node: '>=10'} + camelcase@6.3.0: {} - /caniuse-lite@1.0.30001584: - resolution: {integrity: sha512-LOz7CCQ9M1G7OjJOF9/mzmqmj3jE/7VOmrfw6Mgs0E8cjOsbRXQJHsPBfmBOXDskXKrHLyyW3n7kpDW/4BsfpQ==} + caniuse-lite@1.0.30001584: {} - /case@1.6.3: - resolution: {integrity: sha512-mzDSXIPaFwVDvZAHqZ9VlbyF4yyXRuX6IvB06WvPYkqJVO24kX1PPhv9bfpKNFZyxYFmmgo03HUiD8iklmJYRQ==} - engines: {node: '>= 0.8.0'} - dev: true + case@1.6.3: {} - /centra@2.6.0: - resolution: {integrity: sha512-dgh+YleemrT8u85QL11Z6tYhegAs3MMxsaWAq/oXeAmYJ7VxL3SI9TZtnfaEvNDMAPolj25FXIb3S+HCI4wQaQ==} - deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. - dev: true + centra@2.6.0: {} - /chalk@1.1.3: - resolution: {integrity: sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==} - engines: {node: '>=0.10.0'} + chalk@1.1.3: dependencies: ansi-styles: 2.2.1 escape-string-regexp: 1.0.5 has-ansi: 2.0.0 strip-ansi: 3.0.1 supports-color: 2.0.0 - dev: false - /chalk@2.4.2: - resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} - engines: {node: '>=4'} + chalk@2.4.2: dependencies: ansi-styles: 3.2.1 escape-string-regexp: 1.0.5 supports-color: 5.5.0 - /chalk@4.1.2: - resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} - engines: {node: '>=10'} + chalk@4.1.2: dependencies: ansi-styles: 4.3.0 supports-color: 7.2.0 - /chalk@5.3.0: - resolution: {integrity: sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==} - engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} - dev: true + chalk@5.3.0: {} - /char-regex@1.0.2: - resolution: {integrity: sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==} - engines: {node: '>=10'} + char-regex@1.0.2: {} - /chardet@0.7.0: - resolution: {integrity: sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==} - dev: true + chardet@0.7.0: {} - /chokidar@3.5.3: - resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==} - engines: {node: '>= 8.10.0'} + chokidar@3.5.3: dependencies: anymatch: 3.1.3 braces: 3.0.2 @@ -3011,163 +6874,100 @@ packages: readdirp: 3.6.0 optionalDependencies: fsevents: 2.3.3 - dev: true - /chownr@2.0.0: - resolution: {integrity: sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==} - engines: {node: '>=10'} + chownr@2.0.0: {} - /chrome-trace-event@1.0.3: - resolution: {integrity: sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==} - engines: {node: '>=6.0'} - dev: true + chrome-trace-event@1.0.3: {} - /ci-info@3.9.0: - resolution: {integrity: sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==} - engines: {node: '>=8'} + ci-info@3.9.0: {} - /cjs-module-lexer@1.2.3: - resolution: {integrity: sha512-0TNiGstbQmCFwt4akjjBg5pLRTSyj/PkWQ1ZoO2zntmg9yLqSRxwEa4iCfQLGjqhiqBfOJa7W/E8wfGrTDmlZQ==} + cjs-module-lexer@1.2.3: {} - /class-transformer@0.5.1: - resolution: {integrity: sha512-SQa1Ws6hUbfC98vKGxZH3KFY0Y1lm5Zm0SY8XX9zbK7FJCyVEac3ATW0RIpwzW+oOfmHE5PMPufDG9hCfoEOMw==} + class-transformer@0.5.1: {} - /class-validator@0.14.1: - resolution: {integrity: sha512-2VEG9JICxIqTpoK1eMzZqaV+u/EiwEJkMGzTrZf6sU/fwsnOITVgYJ8yojSy6CaXtO9V0Cc6ZQZ8h8m4UBuLwQ==} + class-validator@0.14.1: dependencies: '@types/validator': 13.11.9 libphonenumber-js: 1.10.58 validator: 13.11.0 - /clean-stack@2.2.0: - resolution: {integrity: sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==} - engines: {node: '>=6'} - dev: false + clean-stack@2.2.0: {} - /cli-cursor@3.1.0: - resolution: {integrity: sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==} - engines: {node: '>=8'} + cli-cursor@3.1.0: dependencies: restore-cursor: 3.1.0 - /cli-spinners@2.9.2: - resolution: {integrity: sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==} - engines: {node: '>=6'} + cli-spinners@2.9.2: {} - /cli-table3@0.6.3: - resolution: {integrity: sha512-w5Jac5SykAeZJKntOxJCrm63Eg5/4dhMWIcuTbo9rpE+brgaSZo0RuNJZeOyMgsUdhDeojvgyQLmjI+K50ZGyg==} - engines: {node: 10.* || >= 12.*} + cli-table3@0.6.3: dependencies: string-width: 4.2.3 optionalDependencies: '@colors/colors': 1.5.0 - dev: true - /cli-width@3.0.0: - resolution: {integrity: sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==} - engines: {node: '>= 10'} - dev: true + cli-width@3.0.0: {} - /cliui@3.2.0: - resolution: {integrity: sha512-0yayqDxWQbqk3ojkYqUKqaAQ6AfNKeKWRNA8kR0WXzAsdHpP4BIaOmMAG87JGuO6qcobyW4GjxHd9PmhEd+T9w==} + cliui@3.2.0: dependencies: string-width: 1.0.2 strip-ansi: 3.0.1 wrap-ansi: 2.1.0 - dev: false - /cliui@7.0.4: - resolution: {integrity: sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==} + cliui@7.0.4: dependencies: string-width: 4.2.3 strip-ansi: 6.0.1 wrap-ansi: 7.0.0 - dev: true - /cliui@8.0.1: - resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} - engines: {node: '>=12'} + cliui@8.0.1: dependencies: string-width: 4.2.3 strip-ansi: 6.0.1 wrap-ansi: 7.0.0 - /clone-stats@0.0.1: - resolution: {integrity: sha512-dhUqc57gSMCo6TX85FLfe51eC/s+Im2MLkAgJwfaRRexR2tA4dd3eLEW4L6efzHc2iNorrRRXITifnDLlRrhaA==} - dev: false + clone-stats@0.0.1: {} - /clone@1.0.4: - resolution: {integrity: sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==} - engines: {node: '>=0.8'} + clone@1.0.4: {} - /co@4.6.0: - resolution: {integrity: sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==} - engines: {iojs: '>= 1.0.0', node: '>= 0.12.0'} + co@4.6.0: {} - /code-point-at@1.1.0: - resolution: {integrity: sha512-RpAVKQA5T63xEj6/giIbUEtZwJ4UFIc3ZtvEkiaUERylqe8xb5IvqcgOurZLahv93CLKfxcw5YI+DZcUBRyLXA==} - engines: {node: '>=0.10.0'} - dev: false + code-point-at@1.1.0: {} - /collect-v8-coverage@1.0.2: - resolution: {integrity: sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q==} + collect-v8-coverage@1.0.2: {} - /color-convert@1.9.3: - resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} + color-convert@1.9.3: dependencies: color-name: 1.1.3 - /color-convert@2.0.1: - resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} - engines: {node: '>=7.0.0'} + color-convert@2.0.1: dependencies: color-name: 1.1.4 - /color-name@1.1.3: - resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} + color-name@1.1.3: {} - /color-name@1.1.4: - resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + color-name@1.1.4: {} - /color-support@1.1.3: - resolution: {integrity: sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==} - hasBin: true - dev: false + color-support@1.1.3: {} - /colorette@2.0.20: - resolution: {integrity: sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==} - dev: false + colorette@2.0.20: {} - /combined-stream@1.0.8: - resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} - engines: {node: '>= 0.8'} + combined-stream@1.0.8: dependencies: delayed-stream: 1.0.0 - /commander@2.20.3: - resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} - dev: true + commander@2.20.3: {} - /commander@4.1.1: - resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==} - engines: {node: '>= 6'} - dev: true + commander@4.1.1: {} - /comment-json@4.2.3: - resolution: {integrity: sha512-SsxdiOf064DWoZLH799Ata6u7iV658A11PlWtZATDlXPpKGJnbJZ5Z24ybixAi+LUUqJ/GKowAejtC5GFUG7Tw==} - engines: {node: '>= 6'} + comment-json@4.2.3: dependencies: array-timsort: 1.0.3 core-util-is: 1.0.3 esprima: 4.0.1 has-own-prop: 2.0.0 repeat-string: 1.6.1 - dev: true - /commitizen@4.3.0(@types/node@20.3.1)(typescript@5.1.3): - resolution: {integrity: sha512-H0iNtClNEhT0fotHvGV3E9tDejDeS04sN1veIebsKYGMuGscFaswRoYJKmT3eW85eIJAs0F28bG2+a/9wCOfPw==} - engines: {node: '>= 12'} - hasBin: true + commitizen@4.3.0(@types/node@20.3.1)(typescript@5.1.3): dependencies: cachedir: 2.3.0 cz-conventional-changelog: 3.3.0(@types/node@20.3.1)(typescript@5.1.3) @@ -3186,100 +6986,63 @@ packages: transitivePeerDependencies: - '@types/node' - typescript - dev: true - /compare-func@2.0.0: - resolution: {integrity: sha512-zHig5N+tPWARooBnb0Zx1MFcdfpyJrfTJ3Y5L+IFvUm8rM74hHz66z0gw0x4tijh5CorKkKUCnW82R2vmpeCRA==} + compare-func@2.0.0: dependencies: array-ify: 1.0.0 dot-prop: 5.3.0 - dev: true - /component-emitter@1.3.1: - resolution: {integrity: sha512-T0+barUSQRTUQASh8bx02dl+DhF54GtIDY13Y3m9oWTklKbb3Wv974meRpeZ3lp1JpLVECWWNHC4vaG2XHXouQ==} - dev: true + component-emitter@1.3.1: {} - /concat-map@0.0.1: - resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + concat-map@0.0.1: {} - /concat-stream@1.5.1: - resolution: {integrity: sha512-eYF1Q4RxUUwq8ApyPD9ebWsYjVrJmTMLGzbGXv4qTZ5iP7FLm+oWN4x2XIzLEZ745xiwRM9DmIB0Ix1Nz8Epmg==} - engines: {'0': node >= 0.8} + concat-stream@1.5.1: dependencies: inherits: 2.0.4 readable-stream: 2.0.6 typedarray: 0.0.7 - dev: false - /concat-stream@2.0.0: - resolution: {integrity: sha512-MWufYdFw53ccGjCA+Ol7XJYpAlW6/prSMzuPOTRnJGcGzuhLn4Scrz7qf6o8bROZ514ltazcIFJZevcfbo0x7A==} - engines: {'0': node >= 6.0} + concat-stream@2.0.0: dependencies: buffer-from: 1.1.2 inherits: 2.0.4 readable-stream: 3.6.2 typedarray: 0.0.6 - dev: true - /consola@2.15.3: - resolution: {integrity: sha512-9vAdYbHj6x2fLKC4+oPH0kFzY/orMZyG2Aj+kNylHxKGJ/Ed4dpNyAQYwJOdqO4zdM7XpVHmyejQDcQHrnuXbw==} + consola@2.15.3: {} - /console-control-strings@1.1.0: - resolution: {integrity: sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==} - dev: false + console-control-strings@1.1.0: {} - /content-disposition@0.5.4: - resolution: {integrity: sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==} - engines: {node: '>= 0.6'} + content-disposition@0.5.4: dependencies: safe-buffer: 5.2.1 - dev: false - /conventional-changelog-angular@5.0.13: - resolution: {integrity: sha512-i/gipMxs7s8L/QeuavPF2hLnJgH6pEZAttySB6aiQLWcX3puWDL3ACVmvBhJGxnAy52Qc15ua26BufY6KpmrVA==} - engines: {node: '>=10'} + conventional-changelog-angular@5.0.13: dependencies: compare-func: 2.0.0 q: 1.5.1 - dev: true - /conventional-changelog-angular@7.0.0: - resolution: {integrity: sha512-ROjNchA9LgfNMTTFSIWPzebCwOGFdgkEq45EnvvrmSLvCtAw0HSmrCs7/ty+wAeYUZyNay0YMUNYFTRL72PkBQ==} - engines: {node: '>=16'} + conventional-changelog-angular@7.0.0: dependencies: compare-func: 2.0.0 - dev: true - /conventional-changelog-atom@2.0.8: - resolution: {integrity: sha512-xo6v46icsFTK3bb7dY/8m2qvc8sZemRgdqLb/bjpBsH2UyOS8rKNTgcb5025Hri6IpANPApbXMg15QLb1LJpBw==} - engines: {node: '>=10'} + conventional-changelog-atom@2.0.8: dependencies: q: 1.5.1 - dev: true - /conventional-changelog-codemirror@2.0.8: - resolution: {integrity: sha512-z5DAsn3uj1Vfp7po3gpt2Boc+Bdwmw2++ZHa5Ak9k0UKsYAO5mH1UBTN0qSCuJZREIhX6WU4E1p3IW2oRCNzQw==} - engines: {node: '>=10'} + conventional-changelog-codemirror@2.0.8: dependencies: q: 1.5.1 - dev: true - /conventional-changelog-config-spec@2.1.0: - resolution: {integrity: sha512-IpVePh16EbbB02V+UA+HQnnPIohgXvJRxHcS5+Uwk4AT5LjzCZJm5sp/yqs5C6KZJ1jMsV4paEV13BN1pvDuxQ==} - dev: true + conventional-changelog-config-spec@2.1.0: {} - /conventional-changelog-conventionalcommits@4.6.3: - resolution: {integrity: sha512-LTTQV4fwOM4oLPad317V/QNQ1FY4Hju5qeBIM1uTHbrnCE+Eg4CdRZ3gO2pUeR+tzWdp80M2j3qFFEDWVqOV4g==} - engines: {node: '>=10'} + conventional-changelog-conventionalcommits@4.6.3: dependencies: compare-func: 2.0.0 lodash: 4.17.21 q: 1.5.1 - dev: true - /conventional-changelog-core@4.2.4: - resolution: {integrity: sha512-gDVS+zVJHE2v4SLc6B0sLsPiloR0ygU7HaDW14aNJE1v4SlqJPILPl/aJC7YdtRE4CybBf8gDwObBvKha8Xlyg==} - engines: {node: '>=10'} + conventional-changelog-core@4.2.4: dependencies: add-stream: 1.0.0 conventional-changelog-writer: 5.0.1 @@ -3295,53 +7058,31 @@ packages: read-pkg: 3.0.0 read-pkg-up: 3.0.0 through2: 4.0.2 - dev: true - /conventional-changelog-ember@2.0.9: - resolution: {integrity: sha512-ulzIReoZEvZCBDhcNYfDIsLTHzYHc7awh+eI44ZtV5cx6LVxLlVtEmcO+2/kGIHGtw+qVabJYjdI5cJOQgXh1A==} - engines: {node: '>=10'} + conventional-changelog-ember@2.0.9: dependencies: q: 1.5.1 - dev: true - /conventional-changelog-eslint@3.0.9: - resolution: {integrity: sha512-6NpUCMgU8qmWmyAMSZO5NrRd7rTgErjrm4VASam2u5jrZS0n38V7Y9CzTtLT2qwz5xEChDR4BduoWIr8TfwvXA==} - engines: {node: '>=10'} + conventional-changelog-eslint@3.0.9: dependencies: q: 1.5.1 - dev: true - /conventional-changelog-express@2.0.6: - resolution: {integrity: sha512-SDez2f3iVJw6V563O3pRtNwXtQaSmEfTCaTBPCqn0oG0mfkq0rX4hHBq5P7De2MncoRixrALj3u3oQsNK+Q0pQ==} - engines: {node: '>=10'} + conventional-changelog-express@2.0.6: dependencies: q: 1.5.1 - dev: true - /conventional-changelog-jquery@3.0.11: - resolution: {integrity: sha512-x8AWz5/Td55F7+o/9LQ6cQIPwrCjfJQ5Zmfqi8thwUEKHstEn4kTIofXub7plf1xvFA2TqhZlq7fy5OmV6BOMw==} - engines: {node: '>=10'} + conventional-changelog-jquery@3.0.11: dependencies: q: 1.5.1 - dev: true - /conventional-changelog-jshint@2.0.9: - resolution: {integrity: sha512-wMLdaIzq6TNnMHMy31hql02OEQ8nCQfExw1SE0hYL5KvU+JCTuPaDO+7JiogGT2gJAxiUGATdtYYfh+nT+6riA==} - engines: {node: '>=10'} + conventional-changelog-jshint@2.0.9: dependencies: compare-func: 2.0.0 q: 1.5.1 - dev: true - /conventional-changelog-preset-loader@2.3.4: - resolution: {integrity: sha512-GEKRWkrSAZeTq5+YjUZOYxdHq+ci4dNwHvpaBC3+ENalzFWuCWa9EZXSuZBpkr72sMdKB+1fyDV4takK1Lf58g==} - engines: {node: '>=10'} - dev: true + conventional-changelog-preset-loader@2.3.4: {} - /conventional-changelog-writer@5.0.1: - resolution: {integrity: sha512-5WsuKUfxW7suLblAbFnxAcrvf6r+0b7GvNaWUwUIk0bXMnENP/PEieGKVUQrjPqwPT4o3EPAASBXiY6iHooLOQ==} - engines: {node: '>=10'} - hasBin: true + conventional-changelog-writer@5.0.1: dependencies: conventional-commits-filter: 2.0.7 dateformat: 3.0.3 @@ -3352,11 +7093,8 @@ packages: semver: 6.3.1 split: 1.0.1 through2: 4.0.2 - dev: true - /conventional-changelog@3.1.25: - resolution: {integrity: sha512-ryhi3fd1mKf3fSjbLXOfK2D06YwKNic1nC9mWqybBHdObPd8KJ2vjaXZfYj1U23t+V8T8n0d7gwnc9XbIdFbyQ==} - engines: {node: '>=10'} + conventional-changelog@3.1.25: dependencies: conventional-changelog-angular: 5.0.13 conventional-changelog-atom: 2.0.8 @@ -3369,24 +7107,15 @@ packages: conventional-changelog-jquery: 3.0.11 conventional-changelog-jshint: 2.0.9 conventional-changelog-preset-loader: 2.3.4 - dev: true - /conventional-commit-types@3.0.0: - resolution: {integrity: sha512-SmmCYnOniSsAa9GqWOeLqc179lfr5TRu5b4QFDkbsrJ5TZjPJx85wtOr3zn+1dbeNiXDKGPbZ72IKbPhLXh/Lg==} - dev: true + conventional-commit-types@3.0.0: {} - /conventional-commits-filter@2.0.7: - resolution: {integrity: sha512-ASS9SamOP4TbCClsRHxIHXRfcGCnIoQqkvAzCSbZzTFLfcTqJVugB0agRgsEELsqaeWgsXv513eS116wnlSSPA==} - engines: {node: '>=10'} + conventional-commits-filter@2.0.7: dependencies: lodash.ismatch: 4.4.0 modify-values: 1.0.1 - dev: true - /conventional-commits-parser@3.2.4: - resolution: {integrity: sha512-nK7sAtfi+QXbxHCYfhpZsfRtaitZLIA6889kFIouLvz6repszQDgxBu7wf2WbU+Dco7sAnNCJYERCwt54WPC2Q==} - engines: {node: '>=10'} - hasBin: true + conventional-commits-parser@3.2.4: dependencies: JSONStream: 1.3.5 is-text-path: 1.0.1 @@ -3394,23 +7123,15 @@ packages: meow: 8.1.2 split2: 3.2.2 through2: 4.0.2 - dev: true - /conventional-commits-parser@5.0.0: - resolution: {integrity: sha512-ZPMl0ZJbw74iS9LuX9YIAiW8pfM5p3yh2o/NbXHbkFuZzY5jvdi5jFycEOkmBW5H5I7nA+D6f3UcsCLP2vvSEA==} - engines: {node: '>=16'} - hasBin: true + conventional-commits-parser@5.0.0: dependencies: JSONStream: 1.3.5 is-text-path: 2.0.0 meow: 12.1.1 split2: 4.2.0 - dev: true - /conventional-recommended-bump@6.1.0: - resolution: {integrity: sha512-uiApbSiNGM/kkdL9GTOLAqC4hbptObFo4wW2QRyHsKciGAfQuLU1ShZ1BIVI/+K2BE/W1AWYQMCXAsv4dyKPaw==} - engines: {node: '>=10'} - hasBin: true + conventional-recommended-bump@6.1.0: dependencies: concat-stream: 2.0.0 conventional-changelog-preset-loader: 2.3.4 @@ -3420,77 +7141,43 @@ packages: git-semver-tags: 4.1.1 meow: 8.1.2 q: 1.5.1 - dev: true - /convert-source-map@1.9.0: - resolution: {integrity: sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==} - dev: false + convert-source-map@1.9.0: {} - /convert-source-map@2.0.0: - resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} + convert-source-map@2.0.0: {} - /cookie-signature@1.2.1: - resolution: {integrity: sha512-78KWk9T26NhzXtuL26cIJ8/qNHANyJ/ZYrmEXFzUmhZdjpBv+DlWlOANRTGBt48YcyslsLrj0bMLFTmXvLRCOw==} - engines: {node: '>=6.6.0'} - dev: false + cookie-signature@1.2.1: {} - /cookie@0.6.0: - resolution: {integrity: sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==} - engines: {node: '>= 0.6'} - dev: false + cookie@0.6.0: {} - /cookiejar@2.1.4: - resolution: {integrity: sha512-LDx6oHrK+PhzLKJU9j5S7/Y3jM/mUHvD/DeI1WQmJn652iPC5Y4TBzC9l+5OMOXlyTTA+SmVUPm0HQUwpD5Jqw==} - dev: true + cookiejar@2.1.4: {} - /core-util-is@1.0.3: - resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} + core-util-is@1.0.3: {} - /cosmiconfig-typescript-loader@5.0.0(@types/node@20.3.1)(cosmiconfig@9.0.0)(typescript@5.1.3): - resolution: {integrity: sha512-+8cK7jRAReYkMwMiG+bxhcNKiHJDM6bR9FD/nGBXOWdMLuYawjF5cGrtLilJ+LGd3ZjCXnJjR5DkfWPoIVlqJA==} - engines: {node: '>=v16'} - peerDependencies: - '@types/node': '*' - cosmiconfig: '>=8.2' - typescript: '>=4' + cosmiconfig-typescript-loader@5.0.0(@types/node@20.3.1)(cosmiconfig@9.0.0)(typescript@5.1.3): dependencies: '@types/node': 20.3.1 cosmiconfig: 9.0.0(typescript@5.1.3) jiti: 1.21.0 typescript: 5.1.3 - dev: true - /cosmiconfig@7.1.0: - resolution: {integrity: sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==} - engines: {node: '>=10'} + cosmiconfig@7.1.0: dependencies: '@types/parse-json': 4.0.2 import-fresh: 3.3.0 parse-json: 5.2.0 path-type: 4.0.0 yaml: 1.10.2 - dev: true - /cosmiconfig@9.0.0(typescript@5.1.3): - resolution: {integrity: sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==} - engines: {node: '>=14'} - peerDependencies: - typescript: '>=4.9.5' - peerDependenciesMeta: - typescript: - optional: true + cosmiconfig@9.0.0(typescript@5.1.3): dependencies: env-paths: 2.2.1 import-fresh: 3.3.0 js-yaml: 4.1.0 parse-json: 5.2.0 typescript: 5.1.3 - dev: true - /create-jest@29.7.0(@types/node@20.3.1)(ts-node@10.9.1): - resolution: {integrity: sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - hasBin: true + create-jest@29.7.0(@types/node@20.3.1)(ts-node@10.9.1): dependencies: '@jest/types': 29.6.3 chalk: 4.1.2 @@ -3505,29 +7192,22 @@ packages: - supports-color - ts-node - /create-require@1.1.1: - resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==} + create-require@1.1.1: {} - /cross-spawn@7.0.3: - resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} - engines: {node: '>= 8'} + cross-spawn@7.0.3: dependencies: path-key: 3.1.1 shebang-command: 2.0.0 which: 2.0.2 - /css@2.2.4: - resolution: {integrity: sha512-oUnjmWpy0niI3x/mPL8dVEI1l7MnG3+HHyRPHf+YFSbK+svOhXpmSOcDURUh2aOCgl2grzrOPt1nHLuCVFULLw==} + css@2.2.4: dependencies: inherits: 2.0.4 source-map: 0.6.1 source-map-resolve: 0.5.3 urix: 0.1.0 - dev: false - /cz-conventional-changelog@3.3.0(@types/node@20.3.1)(typescript@5.1.3): - resolution: {integrity: sha512-U466fIzU5U22eES5lTNiNbZ+d8dfcHcssH4o7QsdWaCcRs/feIPCxKYSWkYBNs5mny7MvEfwpTLWjvbm94hecw==} - engines: {node: '>= 10'} + cz-conventional-changelog@3.3.0(@types/node@20.3.1)(typescript@5.1.3): dependencies: chalk: 2.4.2 commitizen: 4.3.0(@types/node@20.3.1)(typescript@5.1.3) @@ -3540,372 +7220,198 @@ packages: transitivePeerDependencies: - '@types/node' - typescript - dev: true - /dargs@7.0.0: - resolution: {integrity: sha512-2iy1EkLdlBzQGvbweYRFxmFath8+K7+AKB0TlhHWkNuH+TmovaMH/Wp7V7R4u7f4SnX3OgLsU9t1NI9ioDnUpg==} - engines: {node: '>=8'} - dev: true + dargs@7.0.0: {} - /dargs@8.1.0: - resolution: {integrity: sha512-wAV9QHOsNbwnWdNW2FYvE1P56wtgSbM+3SZcdGiWQILwVjACCXDCI3Ai8QlCjMDB8YK5zySiXZYBiwGmNY3lnw==} - engines: {node: '>=12'} - dev: true + dargs@8.1.0: {} - /dateformat@3.0.3: - resolution: {integrity: sha512-jyCETtSl3VMZMWeRo7iY1FL19ges1t55hMo5yaam4Jrsm5EPL89UQkoQRyiI+Yf4k8r2ZpdngkV8hr1lIdjb3Q==} - dev: true + dateformat@3.0.3: {} - /dateformat@4.6.3: - resolution: {integrity: sha512-2P0p0pFGzHS5EMnhdxQi7aJN+iMheud0UhG4dlE1DLAlvL8JHjJJTX/CSm4JXwV0Ka5nGk3zC5mcb5bUQUxxMA==} - dev: false + dateformat@4.6.3: {} - /debug-fabulous@0.0.4: - resolution: {integrity: sha512-mmVKpY/O4UIl6ZDn5Owf8jEauO6uQiuF4Jz9iTuflSmvqNm6/64xARk/qCq5ZJxu141Ic2lCmL1TSMHIYoyiTw==} + debug-fabulous@0.0.4: dependencies: debug: 2.6.9 lazy-debug-legacy: 0.0.1(debug@2.6.9) object-assign: 4.1.0 transitivePeerDependencies: - supports-color - dev: false - /debug@2.6.9: - resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true + debug@2.6.9: dependencies: ms: 2.0.0 - dev: false - /debug@4.3.4: - resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} - engines: {node: '>=6.0'} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true + debug@4.3.4: dependencies: ms: 2.1.2 - /decamelize-keys@1.1.1: - resolution: {integrity: sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg==} - engines: {node: '>=0.10.0'} + decamelize-keys@1.1.1: dependencies: decamelize: 1.2.0 map-obj: 1.0.1 - dev: true - - /decamelize@1.2.0: - resolution: {integrity: sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==} - engines: {node: '>=0.10.0'} - - /decode-uri-component@0.2.2: - resolution: {integrity: sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==} - engines: {node: '>=0.10'} - dev: false - /dedent@0.7.0: - resolution: {integrity: sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==} - dev: true + decamelize@1.2.0: {} - /dedent@1.5.1: - resolution: {integrity: sha512-+LxW+KLWxu3HW3M2w2ympwtqPrqYRzU8fqi6Fhd18fBALe15blJPI/I4+UHveMVG6lJqB4JNd4UG0S5cnVHwIg==} - peerDependencies: - babel-plugin-macros: ^3.1.0 - peerDependenciesMeta: - babel-plugin-macros: - optional: true + decode-uri-component@0.2.2: {} - /deep-is@0.1.4: - resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} - dev: true + dedent@0.7.0: {} - /deep-override@1.0.2: - resolution: {integrity: sha512-+bAuLuYqaVVUWPaq8rmU8NLTX85p4I5k5/cVdhBioEfH7k+5NlGdv4NoJVQcJRByqzzTWWzTpih+pU1wBTmMow==} - dev: true + dedent@1.5.1: {} - /deepmerge@4.3.1: - resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} - engines: {node: '>=0.10.0'} + deep-is@0.1.4: {} - /defaults@1.0.4: - resolution: {integrity: sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==} + deep-override@1.0.2: {} + + deepmerge@4.3.1: {} + + defaults@1.0.4: dependencies: clone: 1.0.4 - /define-data-property@1.1.2: - resolution: {integrity: sha512-SRtsSqsDbgpJBbW3pABMCOt6rQyeM8s8RiyeSN8jYG8sYmt/kGJejbydttUsnDs1tadr19tvhT4ShwMyoqAm4g==} - engines: {node: '>= 0.4'} + define-data-property@1.1.2: dependencies: es-errors: 1.3.0 get-intrinsic: 1.2.4 gopd: 1.0.1 has-property-descriptors: 1.0.1 - dev: true - /delayed-stream@1.0.0: - resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} - engines: {node: '>=0.4.0'} + delayed-stream@1.0.0: {} - /delegates@1.0.0: - resolution: {integrity: sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==} - dev: false + delegates@1.0.0: {} - /depd@2.0.0: - resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} - engines: {node: '>= 0.8'} - dev: false + depd@2.0.0: {} - /detect-file@1.0.0: - resolution: {integrity: sha512-DtCOLG98P007x7wiiOmfI0fi3eIKyWiLTGJ2MDnVi/E04lWGbf+JzrRHMm0rgIIZJGtHpKpbVgLWHrv8xXpc3Q==} - engines: {node: '>=0.10.0'} - dev: true + detect-file@1.0.0: {} - /detect-indent@6.1.0: - resolution: {integrity: sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==} - engines: {node: '>=8'} - dev: true + detect-indent@6.1.0: {} - /detect-libc@2.0.2: - resolution: {integrity: sha512-UX6sGumvvqSaXgdKGUsgZWqcUyIXZ/vZTrlRT/iobiKhGL0zL4d3osHj3uqllWJK+i+sixDS/3COVEOFbupFyw==} - engines: {node: '>=8'} - dev: false + detect-libc@2.0.2: {} - /detect-newline@2.1.0: - resolution: {integrity: sha512-CwffZFvlJffUg9zZA0uqrjQayUTC8ob94pnr5sFwaVv3IOmkfUHcWH+jXaQK3askE51Cqe8/9Ql/0uXNwqZ8Zg==} - engines: {node: '>=0.10.0'} - dev: false + detect-newline@2.1.0: {} - /detect-newline@3.1.0: - resolution: {integrity: sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==} - engines: {node: '>=8'} + detect-newline@3.1.0: {} - /dezalgo@1.0.4: - resolution: {integrity: sha512-rXSP0bf+5n0Qonsb+SVVfNfIsimO4HEtmnIpPHY8Q1UCzKlQrDMfdobr8nJOOsRgWCyMRqeSBQzmWUMq7zvVig==} + dezalgo@1.0.4: dependencies: asap: 2.0.6 wrappy: 1.0.2 - dev: true - /diff-sequences@29.6.3: - resolution: {integrity: sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + diff-sequences@29.6.3: {} - /diff@4.0.2: - resolution: {integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==} - engines: {node: '>=0.3.1'} + diff@4.0.2: {} - /dir-glob@3.0.1: - resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} - engines: {node: '>=8'} + dir-glob@3.0.1: dependencies: path-type: 4.0.0 - dev: true - /doctrine@3.0.0: - resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} - engines: {node: '>=6.0.0'} + doctrine@3.0.0: dependencies: esutils: 2.0.3 - dev: true - /dot-prop@5.3.0: - resolution: {integrity: sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==} - engines: {node: '>=8'} + dot-prop@5.3.0: dependencies: is-obj: 2.0.0 - dev: true - /dot@1.1.3: - resolution: {integrity: sha512-/nt74Rm+PcfnirXGEdhZleTwGC2LMnuKTeeTIlI82xb5loBBoXNYzr2ezCroPSMtilK8EZIfcNZwOcHN+ib1Lg==} - engines: {'0': node >=0.2.6} - hasBin: true - dev: false + dot@1.1.3: {} - /dotenv-expand@10.0.0: - resolution: {integrity: sha512-GopVGCpVS1UKH75VKHGuQFqS1Gusej0z4FyQkPdwjil2gNIv+LNsqBlboOzpJFZKVT95GkCyWJbBSdFEFUWI2A==} - engines: {node: '>=12'} - dev: false + dotenv-expand@10.0.0: {} - /dotenv@16.3.1: - resolution: {integrity: sha512-IPzF4w4/Rd94bA9imS68tZBaYyBWSCE47V1RGuMrB94iyTOIEwRmVL2x/4An+6mETpLrKJ5hQkB8W4kFAadeIQ==} - engines: {node: '>=12'} - dev: false + dotenv@16.3.1: {} - /dotgitignore@2.1.0: - resolution: {integrity: sha512-sCm11ak2oY6DglEPpCB8TixLjWAxd3kJTs6UIcSasNYxXdFPV+YKlye92c8H4kKFqV5qYMIh7d+cYecEg0dIkA==} - engines: {node: '>=6'} + dotgitignore@2.1.0: dependencies: find-up: 3.0.0 minimatch: 3.1.2 - dev: true - /duplexify@3.7.1: - resolution: {integrity: sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==} + duplexify@3.7.1: dependencies: end-of-stream: 1.4.4 inherits: 2.0.4 readable-stream: 2.3.8 stream-shift: 1.0.3 - dev: false - /duplexify@4.1.2: - resolution: {integrity: sha512-fz3OjcNCHmRP12MJoZMPglx8m4rrFP8rovnk4vT8Fs+aonZoCwGg10dSsQsfP/E62eZcPTMSMP6686fu9Qlqtw==} + duplexify@4.1.2: dependencies: end-of-stream: 1.4.4 inherits: 2.0.4 readable-stream: 3.6.2 stream-shift: 1.0.3 - dev: false - /eastasianwidth@0.2.0: - resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} - dev: false + eastasianwidth@0.2.0: {} - /ecdsa-sig-formatter@1.0.11: - resolution: {integrity: sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==} + ecdsa-sig-formatter@1.0.11: dependencies: safe-buffer: 5.2.1 - dev: false - /electron-to-chromium@1.4.659: - resolution: {integrity: sha512-sRJ3nV3HowrYpBtPF9bASQV7OW49IgZC01Xiq43WfSE3RTCkK0/JidoCmR73Hyc1mN+l/H4Yqx0eNiomvExFZg==} + electron-to-chromium@1.4.659: {} - /emittery@0.13.1: - resolution: {integrity: sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==} - engines: {node: '>=12'} + emittery@0.13.1: {} - /emoji-regex@8.0.0: - resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + emoji-regex@8.0.0: {} - /emoji-regex@9.2.2: - resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} - dev: false + emoji-regex@9.2.2: {} - /encoding@0.1.13: - resolution: {integrity: sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==} - requiresBuild: true + encoding@0.1.13: dependencies: iconv-lite: 0.6.3 - dev: false optional: true - /end-of-stream@1.4.4: - resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} + end-of-stream@1.4.4: dependencies: once: 1.4.0 - /enhanced-resolve@5.15.0: - resolution: {integrity: sha512-LXYT42KJ7lpIKECr2mAXIaMldcNCh/7E0KBKOu4KSfkHmP+mZmSs+8V5gBAqisWBy0OO4W5Oyys0GO1Y8KtdKg==} - engines: {node: '>=10.13.0'} + enhanced-resolve@5.15.0: dependencies: graceful-fs: 4.2.11 tapable: 2.2.1 - dev: true - /env-paths@2.2.1: - resolution: {integrity: sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==} - engines: {node: '>=6'} + env-paths@2.2.1: {} - /err-code@2.0.3: - resolution: {integrity: sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==} - dev: false + err-code@2.0.3: {} - /error-ex@1.3.2: - resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} + error-ex@1.3.2: dependencies: is-arrayish: 0.2.1 - /es-errors@1.3.0: - resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} - engines: {node: '>= 0.4'} - dev: true + es-errors@1.3.0: {} - /es-module-lexer@1.4.1: - resolution: {integrity: sha512-cXLGjP0c4T3flZJKQSuziYoq7MlT+rnvfZjfp7h+I7K9BNX54kP9nyWvdbwjQ4u1iWbOL4u96fgeZLToQlZC7w==} - dev: true + es-module-lexer@1.4.1: {} - /escalade@3.1.2: - resolution: {integrity: sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==} - engines: {node: '>=6'} + escalade@3.1.2: {} - /escape-html@1.0.3: - resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==} - dev: false + escape-html@1.0.3: {} - /escape-string-regexp@1.0.5: - resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} - engines: {node: '>=0.8.0'} + escape-string-regexp@1.0.5: {} - /escape-string-regexp@2.0.0: - resolution: {integrity: sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==} - engines: {node: '>=8'} + escape-string-regexp@2.0.0: {} - /escape-string-regexp@4.0.0: - resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} - engines: {node: '>=10'} - dev: true + escape-string-regexp@4.0.0: {} - /eslint-config-prettier@9.0.0(eslint@8.42.0): - resolution: {integrity: sha512-IcJsTkJae2S35pRsRAwoCE+925rJJStOdkKnLVgtE+tEpqU0EVVM7OqrwxqgptKdX29NUwC82I5pXsGFIgSevw==} - hasBin: true - peerDependencies: - eslint: '>=7.0.0' + eslint-config-prettier@9.0.0(eslint@8.42.0): dependencies: eslint: 8.42.0 - dev: true - /eslint-plugin-prettier@5.0.0(eslint-config-prettier@9.0.0)(eslint@8.42.0)(prettier@3.0.0): - resolution: {integrity: sha512-AgaZCVuYDXHUGxj/ZGu1u8H8CYgDY3iG6w5kUFw4AzMVXzB7VvbKgYR4nATIN+OvUrghMbiDLeimVjVY5ilq3w==} - engines: {node: ^14.18.0 || >=16.0.0} - peerDependencies: - '@types/eslint': '>=8.0.0' - eslint: '>=8.0.0' - eslint-config-prettier: '*' - prettier: '>=3.0.0' - peerDependenciesMeta: - '@types/eslint': - optional: true - eslint-config-prettier: - optional: true + eslint-plugin-prettier@5.0.0(eslint-config-prettier@9.0.0)(eslint@8.42.0)(prettier@3.0.0): dependencies: eslint: 8.42.0 eslint-config-prettier: 9.0.0(eslint@8.42.0) prettier: 3.0.0 prettier-linter-helpers: 1.0.0 synckit: 0.8.8 - dev: true - /eslint-scope@5.1.1: - resolution: {integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==} - engines: {node: '>=8.0.0'} + eslint-scope@5.1.1: dependencies: esrecurse: 4.3.0 estraverse: 4.3.0 - dev: true - /eslint-scope@7.2.2: - resolution: {integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + eslint-scope@7.2.2: dependencies: esrecurse: 4.3.0 estraverse: 5.3.0 - dev: true - /eslint-visitor-keys@3.4.3: - resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - dev: true + eslint-visitor-keys@3.4.3: {} - /eslint@8.42.0: - resolution: {integrity: sha512-ulg9Ms6E1WPf67PHaEY4/6E2tEn5/f7FXGzr3t9cBMugOmf1INYvuUwwh1aXQN4MfJ6a5K2iNwP3w4AColvI9A==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - hasBin: true + eslint@8.42.0: dependencies: '@eslint-community/eslint-utils': 4.4.0(eslint@8.42.0) '@eslint-community/regexpp': 4.10.0 @@ -3948,67 +7454,36 @@ packages: text-table: 0.2.0 transitivePeerDependencies: - supports-color - dev: true - /espree@9.6.1: - resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + espree@9.6.1: dependencies: acorn: 8.11.3 acorn-jsx: 5.3.2(acorn@8.11.3) eslint-visitor-keys: 3.4.3 - dev: true - /esprima@4.0.1: - resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} - engines: {node: '>=4'} - hasBin: true + esprima@4.0.1: {} - /esquery@1.5.0: - resolution: {integrity: sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==} - engines: {node: '>=0.10'} + esquery@1.5.0: dependencies: estraverse: 5.3.0 - dev: true - /esrecurse@4.3.0: - resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} - engines: {node: '>=4.0'} + esrecurse@4.3.0: dependencies: estraverse: 5.3.0 - dev: true - /estraverse@4.3.0: - resolution: {integrity: sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==} - engines: {node: '>=4.0'} - dev: true + estraverse@4.3.0: {} - /estraverse@5.3.0: - resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} - engines: {node: '>=4.0'} - dev: true + estraverse@5.3.0: {} - /esutils@2.0.3: - resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} - engines: {node: '>=0.10.0'} - dev: true + esutils@2.0.3: {} - /event-target-shim@5.0.1: - resolution: {integrity: sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==} - engines: {node: '>=6'} - dev: false + event-target-shim@5.0.1: {} - /eventemitter2@6.4.9: - resolution: {integrity: sha512-JEPTiaOt9f04oa6NOkc4aH+nVp5I3wEjpHbIPqfgCdD5v5bUzy7xQqwcVO2aDQgOWhI28da57HksMrzK9HlRxg==} - dev: false + eventemitter2@6.4.9: {} - /events@3.3.0: - resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==} - engines: {node: '>=0.8.x'} + events@3.3.0: {} - /execa@4.1.0: - resolution: {integrity: sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA==} - engines: {node: '>=10'} + execa@4.1.0: dependencies: cross-spawn: 7.0.3 get-stream: 5.2.0 @@ -4019,11 +7494,8 @@ packages: onetime: 5.1.2 signal-exit: 3.0.7 strip-final-newline: 2.0.0 - dev: true - /execa@5.1.1: - resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} - engines: {node: '>=10'} + execa@5.1.1: dependencies: cross-spawn: 7.0.3 get-stream: 6.0.1 @@ -4035,9 +7507,7 @@ packages: signal-exit: 3.0.7 strip-final-newline: 2.0.0 - /execa@8.0.1: - resolution: {integrity: sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==} - engines: {node: '>=16.17'} + execa@8.0.1: dependencies: cross-spawn: 7.0.3 get-stream: 8.0.1 @@ -4048,36 +7518,22 @@ packages: onetime: 6.0.0 signal-exit: 4.1.0 strip-final-newline: 3.0.0 - dev: true - /exit@0.1.2: - resolution: {integrity: sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==} - engines: {node: '>= 0.8.0'} + exit@0.1.2: {} - /expand-brackets@0.1.5: - resolution: {integrity: sha512-hxx03P2dJxss6ceIeri9cmYOT4SRs3Zk3afZwWpOsRqLqprhTR8u++SlC+sFGsQr7WGFPdMF7Gjc1njDLDK6UA==} - engines: {node: '>=0.10.0'} + expand-brackets@0.1.5: dependencies: is-posix-bracket: 0.1.1 - dev: false - /expand-range@1.8.2: - resolution: {integrity: sha512-AFASGfIlnIbkKPQwX1yHaDjFvh/1gyKJODme52V6IORh69uEYgZp0o9C+qsIGNVEiuuhQU0CSSl++Rlegg1qvA==} - engines: {node: '>=0.10.0'} + expand-range@1.8.2: dependencies: fill-range: 2.2.4 - dev: false - /expand-tilde@2.0.2: - resolution: {integrity: sha512-A5EmesHW6rfnZ9ysHQjPdJRni0SRar0tjtG5MNtm9n5TUvsYU8oozprtRD4AqHxcZWWlVuAmQo2nWKfN9oyjTw==} - engines: {node: '>=0.10.0'} + expand-tilde@2.0.2: dependencies: homedir-polyfill: 1.0.3 - dev: true - /expect@29.7.0: - resolution: {integrity: sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + expect@29.7.0: dependencies: '@jest/expect-utils': 29.7.0 jest-get-type: 29.6.3 @@ -4085,72 +7541,45 @@ packages: jest-message-util: 29.7.0 jest-util: 29.7.0 - /exponential-backoff@3.1.1: - resolution: {integrity: sha512-dX7e/LHVJ6W3DE1MHWi9S1EYzDESENfLrYohG2G++ovZrYOkm4Knwa0mc1cn84xJOR4KEU0WSchhLbd0UklbHw==} - dev: false + exponential-backoff@3.1.1: {} - /extend-shallow@2.0.1: - resolution: {integrity: sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==} - engines: {node: '>=0.10.0'} + extend-shallow@2.0.1: dependencies: is-extendable: 0.1.1 - dev: false - /extend@3.0.2: - resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} - dev: false + extend@3.0.2: {} - /external-editor@3.1.0: - resolution: {integrity: sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==} - engines: {node: '>=4'} + external-editor@3.1.0: dependencies: chardet: 0.7.0 iconv-lite: 0.4.24 tmp: 0.0.33 - dev: true - /extglob@0.3.2: - resolution: {integrity: sha512-1FOj1LOwn42TMrruOHGt18HemVnbwAmAak7krWk+wa93KXxGbK+2jpezm+ytJYDaBX0/SPLZFHKM7m+tKobWGg==} - engines: {node: '>=0.10.0'} + extglob@0.3.2: dependencies: is-extglob: 1.0.0 - dev: false - /fast-content-type-parse@1.1.0: - resolution: {integrity: sha512-fBHHqSTFLVnR61C+gltJuE5GkVQMV0S2nqUO8TJ+5Z3qAKG8vAx4FKai1s5jq/inV1+sREynIWSuQ6HgoSXpDQ==} - dev: false + fast-content-type-parse@1.1.0: {} - /fast-copy@3.0.1: - resolution: {integrity: sha512-Knr7NOtK3HWRYGtHoJrjkaWepqT8thIVGAwt0p0aUs1zqkAzXZV4vo9fFNwyb5fcqK1GKYFYxldQdIDVKhUAfA==} - dev: false + fast-copy@3.0.1: {} - /fast-decode-uri-component@1.0.1: - resolution: {integrity: sha512-WKgKWg5eUxvRZGwW8FvfbaH7AXSh2cL+3j5fMGzUMCxWBJ3dV3a7Wz8y2f/uQ0e3B6WmodD3oS54jTQ9HVTIIg==} - dev: false + fast-decode-uri-component@1.0.1: {} - /fast-deep-equal@3.1.3: - resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + fast-deep-equal@3.1.3: {} - /fast-diff@1.3.0: - resolution: {integrity: sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==} - dev: true + fast-diff@1.3.0: {} - /fast-glob@3.3.2: - resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==} - engines: {node: '>=8.6.0'} + fast-glob@3.3.2: 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.5 - dev: true - /fast-json-stable-stringify@2.1.0: - resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} + fast-json-stable-stringify@2.1.0: {} - /fast-json-stringify@5.12.0: - resolution: {integrity: sha512-7Nnm9UPa7SfHRbHVA1kJQrGXCRzB7LMlAAqHXQFkEQqueJm1V8owm0FsE/2Do55/4CcdhwiLQERaKomOnKQkyA==} + fast-json-stringify@5.12.0: dependencies: '@fastify/merge-json-schemas': 0.1.1 ajv: 8.12.0 @@ -4159,43 +7588,26 @@ packages: fast-uri: 2.3.0 json-schema-ref-resolver: 1.0.1 rfdc: 1.3.1 - dev: false - /fast-levenshtein@2.0.6: - resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} - dev: true + fast-levenshtein@2.0.6: {} - /fast-querystring@1.1.2: - resolution: {integrity: sha512-g6KuKWmFXc0fID8WWH0jit4g0AGBoJhCkJMb1RmbsSEUNvQ+ZC8D6CUZ+GtF8nMzSPXnhiePyyqqipzNNEnHjg==} + fast-querystring@1.1.2: dependencies: fast-decode-uri-component: 1.0.1 - dev: false - /fast-redact@3.3.0: - resolution: {integrity: sha512-6T5V1QK1u4oF+ATxs1lWUmlEk6P2T9HqJG3e2DnHOdVgZy2rFJBoEnrIedcTXlkAHU/zKC+7KETJ+KGGKwxgMQ==} - engines: {node: '>=6'} - dev: false + fast-redact@3.3.0: {} - /fast-safe-stringify@2.1.1: - resolution: {integrity: sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==} + fast-safe-stringify@2.1.1: {} - /fast-uri@2.3.0: - resolution: {integrity: sha512-eel5UKGn369gGEWOqBShmFJWfq/xSJvsgDzgLYC845GneayWvXBf0lJCBn5qTABfewy1ZDPoaR5OZCP+kssfuw==} - dev: false + fast-uri@2.3.0: {} - /fastify-ip@1.0.0: - resolution: {integrity: sha512-ht6hS48UDmdHd9jARn2BphJUgw5u/nm8ItO9EceM2uSVhlusrkF07CfNvpuJHxFX8Nx+Eik/VJz0QzxOn3KMJA==} - engines: {node: '>=18.x'} + fastify-ip@1.0.0: dependencies: fastify-plugin: 4.5.1 - dev: false - /fastify-plugin@4.5.1: - resolution: {integrity: sha512-stRHYGeuqpEZTL1Ef0Ovr2ltazUT9g844X5z/zEBFLG8RYlpDiOCIG+ATvYEp+/zmc7sN29mcIMp8gvYplYPIQ==} - dev: false + fastify-plugin@4.5.1: {} - /fastify@4.26.2: - resolution: {integrity: sha512-90pjTuPGrfVKtdpLeLzND5nyC4woXZN5VadiNQCicj/iJU4viNHKhsAnb7jmv1vu2IzkLXyBiCzdWuzeXgQ5Ug==} + fastify@4.26.2: dependencies: '@fastify/ajv-compiler': 3.5.0 '@fastify/error': 3.4.1 @@ -4215,190 +7627,114 @@ packages: toad-cache: 3.7.0 transitivePeerDependencies: - supports-color - dev: false - /fastq@1.17.1: - resolution: {integrity: sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==} + fastq@1.17.1: dependencies: reusify: 1.0.4 - /fb-watchman@2.0.2: - resolution: {integrity: sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==} + fb-watchman@2.0.2: dependencies: bser: 2.1.1 - /figures@3.2.0: - resolution: {integrity: sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==} - engines: {node: '>=8'} + figures@3.2.0: dependencies: escape-string-regexp: 1.0.5 - dev: true - /file-entry-cache@6.0.1: - resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} - engines: {node: ^10.12.0 || >=12.0.0} + file-entry-cache@6.0.1: dependencies: flat-cache: 3.2.0 - dev: true - /file-uri-to-path@1.0.0: - resolution: {integrity: sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==} - dev: false + file-uri-to-path@1.0.0: {} - /filename-regex@2.0.1: - resolution: {integrity: sha512-BTCqyBaWBTsauvnHiE8i562+EdJj+oUpkqWp2R1iCoR8f6oo8STRu3of7WJJ0TqWtxN50a5YFpzYK4Jj9esYfQ==} - engines: {node: '>=0.10.0'} - dev: false + filename-regex@2.0.1: {} - /fill-range@2.2.4: - resolution: {integrity: sha512-cnrcCbj01+j2gTG921VZPnHbjmdAf8oQV/iGeV2kZxGSyfYjjTyY79ErsK1WJWMpw6DaApEX72binqJE+/d+5Q==} - engines: {node: '>=0.10.0'} + fill-range@2.2.4: dependencies: is-number: 2.1.0 isobject: 2.1.0 randomatic: 3.1.1 repeat-element: 1.1.4 repeat-string: 1.6.1 - dev: false - /fill-range@7.0.1: - resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} - engines: {node: '>=8'} + fill-range@7.0.1: dependencies: to-regex-range: 5.0.1 - /find-my-way@8.1.0: - resolution: {integrity: sha512-41QwjCGcVTODUmLLqTMeoHeiozbMXYMAE1CKFiDyi9zVZ2Vjh0yz3MF0WQZoIb+cmzP/XlbFjlF2NtJmvZHznA==} - engines: {node: '>=14'} + find-my-way@8.1.0: dependencies: fast-deep-equal: 3.1.3 fast-querystring: 1.1.2 safe-regex2: 2.0.0 - dev: false - /find-node-modules@2.1.3: - resolution: {integrity: sha512-UC2I2+nx1ZuOBclWVNdcnbDR5dlrOdVb7xNjmT/lHE+LsgztWks3dG7boJ37yTS/venXw84B/mAW9uHVoC5QRg==} + find-node-modules@2.1.3: dependencies: findup-sync: 4.0.0 merge: 2.1.1 - dev: true - /find-root@1.1.0: - resolution: {integrity: sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==} - dev: true + find-root@1.1.0: {} - /find-up@1.1.2: - resolution: {integrity: sha512-jvElSjyuo4EMQGoTwo1uJU5pQMwTW5lS1x05zzfJuTIyLR3zwO27LYrxNg+dlvKpGOuGy/MzBdXh80g0ve5+HA==} - engines: {node: '>=0.10.0'} + find-up@1.1.2: dependencies: path-exists: 2.1.0 pinkie-promise: 2.0.1 - dev: false - /find-up@2.1.0: - resolution: {integrity: sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ==} - engines: {node: '>=4'} + find-up@2.1.0: dependencies: locate-path: 2.0.0 - dev: true - /find-up@3.0.0: - resolution: {integrity: sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==} - engines: {node: '>=6'} + find-up@3.0.0: dependencies: locate-path: 3.0.0 - dev: true - /find-up@4.1.0: - resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} - engines: {node: '>=8'} + find-up@4.1.0: dependencies: locate-path: 5.0.0 path-exists: 4.0.0 - /find-up@5.0.0: - resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} - engines: {node: '>=10'} + find-up@5.0.0: dependencies: locate-path: 6.0.0 path-exists: 4.0.0 - dev: true - /find-up@7.0.0: - resolution: {integrity: sha512-YyZM99iHrqLKjmt4LJDj58KI+fYyufRLBSYcqycxf//KpBk9FoewoGX0450m9nB44qrZnovzC2oeP5hUibxc/g==} - engines: {node: '>=18'} + find-up@7.0.0: dependencies: locate-path: 7.2.0 path-exists: 5.0.0 unicorn-magic: 0.1.0 - dev: true - /findup-sync@4.0.0: - resolution: {integrity: sha512-6jvvn/12IC4quLBL1KNokxC7wWTvYncaVUYSoxWw7YykPLuRrnv4qdHcSOywOI5RpkOVGeQRtWM8/q+G6W6qfQ==} - engines: {node: '>= 8'} + findup-sync@4.0.0: dependencies: detect-file: 1.0.0 is-glob: 4.0.3 micromatch: 4.0.5 resolve-dir: 1.0.1 - dev: true - /first-chunk-stream@1.0.0: - resolution: {integrity: sha512-ArRi5axuv66gEsyl3UuK80CzW7t56hem73YGNYxNWTGNKFJUadSb9Gu9SHijYEUi8ulQMf1bJomYNwSCPHhtTQ==} - engines: {node: '>=0.10.0'} - dev: false + first-chunk-stream@1.0.0: {} - /flat-cache@3.2.0: - resolution: {integrity: sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==} - engines: {node: ^10.12.0 || >=12.0.0} + flat-cache@3.2.0: dependencies: flatted: 3.2.9 keyv: 4.5.4 rimraf: 3.0.2 - dev: true - /flatted@3.2.9: - resolution: {integrity: sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==} - dev: true + flatted@3.2.9: {} - /follow-redirects@1.15.5(debug@2.6.9): - resolution: {integrity: sha512-vSFWUON1B+yAw1VN4xMfxgn5fTUiaOzAJCKBwIIgT/+7CuGy9+r+5gITvP62j3RmaD5Ph65UaERdOSRGUzZtgw==} - engines: {node: '>=4.0'} - peerDependencies: - debug: '*' - peerDependenciesMeta: - debug: - optional: true + follow-redirects@1.15.5(debug@2.6.9): dependencies: debug: 2.6.9 - dev: false - /for-in@1.0.2: - resolution: {integrity: sha512-7EwmXrOjyL+ChxMhmG5lnW9MPt1aIeZEwKhQzoBUdTV0N3zuwWDZYVJatDvZ2OyzPUvdIAZDsCetk3coyMfcnQ==} - engines: {node: '>=0.10.0'} - dev: false + for-in@1.0.2: {} - /for-own@0.1.5: - resolution: {integrity: sha512-SKmowqGTJoPzLO1T0BBJpkfp3EMacCMOuH40hOUbrbzElVktk4DioXVM99QkLCyKoiuOmyjgcWMpVz2xjE7LZw==} - engines: {node: '>=0.10.0'} + for-own@0.1.5: dependencies: for-in: 1.0.2 - dev: false - /foreground-child@3.1.1: - resolution: {integrity: sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==} - engines: {node: '>=14'} + foreground-child@3.1.1: dependencies: cross-spawn: 7.0.3 signal-exit: 4.1.0 - dev: false - /fork-ts-checker-webpack-plugin@8.0.0(typescript@5.1.3)(webpack@5.87.0): - resolution: {integrity: sha512-mX3qW3idpueT2klaQXBzrIM/pHw+T0B/V9KHEvNrqijTq9NFnMZU6oreVxDYcf33P8a5cW+67PjodNHthGnNVg==} - engines: {node: '>=12.13.0', yarn: '>=1.0.0'} - peerDependencies: - typescript: '>3.6.0' - webpack: ^5.11.0 + fork-ts-checker-webpack-plugin@8.0.0(typescript@5.1.3)(webpack@5.87.0): dependencies: '@babel/code-frame': 7.23.5 chalk: 4.1.2 @@ -4414,90 +7750,60 @@ packages: tapable: 2.2.1 typescript: 5.1.3 webpack: 5.87.0 - dev: true - /form-data-lite@1.0.3: - resolution: {integrity: sha512-P7xPqAiOPKzC9Q9aywAZJCQq4QOE5WokPb3HrcWRh7C57RKytueJzoORZAVgHBNvK/lL7E+FxjQjd4X/zbecEQ==} + form-data-lite@1.0.3: dependencies: asynckit: 0.4.0 combined-stream: 1.0.8 mime-lite: 1.0.3 - dev: true - /form-data@4.0.0: - resolution: {integrity: sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==} - engines: {node: '>= 6'} + form-data@4.0.0: dependencies: asynckit: 0.4.0 combined-stream: 1.0.8 mime-types: 2.1.35 - /formidable@2.1.2: - resolution: {integrity: sha512-CM3GuJ57US06mlpQ47YcunuUZ9jpm8Vx+P2CGt2j7HpgkKZO/DJYQ0Bobim8G6PFQmK5lOqOOdUXboU+h73A4g==} + formidable@2.1.2: dependencies: dezalgo: 1.0.4 hexoid: 1.0.0 once: 1.4.0 qs: 6.11.2 - dev: true - /forwarded@0.2.0: - resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==} - engines: {node: '>= 0.6'} - dev: false + forwarded@0.2.0: {} - /from2@2.3.0: - resolution: {integrity: sha512-OMcX/4IC/uqEPVgGeyfN22LJk6AZrMkRZHxcHBMBvHScDGgwTm2GT2Wkgtocyd3JfZffjj2kYUDXXII0Fk9W0g==} + from2@2.3.0: dependencies: inherits: 2.0.4 readable-stream: 2.3.8 - dev: false - /fs-extra@10.1.0: - resolution: {integrity: sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==} - engines: {node: '>=12'} + fs-extra@10.1.0: dependencies: graceful-fs: 4.2.11 jsonfile: 6.1.0 universalify: 2.0.1 - dev: true - /fs-extra@9.1.0: - resolution: {integrity: sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==} - engines: {node: '>=10'} + fs-extra@9.1.0: dependencies: at-least-node: 1.0.0 graceful-fs: 4.2.11 jsonfile: 6.1.0 universalify: 2.0.1 - dev: true - /fs-minipass@2.1.0: - resolution: {integrity: sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==} - engines: {node: '>= 8'} + fs-minipass@2.1.0: dependencies: minipass: 3.3.6 - /fs-monkey@1.0.5: - resolution: {integrity: sha512-8uMbBjrhzW76TYgEV27Y5E//W2f/lTFmx78P2w19FZSxarhI/798APGQyuGCwmkNxgwGRhrLfvWyLBvNtuOmew==} - dev: true + fs-monkey@1.0.5: {} - /fs.realpath@1.0.0: - resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} + fs.realpath@1.0.0: {} - /fsevents@2.3.3: - resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} - engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} - os: [darwin] - requiresBuild: true + fsevents@2.3.3: optional: true - /function-bind@1.1.2: - resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} + function-bind@1.1.2: {} - /gauge@3.0.2: - resolution: {integrity: sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==} - engines: {node: '>=10'} + gauge@3.0.2: dependencies: aproba: 2.0.0 color-support: 1.1.3 @@ -4508,11 +7814,8 @@ packages: string-width: 4.2.3 strip-ansi: 6.0.1 wide-align: 1.1.5 - dev: false - /gauge@4.0.4: - resolution: {integrity: sha512-f9m+BEN5jkg6a0fZjleidjN51VE1X+mPFQ2DJ0uv1V39oCLCbsGe6yjbBnp7eK7z/+GAon99a3nHuqbuuthyPg==} - engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + gauge@4.0.4: dependencies: aproba: 2.0.0 color-support: 1.1.3 @@ -4522,141 +7825,87 @@ packages: string-width: 4.2.3 strip-ansi: 6.0.1 wide-align: 1.1.5 - dev: false - /gensync@1.0.0-beta.2: - resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} - engines: {node: '>=6.9.0'} + gensync@1.0.0-beta.2: {} - /get-caller-file@2.0.5: - resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} - engines: {node: 6.* || 8.* || >= 10.*} + get-caller-file@2.0.5: {} - /get-intrinsic@1.2.4: - resolution: {integrity: sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==} - engines: {node: '>= 0.4'} + get-intrinsic@1.2.4: dependencies: es-errors: 1.3.0 function-bind: 1.1.2 has-proto: 1.0.1 has-symbols: 1.0.3 hasown: 2.0.0 - dev: true - /get-package-type@0.1.0: - resolution: {integrity: sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==} - engines: {node: '>=8.0.0'} + get-package-type@0.1.0: {} - /get-pkg-repo@4.2.1: - resolution: {integrity: sha512-2+QbHjFRfGB74v/pYWjd5OhU3TDIC2Gv/YKUTk/tCvAz0pkn/Mz6P3uByuBimLOcPvN2jYdScl3xGFSrx0jEcA==} - engines: {node: '>=6.9.0'} - hasBin: true + get-pkg-repo@4.2.1: dependencies: '@hutson/parse-repository-url': 3.0.2 hosted-git-info: 4.1.0 through2: 2.0.5 yargs: 16.2.0 - dev: true - /get-stream@5.2.0: - resolution: {integrity: sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==} - engines: {node: '>=8'} + get-stream@5.2.0: dependencies: pump: 3.0.0 - dev: true - - /get-stream@6.0.1: - resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} - engines: {node: '>=10'} - /get-stream@8.0.1: - resolution: {integrity: sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==} - engines: {node: '>=16'} - dev: true + get-stream@6.0.1: {} - /git-raw-commits@2.0.11: - resolution: {integrity: sha512-VnctFhw+xfj8Va1xtfEqCUD2XDrbAPSJx+hSrE5K7fGdjZruW7XV+QOrN7LF/RJyvspRiD2I0asWsxFp0ya26A==} - engines: {node: '>=10'} - hasBin: true + get-stream@8.0.1: {} + + git-raw-commits@2.0.11: dependencies: dargs: 7.0.0 lodash: 4.17.21 meow: 8.1.2 split2: 3.2.2 through2: 4.0.2 - dev: true - /git-raw-commits@4.0.0: - resolution: {integrity: sha512-ICsMM1Wk8xSGMowkOmPrzo2Fgmfo4bMHLNX6ytHjajRJUqvHOw/TFapQ+QG75c3X/tTDDhOSRPGC52dDbNM8FQ==} - engines: {node: '>=16'} - hasBin: true + git-raw-commits@4.0.0: dependencies: dargs: 8.1.0 meow: 12.1.1 split2: 4.2.0 - dev: true - /git-remote-origin-url@2.0.0: - resolution: {integrity: sha512-eU+GGrZgccNJcsDH5LkXR3PB9M958hxc7sbA8DFJjrv9j4L2P/eZfKhM+QD6wyzpiv+b1BpK0XrYCxkovtjSLw==} - engines: {node: '>=4'} + git-remote-origin-url@2.0.0: dependencies: gitconfiglocal: 1.0.0 pify: 2.3.0 - dev: true - /git-semver-tags@4.1.1: - resolution: {integrity: sha512-OWyMt5zBe7xFs8vglMmhM9lRQzCWL3WjHtxNNfJTMngGym7pC1kh8sP6jevfydJ6LP3ZvGxfb6ABYgPUM0mtsA==} - engines: {node: '>=10'} - hasBin: true + git-semver-tags@4.1.1: dependencies: meow: 8.1.2 semver: 6.3.1 - dev: true - /gitconfiglocal@1.0.0: - resolution: {integrity: sha512-spLUXeTAVHxDtKsJc8FkFVgFtMdEN9qPGpL23VfSHx4fP4+Ds097IXLvymbnDH8FnmxX5Nr9bPw3A+AQ6mWEaQ==} + gitconfiglocal@1.0.0: dependencies: ini: 1.3.8 - dev: true - /glob-base@0.3.0: - resolution: {integrity: sha512-ab1S1g1EbO7YzauaJLkgLp7DZVAqj9M/dvKlTt8DkXA2tiOIcSMrlVI2J1RZyB5iJVccEscjGn+kpOG9788MHA==} - engines: {node: '>=0.10.0'} + glob-base@0.3.0: dependencies: glob-parent: 2.0.0 is-glob: 2.0.1 - dev: false - /glob-parent@2.0.0: - resolution: {integrity: sha512-JDYOvfxio/t42HKdxkAYaCiBN7oYiuxykOxKxdaUW5Qn0zaYN3gRQWolrwdnf0shM9/EP0ebuuTmyoXNr1cC5w==} + glob-parent@2.0.0: dependencies: is-glob: 2.0.1 - dev: false - /glob-parent@3.1.0: - resolution: {integrity: sha512-E8Ak/2+dZY6fnzlR7+ueWvhsH1SjHr4jjss4YS/h4py44jY9MhK/VFdaZJAWDz6BbL21KeteKxFSFpq8OS5gVA==} + glob-parent@3.1.0: dependencies: is-glob: 3.1.0 path-dirname: 1.0.2 - dev: false - /glob-parent@5.1.2: - resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} - engines: {node: '>= 6'} + glob-parent@5.1.2: dependencies: is-glob: 4.0.3 - dev: true - /glob-parent@6.0.2: - resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} - engines: {node: '>=10.13.0'} + glob-parent@6.0.2: dependencies: is-glob: 4.0.3 - dev: true - /glob-stream@5.3.5: - resolution: {integrity: sha512-piN8XVAO2sNxwVLokL4PswgJvK/uQ6+awwXUVRTGF+rRfgCZpn4hOqxiRuTEbU/k3qgKl0DACYQ/0Sge54UMQg==} - engines: {node: '>= 0.10'} + glob-stream@5.3.5: dependencies: extend: 3.0.2 glob: 5.0.15 @@ -4666,36 +7915,26 @@ packages: through2: 0.6.5 to-absolute-glob: 0.1.1 unique-stream: 2.3.1 - dev: false - /glob-to-regexp@0.4.1: - resolution: {integrity: sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==} - dev: true + glob-to-regexp@0.4.1: {} - /glob@10.3.10: - resolution: {integrity: sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==} - engines: {node: '>=16 || 14 >=14.17'} - hasBin: true + glob@10.3.10: dependencies: foreground-child: 3.1.1 jackspeak: 2.3.6 minimatch: 9.0.3 minipass: 7.0.4 path-scurry: 1.10.1 - dev: false - /glob@5.0.15: - resolution: {integrity: sha512-c9IPMazfRITpmAAKi22dK1VKxGDX9ehhqfABDriL/lzO92xcUKEJPQHrVA/2YHSNFB4iFlykVmWvwo48nr3OxA==} + glob@5.0.15: dependencies: inflight: 1.0.6 inherits: 2.0.4 minimatch: 3.1.2 once: 1.4.0 path-is-absolute: 1.0.1 - dev: false - /glob@7.2.3: - resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} + glob@7.2.3: dependencies: fs.realpath: 1.0.0 inflight: 1.0.6 @@ -4704,68 +7943,46 @@ packages: once: 1.4.0 path-is-absolute: 1.0.1 - /glob@8.1.0: - resolution: {integrity: sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==} - engines: {node: '>=12'} + glob@8.1.0: dependencies: fs.realpath: 1.0.0 inflight: 1.0.6 inherits: 2.0.4 minimatch: 5.1.6 once: 1.4.0 - dev: false - /glob@9.3.5: - resolution: {integrity: sha512-e1LleDykUz2Iu+MTYdkSsuWX8lvAjAcs0Xef0lNIu0S2wOAzuTxCJtcd9S3cijlwYF18EsU3rzb8jPVobxDh9Q==} - engines: {node: '>=16 || 14 >=14.17'} + glob@9.3.5: dependencies: fs.realpath: 1.0.0 minimatch: 8.0.4 minipass: 4.2.8 path-scurry: 1.10.1 - dev: true - /global-directory@4.0.1: - resolution: {integrity: sha512-wHTUcDUoZ1H5/0iVqEudYW4/kAlN5cZ3j/bXn0Dpbizl9iaUVeWSHqiOjsgk6OW2bkLclbBjzewBz6weQ1zA2Q==} - engines: {node: '>=18'} + global-directory@4.0.1: dependencies: ini: 4.1.1 - dev: true - /global-modules@1.0.0: - resolution: {integrity: sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==} - engines: {node: '>=0.10.0'} + global-modules@1.0.0: dependencies: global-prefix: 1.0.2 is-windows: 1.0.2 resolve-dir: 1.0.1 - dev: true - /global-prefix@1.0.2: - resolution: {integrity: sha512-5lsx1NUDHtSjfg0eHlmYvZKv8/nVqX4ckFbM+FrGcQ+04KWcWFo9P5MxPZYSzUvyzmdTbI7Eix8Q4IbELDqzKg==} - engines: {node: '>=0.10.0'} + global-prefix@1.0.2: dependencies: expand-tilde: 2.0.2 homedir-polyfill: 1.0.3 ini: 1.3.8 is-windows: 1.0.2 which: 1.3.1 - dev: true - /globals@11.12.0: - resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} - engines: {node: '>=4'} + globals@11.12.0: {} - /globals@13.24.0: - resolution: {integrity: sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==} - engines: {node: '>=8'} + globals@13.24.0: dependencies: type-fest: 0.20.2 - dev: true - /globby@11.1.0: - resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} - engines: {node: '>=10'} + globby@11.1.0: dependencies: array-union: 2.1.0 dir-glob: 3.0.1 @@ -4773,28 +7990,18 @@ packages: ignore: 5.3.1 merge2: 1.4.1 slash: 3.0.0 - dev: true - /gopd@1.0.1: - resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==} + gopd@1.0.1: dependencies: get-intrinsic: 1.2.4 - dev: true - /graceful-fs@4.2.11: - resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + graceful-fs@4.2.11: {} - /grapheme-splitter@1.0.4: - resolution: {integrity: sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==} - dev: true + grapheme-splitter@1.0.4: {} - /graphemer@1.4.0: - resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} - dev: true + graphemer@1.4.0: {} - /gulp-sourcemaps@1.12.1: - resolution: {integrity: sha512-2NYnMpB67LJhc36sEv+hNY05UOy1lD9DPtLi+en4hbGH+085G9Zzh3cet2VEqrDlQrLk9Eho0MM9dZ3Z+dL0XA==} - engines: {node: '>=0.10.0'} + gulp-sourcemaps@1.12.1: dependencies: '@gulp-sourcemaps/map-sources': 1.0.0 acorn: 4.0.13 @@ -4809,12 +8016,8 @@ packages: vinyl: 1.2.0 transitivePeerDependencies: - supports-color - dev: false - /handlebars@4.7.8: - resolution: {integrity: sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==} - engines: {node: '>=0.4.7'} - hasBin: true + handlebars@4.7.8: dependencies: minimist: 1.2.8 neo-async: 2.6.2 @@ -4822,231 +8025,131 @@ packages: wordwrap: 1.0.0 optionalDependencies: uglify-js: 3.17.4 - dev: true - /hard-rejection@2.1.0: - resolution: {integrity: sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==} - engines: {node: '>=6'} - dev: true + hard-rejection@2.1.0: {} - /has-ansi@2.0.0: - resolution: {integrity: sha512-C8vBJ8DwUCx19vhm7urhTuUsr4/IyP6l4VzNQDv+ryHQObW3TTTp9yB68WpYgRe2bbaGuZ/se74IqFeVnMnLZg==} - engines: {node: '>=0.10.0'} + has-ansi@2.0.0: dependencies: ansi-regex: 2.1.1 - dev: false - /has-flag@3.0.0: - resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} - engines: {node: '>=4'} + has-flag@3.0.0: {} - /has-flag@4.0.0: - resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} - engines: {node: '>=8'} + has-flag@4.0.0: {} - /has-own-prop@2.0.0: - resolution: {integrity: sha512-Pq0h+hvsVm6dDEa8x82GnLSYHOzNDt7f0ddFa3FqcQlgzEiptPqL+XrOJNavjOzSYiYWIrgeVYYgGlLmnxwilQ==} - engines: {node: '>=8'} - dev: true + has-own-prop@2.0.0: {} - /has-property-descriptors@1.0.1: - resolution: {integrity: sha512-VsX8eaIewvas0xnvinAe9bw4WfIeODpGYikiWYLH+dma0Jw6KHYqWiWfhQlgOVK8D6PvjubK5Uc4P0iIhIcNVg==} + has-property-descriptors@1.0.1: dependencies: get-intrinsic: 1.2.4 - dev: true - /has-proto@1.0.1: - resolution: {integrity: sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==} - engines: {node: '>= 0.4'} - dev: true + has-proto@1.0.1: {} - /has-symbols@1.0.3: - resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==} - engines: {node: '>= 0.4'} - dev: true + has-symbols@1.0.3: {} - /has-unicode@2.0.1: - resolution: {integrity: sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==} - dev: false + has-unicode@2.0.1: {} - /hasown@2.0.0: - resolution: {integrity: sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==} - engines: {node: '>= 0.4'} + hasown@2.0.0: dependencies: function-bind: 1.1.2 - /helmet@7.1.0: - resolution: {integrity: sha512-g+HZqgfbpXdCkme/Cd/mZkV0aV3BZZZSugecH03kl38m/Kmdx8jKjBikpDj2cr+Iynv4KpYEviojNdTJActJAg==} - engines: {node: '>=16.0.0'} - dev: false + helmet@7.1.0: {} - /help-me@5.0.0: - resolution: {integrity: sha512-7xgomUX6ADmcYzFik0HzAxh/73YlKR9bmFzf51CZwR+b6YtzU2m0u49hQCqV6SvlqIqsaxovfwdvbnsw3b/zpg==} - dev: false + help-me@5.0.0: {} - /hexoid@1.0.0: - resolution: {integrity: sha512-QFLV0taWQOZtvIRIAdBChesmogZrtuXvVWsFHZTk2SU+anspqZ2vMnoLg7IE1+Uk16N19APic1BuF8bC8c2m5g==} - engines: {node: '>=8'} - dev: true + hexoid@1.0.0: {} - /homedir-polyfill@1.0.3: - resolution: {integrity: sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==} - engines: {node: '>=0.10.0'} + homedir-polyfill@1.0.3: dependencies: parse-passwd: 1.0.0 - dev: true - /hosted-git-info@2.8.9: - resolution: {integrity: sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==} + hosted-git-info@2.8.9: {} - /hosted-git-info@4.1.0: - resolution: {integrity: sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==} - engines: {node: '>=10'} + hosted-git-info@4.1.0: dependencies: lru-cache: 6.0.0 - dev: true - /html-escaper@2.0.2: - resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==} + html-escaper@2.0.2: {} - /http-cache-semantics@4.1.1: - resolution: {integrity: sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==} - dev: false + http-cache-semantics@4.1.1: {} - /http-errors@2.0.0: - resolution: {integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==} - engines: {node: '>= 0.8'} + http-errors@2.0.0: dependencies: depd: 2.0.0 inherits: 2.0.4 setprototypeof: 1.2.0 statuses: 2.0.1 toidentifier: 1.0.1 - dev: false - /http-proxy-agent@5.0.0: - resolution: {integrity: sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==} - engines: {node: '>= 6'} + http-proxy-agent@5.0.0: dependencies: '@tootallnate/once': 2.0.0 agent-base: 6.0.2 debug: 4.3.4 transitivePeerDependencies: - supports-color - dev: false - /https-proxy-agent@5.0.1: - resolution: {integrity: sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==} - engines: {node: '>= 6'} + https-proxy-agent@5.0.1: dependencies: agent-base: 6.0.2 debug: 4.3.4 transitivePeerDependencies: - supports-color - dev: false - /human-signals@1.1.1: - resolution: {integrity: sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==} - engines: {node: '>=8.12.0'} - dev: true + human-signals@1.1.1: {} - /human-signals@2.1.0: - resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} - engines: {node: '>=10.17.0'} + human-signals@2.1.0: {} - /human-signals@5.0.0: - resolution: {integrity: sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==} - engines: {node: '>=16.17.0'} - dev: true + human-signals@5.0.0: {} - /humanize-ms@1.2.1: - resolution: {integrity: sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==} + humanize-ms@1.2.1: dependencies: ms: 2.1.3 - dev: false - /husky@9.0.11: - resolution: {integrity: sha512-AB6lFlbwwyIqMdHYhwPe+kjOC3Oc5P3nThEoW/AaO2BX3vJDjWPFxYLxokUZOo6RNX20He3AaT8sESs9NJcmEw==} - engines: {node: '>=18'} - hasBin: true - dev: true + husky@9.0.11: {} - /iconv-lite@0.4.24: - resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} - engines: {node: '>=0.10.0'} + iconv-lite@0.4.24: dependencies: safer-buffer: 2.1.2 - dev: true - /iconv-lite@0.6.3: - resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} - engines: {node: '>=0.10.0'} + iconv-lite@0.6.3: dependencies: safer-buffer: 2.1.2 - dev: false optional: true - /ieee754@1.2.1: - resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} + ieee754@1.2.1: {} - /ignore@5.3.1: - resolution: {integrity: sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==} - engines: {node: '>= 4'} - dev: true + ignore@5.3.1: {} - /import-fresh@3.3.0: - resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} - engines: {node: '>=6'} + import-fresh@3.3.0: dependencies: parent-module: 1.0.1 resolve-from: 4.0.0 - dev: true - /import-local@3.1.0: - resolution: {integrity: sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==} - engines: {node: '>=8'} - hasBin: true + import-local@3.1.0: dependencies: pkg-dir: 4.2.0 resolve-cwd: 3.0.0 - /import-meta-resolve@4.0.0: - resolution: {integrity: sha512-okYUR7ZQPH+efeuMJGlq4f8ubUgO50kByRPyt/Cy1Io4PSRsPjxME+YlVaCOx+NIToW7hCsZNFJyTPFFKepRSA==} - dev: true + import-meta-resolve@4.0.0: {} - /imurmurhash@0.1.4: - resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} - engines: {node: '>=0.8.19'} + imurmurhash@0.1.4: {} - /indent-string@4.0.0: - resolution: {integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==} - engines: {node: '>=8'} + indent-string@4.0.0: {} - /infer-owner@1.0.4: - resolution: {integrity: sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==} - dev: false + infer-owner@1.0.4: {} - /inflight@1.0.6: - resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} + inflight@1.0.6: dependencies: once: 1.4.0 wrappy: 1.0.2 - /inherits@2.0.4: - resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + inherits@2.0.4: {} - /ini@1.3.8: - resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} - dev: true + ini@1.3.8: {} - /ini@4.1.1: - resolution: {integrity: sha512-QQnnxNyfvmHFIsj7gkPcYymR8Jdw/o7mp5ZFihxn6h8Ci6fh3Dx4E1gPjpQEpIuPo9XVNY/ZUwh4BPMjGyL01g==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - dev: true + ini@4.1.1: {} - /inquirer@8.2.4: - resolution: {integrity: sha512-nn4F01dxU8VeKfq192IjLsxu0/OmMZ4Lg3xKAns148rCaXP6ntAoEkVYZThWjwON8AlzdZZi6oqnhNbxUG9hVg==} - engines: {node: '>=12.0.0'} + inquirer@8.2.4: dependencies: ansi-escapes: 4.3.2 chalk: 4.1.2 @@ -5063,11 +8166,8 @@ packages: strip-ansi: 6.0.1 through: 2.3.8 wrap-ansi: 7.0.0 - dev: true - /inquirer@8.2.5: - resolution: {integrity: sha512-QAgPDQMEgrDssk1XiwwHoOGYF9BAbUcc1+j+FhEvaOt8/cKRqyLn0U5qA6F74fGhTMGxf92pOvPBeh29jQJDTQ==} - engines: {node: '>=12.0.0'} + inquirer@8.2.5: dependencies: ansi-escapes: 4.3.2 chalk: 4.1.2 @@ -5084,238 +8184,124 @@ packages: strip-ansi: 6.0.1 through: 2.3.8 wrap-ansi: 7.0.0 - dev: true - /interpret@1.4.0: - resolution: {integrity: sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==} - engines: {node: '>= 0.10'} - dev: true + interpret@1.4.0: {} - /into-stream@6.0.0: - resolution: {integrity: sha512-XHbaOAvP+uFKUFsOgoNPRjLkwB+I22JFPFe5OjTkQ0nwgj6+pSjb4NmB6VMxaPshLiOf+zcpOCBQuLwC1KHhZA==} - engines: {node: '>=10'} + into-stream@6.0.0: dependencies: from2: 2.3.0 p-is-promise: 3.0.0 - dev: false - /invert-kv@1.0.0: - resolution: {integrity: sha512-xgs2NH9AE66ucSq4cNG1nhSFghr5l6tdL15Pk+jl46bmmBapgoaY/AacXyaDznAqmGL99TiLSQgO/XazFSKYeQ==} - engines: {node: '>=0.10.0'} - dev: false + invert-kv@1.0.0: {} - /ip-address@9.0.5: - resolution: {integrity: sha512-zHtQzGojZXTwZTHQqra+ETKd4Sn3vgi7uBmlPoXVWZqYvuKmtI0l/VZTjqGmJY9x88GGOaZ9+G9ES8hC4T4X8g==} - engines: {node: '>= 12'} + ip-address@9.0.5: dependencies: jsbn: 1.1.0 sprintf-js: 1.1.3 - dev: false - /ipaddr.js@1.9.1: - resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==} - engines: {node: '>= 0.10'} - dev: false + ipaddr.js@1.9.1: {} - /is-arrayish@0.2.1: - resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} + is-arrayish@0.2.1: {} - /is-binary-path@2.1.0: - resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} - engines: {node: '>=8'} + is-binary-path@2.1.0: dependencies: binary-extensions: 2.2.0 - dev: true - /is-buffer@1.1.6: - resolution: {integrity: sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==} - dev: false + is-buffer@1.1.6: {} - /is-core-module@2.13.1: - resolution: {integrity: sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==} + is-core-module@2.13.1: dependencies: hasown: 2.0.0 - /is-dotfile@1.0.3: - resolution: {integrity: sha512-9YclgOGtN/f8zx0Pr4FQYMdibBiTaH3sn52vjYip4ZSf6C4/6RfTEZ+MR4GvKhCxdPh21Bg42/WL55f6KSnKpg==} - engines: {node: '>=0.10.0'} - dev: false + is-dotfile@1.0.3: {} - /is-equal-shallow@0.1.3: - resolution: {integrity: sha512-0EygVC5qPvIyb+gSz7zdD5/AAoS6Qrx1e//6N4yv4oNm30kqvdmG66oZFWVlQHUWe5OjP08FuTw2IdT0EOTcYA==} - engines: {node: '>=0.10.0'} + is-equal-shallow@0.1.3: dependencies: is-primitive: 2.0.0 - dev: false - /is-extendable@0.1.1: - resolution: {integrity: sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==} - engines: {node: '>=0.10.0'} - dev: false + is-extendable@0.1.1: {} - /is-extglob@1.0.0: - resolution: {integrity: sha512-7Q+VbVafe6x2T+Tu6NcOf6sRklazEPmBoB3IWk3WdGZM2iGUwU/Oe3Wtq5lSEkDTTlpp8yx+5t4pzO/i9Ty1ww==} - engines: {node: '>=0.10.0'} - dev: false + is-extglob@1.0.0: {} - /is-extglob@2.1.1: - resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} - engines: {node: '>=0.10.0'} + is-extglob@2.1.1: {} - /is-fullwidth-code-point@1.0.0: - resolution: {integrity: sha512-1pqUqRjkhPJ9miNq9SwMfdvi6lBJcd6eFxvfaivQhaH3SgisfiuudvFntdKOmxuee/77l+FPjKrQjWvmPjWrRw==} - engines: {node: '>=0.10.0'} + is-fullwidth-code-point@1.0.0: dependencies: number-is-nan: 1.0.1 - dev: false - /is-fullwidth-code-point@3.0.0: - resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} - engines: {node: '>=8'} + is-fullwidth-code-point@3.0.0: {} - /is-generator-fn@2.1.0: - resolution: {integrity: sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==} - engines: {node: '>=6'} + is-generator-fn@2.1.0: {} - /is-glob@2.0.1: - resolution: {integrity: sha512-a1dBeB19NXsf/E0+FHqkagizel/LQw2DjSQpvQrj3zT+jYPpaUCryPnrQajXKFLCMuf4I6FhRpaGtw4lPrG6Eg==} - engines: {node: '>=0.10.0'} + is-glob@2.0.1: dependencies: is-extglob: 1.0.0 - dev: false - /is-glob@3.1.0: - resolution: {integrity: sha512-UFpDDrPgM6qpnFNI+rh/p3bUaq9hKLZN8bMUWzxmcnZVS3omf4IPK+BrewlnWjO1WmUsMYuSjKh4UJuV4+Lqmw==} - engines: {node: '>=0.10.0'} + is-glob@3.1.0: dependencies: is-extglob: 2.1.1 - dev: false - /is-glob@4.0.3: - resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} - engines: {node: '>=0.10.0'} + is-glob@4.0.3: dependencies: is-extglob: 2.1.1 - dev: true - /is-interactive@1.0.0: - resolution: {integrity: sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==} - engines: {node: '>=8'} + is-interactive@1.0.0: {} - /is-lambda@1.0.1: - resolution: {integrity: sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ==} - dev: false + is-lambda@1.0.1: {} - /is-number@2.1.0: - resolution: {integrity: sha512-QUzH43Gfb9+5yckcrSA0VBDwEtDUchrk4F6tfJZQuNzDJbEDB9cZNzSfXGQ1jqmdDY/kl41lUOWM9syA8z8jlg==} - engines: {node: '>=0.10.0'} + is-number@2.1.0: dependencies: kind-of: 3.2.2 - dev: false - /is-number@4.0.0: - resolution: {integrity: sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==} - engines: {node: '>=0.10.0'} - dev: false + is-number@4.0.0: {} - /is-number@7.0.0: - resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} - engines: {node: '>=0.12.0'} + is-number@7.0.0: {} - /is-obj@2.0.0: - resolution: {integrity: sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==} - engines: {node: '>=8'} - dev: true + is-obj@2.0.0: {} - /is-path-inside@3.0.3: - resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} - engines: {node: '>=8'} - dev: true + is-path-inside@3.0.3: {} - /is-plain-obj@1.1.0: - resolution: {integrity: sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==} - engines: {node: '>=0.10.0'} - dev: true + is-plain-obj@1.1.0: {} - /is-posix-bracket@0.1.1: - resolution: {integrity: sha512-Yu68oeXJ7LeWNmZ3Zov/xg/oDBnBK2RNxwYY1ilNJX+tKKZqgPK+qOn/Gs9jEu66KDY9Netf5XLKNGzas/vPfQ==} - engines: {node: '>=0.10.0'} - dev: false + is-posix-bracket@0.1.1: {} - /is-primitive@2.0.0: - resolution: {integrity: sha512-N3w1tFaRfk3UrPfqeRyD+GYDASU3W5VinKhlORy8EWVf/sIdDL9GAcew85XmktCfH+ngG7SRXEVDoO18WMdB/Q==} - engines: {node: '>=0.10.0'} - dev: false + is-primitive@2.0.0: {} - /is-stream@1.1.0: - resolution: {integrity: sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==} - engines: {node: '>=0.10.0'} - dev: false + is-stream@1.1.0: {} - /is-stream@2.0.1: - resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} - engines: {node: '>=8'} + is-stream@2.0.1: {} - /is-stream@3.0.0: - resolution: {integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - dev: true + is-stream@3.0.0: {} - /is-text-path@1.0.1: - resolution: {integrity: sha512-xFuJpne9oFz5qDaodwmmG08e3CawH/2ZV8Qqza1Ko7Sk8POWbkRdwIoAWVhqvq0XeUzANEhKo2n0IXUGBm7A/w==} - engines: {node: '>=0.10.0'} + is-text-path@1.0.1: dependencies: text-extensions: 1.9.0 - dev: true - /is-text-path@2.0.0: - resolution: {integrity: sha512-+oDTluR6WEjdXEJMnC2z6A4FRwFoYuvShVVEGsS7ewc0UTi2QtAKMDJuL4BDEVt+5T7MjFo12RP8ghOM75oKJw==} - engines: {node: '>=8'} + is-text-path@2.0.0: dependencies: text-extensions: 2.4.0 - dev: true - /is-unicode-supported@0.1.0: - resolution: {integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==} - engines: {node: '>=10'} + is-unicode-supported@0.1.0: {} - /is-utf8@0.2.1: - resolution: {integrity: sha512-rMYPYvCzsXywIsldgLaSoPlw5PfoB/ssr7hY4pLfcodrA5M/eArza1a9VmTiNIBNMjOGr1Ow9mTyU2o69U6U9Q==} + is-utf8@0.2.1: {} - /is-valid-glob@0.3.0: - resolution: {integrity: sha512-CvG8EtJZ8FyzVOGPzrDorzyN65W1Ld8BVnqshRCah6pFIsprGx3dKgFtjLn/Vw9kGqR4OlR84U7yhT9ZVTyWIQ==} - engines: {node: '>=0.10.0'} - dev: false + is-valid-glob@0.3.0: {} - /is-windows@1.0.2: - resolution: {integrity: sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==} - engines: {node: '>=0.10.0'} - dev: true + is-windows@1.0.2: {} - /isarray@0.0.1: - resolution: {integrity: sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==} - dev: false + isarray@0.0.1: {} - /isarray@1.0.0: - resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} + isarray@1.0.0: {} - /isexe@2.0.0: - resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + isexe@2.0.0: {} - /isobject@2.1.0: - resolution: {integrity: sha512-+OUdGJlgjOBZDfxnDjYYG6zp487z0JGNQq3cYQYg5f5hKR+syHMsaztzGeml/4kGG55CSpKSpWTY+jYGgsHLgA==} - engines: {node: '>=0.10.0'} + isobject@2.1.0: dependencies: isarray: 1.0.0 - dev: false - /istanbul-lib-coverage@3.2.2: - resolution: {integrity: sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==} - engines: {node: '>=8'} + istanbul-lib-coverage@3.2.2: {} - /istanbul-lib-instrument@5.2.1: - resolution: {integrity: sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==} - engines: {node: '>=8'} + istanbul-lib-instrument@5.2.1: dependencies: '@babel/core': 7.23.9 '@babel/parser': 7.23.9 @@ -5325,9 +8311,7 @@ packages: transitivePeerDependencies: - supports-color - /istanbul-lib-instrument@6.0.1: - resolution: {integrity: sha512-EAMEJBsYuyyztxMxW3g7ugGPkrZsV57v0Hmv3mm1uQsmB+QnZuepg731CRaIgeUVSdmsTngOkSnauNF8p7FIhA==} - engines: {node: '>=10'} + istanbul-lib-instrument@6.0.1: dependencies: '@babel/core': 7.23.9 '@babel/parser': 7.23.9 @@ -5337,17 +8321,13 @@ packages: transitivePeerDependencies: - supports-color - /istanbul-lib-report@3.0.1: - resolution: {integrity: sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==} - engines: {node: '>=10'} + istanbul-lib-report@3.0.1: dependencies: istanbul-lib-coverage: 3.2.2 make-dir: 4.0.0 supports-color: 7.2.0 - /istanbul-lib-source-maps@4.0.1: - resolution: {integrity: sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==} - engines: {node: '>=10'} + istanbul-lib-source-maps@4.0.1: dependencies: debug: 4.3.4 istanbul-lib-coverage: 3.2.2 @@ -5355,37 +8335,26 @@ packages: transitivePeerDependencies: - supports-color - /istanbul-reports@3.1.6: - resolution: {integrity: sha512-TLgnMkKg3iTDsQ9PbPTdpfAK2DzjF9mqUG7RMgcQl8oFjad8ob4laGxv5XV5U9MAfx8D6tSJiUyuAwzLicaxlg==} - engines: {node: '>=8'} + istanbul-reports@3.1.6: dependencies: html-escaper: 2.0.2 istanbul-lib-report: 3.0.1 - /iterare@1.2.1: - resolution: {integrity: sha512-RKYVTCjAnRthyJes037NX/IiqeidgN1xc3j1RjFfECFp28A1GVwK9nA+i0rJPaHqSZwygLzRnFlzUuHFoWWy+Q==} - engines: {node: '>=6'} + iterare@1.2.1: {} - /jackspeak@2.3.6: - resolution: {integrity: sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==} - engines: {node: '>=14'} + jackspeak@2.3.6: dependencies: '@isaacs/cliui': 8.0.2 optionalDependencies: '@pkgjs/parseargs': 0.11.0 - dev: false - /jest-changed-files@29.7.0: - resolution: {integrity: sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + jest-changed-files@29.7.0: dependencies: execa: 5.1.1 jest-util: 29.7.0 p-limit: 3.1.0 - /jest-circus@29.7.0: - resolution: {integrity: sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + jest-circus@29.7.0: dependencies: '@jest/environment': 29.7.0 '@jest/expect': 29.7.0 @@ -5411,15 +8380,7 @@ packages: - babel-plugin-macros - supports-color - /jest-cli@29.7.0(@types/node@20.3.1)(ts-node@10.9.1): - resolution: {integrity: sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - hasBin: true - peerDependencies: - node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 - peerDependenciesMeta: - node-notifier: - optional: true + jest-cli@29.7.0(@types/node@20.3.1)(ts-node@10.9.1): dependencies: '@jest/core': 29.7.0(ts-node@10.9.1) '@jest/test-result': 29.7.0 @@ -5438,17 +8399,7 @@ packages: - supports-color - ts-node - /jest-config@29.7.0(@types/node@20.3.1)(ts-node@10.9.1): - resolution: {integrity: sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - peerDependencies: - '@types/node': '*' - ts-node: '>=9.0.0' - peerDependenciesMeta: - '@types/node': - optional: true - ts-node: - optional: true + jest-config@29.7.0(@types/node@20.3.1)(ts-node@10.9.1): dependencies: '@babel/core': 7.23.9 '@jest/test-sequencer': 29.7.0 @@ -5478,24 +8429,18 @@ packages: - babel-plugin-macros - supports-color - /jest-diff@29.7.0: - resolution: {integrity: sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + jest-diff@29.7.0: dependencies: chalk: 4.1.2 diff-sequences: 29.6.3 jest-get-type: 29.6.3 pretty-format: 29.7.0 - /jest-docblock@29.7.0: - resolution: {integrity: sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + jest-docblock@29.7.0: dependencies: detect-newline: 3.1.0 - /jest-each@29.7.0: - resolution: {integrity: sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + jest-each@29.7.0: dependencies: '@jest/types': 29.6.3 chalk: 4.1.2 @@ -5503,9 +8448,7 @@ packages: jest-util: 29.7.0 pretty-format: 29.7.0 - /jest-environment-node@29.7.0: - resolution: {integrity: sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + jest-environment-node@29.7.0: dependencies: '@jest/environment': 29.7.0 '@jest/fake-timers': 29.7.0 @@ -5514,13 +8457,9 @@ packages: jest-mock: 29.7.0 jest-util: 29.7.0 - /jest-get-type@29.6.3: - resolution: {integrity: sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - - /jest-haste-map@29.7.0: - resolution: {integrity: sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + jest-get-type@29.6.3: {} + + jest-haste-map@29.7.0: dependencies: '@jest/types': 29.6.3 '@types/graceful-fs': 4.1.9 @@ -5536,25 +8475,19 @@ packages: optionalDependencies: fsevents: 2.3.3 - /jest-leak-detector@29.7.0: - resolution: {integrity: sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + jest-leak-detector@29.7.0: dependencies: jest-get-type: 29.6.3 pretty-format: 29.7.0 - /jest-matcher-utils@29.7.0: - resolution: {integrity: sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + jest-matcher-utils@29.7.0: dependencies: chalk: 4.1.2 jest-diff: 29.7.0 jest-get-type: 29.6.3 pretty-format: 29.7.0 - /jest-message-util@29.7.0: - resolution: {integrity: sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + jest-message-util@29.7.0: dependencies: '@babel/code-frame': 7.23.5 '@jest/types': 29.6.3 @@ -5566,41 +8499,26 @@ packages: slash: 3.0.0 stack-utils: 2.0.6 - /jest-mock@29.7.0: - resolution: {integrity: sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + jest-mock@29.7.0: dependencies: '@jest/types': 29.6.3 '@types/node': 20.3.1 jest-util: 29.7.0 - /jest-pnp-resolver@1.2.3(jest-resolve@29.7.0): - resolution: {integrity: sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==} - engines: {node: '>=6'} - peerDependencies: - jest-resolve: '*' - peerDependenciesMeta: - jest-resolve: - optional: true + jest-pnp-resolver@1.2.3(jest-resolve@29.7.0): dependencies: jest-resolve: 29.7.0 - /jest-regex-util@29.6.3: - resolution: {integrity: sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + jest-regex-util@29.6.3: {} - /jest-resolve-dependencies@29.7.0: - resolution: {integrity: sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + jest-resolve-dependencies@29.7.0: dependencies: jest-regex-util: 29.6.3 jest-snapshot: 29.7.0 transitivePeerDependencies: - supports-color - /jest-resolve@29.7.0: - resolution: {integrity: sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + jest-resolve@29.7.0: dependencies: chalk: 4.1.2 graceful-fs: 4.2.11 @@ -5612,9 +8530,7 @@ packages: resolve.exports: 2.0.2 slash: 3.0.0 - /jest-runner@29.7.0: - resolution: {integrity: sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + jest-runner@29.7.0: dependencies: '@jest/console': 29.7.0 '@jest/environment': 29.7.0 @@ -5640,9 +8556,7 @@ packages: transitivePeerDependencies: - supports-color - /jest-runtime@29.7.0: - resolution: {integrity: sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + jest-runtime@29.7.0: dependencies: '@jest/environment': 29.7.0 '@jest/fake-timers': 29.7.0 @@ -5669,9 +8583,7 @@ packages: transitivePeerDependencies: - supports-color - /jest-snapshot@29.7.0: - resolution: {integrity: sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + jest-snapshot@29.7.0: dependencies: '@babel/core': 7.23.9 '@babel/generator': 7.23.6 @@ -5696,9 +8608,7 @@ packages: transitivePeerDependencies: - supports-color - /jest-util@29.7.0: - resolution: {integrity: sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + jest-util@29.7.0: dependencies: '@jest/types': 29.6.3 '@types/node': 20.3.1 @@ -5707,9 +8617,7 @@ packages: graceful-fs: 4.2.11 picomatch: 2.3.1 - /jest-validate@29.7.0: - resolution: {integrity: sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + jest-validate@29.7.0: dependencies: '@jest/types': 29.6.3 camelcase: 6.3.0 @@ -5718,9 +8626,7 @@ packages: leven: 3.1.0 pretty-format: 29.7.0 - /jest-watcher@29.7.0: - resolution: {integrity: sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + jest-watcher@29.7.0: dependencies: '@jest/test-result': 29.7.0 '@jest/types': 29.6.3 @@ -5731,33 +8637,20 @@ packages: jest-util: 29.7.0 string-length: 4.0.2 - /jest-worker@27.5.1: - resolution: {integrity: sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==} - engines: {node: '>= 10.13.0'} + jest-worker@27.5.1: dependencies: '@types/node': 20.3.1 merge-stream: 2.0.0 supports-color: 8.1.1 - dev: true - /jest-worker@29.7.0: - resolution: {integrity: sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + jest-worker@29.7.0: dependencies: '@types/node': 20.3.1 jest-util: 29.7.0 merge-stream: 2.0.0 supports-color: 8.1.1 - /jest@29.5.0(@types/node@20.3.1)(ts-node@10.9.1): - resolution: {integrity: sha512-juMg3he2uru1QoXX078zTa7pO85QyB9xajZc6bU+d9yEGwrKX6+vGmJQ3UdVZsvTEUARIdObzH68QItim6OSSQ==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - hasBin: true - peerDependencies: - node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 - peerDependenciesMeta: - node-notifier: - optional: true + jest@29.5.0(@types/node@20.3.1)(ts-node@10.9.1): dependencies: '@jest/core': 29.7.0(ts-node@10.9.1) '@jest/types': 29.6.3 @@ -5769,110 +8662,62 @@ packages: - supports-color - ts-node - /jiti@1.21.0: - resolution: {integrity: sha512-gFqAIbuKyyso/3G2qhiO2OM6shY6EPP/R0+mkDbyspxKazh8BXDC5FiFsUjlczgdNz/vfra0da2y+aHrusLG/Q==} - hasBin: true - dev: true + jiti@1.21.0: {} - /joycon@3.1.1: - resolution: {integrity: sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw==} - engines: {node: '>=10'} - dev: false + joycon@3.1.1: {} - /js-tokens@4.0.0: - resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + js-tokens@4.0.0: {} - /js-yaml@3.14.1: - resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==} - hasBin: true + js-yaml@3.14.1: dependencies: argparse: 1.0.10 esprima: 4.0.1 - /js-yaml@4.1.0: - resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} - hasBin: true + js-yaml@4.1.0: dependencies: argparse: 2.0.1 - /jsbn@1.1.0: - resolution: {integrity: sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A==} - dev: false + jsbn@1.1.0: {} - /jsesc@2.5.2: - resolution: {integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==} - engines: {node: '>=4'} - hasBin: true + jsesc@2.5.2: {} - /json-buffer@3.0.1: - resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} - dev: true + json-buffer@3.0.1: {} - /json-parse-better-errors@1.0.2: - resolution: {integrity: sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==} - dev: true + json-parse-better-errors@1.0.2: {} - /json-parse-even-better-errors@2.3.1: - resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} + json-parse-even-better-errors@2.3.1: {} - /json-query@2.2.2: - resolution: {integrity: sha512-y+IcVZSdqNmS4fO8t1uZF6RMMs0xh3SrTjJr9bp1X3+v0Q13+7Cyv12dSmKwDswp/H427BVtpkLWhGxYu3ZWRA==} - dev: true + json-query@2.2.2: {} - /json-schema-ref-resolver@1.0.1: - resolution: {integrity: sha512-EJAj1pgHc1hxF6vo2Z3s69fMjO1INq6eGHXZ8Z6wCQeldCuwxGK9Sxf4/cScGn3FZubCVUehfWtcDM/PLteCQw==} + json-schema-ref-resolver@1.0.1: dependencies: fast-deep-equal: 3.1.3 - dev: false - /json-schema-traverse@0.4.1: - resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} - dev: true + json-schema-traverse@0.4.1: {} - /json-schema-traverse@1.0.0: - resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} + json-schema-traverse@1.0.0: {} - /json-stable-stringify-without-jsonify@1.0.1: - resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} + json-stable-stringify-without-jsonify@1.0.1: {} - /json-stringify-safe@5.0.1: - resolution: {integrity: sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==} - dev: true + json-stringify-safe@5.0.1: {} - /json5@2.2.3: - resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} - engines: {node: '>=6'} - hasBin: true + json5@2.2.3: {} - /jsonc-parser@3.0.0: - resolution: {integrity: sha512-fQzRfAbIBnR0IQvftw9FJveWiHp72Fg20giDrHz6TdfB12UH/uue0D3hm57UB5KgAVuniLMCaS8P1IMj9NR7cA==} - dev: false + jsonc-parser@3.0.0: {} - /jsonc-parser@3.2.0: - resolution: {integrity: sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==} - dev: true + jsonc-parser@3.2.0: {} - /jsonfile@6.1.0: - resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==} + jsonfile@6.1.0: dependencies: universalify: 2.0.1 optionalDependencies: graceful-fs: 4.2.11 - dev: true - /jsonparse@1.3.1: - resolution: {integrity: sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==} - engines: {'0': node >= 0.2.0} - dev: true + jsonparse@1.3.1: {} - /jsonrepair@3.7.0: - resolution: {integrity: sha512-TwE50n4P4gdVfMQF2q+X+IGy4ntFfcuHHE8zjRyBcdtrRK0ORZsjOZD6zmdylk4p277nQBAlHgsEPWtMIQk4LQ==} - hasBin: true - dev: false + jsonrepair@3.7.0: {} - /jsonwebtoken@9.0.2: - resolution: {integrity: sha512-PRp66vJ865SSqOlgqS8hujT5U4AOgMfhrwYIuIhfKaoSCZcirrmASQr8CX7cUg+RMih+hgznrjp99o+W4pJLHQ==} - engines: {node: '>=12', npm: '>=6'} + jsonwebtoken@9.0.2: dependencies: jws: 3.2.2 lodash.includes: 4.3.0 @@ -5884,261 +8729,151 @@ packages: lodash.once: 4.1.1 ms: 2.1.3 semver: 7.6.0 - dev: false - /jwa@1.4.1: - resolution: {integrity: sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==} + jwa@1.4.1: dependencies: buffer-equal-constant-time: 1.0.1 ecdsa-sig-formatter: 1.0.11 safe-buffer: 5.2.1 - dev: false - /jws@3.2.2: - resolution: {integrity: sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==} + jws@3.2.2: dependencies: jwa: 1.4.1 safe-buffer: 5.2.1 - dev: false - /keyv@4.5.4: - resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} + keyv@4.5.4: dependencies: json-buffer: 3.0.1 - dev: true - /kind-of@3.2.2: - resolution: {integrity: sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==} - engines: {node: '>=0.10.0'} + kind-of@3.2.2: dependencies: is-buffer: 1.1.6 - dev: false - /kind-of@6.0.3: - resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==} - engines: {node: '>=0.10.0'} + kind-of@6.0.3: {} - /kleur@3.0.3: - resolution: {integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==} - engines: {node: '>=6'} + kleur@3.0.3: {} - /kleur@4.1.5: - resolution: {integrity: sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==} - engines: {node: '>=6'} - dev: true + kleur@4.1.5: {} - /klona@2.0.6: - resolution: {integrity: sha512-dhG34DXATL5hSxJbIexCft8FChFXtmskoZYnoPWjXQuebWYCNkVeV3KkGegCK9CP1oswI/vQibS2GY7Em/sJJA==} - engines: {node: '>= 8'} - dev: true + klona@2.0.6: {} - /lazy-debug-legacy@0.0.1(debug@2.6.9): - resolution: {integrity: sha512-GFWaIBcBjxWWKI5OghwYEsPOR8JFh2xEcc3ZFV0ONYL0oHz0PHINJCfxJyztUq2XzcHncyO7fsRR550Gtfnk6g==} - peerDependencies: - debug: '*' + lazy-debug-legacy@0.0.1(debug@2.6.9): dependencies: debug: 2.6.9 - dev: false - /lazystream@1.0.1: - resolution: {integrity: sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw==} - engines: {node: '>= 0.6.3'} + lazystream@1.0.1: dependencies: readable-stream: 2.3.8 - dev: false - /lcid@1.0.0: - resolution: {integrity: sha512-YiGkH6EnGrDGqLMITnGjXtGmNtjoXw9SVUzcaos8RBi7Ps0VBylkq+vOcY9QE5poLasPCR849ucFUkl0UzUyOw==} - engines: {node: '>=0.10.0'} + lcid@1.0.0: dependencies: invert-kv: 1.0.0 - dev: false - /leven@3.1.0: - resolution: {integrity: sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==} - engines: {node: '>=6'} + leven@3.1.0: {} - /levn@0.4.1: - resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} - engines: {node: '>= 0.8.0'} + levn@0.4.1: dependencies: prelude-ls: 1.2.1 type-check: 0.4.0 - dev: true - /libphonenumber-js@1.10.58: - resolution: {integrity: sha512-53A0IpJFL9LdHbpeatwizf8KSwPICrqn9H0g3Y7WQ+Jgeu9cQ4Ew3WrRtrLBu/CX2lXd5+rgT01/tGlkbkzOjw==} + libphonenumber-js@1.10.58: {} - /light-my-request@5.12.0: - resolution: {integrity: sha512-P526OX6E7aeCIfw/9UyJNsAISfcFETghysaWHQAlQYayynShT08MOj4c6fBCvTWBrHXSvqBAKDp3amUPSCQI4w==} + light-my-request@5.12.0: dependencies: cookie: 0.6.0 process-warning: 3.0.0 set-cookie-parser: 2.6.0 - dev: false - /lightcookie@1.0.25: - resolution: {integrity: sha512-SrY/+eBPaKAMnsn7mCsoOMZzoQyCyHHHZlFCu2fjo28XxSyCLjlooKiTxyrXTg8NPaHp1YzWi0lcGG1gDi6KHw==} - deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. - dev: true + lightcookie@1.0.25: {} - /lines-and-columns@1.2.4: - resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} + lines-and-columns@1.2.4: {} - /load-json-file@1.1.0: - resolution: {integrity: sha512-cy7ZdNRXdablkXYNI049pthVeXFurRyb9+hA/dZzerZ0pGTx42z+y+ssxBaVV2l70t1muq5IdKhn4UtcoGUY9A==} - engines: {node: '>=0.10.0'} + load-json-file@1.1.0: dependencies: graceful-fs: 4.2.11 parse-json: 2.2.0 pify: 2.3.0 pinkie-promise: 2.0.1 strip-bom: 2.0.0 - dev: false - /load-json-file@4.0.0: - resolution: {integrity: sha512-Kx8hMakjX03tiGTLAIdJ+lL0htKnXjEZN6hk/tozf/WOuYGdZBJrZ+rCJRbVCugsjB3jMLn9746NsQIf5VjBMw==} - engines: {node: '>=4'} + load-json-file@4.0.0: dependencies: graceful-fs: 4.2.11 parse-json: 4.0.0 pify: 3.0.0 strip-bom: 3.0.0 - dev: true - /loader-runner@4.3.0: - resolution: {integrity: sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==} - engines: {node: '>=6.11.5'} - dev: true + loader-runner@4.3.0: {} - /locate-path@2.0.0: - resolution: {integrity: sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA==} - engines: {node: '>=4'} + locate-path@2.0.0: dependencies: p-locate: 2.0.0 path-exists: 3.0.0 - dev: true - /locate-path@3.0.0: - resolution: {integrity: sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==} - engines: {node: '>=6'} + locate-path@3.0.0: dependencies: p-locate: 3.0.0 path-exists: 3.0.0 - dev: true - /locate-path@5.0.0: - resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} - engines: {node: '>=8'} + locate-path@5.0.0: dependencies: p-locate: 4.1.0 - /locate-path@6.0.0: - resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} - engines: {node: '>=10'} + locate-path@6.0.0: dependencies: p-locate: 5.0.0 - dev: true - /locate-path@7.2.0: - resolution: {integrity: sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + locate-path@7.2.0: dependencies: p-locate: 6.0.0 - dev: true - /lodash._reinterpolate@3.0.0: - resolution: {integrity: sha512-xYHt68QRoYGjeeM/XOE1uJtvXQAgvszfBhjV4yvsQH0u2i9I6cI6c6/eG4Hh3UAOVn0y/xAXwmTzEay49Q//HA==} - dev: false + lodash._reinterpolate@3.0.0: {} - /lodash.assign@4.2.0: - resolution: {integrity: sha512-hFuH8TY+Yji7Eja3mGiuAxBqLagejScbG8GbG0j6o9vzn0YL14My+ktnqtZgFTosKymC9/44wP6s7xyuLfnClw==} - dev: false + lodash.assign@4.2.0: {} - /lodash.assigninwith@4.2.0: - resolution: {integrity: sha512-oYOjtZzQnecm7PJcxrDbL20OHv3tTtOQdRBSnlor6s0MO6VOFTOC+JyBIJUNUEzsBi1I0oslWtFAAG6QQbFIWQ==} - dev: false + lodash.assigninwith@4.2.0: {} - /lodash.camelcase@4.3.0: - resolution: {integrity: sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==} - dev: true + lodash.camelcase@4.3.0: {} - /lodash.clonedeep@4.5.0: - resolution: {integrity: sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ==} - dev: false + lodash.clonedeep@4.5.0: {} - /lodash.includes@4.3.0: - resolution: {integrity: sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w==} - dev: false + lodash.includes@4.3.0: {} - /lodash.isboolean@3.0.3: - resolution: {integrity: sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg==} - dev: false + lodash.isboolean@3.0.3: {} - /lodash.isequal@4.5.0: - resolution: {integrity: sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==} - dev: false + lodash.isequal@4.5.0: {} - /lodash.isinteger@4.0.4: - resolution: {integrity: sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA==} - dev: false + lodash.isinteger@4.0.4: {} - /lodash.ismatch@4.4.0: - resolution: {integrity: sha512-fPMfXjGQEV9Xsq/8MTSgUf255gawYRbjwMyDbcvDhXgV7enSZA0hynz6vMPnpAb5iONEzBHBPsT+0zes5Z301g==} - dev: true + lodash.ismatch@4.4.0: {} - /lodash.isnumber@3.0.3: - resolution: {integrity: sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw==} - dev: false + lodash.isnumber@3.0.3: {} - /lodash.isplainobject@4.0.6: - resolution: {integrity: sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==} + lodash.isplainobject@4.0.6: {} - /lodash.isstring@4.0.1: - resolution: {integrity: sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==} - dev: false + lodash.isstring@4.0.1: {} - /lodash.kebabcase@4.1.1: - resolution: {integrity: sha512-N8XRTIMMqqDgSy4VLKPnJ/+hpGZN+PHQiJnSenYqPaVV/NCqEogTnAdZLQiGKhxX+JCs8waWq2t1XHWKOmlY8g==} - dev: true + lodash.kebabcase@4.1.1: {} - /lodash.keys@4.2.0: - resolution: {integrity: sha512-J79MkJcp7Df5mizHiVNpjoHXLi4HLjh9VLS/M7lQSGoQ+0oQ+lWEigREkqKyizPB1IawvQLLKY8mzEcm1tkyxQ==} - dev: false + lodash.keys@4.2.0: {} - /lodash.map@4.6.0: - resolution: {integrity: sha512-worNHGKLDetmcEYDvh2stPCrrQRkP20E4l0iIS7F8EvzMqBBi7ltvFN5m1HvTf1P7Jk1txKhvFcmYsCr8O2F1Q==} - dev: true + lodash.map@4.6.0: {} - /lodash.memoize@4.1.2: - resolution: {integrity: sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==} + lodash.memoize@4.1.2: {} - /lodash.merge@4.6.2: - resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} - dev: true + lodash.merge@4.6.2: {} - /lodash.mergewith@4.6.2: - resolution: {integrity: sha512-GK3g5RPZWTRSeLSpgP8Xhra+pnjBC56q9FZYe1d5RN3TJ35dbkGy3YqBSMbyCrlbi+CM9Z3Jk5yTL7RCsqboyQ==} - dev: true + lodash.mergewith@4.6.2: {} - /lodash.once@4.1.1: - resolution: {integrity: sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==} - dev: false + lodash.once@4.1.1: {} - /lodash.rest@4.0.5: - resolution: {integrity: sha512-hsypEpebNAt0hj1aX9isQqi2CIZoNS1lP6PSWhB3hcMnBivobYzPZRPYq4cr38+RtvrlxQTgaW+sIuHAhBoHrA==} - dev: false + lodash.rest@4.0.5: {} - /lodash.snakecase@4.1.1: - resolution: {integrity: sha512-QZ1d4xoBHYUeuouhEq3lk3Uq7ldgyFXGBhg04+oRLnIz8o9T65Eh+8YdroUwn846zchkA9yDsDl5CVVaV2nqYw==} - dev: true + lodash.snakecase@4.1.1: {} - /lodash.startcase@4.4.0: - resolution: {integrity: sha512-+WKqsK294HMSc2jEbNgpHpd0JfIBhp7rEV4aqXWqFr6AlXov+SlcgB1Fv01y2kGe3Gc8nMW7VA0SrGuSkRfIEg==} - dev: true + lodash.startcase@4.4.0: {} - /lodash.template@4.2.4: - resolution: {integrity: sha512-PmEQ9TtYbeYg6lNwJpSjkp4J4KttYLuKF1C6jeFBidyzbOFu0KvVnLicZBf0sGfScARwgOBqxnV/rWuaqRwang==} + lodash.template@4.2.4: dependencies: lodash._reinterpolate: 3.0.0 lodash.assigninwith: 4.2.0 @@ -6146,97 +8881,59 @@ packages: lodash.rest: 4.0.5 lodash.templatesettings: 4.2.0 lodash.tostring: 4.1.4 - dev: false - /lodash.templatesettings@4.2.0: - resolution: {integrity: sha512-stgLz+i3Aa9mZgnjr/O+v9ruKZsPsndy7qPZOchbqk2cnTU1ZaldKK+v7m54WoKIyxiuMZTKT2H81F8BeAc3ZQ==} + lodash.templatesettings@4.2.0: dependencies: lodash._reinterpolate: 3.0.0 - dev: false - /lodash.tostring@4.1.4: - resolution: {integrity: sha512-xWHJ0LY7cSz/C/4ghNNiYA1Ong0VLdzAzrjDHvOzN+eJHzDEHme2+k+w/9Pk8dtdwcASMUbxN1/mtj6mFI25Ng==} - dev: false + lodash.tostring@4.1.4: {} - /lodash.uniq@4.5.0: - resolution: {integrity: sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==} - dev: true + lodash.uniq@4.5.0: {} - /lodash.upperfirst@4.3.1: - resolution: {integrity: sha512-sReKOYJIJf74dhJONhU4e0/shzi1trVbSWDOhKYE5XV2O+H7Sb2Dihwuc7xWxVl+DgFPyTqIN3zMfT9cq5iWDg==} - dev: true + lodash.upperfirst@4.3.1: {} - /lodash@4.17.21: - resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} + lodash@4.17.21: {} - /log-symbols@4.1.0: - resolution: {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==} - engines: {node: '>=10'} + log-symbols@4.1.0: dependencies: chalk: 4.1.2 is-unicode-supported: 0.1.0 - /longest@2.0.1: - resolution: {integrity: sha512-Ajzxb8CM6WAnFjgiloPsI3bF+WCxcvhdIG3KNA2KN962+tdBsHcuQ4k4qX/EcS/2CRkcc0iAkR956Nib6aXU/Q==} - engines: {node: '>=0.10.0'} - dev: true + longest@2.0.1: {} - /lru-cache@10.2.0: - resolution: {integrity: sha512-2bIM8x+VAf6JT4bKAljS1qUWgMsqZRPGJS6FSahIMPVvctcNhyVp7AJu7quxOW9jwkryBReKZY5tY5JYv2n/7Q==} - engines: {node: 14 || >=16.14} + lru-cache@10.2.0: {} - /lru-cache@5.1.1: - resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} + lru-cache@5.1.1: dependencies: yallist: 3.1.1 - /lru-cache@6.0.0: - resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} - engines: {node: '>=10'} + lru-cache@6.0.0: dependencies: yallist: 4.0.0 - /lru-cache@7.18.3: - resolution: {integrity: sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==} - engines: {node: '>=12'} - dev: false + lru-cache@7.18.3: {} - /macos-release@2.5.1: - resolution: {integrity: sha512-DXqXhEM7gW59OjZO8NIjBCz9AQ1BEMrfiOAl4AYByHCtVHRF4KoGNO8mqQeM8lRCtQe/UnJ4imO/d2HdkKsd+A==} - engines: {node: '>=6'} - dev: true + macos-release@2.5.1: {} - /magic-string@0.25.7: - resolution: {integrity: sha512-4CrMT5DOHTDk4HYDlzmwu4FVCcIYI8gauveasrdCu2IKIFOJ3f0v/8MDGJCDL9oD2ppz/Av1b0Nj345H9M+XIA==} + magic-string@0.25.7: dependencies: sourcemap-codec: 1.4.8 - dev: false - /magic-string@0.30.0: - resolution: {integrity: sha512-LA+31JYDJLs82r2ScLrlz1GjSgu66ZV518eyWT+S8VhyQn/JL0u9MeBOvQMGYiPk1DBiSN9DDMOcXvigJZaViQ==} - engines: {node: '>=12'} + magic-string@0.30.0: dependencies: '@jridgewell/sourcemap-codec': 1.4.15 - dev: true - /make-dir@3.1.0: - resolution: {integrity: sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==} - engines: {node: '>=8'} + make-dir@3.1.0: dependencies: semver: 6.3.1 - /make-dir@4.0.0: - resolution: {integrity: sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==} - engines: {node: '>=10'} + make-dir@4.0.0: dependencies: semver: 7.6.0 - /make-error@1.3.6: - resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} + make-error@1.3.6: {} - /make-fetch-happen@10.2.1: - resolution: {integrity: sha512-NgOPbRiaQM10DYXvN3/hhGVI2M5MtITFryzBGxHM5p4wnFxsVCbxkrBrDsk+EZ5OB4jEOT7AjDxtdF+KVEFT7w==} - engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + make-fetch-happen@10.2.1: dependencies: agentkeepalive: 4.5.0 cacache: 16.1.3 @@ -6257,53 +8954,30 @@ packages: transitivePeerDependencies: - bluebird - supports-color - dev: false - /makeerror@1.0.12: - resolution: {integrity: sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==} + makeerror@1.0.12: dependencies: tmpl: 1.0.5 - /map-obj@1.0.1: - resolution: {integrity: sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==} - engines: {node: '>=0.10.0'} - dev: true + map-obj@1.0.1: {} - /map-obj@4.3.0: - resolution: {integrity: sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==} - engines: {node: '>=8'} - dev: true + map-obj@4.3.0: {} - /map-stream@0.0.6: - resolution: {integrity: sha512-RG9wAgznUY0foT30MMfnXh4jS0ObmOuxoGKe/ppYvM55RfquNdIvEEf6e+euczNVVzJIVbkgxg7GJBpYDhQ/Zg==} - dev: false + map-stream@0.0.6: {} - /matchit@1.1.0: - resolution: {integrity: sha512-+nGYoOlfHmxe5BW5tE0EMJppXEwdSf8uBA1GTZC7Q77kbT35+VKLYJMzVNWCHSsga1ps1tPYFtFyvxvKzWVmMA==} - engines: {node: '>=6'} + matchit@1.1.0: dependencies: '@arr/every': 1.0.1 - dev: true - /math-random@1.0.4: - resolution: {integrity: sha512-rUxjysqif/BZQH2yhd5Aaq7vXMSx9NdEsQcyA07uEzIvxgI7zIr33gGsh+RU0/XjmQpCW7RsVof1vlkvQVCK5A==} - dev: false + math-random@1.0.4: {} - /memfs@3.5.3: - resolution: {integrity: sha512-UERzLsxzllchadvbPs5aolHh65ISpKpM+ccLbOJ8/vvpBKmAWf+la7dXFy7Mr0ySHbdHrFv5kGFCUHHe6GFEmw==} - engines: {node: '>= 4.0.0'} + memfs@3.5.3: dependencies: fs-monkey: 1.0.5 - dev: true - /meow@12.1.1: - resolution: {integrity: sha512-BhXM0Au22RwUneMPwSCnyhTOizdWoIEPU9sp0Aqa1PnDMR5Wv2FGXYDjuzJEIX+Eo2Rb8xuYe5jrnm5QowQFkw==} - engines: {node: '>=16.10'} - dev: true + meow@12.1.1: {} - /meow@8.1.2: - resolution: {integrity: sha512-r85E3NdZ+mpYk1C6RjPFEMSE+s1iZMuHtsHAqY0DT3jZczl0diWUZ8g6oU7h0M9cD2EL+PzaYghhCLzR0ZNn5Q==} - engines: {node: '>=10'} + meow@8.1.2: dependencies: '@types/minimist': 1.2.5 camelcase-keys: 6.2.2 @@ -6316,34 +8990,20 @@ packages: trim-newlines: 3.0.1 type-fest: 0.18.1 yargs-parser: 20.2.9 - dev: true - /merge-stream@1.0.1: - resolution: {integrity: sha512-e6RM36aegd4f+r8BZCcYXlO2P3H6xbUM6ktL2Xmf45GAOit9bI4z6/3VU7JwllVO1L7u0UDSg/EhzQ5lmMLolA==} + merge-stream@1.0.1: dependencies: readable-stream: 2.3.8 - dev: false - /merge-stream@2.0.0: - resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} + merge-stream@2.0.0: {} - /merge2@1.4.1: - resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} - engines: {node: '>= 8'} - dev: true + merge2@1.4.1: {} - /merge@2.1.1: - resolution: {integrity: sha512-jz+Cfrg9GWOZbQAnDQ4hlVnQky+341Yk5ru8bZSe6sIDTCIg8n9i/u7hSQGSVOF3C7lH6mGtqjkiT9G4wFLL0w==} - dev: true + merge@2.1.1: {} - /methods@1.1.2: - resolution: {integrity: sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==} - engines: {node: '>= 0.6'} - dev: true + methods@1.1.2: {} - /micromatch@2.3.11: - resolution: {integrity: sha512-LnU2XFEk9xxSJ6rfgAry/ty5qwUTyHYOBU0g4R6tIw5ljwgGIBmiKhRWLw5NpMOnrgUNcDJ4WMp8rl3sYVHLNA==} - engines: {node: '>=0.10.0'} + micromatch@2.3.11: dependencies: arr-diff: 2.0.0 array-unique: 0.2.1 @@ -6358,188 +9018,108 @@ packages: object.omit: 2.0.1 parse-glob: 3.0.4 regex-cache: 0.4.4 - dev: false - /micromatch@4.0.5: - resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} - engines: {node: '>=8.6'} + micromatch@4.0.5: dependencies: braces: 3.0.2 picomatch: 2.3.1 - /mime-db@1.52.0: - resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} - engines: {node: '>= 0.6'} + mime-db@1.52.0: {} - /mime-lite@1.0.3: - resolution: {integrity: sha512-V85l97zJSTG8FEvmdTlmNYb0UMrVBwvRjw7bWTf/aT6KjFwtz3iTz8D2tuFIp7lwiaO2C5ecnrEmSkkMRCrqVw==} - dev: true + mime-lite@1.0.3: {} - /mime-types@2.1.35: - resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} - engines: {node: '>= 0.6'} + mime-types@2.1.35: dependencies: mime-db: 1.52.0 - /mime@2.6.0: - resolution: {integrity: sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==} - engines: {node: '>=4.0.0'} - hasBin: true - dev: true + mime@2.6.0: {} - /mime@3.0.0: - resolution: {integrity: sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==} - engines: {node: '>=10.0.0'} - hasBin: true - dev: false + mime@3.0.0: {} - /mimic-fn@2.1.0: - resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} - engines: {node: '>=6'} + mimic-fn@2.1.0: {} - /mimic-fn@4.0.0: - resolution: {integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==} - engines: {node: '>=12'} - dev: true + mimic-fn@4.0.0: {} - /min-indent@1.0.1: - resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==} - engines: {node: '>=4'} - dev: true + min-indent@1.0.1: {} - /minimatch@3.1.2: - resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + minimatch@3.1.2: dependencies: brace-expansion: 1.1.11 - /minimatch@5.1.6: - resolution: {integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==} - engines: {node: '>=10'} + minimatch@5.1.6: dependencies: brace-expansion: 2.0.1 - dev: false - /minimatch@8.0.4: - resolution: {integrity: sha512-W0Wvr9HyFXZRGIDgCicunpQ299OKXs9RgZfaukz4qAW/pJhcpUfupc9c+OObPOFueNy8VSrZgEmDtk6Kh4WzDA==} - engines: {node: '>=16 || 14 >=14.17'} + minimatch@8.0.4: dependencies: brace-expansion: 2.0.1 - dev: true - /minimatch@9.0.3: - resolution: {integrity: sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==} - engines: {node: '>=16 || 14 >=14.17'} + minimatch@9.0.3: dependencies: brace-expansion: 2.0.1 - dev: false - /minimist-options@4.1.0: - resolution: {integrity: sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==} - engines: {node: '>= 6'} + minimist-options@4.1.0: dependencies: arrify: 1.0.1 is-plain-obj: 1.1.0 kind-of: 6.0.3 - dev: true - /minimist@1.2.7: - resolution: {integrity: sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g==} - dev: true + minimist@1.2.7: {} - /minimist@1.2.8: - resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} + minimist@1.2.8: {} - /minipass-collect@1.0.2: - resolution: {integrity: sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==} - engines: {node: '>= 8'} + minipass-collect@1.0.2: dependencies: minipass: 3.3.6 - dev: false - /minipass-fetch@2.1.2: - resolution: {integrity: sha512-LT49Zi2/WMROHYoqGgdlQIZh8mLPZmOrN2NdJjMXxYe4nkN6FUyuPuOAOedNJDrx0IRGg9+4guZewtp8hE6TxA==} - engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + minipass-fetch@2.1.2: dependencies: minipass: 3.3.6 minipass-sized: 1.0.3 minizlib: 2.1.2 optionalDependencies: encoding: 0.1.13 - dev: false - /minipass-flush@1.0.5: - resolution: {integrity: sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==} - engines: {node: '>= 8'} + minipass-flush@1.0.5: dependencies: minipass: 3.3.6 - dev: false - /minipass-pipeline@1.2.4: - resolution: {integrity: sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==} - engines: {node: '>=8'} + minipass-pipeline@1.2.4: dependencies: minipass: 3.3.6 - dev: false - /minipass-sized@1.0.3: - resolution: {integrity: sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==} - engines: {node: '>=8'} + minipass-sized@1.0.3: dependencies: minipass: 3.3.6 - dev: false - /minipass@3.3.6: - resolution: {integrity: sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==} - engines: {node: '>=8'} + minipass@3.3.6: dependencies: yallist: 4.0.0 - /minipass@4.2.8: - resolution: {integrity: sha512-fNzuVyifolSLFL4NzpF+wEF4qrgqaaKX0haXPQEdQ7NKAN+WecoKMHV09YcuL/DHxrUsYQOK3MiuDf7Ip2OXfQ==} - engines: {node: '>=8'} - dev: true + minipass@4.2.8: {} - /minipass@5.0.0: - resolution: {integrity: sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==} - engines: {node: '>=8'} + minipass@5.0.0: {} - /minipass@7.0.4: - resolution: {integrity: sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==} - engines: {node: '>=16 || 14 >=14.17'} + minipass@7.0.4: {} - /minizlib@2.1.2: - resolution: {integrity: sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==} - engines: {node: '>= 8'} + minizlib@2.1.2: dependencies: minipass: 3.3.6 yallist: 4.0.0 - /mkdirp@0.5.6: - resolution: {integrity: sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==} - hasBin: true + mkdirp@0.5.6: dependencies: minimist: 1.2.8 - dev: false - /mkdirp@1.0.4: - resolution: {integrity: sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==} - engines: {node: '>=10'} - hasBin: true + mkdirp@1.0.4: {} - /mnemonist@0.39.6: - resolution: {integrity: sha512-A/0v5Z59y63US00cRSLiloEIw3t5G+MiKz4BhX21FI+YBJXBOGW0ohFxTxO08dsOYlzxo87T7vGfZKYp2bcAWA==} + mnemonist@0.39.6: dependencies: obliterator: 2.0.4 - dev: false - /modify-values@1.0.1: - resolution: {integrity: sha512-xV2bxeN6F7oYjZWTe/YPAy6MN2M+sL4u/Rlm2AHCIVGfo2p1yGmBHQ6vHehl4bRTZBdHu3TSkWdYgkwpYzAGSw==} - engines: {node: '>=0.10.0'} - dev: true + modify-values@1.0.1: {} - /module@1.2.5: - resolution: {integrity: sha512-Y+j9HcHf8V6YtNBkLbPmREAUi5xGbAdb9ycXpo2roABDPrJEzd79kmoH5Ib9lpxcNVsHWa1LhRZJcflUq2+N3w==} - hasBin: true + module@1.2.5: dependencies: chalk: 1.1.3 concat-stream: 1.5.1 @@ -6550,94 +9130,47 @@ packages: yargs: 4.6.0 transitivePeerDependencies: - supports-color - dev: false - /ms@2.0.0: - resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==} - dev: false + ms@2.0.0: {} - /ms@2.1.2: - resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} + ms@2.1.2: {} - /ms@2.1.3: - resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} - dev: false + ms@2.1.3: {} - /mute-stream@0.0.8: - resolution: {integrity: sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==} - dev: true + mute-stream@0.0.8: {} - /nan@2.19.0: - resolution: {integrity: sha512-nO1xXxfh/RWNxfd/XPfbIfFk5vgLsAxUR9y5O0cHMJu/AW9U95JLXqthYHjEp+8gQ5p96K9jUp8nbVOxCdRbtw==} - dev: false + nan@2.19.0: {} - /nanoid@3.3.7: - resolution: {integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==} - engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} - hasBin: true - dev: false + nanoid@3.3.7: {} - /natural-compare-lite@1.4.0: - resolution: {integrity: sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==} - dev: true + natural-compare-lite@1.4.0: {} - /natural-compare@1.4.0: - resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} + natural-compare@1.4.0: {} - /negotiator@0.6.3: - resolution: {integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==} - engines: {node: '>= 0.6'} - dev: false + negotiator@0.6.3: {} - /neo-async@2.6.2: - resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} - dev: true + neo-async@2.6.2: {} - /nestjs-cls@4.2.0(@nestjs/common@10.0.0)(@nestjs/core@10.0.0)(reflect-metadata@0.1.13)(rxjs@7.8.1): - resolution: {integrity: sha512-sdvdhBmM9eb9d1URtcK7642S3ufD9ZWaKRt4Ouf1gIGmd73YniiKCxxOFwChRqDU+sr7hwxT560JaA27R/7RJQ==} - engines: {node: '>=16'} - peerDependencies: - '@nestjs/common': '> 7.0.0 < 11' - '@nestjs/core': '> 7.0.0 < 11' - reflect-metadata: '*' - rxjs: '>= 7' + nestjs-cls@4.2.0(@nestjs/common@10.0.0)(@nestjs/core@10.0.0)(reflect-metadata@0.1.13)(rxjs@7.8.1): dependencies: '@nestjs/common': 10.0.0(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.1.13)(rxjs@7.8.1) '@nestjs/core': 10.0.0(@nestjs/common@10.0.0)(reflect-metadata@0.1.13)(rxjs@7.8.1) reflect-metadata: 0.1.13 rxjs: 7.8.1 - dev: false - /nestjs-oauth2@0.0.7(@nestjs/common@10.0.0)(rxjs@7.8.1): - resolution: {integrity: sha512-P4HfJziGsMl4+aTclr9vkqfbI84odja1kOjKZw095A+b4ksVczOC4J/AH4BydsIAPVsj/5RJj4aGFoWV90Bu1w==} - peerDependencies: - '@nestjs/common': ^9.0.0 - rxjs: ^7.x + nestjs-oauth2@0.0.7(@nestjs/common@10.0.0)(rxjs@7.8.1): dependencies: '@golevelup/nestjs-modules': 0.6.1(@nestjs/common@10.0.0)(rxjs@7.8.1) '@nestjs/common': 10.0.0(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.1.13)(rxjs@7.8.1) oauth: 0.10.0 rxjs: 7.8.1 - dev: false - /nestjs-pino@4.0.0(@nestjs/common@10.0.0)(pino-http@9.0.0): - resolution: {integrity: sha512-XhCg/R+l3w0BFP6MHyR6lU/BHVEV0tV9z24G0vuA9FD3sv+TQNvnO9uVsF1l/oVspgGfQ9Qulmb2UbsfYlI0+g==} - engines: {node: '>= 14'} - requiresBuild: true - peerDependencies: - '@nestjs/common': ^8.0.0 || ^9.0.0 || ^10.0.0 - pino-http: ^6.4.0 || ^7.0.0 || ^8.0.0 || ^9.0.0 + nestjs-pino@4.0.0(@nestjs/common@10.0.0)(pino-http@9.0.0): dependencies: '@nestjs/common': 10.0.0(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.1.13)(rxjs@7.8.1) pino-http: 9.0.0 - dev: false - /nestjs-prisma@0.23.0(@nestjs/common@10.0.0)(@prisma/client@5.10.2)(prisma@5.10.2): - resolution: {integrity: sha512-0pIMDasayP+vMFSztcs85zu4WSPTKM85F8vIrqn7GsUBboEcKhI8eCeVghhNyKDGzEBaNAYNJlo2MAWdNuN7Tw==} - peerDependencies: - '@nestjs/common': ^7.0.0 || ^8.0.0 || ^9.0.0 || ^10.0.0 - '@prisma/client': ^2.0.0 || ^3.0.0 || ^4.0.0 || ^5.0.0 - prisma: ^2.0.0 || ^3.0.0 || ^4.0.0 || ^5.0.0 + nestjs-prisma@0.23.0(@nestjs/common@10.0.0)(@prisma/client@5.10.2)(prisma@5.10.2): dependencies: '@angular-devkit/core': 13.3.11 '@angular-devkit/schematics': 13.3.11 @@ -6647,37 +9180,20 @@ packages: prisma: 5.10.2 transitivePeerDependencies: - chokidar - dev: false - /node-abort-controller@3.1.1: - resolution: {integrity: sha512-AGK2yQKIjRuqnc6VkX2Xj5d+QW8xZ87pa1UK6yA6ouUyuxfHuMP6umE5QK7UmTeOAymo+Zx1Fxiuw9rVx8taHQ==} - dev: true + node-abort-controller@3.1.1: {} - /node-addon-api@5.1.0: - resolution: {integrity: sha512-eh0GgfEkpnoWDq+VY8OyvYhFEzBk6jIYbRKdIlyTiAXIVJ8PyBaKb0rp7oDtoddbdoHWhq8wwr+XZ81F1rpNdA==} - dev: false + node-addon-api@5.1.0: {} - /node-emoji@1.11.0: - resolution: {integrity: sha512-wo2DpQkQp7Sjm2A0cq+sN7EHKO6Sl0ctXeBdFZrL9T9+UywORbufTcTZxom8YqpLQt/FqNMUkOpkZrJVYSKD3A==} + node-emoji@1.11.0: dependencies: lodash: 4.17.21 - dev: true - /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-fetch@2.7.0: dependencies: whatwg-url: 5.0.0 - /node-gyp@9.4.1: - resolution: {integrity: sha512-OQkWKbjQKbGkMf/xqI1jjy3oCTgMKJac58G2+bjZb3fza6gW2YrCSdMQYaoTb70crvE//Gngr4f0AgVHmqHvBQ==} - engines: {node: ^12.13 || ^14.13 || >=16} - hasBin: true + node-gyp@9.4.1: dependencies: env-paths: 2.2.1 exponential-backoff: 3.1.1 @@ -6693,158 +9209,97 @@ packages: transitivePeerDependencies: - bluebird - supports-color - dev: false - /node-int64@0.4.0: - resolution: {integrity: sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==} + node-int64@0.4.0: {} - /node-releases@2.0.14: - resolution: {integrity: sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==} + node-releases@2.0.14: {} - /nopt@5.0.0: - resolution: {integrity: sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==} - engines: {node: '>=6'} - hasBin: true + nopt@5.0.0: dependencies: abbrev: 1.1.1 - dev: false - /nopt@6.0.0: - resolution: {integrity: sha512-ZwLpbTgdhuZUnZzjd7nb1ZV+4DoiC6/sfiVKok72ym/4Tlf+DFdlHYmT2JPmcNNWV6Pi3SDf1kT+A4r9RTuT9g==} - engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} - hasBin: true + nopt@6.0.0: dependencies: abbrev: 1.1.1 - dev: false - /normalize-package-data@2.5.0: - resolution: {integrity: sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==} + normalize-package-data@2.5.0: dependencies: hosted-git-info: 2.8.9 resolve: 1.22.8 semver: 5.7.2 validate-npm-package-license: 3.0.4 - /normalize-package-data@3.0.3: - resolution: {integrity: sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==} - engines: {node: '>=10'} + normalize-package-data@3.0.3: dependencies: hosted-git-info: 4.1.0 is-core-module: 2.13.1 semver: 7.6.0 validate-npm-package-license: 3.0.4 - dev: true - /normalize-path@2.1.1: - resolution: {integrity: sha512-3pKJwH184Xo/lnH6oyP1q2pMd7HcypqqmRs91/6/i2CGtWwIKGCkOOMTm/zXbgTEWHw1uNpNi/igc3ePOYHb6w==} - engines: {node: '>=0.10.0'} + normalize-path@2.1.1: dependencies: remove-trailing-separator: 1.1.0 - dev: false - /normalize-path@3.0.0: - resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} - engines: {node: '>=0.10.0'} + normalize-path@3.0.0: {} - /npm-run-path@4.0.1: - resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} - engines: {node: '>=8'} + npm-run-path@4.0.1: dependencies: path-key: 3.1.1 - /npm-run-path@5.3.0: - resolution: {integrity: sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + npm-run-path@5.3.0: dependencies: path-key: 4.0.0 - dev: true - /npmlog@5.0.1: - resolution: {integrity: sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==} + npmlog@5.0.1: dependencies: are-we-there-yet: 2.0.0 console-control-strings: 1.1.0 gauge: 3.0.2 set-blocking: 2.0.0 - dev: false - /npmlog@6.0.2: - resolution: {integrity: sha512-/vBvz5Jfr9dT/aFWd0FIRf+T/Q2WBsLENygUaFUqstqsycmZAP/t5BvFJTK0viFmSUxiUKTUplWy5vt+rvKIxg==} - engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + npmlog@6.0.2: dependencies: are-we-there-yet: 3.0.1 console-control-strings: 1.1.0 gauge: 4.0.4 set-blocking: 2.0.0 - dev: false - /number-is-nan@1.0.1: - resolution: {integrity: sha512-4jbtZXNAsfZbAHiiqjLPBiCl16dES1zI4Hpzzxw61Tk+loF+sBDBKx1ICKKKwIqQ7M0mFn1TmkN7euSncWgHiQ==} - engines: {node: '>=0.10.0'} - dev: false + number-is-nan@1.0.1: {} - /oauth@0.10.0: - resolution: {integrity: sha512-1orQ9MT1vHFGQxhuy7E/0gECD3fd2fCC+PIX+/jgmU/gI3EpRocXtmtvxCO5x3WZ443FLTLFWNDjl5MPJf9u+Q==} - dev: false + oauth@0.10.0: {} - /object-assign@4.1.0: - resolution: {integrity: sha512-Lbc7GfN7XFaK30bzUN3cDYLOkT0dH05S0ax1QikylHUD9+Z9PRF3G1iYwX3kcz+6AlzTFGkUgMxz6l3aUwbwTA==} - engines: {node: '>=0.10.0'} - dev: false + object-assign@4.1.0: {} - /object-assign@4.1.1: - resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} - engines: {node: '>=0.10.0'} - dev: false + object-assign@4.1.1: {} - /object-inspect@1.13.1: - resolution: {integrity: sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==} - dev: true + object-inspect@1.13.1: {} - /object.omit@2.0.1: - resolution: {integrity: sha512-UiAM5mhmIuKLsOvrL+B0U2d1hXHF3bFYWIuH1LMpuV2EJEHG1Ntz06PgLEHjm6VFd87NpH8rastvPoyv6UW2fA==} - engines: {node: '>=0.10.0'} + object.omit@2.0.1: dependencies: for-own: 0.1.5 is-extendable: 0.1.1 - dev: false - /obliterator@2.0.4: - resolution: {integrity: sha512-lgHwxlxV1qIg1Eap7LgIeoBWIMFibOjbrYPIPJZcI1mmGAI2m3lNYpK12Y+GBdPQ0U1hRwSord7GIaawz962qQ==} - dev: false + obliterator@2.0.4: {} - /on-exit-leak-free@2.1.2: - resolution: {integrity: sha512-0eJJY6hXLGf1udHwfNftBqH+g73EU4B504nZeKpz1sYRKafAghwxEJunB2O7rDZkL4PGfsMVnTXZ2EjibbqcsA==} - engines: {node: '>=14.0.0'} - dev: false + on-exit-leak-free@2.1.2: {} - /once@1.4.0: - resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + once@1.4.0: dependencies: wrappy: 1.0.2 - /onetime@5.1.2: - resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} - engines: {node: '>=6'} + onetime@5.1.2: dependencies: mimic-fn: 2.1.0 - /onetime@6.0.0: - resolution: {integrity: sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==} - engines: {node: '>=12'} + onetime@6.0.0: dependencies: mimic-fn: 4.0.0 - dev: true - /openapi-fuzzer-core@1.0.6: - resolution: {integrity: sha512-FJNJIfgUFuv4NmVGq9MYdoKra2GrkDy2uhIjE2YGlw30UA1glf4SXLMhI4UwdcJ8jisKdIxi7lXrfej8GvNW5w==} + openapi-fuzzer-core@1.0.6: dependencies: klona: 2.0.6 - dev: true - /optionator@0.9.3: - resolution: {integrity: sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==} - engines: {node: '>= 0.8.0'} + optionator@0.9.3: dependencies: '@aashutoshrathi/word-wrap': 1.2.6 deep-is: 0.1.4 @@ -6852,11 +9307,8 @@ packages: levn: 0.4.1 prelude-ls: 1.2.1 type-check: 0.4.0 - dev: true - /ora@5.4.1: - resolution: {integrity: sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==} - engines: {node: '>=10'} + ora@5.4.1: dependencies: bl: 4.1.0 chalk: 4.1.2 @@ -6868,126 +9320,73 @@ packages: strip-ansi: 6.0.1 wcwidth: 1.0.1 - /ordered-read-streams@0.3.0: - resolution: {integrity: sha512-xQvd8qvx9U1iYY9aVqPpoF5V9uaWJKV6ZGljkh/jkiNX0DiQsjbWvRumbh10QTMDE8DheaOEU8xi0szbrgjzcw==} + ordered-read-streams@0.3.0: dependencies: is-stream: 1.1.0 readable-stream: 2.3.8 - dev: false - /os-homedir@1.0.2: - resolution: {integrity: sha512-B5JU3cabzk8c67mRRd3ECmROafjYMXbuzlwtqdM8IbS8ktlTix8aFGb2bAGKrSRIlnfKwovGUUr72JUPyOb6kQ==} - engines: {node: '>=0.10.0'} - dev: false + os-homedir@1.0.2: {} - /os-locale@1.4.0: - resolution: {integrity: sha512-PRT7ZORmwu2MEFt4/fv3Q+mEfN4zetKxufQrkShY2oGvUms9r8otu5HfdyIFHkYXjO7laNsoVGmM2MANfuTA8g==} - engines: {node: '>=0.10.0'} + os-locale@1.4.0: dependencies: lcid: 1.0.0 - dev: false - /os-name@4.0.1: - resolution: {integrity: sha512-xl9MAoU97MH1Xt5K9ERft2YfCAoaO6msy1OBA0ozxEC0x0TmIoE6K3QvgJMMZA9yKGLmHXNY/YZoDbiGDj4zYw==} - engines: {node: '>=10'} + os-name@4.0.1: dependencies: macos-release: 2.5.1 windows-release: 4.0.0 - dev: true - /os-tmpdir@1.0.2: - resolution: {integrity: sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==} - engines: {node: '>=0.10.0'} - dev: true + os-tmpdir@1.0.2: {} - /p-is-promise@3.0.0: - resolution: {integrity: sha512-Wo8VsW4IRQSKVXsJCn7TomUaVtyfjVDn3nUP7kE967BQk0CwFpdbZs0X0uk5sW9mkBa9eNM7hCMaG93WUAwxYQ==} - engines: {node: '>=8'} - dev: false + p-is-promise@3.0.0: {} - /p-limit@1.3.0: - resolution: {integrity: sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==} - engines: {node: '>=4'} + p-limit@1.3.0: dependencies: p-try: 1.0.0 - dev: true - /p-limit@2.3.0: - resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} - engines: {node: '>=6'} + p-limit@2.3.0: dependencies: p-try: 2.2.0 - /p-limit@3.1.0: - resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} - engines: {node: '>=10'} + p-limit@3.1.0: dependencies: yocto-queue: 0.1.0 - /p-limit@4.0.0: - resolution: {integrity: sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + p-limit@4.0.0: dependencies: yocto-queue: 1.0.0 - dev: true - /p-locate@2.0.0: - resolution: {integrity: sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg==} - engines: {node: '>=4'} + p-locate@2.0.0: dependencies: p-limit: 1.3.0 - dev: true - /p-locate@3.0.0: - resolution: {integrity: sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==} - engines: {node: '>=6'} + p-locate@3.0.0: dependencies: p-limit: 2.3.0 - dev: true - /p-locate@4.1.0: - resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} - engines: {node: '>=8'} + p-locate@4.1.0: dependencies: p-limit: 2.3.0 - /p-locate@5.0.0: - resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} - engines: {node: '>=10'} + p-locate@5.0.0: dependencies: p-limit: 3.1.0 - dev: true - /p-locate@6.0.0: - resolution: {integrity: sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + p-locate@6.0.0: dependencies: p-limit: 4.0.0 - dev: true - /p-map@4.0.0: - resolution: {integrity: sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==} - engines: {node: '>=10'} + p-map@4.0.0: dependencies: aggregate-error: 3.1.0 - dev: false - /p-try@1.0.0: - resolution: {integrity: sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww==} - engines: {node: '>=4'} - dev: true + p-try@1.0.0: {} - /p-try@2.2.0: - resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} - engines: {node: '>=6'} + p-try@2.2.0: {} - /pactum-matchers@1.1.6: - resolution: {integrity: sha512-55io32NeOKbLpHKKPzYDOr+N2dseTzMbj1Gj1y+zvOkKK6NDf5BT5pxglfqLN/ra3ig5zvbrKFUqZIWjAWboog==} - dev: true + pactum-matchers@1.1.6: {} - /pactum@3.6.3: - resolution: {integrity: sha512-iAizqD9sgJsVVKm0sBzDm2ZjqBMJBr/ZTbKOYawfT014EsoSIzuHIsolpslRKsHlru6MFwlg530XrEpaBmElrA==} - engines: {node: '>=10'} + pactum@3.6.3: dependencies: '@exodus/schemasafe': 1.3.0 deep-override: 1.0.2 @@ -7000,229 +9399,135 @@ packages: parse-graphql: 1.0.0 phin: 3.7.0 polka: 0.5.2 - dev: true - /parent-module@1.0.1: - resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} - engines: {node: '>=6'} + parent-module@1.0.1: dependencies: callsites: 3.1.0 - dev: true - /parse-glob@3.0.4: - resolution: {integrity: sha512-FC5TeK0AwXzq3tUBFtH74naWkPQCEWs4K+xMxWZBlKDWu0bVHXGZa+KKqxKidd7xwhdZ19ZNuF2uO1M/r196HA==} - engines: {node: '>=0.10.0'} + parse-glob@3.0.4: dependencies: glob-base: 0.3.0 is-dotfile: 1.0.3 is-extglob: 1.0.0 is-glob: 2.0.1 - dev: false - /parse-graphql@1.0.0: - resolution: {integrity: sha512-NjvQHHaiPCxPZrhm/kKnorxOv7r/eA+tE0VW5E8iJMH9wTqFA1V0YK/7nbpxVu3JdXUxyWTKMez9lsHUtAwa0w==} - dev: true + parse-graphql@1.0.0: {} - /parse-json@2.2.0: - resolution: {integrity: sha512-QR/GGaKCkhwk1ePQNYDRKYZ3mwU9ypsKhB0XyFnLQdomyEqk3e8wpW3V5Jp88zbxK4n5ST1nqo+g9juTpownhQ==} - engines: {node: '>=0.10.0'} + parse-json@2.2.0: dependencies: error-ex: 1.3.2 - dev: false - /parse-json@4.0.0: - resolution: {integrity: sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==} - engines: {node: '>=4'} + parse-json@4.0.0: dependencies: error-ex: 1.3.2 json-parse-better-errors: 1.0.2 - dev: true - /parse-json@5.2.0: - resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} - engines: {node: '>=8'} + parse-json@5.2.0: dependencies: '@babel/code-frame': 7.23.5 error-ex: 1.3.2 json-parse-even-better-errors: 2.3.1 lines-and-columns: 1.2.4 - /parse-passwd@1.0.0: - resolution: {integrity: sha512-1Y1A//QUXEZK7YKz+rD9WydcE1+EuPr6ZBgKecAB8tmoW6UFv0NREVJe1p+jRxtThkcbbKkfwIbWJe/IeE6m2Q==} - engines: {node: '>=0.10.0'} - dev: true + parse-passwd@1.0.0: {} - /passport-jwt@4.0.1: - resolution: {integrity: sha512-UCKMDYhNuGOBE9/9Ycuoyh7vP6jpeTp/+sfMJl7nLff/t6dps+iaeE0hhNkKN8/HZHcJ7lCdOyDxHdDoxoSvdQ==} + passport-jwt@4.0.1: dependencies: jsonwebtoken: 9.0.2 passport-strategy: 1.0.0 - dev: false - /passport-local@1.0.0: - resolution: {integrity: sha512-9wCE6qKznvf9mQYYbgJ3sVOHmCWoUNMVFoZzNoznmISbhnNNPhN9xfY3sLmScHMetEJeoY7CXwfhCe7argfQow==} - engines: {node: '>= 0.4.0'} + passport-local@1.0.0: dependencies: passport-strategy: 1.0.0 - dev: false - /passport-strategy@1.0.0: - resolution: {integrity: sha512-CB97UUvDKJde2V0KDWWB3lyf6PC3FaZP7YxZ2G8OAtn9p4HI9j9JLP9qjOGZFvyl8uwNT8qM+hGnz/n16NI7oA==} - engines: {node: '>= 0.4.0'} - dev: false + passport-strategy@1.0.0: {} - /passport@0.7.0: - resolution: {integrity: sha512-cPLl+qZpSc+ireUvt+IzqbED1cHHkDoVYMo30jbJIdOOjQ1MQYZBPiNvmi8UM6lJuOpTPXJGZQk0DtC4y61MYQ==} - engines: {node: '>= 0.4.0'} + passport@0.7.0: dependencies: passport-strategy: 1.0.0 pause: 0.0.1 utils-merge: 1.0.1 - dev: false - /path-dirname@1.0.2: - resolution: {integrity: sha512-ALzNPpyNq9AqXMBjeymIjFDAkAFH06mHJH/cSBHAgU0s4vfpBn6b2nf8tiRLvagKD8RbTpq2FKTBg7cl9l3c7Q==} - dev: false + path-dirname@1.0.2: {} - /path-exists@2.1.0: - resolution: {integrity: sha512-yTltuKuhtNeFJKa1PiRzfLAU5182q1y4Eb4XCJ3PBqyzEDkAZRzBrKKBct682ls9reBVHf9udYLN5Nd+K1B9BQ==} - engines: {node: '>=0.10.0'} + path-exists@2.1.0: dependencies: pinkie-promise: 2.0.1 - dev: false - /path-exists@3.0.0: - resolution: {integrity: sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==} - engines: {node: '>=4'} - dev: true + path-exists@3.0.0: {} - /path-exists@4.0.0: - resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} - engines: {node: '>=8'} + path-exists@4.0.0: {} - /path-exists@5.0.0: - resolution: {integrity: sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - dev: true + path-exists@5.0.0: {} - /path-is-absolute@1.0.1: - resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} - engines: {node: '>=0.10.0'} + path-is-absolute@1.0.1: {} - /path-key@3.1.1: - resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} - engines: {node: '>=8'} + path-key@3.1.1: {} - /path-key@4.0.0: - resolution: {integrity: sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==} - engines: {node: '>=12'} - dev: true + path-key@4.0.0: {} - /path-parse@1.0.7: - resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + path-parse@1.0.7: {} - /path-scurry@1.10.1: - resolution: {integrity: sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ==} - engines: {node: '>=16 || 14 >=14.17'} + path-scurry@1.10.1: dependencies: lru-cache: 10.2.0 minipass: 7.0.4 - /path-to-regexp@3.2.0: - resolution: {integrity: sha512-jczvQbCUS7XmS7o+y1aEO9OBVFeZBQ1MDSEqmO7xSoPgOPoowY/SxLpZ6Vh97/8qHZOteiCKb7gkG9gA2ZUxJA==} + path-to-regexp@3.2.0: {} - /path-to-regexp@6.2.1: - resolution: {integrity: sha512-JLyh7xT1kizaEvcaXOQwOc2/Yhw6KZOvPf1S8401UyLk86CU79LN3vl7ztXGm/pZ+YjoyAJ4rxmHwbkBXJX+yw==} - dev: false + path-to-regexp@6.2.1: {} - /path-type@1.1.0: - resolution: {integrity: sha512-S4eENJz1pkiQn9Znv33Q+deTOKmbl+jj1Fl+qiP/vYezj+S8x+J3Uo0ISrx/QoEvIlOaDWJhPaRd1flJ9HXZqg==} - engines: {node: '>=0.10.0'} + path-type@1.1.0: dependencies: graceful-fs: 4.2.11 pify: 2.3.0 pinkie-promise: 2.0.1 - dev: false - /path-type@3.0.0: - resolution: {integrity: sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==} - engines: {node: '>=4'} + path-type@3.0.0: dependencies: pify: 3.0.0 - dev: true - /path-type@4.0.0: - resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} - engines: {node: '>=8'} - dev: true + path-type@4.0.0: {} - /pause@0.0.1: - resolution: {integrity: sha512-KG8UEiEVkR3wGEb4m5yZkVCzigAD+cVEJck2CzYZO37ZGJfctvVptVO192MwrtPhzONn6go8ylnOdMhKqi4nfg==} - dev: false + pause@0.0.1: {} - /peek-stream@1.1.3: - resolution: {integrity: sha512-FhJ+YbOSBb9/rIl2ZeE/QHEsWn7PqNYt8ARAY3kIgNGOk13g9FGyIY6JIl/xB/3TFRVoTv5as0l11weORrTekA==} + peek-stream@1.1.3: dependencies: buffer-from: 1.1.2 duplexify: 3.7.1 through2: 2.0.5 - dev: false - /phin@3.7.0: - resolution: {integrity: sha512-DqnVNrpYhKGBZppNKprD+UJylMeEKOZxHgPB+ZP6mGzf3uA2uox4Ep9tUm+rUc8WLIdHT3HcAE4X8fhwQA9JKg==} - engines: {node: '>= 8'} - deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. + phin@3.7.0: dependencies: centra: 2.6.0 - dev: true - /picocolors@1.0.0: - resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} + picocolors@1.0.0: {} - /picomatch@2.3.1: - resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} - engines: {node: '>=8.6'} + picomatch@2.3.1: {} - /pify@2.3.0: - resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==} - engines: {node: '>=0.10.0'} + pify@2.3.0: {} - /pify@3.0.0: - resolution: {integrity: sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==} - engines: {node: '>=4'} - dev: true + pify@3.0.0: {} - /pinkie-promise@2.0.1: - resolution: {integrity: sha512-0Gni6D4UcLTbv9c57DfxDGdr41XfgUjqWZu492f0cIGr16zDU06BWP/RAEvOuo7CQ0CNjHaLlM59YJJFm3NWlw==} - engines: {node: '>=0.10.0'} + pinkie-promise@2.0.1: dependencies: pinkie: 2.0.4 - dev: false - /pinkie@2.0.4: - resolution: {integrity: sha512-MnUuEycAemtSaeFSjXKW/aroV7akBbY+Sv+RkyqFjgAe73F+MR0TBWKBRDkmfWq/HiFmdavfZ1G7h4SPZXaCSg==} - engines: {node: '>=0.10.0'} - dev: false + pinkie@2.0.4: {} - /pino-abstract-transport@1.1.0: - resolution: {integrity: sha512-lsleG3/2a/JIWUtf9Q5gUNErBqwIu1tUKTT3dUzaf5DySw9ra1wcqKjJjLX1VTY64Wk1eEOYsVGSaGfCK85ekA==} + pino-abstract-transport@1.1.0: dependencies: readable-stream: 4.5.2 split2: 4.2.0 - dev: false - /pino-http@9.0.0: - resolution: {integrity: sha512-Q9QDNEz0vQmbJtMFjOVr2c9yL92vHudjmr3s3m6J1hbw3DBGFZJm3TIj9TWyynZ4GEsEA9SOtni4heRUr6lNOg==} + pino-http@9.0.0: dependencies: get-caller-file: 2.0.5 pino: 8.18.0 pino-std-serializers: 6.2.2 process-warning: 3.0.0 - dev: false - /pino-pretty@10.3.1: - resolution: {integrity: sha512-az8JbIYeN/1iLj2t0jR9DV48/LQ3RC6hZPpapKPkb84Q+yTidMCpgWxIT3N0flnBDilyBQ1luWNpOeJptjdp/g==} - hasBin: true + pino-pretty@10.3.1: dependencies: colorette: 2.0.20 dateformat: 4.6.3 @@ -7238,15 +9543,10 @@ packages: secure-json-parse: 2.7.0 sonic-boom: 3.8.0 strip-json-comments: 3.1.1 - dev: false - /pino-std-serializers@6.2.2: - resolution: {integrity: sha512-cHjPPsE+vhj/tnhCy/wiMh3M3z3h/j15zHQX+S9GkTBgqJuTuJzYJ4gUyACLhDaJ7kk9ba9iRDmbH2tJU03OiA==} - dev: false + pino-std-serializers@6.2.2: {} - /pino@8.18.0: - resolution: {integrity: sha512-Mz/gKiRyuXu4HnpHgi1YWdHQCoWMufapzooisvFn78zl4dZciAxS+YeRkUxXl1ee/SzU80YCz1zpECCh4oC6Aw==} - hasBin: true + pino@8.18.0: dependencies: atomic-sleep: 1.0.0 fast-redact: 3.3.0 @@ -7259,294 +9559,173 @@ packages: safe-stable-stringify: 2.4.3 sonic-boom: 3.8.0 thread-stream: 2.4.1 - dev: false - /pirates@4.0.6: - resolution: {integrity: sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==} - engines: {node: '>= 6'} + pirates@4.0.6: {} - /pkg-conf@1.1.3: - resolution: {integrity: sha512-9hHgE5+Xai/ChrnahNP8Ke0VNF/s41IZIB/d24eMHEaRamdPg+wwlRm2lTb5wMvE8eTIKrYZsrxfuOwt3dpsIQ==} - engines: {node: '>=0.10.0'} + pkg-conf@1.1.3: dependencies: find-up: 1.1.2 load-json-file: 1.1.0 object-assign: 4.1.1 symbol: 0.2.3 - dev: false - /pkg-dir@4.2.0: - resolution: {integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==} - engines: {node: '>=8'} + pkg-dir@4.2.0: dependencies: find-up: 4.1.0 - /pluralize-esm@9.0.5: - resolution: {integrity: sha512-Kb2dcpMsIutFw2hYrN0EhsAXOUJTd6FVMIxvNAkZCMQLVt9NGZqQczvGpYDxNWCZeCWLHUPxQIBudWzt1h7VVA==} - engines: {node: '>=14.0.0'} - dev: true + pluralize-esm@9.0.5: {} - /pluralize@8.0.0: - resolution: {integrity: sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==} - engines: {node: '>=4'} - dev: true + pluralize@8.0.0: {} - /polka@0.5.2: - resolution: {integrity: sha512-FVg3vDmCqP80tOrs+OeNlgXYmFppTXdjD5E7I4ET1NjvtNmQrb1/mJibybKkb/d4NA7YWAr1ojxuhpL3FHqdlw==} + polka@0.5.2: dependencies: '@polka/url': 0.5.0 trouter: 2.0.1 - dev: true - /prelude-ls@1.2.1: - resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} - engines: {node: '>= 0.8.0'} - dev: true + prelude-ls@1.2.1: {} - /preserve@0.2.0: - resolution: {integrity: sha512-s/46sYeylUfHNjI+sA/78FAHlmIuKqI9wNnzEOGehAlUUYeObv5C2mOinXBjyUyWmJ2SfcS2/ydApH4hTF4WXQ==} - engines: {node: '>=0.10.0'} - dev: false + preserve@0.2.0: {} - /prettier-linter-helpers@1.0.0: - resolution: {integrity: sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==} - engines: {node: '>=6.0.0'} + prettier-linter-helpers@1.0.0: dependencies: fast-diff: 1.3.0 - dev: true - /prettier@2.8.8: - resolution: {integrity: sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==} - engines: {node: '>=10.13.0'} - hasBin: true - dev: true + prettier@2.8.8: {} - /prettier@3.0.0: - resolution: {integrity: sha512-zBf5eHpwHOGPC47h0zrPyNn+eAEIdEzfywMoYn2XPi0P44Zp0tSq64rq0xAREh4auw2cJZHo9QUob+NqCQky4g==} - engines: {node: '>=14'} - hasBin: true - dev: true + prettier@3.0.0: {} - /pretty-format@29.7.0: - resolution: {integrity: sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + pretty-format@29.7.0: dependencies: '@jest/schemas': 29.6.3 ansi-styles: 5.2.0 react-is: 18.2.0 - /prisma-nested-middleware@4.0.0(@prisma/client@5.10.2): - resolution: {integrity: sha512-WSx0nl7KNXEzGaNC87fuDBOdAjj3V6um/JoQUo24PaMzMy8tvOYfb2Mw25OZhnrMXNTBhqgk4rJTUW3CVcDsHQ==} - peerDependencies: - '@prisma/client': '*' + prisma-nested-middleware@4.0.0(@prisma/client@5.10.2): dependencies: '@open-draft/deferred-promise': 2.2.0 '@prisma/client': 5.10.2(prisma@5.10.2) lodash: 4.17.21 - dev: false - /prisma-soft-delete-middleware@1.3.1(@prisma/client@5.10.2): - resolution: {integrity: sha512-oQ2Ba8wb23ho6PqMXkOSTQTXNKouLmZuILYDHrnKk1Ui3cGIXuj9zNWyJkoaTcWHznsiAaoP1Oy8ytDhwQNQqA==} - peerDependencies: - '@prisma/client': '*' + prisma-soft-delete-middleware@1.3.1(@prisma/client@5.10.2): dependencies: '@prisma/client': 5.10.2(prisma@5.10.2) prisma-nested-middleware: 4.0.0(@prisma/client@5.10.2) - dev: false - /prisma@5.10.2: - resolution: {integrity: sha512-hqb/JMz9/kymRE25pMWCxkdyhbnIWrq+h7S6WysJpdnCvhstbJSNP/S6mScEcqiB8Qv2F+0R3yG+osRaWqZacQ==} - engines: {node: '>=16.13'} - hasBin: true - requiresBuild: true + prisma@5.10.2: dependencies: '@prisma/engines': 5.10.2 - /process-nextick-args@1.0.7: - resolution: {integrity: sha512-yN0WQmuCX63LP/TMvAg31nvT6m4vDqJEiiv2CAZqWOGNWutc9DfDk1NPYYmKUFmaVM2UwDowH4u5AHWYP/jxKw==} - dev: false - - /process-nextick-args@2.0.1: - resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} - - /process-warning@3.0.0: - resolution: {integrity: sha512-mqn0kFRl0EoqhnL0GQ0veqFHyIN1yig9RHh/InzORTUiZHFRAur+aMtRkELNwGs9aNwKS6tg/An4NYBPGwvtzQ==} - dev: false - - /process@0.11.10: - resolution: {integrity: sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==} - engines: {node: '>= 0.6.0'} - dev: false - - /promise-coalesce@1.1.2: - resolution: {integrity: sha512-zLaJ9b8hnC564fnJH6NFSOGZYYdzrAJn2JUUIwzoQb32fG2QAakpDNM+CZo1km6keXkRXRM+hml1BFAPVnPkxg==} - engines: {node: '>=16'} - dev: false - - /promise-inflight@1.0.1: - resolution: {integrity: sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==} - peerDependencies: - bluebird: '*' - peerDependenciesMeta: - bluebird: - optional: true - dev: false + process-nextick-args@1.0.7: {} - /promise-retry@2.0.1: - resolution: {integrity: sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==} - engines: {node: '>=10'} + process-nextick-args@2.0.1: {} + + process-warning@3.0.0: {} + + process@0.11.10: {} + + promise-coalesce@1.1.2: {} + + promise-inflight@1.0.1: {} + + promise-retry@2.0.1: dependencies: err-code: 2.0.3 retry: 0.12.0 - dev: false - /prompts@2.4.2: - resolution: {integrity: sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==} - engines: {node: '>= 6'} + prompts@2.4.2: dependencies: kleur: 3.0.3 sisteransi: 1.0.5 - /proxy-addr@2.0.7: - resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==} - engines: {node: '>= 0.10'} + proxy-addr@2.0.7: dependencies: forwarded: 0.2.0 ipaddr.js: 1.9.1 - dev: false - /proxy-from-env@1.1.0: - resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} - dev: false + proxy-from-env@1.1.0: {} - /pump@3.0.0: - resolution: {integrity: sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==} + pump@3.0.0: dependencies: end-of-stream: 1.4.4 once: 1.4.0 - /pumpify@2.0.1: - resolution: {integrity: sha512-m7KOje7jZxrmutanlkS1daj1dS6z6BgslzOXmcSEpIlCxM3VJH7lG5QLeck/6hgF6F4crFf01UtQmNsJfweTAw==} + pumpify@2.0.1: dependencies: duplexify: 4.1.2 inherits: 2.0.4 pump: 3.0.0 - dev: false - /punycode@2.3.1: - resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} - engines: {node: '>=6'} + punycode@2.3.1: {} - /pure-rand@6.0.4: - resolution: {integrity: sha512-LA0Y9kxMYv47GIPJy6MI84fqTd2HmYZI83W/kM/SkKfDlajnZYfmXFTxkbY+xSBPkLJxltMa9hIkmdc29eguMA==} + pure-rand@6.0.4: {} - /q@1.5.1: - resolution: {integrity: sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==} - engines: {node: '>=0.6.0', teleport: '>=0.2.0'} - dev: true + q@1.5.1: {} - /qs@6.11.2: - resolution: {integrity: sha512-tDNIz22aBzCDxLtVH++VnTfzxlfeK5CbqohpSqpJgj1Wg/cQbStNAz3NuqCs5vV+pjBsK4x4pN9HlVh7rcYRiA==} - engines: {node: '>=0.6'} + qs@6.11.2: dependencies: side-channel: 1.0.5 - dev: true - /queue-microtask@1.2.3: - resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} - dev: true + queue-microtask@1.2.3: {} - /quick-format-unescaped@4.0.4: - resolution: {integrity: sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg==} - dev: false + quick-format-unescaped@4.0.4: {} - /quick-lru@4.0.1: - resolution: {integrity: sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==} - engines: {node: '>=8'} - dev: true + quick-lru@4.0.1: {} - /randomatic@3.1.1: - resolution: {integrity: sha512-TuDE5KxZ0J461RVjrJZCJc+J+zCkTb1MbH9AQUq68sMhOMcy9jLcb3BrZKgp9q9Ncltdg4QVqWrH02W2EFFVYw==} - engines: {node: '>= 0.10.0'} + randomatic@3.1.1: dependencies: is-number: 4.0.0 kind-of: 6.0.3 math-random: 1.0.4 - dev: false - /randombytes@2.1.0: - resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} + randombytes@2.1.0: dependencies: safe-buffer: 5.2.1 - dev: true - /react-is@18.2.0: - resolution: {integrity: sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==} + react-is@18.2.0: {} - /read-pkg-up@1.0.1: - resolution: {integrity: sha512-WD9MTlNtI55IwYUS27iHh9tK3YoIVhxis8yKhLpTqWtml739uXc9NWTpxoHkfZf3+DkCCsXox94/VWZniuZm6A==} - engines: {node: '>=0.10.0'} + read-pkg-up@1.0.1: dependencies: find-up: 1.1.2 read-pkg: 1.1.0 - dev: false - /read-pkg-up@3.0.0: - resolution: {integrity: sha512-YFzFrVvpC6frF1sz8psoHDBGF7fLPc+llq/8NB43oagqWkx8ar5zYtsTORtOjw9W2RHLpWP+zTWwBvf1bCmcSw==} - engines: {node: '>=4'} + read-pkg-up@3.0.0: dependencies: find-up: 2.1.0 read-pkg: 3.0.0 - dev: true - /read-pkg-up@7.0.1: - resolution: {integrity: sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==} - engines: {node: '>=8'} + read-pkg-up@7.0.1: dependencies: find-up: 4.1.0 read-pkg: 5.2.0 type-fest: 0.8.1 - dev: true - /read-pkg@1.1.0: - resolution: {integrity: sha512-7BGwRHqt4s/uVbuyoeejRn4YmFnYZiFl4AuaeXHlgZf3sONF0SOGlxs2Pw8g6hCKupo08RafIO5YXFNOKTfwsQ==} - engines: {node: '>=0.10.0'} + read-pkg@1.1.0: dependencies: load-json-file: 1.1.0 normalize-package-data: 2.5.0 path-type: 1.1.0 - dev: false - /read-pkg@3.0.0: - resolution: {integrity: sha512-BLq/cCO9two+lBgiTYNqD6GdtK8s4NpaWrl6/rCO9w0TUS8oJl7cmToOZfRYllKTISY6nt1U7jQ53brmKqY6BA==} - engines: {node: '>=4'} + read-pkg@3.0.0: dependencies: load-json-file: 4.0.0 normalize-package-data: 2.5.0 path-type: 3.0.0 - dev: true - /read-pkg@5.2.0: - resolution: {integrity: sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==} - engines: {node: '>=8'} + read-pkg@5.2.0: dependencies: '@types/normalize-package-data': 2.4.4 normalize-package-data: 2.5.0 parse-json: 5.2.0 type-fest: 0.6.0 - dev: true - /readable-stream@1.0.34: - resolution: {integrity: sha512-ok1qVCJuRkNmvebYikljxJA/UEsKwLl2nI1OmaqAu4/UE+h0wKCHok4XkL/gvi39OacXvw59RJUOFUkDib2rHg==} + readable-stream@1.0.34: dependencies: core-util-is: 1.0.3 inherits: 2.0.4 isarray: 0.0.1 string_decoder: 0.10.31 - dev: false - /readable-stream@2.0.6: - resolution: {integrity: sha512-TXcFfb63BQe1+ySzsHZI/5v1aJPCShfqvWJ64ayNImXMsN1Cd0YGk/wm8KB7/OeessgPc9QvS9Zou8QTkFzsLw==} + readable-stream@2.0.6: dependencies: core-util-is: 1.0.3 inherits: 2.0.4 @@ -7554,10 +9733,8 @@ packages: process-nextick-args: 1.0.7 string_decoder: 0.10.31 util-deprecate: 1.0.2 - dev: false - /readable-stream@2.3.8: - resolution: {integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==} + readable-stream@2.3.8: dependencies: core-util-is: 1.0.3 inherits: 2.0.4 @@ -7567,259 +9744,150 @@ packages: string_decoder: 1.1.1 util-deprecate: 1.0.2 - /readable-stream@3.6.2: - resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} - engines: {node: '>= 6'} + readable-stream@3.6.2: dependencies: inherits: 2.0.4 string_decoder: 1.3.0 util-deprecate: 1.0.2 - /readable-stream@4.5.2: - resolution: {integrity: sha512-yjavECdqeZ3GLXNgRXgeQEdz9fvDDkNKyHnbHRFtOr7/LcfgBcmct7t/ET+HaCTqfh06OzoAxrkN/IfjJBVe+g==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + readable-stream@4.5.2: dependencies: abort-controller: 3.0.0 buffer: 6.0.3 events: 3.3.0 process: 0.11.10 string_decoder: 1.3.0 - dev: false - /readdirp@3.6.0: - resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} - engines: {node: '>=8.10.0'} + readdirp@3.6.0: dependencies: picomatch: 2.3.1 - dev: true - /real-require@0.2.0: - resolution: {integrity: sha512-57frrGM/OCTLqLOAh0mhVA9VBMHd+9U7Zb2THMGdBUoZVOtGbJzjxsYGDJ3A9AYYCP4hn6y1TVbaOfzWtm5GFg==} - engines: {node: '>= 12.13.0'} - dev: false + real-require@0.2.0: {} - /rechoir@0.6.2: - resolution: {integrity: sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==} - engines: {node: '>= 0.10'} + rechoir@0.6.2: dependencies: resolve: 1.22.8 - dev: true - /redent@3.0.0: - resolution: {integrity: sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==} - engines: {node: '>=8'} + redent@3.0.0: dependencies: indent-string: 4.0.0 strip-indent: 3.0.0 - dev: true - /reflect-metadata@0.1.13: - resolution: {integrity: sha512-Ts1Y/anZELhSsjMcU605fU9RE4Oi3p5ORujwbIKXfWa+0Zxs510Qrmrce5/Jowq3cHSZSJqBjypxmHarc+vEWg==} + reflect-metadata@0.1.13: {} - /regex-cache@0.4.4: - resolution: {integrity: sha512-nVIZwtCjkC9YgvWkpM55B5rBhBYRZhAaJbgcFYXXsHnbZ9UZI9nnVWYZpBlCqv9ho2eZryPnWrZGsOdPwVWXWQ==} - engines: {node: '>=0.10.0'} + regex-cache@0.4.4: dependencies: is-equal-shallow: 0.1.3 - dev: false - /remove-trailing-separator@1.1.0: - resolution: {integrity: sha512-/hS+Y0u3aOfIETiaiirUFwDBDzmXPvO+jAfKTitUngIPzdKc6Z0LoFjM/CK5PL4C+eKwHohlHAb6H0VFfmmUsw==} - dev: false + remove-trailing-separator@1.1.0: {} - /repeat-element@1.1.4: - resolution: {integrity: sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ==} - engines: {node: '>=0.10.0'} - dev: false + repeat-element@1.1.4: {} - /repeat-string@1.6.1: - resolution: {integrity: sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==} - engines: {node: '>=0.10'} + repeat-string@1.6.1: {} - /replace-ext@0.0.1: - resolution: {integrity: sha512-AFBWBy9EVRTa/LhEcG8QDP3FvpwZqmvN2QFDuJswFeaVhWnZMp8q3E6Zd90SR04PlIwfGdyVjNyLPyen/ek5CQ==} - engines: {node: '>= 0.4'} - dev: false + replace-ext@0.0.1: {} - /require-directory@2.1.1: - resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} - engines: {node: '>=0.10.0'} + require-directory@2.1.1: {} - /require-from-string@2.0.2: - resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} - engines: {node: '>=0.10.0'} + require-from-string@2.0.2: {} - /require-main-filename@1.0.1: - resolution: {integrity: sha512-IqSUtOVP4ksd1C/ej5zeEh/BIP2ajqpn8c5x+q99gvcIG/Qf0cud5raVnE/Dwd0ua9TXYDoDc0RE5hBSdz22Ug==} - dev: false + require-main-filename@1.0.1: {} - /resolve-cwd@3.0.0: - resolution: {integrity: sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==} - engines: {node: '>=8'} + resolve-cwd@3.0.0: dependencies: resolve-from: 5.0.0 - /resolve-dir@1.0.1: - resolution: {integrity: sha512-R7uiTjECzvOsWSfdM0QKFNBVFcK27aHOUwdvK53BcW8zqnGdYp0Fbj82cy54+2A4P2tFM22J5kRfe1R+lM/1yg==} - engines: {node: '>=0.10.0'} + resolve-dir@1.0.1: dependencies: expand-tilde: 2.0.2 global-modules: 1.0.0 - dev: true - /resolve-from@4.0.0: - resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} - engines: {node: '>=4'} - dev: true + resolve-from@4.0.0: {} - /resolve-from@5.0.0: - resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} - engines: {node: '>=8'} + resolve-from@5.0.0: {} - /resolve-url@0.2.1: - resolution: {integrity: sha512-ZuF55hVUQaaczgOIwqWzkEcEidmlD/xl44x1UZnhOXcYuFN2S6+rcxpG+C1N3So0wvNI3DmJICUFfu2SxhBmvg==} - deprecated: https://github.com/lydell/resolve-url#deprecated - dev: false + resolve-url@0.2.1: {} - /resolve.exports@2.0.2: - resolution: {integrity: sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg==} - engines: {node: '>=10'} + resolve.exports@2.0.2: {} - /resolve@1.22.8: - resolution: {integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==} - hasBin: true + resolve@1.22.8: dependencies: is-core-module: 2.13.1 path-parse: 1.0.7 supports-preserve-symlinks-flag: 1.0.0 - /restore-cursor@3.1.0: - resolution: {integrity: sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==} - engines: {node: '>=8'} + restore-cursor@3.1.0: dependencies: onetime: 5.1.2 signal-exit: 3.0.7 - /ret@0.2.2: - resolution: {integrity: sha512-M0b3YWQs7R3Z917WRQy1HHA7Ba7D8hvZg6UE5mLykJxQVE2ju0IXbGlaHPPlkY+WN7wFP+wUMXmBFA0aV6vYGQ==} - engines: {node: '>=4'} - dev: false + ret@0.2.2: {} - /retry@0.12.0: - resolution: {integrity: sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==} - engines: {node: '>= 4'} - dev: false + retry@0.12.0: {} - /reusify@1.0.4: - resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} - engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + reusify@1.0.4: {} - /rfdc@1.3.1: - resolution: {integrity: sha512-r5a3l5HzYlIC68TpmYKlxWjmOP6wiPJ1vWv2HeLhNsRZMrCkxeqxiHlQ21oXmQ4F3SiryXBHhAD7JZqvOJjFmg==} - dev: false + rfdc@1.3.1: {} - /rimraf@3.0.2: - resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} - hasBin: true + rimraf@3.0.2: dependencies: glob: 7.2.3 - /rimraf@4.4.1: - resolution: {integrity: sha512-Gk8NlF062+T9CqNGn6h4tls3k6T1+/nXdOcSZVikNVtlRdYpA7wRJJMoXmuvOnLW844rPjdQ7JgXCYM6PPC/og==} - engines: {node: '>=14'} - hasBin: true + rimraf@4.4.1: dependencies: glob: 9.3.5 - dev: true - /run-async@2.4.1: - resolution: {integrity: sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==} - engines: {node: '>=0.12.0'} - dev: true + run-async@2.4.1: {} - /run-parallel@1.2.0: - resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + run-parallel@1.2.0: dependencies: queue-microtask: 1.2.3 - dev: true - /rxjs@6.6.7: - resolution: {integrity: sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==} - engines: {npm: '>=2.0.0'} + rxjs@6.6.7: dependencies: tslib: 1.14.1 - dev: false - /rxjs@7.8.1: - resolution: {integrity: sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==} + rxjs@7.8.1: dependencies: tslib: 2.6.2 - /safe-buffer@5.1.2: - resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} + safe-buffer@5.1.2: {} - /safe-buffer@5.2.1: - resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + safe-buffer@5.2.1: {} - /safe-regex2@2.0.0: - resolution: {integrity: sha512-PaUSFsUaNNuKwkBijoAPHAK6/eM6VirvyPWlZ7BAQy4D+hCvh4B6lIG+nPdhbFfIbP+gTGBcrdsOaUs0F+ZBOQ==} + safe-regex2@2.0.0: dependencies: ret: 0.2.2 - dev: false - /safe-stable-stringify@2.4.3: - resolution: {integrity: sha512-e2bDA2WJT0wxseVd4lsDP4+3ONX6HpMXQa1ZhFQ7SU+GjvORCmShbCMltrtIDfkYhVHrOcPtj+KhmDBdPdZD1g==} - engines: {node: '>=10'} - dev: false + safe-stable-stringify@2.4.3: {} - /safer-buffer@2.1.2: - resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} + safer-buffer@2.1.2: {} - /schema-utils@3.3.0: - resolution: {integrity: sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==} - engines: {node: '>= 10.13.0'} + schema-utils@3.3.0: dependencies: '@types/json-schema': 7.0.15 ajv: 6.12.6 ajv-keywords: 3.5.2(ajv@6.12.6) - dev: true - /secure-json-parse@2.7.0: - resolution: {integrity: sha512-6aU+Rwsezw7VR8/nyvKTx8QpWH9FrcYiXXlqC4z5d5XQBDRqtbfsRjnwGyqbi3gddNtWHuEk9OANUotL26qKUw==} - dev: false + secure-json-parse@2.7.0: {} - /semver@5.7.2: - resolution: {integrity: sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==} - hasBin: true + semver@5.7.2: {} - /semver@6.3.1: - resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} - hasBin: true + semver@6.3.1: {} - /semver@7.6.0: - resolution: {integrity: sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==} - engines: {node: '>=10'} - hasBin: true + semver@7.6.0: dependencies: lru-cache: 6.0.0 - /serialize-javascript@6.0.2: - resolution: {integrity: sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==} + serialize-javascript@6.0.2: dependencies: randombytes: 2.1.0 - dev: true - /set-blocking@2.0.0: - resolution: {integrity: sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==} - dev: false + set-blocking@2.0.0: {} - /set-cookie-parser@2.6.0: - resolution: {integrity: sha512-RVnVQxTXuerk653XfuliOxBP81Sf0+qfQE73LIYKcyMYHG94AuH0kgrQpRDuTZnSmjpysHmzxJXKNfa6PjFhyQ==} - dev: false + set-cookie-parser@2.6.0: {} - /set-function-length@1.2.1: - resolution: {integrity: sha512-j4t6ccc+VsKwYHso+kElc5neZpjtq9EnRICFZtWyBsLojhmeF/ZBd/elqm22WJh/BziDe/SBiOeAt0m2mfLD0g==} - engines: {node: '>= 0.4'} + set-function-length@1.2.1: dependencies: define-data-property: 1.1.2 es-errors: 1.3.0 @@ -7827,192 +9895,120 @@ packages: get-intrinsic: 1.2.4 gopd: 1.0.1 has-property-descriptors: 1.0.1 - dev: true - /setprototypeof@1.2.0: - resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} - dev: false + setprototypeof@1.2.0: {} - /shebang-command@2.0.0: - resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} - engines: {node: '>=8'} + shebang-command@2.0.0: dependencies: shebang-regex: 3.0.0 - /shebang-regex@3.0.0: - resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} - engines: {node: '>=8'} + shebang-regex@3.0.0: {} - /shelljs@0.8.5: - resolution: {integrity: sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==} - engines: {node: '>=4'} - hasBin: true + shelljs@0.8.5: dependencies: glob: 7.2.3 interpret: 1.4.0 rechoir: 0.6.2 - dev: true - /side-channel@1.0.5: - resolution: {integrity: sha512-QcgiIWV4WV7qWExbN5llt6frQB/lBven9pqliLXfGPB+K9ZYXxDozp0wLkHS24kWCm+6YXH/f0HhnObZnZOBnQ==} - engines: {node: '>= 0.4'} + side-channel@1.0.5: dependencies: call-bind: 1.0.6 es-errors: 1.3.0 get-intrinsic: 1.2.4 object-inspect: 1.13.1 - dev: true - /signal-exit@3.0.7: - resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} + signal-exit@3.0.7: {} - /signal-exit@4.1.0: - resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} - engines: {node: '>=14'} + signal-exit@4.1.0: {} - /sisteransi@1.0.5: - resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} + sisteransi@1.0.5: {} - /slash@3.0.0: - resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} - engines: {node: '>=8'} + slash@3.0.0: {} - /smart-buffer@4.2.0: - resolution: {integrity: sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==} - engines: {node: '>= 6.0.0', npm: '>= 3.0.0'} - dev: false + smart-buffer@4.2.0: {} - /socks-proxy-agent@7.0.0: - resolution: {integrity: sha512-Fgl0YPZ902wEsAyiQ+idGd1A7rSFx/ayC1CQVMw5P+EQx2V0SgpGtf6OKFhVjPflPUl9YMmEOnmfjCdMUsygww==} - engines: {node: '>= 10'} + socks-proxy-agent@7.0.0: dependencies: agent-base: 6.0.2 debug: 4.3.4 socks: 2.8.3 transitivePeerDependencies: - supports-color - dev: false - /socks@2.8.3: - resolution: {integrity: sha512-l5x7VUUWbjVFbafGLxPWkYsHIhEvmF85tbIeFZWc8ZPtoMyybuEhL7Jye/ooC4/d48FgOjSJXgsF/AJPYCW8Zw==} - engines: {node: '>= 10.0.0', npm: '>= 3.0.0'} + socks@2.8.3: dependencies: ip-address: 9.0.5 smart-buffer: 4.2.0 - dev: false - /sonic-boom@3.8.0: - resolution: {integrity: sha512-ybz6OYOUjoQQCQ/i4LU8kaToD8ACtYP+Cj5qd2AO36bwbdewxWJ3ArmJ2cr6AvxlL2o0PqnCcPGUgkILbfkaCA==} + sonic-boom@3.8.0: dependencies: atomic-sleep: 1.0.0 - dev: false - /source-map-resolve@0.5.3: - resolution: {integrity: sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==} - deprecated: See https://github.com/lydell/source-map-resolve#deprecated + source-map-resolve@0.5.3: dependencies: atob: 2.1.2 decode-uri-component: 0.2.2 resolve-url: 0.2.1 source-map-url: 0.4.1 urix: 0.1.0 - dev: false - /source-map-support@0.5.13: - resolution: {integrity: sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==} + source-map-support@0.5.13: dependencies: buffer-from: 1.1.2 source-map: 0.6.1 - /source-map-support@0.5.21: - resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} + source-map-support@0.5.21: dependencies: buffer-from: 1.1.2 source-map: 0.6.1 - dev: true - /source-map-url@0.4.1: - resolution: {integrity: sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw==} - deprecated: See https://github.com/lydell/source-map-url#deprecated - dev: false + source-map-url@0.4.1: {} - /source-map@0.6.1: - resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} - engines: {node: '>=0.10.0'} + source-map@0.6.1: {} - /source-map@0.7.3: - resolution: {integrity: sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==} - engines: {node: '>= 8'} - dev: false + source-map@0.7.3: {} - /source-map@0.7.4: - resolution: {integrity: sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==} - engines: {node: '>= 8'} - dev: true + source-map@0.7.4: {} - /sourcemap-codec@1.4.8: - resolution: {integrity: sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==} - deprecated: Please use @jridgewell/sourcemap-codec instead - dev: false + sourcemap-codec@1.4.8: {} - /spdx-correct@3.2.0: - resolution: {integrity: sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==} + spdx-correct@3.2.0: dependencies: spdx-expression-parse: 3.0.1 spdx-license-ids: 3.0.17 - /spdx-exceptions@2.4.0: - resolution: {integrity: sha512-hcjppoJ68fhxA/cjbN4T8N6uCUejN8yFw69ttpqtBeCbF3u13n7mb31NB9jKwGTTWWnt9IbRA/mf1FprYS8wfw==} + spdx-exceptions@2.4.0: {} - /spdx-expression-parse@3.0.1: - resolution: {integrity: sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==} + spdx-expression-parse@3.0.1: dependencies: spdx-exceptions: 2.4.0 spdx-license-ids: 3.0.17 - /spdx-license-ids@3.0.17: - resolution: {integrity: sha512-sh8PWc/ftMqAAdFiBu6Fy6JUOYjqDJBJvIhpfDMyHrr0Rbp5liZqd4TjtQ/RgfLjKFZb+LMx5hpml5qOWy0qvg==} + spdx-license-ids@3.0.17: {} - /split2@3.2.2: - resolution: {integrity: sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg==} + split2@3.2.2: dependencies: readable-stream: 3.6.2 - dev: true - /split2@4.2.0: - resolution: {integrity: sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==} - engines: {node: '>= 10.x'} + split2@4.2.0: {} - /split@1.0.1: - resolution: {integrity: sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg==} + split@1.0.1: dependencies: through: 2.3.8 - dev: true - /sprintf-js@1.0.3: - resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} + sprintf-js@1.0.3: {} - /sprintf-js@1.1.3: - resolution: {integrity: sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==} - dev: false + sprintf-js@1.1.3: {} - /ssri@9.0.1: - resolution: {integrity: sha512-o57Wcn66jMQvfHG1FlYbWeZWW/dHZhJXjpIcTfXldXEk5nz5lStPo3mK0OJQfGR3RbZUlbISexbljkJzuEj/8Q==} - engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + ssri@9.0.1: dependencies: minipass: 3.3.6 - dev: false - /stack-utils@2.0.6: - resolution: {integrity: sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==} - engines: {node: '>=10'} + stack-utils@2.0.6: dependencies: escape-string-regexp: 2.0.0 - /standard-version@9.5.0: - resolution: {integrity: sha512-3zWJ/mmZQsOaO+fOlsa0+QK90pwhNd042qEcw6hKFNoLFs7peGyvPffpEBbK/DSGPbyOvli0mUIFv5A4qTjh2Q==} - engines: {node: '>=10'} - hasBin: true + standard-version@9.5.0: dependencies: chalk: 2.4.2 conventional-changelog: 3.1.25 @@ -8028,136 +10024,82 @@ packages: semver: 7.6.0 stringify-package: 1.0.1 yargs: 16.2.0 - dev: true - /statuses@2.0.1: - resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==} - engines: {node: '>= 0.8'} - dev: false + statuses@2.0.1: {} - /stream-shift@1.0.3: - resolution: {integrity: sha512-76ORR0DO1o1hlKwTbi/DM3EXWGf3ZJYO8cXX5RJwnul2DEg2oyoZyjLNoQM8WsvZiFKCRfC1O0J7iCvie3RZmQ==} - dev: false + stream-shift@1.0.3: {} - /string-length@4.0.2: - resolution: {integrity: sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==} - engines: {node: '>=10'} + string-length@4.0.2: dependencies: char-regex: 1.0.2 strip-ansi: 6.0.1 - /string-width@1.0.2: - resolution: {integrity: sha512-0XsVpQLnVCXHJfyEs8tC0zpTVIr5PKKsQtkT29IwupnPTjtPmQ3xT/4yCREF9hYkV/3M3kzcUTSAZT6a6h81tw==} - engines: {node: '>=0.10.0'} + string-width@1.0.2: dependencies: code-point-at: 1.1.0 is-fullwidth-code-point: 1.0.0 strip-ansi: 3.0.1 - dev: false - /string-width@4.2.3: - resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} - engines: {node: '>=8'} + string-width@4.2.3: dependencies: emoji-regex: 8.0.0 is-fullwidth-code-point: 3.0.0 strip-ansi: 6.0.1 - /string-width@5.1.2: - resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} - engines: {node: '>=12'} + string-width@5.1.2: dependencies: eastasianwidth: 0.2.0 emoji-regex: 9.2.2 strip-ansi: 7.1.0 - dev: false - /string_decoder@0.10.31: - resolution: {integrity: sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==} - dev: false + string_decoder@0.10.31: {} - /string_decoder@1.1.1: - resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==} + string_decoder@1.1.1: dependencies: safe-buffer: 5.1.2 - /string_decoder@1.3.0: - resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} + string_decoder@1.3.0: dependencies: safe-buffer: 5.2.1 - /stringify-package@1.0.1: - resolution: {integrity: sha512-sa4DUQsYciMP1xhKWGuFM04fB0LG/9DlluZoSVywUMRNvzid6XucHK0/90xGxRoHrAaROrcHK1aPKaijCtSrhg==} - deprecated: This module is not used anymore, and has been replaced by @npmcli/package-json - dev: true + stringify-package@1.0.1: {} - /strip-ansi@3.0.1: - resolution: {integrity: sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==} - engines: {node: '>=0.10.0'} + strip-ansi@3.0.1: dependencies: ansi-regex: 2.1.1 - dev: false - /strip-ansi@6.0.1: - resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} - engines: {node: '>=8'} + strip-ansi@6.0.1: dependencies: ansi-regex: 5.0.1 - /strip-ansi@7.1.0: - resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} - engines: {node: '>=12'} + strip-ansi@7.1.0: dependencies: ansi-regex: 6.0.1 - dev: false - /strip-bom-stream@1.0.0: - resolution: {integrity: sha512-7jfJB9YpI2Z0aH3wu10ZqitvYJaE0s5IzFuWE+0pbb4Q/armTloEUShymkDO47YSLnjAW52mlXT//hs9wXNNJQ==} - engines: {node: '>=0.10.0'} + strip-bom-stream@1.0.0: dependencies: first-chunk-stream: 1.0.0 strip-bom: 2.0.0 - dev: false - /strip-bom@2.0.0: - resolution: {integrity: sha512-kwrX1y7czp1E69n2ajbG65mIo9dqvJ+8aBQXOGVxqwvNbsXdFM6Lq37dLAY3mknUwru8CfcCbfOLL/gMo+fi3g==} - engines: {node: '>=0.10.0'} + strip-bom@2.0.0: dependencies: is-utf8: 0.2.1 - dev: false - /strip-bom@3.0.0: - resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} - engines: {node: '>=4'} - dev: true + strip-bom@3.0.0: {} - /strip-bom@4.0.0: - resolution: {integrity: sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==} - engines: {node: '>=8'} + strip-bom@4.0.0: {} - /strip-final-newline@2.0.0: - resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} - engines: {node: '>=6'} + strip-final-newline@2.0.0: {} - /strip-final-newline@3.0.0: - resolution: {integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==} - engines: {node: '>=12'} - dev: true + strip-final-newline@3.0.0: {} - /strip-indent@3.0.0: - resolution: {integrity: sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==} - engines: {node: '>=8'} + strip-indent@3.0.0: dependencies: min-indent: 1.0.1 - dev: true - /strip-json-comments@3.1.1: - resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} - engines: {node: '>=8'} + strip-json-comments@3.1.1: {} - /superagent@8.1.2: - resolution: {integrity: sha512-6WTxW1EB6yCxV5VFOIPQruWGHqc3yI7hEmZK6h+pyk69Lk/Ut7rLUY6W/ONF2MjBuGjvmMiIpsrVJ2vjrHlslA==} - engines: {node: '>=6.4.0 <13 || >=14'} + superagent@8.1.2: dependencies: component-emitter: 1.3.1 cookiejar: 2.1.4 @@ -8171,74 +10113,44 @@ packages: semver: 7.6.0 transitivePeerDependencies: - supports-color - dev: true - /supertest@6.3.3: - resolution: {integrity: sha512-EMCG6G8gDu5qEqRQ3JjjPs6+FYT1a7Hv5ApHvtSghmOFJYtsU5S+pSb6Y2EUeCEY3CmEL3mmQ8YWlPOzQomabA==} - engines: {node: '>=6.4.0'} + supertest@6.3.3: dependencies: methods: 1.1.2 superagent: 8.1.2 transitivePeerDependencies: - supports-color - dev: true - /supports-color@2.0.0: - resolution: {integrity: sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==} - engines: {node: '>=0.8.0'} - dev: false + supports-color@2.0.0: {} - /supports-color@5.5.0: - resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} - engines: {node: '>=4'} + supports-color@5.5.0: dependencies: has-flag: 3.0.0 - /supports-color@7.2.0: - resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} - engines: {node: '>=8'} + supports-color@7.2.0: dependencies: has-flag: 4.0.0 - /supports-color@8.1.1: - resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} - engines: {node: '>=10'} + supports-color@8.1.1: dependencies: has-flag: 4.0.0 - /supports-preserve-symlinks-flag@1.0.0: - resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} - engines: {node: '>= 0.4'} + supports-preserve-symlinks-flag@1.0.0: {} - /swagger-ui-dist@5.11.2: - resolution: {integrity: sha512-jQG0cRgJNMZ7aCoiFofnoojeSaa/+KgWaDlfgs8QN+BXoGMpxeMVY5OEnjq4OlNvF3yjftO8c9GRAgcHlO+u7A==} - dev: false + swagger-ui-dist@5.11.2: {} - /symbol-observable@4.0.0: - resolution: {integrity: sha512-b19dMThMV4HVFynSAM1++gBHAbk2Tc/osgLIBZMKsyqh34jb2e8Os7T6ZW/Bt3pJFdBTd2JwAnAAEQV7rSNvcQ==} - engines: {node: '>=0.10'} - dev: true + symbol-observable@4.0.0: {} - /symbol@0.2.3: - resolution: {integrity: sha512-IUW+ek7apEaW5bFhS6WpYoNtVpNTlNoqB/PH7YiMWQTxSPeXCzG4PILVakwXivJt3ZXWeO1fIJnUd/L9A/VeGA==} - dev: false + symbol@0.2.3: {} - /synckit@0.8.8: - resolution: {integrity: sha512-HwOKAP7Wc5aRGYdKH+dw0PRRpbO841v2DENBtjnR5HFWoiNByAl7vrx3p0G/rCyYXQsrxqtX48TImFtPcIHSpQ==} - engines: {node: ^14.18.0 || >=16.0.0} + synckit@0.8.8: dependencies: '@pkgr/core': 0.1.1 tslib: 2.6.2 - dev: true - /tapable@2.2.1: - resolution: {integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==} - engines: {node: '>=6'} - dev: true + tapable@2.2.1: {} - /tar@6.2.0: - resolution: {integrity: sha512-/Wo7DcT0u5HUV486xg675HtjNd3BXZ6xDbzsCUZPt5iw8bTQ63bP0Raut3mvro9u+CUyq7YQd8Cx55fsZXxqLQ==} - engines: {node: '>=10'} + tar@6.2.0: dependencies: chownr: 2.0.0 fs-minipass: 2.1.0 @@ -8247,21 +10159,7 @@ packages: mkdirp: 1.0.4 yallist: 4.0.0 - /terser-webpack-plugin@5.3.10(webpack@5.87.0): - resolution: {integrity: sha512-BKFPWlPDndPs+NGGCr1U59t0XScL5317Y0UReNrHaw9/FwhPENlq6bfgs+4yPfyP51vqC1bQ4rp1EfXW5ZSH9w==} - engines: {node: '>= 10.13.0'} - peerDependencies: - '@swc/core': '*' - esbuild: '*' - uglify-js: '*' - webpack: ^5.1.0 - peerDependenciesMeta: - '@swc/core': - optional: true - esbuild: - optional: true - uglify-js: - optional: true + terser-webpack-plugin@5.3.10(webpack@5.87.0): dependencies: '@jridgewell/trace-mapping': 0.3.22 jest-worker: 27.5.1 @@ -8269,23 +10167,8 @@ packages: serialize-javascript: 6.0.2 terser: 5.27.0 webpack: 5.87.0 - dev: true - /terser-webpack-plugin@5.3.10(webpack@5.90.1): - resolution: {integrity: sha512-BKFPWlPDndPs+NGGCr1U59t0XScL5317Y0UReNrHaw9/FwhPENlq6bfgs+4yPfyP51vqC1bQ4rp1EfXW5ZSH9w==} - engines: {node: '>= 10.13.0'} - peerDependencies: - '@swc/core': '*' - esbuild: '*' - uglify-js: '*' - webpack: ^5.1.0 - peerDependenciesMeta: - '@swc/core': - optional: true - esbuild: - optional: true - uglify-js: - optional: true + terser-webpack-plugin@5.3.10(webpack@5.90.1): dependencies: '@jridgewell/trace-mapping': 0.3.22 jest-worker: 27.5.1 @@ -8293,177 +10176,95 @@ packages: serialize-javascript: 6.0.2 terser: 5.27.0 webpack: 5.90.1 - dev: true - /terser@5.27.0: - resolution: {integrity: sha512-bi1HRwVRskAjheeYl291n3JC4GgO/Ty4z1nVs5AAsmonJulGxpSektecnNedrwK9C7vpvVtcX3cw00VSLt7U2A==} - engines: {node: '>=10'} - hasBin: true + terser@5.27.0: dependencies: '@jridgewell/source-map': 0.3.5 acorn: 8.11.3 commander: 2.20.3 source-map-support: 0.5.21 - dev: true - /test-exclude@6.0.0: - resolution: {integrity: sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==} - engines: {node: '>=8'} + test-exclude@6.0.0: dependencies: '@istanbuljs/schema': 0.1.3 glob: 7.2.3 minimatch: 3.1.2 - /text-extensions@1.9.0: - resolution: {integrity: sha512-wiBrwC1EhBelW12Zy26JeOUkQ5mRu+5o8rpsJk5+2t+Y5vE7e842qtZDQ2g1NpX/29HdyFeJ4nSIhI47ENSxlQ==} - engines: {node: '>=0.10'} - dev: true + text-extensions@1.9.0: {} - /text-extensions@2.4.0: - resolution: {integrity: sha512-te/NtwBwfiNRLf9Ijqx3T0nlqZiQ2XrrtBvu+cLL8ZRrGkO0NHTug8MYFKyoSrv/sHTaSKfilUkizV6XhxMJ3g==} - engines: {node: '>=8'} - dev: true + text-extensions@2.4.0: {} - /text-table@0.2.0: - resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} - dev: true + text-table@0.2.0: {} - /thread-stream@2.4.1: - resolution: {integrity: sha512-d/Ex2iWd1whipbT681JmTINKw0ZwOUBZm7+Gjs64DHuX34mmw8vJL2bFAaNacaW72zYiTJxSHi5abUuOi5nsfg==} + thread-stream@2.4.1: dependencies: real-require: 0.2.0 - dev: false - /through2-filter@2.0.0: - resolution: {integrity: sha512-miwWajb1B80NvIVKXFPN/o7+vJc4jYUvnZCwvhicRAoTxdD9wbcjri70j+BenCrN/JXEPKDjhpw4iY7yiNsCGg==} + through2-filter@2.0.0: dependencies: through2: 2.0.5 xtend: 4.0.2 - dev: false - /through2-filter@3.0.0: - resolution: {integrity: sha512-jaRjI2WxN3W1V8/FMZ9HKIBXixtiqs3SQSX4/YGIiP3gL6djW48VoZq9tDqeCWs3MT8YY5wb/zli8VW8snY1CA==} + through2-filter@3.0.0: dependencies: through2: 2.0.5 xtend: 4.0.2 - dev: false - /through2@0.6.5: - resolution: {integrity: sha512-RkK/CCESdTKQZHdmKICijdKKsCRVHs5KsLZ6pACAmF/1GPUQhonHSXWNERctxEp7RmvjdNbZTL5z9V7nSCXKcg==} + through2@0.6.5: dependencies: readable-stream: 1.0.34 xtend: 4.0.2 - dev: false - /through2@2.0.5: - resolution: {integrity: sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==} + through2@2.0.5: dependencies: readable-stream: 2.3.8 xtend: 4.0.2 - /through2@4.0.2: - resolution: {integrity: sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==} + through2@4.0.2: dependencies: readable-stream: 3.6.2 - dev: true - /through@2.3.8: - resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==} - dev: true + through@2.3.8: {} - /tildify@1.2.0: - resolution: {integrity: sha512-Y9q1GaV/BO65Z9Yf4NOGMuwt3SGdptkZBnaaKfTQakrDyCLiuO1Kc5wxW4xLdsjzunRtqtOdhekiUFmZbklwYQ==} - engines: {node: '>=0.10.0'} + tildify@1.2.0: dependencies: os-homedir: 1.0.2 - dev: false - /tmp@0.0.33: - resolution: {integrity: sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==} - engines: {node: '>=0.6.0'} + tmp@0.0.33: dependencies: os-tmpdir: 1.0.2 - dev: true - /tmpl@1.0.5: - resolution: {integrity: sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==} + tmpl@1.0.5: {} - /to-absolute-glob@0.1.1: - resolution: {integrity: sha512-Vvl5x6zNf9iVG1QTWeknmWrKzZxaeKfIDRibrZCR3b2V/2NlFJuD2HV7P7AVjaKLZNqLPHqyr0jGrW0fTcxCPQ==} - engines: {node: '>=0.10.0'} + to-absolute-glob@0.1.1: dependencies: extend-shallow: 2.0.1 - dev: false - /to-fast-properties@2.0.0: - resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==} - engines: {node: '>=4'} + to-fast-properties@2.0.0: {} - /to-regex-range@5.0.1: - resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} - engines: {node: '>=8.0'} + to-regex-range@5.0.1: dependencies: is-number: 7.0.0 - /toad-cache@3.7.0: - resolution: {integrity: sha512-/m8M+2BJUpoJdgAHoG+baCwBT+tf2VraSfkBgl0Y00qIWt41DJ8R5B8nsEw0I58YwF5IZH6z24/2TobDKnqSWw==} - engines: {node: '>=12'} - dev: false + toad-cache@3.7.0: {} - /toidentifier@1.0.1: - resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} - engines: {node: '>=0.6'} - dev: false + toidentifier@1.0.1: {} - /tr46@0.0.3: - resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} + tr46@0.0.3: {} - /tree-kill@1.2.2: - resolution: {integrity: sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==} - hasBin: true - dev: true + tree-kill@1.2.2: {} - /trim-newlines@3.0.1: - resolution: {integrity: sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==} - engines: {node: '>=8'} - dev: true + trim-newlines@3.0.1: {} - /trouter@2.0.1: - resolution: {integrity: sha512-kr8SKKw94OI+xTGOkfsvwZQ8mWoikZDd2n8XZHjJVZUARZT+4/VV6cacRS6CLsH9bNm+HFIPU1Zx4CnNnb4qlQ==} - engines: {node: '>=6'} + trouter@2.0.1: dependencies: matchit: 1.1.0 - dev: true - /ts-api-utils@1.2.1(typescript@5.1.3): - resolution: {integrity: sha512-RIYA36cJn2WiH9Hy77hdF9r7oEwxAtB/TS9/S4Qd90Ap4z5FSiin5zEiTL44OII1Y3IIlEvxwxFUVgrHSZ/UpA==} - engines: {node: '>=16'} - peerDependencies: - typescript: '>=4.2.0' + ts-api-utils@1.2.1(typescript@5.1.3): dependencies: typescript: 5.1.3 - dev: true - /ts-jest@29.1.0(@babel/core@7.23.9)(jest@29.5.0)(typescript@5.0.4): - resolution: {integrity: sha512-ZhNr7Z4PcYa+JjMl62ir+zPiNJfXJN6E8hSLnaUKhOgqcn8vb3e537cpkd0FuAfRK3sR1LSqM1MOhliXNgOFPA==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - hasBin: true - peerDependencies: - '@babel/core': '>=7.0.0-beta.0 <8' - '@jest/types': ^29.0.0 - babel-jest: ^29.0.0 - esbuild: '*' - jest: ^29.0.0 - typescript: '>=4.3 <6' - peerDependenciesMeta: - '@babel/core': - optional: true - '@jest/types': - optional: true - babel-jest: - optional: true - esbuild: - optional: true + ts-jest@29.1.0(@babel/core@7.23.9)(jest@29.5.0)(typescript@5.0.4): dependencies: '@babel/core': 7.23.9 bs-logger: 0.2.6 @@ -8476,28 +10277,8 @@ packages: semver: 7.6.0 typescript: 5.0.4 yargs-parser: 21.1.1 - dev: false - /ts-jest@29.1.0(@babel/core@7.23.9)(jest@29.5.0)(typescript@5.1.3): - resolution: {integrity: sha512-ZhNr7Z4PcYa+JjMl62ir+zPiNJfXJN6E8hSLnaUKhOgqcn8vb3e537cpkd0FuAfRK3sR1LSqM1MOhliXNgOFPA==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - hasBin: true - peerDependencies: - '@babel/core': '>=7.0.0-beta.0 <8' - '@jest/types': ^29.0.0 - babel-jest: ^29.0.0 - esbuild: '*' - jest: ^29.0.0 - typescript: '>=4.3 <6' - peerDependenciesMeta: - '@babel/core': - optional: true - '@jest/types': - optional: true - babel-jest: - optional: true - esbuild: - optional: true + ts-jest@29.1.0(@babel/core@7.23.9)(jest@29.5.0)(typescript@5.1.3): dependencies: '@babel/core': 7.23.9 bs-logger: 0.2.6 @@ -8510,14 +10291,8 @@ packages: semver: 7.6.0 typescript: 5.1.3 yargs-parser: 21.1.1 - dev: true - /ts-loader@9.4.3(typescript@5.1.3)(webpack@5.90.1): - resolution: {integrity: sha512-n3hBnm6ozJYzwiwt5YRiJZkzktftRpMiBApHaJPoWLA+qetQBAXkHqCLM6nwSdRDimqVtA5ocIkcTRLMTt7yzA==} - engines: {node: '>=12.0.0'} - peerDependencies: - typescript: '*' - webpack: ^5.0.0 + ts-loader@9.4.3(typescript@5.1.3)(webpack@5.90.1): dependencies: chalk: 4.1.2 enhanced-resolve: 5.15.0 @@ -8525,21 +10300,8 @@ packages: semver: 7.6.0 typescript: 5.1.3 webpack: 5.90.1 - dev: true - /ts-node@10.9.1(@types/node@20.3.1)(typescript@5.1.3): - resolution: {integrity: sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==} - hasBin: true - peerDependencies: - '@swc/core': '>=1.2.50' - '@swc/wasm': '>=1.2.50' - '@types/node': '*' - typescript: '>=2.7' - peerDependenciesMeta: - '@swc/core': - optional: true - '@swc/wasm': - optional: true + ts-node@10.9.1(@types/node@20.3.1)(typescript@5.1.3): dependencies: '@cspotcode/source-map-support': 0.8.1 '@tsconfig/node10': 1.0.9 @@ -8557,180 +10319,97 @@ packages: v8-compile-cache-lib: 3.0.1 yn: 3.1.1 - /ts-toolbelt@9.6.0: - resolution: {integrity: sha512-nsZd8ZeNUzukXPlJmTBwUAuABDe/9qtVDelJeT/qW0ow3ZS3BsQJtNkan1802aM9Uf68/Y8ljw86Hu0h5IUW3w==} - dev: true + ts-toolbelt@9.6.0: {} - /tsconfig-paths-webpack-plugin@4.0.1: - resolution: {integrity: sha512-m5//KzLoKmqu2MVix+dgLKq70MnFi8YL8sdzQZ6DblmCdfuq/y3OqvJd5vMndg2KEVCOeNz8Es4WVZhYInteLw==} - engines: {node: '>=10.13.0'} + tsconfig-paths-webpack-plugin@4.0.1: dependencies: chalk: 4.1.2 enhanced-resolve: 5.15.0 tsconfig-paths: 4.2.0 - dev: true - /tsconfig-paths@4.2.0: - resolution: {integrity: sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg==} - engines: {node: '>=6'} + tsconfig-paths@4.2.0: dependencies: json5: 2.2.3 minimist: 1.2.8 strip-bom: 3.0.0 - dev: true - /tslib@1.14.1: - resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==} - dev: false + tslib@1.14.1: {} - /tslib@2.5.0: - resolution: {integrity: sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==} - dev: false + tslib@2.5.0: {} - /tslib@2.5.3: - resolution: {integrity: sha512-mSxlJJwl3BMEQCUNnxXBU9jP4JBktcEGhURcPR6VQVlnP0FdDEsIaz0C35dXNGLyRfrATNofF0F5p2KPxQgB+w==} + tslib@2.5.3: {} - /tslib@2.6.2: - resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==} + tslib@2.6.2: {} - /type-check@0.4.0: - resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} - engines: {node: '>= 0.8.0'} + type-check@0.4.0: dependencies: prelude-ls: 1.2.1 - dev: true - /type-detect@4.0.8: - resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==} - engines: {node: '>=4'} + type-detect@4.0.8: {} - /type-fest@0.18.1: - resolution: {integrity: sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==} - engines: {node: '>=10'} - dev: true + type-fest@0.18.1: {} - /type-fest@0.20.2: - resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} - engines: {node: '>=10'} - dev: true + type-fest@0.20.2: {} - /type-fest@0.21.3: - resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==} - engines: {node: '>=10'} + type-fest@0.21.3: {} - /type-fest@0.6.0: - resolution: {integrity: sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==} - engines: {node: '>=8'} - dev: true + type-fest@0.6.0: {} - /type-fest@0.8.1: - resolution: {integrity: sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==} - engines: {node: '>=8'} - dev: true + type-fest@0.8.1: {} - /typedarray@0.0.6: - resolution: {integrity: sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==} - dev: true + typedarray@0.0.6: {} - /typedarray@0.0.7: - resolution: {integrity: sha512-ueeb9YybpjhivjbHP2LdFDAjbS948fGEPj+ACAMs4xCMmh72OCOMQWBQKlaN4ZNQ04yfLSDLSx1tGRIoWimObQ==} - dev: false + typedarray@0.0.7: {} - /typescript@5.0.4: - resolution: {integrity: sha512-cW9T5W9xY37cc+jfEnaUvX91foxtHkza3Nw3wkoF4sSlKn0MONdkdEndig/qPBWXNkmplh3NzayQzCiHM4/hqw==} - engines: {node: '>=12.20'} - hasBin: true - dev: false + typescript@5.0.4: {} - /typescript@5.1.3: - resolution: {integrity: sha512-XH627E9vkeqhlZFQuL+UsyAXEnibT0kWR2FWONlr4sTjvxyJYnyefgrkyECLzM5NenmKzRAy2rR/OlYLA1HkZw==} - engines: {node: '>=14.17'} - hasBin: true + typescript@5.1.3: {} - /uglify-js@3.17.4: - resolution: {integrity: sha512-T9q82TJI9e/C1TAxYvfb16xO120tMVFZrGA3f9/P4424DNu6ypK103y0GPFVa17yotwSyZW5iYXgjYHkGrJW/g==} - engines: {node: '>=0.8.0'} - hasBin: true - requiresBuild: true - dev: true + uglify-js@3.17.4: optional: true - /uid@2.0.2: - resolution: {integrity: sha512-u3xV3X7uzvi5b1MncmZo3i2Aw222Zk1keqLA1YkHldREkAhAqi65wuPfe7lHx8H/Wzy+8CE7S7uS3jekIM5s8g==} - engines: {node: '>=8'} + uid@2.0.2: dependencies: '@lukeed/csprng': 1.1.0 - /unicorn-magic@0.1.0: - resolution: {integrity: sha512-lRfVq8fE8gz6QMBuDM6a+LO3IAzTi05H6gCVaUpir2E1Rwpo4ZUog45KpNXKC/Mn3Yb9UDuHumeFTo9iV/D9FQ==} - engines: {node: '>=18'} - dev: true + unicorn-magic@0.1.0: {} - /unique-filename@2.0.1: - resolution: {integrity: sha512-ODWHtkkdx3IAR+veKxFV+VBkUMcN+FaqzUUd7IZzt+0zhDZFPFxhlqwPF3YQvMHx1TD0tdgYl+kuPnJ8E6ql7A==} - engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + unique-filename@2.0.1: dependencies: unique-slug: 3.0.0 - dev: false - /unique-slug@3.0.0: - resolution: {integrity: sha512-8EyMynh679x/0gqE9fT9oilG+qEt+ibFyqjuVTsZn1+CMxH+XLlpvr2UZx4nVcCwTpx81nICr2JQFkM+HPLq4w==} - engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + unique-slug@3.0.0: dependencies: imurmurhash: 0.1.4 - dev: false - /unique-stream@2.3.1: - resolution: {integrity: sha512-2nY4TnBE70yoxHkDli7DMazpWiP7xMdCYqU2nBRO0UB+ZpEkGsSija7MvmvnZFUeC+mrgiUfcHSr3LmRFIg4+A==} + unique-stream@2.3.1: dependencies: json-stable-stringify-without-jsonify: 1.0.1 through2-filter: 3.0.0 - dev: false - /universalify@2.0.1: - resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==} - engines: {node: '>= 10.0.0'} - dev: true + universalify@2.0.1: {} - /update-browserslist-db@1.0.13(browserslist@4.22.3): - resolution: {integrity: sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==} - hasBin: true - peerDependencies: - browserslist: '>= 4.21.0' + update-browserslist-db@1.0.13(browserslist@4.22.3): dependencies: browserslist: 4.22.3 escalade: 3.1.2 picocolors: 1.0.0 - /uri-js@4.4.1: - resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} + uri-js@4.4.1: dependencies: punycode: 2.3.1 - /urix@0.1.0: - resolution: {integrity: sha512-Am1ousAhSLBeB9cG/7k7r2R0zj50uDRlZHPGbazid5s9rlF1F/QKYObEKSIunSjIOkJZqwRRLpvewjEkM7pSqg==} - deprecated: Please see https://github.com/lydell/urix#deprecated - dev: false + urix@0.1.0: {} - /util-deprecate@1.0.2: - resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + util-deprecate@1.0.2: {} - /utils-merge@1.0.1: - resolution: {integrity: sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==} - engines: {node: '>= 0.4.0'} - dev: false + utils-merge@1.0.1: {} - /uuid@9.0.0: - resolution: {integrity: sha512-MXcSTerfPa4uqyzStbRoTgt5XIe3x5+42+q1sDuy3R5MDk66URdLMOZe5aPX/SQd+kuYAh0FdP/pO28IkQyTeg==} - hasBin: true - dev: false + uuid@9.0.0: {} - /v8-compile-cache-lib@3.0.1: - resolution: {integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==} + v8-compile-cache-lib@3.0.1: {} - /v8-sandbox@3.2.10(debug@2.6.9): - resolution: {integrity: sha512-BIIohkY8ULJ63o084YCPMVItEurrH8HIiPufbTtI6AD9HXNnC6QmJTvN97CpvakRkSk0isK4a4diSmwVG2pyFQ==} - requiresBuild: true + v8-sandbox@3.2.10(debug@2.6.9): dependencies: async: 3.2.5 axios: 1.6.7(debug@2.6.9) @@ -8743,34 +10422,23 @@ packages: - bluebird - debug - supports-color - dev: false - /v8-to-istanbul@9.2.0: - resolution: {integrity: sha512-/EH/sDgxU2eGxajKdwLCDmQ4FWq+kpi3uCmBGpw1xJtnAxEjlD8j8PEiGWpCIMIs3ciNAgH0d3TTJiUkYzyZjA==} - engines: {node: '>=10.12.0'} + v8-to-istanbul@9.2.0: dependencies: '@jridgewell/trace-mapping': 0.3.22 '@types/istanbul-lib-coverage': 2.0.6 convert-source-map: 2.0.0 - /vali-date@1.0.0: - resolution: {integrity: sha512-sgECfZthyaCKW10N0fm27cg8HYTFK5qMWgypqkXMQ4Wbl/zZKx7xZICgcoxIIE+WFAP/MBL2EFwC/YvLxw3Zeg==} - engines: {node: '>=0.10.0'} - dev: false + vali-date@1.0.0: {} - /validate-npm-package-license@3.0.4: - resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==} + validate-npm-package-license@3.0.4: dependencies: spdx-correct: 3.2.0 spdx-expression-parse: 3.0.1 - /validator@13.11.0: - resolution: {integrity: sha512-Ii+sehpSfZy+At5nPdnyMhx78fEoPDkR2XW/zimHEL3MyGJQOCQ7WeP20jPYRz7ZCpcKLB21NxuXHF3bxjStBQ==} - engines: {node: '>= 0.10'} + validator@13.11.0: {} - /vinyl-fs@2.4.3: - resolution: {integrity: sha512-XxYoy5HpHrVd76tpnI5Vv/+b/xlEVusOmn4LjQ01s2JyiDMNaUm3Rb7Y3xTkRw+YoRBVoUrCs7EAIFNXyIlI8Q==} - engines: {node: '>=0.10'} + vinyl-fs@2.4.3: dependencies: duplexify: 3.7.1 glob-stream: 5.3.5 @@ -8791,57 +10459,33 @@ packages: vinyl: 1.2.0 transitivePeerDependencies: - supports-color - dev: false - /vinyl@1.2.0: - resolution: {integrity: sha512-Ci3wnR2uuSAWFMSglZuB8Z2apBdtOyz8CV7dC6/U1XbltXBC+IuutUkXQISz01P+US2ouBuesSbV6zILZ6BuzQ==} - engines: {node: '>= 0.9'} + vinyl@1.2.0: dependencies: clone: 1.0.4 clone-stats: 0.0.1 replace-ext: 0.0.1 - dev: false - /walker@1.0.8: - resolution: {integrity: sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==} + walker@1.0.8: dependencies: makeerror: 1.0.12 - /watchpack@2.4.0: - resolution: {integrity: sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==} - engines: {node: '>=10.13.0'} + watchpack@2.4.0: dependencies: glob-to-regexp: 0.4.1 graceful-fs: 4.2.11 - dev: true - /wcwidth@1.0.1: - resolution: {integrity: sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==} + wcwidth@1.0.1: dependencies: defaults: 1.0.4 - /webidl-conversions@3.0.1: - resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} + webidl-conversions@3.0.1: {} - /webpack-node-externals@3.0.0: - resolution: {integrity: sha512-LnL6Z3GGDPht/AigwRh2dvL9PQPFQ8skEpVrWZXLWBYmqcaojHNN0onvHzie6rq7EWKrrBfPYqNEzTJgiwEQDQ==} - engines: {node: '>=6'} - dev: true + webpack-node-externals@3.0.0: {} - /webpack-sources@3.2.3: - resolution: {integrity: sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==} - engines: {node: '>=10.13.0'} - dev: true + webpack-sources@3.2.3: {} - /webpack@5.87.0: - resolution: {integrity: sha512-GOu1tNbQ7p1bDEoFRs2YPcfyGs8xq52yyPBZ3m2VGnXGtV9MxjrkABHm4V9Ia280OefsSLzvbVoXcfLxjKY/Iw==} - engines: {node: '>=10.13.0'} - hasBin: true - peerDependencies: - webpack-cli: '*' - peerDependenciesMeta: - webpack-cli: - optional: true + webpack@5.87.0: dependencies: '@types/eslint-scope': 3.7.7 '@types/estree': 1.0.5 @@ -8871,17 +10515,8 @@ packages: - '@swc/core' - esbuild - uglify-js - dev: true - /webpack@5.90.1: - resolution: {integrity: sha512-SstPdlAC5IvgFnhiRok8hqJo/+ArAbNv7rhU4fnWGHNVfN59HSQFaxZDSAL3IFG2YmqxuRs+IU33milSxbPlog==} - engines: {node: '>=10.13.0'} - hasBin: true - peerDependencies: - webpack-cli: '*' - peerDependenciesMeta: - webpack-cli: - optional: true + webpack@5.90.1: dependencies: '@types/eslint-scope': 3.7.7 '@types/estree': 1.0.5 @@ -8911,133 +10546,80 @@ packages: - '@swc/core' - esbuild - uglify-js - dev: true - /whatwg-url@5.0.0: - resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} + whatwg-url@5.0.0: dependencies: tr46: 0.0.3 webidl-conversions: 3.0.1 - /which@1.3.1: - resolution: {integrity: sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==} - hasBin: true + which@1.3.1: dependencies: isexe: 2.0.0 - dev: true - /which@2.0.2: - resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} - engines: {node: '>= 8'} - hasBin: true + which@2.0.2: dependencies: isexe: 2.0.0 - /wide-align@1.1.5: - resolution: {integrity: sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==} + wide-align@1.1.5: dependencies: string-width: 4.2.3 - dev: false - /window-size@0.2.0: - resolution: {integrity: sha512-UD7d8HFA2+PZsbKyaOCEy8gMh1oDtHgJh1LfgjQ4zVXmYjAT/kvz3PueITKuqDiIXQe7yzpPnxX3lNc+AhQMyw==} - engines: {node: '>= 0.10.0'} - hasBin: true - dev: false + window-size@0.2.0: {} - /windows-release@4.0.0: - resolution: {integrity: sha512-OxmV4wzDKB1x7AZaZgXMVsdJ1qER1ed83ZrTYd5Bwq2HfJVg3DJS8nqlAG4sMoJ7mu8cuRmLEYyU13BKwctRAg==} - engines: {node: '>=10'} + windows-release@4.0.0: dependencies: execa: 4.1.0 - dev: true - /word-wrap@1.2.5: - resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} - engines: {node: '>=0.10.0'} - dev: true + word-wrap@1.2.5: {} - /wordwrap@1.0.0: - resolution: {integrity: sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==} - dev: true + wordwrap@1.0.0: {} - /wrap-ansi@2.1.0: - resolution: {integrity: sha512-vAaEaDM946gbNpH5pLVNR+vX2ht6n0Bt3GXwVB1AuAqZosOvHNF3P7wDnh8KLkSqgUh0uh77le7Owgoz+Z9XBw==} - engines: {node: '>=0.10.0'} + wrap-ansi@2.1.0: dependencies: string-width: 1.0.2 strip-ansi: 3.0.1 - dev: false - /wrap-ansi@7.0.0: - resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} - engines: {node: '>=10'} + wrap-ansi@7.0.0: dependencies: ansi-styles: 4.3.0 string-width: 4.2.3 strip-ansi: 6.0.1 - /wrap-ansi@8.1.0: - resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} - engines: {node: '>=12'} + wrap-ansi@8.1.0: dependencies: ansi-styles: 6.2.1 string-width: 5.1.2 strip-ansi: 7.1.0 - dev: false - /wrappy@1.0.2: - resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + wrappy@1.0.2: {} - /write-file-atomic@4.0.2: - resolution: {integrity: sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==} - engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + write-file-atomic@4.0.2: dependencies: imurmurhash: 0.1.4 signal-exit: 3.0.7 - /xtend@4.0.2: - resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==} - engines: {node: '>=0.4'} + xtend@4.0.2: {} - /y18n@3.2.2: - resolution: {integrity: sha512-uGZHXkHnhF0XeeAPgnKfPv1bgKAYyVvmNL1xlKsPYZPaIHxGti2hHqvOCQv71XMsLxu1QjergkqogUnms5D3YQ==} - dev: false + y18n@3.2.2: {} - /y18n@5.0.8: - resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} - engines: {node: '>=10'} + y18n@5.0.8: {} - /yallist@3.1.1: - resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} + yallist@3.1.1: {} - /yallist@4.0.0: - resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} + yallist@4.0.0: {} - /yaml@1.10.2: - resolution: {integrity: sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==} - engines: {node: '>= 6'} - dev: true + yaml@1.10.2: {} - /yargs-parser@2.4.1: - resolution: {integrity: sha512-9pIKIJhnI5tonzG6OnCFlz/yln8xHYcGl+pn3xR0Vzff0vzN1PbNRaelgfgRUwZ3s4i3jvxT9WhmUGL4whnasA==} + yargs-parser@2.4.1: dependencies: camelcase: 3.0.0 lodash.assign: 4.2.0 - dev: false - /yargs-parser@20.2.9: - resolution: {integrity: sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==} - engines: {node: '>=10'} - dev: true + yargs-parser@20.2.9: {} - /yargs-parser@21.1.1: - resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} - engines: {node: '>=12'} + yargs-parser@21.1.1: {} - /yargs@16.2.0: - resolution: {integrity: sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==} - engines: {node: '>=10'} + yargs@16.2.0: dependencies: cliui: 7.0.4 escalade: 3.1.2 @@ -9046,11 +10628,8 @@ packages: string-width: 4.2.3 y18n: 5.0.8 yargs-parser: 20.2.9 - dev: true - /yargs@17.7.2: - resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} - engines: {node: '>=12'} + yargs@17.7.2: dependencies: cliui: 8.0.1 escalade: 3.1.2 @@ -9060,8 +10639,7 @@ packages: y18n: 5.0.8 yargs-parser: 21.1.1 - /yargs@4.6.0: - resolution: {integrity: sha512-KmjJbWBkYiSRUChcOSa4rtBxDXf0j4ISz+tpeNa4LKIBllgKnkemJ3x4yo4Yydp3wPU4/xJTaKTLLZ8V7zhI7A==} + yargs@4.6.0: dependencies: camelcase: 2.1.1 cliui: 3.2.0 @@ -9075,17 +10653,9 @@ packages: window-size: 0.2.0 y18n: 3.2.2 yargs-parser: 2.4.1 - dev: false - /yn@3.1.1: - resolution: {integrity: sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==} - engines: {node: '>=6'} + yn@3.1.1: {} - /yocto-queue@0.1.0: - resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} - engines: {node: '>=10'} + yocto-queue@0.1.0: {} - /yocto-queue@1.0.0: - resolution: {integrity: sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==} - engines: {node: '>=12.20'} - dev: true + yocto-queue@1.0.0: {} diff --git a/render.yaml b/render.yaml new file mode 100644 index 0000000..05a1013 --- /dev/null +++ b/render.yaml @@ -0,0 +1,53 @@ +# Exported from Render on 2024-05-30T08:21:36Z +services: +- type: web + name: callgent-api-docker + runtime: docker + repo: https://github.com/Callgent/callgent-api + plan: free + envVars: + - key: GOOGLE_OAUTH_CLIENT_SECRET + sync: false + - key: GOOGLE_OAUTH_CLIENT_ID + sync: false + - key: GITHUB_OAUTH_CLIENT_SECRET + sync: false + - key: GITHUB_OAUTH_CLIENT_ID + sync: false + - key: EMAIL_DEFAULT_SENDER + sync: false + - key: EMAIL_BREVO_API_KEY + sync: false + - key: EMAIL_SPARKPOST_API_KEY + sync: false + - key: NOT_HTTP_ONLY + sync: false + - key: DATABASE_URL + sync: false + - key: POSTGRES_DB + sync: false + - key: POSTGRES_USER + sync: false + - key: POSTGRES_PASSWORD + sync: false + - key: POSTGRES_PORT + sync: false + - key: POSTGRES_HOST + sync: false + - key: FRONTEND_SITE_URL + sync: false + - key: SITE_API_URL + sync: false + - key: SITE_ROOT_URL + sync: false + - key: SITE_ROOT_DOMAIN + sync: false + - key: JWT_COOKIE_NAME + sync: false + region: oregon + dockerContext: . + dockerfilePath: ./Dockerfile + domains: + - api.callgent.com + pullRequestPreviewsEnabled: true +version: "1" \ No newline at end of file From a81e3d7530a4c21efb8b309668e908da2d8f05c5 Mon Sep 17 00:00:00 2001 From: ahlon Date: Fri, 7 Jun 2024 12:59:36 +0800 Subject: [PATCH 010/183] refactor: add run tests in devlog add run tests in devlog Signed-off-by: ahlon --- DEVLOG.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/DEVLOG.md b/DEVLOG.md index 0768f40..fc983bb 100644 --- a/DEVLOG.md +++ b/DEVLOG.md @@ -42,6 +42,11 @@ pnpm run start:dev If all the above steps are done, and nothing failed, you can access the API at `http://localhost:3000/api` +- run tests +```shell +pnpm run test:e2e +``` + ## Development Logs ### init project From 835aaf4bc93570e5e923ff7686499f59529e8abb Mon Sep 17 00:00:00 2001 From: ahlon Date: Fri, 7 Jun 2024 14:32:47 +0800 Subject: [PATCH 011/183] refactor: update devlog update devlog Signed-off-by: ahlon --- DEVLOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/DEVLOG.md b/DEVLOG.md index fc983bb..fee8a5e 100644 --- a/DEVLOG.md +++ b/DEVLOG.md @@ -1,5 +1,5 @@ # Developer Guide -Before you start to get prepared for the develop environment, you need to make sure your basic tools are installed correctly. +This is guide for developers to setup the development environment. Before you start to get prepared for the develop environment, you need to make sure your basic tools are installed correctly. * Nodejs (Notice: To build the project, the right version is needed, otherwise installation can not be corrected, see .node-version) * pnpm From a3d78219f60a535f7fa4facf7a280ee72e917ee4 Mon Sep 17 00:00:00 2001 From: ZhaoYongchao Date: Wed, 19 Jun 2024 10:58:56 +0800 Subject: [PATCH 012/183] fix: add origin Signed-off-by: ZhaoYongchao --- .env.dev | 1 + .env.test | 1 + src/bootstrap.ts | 5 ++--- 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/.env.dev b/.env.dev index 2e0c018..921b142 100644 --- a/.env.dev +++ b/.env.dev @@ -4,6 +4,7 @@ SITE_ROOT_URL=http://localhost:3000 SITE_API_URL=${SITE_ROOT_URL}/api FRONTEND_SITE_URL=http://localhost:3030 FRONTEND_DOCS_URL=http://localhost:4000 +FRONTEND_APP_URL=http://localhost:8000 LOG_LEVEL=debug # default to stdout diff --git a/.env.test b/.env.test index 32aa5fb..81c63d4 100644 --- a/.env.test +++ b/.env.test @@ -4,6 +4,7 @@ SITE_ROOT_URL=http://localhost:3000 SITE_API_URL=${SITE_ROOT_URL}/api FRONTEND_SITE_URL=http://localhost:3030 FRONTEND_DOCS_URL=http://localhost:4000 +FRONTEND_APP_URL=http://localhost:8000 LOG_LEVEL=debug # default to stdout diff --git a/src/bootstrap.ts b/src/bootstrap.ts index c58eb88..4412783 100644 --- a/src/bootstrap.ts +++ b/src/bootstrap.ts @@ -78,7 +78,7 @@ async function bootstrap(app: NestFastifyApplication, port: string) { const configService = app.get(ConfigService); if (configService.get('ALLOW_CORS')) app.register(fastifyCors, { - origin: [process.env.FRONTEND_SITE_URL, process.env.FRONTEND_DOCS_URL], + origin: [process.env.FRONTEND_SITE_URL, process.env.FRONTEND_DOCS_URL, process.env.FRONTEND_APP_URL], methods: ['GET', 'POST', 'PUT', 'PATCH', 'DELETE'], allowedHeaders: ['Content-Type', 'Authorization'], credentials: true, // allow cookie @@ -201,8 +201,7 @@ function registerApi( }); logger.log( - `API Documentation: http://localhost:${ - process.env.PORT || 3000 + `API Documentation: http://localhost:${process.env.PORT || 3000 }/docs/api`, ); } From d6aecfa93e1bcb9e7177619bed61fa3a63bb55d8 Mon Sep 17 00:00:00 2001 From: dev-callgent Date: Fri, 21 Jun 2024 15:16:10 +0800 Subject: [PATCH 013/183] refactor: list adaptors Signed-off-by: dev-callgent --- prisma/schema.prisma | 2 +- .../email.adaptor.ts} | 6 +-- .../adaptors/endpoint-adaptor.decorator.ts | 2 +- src/endpoints/endpoints.controller.ts | 2 +- src/endpoints/endpoints.module.ts | 4 +- src/endpoints/endpoints.service.ts | 39 +++++++++++-------- .../listeners/callgent-created.listener.ts | 2 +- 7 files changed, 31 insertions(+), 26 deletions(-) rename src/endpoints/adaptors/builtin/{mail/mail.adaptor.ts => email/email.adaptor.ts} (92%) diff --git a/prisma/schema.prisma b/prisma/schema.prisma index 6d53ff5..b8461cc 100644 --- a/prisma/schema.prisma +++ b/prisma/schema.prisma @@ -316,7 +316,7 @@ enum EndpointType { EVENT } -/// @description a callgent may have multiple endpoints, including receiver & sender +/// @description a callgent may have multiple endpoints, including cep & sep model Endpoint { /// @DtoEntityHidden id Int @id @default(autoincrement()) diff --git a/src/endpoints/adaptors/builtin/mail/mail.adaptor.ts b/src/endpoints/adaptors/builtin/email/email.adaptor.ts similarity index 92% rename from src/endpoints/adaptors/builtin/mail/mail.adaptor.ts rename to src/endpoints/adaptors/builtin/email/email.adaptor.ts index 9f482c2..0b6cc0f 100644 --- a/src/endpoints/adaptors/builtin/mail/mail.adaptor.ts +++ b/src/endpoints/adaptors/builtin/email/email.adaptor.ts @@ -4,11 +4,11 @@ import { EndpointAdaptorName } from '../../endpoint-adaptor.decorator'; import { ApiSpec, EndpointAdaptor, - EndpointConfig + EndpointConfig, } from '../../endpoint-adaptor.interface'; -@EndpointAdaptorName('mail', 'both') -export class MailAdaptor implements EndpointAdaptor { +@EndpointAdaptorName('email', 'both') +export class EmailAdaptor implements EndpointAdaptor { getCallback( callback: string, rawReq: object, diff --git a/src/endpoints/adaptors/endpoint-adaptor.decorator.ts b/src/endpoints/adaptors/endpoint-adaptor.decorator.ts index 40cc625..18dd239 100644 --- a/src/endpoints/adaptors/endpoint-adaptor.decorator.ts +++ b/src/endpoints/adaptors/endpoint-adaptor.decorator.ts @@ -3,5 +3,5 @@ import { SetMetadata } from '@nestjs/common'; export const IS_CALLGENT_ENDPOINT_ADAPTOR = 'isCallgentEndpointAdaptor'; export const EndpointAdaptorName = ( name: string, - type: 'receiver' | 'sender' | 'both', + type: 'client' | 'server' | 'both', ) => SetMetadata(IS_CALLGENT_ENDPOINT_ADAPTOR, `${name}:${type}`); diff --git a/src/endpoints/endpoints.controller.ts b/src/endpoints/endpoints.controller.ts index a9c49fe..26cd116 100644 --- a/src/endpoints/endpoints.controller.ts +++ b/src/endpoints/endpoints.controller.ts @@ -26,7 +26,7 @@ export class EndpointsController { private readonly endpointsService: EndpointsService, ) {} - @Get() + @Get('adaptors') list(@Query('client') client?: boolean) { return this.endpointsService.list(client); } diff --git a/src/endpoints/endpoints.module.ts b/src/endpoints/endpoints.module.ts index 63f397a..2fdd445 100644 --- a/src/endpoints/endpoints.module.ts +++ b/src/endpoints/endpoints.module.ts @@ -1,5 +1,5 @@ import { Module } from '@nestjs/common'; -import { MailAdaptor } from './adaptors/builtin/mail/mail.adaptor'; +import { EmailAdaptor } from './adaptors/builtin/email/email.adaptor'; import { RestAPIAdaptor } from './adaptors/builtin/restapi/restapi.adaptor'; import { RestApiController } from './adaptors/builtin/restapi/restapi.controller'; import { WebpageAdaptor } from './adaptors/builtin/web/webpage.adaptor'; @@ -23,7 +23,7 @@ import { CallgentsModule } from '../callgents/callgents.module'; }, { provide: 'webpage-EndpointAdaptor', - useClass: MailAdaptor, + useClass: EmailAdaptor, }, ], controllers: [EndpointsController, RestApiController], diff --git a/src/endpoints/endpoints.service.ts b/src/endpoints/endpoints.service.ts index 81f54fd..ada365f 100644 --- a/src/endpoints/endpoints.service.ts +++ b/src/endpoints/endpoints.service.ts @@ -33,8 +33,8 @@ export class EndpointsService { createdBy: false, deletedAt: false, }; - private serversList = {}; - private clientsList = {}; + private serverAdaptorsList = {}; + private clientAdaptorsList = {}; onModuleInit() { const modules = [...this.modulesContainer.values()]; @@ -48,32 +48,34 @@ export class EndpointsService { ); if (name?.indexOf(':') > 0) { const [key, type] = name.split(/:(?=[^:]*$)/); - if (type == 'sender' || type == 'both') { - this._add2ServiceList(key, serviceKey, false); + if (type == 'server' || type == 'both') { + this._add2AdaptorsList(key, serviceKey, false); } - if (type == 'receiver' || type == 'both') { - this._add2ServiceList(key, serviceKey, true); + if (type == 'client' || type == 'both') { + this._add2AdaptorsList(key, serviceKey, true); } } } } } - private _add2ServiceList( + private _add2AdaptorsList( key: string, - serviceKey: InjectionToken, + adaptorKey: InjectionToken, client: boolean, ) { - const list = client ? this.clientsList : this.serversList; + const list = client ? this.clientAdaptorsList : this.serverAdaptorsList; if (key in list) throw new Error( - `Conflict endpoint key ${key}:[${String(serviceKey)}, ${list[key]}]`, + `Conflict endpoint adaptor key ${key}:[${String(adaptorKey)}, ${list[key]}]`, ); - list[key] = serviceKey; + list[key] = adaptorKey; } list(client: boolean) { - return Object.keys(client ? this.clientsList : this.serversList); + return Object.keys( + client ? this.clientAdaptorsList : this.serverAdaptorsList, + ); } @Transactional() @@ -128,12 +130,15 @@ export class EndpointsService { } getAdaptor(adaptorKey: string, endpointType?: EndpointType): EndpointAdaptor { - const list = endpointType == 'SERVER' ? this.serversList : this.clientsList; + const list = + endpointType == 'SERVER' + ? this.serverAdaptorsList + : this.clientAdaptorsList; if (adaptorKey in list) return this.moduleRef.get(list[adaptorKey], { strict: false }); - if (endpointType === undefined && adaptorKey in this.serversList) - return this.moduleRef.get(this.serversList[adaptorKey], { + if (endpointType === undefined && adaptorKey in this.serverAdaptorsList) + return this.moduleRef.get(this.serverAdaptorsList[adaptorKey], { strict: false, }); } @@ -210,8 +215,8 @@ export class EndpointsService { if (endpoint) { const adaptor = this.getAdaptor(endpoint.adaptorKey, endpoint.type); if (adaptor) { - // FIXME issue receiver token - // const content = await (endpoint.type == 'SENDER' + // FIXME issue client token + // const content = await (endpoint.type == 'SERVER' // ? adaptor.initSender // : adaptor.initReceiver)(initParams, endpoint as any); // if (content) diff --git a/src/endpoints/listeners/callgent-created.listener.ts b/src/endpoints/listeners/callgent-created.listener.ts index d53aed5..4fe83e8 100644 --- a/src/endpoints/listeners/callgent-created.listener.ts +++ b/src/endpoints/listeners/callgent-created.listener.ts @@ -12,7 +12,7 @@ export class CallgentCreatedListener { private readonly endpointsService: EndpointsService, ) {} - /** create a callgent with default api receiver endpoint, and mail receiver/sender endpoint */ + /** create a callgent with default api client endpoint, and mail client/server endpoint */ @Transactional() @OnEvent(CallgentCreatedEvent.eventName, { async: false }) async handleEvent(event: CallgentCreatedEvent) { From 5990215474cc836689a36e8ddef4cfaec5166e5a Mon Sep 17 00:00:00 2001 From: dev-callgent Date: Fri, 21 Jun 2024 16:22:36 +0800 Subject: [PATCH 014/183] feat: endpoints api Signed-off-by: dev-callgent --- src/endpoints/endpoints.controller.ts | 35 +++++++++++++++++++++++---- src/endpoints/endpoints.service.ts | 12 ++++++++- 2 files changed, 41 insertions(+), 6 deletions(-) diff --git a/src/endpoints/endpoints.controller.ts b/src/endpoints/endpoints.controller.ts index 26cd116..c363380 100644 --- a/src/endpoints/endpoints.controller.ts +++ b/src/endpoints/endpoints.controller.ts @@ -1,18 +1,26 @@ import { Body, Controller, + Delete, Get, Inject, Param, - Patch, Post, + Put, Query, Req, - UseGuards, + UseGuards } from '@nestjs/common'; -import { ApiSecurity, ApiTags } from '@nestjs/swagger'; +import { + ApiOkResponse, + ApiSecurity, + ApiTags, + getSchemaPath, +} from '@nestjs/swagger'; import { JwtGuard } from '../infra/auth/jwt/jwt.guard'; +import { RestApiResponse } from '../restapi/response.interface'; import { CreateEndpointDto } from './dto/create-endpoint.dto'; +import { EndpointDto } from './dto/endpoint.dto'; import { UpdateEndpointDto } from './dto/update-endpoint.dto'; import { EndpointsService } from './endpoints.service'; @@ -40,7 +48,7 @@ export class EndpointsController { // return adaptor.getConfig(); // } - @Post(':adaptorKey/callgents') + @Post(':adaptorKey/create') async createEndpoint( @Req() req, @Param('adaptorKey') adaptorKey: string, @@ -55,7 +63,7 @@ export class EndpointsController { }; } - @Patch(':uuid') + @Put(':uuid') async updateEndpoint( @Param('uuid') uuid: string, @Body() dto: UpdateEndpointDto, @@ -65,6 +73,23 @@ export class EndpointsController { }; } + @ApiOkResponse({ + schema: { + allOf: [ + { $ref: getSchemaPath(RestApiResponse) }, + { + properties: { + data: { $ref: getSchemaPath(EndpointDto) }, + }, + }, + ], + }, + }) + @Delete('/:uuid') + async delete(@Param('uuid') uuid: string) { + return { data: await this.endpointsService.delete(uuid) }; + } + /** for auth type `APP`, userKey is ignored */ // @Put('auth') // async upsertEndpointAuth(@Req() req, @Body() dto: CreateEndpointAuthDto) { diff --git a/src/endpoints/endpoints.service.ts b/src/endpoints/endpoints.service.ts index ada365f..382129f 100644 --- a/src/endpoints/endpoints.service.ts +++ b/src/endpoints/endpoints.service.ts @@ -67,7 +67,9 @@ export class EndpointsService { const list = client ? this.clientAdaptorsList : this.serverAdaptorsList; if (key in list) throw new Error( - `Conflict endpoint adaptor key ${key}:[${String(adaptorKey)}, ${list[key]}]`, + `Conflict endpoint adaptor key ${key}:[${String(adaptorKey)}, ${ + list[key] + }]`, ); list[key] = adaptorKey; } @@ -172,6 +174,14 @@ export class EndpointsService { throw new Error('Method not implemented.'); } + @Transactional() + delete(uuid: string) { + const prisma = this.txHost.tx as PrismaClient; + return selectHelper(this.defSelect, (select) => + prisma.endpoint.delete({ select, where: { uuid } }), + ); + } + // @Transactional() // upsertEndpointAuth( // dto: Prisma.EndpointAuthUncheckedCreateInput, From 0cc8914e0b84f4ef040c7284790d49e03b67db4b Mon Sep 17 00:00:00 2001 From: dev-callgent Date: Fri, 21 Jun 2024 17:28:35 +0800 Subject: [PATCH 015/183] docs: rename mail Signed-off-by: dev-callgent --- prisma/schema.prisma | 2 +- src/endpoints/listeners/callgent-created.listener.ts | 8 ++++---- src/executions/command.schema.ts | 2 +- src/users/users.service.ts | 4 ++-- test/e2e/endpoints.e2e-spec.ts | 2 +- 5 files changed, 9 insertions(+), 9 deletions(-) diff --git a/prisma/schema.prisma b/prisma/schema.prisma index b8461cc..abf6a6f 100644 --- a/prisma/schema.prisma +++ b/prisma/schema.prisma @@ -36,7 +36,7 @@ model Tenant { /// @DtoUpdateApiResponse /// @DtoPlainApiResponse uuid String @unique @db.VarChar(36) - mailHost String? @unique @db.VarChar(36) /// @description unique tenant mail host + emailHost String? @unique @db.VarChar(36) /// @description unique tenant email host name String? @db.VarChar(50) avatar String? @db.VarChar(1023) type Int @default(1) /// @description account type: 1: individual, 2: organization. diff --git a/src/endpoints/listeners/callgent-created.listener.ts b/src/endpoints/listeners/callgent-created.listener.ts index 4fe83e8..20d5edc 100644 --- a/src/endpoints/listeners/callgent-created.listener.ts +++ b/src/endpoints/listeners/callgent-created.listener.ts @@ -12,7 +12,7 @@ export class CallgentCreatedListener { private readonly endpointsService: EndpointsService, ) {} - /** create a callgent with default api client endpoint, and mail client/server endpoint */ + /** create a callgent with default api client endpoint, and email client/server endpoint */ @Transactional() @OnEvent(CallgentCreatedEvent.eventName, { async: false }) async handleEvent(event: CallgentCreatedEvent) { @@ -39,13 +39,13 @@ export class CallgentCreatedListener { // TODO API event endpoint - // mail client endpoint + // email client endpoint this.endpointsService .create({ callgentUuid: callgent.uuid, type: 'CLIENT', - adaptorKey: 'mail', - host: { mail: `callgent+${callgent.uuid}@my.callgent.com` }, + adaptorKey: 'email', + host: { email: `callgent+${callgent.uuid}@my.callgent.com` }, createdBy: callgent.createdBy, }) .then((endpoint) => { diff --git a/src/executions/command.schema.ts b/src/executions/command.schema.ts index 9651580..fdfc48e 100644 --- a/src/executions/command.schema.ts +++ b/src/executions/command.schema.ts @@ -41,7 +41,7 @@ export class Command { // ask a callgent to do sth, on some condition: // when resp.?, then callgent.act(args) -// guys, please send a mail at 3pm to xx, ask him whether and where want to go +// guys, please send an email at 3pm to xx, ask him whether and where want to go // if yes, book a table at where he want to go // TODO callgent routing diff --git a/src/users/users.service.ts b/src/users/users.service.ts index 6676d7a..ff59624 100644 --- a/src/users/users.service.ts +++ b/src/users/users.service.ts @@ -133,7 +133,7 @@ export class UsersService { ); } } else { - // register tenant from mail host + // register tenant from email host const tenant = await this.registerTenant(mailHost); if (tenant.deletedAt) @@ -266,7 +266,7 @@ export class UsersService { { sub: email, exp: 60 * 60 * 24, resetPwd, create, userId }, 'API_KEY', ); - // send mail + // send email return this.emailsService.sendTemplateMail( [{ email, name: ui?.name || email }], 'validation-email', diff --git a/test/e2e/endpoints.e2e-spec.ts b/test/e2e/endpoints.e2e-spec.ts index f893424..3286c13 100644 --- a/test/e2e/endpoints.e2e-spec.ts +++ b/test/e2e/endpoints.e2e-spec.ts @@ -78,7 +78,7 @@ export const createEndpoint = ( ) => { return pactum .spec() - .post(`/api/endpoints/${adaptorKey}/callgents`) + .post(`/api/endpoints/${adaptorKey}/create`) .withHeaders('x-callgent-authorization', TestConstant.authToken) .withBody(endpointDto) .expectStatus(201); From 8063ebb80aa28e989a4d16adcf7971c76c329913 Mon Sep 17 00:00:00 2001 From: dev-callgent Date: Mon, 24 Jun 2024 17:26:41 +0800 Subject: [PATCH 016/183] docs: rename mailHost Signed-off-by: dev-callgent --- src/users/users.service.ts | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/src/users/users.service.ts b/src/users/users.service.ts index ff59624..f33f08c 100644 --- a/src/users/users.service.ts +++ b/src/users/users.service.ts @@ -103,7 +103,7 @@ export class UsersService { async registerUserFromIdentity( ui: CreateUserIdentityDto & { email_verified?: boolean }, ) { - const [mailName, mailHost] = ui.email?.split('@') || []; + const [mailName, emailHost] = ui.email?.split('@') || []; ui.name || (ui.name = mailName) || (ui.name = `${ui.provider}@${ui.uid}`); const prisma = this.txHost.tx as PrismaClient; @@ -134,16 +134,16 @@ export class UsersService { } } else { // register tenant from email host - const tenant = await this.registerTenant(mailHost); + const tenant = await this.registerTenant(emailHost); if (tenant.deletedAt) throw new ForbiddenException( - mailHost, + emailHost, 'Sorry, current account has no access to our services', ); if (!(tenant.statusCode > 0)) throw new ForbiddenException( - mailHost, + emailHost, `Sorry, current account is in ${ tenant.statusCode == 0 ? 'pending' : 'inactive' } statusCode, please try again later.`, @@ -191,16 +191,16 @@ export class UsersService { * @returns new or existing tenant, even invalid */ @Transactional() - async registerTenant(mailHost: string) { - mailHost || (mailHost = undefined); + async registerTenant(emailHost: string) { + emailHost || (emailHost = undefined); const prisma = this.txHost.tx as PrismaClient; let tenant = - mailHost && + emailHost && (await prisma.tenant.findFirst({ where: { AND: { - mailHost, + emailHost, OR: [{ deletedAt: null }, { deletedAt: { not: null } }], }, }, @@ -211,8 +211,8 @@ export class UsersService { tenant = await prisma.tenant.create({ data: { uuid: Utils.uuid(), - mailHost, - name: mailHost, + emailHost, + name: emailHost, type: 1, statusCode: 1, // active by default }, From b1233f62818d34f972966468f1bab511dbfcceb8 Mon Sep 17 00:00:00 2001 From: dev-callgent Date: Tue, 25 Jun 2024 01:07:39 +0800 Subject: [PATCH 017/183] feat: get /api/bff/callgent-endpoints/{uuid} Signed-off-by: dev-callgent --- src/app.module.ts | 2 + .../callgent-tree.controller.spec.ts | 18 ++++++ .../callgent-tree.controller.ts | 64 +++++++++++++++++++ src/bff-callgent-tree/callgent-tree.module.ts | 10 +++ src/endpoints/endpoints.service.ts | 23 +++++++ 5 files changed, 117 insertions(+) create mode 100644 src/bff-callgent-tree/callgent-tree.controller.spec.ts create mode 100644 src/bff-callgent-tree/callgent-tree.controller.ts create mode 100644 src/bff-callgent-tree/callgent-tree.module.ts diff --git a/src/app.module.ts b/src/app.module.ts index 9fe4bed..bbe156b 100644 --- a/src/app.module.ts +++ b/src/app.module.ts @@ -17,6 +17,7 @@ import { ReposModule } from './infra/repo/repos.module'; import { TaskActionsModule } from './task-actions/task-actions.module'; import { TasksModule } from './tasks/tasks.module'; import { UsersModule } from './users/users.module'; +import { CallgentTreeModule } from './bff-callgent-tree/callgent-tree.module'; @Module({ imports: [ @@ -41,6 +42,7 @@ import { UsersModule } from './users/users.module'; EventListenersModule, EventStoresModule, EmailsModule, + CallgentTreeModule, ], controllers: [AppController], providers: [AppService], diff --git a/src/bff-callgent-tree/callgent-tree.controller.spec.ts b/src/bff-callgent-tree/callgent-tree.controller.spec.ts new file mode 100644 index 0000000..543a71f --- /dev/null +++ b/src/bff-callgent-tree/callgent-tree.controller.spec.ts @@ -0,0 +1,18 @@ +import { Test, TestingModule } from '@nestjs/testing'; +import { CallgentTreeController } from './callgent-tree.controller'; + +describe('CallgentTreeController', () => { + let controller: CallgentTreeController; + + beforeEach(async () => { + const module: TestingModule = await Test.createTestingModule({ + controllers: [CallgentTreeController], + }).compile(); + + controller = module.get(CallgentTreeController); + }); + + it('should be defined', () => { + expect(controller).toBeDefined(); + }); +}); diff --git a/src/bff-callgent-tree/callgent-tree.controller.ts b/src/bff-callgent-tree/callgent-tree.controller.ts new file mode 100644 index 0000000..637fa4c --- /dev/null +++ b/src/bff-callgent-tree/callgent-tree.controller.ts @@ -0,0 +1,64 @@ +import { + Controller, + Get, + Inject, + Logger, + NotFoundException, + Param, + UseGuards, +} from '@nestjs/common'; +import { CallgentsService } from '../callgents/callgents.service'; +import { EndpointsService } from '../endpoints/endpoints.service'; +import { JwtGuard } from '../infra/auth/jwt/jwt.guard'; + +@UseGuards(JwtGuard) +@Controller('bff') +export class CallgentTreeController { + constructor( + private readonly callgentsService: CallgentsService, + @Inject('EndpointsService') + private readonly endpointsService: EndpointsService, + ) {} + private readonly logger = new Logger(CallgentTreeController.name); + + /** + * @returns callgent with endpoints tree + */ + @Get('callgent-endpoints/:uuid') + async findOne(@Param('uuid') uuid: string) { + const callgent = await this.callgentsService.findOne(uuid); + if (!callgent) throw new NotFoundException(); + + const endpoints = await this.endpointsService.findAll({ + select: { callgentUuid: false }, + where: { callgentUuid: uuid }, + }); + + const [CEP, SEP, EEP] = [[], [], []]; + endpoints.forEach((ep) => { + if (ep.type == 'CLIENT') { + CEP.push(ep); + } else if (ep.type == 'SERVER') { + SEP.push(ep); + } else if (ep.type == 'EVENT') EEP.push(ep); + else + this.logger.error( + `Unknown endpoint type: ${ep.type}, ep.uuid=${ep.uuid}`, + ); + }); + + return { + data: { + id: callgent.uuid, + name: callgent.name, + createdAt: callgent.createdAt, + updatedAt: callgent.updatedAt, + children: [ + { id: 'CEP', name: 'CEP', children: CEP }, + { id: 'SEP', name: 'SEP', children: SEP }, + { id: 'EEP', name: 'EEP', children: EEP }, + ], + }, + }; + } +} diff --git a/src/bff-callgent-tree/callgent-tree.module.ts b/src/bff-callgent-tree/callgent-tree.module.ts new file mode 100644 index 0000000..5be5ce3 --- /dev/null +++ b/src/bff-callgent-tree/callgent-tree.module.ts @@ -0,0 +1,10 @@ +import { Module } from '@nestjs/common'; +import { CallgentsModule } from '../callgents/callgents.module'; +import { EndpointsModule } from '../endpoints/endpoints.module'; +import { CallgentTreeController } from './callgent-tree.controller'; + +@Module({ + imports: [CallgentsModule, EndpointsModule], + controllers: [CallgentTreeController], +}) +export class CallgentTreeModule {} diff --git a/src/endpoints/endpoints.service.ts b/src/endpoints/endpoints.service.ts index 382129f..198d042 100644 --- a/src/endpoints/endpoints.service.ts +++ b/src/endpoints/endpoints.service.ts @@ -131,6 +131,29 @@ export class EndpointsService { }); } + @Transactional() + findAll({ + select, + where, + orderBy = { id: 'desc' }, + }: { + select?: Prisma.EndpointSelect; + where?: Prisma.EndpointWhereInput; + orderBy?: Prisma.EndpointOrderByWithRelationInput; + }) { + const prisma = this.txHost.tx as PrismaClient; + return selectHelper( + select, + async (select) => + await prisma.endpoint.findMany({ + where, + select, + orderBy, + }), + this.defSelect, + ); + } + getAdaptor(adaptorKey: string, endpointType?: EndpointType): EndpointAdaptor { const list = endpointType == 'SERVER' From 5dd3696f4feaff4bbef84a6d1ea4ac17b716ba92 Mon Sep 17 00:00:00 2001 From: dev-callgent Date: Tue, 25 Jun 2024 08:52:41 +0800 Subject: [PATCH 018/183] feat: post /api/bff/callgent-endpoints Signed-off-by: dev-callgent --- prisma/schema.prisma | 7 ++- .../callgent-tree.controller.ts | 46 +++++++++++++------ src/endpoints/endpoints.service.ts | 2 + 3 files changed, 40 insertions(+), 15 deletions(-) diff --git a/prisma/schema.prisma b/prisma/schema.prisma index abf6a6f..146d1c7 100644 --- a/prisma/schema.prisma +++ b/prisma/schema.prisma @@ -36,7 +36,7 @@ model Tenant { /// @DtoUpdateApiResponse /// @DtoPlainApiResponse uuid String @unique @db.VarChar(36) - emailHost String? @unique @db.VarChar(36) /// @description unique tenant email host + emailHost String? @unique @db.VarChar(36) /// @description unique tenant email host name String? @db.VarChar(50) avatar String? @db.VarChar(1023) type Int @default(1) /// @description account type: 1: individual, 2: organization. @@ -198,7 +198,7 @@ model CallgentFunction { // @DtoReadOnly /// @CustomValidator(EntityIdExists, 'callgent', 'uuid', ../../infra/repo/validators/entity-exists.validator) - callgentUuid String @db.VarChar(36) + callgentUuid String @db.VarChar(36) /// @description actual server endpoint, when action type is `ENDPOINT` /// @CustomValidator(EntityIdExists, 'endpoint', 'uuid', ../../infra/repo/validators/entity-exists.validator) endpointUuid String? @db.VarChar(36) @@ -329,6 +329,9 @@ model Endpoint { // add to migration.sql tenantId Int @default(dbgenerated("(current_setting('tenancy.tenantId')::int)")) + /// @DtoUpdateApiResponse + /// @DtoPlainApiResponse + name String @default("") @db.VarChar(2047) /// @DtoUpdateApiResponse /// @DtoPlainApiResponse type EndpointType /// @description endpoint type: CLIENT, SERVER OR EVENT diff --git a/src/bff-callgent-tree/callgent-tree.controller.ts b/src/bff-callgent-tree/callgent-tree.controller.ts index 637fa4c..b65915f 100644 --- a/src/bff-callgent-tree/callgent-tree.controller.ts +++ b/src/bff-callgent-tree/callgent-tree.controller.ts @@ -1,15 +1,20 @@ import { + Body, Controller, Get, Inject, Logger, NotFoundException, Param, + Post, + Req, UseGuards, } from '@nestjs/common'; import { CallgentsService } from '../callgents/callgents.service'; +import { CreateCallgentDto } from '../callgents/dto/create-callgent.dto'; import { EndpointsService } from '../endpoints/endpoints.service'; import { JwtGuard } from '../infra/auth/jwt/jwt.guard'; +import { Callgent } from '@prisma/client'; @UseGuards(JwtGuard) @Controller('bff') @@ -29,9 +34,25 @@ export class CallgentTreeController { const callgent = await this.callgentsService.findOne(uuid); if (!callgent) throw new NotFoundException(); + const data = await this._callgentTree(callgent); + + return { data }; + } + + /** + * @returns callgent with endpoints tree + */ + @Post('callgent-endpoints') + async create(@Req() req, @Body() dto: CreateCallgentDto) { + const callgent = await this.callgentsService.create(dto, req.user.sub); + const data = await this._callgentTree(callgent); + return { data }; + } + + private async _callgentTree(callgent: Callgent) { const endpoints = await this.endpointsService.findAll({ select: { callgentUuid: false }, - where: { callgentUuid: uuid }, + where: { callgentUuid: callgent.uuid }, }); const [CEP, SEP, EEP] = [[], [], []]; @@ -47,18 +68,17 @@ export class CallgentTreeController { ); }); - return { - data: { - id: callgent.uuid, - name: callgent.name, - createdAt: callgent.createdAt, - updatedAt: callgent.updatedAt, - children: [ - { id: 'CEP', name: 'CEP', children: CEP }, - { id: 'SEP', name: 'SEP', children: SEP }, - { id: 'EEP', name: 'EEP', children: EEP }, - ], - }, + const data = { + id: callgent.uuid, + name: callgent.name, + createdAt: callgent.createdAt, + updatedAt: callgent.updatedAt, + children: [ + { id: 'CEP', name: 'CEP', children: CEP }, + { id: 'SEP', name: 'SEP', children: SEP }, + { id: 'EEP', name: 'EEP', children: EEP }, + ], }; + return data; } } diff --git a/src/endpoints/endpoints.service.ts b/src/endpoints/endpoints.service.ts index 198d042..1bc8899 100644 --- a/src/endpoints/endpoints.service.ts +++ b/src/endpoints/endpoints.service.ts @@ -180,6 +180,8 @@ export class EndpointsService { 'Invalid endpoint adaptor key=' + dto.adaptorKey, ); + // FIXME init ep name + const uuid = Utils.uuid(); return selectHelper( select, From d56199fdc82a988e9a405bbcc87ba1ef46239a3a Mon Sep 17 00:00:00 2001 From: dev-callgent Date: Tue, 25 Jun 2024 15:39:56 +0800 Subject: [PATCH 019/183] feat: get /api/bff/callgent-endpoints/{uuid} Signed-off-by: dev-callgent --- src/bff-callgent-tree/callgent-tree.controller.ts | 2 +- src/callgents/callgents.controller.ts | 9 +++++++-- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/src/bff-callgent-tree/callgent-tree.controller.ts b/src/bff-callgent-tree/callgent-tree.controller.ts index b65915f..75cd98e 100644 --- a/src/bff-callgent-tree/callgent-tree.controller.ts +++ b/src/bff-callgent-tree/callgent-tree.controller.ts @@ -69,7 +69,7 @@ export class CallgentTreeController { }); const data = { - id: callgent.uuid, + uuid: callgent.uuid, name: callgent.name, createdAt: callgent.createdAt, updatedAt: callgent.updatedAt, diff --git a/src/callgents/callgents.controller.ts b/src/callgents/callgents.controller.ts index 18e73f5..ab761ca 100644 --- a/src/callgents/callgents.controller.ts +++ b/src/callgents/callgents.controller.ts @@ -71,7 +71,10 @@ export class CallgentsController { { $ref: getSchemaPath(RestApiResponse) }, { properties: { - data: { type: 'array', items: { $ref: getSchemaPath(CallgentDto) } }, + data: { + type: 'array', + items: { $ref: getSchemaPath(CallgentDto) }, + }, }, }, ], @@ -86,11 +89,13 @@ export class CallgentsController { name: { contains: query.queryString }, } : undefined; - return this.callgentService.findAll({ + const list = await this.callgentService.findAll({ page: query.page, perPage: query.perPage, where, }); + list.data?.forEach((item: any) => (item.children = [])); + return list; } @ApiOkResponse({ From f742340c83215d45d062c39620f790c334f7fead Mon Sep 17 00:00:00 2001 From: dev-callgent Date: Tue, 25 Jun 2024 15:43:18 +0800 Subject: [PATCH 020/183] refactor: uuid to id Signed-off-by: dev-callgent --- src/bff-callgent-tree/callgent-tree.controller.ts | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/bff-callgent-tree/callgent-tree.controller.ts b/src/bff-callgent-tree/callgent-tree.controller.ts index 75cd98e..7ce93c9 100644 --- a/src/bff-callgent-tree/callgent-tree.controller.ts +++ b/src/bff-callgent-tree/callgent-tree.controller.ts @@ -56,7 +56,8 @@ export class CallgentTreeController { }); const [CEP, SEP, EEP] = [[], [], []]; - endpoints.forEach((ep) => { + endpoints.forEach((ep: any) => { + ep = { ...ep, id: ep.uuid, uuid: undefined }; if (ep.type == 'CLIENT') { CEP.push(ep); } else if (ep.type == 'SERVER') { @@ -69,7 +70,7 @@ export class CallgentTreeController { }); const data = { - uuid: callgent.uuid, + id: callgent.uuid, name: callgent.name, createdAt: callgent.createdAt, updatedAt: callgent.updatedAt, From e9dd551a190bfeab59a9ce83088fc9e13743cd31 Mon Sep 17 00:00:00 2001 From: dev-callgent Date: Wed, 26 Jun 2024 16:38:37 +0800 Subject: [PATCH 021/183] refactor: endpoint ids Signed-off-by: dev-callgent --- src/bff-callgent-tree/callgent-tree.controller.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/bff-callgent-tree/callgent-tree.controller.ts b/src/bff-callgent-tree/callgent-tree.controller.ts index 7ce93c9..f45a12e 100644 --- a/src/bff-callgent-tree/callgent-tree.controller.ts +++ b/src/bff-callgent-tree/callgent-tree.controller.ts @@ -75,9 +75,9 @@ export class CallgentTreeController { createdAt: callgent.createdAt, updatedAt: callgent.updatedAt, children: [ - { id: 'CEP', name: 'CEP', children: CEP }, - { id: 'SEP', name: 'SEP', children: SEP }, - { id: 'EEP', name: 'EEP', children: EEP }, + { id: 'CLIENT', name: 'CEP', children: CEP }, + { id: 'SERVER', name: 'SEP', children: SEP }, + { id: 'EVENT', name: 'EEP', children: EEP }, ], }; return data; From 81eb948ff59f25d554b64e45aeba9f6ec21af65b Mon Sep 17 00:00:00 2001 From: dev-callgent Date: Thu, 27 Jun 2024 16:21:32 +0800 Subject: [PATCH 022/183] refactor: rename email adaptor key Signed-off-by: dev-callgent --- .../callgent-tree.controller.ts | 21 ++++++++++++++++--- .../adaptors/builtin/email/email.adaptor.ts | 2 +- src/endpoints/endpoints.module.ts | 4 ++-- .../listeners/callgent-created.listener.ts | 8 +++---- 4 files changed, 25 insertions(+), 10 deletions(-) diff --git a/src/bff-callgent-tree/callgent-tree.controller.ts b/src/bff-callgent-tree/callgent-tree.controller.ts index f45a12e..9e60c7f 100644 --- a/src/bff-callgent-tree/callgent-tree.controller.ts +++ b/src/bff-callgent-tree/callgent-tree.controller.ts @@ -75,9 +75,24 @@ export class CallgentTreeController { createdAt: callgent.createdAt, updatedAt: callgent.updatedAt, children: [ - { id: 'CLIENT', name: 'CEP', children: CEP }, - { id: 'SERVER', name: 'SEP', children: SEP }, - { id: 'EVENT', name: 'EEP', children: EEP }, + { + id: 'CLIENT', + name: 'Client Endpoints (CEP)', + hint: 'Adaptor to accept request to the callgent', + children: CEP, + }, + { + id: 'SERVER', + name: 'Server Endpoints (SEP)', + hint: 'Adaptor to forward the request to actual service', + children: SEP, + }, + { + id: 'EVENT', + name: 'Event Endpoints (EEP)', + hint: 'To accept service events and trigger your registered listener', + children: EEP, + }, ], }; return data; diff --git a/src/endpoints/adaptors/builtin/email/email.adaptor.ts b/src/endpoints/adaptors/builtin/email/email.adaptor.ts index 0b6cc0f..df69b02 100644 --- a/src/endpoints/adaptors/builtin/email/email.adaptor.ts +++ b/src/endpoints/adaptors/builtin/email/email.adaptor.ts @@ -7,7 +7,7 @@ import { EndpointConfig, } from '../../endpoint-adaptor.interface'; -@EndpointAdaptorName('email', 'both') +@EndpointAdaptorName('Email', 'both') export class EmailAdaptor implements EndpointAdaptor { getCallback( callback: string, diff --git a/src/endpoints/endpoints.module.ts b/src/endpoints/endpoints.module.ts index 2fdd445..0ae760b 100644 --- a/src/endpoints/endpoints.module.ts +++ b/src/endpoints/endpoints.module.ts @@ -18,11 +18,11 @@ import { CallgentsModule } from '../callgents/callgents.module'; useClass: RestAPIAdaptor, }, { - provide: 'webpage-EndpointAdaptor', + provide: 'Webpage-EndpointAdaptor', useClass: WebpageAdaptor, }, { - provide: 'webpage-EndpointAdaptor', + provide: 'Email-EndpointAdaptor', useClass: EmailAdaptor, }, ], diff --git a/src/endpoints/listeners/callgent-created.listener.ts b/src/endpoints/listeners/callgent-created.listener.ts index 20d5edc..28d1e5f 100644 --- a/src/endpoints/listeners/callgent-created.listener.ts +++ b/src/endpoints/listeners/callgent-created.listener.ts @@ -12,7 +12,7 @@ export class CallgentCreatedListener { private readonly endpointsService: EndpointsService, ) {} - /** create a callgent with default api client endpoint, and email client/server endpoint */ + /** create a callgent with default api client endpoint, and Email client/server endpoint */ @Transactional() @OnEvent(CallgentCreatedEvent.eventName, { async: false }) async handleEvent(event: CallgentCreatedEvent) { @@ -39,13 +39,13 @@ export class CallgentCreatedListener { // TODO API event endpoint - // email client endpoint + // Email client endpoint this.endpointsService .create({ callgentUuid: callgent.uuid, type: 'CLIENT', - adaptorKey: 'email', - host: { email: `callgent+${callgent.uuid}@my.callgent.com` }, + adaptorKey: 'Email', + host: `callgent+${callgent.uuid}@my.callgent.com`, createdBy: callgent.createdBy, }) .then((endpoint) => { From 49bc8acfc28d2f36f2a5008027c00f45e3510491 Mon Sep 17 00:00:00 2001 From: dev-callgent Date: Thu, 27 Jun 2024 17:42:24 +0800 Subject: [PATCH 023/183] feat: ep name Signed-off-by: dev-callgent --- prisma/schema.prisma | 8 +++----- src/endpoints/endpoints.controller.ts | 2 +- src/endpoints/endpoints.service.ts | 14 ++++++++++---- .../listeners/callgent-created.listener.ts | 4 ++-- 4 files changed, 16 insertions(+), 12 deletions(-) diff --git a/prisma/schema.prisma b/prisma/schema.prisma index 146d1c7..99487fe 100644 --- a/prisma/schema.prisma +++ b/prisma/schema.prisma @@ -329,8 +329,6 @@ model Endpoint { // add to migration.sql tenantId Int @default(dbgenerated("(current_setting('tenancy.tenantId')::int)")) - /// @DtoUpdateApiResponse - /// @DtoPlainApiResponse name String @default("") @db.VarChar(2047) /// @DtoUpdateApiResponse /// @DtoPlainApiResponse @@ -341,9 +339,9 @@ model Endpoint { adaptorKey String @db.VarChar(127) /// @description endpoint adaptor key priority Int @default(0) /// @description priority in the callgent - host Json @db.Json /// @description host address & configs - initParams Json? @db.Json /// @description initializing parameters - content Json? @db.Json /// @description generated content/code by init method + host String @db.VarChar(2047) /// @description host address, e.g. '/api/callgents/rbhes0-w4rff/{uuid}/invoke/api/', where `{uuid}` will be replaced with current endpoint uuid + initParams Json? @db.Json /// @description initializing parameters + content Json? @db.Json /// @description generated content/code by init method /// @DtoUpdateApiResponse /// @DtoPlainApiResponse diff --git a/src/endpoints/endpoints.controller.ts b/src/endpoints/endpoints.controller.ts index c363380..5ee894b 100644 --- a/src/endpoints/endpoints.controller.ts +++ b/src/endpoints/endpoints.controller.ts @@ -9,7 +9,7 @@ import { Put, Query, Req, - UseGuards + UseGuards, } from '@nestjs/common'; import { ApiOkResponse, diff --git a/src/endpoints/endpoints.service.ts b/src/endpoints/endpoints.service.ts index 1bc8899..008a828 100644 --- a/src/endpoints/endpoints.service.ts +++ b/src/endpoints/endpoints.service.ts @@ -1,4 +1,8 @@ -import { TransactionHost, Transactional } from '@nestjs-cls/transactional'; +import { + Propagation, + TransactionHost, + Transactional, +} from '@nestjs-cls/transactional'; import { TransactionalAdapterPrisma } from '@nestjs-cls/transactional-adapter-prisma'; import { BadRequestException, @@ -180,9 +184,11 @@ export class EndpointsService { 'Invalid endpoint adaptor key=' + dto.adaptorKey, ); - // FIXME init ep name - const uuid = Utils.uuid(); + // init ep name + dto.host = dto.host.replace('{uuid}', uuid); + dto.name || (dto.name = dto.host); + return selectHelper( select, (select) => @@ -241,7 +247,7 @@ export class EndpointsService { // ); // } - @Transactional() + @Transactional(Propagation.RequiresNew) async init(uuid: string, initParams: object) { return; const prisma = this.txHost.tx as PrismaClient; diff --git a/src/endpoints/listeners/callgent-created.listener.ts b/src/endpoints/listeners/callgent-created.listener.ts index 28d1e5f..d380452 100644 --- a/src/endpoints/listeners/callgent-created.listener.ts +++ b/src/endpoints/listeners/callgent-created.listener.ts @@ -28,11 +28,11 @@ export class CallgentCreatedListener { callgentUuid: callgent.uuid, type: 'CLIENT', adaptorKey: 'restAPI', - host: {}, + host: `/api/callgents/${callgent.uuid}/{uuid}/invoke/api/`, createdBy: callgent.createdBy, }) .then((endpoint) => { - // no await init, it may be slow, TODO: tx invalid + // no await init, it may be slow, init must restart a new tx this.endpointsService.init(endpoint.uuid, []); return endpoint; }), From a2c41f79cd8df89bd5aecca88518c8d91d989770 Mon Sep 17 00:00:00 2001 From: ahlon Date: Thu, 27 Jun 2024 18:41:21 +0800 Subject: [PATCH 024/183] refactor: update test case doc Signed-off-by: ahlon --- src/callgent-functions/callgent-functions.service.ts | 3 +++ test/e2e/callgents.e2e-spec.ts | 1 + test/e2e/endpoints.e2e-spec.ts | 2 ++ 3 files changed, 6 insertions(+) diff --git a/src/callgent-functions/callgent-functions.service.ts b/src/callgent-functions/callgent-functions.service.ts index 3a360a2..698023f 100644 --- a/src/callgent-functions/callgent-functions.service.ts +++ b/src/callgent-functions/callgent-functions.service.ts @@ -93,6 +93,9 @@ export class CallgentFunctionsService { return { ...e, uuid: Utils.uuid(), + funName: e.name, + documents: e.content.summary, + fullCode: '', endpointUuid: endpoint.uuid, callgentUuid: endpoint.callgentUuid, createdBy: createdBy, diff --git a/test/e2e/callgents.e2e-spec.ts b/test/e2e/callgents.e2e-spec.ts index ef26504..cb5026c 100644 --- a/test/e2e/callgents.e2e-spec.ts +++ b/test/e2e/callgents.e2e-spec.ts @@ -15,6 +15,7 @@ describe('CallgentsController (e2e)', () => { afterEach(afterEachFn); const endpoint = '/api/callgents'; + it(`${endpoint} (POST): create new callgent no auth, 401`, async () => { await createCallgent({}, false); }); diff --git a/test/e2e/endpoints.e2e-spec.ts b/test/e2e/endpoints.e2e-spec.ts index f893424..fb72917 100644 --- a/test/e2e/endpoints.e2e-spec.ts +++ b/test/e2e/endpoints.e2e-spec.ts @@ -59,6 +59,7 @@ export const prepareCannyCallgent = async () => { host: { url: 'https://canny.io/api/v1' }, }); + // import api definitions const jsonData = await fs.readFile('./test/e2e/data/canny-apis.json', 'utf8'); const { json: { data: functionCount }, @@ -67,6 +68,7 @@ export const prepareCannyCallgent = async () => { text: jsonData, format: 'openAPI', }); + console.log({ serverEndpoint, functionCount }); return callgent; From fc79d90fd723d8680e09d0ab0fb069d9ebe0f1f6 Mon Sep 17 00:00:00 2001 From: ZhaoYongchao Date: Sat, 29 Jun 2024 07:42:22 +0800 Subject: [PATCH 025/183] fix: register Signed-off-by: ZhaoYongchao --- src/users/users.service.ts | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/users/users.service.ts b/src/users/users.service.ts index f33f08c..ffe4477 100644 --- a/src/users/users.service.ts +++ b/src/users/users.service.ts @@ -42,6 +42,7 @@ export class UsersService { /** * validate pwd * @returns valid user object or undefined + * @throws UnauthorizedException */ async login(email: string, password: string) { const ui = await this.findUserIdentity(email, 'local', { @@ -114,6 +115,9 @@ export class UsersService { // if exists, no creation if (uiInDb) { + if (uiInDb.provider == 'local') + await this.login(uiInDb.uid, ui.credentials); + if ( uiInDb.deletedAt || uiInDb.user?.deletedAt || From 90b85bd1a6662ca14ec9c8c58f5934493dbacbfd Mon Sep 17 00:00:00 2001 From: dev-callgent Date: Mon, 1 Jul 2024 09:56:22 +0800 Subject: [PATCH 026/183] feat: sep functions in tree Signed-off-by: dev-callgent --- .../callgent-tree.controller.ts | 22 +++++++++++++++---- src/bff-callgent-tree/callgent-tree.module.ts | 3 ++- .../callgent-functions.service.ts | 5 ++++- 3 files changed, 24 insertions(+), 6 deletions(-) diff --git a/src/bff-callgent-tree/callgent-tree.controller.ts b/src/bff-callgent-tree/callgent-tree.controller.ts index 9e60c7f..54da3eb 100644 --- a/src/bff-callgent-tree/callgent-tree.controller.ts +++ b/src/bff-callgent-tree/callgent-tree.controller.ts @@ -10,11 +10,12 @@ import { Req, UseGuards, } from '@nestjs/common'; +import { Callgent } from '@prisma/client'; +import { CallgentFunctionsService } from '../callgent-functions/callgent-functions.service'; import { CallgentsService } from '../callgents/callgents.service'; import { CreateCallgentDto } from '../callgents/dto/create-callgent.dto'; import { EndpointsService } from '../endpoints/endpoints.service'; import { JwtGuard } from '../infra/auth/jwt/jwt.guard'; -import { Callgent } from '@prisma/client'; @UseGuards(JwtGuard) @Controller('bff') @@ -23,6 +24,8 @@ export class CallgentTreeController { private readonly callgentsService: CallgentsService, @Inject('EndpointsService') private readonly endpointsService: EndpointsService, + @Inject('CallgentFunctionsService') + private readonly callgentFunctionsService: CallgentFunctionsService, ) {} private readonly logger = new Logger(CallgentTreeController.name); @@ -56,14 +59,25 @@ export class CallgentTreeController { }); const [CEP, SEP, EEP] = [[], [], []]; - endpoints.forEach((ep: any) => { + endpoints.forEach(async (ep: any) => { ep = { ...ep, id: ep.uuid, uuid: undefined }; if (ep.type == 'CLIENT') { CEP.push(ep); } else if (ep.type == 'SERVER') { SEP.push(ep); - } else if (ep.type == 'EVENT') EEP.push(ep); - else + const funcs = await this.callgentFunctionsService.findMany({ + select: { fullCode: false, callgentUuid: false, content: false }, + where: { endpointUuid: ep.uuid }, + }); + ep.children = funcs.map((f) => ({ + ...f, + id: f.uuid, + uuid: undefined, + })); + } else if (ep.type == 'EVENT') { + EEP.push(ep); + // TODO listeners as children + } else this.logger.error( `Unknown endpoint type: ${ep.type}, ep.uuid=${ep.uuid}`, ); diff --git a/src/bff-callgent-tree/callgent-tree.module.ts b/src/bff-callgent-tree/callgent-tree.module.ts index 5be5ce3..c22b57b 100644 --- a/src/bff-callgent-tree/callgent-tree.module.ts +++ b/src/bff-callgent-tree/callgent-tree.module.ts @@ -1,10 +1,11 @@ import { Module } from '@nestjs/common'; +import { CallgentFunctionsModule } from '../callgent-functions/callgent-functions.module'; import { CallgentsModule } from '../callgents/callgents.module'; import { EndpointsModule } from '../endpoints/endpoints.module'; import { CallgentTreeController } from './callgent-tree.controller'; @Module({ - imports: [CallgentsModule, EndpointsModule], + imports: [CallgentsModule, EndpointsModule, CallgentFunctionsModule], controllers: [CallgentTreeController], }) export class CallgentTreeModule {} diff --git a/src/callgent-functions/callgent-functions.service.ts b/src/callgent-functions/callgent-functions.service.ts index 698023f..ce1796c 100644 --- a/src/callgent-functions/callgent-functions.service.ts +++ b/src/callgent-functions/callgent-functions.service.ts @@ -162,7 +162,10 @@ export class CallgentFunctionsService { orderBy?: Prisma.CallgentFunctionOrderByWithRelationInput; }) { const prisma = this.txHost.tx as PrismaClient; - return prisma.callgentFunction.findMany({ ...args }); + return prisma.callgentFunction.findMany({ + ...args, + select: { ...this.defSelect, ...args.select }, + }); } @Transactional() From c484ec6b7873543f49c30f1a854fd6c9030cd6b0 Mon Sep 17 00:00:00 2001 From: dev-callgent Date: Sun, 7 Jul 2024 11:32:03 +0800 Subject: [PATCH 027/183] feat: returns existing when creating callgent Signed-off-by: dev-callgent --- .../callgent-tree.controller.ts | 6 +++-- src/callgents/callgents.service.ts | 27 +++++++++++++++++-- src/infra/repo/prisma.middlewares.ts | 4 ++- 3 files changed, 32 insertions(+), 5 deletions(-) diff --git a/src/bff-callgent-tree/callgent-tree.controller.ts b/src/bff-callgent-tree/callgent-tree.controller.ts index 54da3eb..4fbde22 100644 --- a/src/bff-callgent-tree/callgent-tree.controller.ts +++ b/src/bff-callgent-tree/callgent-tree.controller.ts @@ -43,11 +43,13 @@ export class CallgentTreeController { } /** - * @returns callgent with endpoints tree + * @returns new or existing callgent with endpoints tree */ @Post('callgent-endpoints') async create(@Req() req, @Body() dto: CreateCallgentDto) { - const callgent = await this.callgentsService.create(dto, req.user.sub); + let callgent = await this.callgentsService.getByName(dto.name); + if (!callgent) + callgent = await this.callgentsService.create(dto, req.user.sub); const data = await this._callgentTree(callgent); return { data }; } diff --git a/src/callgents/callgents.service.ts b/src/callgents/callgents.service.ts index 046cc4a..39122e5 100644 --- a/src/callgents/callgents.service.ts +++ b/src/callgents/callgents.service.ts @@ -145,6 +145,25 @@ export class CallgentsService { ); } + @Transactional() + getByName(name: string, select?: Prisma.CallgentSelect) { + const tenantId = this.tenancyService.getTenantId(); + const prisma = this.txHost.tx as PrismaClient; + return selectHelper( + { ...select, deletedAt: null }, + (select) => + prisma.callgent.findUnique({ + select, + where: { tenantId_name: { tenantId, name } }, + }), + this.defSelect, + ).then((c) => { + if (c.deletedAt) return null; + delete c.deletedAt; + return c; + }); + } + @Transactional() async duplicateOverTenancy( dupUuid: string, @@ -156,7 +175,9 @@ export class CallgentsService { await this.tenancyService.bypassTenancy(prisma); const dup = await prisma.callgent.findUnique({ where: { uuid: dupUuid } }); if (!dup) - throw new NotFoundException('callgent to duplicate not found: ' + dupUuid); + throw new NotFoundException( + 'callgent to duplicate not found: ' + dupUuid, + ); await this.tenancyService.bypassTenancy(prisma, false); const callgent = await this.create(dto, createdBy, { id: null }); @@ -191,7 +212,9 @@ export class CallgentsService { // check targets if (!callgent) - throw new NotFoundException('callgent not found: ' + endpoint.callgentUuid); + throw new NotFoundException( + 'callgent not found: ' + endpoint.callgentUuid, + ); if (actions.length === 0) throw new NotFoundException( `callgent=${endpoint.callgentUuid} API action not found: ${act}`, diff --git a/src/infra/repo/prisma.middlewares.ts b/src/infra/repo/prisma.middlewares.ts index df3315d..d12d5b8 100644 --- a/src/infra/repo/prisma.middlewares.ts +++ b/src/infra/repo/prisma.middlewares.ts @@ -25,7 +25,9 @@ export const mainPrismaServiceOptions = ( Tenant: deleteHandle, User: deleteHandle, UserIdentity: deleteHandle, - Callgent: deleteHandle, + // need to exclude soft deleted records in a compound findUnique operation + // https://github.com/olivierwilkinson/prisma-soft-delete-middleware?tab=readme-ov-file#excluding-soft-deleted-records-in-a-findunique-operation + Callgent: { ...deleteHandle, allowCompoundUniqueIndexWhere: true }, CallgentFunction: deleteHandle, Endpoint: deleteHandle, Task: deleteHandle, From a183109aaacc448fb64773d62200737f58ac518a Mon Sep 17 00:00:00 2001 From: dev-callgent Date: Sun, 7 Jul 2024 11:59:08 +0800 Subject: [PATCH 028/183] fix: find many functions Signed-off-by: dev-callgent --- .../callgent-functions.service.ts | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/src/callgent-functions/callgent-functions.service.ts b/src/callgent-functions/callgent-functions.service.ts index ce1796c..0e3c589 100644 --- a/src/callgent-functions/callgent-functions.service.ts +++ b/src/callgent-functions/callgent-functions.service.ts @@ -156,16 +156,21 @@ export class CallgentFunctionsService { ); } - findMany(args: { + findMany({ + select, + where, + orderBy, + }: { select?: Prisma.CallgentFunctionSelect; where?: Prisma.CallgentFunctionWhereInput; orderBy?: Prisma.CallgentFunctionOrderByWithRelationInput; }) { const prisma = this.txHost.tx as PrismaClient; - return prisma.callgentFunction.findMany({ - ...args, - select: { ...this.defSelect, ...args.select }, - }); + return selectHelper( + select, + (select) => prisma.callgentFunction.findMany({ where, select, orderBy }), + this.defSelect, + ); } @Transactional() From 32834f635775a73bb8ab33d16a5521822b9cf509 Mon Sep 17 00:00:00 2001 From: dev-callgent Date: Sun, 7 Jul 2024 12:26:30 +0800 Subject: [PATCH 029/183] fix: get callgent by name Signed-off-by: dev-callgent --- src/callgents/callgents.service.ts | 2 +- test/e2e/endpoints.e2e-spec.ts | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/callgents/callgents.service.ts b/src/callgents/callgents.service.ts index 39122e5..0b75e3c 100644 --- a/src/callgents/callgents.service.ts +++ b/src/callgents/callgents.service.ts @@ -158,7 +158,7 @@ export class CallgentsService { }), this.defSelect, ).then((c) => { - if (c.deletedAt) return null; + if (!c || c.deletedAt) return null; delete c.deletedAt; return c; }); diff --git a/test/e2e/endpoints.e2e-spec.ts b/test/e2e/endpoints.e2e-spec.ts index c437b30..140b347 100644 --- a/test/e2e/endpoints.e2e-spec.ts +++ b/test/e2e/endpoints.e2e-spec.ts @@ -56,7 +56,7 @@ export const prepareCannyCallgent = async () => { } = await createEndpoint('restAPI', { callgentUuid: callgent.uuid, type: 'SERVER', - host: { url: 'https://canny.io/api/v1' }, + host: 'https://canny.io/api/v1', }); // import api definitions @@ -68,7 +68,7 @@ export const prepareCannyCallgent = async () => { text: jsonData, format: 'openAPI', }); - + console.log({ serverEndpoint, functionCount }); return callgent; From db8d5faacba217e5cf8222b0679739a56ee18ecc Mon Sep 17 00:00:00 2001 From: dev-callgent Date: Tue, 9 Jul 2024 10:27:48 +0800 Subject: [PATCH 030/183] feat: callgent-function tree Signed-off-by: dev-callgent --- .../callgent-tree.controller.ts | 48 ++++++----- .../adaptors/builtin/email/email.adaptor.ts | 10 ++- .../builtin/restapi/restapi.adaptor.ts | 57 +------------ .../adaptors/builtin/web/webpage.adaptor.ts | 9 +- .../adaptors/endpoint-adaptor.interface.ts | 83 ++++++++++++++++--- 5 files changed, 115 insertions(+), 92 deletions(-) diff --git a/src/bff-callgent-tree/callgent-tree.controller.ts b/src/bff-callgent-tree/callgent-tree.controller.ts index 4fbde22..12affbb 100644 --- a/src/bff-callgent-tree/callgent-tree.controller.ts +++ b/src/bff-callgent-tree/callgent-tree.controller.ts @@ -61,29 +61,31 @@ export class CallgentTreeController { }); const [CEP, SEP, EEP] = [[], [], []]; - endpoints.forEach(async (ep: any) => { - ep = { ...ep, id: ep.uuid, uuid: undefined }; - if (ep.type == 'CLIENT') { - CEP.push(ep); - } else if (ep.type == 'SERVER') { - SEP.push(ep); - const funcs = await this.callgentFunctionsService.findMany({ - select: { fullCode: false, callgentUuid: false, content: false }, - where: { endpointUuid: ep.uuid }, - }); - ep.children = funcs.map((f) => ({ - ...f, - id: f.uuid, - uuid: undefined, - })); - } else if (ep.type == 'EVENT') { - EEP.push(ep); - // TODO listeners as children - } else - this.logger.error( - `Unknown endpoint type: ${ep.type}, ep.uuid=${ep.uuid}`, - ); - }); + await Promise.all( + endpoints.map(async (ep: any) => { + ep = { ...ep, id: ep.uuid, uuid: undefined }; + if (ep.type == 'CLIENT') { + CEP.push(ep); + } else if (ep.type == 'SERVER') { + const funcs = await this.callgentFunctionsService.findMany({ + select: { fullCode: false, callgentUuid: false, content: false }, + where: { endpointUuid: ep.id }, + }); + ep.children = funcs.map((f) => ({ + ...f, + id: f.uuid, + uuid: undefined, + })); + SEP.push(ep); + } else if (ep.type == 'EVENT') { + EEP.push(ep); + // TODO listeners as children + } else + this.logger.error( + `Unknown endpoint type: ${ep.type}, ep.uuid=${ep.uuid}`, + ); + }), + ); const data = { id: callgent.uuid, diff --git a/src/endpoints/adaptors/builtin/email/email.adaptor.ts b/src/endpoints/adaptors/builtin/email/email.adaptor.ts index df69b02..3dd142f 100644 --- a/src/endpoints/adaptors/builtin/email/email.adaptor.ts +++ b/src/endpoints/adaptors/builtin/email/email.adaptor.ts @@ -1,3 +1,5 @@ +import { Inject } from '@nestjs/common'; +import { AgentsService } from '../../../../agents/agents.service'; import { EndpointDto } from '../../../dto/endpoint.dto'; import { ClientRequestEvent } from '../../../events/client-request.event'; import { EndpointAdaptorName } from '../../endpoint-adaptor.decorator'; @@ -8,7 +10,11 @@ import { } from '../../endpoint-adaptor.interface'; @EndpointAdaptorName('Email', 'both') -export class EmailAdaptor implements EndpointAdaptor { +export class EmailAdaptor extends EndpointAdaptor { + constructor(@Inject('AgentsService') readonly agentsService: AgentsService) { + super(agentsService); + } + getCallback( callback: string, rawReq: object, @@ -37,7 +43,7 @@ export class EmailAdaptor implements EndpointAdaptor { } parseApis(apiTxt: { text: string; format?: string }): Promise { - throw new Error('Method not implemented.'); + return super.parseApis(apiTxt); } readData(name: string, hints?: { [key: string]: any }): Promise { throw new Error('Method not implemented.'); diff --git a/src/endpoints/adaptors/builtin/restapi/restapi.adaptor.ts b/src/endpoints/adaptors/builtin/restapi/restapi.adaptor.ts index 5b8a521..8750bca 100644 --- a/src/endpoints/adaptors/builtin/restapi/restapi.adaptor.ts +++ b/src/endpoints/adaptors/builtin/restapi/restapi.adaptor.ts @@ -1,11 +1,9 @@ -import $RefParser from '@apidevtools/json-schema-ref-parser'; import { BadRequestException, Inject } from '@nestjs/common'; import { AgentsService } from '../../../../agents/agents.service'; import { EndpointDto } from '../../../dto/endpoint.dto'; import { ClientRequestEvent } from '../../../events/client-request.event'; import { EndpointAdaptorName } from '../../endpoint-adaptor.decorator'; import { - ApiSpec, EndpointAdaptor, EndpointConfig, } from '../../endpoint-adaptor.interface'; @@ -30,10 +28,10 @@ class ResponseJson { } @EndpointAdaptorName('restAPI', 'both') -export class RestAPIAdaptor implements EndpointAdaptor { - constructor( - @Inject('AgentsService') private readonly agentsService: AgentsService, - ) {} +export class RestAPIAdaptor extends EndpointAdaptor { + constructor(@Inject('AgentsService') readonly agentsService: AgentsService) { + super(agentsService); + } getConfig(): EndpointConfig { return { @@ -159,50 +157,6 @@ export class RestAPIAdaptor implements EndpointAdaptor { reqEvent.data.req = this.req2Json(reqEvent.rawReq); } - async parseApis(apiTxt: { text: string; format?: string }) { - const ret: ApiSpec = { apis: [] }; - - const { text, format } = apiTxt; - if (!format || format === 'openAPI') { - let json = JSON.parse(text); - try { - json = await $RefParser.dereference(json); - } catch (err) { - throw new BadRequestException(err); - } - const { paths } = json; - - if (paths) { - const ps = Object.entries(paths); - for (const [path, pathApis] of ps) { - const entries = Object.entries(pathApis); - for (const [method, restApi] of entries) { - // wrap schema - - const apiName = RestAPIAdaptor.formalActionName(method, path); - const func = await this.agentsService.api2Function( - 'restAPI', - '(req:{ path: string; method: string; headers?: { [key: string]: string }; query?: { [key: string]: string }; params?: { [key: string]: string }; files?: { [key: string]: any }; body?: any; form?: any;})=>Promise<{ apiResult: any; headers?: { [key: string]: string }; status?: number; statusText?: string;}>', - { - apiName, - apiContent: JSON.stringify(restApi), - }, - ); - ret.apis.push({ - name: apiName, - ...func, - content: restApi, - }); - } - } - } - - return ret; - } - - throw new BadRequestException('Unsupported format: ' + format); - } - // async invoke() {} async getCallback( @@ -262,7 +216,4 @@ export class RestAPIAdaptor implements EndpointAdaptor { callback(resp: any): Promise { throw new Error('Method not implemented.'); } - - static formalActionName = (method, path) => - `${(method || 'GET').toUpperCase()}:${path}`; } diff --git a/src/endpoints/adaptors/builtin/web/webpage.adaptor.ts b/src/endpoints/adaptors/builtin/web/webpage.adaptor.ts index 2a9fa16..2b978df 100644 --- a/src/endpoints/adaptors/builtin/web/webpage.adaptor.ts +++ b/src/endpoints/adaptors/builtin/web/webpage.adaptor.ts @@ -1,15 +1,20 @@ +import { Inject } from '@nestjs/common'; +import { AgentsService } from '../../../../agents/agents.service'; import { EndpointDto } from '../../../dto/endpoint.dto'; import { ClientRequestEvent } from '../../../events/client-request.event'; import { EndpointAdaptorName } from '../../endpoint-adaptor.decorator'; import { - AdaptedDataSource, ApiSpec, EndpointAdaptor, EndpointConfig, } from '../../endpoint-adaptor.interface'; @EndpointAdaptorName('webpage', 'both') -export class WebpageAdaptor implements EndpointAdaptor { +export class WebpageAdaptor extends EndpointAdaptor { + constructor(@Inject('AgentsService') readonly agentsService: AgentsService) { + super(agentsService); + } + getCallback( callback: string, rawReq: object, diff --git a/src/endpoints/adaptors/endpoint-adaptor.interface.ts b/src/endpoints/adaptors/endpoint-adaptor.interface.ts index 59c501c..4069148 100644 --- a/src/endpoints/adaptors/endpoint-adaptor.interface.ts +++ b/src/endpoints/adaptors/endpoint-adaptor.interface.ts @@ -1,30 +1,89 @@ +import $RefParser from '@apidevtools/json-schema-ref-parser'; +import { BadRequestException } from '@nestjs/common'; import { ApiProperty } from '@nestjs/swagger'; +import { AgentsService } from '../../agents/agents.service'; import { EndpointDto } from '../dto/endpoint.dto'; import { ClientRequestEvent } from '../events/client-request.event'; -export interface EndpointAdaptor { - preprocess(reqEvent: ClientRequestEvent, endpoint: EndpointDto); +export abstract class EndpointAdaptor { + protected readonly agentsService: AgentsService; + constructor(agentsService: AgentsService) { + this.agentsService = agentsService; + } + + abstract preprocess(reqEvent: ClientRequestEvent, endpoint: EndpointDto); /** Endpoint config. */ - getConfig(): EndpointConfig; + abstract getConfig(): EndpointConfig; /** init the endpoint. result in generated content */ - initClient(initParams: object, endpoint: EndpointDto): Promise; - initServer(initParams: object, endpoint: EndpointDto): Promise; - - /** parse api spec from text */ - parseApis(apiTxt: { text: string; format?: string }): Promise; + abstract initClient( + initParams: object, + endpoint: EndpointDto, + ): Promise; + abstract initServer( + initParams: object, + endpoint: EndpointDto, + ): Promise; /** please declare hints in api-doc */ - readData(name: string, hints?: { [key: string]: any }): Promise; - invoke(params: object): Promise; + abstract readData(name: string, hints?: { [key: string]: any }): Promise; + abstract invoke(params: object): Promise; /** get callback param */ - getCallback( + abstract getCallback( callback: string, rawReq: unknown, reqEndpoint?: EndpointDto, ): Promise; + /** send response back to client */ - callback(resp: any): Promise; + abstract callback(resp: any): Promise; + + /** parse api spec from text */ + async parseApis({ text, format }: { text: string; format?: string }) { + const ret: ApiSpec = { apis: [] }; + + if (!format || format === 'openAPI') { + let json = JSON.parse(text); + try { + json = await $RefParser.dereference(json); + } catch (err) { + throw new BadRequestException(err); + } + const { paths } = json; + + if (paths) { + const ps = Object.entries(paths); + for (const [path, pathApis] of ps) { + const entries = Object.entries(pathApis); + for (const [method, restApi] of entries) { + // wrap schema + + const apiName = EndpointAdaptor.formalActionName(method, path); + const func = await this.agentsService.api2Function( + 'restAPI', + '(req:{ path: string; method: string; headers?: { [key: string]: string }; query?: { [key: string]: string }; params?: { [key: string]: string }; files?: { [key: string]: any }; body?: any; form?: any;})=>Promise<{ apiResult: any; headers?: { [key: string]: string }; status?: number; statusText?: string;}>', + { + apiName, + apiContent: JSON.stringify(restApi), + }, + ); + ret.apis.push({ + name: apiName, + ...func, + content: restApi, + }); + } + } + } + + return ret; + } + + throw new BadRequestException('Unsupported format: ' + format); + } + + static formalActionName = (method, path) => + `${(method || 'GET').toUpperCase()}:${path}`; } export interface AdaptedDataSource {} From 1189246f02ba2bfdd4a00358ded02e98a7fbaee1 Mon Sep 17 00:00:00 2001 From: dev-callgent Date: Thu, 11 Jul 2024 17:52:44 +0800 Subject: [PATCH 031/183] feat: callgent-function tree Signed-off-by: dev-callgent --- src/app.module.ts | 2 ++ .../bff-callgent-functions.controller.spec.ts | 18 ++++++++++ .../bff-callgent-functions.controller.ts | 35 +++++++++++++++++++ .../bff-callgent-functions.module.ts | 9 +++++ .../callgent-functions.controller.ts | 14 ++++---- .../callgent-functions.service.ts | 3 ++ 6 files changed, 74 insertions(+), 7 deletions(-) create mode 100644 src/bff-callgent-functions/bff-callgent-functions.controller.spec.ts create mode 100644 src/bff-callgent-functions/bff-callgent-functions.controller.ts create mode 100644 src/bff-callgent-functions/bff-callgent-functions.module.ts diff --git a/src/app.module.ts b/src/app.module.ts index bbe156b..a892af9 100644 --- a/src/app.module.ts +++ b/src/app.module.ts @@ -18,6 +18,7 @@ import { TaskActionsModule } from './task-actions/task-actions.module'; import { TasksModule } from './tasks/tasks.module'; import { UsersModule } from './users/users.module'; import { CallgentTreeModule } from './bff-callgent-tree/callgent-tree.module'; +import { BffCallgentFunctionsModule } from './bff-callgent-functions/bff-callgent-functions.module'; @Module({ imports: [ @@ -43,6 +44,7 @@ import { CallgentTreeModule } from './bff-callgent-tree/callgent-tree.module'; EventStoresModule, EmailsModule, CallgentTreeModule, + BffCallgentFunctionsModule, ], controllers: [AppController], providers: [AppService], diff --git a/src/bff-callgent-functions/bff-callgent-functions.controller.spec.ts b/src/bff-callgent-functions/bff-callgent-functions.controller.spec.ts new file mode 100644 index 0000000..0e27939 --- /dev/null +++ b/src/bff-callgent-functions/bff-callgent-functions.controller.spec.ts @@ -0,0 +1,18 @@ +import { Test, TestingModule } from '@nestjs/testing'; +import { BffCallgentFunctionsController } from './bff-callgent-functions.controller'; + +describe('BffCallgentFunctionsController', () => { + let controller: BffCallgentFunctionsController; + + beforeEach(async () => { + const module: TestingModule = await Test.createTestingModule({ + controllers: [BffCallgentFunctionsController], + }).compile(); + + controller = module.get(BffCallgentFunctionsController); + }); + + it('should be defined', () => { + expect(controller).toBeDefined(); + }); +}); diff --git a/src/bff-callgent-functions/bff-callgent-functions.controller.ts b/src/bff-callgent-functions/bff-callgent-functions.controller.ts new file mode 100644 index 0000000..d2d8fd5 --- /dev/null +++ b/src/bff-callgent-functions/bff-callgent-functions.controller.ts @@ -0,0 +1,35 @@ +import { Body, Controller, Inject, Post, Req, UseGuards } from '@nestjs/common'; +import { CallgentApiText } from '../callgent-functions/callgent-functions.controller'; +import { CallgentFunctionsService } from '../callgent-functions/callgent-functions.service'; +import { EndpointDto } from '../endpoints/dto/endpoint.dto'; +import { JwtGuard } from '../infra/auth/jwt/jwt.guard'; +import { EntityIdExists } from '../infra/repo/validators/entity-exists.validator'; + +@UseGuards(JwtGuard) +@Controller('bff/callgent-functions') +export class BffCallgentFunctionsController { + constructor( + @Inject('CallgentFunctionsService') + private readonly callgentFunctionService: CallgentFunctionsService, + ) {} + + @Post('import') + async importBatch( + @Req() req, + @Body() + apiTxt: CallgentApiText, + ) { + const endpoint = EntityIdExists.entity(apiTxt, 'endpoint'); + await this.callgentFunctionService.importBatch( + endpoint, + apiTxt, + req.user?.sub, + ); + + const data = await this.callgentFunctionService.findMany({ + where: { endpointUuid: endpoint.uuid }, + }); + + return { data }; + } +} diff --git a/src/bff-callgent-functions/bff-callgent-functions.module.ts b/src/bff-callgent-functions/bff-callgent-functions.module.ts new file mode 100644 index 0000000..bbc4c5d --- /dev/null +++ b/src/bff-callgent-functions/bff-callgent-functions.module.ts @@ -0,0 +1,9 @@ +import { Module } from '@nestjs/common'; +import { BffCallgentFunctionsController } from './bff-callgent-functions.controller'; +import { CallgentFunctionsModule } from '../callgent-functions/callgent-functions.module'; + +@Module({ + imports: [CallgentFunctionsModule], + controllers: [BffCallgentFunctionsController], +}) +export class BffCallgentFunctionsModule {} diff --git a/src/callgent-functions/callgent-functions.controller.ts b/src/callgent-functions/callgent-functions.controller.ts index 3cd8ca3..c53641b 100644 --- a/src/callgent-functions/callgent-functions.controller.ts +++ b/src/callgent-functions/callgent-functions.controller.ts @@ -68,7 +68,7 @@ export class CallgentApiText { export class CallgentFunctionsController { constructor( @Inject('CallgentFunctionsService') - private readonly CallgentFunctionService: CallgentFunctionsService, + private readonly callgentFunctionService: CallgentFunctionsService, ) {} @ApiOperation({ @@ -84,7 +84,7 @@ export class CallgentFunctionsController { ) { const endpoint = EntityIdExists.entity(apis, 'endpoint'); return { - data: await this.CallgentFunctionService.createBatch( + data: await this.callgentFunctionService.createBatch( endpoint, apis, req.user?.sub, @@ -104,7 +104,7 @@ export class CallgentFunctionsController { ) { const endpoint = EntityIdExists.entity(apiTxt, 'endpoint'); return { - data: await this.CallgentFunctionService.importBatch( + data: await this.callgentFunctionService.importBatch( endpoint, apiTxt, req.user?.sub, @@ -126,7 +126,7 @@ export class CallgentFunctionsController { }) @Get('/:uuid') async findOne(@Param('uuid') uuid: string) { - return { data: await this.CallgentFunctionService.findOne(uuid) }; + return { data: await this.callgentFunctionService.findOne(uuid) }; } @ApiQuery({ name: 'query', required: false, type: String }) @@ -156,7 +156,7 @@ export class CallgentFunctionsController { name: { contains: query.queryString }, } : undefined; - return this.CallgentFunctionService.findAll({ + return this.callgentFunctionService.findAll({ page: query.page, perPage: query.perPage, where, @@ -177,7 +177,7 @@ export class CallgentFunctionsController { @Body() dto: UpdateCallgentFunctionDto, ) { dto.uuid = uuid; - return { data: await this.CallgentFunctionService.update(dto) }; + return { data: await this.callgentFunctionService.update(dto) }; } @ApiOkResponse({ @@ -194,6 +194,6 @@ export class CallgentFunctionsController { }) @Delete('/:uuid') async delete(@Param('uuid') uuid: string) { - return { data: await this.CallgentFunctionService.delete(uuid) }; + return { data: await this.callgentFunctionService.delete(uuid) }; } } diff --git a/src/callgent-functions/callgent-functions.service.ts b/src/callgent-functions/callgent-functions.service.ts index 0e3c589..e5fadac 100644 --- a/src/callgent-functions/callgent-functions.service.ts +++ b/src/callgent-functions/callgent-functions.service.ts @@ -23,6 +23,9 @@ export class CallgentFunctionsService { protected readonly defSelect: Prisma.CallgentFunctionSelect = { id: false, tenantId: false, + fullCode: false, + content: false, + callgentUuid: false, createdBy: false, deletedAt: false, }; From 77d65225e920c9951cd0e018c3ed9ca53ca94c7f Mon Sep 17 00:00:00 2001 From: dev-callgent Date: Thu, 22 Aug 2024 14:31:49 +0800 Subject: [PATCH 032/183] refactor: pk, id Signed-off-by: dev-callgent --- .gitignore | 1 - DEVLOG.md | 34 +-- package.json | 2 +- .../0_row_level_security/migration.sql | 141 ++++++---- .../20240822033907_init/migration.sql | 245 ++++++++++++++++++ prisma/schema.prisma | 171 ++++++------ prisma/seed-test.ts | 68 ++--- prisma/seed.ts | 56 ++-- src/agents/agents.service.ts | 8 +- .../events/progressive-request.event.ts | 2 +- src/app.module.ts | 4 +- src/auth-tokens/auth-tokens.service.ts | 2 +- .../callgent-tree.controller.spec.ts | 0 .../callgent-tree.controller.ts | 36 +-- .../bff-callgent-tree/callgent-tree.module.ts | 6 +- .../bff-callgent-functions.controller.spec.ts | 0 .../bff-callgent-functions.controller.ts | 14 +- .../bff-callgent-functions.module.ts | 2 +- src/bootstrap.ts | 15 +- .../callgent-functions.controller.ts | 90 +++---- .../callgent-functions.service.ts | 30 +-- src/callgents/callgents.controller.ts | 54 ++-- src/callgents/callgents.service.ts | 62 +++-- .../builtin/restapi/restapi.adaptor.ts | 2 +- .../builtin/restapi/restapi.controller.ts | 42 ++- src/endpoints/endpoints.controller.ts | 52 ++-- src/endpoints/endpoints.service.ts | 54 ++-- src/endpoints/events/client-request.event.ts | 2 +- .../listeners/callgent-created.listener.ts | 12 +- .../event-listeners.service.ts | 42 +-- src/event-listeners/event-object.ts | 8 +- src/event-stores/event-stores.service.ts | 6 +- src/executions/command.schema.ts | 2 +- src/executions/executions.service.ts | 44 ++-- src/infra/auth/jwt/jwt.service.ts | 2 +- .../repo/tenancy/prisma-tenancy.module.ts | 2 +- .../repo/tenancy/prisma-tenancy.provider.ts | 8 +- .../repo/tenancy/prisma-tenancy.service.ts | 4 +- src/task-actions/task-actions.service.ts | 35 +-- src/tasks/events/task-created.event.ts | 2 +- src/tasks/tasks.controller.ts | 22 +- src/tasks/tasks.service.ts | 20 +- src/users/auth.controller.ts | 10 +- src/users/listeners/auth-login.listener.ts | 8 +- src/users/listeners/auth-logined.listener.ts | 6 +- src/users/users.controller.ts | 15 +- src/users/users.service.ts | 30 +-- test/app-init.e2e.ts | 6 +- test/e2e/endpoints.e2e-spec.ts | 12 +- 49 files changed, 895 insertions(+), 596 deletions(-) create mode 100644 prisma/migrations/20240822033907_init/migration.sql rename src/{ => bff}/bff-callgent-tree/callgent-tree.controller.spec.ts (100%) rename src/{ => bff}/bff-callgent-tree/callgent-tree.controller.ts (73%) rename src/{ => bff}/bff-callgent-tree/callgent-tree.module.ts (54%) rename src/{bff-callgent-functions => bff/callgent-functions}/bff-callgent-functions.controller.spec.ts (100%) rename src/{bff-callgent-functions => bff/callgent-functions}/bff-callgent-functions.controller.ts (58%) rename src/{bff-callgent-functions => bff/callgent-functions}/bff-callgent-functions.module.ts (74%) diff --git a/.gitignore b/.gitignore index 48d895b..13ffe21 100644 --- a/.gitignore +++ b/.gitignore @@ -5,7 +5,6 @@ # generated files /src/*/dto/*.dto.ts /src/*/entities/*.entity.ts -/prisma/migrations/20* # Logs logs diff --git a/DEVLOG.md b/DEVLOG.md index fee8a5e..87c5b77 100644 --- a/DEVLOG.md +++ b/DEVLOG.md @@ -32,7 +32,7 @@ npx prisma db seed # init db data - init db test data ```shell -pnpm run prisma:seed:test # init db test data +pnpm run prisma:seed-test # init db test data ``` - start server @@ -80,24 +80,24 @@ npx prisma migrate dev --name init ``` ### multi-tenancy -1. write default value for `tenancy.tenantId` in db +1. write default value for `tenancy.tenantPk` in db ```text - tenantId Int @default(dbgenerated("(current_setting('tenancy.tenantId'))::int")) + tenantPk Int @default(dbgenerated("(current_setting('tenancy.tenantPk'))::int")) ``` -2. enable postgres row level security(RLS), so that we can filter data by `tenantId` automatically: +2. enable postgres row level security(RLS), so that we can filter data by `tenantPk` automatically: config in prisma/migrations/01_row_level_security/migration.sql, @see -3. set `tenantId` into `cls` context: +3. set `tenantPk` into `cls` context: ```ts cls.set('TENANT_ID', .. ``` -4. extend `PrismaClient` to set `tenantId` before any query +4. extend `PrismaClient` to set `tenantPk` before any query ```sql - SELECT set_config('tenancy.tenantId', cls.get('TENANT_ID') ... + SELECT set_config('tenancy.tenantPk', cls.get('TENANT_ID') ... ``` 5. bypass rls, for example, by admin, or looking up the logon user to determine their tenant ID: @@ -124,9 +124,9 @@ all validation is based on bearer token, with payload: ```js { - sub: user.id.toString(), - iss: user.tenantId.toString(), - aud: user.uuid, + sub: user.pk.toString(), + iss: user.tenantPk.toString(), + aud: user.id, } ``` @@ -219,8 +219,8 @@ export class CreateTaskDto { // ... // automatically validation check if the callgent exists in db on controller requesting - @EntityIdExists('callgent', 'uuid') // @EntityIdExists('entityType', 'fieldName') - callgentUuid: string; + @EntityIdExists('callgent', 'id') // @EntityIdExists('entityType', 'fieldName') + callgentId: string; } ``` @@ -231,8 +231,8 @@ Based on `prisma-generator-nestjs-dto`, you may also annotate this decorator in ```prisma model Task { // ... - /// @CustomValidator(EntityIdExists, 'callgent', 'uuid', ../../infra/repo/validators/entity-exists.validator) - callgentUuid String @db.VarChar(36) + /// @CustomValidator(EntityIdExists, 'callgent', 'id', ../../infra/repo/validators/entity-exists.validator) + callgentId String @db.VarChar(36) } ``` @@ -240,10 +240,10 @@ This makes the generated DTO to be annotated with `@EntityIdExists` decorator. #### Retrieves the entity instance -This makes sure the `callgentUuid` field is a valid UUID of a callgent in the database. +This makes sure the `callgentId` field is a valid UUID of a callgent in the database. you can retrieve the entity instance directly from the dto: ```typescript -const callgent = EntityIdExists.entity(dto, 'callgentUuid') || - (await prisma.callgent.findUnique({ where: {uuid: dto.callgentUuid} })); +const callgent = EntityIdExists.entity(dto, 'callgentId') || + (await prisma.callgent.findUnique({ where: {id: dto.callgentId} })); ``` diff --git a/package.json b/package.json index 24d363a..d5bdb91 100644 --- a/package.json +++ b/package.json @@ -25,7 +25,7 @@ "prisma:generate": "npx prisma generate", "prisma:studio": "npx prisma studio", "prisma:seed": "npx prisma db seed", - "prisma:seed:test": "ts-node prisma/seed-test.ts", + "prisma:seed-test": "ts-node prisma/seed-test.ts", "prepare": "husky", "commit": "git-cz", "release": "standard-version" diff --git a/prisma/migrations/0_row_level_security/migration.sql b/prisma/migrations/0_row_level_security/migration.sql index 8c8adac..fc51a57 100644 --- a/prisma/migrations/0_row_level_security/migration.sql +++ b/prisma/migrations/0_row_level_security/migration.sql @@ -12,24 +12,24 @@ CREATE TYPE "EventCallbackType" AS ENUM ('URL', 'EVENT'); -- CreateTable CREATE TABLE "User" ( - "id" SERIAL NOT NULL, - "uuid" VARCHAR(36) NOT NULL, + "pk" SERIAL NOT NULL, + "id" VARCHAR(36) NOT NULL, "name" VARCHAR(36) NOT NULL, "email" VARCHAR(255), "avatar" VARCHAR(1023), "locale" VARCHAR(10) DEFAULT 'en_US', - "tenantId" INTEGER NOT NULL DEFAULT (current_setting('tenancy.tenantId')::int), + "tenantPk" INTEGER NOT NULL DEFAULT (current_setting('tenancy.tenantPk')::int), "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, "updatedAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, "deletedAt" TIMESTAMP(3), - CONSTRAINT "User_pkey" PRIMARY KEY ("id") + CONSTRAINT "User_pkey" PRIMARY KEY ("pk") ); -- CreateTable CREATE TABLE "UserIdentity" ( - "id" SERIAL NOT NULL, - "tenantId" INTEGER NOT NULL DEFAULT (current_setting('tenancy.tenantId')::int), + "pk" SERIAL NOT NULL, + "tenantPk" INTEGER NOT NULL DEFAULT (current_setting('tenancy.tenantPk')::int), "provider" VARCHAR(36) NOT NULL, "uid" VARCHAR(255) NOT NULL, "credentials" VARCHAR(2048) NOT NULL, @@ -38,21 +38,21 @@ CREATE TABLE "UserIdentity" ( "email_verified" BOOLEAN NOT NULL DEFAULT false, "avatar" VARCHAR(1023), "info" JSONB, - "userId" INTEGER NOT NULL, - "userUuid" VARCHAR(36) NOT NULL, + "userPk" INTEGER NOT NULL, + "userId" VARCHAR(36) NOT NULL, "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, "updatedAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, "deletedAt" TIMESTAMP(3), - CONSTRAINT "UserIdentity_pkey" PRIMARY KEY ("id") + CONSTRAINT "UserIdentity_pkey" PRIMARY KEY ("pk") ); -- CreateTable CREATE TABLE "Callgent" ( - "id" SERIAL NOT NULL, - "uuid" VARCHAR(36) NOT NULL, - "tenantId" INTEGER NOT NULL DEFAULT (current_setting('tenancy.tenantId')::int), + "pk" SERIAL NOT NULL, + "id" VARCHAR(36) NOT NULL, + "tenantPk" INTEGER NOT NULL DEFAULT (current_setting('tenancy.tenantPk')::int), "name" VARCHAR(255) NOT NULL, "summary" VARCHAR(4095), "createdBy" VARCHAR(36) NOT NULL, @@ -60,70 +60,70 @@ CREATE TABLE "Callgent" ( "updatedAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, "deletedAt" TIMESTAMP(3), - CONSTRAINT "Callgent_pkey" PRIMARY KEY ("id") + CONSTRAINT "Callgent_pkey" PRIMARY KEY ("pk") ); -- CreateTable CREATE TABLE "CallgentFunction" ( - "id" SERIAL NOT NULL, - "uuid" VARCHAR(36) NOT NULL, - "tenantId" INTEGER NOT NULL DEFAULT (current_setting('tenancy.tenantId')::int), + "pk" SERIAL NOT NULL, + "id" VARCHAR(36) NOT NULL, + "tenantPk" INTEGER NOT NULL DEFAULT (current_setting('tenancy.tenantPk')::int), "name" VARCHAR(255) NOT NULL, "funName" VARCHAR(255) NOT NULL, "params" VARCHAR(31)[], "documents" VARCHAR(4095) NOT NULL, "fullCode" VARCHAR(1023) NOT NULL, "content" JSON NOT NULL, - "callgentUuid" VARCHAR(36) NOT NULL, - "endpointUuid" VARCHAR(36), + "callgentId" VARCHAR(36) NOT NULL, + "endpointId" VARCHAR(36), "createdBy" VARCHAR(36) NOT NULL, "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, "updatedAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, "deletedAt" TIMESTAMP(3), - CONSTRAINT "CallgentFunction_pkey" PRIMARY KEY ("id") + CONSTRAINT "CallgentFunction_pkey" PRIMARY KEY ("pk") ); -- CreateTable CREATE TABLE "Endpoint" ( - "id" SERIAL NOT NULL, - "uuid" VARCHAR(36) NOT NULL, - "tenantId" INTEGER NOT NULL DEFAULT (current_setting('tenancy.tenantId')::int), + "pk" SERIAL NOT NULL, + "id" VARCHAR(36) NOT NULL, + "tenantPk" INTEGER NOT NULL DEFAULT (current_setting('tenancy.tenantPk')::int), "type" "EndpointType" NOT NULL, "adaptorKey" VARCHAR(127) NOT NULL, "priority" INTEGER NOT NULL DEFAULT 0, "host" JSON NOT NULL, "initParams" JSON, "content" JSON, - "callgentUuid" VARCHAR(36) NOT NULL, + "callgentId" VARCHAR(36) NOT NULL, "createdBy" VARCHAR(36) NOT NULL, "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, "updatedAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, "deletedAt" TIMESTAMP(3), - CONSTRAINT "Endpoint_pkey" PRIMARY KEY ("id") + CONSTRAINT "Endpoint_pkey" PRIMARY KEY ("pk") ); -- CreateTable CREATE TABLE "EndpointAuth" ( - "id" SERIAL NOT NULL, - "tenantId" INTEGER NOT NULL DEFAULT (current_setting('tenancy.tenantId')::int), - "endpointUuid" VARCHAR(36) NOT NULL, + "pk" SERIAL NOT NULL, + "tenantPk" INTEGER NOT NULL DEFAULT (current_setting('tenancy.tenantPk')::int), + "endpointId" VARCHAR(36) NOT NULL, "userKey" VARCHAR(63), "credentials" JSON NOT NULL, "createdBy" VARCHAR(36) NOT NULL, "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, "updatedAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, - CONSTRAINT "EndpointAuth_pkey" PRIMARY KEY ("id") + CONSTRAINT "EndpointAuth_pkey" PRIMARY KEY ("pk") ); -- CreateTable CREATE TABLE "EventStore" ( - "id" SERIAL NOT NULL, - "uuid" VARCHAR(36) NOT NULL, - "tenantId" INTEGER NOT NULL DEFAULT (current_setting('tenancy.tenantId')::int), + "pk" SERIAL NOT NULL, + "id" VARCHAR(36) NOT NULL, + "tenantPk" INTEGER NOT NULL DEFAULT (current_setting('tenancy.tenantPk')::int), "srcId" VARCHAR(36) NOT NULL, "targetId" VARCHAR(36), "eventType" VARCHAR(36) NOT NULL, @@ -136,22 +136,22 @@ CREATE TABLE "EventStore" ( "message" VARCHAR(255), "stopPropagation" BOOLEAN NOT NULL, "defaultPrevented" BOOLEAN NOT NULL, - "listenerUuid" VARCHAR(36), + "listenerId" VARCHAR(36), "funName" VARCHAR(255), "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, "updatedAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, "deletedAt" TIMESTAMP(3), - CONSTRAINT "EventStore_pkey" PRIMARY KEY ("id") + CONSTRAINT "EventStore_pkey" PRIMARY KEY ("pk") ); -- CreateTable CREATE TABLE "EventListener" ( - "id" SERIAL NOT NULL, - "uuid" VARCHAR(36) NOT NULL, - "tenantId" INTEGER NOT NULL DEFAULT (current_setting('tenancy.tenantId')::int), - "srcUuid" VARCHAR(36) NOT NULL, + "pk" SERIAL NOT NULL, + "id" VARCHAR(36) NOT NULL, + "tenantPk" INTEGER NOT NULL DEFAULT (current_setting('tenancy.tenantPk')::int), + "srcId" VARCHAR(36) NOT NULL, "eventType" VARCHAR(36) NOT NULL, "dataType" VARCHAR(36) NOT NULL, "priority" INTEGER DEFAULT 0, @@ -163,7 +163,48 @@ CREATE TABLE "EventListener" ( "updatedAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, "deletedAt" TIMESTAMP(3), - CONSTRAINT "EventListener_pkey" PRIMARY KEY ("id") + CONSTRAINT "EventListener_pkey" PRIMARY KEY ("pk") +); + +CREATE TABLE "Task" ( + "pk" SERIAL NOT NULL, + "id" VARCHAR(36) NOT NULL, + "tenantPk" INTEGER NOT NULL DEFAULT (current_setting('tenancy.tenantPk')::int), + "statusCode" INTEGER NOT NULL DEFAULT -1, + "name" VARCHAR(64), + "brief" VARCHAR(255), + "content" JSONB, + "createdBy" VARCHAR(36) NOT NULL, + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updatedAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "deletedAt" TIMESTAMP(3), + + CONSTRAINT "Task_pkey" PRIMARY KEY ("pk") +); + +-- CreateTable +CREATE TABLE "TaskAction" ( + "pk" SERIAL NOT NULL, + "id" VARCHAR(36) NOT NULL, + "tenantPk" INTEGER NOT NULL DEFAULT (current_setting('tenancy.tenantPk')::int), + "cepId" VARCHAR(36), + "funName" VARCHAR(255), + "cAdaptor" VARCHAR(36) NOT NULL, + "callback" JSON, + "progressive" VARCHAR(36), + "returns" BOOLEAN NOT NULL DEFAULT false, + "req" JSON NOT NULL, + "res" JSON, + "stage" INTEGER NOT NULL DEFAULT -1, + "statusCode" INTEGER NOT NULL DEFAULT 0, + "message" VARCHAR(255), + "taskId" VARCHAR(36) NOT NULL, + "createdBy" VARCHAR(36) NOT NULL, + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updatedAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "deletedAt" TIMESTAMP(3), + + CONSTRAINT "TaskAction_pkey" PRIMARY KEY ("pk") ); @@ -180,6 +221,8 @@ ALTER TABLE "Endpoint" ENABLE ROW LEVEL SECURITY; ALTER TABLE "EndpointAuth" ENABLE ROW LEVEL SECURITY; ALTER TABLE "EventListener" ENABLE ROW LEVEL SECURITY; ALTER TABLE "EventStore" ENABLE ROW LEVEL SECURITY; +ALTER TABLE "Task" ENABLE ROW LEVEL SECURITY; +ALTER TABLE "TaskAction" ENABLE ROW LEVEL SECURITY; -- Force Row Level Security for table owners ALTER TABLE "User" FORCE ROW LEVEL SECURITY; @@ -190,16 +233,20 @@ ALTER TABLE "Endpoint" FORCE ROW LEVEL SECURITY; ALTER TABLE "EndpointAuth" FORCE ROW LEVEL SECURITY; ALTER TABLE "EventListener" FORCE ROW LEVEL SECURITY; ALTER TABLE "EventStore" FORCE ROW LEVEL SECURITY; +ALTER TABLE "Task" FORCE ROW LEVEL SECURITY; +ALTER TABLE "TaskAction" FORCE ROW LEVEL SECURITY; -- Create row security policies -CREATE POLICY tenant_isolation_policy ON "User" USING (("tenantId" = 0) OR ("tenantId" = current_setting('tenancy.tenantId', TRUE)::int)); -CREATE POLICY tenant_isolation_policy ON "UserIdentity" USING (("tenantId" = 0) OR ("tenantId" = current_setting('tenancy.tenantId', TRUE)::int)); -CREATE POLICY tenant_isolation_policy ON "Callgent" USING (("tenantId" = 0) OR ("tenantId" = current_setting('tenancy.tenantId', TRUE)::int)); -CREATE POLICY tenant_isolation_policy ON "CallgentFunction" USING (("tenantId" = 0) OR ("tenantId" = current_setting('tenancy.tenantId', TRUE)::int)); -CREATE POLICY tenant_isolation_policy ON "Endpoint" USING (("tenantId" = 0) OR ("tenantId" = current_setting('tenancy.tenantId', TRUE)::int)); -CREATE POLICY tenant_isolation_policy ON "EndpointAuth" USING (("tenantId" = 0) OR ("tenantId" = current_setting('tenancy.tenantId', TRUE)::int)); -CREATE POLICY tenant_isolation_policy ON "EventListener" USING (("tenantId" = 0) OR ("tenantId" = current_setting('tenancy.tenantId', TRUE)::int)); -CREATE POLICY tenant_isolation_policy ON "EventStore" USING (("tenantId" = 0) OR ("tenantId" = current_setting('tenancy.tenantId', TRUE)::int)); +CREATE POLICY tenant_isolation_policy ON "User" USING (("tenantPk" = 0) OR ("tenantPk" = current_setting('tenancy.tenantPk', TRUE)::int)); +CREATE POLICY tenant_isolation_policy ON "UserIdentity" USING (("tenantPk" = 0) OR ("tenantPk" = current_setting('tenancy.tenantPk', TRUE)::int)); +CREATE POLICY tenant_isolation_policy ON "Callgent" USING (("tenantPk" = 0) OR ("tenantPk" = current_setting('tenancy.tenantPk', TRUE)::int)); +CREATE POLICY tenant_isolation_policy ON "CallgentFunction" USING (("tenantPk" = 0) OR ("tenantPk" = current_setting('tenancy.tenantPk', TRUE)::int)); +CREATE POLICY tenant_isolation_policy ON "Endpoint" USING (("tenantPk" = 0) OR ("tenantPk" = current_setting('tenancy.tenantPk', TRUE)::int)); +CREATE POLICY tenant_isolation_policy ON "EndpointAuth" USING (("tenantPk" = 0) OR ("tenantPk" = current_setting('tenancy.tenantPk', TRUE)::int)); +CREATE POLICY tenant_isolation_policy ON "EventListener" USING (("tenantPk" = 0) OR ("tenantPk" = current_setting('tenancy.tenantPk', TRUE)::int)); +CREATE POLICY tenant_isolation_policy ON "EventStore" USING (("tenantPk" = 0) OR ("tenantPk" = current_setting('tenancy.tenantPk', TRUE)::int)); +CREATE POLICY tenant_isolation_policy ON "Task" USING (("tenantPk" = 0) OR ("tenantPk" = current_setting('tenancy.tenantPk', TRUE)::int)); +CREATE POLICY tenant_isolation_policy ON "TaskAction" USING (("tenantPk" = 0) OR ("tenantPk" = current_setting('tenancy.tenantPk', TRUE)::int)); -- Create policies to bypass RLS (optional) CREATE POLICY bypass_rls_policy ON "User" USING (current_setting('tenancy.bypass_rls', TRUE)::text = 'on'); @@ -210,3 +257,5 @@ CREATE POLICY bypass_rls_policy ON "Endpoint" USING (current_setting('tenancy.by CREATE POLICY bypass_rls_policy ON "EndpointAuth" USING (current_setting('tenancy.bypass_rls', TRUE)::text = 'on'); CREATE POLICY bypass_rls_policy ON "EventListener" USING (current_setting('tenancy.bypass_rls', TRUE)::text = 'on'); CREATE POLICY bypass_rls_policy ON "EventStore" USING (current_setting('tenancy.bypass_rls', TRUE)::text = 'on'); +CREATE POLICY bypass_rls_policy ON "Task" USING (current_setting('tenancy.bypass_rls', TRUE)::text = 'on'); +CREATE POLICY bypass_rls_policy ON "TaskAction" USING (current_setting('tenancy.bypass_rls', TRUE)::text = 'on'); diff --git a/prisma/migrations/20240822033907_init/migration.sql b/prisma/migrations/20240822033907_init/migration.sql new file mode 100644 index 0000000..74f3eb3 --- /dev/null +++ b/prisma/migrations/20240822033907_init/migration.sql @@ -0,0 +1,245 @@ +/* + Warnings: + + - You are about to alter the column `host` on the `Endpoint` table. The data in that column could be lost. The data in that column will be cast from `Json` to `VarChar(2047)`. + - A unique constraint covering the columns `[id]` on the table `Callgent` will be added. If there are existing duplicate values, this will fail. + - A unique constraint covering the columns `[tenantPk,name]` on the table `Callgent` will be added. If there are existing duplicate values, this will fail. + - A unique constraint covering the columns `[id]` on the table `CallgentFunction` will be added. If there are existing duplicate values, this will fail. + - A unique constraint covering the columns `[callgentId,name]` on the table `CallgentFunction` will be added. If there are existing duplicate values, this will fail. + - A unique constraint covering the columns `[id]` on the table `Endpoint` will be added. If there are existing duplicate values, this will fail. + - A unique constraint covering the columns `[endpointId,userKey]` on the table `EndpointAuth` will be added. If there are existing duplicate values, this will fail. + - A unique constraint covering the columns `[id]` on the table `EventListener` will be added. If there are existing duplicate values, this will fail. + - A unique constraint covering the columns `[id]` on the table `EventStore` will be added. If there are existing duplicate values, this will fail. + - A unique constraint covering the columns `[id]` on the table `Task` will be added. If there are existing duplicate values, this will fail. + - A unique constraint covering the columns `[id]` on the table `TaskAction` will be added. If there are existing duplicate values, this will fail. + - A unique constraint covering the columns `[id]` on the table `User` will be added. If there are existing duplicate values, this will fail. + - A unique constraint covering the columns `[provider,uid]` on the table `UserIdentity` will be added. If there are existing duplicate values, this will fail. + +*/ +-- CreateEnum +CREATE TYPE "EndpointAuthType" AS ENUM ('NONE', 'APP', 'USER'); + +-- AlterTable +ALTER TABLE "Callgent" ALTER COLUMN "tenantPk" SET DEFAULT (current_setting('tenancy.tenantPk')::int); + +-- AlterTable +ALTER TABLE "CallgentFunction" ALTER COLUMN "tenantPk" SET DEFAULT (current_setting('tenancy.tenantPk')::int); + +-- AlterTable +ALTER TABLE "Endpoint" ADD COLUMN "name" VARCHAR(2047) NOT NULL DEFAULT '', +ALTER COLUMN "tenantPk" SET DEFAULT (current_setting('tenancy.tenantPk')::int), +ALTER COLUMN "host" SET DATA TYPE VARCHAR(2047); + +-- AlterTable +ALTER TABLE "EndpointAuth" ALTER COLUMN "tenantPk" SET DEFAULT (current_setting('tenancy.tenantPk')::int); + +-- AlterTable +ALTER TABLE "EventListener" ALTER COLUMN "tenantPk" SET DEFAULT (current_setting('tenancy.tenantPk')::int); + +-- AlterTable +ALTER TABLE "EventStore" ALTER COLUMN "tenantPk" SET DEFAULT (current_setting('tenancy.tenantPk')::int); + +-- AlterTable +ALTER TABLE "Task" ALTER COLUMN "tenantPk" SET DEFAULT (current_setting('tenancy.tenantPk')::int); + +-- AlterTable +ALTER TABLE "TaskAction" ALTER COLUMN "tenantPk" SET DEFAULT (current_setting('tenancy.tenantPk')::int); + +-- AlterTable +ALTER TABLE "User" ALTER COLUMN "tenantPk" SET DEFAULT (current_setting('tenancy.tenantPk')::int); + +-- AlterTable +ALTER TABLE "UserIdentity" ALTER COLUMN "tenantPk" SET DEFAULT (current_setting('tenancy.tenantPk')::int); + +-- CreateTable +CREATE TABLE "Tenant" ( + "pk" SERIAL NOT NULL, + "id" VARCHAR(36) NOT NULL, + "emailHost" VARCHAR(36), + "name" VARCHAR(50), + "avatar" VARCHAR(1023), + "type" INTEGER NOT NULL DEFAULT 1, + "statusCode" INTEGER NOT NULL DEFAULT 0, + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updatedAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "deletedAt" TIMESTAMP(3), + + CONSTRAINT "Tenant_pkey" PRIMARY KEY ("pk") +); + +-- CreateTable +CREATE TABLE "PublicMailHost" ( + "pk" SERIAL NOT NULL, + "dotHost" VARCHAR(255) NOT NULL, + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + + CONSTRAINT "PublicMailHost_pkey" PRIMARY KEY ("pk") +); + +-- CreateTable +CREATE TABLE "AuthToken" ( + "pk" SERIAL NOT NULL, + "token" VARCHAR(36) NOT NULL, + "type" VARCHAR(10) NOT NULL, + "payload" JSONB NOT NULL, + "revoked" BOOLEAN NOT NULL DEFAULT false, + "expiresAt" TIMESTAMP(3), + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updatedAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + + CONSTRAINT "AuthToken_pkey" PRIMARY KEY ("pk") +); + +-- CreateTable +CREATE TABLE "LlmTemplate" ( + "pk" SERIAL NOT NULL, + "name" VARCHAR(32) NOT NULL, + "prompt" VARCHAR(4096) NOT NULL, + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updatedAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + + CONSTRAINT "LlmTemplate_pkey" PRIMARY KEY ("pk") +); + +-- CreateTable +CREATE TABLE "LlmCache" ( + "pk" SERIAL NOT NULL, + "name" VARCHAR(32) NOT NULL, + "prompt" VARCHAR(4096) NOT NULL, + "result" VARCHAR(4096) NOT NULL, + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + + CONSTRAINT "LlmCache_pkey" PRIMARY KEY ("pk") +); + +-- CreateTable +CREATE TABLE "PersistedAsync" ( + "pk" BIGSERIAL NOT NULL, + "statusCode" INTEGER NOT NULL DEFAULT -1, + "service" VARCHAR(127) NOT NULL, + "method" VARCHAR(127) NOT NULL, + "parentPk" BIGINT, + "createdBy" VARCHAR(36) NOT NULL, + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updatedAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "deletedAt" TIMESTAMP(3), + + CONSTRAINT "PersistedAsync_pkey" PRIMARY KEY ("pk") +); + +-- CreateIndex +CREATE UNIQUE INDEX "Tenant_id_key" ON "Tenant"("id"); + +-- CreateIndex +CREATE UNIQUE INDEX "Tenant_emailHost_key" ON "Tenant"("emailHost"); + +-- CreateIndex +CREATE UNIQUE INDEX "PublicMailHost_dotHost_key" ON "PublicMailHost"("dotHost"); + +-- CreateIndex +CREATE UNIQUE INDEX "AuthToken_token_key" ON "AuthToken"("token"); + +-- CreateIndex +CREATE UNIQUE INDEX "LlmTemplate_name_key" ON "LlmTemplate"("name"); + +-- CreateIndex +CREATE UNIQUE INDEX "LlmCache_prompt_name_key" ON "LlmCache"("prompt", "name"); + +-- CreateIndex +CREATE INDEX "PersistedAsync_parentPk_idx" ON "PersistedAsync"("parentPk"); + +-- CreateIndex +CREATE UNIQUE INDEX "Callgent_id_key" ON "Callgent"("id"); + +-- CreateIndex +CREATE INDEX "Callgent_tenantPk_idx" ON "Callgent"("tenantPk"); + +-- CreateIndex +CREATE UNIQUE INDEX "Callgent_tenantPk_name_key" ON "Callgent"("tenantPk", "name"); + +-- CreateIndex +CREATE UNIQUE INDEX "CallgentFunction_id_key" ON "CallgentFunction"("id"); + +-- CreateIndex +CREATE INDEX "CallgentFunction_tenantPk_idx" ON "CallgentFunction"("tenantPk"); + +-- CreateIndex +CREATE INDEX "CallgentFunction_callgentId_idx" ON "CallgentFunction"("callgentId"); + +-- CreateIndex +CREATE INDEX "CallgentFunction_endpointId_idx" ON "CallgentFunction"("endpointId"); + +-- CreateIndex +CREATE UNIQUE INDEX "CallgentFunction_callgentId_name_key" ON "CallgentFunction"("callgentId", "name"); + +-- CreateIndex +CREATE UNIQUE INDEX "Endpoint_id_key" ON "Endpoint"("id"); + +-- CreateIndex +CREATE INDEX "Endpoint_tenantPk_idx" ON "Endpoint"("tenantPk"); + +-- CreateIndex +CREATE INDEX "Endpoint_callgentId_idx" ON "Endpoint"("callgentId"); + +-- CreateIndex +CREATE INDEX "EndpointAuth_tenantPk_idx" ON "EndpointAuth"("tenantPk"); + +-- CreateIndex +CREATE INDEX "EndpointAuth_endpointId_idx" ON "EndpointAuth"("endpointId"); + +-- CreateIndex +CREATE UNIQUE INDEX "EndpointAuth_endpointId_userKey_key" ON "EndpointAuth"("endpointId", "userKey"); + +-- CreateIndex +CREATE UNIQUE INDEX "EventListener_id_key" ON "EventListener"("id"); + +-- CreateIndex +CREATE INDEX "EventListener_srcId_idx" ON "EventListener"("srcId"); + +-- CreateIndex +CREATE INDEX "EventListener_tenantPk_idx" ON "EventListener"("tenantPk"); + +-- CreateIndex +CREATE UNIQUE INDEX "EventStore_id_key" ON "EventStore"("id"); + +-- CreateIndex +CREATE INDEX "EventStore_srcId_idx" ON "EventStore"("srcId"); + +-- CreateIndex +CREATE INDEX "EventStore_targetId_idx" ON "EventStore"("targetId"); + +-- CreateIndex +CREATE INDEX "EventStore_tenantPk_idx" ON "EventStore"("tenantPk"); + +-- CreateIndex +CREATE UNIQUE INDEX "Task_id_key" ON "Task"("id"); + +-- CreateIndex +CREATE INDEX "Task_tenantPk_idx" ON "Task"("tenantPk"); + +-- CreateIndex +CREATE UNIQUE INDEX "TaskAction_id_key" ON "TaskAction"("id"); + +-- CreateIndex +CREATE INDEX "TaskAction_tenantPk_idx" ON "TaskAction"("tenantPk"); + +-- CreateIndex +CREATE INDEX "TaskAction_taskId_idx" ON "TaskAction"("taskId"); + +-- CreateIndex +CREATE UNIQUE INDEX "User_id_key" ON "User"("id"); + +-- CreateIndex +CREATE INDEX "User_tenantPk_idx" ON "User"("tenantPk"); + +-- CreateIndex +CREATE INDEX "UserIdentity_userPk_idx" ON "UserIdentity"("userPk"); + +-- CreateIndex +CREATE INDEX "UserIdentity_userId_idx" ON "UserIdentity"("userId"); + +-- CreateIndex +CREATE INDEX "UserIdentity_tenantPk_idx" ON "UserIdentity"("tenantPk"); + +-- CreateIndex +CREATE UNIQUE INDEX "UserIdentity_provider_uid_key" ON "UserIdentity"("provider", "uid"); diff --git a/prisma/schema.prisma b/prisma/schema.prisma index 99487fe..6c0bb99 100644 --- a/prisma/schema.prisma +++ b/prisma/schema.prisma @@ -20,22 +20,23 @@ generator nestjsDto { } datasource db { - provider = "postgres" - url = env("DATABASE_URL") + provider = "postgres" + url = env("DATABASE_URL") + relationMode = "prisma" } -// db sharding base on tenantId: -// 1. id segmentation, ALTER SEQUENCE [表名]_[id]_seq RESTART WITH 1001; +// db sharding base on tenantPk: +// 1. pk segmentation, ALTER SEQUENCE [表名]_[id]_seq RESTART WITH 1001; // 2.chard tenant based on tenant_id, eq (0~10000] db1, (10000,20000] db2 //////////////////// Authentication and Account //////////////////////////// model Tenant { - id Int @id @default(autoincrement()) + pk Int @id @default(autoincrement()) /// @DtoCreateApiResponse /// @DtoUpdateApiResponse /// @DtoPlainApiResponse - uuid String @unique @db.VarChar(36) + id String @unique @db.VarChar(36) emailHost String? @unique @db.VarChar(36) /// @description unique tenant email host name String? @db.VarChar(50) avatar String? @db.VarChar(1023) @@ -53,20 +54,20 @@ model Tenant { } model User { - id Int @id @default(autoincrement()) + pk Int @id @default(autoincrement()) /// @DtoCreateApiResponse /// @DtoUpdateApiResponse /// @DtoPlainApiResponse - uuid String @unique @db.VarChar(36) + id String @unique @db.VarChar(36) name String @db.VarChar(36) email String? @db.VarChar(255) /// @description account primary verified email avatar String? @db.VarChar(1023) locale String? @default("en_US") @db.VarChar(10) - tenant Tenant @relation(fields: [tenantId], references: [id]) + tenant Tenant @relation(fields: [tenantPk], references: [pk]) /// @DtoRelationIncludeId // add to migration.sql - tenantId Int @default(dbgenerated("(current_setting('tenancy.tenantId')::int)")) + tenantPk Int @default(dbgenerated("(current_setting('tenancy.tenantPk')::int)")) /// @DtoReadOnly /// @DtoEntityHidden userIdentity UserIdentity[] @@ -78,15 +79,15 @@ model User { /// @DtoEntityHidden deletedAt DateTime? /// @description logical deletion. - @@index([tenantId]) + @@index([tenantPk]) } model UserIdentity { - id Int @id @default(autoincrement()) + pk Int @id @default(autoincrement()) /// @DtoReadOnly /// @DtoEntityHidden // add to migration.sql - tenantId Int @default(dbgenerated("(current_setting('tenancy.tenantId')::int)")) + tenantPk Int @default(dbgenerated("(current_setting('tenancy.tenantPk')::int)")) /// @DtoCreateApiResponse /// @DtoUpdateApiResponse /// @DtoPlainApiResponse @@ -110,11 +111,11 @@ model UserIdentity { /// @DtoPlainApiResponse info Json? @map("info") /// @description authentication info from realm - user User @relation(fields: [userId], references: [id]) - userId Int + user User @relation(fields: [userPk], references: [pk]) + userPk Int /// @DtoReadOnly /// @DtoEntityHidden - userUuid String @db.VarChar(36) + userId String @db.VarChar(36) createdAt DateTime @default(now()) updatedAt DateTime @default(now()) @updatedAt @@ -124,15 +125,15 @@ model UserIdentity { deletedAt DateTime? /// @description logical deletion. @@unique([provider, uid]) + @@index([userPk]) @@index([userId]) - @@index([userUuid]) - @@index([tenantId]) + @@index([tenantPk]) } /// @DtoIgnoreModel /// @description non-organization email hosts model PublicMailHost { - id Int @id @default(autoincrement()) + pk Int @id @default(autoincrement()) /// @description starts with `.`, e.g.: '.gmail.com', '.hotmail.com' dotHost String @unique @db.VarChar(255) @@ -143,15 +144,15 @@ model PublicMailHost { model Callgent { /// @DtoEntityHidden - id Int @id @default(autoincrement()) + pk Int @id @default(autoincrement()) /// @DtoCreateApiResponse /// @DtoUpdateApiResponse /// @DtoPlainApiResponse - uuid String @unique @db.VarChar(36) + id String @unique @db.VarChar(36) /// @DtoReadOnly /// @DtoEntityHidden // add to migration.sql - tenantId Int @default(dbgenerated("(current_setting('tenancy.tenantId')::int)")) + tenantPk Int @default(dbgenerated("(current_setting('tenancy.tenantPk')::int)")) name String @db.VarChar(255) /// @DtoCreateApiResponse @@ -169,21 +170,21 @@ model Callgent { /// @DtoEntityHidden deletedAt DateTime? /// @description logical deletion. - @@unique([tenantId, name]) - @@index([tenantId]) + @@unique([tenantPk, name]) + @@index([tenantPk]) } model CallgentFunction { /// @DtoEntityHidden - id Int @id @default(autoincrement()) + pk Int @id @default(autoincrement()) /// @DtoCreateApiResponse /// @DtoUpdateApiResponse /// @DtoPlainApiResponse - uuid String @unique @db.VarChar(36) + id String @unique @db.VarChar(36) /// @DtoReadOnly /// @DtoEntityHidden // add to migration.sql - tenantId Int @default(dbgenerated("(current_setting('tenancy.tenantId')::int)")) + tenantPk Int @default(dbgenerated("(current_setting('tenancy.tenantPk')::int)")) name String @db.VarChar(255) /// @description js function name to invoke this callgent function @@ -193,15 +194,15 @@ model CallgentFunction { documents String @db.VarChar(4095) /// @description js actual code to invoke this callgent function fullCode String @db.VarChar(1023) - /// @description endpoint uuid or command or code + /// @description endpoint id or command or code content Json @db.Json // @DtoReadOnly - /// @CustomValidator(EntityIdExists, 'callgent', 'uuid', ../../infra/repo/validators/entity-exists.validator) - callgentUuid String @db.VarChar(36) + /// @CustomValidator(EntityIdExists, 'callgent', 'id', ../../infra/repo/validators/entity-exists.validator) + callgentId String @db.VarChar(36) /// @description actual server endpoint, when action type is `ENDPOINT` - /// @CustomValidator(EntityIdExists, 'endpoint', 'uuid', ../../infra/repo/validators/entity-exists.validator) - endpointUuid String? @db.VarChar(36) + /// @CustomValidator(EntityIdExists, 'endpoint', 'id', ../../infra/repo/validators/entity-exists.validator) + endpointId String? @db.VarChar(36) /// @DtoReadOnly /// @DtoEntityHidden @@ -213,22 +214,23 @@ model CallgentFunction { /// @DtoEntityHidden deletedAt DateTime? /// @description logical deletion. - @@unique([callgentUuid, name]) - @@index([tenantId]) - @@index([callgentUuid]) + @@unique([callgentId, name]) + @@index([tenantPk]) + @@index([callgentId]) + @@index([endpointId]) } model Task { /// @DtoEntityHidden - id Int @id @default(autoincrement()) + pk Int @id @default(autoincrement()) /// @DtoCreateApiResponse /// @DtoUpdateApiResponse /// @DtoPlainApiResponse - uuid String @unique @db.VarChar(36) + id String @unique @db.VarChar(36) /// @DtoReadOnly /// @DtoEntityHidden // add to migration.sql - tenantId Int @default(dbgenerated("(current_setting('tenancy.tenantId')::int)")) + tenantPk Int @default(dbgenerated("(current_setting('tenancy.tenantPk')::int)")) statusCode Int @default(-1) /// @description Task statusCode, -1: pending, 0: done, <-1: failed name String? @db.VarChar(64) /// @description task name @@ -245,24 +247,24 @@ model Task { /// @DtoEntityHidden deletedAt DateTime? /// @description logical deletion. - @@index([tenantId]) + @@index([tenantPk]) } model TaskAction { /// @DtoEntityHidden - id Int @id @default(autoincrement()) + pk Int @id @default(autoincrement()) /// @DtoCreateApiResponse /// @DtoUpdateApiResponse /// @DtoPlainApiResponse - uuid String @unique @db.VarChar(36) + id String @unique @db.VarChar(36) /// @DtoReadOnly /// @DtoEntityHidden // add to migration.sql - tenantId Int @default(dbgenerated("(current_setting('tenancy.tenantId')::int)")) + tenantPk Int @default(dbgenerated("(current_setting('tenancy.tenantPk')::int)")) // client side information - /// @description action owner callgent uuid, responsible for progressive response - cepUuid String? @db.VarChar(36) /// @description client endpoint uuid + /// @description action owner callgent id, responsible for progressive response + cepId String? @db.VarChar(36) /// @description client endpoint id funName String? @db.VarChar(255) /// @description optional callgent function name cAdaptor String @db.VarChar(36) /// @description client adaptor key callback Json? @db.Json /// @description callback url template or callgent function @@ -277,12 +279,12 @@ model TaskAction { message String? @db.VarChar(255) /// @description error message // @DtoReadOnly - /// @CustomValidator(EntityIdExists, 'callgent', 'uuid', ../../infra/repo/validators/entity-exists.validator) - taskUuid String @db.VarChar(36) + /// @CustomValidator(EntityIdExists, 'callgent', 'id', ../../infra/repo/validators/entity-exists.validator) + taskId String @db.VarChar(36) /// @DtoReadOnly /// @DtoEntityHidden - createdBy String @db.VarChar(36) /// @description user uuid, anonymous ip, etc. + createdBy String @db.VarChar(36) /// @description user id, anonymous ip, etc. createdAt DateTime @default(now()) updatedAt DateTime @default(now()) @updatedAt // DONOT FORGET TO ADD the model into `createSoftDeleteMiddleware` @@ -290,14 +292,14 @@ model TaskAction { /// @DtoEntityHidden deletedAt DateTime? /// @description logical deletion. - @@index([tenantId]) - @@index([taskUuid]) + @@index([tenantPk]) + @@index([taskId]) } /// @DtoIgnoreModel model AuthToken { /// @DtoEntityHidden - id Int @id @default(autoincrement()) + pk Int @id @default(autoincrement()) token String @unique @db.VarChar(36) type String @db.VarChar(10) /// @description token type: JWT, API_KEY, .. @@ -319,15 +321,15 @@ enum EndpointType { /// @description a callgent may have multiple endpoints, including cep & sep model Endpoint { /// @DtoEntityHidden - id Int @id @default(autoincrement()) + pk Int @id @default(autoincrement()) /// @DtoCreateApiResponse /// @DtoUpdateApiResponse /// @DtoPlainApiResponse - uuid String @unique @db.VarChar(36) + id String @unique @db.VarChar(36) /// @DtoReadOnly /// @DtoEntityHidden // add to migration.sql - tenantId Int @default(dbgenerated("(current_setting('tenancy.tenantId')::int)")) + tenantPk Int @default(dbgenerated("(current_setting('tenancy.tenantPk')::int)")) name String @default("") @db.VarChar(2047) /// @DtoUpdateApiResponse @@ -339,14 +341,14 @@ model Endpoint { adaptorKey String @db.VarChar(127) /// @description endpoint adaptor key priority Int @default(0) /// @description priority in the callgent - host String @db.VarChar(2047) /// @description host address, e.g. '/api/callgents/rbhes0-w4rff/{uuid}/invoke/api/', where `{uuid}` will be replaced with current endpoint uuid + host String @db.VarChar(2047) /// @description host address, e.g. '/api/callgents/rbhes0-w4rff/{id}/invoke/api/', where `{id}` will be replaced with current endpoint id initParams Json? @db.Json /// @description initializing parameters content Json? @db.Json /// @description generated content/code by init method /// @DtoUpdateApiResponse /// @DtoPlainApiResponse - /// @CustomValidator(EntityIdExists, 'callgent', 'uuid', ../../infra/repo/validators/entity-exists.validator) - callgentUuid String @db.VarChar(36) /// @description callgent owning the endpoint + /// @CustomValidator(EntityIdExists, 'callgent', 'id', ../../infra/repo/validators/entity-exists.validator) + callgentId String @db.VarChar(36) /// @description callgent owning the endpoint /// @DtoReadOnly /// @DtoEntityHidden @@ -358,8 +360,8 @@ model Endpoint { /// @DtoEntityHidden deletedAt DateTime? /// @description logical deletion. - @@index([tenantId]) - @@index([callgentUuid]) + @@index([tenantPk]) + @@index([callgentId]) } enum EndpointAuthType { @@ -371,15 +373,15 @@ enum EndpointAuthType { /// @description endpoint app or user auth credentials model EndpointAuth { /// @DtoEntityHidden - id Int @id @default(autoincrement()) + pk Int @id @default(autoincrement()) /// @DtoReadOnly /// @DtoEntityHidden // add to migration.sql - tenantId Int @default(dbgenerated("(current_setting('tenancy.tenantId')::int)")) + tenantPk Int @default(dbgenerated("(current_setting('tenancy.tenantPk')::int)")) - /// @CustomValidator(EntityIdExists, 'endpoint', 'uuid', ../../infra/repo/validators/entity-exists.validator) - endpointUuid String @db.VarChar(36) /// @description endpoint uuid. - userKey String? @db.VarChar(63) /// @description unique user key, e.g. assignee userId + /// @CustomValidator(EntityIdExists, 'endpoint', 'id', ../../infra/repo/validators/entity-exists.validator) + endpointId String @db.VarChar(36) /// @description endpoint id. + userKey String? @db.VarChar(63) /// @description unique user key, e.g. assignee userId credentials Json @db.Json /// @description auth credentials @@ -389,15 +391,15 @@ model EndpointAuth { createdAt DateTime @default(now()) updatedAt DateTime @default(now()) @updatedAt - @@unique([endpointUuid, userKey]) - @@index([tenantId]) - @@index([endpointUuid]) + @@unique([endpointId, userKey]) + @@index([tenantPk]) + @@index([endpointId]) } /// @DtoIgnoreModel model LlmTemplate { /// @DtoEntityHidden - id Int @id @default(autoincrement()) + pk Int @id @default(autoincrement()) name String @db.VarChar(32) prompt String @db.VarChar(4096) @@ -411,7 +413,7 @@ model LlmTemplate { /// @DtoIgnoreModel model LlmCache { /// @DtoEntityHidden - id Int @id @default(autoincrement()) + pk Int @id @default(autoincrement()) name String @db.VarChar(32) prompt String @db.VarChar(4096) @@ -424,18 +426,20 @@ model LlmCache { model PersistedAsync { /// @DtoEntityHidden - id BigInt @id @default(autoincrement()) + pk BigInt @id @default(autoincrement()) statusCode Int @default(-1) /// @description statusCode, -1: pending, 1: sent, 0: done, <-1: failed service String @db.VarChar(127) /// @description callback service name method String @db.VarChar(127) /// @description callback method name - parentAsyncId BigInt? @db.BigInt /// @description parent async id + parentPk BigInt? @db.BigInt /// @description parent async pk createdBy String @db.VarChar(36) createdAt DateTime @default(now()) updatedAt DateTime @default(now()) @updatedAt deletedAt DateTime? /// @description logical deletion. + + @@index(parentPk) } enum ServiceType { @@ -445,17 +449,17 @@ enum ServiceType { model EventListener { /// @DtoEntityHidden - id Int @id @default(autoincrement()) + pk Int @id @default(autoincrement()) /// @DtoCreateApiResponse /// @DtoUpdateApiResponse /// @DtoPlainApiResponse - uuid String @unique @db.VarChar(36) + id String @unique @db.VarChar(36) /// @DtoReadOnly /// @DtoEntityHidden // add to migration.sql - tenantId Int @default(dbgenerated("(current_setting('tenancy.tenantId')::int)")) + tenantPk Int @default(dbgenerated("(current_setting('tenancy.tenantPk')::int)")) - srcUuid String @db.VarChar(36) /// @description event source id + srcId String @db.VarChar(36) /// @description event source id eventType String @db.VarChar(36) dataType String @db.VarChar(36) @@ -476,8 +480,8 @@ model EventListener { /// @DtoEntityHidden deletedAt DateTime? /// @description logical deletion. - @@index([srcUuid]) - @@index([tenantId]) + @@index([srcId]) + @@index([tenantPk]) } enum EventCallbackType { @@ -487,19 +491,19 @@ enum EventCallbackType { model EventStore { /// @DtoEntityHidden - id Int @id @default(autoincrement()) + pk Int @id @default(autoincrement()) /// @DtoCreateApiResponse /// @DtoUpdateApiResponse /// @DtoPlainApiResponse - uuid String @unique @db.VarChar(36) + id String @unique @db.VarChar(36) /// @DtoReadOnly /// @DtoEntityHidden // add to migration.sql - tenantId Int @default(dbgenerated("(current_setting('tenancy.tenantId')::int)")) + tenantPk Int @default(dbgenerated("(current_setting('tenancy.tenantPk')::int)")) - /// @Description src entity uuid which bind to the listener + /// @Description src entity id which bind to the listener srcId String @db.VarChar(36) - /// @Description target uuid to relate several events + /// @Description target id to relate several events targetId String? @db.VarChar(36) eventType String @db.VarChar(36) dataType String @db.VarChar(36) @@ -516,7 +520,7 @@ model EventStore { message String? @db.VarChar(255) stopPropagation Boolean defaultPrevented Boolean - listenerUuid String? @db.VarChar(36) + listenerId String? @db.VarChar(36) funName String? @db.VarChar(255) createdAt DateTime @default(now()) @@ -528,6 +532,5 @@ model EventStore { @@index([srcId]) @@index([targetId]) - @@index([tenantId]) - @@index([uuid]) + @@index([tenantPk]) } diff --git a/prisma/seed-test.ts b/prisma/seed-test.ts index d5514ad..7dda115 100644 --- a/prisma/seed-test.ts +++ b/prisma/seed-test.ts @@ -21,22 +21,22 @@ main() function initTestData() { const tenant: Prisma.TenantUncheckedCreateInput = { - id: 1, - uuid: 'TEST_TENANT_UUID', + pk: 1, + id: 'TEST_TENANT_ID', statusCode: 1, }; - const userUuid = 'TEST_USER_UUID'; + const userId = 'TEST_USER_ID'; const u: Prisma.UserUncheckedCreateInput = { - id: 1, - uuid: userUuid, + pk: 1, + id: userId, name: 'test-user', - tenantId: 1, + tenantPk: 1, }; const ui: Prisma.UserIdentityUncheckedCreateInput = { - id: 1, - tenantId: 1, + pk: 1, + tenantPk: 1, provider: 'local', uid: 'test@callgent.com', // password123 @@ -44,43 +44,43 @@ function initTestData() { name: 'test-user', email: 'test@callgent.com', email_verified: true, - userId: 1, - userUuid, + userPk: 1, + userId, }; const authTokenDto: Prisma.AuthTokenUncheckedCreateInput = { - id: 1, + pk: 1, token: 'TEST-ONLY-API_KEY', type: 'API_KEY', payload: { - sub: userUuid, + sub: userId, aud: 'appKey', }, }; const callgentDto: Prisma.CallgentUncheckedCreateInput = { - id: 1, - uuid: 'TEST_CALLGENT_UUID', + pk: 1, + id: 'TEST_CALLGENT_ID', name: 'test-callgent', - tenantId: 1, - createdBy: userUuid, + tenantPk: 1, + createdBy: userId, }; const cepDto: Prisma.EndpointUncheckedCreateInput = { - id: 1, - uuid: 'TEST_CEP_UUID', - callgentUuid: 'TEST_CALLGENT_UUID', + pk: 1, + id: 'TEST_CEP_ID', + callgentId: 'TEST_CALLGENT_ID', type: 'CLIENT', adaptorKey: 'restAPI', - host: {}, - tenantId: 1, - createdBy: userUuid, + host: '', + tenantPk: 1, + createdBy: userId, }; return [ prisma.tenant .upsert({ - where: { id: 1 }, + where: { pk: 1 }, update: tenant, create: tenant, }) @@ -88,16 +88,16 @@ function initTestData() { console.log({ tenant }); prisma.user .upsert({ - where: { id: 1 }, + where: { pk: 1 }, update: u, create: u, }) .then((user) => { - (ui as any).id = 1; + (ui as any).pk = 1; (ui as any).userId = user.id; prisma.userIdentity .upsert({ - where: { id: 1 }, + where: { pk: 1 }, update: ui, create: ui, }) @@ -106,21 +106,21 @@ function initTestData() { }), prisma.authToken .upsert({ - where: { id: 1 }, + where: { pk: 1 }, update: authTokenDto, create: authTokenDto, }) .then((authToken) => console.log({ authToken })), prisma.callgent .upsert({ - where: { id: 1 }, + where: { pk: 1 }, update: callgentDto, create: callgentDto, }) .then((callgent) => console.log({ callgent })), prisma.endpoint .upsert({ - where: { id: 1 }, + where: { pk: 1 }, update: cepDto, create: cepDto, }) @@ -135,7 +135,7 @@ function initTestData() { 2, 'api2Function', 'Please convert below API doc of format restAPI:\n{ "POST:/boards/retrieve": {"summary":"Retrieve board","requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"apiKey":{"type":"string","description":"Your secret API key."},"id":{"type":"string","description":"The board\'s unique identifier."}},"required":["apiKey","id"]}}},"required":true},"responses":{"200":{"description":"Returns a board object, if a valid id was supplied.","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string","description":"A unique identifier for the board."},"created":{"type":"string","description":"Time at which the board was created, in ISO 8601 format."},"isPrivate":{"type":"boolean","description":"Whether or not the board is set as private in the administrative settings."},"name":{"type":"string","description":"The board\'s name."},"postCount":{"type":"integer","description":"The number of non-deleted posts associated with the board. This number includes posts that are marked as closed or complete."},"privateComments":{"type":"boolean","description":"Whether or not comments left on posts can be viewed by other end-users."},"url":{"type":"string","description":"The URL to the board\'s page."}}}}}}}} }\n\ninto a js function, the function must be as follows:\n// the `invoker` function do the real invocation\nasync (invoker: (req:{ path: string; method: string; headers?: { [key: string]: string }; query?: { [key: string]: string }; params?: { [key: string]: string }; files?: { [key: string]: any }; body?: any; form?: any;})=>Promise<{ apiResult: any; headers?: { [key: string]: string }; status?: number; statusText?: string;}>, ...apiParams) {...; const json = await invoker(...); ...; return apiResult; }\n\nplease generate the js function with **full implementation and error handling**! output a single-line json object:\n{"funName":"function name", "params":["invoker", ...apiParams]"documents":"formal js function documentation with description of params and response object with **all properties elaborated** exactly same as the API doc", "fullCode":"(invoker, ...)=>{...; const json = await invoker(...); ...; return apiResult;}"}', - '{"funName":"retrieveBoard","params":["invoker","apiKey","id"],"documents":"This function retrieves a board object given a valid API key and board ID.\\n\\nParameters:\\n- invoker: A function that performs the actual API call.\\n- apiKey: Your secret API key.\\n- id: The board\'s unique identifier.\\n\\nReturns:\\nAn object containing the board details if a valid id was supplied. The object properties are:\\n- id: A unique identifier for the board.\\n- created: Time at which the board was created, in ISO 8601 format.\\n- isPrivate: Whether or not the board is set as private in the administrative settings.\\n- name: The board\'s name.\\n- postCount: The number of non-deleted posts associated with the board. This number includes posts that are marked as closed or complete.\\n- privateComments: Whether or not comments left on posts can be viewed by other end-users.\\n- url: The URL to the board\'s page.","fullCode":"(invoker, apiKey, id) => {\\n const req = {\\n path: \'/boards/retrieve\',\\n method: \'POST\',\\n headers: { \'Content-Type\': \'application/json\' },\\n body: JSON.stringify({\\n apiKey, id\\n })\\n };\\n try {\\n const resp = await invoker(req);\\n if (resp.status !== 200) {\\n throw new Error(`Failed to retrieve board. Status: ${resp.status}`);\\n }\\n return resp.result;\\n } catch (error) {\\n console.error(error);\\n throw error;\\n }\\n}"}', + '{"funName":"retrieveBoard","params":["invoker","apiKey","id"],"documents":"This function retrieves a board object given a valid API key and board ID.\\n\\nParameters:\\n- invoker: A function that performs the actual API call.\\n- apiKey: Your secret API key.\\n- pk: The board\'s unique identifier.\\n\\nReturns:\\nAn object containing the board details if a valid id was supplied. The object properties are:\\n- pk: A unique identifier for the board.\\n- created: Time at which the board was created, in ISO 8601 format.\\n- isPrivate: Whether or not the board is set as private in the administrative settings.\\n- name: The board\'s name.\\n- postCount: The number of non-deleted posts associated with the board. This number includes posts that are marked as closed or complete.\\n- privateComments: Whether or not comments left on posts can be viewed by other end-users.\\n- url: The URL to the board\'s page.","fullCode":"(invoker, apiKey, id) => {\\n const req = {\\n path: \'/boards/retrieve\',\\n method: \'POST\',\\n headers: { \'Content-Type\': \'application/json\' },\\n body: JSON.stringify({\\n apiKey, id\\n })\\n };\\n try {\\n const resp = await invoker(req);\\n if (resp.status !== 200) {\\n throw new Error(`Failed to retrieve board. Status: ${resp.status}`);\\n }\\n return resp.result;\\n } catch (error) {\\n console.error(error);\\n throw error;\\n }\\n}"}', ), addLlmCache( 3, @@ -147,21 +147,21 @@ function initTestData() { 4, 'map2Function', 'given below service functions:\nclass new-test-callgent {\n "function name: POST:/boards/list": {"params":[invoker,apiKey], "documents":"This function lists all boards.\n\n@param {Function} invoker - A function that makes the actual API call.\n@param {string} apiKey - Your secret API key.\n\n@returns {Promise} A promise that resolves to an object containing the API result.\n@property {Array} boards - An array of board objects.\n@property {string} boards[].id - A unique identifier for the board.\n@property {string} boards[].created - Time at which the board was created, in ISO 8601 format.\n@property {boolean} boards[].isPrivate - Whether or not the board is set as private in the administrative settings.\n@property {string} boards[].name - The board\'s name.\n@property {number} boards[].postCount - The number of non-deleted posts associated with the board. This number includes posts that are marked as closed or complete.\n@property {boolean} boards[].privateComments - Whether or not comments left on posts can be viewed by other end-users.\n@property {string} boards[].url - The URL to the board\'s page.\n@property {boolean} hasMore - Specifies whether this query returns more boards than the limit."},\n\n}\nand an service `invoker` function.\n\nPlease choose one function to fulfill below request:\n{\n"requesting function": "POST:/boards/list",\n"request from": "restAPI",\n"request_object": {"url":"/boards/list","method":"POST","headers":{"host":"127.0.0.1:3300","connection":"close","content-length":"0"},"query":{}},\n}\nand code for request_object to chosen function args mapping. if any data missing/unclear/ambiguous from request_object to invocation args, please ask question to the caller in below json.question field.\n\noutput a single-line json object:\n{ "funName": "the function name to be invoked", "params":"param names of the chosen function", "mapping": "the js function (invoker, request_object)=>{...;return functionArgsArray;}, full implementation to return the **real** args from request_object to invoke the chosen service function. don\'t use data not exist or ambiguous in request", "question": "question to ask the caller if anything not sure or missing for request to args mapping, *no* guess or assumption of the mapping. null if the mapping is crystal clear." }"}', - '{"funName":"POST:/boards/list","params":["invoker","apiKey"],"mapping":"(invoker, request_object)=>{ let apiKey = request_object.params.uuids; return [invoker, apiKey]; }","question":"What is the API key for this request? It is not provided in the request_object."}', + '{"funName":"POST:/boards/list","params":["invoker","apiKey"],"mapping":"(invoker, request_object)=>{ let apiKey = request_object.params.ids; return [invoker, apiKey]; }","question":"What is the API key for this request? It is not provided in the request_object."}', ), ]; } async function addLlmCache( - id: number, + pk: number, name: string, prompt: string, result: string, ) { - const llmCacheDto = { id, name, prompt, result }; + const llmCacheDto = { pk, name, prompt, result }; return prisma.llmCache .upsert({ - where: { id }, + where: { pk }, update: llmCacheDto, create: llmCacheDto, }) diff --git a/prisma/seed.ts b/prisma/seed.ts index a2f562e..99e8c64 100644 --- a/prisma/seed.ts +++ b/prisma/seed.ts @@ -28,10 +28,10 @@ function initEventListeners() { priority = -100; const els: Prisma.EventListenerUncheckedCreateInput[] = [ { - id: elId++, - uuid: 'CR-ADAPTOR-PREPROCESS', - srcUuid: 'GLOBAL', - tenantId: 0, + pk: elId++, + id: 'CR-ADAPTOR-PREPROCESS', + srcId: 'GLOBAL', + tenantPk: 0, eventType: 'CLIENT_REQUEST', dataType: '*', serviceType: 'SERVICE', @@ -41,10 +41,10 @@ function initEventListeners() { priority: (priority += 100), }, { - id: elId++, - uuid: 'CR-LOAD-FUNCTIONS', - srcUuid: 'GLOBAL', - tenantId: 0, + pk: elId++, + id: 'CR-LOAD-FUNCTIONS', + srcId: 'GLOBAL', + tenantPk: 0, eventType: 'CLIENT_REQUEST', dataType: '*', serviceType: 'SERVICE', @@ -54,10 +54,10 @@ function initEventListeners() { priority: (priority += 100), }, { - id: elId++, - uuid: 'CR-LOAD-TARGET', - srcUuid: 'GLOBAL', - tenantId: 0, + pk: elId++, + id: 'CR-LOAD-TARGET', + srcId: 'GLOBAL', + tenantPk: 0, eventType: 'CLIENT_REQUEST', dataType: '*', serviceType: 'SERVICE', @@ -67,10 +67,10 @@ function initEventListeners() { priority: (priority += 100), }, { - id: elId++, - uuid: 'CR-MAP-2-FUNCTION', - srcUuid: 'GLOBAL', - tenantId: 0, + pk: elId++, + id: 'CR-MAP-2-FUNCTION', + srcId: 'GLOBAL', + tenantPk: 0, eventType: 'CLIENT_REQUEST', dataType: '*', serviceType: 'SERVICE', @@ -80,10 +80,10 @@ function initEventListeners() { priority: (priority += 100), }, { - id: elId++, - uuid: 'CR-MAP-2-ARGS', - srcUuid: 'GLOBAL', - tenantId: 0, + pk: elId++, + id: 'CR-MAP-2-ARGS', + srcId: 'GLOBAL', + tenantPk: 0, eventType: 'CLIENT_REQUEST', dataType: '*', serviceType: 'SERVICE', @@ -93,10 +93,10 @@ function initEventListeners() { priority: (priority += 100), }, // { - // id: elId++, - // uuid: 'PR-MAP-2-ARGS', - // srcUuid: 'GLOBAL', - // tenantId: 0, + // pk: elId++, + // id: 'PR-MAP-2-ARGS', + // srcId: 'GLOBAL', + // tenantPk: 0, // eventType: 'CLIENT_REQUEST', // dataType: '*', // serviceType: 'SERVICE', @@ -110,7 +110,7 @@ function initEventListeners() { return els.map((el) => prisma.eventListener .upsert({ - where: { id: el.id }, + where: { pk: el.pk }, update: el, create: el, }) @@ -121,7 +121,7 @@ function initEventListeners() { async function initLlmTemplates() { const llmTemplates: Prisma.LlmTemplateUncheckedCreateInput[] = [ { - id: 1, + pk: 1, name: 'api2Function', prompt: `Please convert below API doc of format {{=it.format}}: { "{{=it.apiName}}": {{=it.apiContent}} } @@ -134,7 +134,7 @@ please generate the js function with **full implementation and error handling**! {"funName":"function name", "params":["invoker", ...apiParams]"documents":"formal js function documentation with description of params and response object with **all properties elaborated** exactly same as the API doc", "fullCode":"(invoker, ...)=>{...; const json = await invoker(...); ...; return apiResult;}"}`, }, { - id: 2, + pk: 2, name: 'map2Function', prompt: `given below service functions: class {{=it.callgentName}} {{{~ it.callgentFunctions :fun }} @@ -159,7 +159,7 @@ output a single-line json object: return llmTemplates.map((llmTpl) => prisma.llmTemplate .upsert({ - where: { id: llmTpl.id }, + where: { pk: llmTpl.pk }, update: llmTpl, create: llmTpl, }) diff --git a/src/agents/agents.service.ts b/src/agents/agents.service.ts index 21cf9c1..0e53dbd 100644 --- a/src/agents/agents.service.ts +++ b/src/agents/agents.service.ts @@ -35,7 +35,7 @@ export class AgentsService { reqEvent: ClientRequestEvent, ): Promise { const { - uuid, + id, srcId, dataType: cepAdaptor, data: { callgentName, req, funName, progressive }, @@ -45,7 +45,7 @@ export class AgentsService { .functions as unknown as CallgentFunctionDto[]; if (!callgentFunctions?.length) throw new BadRequestException( - 'No functions for mapping, ClientRequestEvent#' + uuid, + 'No functions for mapping, ClientRequestEvent#' + id, ); // FIXME map from all targetId events @@ -69,7 +69,7 @@ export class AgentsService { // emit progressive requesting event const { event: prEvent, statusCode } = await this.eventListenersService.emit( - new ProgressiveRequestEvent(srcId, uuid, cepAdaptor, { progressive }), + new ProgressiveRequestEvent(srcId, id, cepAdaptor, { progressive }), ); if (!statusCode) { // direct return, no persistent async @@ -111,7 +111,7 @@ export class AgentsService { } async genPseudoCmd( - callgents: { uuid: string; name: string; summary: string }[], + callgents: { id: string; name: string; summary: string }[], taskaAction: TaskActionDto, ) {} diff --git a/src/agents/events/progressive-request.event.ts b/src/agents/events/progressive-request.event.ts index 068fb9d..e16870e 100644 --- a/src/agents/events/progressive-request.event.ts +++ b/src/agents/events/progressive-request.event.ts @@ -3,7 +3,7 @@ import { EventObject } from '../../event-listeners/event-object'; export class ProgressiveRequestEvent extends EventObject { constructor( srcId: string, - /** parent event uuid in event chain */ + /** parent event id in event chain */ fromEvent: string, dataType: string, public readonly data: { diff --git a/src/app.module.ts b/src/app.module.ts index a892af9..db24f1a 100644 --- a/src/app.module.ts +++ b/src/app.module.ts @@ -17,8 +17,8 @@ import { ReposModule } from './infra/repo/repos.module'; import { TaskActionsModule } from './task-actions/task-actions.module'; import { TasksModule } from './tasks/tasks.module'; import { UsersModule } from './users/users.module'; -import { CallgentTreeModule } from './bff-callgent-tree/callgent-tree.module'; -import { BffCallgentFunctionsModule } from './bff-callgent-functions/bff-callgent-functions.module'; +import { CallgentTreeModule } from './bff/bff-callgent-tree/callgent-tree.module'; +import { BffCallgentFunctionsModule } from './bff/callgent-functions/bff-callgent-functions.module'; @Module({ imports: [ diff --git a/src/auth-tokens/auth-tokens.service.ts b/src/auth-tokens/auth-tokens.service.ts index eb8d1b1..6240b6b 100644 --- a/src/auth-tokens/auth-tokens.service.ts +++ b/src/auth-tokens/auth-tokens.service.ts @@ -46,7 +46,7 @@ export class AuthTokensService { if (authToken) { const expired = authToken.expiresAt < new Date(); if (once || expired) - await prisma.authToken.delete({ where: { id: authToken.id } }); + await prisma.authToken.delete({ where: { pk: authToken.pk } }); if (!expired && !authToken.revoked) return authToken.payload as JwtPayload; } diff --git a/src/bff-callgent-tree/callgent-tree.controller.spec.ts b/src/bff/bff-callgent-tree/callgent-tree.controller.spec.ts similarity index 100% rename from src/bff-callgent-tree/callgent-tree.controller.spec.ts rename to src/bff/bff-callgent-tree/callgent-tree.controller.spec.ts diff --git a/src/bff-callgent-tree/callgent-tree.controller.ts b/src/bff/bff-callgent-tree/callgent-tree.controller.ts similarity index 73% rename from src/bff-callgent-tree/callgent-tree.controller.ts rename to src/bff/bff-callgent-tree/callgent-tree.controller.ts index 12affbb..4540167 100644 --- a/src/bff-callgent-tree/callgent-tree.controller.ts +++ b/src/bff/bff-callgent-tree/callgent-tree.controller.ts @@ -10,13 +10,15 @@ import { Req, UseGuards, } from '@nestjs/common'; +import { ApiTags } from '@nestjs/swagger'; import { Callgent } from '@prisma/client'; -import { CallgentFunctionsService } from '../callgent-functions/callgent-functions.service'; -import { CallgentsService } from '../callgents/callgents.service'; -import { CreateCallgentDto } from '../callgents/dto/create-callgent.dto'; -import { EndpointsService } from '../endpoints/endpoints.service'; -import { JwtGuard } from '../infra/auth/jwt/jwt.guard'; +import { CallgentFunctionsService } from '../../callgent-functions/callgent-functions.service'; +import { CallgentsService } from '../../callgents/callgents.service'; +import { CreateCallgentDto } from '../../callgents/dto/create-callgent.dto'; +import { EndpointsService } from '../../endpoints/endpoints.service'; +import { JwtGuard } from '../../infra/auth/jwt/jwt.guard'; +@ApiTags('bff') @UseGuards(JwtGuard) @Controller('bff') export class CallgentTreeController { @@ -32,9 +34,9 @@ export class CallgentTreeController { /** * @returns callgent with endpoints tree */ - @Get('callgent-endpoints/:uuid') - async findOne(@Param('uuid') uuid: string) { - const callgent = await this.callgentsService.findOne(uuid); + @Get('callgent-endpoints/:id') + async findOne(@Param('id') id: string) { + const callgent = await this.callgentsService.findOne(id); if (!callgent) throw new NotFoundException(); const data = await this._callgentTree(callgent); @@ -56,25 +58,25 @@ export class CallgentTreeController { private async _callgentTree(callgent: Callgent) { const endpoints = await this.endpointsService.findAll({ - select: { callgentUuid: false }, - where: { callgentUuid: callgent.uuid }, + select: { callgentId: false }, + where: { callgentId: callgent.id }, }); const [CEP, SEP, EEP] = [[], [], []]; await Promise.all( endpoints.map(async (ep: any) => { - ep = { ...ep, id: ep.uuid, uuid: undefined }; + ep = { ...ep, id: ep.id, pk: undefined }; if (ep.type == 'CLIENT') { CEP.push(ep); } else if (ep.type == 'SERVER') { const funcs = await this.callgentFunctionsService.findMany({ - select: { fullCode: false, callgentUuid: false, content: false }, - where: { endpointUuid: ep.id }, + select: { fullCode: false, callgentId: false, content: false }, + where: { endpointId: ep.id }, }); ep.children = funcs.map((f) => ({ ...f, - id: f.uuid, - uuid: undefined, + id: f.id, + pk: undefined, })); SEP.push(ep); } else if (ep.type == 'EVENT') { @@ -82,13 +84,13 @@ export class CallgentTreeController { // TODO listeners as children } else this.logger.error( - `Unknown endpoint type: ${ep.type}, ep.uuid=${ep.uuid}`, + `Unknown endpoint type: ${ep.type}, ep.id=${ep.id}`, ); }), ); const data = { - id: callgent.uuid, + id: callgent.id, name: callgent.name, createdAt: callgent.createdAt, updatedAt: callgent.updatedAt, diff --git a/src/bff-callgent-tree/callgent-tree.module.ts b/src/bff/bff-callgent-tree/callgent-tree.module.ts similarity index 54% rename from src/bff-callgent-tree/callgent-tree.module.ts rename to src/bff/bff-callgent-tree/callgent-tree.module.ts index c22b57b..6bc598a 100644 --- a/src/bff-callgent-tree/callgent-tree.module.ts +++ b/src/bff/bff-callgent-tree/callgent-tree.module.ts @@ -1,7 +1,7 @@ import { Module } from '@nestjs/common'; -import { CallgentFunctionsModule } from '../callgent-functions/callgent-functions.module'; -import { CallgentsModule } from '../callgents/callgents.module'; -import { EndpointsModule } from '../endpoints/endpoints.module'; +import { CallgentFunctionsModule } from '../../callgent-functions/callgent-functions.module'; +import { CallgentsModule } from '../../callgents/callgents.module'; +import { EndpointsModule } from '../../endpoints/endpoints.module'; import { CallgentTreeController } from './callgent-tree.controller'; @Module({ diff --git a/src/bff-callgent-functions/bff-callgent-functions.controller.spec.ts b/src/bff/callgent-functions/bff-callgent-functions.controller.spec.ts similarity index 100% rename from src/bff-callgent-functions/bff-callgent-functions.controller.spec.ts rename to src/bff/callgent-functions/bff-callgent-functions.controller.spec.ts diff --git a/src/bff-callgent-functions/bff-callgent-functions.controller.ts b/src/bff/callgent-functions/bff-callgent-functions.controller.ts similarity index 58% rename from src/bff-callgent-functions/bff-callgent-functions.controller.ts rename to src/bff/callgent-functions/bff-callgent-functions.controller.ts index d2d8fd5..dc36965 100644 --- a/src/bff-callgent-functions/bff-callgent-functions.controller.ts +++ b/src/bff/callgent-functions/bff-callgent-functions.controller.ts @@ -1,10 +1,12 @@ import { Body, Controller, Inject, Post, Req, UseGuards } from '@nestjs/common'; -import { CallgentApiText } from '../callgent-functions/callgent-functions.controller'; -import { CallgentFunctionsService } from '../callgent-functions/callgent-functions.service'; -import { EndpointDto } from '../endpoints/dto/endpoint.dto'; -import { JwtGuard } from '../infra/auth/jwt/jwt.guard'; -import { EntityIdExists } from '../infra/repo/validators/entity-exists.validator'; +import { ApiTags } from '@nestjs/swagger'; +import { CallgentApiText } from '../../callgent-functions/callgent-functions.controller'; +import { CallgentFunctionsService } from '../../callgent-functions/callgent-functions.service'; +import { EndpointDto } from '../../endpoints/dto/endpoint.dto'; +import { JwtGuard } from '../../infra/auth/jwt/jwt.guard'; +import { EntityIdExists } from '../../infra/repo/validators/entity-exists.validator'; +@ApiTags('bff') @UseGuards(JwtGuard) @Controller('bff/callgent-functions') export class BffCallgentFunctionsController { @@ -27,7 +29,7 @@ export class BffCallgentFunctionsController { ); const data = await this.callgentFunctionService.findMany({ - where: { endpointUuid: endpoint.uuid }, + where: { endpointId: endpoint.id }, }); return { data }; diff --git a/src/bff-callgent-functions/bff-callgent-functions.module.ts b/src/bff/callgent-functions/bff-callgent-functions.module.ts similarity index 74% rename from src/bff-callgent-functions/bff-callgent-functions.module.ts rename to src/bff/callgent-functions/bff-callgent-functions.module.ts index bbc4c5d..be5e738 100644 --- a/src/bff-callgent-functions/bff-callgent-functions.module.ts +++ b/src/bff/callgent-functions/bff-callgent-functions.module.ts @@ -1,6 +1,6 @@ import { Module } from '@nestjs/common'; import { BffCallgentFunctionsController } from './bff-callgent-functions.controller'; -import { CallgentFunctionsModule } from '../callgent-functions/callgent-functions.module'; +import { CallgentFunctionsModule } from '../../callgent-functions/callgent-functions.module'; @Module({ imports: [CallgentFunctionsModule], diff --git a/src/bootstrap.ts b/src/bootstrap.ts index 4412783..df9746b 100644 --- a/src/bootstrap.ts +++ b/src/bootstrap.ts @@ -78,7 +78,11 @@ async function bootstrap(app: NestFastifyApplication, port: string) { const configService = app.get(ConfigService); if (configService.get('ALLOW_CORS')) app.register(fastifyCors, { - origin: [process.env.FRONTEND_SITE_URL, process.env.FRONTEND_DOCS_URL, process.env.FRONTEND_APP_URL], + origin: [ + process.env.FRONTEND_SITE_URL, + process.env.FRONTEND_DOCS_URL, + process.env.FRONTEND_APP_URL, + ], methods: ['GET', 'POST', 'PUT', 'PATCH', 'DELETE'], allowedHeaders: ['Content-Type', 'Authorization'], credentials: true, // allow cookie @@ -168,11 +172,11 @@ function registerApi( const devDocVersion = configService.get('DOCUMENTATION_VERSION'); if (devDocVersion) { const devJwtToken = app.get(JwtAuthService).sign({ - tenantId: 1, + tenantPk: 1, id: testUserId, iss: 'test.only', - sub: 'TEST_USER_UUID', - aud: 'test.client.uuid', + sub: 'TEST_USER_ID', + aud: 'test.client.id', username: 'user@example.com', }); // console.debug('devJwtToken:', devJwtToken); @@ -201,7 +205,8 @@ function registerApi( }); logger.log( - `API Documentation: http://localhost:${process.env.PORT || 3000 + `API Documentation: http://localhost:${ + process.env.PORT || 3000 }/docs/api`, ); } diff --git a/src/callgent-functions/callgent-functions.controller.ts b/src/callgent-functions/callgent-functions.controller.ts index c53641b..960bf89 100644 --- a/src/callgent-functions/callgent-functions.controller.ts +++ b/src/callgent-functions/callgent-functions.controller.ts @@ -32,17 +32,17 @@ import { CallgentFunctionDto } from './dto/callgent-function.dto'; import { UpdateCallgentFunctionDto } from './dto/update-callgent-function.dto'; export class CallgentApis extends ApiSpec { - @EntityIdExists('endpoint', 'uuid') + @EntityIdExists('endpoint', 'id') endpoint: string; } export class CallgentApiText { @ApiProperty({ required: true, - description: 'The callgent server-endpoint uuid', + description: 'The callgent server-endpoint id', }) @IsNotEmpty() - @EntityIdExists('endpoint', 'uuid') + @EntityIdExists('endpoint', 'id') endpoint: string; @ApiProperty({ @@ -124,44 +124,44 @@ export class CallgentFunctionsController { ], }, }) - @Get('/:uuid') - async findOne(@Param('uuid') uuid: string) { - return { data: await this.callgentFunctionService.findOne(uuid) }; + @Get('/:id') + async findOne(@Param('id') id: string) { + return { data: await this.callgentFunctionService.findOne(id) }; } - @ApiQuery({ name: 'query', required: false, type: String }) - @ApiQuery({ name: 'page', required: false, type: Number }) - @ApiQuery({ name: 'perPage', required: false, type: Number }) - @ApiOkResponse({ - schema: { - allOf: [ - { $ref: getSchemaPath(RestApiResponse) }, - { - properties: { - data: { - type: 'array', - items: { $ref: getSchemaPath(CallgentFunctionDto) }, - }, - }, - }, - ], - }, - }) - @Get() - async findAll( - @Query() query: { queryString?: string; page?: 1; perPage?: 10 }, - ) { - const where = query.queryString - ? { - name: { contains: query.queryString }, - } - : undefined; - return this.callgentFunctionService.findAll({ - page: query.page, - perPage: query.perPage, - where, - }); - } + // @ApiQuery({ name: 'query', required: false, type: String }) + // @ApiQuery({ name: 'page', required: false, type: Number }) + // @ApiQuery({ name: 'perPage', required: false, type: Number }) + // @ApiOkResponse({ + // schema: { + // allOf: [ + // { $ref: getSchemaPath(RestApiResponse) }, + // { + // properties: { + // data: { + // type: 'array', + // items: { $ref: getSchemaPath(CallgentFunctionDto) }, + // }, + // }, + // }, + // ], + // }, + // }) + // @Get() + // async findAll( + // @Query() query: { queryString?: string; page?: 1; perPage?: 10 }, + // ) { + // const where = query.queryString + // ? { + // name: { contains: query.queryString }, + // } + // : undefined; + // return this.callgentFunctionService.findAll({ + // page: query.page, + // perPage: query.perPage, + // where, + // }); + // } @ApiOkResponse({ schema: { @@ -171,12 +171,12 @@ export class CallgentFunctionsController { ], }, }) - @Put('/:uuid') + @Put('/:id') async update( - @Param('uuid') uuid: string, + @Param('id') id: string, @Body() dto: UpdateCallgentFunctionDto, ) { - dto.uuid = uuid; + dto.id = id; return { data: await this.callgentFunctionService.update(dto) }; } @@ -192,8 +192,8 @@ export class CallgentFunctionsController { ], }, }) - @Delete('/:uuid') - async delete(@Param('uuid') uuid: string) { - return { data: await this.callgentFunctionService.delete(uuid) }; + @Delete('/:id') + async delete(@Param('id') id: string) { + return { data: await this.callgentFunctionService.delete(id) }; } } diff --git a/src/callgent-functions/callgent-functions.service.ts b/src/callgent-functions/callgent-functions.service.ts index e5fadac..d873980 100644 --- a/src/callgent-functions/callgent-functions.service.ts +++ b/src/callgent-functions/callgent-functions.service.ts @@ -21,11 +21,11 @@ export class CallgentFunctionsService { private readonly endpointsService: EndpointsService, ) {} protected readonly defSelect: Prisma.CallgentFunctionSelect = { - id: false, - tenantId: false, + pk: false, + tenantPk: false, fullCode: false, content: false, - callgentUuid: false, + callgentId: false, createdBy: false, deletedAt: false, }; @@ -39,13 +39,13 @@ export class CallgentFunctionsService { // TODO if too many functions, use summary first const { data: funcs } = await this.findAll({ select: { createdAt: false, updatedAt: false }, - where: { callgentUuid: callgentId, name: funName }, + where: { callgentId: callgentId, name: funName }, perPage: Number.MAX_SAFE_INTEGER, }); if (!funcs.length) throw new BadRequestException( `No function found on callgent#${callgentId}${ - funName ? 'name=' + funName : '' + funName ? ' name=' + funName : '' }`, ); reqEvent.context.functions = funcs as any[]; @@ -86,7 +86,7 @@ export class CallgentFunctionsService { async createBatch(endpoint: EndpointDto, spec: ApiSpec, createdBy: string) { if (endpoint.type != 'SERVER') throw new BadRequestException( - 'endpoint must be of type `SERVER`, uuid=' + endpoint.uuid, + 'endpoint must be of type `SERVER`, id=' + endpoint.id, ); const { apis } = spec; @@ -95,12 +95,12 @@ export class CallgentFunctionsService { (e) => { return { ...e, - uuid: Utils.uuid(), + id: Utils.uuid(), funName: e.name, documents: e.content.summary, fullCode: '', - endpointUuid: endpoint.uuid, - callgentUuid: endpoint.callgentUuid, + endpointId: endpoint.id, + callgentId: endpoint.callgentId, createdBy: createdBy, }; }, @@ -177,32 +177,32 @@ export class CallgentFunctionsService { } @Transactional() - delete(uuid: string) { + delete(id: string) { const prisma = this.txHost.tx as PrismaClient; return selectHelper(this.defSelect, (select) => - prisma.callgentFunction.delete({ select, where: { uuid } }), + prisma.callgentFunction.delete({ select, where: { id } }), ); } @Transactional() update(dto: UpdateCallgentFunctionDto) { - if (!dto.uuid) return; + if (!dto.id) return; const prisma = this.txHost.tx as PrismaClient; return selectHelper(this.defSelect, (select) => prisma.callgentFunction.update({ select, - where: { uuid: dto.uuid }, + where: { id: dto.id }, data: dto, }), ); } - findOne(uuid: string) { + findOne(id: string) { const prisma = this.txHost.tx as PrismaClient; return selectHelper(this.defSelect, (select) => prisma.callgentFunction.findUnique({ select, - where: { uuid }, + where: { id }, }), ); } diff --git a/src/callgents/callgents.controller.ts b/src/callgents/callgents.controller.ts index ab761ca..0cbbfa2 100644 --- a/src/callgents/callgents.controller.ts +++ b/src/callgents/callgents.controller.ts @@ -57,9 +57,9 @@ export class CallgentsController { ], }, }) - @Get('/:uuid') - async findOne(@Param('uuid') uuid: string) { - return { data: await this.callgentService.findOne(uuid) }; + @Get('/:id') + async findOne(@Param('id') id: string) { + return { data: await this.callgentService.findOne(id) }; } @ApiQuery({ name: 'query', required: false, type: String }) @@ -67,7 +67,7 @@ export class CallgentsController { @ApiQuery({ name: 'perPage', required: false, type: Number }) @ApiOkResponse({ schema: { - allOf: [ + anyOf: [ { $ref: getSchemaPath(RestApiResponse) }, { properties: { @@ -106,29 +106,12 @@ export class CallgentsController { ], }, }) - @Put('/:uuid') - async update(@Param('uuid') uuid: string, @Body() dto: UpdateCallgentDto) { - dto.uuid = uuid; + @Put('/:id') + async update(@Param('id') id: string, @Body() dto: UpdateCallgentDto) { + dto.id = id; return { data: await this.callgentService.update(dto) }; } - @ApiOkResponse({ - schema: { - allOf: [ - { $ref: getSchemaPath(RestApiResponse) }, - { - properties: { - data: { $ref: getSchemaPath(CallgentDto) }, - }, - }, - ], - }, - }) - @Delete('/:uuid') - async delete(@Param('uuid') uuid: string) { - return { data: await this.callgentService.delete(uuid) }; - } - @ApiCreatedResponse({ schema: { allOf: [ @@ -137,18 +120,35 @@ export class CallgentsController { ], }, }) - @Post(':uuid/duplicate') + @Post(':id/duplicate') async duplicateOverTenancy( - @Param('uuid') uuid: string, + @Param('id') id: string, @Req() req, @Body() dto: CreateCallgentDto, ) { return { data: await this.callgentService.duplicateOverTenancy( - uuid, + id, dto, req.user.sub, ), }; } + + @ApiOkResponse({ + schema: { + allOf: [ + { $ref: getSchemaPath(RestApiResponse) }, + { + properties: { + data: { $ref: getSchemaPath(CallgentDto) }, + }, + }, + ], + }, + }) + @Delete('/:id') + async remove(@Param('id') id: string) { + return { data: await this.callgentService.delete(id) }; + } } diff --git a/src/callgents/callgents.service.ts b/src/callgents/callgents.service.ts index 0b75e3c..760f1e9 100644 --- a/src/callgents/callgents.service.ts +++ b/src/callgents/callgents.service.ts @@ -22,8 +22,8 @@ export class CallgentsService { private readonly tenancyService: PrismaTenancyService, ) {} protected readonly defSelect: Prisma.CallgentSelect = { - id: false, - tenantId: false, + pk: false, + tenantPk: false, createdBy: false, deletedAt: false, }; @@ -35,7 +35,7 @@ export class CallgentsService { select?: Prisma.CallgentSelect, ) { const data = dto as Prisma.CallgentUncheckedCreateInput; - (data.uuid = Utils.uuid()), (data.createdBy = createdBy); + (data.id = Utils.uuid()), (data.createdBy = createdBy); const prisma = this.txHost.tx as PrismaClient; const ret: Callgent = await selectHelper( @@ -88,58 +88,58 @@ export class CallgentsService { } @Transactional() - async findMany(uuids: string[], select?: Prisma.CallgentSelect) { + async findMany(ids: string[], select?: Prisma.CallgentSelect) { const prisma = this.txHost.tx as PrismaClient; const callgents = await selectHelper( select, async (select) => await prisma.callgent.findMany({ - where: { uuid: { in: uuids } }, + where: { id: { in: ids } }, select, }), this.defSelect, ); - if (callgents.length != uuids.length) + if (callgents.length != ids.length) throw new NotFoundException( - `Callgent not found, uuid=${uuids - .filter((x) => !callgents.find((y) => y.uuid == x)) + `Callgent not found, id=${ids + .filter((x) => !callgents.find((y) => y.id == x)) .join(', ')}`, ); return callgents; } @Transactional() - delete(uuid: string) { + delete(id: string) { const prisma = this.txHost.tx as PrismaClient; return selectHelper(this.defSelect, (select) => - prisma.callgent.delete({ select, where: { uuid } }), + prisma.callgent.delete({ select, where: { id } }), ); } @Transactional() update(dto: UpdateCallgentDto) { - if (!dto.uuid) return; + if (!dto.id) return; const prisma = this.txHost.tx as PrismaClient; return selectHelper(this.defSelect, (select) => prisma.callgent.update({ select, - where: { uuid: dto.uuid }, + where: { id: dto.id }, data: dto, }), ); } @Transactional() - findOne(uuid: string, select?: Prisma.CallgentSelect) { + findOne(id: string, select?: Prisma.CallgentSelect) { const prisma = this.txHost.tx as PrismaClient; return selectHelper( select, (select) => prisma.callgent.findUnique({ select, - where: { uuid }, + where: { id }, }), this.defSelect, ); @@ -147,14 +147,14 @@ export class CallgentsService { @Transactional() getByName(name: string, select?: Prisma.CallgentSelect) { - const tenantId = this.tenancyService.getTenantId(); + const tenantPk = this.tenancyService.getTenantId(); const prisma = this.txHost.tx as PrismaClient; return selectHelper( { ...select, deletedAt: null }, (select) => prisma.callgent.findUnique({ select, - where: { tenantId_name: { tenantId, name } }, + where: { tenantPk_name: { tenantPk, name } }, }), this.defSelect, ).then((c) => { @@ -166,21 +166,19 @@ export class CallgentsService { @Transactional() async duplicateOverTenancy( - dupUuid: string, + dupId: string, dto: CreateCallgentDto, createdBy: string, ) { const prisma = this.txHost.tx as PrismaClient; await this.tenancyService.bypassTenancy(prisma); - const dup = await prisma.callgent.findUnique({ where: { uuid: dupUuid } }); + const dup = await prisma.callgent.findUnique({ where: { id: dupId } }); if (!dup) - throw new NotFoundException( - 'callgent to duplicate not found: ' + dupUuid, - ); + throw new NotFoundException('callgent to duplicate not found: ' + dupId); await this.tenancyService.bypassTenancy(prisma, false); - const callgent = await this.create(dto, createdBy, { id: null }); + return this.create(dto, createdBy, { id: null }); } /** @@ -193,18 +191,18 @@ export class CallgentsService { async please( act: string, args: any[], - endpoint: { callgentUuid: string; uuid?: string; adaptorKey?: string }, + endpoint: { callgentId: string; id?: string; adaptorKey?: string }, ) { // invoke callgent action api, through endpoint const prisma = this.txHost.tx as PrismaClient; - const withEndpoint = endpoint?.uuid || endpoint?.adaptorKey; + const withEndpoint = endpoint?.id || endpoint?.adaptorKey; // load targets if (withEndpoint) this.tenancyService.bypassTenancy(prisma); const [callgent, actions, epClient] = await Promise.all([ - prisma.callgent.findUnique({ where: { uuid: endpoint.callgentUuid } }), + prisma.callgent.findUnique({ where: { id: endpoint.callgentId } }), prisma.callgentFunction.findMany({ - where: { name: act, callgentUuid: endpoint.callgentUuid }, + where: { name: act, callgentId: endpoint.callgentId }, }), withEndpoint && prisma.endpoint.findFirst({ where: { ...endpoint, type: 'CLIENT' } }), @@ -212,21 +210,19 @@ export class CallgentsService { // check targets if (!callgent) - throw new NotFoundException( - 'callgent not found: ' + endpoint.callgentUuid, - ); + throw new NotFoundException('callgent not found: ' + endpoint.callgentId); if (actions.length === 0) throw new NotFoundException( - `callgent=${endpoint.callgentUuid} API action not found: ${act}`, + `callgent=${endpoint.callgentId} API action not found: ${act}`, ); if (withEndpoint) { if (!epClient) throw new NotFoundException( - `Client endpoint not found for callgent=${endpoint.callgentUuid}: ${ - endpoint.uuid || endpoint.adaptorKey + `Client endpoint not found for callgent=${endpoint.callgentId}: ${ + endpoint.id || endpoint.adaptorKey }`, ); - this.tenancyService.setTenantId(callgent.tenantId); + this.tenancyService.setTenantId(callgent.tenantPk); this.tenancyService.bypassTenancy(prisma, false); } diff --git a/src/endpoints/adaptors/builtin/restapi/restapi.adaptor.ts b/src/endpoints/adaptors/builtin/restapi/restapi.adaptor.ts index 8750bca..d1599bb 100644 --- a/src/endpoints/adaptors/builtin/restapi/restapi.adaptor.ts +++ b/src/endpoints/adaptors/builtin/restapi/restapi.adaptor.ts @@ -172,7 +172,7 @@ export class RestAPIAdaptor extends EndpointAdaptor { const { method, headers: rawHeaders, query, body, raw } = request; if (request.url.indexOf('/invoke/api/') < 0) throw new Error( - 'Unsupported URL, should be /callgents/:uuids/:endpoint/invoke/api/*', + 'Unsupported URL, should be /callgents/:ids/:endpoint/invoke/api/*', ); const url = request.url.substr(request.url.indexOf('/invoke/api/') + 11); diff --git a/src/endpoints/adaptors/builtin/restapi/restapi.controller.ts b/src/endpoints/adaptors/builtin/restapi/restapi.controller.ts index 5a49cdc..bc822ab 100644 --- a/src/endpoints/adaptors/builtin/restapi/restapi.controller.ts +++ b/src/endpoints/adaptors/builtin/restapi/restapi.controller.ts @@ -35,14 +35,14 @@ export class RestApiController { description: 'rest-api client endpoint entry of multiple callgents', }) @ApiParam({ - name: 'uuid', + name: 'id', required: true, - description: "comma separated callgent uuids, eg: 'uuid1,uuid2,uuid3'. ", + description: "comma separated callgent ids, eg: 'id1,id2,id3'. ", }) @ApiParam({ name: 'endpoint', required: false, - description: 'endpoint uuid, optional: "/callgents/the-uuid`//`invoke/api/"', + description: 'endpoint id, optional: "/callgents/the-id`//`invoke/api/"', }) @ApiParam({ name: 'NOTE: swagger does not support wildcard param. Just document here', @@ -57,10 +57,10 @@ export class RestApiController { description: 'progressive request responder', }) @ApiHeader({ name: 'x-callgent-callback', required: false }) - @All(':uuid/:endpoint/invoke/api/*') + @All(':id/:endpoint/invoke/api/*') async execute( @Req() req, - @Param('uuid') callgentId: string, + @Param('id') callgentId: string, @Param('endpoint') endpoint?: string, @Headers('x-callgent-taskId') taskId?: string, @Headers('x-callgent-progressive') progressive?: string, @@ -73,7 +73,7 @@ export class RestApiController { const caller = req.user?.sub || req.ip || req.socket.remoteAddress; // TODO owner defaults to caller callgent - // find callgent cep, then set tenantId + // find callgent cep, then set tenantPk const cep = await this.endpointsService.$findFirstByType( EndpointType.CLIENT, callgentId, @@ -84,25 +84,21 @@ export class RestApiController { throw new NotFoundException( 'restAPI endpoint not found for callgent: ' + callgentId, ); - const callgent = await this.callgentsService.findOne(callgentId, { name: true }); - if (!callgent) throw new NotFoundException('callgent not found: ' + callgentId); + const callgent = await this.callgentsService.findOne(callgentId, { + name: true, + }); + if (!callgent) + throw new NotFoundException('callgent not found: ' + callgentId); const { event, statusCode, message } = await this.eventListenersService.emit( - new ClientRequestEvent( - cep.uuid, - taskId, - cep.adaptorKey, - req, - callback, - { - callgentId, - callgentName: callgent.name, - caller, - progressive, - funName, - }, - ), + new ClientRequestEvent(cep.id, taskId, cep.adaptorKey, req, callback, { + callgentId, + callgentName: callgent.name, + caller, + progressive, + funName, + }), // FIXME sync timeout ); // FIXME data @@ -152,7 +148,7 @@ export class RestApiController { // const dto = await this.convertToTask(callerType, body, caller); // if (!dto?.callgent) - // throw new BadRequestException('callgent uuid is missing'); + // throw new BadRequestException('callgent id is missing'); // const [task] = await this.tasksService.create(dto); diff --git a/src/endpoints/endpoints.controller.ts b/src/endpoints/endpoints.controller.ts index 5ee894b..037af07 100644 --- a/src/endpoints/endpoints.controller.ts +++ b/src/endpoints/endpoints.controller.ts @@ -35,7 +35,7 @@ export class EndpointsController { ) {} @Get('adaptors') - list(@Query('client') client?: boolean) { + listAdaptors(@Query('client') client?: boolean) { return this.endpointsService.list(client); } @@ -63,33 +63,16 @@ export class EndpointsController { }; } - @Put(':uuid') + @Put(':id') async updateEndpoint( - @Param('uuid') uuid: string, + @Param('id') id: string, @Body() dto: UpdateEndpointDto, ) { return { - data: await this.endpointsService.update(uuid, dto), + data: await this.endpointsService.update(id, dto), }; } - @ApiOkResponse({ - schema: { - allOf: [ - { $ref: getSchemaPath(RestApiResponse) }, - { - properties: { - data: { $ref: getSchemaPath(EndpointDto) }, - }, - }, - ], - }, - }) - @Delete('/:uuid') - async delete(@Param('uuid') uuid: string) { - return { data: await this.endpointsService.delete(uuid) }; - } - /** for auth type `APP`, userKey is ignored */ // @Put('auth') // async upsertEndpointAuth(@Req() req, @Body() dto: CreateEndpointAuthDto) { @@ -102,14 +85,31 @@ export class EndpointsController { // }; // } - @Post(':uuid/init') - initEndpoint(@Param('uuid') uuid: string, @Body() initParams: object) { - this.endpointsService.init(uuid, initParams); + @Post(':id/init') + initEndpoint(@Param('id') id: string, @Body() initParams: object) { + this.endpointsService.init(id, initParams); } /** manual test endpoint */ - @Post(':uuid/test') - testEndpoint(@Param('uuid') uuid: string, @Body() any: any) { + @Post(':id/test') + testEndpoint(@Param('id') id: string, @Body() any: any) { // } + + @ApiOkResponse({ + schema: { + allOf: [ + { $ref: getSchemaPath(RestApiResponse) }, + { + properties: { + data: { $ref: getSchemaPath(EndpointDto) }, + }, + }, + ], + }, + }) + @Delete('/:id') + async remove(@Param('id') id: string) { + return { data: await this.endpointsService.delete(id) }; + } } diff --git a/src/endpoints/endpoints.service.ts b/src/endpoints/endpoints.service.ts index 008a828..a44cb1e 100644 --- a/src/endpoints/endpoints.service.ts +++ b/src/endpoints/endpoints.service.ts @@ -32,8 +32,8 @@ export class EndpointsService { private readonly tenancyService: PrismaTenancyService, ) {} protected readonly defSelect: Prisma.EndpointSelect = { - id: false, - tenantId: false, + pk: false, + tenantPk: false, createdBy: false, deletedAt: false, }; @@ -85,22 +85,22 @@ export class EndpointsService { } @Transactional() - findOne(uuid: string) { + findOne(id: string) { const prisma = this.txHost.tx as PrismaClient; - return prisma.endpoint.findUnique({ where: { uuid } }); + return prisma.endpoint.findUnique({ where: { id } }); } @Transactional() findFirstByType( type: EndpointType, - callgentUuid: string, + callgentId: string, adaptorKey: string, - uuid?: string, + id?: string, ) { - uuid || (uuid = undefined); + id || (id = undefined); const prisma = this.txHost.tx as PrismaClient; return prisma.endpoint.findFirst({ - where: { callgentUuid, adaptorKey, type, uuid }, + where: { callgentId, adaptorKey, type, id }, orderBy: { priority: 'desc' }, }); } @@ -109,15 +109,15 @@ export class EndpointsService { @Transactional() async $findFirstByType( type: EndpointType, - callgentUuid: string, + callgentId: string, adaptorKey: string, endpoint?: string, ) { const prisma = this.txHost.tx as PrismaClient; return this.tenancyService.bypassTenancy(prisma).then(() => - this.findFirstByType(type, callgentUuid, adaptorKey, endpoint).then( + this.findFirstByType(type, callgentId, adaptorKey, endpoint).then( async (v) => { - v && this.tenancyService.setTenantId(v.tenantId); + v && this.tenancyService.setTenantId(v.tenantPk); await this.tenancyService.bypassTenancy(prisma, false); return v; }, @@ -126,11 +126,11 @@ export class EndpointsService { } @Transactional() - findOneAuth(uuid: string, userKey: string) { + findOneAuth(id: string, userKey: string) { const prisma = this.txHost.tx as PrismaClient; return prisma.endpointAuth.findUnique({ where: { - endpointUuid_userKey: { endpointUuid: uuid, userKey: userKey }, + endpointId_userKey: { endpointId: id, userKey: userKey }, }, }); } @@ -174,7 +174,7 @@ export class EndpointsService { @Transactional() async create( - dto: Omit, + dto: Omit, select?: Prisma.EndpointSelect, ) { const prisma = this.txHost.tx as PrismaClient; @@ -184,9 +184,9 @@ export class EndpointsService { 'Invalid endpoint adaptor key=' + dto.adaptorKey, ); - const uuid = Utils.uuid(); + const id = Utils.uuid(); // init ep name - dto.host = dto.host.replace('{uuid}', uuid); + dto.host = dto.host.replace('{id}', id); dto.name || (dto.name = dto.host); return selectHelper( @@ -194,22 +194,22 @@ export class EndpointsService { (select) => prisma.endpoint.create({ select, - data: { ...dto, uuid }, + data: { ...dto, id }, }), this.defSelect, ); } @Transactional() - update(uuid: string, dto: UpdateEndpointDto) { + update(id: string, dto: UpdateEndpointDto) { throw new Error('Method not implemented.'); } @Transactional() - delete(uuid: string) { + delete(id: string) { const prisma = this.txHost.tx as PrismaClient; return selectHelper(this.defSelect, (select) => - prisma.endpoint.delete({ select, where: { uuid } }), + prisma.endpoint.delete({ select, where: { id } }), ); } @@ -229,15 +229,15 @@ export class EndpointsService { // } else if (endpoint.authType == 'APP') dto.userKey = ''; // // else // // throw new BadRequestException('Invalid auth type: ' + endpoint.authType); - // dto.endpointUuid = endpoint.uuid; + // dto.endpointId = endpoint.id; // const prisma = this.txHost.tx as PrismaClient; // return selectHelper(this.defSelect as Prisma.EndpointAuthSelect, (select) => // prisma.endpointAuth.upsert({ // select, // where: { - // endpointUuid_userKey: { - // endpointUuid: dto.endpointUuid, + // endpointId_userKey: { + // endpointId: dto.endpointId, // userKey: dto.userKey, // }, // }, @@ -248,11 +248,11 @@ export class EndpointsService { // } @Transactional(Propagation.RequiresNew) - async init(uuid: string, initParams: object) { + async init(id: string, initParams: object) { return; const prisma = this.txHost.tx as PrismaClient; - const endpoint = await this.findOne(uuid); + const endpoint = await this.findOne(id); if (endpoint) { const adaptor = this.getAdaptor(endpoint.adaptorKey, endpoint.type); if (adaptor) { @@ -262,7 +262,7 @@ export class EndpointsService { // : adaptor.initReceiver)(initParams, endpoint as any); // if (content) // prisma.endpoint.update({ - // where: { uuid }, + // where: { id }, // data: { content }, // }); // return content; @@ -272,7 +272,7 @@ export class EndpointsService { `Invalid endpoint adaptor, adaptorKey=${endpoint.adaptorKey}`, ); } - throw new NotFoundException(`Endpoint not found, uuid=${uuid}`); + throw new NotFoundException(`Endpoint not found, id=${id}`); } async parseApis( diff --git a/src/endpoints/events/client-request.event.ts b/src/endpoints/events/client-request.event.ts index 5be12b8..f0f107b 100644 --- a/src/endpoints/events/client-request.event.ts +++ b/src/endpoints/events/client-request.event.ts @@ -11,7 +11,7 @@ import { EventObject } from '../../event-listeners/event-object'; */ export class ClientRequestEvent extends EventObject { constructor( - /** client endpoint uuid */ + /** client endpoint id */ cepId: string, /** empty to create new task */ taskId: string, diff --git a/src/endpoints/listeners/callgent-created.listener.ts b/src/endpoints/listeners/callgent-created.listener.ts index d380452..7fd595a 100644 --- a/src/endpoints/listeners/callgent-created.listener.ts +++ b/src/endpoints/listeners/callgent-created.listener.ts @@ -25,15 +25,15 @@ export class CallgentCreatedListener { // API client endpoint this.endpointsService .create({ - callgentUuid: callgent.uuid, + callgentId: callgent.id, type: 'CLIENT', adaptorKey: 'restAPI', - host: `/api/callgents/${callgent.uuid}/{uuid}/invoke/api/`, + host: `/api/callgents/${callgent.id}/{id}/invoke/api/`, createdBy: callgent.createdBy, }) .then((endpoint) => { // no await init, it may be slow, init must restart a new tx - this.endpointsService.init(endpoint.uuid, []); + this.endpointsService.init(endpoint.id, []); return endpoint; }), @@ -42,15 +42,15 @@ export class CallgentCreatedListener { // Email client endpoint this.endpointsService .create({ - callgentUuid: callgent.uuid, + callgentId: callgent.id, type: 'CLIENT', adaptorKey: 'Email', - host: `callgent+${callgent.uuid}@my.callgent.com`, + host: `callgent+${callgent.id}@my.callgent.com`, createdBy: callgent.createdBy, }) .then((endpoint) => { // no await init, it may be slow - this.endpointsService.init(endpoint.uuid, []); + this.endpointsService.init(endpoint.id, []); return endpoint; }), ]); diff --git a/src/event-listeners/event-listeners.service.ts b/src/event-listeners/event-listeners.service.ts index f265076..d91f3ad 100644 --- a/src/event-listeners/event-listeners.service.ts +++ b/src/event-listeners/event-listeners.service.ts @@ -47,7 +47,7 @@ export class EventListenersService { return { event, statusCode: event.statusCode, - message: `Sync invocation timeout(${timeout}ms), respond via callback`, + message: `Sync invocation timeout(${timeout}ms), will respond via callback`, }; }), ]) @@ -61,13 +61,13 @@ export class EventListenersService { ): Promise<{ event: T; statusCode?: number; message?: string }> { const prisma = this.txHost.tx as PrismaClient; const event = await prisma.eventStore.findUnique({ - where: { uuid: eventId }, + where: { id: eventId }, }); - if (!event) throw new NotFoundException('Event not found, uuid=' + eventId); + if (!event) throw new NotFoundException('Event not found, id=' + eventId); // -1: processing, 0: done, 1: pending, >1: error if (event.statusCode <= 0) throw new BadRequestException( - `Cannot resume event with status ${event.statusCode}, uuid=${eventId}`, + `Cannot resume event with status ${event.statusCode}, id=${eventId}`, ); const listeners = await this.resumeListeners(event); @@ -128,7 +128,7 @@ export class EventListenersService { } finally { const nextListener = statusCode > 0 ? listener : statusCode == 0 ? null : listeners[idx]; - await this.upsertEvent(event, funName, nextListener?.uuid, statusCode); + await this.upsertEvent(event, funName, nextListener?.id, statusCode); } } return { event, statusCode }; @@ -142,12 +142,12 @@ export class EventListenersService { }, deleted = false, ) { - const { srcId: srcUuid, eventType, dataType } = event; + const { srcId: srcId, eventType, dataType } = event; const prisma = this.txHost.tx as PrismaClient; const AND: Prisma.EventListenerWhereInput[] = [ { - OR: [{ srcUuid }, { tenantId: 0, srcUuid: 'GLOBAL' }], + OR: [{ srcId }, { tenantPk: 0, srcId: 'GLOBAL' }], }, { OR: [{ eventType }, { dataType }] }, ]; @@ -166,7 +166,7 @@ export class EventListenersService { .sort((a, b) => { const diff = a.priority - b.priority || - (a.srcUuid === 'GLOBAL' ? -1 : 1) - (b.srcUuid === 'GLOBAL' ? -1 : 1); + (a.srcId === 'GLOBAL' ? -1 : 1) - (b.srcId === 'GLOBAL' ? -1 : 1); return diff; }); if (!listeners.length) @@ -176,16 +176,16 @@ export class EventListenersService { return listeners; } - /** load listeners by event id after event.listenerUuid[including] */ + /** load listeners by event id after event.listenerId[including] */ async resumeListeners(event: EventStore) { let listeners = await this.loadListeners(event, true); - if (event.listenerUuid) { + if (event.listenerId) { const idx = listeners.findIndex( - (listener) => listener.uuid === event.listenerUuid, + (listener) => listener.id === event.listenerId, ); if (idx < 0) throw new NotFoundException( - `Invalid listener uuid ${event.listenerUuid} for event ${event.uuid}`, + `Invalid listener id ${event.listenerId} for event ${event.id}`, ); listeners = listeners.splice(0, idx); @@ -205,26 +205,26 @@ export class EventListenersService { } } protected async _invokeService( - target: { uuid: string; serviceName: string; funName: string }, + target: { id: string; serviceName: string; funName: string }, event: EventObject, funName?: string, ): Promise<{ event: T; funName?: string }> { const service = this.moduleRef.get(target.serviceName, { strict: false }); if (!service) throw new Error( - `Service ${target.serviceName} not found for event listener#${target.uuid}`, + `Service ${target.serviceName} not found for event listener#${target.id}`, ); const fun = service[funName || target.funName]; if (!fun) throw new Error( - `Service ${target.serviceName}.${target.funName} not found for event listener#${target.uuid}`, + `Service ${target.serviceName}.${target.funName} not found for event listener#${target.id}`, ); return fun.apply(service, [event]); } protected async _invokeCallgent( - target: { uuid: string; serviceName: string; funName: string }, + target: { id: string; serviceName: string; funName: string }, event: T, funName?: string, ): Promise<{ event: T; funName?: string }> { @@ -236,9 +236,9 @@ export class EventListenersService { data.eventType || (data.eventType = '*'); data.dataType || (data.dataType = '*'); - const uuid = Utils.uuid(); + const id = Utils.uuid(); const prisma = this.txHost.tx as PrismaClient; - return prisma.eventListener.create({ data: { ...data, uuid, createdBy } }); + return prisma.eventListener.create({ data: { ...data, id, createdBy } }); } @Transactional() @@ -254,7 +254,7 @@ export class EventListenersService { upsertEvent( event: EventObject, funName: string, - listenerUuid: string, + listenerId: string, status: number, ) { const prisma = this.txHost.tx as PrismaClient; @@ -262,11 +262,11 @@ export class EventListenersService { const data: Prisma.EventStoreCreateInput = { ...event, funName, - listenerUuid, + listenerId, }; delete (data as any).rawReq; return prisma.eventStore.upsert({ - where: { uuid: event.uuid }, + where: { id: event.id }, create: data, update: data, }); diff --git a/src/event-listeners/event-object.ts b/src/event-listeners/event-object.ts index f43e0cf..75ebf31 100644 --- a/src/event-listeners/event-object.ts +++ b/src/event-listeners/event-object.ts @@ -4,19 +4,19 @@ import { Utils } from '../infra/libs/utils'; export class EventObject { constructor( - /** src entity uuid which bind to the listener */ + /** src entity id which bind to the listener */ public readonly srcId: string, public readonly eventType: string, public readonly dataType: string, - /** target uuid to relate several events */ + /** target id to relate several events */ public targetId: string, /** url template for response callback, `callgent:funName[@callgent]` to invoke callgent */ public callback?: string, public readonly callbackType: EventCallbackType = 'EVENT', ) { - this.uuid = Utils.uuid(); + this.id = Utils.uuid(); } - public readonly uuid: string; + public readonly id: string; public statusCode = -1; // for response only public readonly context: { [key: string]: JsonValue } = {}; public message: string; diff --git a/src/event-stores/event-stores.service.ts b/src/event-stores/event-stores.service.ts index f493a0f..c571a0d 100644 --- a/src/event-stores/event-stores.service.ts +++ b/src/event-stores/event-stores.service.ts @@ -13,12 +13,12 @@ export class EventStoresService { /** create random targetId if not set, else load all events of targetId */ async loadTargetEvents(event: EventObject) { - const { uuid, targetId } = event; + const { id, targetId } = event; if (targetId) { const prisma = this.txHost.tx as PrismaClient; const es = await prisma.eventStore.findMany({ - select: { uuid: true, eventType: true, dataType: true, data: true }, // TODO, what to select - where: { AND: [{ uuid: { not: uuid } }, { targetId }] }, + select: { id: true, eventType: true, dataType: true, data: true }, // TODO, what to select + where: { AND: [{ NOT: { id } }, { targetId }] }, orderBy: { id: 'asc' }, }); if (!es?.length) diff --git a/src/executions/command.schema.ts b/src/executions/command.schema.ts index fdfc48e..c7bb094 100644 --- a/src/executions/command.schema.ts +++ b/src/executions/command.schema.ts @@ -1,7 +1,7 @@ /** through `callgent` to call method/assignee, with args */ export class Invocation { /** callgent */ - callgent: { uuid: string; name: string }; + callgent: { id: string; name: string }; func: string; /** expression referring to callgent response data */ args?: { [key: string]: string }; diff --git a/src/executions/executions.service.ts b/src/executions/executions.service.ts index 1db4710..b39a719 100644 --- a/src/executions/executions.service.ts +++ b/src/executions/executions.service.ts @@ -33,15 +33,15 @@ export class ExecutionsService { */ @Transactional() async execute( - callgentUuids: string[], + callgentIds: string[], rawReq: object, reqAdaptorKey: string, ctx: { taskId?: string; caller?: JwtPayload; callback?: string } = {}, - reqEndpointUuid?: string, + reqEndpointId?: string, action?: string, ) { - if (!callgentUuids?.length) - throw new BadRequestException('callgentUuids must be specified'); + if (!callgentIds?.length) + throw new BadRequestException('callgentIds must be specified'); // client adaptor const reqAdaptor = this.endpointsService.getAdaptor( @@ -54,29 +54,27 @@ export class ExecutionsService { ); let reqEndpoint: EndpointDto; - if (reqEndpointUuid) { - reqEndpoint = await this.endpointsService.findOne(reqEndpointUuid); + if (reqEndpointId) { + reqEndpoint = await this.endpointsService.findOne(reqEndpointId); if ( !reqEndpoint || reqEndpoint.type != EndpointType.CLIENT || reqEndpoint.adaptorKey != reqAdaptorKey || - !callgentUuids.includes(reqEndpoint.callgentUuid) + !callgentIds.includes(reqEndpoint.callgentId) ) - throw new NotFoundException( - `Endpoint not found, uuid=${reqEndpointUuid}`, - ); + throw new NotFoundException(`Endpoint not found, id=${reqEndpointId}`); } // load callgents const prisma = this.txHost.tx as PrismaClient; const callgents = await prisma.callgent.findMany({ - where: { uuid: { in: callgentUuids } }, - select: { uuid: true, name: true, summary: true }, + where: { id: { in: callgentIds } }, + select: { id: true, name: true, summary: true }, }); - if (callgents.length != callgentUuids.length) + if (callgents.length != callgentIds.length) throw new NotFoundException( - `Callgent not found, uuid=${callgentUuids - .filter((x) => !callgents.find((y) => y.uuid == x)) + `Callgent not found, id=${callgentIds + .filter((x) => !callgents.find((y) => y.id == x)) .join(', ')}`, ); @@ -98,7 +96,7 @@ export class ExecutionsService { // return this._invocationFlow( // { endpoint: reqEndpoint, adaptor: reqAdaptor, req: rawReq }, - // callgentUuids[0], + // callgentIds[0], // action, // ); } @@ -106,15 +104,15 @@ export class ExecutionsService { /** invocation flow, and lifecycle events */ // protected async _invocationFlow( // req: any, - // callgentUuid: string, + // callgentId: string, // actionName?: string, // ) { // const prisma = this.txHost.tx as PrismaClient; // // specific/AI routing from req, get action params/code, TODO: [and specific mapping] // const where = actionName - // ? { AND: [{ name: actionName }, { callgentUuid }] } - // : { callgentUuid }; + // ? { AND: [{ name: actionName }, { callgentId }] } + // : { callgentId }; // const take = actionName ? 1 : undefined; // const actions = await prisma.callgentFunction.findMany({ where, take }); // const action = actionName @@ -122,7 +120,7 @@ export class ExecutionsService { // : await this._routing(req, actions); // if (!action) // throw new BadRequestException( - // 'Action entry not found on callgent: ' + callgentUuid, + // 'Action entry not found on callgent: ' + callgentId, // ); // // may reply ack to client directly, async result @@ -141,15 +139,15 @@ export class ExecutionsService { // @Transactional() // async callout(action: CallgentFunctionDto, req: any) { // // get server endpoint(sep), and sAdaptor - // const sEndpoint = null; // await this.findOne(action.endpointUuid); + // const sEndpoint = null; // await this.findOne(action.endpointId); // if (!sEndpoint) // throw new NotFoundException( - // `Endpoint not found, uuid=${action.endpointUuid}`, + // `Endpoint not found, id=${action.endpointId}`, // ); // const sAdaptor = null; // this.getAdaptor(sEndpoint.adaptorKey, sEndpoint.type); // if (!sAdaptor) // throw new NotFoundException( - // `Endpoint#${action.endpointUuid} adaptor not found, adaptorKey=${sEndpoint.adaptorKey}`, + // `Endpoint#${action.endpointId} adaptor not found, adaptorKey=${sEndpoint.adaptorKey}`, // ); // //// async/sync execute action command, given action params/code/req/[specific mapping], with cb diff --git a/src/infra/auth/jwt/jwt.service.ts b/src/infra/auth/jwt/jwt.service.ts index b5c76f0..95bc83b 100644 --- a/src/infra/auth/jwt/jwt.service.ts +++ b/src/infra/auth/jwt/jwt.service.ts @@ -13,7 +13,7 @@ export class JwtPayload { /** audience id or type, e.g. email,appKey */ aud?: string; id?: number; - tenantId?: number; + tenantPk?: number; scope?: string | string[]; username?: string; nickname?: string; diff --git a/src/infra/repo/tenancy/prisma-tenancy.module.ts b/src/infra/repo/tenancy/prisma-tenancy.module.ts index d6b9765..e0719c4 100644 --- a/src/infra/repo/tenancy/prisma-tenancy.module.ts +++ b/src/infra/repo/tenancy/prisma-tenancy.module.ts @@ -7,7 +7,7 @@ import { PrismaTenancyService } from './prisma-tenancy.service'; /** * postgres specific module. - * automatically `SELECT set_config('tenancy.tenantId', cls.get('TENANT_ID'))`, before all operations. + * automatically `SELECT set_config('tenancy.tenantPk', cls.get('TENANT_ID'))`, before all operations. */ @Global() @Module({ diff --git a/src/infra/repo/tenancy/prisma-tenancy.provider.ts b/src/infra/repo/tenancy/prisma-tenancy.provider.ts index 8ffd2b2..b7866ce 100644 --- a/src/infra/repo/tenancy/prisma-tenancy.provider.ts +++ b/src/infra/repo/tenancy/prisma-tenancy.provider.ts @@ -3,7 +3,7 @@ import { ClsService } from 'nestjs-cls'; import { PrismaService } from 'nestjs-prisma'; import { PrismaTenancyService } from './prisma-tenancy.service'; -/** 'tenancy.tenantId' */ +/** 'tenancy.tenantPk' */ export const prismaTenancyUseFactory = ( newTx: PrismaService, store: ClsService, @@ -12,14 +12,14 @@ export const prismaTenancyUseFactory = ( query: { $allModels: { async $allOperations({ args, query }) { - const tenantId = store.get(PrismaTenancyService.TENANT_ID_KEY); + const tenantPk = store.get(PrismaTenancyService.TENANT_ID_KEY); - if (tenantId) { + if (tenantPk) { const existingTx = store.get(getTransactionClsKey()); // 2 ops const op = (existingTx || newTx) - .$executeRaw`SELECT set_config('tenancy.tenantId', ${tenantId.toString()}, TRUE)`; + .$executeRaw`SELECT set_config('tenancy.tenantPk', ${tenantPk.toString()}, TRUE)`; if (existingTx) { await op; } else { diff --git a/src/infra/repo/tenancy/prisma-tenancy.service.ts b/src/infra/repo/tenancy/prisma-tenancy.service.ts index 5e04881..ccc6179 100644 --- a/src/infra/repo/tenancy/prisma-tenancy.service.ts +++ b/src/infra/repo/tenancy/prisma-tenancy.service.ts @@ -8,9 +8,9 @@ export class PrismaTenancyService { public static readonly TENANT_ID_KEY = 'TENANT_ID'; - setTenantId(tenantId: number) { + setTenantId(tenantPk: number) { this.cls.enter({ ifNested: 'reuse' }); - this.cls.set(PrismaTenancyService.TENANT_ID_KEY, tenantId); + this.cls.set(PrismaTenancyService.TENANT_ID_KEY, tenantPk); } getTenantId(): number { diff --git a/src/task-actions/task-actions.service.ts b/src/task-actions/task-actions.service.ts index 2e447e1..a6fc7d6 100644 --- a/src/task-actions/task-actions.service.ts +++ b/src/task-actions/task-actions.service.ts @@ -28,17 +28,17 @@ export class TaskActionsService { // // new task // const task = taskId - // ? await this.tasksService.findOne(taskId, { uuid: true }) - // : await this.tasksService.create({}, caller, { uuid: true }); - // if (!task) throw new NotFoundException('Task not found, uuid=' + taskId); + // ? await this.tasksService.findOne(taskId, { id: true }) + // : await this.tasksService.create({}, caller, { id: true }); + // if (!task) throw new NotFoundException('Task not found, id=' + taskId); // const data = { - // uuid: Utils.uuid(), + // id: Utils.id(), // req, - // taskUuid: task.uuid, + // taskId: task.id, // progressive, // cAdaptor: reqEvent.dataType, - // cepUuid: reqEvent.srcId, + // cepId: reqEvent.srcId, // callback, // createdBy: caller, // funName, @@ -47,8 +47,8 @@ export class TaskActionsService { // // TODO: some action needn't persist, e.g. (action && !taskId) // const prisma = this.txHost.tx as PrismaClient; // await prisma.taskAction.create({ data }); - // reqEvent.data.taskId = task.uuid; - // reqEvent.processed.taskActionId = data.uuid; + // reqEvent.data.taskId = task.id; + // reqEvent.processed.taskActionId = data.id; // } async __createTaskAction(e: ClientRequestEvent) { @@ -84,7 +84,10 @@ export class TaskActionsService { // ]); } - protected async _execute(callgents: CallgentDto[], taskAction: TaskActionDto) { + protected async _execute( + callgents: CallgentDto[], + taskAction: TaskActionDto, + ) { // FIXME merge system callgents, e.g., system event register, timer, cmd entry creation // load task context vars @@ -141,15 +144,15 @@ export class TaskActionsService { /** invocation flow, and lifecycle events */ // protected async _invocationFlow( // req: RequestPack, - // callgentUuid: string, + // callgentId: string, // actionName?: string, // ) { // const prisma = this.txHost.tx as PrismaClient; // // specific/AI routing from req, get action params/code, TODO: [and specific mapping] // const where = actionName - // ? { AND: [{ name: actionName }, { callgentUuid }] } - // : { callgentUuid }; + // ? { AND: [{ name: actionName }, { callgentId }] } + // : { callgentId }; // const take = actionName ? 1 : undefined; // const actions = await prisma.callgentFunction.findMany({ where, take }); // const action = actionName @@ -157,7 +160,7 @@ export class TaskActionsService { // : await this._routing(req, actions); // if (!action) // throw new BadRequestException( - // 'Action entry not found on callgent: ' + callgentUuid, + // 'Action entry not found on callgent: ' + callgentId, // ); // // may reply ack to client directly, async result @@ -176,15 +179,15 @@ export class TaskActionsService { // @Transactional() // async callout(action: CallgentFunctionDto, req: RequestPack) { // // get server endpoint(sep), and sAdaptor - // const sEndpoint = await this.findOne(action.endpointUuid); + // const sEndpoint = await this.findOne(action.endpointId); // if (!sEndpoint) // throw new NotFoundException( - // `Endpoint not found, uuid=${action.endpointUuid}`, + // `Endpoint not found, id=${action.endpointId}`, // ); // const sAdaptor = this.getAdaptor(sEndpoint.adaptorKey, sEndpoint.type); // if (!sAdaptor) // throw new NotFoundException( - // `Endpoint#${action.endpointUuid} adaptor not found, adaptorKey=${sEndpoint.adaptorKey}`, + // `Endpoint#${action.endpointId} adaptor not found, adaptorKey=${sEndpoint.adaptorKey}`, // ); // //// async/sync execute action command, given action params/code/req/[specific mapping], with cb diff --git a/src/tasks/events/task-created.event.ts b/src/tasks/events/task-created.event.ts index 4fa3bf1..03daaf8 100644 --- a/src/tasks/events/task-created.event.ts +++ b/src/tasks/events/task-created.event.ts @@ -4,7 +4,7 @@ export class TaskCreatedEvent { public static readonly eventName = 'task.created' as const; /** - * @param task transient if task.uuid empty + * @param task transient if task.id empty */ constructor( public readonly task: Prisma.TaskUncheckedCreateInput, diff --git a/src/tasks/tasks.controller.ts b/src/tasks/tasks.controller.ts index dd607ce..7f217e3 100644 --- a/src/tasks/tasks.controller.ts +++ b/src/tasks/tasks.controller.ts @@ -57,13 +57,13 @@ export class TasksController { @Post() async create( @Req() req, - @Param('callgent') callgentUuid: string, + @Param('callgent') callgentId: string, @Body() dto: CreateTaskDto, ) { const user: JwtPayload = req.user; // const [task, syncResult] = await this.taskService.create({ // ...dto, - // callgentUuid, + // callgentId, // callerType: user.aud, // // assignees are set when processing the task // createdBy: user.sub, @@ -86,9 +86,9 @@ export class TasksController { ], }, }) - @Get('/:uuid') - async findOne(@Param('uuid') uuid: string) { - return { data: await this.taskService.findOne(uuid) }; + @Get('/:id') + async findOne(@Param('id') id: string) { + return { data: await this.taskService.findOne(id) }; } @ApiQuery({ name: 'query', required: false, type: String }) @@ -130,9 +130,9 @@ export class TasksController { // ], // }, // }) - // @Put('/:uuid') - // async update(@Param('uuid') uuid: string, @Body() dto: UpdateTaskDto) { - // dto.uuid = uuid; + // @Put('/:id') + // async update(@Param('id') id: string, @Body() dto: UpdateTaskDto) { + // dto.id = id; // return { data: await this.taskService.update(dto) }; // } @@ -148,8 +148,8 @@ export class TasksController { ], }, }) - @Delete('/:uuid') - async delete(@Param('uuid') uuid: string) { - return { data: await this.taskService.delete(uuid) }; + @Delete('/:id') + async delete(@Param('id') id: string) { + return { data: await this.taskService.delete(id) }; } } diff --git a/src/tasks/tasks.service.ts b/src/tasks/tasks.service.ts index 4ba9e29..58a22e1 100644 --- a/src/tasks/tasks.service.ts +++ b/src/tasks/tasks.service.ts @@ -19,8 +19,8 @@ export class TasksService { private readonly eventEmitter: EventEmitter2, ) {} protected readonly defSelect: Prisma.TaskSelect = { - id: false, - tenantId: false, + pk: false, + tenantPk: false, createdBy: false, deletedAt: false, }; @@ -37,7 +37,7 @@ export class TasksService { select?: Prisma.TaskSelect, ) { const data = dto as Prisma.CallgentUncheckedCreateInput; - (data.uuid = Utils.uuid()), (data.createdBy = createdBy); + (data.id = Utils.uuid()), (data.createdBy = createdBy); const prisma = this.txHost.tx as PrismaClient; const ret: Task = await selectHelper( @@ -65,7 +65,7 @@ export class TasksService { const r = 0; // await prisma.callgentReceiver.findFirst({ // where: { - // callgentUuid: callgent.uuid, + // callgentId: callgent.id, // receiverType, // }, // orderBy: { @@ -116,34 +116,34 @@ export class TasksService { } @Transactional() - delete(uuid: string) { + delete(id: string) { const prisma = this.txHost.tx as PrismaClient; return selectHelper(this.defSelect, (select) => - prisma.task.delete({ select, where: { uuid } }), + prisma.task.delete({ select, where: { id } }), ); } @Transactional() update(dto: UpdateTaskDto) { - if (!dto.uuid) return; + if (!dto.id) return; const prisma = this.txHost.tx as PrismaClient; return selectHelper(this.defSelect, (select) => prisma.task.update({ select, - where: { uuid: dto.uuid }, + where: { id: dto.id }, data: dto, }), ); } - findOne(uuid: string, select?: Prisma.TaskSelect) { + findOne(id: string, select?: Prisma.TaskSelect) { const prisma = this.txHost.tx as PrismaClient; return selectHelper( select, (select) => prisma.task.findUnique({ select, - where: { uuid }, + where: { id }, }), this.defSelect, ); diff --git a/src/users/auth.controller.ts b/src/users/auth.controller.ts index dc1edaa..faff4df 100644 --- a/src/users/auth.controller.ts +++ b/src/users/auth.controller.ts @@ -48,18 +48,18 @@ export class AuthController extends LocalAuthController { const ui = await this.userService.registerUserFromIdentity(dto); const user = ui.user; const token = this.jwtService.sign({ - tenantId: user.tenantId, - id: user.id, - sub: user.uuid, + tenantPk: user.tenantPk, + id: user.pk, + sub: user.id, iss: dto.provider, - aud: user.uuid, + aud: user.id, }); return { data: { ...user, tenant: undefined, id: undefined, - tenantId: undefined, + tenantPk: undefined, deletedAt: undefined, }, meta: { token }, diff --git a/src/users/listeners/auth-login.listener.ts b/src/users/listeners/auth-login.listener.ts index ae430ff..d40e355 100644 --- a/src/users/listeners/auth-login.listener.ts +++ b/src/users/listeners/auth-login.listener.ts @@ -37,11 +37,11 @@ export class AuthLoginListener { } else throw new BadRequestException('Invalid auth type:' + event.authType); const payload: JwtPayload = { - tenantId: user.tenantId, - id: user.id, - sub: user.uuid, + tenantPk: user.tenantPk, + id: user.pk, + sub: user.id, iss: event.provider, - aud: user.uuid, + aud: user.id, }; return payload; } diff --git a/src/users/listeners/auth-logined.listener.ts b/src/users/listeners/auth-logined.listener.ts index 3efa9eb..04826da 100644 --- a/src/users/listeners/auth-logined.listener.ts +++ b/src/users/listeners/auth-logined.listener.ts @@ -3,7 +3,7 @@ import { OnEvent } from '@nestjs/event-emitter'; import { AuthLoginedEvent } from '../../infra/auth/events/auth-logined.event'; import { PrismaTenancyService } from '../../infra/repo/tenancy/prisma-tenancy.service'; -/** set tenantId into cls context */ +/** set tenantPk into cls context */ @Injectable() export class AuthLoginedListener { constructor(private readonly tenancyService: PrismaTenancyService) {} @@ -12,7 +12,7 @@ export class AuthLoginedListener { @OnEvent(AuthLoginedEvent.eventName, { async: false }) async handleEvent(event: AuthLoginedEvent) { - event.user?.tenantId && - this.tenancyService.setTenantId(event.user.tenantId); + event.user?.tenantPk && + this.tenancyService.setTenantId(event.user.tenantPk); } } diff --git a/src/users/users.controller.ts b/src/users/users.controller.ts index bbbdfd1..791d6a4 100644 --- a/src/users/users.controller.ts +++ b/src/users/users.controller.ts @@ -14,6 +14,7 @@ import { ConfigService } from '@nestjs/config'; import { ApiBody, ApiConsumes, + ApiCreatedResponse, ApiExtraModels, ApiOkResponse, ApiOperation, @@ -63,10 +64,10 @@ export class UsersController { @UseGuards(new JwtGuard(true)) @Get('info') async findOne(@Req() req) { - const uuid = req.user?.sub; - if (!uuid) return { data: null }; + const id = req.user?.sub; + if (!id) return { data: null }; - const user = await this.userService.findOne(uuid); + const user = await this.userService.findOne(id); const token = user ? req.headers.authorization?.split(' ')[1] || req.cookies[AuthUtils.getAuthCookieName(this.configService)] @@ -78,9 +79,9 @@ export class UsersController { @ApiOperation({ summary: 'Reset password by sending validation email with reset url', }) - @ApiOkResponse({ + @ApiCreatedResponse({ schema: { - allOf: [ + anyOf: [ { $ref: getSchemaPath(RestApiResponse) }, { properties: { data: { type: 'boolean' } } }, ], @@ -89,8 +90,8 @@ export class UsersController { @UseGuards(new JwtGuard(true)) @Post('send-confirm-email') async sendConfirmEmail(@Body() vo: ValidationEmailVo, @Req() req) { - const uuid = req.user?.sub; - const sent = await this.userService.sendValidationEmail(vo, uuid); + const id = req.user?.sub; + const sent = await this.userService.sendValidationEmail(vo, id); return { data: sent }; } diff --git a/src/users/users.service.ts b/src/users/users.service.ts index ffe4477..47f5bce 100644 --- a/src/users/users.service.ts +++ b/src/users/users.service.ts @@ -33,8 +33,8 @@ export class UsersService { private readonly eventEmitter: EventEmitter2, ) {} protected readonly defSelect: Prisma.CallgentSelect = { - id: false, - tenantId: false, + pk: false, + tenantPk: false, createdBy: false, deletedAt: false, }; @@ -155,8 +155,8 @@ export class UsersService { // create user const user: Prisma.UserUncheckedCreateWithoutUserIdentityInput = { - tenantId: tenant.id, - uuid: Utils.uuid(), + tenantPk: tenant.pk, + id: Utils.uuid(), name: ui.name, avatar: ui.avatar, deletedAt: tenant.deletedAt, @@ -171,8 +171,8 @@ export class UsersService { ...ui, uid: ui.uid, provider: ui.provider, - tenantId: tenant.id, - userUuid: user.uuid, + tenantPk: tenant.pk, + userId: user.id, deletedAt: tenant.deletedAt, user: { create: user, @@ -214,7 +214,7 @@ export class UsersService { // create a tenant tenant = await prisma.tenant.create({ data: { - uuid: Utils.uuid(), + id: Utils.uuid(), emailHost, name: emailHost, type: 1, @@ -225,12 +225,12 @@ export class UsersService { return tenant; } - findOne(uuid: string) { + findOne(id: string) { const prisma = this.txHost.tx as PrismaClient; return selectHelper(this.defSelect, (select) => prisma.user.findUnique({ select, - where: { uuid }, + where: { id }, }), ); } @@ -238,7 +238,7 @@ export class UsersService { /** * @param email * @param resetPwd - * @param userId current user uuid, may null + * @param userId current user id, may null * @param create whether create account if not found */ @Transactional() @@ -298,12 +298,12 @@ export class UsersService { 'Sorry, the user account is deactivated:' + email, ); - if (resetPwd) await this.updateLocalPassword(pwd, ui.id); + if (resetPwd) await this.updateLocalPassword(pwd, ui.pk); else if (ui.email_verified) throw new BadRequestException(email + ' is already verified'); else prisma.userIdentity.update({ - where: { id: ui.id }, + where: { pk: ui.pk }, data: { email_verified: true }, }); } else { @@ -344,16 +344,16 @@ export class UsersService { } @Transactional() - async updateLocalPassword(pwd: string, id?: number) { + async updateLocalPassword(pwd: string, pk?: number) { // TODO check pwd complexity if (pwd && (typeof pwd !== 'string' || pwd?.length < 8)) throw new BadRequestException('Password should be at least 8 characters'); const credentials = pwd ? await Utils.hashSalted(pwd) : undefined; - if (id) { + if (pk) { const prisma = this.txHost.tx as PrismaClient; await prisma.userIdentity.update({ - where: { id }, + where: { pk }, data: { credentials }, }); } diff --git a/test/app-init.e2e.ts b/test/app-init.e2e.ts index 80ad80c..20165a9 100755 --- a/test/app-init.e2e.ts +++ b/test/app-init.e2e.ts @@ -129,10 +129,10 @@ export async function beforeEachFn() { console.log('Starting new transaction.'); } -export async function beforeEachFnTenanted(tenantId = 1) { +export async function beforeEachFnTenanted(tenantPk = 1) { await prismaTestingHelper.startNewTransaction({ timeout: 888888 }); - testApp.get(PrismaTenancyService).setTenantId(tenantId); - console.log('Starts test transaction, tenantId:', tenantId); + testApp.get(PrismaTenancyService).setTenantId(tenantPk); + console.log('Starts test transaction, tenantPk:', tenantPk); } // This function must be called after every test diff --git a/test/e2e/endpoints.e2e-spec.ts b/test/e2e/endpoints.e2e-spec.ts index 140b347..15a78eb 100644 --- a/test/e2e/endpoints.e2e-spec.ts +++ b/test/e2e/endpoints.e2e-spec.ts @@ -31,7 +31,7 @@ describe('Callgent Endpoint (e2e)', () => { const callgent = await prepareCannyCallgent(); // request for task by callgent api - await invokeCallgentByApi(callgent.uuid).expectStatus(400); + await invokeCallgentByApi(callgent.id).expectStatus(400); }); it(`(POST): add a new canny.io rest-api server endpoint to invoke 200`, async () => { @@ -40,7 +40,7 @@ describe('Callgent Endpoint (e2e)', () => { // mount server endpoint auth // request for task by callgent api - await invokeCallgentByApi(callgent.uuid).expectStatus(400); + await invokeCallgentByApi(callgent.id).expectStatus(400); }); }); @@ -54,7 +54,7 @@ export const prepareCannyCallgent = async () => { const { json: { data: serverEndpoint }, } = await createEndpoint('restAPI', { - callgentUuid: callgent.uuid, + callgentId: callgent.id, type: 'SERVER', host: 'https://canny.io/api/v1', }); @@ -64,7 +64,7 @@ export const prepareCannyCallgent = async () => { const { json: { data: functionCount }, } = await addCallgentFunctions({ - endpoint: serverEndpoint.uuid, + endpoint: serverEndpoint.id, text: jsonData, format: 'openAPI', }); @@ -95,10 +95,10 @@ export const addEndpointAuth = (endpointAuthDto: CreateEndpointAuthDto) => { .expectStatus(200); }; -export const invokeCallgentByApi = (callgentUuid, body?: any) => { +export const invokeCallgentByApi = (callgentId, body?: any) => { return pactum .spec() - .post(`/api/callgents/${callgentUuid}//invoke/api/boards/list`) + .post(`/api/callgents/${callgentId}//invoke/api/boards/list`) .withHeaders('x-callgent-authorization', TestConstant.authToken) .withBody(body) .expectStatus(200); From 10542c07936c1d0c7cfef4d47569298d6e3e74b1 Mon Sep 17 00:00:00 2001 From: dev-callgent Date: Thu, 22 Aug 2024 17:07:06 +0800 Subject: [PATCH 033/183] ci: node version Signed-off-by: dev-callgent --- .node-version | 2 +- .nvmrc | 2 +- pnpm-lock.yaml | 11000 ++++++++++++++++++++--------------------------- 3 files changed, 4717 insertions(+), 6287 deletions(-) diff --git a/.node-version b/.node-version index b6fb44b..9137833 100644 --- a/.node-version +++ b/.node-version @@ -1 +1 @@ -v18.17.1 \ No newline at end of file +v18.19.1 \ No newline at end of file diff --git a/.nvmrc b/.nvmrc index b1215e8..9137833 100644 --- a/.nvmrc +++ b/.nvmrc @@ -1 +1 @@ -v18.16.0 \ No newline at end of file +v18.19.1 \ No newline at end of file diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 364358e..23be625 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1,5085 +1,274 @@ -lockfileVersion: '9.0' - -settings: - autoInstallPeers: true - excludeLinksFromLockfile: false - -importers: - - .: - dependencies: - '@apidevtools/json-schema-ref-parser': - specifier: ^11.5.4 - version: 11.5.4 - '@fastify/compress': - specifier: ^7.0.0 - version: 7.0.0 - '@fastify/cookie': - specifier: ^9.3.1 - version: 9.3.1 - '@fastify/cors': - specifier: ^9.0.1 - version: 9.0.1 - '@fastify/helmet': - specifier: ^11.1.1 - version: 11.1.1 - '@fastify/static': - specifier: ^6.12.0 - version: 6.12.0 - '@nestjs-cls/transactional': - specifier: ^2.2.0 - version: 2.2.0(@nestjs/common@10.0.0)(@nestjs/core@10.0.0)(nestjs-cls@4.2.0)(reflect-metadata@0.1.13)(rxjs@7.8.1) - '@nestjs-cls/transactional-adapter-prisma': - specifier: ^1.1.0 - version: 1.1.0(@nestjs-cls/transactional@2.2.0)(@prisma/client@5.10.2)(nestjs-cls@4.2.0)(prisma@5.10.2) - '@nestjs/cache-manager': - specifier: ^2.2.0 - version: 2.2.0(@nestjs/common@10.0.0)(@nestjs/core@10.0.0)(cache-manager@5.4.0)(reflect-metadata@0.1.13)(rxjs@7.8.1) - '@nestjs/common': - specifier: ^10.0.0 - version: 10.0.0(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.1.13)(rxjs@7.8.1) - '@nestjs/config': - specifier: ^3.1.1 - version: 3.1.1(@nestjs/common@10.0.0)(reflect-metadata@0.1.13) - '@nestjs/core': - specifier: ^10.0.0 - version: 10.0.0(@nestjs/common@10.0.0)(reflect-metadata@0.1.13)(rxjs@7.8.1) - '@nestjs/event-emitter': - specifier: ^2.0.3 - version: 2.0.3(@nestjs/common@10.0.0)(@nestjs/core@10.0.0)(reflect-metadata@0.1.13) - '@nestjs/jwt': - specifier: ^10.2.0 - version: 10.2.0(@nestjs/common@10.0.0) - '@nestjs/passport': - specifier: ^10.0.3 - version: 10.0.3(@nestjs/common@10.0.0)(passport@0.7.0) - '@nestjs/platform-fastify': - specifier: ^10.3.4 - version: 10.3.4(@fastify/static@6.12.0)(@nestjs/common@10.0.0)(@nestjs/core@10.0.0) - '@nestjs/swagger': - specifier: ^7.3.0 - version: 7.3.0(@fastify/static@6.12.0)(@nestjs/common@10.0.0)(@nestjs/core@10.0.0)(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.1.13) - '@nodeteam/nestjs-prisma-pagination': - specifier: ^1.0.6 - version: 1.0.6(@babel/core@7.23.9)(@nestjs/core@10.0.0)(@types/node@20.3.1)(cache-manager@5.4.0)(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.1.13)(rxjs@7.8.1)(ts-node@10.9.1) - '@prisma/client': - specifier: 5.10.2 - version: 5.10.2(prisma@5.10.2) - axios: - specifier: ^1.6.7 - version: 1.6.7(debug@2.6.9) - bcrypt: - specifier: ^5.1.1 - version: 5.1.1 - class-transformer: - specifier: ^0.5.1 - version: 0.5.1 - class-validator: - specifier: ^0.14.1 - version: 0.14.1 - dot: - specifier: ^1.1.3 - version: 1.1.3 - fastify: - specifier: 4.26.2 - version: 4.26.2 - fastify-ip: - specifier: ^1.0.0 - version: 1.0.0 - glob: - specifier: ^10.3.10 - version: 10.3.10 - jsonrepair: - specifier: ^3.7.0 - version: 3.7.0 - module: - specifier: ^1.2.5 - version: 1.2.5 - ms: - specifier: ^2.1.3 - version: 2.1.3 - nanoid: - specifier: 3.3.7 - version: 3.3.7 - nestjs-cls: - specifier: ^4.2.0 - version: 4.2.0(@nestjs/common@10.0.0)(@nestjs/core@10.0.0)(reflect-metadata@0.1.13)(rxjs@7.8.1) - nestjs-oauth2: - specifier: ^0.0.7 - version: 0.0.7(@nestjs/common@10.0.0)(rxjs@7.8.1) - nestjs-pino: - specifier: ^4.0.0 - version: 4.0.0(@nestjs/common@10.0.0)(pino-http@9.0.0) - nestjs-prisma: - specifier: ^0.23.0 - version: 0.23.0(@nestjs/common@10.0.0)(@prisma/client@5.10.2)(prisma@5.10.2) - passport-jwt: - specifier: ^4.0.1 - version: 4.0.1 - passport-local: - specifier: ^1.0.0 - version: 1.0.0 - pino: - specifier: ^8.18.0 - version: 8.18.0 - pino-http: - specifier: ^9.0.0 - version: 9.0.0 - pino-pretty: - specifier: ^10.3.1 - version: 10.3.1 - prisma-soft-delete-middleware: - specifier: ^1.3.1 - version: 1.3.1(@prisma/client@5.10.2) - reflect-metadata: - specifier: ^0.1.13 - version: 0.1.13 - rxjs: - specifier: ^7.8.1 - version: 7.8.1 - v8-sandbox: - specifier: ^3.2.10 - version: 3.2.10(debug@2.6.9) - devDependencies: - '@chax-at/transactional-prisma-testing': - specifier: ^1.1.0 - version: 1.1.0(@prisma/client@5.10.2) - '@commitlint/cli': - specifier: ^19.2.0 - version: 19.2.0(@types/node@20.3.1)(typescript@5.1.3) - '@commitlint/config-angular': - specifier: ^19.1.0 - version: 19.1.0 - '@nestjs/cli': - specifier: ^10.0.0 - version: 10.0.0 - '@nestjs/schematics': - specifier: ^10.0.0 - version: 10.0.0(chokidar@3.5.3)(typescript@5.1.3) - '@nestjs/testing': - specifier: ^10.0.0 - version: 10.0.0(@nestjs/common@10.0.0)(@nestjs/core@10.0.0) - '@pond918/prisma-generator-nestjs-dto': - specifier: ^1.17.513 - version: 1.17.513 - '@types/bcrypt': - specifier: ^5.0.2 - version: 5.0.2 - '@types/dot': - specifier: ^1.1.7 - version: 1.1.7 - '@types/express': - specifier: ^4.17.17 - version: 4.17.17 - '@types/jest': - specifier: ^29.5.2 - version: 29.5.2 - '@types/ms': - specifier: ^0.7.34 - version: 0.7.34 - '@types/node': - specifier: ^20.3.1 - version: 20.3.1 - '@types/passport-jwt': - specifier: ^4.0.1 - version: 4.0.1 - '@types/passport-local': - specifier: ^1.0.38 - version: 1.0.38 - '@types/supertest': - specifier: ^6.0.0 - version: 6.0.0 - '@typescript-eslint/eslint-plugin': - specifier: ^6.0.0 - version: 6.0.0(@typescript-eslint/parser@6.0.0)(eslint@8.42.0)(typescript@5.1.3) - '@typescript-eslint/parser': - specifier: ^6.0.0 - version: 6.0.0(eslint@8.42.0)(typescript@5.1.3) - commitizen: - specifier: ^4.3.0 - version: 4.3.0(@types/node@20.3.1)(typescript@5.1.3) - cz-conventional-changelog: - specifier: ^3.3.0 - version: 3.3.0(@types/node@20.3.1)(typescript@5.1.3) - eslint: - specifier: ^8.42.0 - version: 8.42.0 - eslint-config-prettier: - specifier: ^9.0.0 - version: 9.0.0(eslint@8.42.0) - eslint-plugin-prettier: - specifier: ^5.0.0 - version: 5.0.0(eslint-config-prettier@9.0.0)(eslint@8.42.0)(prettier@3.0.0) - husky: - specifier: ^9.0.11 - version: 9.0.11 - jest: - specifier: ^29.5.0 - version: 29.5.0(@types/node@20.3.1)(ts-node@10.9.1) - pactum: - specifier: ^3.6.3 - version: 3.6.3 - pactum-matchers: - specifier: ^1.1.6 - version: 1.1.6 - prettier: - specifier: ^3.0.0 - version: 3.0.0 - prisma: - specifier: ^5.10.2 - version: 5.10.2 - source-map-support: - specifier: ^0.5.21 - version: 0.5.21 - standard-version: - specifier: ^9.5.0 - version: 9.5.0 - supertest: - specifier: ^6.3.3 - version: 6.3.3 - ts-jest: - specifier: ^29.1.0 - version: 29.1.0(@babel/core@7.23.9)(jest@29.5.0)(typescript@5.1.3) - ts-loader: - specifier: ^9.4.3 - version: 9.4.3(typescript@5.1.3)(webpack@5.90.1) - ts-node: - specifier: ^10.9.1 - version: 10.9.1(@types/node@20.3.1)(typescript@5.1.3) - tsconfig-paths: - specifier: ^4.2.0 - version: 4.2.0 - typescript: - specifier: ^5.1.3 - version: 5.1.3 - -packages: - - '@aashutoshrathi/word-wrap@1.2.6': - resolution: {integrity: sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==} - engines: {node: '>=0.10.0'} - - '@ampproject/remapping@2.2.1': - resolution: {integrity: sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==} - engines: {node: '>=6.0.0'} - - '@angular-devkit/core@13.3.11': - resolution: {integrity: sha512-rfqoLMRYhlz0wzKlHx7FfyIyQq8dKTsmbCoIVU1cEIH0gyTMVY7PbVzwRRcO6xp5waY+0hA+0Brriujpuhkm4w==} - engines: {node: ^12.20.0 || ^14.15.0 || >=16.10.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: '>= 1.13.0'} - peerDependencies: - chokidar: ^3.5.2 - peerDependenciesMeta: - chokidar: - optional: true - - '@angular-devkit/core@16.1.0': - resolution: {integrity: sha512-mrWpuDvttmhrCGcLc68RIXKtTzUhkBTsE5ZZFZNO1+FSC+vO/ZpyCpPd6C+6coM68NfXYjHlms5XF6KbxeGn/Q==} - engines: {node: ^16.14.0 || >=18.10.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: '>= 1.13.0'} - peerDependencies: - chokidar: ^3.5.2 - peerDependenciesMeta: - chokidar: - optional: true - - '@angular-devkit/schematics-cli@16.1.0': - resolution: {integrity: sha512-siBpRDmMMV7NB+NvaDHeJ4doHoSkFwIywwFj8GXnBCtobyxrBl1EyG1cKK+FHRydYtyYIk8FEoOpJA9oE9S2hg==} - engines: {node: ^16.14.0 || >=18.10.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: '>= 1.13.0'} - hasBin: true - - '@angular-devkit/schematics@13.3.11': - resolution: {integrity: sha512-ben+EGXpCrClnIVAAnEQmhQdKmnnqFhMp5BqMxgOslSYBAmCutLA6rBu5vsc8kZcGian1wt+lueF7G1Uk5cGBg==} - engines: {node: ^12.20.0 || ^14.15.0 || >=16.10.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: '>= 1.13.0'} - - '@angular-devkit/schematics@16.1.0': - resolution: {integrity: sha512-LM35PH9DT3eQRSZgrkk2bx1ZQjjVh8BCByTlr37/c+FnF9mNbeBsa1YkxrlsN/CwO+045OwEwRHnkM9Zcx0U/A==} - engines: {node: ^16.14.0 || >=18.10.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: '>= 1.13.0'} - - '@apidevtools/json-schema-ref-parser@11.5.4': - resolution: {integrity: sha512-o2fsypTGU0WxRxbax8zQoHiIB4dyrkwYfcm8TxZ+bx9pCzcWZbQtiMqpgBvWA/nJ2TrGjK5adCLfTH8wUeU/Wg==} - engines: {node: '>= 16'} - - '@arr/every@1.0.1': - resolution: {integrity: sha512-UQFQ6SgyJ6LX42W8rHCs8KVc0JS0tzVL9ct4XYedJukskYVWTo49tNiMEK9C2HTyarbNiT/RVIRSY82vH+6sTg==} - engines: {node: '>=4'} - - '@babel/code-frame@7.23.5': - resolution: {integrity: sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA==} - engines: {node: '>=6.9.0'} - - '@babel/compat-data@7.23.5': - resolution: {integrity: sha512-uU27kfDRlhfKl+w1U6vp16IuvSLtjAxdArVXPa9BvLkrr7CYIsxH5adpHObeAGY/41+syctUWOZ140a2Rvkgjw==} - engines: {node: '>=6.9.0'} - - '@babel/core@7.23.9': - resolution: {integrity: sha512-5q0175NOjddqpvvzU+kDiSOAk4PfdO6FvwCWoQ6RO7rTzEe8vlo+4HVfcnAREhD4npMs0e9uZypjTwzZPCf/cw==} - engines: {node: '>=6.9.0'} - - '@babel/generator@7.23.6': - resolution: {integrity: sha512-qrSfCYxYQB5owCmGLbl8XRpX1ytXlpueOb0N0UmQwA073KZxejgQTzAmJezxvpwQD9uGtK2shHdi55QT+MbjIw==} - engines: {node: '>=6.9.0'} - - '@babel/helper-compilation-targets@7.23.6': - resolution: {integrity: sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ==} - engines: {node: '>=6.9.0'} - - '@babel/helper-environment-visitor@7.22.20': - resolution: {integrity: sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==} - engines: {node: '>=6.9.0'} - - '@babel/helper-function-name@7.23.0': - resolution: {integrity: sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==} - engines: {node: '>=6.9.0'} - - '@babel/helper-hoist-variables@7.22.5': - resolution: {integrity: sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==} - engines: {node: '>=6.9.0'} - - '@babel/helper-module-imports@7.22.15': - resolution: {integrity: sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==} - engines: {node: '>=6.9.0'} - - '@babel/helper-module-transforms@7.23.3': - resolution: {integrity: sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - - '@babel/helper-plugin-utils@7.22.5': - resolution: {integrity: sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==} - engines: {node: '>=6.9.0'} - - '@babel/helper-simple-access@7.22.5': - resolution: {integrity: sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==} - engines: {node: '>=6.9.0'} - - '@babel/helper-split-export-declaration@7.22.6': - resolution: {integrity: sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==} - engines: {node: '>=6.9.0'} - - '@babel/helper-string-parser@7.23.4': - resolution: {integrity: sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ==} - engines: {node: '>=6.9.0'} - - '@babel/helper-validator-identifier@7.22.20': - resolution: {integrity: sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==} - engines: {node: '>=6.9.0'} - - '@babel/helper-validator-option@7.23.5': - resolution: {integrity: sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw==} - engines: {node: '>=6.9.0'} - - '@babel/helpers@7.23.9': - resolution: {integrity: sha512-87ICKgU5t5SzOT7sBMfCOZQ2rHjRU+Pcb9BoILMYz600W6DkVRLFBPwQ18gwUVvggqXivaUakpnxWQGbpywbBQ==} - engines: {node: '>=6.9.0'} - - '@babel/highlight@7.23.4': - resolution: {integrity: sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A==} - engines: {node: '>=6.9.0'} - - '@babel/parser@7.23.9': - resolution: {integrity: sha512-9tcKgqKbs3xGJ+NtKF2ndOBBLVwPjl1SHxPQkd36r3Dlirw3xWUeGaTbqr7uGZcTaxkVNwc+03SVP7aCdWrTlA==} - engines: {node: '>=6.0.0'} - hasBin: true - - '@babel/plugin-syntax-async-generators@7.8.4': - resolution: {integrity: sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-syntax-bigint@7.8.3': - resolution: {integrity: sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-syntax-class-properties@7.12.13': - resolution: {integrity: sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-syntax-import-meta@7.10.4': - resolution: {integrity: sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-syntax-json-strings@7.8.3': - resolution: {integrity: sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-syntax-jsx@7.23.3': - resolution: {integrity: sha512-EB2MELswq55OHUoRZLGg/zC7QWUKfNLpE57m/S2yr1uEneIgsTgrSzXP3NXEsMkVn76OlaVVnzN+ugObuYGwhg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-syntax-logical-assignment-operators@7.10.4': - resolution: {integrity: sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-syntax-nullish-coalescing-operator@7.8.3': - resolution: {integrity: sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-syntax-numeric-separator@7.10.4': - resolution: {integrity: sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-syntax-object-rest-spread@7.8.3': - resolution: {integrity: sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-syntax-optional-catch-binding@7.8.3': - resolution: {integrity: sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-syntax-optional-chaining@7.8.3': - resolution: {integrity: sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-syntax-top-level-await@7.14.5': - resolution: {integrity: sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-syntax-typescript@7.23.3': - resolution: {integrity: sha512-9EiNjVJOMwCO+43TqoTrgQ8jMwcAd0sWyXi9RPfIsLTj4R2MADDDQXELhffaUx/uJv2AYcxBgPwH6j4TIA4ytQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/template@7.23.9': - resolution: {integrity: sha512-+xrD2BWLpvHKNmX2QbpdpsBaWnRxahMwJjO+KZk2JOElj5nSmKezyS1B4u+QbHMTX69t4ukm6hh9lsYQ7GHCKA==} - engines: {node: '>=6.9.0'} - - '@babel/traverse@7.23.9': - resolution: {integrity: sha512-I/4UJ9vs90OkBtY6iiiTORVMyIhJ4kAVmsKo9KFc8UOxMeUfi2hvtIBsET5u9GizXE6/GFSuKCTNfgCswuEjRg==} - engines: {node: '>=6.9.0'} - - '@babel/types@7.23.9': - resolution: {integrity: sha512-dQjSq/7HaSjRM43FFGnv5keM2HsxpmyV1PfaSVm0nzzjwwTmjOe6J4bC8e3+pTEIgHaHj+1ZlLThRJ2auc/w1Q==} - engines: {node: '>=6.9.0'} - - '@bcoe/v8-coverage@0.2.3': - resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==} - - '@chax-at/transactional-prisma-testing@1.1.0': - resolution: {integrity: sha512-BT2KRg2mfHbjW3gb3u5RtXjwvodywA8uvOX5Szm2J6KotgYJ/vRnCJ8LKp+kb/dbHhnPIrOCTtj6AY1Xku8Wng==} - engines: {node: '>= 14'} - peerDependencies: - '@prisma/client': ^4.7.0 || 5 - - '@colors/colors@1.5.0': - resolution: {integrity: sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==} - engines: {node: '>=0.1.90'} - - '@commitlint/cli@19.2.0': - resolution: {integrity: sha512-8XnQDMyQR+1/ldbmIyhonvnDS2enEw48Wompo/967fsEvy9Vj5/JbDutzmSBKxANWDVeEbR9QQm0yHpw6ArrFw==} - engines: {node: '>=v18'} - hasBin: true - - '@commitlint/config-angular-type-enum@19.1.0': - resolution: {integrity: sha512-eLjt7vSArP62kpDmmIZNdIBjPzbqY8jss6mVOcSDm4t1KfDw4UmPrtPh/7zcIL3GI5uf/7W8d2s3K0qisf9C+g==} - engines: {node: '>=v18'} - - '@commitlint/config-angular@19.1.0': - resolution: {integrity: sha512-qZyG9FHjPoG+VaHxH1OruWI8cmWWRe00sAS73jXAhACimT74k4Dex5jI2cKFcXSH8Ebh1yGwxfjzSgup5O0ykA==} - engines: {node: '>=v18'} - - '@commitlint/config-validator@19.0.3': - resolution: {integrity: sha512-2D3r4PKjoo59zBc2auodrSCaUnCSALCx54yveOFwwP/i2kfEAQrygwOleFWswLqK0UL/F9r07MFi5ev2ohyM4Q==} - engines: {node: '>=v18'} - - '@commitlint/ensure@19.0.3': - resolution: {integrity: sha512-SZEpa/VvBLoT+EFZVb91YWbmaZ/9rPH3ESrINOl0HD2kMYsjvl0tF7nMHh0EpTcv4+gTtZBAe1y/SS6/OhfZzQ==} - engines: {node: '>=v18'} - - '@commitlint/execute-rule@19.0.0': - resolution: {integrity: sha512-mtsdpY1qyWgAO/iOK0L6gSGeR7GFcdW7tIjcNFxcWkfLDF5qVbPHKuGATFqRMsxcO8OUKNj0+3WOHB7EHm4Jdw==} - engines: {node: '>=v18'} - - '@commitlint/format@19.0.3': - resolution: {integrity: sha512-QjjyGyoiVWzx1f5xOteKHNLFyhyweVifMgopozSgx1fGNrGV8+wp7k6n1t6StHdJ6maQJ+UUtO2TcEiBFRyR6Q==} - engines: {node: '>=v18'} - - '@commitlint/is-ignored@19.0.3': - resolution: {integrity: sha512-MqDrxJaRSVSzCbPsV6iOKG/Lt52Y+PVwFVexqImmYYFhe51iVJjK2hRhOG2jUAGiUHk4jpdFr0cZPzcBkSzXDQ==} - engines: {node: '>=v18'} - - '@commitlint/lint@19.1.0': - resolution: {integrity: sha512-ESjaBmL/9cxm+eePyEr6SFlBUIYlYpI80n+Ltm7IA3MAcrmiP05UMhJdAD66sO8jvo8O4xdGn/1Mt2G5VzfZKw==} - engines: {node: '>=v18'} - - '@commitlint/load@19.2.0': - resolution: {integrity: sha512-XvxxLJTKqZojCxaBQ7u92qQLFMMZc4+p9qrIq/9kJDy8DOrEa7P1yx7Tjdc2u2JxIalqT4KOGraVgCE7eCYJyQ==} - engines: {node: '>=v18'} - - '@commitlint/message@19.0.0': - resolution: {integrity: sha512-c9czf6lU+9oF9gVVa2lmKaOARJvt4soRsVmbR7Njwp9FpbBgste5i7l/2l5o8MmbwGh4yE1snfnsy2qyA2r/Fw==} - engines: {node: '>=v18'} - - '@commitlint/parse@19.0.3': - resolution: {integrity: sha512-Il+tNyOb8VDxN3P6XoBBwWJtKKGzHlitEuXA5BP6ir/3loWlsSqDr5aecl6hZcC/spjq4pHqNh0qPlfeWu38QA==} - engines: {node: '>=v18'} - - '@commitlint/read@19.2.0': - resolution: {integrity: sha512-HlGeEd/jyp2a5Fb9mvtsaDm5hFCmj80dJYjLQkpG3DzWneWBc37YU3kM8Za1D1HUazZaTkdsWq73M3XDE4CvCA==} - engines: {node: '>=v18'} - - '@commitlint/resolve-extends@19.1.0': - resolution: {integrity: sha512-z2riI+8G3CET5CPgXJPlzftH+RiWYLMYv4C9tSLdLXdr6pBNimSKukYP9MS27ejmscqCTVA4almdLh0ODD2KYg==} - engines: {node: '>=v18'} - - '@commitlint/rules@19.0.3': - resolution: {integrity: sha512-TspKb9VB6svklxNCKKwxhELn7qhtY1rFF8ls58DcFd0F97XoG07xugPjjbVnLqmMkRjZDbDIwBKt9bddOfLaPw==} - engines: {node: '>=v18'} - - '@commitlint/to-lines@19.0.0': - resolution: {integrity: sha512-vkxWo+VQU5wFhiP9Ub9Sre0FYe019JxFikrALVoD5UGa8/t3yOJEpEhxC5xKiENKKhUkTpEItMTRAjHw2SCpZw==} - engines: {node: '>=v18'} - - '@commitlint/top-level@19.0.0': - resolution: {integrity: sha512-KKjShd6u1aMGNkCkaX4aG1jOGdn7f8ZI8TR1VEuNqUOjWTOdcDSsmglinglJ18JTjuBX5I1PtjrhQCRcixRVFQ==} - engines: {node: '>=v18'} - - '@commitlint/types@19.0.3': - resolution: {integrity: sha512-tpyc+7i6bPG9mvaBbtKUeghfyZSDgWquIDfMgqYtTbmZ9Y9VzEm2je9EYcQ0aoz5o7NvGS+rcDec93yO08MHYA==} - engines: {node: '>=v18'} - - '@cspotcode/source-map-support@0.8.1': - resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==} - engines: {node: '>=12'} - - '@eslint-community/eslint-utils@4.4.0': - resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 - - '@eslint-community/regexpp@4.10.0': - resolution: {integrity: sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==} - engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} - - '@eslint/eslintrc@2.1.4': - resolution: {integrity: sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - - '@eslint/js@8.42.0': - resolution: {integrity: sha512-6SWlXpWU5AvId8Ac7zjzmIOqMOba/JWY8XZ4A7q7Gn1Vlfg/SFFIlrtHXt9nPn4op9ZPAkl91Jao+QQv3r/ukw==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - - '@exodus/schemasafe@1.3.0': - resolution: {integrity: sha512-5Aap/GaRupgNx/feGBwLLTVv8OQFfv3pq2lPRzPg9R+IOBnDgghTGW7l7EuVXOvg5cc/xSAlRW8rBrjIC3Nvqw==} - - '@fastify/accept-negotiator@1.1.0': - resolution: {integrity: sha512-OIHZrb2ImZ7XG85HXOONLcJWGosv7sIvM2ifAPQVhg9Lv7qdmMBNVaai4QTdyuaqbKM5eO6sLSQOYI7wEQeCJQ==} - engines: {node: '>=14'} - - '@fastify/ajv-compiler@3.5.0': - resolution: {integrity: sha512-ebbEtlI7dxXF5ziNdr05mOY8NnDiPB1XvAlLHctRt/Rc+C3LCOVW5imUVX+mhvUhnNzmPBHewUkOFgGlCxgdAA==} - - '@fastify/compress@7.0.0': - resolution: {integrity: sha512-jo/NaBVHP1OXIf8Kmr3bZyYQB0gAIgcy5c8rRKTPjhklHO7lRs/6ZFckUVT0NtbKSvrTuIcmSkxYpjyv3FNHXA==} - - '@fastify/cookie@9.3.1': - resolution: {integrity: sha512-h1NAEhB266+ZbZ0e9qUE6NnNR07i7DnNXWG9VbbZ8uC6O/hxHpl+Zoe5sw1yfdZ2U6XhToUGDnzQtWJdCaPwfg==} - - '@fastify/cors@9.0.1': - resolution: {integrity: sha512-YY9Ho3ovI+QHIL2hW+9X4XqQjXLjJqsU+sMV/xFsxZkE8p3GNnYVFpoOxF7SsP5ZL76gwvbo3V9L+FIekBGU4Q==} - - '@fastify/error@3.4.1': - resolution: {integrity: sha512-wWSvph+29GR783IhmvdwWnN4bUxTD01Vm5Xad4i7i1VuAOItLvbPAb69sb0IQ2N57yprvhNIwAP5B6xfKTmjmQ==} - - '@fastify/fast-json-stringify-compiler@4.3.0': - resolution: {integrity: sha512-aZAXGYo6m22Fk1zZzEUKBvut/CIIQe/BapEORnxiD5Qr0kPHqqI69NtEMCme74h+at72sPhbkb4ZrLd1W3KRLA==} - - '@fastify/formbody@7.4.0': - resolution: {integrity: sha512-H3C6h1GN56/SMrZS8N2vCT2cZr7mIHzBHzOBa5OPpjfB/D6FzP9mMpE02ZzrFX0ANeh0BAJdoXKOF2e7IbV+Og==} - - '@fastify/helmet@11.1.1': - resolution: {integrity: sha512-pjJxjk6SLEimITWadtYIXt6wBMfFC1I6OQyH/jYVCqSAn36sgAIFjeNiibHtifjCd+e25442pObis3Rjtame6A==} - - '@fastify/merge-json-schemas@0.1.1': - resolution: {integrity: sha512-fERDVz7topgNjtXsJTTW1JKLy0rhuLRcquYqNR9rF7OcVpCa2OVW49ZPDIhaRRCaUuvVxI+N416xUoF76HNSXA==} - - '@fastify/middie@8.3.0': - resolution: {integrity: sha512-h+zBxCzMlkEkh4fM7pZaSGzqS7P9M0Z6rXnWPdUEPfe7x1BCj++wEk/pQ5jpyYY4pF8AknFqb77n7uwh8HdxEA==} - - '@fastify/send@2.1.0': - resolution: {integrity: sha512-yNYiY6sDkexoJR0D8IDy3aRP3+L4wdqCpvx5WP+VtEU58sn7USmKynBzDQex5X42Zzvw2gNzzYgP90UfWShLFA==} - - '@fastify/static@6.12.0': - resolution: {integrity: sha512-KK1B84E6QD/FcQWxDI2aiUCwHxMJBI1KeCUzm1BwYpPY1b742+jeKruGHP2uOluuM6OkBPI8CIANrXcCRtC2oQ==} - - '@gar/promisify@1.1.3': - resolution: {integrity: sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw==} - - '@golevelup/nestjs-modules@0.6.1': - resolution: {integrity: sha512-E0STg8In8fhIivnGDJAA70+XLPHzK5bMTkCnif9FbZ8waTYDQ3T/QQL0h73k+CUFeznn1hmuEW14sNaE+8cd7w==} - peerDependencies: - '@nestjs/common': ^9.x - rxjs: ^7.x - - '@gulp-sourcemaps/map-sources@1.0.0': - resolution: {integrity: sha512-o/EatdaGt8+x2qpb0vFLC/2Gug/xYPRXb6a+ET1wGYKozKN3krDWC/zZFZAtrzxJHuDL12mwdfEFKcKMNvc55A==} - engines: {node: '>= 0.10'} - - '@humanwhocodes/config-array@0.11.14': - resolution: {integrity: sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==} - engines: {node: '>=10.10.0'} - - '@humanwhocodes/module-importer@1.0.1': - resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} - engines: {node: '>=12.22'} - - '@humanwhocodes/object-schema@2.0.2': - resolution: {integrity: sha512-6EwiSjwWYP7pTckG6I5eyFANjPhmPjUX9JRLUSfNPC7FX7zK9gyZAfUEaECL6ALTpGX5AjnBq3C9XmVWPitNpw==} - - '@hutson/parse-repository-url@3.0.2': - resolution: {integrity: sha512-H9XAx3hc0BQHY6l+IFSWHDySypcXsvsuLhgYLUGywmJ5pswRVQJUHpOsobnLYp2ZUaUlKiKDrgWWhosOwAEM8Q==} - engines: {node: '>=6.9.0'} - - '@isaacs/cliui@8.0.2': - resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} - engines: {node: '>=12'} - - '@istanbuljs/load-nyc-config@1.1.0': - resolution: {integrity: sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==} - engines: {node: '>=8'} - - '@istanbuljs/schema@0.1.3': - resolution: {integrity: sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==} - engines: {node: '>=8'} - - '@jest/console@29.7.0': - resolution: {integrity: sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - - '@jest/core@29.7.0': - resolution: {integrity: sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - peerDependencies: - node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 - peerDependenciesMeta: - node-notifier: - optional: true - - '@jest/environment@29.7.0': - resolution: {integrity: sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - - '@jest/expect-utils@29.7.0': - resolution: {integrity: sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - - '@jest/expect@29.7.0': - resolution: {integrity: sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - - '@jest/fake-timers@29.7.0': - resolution: {integrity: sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - - '@jest/globals@29.7.0': - resolution: {integrity: sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - - '@jest/reporters@29.7.0': - resolution: {integrity: sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - peerDependencies: - node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 - peerDependenciesMeta: - node-notifier: - optional: true - - '@jest/schemas@29.6.3': - resolution: {integrity: sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - - '@jest/source-map@29.6.3': - resolution: {integrity: sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - - '@jest/test-result@29.7.0': - resolution: {integrity: sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - - '@jest/test-sequencer@29.7.0': - resolution: {integrity: sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - - '@jest/transform@29.7.0': - resolution: {integrity: sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - - '@jest/types@29.6.3': - resolution: {integrity: sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - - '@jridgewell/gen-mapping@0.3.3': - resolution: {integrity: sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==} - engines: {node: '>=6.0.0'} - - '@jridgewell/resolve-uri@3.1.1': - resolution: {integrity: sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==} - engines: {node: '>=6.0.0'} - - '@jridgewell/set-array@1.1.2': - resolution: {integrity: sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==} - engines: {node: '>=6.0.0'} - - '@jridgewell/source-map@0.3.5': - resolution: {integrity: sha512-UTYAUj/wviwdsMfzoSJspJxbkH5o1snzwX0//0ENX1u/55kkZZkcTZP6u9bwKGkv+dkk9at4m1Cpt0uY80kcpQ==} - - '@jridgewell/sourcemap-codec@1.4.15': - resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} - - '@jridgewell/trace-mapping@0.3.22': - resolution: {integrity: sha512-Wf963MzWtA2sjrNt+g18IAln9lKnlRp+K2eH4jjIoF1wYeq3aMREpG09xhlhdzS0EjwU7qmUJYangWa+151vZw==} - - '@jridgewell/trace-mapping@0.3.9': - resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==} - - '@jsdevtools/ono@7.1.3': - resolution: {integrity: sha512-4JQNk+3mVzK3xh2rqd6RB4J46qUR19azEHBneZyTZM+c456qOrbbM/5xcR8huNCCcbVt7+UmizG6GuUvPvKUYg==} - - '@lukeed/csprng@1.1.0': - resolution: {integrity: sha512-Z7C/xXCiGWsg0KuKsHTKJxbWhpI3Vs5GwLfOean7MGyVFGqdRgBbAjOCh6u4bbjPc/8MJ2pZmK/0DLdCbivLDA==} - engines: {node: '>=8'} - - '@lukeed/ms@2.0.2': - resolution: {integrity: sha512-9I2Zn6+NJLfaGoz9jN3lpwDgAYvfGeNYdbAIjJOqzs4Tpc+VU3Jqq4IofSUBKajiDS8k9fZIg18/z13mpk1bsA==} - engines: {node: '>=8'} - - '@mapbox/node-pre-gyp@1.0.11': - resolution: {integrity: sha512-Yhlar6v9WQgUp/He7BdgzOz8lqMQ8sU+jkCq7Wx8Myc5YFJLbEe7lgui/V7G1qB1DJykHSGwreceSaD60Y0PUQ==} - hasBin: true - - '@microsoft/tsdoc@0.14.2': - resolution: {integrity: sha512-9b8mPpKrfeGRuhFH5iO1iwCLeIIsV6+H1sRfxbkoGXIyQE2BTsPd9zqSqQJ+pv5sJ/hT5M1zvOFL02MnEezFug==} - - '@nestjs-cls/transactional-adapter-prisma@1.1.0': - resolution: {integrity: sha512-iTwt0uN+GTQOM9ZkSnbznWhPmKG10UDetVzZ3MZMdKZMRpkAZUnp5ClrmFUo3e37hUO/EYdfzi/g7wesO9owug==} - engines: {node: '>=18'} - peerDependencies: - '@nestjs-cls/transactional': ^2.2.0 - '@prisma/client': '> 4 < 6' - nestjs-cls: ^4.2.0 - prisma: '> 4 < 6' - - '@nestjs-cls/transactional@2.2.0': - resolution: {integrity: sha512-O3wWCiVjeOPLGPs/sPcAUhSe/xaNx8JuzBtGg4IqnVrZfbjDzeADtlHIO8YkYhHYAVbqvVtGFbfFjL5tDUGWsA==} - engines: {node: '>=16'} - peerDependencies: - '@nestjs/common': '> 7.0.0 < 11' - '@nestjs/core': '> 7.0.0 < 11' - nestjs-cls: ^4.2.0 - reflect-metadata: '*' - rxjs: '>= 7' - - '@nestjs/cache-manager@2.2.0': - resolution: {integrity: sha512-hAcX1f5moiK7B8KnPZVfV/up4nrZnaeN6w0o3M+UzNJNlw6bsIH6bn7jpGqzySAWPD9iYE/rg5IxTe1vSWyWZg==} - peerDependencies: - '@nestjs/common': ^9.0.0 || ^10.0.0 - '@nestjs/core': ^9.0.0 || ^10.0.0 - cache-manager: <=5 - reflect-metadata: ^0.1.12 - rxjs: ^7.0.0 - - '@nestjs/cli@10.0.0': - resolution: {integrity: sha512-14pju3ejAAUpFe1iK99v/b7Bw96phBMV58GXTSm3TcdgaI4O7UTLXTbMiUNyU+LGr/1CPIfThcWqFyKhDIC9VQ==} - engines: {node: '>= 16'} - hasBin: true - peerDependencies: - '@swc/cli': ^0.1.62 - '@swc/core': ^1.3.62 - peerDependenciesMeta: - '@swc/cli': - optional: true - '@swc/core': - optional: true - - '@nestjs/common@10.0.0': - resolution: {integrity: sha512-Fa2GDQJrO5TTTcpISWfm0pdPS62V+8YbxeG5CA01zMUI+dCO3v3oFf+BSjqCGUUo7GDNzDsjAejwGXuqA54RPw==} - peerDependencies: - class-transformer: '*' - class-validator: '*' - reflect-metadata: ^0.1.12 - rxjs: ^7.1.0 - peerDependenciesMeta: - class-transformer: - optional: true - class-validator: - optional: true - - '@nestjs/common@9.4.0': - resolution: {integrity: sha512-RUcVAQsEF4WPrmzFXEOUfZnPwrLTe1UVlzXTlSyfqfqbdWDPKDGlIPVelBLfc5/+RRUQ0I5iE4+CQvpCmkqldw==} - peerDependencies: - cache-manager: <=5 - class-transformer: '*' - class-validator: '*' - reflect-metadata: ^0.1.12 - rxjs: ^7.1.0 - peerDependenciesMeta: - cache-manager: - optional: true - class-transformer: - optional: true - class-validator: - optional: true - - '@nestjs/config@3.1.1': - resolution: {integrity: sha512-qu5QlNiJdqQtOsnB6lx4JCXPQ96jkKUsOGd+JXfXwqJqZcOSAq6heNFg0opW4pq4J/VZoNwoo87TNnx9wthnqQ==} - peerDependencies: - '@nestjs/common': ^8.0.0 || ^9.0.0 || ^10.0.0 - reflect-metadata: ^0.1.13 - - '@nestjs/core@10.0.0': - resolution: {integrity: sha512-HFTdj4vsF+2qOaq97ZPRDle6Q/KyL5lmMah0/ZR0ie+e1/tnlvmlqw589xFACTemLJFFOjZMy763v+icO9u72w==} - peerDependencies: - '@nestjs/common': ^10.0.0 - '@nestjs/microservices': ^10.0.0 - '@nestjs/platform-express': ^10.0.0 - '@nestjs/websockets': ^10.0.0 - reflect-metadata: ^0.1.12 - rxjs: ^7.1.0 - peerDependenciesMeta: - '@nestjs/microservices': - optional: true - '@nestjs/platform-express': - optional: true - '@nestjs/websockets': - optional: true - - '@nestjs/event-emitter@2.0.3': - resolution: {integrity: sha512-Pt7KAERrgK0OjvarSI3wfVhwZ8X1iLq1lXuodyRe+Zx3aLLP7fraFUHirASbFkB6KIQ1Zj+gZ1g8a9eu4GfFhw==} - peerDependencies: - '@nestjs/common': ^8.0.0 || ^9.0.0 || ^10.0.0 - '@nestjs/core': ^8.0.0 || ^9.0.0 || ^10.0.0 - reflect-metadata: ^0.1.12 - - '@nestjs/jwt@10.2.0': - resolution: {integrity: sha512-x8cG90SURkEiLOehNaN2aRlotxT0KZESUliOPKKnjWiyJOcWurkF3w345WOX0P4MgFzUjGoZ1Sy0aZnxeihT0g==} - peerDependencies: - '@nestjs/common': ^8.0.0 || ^9.0.0 || ^10.0.0 - - '@nestjs/mapped-types@2.0.5': - resolution: {integrity: sha512-bSJv4pd6EY99NX9CjBIyn4TVDoSit82DUZlL4I3bqNfy5Gt+gXTa86i3I/i0iIV9P4hntcGM5GyO+FhZAhxtyg==} - peerDependencies: - '@nestjs/common': ^8.0.0 || ^9.0.0 || ^10.0.0 - class-transformer: ^0.4.0 || ^0.5.0 - class-validator: ^0.13.0 || ^0.14.0 - reflect-metadata: ^0.1.12 || ^0.2.0 - peerDependenciesMeta: - class-transformer: - optional: true - class-validator: - optional: true - - '@nestjs/passport@10.0.3': - resolution: {integrity: sha512-znJ9Y4S8ZDVY+j4doWAJ8EuuVO7SkQN3yOBmzxbGaXbvcSwFDAdGJ+OMCg52NdzIO4tQoN4pYKx8W6M0ArfFRQ==} - peerDependencies: - '@nestjs/common': ^8.0.0 || ^9.0.0 || ^10.0.0 - passport: ^0.4.0 || ^0.5.0 || ^0.6.0 || ^0.7.0 - - '@nestjs/platform-fastify@10.3.4': - resolution: {integrity: sha512-rYoAdJ1ybBXPwO+KutWJ4siaqGDdMzwXS4ggJ5soQgD4maN2p1rvKE31MzERd1MqYXWprFIESFHuxkiHMZV6kg==} - peerDependencies: - '@fastify/static': ^6.0.0 || ^7.0.0 - '@fastify/view': ^7.0.0 || ^8.0.0 - '@nestjs/common': ^10.0.0 - '@nestjs/core': ^10.0.0 - peerDependenciesMeta: - '@fastify/static': - optional: true - '@fastify/view': - optional: true - - '@nestjs/schematics@10.0.0': - resolution: {integrity: sha512-gfUy/N1m1paN33BXq4d7HoCM+zM4rFxYjqAb8jkrBfBHiwyEhHHozfX/aRy/kOnAcy/VP8v4Zs4HKKrbRRlHnw==} - peerDependencies: - typescript: '>=4.8.2' - - '@nestjs/swagger@7.3.0': - resolution: {integrity: sha512-zLkfKZ+ioYsIZ3dfv7Bj8YHnZMNAGWFUmx2ZDuLp/fBE4P8BSjB7hldzDueFXsmwaPL90v7lgyd82P+s7KME1Q==} - 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 - class-transformer: '*' - class-validator: '*' - reflect-metadata: ^0.1.12 || ^0.2.0 - peerDependenciesMeta: - '@fastify/static': - optional: true - class-transformer: - optional: true - class-validator: - optional: true - - '@nestjs/testing@10.0.0': - resolution: {integrity: sha512-U5q3+svkddpdSk51ZFCEnFpQuWxAwE4ahsX77FrqqCAYidr7HUtL/BHYOVzI5H9vUH6BvJxMbfo3tiUXQl/2aA==} - peerDependencies: - '@nestjs/common': ^10.0.0 - '@nestjs/core': ^10.0.0 - '@nestjs/microservices': ^10.0.0 - '@nestjs/platform-express': ^10.0.0 - peerDependenciesMeta: - '@nestjs/microservices': - optional: true - '@nestjs/platform-express': - optional: true - - '@nestjs/testing@9.4.0': - resolution: {integrity: sha512-xZWp363P4otcebg++gSjUcdCfTK0RorORzyFq3aLaSAQOlq8kxfFDRIKzEATR4aOUfqTMMsAA8lhnMJWf35N6A==} - peerDependencies: - '@nestjs/common': ^9.0.0 - '@nestjs/core': ^9.0.0 - '@nestjs/microservices': ^9.0.0 - '@nestjs/platform-express': ^9.0.0 - peerDependenciesMeta: - '@nestjs/microservices': - optional: true - '@nestjs/platform-express': - optional: true - - '@nodelib/fs.scandir@2.1.5': - resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} - engines: {node: '>= 8'} - - '@nodelib/fs.stat@2.0.5': - resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} - engines: {node: '>= 8'} - - '@nodelib/fs.walk@1.2.8': - resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} - engines: {node: '>= 8'} - - '@nodeteam/nestjs-prisma-pagination@1.0.6': - resolution: {integrity: sha512-ZTTXIlbnphmtBt4xFlFfV7an5e2EvmC/P4nj7s0nbSgq8bYovjMAbGxlmBh/shxfVaQeYCl78SoSnYWOjIQMCA==} - - '@npmcli/fs@2.1.2': - resolution: {integrity: sha512-yOJKRvohFOaLqipNtwYB9WugyZKhC/DZC4VYPmpaCzDBrA8YpK3qHZ8/HGscMnE4GqbkLNuVcCnxkeQEdGt6LQ==} - engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} - - '@npmcli/move-file@2.0.1': - resolution: {integrity: sha512-mJd2Z5TjYWq/ttPLLGqArdtnC74J6bOzg4rMDnN+p1xTacZ2yPRCk2y0oSWQtygLR9YVQXgOcONrwtnk3JupxQ==} - engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} - deprecated: This functionality has been moved to @npmcli/fs - - '@nuxtjs/opencollective@0.3.2': - resolution: {integrity: sha512-um0xL3fO7Mf4fDxcqx9KryrB7zgRM5JSlvGN5AGkP6JLM5XEKyjeAiPbNxdXVXQ16isuAhYpvP88NgL2BGd6aA==} - engines: {node: '>=8.0.0', npm: '>=5.0.0'} - hasBin: true - - '@open-draft/deferred-promise@2.2.0': - resolution: {integrity: sha512-CecwLWx3rhxVQF6V4bAgPS5t+So2sTbPgAzafKkVizyi7tlwpcFpdFqq+wqF2OwNBmqFuu6tOyouTuxgpMfzmA==} - - '@pkgjs/parseargs@0.11.0': - resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} - engines: {node: '>=14'} - - '@pkgr/core@0.1.1': - resolution: {integrity: sha512-cq8o4cWH0ibXh9VGi5P20Tu9XF/0fFXl9EUinr9QfTM7a7p0oTA4iJRCQWppXR1Pg8dSM0UCItCkPwsk9qWWYA==} - engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} - - '@polka/url@0.5.0': - resolution: {integrity: sha512-oZLYFEAzUKyi3SKnXvj32ZCEGH6RDnao7COuCVhDydMS9NrCSVXhM79VaKyP5+Zc33m0QXEd2DN3UkU7OsHcfw==} - - '@pond918/prisma-generator-nestjs-dto@1.17.513': - resolution: {integrity: sha512-wq/GSVeVuD8kSm1Q6mC2T1MjNkyhn4wtD+N62Zp4XwV4hbxVNXUgLQsBn1lex8Yhd9DqHlVAawyTwKhLt6xBqg==} - engines: {node: '>=14'} - hasBin: true - - '@prisma/client@5.10.2': - resolution: {integrity: sha512-ef49hzB2yJZCvM5gFHMxSFL9KYrIP9udpT5rYo0CsHD4P9IKj473MbhU1gjKKftiwWBTIyrt9jukprzZXazyag==} - engines: {node: '>=16.13'} - peerDependencies: - prisma: '*' - peerDependenciesMeta: - prisma: - optional: true - - '@prisma/debug@4.16.2': - resolution: {integrity: sha512-7L7WbG0qNNZYgLpsVB8rCHCXEyHFyIycRlRDNwkVfjQmACC2OW6AWCYCbfdjQhkF/t7+S3njj8wAWAocSs+Brw==} - - '@prisma/debug@5.10.2': - resolution: {integrity: sha512-bkBOmH9dpEBbMKFJj8V+Zp8IZHIBjy3fSyhLhxj4FmKGb/UBSt9doyfA6k1UeUREsMJft7xgPYBbHSOYBr8XCA==} - - '@prisma/engines-version@5.10.0-34.5a9203d0590c951969e85a7d07215503f4672eb9': - resolution: {integrity: sha512-uCy/++3Jx/O3ufM+qv2H1L4tOemTNqcP/gyEVOlZqTpBvYJUe0tWtW0y3o2Ueq04mll4aM5X3f6ugQftOSLdFQ==} - - '@prisma/engines@5.10.2': - resolution: {integrity: sha512-HkSJvix6PW8YqEEt3zHfCYYJY69CXsNdhU+wna+4Y7EZ+AwzeupMnUThmvaDA7uqswiHkgm5/SZ6/4CStjaGmw==} - - '@prisma/fetch-engine@5.10.2': - resolution: {integrity: sha512-dSmXcqSt6DpTmMaLQ9K8ZKzVAMH3qwGCmYEZr/uVnzVhxRJ1EbT/w2MMwIdBNq1zT69Rvh0h75WMIi0mrIw7Hg==} - - '@prisma/generator-helper@4.16.2': - resolution: {integrity: sha512-bMOH7y73Ui7gpQrioFeavMQA+Tf8ksaVf8Nhs9rQNzuSg8SSV6E9baczob0L5KGZTSgYoqnrRxuo03kVJYrnIg==} - - '@prisma/get-platform@5.10.2': - resolution: {integrity: sha512-nqXP6vHiY2PIsebBAuDeWiUYg8h8mfjBckHh6Jezuwej0QJNnjDiOq30uesmg+JXxGk99nqyG3B7wpcOODzXvg==} - - '@schematics/angular@13.3.11': - resolution: {integrity: sha512-imKBnKYEse0SBVELZO/753nkpt3eEgpjrYkB+AFWF9YfO/4RGnYXDHoH8CFkzxPH9QQCgNrmsVFNiYGS+P/S1A==} - engines: {node: ^12.20.0 || ^14.15.0 || >=16.10.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: '>= 1.13.0'} - - '@sinclair/typebox@0.27.8': - resolution: {integrity: sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==} - - '@sinonjs/commons@3.0.1': - resolution: {integrity: sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==} - - '@sinonjs/fake-timers@10.3.0': - resolution: {integrity: sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==} - - '@tootallnate/once@2.0.0': - resolution: {integrity: sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==} - engines: {node: '>= 10'} - - '@tsconfig/node10@1.0.9': - resolution: {integrity: sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==} - - '@tsconfig/node12@1.0.11': - resolution: {integrity: sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==} - - '@tsconfig/node14@1.0.3': - resolution: {integrity: sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==} - - '@tsconfig/node16@1.0.4': - resolution: {integrity: sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==} - - '@types/babel__core@7.20.5': - resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==} - - '@types/babel__generator@7.6.8': - resolution: {integrity: sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==} - - '@types/babel__template@7.4.4': - resolution: {integrity: sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==} - - '@types/babel__traverse@7.20.5': - resolution: {integrity: sha512-WXCyOcRtH37HAUkpXhUduaxdm82b4GSlyTqajXviN4EfiuPgNYR109xMCKvpl6zPIpua0DGlMEDCq+g8EdoheQ==} - - '@types/bcrypt@5.0.2': - resolution: {integrity: sha512-6atioO8Y75fNcbmj0G7UjI9lXN2pQ/IGJ2FWT4a/btd0Lk9lQalHLKhkgKVZ3r+spnmWUKfbMi1GEe9wyHQfNQ==} - - '@types/body-parser@1.19.5': - resolution: {integrity: sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==} - - '@types/connect@3.4.38': - resolution: {integrity: sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==} - - '@types/conventional-commits-parser@5.0.0': - resolution: {integrity: sha512-loB369iXNmAZglwWATL+WRe+CRMmmBPtpolYzIebFaX4YA3x+BEfLqhUAV9WanycKI3TG1IMr5bMJDajDKLlUQ==} - - '@types/cookiejar@2.1.5': - resolution: {integrity: sha512-he+DHOWReW0nghN24E1WUqM0efK4kI9oTqDm6XmK8ZPe2djZ90BSNdGnIyCLzCPw7/pogPlGbzI2wHGGmi4O/Q==} - - '@types/cross-spawn@6.0.2': - resolution: {integrity: sha512-KuwNhp3eza+Rhu8IFI5HUXRP0LIhqH5cAjubUvGXXthh4YYBuP2ntwEX+Cz8GJoZUHlKo247wPWOfA9LYEq4cw==} - - '@types/debug@4.1.8': - resolution: {integrity: sha512-/vPO1EPOs306Cvhwv7KfVfYvOJqA/S/AXjaHQiJboCZzcNDb+TIJFN9/2C9DZ//ijSKWioNyUxD792QmDJ+HKQ==} - - '@types/dot@1.1.7': - resolution: {integrity: sha512-RhMcnI18Y+401Nceh2pW5gTGgsdfZdvg9g0P/5HIBJ0jmZEv5KlkYvfQiHhw4/Vnb8NdePi/4UCs92ITExLxuQ==} - - '@types/eslint-scope@3.7.7': - resolution: {integrity: sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==} - - '@types/eslint@8.56.2': - resolution: {integrity: sha512-uQDwm1wFHmbBbCZCqAlq6Do9LYwByNZHWzXppSnay9SuwJ+VRbjkbLABer54kcPnMSlG6Fdiy2yaFXm/z9Z5gw==} - - '@types/estree@1.0.5': - resolution: {integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==} - - '@types/express-serve-static-core@4.17.43': - resolution: {integrity: sha512-oaYtiBirUOPQGSWNGPWnzyAFJ0BP3cwvN4oWZQY+zUBwpVIGsKUkpBpSztp74drYcjavs7SKFZ4DX1V2QeN8rg==} - - '@types/express@4.17.17': - resolution: {integrity: sha512-Q4FmmuLGBG58btUnfS1c1r/NQdlp3DMfGDGig8WhfpA2YRUtEkxAjkZb0yvplJGYdF1fsQ81iMDcH24sSCNC/Q==} - - '@types/graceful-fs@4.1.9': - resolution: {integrity: sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==} - - '@types/http-errors@2.0.4': - resolution: {integrity: sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA==} - - '@types/istanbul-lib-coverage@2.0.6': - resolution: {integrity: sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==} - - '@types/istanbul-lib-report@3.0.3': - resolution: {integrity: sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==} - - '@types/istanbul-reports@3.0.4': - resolution: {integrity: sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==} - - '@types/jest@29.5.2': - resolution: {integrity: sha512-mSoZVJF5YzGVCk+FsDxzDuH7s+SCkzrgKZzf0Z0T2WudhBUPoF6ktoTPC4R0ZoCPCV5xUvuU6ias5NvxcBcMMg==} - - '@types/json-schema@7.0.15': - resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} - - '@types/jsonwebtoken@9.0.5': - resolution: {integrity: sha512-VRLSGzik+Unrup6BsouBeHsf4d1hOEgYWTm/7Nmw1sXoN1+tRly/Gy/po3yeahnP4jfnQWWAhQAqcNfH7ngOkA==} - - '@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/mime@3.0.4': - resolution: {integrity: sha512-iJt33IQnVRkqeqC7PzBHPTC6fDlRNRW8vjrgqtScAhrmMwe8c4Eo7+fUGTa+XdWrpEgpyKWMYmi2dIwMAYRzPw==} - - '@types/minimist@1.2.5': - resolution: {integrity: sha512-hov8bUuiLiyFPGyFPE1lwWhmzYbirOXQNNo40+y3zow8aFVTeyn3VWL0VFFfdNddA8S4Vf0Tc062rzyNr7Paag==} - - '@types/ms@0.7.34': - resolution: {integrity: sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g==} - - '@types/node@20.3.1': - resolution: {integrity: sha512-EhcH/wvidPy1WeML3TtYFGR83UzjxeWRen9V402T8aUGYsCHOmfoisV3ZSg03gAFIbLq8TnWOJ0f4cALtnSEUg==} - - '@types/normalize-package-data@2.4.4': - resolution: {integrity: sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==} - - '@types/parse-json@4.0.2': - resolution: {integrity: sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==} - - '@types/passport-jwt@4.0.1': - resolution: {integrity: sha512-Y0Ykz6nWP4jpxgEUYq8NoVZeCQPo1ZndJLfapI249g1jHChvRfZRO/LS3tqu26YgAS/laI1qx98sYGz0IalRXQ==} - - '@types/passport-local@1.0.38': - resolution: {integrity: sha512-nsrW4A963lYE7lNTv9cr5WmiUD1ibYJvWrpE13oxApFsRt77b0RdtZvKbCdNIY4v/QZ6TRQWaDDEwV1kCTmcXg==} - - '@types/passport-strategy@0.2.38': - resolution: {integrity: sha512-GC6eMqqojOooq993Tmnmp7AUTbbQSgilyvpCYQjT+H6JfG/g6RGc7nXEniZlp0zyKJ0WUdOiZWLBZft9Yug1uA==} - - '@types/passport@1.0.16': - resolution: {integrity: sha512-FD0qD5hbPWQzaM0wHUnJ/T0BBCJBxCeemtnCwc/ThhTg3x9jfrAcRUmj5Dopza+MfFS9acTe3wk7rcVnRIp/0A==} - - '@types/qs@6.9.11': - resolution: {integrity: sha512-oGk0gmhnEJK4Yyk+oI7EfXsLayXatCWPHary1MtcmbAifkobT9cM9yutG/hZKIseOU0MqbIwQ/u2nn/Gb+ltuQ==} - - '@types/range-parser@1.2.7': - resolution: {integrity: sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==} - - '@types/semver@7.5.6': - resolution: {integrity: sha512-dn1l8LaMea/IjDoHNd9J52uBbInB796CDffS6VdIxvqYCPSG0V0DzHp76GpaWnlhg88uYyPbXCDIowa86ybd5A==} - - '@types/send@0.17.4': - resolution: {integrity: sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==} - - '@types/serve-static@1.15.5': - resolution: {integrity: sha512-PDRk21MnK70hja/YF8AHfC7yIsiQHn1rcXx7ijCFBX/k+XQJhQT/gw3xekXKJvx+5SXaMMS8oqQy09Mzvz2TuQ==} - - '@types/stack-utils@2.0.3': - resolution: {integrity: sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==} - - '@types/superagent@8.1.3': - resolution: {integrity: sha512-R/CfN6w2XsixLb1Ii8INfn+BT9sGPvw74OavfkW4SwY+jeUcAwLZv2+bXLJkndnimxjEBm0RPHgcjW9pLCa8cw==} - - '@types/supertest@6.0.0': - resolution: {integrity: sha512-j3/Z2avY+H3yn+xp/ef//QyqqE+dg3rWh14Ewi/QZs6uVK+oOs7lFRXtjp2YHAqHJZ4OFGNmCxZO5vd7AuG/Dg==} - - '@types/validator@13.11.9': - resolution: {integrity: sha512-FCTsikRozryfayPuiI46QzH3fnrOoctTjvOYZkho9BTFLCOZ2rgZJHMOVgCOfttjPJcgOx52EpkY0CMfy87MIw==} - - '@types/yargs-parser@21.0.3': - resolution: {integrity: sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==} - - '@types/yargs@17.0.32': - resolution: {integrity: sha512-xQ67Yc/laOG5uMfX/093MRlGGCIBzZMarVa+gfNKJxWAIgykYpVGkBdbqEzGDDfCrVUj6Hiff4mTZ5BA6TmAog==} - - '@typescript-eslint/eslint-plugin@6.0.0': - resolution: {integrity: sha512-xuv6ghKGoiq856Bww/yVYnXGsKa588kY3M0XK7uUW/3fJNNULKRfZfSBkMTSpqGG/8ZCXCadfh8G/z/B4aqS/A==} - engines: {node: ^16.0.0 || >=18.0.0} - peerDependencies: - '@typescript-eslint/parser': ^6.0.0 || ^6.0.0-alpha - eslint: ^7.0.0 || ^8.0.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - - '@typescript-eslint/parser@6.0.0': - resolution: {integrity: sha512-TNaufYSPrr1U8n+3xN+Yp9g31vQDJqhXzzPSHfQDLcaO4tU+mCfODPxCwf4H530zo7aUBE3QIdxCXamEnG04Tg==} - engines: {node: ^16.0.0 || >=18.0.0} - peerDependencies: - eslint: ^7.0.0 || ^8.0.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - - '@typescript-eslint/scope-manager@6.0.0': - resolution: {integrity: sha512-o4q0KHlgCZTqjuaZ25nw5W57NeykZT9LiMEG4do/ovwvOcPnDO1BI5BQdCsUkjxFyrCL0cSzLjvIMfR9uo7cWg==} - engines: {node: ^16.0.0 || >=18.0.0} - - '@typescript-eslint/type-utils@6.0.0': - resolution: {integrity: sha512-ah6LJvLgkoZ/pyJ9GAdFkzeuMZ8goV6BH7eC9FPmojrnX9yNCIsfjB+zYcnex28YO3RFvBkV6rMV6WpIqkPvoQ==} - engines: {node: ^16.0.0 || >=18.0.0} - peerDependencies: - eslint: ^7.0.0 || ^8.0.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - - '@typescript-eslint/types@6.0.0': - resolution: {integrity: sha512-Zk9KDggyZM6tj0AJWYYKgF0yQyrcnievdhG0g5FqyU3Y2DRxJn4yWY21sJC0QKBckbsdKKjYDV2yVrrEvuTgxg==} - engines: {node: ^16.0.0 || >=18.0.0} - - '@typescript-eslint/typescript-estree@6.0.0': - resolution: {integrity: sha512-2zq4O7P6YCQADfmJ5OTDQTP3ktajnXIRrYAtHM9ofto/CJZV3QfJ89GEaM2BNGeSr1KgmBuLhEkz5FBkS2RQhQ==} - engines: {node: ^16.0.0 || >=18.0.0} - peerDependencies: - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - - '@typescript-eslint/utils@6.0.0': - resolution: {integrity: sha512-SOr6l4NB6HE4H/ktz0JVVWNXqCJTOo/mHnvIte1ZhBQ0Cvd04x5uKZa3zT6tiodL06zf5xxdK8COiDvPnQ27JQ==} - engines: {node: ^16.0.0 || >=18.0.0} - peerDependencies: - eslint: ^7.0.0 || ^8.0.0 - - '@typescript-eslint/visitor-keys@6.0.0': - resolution: {integrity: sha512-cvJ63l8c0yXdeT5POHpL0Q1cZoRcmRKFCtSjNGJxPkcP571EfZMcNbzWAc7oK3D1dRzm/V5EwtkANTZxqvuuUA==} - engines: {node: ^16.0.0 || >=18.0.0} - - '@webassemblyjs/ast@1.11.6': - resolution: {integrity: sha512-IN1xI7PwOvLPgjcf180gC1bqn3q/QaOCwYUahIOhbYUu8KA/3tw2RT/T0Gidi1l7Hhj5D/INhJxiICObqpMu4Q==} - - '@webassemblyjs/floating-point-hex-parser@1.11.6': - resolution: {integrity: sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==} - - '@webassemblyjs/helper-api-error@1.11.6': - resolution: {integrity: sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==} - - '@webassemblyjs/helper-buffer@1.11.6': - resolution: {integrity: sha512-z3nFzdcp1mb8nEOFFk8DrYLpHvhKC3grJD2ardfKOzmbmJvEf/tPIqCY+sNcwZIY8ZD7IkB2l7/pqhUhqm7hLA==} - - '@webassemblyjs/helper-numbers@1.11.6': - resolution: {integrity: sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==} - - '@webassemblyjs/helper-wasm-bytecode@1.11.6': - resolution: {integrity: sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==} - - '@webassemblyjs/helper-wasm-section@1.11.6': - resolution: {integrity: sha512-LPpZbSOwTpEC2cgn4hTydySy1Ke+XEu+ETXuoyvuyezHO3Kjdu90KK95Sh9xTbmjrCsUwvWwCOQQNta37VrS9g==} - - '@webassemblyjs/ieee754@1.11.6': - resolution: {integrity: sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==} - - '@webassemblyjs/leb128@1.11.6': - resolution: {integrity: sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==} - - '@webassemblyjs/utf8@1.11.6': - resolution: {integrity: sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==} - - '@webassemblyjs/wasm-edit@1.11.6': - resolution: {integrity: sha512-Ybn2I6fnfIGuCR+Faaz7YcvtBKxvoLV3Lebn1tM4o/IAJzmi9AWYIPWpyBfU8cC+JxAO57bk4+zdsTjJR+VTOw==} - - '@webassemblyjs/wasm-gen@1.11.6': - resolution: {integrity: sha512-3XOqkZP/y6B4F0PBAXvI1/bky7GryoogUtfwExeP/v7Nzwo1QLcq5oQmpKlftZLbT+ERUOAZVQjuNVak6UXjPA==} - - '@webassemblyjs/wasm-opt@1.11.6': - resolution: {integrity: sha512-cOrKuLRE7PCe6AsOVl7WasYf3wbSo4CeOk6PkrjS7g57MFfVUF9u6ysQBBODX0LdgSvQqRiGz3CXvIDKcPNy4g==} - - '@webassemblyjs/wasm-parser@1.11.6': - resolution: {integrity: sha512-6ZwPeGzMJM3Dqp3hCsLgESxBGtT/OeCvCZ4TA1JUPYgmhAx38tTPR9JaKy0S5H3evQpO/h2uWs2j6Yc/fjkpTQ==} - - '@webassemblyjs/wast-printer@1.11.6': - resolution: {integrity: sha512-JM7AhRcE+yW2GWYaKeHL5vt4xqee5N2WcezptmgyhNS+ScggqcT1OtXykhAb13Sn5Yas0j2uv9tHgrjwvzAP4A==} - - '@xtuc/ieee754@1.2.0': - resolution: {integrity: sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==} - - '@xtuc/long@4.2.2': - resolution: {integrity: sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==} - - JSONStream@1.3.5: - resolution: {integrity: sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==} - hasBin: true - - abbrev@1.1.1: - resolution: {integrity: sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==} - - abort-controller@3.0.0: - resolution: {integrity: sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==} - engines: {node: '>=6.5'} - - abstract-logging@2.0.1: - resolution: {integrity: sha512-2BjRTZxTPvheOvGbBslFSYOUkr+SjPtOnrLP33f+VIWLzezQpZcqVg7ja3L4dBXmzzgwT+a029jRx5PCi3JuiA==} - - acorn-import-assertions@1.9.0: - resolution: {integrity: sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==} - peerDependencies: - acorn: ^8 - - acorn-jsx@5.3.2: - resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} - peerDependencies: - acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 - - acorn-walk@8.3.2: - resolution: {integrity: sha512-cjkyv4OtNCIeqhHrfS81QWXoCBPExR/J62oyEqepVw8WaQeSqpW2uhuLPh1m9eWhDuOo/jUXVTlifvesOWp/4A==} - engines: {node: '>=0.4.0'} - - acorn@4.0.13: - resolution: {integrity: sha512-fu2ygVGuMmlzG8ZeRJ0bvR41nsAkxxhbyk8bZ1SS521Z7vmgJFTQQlfz/Mp/nJexGBz+v8sC9bM6+lNgskt4Ug==} - engines: {node: '>=0.4.0'} - hasBin: true - - acorn@8.11.3: - resolution: {integrity: sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==} - engines: {node: '>=0.4.0'} - hasBin: true - - add-stream@1.0.0: - resolution: {integrity: sha512-qQLMr+8o0WC4FZGQTcJiKBVC59JylcPSrTtk6usvmIDFUOCKegapy1VHQwRbFMOFyb/inzUVqHs+eMYKDM1YeQ==} - - agent-base@6.0.2: - resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==} - engines: {node: '>= 6.0.0'} - - agentkeepalive@4.5.0: - resolution: {integrity: sha512-5GG/5IbQQpC9FpkRGsSvZI5QYeSCzlJHdpBQntCsuTOxhKD8lqKhrleg2Yi7yvMIf82Ycmmqln9U8V9qwEiJew==} - engines: {node: '>= 8.0.0'} - - aggregate-error@3.1.0: - resolution: {integrity: sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==} - engines: {node: '>=8'} - - ajv-formats@2.1.1: - resolution: {integrity: sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==} - peerDependencies: - ajv: ^8.0.0 - peerDependenciesMeta: - ajv: - optional: true - - ajv-keywords@3.5.2: - resolution: {integrity: sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==} - peerDependencies: - ajv: ^6.9.1 - - ajv@6.12.6: - resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} - - ajv@8.12.0: - resolution: {integrity: sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==} - - ajv@8.9.0: - resolution: {integrity: sha512-qOKJyNj/h+OWx7s5DePL6Zu1KeM9jPZhwBqs+7DzP6bGOvqzVCSf0xueYmVuaC/oQ/VtS2zLMLHdQFbkka+XDQ==} - - ansi-colors@4.1.3: - resolution: {integrity: sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==} - engines: {node: '>=6'} - - ansi-escapes@4.3.2: - resolution: {integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==} - engines: {node: '>=8'} - - ansi-regex@2.1.1: - resolution: {integrity: sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==} - engines: {node: '>=0.10.0'} - - ansi-regex@5.0.1: - resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} - engines: {node: '>=8'} - - ansi-regex@6.0.1: - resolution: {integrity: sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==} - engines: {node: '>=12'} - - ansi-styles@2.2.1: - resolution: {integrity: sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==} - engines: {node: '>=0.10.0'} - - ansi-styles@3.2.1: - resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} - engines: {node: '>=4'} - - ansi-styles@4.3.0: - resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} - engines: {node: '>=8'} - - ansi-styles@5.2.0: - resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==} - engines: {node: '>=10'} - - ansi-styles@6.2.1: - resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} - engines: {node: '>=12'} - - anymatch@3.1.3: - resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} - engines: {node: '>= 8'} - - aproba@2.0.0: - resolution: {integrity: sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==} - - archy@1.0.0: - resolution: {integrity: sha512-Xg+9RwCg/0p32teKdGMPTPnVXKD0w3DfHnFTficozsAgsvq2XenPJq/MYpzzQ/v8zrOyJn6Ds39VA4JIDwFfqw==} - - are-we-there-yet@2.0.0: - resolution: {integrity: sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==} - engines: {node: '>=10'} - - are-we-there-yet@3.0.1: - resolution: {integrity: sha512-QZW4EDmGwlYur0Yyf/b2uGucHQMa8aFUP7eu9ddR73vvhFyt4V0Vl3QHPcTNJ8l6qYOBdxgXdnBXQrHilfRQBg==} - engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} - - arg@4.1.3: - resolution: {integrity: sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==} - - argparse@1.0.10: - resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} - - argparse@2.0.1: - resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} - - arr-diff@2.0.0: - resolution: {integrity: sha512-dtXTVMkh6VkEEA7OhXnN1Ecb8aAGFdZ1LFxtOCoqj4qkyOJMt7+qs6Ahdy6p/NQCPYsRSXXivhSB/J5E9jmYKA==} - engines: {node: '>=0.10.0'} - - arr-flatten@1.1.0: - resolution: {integrity: sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==} - engines: {node: '>=0.10.0'} - - array-ify@1.0.0: - resolution: {integrity: sha512-c5AMf34bKdvPhQ7tBGhqkgKNUzMr4WUs+WDtC2ZUGOUncbxKMTvqxYctiseW3+L4bA8ec+GcZ6/A/FW4m8ukng==} - - array-timsort@1.0.3: - resolution: {integrity: sha512-/+3GRL7dDAGEfM6TseQk/U+mi18TU2Ms9I3UlLdUMhz2hbvGNTKdj9xniwXfUqgYhHxRx0+8UnKkvlNwVU+cWQ==} - - array-union@2.1.0: - resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} - engines: {node: '>=8'} - - array-unique@0.2.1: - resolution: {integrity: sha512-G2n5bG5fSUCpnsXz4+8FUkYsGPkNfLn9YvS66U5qbTIXI2Ynnlo4Bi42bWv+omKUCqz+ejzfClwne0alJWJPhg==} - engines: {node: '>=0.10.0'} - - arrify@1.0.1: - resolution: {integrity: sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==} - engines: {node: '>=0.10.0'} - - asap@2.0.6: - resolution: {integrity: sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==} - - async@3.2.5: - resolution: {integrity: sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg==} - - asynckit@0.4.0: - resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} - - at-least-node@1.0.0: - resolution: {integrity: sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==} - engines: {node: '>= 4.0.0'} - - atob@2.1.2: - resolution: {integrity: sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==} - engines: {node: '>= 4.5.0'} - hasBin: true - - atomic-sleep@1.0.0: - resolution: {integrity: sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ==} - engines: {node: '>=8.0.0'} - - avvio@8.3.0: - resolution: {integrity: sha512-VBVH0jubFr9LdFASy/vNtm5giTrnbVquWBhT0fyizuNK2rQ7e7ONU2plZQWUNqtE1EmxFEb+kbSkFRkstiaS9Q==} - - axios@1.6.7: - resolution: {integrity: sha512-/hDJGff6/c7u0hDkvkGxR/oy6CbCs8ziCsC7SqmhjfozqiJGc8Z11wrv9z9lYfY4K8l+H9TpjcMDX0xOZmx+RA==} - - babel-jest@29.7.0: - resolution: {integrity: sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - peerDependencies: - '@babel/core': ^7.8.0 - - babel-plugin-istanbul@6.1.1: - resolution: {integrity: sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==} - engines: {node: '>=8'} - - babel-plugin-jest-hoist@29.6.3: - resolution: {integrity: sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - - babel-preset-current-node-syntax@1.0.1: - resolution: {integrity: sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==} - peerDependencies: - '@babel/core': ^7.0.0 - - babel-preset-jest@29.6.3: - resolution: {integrity: sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - peerDependencies: - '@babel/core': ^7.0.0 - - balanced-match@1.0.2: - resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} - - base64-js@1.5.1: - resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} - - bcrypt@5.1.1: - resolution: {integrity: sha512-AGBHOG5hPYZ5Xl9KXzU5iKq9516yEmvCKDg3ecP5kX2aB6UqTeXZxk2ELnDgDm6BQSMlLt9rDB4LoSMx0rYwww==} - engines: {node: '>= 10.0.0'} - - binary-extensions@2.2.0: - resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==} - engines: {node: '>=8'} - - bindings@1.5.0: - resolution: {integrity: sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==} - - bl@4.1.0: - resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==} - - brace-expansion@1.1.11: - resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} - - brace-expansion@2.0.1: - resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} - - braces@1.8.5: - resolution: {integrity: sha512-xU7bpz2ytJl1bH9cgIurjpg/n8Gohy9GTw81heDYLJQ4RU60dlyJsa+atVF2pI0yMMvKxI9HkKwjePCj5XI1hw==} - engines: {node: '>=0.10.0'} - - braces@3.0.2: - resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} - engines: {node: '>=8'} - - browserslist@4.22.3: - resolution: {integrity: sha512-UAp55yfwNv0klWNapjs/ktHoguxuQNGnOzxYmfnXIS+8AsRDZkSDxg7R1AX3GKzn078SBI5dzwzj/Yx0Or0e3A==} - engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} - hasBin: true - - bs-logger@0.2.6: - resolution: {integrity: sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==} - engines: {node: '>= 6'} - - bser@2.1.1: - resolution: {integrity: sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==} - - buffer-equal-constant-time@1.0.1: - resolution: {integrity: sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==} - - buffer-from@1.1.2: - resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} - - buffer@5.7.1: - resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} - - buffer@6.0.3: - resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==} - - cacache@16.1.3: - resolution: {integrity: sha512-/+Emcj9DAXxX4cwlLmRI9c166RuL3w30zp4R7Joiv2cQTtTtA+jeuCAjH3ZlGnYS3tKENSrKhAzVVP9GVyzeYQ==} - engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} - - cache-manager@5.4.0: - resolution: {integrity: sha512-FS7o8vqJosnLpu9rh2gQTo8EOzCRJLF1BJ4XDEUDMqcfvs7SJZs5iuoFTXLauzQ3S5v8sBAST1pCwMaurpyi1A==} - - cachedir@2.3.0: - resolution: {integrity: sha512-A+Fezp4zxnit6FanDmv9EqXNAi3vt9DWp51/71UEhXukb7QUuvtv9344h91dyAxuTLoSYJFU299qzR3tzwPAhw==} - engines: {node: '>=6'} - - call-bind@1.0.6: - resolution: {integrity: sha512-Mj50FLHtlsoVfRfnHaZvyrooHcrlceNZdL/QBvJJVd9Ta55qCQK0gs4ss2oZDeV9zFCs6ewzYgVE5yfVmfFpVg==} - engines: {node: '>= 0.4'} - - callsites@3.1.0: - resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} - engines: {node: '>=6'} - - camelcase-keys@6.2.2: - resolution: {integrity: sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==} - engines: {node: '>=8'} - - camelcase@2.1.1: - resolution: {integrity: sha512-DLIsRzJVBQu72meAKPkWQOLcujdXT32hwdfnkI1frSiSRMK1MofjKHf+MEx0SB6fjEFXL8fBDv1dKymBlOp4Qw==} - engines: {node: '>=0.10.0'} - - camelcase@3.0.0: - resolution: {integrity: sha512-4nhGqUkc4BqbBBB4Q6zLuD7lzzrHYrjKGeYaEji/3tFR5VdJu9v+LilhGIVe8wxEJPPOeWo7eg8dwY13TZ1BNg==} - engines: {node: '>=0.10.0'} - - camelcase@5.3.1: - resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==} - engines: {node: '>=6'} - - camelcase@6.3.0: - resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} - engines: {node: '>=10'} - - caniuse-lite@1.0.30001584: - resolution: {integrity: sha512-LOz7CCQ9M1G7OjJOF9/mzmqmj3jE/7VOmrfw6Mgs0E8cjOsbRXQJHsPBfmBOXDskXKrHLyyW3n7kpDW/4BsfpQ==} - - case@1.6.3: - resolution: {integrity: sha512-mzDSXIPaFwVDvZAHqZ9VlbyF4yyXRuX6IvB06WvPYkqJVO24kX1PPhv9bfpKNFZyxYFmmgo03HUiD8iklmJYRQ==} - engines: {node: '>= 0.8.0'} - - centra@2.6.0: - resolution: {integrity: sha512-dgh+YleemrT8u85QL11Z6tYhegAs3MMxsaWAq/oXeAmYJ7VxL3SI9TZtnfaEvNDMAPolj25FXIb3S+HCI4wQaQ==} - deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. - - chalk@1.1.3: - resolution: {integrity: sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==} - engines: {node: '>=0.10.0'} - - chalk@2.4.2: - resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} - engines: {node: '>=4'} - - chalk@4.1.2: - resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} - engines: {node: '>=10'} - - chalk@5.3.0: - resolution: {integrity: sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==} - engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} - - char-regex@1.0.2: - resolution: {integrity: sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==} - engines: {node: '>=10'} - - chardet@0.7.0: - resolution: {integrity: sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==} - - chokidar@3.5.3: - resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==} - engines: {node: '>= 8.10.0'} - - chownr@2.0.0: - resolution: {integrity: sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==} - engines: {node: '>=10'} - - chrome-trace-event@1.0.3: - resolution: {integrity: sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==} - engines: {node: '>=6.0'} - - ci-info@3.9.0: - resolution: {integrity: sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==} - engines: {node: '>=8'} - - cjs-module-lexer@1.2.3: - resolution: {integrity: sha512-0TNiGstbQmCFwt4akjjBg5pLRTSyj/PkWQ1ZoO2zntmg9yLqSRxwEa4iCfQLGjqhiqBfOJa7W/E8wfGrTDmlZQ==} - - class-transformer@0.5.1: - resolution: {integrity: sha512-SQa1Ws6hUbfC98vKGxZH3KFY0Y1lm5Zm0SY8XX9zbK7FJCyVEac3ATW0RIpwzW+oOfmHE5PMPufDG9hCfoEOMw==} - - class-validator@0.14.1: - resolution: {integrity: sha512-2VEG9JICxIqTpoK1eMzZqaV+u/EiwEJkMGzTrZf6sU/fwsnOITVgYJ8yojSy6CaXtO9V0Cc6ZQZ8h8m4UBuLwQ==} - - clean-stack@2.2.0: - resolution: {integrity: sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==} - engines: {node: '>=6'} - - cli-cursor@3.1.0: - resolution: {integrity: sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==} - engines: {node: '>=8'} - - cli-spinners@2.9.2: - resolution: {integrity: sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==} - engines: {node: '>=6'} - - cli-table3@0.6.3: - resolution: {integrity: sha512-w5Jac5SykAeZJKntOxJCrm63Eg5/4dhMWIcuTbo9rpE+brgaSZo0RuNJZeOyMgsUdhDeojvgyQLmjI+K50ZGyg==} - engines: {node: 10.* || >= 12.*} - - cli-width@3.0.0: - resolution: {integrity: sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==} - engines: {node: '>= 10'} - - cliui@3.2.0: - resolution: {integrity: sha512-0yayqDxWQbqk3ojkYqUKqaAQ6AfNKeKWRNA8kR0WXzAsdHpP4BIaOmMAG87JGuO6qcobyW4GjxHd9PmhEd+T9w==} - - cliui@7.0.4: - resolution: {integrity: sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==} - - cliui@8.0.1: - resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} - engines: {node: '>=12'} - - clone-stats@0.0.1: - resolution: {integrity: sha512-dhUqc57gSMCo6TX85FLfe51eC/s+Im2MLkAgJwfaRRexR2tA4dd3eLEW4L6efzHc2iNorrRRXITifnDLlRrhaA==} - - clone@1.0.4: - resolution: {integrity: sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==} - engines: {node: '>=0.8'} - - co@4.6.0: - resolution: {integrity: sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==} - engines: {iojs: '>= 1.0.0', node: '>= 0.12.0'} - - code-point-at@1.1.0: - resolution: {integrity: sha512-RpAVKQA5T63xEj6/giIbUEtZwJ4UFIc3ZtvEkiaUERylqe8xb5IvqcgOurZLahv93CLKfxcw5YI+DZcUBRyLXA==} - engines: {node: '>=0.10.0'} - - collect-v8-coverage@1.0.2: - resolution: {integrity: sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q==} - - color-convert@1.9.3: - resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} - - color-convert@2.0.1: - resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} - engines: {node: '>=7.0.0'} - - color-name@1.1.3: - resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} - - color-name@1.1.4: - resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} - - color-support@1.1.3: - resolution: {integrity: sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==} - hasBin: true - - 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'} - - commander@2.20.3: - resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} - - commander@4.1.1: - resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==} - engines: {node: '>= 6'} - - comment-json@4.2.3: - resolution: {integrity: sha512-SsxdiOf064DWoZLH799Ata6u7iV658A11PlWtZATDlXPpKGJnbJZ5Z24ybixAi+LUUqJ/GKowAejtC5GFUG7Tw==} - engines: {node: '>= 6'} - - commitizen@4.3.0: - resolution: {integrity: sha512-H0iNtClNEhT0fotHvGV3E9tDejDeS04sN1veIebsKYGMuGscFaswRoYJKmT3eW85eIJAs0F28bG2+a/9wCOfPw==} - engines: {node: '>= 12'} - hasBin: true - - compare-func@2.0.0: - resolution: {integrity: sha512-zHig5N+tPWARooBnb0Zx1MFcdfpyJrfTJ3Y5L+IFvUm8rM74hHz66z0gw0x4tijh5CorKkKUCnW82R2vmpeCRA==} - - component-emitter@1.3.1: - resolution: {integrity: sha512-T0+barUSQRTUQASh8bx02dl+DhF54GtIDY13Y3m9oWTklKbb3Wv974meRpeZ3lp1JpLVECWWNHC4vaG2XHXouQ==} - - concat-map@0.0.1: - resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} - - concat-stream@1.5.1: - resolution: {integrity: sha512-eYF1Q4RxUUwq8ApyPD9ebWsYjVrJmTMLGzbGXv4qTZ5iP7FLm+oWN4x2XIzLEZ745xiwRM9DmIB0Ix1Nz8Epmg==} - 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==} - - console-control-strings@1.1.0: - resolution: {integrity: sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==} - - content-disposition@0.5.4: - resolution: {integrity: sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==} - engines: {node: '>= 0.6'} - - conventional-changelog-angular@5.0.13: - resolution: {integrity: sha512-i/gipMxs7s8L/QeuavPF2hLnJgH6pEZAttySB6aiQLWcX3puWDL3ACVmvBhJGxnAy52Qc15ua26BufY6KpmrVA==} - engines: {node: '>=10'} - - conventional-changelog-angular@7.0.0: - resolution: {integrity: sha512-ROjNchA9LgfNMTTFSIWPzebCwOGFdgkEq45EnvvrmSLvCtAw0HSmrCs7/ty+wAeYUZyNay0YMUNYFTRL72PkBQ==} - engines: {node: '>=16'} - - conventional-changelog-atom@2.0.8: - resolution: {integrity: sha512-xo6v46icsFTK3bb7dY/8m2qvc8sZemRgdqLb/bjpBsH2UyOS8rKNTgcb5025Hri6IpANPApbXMg15QLb1LJpBw==} - engines: {node: '>=10'} - - conventional-changelog-codemirror@2.0.8: - resolution: {integrity: sha512-z5DAsn3uj1Vfp7po3gpt2Boc+Bdwmw2++ZHa5Ak9k0UKsYAO5mH1UBTN0qSCuJZREIhX6WU4E1p3IW2oRCNzQw==} - engines: {node: '>=10'} - - conventional-changelog-config-spec@2.1.0: - resolution: {integrity: sha512-IpVePh16EbbB02V+UA+HQnnPIohgXvJRxHcS5+Uwk4AT5LjzCZJm5sp/yqs5C6KZJ1jMsV4paEV13BN1pvDuxQ==} - - conventional-changelog-conventionalcommits@4.6.3: - resolution: {integrity: sha512-LTTQV4fwOM4oLPad317V/QNQ1FY4Hju5qeBIM1uTHbrnCE+Eg4CdRZ3gO2pUeR+tzWdp80M2j3qFFEDWVqOV4g==} - engines: {node: '>=10'} - - conventional-changelog-core@4.2.4: - resolution: {integrity: sha512-gDVS+zVJHE2v4SLc6B0sLsPiloR0ygU7HaDW14aNJE1v4SlqJPILPl/aJC7YdtRE4CybBf8gDwObBvKha8Xlyg==} - engines: {node: '>=10'} - - conventional-changelog-ember@2.0.9: - resolution: {integrity: sha512-ulzIReoZEvZCBDhcNYfDIsLTHzYHc7awh+eI44ZtV5cx6LVxLlVtEmcO+2/kGIHGtw+qVabJYjdI5cJOQgXh1A==} - engines: {node: '>=10'} - - conventional-changelog-eslint@3.0.9: - resolution: {integrity: sha512-6NpUCMgU8qmWmyAMSZO5NrRd7rTgErjrm4VASam2u5jrZS0n38V7Y9CzTtLT2qwz5xEChDR4BduoWIr8TfwvXA==} - engines: {node: '>=10'} - - conventional-changelog-express@2.0.6: - resolution: {integrity: sha512-SDez2f3iVJw6V563O3pRtNwXtQaSmEfTCaTBPCqn0oG0mfkq0rX4hHBq5P7De2MncoRixrALj3u3oQsNK+Q0pQ==} - engines: {node: '>=10'} - - conventional-changelog-jquery@3.0.11: - resolution: {integrity: sha512-x8AWz5/Td55F7+o/9LQ6cQIPwrCjfJQ5Zmfqi8thwUEKHstEn4kTIofXub7plf1xvFA2TqhZlq7fy5OmV6BOMw==} - engines: {node: '>=10'} - - conventional-changelog-jshint@2.0.9: - resolution: {integrity: sha512-wMLdaIzq6TNnMHMy31hql02OEQ8nCQfExw1SE0hYL5KvU+JCTuPaDO+7JiogGT2gJAxiUGATdtYYfh+nT+6riA==} - engines: {node: '>=10'} - - conventional-changelog-preset-loader@2.3.4: - resolution: {integrity: sha512-GEKRWkrSAZeTq5+YjUZOYxdHq+ci4dNwHvpaBC3+ENalzFWuCWa9EZXSuZBpkr72sMdKB+1fyDV4takK1Lf58g==} - engines: {node: '>=10'} - - conventional-changelog-writer@5.0.1: - resolution: {integrity: sha512-5WsuKUfxW7suLblAbFnxAcrvf6r+0b7GvNaWUwUIk0bXMnENP/PEieGKVUQrjPqwPT4o3EPAASBXiY6iHooLOQ==} - engines: {node: '>=10'} - hasBin: true - - conventional-changelog@3.1.25: - resolution: {integrity: sha512-ryhi3fd1mKf3fSjbLXOfK2D06YwKNic1nC9mWqybBHdObPd8KJ2vjaXZfYj1U23t+V8T8n0d7gwnc9XbIdFbyQ==} - engines: {node: '>=10'} - - conventional-commit-types@3.0.0: - resolution: {integrity: sha512-SmmCYnOniSsAa9GqWOeLqc179lfr5TRu5b4QFDkbsrJ5TZjPJx85wtOr3zn+1dbeNiXDKGPbZ72IKbPhLXh/Lg==} - - conventional-commits-filter@2.0.7: - resolution: {integrity: sha512-ASS9SamOP4TbCClsRHxIHXRfcGCnIoQqkvAzCSbZzTFLfcTqJVugB0agRgsEELsqaeWgsXv513eS116wnlSSPA==} - engines: {node: '>=10'} - - conventional-commits-parser@3.2.4: - resolution: {integrity: sha512-nK7sAtfi+QXbxHCYfhpZsfRtaitZLIA6889kFIouLvz6repszQDgxBu7wf2WbU+Dco7sAnNCJYERCwt54WPC2Q==} - engines: {node: '>=10'} - hasBin: true - - conventional-commits-parser@5.0.0: - resolution: {integrity: sha512-ZPMl0ZJbw74iS9LuX9YIAiW8pfM5p3yh2o/NbXHbkFuZzY5jvdi5jFycEOkmBW5H5I7nA+D6f3UcsCLP2vvSEA==} - engines: {node: '>=16'} - hasBin: true - - conventional-recommended-bump@6.1.0: - resolution: {integrity: sha512-uiApbSiNGM/kkdL9GTOLAqC4hbptObFo4wW2QRyHsKciGAfQuLU1ShZ1BIVI/+K2BE/W1AWYQMCXAsv4dyKPaw==} - engines: {node: '>=10'} - hasBin: true - - convert-source-map@1.9.0: - resolution: {integrity: sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==} - - convert-source-map@2.0.0: - resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} - - cookie-signature@1.2.1: - resolution: {integrity: sha512-78KWk9T26NhzXtuL26cIJ8/qNHANyJ/ZYrmEXFzUmhZdjpBv+DlWlOANRTGBt48YcyslsLrj0bMLFTmXvLRCOw==} - engines: {node: '>=6.6.0'} - - cookie@0.6.0: - resolution: {integrity: sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==} - 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==} - - cosmiconfig-typescript-loader@5.0.0: - resolution: {integrity: sha512-+8cK7jRAReYkMwMiG+bxhcNKiHJDM6bR9FD/nGBXOWdMLuYawjF5cGrtLilJ+LGd3ZjCXnJjR5DkfWPoIVlqJA==} - engines: {node: '>=v16'} - peerDependencies: - '@types/node': '*' - cosmiconfig: '>=8.2' - typescript: '>=4' - - cosmiconfig@7.1.0: - resolution: {integrity: sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==} - engines: {node: '>=10'} - - cosmiconfig@9.0.0: - resolution: {integrity: sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==} - engines: {node: '>=14'} - peerDependencies: - typescript: '>=4.9.5' - peerDependenciesMeta: - typescript: - optional: true - - create-jest@29.7.0: - resolution: {integrity: sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - hasBin: true - - create-require@1.1.1: - resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==} - - cross-spawn@7.0.3: - resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} - engines: {node: '>= 8'} - - css@2.2.4: - resolution: {integrity: sha512-oUnjmWpy0niI3x/mPL8dVEI1l7MnG3+HHyRPHf+YFSbK+svOhXpmSOcDURUh2aOCgl2grzrOPt1nHLuCVFULLw==} - - cz-conventional-changelog@3.3.0: - resolution: {integrity: sha512-U466fIzU5U22eES5lTNiNbZ+d8dfcHcssH4o7QsdWaCcRs/feIPCxKYSWkYBNs5mny7MvEfwpTLWjvbm94hecw==} - engines: {node: '>= 10'} - - dargs@7.0.0: - resolution: {integrity: sha512-2iy1EkLdlBzQGvbweYRFxmFath8+K7+AKB0TlhHWkNuH+TmovaMH/Wp7V7R4u7f4SnX3OgLsU9t1NI9ioDnUpg==} - engines: {node: '>=8'} - - dargs@8.1.0: - resolution: {integrity: sha512-wAV9QHOsNbwnWdNW2FYvE1P56wtgSbM+3SZcdGiWQILwVjACCXDCI3Ai8QlCjMDB8YK5zySiXZYBiwGmNY3lnw==} - engines: {node: '>=12'} - - dateformat@3.0.3: - resolution: {integrity: sha512-jyCETtSl3VMZMWeRo7iY1FL19ges1t55hMo5yaam4Jrsm5EPL89UQkoQRyiI+Yf4k8r2ZpdngkV8hr1lIdjb3Q==} - - dateformat@4.6.3: - resolution: {integrity: sha512-2P0p0pFGzHS5EMnhdxQi7aJN+iMheud0UhG4dlE1DLAlvL8JHjJJTX/CSm4JXwV0Ka5nGk3zC5mcb5bUQUxxMA==} - - debug-fabulous@0.0.4: - resolution: {integrity: sha512-mmVKpY/O4UIl6ZDn5Owf8jEauO6uQiuF4Jz9iTuflSmvqNm6/64xARk/qCq5ZJxu141Ic2lCmL1TSMHIYoyiTw==} - - debug@2.6.9: - resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true - - debug@4.3.4: - resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} - engines: {node: '>=6.0'} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true - - decamelize-keys@1.1.1: - resolution: {integrity: sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg==} - engines: {node: '>=0.10.0'} - - decamelize@1.2.0: - resolution: {integrity: sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==} - engines: {node: '>=0.10.0'} - - decode-uri-component@0.2.2: - resolution: {integrity: sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==} - engines: {node: '>=0.10'} - - dedent@0.7.0: - resolution: {integrity: sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==} - - dedent@1.5.1: - resolution: {integrity: sha512-+LxW+KLWxu3HW3M2w2ympwtqPrqYRzU8fqi6Fhd18fBALe15blJPI/I4+UHveMVG6lJqB4JNd4UG0S5cnVHwIg==} - peerDependencies: - babel-plugin-macros: ^3.1.0 - peerDependenciesMeta: - babel-plugin-macros: - optional: true - - deep-is@0.1.4: - resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} - - deep-override@1.0.2: - resolution: {integrity: sha512-+bAuLuYqaVVUWPaq8rmU8NLTX85p4I5k5/cVdhBioEfH7k+5NlGdv4NoJVQcJRByqzzTWWzTpih+pU1wBTmMow==} - - deepmerge@4.3.1: - resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} - engines: {node: '>=0.10.0'} - - defaults@1.0.4: - resolution: {integrity: sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==} - - define-data-property@1.1.2: - resolution: {integrity: sha512-SRtsSqsDbgpJBbW3pABMCOt6rQyeM8s8RiyeSN8jYG8sYmt/kGJejbydttUsnDs1tadr19tvhT4ShwMyoqAm4g==} - engines: {node: '>= 0.4'} - - delayed-stream@1.0.0: - resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} - engines: {node: '>=0.4.0'} - - delegates@1.0.0: - resolution: {integrity: sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==} - - depd@2.0.0: - resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} - engines: {node: '>= 0.8'} - - detect-file@1.0.0: - resolution: {integrity: sha512-DtCOLG98P007x7wiiOmfI0fi3eIKyWiLTGJ2MDnVi/E04lWGbf+JzrRHMm0rgIIZJGtHpKpbVgLWHrv8xXpc3Q==} - engines: {node: '>=0.10.0'} - - detect-indent@6.1.0: - resolution: {integrity: sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==} - engines: {node: '>=8'} - - detect-libc@2.0.2: - resolution: {integrity: sha512-UX6sGumvvqSaXgdKGUsgZWqcUyIXZ/vZTrlRT/iobiKhGL0zL4d3osHj3uqllWJK+i+sixDS/3COVEOFbupFyw==} - engines: {node: '>=8'} - - detect-newline@2.1.0: - resolution: {integrity: sha512-CwffZFvlJffUg9zZA0uqrjQayUTC8ob94pnr5sFwaVv3IOmkfUHcWH+jXaQK3askE51Cqe8/9Ql/0uXNwqZ8Zg==} - engines: {node: '>=0.10.0'} - - detect-newline@3.1.0: - resolution: {integrity: sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==} - engines: {node: '>=8'} - - dezalgo@1.0.4: - resolution: {integrity: sha512-rXSP0bf+5n0Qonsb+SVVfNfIsimO4HEtmnIpPHY8Q1UCzKlQrDMfdobr8nJOOsRgWCyMRqeSBQzmWUMq7zvVig==} - - diff-sequences@29.6.3: - resolution: {integrity: sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - - diff@4.0.2: - resolution: {integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==} - 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'} - - dot-prop@5.3.0: - resolution: {integrity: sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==} - engines: {node: '>=8'} - - dot@1.1.3: - resolution: {integrity: sha512-/nt74Rm+PcfnirXGEdhZleTwGC2LMnuKTeeTIlI82xb5loBBoXNYzr2ezCroPSMtilK8EZIfcNZwOcHN+ib1Lg==} - engines: {'0': node >=0.2.6} - hasBin: true - - dotenv-expand@10.0.0: - resolution: {integrity: sha512-GopVGCpVS1UKH75VKHGuQFqS1Gusej0z4FyQkPdwjil2gNIv+LNsqBlboOzpJFZKVT95GkCyWJbBSdFEFUWI2A==} - engines: {node: '>=12'} - - dotenv@16.3.1: - resolution: {integrity: sha512-IPzF4w4/Rd94bA9imS68tZBaYyBWSCE47V1RGuMrB94iyTOIEwRmVL2x/4An+6mETpLrKJ5hQkB8W4kFAadeIQ==} - engines: {node: '>=12'} - - dotgitignore@2.1.0: - resolution: {integrity: sha512-sCm11ak2oY6DglEPpCB8TixLjWAxd3kJTs6UIcSasNYxXdFPV+YKlye92c8H4kKFqV5qYMIh7d+cYecEg0dIkA==} - engines: {node: '>=6'} - - duplexify@3.7.1: - resolution: {integrity: sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==} - - duplexify@4.1.2: - resolution: {integrity: sha512-fz3OjcNCHmRP12MJoZMPglx8m4rrFP8rovnk4vT8Fs+aonZoCwGg10dSsQsfP/E62eZcPTMSMP6686fu9Qlqtw==} - - eastasianwidth@0.2.0: - resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} - - ecdsa-sig-formatter@1.0.11: - resolution: {integrity: sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==} - - electron-to-chromium@1.4.659: - resolution: {integrity: sha512-sRJ3nV3HowrYpBtPF9bASQV7OW49IgZC01Xiq43WfSE3RTCkK0/JidoCmR73Hyc1mN+l/H4Yqx0eNiomvExFZg==} - - emittery@0.13.1: - resolution: {integrity: sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==} - engines: {node: '>=12'} - - emoji-regex@8.0.0: - resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} - - emoji-regex@9.2.2: - resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} - - encoding@0.1.13: - resolution: {integrity: sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==} - - end-of-stream@1.4.4: - resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} - - enhanced-resolve@5.15.0: - resolution: {integrity: sha512-LXYT42KJ7lpIKECr2mAXIaMldcNCh/7E0KBKOu4KSfkHmP+mZmSs+8V5gBAqisWBy0OO4W5Oyys0GO1Y8KtdKg==} - engines: {node: '>=10.13.0'} - - env-paths@2.2.1: - resolution: {integrity: sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==} - engines: {node: '>=6'} - - err-code@2.0.3: - resolution: {integrity: sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==} - - error-ex@1.3.2: - resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} - - es-errors@1.3.0: - resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} - engines: {node: '>= 0.4'} - - es-module-lexer@1.4.1: - resolution: {integrity: sha512-cXLGjP0c4T3flZJKQSuziYoq7MlT+rnvfZjfp7h+I7K9BNX54kP9nyWvdbwjQ4u1iWbOL4u96fgeZLToQlZC7w==} - - escalade@3.1.2: - resolution: {integrity: sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==} - engines: {node: '>=6'} - - 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'} - - escape-string-regexp@4.0.0: - resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} - engines: {node: '>=10'} - - eslint-config-prettier@9.0.0: - resolution: {integrity: sha512-IcJsTkJae2S35pRsRAwoCE+925rJJStOdkKnLVgtE+tEpqU0EVVM7OqrwxqgptKdX29NUwC82I5pXsGFIgSevw==} - hasBin: true - peerDependencies: - eslint: '>=7.0.0' - - eslint-plugin-prettier@5.0.0: - resolution: {integrity: sha512-AgaZCVuYDXHUGxj/ZGu1u8H8CYgDY3iG6w5kUFw4AzMVXzB7VvbKgYR4nATIN+OvUrghMbiDLeimVjVY5ilq3w==} - engines: {node: ^14.18.0 || >=16.0.0} - peerDependencies: - '@types/eslint': '>=8.0.0' - eslint: '>=8.0.0' - eslint-config-prettier: '*' - prettier: '>=3.0.0' - peerDependenciesMeta: - '@types/eslint': - optional: true - eslint-config-prettier: - optional: true - - eslint-scope@5.1.1: - resolution: {integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==} - engines: {node: '>=8.0.0'} - - eslint-scope@7.2.2: - resolution: {integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - - eslint-visitor-keys@3.4.3: - resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - - eslint@8.42.0: - resolution: {integrity: sha512-ulg9Ms6E1WPf67PHaEY4/6E2tEn5/f7FXGzr3t9cBMugOmf1INYvuUwwh1aXQN4MfJ6a5K2iNwP3w4AColvI9A==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - hasBin: true - - espree@9.6.1: - resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - - esprima@4.0.1: - resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} - engines: {node: '>=4'} - hasBin: true - - esquery@1.5.0: - resolution: {integrity: sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==} - engines: {node: '>=0.10'} - - esrecurse@4.3.0: - resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} - engines: {node: '>=4.0'} - - estraverse@4.3.0: - resolution: {integrity: sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==} - engines: {node: '>=4.0'} - - estraverse@5.3.0: - resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} - engines: {node: '>=4.0'} - - esutils@2.0.3: - resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} - engines: {node: '>=0.10.0'} - - event-target-shim@5.0.1: - resolution: {integrity: sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==} - engines: {node: '>=6'} - - eventemitter2@6.4.9: - resolution: {integrity: sha512-JEPTiaOt9f04oa6NOkc4aH+nVp5I3wEjpHbIPqfgCdD5v5bUzy7xQqwcVO2aDQgOWhI28da57HksMrzK9HlRxg==} - - events@3.3.0: - 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'} - - execa@8.0.1: - resolution: {integrity: sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==} - engines: {node: '>=16.17'} - - exit@0.1.2: - resolution: {integrity: sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==} - engines: {node: '>= 0.8.0'} - - expand-brackets@0.1.5: - resolution: {integrity: sha512-hxx03P2dJxss6ceIeri9cmYOT4SRs3Zk3afZwWpOsRqLqprhTR8u++SlC+sFGsQr7WGFPdMF7Gjc1njDLDK6UA==} - engines: {node: '>=0.10.0'} - - expand-range@1.8.2: - resolution: {integrity: sha512-AFASGfIlnIbkKPQwX1yHaDjFvh/1gyKJODme52V6IORh69uEYgZp0o9C+qsIGNVEiuuhQU0CSSl++Rlegg1qvA==} - engines: {node: '>=0.10.0'} - - expand-tilde@2.0.2: - resolution: {integrity: sha512-A5EmesHW6rfnZ9ysHQjPdJRni0SRar0tjtG5MNtm9n5TUvsYU8oozprtRD4AqHxcZWWlVuAmQo2nWKfN9oyjTw==} - engines: {node: '>=0.10.0'} - - expect@29.7.0: - resolution: {integrity: sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - - exponential-backoff@3.1.1: - resolution: {integrity: sha512-dX7e/LHVJ6W3DE1MHWi9S1EYzDESENfLrYohG2G++ovZrYOkm4Knwa0mc1cn84xJOR4KEU0WSchhLbd0UklbHw==} - - extend-shallow@2.0.1: - resolution: {integrity: sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==} - engines: {node: '>=0.10.0'} - - extend@3.0.2: - resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} - - external-editor@3.1.0: - resolution: {integrity: sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==} - engines: {node: '>=4'} - - extglob@0.3.2: - resolution: {integrity: sha512-1FOj1LOwn42TMrruOHGt18HemVnbwAmAak7krWk+wa93KXxGbK+2jpezm+ytJYDaBX0/SPLZFHKM7m+tKobWGg==} - engines: {node: '>=0.10.0'} - - fast-content-type-parse@1.1.0: - resolution: {integrity: sha512-fBHHqSTFLVnR61C+gltJuE5GkVQMV0S2nqUO8TJ+5Z3qAKG8vAx4FKai1s5jq/inV1+sREynIWSuQ6HgoSXpDQ==} - - fast-copy@3.0.1: - resolution: {integrity: sha512-Knr7NOtK3HWRYGtHoJrjkaWepqT8thIVGAwt0p0aUs1zqkAzXZV4vo9fFNwyb5fcqK1GKYFYxldQdIDVKhUAfA==} - - fast-decode-uri-component@1.0.1: - resolution: {integrity: sha512-WKgKWg5eUxvRZGwW8FvfbaH7AXSh2cL+3j5fMGzUMCxWBJ3dV3a7Wz8y2f/uQ0e3B6WmodD3oS54jTQ9HVTIIg==} - - fast-deep-equal@3.1.3: - resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} - - fast-diff@1.3.0: - resolution: {integrity: sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==} - - fast-glob@3.3.2: - resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==} - engines: {node: '>=8.6.0'} - - fast-json-stable-stringify@2.1.0: - resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} - - fast-json-stringify@5.12.0: - resolution: {integrity: sha512-7Nnm9UPa7SfHRbHVA1kJQrGXCRzB7LMlAAqHXQFkEQqueJm1V8owm0FsE/2Do55/4CcdhwiLQERaKomOnKQkyA==} - - fast-levenshtein@2.0.6: - resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} - - fast-querystring@1.1.2: - resolution: {integrity: sha512-g6KuKWmFXc0fID8WWH0jit4g0AGBoJhCkJMb1RmbsSEUNvQ+ZC8D6CUZ+GtF8nMzSPXnhiePyyqqipzNNEnHjg==} - - fast-redact@3.3.0: - resolution: {integrity: sha512-6T5V1QK1u4oF+ATxs1lWUmlEk6P2T9HqJG3e2DnHOdVgZy2rFJBoEnrIedcTXlkAHU/zKC+7KETJ+KGGKwxgMQ==} - engines: {node: '>=6'} - - fast-safe-stringify@2.1.1: - resolution: {integrity: sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==} - - fast-uri@2.3.0: - resolution: {integrity: sha512-eel5UKGn369gGEWOqBShmFJWfq/xSJvsgDzgLYC845GneayWvXBf0lJCBn5qTABfewy1ZDPoaR5OZCP+kssfuw==} - - fastify-ip@1.0.0: - resolution: {integrity: sha512-ht6hS48UDmdHd9jARn2BphJUgw5u/nm8ItO9EceM2uSVhlusrkF07CfNvpuJHxFX8Nx+Eik/VJz0QzxOn3KMJA==} - engines: {node: '>=18.x'} - - fastify-plugin@4.5.1: - resolution: {integrity: sha512-stRHYGeuqpEZTL1Ef0Ovr2ltazUT9g844X5z/zEBFLG8RYlpDiOCIG+ATvYEp+/zmc7sN29mcIMp8gvYplYPIQ==} - - fastify@4.26.2: - resolution: {integrity: sha512-90pjTuPGrfVKtdpLeLzND5nyC4woXZN5VadiNQCicj/iJU4viNHKhsAnb7jmv1vu2IzkLXyBiCzdWuzeXgQ5Ug==} - - fastq@1.17.1: - resolution: {integrity: sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==} - - fb-watchman@2.0.2: - resolution: {integrity: sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==} - - figures@3.2.0: - resolution: {integrity: sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==} - engines: {node: '>=8'} - - file-entry-cache@6.0.1: - resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} - engines: {node: ^10.12.0 || >=12.0.0} - - file-uri-to-path@1.0.0: - resolution: {integrity: sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==} - - filename-regex@2.0.1: - resolution: {integrity: sha512-BTCqyBaWBTsauvnHiE8i562+EdJj+oUpkqWp2R1iCoR8f6oo8STRu3of7WJJ0TqWtxN50a5YFpzYK4Jj9esYfQ==} - engines: {node: '>=0.10.0'} - - fill-range@2.2.4: - resolution: {integrity: sha512-cnrcCbj01+j2gTG921VZPnHbjmdAf8oQV/iGeV2kZxGSyfYjjTyY79ErsK1WJWMpw6DaApEX72binqJE+/d+5Q==} - engines: {node: '>=0.10.0'} - - fill-range@7.0.1: - resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} - engines: {node: '>=8'} - - find-my-way@8.1.0: - resolution: {integrity: sha512-41QwjCGcVTODUmLLqTMeoHeiozbMXYMAE1CKFiDyi9zVZ2Vjh0yz3MF0WQZoIb+cmzP/XlbFjlF2NtJmvZHznA==} - engines: {node: '>=14'} - - find-node-modules@2.1.3: - resolution: {integrity: sha512-UC2I2+nx1ZuOBclWVNdcnbDR5dlrOdVb7xNjmT/lHE+LsgztWks3dG7boJ37yTS/venXw84B/mAW9uHVoC5QRg==} - - find-root@1.1.0: - resolution: {integrity: sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==} - - find-up@1.1.2: - resolution: {integrity: sha512-jvElSjyuo4EMQGoTwo1uJU5pQMwTW5lS1x05zzfJuTIyLR3zwO27LYrxNg+dlvKpGOuGy/MzBdXh80g0ve5+HA==} - engines: {node: '>=0.10.0'} - - find-up@2.1.0: - resolution: {integrity: sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ==} - engines: {node: '>=4'} - - find-up@3.0.0: - resolution: {integrity: sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==} - engines: {node: '>=6'} - - find-up@4.1.0: - resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} - engines: {node: '>=8'} - - find-up@5.0.0: - resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} - engines: {node: '>=10'} - - find-up@7.0.0: - resolution: {integrity: sha512-YyZM99iHrqLKjmt4LJDj58KI+fYyufRLBSYcqycxf//KpBk9FoewoGX0450m9nB44qrZnovzC2oeP5hUibxc/g==} - engines: {node: '>=18'} - - findup-sync@4.0.0: - resolution: {integrity: sha512-6jvvn/12IC4quLBL1KNokxC7wWTvYncaVUYSoxWw7YykPLuRrnv4qdHcSOywOI5RpkOVGeQRtWM8/q+G6W6qfQ==} - engines: {node: '>= 8'} - - first-chunk-stream@1.0.0: - resolution: {integrity: sha512-ArRi5axuv66gEsyl3UuK80CzW7t56hem73YGNYxNWTGNKFJUadSb9Gu9SHijYEUi8ulQMf1bJomYNwSCPHhtTQ==} - engines: {node: '>=0.10.0'} - - flat-cache@3.2.0: - resolution: {integrity: sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==} - engines: {node: ^10.12.0 || >=12.0.0} - - flatted@3.2.9: - resolution: {integrity: sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==} - - follow-redirects@1.15.5: - resolution: {integrity: sha512-vSFWUON1B+yAw1VN4xMfxgn5fTUiaOzAJCKBwIIgT/+7CuGy9+r+5gITvP62j3RmaD5Ph65UaERdOSRGUzZtgw==} - engines: {node: '>=4.0'} - peerDependencies: - debug: '*' - peerDependenciesMeta: - debug: - optional: true - - for-in@1.0.2: - resolution: {integrity: sha512-7EwmXrOjyL+ChxMhmG5lnW9MPt1aIeZEwKhQzoBUdTV0N3zuwWDZYVJatDvZ2OyzPUvdIAZDsCetk3coyMfcnQ==} - engines: {node: '>=0.10.0'} - - for-own@0.1.5: - resolution: {integrity: sha512-SKmowqGTJoPzLO1T0BBJpkfp3EMacCMOuH40hOUbrbzElVktk4DioXVM99QkLCyKoiuOmyjgcWMpVz2xjE7LZw==} - engines: {node: '>=0.10.0'} - - foreground-child@3.1.1: - resolution: {integrity: sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==} - 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'} - peerDependencies: - typescript: '>3.6.0' - webpack: ^5.11.0 - - form-data-lite@1.0.3: - resolution: {integrity: sha512-P7xPqAiOPKzC9Q9aywAZJCQq4QOE5WokPb3HrcWRh7C57RKytueJzoORZAVgHBNvK/lL7E+FxjQjd4X/zbecEQ==} - - form-data@4.0.0: - resolution: {integrity: sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==} - engines: {node: '>= 6'} - - formidable@2.1.2: - resolution: {integrity: sha512-CM3GuJ57US06mlpQ47YcunuUZ9jpm8Vx+P2CGt2j7HpgkKZO/DJYQ0Bobim8G6PFQmK5lOqOOdUXboU+h73A4g==} - - forwarded@0.2.0: - resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==} - engines: {node: '>= 0.6'} - - from2@2.3.0: - resolution: {integrity: sha512-OMcX/4IC/uqEPVgGeyfN22LJk6AZrMkRZHxcHBMBvHScDGgwTm2GT2Wkgtocyd3JfZffjj2kYUDXXII0Fk9W0g==} - - fs-extra@10.1.0: - resolution: {integrity: sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==} - engines: {node: '>=12'} - - fs-extra@9.1.0: - resolution: {integrity: sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==} - engines: {node: '>=10'} - - fs-minipass@2.1.0: - resolution: {integrity: sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==} - engines: {node: '>= 8'} - - fs-monkey@1.0.5: - resolution: {integrity: sha512-8uMbBjrhzW76TYgEV27Y5E//W2f/lTFmx78P2w19FZSxarhI/798APGQyuGCwmkNxgwGRhrLfvWyLBvNtuOmew==} - - fs.realpath@1.0.0: - resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} - - fsevents@2.3.3: - resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} - engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} - os: [darwin] - - function-bind@1.1.2: - resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} - - gauge@3.0.2: - resolution: {integrity: sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==} - engines: {node: '>=10'} - - gauge@4.0.4: - resolution: {integrity: sha512-f9m+BEN5jkg6a0fZjleidjN51VE1X+mPFQ2DJ0uv1V39oCLCbsGe6yjbBnp7eK7z/+GAon99a3nHuqbuuthyPg==} - engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} - - gensync@1.0.0-beta.2: - resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} - engines: {node: '>=6.9.0'} - - get-caller-file@2.0.5: - resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} - engines: {node: 6.* || 8.* || >= 10.*} - - get-intrinsic@1.2.4: - resolution: {integrity: sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==} - engines: {node: '>= 0.4'} - - get-package-type@0.1.0: - resolution: {integrity: sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==} - engines: {node: '>=8.0.0'} - - get-pkg-repo@4.2.1: - resolution: {integrity: sha512-2+QbHjFRfGB74v/pYWjd5OhU3TDIC2Gv/YKUTk/tCvAz0pkn/Mz6P3uByuBimLOcPvN2jYdScl3xGFSrx0jEcA==} - engines: {node: '>=6.9.0'} - hasBin: true - - 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'} - - get-stream@8.0.1: - resolution: {integrity: sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==} - engines: {node: '>=16'} - - git-raw-commits@2.0.11: - resolution: {integrity: sha512-VnctFhw+xfj8Va1xtfEqCUD2XDrbAPSJx+hSrE5K7fGdjZruW7XV+QOrN7LF/RJyvspRiD2I0asWsxFp0ya26A==} - engines: {node: '>=10'} - hasBin: true - - git-raw-commits@4.0.0: - resolution: {integrity: sha512-ICsMM1Wk8xSGMowkOmPrzo2Fgmfo4bMHLNX6ytHjajRJUqvHOw/TFapQ+QG75c3X/tTDDhOSRPGC52dDbNM8FQ==} - engines: {node: '>=16'} - hasBin: true - - git-remote-origin-url@2.0.0: - resolution: {integrity: sha512-eU+GGrZgccNJcsDH5LkXR3PB9M958hxc7sbA8DFJjrv9j4L2P/eZfKhM+QD6wyzpiv+b1BpK0XrYCxkovtjSLw==} - engines: {node: '>=4'} - - git-semver-tags@4.1.1: - resolution: {integrity: sha512-OWyMt5zBe7xFs8vglMmhM9lRQzCWL3WjHtxNNfJTMngGym7pC1kh8sP6jevfydJ6LP3ZvGxfb6ABYgPUM0mtsA==} - engines: {node: '>=10'} - hasBin: true - - gitconfiglocal@1.0.0: - resolution: {integrity: sha512-spLUXeTAVHxDtKsJc8FkFVgFtMdEN9qPGpL23VfSHx4fP4+Ds097IXLvymbnDH8FnmxX5Nr9bPw3A+AQ6mWEaQ==} - - glob-base@0.3.0: - resolution: {integrity: sha512-ab1S1g1EbO7YzauaJLkgLp7DZVAqj9M/dvKlTt8DkXA2tiOIcSMrlVI2J1RZyB5iJVccEscjGn+kpOG9788MHA==} - engines: {node: '>=0.10.0'} - - glob-parent@2.0.0: - resolution: {integrity: sha512-JDYOvfxio/t42HKdxkAYaCiBN7oYiuxykOxKxdaUW5Qn0zaYN3gRQWolrwdnf0shM9/EP0ebuuTmyoXNr1cC5w==} - - glob-parent@3.1.0: - resolution: {integrity: sha512-E8Ak/2+dZY6fnzlR7+ueWvhsH1SjHr4jjss4YS/h4py44jY9MhK/VFdaZJAWDz6BbL21KeteKxFSFpq8OS5gVA==} - - 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'} - - glob-stream@5.3.5: - resolution: {integrity: sha512-piN8XVAO2sNxwVLokL4PswgJvK/uQ6+awwXUVRTGF+rRfgCZpn4hOqxiRuTEbU/k3qgKl0DACYQ/0Sge54UMQg==} - engines: {node: '>= 0.10'} - - glob-to-regexp@0.4.1: - resolution: {integrity: sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==} - - glob@10.3.10: - resolution: {integrity: sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==} - engines: {node: '>=16 || 14 >=14.17'} - hasBin: true - - glob@5.0.15: - resolution: {integrity: sha512-c9IPMazfRITpmAAKi22dK1VKxGDX9ehhqfABDriL/lzO92xcUKEJPQHrVA/2YHSNFB4iFlykVmWvwo48nr3OxA==} - - glob@7.2.3: - resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} - - glob@8.1.0: - resolution: {integrity: sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==} - engines: {node: '>=12'} - - glob@9.3.5: - resolution: {integrity: sha512-e1LleDykUz2Iu+MTYdkSsuWX8lvAjAcs0Xef0lNIu0S2wOAzuTxCJtcd9S3cijlwYF18EsU3rzb8jPVobxDh9Q==} - engines: {node: '>=16 || 14 >=14.17'} - - global-directory@4.0.1: - resolution: {integrity: sha512-wHTUcDUoZ1H5/0iVqEudYW4/kAlN5cZ3j/bXn0Dpbizl9iaUVeWSHqiOjsgk6OW2bkLclbBjzewBz6weQ1zA2Q==} - engines: {node: '>=18'} - - global-modules@1.0.0: - resolution: {integrity: sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==} - engines: {node: '>=0.10.0'} - - global-prefix@1.0.2: - resolution: {integrity: sha512-5lsx1NUDHtSjfg0eHlmYvZKv8/nVqX4ckFbM+FrGcQ+04KWcWFo9P5MxPZYSzUvyzmdTbI7Eix8Q4IbELDqzKg==} - engines: {node: '>=0.10.0'} - - globals@11.12.0: - resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} - engines: {node: '>=4'} - - globals@13.24.0: - resolution: {integrity: sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==} - engines: {node: '>=8'} - - globby@11.1.0: - resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} - engines: {node: '>=10'} - - gopd@1.0.1: - resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==} - - graceful-fs@4.2.11: - resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} - - grapheme-splitter@1.0.4: - resolution: {integrity: sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==} - - graphemer@1.4.0: - resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} - - gulp-sourcemaps@1.12.1: - resolution: {integrity: sha512-2NYnMpB67LJhc36sEv+hNY05UOy1lD9DPtLi+en4hbGH+085G9Zzh3cet2VEqrDlQrLk9Eho0MM9dZ3Z+dL0XA==} - engines: {node: '>=0.10.0'} - - handlebars@4.7.8: - resolution: {integrity: sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==} - engines: {node: '>=0.4.7'} - hasBin: true - - hard-rejection@2.1.0: - resolution: {integrity: sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==} - engines: {node: '>=6'} - - has-ansi@2.0.0: - resolution: {integrity: sha512-C8vBJ8DwUCx19vhm7urhTuUsr4/IyP6l4VzNQDv+ryHQObW3TTTp9yB68WpYgRe2bbaGuZ/se74IqFeVnMnLZg==} - engines: {node: '>=0.10.0'} - - has-flag@3.0.0: - resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} - engines: {node: '>=4'} - - has-flag@4.0.0: - resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} - engines: {node: '>=8'} - - has-own-prop@2.0.0: - resolution: {integrity: sha512-Pq0h+hvsVm6dDEa8x82GnLSYHOzNDt7f0ddFa3FqcQlgzEiptPqL+XrOJNavjOzSYiYWIrgeVYYgGlLmnxwilQ==} - engines: {node: '>=8'} - - has-property-descriptors@1.0.1: - resolution: {integrity: sha512-VsX8eaIewvas0xnvinAe9bw4WfIeODpGYikiWYLH+dma0Jw6KHYqWiWfhQlgOVK8D6PvjubK5Uc4P0iIhIcNVg==} - - has-proto@1.0.1: - resolution: {integrity: sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==} - engines: {node: '>= 0.4'} - - has-symbols@1.0.3: - resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==} - engines: {node: '>= 0.4'} - - has-unicode@2.0.1: - resolution: {integrity: sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==} - - hasown@2.0.0: - resolution: {integrity: sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==} - engines: {node: '>= 0.4'} - - helmet@7.1.0: - resolution: {integrity: sha512-g+HZqgfbpXdCkme/Cd/mZkV0aV3BZZZSugecH03kl38m/Kmdx8jKjBikpDj2cr+Iynv4KpYEviojNdTJActJAg==} - engines: {node: '>=16.0.0'} - - help-me@5.0.0: - resolution: {integrity: sha512-7xgomUX6ADmcYzFik0HzAxh/73YlKR9bmFzf51CZwR+b6YtzU2m0u49hQCqV6SvlqIqsaxovfwdvbnsw3b/zpg==} - - hexoid@1.0.0: - resolution: {integrity: sha512-QFLV0taWQOZtvIRIAdBChesmogZrtuXvVWsFHZTk2SU+anspqZ2vMnoLg7IE1+Uk16N19APic1BuF8bC8c2m5g==} - engines: {node: '>=8'} - - homedir-polyfill@1.0.3: - resolution: {integrity: sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==} - engines: {node: '>=0.10.0'} - - hosted-git-info@2.8.9: - resolution: {integrity: sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==} - - hosted-git-info@4.1.0: - resolution: {integrity: sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==} - engines: {node: '>=10'} - - html-escaper@2.0.2: - resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==} - - http-cache-semantics@4.1.1: - resolution: {integrity: sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==} - - http-errors@2.0.0: - resolution: {integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==} - engines: {node: '>= 0.8'} - - http-proxy-agent@5.0.0: - resolution: {integrity: sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==} - engines: {node: '>= 6'} - - https-proxy-agent@5.0.1: - resolution: {integrity: sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==} - engines: {node: '>= 6'} - - 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'} - - human-signals@5.0.0: - resolution: {integrity: sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==} - engines: {node: '>=16.17.0'} - - humanize-ms@1.2.1: - resolution: {integrity: sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==} - - husky@9.0.11: - resolution: {integrity: sha512-AB6lFlbwwyIqMdHYhwPe+kjOC3Oc5P3nThEoW/AaO2BX3vJDjWPFxYLxokUZOo6RNX20He3AaT8sESs9NJcmEw==} - 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'} - - ieee754@1.2.1: - resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} - - ignore@5.3.1: - resolution: {integrity: sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==} - engines: {node: '>= 4'} - - import-fresh@3.3.0: - resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} - engines: {node: '>=6'} - - import-local@3.1.0: - resolution: {integrity: sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==} - engines: {node: '>=8'} - hasBin: true - - import-meta-resolve@4.0.0: - resolution: {integrity: sha512-okYUR7ZQPH+efeuMJGlq4f8ubUgO50kByRPyt/Cy1Io4PSRsPjxME+YlVaCOx+NIToW7hCsZNFJyTPFFKepRSA==} - - imurmurhash@0.1.4: - resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} - engines: {node: '>=0.8.19'} - - indent-string@4.0.0: - resolution: {integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==} - engines: {node: '>=8'} - - infer-owner@1.0.4: - resolution: {integrity: sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==} - - inflight@1.0.6: - resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} - - inherits@2.0.4: - resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} - - ini@1.3.8: - resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} - - ini@4.1.1: - resolution: {integrity: sha512-QQnnxNyfvmHFIsj7gkPcYymR8Jdw/o7mp5ZFihxn6h8Ci6fh3Dx4E1gPjpQEpIuPo9XVNY/ZUwh4BPMjGyL01g==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - - 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'} - - interpret@1.4.0: - resolution: {integrity: sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==} - engines: {node: '>= 0.10'} - - into-stream@6.0.0: - resolution: {integrity: sha512-XHbaOAvP+uFKUFsOgoNPRjLkwB+I22JFPFe5OjTkQ0nwgj6+pSjb4NmB6VMxaPshLiOf+zcpOCBQuLwC1KHhZA==} - engines: {node: '>=10'} - - invert-kv@1.0.0: - resolution: {integrity: sha512-xgs2NH9AE66ucSq4cNG1nhSFghr5l6tdL15Pk+jl46bmmBapgoaY/AacXyaDznAqmGL99TiLSQgO/XazFSKYeQ==} - engines: {node: '>=0.10.0'} - - ip-address@9.0.5: - resolution: {integrity: sha512-zHtQzGojZXTwZTHQqra+ETKd4Sn3vgi7uBmlPoXVWZqYvuKmtI0l/VZTjqGmJY9x88GGOaZ9+G9ES8hC4T4X8g==} - engines: {node: '>= 12'} - - ipaddr.js@1.9.1: - resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==} - engines: {node: '>= 0.10'} - - is-arrayish@0.2.1: - resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} - - is-binary-path@2.1.0: - resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} - engines: {node: '>=8'} - - is-buffer@1.1.6: - resolution: {integrity: sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==} - - is-core-module@2.13.1: - resolution: {integrity: sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==} - - is-dotfile@1.0.3: - resolution: {integrity: sha512-9YclgOGtN/f8zx0Pr4FQYMdibBiTaH3sn52vjYip4ZSf6C4/6RfTEZ+MR4GvKhCxdPh21Bg42/WL55f6KSnKpg==} - engines: {node: '>=0.10.0'} - - is-equal-shallow@0.1.3: - resolution: {integrity: sha512-0EygVC5qPvIyb+gSz7zdD5/AAoS6Qrx1e//6N4yv4oNm30kqvdmG66oZFWVlQHUWe5OjP08FuTw2IdT0EOTcYA==} - engines: {node: '>=0.10.0'} - - is-extendable@0.1.1: - resolution: {integrity: sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==} - engines: {node: '>=0.10.0'} - - is-extglob@1.0.0: - resolution: {integrity: sha512-7Q+VbVafe6x2T+Tu6NcOf6sRklazEPmBoB3IWk3WdGZM2iGUwU/Oe3Wtq5lSEkDTTlpp8yx+5t4pzO/i9Ty1ww==} - engines: {node: '>=0.10.0'} - - is-extglob@2.1.1: - resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} - engines: {node: '>=0.10.0'} - - is-fullwidth-code-point@1.0.0: - resolution: {integrity: sha512-1pqUqRjkhPJ9miNq9SwMfdvi6lBJcd6eFxvfaivQhaH3SgisfiuudvFntdKOmxuee/77l+FPjKrQjWvmPjWrRw==} - engines: {node: '>=0.10.0'} - - is-fullwidth-code-point@3.0.0: - resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} - engines: {node: '>=8'} - - is-generator-fn@2.1.0: - resolution: {integrity: sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==} - engines: {node: '>=6'} - - is-glob@2.0.1: - resolution: {integrity: sha512-a1dBeB19NXsf/E0+FHqkagizel/LQw2DjSQpvQrj3zT+jYPpaUCryPnrQajXKFLCMuf4I6FhRpaGtw4lPrG6Eg==} - engines: {node: '>=0.10.0'} - - is-glob@3.1.0: - resolution: {integrity: sha512-UFpDDrPgM6qpnFNI+rh/p3bUaq9hKLZN8bMUWzxmcnZVS3omf4IPK+BrewlnWjO1WmUsMYuSjKh4UJuV4+Lqmw==} - engines: {node: '>=0.10.0'} - - is-glob@4.0.3: - resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} - engines: {node: '>=0.10.0'} - - is-interactive@1.0.0: - resolution: {integrity: sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==} - engines: {node: '>=8'} - - is-lambda@1.0.1: - resolution: {integrity: sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ==} - - is-number@2.1.0: - resolution: {integrity: sha512-QUzH43Gfb9+5yckcrSA0VBDwEtDUchrk4F6tfJZQuNzDJbEDB9cZNzSfXGQ1jqmdDY/kl41lUOWM9syA8z8jlg==} - engines: {node: '>=0.10.0'} - - is-number@4.0.0: - resolution: {integrity: sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==} - engines: {node: '>=0.10.0'} - - is-number@7.0.0: - resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} - engines: {node: '>=0.12.0'} - - is-obj@2.0.0: - resolution: {integrity: sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==} - engines: {node: '>=8'} - - is-path-inside@3.0.3: - resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} - engines: {node: '>=8'} - - is-plain-obj@1.1.0: - resolution: {integrity: sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==} - engines: {node: '>=0.10.0'} - - is-posix-bracket@0.1.1: - resolution: {integrity: sha512-Yu68oeXJ7LeWNmZ3Zov/xg/oDBnBK2RNxwYY1ilNJX+tKKZqgPK+qOn/Gs9jEu66KDY9Netf5XLKNGzas/vPfQ==} - engines: {node: '>=0.10.0'} - - is-primitive@2.0.0: - resolution: {integrity: sha512-N3w1tFaRfk3UrPfqeRyD+GYDASU3W5VinKhlORy8EWVf/sIdDL9GAcew85XmktCfH+ngG7SRXEVDoO18WMdB/Q==} - engines: {node: '>=0.10.0'} - - is-stream@1.1.0: - resolution: {integrity: sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==} - engines: {node: '>=0.10.0'} - - is-stream@2.0.1: - resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} - engines: {node: '>=8'} - - is-stream@3.0.0: - resolution: {integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - - is-text-path@1.0.1: - resolution: {integrity: sha512-xFuJpne9oFz5qDaodwmmG08e3CawH/2ZV8Qqza1Ko7Sk8POWbkRdwIoAWVhqvq0XeUzANEhKo2n0IXUGBm7A/w==} - engines: {node: '>=0.10.0'} - - is-text-path@2.0.0: - resolution: {integrity: sha512-+oDTluR6WEjdXEJMnC2z6A4FRwFoYuvShVVEGsS7ewc0UTi2QtAKMDJuL4BDEVt+5T7MjFo12RP8ghOM75oKJw==} - engines: {node: '>=8'} - - is-unicode-supported@0.1.0: - resolution: {integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==} - engines: {node: '>=10'} - - is-utf8@0.2.1: - resolution: {integrity: sha512-rMYPYvCzsXywIsldgLaSoPlw5PfoB/ssr7hY4pLfcodrA5M/eArza1a9VmTiNIBNMjOGr1Ow9mTyU2o69U6U9Q==} - - is-valid-glob@0.3.0: - resolution: {integrity: sha512-CvG8EtJZ8FyzVOGPzrDorzyN65W1Ld8BVnqshRCah6pFIsprGx3dKgFtjLn/Vw9kGqR4OlR84U7yhT9ZVTyWIQ==} - engines: {node: '>=0.10.0'} - - is-windows@1.0.2: - resolution: {integrity: sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==} - engines: {node: '>=0.10.0'} - - isarray@0.0.1: - resolution: {integrity: sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==} - - isarray@1.0.0: - resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} - - isexe@2.0.0: - resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} - - isobject@2.1.0: - resolution: {integrity: sha512-+OUdGJlgjOBZDfxnDjYYG6zp487z0JGNQq3cYQYg5f5hKR+syHMsaztzGeml/4kGG55CSpKSpWTY+jYGgsHLgA==} - engines: {node: '>=0.10.0'} - - istanbul-lib-coverage@3.2.2: - resolution: {integrity: sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==} - engines: {node: '>=8'} - - istanbul-lib-instrument@5.2.1: - resolution: {integrity: sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==} - engines: {node: '>=8'} - - istanbul-lib-instrument@6.0.1: - resolution: {integrity: sha512-EAMEJBsYuyyztxMxW3g7ugGPkrZsV57v0Hmv3mm1uQsmB+QnZuepg731CRaIgeUVSdmsTngOkSnauNF8p7FIhA==} - engines: {node: '>=10'} - - istanbul-lib-report@3.0.1: - resolution: {integrity: sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==} - engines: {node: '>=10'} - - istanbul-lib-source-maps@4.0.1: - resolution: {integrity: sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==} - engines: {node: '>=10'} - - istanbul-reports@3.1.6: - resolution: {integrity: sha512-TLgnMkKg3iTDsQ9PbPTdpfAK2DzjF9mqUG7RMgcQl8oFjad8ob4laGxv5XV5U9MAfx8D6tSJiUyuAwzLicaxlg==} - engines: {node: '>=8'} - - iterare@1.2.1: - resolution: {integrity: sha512-RKYVTCjAnRthyJes037NX/IiqeidgN1xc3j1RjFfECFp28A1GVwK9nA+i0rJPaHqSZwygLzRnFlzUuHFoWWy+Q==} - engines: {node: '>=6'} - - jackspeak@2.3.6: - resolution: {integrity: sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==} - engines: {node: '>=14'} - - jest-changed-files@29.7.0: - resolution: {integrity: sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - - jest-circus@29.7.0: - resolution: {integrity: sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - - jest-cli@29.7.0: - resolution: {integrity: sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - hasBin: true - peerDependencies: - node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 - peerDependenciesMeta: - node-notifier: - optional: true - - jest-config@29.7.0: - resolution: {integrity: sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - peerDependencies: - '@types/node': '*' - ts-node: '>=9.0.0' - peerDependenciesMeta: - '@types/node': - optional: true - ts-node: - optional: true - - jest-diff@29.7.0: - resolution: {integrity: sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - - jest-docblock@29.7.0: - resolution: {integrity: sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - - jest-each@29.7.0: - resolution: {integrity: sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - - jest-environment-node@29.7.0: - resolution: {integrity: sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - - jest-get-type@29.6.3: - resolution: {integrity: sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - - jest-haste-map@29.7.0: - resolution: {integrity: sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - - jest-leak-detector@29.7.0: - resolution: {integrity: sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - - jest-matcher-utils@29.7.0: - resolution: {integrity: sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - - jest-message-util@29.7.0: - resolution: {integrity: sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - - jest-mock@29.7.0: - resolution: {integrity: sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - - jest-pnp-resolver@1.2.3: - resolution: {integrity: sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==} - engines: {node: '>=6'} - peerDependencies: - jest-resolve: '*' - peerDependenciesMeta: - jest-resolve: - optional: true - - jest-regex-util@29.6.3: - resolution: {integrity: sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - - jest-resolve-dependencies@29.7.0: - resolution: {integrity: sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - - jest-resolve@29.7.0: - resolution: {integrity: sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - - jest-runner@29.7.0: - resolution: {integrity: sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - - jest-runtime@29.7.0: - resolution: {integrity: sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - - jest-snapshot@29.7.0: - resolution: {integrity: sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - - jest-util@29.7.0: - resolution: {integrity: sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - - jest-validate@29.7.0: - resolution: {integrity: sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - - jest-watcher@29.7.0: - resolution: {integrity: sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - - jest-worker@27.5.1: - resolution: {integrity: sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==} - engines: {node: '>= 10.13.0'} - - jest-worker@29.7.0: - resolution: {integrity: sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - - jest@29.5.0: - resolution: {integrity: sha512-juMg3he2uru1QoXX078zTa7pO85QyB9xajZc6bU+d9yEGwrKX6+vGmJQ3UdVZsvTEUARIdObzH68QItim6OSSQ==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - hasBin: true - peerDependencies: - node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 - peerDependenciesMeta: - node-notifier: - optional: true - - jiti@1.21.0: - resolution: {integrity: sha512-gFqAIbuKyyso/3G2qhiO2OM6shY6EPP/R0+mkDbyspxKazh8BXDC5FiFsUjlczgdNz/vfra0da2y+aHrusLG/Q==} - hasBin: true - - joycon@3.1.1: - resolution: {integrity: sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw==} - engines: {node: '>=10'} - - js-tokens@4.0.0: - resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} - - js-yaml@3.14.1: - resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==} - hasBin: true - - js-yaml@4.1.0: - resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} - hasBin: true - - jsbn@1.1.0: - resolution: {integrity: sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A==} - - jsesc@2.5.2: - resolution: {integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==} - engines: {node: '>=4'} - hasBin: true - - json-buffer@3.0.1: - resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} - - json-parse-better-errors@1.0.2: - resolution: {integrity: sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==} - - json-parse-even-better-errors@2.3.1: - resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} - - json-query@2.2.2: - resolution: {integrity: sha512-y+IcVZSdqNmS4fO8t1uZF6RMMs0xh3SrTjJr9bp1X3+v0Q13+7Cyv12dSmKwDswp/H427BVtpkLWhGxYu3ZWRA==} - - json-schema-ref-resolver@1.0.1: - resolution: {integrity: sha512-EJAj1pgHc1hxF6vo2Z3s69fMjO1INq6eGHXZ8Z6wCQeldCuwxGK9Sxf4/cScGn3FZubCVUehfWtcDM/PLteCQw==} - - json-schema-traverse@0.4.1: - resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} - - json-schema-traverse@1.0.0: - resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} - - json-stable-stringify-without-jsonify@1.0.1: - resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} - - json-stringify-safe@5.0.1: - resolution: {integrity: sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==} - - json5@2.2.3: - resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} - engines: {node: '>=6'} - hasBin: true - - jsonc-parser@3.0.0: - resolution: {integrity: sha512-fQzRfAbIBnR0IQvftw9FJveWiHp72Fg20giDrHz6TdfB12UH/uue0D3hm57UB5KgAVuniLMCaS8P1IMj9NR7cA==} - - jsonc-parser@3.2.0: - resolution: {integrity: sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==} - - jsonfile@6.1.0: - resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==} - - jsonparse@1.3.1: - resolution: {integrity: sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==} - engines: {'0': node >= 0.2.0} - - jsonrepair@3.7.0: - resolution: {integrity: sha512-TwE50n4P4gdVfMQF2q+X+IGy4ntFfcuHHE8zjRyBcdtrRK0ORZsjOZD6zmdylk4p277nQBAlHgsEPWtMIQk4LQ==} - hasBin: true - - jsonwebtoken@9.0.2: - resolution: {integrity: sha512-PRp66vJ865SSqOlgqS8hujT5U4AOgMfhrwYIuIhfKaoSCZcirrmASQr8CX7cUg+RMih+hgznrjp99o+W4pJLHQ==} - engines: {node: '>=12', npm: '>=6'} - - jwa@1.4.1: - resolution: {integrity: sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==} - - jws@3.2.2: - resolution: {integrity: sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==} - - keyv@4.5.4: - resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} - - kind-of@3.2.2: - resolution: {integrity: sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==} - engines: {node: '>=0.10.0'} - - kind-of@6.0.3: - resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==} - engines: {node: '>=0.10.0'} - - kleur@3.0.3: - resolution: {integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==} - engines: {node: '>=6'} - - kleur@4.1.5: - resolution: {integrity: sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==} - engines: {node: '>=6'} - - klona@2.0.6: - resolution: {integrity: sha512-dhG34DXATL5hSxJbIexCft8FChFXtmskoZYnoPWjXQuebWYCNkVeV3KkGegCK9CP1oswI/vQibS2GY7Em/sJJA==} - engines: {node: '>= 8'} - - lazy-debug-legacy@0.0.1: - resolution: {integrity: sha512-GFWaIBcBjxWWKI5OghwYEsPOR8JFh2xEcc3ZFV0ONYL0oHz0PHINJCfxJyztUq2XzcHncyO7fsRR550Gtfnk6g==} - peerDependencies: - debug: '*' - - lazystream@1.0.1: - resolution: {integrity: sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw==} - engines: {node: '>= 0.6.3'} - - lcid@1.0.0: - resolution: {integrity: sha512-YiGkH6EnGrDGqLMITnGjXtGmNtjoXw9SVUzcaos8RBi7Ps0VBylkq+vOcY9QE5poLasPCR849ucFUkl0UzUyOw==} - engines: {node: '>=0.10.0'} - - leven@3.1.0: - resolution: {integrity: sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==} - engines: {node: '>=6'} - - levn@0.4.1: - resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} - engines: {node: '>= 0.8.0'} - - libphonenumber-js@1.10.58: - resolution: {integrity: sha512-53A0IpJFL9LdHbpeatwizf8KSwPICrqn9H0g3Y7WQ+Jgeu9cQ4Ew3WrRtrLBu/CX2lXd5+rgT01/tGlkbkzOjw==} - - light-my-request@5.12.0: - resolution: {integrity: sha512-P526OX6E7aeCIfw/9UyJNsAISfcFETghysaWHQAlQYayynShT08MOj4c6fBCvTWBrHXSvqBAKDp3amUPSCQI4w==} - - lightcookie@1.0.25: - resolution: {integrity: sha512-SrY/+eBPaKAMnsn7mCsoOMZzoQyCyHHHZlFCu2fjo28XxSyCLjlooKiTxyrXTg8NPaHp1YzWi0lcGG1gDi6KHw==} - deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. - - lines-and-columns@1.2.4: - resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} - - load-json-file@1.1.0: - resolution: {integrity: sha512-cy7ZdNRXdablkXYNI049pthVeXFurRyb9+hA/dZzerZ0pGTx42z+y+ssxBaVV2l70t1muq5IdKhn4UtcoGUY9A==} - engines: {node: '>=0.10.0'} - - load-json-file@4.0.0: - resolution: {integrity: sha512-Kx8hMakjX03tiGTLAIdJ+lL0htKnXjEZN6hk/tozf/WOuYGdZBJrZ+rCJRbVCugsjB3jMLn9746NsQIf5VjBMw==} - engines: {node: '>=4'} - - loader-runner@4.3.0: - resolution: {integrity: sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==} - engines: {node: '>=6.11.5'} - - locate-path@2.0.0: - resolution: {integrity: sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA==} - engines: {node: '>=4'} - - locate-path@3.0.0: - resolution: {integrity: sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==} - engines: {node: '>=6'} - - locate-path@5.0.0: - resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} - engines: {node: '>=8'} - - locate-path@6.0.0: - resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} - engines: {node: '>=10'} - - locate-path@7.2.0: - resolution: {integrity: sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - - lodash._reinterpolate@3.0.0: - resolution: {integrity: sha512-xYHt68QRoYGjeeM/XOE1uJtvXQAgvszfBhjV4yvsQH0u2i9I6cI6c6/eG4Hh3UAOVn0y/xAXwmTzEay49Q//HA==} - - lodash.assign@4.2.0: - resolution: {integrity: sha512-hFuH8TY+Yji7Eja3mGiuAxBqLagejScbG8GbG0j6o9vzn0YL14My+ktnqtZgFTosKymC9/44wP6s7xyuLfnClw==} - - lodash.assigninwith@4.2.0: - resolution: {integrity: sha512-oYOjtZzQnecm7PJcxrDbL20OHv3tTtOQdRBSnlor6s0MO6VOFTOC+JyBIJUNUEzsBi1I0oslWtFAAG6QQbFIWQ==} - - lodash.camelcase@4.3.0: - resolution: {integrity: sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==} - - lodash.clonedeep@4.5.0: - resolution: {integrity: sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ==} - - lodash.includes@4.3.0: - resolution: {integrity: sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w==} - - lodash.isboolean@3.0.3: - resolution: {integrity: sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg==} - - lodash.isequal@4.5.0: - resolution: {integrity: sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==} - - lodash.isinteger@4.0.4: - resolution: {integrity: sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA==} - - lodash.ismatch@4.4.0: - resolution: {integrity: sha512-fPMfXjGQEV9Xsq/8MTSgUf255gawYRbjwMyDbcvDhXgV7enSZA0hynz6vMPnpAb5iONEzBHBPsT+0zes5Z301g==} - - lodash.isnumber@3.0.3: - resolution: {integrity: sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw==} - - lodash.isplainobject@4.0.6: - resolution: {integrity: sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==} - - lodash.isstring@4.0.1: - resolution: {integrity: sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==} - - lodash.kebabcase@4.1.1: - resolution: {integrity: sha512-N8XRTIMMqqDgSy4VLKPnJ/+hpGZN+PHQiJnSenYqPaVV/NCqEogTnAdZLQiGKhxX+JCs8waWq2t1XHWKOmlY8g==} - - lodash.keys@4.2.0: - resolution: {integrity: sha512-J79MkJcp7Df5mizHiVNpjoHXLi4HLjh9VLS/M7lQSGoQ+0oQ+lWEigREkqKyizPB1IawvQLLKY8mzEcm1tkyxQ==} - - lodash.map@4.6.0: - resolution: {integrity: sha512-worNHGKLDetmcEYDvh2stPCrrQRkP20E4l0iIS7F8EvzMqBBi7ltvFN5m1HvTf1P7Jk1txKhvFcmYsCr8O2F1Q==} - - lodash.memoize@4.1.2: - resolution: {integrity: sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==} - - lodash.merge@4.6.2: - resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} - - lodash.mergewith@4.6.2: - resolution: {integrity: sha512-GK3g5RPZWTRSeLSpgP8Xhra+pnjBC56q9FZYe1d5RN3TJ35dbkGy3YqBSMbyCrlbi+CM9Z3Jk5yTL7RCsqboyQ==} - - lodash.once@4.1.1: - resolution: {integrity: sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==} - - lodash.rest@4.0.5: - resolution: {integrity: sha512-hsypEpebNAt0hj1aX9isQqi2CIZoNS1lP6PSWhB3hcMnBivobYzPZRPYq4cr38+RtvrlxQTgaW+sIuHAhBoHrA==} - - lodash.snakecase@4.1.1: - resolution: {integrity: sha512-QZ1d4xoBHYUeuouhEq3lk3Uq7ldgyFXGBhg04+oRLnIz8o9T65Eh+8YdroUwn846zchkA9yDsDl5CVVaV2nqYw==} - - lodash.startcase@4.4.0: - resolution: {integrity: sha512-+WKqsK294HMSc2jEbNgpHpd0JfIBhp7rEV4aqXWqFr6AlXov+SlcgB1Fv01y2kGe3Gc8nMW7VA0SrGuSkRfIEg==} - - lodash.template@4.2.4: - resolution: {integrity: sha512-PmEQ9TtYbeYg6lNwJpSjkp4J4KttYLuKF1C6jeFBidyzbOFu0KvVnLicZBf0sGfScARwgOBqxnV/rWuaqRwang==} - - lodash.templatesettings@4.2.0: - resolution: {integrity: sha512-stgLz+i3Aa9mZgnjr/O+v9ruKZsPsndy7qPZOchbqk2cnTU1ZaldKK+v7m54WoKIyxiuMZTKT2H81F8BeAc3ZQ==} - - lodash.tostring@4.1.4: - resolution: {integrity: sha512-xWHJ0LY7cSz/C/4ghNNiYA1Ong0VLdzAzrjDHvOzN+eJHzDEHme2+k+w/9Pk8dtdwcASMUbxN1/mtj6mFI25Ng==} - - lodash.uniq@4.5.0: - resolution: {integrity: sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==} - - lodash.upperfirst@4.3.1: - resolution: {integrity: sha512-sReKOYJIJf74dhJONhU4e0/shzi1trVbSWDOhKYE5XV2O+H7Sb2Dihwuc7xWxVl+DgFPyTqIN3zMfT9cq5iWDg==} - - lodash@4.17.21: - resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} - - log-symbols@4.1.0: - resolution: {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==} - engines: {node: '>=10'} - - longest@2.0.1: - resolution: {integrity: sha512-Ajzxb8CM6WAnFjgiloPsI3bF+WCxcvhdIG3KNA2KN962+tdBsHcuQ4k4qX/EcS/2CRkcc0iAkR956Nib6aXU/Q==} - engines: {node: '>=0.10.0'} - - lru-cache@10.2.0: - resolution: {integrity: sha512-2bIM8x+VAf6JT4bKAljS1qUWgMsqZRPGJS6FSahIMPVvctcNhyVp7AJu7quxOW9jwkryBReKZY5tY5JYv2n/7Q==} - engines: {node: 14 || >=16.14} - - lru-cache@5.1.1: - resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} - - lru-cache@6.0.0: - resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} - engines: {node: '>=10'} - - lru-cache@7.18.3: - resolution: {integrity: sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==} - engines: {node: '>=12'} - - macos-release@2.5.1: - resolution: {integrity: sha512-DXqXhEM7gW59OjZO8NIjBCz9AQ1BEMrfiOAl4AYByHCtVHRF4KoGNO8mqQeM8lRCtQe/UnJ4imO/d2HdkKsd+A==} - engines: {node: '>=6'} - - magic-string@0.25.7: - resolution: {integrity: sha512-4CrMT5DOHTDk4HYDlzmwu4FVCcIYI8gauveasrdCu2IKIFOJ3f0v/8MDGJCDL9oD2ppz/Av1b0Nj345H9M+XIA==} - - magic-string@0.30.0: - resolution: {integrity: sha512-LA+31JYDJLs82r2ScLrlz1GjSgu66ZV518eyWT+S8VhyQn/JL0u9MeBOvQMGYiPk1DBiSN9DDMOcXvigJZaViQ==} - engines: {node: '>=12'} - - make-dir@3.1.0: - resolution: {integrity: sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==} - engines: {node: '>=8'} - - make-dir@4.0.0: - resolution: {integrity: sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==} - engines: {node: '>=10'} - - make-error@1.3.6: - resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} - - make-fetch-happen@10.2.1: - resolution: {integrity: sha512-NgOPbRiaQM10DYXvN3/hhGVI2M5MtITFryzBGxHM5p4wnFxsVCbxkrBrDsk+EZ5OB4jEOT7AjDxtdF+KVEFT7w==} - engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} - - makeerror@1.0.12: - resolution: {integrity: sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==} - - map-obj@1.0.1: - resolution: {integrity: sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==} - engines: {node: '>=0.10.0'} - - map-obj@4.3.0: - resolution: {integrity: sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==} - engines: {node: '>=8'} - - map-stream@0.0.6: - resolution: {integrity: sha512-RG9wAgznUY0foT30MMfnXh4jS0ObmOuxoGKe/ppYvM55RfquNdIvEEf6e+euczNVVzJIVbkgxg7GJBpYDhQ/Zg==} - - matchit@1.1.0: - resolution: {integrity: sha512-+nGYoOlfHmxe5BW5tE0EMJppXEwdSf8uBA1GTZC7Q77kbT35+VKLYJMzVNWCHSsga1ps1tPYFtFyvxvKzWVmMA==} - engines: {node: '>=6'} - - math-random@1.0.4: - resolution: {integrity: sha512-rUxjysqif/BZQH2yhd5Aaq7vXMSx9NdEsQcyA07uEzIvxgI7zIr33gGsh+RU0/XjmQpCW7RsVof1vlkvQVCK5A==} - - memfs@3.5.3: - resolution: {integrity: sha512-UERzLsxzllchadvbPs5aolHh65ISpKpM+ccLbOJ8/vvpBKmAWf+la7dXFy7Mr0ySHbdHrFv5kGFCUHHe6GFEmw==} - engines: {node: '>= 4.0.0'} - - meow@12.1.1: - resolution: {integrity: sha512-BhXM0Au22RwUneMPwSCnyhTOizdWoIEPU9sp0Aqa1PnDMR5Wv2FGXYDjuzJEIX+Eo2Rb8xuYe5jrnm5QowQFkw==} - engines: {node: '>=16.10'} - - meow@8.1.2: - resolution: {integrity: sha512-r85E3NdZ+mpYk1C6RjPFEMSE+s1iZMuHtsHAqY0DT3jZczl0diWUZ8g6oU7h0M9cD2EL+PzaYghhCLzR0ZNn5Q==} - engines: {node: '>=10'} - - merge-stream@1.0.1: - resolution: {integrity: sha512-e6RM36aegd4f+r8BZCcYXlO2P3H6xbUM6ktL2Xmf45GAOit9bI4z6/3VU7JwllVO1L7u0UDSg/EhzQ5lmMLolA==} - - 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'} - - merge@2.1.1: - resolution: {integrity: sha512-jz+Cfrg9GWOZbQAnDQ4hlVnQky+341Yk5ru8bZSe6sIDTCIg8n9i/u7hSQGSVOF3C7lH6mGtqjkiT9G4wFLL0w==} - - methods@1.1.2: - resolution: {integrity: sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==} - engines: {node: '>= 0.6'} - - micromatch@2.3.11: - resolution: {integrity: sha512-LnU2XFEk9xxSJ6rfgAry/ty5qwUTyHYOBU0g4R6tIw5ljwgGIBmiKhRWLw5NpMOnrgUNcDJ4WMp8rl3sYVHLNA==} - engines: {node: '>=0.10.0'} - - micromatch@4.0.5: - resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} - engines: {node: '>=8.6'} - - mime-db@1.52.0: - resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} - engines: {node: '>= 0.6'} - - mime-lite@1.0.3: - resolution: {integrity: sha512-V85l97zJSTG8FEvmdTlmNYb0UMrVBwvRjw7bWTf/aT6KjFwtz3iTz8D2tuFIp7lwiaO2C5ecnrEmSkkMRCrqVw==} - - mime-types@2.1.35: - resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} - engines: {node: '>= 0.6'} - - mime@2.6.0: - resolution: {integrity: sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==} - engines: {node: '>=4.0.0'} - hasBin: true - - mime@3.0.0: - resolution: {integrity: sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==} - engines: {node: '>=10.0.0'} - hasBin: true - - mimic-fn@2.1.0: - resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} - engines: {node: '>=6'} - - mimic-fn@4.0.0: - resolution: {integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==} - engines: {node: '>=12'} - - min-indent@1.0.1: - resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==} - engines: {node: '>=4'} - - minimatch@3.1.2: - resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} - - minimatch@5.1.6: - resolution: {integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==} - engines: {node: '>=10'} - - minimatch@8.0.4: - resolution: {integrity: sha512-W0Wvr9HyFXZRGIDgCicunpQ299OKXs9RgZfaukz4qAW/pJhcpUfupc9c+OObPOFueNy8VSrZgEmDtk6Kh4WzDA==} - engines: {node: '>=16 || 14 >=14.17'} - - minimatch@9.0.3: - resolution: {integrity: sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==} - engines: {node: '>=16 || 14 >=14.17'} - - minimist-options@4.1.0: - resolution: {integrity: sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==} - engines: {node: '>= 6'} - - minimist@1.2.7: - resolution: {integrity: sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g==} - - minimist@1.2.8: - resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} - - minipass-collect@1.0.2: - resolution: {integrity: sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==} - engines: {node: '>= 8'} - - minipass-fetch@2.1.2: - resolution: {integrity: sha512-LT49Zi2/WMROHYoqGgdlQIZh8mLPZmOrN2NdJjMXxYe4nkN6FUyuPuOAOedNJDrx0IRGg9+4guZewtp8hE6TxA==} - engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} - - minipass-flush@1.0.5: - resolution: {integrity: sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==} - engines: {node: '>= 8'} - - minipass-pipeline@1.2.4: - resolution: {integrity: sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==} - engines: {node: '>=8'} - - minipass-sized@1.0.3: - resolution: {integrity: sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==} - engines: {node: '>=8'} - - minipass@3.3.6: - resolution: {integrity: sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==} - engines: {node: '>=8'} - - minipass@4.2.8: - resolution: {integrity: sha512-fNzuVyifolSLFL4NzpF+wEF4qrgqaaKX0haXPQEdQ7NKAN+WecoKMHV09YcuL/DHxrUsYQOK3MiuDf7Ip2OXfQ==} - engines: {node: '>=8'} - - minipass@5.0.0: - resolution: {integrity: sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==} - engines: {node: '>=8'} - - minipass@7.0.4: - resolution: {integrity: sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==} - engines: {node: '>=16 || 14 >=14.17'} - - minizlib@2.1.2: - resolution: {integrity: sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==} - engines: {node: '>= 8'} - - mkdirp@0.5.6: - resolution: {integrity: sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==} - hasBin: true - - mkdirp@1.0.4: - resolution: {integrity: sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==} - engines: {node: '>=10'} - hasBin: true - - mnemonist@0.39.6: - resolution: {integrity: sha512-A/0v5Z59y63US00cRSLiloEIw3t5G+MiKz4BhX21FI+YBJXBOGW0ohFxTxO08dsOYlzxo87T7vGfZKYp2bcAWA==} - - modify-values@1.0.1: - resolution: {integrity: sha512-xV2bxeN6F7oYjZWTe/YPAy6MN2M+sL4u/Rlm2AHCIVGfo2p1yGmBHQ6vHehl4bRTZBdHu3TSkWdYgkwpYzAGSw==} - engines: {node: '>=0.10.0'} - - module@1.2.5: - resolution: {integrity: sha512-Y+j9HcHf8V6YtNBkLbPmREAUi5xGbAdb9ycXpo2roABDPrJEzd79kmoH5Ib9lpxcNVsHWa1LhRZJcflUq2+N3w==} - hasBin: true - - ms@2.0.0: - resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==} - - ms@2.1.2: - resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} - - ms@2.1.3: - resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} - - mute-stream@0.0.8: - resolution: {integrity: sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==} - - nan@2.19.0: - resolution: {integrity: sha512-nO1xXxfh/RWNxfd/XPfbIfFk5vgLsAxUR9y5O0cHMJu/AW9U95JLXqthYHjEp+8gQ5p96K9jUp8nbVOxCdRbtw==} - - nanoid@3.3.7: - resolution: {integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==} - engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} - hasBin: true - - 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==} - engines: {node: '>= 0.6'} - - neo-async@2.6.2: - resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} - - nestjs-cls@4.2.0: - resolution: {integrity: sha512-sdvdhBmM9eb9d1URtcK7642S3ufD9ZWaKRt4Ouf1gIGmd73YniiKCxxOFwChRqDU+sr7hwxT560JaA27R/7RJQ==} - engines: {node: '>=16'} - peerDependencies: - '@nestjs/common': '> 7.0.0 < 11' - '@nestjs/core': '> 7.0.0 < 11' - reflect-metadata: '*' - rxjs: '>= 7' - - nestjs-oauth2@0.0.7: - resolution: {integrity: sha512-P4HfJziGsMl4+aTclr9vkqfbI84odja1kOjKZw095A+b4ksVczOC4J/AH4BydsIAPVsj/5RJj4aGFoWV90Bu1w==} - peerDependencies: - '@nestjs/common': ^9.0.0 - rxjs: ^7.x - - nestjs-pino@4.0.0: - resolution: {integrity: sha512-XhCg/R+l3w0BFP6MHyR6lU/BHVEV0tV9z24G0vuA9FD3sv+TQNvnO9uVsF1l/oVspgGfQ9Qulmb2UbsfYlI0+g==} - engines: {node: '>= 14'} - peerDependencies: - '@nestjs/common': ^8.0.0 || ^9.0.0 || ^10.0.0 - pino-http: ^6.4.0 || ^7.0.0 || ^8.0.0 || ^9.0.0 - - nestjs-prisma@0.23.0: - resolution: {integrity: sha512-0pIMDasayP+vMFSztcs85zu4WSPTKM85F8vIrqn7GsUBboEcKhI8eCeVghhNyKDGzEBaNAYNJlo2MAWdNuN7Tw==} - peerDependencies: - '@nestjs/common': ^7.0.0 || ^8.0.0 || ^9.0.0 || ^10.0.0 - '@prisma/client': ^2.0.0 || ^3.0.0 || ^4.0.0 || ^5.0.0 - prisma: ^2.0.0 || ^3.0.0 || ^4.0.0 || ^5.0.0 - - node-abort-controller@3.1.1: - resolution: {integrity: sha512-AGK2yQKIjRuqnc6VkX2Xj5d+QW8xZ87pa1UK6yA6ouUyuxfHuMP6umE5QK7UmTeOAymo+Zx1Fxiuw9rVx8taHQ==} - - node-addon-api@5.1.0: - resolution: {integrity: sha512-eh0GgfEkpnoWDq+VY8OyvYhFEzBk6jIYbRKdIlyTiAXIVJ8PyBaKb0rp7oDtoddbdoHWhq8wwr+XZ81F1rpNdA==} - - 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-gyp@9.4.1: - resolution: {integrity: sha512-OQkWKbjQKbGkMf/xqI1jjy3oCTgMKJac58G2+bjZb3fza6gW2YrCSdMQYaoTb70crvE//Gngr4f0AgVHmqHvBQ==} - engines: {node: ^12.13 || ^14.13 || >=16} - hasBin: true - - node-int64@0.4.0: - resolution: {integrity: sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==} - - node-releases@2.0.14: - resolution: {integrity: sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==} - - nopt@5.0.0: - resolution: {integrity: sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==} - engines: {node: '>=6'} - hasBin: true - - nopt@6.0.0: - resolution: {integrity: sha512-ZwLpbTgdhuZUnZzjd7nb1ZV+4DoiC6/sfiVKok72ym/4Tlf+DFdlHYmT2JPmcNNWV6Pi3SDf1kT+A4r9RTuT9g==} - engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} - hasBin: true - - normalize-package-data@2.5.0: - resolution: {integrity: sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==} - - normalize-package-data@3.0.3: - resolution: {integrity: sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==} - engines: {node: '>=10'} - - normalize-path@2.1.1: - resolution: {integrity: sha512-3pKJwH184Xo/lnH6oyP1q2pMd7HcypqqmRs91/6/i2CGtWwIKGCkOOMTm/zXbgTEWHw1uNpNi/igc3ePOYHb6w==} - engines: {node: '>=0.10.0'} - - normalize-path@3.0.0: - resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} - engines: {node: '>=0.10.0'} - - npm-run-path@4.0.1: - resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} - engines: {node: '>=8'} - - npm-run-path@5.3.0: - resolution: {integrity: sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - - npmlog@5.0.1: - resolution: {integrity: sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==} - - npmlog@6.0.2: - resolution: {integrity: sha512-/vBvz5Jfr9dT/aFWd0FIRf+T/Q2WBsLENygUaFUqstqsycmZAP/t5BvFJTK0viFmSUxiUKTUplWy5vt+rvKIxg==} - engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} - - number-is-nan@1.0.1: - resolution: {integrity: sha512-4jbtZXNAsfZbAHiiqjLPBiCl16dES1zI4Hpzzxw61Tk+loF+sBDBKx1ICKKKwIqQ7M0mFn1TmkN7euSncWgHiQ==} - engines: {node: '>=0.10.0'} - - oauth@0.10.0: - resolution: {integrity: sha512-1orQ9MT1vHFGQxhuy7E/0gECD3fd2fCC+PIX+/jgmU/gI3EpRocXtmtvxCO5x3WZ443FLTLFWNDjl5MPJf9u+Q==} - - object-assign@4.1.0: - resolution: {integrity: sha512-Lbc7GfN7XFaK30bzUN3cDYLOkT0dH05S0ax1QikylHUD9+Z9PRF3G1iYwX3kcz+6AlzTFGkUgMxz6l3aUwbwTA==} - engines: {node: '>=0.10.0'} - - object-assign@4.1.1: - resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} - engines: {node: '>=0.10.0'} - - object-inspect@1.13.1: - resolution: {integrity: sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==} - - object.omit@2.0.1: - resolution: {integrity: sha512-UiAM5mhmIuKLsOvrL+B0U2d1hXHF3bFYWIuH1LMpuV2EJEHG1Ntz06PgLEHjm6VFd87NpH8rastvPoyv6UW2fA==} - engines: {node: '>=0.10.0'} - - obliterator@2.0.4: - resolution: {integrity: sha512-lgHwxlxV1qIg1Eap7LgIeoBWIMFibOjbrYPIPJZcI1mmGAI2m3lNYpK12Y+GBdPQ0U1hRwSord7GIaawz962qQ==} - - on-exit-leak-free@2.1.2: - resolution: {integrity: sha512-0eJJY6hXLGf1udHwfNftBqH+g73EU4B504nZeKpz1sYRKafAghwxEJunB2O7rDZkL4PGfsMVnTXZ2EjibbqcsA==} - engines: {node: '>=14.0.0'} - - once@1.4.0: - resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} - - onetime@5.1.2: - resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} - engines: {node: '>=6'} - - onetime@6.0.0: - resolution: {integrity: sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==} - engines: {node: '>=12'} - - openapi-fuzzer-core@1.0.6: - resolution: {integrity: sha512-FJNJIfgUFuv4NmVGq9MYdoKra2GrkDy2uhIjE2YGlw30UA1glf4SXLMhI4UwdcJ8jisKdIxi7lXrfej8GvNW5w==} - - optionator@0.9.3: - resolution: {integrity: sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==} - engines: {node: '>= 0.8.0'} - - ora@5.4.1: - resolution: {integrity: sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==} - engines: {node: '>=10'} - - ordered-read-streams@0.3.0: - resolution: {integrity: sha512-xQvd8qvx9U1iYY9aVqPpoF5V9uaWJKV6ZGljkh/jkiNX0DiQsjbWvRumbh10QTMDE8DheaOEU8xi0szbrgjzcw==} - - os-homedir@1.0.2: - resolution: {integrity: sha512-B5JU3cabzk8c67mRRd3ECmROafjYMXbuzlwtqdM8IbS8ktlTix8aFGb2bAGKrSRIlnfKwovGUUr72JUPyOb6kQ==} - engines: {node: '>=0.10.0'} - - os-locale@1.4.0: - resolution: {integrity: sha512-PRT7ZORmwu2MEFt4/fv3Q+mEfN4zetKxufQrkShY2oGvUms9r8otu5HfdyIFHkYXjO7laNsoVGmM2MANfuTA8g==} - engines: {node: '>=0.10.0'} - - 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'} - - p-is-promise@3.0.0: - resolution: {integrity: sha512-Wo8VsW4IRQSKVXsJCn7TomUaVtyfjVDn3nUP7kE967BQk0CwFpdbZs0X0uk5sW9mkBa9eNM7hCMaG93WUAwxYQ==} - engines: {node: '>=8'} - - p-limit@1.3.0: - resolution: {integrity: sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==} - engines: {node: '>=4'} - - p-limit@2.3.0: - resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} - engines: {node: '>=6'} - - p-limit@3.1.0: - resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} - engines: {node: '>=10'} - - p-limit@4.0.0: - resolution: {integrity: sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - - p-locate@2.0.0: - resolution: {integrity: sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg==} - engines: {node: '>=4'} - - p-locate@3.0.0: - resolution: {integrity: sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==} - engines: {node: '>=6'} - - p-locate@4.1.0: - resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} - engines: {node: '>=8'} - - p-locate@5.0.0: - resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} - engines: {node: '>=10'} - - p-locate@6.0.0: - resolution: {integrity: sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - - p-map@4.0.0: - resolution: {integrity: sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==} - engines: {node: '>=10'} - - p-try@1.0.0: - resolution: {integrity: sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww==} - engines: {node: '>=4'} - - p-try@2.2.0: - resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} - engines: {node: '>=6'} - - pactum-matchers@1.1.6: - resolution: {integrity: sha512-55io32NeOKbLpHKKPzYDOr+N2dseTzMbj1Gj1y+zvOkKK6NDf5BT5pxglfqLN/ra3ig5zvbrKFUqZIWjAWboog==} - - pactum@3.6.3: - resolution: {integrity: sha512-iAizqD9sgJsVVKm0sBzDm2ZjqBMJBr/ZTbKOYawfT014EsoSIzuHIsolpslRKsHlru6MFwlg530XrEpaBmElrA==} - engines: {node: '>=10'} - - parent-module@1.0.1: - resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} - engines: {node: '>=6'} - - parse-glob@3.0.4: - resolution: {integrity: sha512-FC5TeK0AwXzq3tUBFtH74naWkPQCEWs4K+xMxWZBlKDWu0bVHXGZa+KKqxKidd7xwhdZ19ZNuF2uO1M/r196HA==} - engines: {node: '>=0.10.0'} - - parse-graphql@1.0.0: - resolution: {integrity: sha512-NjvQHHaiPCxPZrhm/kKnorxOv7r/eA+tE0VW5E8iJMH9wTqFA1V0YK/7nbpxVu3JdXUxyWTKMez9lsHUtAwa0w==} - - parse-json@2.2.0: - resolution: {integrity: sha512-QR/GGaKCkhwk1ePQNYDRKYZ3mwU9ypsKhB0XyFnLQdomyEqk3e8wpW3V5Jp88zbxK4n5ST1nqo+g9juTpownhQ==} - engines: {node: '>=0.10.0'} - - parse-json@4.0.0: - resolution: {integrity: sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==} - engines: {node: '>=4'} - - parse-json@5.2.0: - resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} - engines: {node: '>=8'} - - parse-passwd@1.0.0: - resolution: {integrity: sha512-1Y1A//QUXEZK7YKz+rD9WydcE1+EuPr6ZBgKecAB8tmoW6UFv0NREVJe1p+jRxtThkcbbKkfwIbWJe/IeE6m2Q==} - engines: {node: '>=0.10.0'} - - passport-jwt@4.0.1: - resolution: {integrity: sha512-UCKMDYhNuGOBE9/9Ycuoyh7vP6jpeTp/+sfMJl7nLff/t6dps+iaeE0hhNkKN8/HZHcJ7lCdOyDxHdDoxoSvdQ==} - - passport-local@1.0.0: - resolution: {integrity: sha512-9wCE6qKznvf9mQYYbgJ3sVOHmCWoUNMVFoZzNoznmISbhnNNPhN9xfY3sLmScHMetEJeoY7CXwfhCe7argfQow==} - engines: {node: '>= 0.4.0'} - - passport-strategy@1.0.0: - resolution: {integrity: sha512-CB97UUvDKJde2V0KDWWB3lyf6PC3FaZP7YxZ2G8OAtn9p4HI9j9JLP9qjOGZFvyl8uwNT8qM+hGnz/n16NI7oA==} - engines: {node: '>= 0.4.0'} - - passport@0.7.0: - resolution: {integrity: sha512-cPLl+qZpSc+ireUvt+IzqbED1cHHkDoVYMo30jbJIdOOjQ1MQYZBPiNvmi8UM6lJuOpTPXJGZQk0DtC4y61MYQ==} - engines: {node: '>= 0.4.0'} - - path-dirname@1.0.2: - resolution: {integrity: sha512-ALzNPpyNq9AqXMBjeymIjFDAkAFH06mHJH/cSBHAgU0s4vfpBn6b2nf8tiRLvagKD8RbTpq2FKTBg7cl9l3c7Q==} - - path-exists@2.1.0: - resolution: {integrity: sha512-yTltuKuhtNeFJKa1PiRzfLAU5182q1y4Eb4XCJ3PBqyzEDkAZRzBrKKBct682ls9reBVHf9udYLN5Nd+K1B9BQ==} - engines: {node: '>=0.10.0'} - - path-exists@3.0.0: - resolution: {integrity: sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==} - engines: {node: '>=4'} - - path-exists@4.0.0: - resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} - engines: {node: '>=8'} - - path-exists@5.0.0: - resolution: {integrity: sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - - path-is-absolute@1.0.1: - resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} - engines: {node: '>=0.10.0'} - - path-key@3.1.1: - resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} - engines: {node: '>=8'} - - path-key@4.0.0: - resolution: {integrity: sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==} - engines: {node: '>=12'} - - path-parse@1.0.7: - resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} - - path-scurry@1.10.1: - resolution: {integrity: sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ==} - engines: {node: '>=16 || 14 >=14.17'} - - path-to-regexp@3.2.0: - resolution: {integrity: sha512-jczvQbCUS7XmS7o+y1aEO9OBVFeZBQ1MDSEqmO7xSoPgOPoowY/SxLpZ6Vh97/8qHZOteiCKb7gkG9gA2ZUxJA==} - - path-to-regexp@6.2.1: - resolution: {integrity: sha512-JLyh7xT1kizaEvcaXOQwOc2/Yhw6KZOvPf1S8401UyLk86CU79LN3vl7ztXGm/pZ+YjoyAJ4rxmHwbkBXJX+yw==} - - path-type@1.1.0: - resolution: {integrity: sha512-S4eENJz1pkiQn9Znv33Q+deTOKmbl+jj1Fl+qiP/vYezj+S8x+J3Uo0ISrx/QoEvIlOaDWJhPaRd1flJ9HXZqg==} - engines: {node: '>=0.10.0'} - - path-type@3.0.0: - resolution: {integrity: sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==} - engines: {node: '>=4'} - - path-type@4.0.0: - resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} - engines: {node: '>=8'} - - pause@0.0.1: - resolution: {integrity: sha512-KG8UEiEVkR3wGEb4m5yZkVCzigAD+cVEJck2CzYZO37ZGJfctvVptVO192MwrtPhzONn6go8ylnOdMhKqi4nfg==} - - peek-stream@1.1.3: - resolution: {integrity: sha512-FhJ+YbOSBb9/rIl2ZeE/QHEsWn7PqNYt8ARAY3kIgNGOk13g9FGyIY6JIl/xB/3TFRVoTv5as0l11weORrTekA==} - - phin@3.7.0: - resolution: {integrity: sha512-DqnVNrpYhKGBZppNKprD+UJylMeEKOZxHgPB+ZP6mGzf3uA2uox4Ep9tUm+rUc8WLIdHT3HcAE4X8fhwQA9JKg==} - engines: {node: '>= 8'} - deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. - - picocolors@1.0.0: - resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} - - picomatch@2.3.1: - resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} - engines: {node: '>=8.6'} - - pify@2.3.0: - resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==} - engines: {node: '>=0.10.0'} - - pify@3.0.0: - resolution: {integrity: sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==} - engines: {node: '>=4'} - - pinkie-promise@2.0.1: - resolution: {integrity: sha512-0Gni6D4UcLTbv9c57DfxDGdr41XfgUjqWZu492f0cIGr16zDU06BWP/RAEvOuo7CQ0CNjHaLlM59YJJFm3NWlw==} - engines: {node: '>=0.10.0'} - - pinkie@2.0.4: - resolution: {integrity: sha512-MnUuEycAemtSaeFSjXKW/aroV7akBbY+Sv+RkyqFjgAe73F+MR0TBWKBRDkmfWq/HiFmdavfZ1G7h4SPZXaCSg==} - engines: {node: '>=0.10.0'} - - pino-abstract-transport@1.1.0: - resolution: {integrity: sha512-lsleG3/2a/JIWUtf9Q5gUNErBqwIu1tUKTT3dUzaf5DySw9ra1wcqKjJjLX1VTY64Wk1eEOYsVGSaGfCK85ekA==} - - pino-http@9.0.0: - resolution: {integrity: sha512-Q9QDNEz0vQmbJtMFjOVr2c9yL92vHudjmr3s3m6J1hbw3DBGFZJm3TIj9TWyynZ4GEsEA9SOtni4heRUr6lNOg==} - - pino-pretty@10.3.1: - resolution: {integrity: sha512-az8JbIYeN/1iLj2t0jR9DV48/LQ3RC6hZPpapKPkb84Q+yTidMCpgWxIT3N0flnBDilyBQ1luWNpOeJptjdp/g==} - hasBin: true - - pino-std-serializers@6.2.2: - resolution: {integrity: sha512-cHjPPsE+vhj/tnhCy/wiMh3M3z3h/j15zHQX+S9GkTBgqJuTuJzYJ4gUyACLhDaJ7kk9ba9iRDmbH2tJU03OiA==} - - pino@8.18.0: - resolution: {integrity: sha512-Mz/gKiRyuXu4HnpHgi1YWdHQCoWMufapzooisvFn78zl4dZciAxS+YeRkUxXl1ee/SzU80YCz1zpECCh4oC6Aw==} - hasBin: true - - pirates@4.0.6: - resolution: {integrity: sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==} - engines: {node: '>= 6'} - - pkg-conf@1.1.3: - resolution: {integrity: sha512-9hHgE5+Xai/ChrnahNP8Ke0VNF/s41IZIB/d24eMHEaRamdPg+wwlRm2lTb5wMvE8eTIKrYZsrxfuOwt3dpsIQ==} - engines: {node: '>=0.10.0'} - - pkg-dir@4.2.0: - resolution: {integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==} - engines: {node: '>=8'} - - pluralize-esm@9.0.5: - resolution: {integrity: sha512-Kb2dcpMsIutFw2hYrN0EhsAXOUJTd6FVMIxvNAkZCMQLVt9NGZqQczvGpYDxNWCZeCWLHUPxQIBudWzt1h7VVA==} - engines: {node: '>=14.0.0'} - - pluralize@8.0.0: - resolution: {integrity: sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==} - engines: {node: '>=4'} - - polka@0.5.2: - resolution: {integrity: sha512-FVg3vDmCqP80tOrs+OeNlgXYmFppTXdjD5E7I4ET1NjvtNmQrb1/mJibybKkb/d4NA7YWAr1ojxuhpL3FHqdlw==} - - prelude-ls@1.2.1: - resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} - engines: {node: '>= 0.8.0'} - - preserve@0.2.0: - resolution: {integrity: sha512-s/46sYeylUfHNjI+sA/78FAHlmIuKqI9wNnzEOGehAlUUYeObv5C2mOinXBjyUyWmJ2SfcS2/ydApH4hTF4WXQ==} - engines: {node: '>=0.10.0'} - - prettier-linter-helpers@1.0.0: - resolution: {integrity: sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==} - engines: {node: '>=6.0.0'} - - prettier@2.8.8: - resolution: {integrity: sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==} - engines: {node: '>=10.13.0'} - hasBin: true - - prettier@3.0.0: - resolution: {integrity: sha512-zBf5eHpwHOGPC47h0zrPyNn+eAEIdEzfywMoYn2XPi0P44Zp0tSq64rq0xAREh4auw2cJZHo9QUob+NqCQky4g==} - engines: {node: '>=14'} - hasBin: true - - pretty-format@29.7.0: - resolution: {integrity: sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - - prisma-nested-middleware@4.0.0: - resolution: {integrity: sha512-WSx0nl7KNXEzGaNC87fuDBOdAjj3V6um/JoQUo24PaMzMy8tvOYfb2Mw25OZhnrMXNTBhqgk4rJTUW3CVcDsHQ==} - peerDependencies: - '@prisma/client': '*' - - prisma-soft-delete-middleware@1.3.1: - resolution: {integrity: sha512-oQ2Ba8wb23ho6PqMXkOSTQTXNKouLmZuILYDHrnKk1Ui3cGIXuj9zNWyJkoaTcWHznsiAaoP1Oy8ytDhwQNQqA==} - peerDependencies: - '@prisma/client': '*' - - prisma@5.10.2: - resolution: {integrity: sha512-hqb/JMz9/kymRE25pMWCxkdyhbnIWrq+h7S6WysJpdnCvhstbJSNP/S6mScEcqiB8Qv2F+0R3yG+osRaWqZacQ==} - engines: {node: '>=16.13'} - hasBin: true - - process-nextick-args@1.0.7: - resolution: {integrity: sha512-yN0WQmuCX63LP/TMvAg31nvT6m4vDqJEiiv2CAZqWOGNWutc9DfDk1NPYYmKUFmaVM2UwDowH4u5AHWYP/jxKw==} - - process-nextick-args@2.0.1: - resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} - - process-warning@3.0.0: - resolution: {integrity: sha512-mqn0kFRl0EoqhnL0GQ0veqFHyIN1yig9RHh/InzORTUiZHFRAur+aMtRkELNwGs9aNwKS6tg/An4NYBPGwvtzQ==} - - process@0.11.10: - resolution: {integrity: sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==} - engines: {node: '>= 0.6.0'} - - promise-coalesce@1.1.2: - resolution: {integrity: sha512-zLaJ9b8hnC564fnJH6NFSOGZYYdzrAJn2JUUIwzoQb32fG2QAakpDNM+CZo1km6keXkRXRM+hml1BFAPVnPkxg==} - engines: {node: '>=16'} - - promise-inflight@1.0.1: - resolution: {integrity: sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==} - peerDependencies: - bluebird: '*' - peerDependenciesMeta: - bluebird: - optional: true - - promise-retry@2.0.1: - resolution: {integrity: sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==} - engines: {node: '>=10'} - - prompts@2.4.2: - resolution: {integrity: sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==} - engines: {node: '>= 6'} - - proxy-addr@2.0.7: - resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==} - engines: {node: '>= 0.10'} - - proxy-from-env@1.1.0: - resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} - - pump@3.0.0: - resolution: {integrity: sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==} - - pumpify@2.0.1: - resolution: {integrity: sha512-m7KOje7jZxrmutanlkS1daj1dS6z6BgslzOXmcSEpIlCxM3VJH7lG5QLeck/6hgF6F4crFf01UtQmNsJfweTAw==} - - punycode@2.3.1: - resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} - engines: {node: '>=6'} - - pure-rand@6.0.4: - resolution: {integrity: sha512-LA0Y9kxMYv47GIPJy6MI84fqTd2HmYZI83W/kM/SkKfDlajnZYfmXFTxkbY+xSBPkLJxltMa9hIkmdc29eguMA==} - - q@1.5.1: - resolution: {integrity: sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==} - engines: {node: '>=0.6.0', teleport: '>=0.2.0'} - - qs@6.11.2: - resolution: {integrity: sha512-tDNIz22aBzCDxLtVH++VnTfzxlfeK5CbqohpSqpJgj1Wg/cQbStNAz3NuqCs5vV+pjBsK4x4pN9HlVh7rcYRiA==} - engines: {node: '>=0.6'} - - queue-microtask@1.2.3: - resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} - - quick-format-unescaped@4.0.4: - resolution: {integrity: sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg==} - - quick-lru@4.0.1: - resolution: {integrity: sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==} - engines: {node: '>=8'} - - randomatic@3.1.1: - resolution: {integrity: sha512-TuDE5KxZ0J461RVjrJZCJc+J+zCkTb1MbH9AQUq68sMhOMcy9jLcb3BrZKgp9q9Ncltdg4QVqWrH02W2EFFVYw==} - engines: {node: '>= 0.10.0'} - - randombytes@2.1.0: - resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} - - react-is@18.2.0: - resolution: {integrity: sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==} - - read-pkg-up@1.0.1: - resolution: {integrity: sha512-WD9MTlNtI55IwYUS27iHh9tK3YoIVhxis8yKhLpTqWtml739uXc9NWTpxoHkfZf3+DkCCsXox94/VWZniuZm6A==} - engines: {node: '>=0.10.0'} - - read-pkg-up@3.0.0: - resolution: {integrity: sha512-YFzFrVvpC6frF1sz8psoHDBGF7fLPc+llq/8NB43oagqWkx8ar5zYtsTORtOjw9W2RHLpWP+zTWwBvf1bCmcSw==} - engines: {node: '>=4'} - - read-pkg-up@7.0.1: - resolution: {integrity: sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==} - engines: {node: '>=8'} - - read-pkg@1.1.0: - resolution: {integrity: sha512-7BGwRHqt4s/uVbuyoeejRn4YmFnYZiFl4AuaeXHlgZf3sONF0SOGlxs2Pw8g6hCKupo08RafIO5YXFNOKTfwsQ==} - engines: {node: '>=0.10.0'} - - read-pkg@3.0.0: - resolution: {integrity: sha512-BLq/cCO9two+lBgiTYNqD6GdtK8s4NpaWrl6/rCO9w0TUS8oJl7cmToOZfRYllKTISY6nt1U7jQ53brmKqY6BA==} - engines: {node: '>=4'} - - read-pkg@5.2.0: - resolution: {integrity: sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==} - engines: {node: '>=8'} - - readable-stream@1.0.34: - resolution: {integrity: sha512-ok1qVCJuRkNmvebYikljxJA/UEsKwLl2nI1OmaqAu4/UE+h0wKCHok4XkL/gvi39OacXvw59RJUOFUkDib2rHg==} - - readable-stream@2.0.6: - resolution: {integrity: sha512-TXcFfb63BQe1+ySzsHZI/5v1aJPCShfqvWJ64ayNImXMsN1Cd0YGk/wm8KB7/OeessgPc9QvS9Zou8QTkFzsLw==} - - 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'} - - readable-stream@4.5.2: - resolution: {integrity: sha512-yjavECdqeZ3GLXNgRXgeQEdz9fvDDkNKyHnbHRFtOr7/LcfgBcmct7t/ET+HaCTqfh06OzoAxrkN/IfjJBVe+g==} - 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'} - - real-require@0.2.0: - resolution: {integrity: sha512-57frrGM/OCTLqLOAh0mhVA9VBMHd+9U7Zb2THMGdBUoZVOtGbJzjxsYGDJ3A9AYYCP4hn6y1TVbaOfzWtm5GFg==} - engines: {node: '>= 12.13.0'} - - rechoir@0.6.2: - resolution: {integrity: sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==} - engines: {node: '>= 0.10'} - - redent@3.0.0: - resolution: {integrity: sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==} - engines: {node: '>=8'} - - reflect-metadata@0.1.13: - resolution: {integrity: sha512-Ts1Y/anZELhSsjMcU605fU9RE4Oi3p5ORujwbIKXfWa+0Zxs510Qrmrce5/Jowq3cHSZSJqBjypxmHarc+vEWg==} - - regex-cache@0.4.4: - resolution: {integrity: sha512-nVIZwtCjkC9YgvWkpM55B5rBhBYRZhAaJbgcFYXXsHnbZ9UZI9nnVWYZpBlCqv9ho2eZryPnWrZGsOdPwVWXWQ==} - engines: {node: '>=0.10.0'} - - remove-trailing-separator@1.1.0: - resolution: {integrity: sha512-/hS+Y0u3aOfIETiaiirUFwDBDzmXPvO+jAfKTitUngIPzdKc6Z0LoFjM/CK5PL4C+eKwHohlHAb6H0VFfmmUsw==} - - repeat-element@1.1.4: - resolution: {integrity: sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ==} - engines: {node: '>=0.10.0'} - - repeat-string@1.6.1: - resolution: {integrity: sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==} - engines: {node: '>=0.10'} - - replace-ext@0.0.1: - resolution: {integrity: sha512-AFBWBy9EVRTa/LhEcG8QDP3FvpwZqmvN2QFDuJswFeaVhWnZMp8q3E6Zd90SR04PlIwfGdyVjNyLPyen/ek5CQ==} - engines: {node: '>= 0.4'} - - require-directory@2.1.1: - resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} - engines: {node: '>=0.10.0'} - - require-from-string@2.0.2: - resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} - engines: {node: '>=0.10.0'} - - require-main-filename@1.0.1: - resolution: {integrity: sha512-IqSUtOVP4ksd1C/ej5zeEh/BIP2ajqpn8c5x+q99gvcIG/Qf0cud5raVnE/Dwd0ua9TXYDoDc0RE5hBSdz22Ug==} - - resolve-cwd@3.0.0: - resolution: {integrity: sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==} - engines: {node: '>=8'} - - resolve-dir@1.0.1: - resolution: {integrity: sha512-R7uiTjECzvOsWSfdM0QKFNBVFcK27aHOUwdvK53BcW8zqnGdYp0Fbj82cy54+2A4P2tFM22J5kRfe1R+lM/1yg==} - engines: {node: '>=0.10.0'} - - resolve-from@4.0.0: - resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} - engines: {node: '>=4'} - - resolve-from@5.0.0: - resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} - engines: {node: '>=8'} - - resolve-url@0.2.1: - resolution: {integrity: sha512-ZuF55hVUQaaczgOIwqWzkEcEidmlD/xl44x1UZnhOXcYuFN2S6+rcxpG+C1N3So0wvNI3DmJICUFfu2SxhBmvg==} - deprecated: https://github.com/lydell/resolve-url#deprecated - - resolve.exports@2.0.2: - resolution: {integrity: sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg==} - engines: {node: '>=10'} - - resolve@1.22.8: - resolution: {integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==} - hasBin: true - - restore-cursor@3.1.0: - resolution: {integrity: sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==} - engines: {node: '>=8'} - - ret@0.2.2: - resolution: {integrity: sha512-M0b3YWQs7R3Z917WRQy1HHA7Ba7D8hvZg6UE5mLykJxQVE2ju0IXbGlaHPPlkY+WN7wFP+wUMXmBFA0aV6vYGQ==} - engines: {node: '>=4'} - - retry@0.12.0: - resolution: {integrity: sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==} - engines: {node: '>= 4'} - - reusify@1.0.4: - resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} - engines: {iojs: '>=1.0.0', node: '>=0.10.0'} - - rfdc@1.3.1: - resolution: {integrity: sha512-r5a3l5HzYlIC68TpmYKlxWjmOP6wiPJ1vWv2HeLhNsRZMrCkxeqxiHlQ21oXmQ4F3SiryXBHhAD7JZqvOJjFmg==} - - rimraf@3.0.2: - resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} - 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'} - - run-parallel@1.2.0: - resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} - - rxjs@6.6.7: - resolution: {integrity: sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==} - engines: {npm: '>=2.0.0'} - - rxjs@7.8.1: - resolution: {integrity: sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==} - - safe-buffer@5.1.2: - resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} - - safe-buffer@5.2.1: - resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} - - safe-regex2@2.0.0: - resolution: {integrity: sha512-PaUSFsUaNNuKwkBijoAPHAK6/eM6VirvyPWlZ7BAQy4D+hCvh4B6lIG+nPdhbFfIbP+gTGBcrdsOaUs0F+ZBOQ==} - - safe-stable-stringify@2.4.3: - resolution: {integrity: sha512-e2bDA2WJT0wxseVd4lsDP4+3ONX6HpMXQa1ZhFQ7SU+GjvORCmShbCMltrtIDfkYhVHrOcPtj+KhmDBdPdZD1g==} - engines: {node: '>=10'} - - safer-buffer@2.1.2: - resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} - - schema-utils@3.3.0: - resolution: {integrity: sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==} - engines: {node: '>= 10.13.0'} - - secure-json-parse@2.7.0: - resolution: {integrity: sha512-6aU+Rwsezw7VR8/nyvKTx8QpWH9FrcYiXXlqC4z5d5XQBDRqtbfsRjnwGyqbi3gddNtWHuEk9OANUotL26qKUw==} - - semver@5.7.2: - resolution: {integrity: sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==} - hasBin: true - - semver@6.3.1: - resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} - hasBin: true - - semver@7.6.0: - resolution: {integrity: sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==} - engines: {node: '>=10'} - hasBin: true - - serialize-javascript@6.0.2: - resolution: {integrity: sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==} - - set-blocking@2.0.0: - resolution: {integrity: sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==} - - set-cookie-parser@2.6.0: - resolution: {integrity: sha512-RVnVQxTXuerk653XfuliOxBP81Sf0+qfQE73LIYKcyMYHG94AuH0kgrQpRDuTZnSmjpysHmzxJXKNfa6PjFhyQ==} - - set-function-length@1.2.1: - resolution: {integrity: sha512-j4t6ccc+VsKwYHso+kElc5neZpjtq9EnRICFZtWyBsLojhmeF/ZBd/elqm22WJh/BziDe/SBiOeAt0m2mfLD0g==} - engines: {node: '>= 0.4'} - - setprototypeof@1.2.0: - resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} - - shebang-command@2.0.0: - resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} - engines: {node: '>=8'} - - shebang-regex@3.0.0: - 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@1.0.5: - resolution: {integrity: sha512-QcgiIWV4WV7qWExbN5llt6frQB/lBven9pqliLXfGPB+K9ZYXxDozp0wLkHS24kWCm+6YXH/f0HhnObZnZOBnQ==} - engines: {node: '>= 0.4'} - - signal-exit@3.0.7: - resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} - - signal-exit@4.1.0: - resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} - engines: {node: '>=14'} - - sisteransi@1.0.5: - resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} - - slash@3.0.0: - resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} - engines: {node: '>=8'} - - smart-buffer@4.2.0: - resolution: {integrity: sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==} - engines: {node: '>= 6.0.0', npm: '>= 3.0.0'} - - socks-proxy-agent@7.0.0: - resolution: {integrity: sha512-Fgl0YPZ902wEsAyiQ+idGd1A7rSFx/ayC1CQVMw5P+EQx2V0SgpGtf6OKFhVjPflPUl9YMmEOnmfjCdMUsygww==} - engines: {node: '>= 10'} - - socks@2.8.3: - resolution: {integrity: sha512-l5x7VUUWbjVFbafGLxPWkYsHIhEvmF85tbIeFZWc8ZPtoMyybuEhL7Jye/ooC4/d48FgOjSJXgsF/AJPYCW8Zw==} - engines: {node: '>= 10.0.0', npm: '>= 3.0.0'} - - sonic-boom@3.8.0: - resolution: {integrity: sha512-ybz6OYOUjoQQCQ/i4LU8kaToD8ACtYP+Cj5qd2AO36bwbdewxWJ3ArmJ2cr6AvxlL2o0PqnCcPGUgkILbfkaCA==} - - source-map-resolve@0.5.3: - resolution: {integrity: sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==} - deprecated: See https://github.com/lydell/source-map-resolve#deprecated - - source-map-support@0.5.13: - resolution: {integrity: sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==} - - source-map-support@0.5.21: - resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} - - source-map-url@0.4.1: - resolution: {integrity: sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw==} - deprecated: See https://github.com/lydell/source-map-url#deprecated - - source-map@0.6.1: - resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} - engines: {node: '>=0.10.0'} - - source-map@0.7.3: - resolution: {integrity: sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==} - engines: {node: '>= 8'} - - source-map@0.7.4: - resolution: {integrity: sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==} - engines: {node: '>= 8'} - - sourcemap-codec@1.4.8: - resolution: {integrity: sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==} - deprecated: Please use @jridgewell/sourcemap-codec instead - - spdx-correct@3.2.0: - resolution: {integrity: sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==} - - spdx-exceptions@2.4.0: - resolution: {integrity: sha512-hcjppoJ68fhxA/cjbN4T8N6uCUejN8yFw69ttpqtBeCbF3u13n7mb31NB9jKwGTTWWnt9IbRA/mf1FprYS8wfw==} - - spdx-expression-parse@3.0.1: - resolution: {integrity: sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==} - - spdx-license-ids@3.0.17: - resolution: {integrity: sha512-sh8PWc/ftMqAAdFiBu6Fy6JUOYjqDJBJvIhpfDMyHrr0Rbp5liZqd4TjtQ/RgfLjKFZb+LMx5hpml5qOWy0qvg==} - - split2@3.2.2: - resolution: {integrity: sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg==} - - split2@4.2.0: - resolution: {integrity: sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==} - engines: {node: '>= 10.x'} - - split@1.0.1: - resolution: {integrity: sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg==} - - sprintf-js@1.0.3: - resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} - - sprintf-js@1.1.3: - resolution: {integrity: sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==} - - ssri@9.0.1: - resolution: {integrity: sha512-o57Wcn66jMQvfHG1FlYbWeZWW/dHZhJXjpIcTfXldXEk5nz5lStPo3mK0OJQfGR3RbZUlbISexbljkJzuEj/8Q==} - engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} - - stack-utils@2.0.6: - resolution: {integrity: sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==} - engines: {node: '>=10'} - - standard-version@9.5.0: - resolution: {integrity: sha512-3zWJ/mmZQsOaO+fOlsa0+QK90pwhNd042qEcw6hKFNoLFs7peGyvPffpEBbK/DSGPbyOvli0mUIFv5A4qTjh2Q==} - engines: {node: '>=10'} - hasBin: true - - statuses@2.0.1: - resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==} - engines: {node: '>= 0.8'} - - stream-shift@1.0.3: - resolution: {integrity: sha512-76ORR0DO1o1hlKwTbi/DM3EXWGf3ZJYO8cXX5RJwnul2DEg2oyoZyjLNoQM8WsvZiFKCRfC1O0J7iCvie3RZmQ==} - - string-length@4.0.2: - resolution: {integrity: sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==} - engines: {node: '>=10'} - - string-width@1.0.2: - resolution: {integrity: sha512-0XsVpQLnVCXHJfyEs8tC0zpTVIr5PKKsQtkT29IwupnPTjtPmQ3xT/4yCREF9hYkV/3M3kzcUTSAZT6a6h81tw==} - engines: {node: '>=0.10.0'} - - string-width@4.2.3: - resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} - engines: {node: '>=8'} - - string-width@5.1.2: - resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} - engines: {node: '>=12'} - - string_decoder@0.10.31: - resolution: {integrity: sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==} - - 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==} - - stringify-package@1.0.1: - resolution: {integrity: sha512-sa4DUQsYciMP1xhKWGuFM04fB0LG/9DlluZoSVywUMRNvzid6XucHK0/90xGxRoHrAaROrcHK1aPKaijCtSrhg==} - deprecated: This module is not used anymore, and has been replaced by @npmcli/package-json - - strip-ansi@3.0.1: - resolution: {integrity: sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==} - engines: {node: '>=0.10.0'} - - strip-ansi@6.0.1: - resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} - engines: {node: '>=8'} - - strip-ansi@7.1.0: - resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} - engines: {node: '>=12'} - - strip-bom-stream@1.0.0: - resolution: {integrity: sha512-7jfJB9YpI2Z0aH3wu10ZqitvYJaE0s5IzFuWE+0pbb4Q/armTloEUShymkDO47YSLnjAW52mlXT//hs9wXNNJQ==} - engines: {node: '>=0.10.0'} - - strip-bom@2.0.0: - resolution: {integrity: sha512-kwrX1y7czp1E69n2ajbG65mIo9dqvJ+8aBQXOGVxqwvNbsXdFM6Lq37dLAY3mknUwru8CfcCbfOLL/gMo+fi3g==} - engines: {node: '>=0.10.0'} - - strip-bom@3.0.0: - resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} - engines: {node: '>=4'} - - strip-bom@4.0.0: - resolution: {integrity: sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==} - engines: {node: '>=8'} - - strip-final-newline@2.0.0: - resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} - engines: {node: '>=6'} - - strip-final-newline@3.0.0: - resolution: {integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==} - engines: {node: '>=12'} - - strip-indent@3.0.0: - resolution: {integrity: sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==} - engines: {node: '>=8'} - - strip-json-comments@3.1.1: - resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} - engines: {node: '>=8'} - - superagent@8.1.2: - resolution: {integrity: sha512-6WTxW1EB6yCxV5VFOIPQruWGHqc3yI7hEmZK6h+pyk69Lk/Ut7rLUY6W/ONF2MjBuGjvmMiIpsrVJ2vjrHlslA==} - engines: {node: '>=6.4.0 <13 || >=14'} - - supertest@6.3.3: - resolution: {integrity: sha512-EMCG6G8gDu5qEqRQ3JjjPs6+FYT1a7Hv5ApHvtSghmOFJYtsU5S+pSb6Y2EUeCEY3CmEL3mmQ8YWlPOzQomabA==} - engines: {node: '>=6.4.0'} - - supports-color@2.0.0: - resolution: {integrity: sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==} - engines: {node: '>=0.8.0'} - - supports-color@5.5.0: - resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} - engines: {node: '>=4'} - - supports-color@7.2.0: - resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} - engines: {node: '>=8'} - - supports-color@8.1.1: - resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} - engines: {node: '>=10'} - - supports-preserve-symlinks-flag@1.0.0: - resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} - engines: {node: '>= 0.4'} - - swagger-ui-dist@5.11.2: - resolution: {integrity: sha512-jQG0cRgJNMZ7aCoiFofnoojeSaa/+KgWaDlfgs8QN+BXoGMpxeMVY5OEnjq4OlNvF3yjftO8c9GRAgcHlO+u7A==} - - symbol-observable@4.0.0: - resolution: {integrity: sha512-b19dMThMV4HVFynSAM1++gBHAbk2Tc/osgLIBZMKsyqh34jb2e8Os7T6ZW/Bt3pJFdBTd2JwAnAAEQV7rSNvcQ==} - engines: {node: '>=0.10'} - - symbol@0.2.3: - resolution: {integrity: sha512-IUW+ek7apEaW5bFhS6WpYoNtVpNTlNoqB/PH7YiMWQTxSPeXCzG4PILVakwXivJt3ZXWeO1fIJnUd/L9A/VeGA==} - - synckit@0.8.8: - resolution: {integrity: sha512-HwOKAP7Wc5aRGYdKH+dw0PRRpbO841v2DENBtjnR5HFWoiNByAl7vrx3p0G/rCyYXQsrxqtX48TImFtPcIHSpQ==} - engines: {node: ^14.18.0 || >=16.0.0} - - tapable@2.2.1: - resolution: {integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==} - engines: {node: '>=6'} - - tar@6.2.0: - resolution: {integrity: sha512-/Wo7DcT0u5HUV486xg675HtjNd3BXZ6xDbzsCUZPt5iw8bTQ63bP0Raut3mvro9u+CUyq7YQd8Cx55fsZXxqLQ==} - engines: {node: '>=10'} - - terser-webpack-plugin@5.3.10: - resolution: {integrity: sha512-BKFPWlPDndPs+NGGCr1U59t0XScL5317Y0UReNrHaw9/FwhPENlq6bfgs+4yPfyP51vqC1bQ4rp1EfXW5ZSH9w==} - engines: {node: '>= 10.13.0'} - peerDependencies: - '@swc/core': '*' - esbuild: '*' - uglify-js: '*' - webpack: ^5.1.0 - peerDependenciesMeta: - '@swc/core': - optional: true - esbuild: - optional: true - uglify-js: - optional: true - - terser@5.27.0: - resolution: {integrity: sha512-bi1HRwVRskAjheeYl291n3JC4GgO/Ty4z1nVs5AAsmonJulGxpSektecnNedrwK9C7vpvVtcX3cw00VSLt7U2A==} - engines: {node: '>=10'} - hasBin: true - - test-exclude@6.0.0: - resolution: {integrity: sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==} - engines: {node: '>=8'} - - text-extensions@1.9.0: - resolution: {integrity: sha512-wiBrwC1EhBelW12Zy26JeOUkQ5mRu+5o8rpsJk5+2t+Y5vE7e842qtZDQ2g1NpX/29HdyFeJ4nSIhI47ENSxlQ==} - engines: {node: '>=0.10'} - - text-extensions@2.4.0: - resolution: {integrity: sha512-te/NtwBwfiNRLf9Ijqx3T0nlqZiQ2XrrtBvu+cLL8ZRrGkO0NHTug8MYFKyoSrv/sHTaSKfilUkizV6XhxMJ3g==} - engines: {node: '>=8'} - - text-table@0.2.0: - resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} - - thread-stream@2.4.1: - resolution: {integrity: sha512-d/Ex2iWd1whipbT681JmTINKw0ZwOUBZm7+Gjs64DHuX34mmw8vJL2bFAaNacaW72zYiTJxSHi5abUuOi5nsfg==} - - through2-filter@2.0.0: - resolution: {integrity: sha512-miwWajb1B80NvIVKXFPN/o7+vJc4jYUvnZCwvhicRAoTxdD9wbcjri70j+BenCrN/JXEPKDjhpw4iY7yiNsCGg==} - - through2-filter@3.0.0: - resolution: {integrity: sha512-jaRjI2WxN3W1V8/FMZ9HKIBXixtiqs3SQSX4/YGIiP3gL6djW48VoZq9tDqeCWs3MT8YY5wb/zli8VW8snY1CA==} - - through2@0.6.5: - resolution: {integrity: sha512-RkK/CCESdTKQZHdmKICijdKKsCRVHs5KsLZ6pACAmF/1GPUQhonHSXWNERctxEp7RmvjdNbZTL5z9V7nSCXKcg==} - - through2@2.0.5: - resolution: {integrity: sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==} - - through2@4.0.2: - resolution: {integrity: sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==} - - through@2.3.8: - resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==} - - tildify@1.2.0: - resolution: {integrity: sha512-Y9q1GaV/BO65Z9Yf4NOGMuwt3SGdptkZBnaaKfTQakrDyCLiuO1Kc5wxW4xLdsjzunRtqtOdhekiUFmZbklwYQ==} - engines: {node: '>=0.10.0'} - - tmp@0.0.33: - resolution: {integrity: sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==} - engines: {node: '>=0.6.0'} - - tmpl@1.0.5: - resolution: {integrity: sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==} - - to-absolute-glob@0.1.1: - resolution: {integrity: sha512-Vvl5x6zNf9iVG1QTWeknmWrKzZxaeKfIDRibrZCR3b2V/2NlFJuD2HV7P7AVjaKLZNqLPHqyr0jGrW0fTcxCPQ==} - engines: {node: '>=0.10.0'} - - to-fast-properties@2.0.0: - resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==} - engines: {node: '>=4'} - - to-regex-range@5.0.1: - resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} - engines: {node: '>=8.0'} - - toad-cache@3.7.0: - resolution: {integrity: sha512-/m8M+2BJUpoJdgAHoG+baCwBT+tf2VraSfkBgl0Y00qIWt41DJ8R5B8nsEw0I58YwF5IZH6z24/2TobDKnqSWw==} - engines: {node: '>=12'} - - toidentifier@1.0.1: - resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} - engines: {node: '>=0.6'} - - tr46@0.0.3: - resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} - - tree-kill@1.2.2: - resolution: {integrity: sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==} - hasBin: true - - trim-newlines@3.0.1: - resolution: {integrity: sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==} - engines: {node: '>=8'} - - trouter@2.0.1: - resolution: {integrity: sha512-kr8SKKw94OI+xTGOkfsvwZQ8mWoikZDd2n8XZHjJVZUARZT+4/VV6cacRS6CLsH9bNm+HFIPU1Zx4CnNnb4qlQ==} - engines: {node: '>=6'} - - ts-api-utils@1.2.1: - resolution: {integrity: sha512-RIYA36cJn2WiH9Hy77hdF9r7oEwxAtB/TS9/S4Qd90Ap4z5FSiin5zEiTL44OII1Y3IIlEvxwxFUVgrHSZ/UpA==} - engines: {node: '>=16'} - peerDependencies: - typescript: '>=4.2.0' - - ts-jest@29.1.0: - resolution: {integrity: sha512-ZhNr7Z4PcYa+JjMl62ir+zPiNJfXJN6E8hSLnaUKhOgqcn8vb3e537cpkd0FuAfRK3sR1LSqM1MOhliXNgOFPA==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - hasBin: true - peerDependencies: - '@babel/core': '>=7.0.0-beta.0 <8' - '@jest/types': ^29.0.0 - babel-jest: ^29.0.0 - esbuild: '*' - jest: ^29.0.0 - typescript: '>=4.3 <6' - peerDependenciesMeta: - '@babel/core': - optional: true - '@jest/types': - optional: true - babel-jest: - optional: true - esbuild: - optional: true - - ts-loader@9.4.3: - resolution: {integrity: sha512-n3hBnm6ozJYzwiwt5YRiJZkzktftRpMiBApHaJPoWLA+qetQBAXkHqCLM6nwSdRDimqVtA5ocIkcTRLMTt7yzA==} - engines: {node: '>=12.0.0'} - peerDependencies: - typescript: '*' - webpack: ^5.0.0 - - ts-node@10.9.1: - resolution: {integrity: sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==} - hasBin: true - peerDependencies: - '@swc/core': '>=1.2.50' - '@swc/wasm': '>=1.2.50' - '@types/node': '*' - typescript: '>=2.7' - peerDependenciesMeta: - '@swc/core': - optional: true - '@swc/wasm': - optional: true - - ts-toolbelt@9.6.0: - resolution: {integrity: sha512-nsZd8ZeNUzukXPlJmTBwUAuABDe/9qtVDelJeT/qW0ow3ZS3BsQJtNkan1802aM9Uf68/Y8ljw86Hu0h5IUW3w==} - - tsconfig-paths-webpack-plugin@4.0.1: - resolution: {integrity: sha512-m5//KzLoKmqu2MVix+dgLKq70MnFi8YL8sdzQZ6DblmCdfuq/y3OqvJd5vMndg2KEVCOeNz8Es4WVZhYInteLw==} - engines: {node: '>=10.13.0'} - - tsconfig-paths@4.2.0: - resolution: {integrity: sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg==} - engines: {node: '>=6'} - - tslib@1.14.1: - resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==} - - tslib@2.5.0: - resolution: {integrity: sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==} - - tslib@2.5.3: - resolution: {integrity: sha512-mSxlJJwl3BMEQCUNnxXBU9jP4JBktcEGhURcPR6VQVlnP0FdDEsIaz0C35dXNGLyRfrATNofF0F5p2KPxQgB+w==} - - tslib@2.6.2: - resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==} - - type-check@0.4.0: - resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} - engines: {node: '>= 0.8.0'} - - type-detect@4.0.8: - resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==} - engines: {node: '>=4'} - - type-fest@0.18.1: - resolution: {integrity: sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==} - engines: {node: '>=10'} - - type-fest@0.20.2: - resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} - engines: {node: '>=10'} - - type-fest@0.21.3: - resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==} - engines: {node: '>=10'} - - type-fest@0.6.0: - resolution: {integrity: sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==} - engines: {node: '>=8'} - - type-fest@0.8.1: - resolution: {integrity: sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==} - engines: {node: '>=8'} - - typedarray@0.0.6: - resolution: {integrity: sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==} - - typedarray@0.0.7: - resolution: {integrity: sha512-ueeb9YybpjhivjbHP2LdFDAjbS948fGEPj+ACAMs4xCMmh72OCOMQWBQKlaN4ZNQ04yfLSDLSx1tGRIoWimObQ==} - - typescript@5.0.4: - resolution: {integrity: sha512-cW9T5W9xY37cc+jfEnaUvX91foxtHkza3Nw3wkoF4sSlKn0MONdkdEndig/qPBWXNkmplh3NzayQzCiHM4/hqw==} - engines: {node: '>=12.20'} - hasBin: true - - typescript@5.1.3: - resolution: {integrity: sha512-XH627E9vkeqhlZFQuL+UsyAXEnibT0kWR2FWONlr4sTjvxyJYnyefgrkyECLzM5NenmKzRAy2rR/OlYLA1HkZw==} - engines: {node: '>=14.17'} - hasBin: true - - uglify-js@3.17.4: - resolution: {integrity: sha512-T9q82TJI9e/C1TAxYvfb16xO120tMVFZrGA3f9/P4424DNu6ypK103y0GPFVa17yotwSyZW5iYXgjYHkGrJW/g==} - engines: {node: '>=0.8.0'} - hasBin: true - - uid@2.0.2: - resolution: {integrity: sha512-u3xV3X7uzvi5b1MncmZo3i2Aw222Zk1keqLA1YkHldREkAhAqi65wuPfe7lHx8H/Wzy+8CE7S7uS3jekIM5s8g==} - engines: {node: '>=8'} - - unicorn-magic@0.1.0: - resolution: {integrity: sha512-lRfVq8fE8gz6QMBuDM6a+LO3IAzTi05H6gCVaUpir2E1Rwpo4ZUog45KpNXKC/Mn3Yb9UDuHumeFTo9iV/D9FQ==} - engines: {node: '>=18'} - - unique-filename@2.0.1: - resolution: {integrity: sha512-ODWHtkkdx3IAR+veKxFV+VBkUMcN+FaqzUUd7IZzt+0zhDZFPFxhlqwPF3YQvMHx1TD0tdgYl+kuPnJ8E6ql7A==} - engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} - - unique-slug@3.0.0: - resolution: {integrity: sha512-8EyMynh679x/0gqE9fT9oilG+qEt+ibFyqjuVTsZn1+CMxH+XLlpvr2UZx4nVcCwTpx81nICr2JQFkM+HPLq4w==} - engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} - - unique-stream@2.3.1: - resolution: {integrity: sha512-2nY4TnBE70yoxHkDli7DMazpWiP7xMdCYqU2nBRO0UB+ZpEkGsSija7MvmvnZFUeC+mrgiUfcHSr3LmRFIg4+A==} - - universalify@2.0.1: - resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==} - engines: {node: '>= 10.0.0'} - - update-browserslist-db@1.0.13: - resolution: {integrity: sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==} - hasBin: true - peerDependencies: - browserslist: '>= 4.21.0' - - uri-js@4.4.1: - resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} - - urix@0.1.0: - resolution: {integrity: sha512-Am1ousAhSLBeB9cG/7k7r2R0zj50uDRlZHPGbazid5s9rlF1F/QKYObEKSIunSjIOkJZqwRRLpvewjEkM7pSqg==} - deprecated: Please see https://github.com/lydell/urix#deprecated - - util-deprecate@1.0.2: - resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} - - utils-merge@1.0.1: - resolution: {integrity: sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==} - engines: {node: '>= 0.4.0'} - - uuid@9.0.0: - resolution: {integrity: sha512-MXcSTerfPa4uqyzStbRoTgt5XIe3x5+42+q1sDuy3R5MDk66URdLMOZe5aPX/SQd+kuYAh0FdP/pO28IkQyTeg==} - hasBin: true - - v8-compile-cache-lib@3.0.1: - resolution: {integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==} - - v8-sandbox@3.2.10: - resolution: {integrity: sha512-BIIohkY8ULJ63o084YCPMVItEurrH8HIiPufbTtI6AD9HXNnC6QmJTvN97CpvakRkSk0isK4a4diSmwVG2pyFQ==} - - v8-to-istanbul@9.2.0: - resolution: {integrity: sha512-/EH/sDgxU2eGxajKdwLCDmQ4FWq+kpi3uCmBGpw1xJtnAxEjlD8j8PEiGWpCIMIs3ciNAgH0d3TTJiUkYzyZjA==} - engines: {node: '>=10.12.0'} - - vali-date@1.0.0: - resolution: {integrity: sha512-sgECfZthyaCKW10N0fm27cg8HYTFK5qMWgypqkXMQ4Wbl/zZKx7xZICgcoxIIE+WFAP/MBL2EFwC/YvLxw3Zeg==} - engines: {node: '>=0.10.0'} - - validate-npm-package-license@3.0.4: - resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==} - - validator@13.11.0: - resolution: {integrity: sha512-Ii+sehpSfZy+At5nPdnyMhx78fEoPDkR2XW/zimHEL3MyGJQOCQ7WeP20jPYRz7ZCpcKLB21NxuXHF3bxjStBQ==} - engines: {node: '>= 0.10'} - - vinyl-fs@2.4.3: - resolution: {integrity: sha512-XxYoy5HpHrVd76tpnI5Vv/+b/xlEVusOmn4LjQ01s2JyiDMNaUm3Rb7Y3xTkRw+YoRBVoUrCs7EAIFNXyIlI8Q==} - engines: {node: '>=0.10'} - - vinyl@1.2.0: - resolution: {integrity: sha512-Ci3wnR2uuSAWFMSglZuB8Z2apBdtOyz8CV7dC6/U1XbltXBC+IuutUkXQISz01P+US2ouBuesSbV6zILZ6BuzQ==} - engines: {node: '>= 0.9'} - - walker@1.0.8: - resolution: {integrity: sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==} - - watchpack@2.4.0: - resolution: {integrity: sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==} - engines: {node: '>=10.13.0'} - - wcwidth@1.0.1: - resolution: {integrity: sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==} - - 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'} - - webpack-sources@3.2.3: - resolution: {integrity: sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==} - engines: {node: '>=10.13.0'} - - webpack@5.87.0: - resolution: {integrity: sha512-GOu1tNbQ7p1bDEoFRs2YPcfyGs8xq52yyPBZ3m2VGnXGtV9MxjrkABHm4V9Ia280OefsSLzvbVoXcfLxjKY/Iw==} - engines: {node: '>=10.13.0'} - hasBin: true - peerDependencies: - webpack-cli: '*' - peerDependenciesMeta: - webpack-cli: - optional: true - - webpack@5.90.1: - resolution: {integrity: sha512-SstPdlAC5IvgFnhiRok8hqJo/+ArAbNv7rhU4fnWGHNVfN59HSQFaxZDSAL3IFG2YmqxuRs+IU33milSxbPlog==} - engines: {node: '>=10.13.0'} - hasBin: true - peerDependencies: - webpack-cli: '*' - peerDependenciesMeta: - webpack-cli: - optional: true - - whatwg-url@5.0.0: - resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} - - which@1.3.1: - resolution: {integrity: sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==} - hasBin: true - - which@2.0.2: - resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} - engines: {node: '>= 8'} - hasBin: true - - wide-align@1.1.5: - resolution: {integrity: sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==} - - window-size@0.2.0: - resolution: {integrity: sha512-UD7d8HFA2+PZsbKyaOCEy8gMh1oDtHgJh1LfgjQ4zVXmYjAT/kvz3PueITKuqDiIXQe7yzpPnxX3lNc+AhQMyw==} - engines: {node: '>= 0.10.0'} - hasBin: true - - windows-release@4.0.0: - resolution: {integrity: sha512-OxmV4wzDKB1x7AZaZgXMVsdJ1qER1ed83ZrTYd5Bwq2HfJVg3DJS8nqlAG4sMoJ7mu8cuRmLEYyU13BKwctRAg==} - engines: {node: '>=10'} +lockfileVersion: '6.0' + +dependencies: + '@apidevtools/json-schema-ref-parser': + specifier: ^11.5.4 + version: 11.5.4 + '@fastify/compress': + specifier: ^7.0.0 + version: 7.0.0 + '@fastify/cookie': + specifier: ^9.3.1 + version: 9.3.1 + '@fastify/cors': + specifier: ^9.0.1 + version: 9.0.1 + '@fastify/helmet': + specifier: ^11.1.1 + version: 11.1.1 + '@fastify/static': + specifier: ^6.12.0 + version: 6.12.0 + '@nestjs-cls/transactional': + specifier: ^2.2.0 + version: 2.2.0(@nestjs/common@10.0.0)(@nestjs/core@10.0.0)(nestjs-cls@4.2.0)(reflect-metadata@0.1.13)(rxjs@7.8.1) + '@nestjs-cls/transactional-adapter-prisma': + specifier: ^1.1.0 + version: 1.1.0(@nestjs-cls/transactional@2.2.0)(@prisma/client@5.10.2)(nestjs-cls@4.2.0)(prisma@5.10.2) + '@nestjs/cache-manager': + specifier: ^2.2.0 + version: 2.2.0(@nestjs/common@10.0.0)(@nestjs/core@10.0.0)(cache-manager@5.4.0)(reflect-metadata@0.1.13)(rxjs@7.8.1) + '@nestjs/common': + specifier: ^10.0.0 + version: 10.0.0(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.1.13)(rxjs@7.8.1) + '@nestjs/config': + specifier: ^3.1.1 + version: 3.1.1(@nestjs/common@10.0.0)(reflect-metadata@0.1.13) + '@nestjs/core': + specifier: ^10.0.0 + version: 10.0.0(@nestjs/common@10.0.0)(reflect-metadata@0.1.13)(rxjs@7.8.1) + '@nestjs/event-emitter': + specifier: ^2.0.3 + version: 2.0.3(@nestjs/common@10.0.0)(@nestjs/core@10.0.0)(reflect-metadata@0.1.13) + '@nestjs/jwt': + specifier: ^10.2.0 + version: 10.2.0(@nestjs/common@10.0.0) + '@nestjs/passport': + specifier: ^10.0.3 + version: 10.0.3(@nestjs/common@10.0.0)(passport@0.7.0) + '@nestjs/platform-fastify': + specifier: ^10.3.4 + version: 10.3.4(@fastify/static@6.12.0)(@nestjs/common@10.0.0)(@nestjs/core@10.0.0) + '@nestjs/swagger': + specifier: ^7.3.0 + version: 7.3.0(@fastify/static@6.12.0)(@nestjs/common@10.0.0)(@nestjs/core@10.0.0)(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.1.13) + '@nodeteam/nestjs-prisma-pagination': + specifier: ^1.0.6 + version: 1.0.6(@babel/core@7.23.9)(@nestjs/core@10.0.0)(@types/node@20.3.1)(cache-manager@5.4.0)(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.1.13)(rxjs@7.8.1)(ts-node@10.9.1) + '@prisma/client': + specifier: 5.10.2 + version: 5.10.2(prisma@5.10.2) + axios: + specifier: ^1.6.7 + version: 1.6.7(debug@2.6.9) + bcrypt: + specifier: ^5.1.1 + version: 5.1.1 + class-transformer: + specifier: ^0.5.1 + version: 0.5.1 + class-validator: + specifier: ^0.14.1 + version: 0.14.1 + dot: + specifier: ^1.1.3 + version: 1.1.3 + fastify: + specifier: 4.26.2 + version: 4.26.2 + fastify-ip: + specifier: ^1.0.0 + version: 1.0.0 + glob: + specifier: ^10.3.10 + version: 10.3.10 + jsonrepair: + specifier: ^3.7.0 + version: 3.7.0 + module: + specifier: ^1.2.5 + version: 1.2.5 + ms: + specifier: ^2.1.3 + version: 2.1.3 + nanoid: + specifier: 3.3.7 + version: 3.3.7 + nestjs-cls: + specifier: ^4.2.0 + version: 4.2.0(@nestjs/common@10.0.0)(@nestjs/core@10.0.0)(reflect-metadata@0.1.13)(rxjs@7.8.1) + nestjs-oauth2: + specifier: ^0.0.7 + version: 0.0.7(@nestjs/common@10.0.0)(rxjs@7.8.1) + nestjs-pino: + specifier: ^4.0.0 + version: 4.0.0(@nestjs/common@10.0.0)(pino-http@9.0.0) + nestjs-prisma: + specifier: ^0.23.0 + version: 0.23.0(@nestjs/common@10.0.0)(@prisma/client@5.10.2)(prisma@5.10.2) + passport-jwt: + specifier: ^4.0.1 + version: 4.0.1 + passport-local: + specifier: ^1.0.0 + version: 1.0.0 + pino: + specifier: ^8.18.0 + version: 8.18.0 + pino-http: + specifier: ^9.0.0 + version: 9.0.0 + pino-pretty: + specifier: ^10.3.1 + version: 10.3.1 + prisma-soft-delete-middleware: + specifier: ^1.3.1 + version: 1.3.1(@prisma/client@5.10.2) + reflect-metadata: + specifier: ^0.1.13 + version: 0.1.13 + rxjs: + specifier: ^7.8.1 + version: 7.8.1 + v8-sandbox: + specifier: ^3.2.10 + version: 3.2.10(debug@2.6.9) + +devDependencies: + '@chax-at/transactional-prisma-testing': + specifier: ^1.1.0 + version: 1.1.0(@prisma/client@5.10.2) + '@commitlint/cli': + specifier: ^19.2.0 + version: 19.2.0(@types/node@20.3.1)(typescript@5.1.3) + '@commitlint/config-angular': + specifier: ^19.1.0 + version: 19.1.0 + '@nestjs/cli': + specifier: ^10.0.0 + version: 10.0.0 + '@nestjs/schematics': + specifier: ^10.0.0 + version: 10.0.0(chokidar@3.5.3)(typescript@5.1.3) + '@nestjs/testing': + specifier: ^10.0.0 + version: 10.0.0(@nestjs/common@10.0.0)(@nestjs/core@10.0.0) + '@pond918/prisma-generator-nestjs-dto': + specifier: ^1.17.513 + version: 1.17.513 + '@types/bcrypt': + specifier: ^5.0.2 + version: 5.0.2 + '@types/dot': + specifier: ^1.1.7 + version: 1.1.7 + '@types/express': + specifier: ^4.17.17 + version: 4.17.17 + '@types/jest': + specifier: ^29.5.2 + version: 29.5.2 + '@types/ms': + specifier: ^0.7.34 + version: 0.7.34 + '@types/node': + specifier: ^20.3.1 + version: 20.3.1 + '@types/passport-jwt': + specifier: ^4.0.1 + version: 4.0.1 + '@types/passport-local': + specifier: ^1.0.38 + version: 1.0.38 + '@types/supertest': + specifier: ^6.0.0 + version: 6.0.0 + '@typescript-eslint/eslint-plugin': + specifier: ^6.0.0 + version: 6.0.0(@typescript-eslint/parser@6.0.0)(eslint@8.42.0)(typescript@5.1.3) + '@typescript-eslint/parser': + specifier: ^6.0.0 + version: 6.0.0(eslint@8.42.0)(typescript@5.1.3) + commitizen: + specifier: ^4.3.0 + version: 4.3.0(@types/node@20.3.1)(typescript@5.1.3) + cz-conventional-changelog: + specifier: ^3.3.0 + version: 3.3.0(@types/node@20.3.1)(typescript@5.1.3) + eslint: + specifier: ^8.42.0 + version: 8.42.0 + eslint-config-prettier: + specifier: ^9.0.0 + version: 9.0.0(eslint@8.42.0) + eslint-plugin-prettier: + specifier: ^5.0.0 + version: 5.0.0(eslint-config-prettier@9.0.0)(eslint@8.42.0)(prettier@3.0.0) + husky: + specifier: ^9.0.11 + version: 9.0.11 + jest: + specifier: ^29.5.0 + version: 29.5.0(@types/node@20.3.1)(ts-node@10.9.1) + pactum: + specifier: ^3.6.3 + version: 3.6.3 + pactum-matchers: + specifier: ^1.1.6 + version: 1.1.6 + prettier: + specifier: ^3.0.0 + version: 3.0.0 + prisma: + specifier: ^5.10.2 + version: 5.10.2 + source-map-support: + specifier: ^0.5.21 + version: 0.5.21 + standard-version: + specifier: ^9.5.0 + version: 9.5.0 + supertest: + specifier: ^6.3.3 + version: 6.3.3 + ts-jest: + specifier: ^29.1.0 + version: 29.1.0(@babel/core@7.23.9)(jest@29.5.0)(typescript@5.1.3) + ts-loader: + specifier: ^9.4.3 + version: 9.4.3(typescript@5.1.3)(webpack@5.90.1) + ts-node: + specifier: ^10.9.1 + version: 10.9.1(@types/node@20.3.1)(typescript@5.1.3) + tsconfig-paths: + specifier: ^4.2.0 + version: 4.2.0 + typescript: + specifier: ^5.1.3 + version: 5.1.3 - 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==} +packages: - wrap-ansi@2.1.0: - resolution: {integrity: sha512-vAaEaDM946gbNpH5pLVNR+vX2ht6n0Bt3GXwVB1AuAqZosOvHNF3P7wDnh8KLkSqgUh0uh77le7Owgoz+Z9XBw==} + /@aashutoshrathi/word-wrap@1.2.6: + resolution: {integrity: sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==} engines: {node: '>=0.10.0'} + dev: true - wrap-ansi@7.0.0: - resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} - engines: {node: '>=10'} - - wrap-ansi@8.1.0: - resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} - engines: {node: '>=12'} - - wrappy@1.0.2: - resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} - - write-file-atomic@4.0.2: - resolution: {integrity: sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==} - engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} - - xtend@4.0.2: - resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==} - engines: {node: '>=0.4'} - - y18n@3.2.2: - resolution: {integrity: sha512-uGZHXkHnhF0XeeAPgnKfPv1bgKAYyVvmNL1xlKsPYZPaIHxGti2hHqvOCQv71XMsLxu1QjergkqogUnms5D3YQ==} - - y18n@5.0.8: - resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} - engines: {node: '>=10'} - - yallist@3.1.1: - resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} - - yallist@4.0.0: - resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} - - yaml@1.10.2: - resolution: {integrity: sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==} - engines: {node: '>= 6'} - - yargs-parser@2.4.1: - resolution: {integrity: sha512-9pIKIJhnI5tonzG6OnCFlz/yln8xHYcGl+pn3xR0Vzff0vzN1PbNRaelgfgRUwZ3s4i3jvxT9WhmUGL4whnasA==} - - yargs-parser@20.2.9: - resolution: {integrity: sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==} - engines: {node: '>=10'} - - yargs-parser@21.1.1: - resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} - engines: {node: '>=12'} - - yargs@16.2.0: - resolution: {integrity: sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==} - engines: {node: '>=10'} - - yargs@17.7.2: - resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} - engines: {node: '>=12'} - - yargs@4.6.0: - resolution: {integrity: sha512-KmjJbWBkYiSRUChcOSa4rtBxDXf0j4ISz+tpeNa4LKIBllgKnkemJ3x4yo4Yydp3wPU4/xJTaKTLLZ8V7zhI7A==} - - yn@3.1.1: - resolution: {integrity: sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==} - engines: {node: '>=6'} - - yocto-queue@0.1.0: - resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} - engines: {node: '>=10'} - - yocto-queue@1.0.0: - resolution: {integrity: sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==} - engines: {node: '>=12.20'} - -snapshots: - - '@aashutoshrathi/word-wrap@1.2.6': {} - - '@ampproject/remapping@2.2.1': + /@ampproject/remapping@2.2.1: + resolution: {integrity: sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==} + engines: {node: '>=6.0.0'} dependencies: '@jridgewell/gen-mapping': 0.3.3 '@jridgewell/trace-mapping': 0.3.22 - '@angular-devkit/core@13.3.11': + /@angular-devkit/core@13.3.11: + resolution: {integrity: sha512-rfqoLMRYhlz0wzKlHx7FfyIyQq8dKTsmbCoIVU1cEIH0gyTMVY7PbVzwRRcO6xp5waY+0hA+0Brriujpuhkm4w==} + engines: {node: ^12.20.0 || ^14.15.0 || >=16.10.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: '>= 1.13.0'} + peerDependencies: + chokidar: ^3.5.2 + peerDependenciesMeta: + chokidar: + optional: true dependencies: ajv: 8.9.0 ajv-formats: 2.1.1(ajv@8.9.0) @@ -5087,8 +276,16 @@ snapshots: magic-string: 0.25.7 rxjs: 6.6.7 source-map: 0.7.3 + dev: false - '@angular-devkit/core@16.1.0(chokidar@3.5.3)': + /@angular-devkit/core@16.1.0(chokidar@3.5.3): + resolution: {integrity: sha512-mrWpuDvttmhrCGcLc68RIXKtTzUhkBTsE5ZZFZNO1+FSC+vO/ZpyCpPd6C+6coM68NfXYjHlms5XF6KbxeGn/Q==} + engines: {node: ^16.14.0 || >=18.10.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: '>= 1.13.0'} + peerDependencies: + chokidar: ^3.5.2 + peerDependenciesMeta: + chokidar: + optional: true dependencies: ajv: 8.12.0 ajv-formats: 2.1.1(ajv@8.12.0) @@ -5096,8 +293,12 @@ snapshots: jsonc-parser: 3.2.0 rxjs: 7.8.1 source-map: 0.7.4 + dev: true - '@angular-devkit/schematics-cli@16.1.0(chokidar@3.5.3)': + /@angular-devkit/schematics-cli@16.1.0(chokidar@3.5.3): + resolution: {integrity: sha512-siBpRDmMMV7NB+NvaDHeJ4doHoSkFwIywwFj8GXnBCtobyxrBl1EyG1cKK+FHRydYtyYIk8FEoOpJA9oE9S2hg==} + engines: {node: ^16.14.0 || >=18.10.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: '>= 1.13.0'} + hasBin: true dependencies: '@angular-devkit/core': 16.1.0(chokidar@3.5.3) '@angular-devkit/schematics': 16.1.0(chokidar@3.5.3) @@ -5107,8 +308,11 @@ snapshots: yargs-parser: 21.1.1 transitivePeerDependencies: - chokidar + dev: true - '@angular-devkit/schematics@13.3.11': + /@angular-devkit/schematics@13.3.11: + resolution: {integrity: sha512-ben+EGXpCrClnIVAAnEQmhQdKmnnqFhMp5BqMxgOslSYBAmCutLA6rBu5vsc8kZcGian1wt+lueF7G1Uk5cGBg==} + engines: {node: ^12.20.0 || ^14.15.0 || >=16.10.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: '>= 1.13.0'} dependencies: '@angular-devkit/core': 13.3.11 jsonc-parser: 3.0.0 @@ -5117,8 +321,11 @@ snapshots: rxjs: 6.6.7 transitivePeerDependencies: - chokidar + dev: false - '@angular-devkit/schematics@16.1.0(chokidar@3.5.3)': + /@angular-devkit/schematics@16.1.0(chokidar@3.5.3): + resolution: {integrity: sha512-LM35PH9DT3eQRSZgrkk2bx1ZQjjVh8BCByTlr37/c+FnF9mNbeBsa1YkxrlsN/CwO+045OwEwRHnkM9Zcx0U/A==} + engines: {node: ^16.14.0 || >=18.10.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: '>= 1.13.0'} dependencies: '@angular-devkit/core': 16.1.0(chokidar@3.5.3) jsonc-parser: 3.2.0 @@ -5127,23 +334,36 @@ snapshots: rxjs: 7.8.1 transitivePeerDependencies: - chokidar + dev: true - '@apidevtools/json-schema-ref-parser@11.5.4': + /@apidevtools/json-schema-ref-parser@11.5.4: + resolution: {integrity: sha512-o2fsypTGU0WxRxbax8zQoHiIB4dyrkwYfcm8TxZ+bx9pCzcWZbQtiMqpgBvWA/nJ2TrGjK5adCLfTH8wUeU/Wg==} + engines: {node: '>= 16'} dependencies: '@jsdevtools/ono': 7.1.3 '@types/json-schema': 7.0.15 js-yaml: 4.1.0 + dev: false - '@arr/every@1.0.1': {} + /@arr/every@1.0.1: + resolution: {integrity: sha512-UQFQ6SgyJ6LX42W8rHCs8KVc0JS0tzVL9ct4XYedJukskYVWTo49tNiMEK9C2HTyarbNiT/RVIRSY82vH+6sTg==} + engines: {node: '>=4'} + dev: true - '@babel/code-frame@7.23.5': + /@babel/code-frame@7.23.5: + resolution: {integrity: sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA==} + engines: {node: '>=6.9.0'} dependencies: '@babel/highlight': 7.23.4 chalk: 2.4.2 - '@babel/compat-data@7.23.5': {} + /@babel/compat-data@7.23.5: + resolution: {integrity: sha512-uU27kfDRlhfKl+w1U6vp16IuvSLtjAxdArVXPa9BvLkrr7CYIsxH5adpHObeAGY/41+syctUWOZ140a2Rvkgjw==} + engines: {node: '>=6.9.0'} - '@babel/core@7.23.9': + /@babel/core@7.23.9: + resolution: {integrity: sha512-5q0175NOjddqpvvzU+kDiSOAk4PfdO6FvwCWoQ6RO7rTzEe8vlo+4HVfcnAREhD4npMs0e9uZypjTwzZPCf/cw==} + engines: {node: '>=6.9.0'} dependencies: '@ampproject/remapping': 2.2.1 '@babel/code-frame': 7.23.5 @@ -5163,14 +383,18 @@ snapshots: transitivePeerDependencies: - supports-color - '@babel/generator@7.23.6': + /@babel/generator@7.23.6: + resolution: {integrity: sha512-qrSfCYxYQB5owCmGLbl8XRpX1ytXlpueOb0N0UmQwA073KZxejgQTzAmJezxvpwQD9uGtK2shHdi55QT+MbjIw==} + engines: {node: '>=6.9.0'} dependencies: '@babel/types': 7.23.9 '@jridgewell/gen-mapping': 0.3.3 '@jridgewell/trace-mapping': 0.3.22 jsesc: 2.5.2 - '@babel/helper-compilation-targets@7.23.6': + /@babel/helper-compilation-targets@7.23.6: + resolution: {integrity: sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ==} + engines: {node: '>=6.9.0'} dependencies: '@babel/compat-data': 7.23.5 '@babel/helper-validator-option': 7.23.5 @@ -5178,22 +402,34 @@ snapshots: lru-cache: 5.1.1 semver: 6.3.1 - '@babel/helper-environment-visitor@7.22.20': {} + /@babel/helper-environment-visitor@7.22.20: + resolution: {integrity: sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==} + engines: {node: '>=6.9.0'} - '@babel/helper-function-name@7.23.0': + /@babel/helper-function-name@7.23.0: + resolution: {integrity: sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==} + engines: {node: '>=6.9.0'} dependencies: '@babel/template': 7.23.9 '@babel/types': 7.23.9 - '@babel/helper-hoist-variables@7.22.5': + /@babel/helper-hoist-variables@7.22.5: + resolution: {integrity: sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==} + engines: {node: '>=6.9.0'} dependencies: '@babel/types': 7.23.9 - '@babel/helper-module-imports@7.22.15': + /@babel/helper-module-imports@7.22.15: + resolution: {integrity: sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==} + engines: {node: '>=6.9.0'} dependencies: '@babel/types': 7.23.9 - '@babel/helper-module-transforms@7.23.3(@babel/core@7.23.9)': + /@babel/helper-module-transforms@7.23.3(@babel/core@7.23.9): + resolution: {integrity: sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 dependencies: '@babel/core': 7.23.9 '@babel/helper-environment-visitor': 7.22.20 @@ -5202,23 +438,37 @@ snapshots: '@babel/helper-split-export-declaration': 7.22.6 '@babel/helper-validator-identifier': 7.22.20 - '@babel/helper-plugin-utils@7.22.5': {} + /@babel/helper-plugin-utils@7.22.5: + resolution: {integrity: sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==} + engines: {node: '>=6.9.0'} - '@babel/helper-simple-access@7.22.5': + /@babel/helper-simple-access@7.22.5: + resolution: {integrity: sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==} + engines: {node: '>=6.9.0'} dependencies: '@babel/types': 7.23.9 - '@babel/helper-split-export-declaration@7.22.6': + /@babel/helper-split-export-declaration@7.22.6: + resolution: {integrity: sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==} + engines: {node: '>=6.9.0'} dependencies: '@babel/types': 7.23.9 - '@babel/helper-string-parser@7.23.4': {} + /@babel/helper-string-parser@7.23.4: + resolution: {integrity: sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ==} + engines: {node: '>=6.9.0'} - '@babel/helper-validator-identifier@7.22.20': {} + /@babel/helper-validator-identifier@7.22.20: + resolution: {integrity: sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==} + engines: {node: '>=6.9.0'} - '@babel/helper-validator-option@7.23.5': {} + /@babel/helper-validator-option@7.23.5: + resolution: {integrity: sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw==} + engines: {node: '>=6.9.0'} - '@babel/helpers@7.23.9': + /@babel/helpers@7.23.9: + resolution: {integrity: sha512-87ICKgU5t5SzOT7sBMfCOZQ2rHjRU+Pcb9BoILMYz600W6DkVRLFBPwQ18gwUVvggqXivaUakpnxWQGbpywbBQ==} + engines: {node: '>=6.9.0'} dependencies: '@babel/template': 7.23.9 '@babel/traverse': 7.23.9 @@ -5226,93 +476,147 @@ snapshots: transitivePeerDependencies: - supports-color - '@babel/highlight@7.23.4': + /@babel/highlight@7.23.4: + resolution: {integrity: sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A==} + engines: {node: '>=6.9.0'} dependencies: '@babel/helper-validator-identifier': 7.22.20 chalk: 2.4.2 js-tokens: 4.0.0 - '@babel/parser@7.23.9': + /@babel/parser@7.23.9: + resolution: {integrity: sha512-9tcKgqKbs3xGJ+NtKF2ndOBBLVwPjl1SHxPQkd36r3Dlirw3xWUeGaTbqr7uGZcTaxkVNwc+03SVP7aCdWrTlA==} + engines: {node: '>=6.0.0'} + hasBin: true dependencies: '@babel/types': 7.23.9 - '@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.23.9)': + /@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.23.9): + resolution: {integrity: sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==} + peerDependencies: + '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.23.9 '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-bigint@7.8.3(@babel/core@7.23.9)': + /@babel/plugin-syntax-bigint@7.8.3(@babel/core@7.23.9): + resolution: {integrity: sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==} + peerDependencies: + '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.23.9 '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.23.9)': + /@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.23.9): + resolution: {integrity: sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==} + peerDependencies: + '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.23.9 '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.23.9)': + /@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.23.9): + resolution: {integrity: sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==} + peerDependencies: + '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.23.9 '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.23.9)': + /@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.23.9): + resolution: {integrity: sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==} + peerDependencies: + '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.23.9 '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-jsx@7.23.3(@babel/core@7.23.9)': + /@babel/plugin-syntax-jsx@7.23.3(@babel/core@7.23.9): + resolution: {integrity: sha512-EB2MELswq55OHUoRZLGg/zC7QWUKfNLpE57m/S2yr1uEneIgsTgrSzXP3NXEsMkVn76OlaVVnzN+ugObuYGwhg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.23.9 '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.23.9)': + /@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.23.9): + resolution: {integrity: sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==} + peerDependencies: + '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.23.9 '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.23.9)': + /@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.23.9): + resolution: {integrity: sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==} + peerDependencies: + '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.23.9 '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.23.9)': + /@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.23.9): + resolution: {integrity: sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==} + peerDependencies: + '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.23.9 '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.23.9)': + /@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.23.9): + resolution: {integrity: sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==} + peerDependencies: + '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.23.9 '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.23.9)': + /@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.23.9): + resolution: {integrity: sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==} + peerDependencies: + '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.23.9 '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.23.9)': + /@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.23.9): + resolution: {integrity: sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==} + peerDependencies: + '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.23.9 '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.23.9)': + /@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.23.9): + resolution: {integrity: sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.23.9 '@babel/helper-plugin-utils': 7.22.5 - '@babel/plugin-syntax-typescript@7.23.3(@babel/core@7.23.9)': + /@babel/plugin-syntax-typescript@7.23.3(@babel/core@7.23.9): + resolution: {integrity: sha512-9EiNjVJOMwCO+43TqoTrgQ8jMwcAd0sWyXi9RPfIsLTj4R2MADDDQXELhffaUx/uJv2AYcxBgPwH6j4TIA4ytQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.23.9 '@babel/helper-plugin-utils': 7.22.5 - '@babel/template@7.23.9': + /@babel/template@7.23.9: + resolution: {integrity: sha512-+xrD2BWLpvHKNmX2QbpdpsBaWnRxahMwJjO+KZk2JOElj5nSmKezyS1B4u+QbHMTX69t4ukm6hh9lsYQ7GHCKA==} + engines: {node: '>=6.9.0'} dependencies: '@babel/code-frame': 7.23.5 '@babel/parser': 7.23.9 '@babel/types': 7.23.9 - '@babel/traverse@7.23.9': + /@babel/traverse@7.23.9: + resolution: {integrity: sha512-I/4UJ9vs90OkBtY6iiiTORVMyIhJ4kAVmsKo9KFc8UOxMeUfi2hvtIBsET5u9GizXE6/GFSuKCTNfgCswuEjRg==} + engines: {node: '>=6.9.0'} dependencies: '@babel/code-frame': 7.23.5 '@babel/generator': 7.23.6 @@ -5327,22 +631,37 @@ snapshots: transitivePeerDependencies: - supports-color - '@babel/types@7.23.9': + /@babel/types@7.23.9: + resolution: {integrity: sha512-dQjSq/7HaSjRM43FFGnv5keM2HsxpmyV1PfaSVm0nzzjwwTmjOe6J4bC8e3+pTEIgHaHj+1ZlLThRJ2auc/w1Q==} + engines: {node: '>=6.9.0'} dependencies: '@babel/helper-string-parser': 7.23.4 '@babel/helper-validator-identifier': 7.22.20 to-fast-properties: 2.0.0 - '@bcoe/v8-coverage@0.2.3': {} + /@bcoe/v8-coverage@0.2.3: + resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==} - '@chax-at/transactional-prisma-testing@1.1.0(@prisma/client@5.10.2)': + /@chax-at/transactional-prisma-testing@1.1.0(@prisma/client@5.10.2): + resolution: {integrity: sha512-BT2KRg2mfHbjW3gb3u5RtXjwvodywA8uvOX5Szm2J6KotgYJ/vRnCJ8LKp+kb/dbHhnPIrOCTtj6AY1Xku8Wng==} + engines: {node: '>= 14'} + peerDependencies: + '@prisma/client': ^4.7.0 || 5 dependencies: '@prisma/client': 5.10.2(prisma@5.10.2) + dev: true - '@colors/colors@1.5.0': + /@colors/colors@1.5.0: + resolution: {integrity: sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==} + engines: {node: '>=0.1.90'} + requiresBuild: true + dev: true optional: true - '@commitlint/cli@19.2.0(@types/node@20.3.1)(typescript@5.1.3)': + /@commitlint/cli@19.2.0(@types/node@20.3.1)(typescript@5.1.3): + resolution: {integrity: sha512-8XnQDMyQR+1/ldbmIyhonvnDS2enEw48Wompo/967fsEvy9Vj5/JbDutzmSBKxANWDVeEbR9QQm0yHpw6ArrFw==} + engines: {node: '>=v18'} + hasBin: true dependencies: '@commitlint/format': 19.0.3 '@commitlint/lint': 19.1.0 @@ -5354,19 +673,31 @@ snapshots: transitivePeerDependencies: - '@types/node' - typescript + dev: true - '@commitlint/config-angular-type-enum@19.1.0': {} + /@commitlint/config-angular-type-enum@19.1.0: + resolution: {integrity: sha512-eLjt7vSArP62kpDmmIZNdIBjPzbqY8jss6mVOcSDm4t1KfDw4UmPrtPh/7zcIL3GI5uf/7W8d2s3K0qisf9C+g==} + engines: {node: '>=v18'} + dev: true - '@commitlint/config-angular@19.1.0': + /@commitlint/config-angular@19.1.0: + resolution: {integrity: sha512-qZyG9FHjPoG+VaHxH1OruWI8cmWWRe00sAS73jXAhACimT74k4Dex5jI2cKFcXSH8Ebh1yGwxfjzSgup5O0ykA==} + engines: {node: '>=v18'} dependencies: '@commitlint/config-angular-type-enum': 19.1.0 + dev: true - '@commitlint/config-validator@19.0.3': + /@commitlint/config-validator@19.0.3: + resolution: {integrity: sha512-2D3r4PKjoo59zBc2auodrSCaUnCSALCx54yveOFwwP/i2kfEAQrygwOleFWswLqK0UL/F9r07MFi5ev2ohyM4Q==} + engines: {node: '>=v18'} dependencies: '@commitlint/types': 19.0.3 ajv: 8.12.0 + dev: true - '@commitlint/ensure@19.0.3': + /@commitlint/ensure@19.0.3: + resolution: {integrity: sha512-SZEpa/VvBLoT+EFZVb91YWbmaZ/9rPH3ESrINOl0HD2kMYsjvl0tF7nMHh0EpTcv4+gTtZBAe1y/SS6/OhfZzQ==} + engines: {node: '>=v18'} dependencies: '@commitlint/types': 19.0.3 lodash.camelcase: 4.3.0 @@ -5374,27 +705,42 @@ snapshots: lodash.snakecase: 4.1.1 lodash.startcase: 4.4.0 lodash.upperfirst: 4.3.1 + dev: true - '@commitlint/execute-rule@19.0.0': {} + /@commitlint/execute-rule@19.0.0: + resolution: {integrity: sha512-mtsdpY1qyWgAO/iOK0L6gSGeR7GFcdW7tIjcNFxcWkfLDF5qVbPHKuGATFqRMsxcO8OUKNj0+3WOHB7EHm4Jdw==} + engines: {node: '>=v18'} + dev: true - '@commitlint/format@19.0.3': + /@commitlint/format@19.0.3: + resolution: {integrity: sha512-QjjyGyoiVWzx1f5xOteKHNLFyhyweVifMgopozSgx1fGNrGV8+wp7k6n1t6StHdJ6maQJ+UUtO2TcEiBFRyR6Q==} + engines: {node: '>=v18'} dependencies: '@commitlint/types': 19.0.3 chalk: 5.3.0 + dev: true - '@commitlint/is-ignored@19.0.3': + /@commitlint/is-ignored@19.0.3: + resolution: {integrity: sha512-MqDrxJaRSVSzCbPsV6iOKG/Lt52Y+PVwFVexqImmYYFhe51iVJjK2hRhOG2jUAGiUHk4jpdFr0cZPzcBkSzXDQ==} + engines: {node: '>=v18'} dependencies: '@commitlint/types': 19.0.3 semver: 7.6.0 + dev: true - '@commitlint/lint@19.1.0': + /@commitlint/lint@19.1.0: + resolution: {integrity: sha512-ESjaBmL/9cxm+eePyEr6SFlBUIYlYpI80n+Ltm7IA3MAcrmiP05UMhJdAD66sO8jvo8O4xdGn/1Mt2G5VzfZKw==} + engines: {node: '>=v18'} dependencies: '@commitlint/is-ignored': 19.0.3 '@commitlint/parse': 19.0.3 '@commitlint/rules': 19.0.3 '@commitlint/types': 19.0.3 + dev: true - '@commitlint/load@19.2.0(@types/node@20.3.1)(typescript@5.1.3)': + /@commitlint/load@19.2.0(@types/node@20.3.1)(typescript@5.1.3): + resolution: {integrity: sha512-XvxxLJTKqZojCxaBQ7u92qQLFMMZc4+p9qrIq/9kJDy8DOrEa7P1yx7Tjdc2u2JxIalqT4KOGraVgCE7eCYJyQ==} + engines: {node: '>=v18'} dependencies: '@commitlint/config-validator': 19.0.3 '@commitlint/execute-rule': 19.0.0 @@ -5409,24 +755,36 @@ snapshots: transitivePeerDependencies: - '@types/node' - typescript + dev: true - '@commitlint/message@19.0.0': {} + /@commitlint/message@19.0.0: + resolution: {integrity: sha512-c9czf6lU+9oF9gVVa2lmKaOARJvt4soRsVmbR7Njwp9FpbBgste5i7l/2l5o8MmbwGh4yE1snfnsy2qyA2r/Fw==} + engines: {node: '>=v18'} + dev: true - '@commitlint/parse@19.0.3': + /@commitlint/parse@19.0.3: + resolution: {integrity: sha512-Il+tNyOb8VDxN3P6XoBBwWJtKKGzHlitEuXA5BP6ir/3loWlsSqDr5aecl6hZcC/spjq4pHqNh0qPlfeWu38QA==} + engines: {node: '>=v18'} dependencies: '@commitlint/types': 19.0.3 conventional-changelog-angular: 7.0.0 conventional-commits-parser: 5.0.0 + dev: true - '@commitlint/read@19.2.0': + /@commitlint/read@19.2.0: + resolution: {integrity: sha512-HlGeEd/jyp2a5Fb9mvtsaDm5hFCmj80dJYjLQkpG3DzWneWBc37YU3kM8Za1D1HUazZaTkdsWq73M3XDE4CvCA==} + engines: {node: '>=v18'} dependencies: '@commitlint/top-level': 19.0.0 '@commitlint/types': 19.0.3 execa: 8.0.1 git-raw-commits: 4.0.0 minimist: 1.2.8 + dev: true - '@commitlint/resolve-extends@19.1.0': + /@commitlint/resolve-extends@19.1.0: + resolution: {integrity: sha512-z2riI+8G3CET5CPgXJPlzftH+RiWYLMYv4C9tSLdLXdr6pBNimSKukYP9MS27ejmscqCTVA4almdLh0ODD2KYg==} + engines: {node: '>=v18'} dependencies: '@commitlint/config-validator': 19.0.3 '@commitlint/types': 19.0.3 @@ -5434,38 +792,63 @@ snapshots: import-meta-resolve: 4.0.0 lodash.mergewith: 4.6.2 resolve-from: 5.0.0 + dev: true - '@commitlint/rules@19.0.3': + /@commitlint/rules@19.0.3: + resolution: {integrity: sha512-TspKb9VB6svklxNCKKwxhELn7qhtY1rFF8ls58DcFd0F97XoG07xugPjjbVnLqmMkRjZDbDIwBKt9bddOfLaPw==} + engines: {node: '>=v18'} dependencies: '@commitlint/ensure': 19.0.3 '@commitlint/message': 19.0.0 '@commitlint/to-lines': 19.0.0 '@commitlint/types': 19.0.3 execa: 8.0.1 + dev: true - '@commitlint/to-lines@19.0.0': {} + /@commitlint/to-lines@19.0.0: + resolution: {integrity: sha512-vkxWo+VQU5wFhiP9Ub9Sre0FYe019JxFikrALVoD5UGa8/t3yOJEpEhxC5xKiENKKhUkTpEItMTRAjHw2SCpZw==} + engines: {node: '>=v18'} + dev: true - '@commitlint/top-level@19.0.0': + /@commitlint/top-level@19.0.0: + resolution: {integrity: sha512-KKjShd6u1aMGNkCkaX4aG1jOGdn7f8ZI8TR1VEuNqUOjWTOdcDSsmglinglJ18JTjuBX5I1PtjrhQCRcixRVFQ==} + engines: {node: '>=v18'} dependencies: find-up: 7.0.0 + dev: true - '@commitlint/types@19.0.3': + /@commitlint/types@19.0.3: + resolution: {integrity: sha512-tpyc+7i6bPG9mvaBbtKUeghfyZSDgWquIDfMgqYtTbmZ9Y9VzEm2je9EYcQ0aoz5o7NvGS+rcDec93yO08MHYA==} + engines: {node: '>=v18'} dependencies: '@types/conventional-commits-parser': 5.0.0 chalk: 5.3.0 + dev: true - '@cspotcode/source-map-support@0.8.1': + /@cspotcode/source-map-support@0.8.1: + resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==} + engines: {node: '>=12'} dependencies: '@jridgewell/trace-mapping': 0.3.9 - '@eslint-community/eslint-utils@4.4.0(eslint@8.42.0)': + /@eslint-community/eslint-utils@4.4.0(eslint@8.42.0): + resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 dependencies: eslint: 8.42.0 eslint-visitor-keys: 3.4.3 + dev: true - '@eslint-community/regexpp@4.10.0': {} + /@eslint-community/regexpp@4.10.0: + resolution: {integrity: sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==} + engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} + dev: true - '@eslint/eslintrc@2.1.4': + /@eslint/eslintrc@2.1.4: + resolution: {integrity: sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dependencies: ajv: 6.12.6 debug: 4.3.4 @@ -5478,20 +861,32 @@ snapshots: strip-json-comments: 3.1.1 transitivePeerDependencies: - supports-color + dev: true - '@eslint/js@8.42.0': {} + /@eslint/js@8.42.0: + resolution: {integrity: sha512-6SWlXpWU5AvId8Ac7zjzmIOqMOba/JWY8XZ4A7q7Gn1Vlfg/SFFIlrtHXt9nPn4op9ZPAkl91Jao+QQv3r/ukw==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dev: true - '@exodus/schemasafe@1.3.0': {} + /@exodus/schemasafe@1.3.0: + resolution: {integrity: sha512-5Aap/GaRupgNx/feGBwLLTVv8OQFfv3pq2lPRzPg9R+IOBnDgghTGW7l7EuVXOvg5cc/xSAlRW8rBrjIC3Nvqw==} + dev: true - '@fastify/accept-negotiator@1.1.0': {} + /@fastify/accept-negotiator@1.1.0: + resolution: {integrity: sha512-OIHZrb2ImZ7XG85HXOONLcJWGosv7sIvM2ifAPQVhg9Lv7qdmMBNVaai4QTdyuaqbKM5eO6sLSQOYI7wEQeCJQ==} + engines: {node: '>=14'} + dev: false - '@fastify/ajv-compiler@3.5.0': + /@fastify/ajv-compiler@3.5.0: + resolution: {integrity: sha512-ebbEtlI7dxXF5ziNdr05mOY8NnDiPB1XvAlLHctRt/Rc+C3LCOVW5imUVX+mhvUhnNzmPBHewUkOFgGlCxgdAA==} dependencies: ajv: 8.12.0 ajv-formats: 2.1.1(ajv@8.12.0) fast-uri: 2.3.0 + dev: false - '@fastify/compress@7.0.0': + /@fastify/compress@7.0.0: + resolution: {integrity: sha512-jo/NaBVHP1OXIf8Kmr3bZyYQB0gAIgcy5c8rRKTPjhklHO7lRs/6ZFckUVT0NtbKSvrTuIcmSkxYpjyv3FNHXA==} dependencies: '@fastify/accept-negotiator': 1.1.0 fastify-plugin: 4.5.1 @@ -5501,53 +896,73 @@ snapshots: peek-stream: 1.1.3 pump: 3.0.0 pumpify: 2.0.1 + dev: false - '@fastify/cookie@9.3.1': + /@fastify/cookie@9.3.1: + resolution: {integrity: sha512-h1NAEhB266+ZbZ0e9qUE6NnNR07i7DnNXWG9VbbZ8uC6O/hxHpl+Zoe5sw1yfdZ2U6XhToUGDnzQtWJdCaPwfg==} dependencies: cookie-signature: 1.2.1 fastify-plugin: 4.5.1 + dev: false - '@fastify/cors@9.0.1': + /@fastify/cors@9.0.1: + resolution: {integrity: sha512-YY9Ho3ovI+QHIL2hW+9X4XqQjXLjJqsU+sMV/xFsxZkE8p3GNnYVFpoOxF7SsP5ZL76gwvbo3V9L+FIekBGU4Q==} dependencies: fastify-plugin: 4.5.1 mnemonist: 0.39.6 + dev: false - '@fastify/error@3.4.1': {} + /@fastify/error@3.4.1: + resolution: {integrity: sha512-wWSvph+29GR783IhmvdwWnN4bUxTD01Vm5Xad4i7i1VuAOItLvbPAb69sb0IQ2N57yprvhNIwAP5B6xfKTmjmQ==} + dev: false - '@fastify/fast-json-stringify-compiler@4.3.0': + /@fastify/fast-json-stringify-compiler@4.3.0: + resolution: {integrity: sha512-aZAXGYo6m22Fk1zZzEUKBvut/CIIQe/BapEORnxiD5Qr0kPHqqI69NtEMCme74h+at72sPhbkb4ZrLd1W3KRLA==} dependencies: fast-json-stringify: 5.12.0 + dev: false - '@fastify/formbody@7.4.0': + /@fastify/formbody@7.4.0: + resolution: {integrity: sha512-H3C6h1GN56/SMrZS8N2vCT2cZr7mIHzBHzOBa5OPpjfB/D6FzP9mMpE02ZzrFX0ANeh0BAJdoXKOF2e7IbV+Og==} dependencies: fast-querystring: 1.1.2 fastify-plugin: 4.5.1 + dev: false - '@fastify/helmet@11.1.1': + /@fastify/helmet@11.1.1: + resolution: {integrity: sha512-pjJxjk6SLEimITWadtYIXt6wBMfFC1I6OQyH/jYVCqSAn36sgAIFjeNiibHtifjCd+e25442pObis3Rjtame6A==} dependencies: fastify-plugin: 4.5.1 helmet: 7.1.0 + dev: false - '@fastify/merge-json-schemas@0.1.1': + /@fastify/merge-json-schemas@0.1.1: + resolution: {integrity: sha512-fERDVz7topgNjtXsJTTW1JKLy0rhuLRcquYqNR9rF7OcVpCa2OVW49ZPDIhaRRCaUuvVxI+N416xUoF76HNSXA==} dependencies: fast-deep-equal: 3.1.3 + dev: false - '@fastify/middie@8.3.0': + /@fastify/middie@8.3.0: + resolution: {integrity: sha512-h+zBxCzMlkEkh4fM7pZaSGzqS7P9M0Z6rXnWPdUEPfe7x1BCj++wEk/pQ5jpyYY4pF8AknFqb77n7uwh8HdxEA==} dependencies: '@fastify/error': 3.4.1 fastify-plugin: 4.5.1 path-to-regexp: 6.2.1 reusify: 1.0.4 + dev: false - '@fastify/send@2.1.0': + /@fastify/send@2.1.0: + resolution: {integrity: sha512-yNYiY6sDkexoJR0D8IDy3aRP3+L4wdqCpvx5WP+VtEU58sn7USmKynBzDQex5X42Zzvw2gNzzYgP90UfWShLFA==} dependencies: '@lukeed/ms': 2.0.2 escape-html: 1.0.3 fast-decode-uri-component: 1.0.1 http-errors: 2.0.0 mime: 3.0.0 + dev: false - '@fastify/static@6.12.0': + /@fastify/static@6.12.0: + resolution: {integrity: sha512-KK1B84E6QD/FcQWxDI2aiUCwHxMJBI1KeCUzm1BwYpPY1b742+jeKruGHP2uOluuM6OkBPI8CIANrXcCRtC2oQ==} dependencies: '@fastify/accept-negotiator': 1.1.0 '@fastify/send': 2.1.0 @@ -5555,44 +970,71 @@ snapshots: fastify-plugin: 4.5.1 glob: 8.1.0 p-limit: 3.1.0 + dev: false - '@gar/promisify@1.1.3': {} + /@gar/promisify@1.1.3: + resolution: {integrity: sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw==} + dev: false - '@golevelup/nestjs-modules@0.6.1(@nestjs/common@10.0.0)(rxjs@7.8.1)': + /@golevelup/nestjs-modules@0.6.1(@nestjs/common@10.0.0)(rxjs@7.8.1): + resolution: {integrity: sha512-E0STg8In8fhIivnGDJAA70+XLPHzK5bMTkCnif9FbZ8waTYDQ3T/QQL0h73k+CUFeznn1hmuEW14sNaE+8cd7w==} + peerDependencies: + '@nestjs/common': ^9.x + rxjs: ^7.x dependencies: '@nestjs/common': 10.0.0(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.1.13)(rxjs@7.8.1) lodash: 4.17.21 rxjs: 7.8.1 + dev: false - '@gulp-sourcemaps/map-sources@1.0.0': + /@gulp-sourcemaps/map-sources@1.0.0: + resolution: {integrity: sha512-o/EatdaGt8+x2qpb0vFLC/2Gug/xYPRXb6a+ET1wGYKozKN3krDWC/zZFZAtrzxJHuDL12mwdfEFKcKMNvc55A==} + engines: {node: '>= 0.10'} dependencies: normalize-path: 2.1.1 through2: 2.0.5 + dev: false - '@humanwhocodes/config-array@0.11.14': + /@humanwhocodes/config-array@0.11.14: + resolution: {integrity: sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==} + engines: {node: '>=10.10.0'} dependencies: '@humanwhocodes/object-schema': 2.0.2 debug: 4.3.4 minimatch: 3.1.2 transitivePeerDependencies: - supports-color + dev: true - '@humanwhocodes/module-importer@1.0.1': {} + /@humanwhocodes/module-importer@1.0.1: + resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} + engines: {node: '>=12.22'} + dev: true - '@humanwhocodes/object-schema@2.0.2': {} + /@humanwhocodes/object-schema@2.0.2: + resolution: {integrity: sha512-6EwiSjwWYP7pTckG6I5eyFANjPhmPjUX9JRLUSfNPC7FX7zK9gyZAfUEaECL6ALTpGX5AjnBq3C9XmVWPitNpw==} + dev: true - '@hutson/parse-repository-url@3.0.2': {} + /@hutson/parse-repository-url@3.0.2: + resolution: {integrity: sha512-H9XAx3hc0BQHY6l+IFSWHDySypcXsvsuLhgYLUGywmJ5pswRVQJUHpOsobnLYp2ZUaUlKiKDrgWWhosOwAEM8Q==} + engines: {node: '>=6.9.0'} + dev: true - '@isaacs/cliui@8.0.2': + /@isaacs/cliui@8.0.2: + resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} + engines: {node: '>=12'} dependencies: string-width: 5.1.2 - string-width-cjs: string-width@4.2.3 + string-width-cjs: /string-width@4.2.3 strip-ansi: 7.1.0 - strip-ansi-cjs: strip-ansi@6.0.1 + strip-ansi-cjs: /strip-ansi@6.0.1 wrap-ansi: 8.1.0 - wrap-ansi-cjs: wrap-ansi@7.0.0 + wrap-ansi-cjs: /wrap-ansi@7.0.0 + dev: false - '@istanbuljs/load-nyc-config@1.1.0': + /@istanbuljs/load-nyc-config@1.1.0: + resolution: {integrity: sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==} + engines: {node: '>=8'} dependencies: camelcase: 5.3.1 find-up: 4.1.0 @@ -5600,9 +1042,13 @@ snapshots: js-yaml: 3.14.1 resolve-from: 5.0.0 - '@istanbuljs/schema@0.1.3': {} + /@istanbuljs/schema@0.1.3: + resolution: {integrity: sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==} + engines: {node: '>=8'} - '@jest/console@29.7.0': + /@jest/console@29.7.0: + resolution: {integrity: sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: '@jest/types': 29.6.3 '@types/node': 20.3.1 @@ -5611,7 +1057,14 @@ snapshots: jest-util: 29.7.0 slash: 3.0.0 - '@jest/core@29.7.0(ts-node@10.9.1)': + /@jest/core@29.7.0(ts-node@10.9.1): + resolution: {integrity: sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true dependencies: '@jest/console': 29.7.0 '@jest/reporters': 29.7.0 @@ -5646,25 +1099,33 @@ snapshots: - supports-color - ts-node - '@jest/environment@29.7.0': + /@jest/environment@29.7.0: + resolution: {integrity: sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: '@jest/fake-timers': 29.7.0 '@jest/types': 29.6.3 '@types/node': 20.3.1 jest-mock: 29.7.0 - '@jest/expect-utils@29.7.0': + /@jest/expect-utils@29.7.0: + resolution: {integrity: sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: jest-get-type: 29.6.3 - '@jest/expect@29.7.0': + /@jest/expect@29.7.0: + resolution: {integrity: sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: expect: 29.7.0 jest-snapshot: 29.7.0 transitivePeerDependencies: - supports-color - '@jest/fake-timers@29.7.0': + /@jest/fake-timers@29.7.0: + resolution: {integrity: sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: '@jest/types': 29.6.3 '@sinonjs/fake-timers': 10.3.0 @@ -5673,7 +1134,9 @@ snapshots: jest-mock: 29.7.0 jest-util: 29.7.0 - '@jest/globals@29.7.0': + /@jest/globals@29.7.0: + resolution: {integrity: sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: '@jest/environment': 29.7.0 '@jest/expect': 29.7.0 @@ -5682,7 +1145,14 @@ snapshots: transitivePeerDependencies: - supports-color - '@jest/reporters@29.7.0': + /@jest/reporters@29.7.0: + resolution: {integrity: sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true dependencies: '@bcoe/v8-coverage': 0.2.3 '@jest/console': 29.7.0 @@ -5711,31 +1181,41 @@ snapshots: transitivePeerDependencies: - supports-color - '@jest/schemas@29.6.3': + /@jest/schemas@29.6.3: + resolution: {integrity: sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: '@sinclair/typebox': 0.27.8 - '@jest/source-map@29.6.3': + /@jest/source-map@29.6.3: + resolution: {integrity: sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: '@jridgewell/trace-mapping': 0.3.22 callsites: 3.1.0 graceful-fs: 4.2.11 - '@jest/test-result@29.7.0': + /@jest/test-result@29.7.0: + resolution: {integrity: sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: '@jest/console': 29.7.0 '@jest/types': 29.6.3 '@types/istanbul-lib-coverage': 2.0.6 collect-v8-coverage: 1.0.2 - '@jest/test-sequencer@29.7.0': + /@jest/test-sequencer@29.7.0: + resolution: {integrity: sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: '@jest/test-result': 29.7.0 graceful-fs: 4.2.11 jest-haste-map: 29.7.0 slash: 3.0.0 - '@jest/transform@29.7.0': + /@jest/transform@29.7.0: + resolution: {integrity: sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: '@babel/core': 7.23.9 '@jest/types': 29.6.3 @@ -5755,7 +1235,9 @@ snapshots: transitivePeerDependencies: - supports-color - '@jest/types@29.6.3': + /@jest/types@29.6.3: + resolution: {integrity: sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: '@jest/schemas': 29.6.3 '@types/istanbul-lib-coverage': 2.0.6 @@ -5764,40 +1246,60 @@ snapshots: '@types/yargs': 17.0.32 chalk: 4.1.2 - '@jridgewell/gen-mapping@0.3.3': + /@jridgewell/gen-mapping@0.3.3: + resolution: {integrity: sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==} + engines: {node: '>=6.0.0'} dependencies: '@jridgewell/set-array': 1.1.2 '@jridgewell/sourcemap-codec': 1.4.15 '@jridgewell/trace-mapping': 0.3.22 - '@jridgewell/resolve-uri@3.1.1': {} + /@jridgewell/resolve-uri@3.1.1: + resolution: {integrity: sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==} + engines: {node: '>=6.0.0'} - '@jridgewell/set-array@1.1.2': {} + /@jridgewell/set-array@1.1.2: + resolution: {integrity: sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==} + engines: {node: '>=6.0.0'} - '@jridgewell/source-map@0.3.5': + /@jridgewell/source-map@0.3.5: + resolution: {integrity: sha512-UTYAUj/wviwdsMfzoSJspJxbkH5o1snzwX0//0ENX1u/55kkZZkcTZP6u9bwKGkv+dkk9at4m1Cpt0uY80kcpQ==} dependencies: '@jridgewell/gen-mapping': 0.3.3 '@jridgewell/trace-mapping': 0.3.22 + dev: true - '@jridgewell/sourcemap-codec@1.4.15': {} + /@jridgewell/sourcemap-codec@1.4.15: + resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} - '@jridgewell/trace-mapping@0.3.22': + /@jridgewell/trace-mapping@0.3.22: + resolution: {integrity: sha512-Wf963MzWtA2sjrNt+g18IAln9lKnlRp+K2eH4jjIoF1wYeq3aMREpG09xhlhdzS0EjwU7qmUJYangWa+151vZw==} dependencies: '@jridgewell/resolve-uri': 3.1.1 '@jridgewell/sourcemap-codec': 1.4.15 - '@jridgewell/trace-mapping@0.3.9': + /@jridgewell/trace-mapping@0.3.9: + resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==} dependencies: '@jridgewell/resolve-uri': 3.1.1 '@jridgewell/sourcemap-codec': 1.4.15 - '@jsdevtools/ono@7.1.3': {} + /@jsdevtools/ono@7.1.3: + resolution: {integrity: sha512-4JQNk+3mVzK3xh2rqd6RB4J46qUR19azEHBneZyTZM+c456qOrbbM/5xcR8huNCCcbVt7+UmizG6GuUvPvKUYg==} + dev: false - '@lukeed/csprng@1.1.0': {} + /@lukeed/csprng@1.1.0: + resolution: {integrity: sha512-Z7C/xXCiGWsg0KuKsHTKJxbWhpI3Vs5GwLfOean7MGyVFGqdRgBbAjOCh6u4bbjPc/8MJ2pZmK/0DLdCbivLDA==} + engines: {node: '>=8'} - '@lukeed/ms@2.0.2': {} + /@lukeed/ms@2.0.2: + resolution: {integrity: sha512-9I2Zn6+NJLfaGoz9jN3lpwDgAYvfGeNYdbAIjJOqzs4Tpc+VU3Jqq4IofSUBKajiDS8k9fZIg18/z13mpk1bsA==} + engines: {node: '>=8'} + dev: false - '@mapbox/node-pre-gyp@1.0.11': + /@mapbox/node-pre-gyp@1.0.11: + resolution: {integrity: sha512-Yhlar6v9WQgUp/He7BdgzOz8lqMQ8sU+jkCq7Wx8Myc5YFJLbEe7lgui/V7G1qB1DJykHSGwreceSaD60Y0PUQ==} + hasBin: true dependencies: detect-libc: 2.0.2 https-proxy-agent: 5.0.1 @@ -5811,33 +1313,72 @@ snapshots: transitivePeerDependencies: - encoding - supports-color + dev: false - '@microsoft/tsdoc@0.14.2': {} + /@microsoft/tsdoc@0.14.2: + resolution: {integrity: sha512-9b8mPpKrfeGRuhFH5iO1iwCLeIIsV6+H1sRfxbkoGXIyQE2BTsPd9zqSqQJ+pv5sJ/hT5M1zvOFL02MnEezFug==} + dev: false - '@nestjs-cls/transactional-adapter-prisma@1.1.0(@nestjs-cls/transactional@2.2.0)(@prisma/client@5.10.2)(nestjs-cls@4.2.0)(prisma@5.10.2)': + /@nestjs-cls/transactional-adapter-prisma@1.1.0(@nestjs-cls/transactional@2.2.0)(@prisma/client@5.10.2)(nestjs-cls@4.2.0)(prisma@5.10.2): + resolution: {integrity: sha512-iTwt0uN+GTQOM9ZkSnbznWhPmKG10UDetVzZ3MZMdKZMRpkAZUnp5ClrmFUo3e37hUO/EYdfzi/g7wesO9owug==} + engines: {node: '>=18'} + peerDependencies: + '@nestjs-cls/transactional': ^2.2.0 + '@prisma/client': '> 4 < 6' + nestjs-cls: ^4.2.0 + prisma: '> 4 < 6' dependencies: '@nestjs-cls/transactional': 2.2.0(@nestjs/common@10.0.0)(@nestjs/core@10.0.0)(nestjs-cls@4.2.0)(reflect-metadata@0.1.13)(rxjs@7.8.1) '@prisma/client': 5.10.2(prisma@5.10.2) nestjs-cls: 4.2.0(@nestjs/common@10.0.0)(@nestjs/core@10.0.0)(reflect-metadata@0.1.13)(rxjs@7.8.1) prisma: 5.10.2 + dev: false - '@nestjs-cls/transactional@2.2.0(@nestjs/common@10.0.0)(@nestjs/core@10.0.0)(nestjs-cls@4.2.0)(reflect-metadata@0.1.13)(rxjs@7.8.1)': + /@nestjs-cls/transactional@2.2.0(@nestjs/common@10.0.0)(@nestjs/core@10.0.0)(nestjs-cls@4.2.0)(reflect-metadata@0.1.13)(rxjs@7.8.1): + resolution: {integrity: sha512-O3wWCiVjeOPLGPs/sPcAUhSe/xaNx8JuzBtGg4IqnVrZfbjDzeADtlHIO8YkYhHYAVbqvVtGFbfFjL5tDUGWsA==} + engines: {node: '>=16'} + peerDependencies: + '@nestjs/common': '> 7.0.0 < 11' + '@nestjs/core': '> 7.0.0 < 11' + nestjs-cls: ^4.2.0 + reflect-metadata: '*' + rxjs: '>= 7' dependencies: '@nestjs/common': 10.0.0(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.1.13)(rxjs@7.8.1) '@nestjs/core': 10.0.0(@nestjs/common@10.0.0)(reflect-metadata@0.1.13)(rxjs@7.8.1) nestjs-cls: 4.2.0(@nestjs/common@10.0.0)(@nestjs/core@10.0.0)(reflect-metadata@0.1.13)(rxjs@7.8.1) reflect-metadata: 0.1.13 rxjs: 7.8.1 + dev: false - '@nestjs/cache-manager@2.2.0(@nestjs/common@10.0.0)(@nestjs/core@10.0.0)(cache-manager@5.4.0)(reflect-metadata@0.1.13)(rxjs@7.8.1)': + /@nestjs/cache-manager@2.2.0(@nestjs/common@10.0.0)(@nestjs/core@10.0.0)(cache-manager@5.4.0)(reflect-metadata@0.1.13)(rxjs@7.8.1): + resolution: {integrity: sha512-hAcX1f5moiK7B8KnPZVfV/up4nrZnaeN6w0o3M+UzNJNlw6bsIH6bn7jpGqzySAWPD9iYE/rg5IxTe1vSWyWZg==} + peerDependencies: + '@nestjs/common': ^9.0.0 || ^10.0.0 + '@nestjs/core': ^9.0.0 || ^10.0.0 + cache-manager: <=5 + reflect-metadata: ^0.1.12 + rxjs: ^7.0.0 dependencies: '@nestjs/common': 10.0.0(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.1.13)(rxjs@7.8.1) '@nestjs/core': 10.0.0(@nestjs/common@10.0.0)(reflect-metadata@0.1.13)(rxjs@7.8.1) cache-manager: 5.4.0 reflect-metadata: 0.1.13 rxjs: 7.8.1 + dev: false - '@nestjs/cli@10.0.0': + /@nestjs/cli@10.0.0: + resolution: {integrity: sha512-14pju3ejAAUpFe1iK99v/b7Bw96phBMV58GXTSm3TcdgaI4O7UTLXTbMiUNyU+LGr/1CPIfThcWqFyKhDIC9VQ==} + engines: {node: '>= 16'} + hasBin: true + peerDependencies: + '@swc/cli': ^0.1.62 + '@swc/core': ^1.3.62 + peerDependenciesMeta: + '@swc/cli': + optional: true + '@swc/core': + optional: true dependencies: '@angular-devkit/core': 16.1.0(chokidar@3.5.3) '@angular-devkit/schematics': 16.1.0(chokidar@3.5.3) @@ -5865,8 +1406,20 @@ snapshots: - esbuild - uglify-js - webpack-cli + dev: true - '@nestjs/common@10.0.0(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.1.13)(rxjs@7.8.1)': + /@nestjs/common@10.0.0(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.1.13)(rxjs@7.8.1): + resolution: {integrity: sha512-Fa2GDQJrO5TTTcpISWfm0pdPS62V+8YbxeG5CA01zMUI+dCO3v3oFf+BSjqCGUUo7GDNzDsjAejwGXuqA54RPw==} + peerDependencies: + class-transformer: '*' + class-validator: '*' + reflect-metadata: ^0.1.12 + rxjs: ^7.1.0 + peerDependenciesMeta: + class-transformer: + optional: true + class-validator: + optional: true dependencies: class-transformer: 0.5.1 class-validator: 0.14.1 @@ -5876,7 +1429,21 @@ snapshots: tslib: 2.5.3 uid: 2.0.2 - '@nestjs/common@9.4.0(cache-manager@5.4.0)(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.1.13)(rxjs@7.8.1)': + /@nestjs/common@9.4.0(cache-manager@5.4.0)(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.1.13)(rxjs@7.8.1): + resolution: {integrity: sha512-RUcVAQsEF4WPrmzFXEOUfZnPwrLTe1UVlzXTlSyfqfqbdWDPKDGlIPVelBLfc5/+RRUQ0I5iE4+CQvpCmkqldw==} + peerDependencies: + cache-manager: <=5 + class-transformer: '*' + class-validator: '*' + reflect-metadata: ^0.1.12 + rxjs: ^7.1.0 + peerDependenciesMeta: + cache-manager: + optional: true + class-transformer: + optional: true + class-validator: + optional: true dependencies: cache-manager: 5.4.0 class-transformer: 0.5.1 @@ -5886,8 +1453,13 @@ snapshots: rxjs: 7.8.1 tslib: 2.5.0 uid: 2.0.2 + dev: false - '@nestjs/config@3.1.1(@nestjs/common@10.0.0)(reflect-metadata@0.1.13)': + /@nestjs/config@3.1.1(@nestjs/common@10.0.0)(reflect-metadata@0.1.13): + resolution: {integrity: sha512-qu5QlNiJdqQtOsnB6lx4JCXPQ96jkKUsOGd+JXfXwqJqZcOSAq6heNFg0opW4pq4J/VZoNwoo87TNnx9wthnqQ==} + peerDependencies: + '@nestjs/common': ^8.0.0 || ^9.0.0 || ^10.0.0 + reflect-metadata: ^0.1.13 dependencies: '@nestjs/common': 10.0.0(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.1.13)(rxjs@7.8.1) dotenv: 16.3.1 @@ -5895,8 +1467,25 @@ snapshots: lodash: 4.17.21 reflect-metadata: 0.1.13 uuid: 9.0.0 + dev: false - '@nestjs/core@10.0.0(@nestjs/common@10.0.0)(reflect-metadata@0.1.13)(rxjs@7.8.1)': + /@nestjs/core@10.0.0(@nestjs/common@10.0.0)(reflect-metadata@0.1.13)(rxjs@7.8.1): + resolution: {integrity: sha512-HFTdj4vsF+2qOaq97ZPRDle6Q/KyL5lmMah0/ZR0ie+e1/tnlvmlqw589xFACTemLJFFOjZMy763v+icO9u72w==} + requiresBuild: true + peerDependencies: + '@nestjs/common': ^10.0.0 + '@nestjs/microservices': ^10.0.0 + '@nestjs/platform-express': ^10.0.0 + '@nestjs/websockets': ^10.0.0 + reflect-metadata: ^0.1.12 + rxjs: ^7.1.0 + peerDependenciesMeta: + '@nestjs/microservices': + optional: true + '@nestjs/platform-express': + optional: true + '@nestjs/websockets': + optional: true dependencies: '@nestjs/common': 10.0.0(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.1.13)(rxjs@7.8.1) '@nuxtjs/opencollective': 0.3.2 @@ -5910,32 +1499,70 @@ snapshots: transitivePeerDependencies: - encoding - '@nestjs/event-emitter@2.0.3(@nestjs/common@10.0.0)(@nestjs/core@10.0.0)(reflect-metadata@0.1.13)': + /@nestjs/event-emitter@2.0.3(@nestjs/common@10.0.0)(@nestjs/core@10.0.0)(reflect-metadata@0.1.13): + resolution: {integrity: sha512-Pt7KAERrgK0OjvarSI3wfVhwZ8X1iLq1lXuodyRe+Zx3aLLP7fraFUHirASbFkB6KIQ1Zj+gZ1g8a9eu4GfFhw==} + peerDependencies: + '@nestjs/common': ^8.0.0 || ^9.0.0 || ^10.0.0 + '@nestjs/core': ^8.0.0 || ^9.0.0 || ^10.0.0 + reflect-metadata: ^0.1.12 dependencies: '@nestjs/common': 10.0.0(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.1.13)(rxjs@7.8.1) '@nestjs/core': 10.0.0(@nestjs/common@10.0.0)(reflect-metadata@0.1.13)(rxjs@7.8.1) eventemitter2: 6.4.9 reflect-metadata: 0.1.13 + dev: false - '@nestjs/jwt@10.2.0(@nestjs/common@10.0.0)': + /@nestjs/jwt@10.2.0(@nestjs/common@10.0.0): + resolution: {integrity: sha512-x8cG90SURkEiLOehNaN2aRlotxT0KZESUliOPKKnjWiyJOcWurkF3w345WOX0P4MgFzUjGoZ1Sy0aZnxeihT0g==} + peerDependencies: + '@nestjs/common': ^8.0.0 || ^9.0.0 || ^10.0.0 dependencies: '@nestjs/common': 10.0.0(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.1.13)(rxjs@7.8.1) '@types/jsonwebtoken': 9.0.5 jsonwebtoken: 9.0.2 + dev: false - '@nestjs/mapped-types@2.0.5(@nestjs/common@10.0.0)(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.1.13)': + /@nestjs/mapped-types@2.0.5(@nestjs/common@10.0.0)(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.1.13): + resolution: {integrity: sha512-bSJv4pd6EY99NX9CjBIyn4TVDoSit82DUZlL4I3bqNfy5Gt+gXTa86i3I/i0iIV9P4hntcGM5GyO+FhZAhxtyg==} + peerDependencies: + '@nestjs/common': ^8.0.0 || ^9.0.0 || ^10.0.0 + class-transformer: ^0.4.0 || ^0.5.0 + class-validator: ^0.13.0 || ^0.14.0 + reflect-metadata: ^0.1.12 || ^0.2.0 + peerDependenciesMeta: + class-transformer: + optional: true + class-validator: + optional: true dependencies: '@nestjs/common': 10.0.0(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.1.13)(rxjs@7.8.1) class-transformer: 0.5.1 class-validator: 0.14.1 reflect-metadata: 0.1.13 + dev: false - '@nestjs/passport@10.0.3(@nestjs/common@10.0.0)(passport@0.7.0)': + /@nestjs/passport@10.0.3(@nestjs/common@10.0.0)(passport@0.7.0): + resolution: {integrity: sha512-znJ9Y4S8ZDVY+j4doWAJ8EuuVO7SkQN3yOBmzxbGaXbvcSwFDAdGJ+OMCg52NdzIO4tQoN4pYKx8W6M0ArfFRQ==} + peerDependencies: + '@nestjs/common': ^8.0.0 || ^9.0.0 || ^10.0.0 + passport: ^0.4.0 || ^0.5.0 || ^0.6.0 || ^0.7.0 dependencies: '@nestjs/common': 10.0.0(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.1.13)(rxjs@7.8.1) passport: 0.7.0 + dev: false - '@nestjs/platform-fastify@10.3.4(@fastify/static@6.12.0)(@nestjs/common@10.0.0)(@nestjs/core@10.0.0)': + /@nestjs/platform-fastify@10.3.4(@fastify/static@6.12.0)(@nestjs/common@10.0.0)(@nestjs/core@10.0.0): + resolution: {integrity: sha512-rYoAdJ1ybBXPwO+KutWJ4siaqGDdMzwXS4ggJ5soQgD4maN2p1rvKE31MzERd1MqYXWprFIESFHuxkiHMZV6kg==} + peerDependencies: + '@fastify/static': ^6.0.0 || ^7.0.0 + '@fastify/view': ^7.0.0 || ^8.0.0 + '@nestjs/common': ^10.0.0 + '@nestjs/core': ^10.0.0 + peerDependenciesMeta: + '@fastify/static': + optional: true + '@fastify/view': + optional: true dependencies: '@fastify/cors': 9.0.1 '@fastify/formbody': 7.4.0 @@ -5949,8 +1576,12 @@ snapshots: tslib: 2.6.2 transitivePeerDependencies: - supports-color + dev: false - '@nestjs/schematics@10.0.0(chokidar@3.5.3)(typescript@5.1.3)': + /@nestjs/schematics@10.0.0(chokidar@3.5.3)(typescript@5.1.3): + resolution: {integrity: sha512-gfUy/N1m1paN33BXq4d7HoCM+zM4rFxYjqAb8jkrBfBHiwyEhHHozfX/aRy/kOnAcy/VP8v4Zs4HKKrbRRlHnw==} + peerDependencies: + typescript: '>=4.8.2' dependencies: '@angular-devkit/core': 16.1.0(chokidar@3.5.3) '@angular-devkit/schematics': 16.1.0(chokidar@3.5.3) @@ -5960,8 +1591,24 @@ snapshots: typescript: 5.1.3 transitivePeerDependencies: - chokidar + dev: true - '@nestjs/swagger@7.3.0(@fastify/static@6.12.0)(@nestjs/common@10.0.0)(@nestjs/core@10.0.0)(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.1.13)': + /@nestjs/swagger@7.3.0(@fastify/static@6.12.0)(@nestjs/common@10.0.0)(@nestjs/core@10.0.0)(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.1.13): + resolution: {integrity: sha512-zLkfKZ+ioYsIZ3dfv7Bj8YHnZMNAGWFUmx2ZDuLp/fBE4P8BSjB7hldzDueFXsmwaPL90v7lgyd82P+s7KME1Q==} + 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 + class-transformer: '*' + class-validator: '*' + reflect-metadata: ^0.1.12 || ^0.2.0 + peerDependenciesMeta: + '@fastify/static': + optional: true + class-transformer: + optional: true + class-validator: + optional: true dependencies: '@fastify/static': 6.12.0 '@microsoft/tsdoc': 0.14.2 @@ -5975,32 +1622,67 @@ snapshots: path-to-regexp: 3.2.0 reflect-metadata: 0.1.13 swagger-ui-dist: 5.11.2 + dev: false - '@nestjs/testing@10.0.0(@nestjs/common@10.0.0)(@nestjs/core@10.0.0)': + /@nestjs/testing@10.0.0(@nestjs/common@10.0.0)(@nestjs/core@10.0.0): + resolution: {integrity: sha512-U5q3+svkddpdSk51ZFCEnFpQuWxAwE4ahsX77FrqqCAYidr7HUtL/BHYOVzI5H9vUH6BvJxMbfo3tiUXQl/2aA==} + peerDependencies: + '@nestjs/common': ^10.0.0 + '@nestjs/core': ^10.0.0 + '@nestjs/microservices': ^10.0.0 + '@nestjs/platform-express': ^10.0.0 + peerDependenciesMeta: + '@nestjs/microservices': + optional: true + '@nestjs/platform-express': + optional: true dependencies: '@nestjs/common': 10.0.0(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.1.13)(rxjs@7.8.1) '@nestjs/core': 10.0.0(@nestjs/common@10.0.0)(reflect-metadata@0.1.13)(rxjs@7.8.1) tslib: 2.5.3 + dev: true - '@nestjs/testing@9.4.0(@nestjs/common@9.4.0)(@nestjs/core@10.0.0)': + /@nestjs/testing@9.4.0(@nestjs/common@9.4.0)(@nestjs/core@10.0.0): + resolution: {integrity: sha512-xZWp363P4otcebg++gSjUcdCfTK0RorORzyFq3aLaSAQOlq8kxfFDRIKzEATR4aOUfqTMMsAA8lhnMJWf35N6A==} + peerDependencies: + '@nestjs/common': ^9.0.0 + '@nestjs/core': ^9.0.0 + '@nestjs/microservices': ^9.0.0 + '@nestjs/platform-express': ^9.0.0 + peerDependenciesMeta: + '@nestjs/microservices': + optional: true + '@nestjs/platform-express': + optional: true dependencies: '@nestjs/common': 9.4.0(cache-manager@5.4.0)(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.1.13)(rxjs@7.8.1) '@nestjs/core': 10.0.0(@nestjs/common@10.0.0)(reflect-metadata@0.1.13)(rxjs@7.8.1) tslib: 2.5.0 + dev: false - '@nodelib/fs.scandir@2.1.5': + /@nodelib/fs.scandir@2.1.5: + resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} + engines: {node: '>= 8'} dependencies: '@nodelib/fs.stat': 2.0.5 run-parallel: 1.2.0 + dev: true - '@nodelib/fs.stat@2.0.5': {} + /@nodelib/fs.stat@2.0.5: + resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} + engines: {node: '>= 8'} + dev: true - '@nodelib/fs.walk@1.2.8': + /@nodelib/fs.walk@1.2.8: + resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} + engines: {node: '>= 8'} dependencies: '@nodelib/fs.scandir': 2.1.5 fastq: 1.17.1 + dev: true - '@nodeteam/nestjs-prisma-pagination@1.0.6(@babel/core@7.23.9)(@nestjs/core@10.0.0)(@types/node@20.3.1)(cache-manager@5.4.0)(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.1.13)(rxjs@7.8.1)(ts-node@10.9.1)': + /@nodeteam/nestjs-prisma-pagination@1.0.6(@babel/core@7.23.9)(@nestjs/core@10.0.0)(@types/node@20.3.1)(cache-manager@5.4.0)(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.1.13)(rxjs@7.8.1)(ts-node@10.9.1): + resolution: {integrity: sha512-ZTTXIlbnphmtBt4xFlFfV7an5e2EvmC/P4nj7s0nbSgq8bYovjMAbGxlmBh/shxfVaQeYCl78SoSnYWOjIQMCA==} dependencies: '@nestjs/common': 9.4.0(cache-manager@5.4.0)(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.1.13)(rxjs@7.8.1) '@nestjs/testing': 9.4.0(@nestjs/common@9.4.0)(@nestjs/core@10.0.0) @@ -6025,18 +1707,29 @@ snapshots: - rxjs - supports-color - ts-node + dev: false - '@npmcli/fs@2.1.2': + /@npmcli/fs@2.1.2: + resolution: {integrity: sha512-yOJKRvohFOaLqipNtwYB9WugyZKhC/DZC4VYPmpaCzDBrA8YpK3qHZ8/HGscMnE4GqbkLNuVcCnxkeQEdGt6LQ==} + engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} dependencies: '@gar/promisify': 1.1.3 semver: 7.6.0 + dev: false - '@npmcli/move-file@2.0.1': + /@npmcli/move-file@2.0.1: + resolution: {integrity: sha512-mJd2Z5TjYWq/ttPLLGqArdtnC74J6bOzg4rMDnN+p1xTacZ2yPRCk2y0oSWQtygLR9YVQXgOcONrwtnk3JupxQ==} + engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + deprecated: This functionality has been moved to @npmcli/fs dependencies: mkdirp: 1.0.4 rimraf: 3.0.2 + dev: false - '@nuxtjs/opencollective@0.3.2': + /@nuxtjs/opencollective@0.3.2: + resolution: {integrity: sha512-um0xL3fO7Mf4fDxcqx9KryrB7zgRM5JSlvGN5AGkP6JLM5XEKyjeAiPbNxdXVXQ16isuAhYpvP88NgL2BGd6aA==} + engines: {node: '>=8.0.0', npm: '>=5.0.0'} + hasBin: true dependencies: chalk: 4.1.2 consola: 2.15.3 @@ -6044,16 +1737,30 @@ snapshots: transitivePeerDependencies: - encoding - '@open-draft/deferred-promise@2.2.0': {} + /@open-draft/deferred-promise@2.2.0: + resolution: {integrity: sha512-CecwLWx3rhxVQF6V4bAgPS5t+So2sTbPgAzafKkVizyi7tlwpcFpdFqq+wqF2OwNBmqFuu6tOyouTuxgpMfzmA==} + dev: false - '@pkgjs/parseargs@0.11.0': + /@pkgjs/parseargs@0.11.0: + resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} + engines: {node: '>=14'} + requiresBuild: true + dev: false optional: true - '@pkgr/core@0.1.1': {} + /@pkgr/core@0.1.1: + resolution: {integrity: sha512-cq8o4cWH0ibXh9VGi5P20Tu9XF/0fFXl9EUinr9QfTM7a7p0oTA4iJRCQWppXR1Pg8dSM0UCItCkPwsk9qWWYA==} + engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} + dev: true - '@polka/url@0.5.0': {} + /@polka/url@0.5.0: + resolution: {integrity: sha512-oZLYFEAzUKyi3SKnXvj32ZCEGH6RDnao7COuCVhDydMS9NrCSVXhM79VaKyP5+Zc33m0QXEd2DN3UkU7OsHcfw==} + dev: true - '@pond918/prisma-generator-nestjs-dto@1.17.513': + /@pond918/prisma-generator-nestjs-dto@1.17.513: + resolution: {integrity: sha512-wq/GSVeVuD8kSm1Q6mC2T1MjNkyhn4wtD+N62Zp4XwV4hbxVNXUgLQsBn1lex8Yhd9DqHlVAawyTwKhLt6xBqg==} + engines: {node: '>=14'} + hasBin: true dependencies: '@prisma/generator-helper': 4.16.2 case: 1.6.3 @@ -6066,37 +1773,54 @@ snapshots: ts-toolbelt: 9.6.0 transitivePeerDependencies: - supports-color + dev: true - '@prisma/client@5.10.2(prisma@5.10.2)': + /@prisma/client@5.10.2(prisma@5.10.2): + resolution: {integrity: sha512-ef49hzB2yJZCvM5gFHMxSFL9KYrIP9udpT5rYo0CsHD4P9IKj473MbhU1gjKKftiwWBTIyrt9jukprzZXazyag==} + engines: {node: '>=16.13'} + requiresBuild: true + peerDependencies: + prisma: '*' + peerDependenciesMeta: + prisma: + optional: true dependencies: prisma: 5.10.2 - '@prisma/debug@4.16.2': + /@prisma/debug@4.16.2: + resolution: {integrity: sha512-7L7WbG0qNNZYgLpsVB8rCHCXEyHFyIycRlRDNwkVfjQmACC2OW6AWCYCbfdjQhkF/t7+S3njj8wAWAocSs+Brw==} dependencies: '@types/debug': 4.1.8 debug: 4.3.4 strip-ansi: 6.0.1 transitivePeerDependencies: - supports-color + dev: true - '@prisma/debug@5.10.2': {} + /@prisma/debug@5.10.2: + resolution: {integrity: sha512-bkBOmH9dpEBbMKFJj8V+Zp8IZHIBjy3fSyhLhxj4FmKGb/UBSt9doyfA6k1UeUREsMJft7xgPYBbHSOYBr8XCA==} - '@prisma/engines-version@5.10.0-34.5a9203d0590c951969e85a7d07215503f4672eb9': {} + /@prisma/engines-version@5.10.0-34.5a9203d0590c951969e85a7d07215503f4672eb9: + resolution: {integrity: sha512-uCy/++3Jx/O3ufM+qv2H1L4tOemTNqcP/gyEVOlZqTpBvYJUe0tWtW0y3o2Ueq04mll4aM5X3f6ugQftOSLdFQ==} - '@prisma/engines@5.10.2': + /@prisma/engines@5.10.2: + resolution: {integrity: sha512-HkSJvix6PW8YqEEt3zHfCYYJY69CXsNdhU+wna+4Y7EZ+AwzeupMnUThmvaDA7uqswiHkgm5/SZ6/4CStjaGmw==} + requiresBuild: true dependencies: '@prisma/debug': 5.10.2 '@prisma/engines-version': 5.10.0-34.5a9203d0590c951969e85a7d07215503f4672eb9 '@prisma/fetch-engine': 5.10.2 '@prisma/get-platform': 5.10.2 - '@prisma/fetch-engine@5.10.2': + /@prisma/fetch-engine@5.10.2: + resolution: {integrity: sha512-dSmXcqSt6DpTmMaLQ9K8ZKzVAMH3qwGCmYEZr/uVnzVhxRJ1EbT/w2MMwIdBNq1zT69Rvh0h75WMIi0mrIw7Hg==} dependencies: '@prisma/debug': 5.10.2 '@prisma/engines-version': 5.10.0-34.5a9203d0590c951969e85a7d07215503f4672eb9 '@prisma/get-platform': 5.10.2 - '@prisma/generator-helper@4.16.2': + /@prisma/generator-helper@4.16.2: + resolution: {integrity: sha512-bMOH7y73Ui7gpQrioFeavMQA+Tf8ksaVf8Nhs9rQNzuSg8SSV6E9baczob0L5KGZTSgYoqnrRxuo03kVJYrnIg==} dependencies: '@prisma/debug': 4.16.2 '@types/cross-spawn': 6.0.2 @@ -6104,40 +1828,56 @@ snapshots: kleur: 4.1.5 transitivePeerDependencies: - supports-color + dev: true - '@prisma/get-platform@5.10.2': + /@prisma/get-platform@5.10.2: + resolution: {integrity: sha512-nqXP6vHiY2PIsebBAuDeWiUYg8h8mfjBckHh6Jezuwej0QJNnjDiOq30uesmg+JXxGk99nqyG3B7wpcOODzXvg==} dependencies: '@prisma/debug': 5.10.2 - '@schematics/angular@13.3.11': + /@schematics/angular@13.3.11: + resolution: {integrity: sha512-imKBnKYEse0SBVELZO/753nkpt3eEgpjrYkB+AFWF9YfO/4RGnYXDHoH8CFkzxPH9QQCgNrmsVFNiYGS+P/S1A==} + engines: {node: ^12.20.0 || ^14.15.0 || >=16.10.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: '>= 1.13.0'} dependencies: '@angular-devkit/core': 13.3.11 '@angular-devkit/schematics': 13.3.11 jsonc-parser: 3.0.0 transitivePeerDependencies: - chokidar + dev: false - '@sinclair/typebox@0.27.8': {} + /@sinclair/typebox@0.27.8: + resolution: {integrity: sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==} - '@sinonjs/commons@3.0.1': + /@sinonjs/commons@3.0.1: + resolution: {integrity: sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==} dependencies: type-detect: 4.0.8 - '@sinonjs/fake-timers@10.3.0': + /@sinonjs/fake-timers@10.3.0: + resolution: {integrity: sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==} dependencies: '@sinonjs/commons': 3.0.1 - '@tootallnate/once@2.0.0': {} + /@tootallnate/once@2.0.0: + resolution: {integrity: sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==} + engines: {node: '>= 10'} + dev: false - '@tsconfig/node10@1.0.9': {} + /@tsconfig/node10@1.0.9: + resolution: {integrity: sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==} - '@tsconfig/node12@1.0.11': {} + /@tsconfig/node12@1.0.11: + resolution: {integrity: sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==} - '@tsconfig/node14@1.0.3': {} + /@tsconfig/node14@1.0.3: + resolution: {integrity: sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==} - '@tsconfig/node16@1.0.4': {} + /@tsconfig/node16@1.0.4: + resolution: {integrity: sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==} - '@types/babel__core@7.20.5': + /@types/babel__core@7.20.5: + resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==} dependencies: '@babel/parser': 7.23.9 '@babel/types': 7.23.9 @@ -6145,177 +1885,266 @@ snapshots: '@types/babel__template': 7.4.4 '@types/babel__traverse': 7.20.5 - '@types/babel__generator@7.6.8': + /@types/babel__generator@7.6.8: + resolution: {integrity: sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==} dependencies: '@babel/types': 7.23.9 - '@types/babel__template@7.4.4': + /@types/babel__template@7.4.4: + resolution: {integrity: sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==} dependencies: '@babel/parser': 7.23.9 '@babel/types': 7.23.9 - '@types/babel__traverse@7.20.5': + /@types/babel__traverse@7.20.5: + resolution: {integrity: sha512-WXCyOcRtH37HAUkpXhUduaxdm82b4GSlyTqajXviN4EfiuPgNYR109xMCKvpl6zPIpua0DGlMEDCq+g8EdoheQ==} dependencies: '@babel/types': 7.23.9 - '@types/bcrypt@5.0.2': + /@types/bcrypt@5.0.2: + resolution: {integrity: sha512-6atioO8Y75fNcbmj0G7UjI9lXN2pQ/IGJ2FWT4a/btd0Lk9lQalHLKhkgKVZ3r+spnmWUKfbMi1GEe9wyHQfNQ==} dependencies: '@types/node': 20.3.1 + dev: true - '@types/body-parser@1.19.5': + /@types/body-parser@1.19.5: + resolution: {integrity: sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==} dependencies: '@types/connect': 3.4.38 '@types/node': 20.3.1 + dev: true - '@types/connect@3.4.38': + /@types/connect@3.4.38: + resolution: {integrity: sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==} dependencies: '@types/node': 20.3.1 + dev: true - '@types/conventional-commits-parser@5.0.0': + /@types/conventional-commits-parser@5.0.0: + resolution: {integrity: sha512-loB369iXNmAZglwWATL+WRe+CRMmmBPtpolYzIebFaX4YA3x+BEfLqhUAV9WanycKI3TG1IMr5bMJDajDKLlUQ==} dependencies: '@types/node': 20.3.1 + dev: true - '@types/cookiejar@2.1.5': {} + /@types/cookiejar@2.1.5: + resolution: {integrity: sha512-he+DHOWReW0nghN24E1WUqM0efK4kI9oTqDm6XmK8ZPe2djZ90BSNdGnIyCLzCPw7/pogPlGbzI2wHGGmi4O/Q==} + dev: true - '@types/cross-spawn@6.0.2': + /@types/cross-spawn@6.0.2: + resolution: {integrity: sha512-KuwNhp3eza+Rhu8IFI5HUXRP0LIhqH5cAjubUvGXXthh4YYBuP2ntwEX+Cz8GJoZUHlKo247wPWOfA9LYEq4cw==} dependencies: '@types/node': 20.3.1 + dev: true - '@types/debug@4.1.8': + /@types/debug@4.1.8: + resolution: {integrity: sha512-/vPO1EPOs306Cvhwv7KfVfYvOJqA/S/AXjaHQiJboCZzcNDb+TIJFN9/2C9DZ//ijSKWioNyUxD792QmDJ+HKQ==} dependencies: '@types/ms': 0.7.34 + dev: true - '@types/dot@1.1.7': {} + /@types/dot@1.1.7: + resolution: {integrity: sha512-RhMcnI18Y+401Nceh2pW5gTGgsdfZdvg9g0P/5HIBJ0jmZEv5KlkYvfQiHhw4/Vnb8NdePi/4UCs92ITExLxuQ==} + dev: true - '@types/eslint-scope@3.7.7': + /@types/eslint-scope@3.7.7: + resolution: {integrity: sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==} dependencies: '@types/eslint': 8.56.2 '@types/estree': 1.0.5 + dev: true - '@types/eslint@8.56.2': + /@types/eslint@8.56.2: + resolution: {integrity: sha512-uQDwm1wFHmbBbCZCqAlq6Do9LYwByNZHWzXppSnay9SuwJ+VRbjkbLABer54kcPnMSlG6Fdiy2yaFXm/z9Z5gw==} dependencies: '@types/estree': 1.0.5 '@types/json-schema': 7.0.15 + dev: true - '@types/estree@1.0.5': {} + /@types/estree@1.0.5: + resolution: {integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==} + dev: true - '@types/express-serve-static-core@4.17.43': + /@types/express-serve-static-core@4.17.43: + resolution: {integrity: sha512-oaYtiBirUOPQGSWNGPWnzyAFJ0BP3cwvN4oWZQY+zUBwpVIGsKUkpBpSztp74drYcjavs7SKFZ4DX1V2QeN8rg==} dependencies: '@types/node': 20.3.1 '@types/qs': 6.9.11 '@types/range-parser': 1.2.7 '@types/send': 0.17.4 + dev: true - '@types/express@4.17.17': + /@types/express@4.17.17: + resolution: {integrity: sha512-Q4FmmuLGBG58btUnfS1c1r/NQdlp3DMfGDGig8WhfpA2YRUtEkxAjkZb0yvplJGYdF1fsQ81iMDcH24sSCNC/Q==} dependencies: '@types/body-parser': 1.19.5 '@types/express-serve-static-core': 4.17.43 '@types/qs': 6.9.11 '@types/serve-static': 1.15.5 + dev: true - '@types/graceful-fs@4.1.9': + /@types/graceful-fs@4.1.9: + resolution: {integrity: sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==} dependencies: '@types/node': 20.3.1 - '@types/http-errors@2.0.4': {} + /@types/http-errors@2.0.4: + resolution: {integrity: sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA==} + dev: true - '@types/istanbul-lib-coverage@2.0.6': {} + /@types/istanbul-lib-coverage@2.0.6: + resolution: {integrity: sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==} - '@types/istanbul-lib-report@3.0.3': + /@types/istanbul-lib-report@3.0.3: + resolution: {integrity: sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==} dependencies: '@types/istanbul-lib-coverage': 2.0.6 - '@types/istanbul-reports@3.0.4': + /@types/istanbul-reports@3.0.4: + resolution: {integrity: sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==} dependencies: '@types/istanbul-lib-report': 3.0.3 - '@types/jest@29.5.2': + /@types/jest@29.5.2: + resolution: {integrity: sha512-mSoZVJF5YzGVCk+FsDxzDuH7s+SCkzrgKZzf0Z0T2WudhBUPoF6ktoTPC4R0ZoCPCV5xUvuU6ias5NvxcBcMMg==} dependencies: expect: 29.7.0 pretty-format: 29.7.0 + dev: true - '@types/json-schema@7.0.15': {} + /@types/json-schema@7.0.15: + resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} - '@types/jsonwebtoken@9.0.5': + /@types/jsonwebtoken@9.0.5: + resolution: {integrity: sha512-VRLSGzik+Unrup6BsouBeHsf4d1hOEgYWTm/7Nmw1sXoN1+tRly/Gy/po3yeahnP4jfnQWWAhQAqcNfH7ngOkA==} dependencies: '@types/node': 20.3.1 - '@types/methods@1.1.4': {} + /@types/methods@1.1.4: + resolution: {integrity: sha512-ymXWVrDiCxTBE3+RIrrP533E70eA+9qu7zdWoHuOmGujkYtzf4HQF96b8nwHLqhuf4ykX61IGRIB38CC6/sImQ==} + dev: true - '@types/mime@1.3.5': {} + /@types/mime@1.3.5: + resolution: {integrity: sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==} + dev: true - '@types/mime@3.0.4': {} + /@types/mime@3.0.4: + resolution: {integrity: sha512-iJt33IQnVRkqeqC7PzBHPTC6fDlRNRW8vjrgqtScAhrmMwe8c4Eo7+fUGTa+XdWrpEgpyKWMYmi2dIwMAYRzPw==} + dev: true - '@types/minimist@1.2.5': {} + /@types/minimist@1.2.5: + resolution: {integrity: sha512-hov8bUuiLiyFPGyFPE1lwWhmzYbirOXQNNo40+y3zow8aFVTeyn3VWL0VFFfdNddA8S4Vf0Tc062rzyNr7Paag==} + dev: true - '@types/ms@0.7.34': {} + /@types/ms@0.7.34: + resolution: {integrity: sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g==} + dev: true - '@types/node@20.3.1': {} + /@types/node@20.3.1: + resolution: {integrity: sha512-EhcH/wvidPy1WeML3TtYFGR83UzjxeWRen9V402T8aUGYsCHOmfoisV3ZSg03gAFIbLq8TnWOJ0f4cALtnSEUg==} - '@types/normalize-package-data@2.4.4': {} + /@types/normalize-package-data@2.4.4: + resolution: {integrity: sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==} + dev: true - '@types/parse-json@4.0.2': {} + /@types/parse-json@4.0.2: + resolution: {integrity: sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==} + dev: true - '@types/passport-jwt@4.0.1': + /@types/passport-jwt@4.0.1: + resolution: {integrity: sha512-Y0Ykz6nWP4jpxgEUYq8NoVZeCQPo1ZndJLfapI249g1jHChvRfZRO/LS3tqu26YgAS/laI1qx98sYGz0IalRXQ==} dependencies: '@types/jsonwebtoken': 9.0.5 '@types/passport-strategy': 0.2.38 + dev: true - '@types/passport-local@1.0.38': + /@types/passport-local@1.0.38: + resolution: {integrity: sha512-nsrW4A963lYE7lNTv9cr5WmiUD1ibYJvWrpE13oxApFsRt77b0RdtZvKbCdNIY4v/QZ6TRQWaDDEwV1kCTmcXg==} dependencies: '@types/express': 4.17.17 '@types/passport': 1.0.16 '@types/passport-strategy': 0.2.38 + dev: true - '@types/passport-strategy@0.2.38': + /@types/passport-strategy@0.2.38: + resolution: {integrity: sha512-GC6eMqqojOooq993Tmnmp7AUTbbQSgilyvpCYQjT+H6JfG/g6RGc7nXEniZlp0zyKJ0WUdOiZWLBZft9Yug1uA==} dependencies: '@types/express': 4.17.17 '@types/passport': 1.0.16 + dev: true - '@types/passport@1.0.16': + /@types/passport@1.0.16: + resolution: {integrity: sha512-FD0qD5hbPWQzaM0wHUnJ/T0BBCJBxCeemtnCwc/ThhTg3x9jfrAcRUmj5Dopza+MfFS9acTe3wk7rcVnRIp/0A==} dependencies: '@types/express': 4.17.17 + dev: true - '@types/qs@6.9.11': {} + /@types/qs@6.9.11: + resolution: {integrity: sha512-oGk0gmhnEJK4Yyk+oI7EfXsLayXatCWPHary1MtcmbAifkobT9cM9yutG/hZKIseOU0MqbIwQ/u2nn/Gb+ltuQ==} + dev: true - '@types/range-parser@1.2.7': {} + /@types/range-parser@1.2.7: + resolution: {integrity: sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==} + dev: true - '@types/semver@7.5.6': {} + /@types/semver@7.5.6: + resolution: {integrity: sha512-dn1l8LaMea/IjDoHNd9J52uBbInB796CDffS6VdIxvqYCPSG0V0DzHp76GpaWnlhg88uYyPbXCDIowa86ybd5A==} + dev: true - '@types/send@0.17.4': + /@types/send@0.17.4: + resolution: {integrity: sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==} dependencies: '@types/mime': 1.3.5 '@types/node': 20.3.1 + dev: true - '@types/serve-static@1.15.5': + /@types/serve-static@1.15.5: + resolution: {integrity: sha512-PDRk21MnK70hja/YF8AHfC7yIsiQHn1rcXx7ijCFBX/k+XQJhQT/gw3xekXKJvx+5SXaMMS8oqQy09Mzvz2TuQ==} dependencies: '@types/http-errors': 2.0.4 '@types/mime': 3.0.4 '@types/node': 20.3.1 + dev: true - '@types/stack-utils@2.0.3': {} + /@types/stack-utils@2.0.3: + resolution: {integrity: sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==} - '@types/superagent@8.1.3': + /@types/superagent@8.1.3: + resolution: {integrity: sha512-R/CfN6w2XsixLb1Ii8INfn+BT9sGPvw74OavfkW4SwY+jeUcAwLZv2+bXLJkndnimxjEBm0RPHgcjW9pLCa8cw==} dependencies: '@types/cookiejar': 2.1.5 '@types/methods': 1.1.4 '@types/node': 20.3.1 + dev: true - '@types/supertest@6.0.0': + /@types/supertest@6.0.0: + resolution: {integrity: sha512-j3/Z2avY+H3yn+xp/ef//QyqqE+dg3rWh14Ewi/QZs6uVK+oOs7lFRXtjp2YHAqHJZ4OFGNmCxZO5vd7AuG/Dg==} dependencies: '@types/cookiejar': 2.1.5 '@types/methods': 1.1.4 '@types/superagent': 8.1.3 + dev: true - '@types/validator@13.11.9': {} + /@types/validator@13.11.9: + resolution: {integrity: sha512-FCTsikRozryfayPuiI46QzH3fnrOoctTjvOYZkho9BTFLCOZ2rgZJHMOVgCOfttjPJcgOx52EpkY0CMfy87MIw==} - '@types/yargs-parser@21.0.3': {} + /@types/yargs-parser@21.0.3: + resolution: {integrity: sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==} - '@types/yargs@17.0.32': + /@types/yargs@17.0.32: + resolution: {integrity: sha512-xQ67Yc/laOG5uMfX/093MRlGGCIBzZMarVa+gfNKJxWAIgykYpVGkBdbqEzGDDfCrVUj6Hiff4mTZ5BA6TmAog==} dependencies: '@types/yargs-parser': 21.0.3 - '@typescript-eslint/eslint-plugin@6.0.0(@typescript-eslint/parser@6.0.0)(eslint@8.42.0)(typescript@5.1.3)': + /@typescript-eslint/eslint-plugin@6.0.0(@typescript-eslint/parser@6.0.0)(eslint@8.42.0)(typescript@5.1.3): + resolution: {integrity: sha512-xuv6ghKGoiq856Bww/yVYnXGsKa588kY3M0XK7uUW/3fJNNULKRfZfSBkMTSpqGG/8ZCXCadfh8G/z/B4aqS/A==} + engines: {node: ^16.0.0 || >=18.0.0} + peerDependencies: + '@typescript-eslint/parser': ^6.0.0 || ^6.0.0-alpha + eslint: ^7.0.0 || ^8.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true dependencies: '@eslint-community/regexpp': 4.10.0 '@typescript-eslint/parser': 6.0.0(eslint@8.42.0)(typescript@5.1.3) @@ -6335,8 +2164,17 @@ snapshots: typescript: 5.1.3 transitivePeerDependencies: - supports-color + dev: true - '@typescript-eslint/parser@6.0.0(eslint@8.42.0)(typescript@5.1.3)': + /@typescript-eslint/parser@6.0.0(eslint@8.42.0)(typescript@5.1.3): + resolution: {integrity: sha512-TNaufYSPrr1U8n+3xN+Yp9g31vQDJqhXzzPSHfQDLcaO4tU+mCfODPxCwf4H530zo7aUBE3QIdxCXamEnG04Tg==} + engines: {node: ^16.0.0 || >=18.0.0} + peerDependencies: + eslint: ^7.0.0 || ^8.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true dependencies: '@typescript-eslint/scope-manager': 6.0.0 '@typescript-eslint/types': 6.0.0 @@ -6347,13 +2185,25 @@ snapshots: typescript: 5.1.3 transitivePeerDependencies: - supports-color + dev: true - '@typescript-eslint/scope-manager@6.0.0': + /@typescript-eslint/scope-manager@6.0.0: + resolution: {integrity: sha512-o4q0KHlgCZTqjuaZ25nw5W57NeykZT9LiMEG4do/ovwvOcPnDO1BI5BQdCsUkjxFyrCL0cSzLjvIMfR9uo7cWg==} + engines: {node: ^16.0.0 || >=18.0.0} dependencies: '@typescript-eslint/types': 6.0.0 '@typescript-eslint/visitor-keys': 6.0.0 + dev: true - '@typescript-eslint/type-utils@6.0.0(eslint@8.42.0)(typescript@5.1.3)': + /@typescript-eslint/type-utils@6.0.0(eslint@8.42.0)(typescript@5.1.3): + resolution: {integrity: sha512-ah6LJvLgkoZ/pyJ9GAdFkzeuMZ8goV6BH7eC9FPmojrnX9yNCIsfjB+zYcnex28YO3RFvBkV6rMV6WpIqkPvoQ==} + engines: {node: ^16.0.0 || >=18.0.0} + peerDependencies: + eslint: ^7.0.0 || ^8.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true dependencies: '@typescript-eslint/typescript-estree': 6.0.0(typescript@5.1.3) '@typescript-eslint/utils': 6.0.0(eslint@8.42.0)(typescript@5.1.3) @@ -6363,10 +2213,21 @@ snapshots: typescript: 5.1.3 transitivePeerDependencies: - supports-color + dev: true - '@typescript-eslint/types@6.0.0': {} + /@typescript-eslint/types@6.0.0: + resolution: {integrity: sha512-Zk9KDggyZM6tj0AJWYYKgF0yQyrcnievdhG0g5FqyU3Y2DRxJn4yWY21sJC0QKBckbsdKKjYDV2yVrrEvuTgxg==} + engines: {node: ^16.0.0 || >=18.0.0} + dev: true - '@typescript-eslint/typescript-estree@6.0.0(typescript@5.1.3)': + /@typescript-eslint/typescript-estree@6.0.0(typescript@5.1.3): + resolution: {integrity: sha512-2zq4O7P6YCQADfmJ5OTDQTP3ktajnXIRrYAtHM9ofto/CJZV3QfJ89GEaM2BNGeSr1KgmBuLhEkz5FBkS2RQhQ==} + engines: {node: ^16.0.0 || >=18.0.0} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true dependencies: '@typescript-eslint/types': 6.0.0 '@typescript-eslint/visitor-keys': 6.0.0 @@ -6378,8 +2239,13 @@ snapshots: typescript: 5.1.3 transitivePeerDependencies: - supports-color + dev: true - '@typescript-eslint/utils@6.0.0(eslint@8.42.0)(typescript@5.1.3)': + /@typescript-eslint/utils@6.0.0(eslint@8.42.0)(typescript@5.1.3): + resolution: {integrity: sha512-SOr6l4NB6HE4H/ktz0JVVWNXqCJTOo/mHnvIte1ZhBQ0Cvd04x5uKZa3zT6tiodL06zf5xxdK8COiDvPnQ27JQ==} + engines: {node: ^16.0.0 || >=18.0.0} + peerDependencies: + eslint: ^7.0.0 || ^8.0.0 dependencies: '@eslint-community/eslint-utils': 4.4.0(eslint@8.42.0) '@types/json-schema': 7.0.15 @@ -6393,49 +2259,74 @@ snapshots: transitivePeerDependencies: - supports-color - typescript + dev: true - '@typescript-eslint/visitor-keys@6.0.0': + /@typescript-eslint/visitor-keys@6.0.0: + resolution: {integrity: sha512-cvJ63l8c0yXdeT5POHpL0Q1cZoRcmRKFCtSjNGJxPkcP571EfZMcNbzWAc7oK3D1dRzm/V5EwtkANTZxqvuuUA==} + engines: {node: ^16.0.0 || >=18.0.0} dependencies: '@typescript-eslint/types': 6.0.0 eslint-visitor-keys: 3.4.3 + dev: true - '@webassemblyjs/ast@1.11.6': + /@webassemblyjs/ast@1.11.6: + resolution: {integrity: sha512-IN1xI7PwOvLPgjcf180gC1bqn3q/QaOCwYUahIOhbYUu8KA/3tw2RT/T0Gidi1l7Hhj5D/INhJxiICObqpMu4Q==} dependencies: '@webassemblyjs/helper-numbers': 1.11.6 '@webassemblyjs/helper-wasm-bytecode': 1.11.6 + dev: true - '@webassemblyjs/floating-point-hex-parser@1.11.6': {} + /@webassemblyjs/floating-point-hex-parser@1.11.6: + resolution: {integrity: sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==} + dev: true - '@webassemblyjs/helper-api-error@1.11.6': {} + /@webassemblyjs/helper-api-error@1.11.6: + resolution: {integrity: sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==} + dev: true - '@webassemblyjs/helper-buffer@1.11.6': {} + /@webassemblyjs/helper-buffer@1.11.6: + resolution: {integrity: sha512-z3nFzdcp1mb8nEOFFk8DrYLpHvhKC3grJD2ardfKOzmbmJvEf/tPIqCY+sNcwZIY8ZD7IkB2l7/pqhUhqm7hLA==} + dev: true - '@webassemblyjs/helper-numbers@1.11.6': + /@webassemblyjs/helper-numbers@1.11.6: + resolution: {integrity: sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==} dependencies: '@webassemblyjs/floating-point-hex-parser': 1.11.6 '@webassemblyjs/helper-api-error': 1.11.6 '@xtuc/long': 4.2.2 + dev: true - '@webassemblyjs/helper-wasm-bytecode@1.11.6': {} + /@webassemblyjs/helper-wasm-bytecode@1.11.6: + resolution: {integrity: sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==} + dev: true - '@webassemblyjs/helper-wasm-section@1.11.6': + /@webassemblyjs/helper-wasm-section@1.11.6: + resolution: {integrity: sha512-LPpZbSOwTpEC2cgn4hTydySy1Ke+XEu+ETXuoyvuyezHO3Kjdu90KK95Sh9xTbmjrCsUwvWwCOQQNta37VrS9g==} dependencies: '@webassemblyjs/ast': 1.11.6 '@webassemblyjs/helper-buffer': 1.11.6 '@webassemblyjs/helper-wasm-bytecode': 1.11.6 '@webassemblyjs/wasm-gen': 1.11.6 + dev: true - '@webassemblyjs/ieee754@1.11.6': + /@webassemblyjs/ieee754@1.11.6: + resolution: {integrity: sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==} dependencies: '@xtuc/ieee754': 1.2.0 + dev: true - '@webassemblyjs/leb128@1.11.6': + /@webassemblyjs/leb128@1.11.6: + resolution: {integrity: sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==} dependencies: '@xtuc/long': 4.2.2 + dev: true - '@webassemblyjs/utf8@1.11.6': {} + /@webassemblyjs/utf8@1.11.6: + resolution: {integrity: sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==} + dev: true - '@webassemblyjs/wasm-edit@1.11.6': + /@webassemblyjs/wasm-edit@1.11.6: + resolution: {integrity: sha512-Ybn2I6fnfIGuCR+Faaz7YcvtBKxvoLV3Lebn1tM4o/IAJzmi9AWYIPWpyBfU8cC+JxAO57bk4+zdsTjJR+VTOw==} dependencies: '@webassemblyjs/ast': 1.11.6 '@webassemblyjs/helper-buffer': 1.11.6 @@ -6445,23 +2336,29 @@ snapshots: '@webassemblyjs/wasm-opt': 1.11.6 '@webassemblyjs/wasm-parser': 1.11.6 '@webassemblyjs/wast-printer': 1.11.6 + dev: true - '@webassemblyjs/wasm-gen@1.11.6': + /@webassemblyjs/wasm-gen@1.11.6: + resolution: {integrity: sha512-3XOqkZP/y6B4F0PBAXvI1/bky7GryoogUtfwExeP/v7Nzwo1QLcq5oQmpKlftZLbT+ERUOAZVQjuNVak6UXjPA==} dependencies: '@webassemblyjs/ast': 1.11.6 '@webassemblyjs/helper-wasm-bytecode': 1.11.6 '@webassemblyjs/ieee754': 1.11.6 '@webassemblyjs/leb128': 1.11.6 '@webassemblyjs/utf8': 1.11.6 + dev: true - '@webassemblyjs/wasm-opt@1.11.6': + /@webassemblyjs/wasm-opt@1.11.6: + resolution: {integrity: sha512-cOrKuLRE7PCe6AsOVl7WasYf3wbSo4CeOk6PkrjS7g57MFfVUF9u6ysQBBODX0LdgSvQqRiGz3CXvIDKcPNy4g==} dependencies: '@webassemblyjs/ast': 1.11.6 '@webassemblyjs/helper-buffer': 1.11.6 '@webassemblyjs/wasm-gen': 1.11.6 '@webassemblyjs/wasm-parser': 1.11.6 + dev: true - '@webassemblyjs/wasm-parser@1.11.6': + /@webassemblyjs/wasm-parser@1.11.6: + resolution: {integrity: sha512-6ZwPeGzMJM3Dqp3hCsLgESxBGtT/OeCvCZ4TA1JUPYgmhAx38tTPR9JaKy0S5H3evQpO/h2uWs2j6Yc/fjkpTQ==} dependencies: '@webassemblyjs/ast': 1.11.6 '@webassemblyjs/helper-api-error': 1.11.6 @@ -6469,175 +2366,317 @@ snapshots: '@webassemblyjs/ieee754': 1.11.6 '@webassemblyjs/leb128': 1.11.6 '@webassemblyjs/utf8': 1.11.6 + dev: true - '@webassemblyjs/wast-printer@1.11.6': + /@webassemblyjs/wast-printer@1.11.6: + resolution: {integrity: sha512-JM7AhRcE+yW2GWYaKeHL5vt4xqee5N2WcezptmgyhNS+ScggqcT1OtXykhAb13Sn5Yas0j2uv9tHgrjwvzAP4A==} dependencies: '@webassemblyjs/ast': 1.11.6 '@xtuc/long': 4.2.2 + dev: true - '@xtuc/ieee754@1.2.0': {} + /@xtuc/ieee754@1.2.0: + resolution: {integrity: sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==} + dev: true - '@xtuc/long@4.2.2': {} + /@xtuc/long@4.2.2: + resolution: {integrity: sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==} + dev: true - JSONStream@1.3.5: + /JSONStream@1.3.5: + resolution: {integrity: sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==} + hasBin: true dependencies: jsonparse: 1.3.1 through: 2.3.8 + dev: true - abbrev@1.1.1: {} + /abbrev@1.1.1: + resolution: {integrity: sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==} + dev: false - abort-controller@3.0.0: + /abort-controller@3.0.0: + resolution: {integrity: sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==} + engines: {node: '>=6.5'} dependencies: event-target-shim: 5.0.1 + dev: false - abstract-logging@2.0.1: {} + /abstract-logging@2.0.1: + resolution: {integrity: sha512-2BjRTZxTPvheOvGbBslFSYOUkr+SjPtOnrLP33f+VIWLzezQpZcqVg7ja3L4dBXmzzgwT+a029jRx5PCi3JuiA==} + dev: false - acorn-import-assertions@1.9.0(acorn@8.11.3): + /acorn-import-assertions@1.9.0(acorn@8.11.3): + resolution: {integrity: sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==} + peerDependencies: + acorn: ^8 dependencies: acorn: 8.11.3 + dev: true - acorn-jsx@5.3.2(acorn@8.11.3): + /acorn-jsx@5.3.2(acorn@8.11.3): + resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} + peerDependencies: + acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 dependencies: acorn: 8.11.3 + dev: true - acorn-walk@8.3.2: {} + /acorn-walk@8.3.2: + resolution: {integrity: sha512-cjkyv4OtNCIeqhHrfS81QWXoCBPExR/J62oyEqepVw8WaQeSqpW2uhuLPh1m9eWhDuOo/jUXVTlifvesOWp/4A==} + engines: {node: '>=0.4.0'} - acorn@4.0.13: {} + /acorn@4.0.13: + resolution: {integrity: sha512-fu2ygVGuMmlzG8ZeRJ0bvR41nsAkxxhbyk8bZ1SS521Z7vmgJFTQQlfz/Mp/nJexGBz+v8sC9bM6+lNgskt4Ug==} + engines: {node: '>=0.4.0'} + hasBin: true + dev: false - acorn@8.11.3: {} + /acorn@8.11.3: + resolution: {integrity: sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==} + engines: {node: '>=0.4.0'} + hasBin: true - add-stream@1.0.0: {} + /add-stream@1.0.0: + resolution: {integrity: sha512-qQLMr+8o0WC4FZGQTcJiKBVC59JylcPSrTtk6usvmIDFUOCKegapy1VHQwRbFMOFyb/inzUVqHs+eMYKDM1YeQ==} + dev: true - agent-base@6.0.2: + /agent-base@6.0.2: + resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==} + engines: {node: '>= 6.0.0'} dependencies: debug: 4.3.4 transitivePeerDependencies: - supports-color + dev: false - agentkeepalive@4.5.0: + /agentkeepalive@4.5.0: + resolution: {integrity: sha512-5GG/5IbQQpC9FpkRGsSvZI5QYeSCzlJHdpBQntCsuTOxhKD8lqKhrleg2Yi7yvMIf82Ycmmqln9U8V9qwEiJew==} + engines: {node: '>= 8.0.0'} dependencies: humanize-ms: 1.2.1 + dev: false - aggregate-error@3.1.0: + /aggregate-error@3.1.0: + resolution: {integrity: sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==} + engines: {node: '>=8'} dependencies: clean-stack: 2.2.0 indent-string: 4.0.0 + dev: false - ajv-formats@2.1.1(ajv@8.12.0): + /ajv-formats@2.1.1(ajv@8.12.0): + resolution: {integrity: sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==} + peerDependencies: + ajv: ^8.0.0 + peerDependenciesMeta: + ajv: + optional: true dependencies: ajv: 8.12.0 - ajv-formats@2.1.1(ajv@8.9.0): + /ajv-formats@2.1.1(ajv@8.9.0): + resolution: {integrity: sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==} + peerDependencies: + ajv: ^8.0.0 + peerDependenciesMeta: + ajv: + optional: true dependencies: ajv: 8.9.0 + dev: false - ajv-keywords@3.5.2(ajv@6.12.6): + /ajv-keywords@3.5.2(ajv@6.12.6): + resolution: {integrity: sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==} + peerDependencies: + ajv: ^6.9.1 dependencies: ajv: 6.12.6 + dev: true - ajv@6.12.6: + /ajv@6.12.6: + resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} dependencies: fast-deep-equal: 3.1.3 fast-json-stable-stringify: 2.1.0 json-schema-traverse: 0.4.1 uri-js: 4.4.1 + dev: true - ajv@8.12.0: + /ajv@8.12.0: + resolution: {integrity: sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==} dependencies: fast-deep-equal: 3.1.3 json-schema-traverse: 1.0.0 require-from-string: 2.0.2 uri-js: 4.4.1 - ajv@8.9.0: + /ajv@8.9.0: + resolution: {integrity: sha512-qOKJyNj/h+OWx7s5DePL6Zu1KeM9jPZhwBqs+7DzP6bGOvqzVCSf0xueYmVuaC/oQ/VtS2zLMLHdQFbkka+XDQ==} dependencies: fast-deep-equal: 3.1.3 json-schema-traverse: 1.0.0 require-from-string: 2.0.2 uri-js: 4.4.1 + dev: false - ansi-colors@4.1.3: {} + /ansi-colors@4.1.3: + resolution: {integrity: sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==} + engines: {node: '>=6'} + dev: true - ansi-escapes@4.3.2: + /ansi-escapes@4.3.2: + resolution: {integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==} + engines: {node: '>=8'} dependencies: type-fest: 0.21.3 - ansi-regex@2.1.1: {} + /ansi-regex@2.1.1: + resolution: {integrity: sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==} + engines: {node: '>=0.10.0'} + dev: false - ansi-regex@5.0.1: {} + /ansi-regex@5.0.1: + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} + engines: {node: '>=8'} - ansi-regex@6.0.1: {} + /ansi-regex@6.0.1: + resolution: {integrity: sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==} + engines: {node: '>=12'} + dev: false - ansi-styles@2.2.1: {} + /ansi-styles@2.2.1: + resolution: {integrity: sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==} + engines: {node: '>=0.10.0'} + dev: false - ansi-styles@3.2.1: + /ansi-styles@3.2.1: + resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} + engines: {node: '>=4'} dependencies: color-convert: 1.9.3 - ansi-styles@4.3.0: + /ansi-styles@4.3.0: + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + engines: {node: '>=8'} dependencies: color-convert: 2.0.1 - ansi-styles@5.2.0: {} + /ansi-styles@5.2.0: + resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==} + engines: {node: '>=10'} - ansi-styles@6.2.1: {} + /ansi-styles@6.2.1: + resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} + engines: {node: '>=12'} + dev: false - anymatch@3.1.3: + /anymatch@3.1.3: + resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} + engines: {node: '>= 8'} dependencies: normalize-path: 3.0.0 picomatch: 2.3.1 - aproba@2.0.0: {} + /aproba@2.0.0: + resolution: {integrity: sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==} + dev: false - archy@1.0.0: {} + /archy@1.0.0: + resolution: {integrity: sha512-Xg+9RwCg/0p32teKdGMPTPnVXKD0w3DfHnFTficozsAgsvq2XenPJq/MYpzzQ/v8zrOyJn6Ds39VA4JIDwFfqw==} + dev: false - are-we-there-yet@2.0.0: + /are-we-there-yet@2.0.0: + resolution: {integrity: sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==} + engines: {node: '>=10'} dependencies: delegates: 1.0.0 readable-stream: 3.6.2 + dev: false - are-we-there-yet@3.0.1: + /are-we-there-yet@3.0.1: + resolution: {integrity: sha512-QZW4EDmGwlYur0Yyf/b2uGucHQMa8aFUP7eu9ddR73vvhFyt4V0Vl3QHPcTNJ8l6qYOBdxgXdnBXQrHilfRQBg==} + engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} dependencies: delegates: 1.0.0 readable-stream: 3.6.2 + dev: false - arg@4.1.3: {} + /arg@4.1.3: + resolution: {integrity: sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==} - argparse@1.0.10: + /argparse@1.0.10: + resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} dependencies: sprintf-js: 1.0.3 - argparse@2.0.1: {} + /argparse@2.0.1: + resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} - arr-diff@2.0.0: + /arr-diff@2.0.0: + resolution: {integrity: sha512-dtXTVMkh6VkEEA7OhXnN1Ecb8aAGFdZ1LFxtOCoqj4qkyOJMt7+qs6Ahdy6p/NQCPYsRSXXivhSB/J5E9jmYKA==} + engines: {node: '>=0.10.0'} dependencies: arr-flatten: 1.1.0 + dev: false - arr-flatten@1.1.0: {} + /arr-flatten@1.1.0: + resolution: {integrity: sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==} + engines: {node: '>=0.10.0'} + dev: false - array-ify@1.0.0: {} + /array-ify@1.0.0: + resolution: {integrity: sha512-c5AMf34bKdvPhQ7tBGhqkgKNUzMr4WUs+WDtC2ZUGOUncbxKMTvqxYctiseW3+L4bA8ec+GcZ6/A/FW4m8ukng==} + dev: true - array-timsort@1.0.3: {} + /array-timsort@1.0.3: + resolution: {integrity: sha512-/+3GRL7dDAGEfM6TseQk/U+mi18TU2Ms9I3UlLdUMhz2hbvGNTKdj9xniwXfUqgYhHxRx0+8UnKkvlNwVU+cWQ==} + dev: true - array-union@2.1.0: {} + /array-union@2.1.0: + resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} + engines: {node: '>=8'} + dev: true - array-unique@0.2.1: {} + /array-unique@0.2.1: + resolution: {integrity: sha512-G2n5bG5fSUCpnsXz4+8FUkYsGPkNfLn9YvS66U5qbTIXI2Ynnlo4Bi42bWv+omKUCqz+ejzfClwne0alJWJPhg==} + engines: {node: '>=0.10.0'} + dev: false - arrify@1.0.1: {} + /arrify@1.0.1: + resolution: {integrity: sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==} + engines: {node: '>=0.10.0'} + dev: true - asap@2.0.6: {} + /asap@2.0.6: + resolution: {integrity: sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==} + dev: true - async@3.2.5: {} + /async@3.2.5: + resolution: {integrity: sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg==} + dev: false - asynckit@0.4.0: {} + /asynckit@0.4.0: + resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} - at-least-node@1.0.0: {} + /at-least-node@1.0.0: + resolution: {integrity: sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==} + engines: {node: '>= 4.0.0'} + dev: true - atob@2.1.2: {} + /atob@2.1.2: + resolution: {integrity: sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==} + engines: {node: '>= 4.5.0'} + hasBin: true + dev: false - atomic-sleep@1.0.0: {} + /atomic-sleep@1.0.0: + resolution: {integrity: sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ==} + engines: {node: '>=8.0.0'} + dev: false - avvio@8.3.0: + /avvio@8.3.0: + resolution: {integrity: sha512-VBVH0jubFr9LdFASy/vNtm5giTrnbVquWBhT0fyizuNK2rQ7e7ONU2plZQWUNqtE1EmxFEb+kbSkFRkstiaS9Q==} dependencies: '@fastify/error': 3.4.1 archy: 1.0.0 @@ -6645,16 +2684,23 @@ snapshots: fastq: 1.17.1 transitivePeerDependencies: - supports-color + dev: false - axios@1.6.7(debug@2.6.9): + /axios@1.6.7(debug@2.6.9): + resolution: {integrity: sha512-/hDJGff6/c7u0hDkvkGxR/oy6CbCs8ziCsC7SqmhjfozqiJGc8Z11wrv9z9lYfY4K8l+H9TpjcMDX0xOZmx+RA==} dependencies: follow-redirects: 1.15.5(debug@2.6.9) form-data: 4.0.0 proxy-from-env: 1.1.0 transitivePeerDependencies: - debug + dev: false - babel-jest@29.7.0(@babel/core@7.23.9): + /babel-jest@29.7.0(@babel/core@7.23.9): + resolution: {integrity: sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + peerDependencies: + '@babel/core': ^7.8.0 dependencies: '@babel/core': 7.23.9 '@jest/transform': 29.7.0 @@ -6667,7 +2713,9 @@ snapshots: transitivePeerDependencies: - supports-color - babel-plugin-istanbul@6.1.1: + /babel-plugin-istanbul@6.1.1: + resolution: {integrity: sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==} + engines: {node: '>=8'} dependencies: '@babel/helper-plugin-utils': 7.22.5 '@istanbuljs/load-nyc-config': 1.1.0 @@ -6677,14 +2725,19 @@ snapshots: transitivePeerDependencies: - supports-color - babel-plugin-jest-hoist@29.6.3: + /babel-plugin-jest-hoist@29.6.3: + resolution: {integrity: sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: '@babel/template': 7.23.9 '@babel/types': 7.23.9 '@types/babel__core': 7.20.5 '@types/babel__traverse': 7.20.5 - babel-preset-current-node-syntax@1.0.1(@babel/core@7.23.9): + /babel-preset-current-node-syntax@1.0.1(@babel/core@7.23.9): + resolution: {integrity: sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==} + peerDependencies: + '@babel/core': ^7.0.0 dependencies: '@babel/core': 7.23.9 '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.23.9) @@ -6700,85 +2753,122 @@ snapshots: '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.23.9) '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.23.9) - babel-preset-jest@29.6.3(@babel/core@7.23.9): + /babel-preset-jest@29.6.3(@babel/core@7.23.9): + resolution: {integrity: sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + peerDependencies: + '@babel/core': ^7.0.0 dependencies: '@babel/core': 7.23.9 babel-plugin-jest-hoist: 29.6.3 babel-preset-current-node-syntax: 1.0.1(@babel/core@7.23.9) - balanced-match@1.0.2: {} + /balanced-match@1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} - base64-js@1.5.1: {} + /base64-js@1.5.1: + resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} - bcrypt@5.1.1: + /bcrypt@5.1.1: + resolution: {integrity: sha512-AGBHOG5hPYZ5Xl9KXzU5iKq9516yEmvCKDg3ecP5kX2aB6UqTeXZxk2ELnDgDm6BQSMlLt9rDB4LoSMx0rYwww==} + engines: {node: '>= 10.0.0'} + requiresBuild: true dependencies: '@mapbox/node-pre-gyp': 1.0.11 node-addon-api: 5.1.0 transitivePeerDependencies: - encoding - supports-color + dev: false - binary-extensions@2.2.0: {} + /binary-extensions@2.2.0: + resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==} + engines: {node: '>=8'} + dev: true - bindings@1.5.0: + /bindings@1.5.0: + resolution: {integrity: sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==} dependencies: file-uri-to-path: 1.0.0 + dev: false - bl@4.1.0: + /bl@4.1.0: + resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==} dependencies: buffer: 5.7.1 inherits: 2.0.4 readable-stream: 3.6.2 - brace-expansion@1.1.11: + /brace-expansion@1.1.11: + resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} dependencies: balanced-match: 1.0.2 concat-map: 0.0.1 - brace-expansion@2.0.1: + /brace-expansion@2.0.1: + resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} dependencies: balanced-match: 1.0.2 - braces@1.8.5: + /braces@1.8.5: + resolution: {integrity: sha512-xU7bpz2ytJl1bH9cgIurjpg/n8Gohy9GTw81heDYLJQ4RU60dlyJsa+atVF2pI0yMMvKxI9HkKwjePCj5XI1hw==} + engines: {node: '>=0.10.0'} dependencies: expand-range: 1.8.2 preserve: 0.2.0 repeat-element: 1.1.4 + dev: false - braces@3.0.2: + /braces@3.0.2: + resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} + engines: {node: '>=8'} dependencies: fill-range: 7.0.1 - browserslist@4.22.3: + /browserslist@4.22.3: + resolution: {integrity: sha512-UAp55yfwNv0klWNapjs/ktHoguxuQNGnOzxYmfnXIS+8AsRDZkSDxg7R1AX3GKzn078SBI5dzwzj/Yx0Or0e3A==} + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} + hasBin: true dependencies: caniuse-lite: 1.0.30001584 electron-to-chromium: 1.4.659 node-releases: 2.0.14 update-browserslist-db: 1.0.13(browserslist@4.22.3) - bs-logger@0.2.6: + /bs-logger@0.2.6: + resolution: {integrity: sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==} + engines: {node: '>= 6'} dependencies: fast-json-stable-stringify: 2.1.0 - bser@2.1.1: + /bser@2.1.1: + resolution: {integrity: sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==} dependencies: node-int64: 0.4.0 - buffer-equal-constant-time@1.0.1: {} + /buffer-equal-constant-time@1.0.1: + resolution: {integrity: sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==} + dev: false - buffer-from@1.1.2: {} + /buffer-from@1.1.2: + resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} - buffer@5.7.1: + /buffer@5.7.1: + resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} dependencies: base64-js: 1.5.1 ieee754: 1.2.1 - buffer@6.0.3: + /buffer@6.0.3: + resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==} dependencies: base64-js: 1.5.1 ieee754: 1.2.1 + dev: false - cacache@16.1.3: + /cacache@16.1.3: + resolution: {integrity: sha512-/+Emcj9DAXxX4cwlLmRI9c166RuL3w30zp4R7Joiv2cQTtTtA+jeuCAjH3ZlGnYS3tKENSrKhAzVVP9GVyzeYQ==} + engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} dependencies: '@npmcli/fs': 2.1.2 '@npmcli/move-file': 2.0.1 @@ -6800,70 +2890,117 @@ snapshots: unique-filename: 2.0.1 transitivePeerDependencies: - bluebird + dev: false - cache-manager@5.4.0: + /cache-manager@5.4.0: + resolution: {integrity: sha512-FS7o8vqJosnLpu9rh2gQTo8EOzCRJLF1BJ4XDEUDMqcfvs7SJZs5iuoFTXLauzQ3S5v8sBAST1pCwMaurpyi1A==} dependencies: lodash.clonedeep: 4.5.0 lru-cache: 10.2.0 promise-coalesce: 1.1.2 + dev: false - cachedir@2.3.0: {} + /cachedir@2.3.0: + resolution: {integrity: sha512-A+Fezp4zxnit6FanDmv9EqXNAi3vt9DWp51/71UEhXukb7QUuvtv9344h91dyAxuTLoSYJFU299qzR3tzwPAhw==} + engines: {node: '>=6'} + dev: true - call-bind@1.0.6: + /call-bind@1.0.6: + resolution: {integrity: sha512-Mj50FLHtlsoVfRfnHaZvyrooHcrlceNZdL/QBvJJVd9Ta55qCQK0gs4ss2oZDeV9zFCs6ewzYgVE5yfVmfFpVg==} + engines: {node: '>= 0.4'} dependencies: es-errors: 1.3.0 function-bind: 1.1.2 get-intrinsic: 1.2.4 set-function-length: 1.2.1 + dev: true - callsites@3.1.0: {} + /callsites@3.1.0: + resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} + engines: {node: '>=6'} - camelcase-keys@6.2.2: + /camelcase-keys@6.2.2: + resolution: {integrity: sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==} + engines: {node: '>=8'} dependencies: camelcase: 5.3.1 map-obj: 4.3.0 quick-lru: 4.0.1 + dev: true - camelcase@2.1.1: {} + /camelcase@2.1.1: + resolution: {integrity: sha512-DLIsRzJVBQu72meAKPkWQOLcujdXT32hwdfnkI1frSiSRMK1MofjKHf+MEx0SB6fjEFXL8fBDv1dKymBlOp4Qw==} + engines: {node: '>=0.10.0'} + dev: false - camelcase@3.0.0: {} + /camelcase@3.0.0: + resolution: {integrity: sha512-4nhGqUkc4BqbBBB4Q6zLuD7lzzrHYrjKGeYaEji/3tFR5VdJu9v+LilhGIVe8wxEJPPOeWo7eg8dwY13TZ1BNg==} + engines: {node: '>=0.10.0'} + dev: false - camelcase@5.3.1: {} + /camelcase@5.3.1: + resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==} + engines: {node: '>=6'} - camelcase@6.3.0: {} + /camelcase@6.3.0: + resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} + engines: {node: '>=10'} - caniuse-lite@1.0.30001584: {} + /caniuse-lite@1.0.30001584: + resolution: {integrity: sha512-LOz7CCQ9M1G7OjJOF9/mzmqmj3jE/7VOmrfw6Mgs0E8cjOsbRXQJHsPBfmBOXDskXKrHLyyW3n7kpDW/4BsfpQ==} - case@1.6.3: {} + /case@1.6.3: + resolution: {integrity: sha512-mzDSXIPaFwVDvZAHqZ9VlbyF4yyXRuX6IvB06WvPYkqJVO24kX1PPhv9bfpKNFZyxYFmmgo03HUiD8iklmJYRQ==} + engines: {node: '>= 0.8.0'} + dev: true - centra@2.6.0: {} + /centra@2.6.0: + resolution: {integrity: sha512-dgh+YleemrT8u85QL11Z6tYhegAs3MMxsaWAq/oXeAmYJ7VxL3SI9TZtnfaEvNDMAPolj25FXIb3S+HCI4wQaQ==} + deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. + dev: true - chalk@1.1.3: + /chalk@1.1.3: + resolution: {integrity: sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==} + engines: {node: '>=0.10.0'} dependencies: ansi-styles: 2.2.1 escape-string-regexp: 1.0.5 has-ansi: 2.0.0 strip-ansi: 3.0.1 supports-color: 2.0.0 + dev: false - chalk@2.4.2: + /chalk@2.4.2: + resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} + engines: {node: '>=4'} dependencies: ansi-styles: 3.2.1 escape-string-regexp: 1.0.5 supports-color: 5.5.0 - chalk@4.1.2: + /chalk@4.1.2: + resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} + engines: {node: '>=10'} dependencies: ansi-styles: 4.3.0 supports-color: 7.2.0 - chalk@5.3.0: {} + /chalk@5.3.0: + resolution: {integrity: sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==} + engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} + dev: true - char-regex@1.0.2: {} + /char-regex@1.0.2: + resolution: {integrity: sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==} + engines: {node: '>=10'} - chardet@0.7.0: {} + /chardet@0.7.0: + resolution: {integrity: sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==} + dev: true - chokidar@3.5.3: + /chokidar@3.5.3: + resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==} + engines: {node: '>= 8.10.0'} dependencies: anymatch: 3.1.3 braces: 3.0.2 @@ -6874,100 +3011,163 @@ snapshots: readdirp: 3.6.0 optionalDependencies: fsevents: 2.3.3 + dev: true - chownr@2.0.0: {} + /chownr@2.0.0: + resolution: {integrity: sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==} + engines: {node: '>=10'} - chrome-trace-event@1.0.3: {} + /chrome-trace-event@1.0.3: + resolution: {integrity: sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==} + engines: {node: '>=6.0'} + dev: true - ci-info@3.9.0: {} + /ci-info@3.9.0: + resolution: {integrity: sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==} + engines: {node: '>=8'} - cjs-module-lexer@1.2.3: {} + /cjs-module-lexer@1.2.3: + resolution: {integrity: sha512-0TNiGstbQmCFwt4akjjBg5pLRTSyj/PkWQ1ZoO2zntmg9yLqSRxwEa4iCfQLGjqhiqBfOJa7W/E8wfGrTDmlZQ==} - class-transformer@0.5.1: {} + /class-transformer@0.5.1: + resolution: {integrity: sha512-SQa1Ws6hUbfC98vKGxZH3KFY0Y1lm5Zm0SY8XX9zbK7FJCyVEac3ATW0RIpwzW+oOfmHE5PMPufDG9hCfoEOMw==} - class-validator@0.14.1: + /class-validator@0.14.1: + resolution: {integrity: sha512-2VEG9JICxIqTpoK1eMzZqaV+u/EiwEJkMGzTrZf6sU/fwsnOITVgYJ8yojSy6CaXtO9V0Cc6ZQZ8h8m4UBuLwQ==} dependencies: '@types/validator': 13.11.9 libphonenumber-js: 1.10.58 validator: 13.11.0 - clean-stack@2.2.0: {} + /clean-stack@2.2.0: + resolution: {integrity: sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==} + engines: {node: '>=6'} + dev: false - cli-cursor@3.1.0: + /cli-cursor@3.1.0: + resolution: {integrity: sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==} + engines: {node: '>=8'} dependencies: restore-cursor: 3.1.0 - cli-spinners@2.9.2: {} + /cli-spinners@2.9.2: + resolution: {integrity: sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==} + engines: {node: '>=6'} - cli-table3@0.6.3: + /cli-table3@0.6.3: + resolution: {integrity: sha512-w5Jac5SykAeZJKntOxJCrm63Eg5/4dhMWIcuTbo9rpE+brgaSZo0RuNJZeOyMgsUdhDeojvgyQLmjI+K50ZGyg==} + engines: {node: 10.* || >= 12.*} dependencies: string-width: 4.2.3 optionalDependencies: '@colors/colors': 1.5.0 + dev: true - cli-width@3.0.0: {} + /cli-width@3.0.0: + resolution: {integrity: sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==} + engines: {node: '>= 10'} + dev: true - cliui@3.2.0: + /cliui@3.2.0: + resolution: {integrity: sha512-0yayqDxWQbqk3ojkYqUKqaAQ6AfNKeKWRNA8kR0WXzAsdHpP4BIaOmMAG87JGuO6qcobyW4GjxHd9PmhEd+T9w==} dependencies: string-width: 1.0.2 strip-ansi: 3.0.1 wrap-ansi: 2.1.0 + dev: false - cliui@7.0.4: + /cliui@7.0.4: + resolution: {integrity: sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==} dependencies: string-width: 4.2.3 strip-ansi: 6.0.1 wrap-ansi: 7.0.0 + dev: true - cliui@8.0.1: + /cliui@8.0.1: + resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} + engines: {node: '>=12'} dependencies: string-width: 4.2.3 strip-ansi: 6.0.1 wrap-ansi: 7.0.0 - clone-stats@0.0.1: {} + /clone-stats@0.0.1: + resolution: {integrity: sha512-dhUqc57gSMCo6TX85FLfe51eC/s+Im2MLkAgJwfaRRexR2tA4dd3eLEW4L6efzHc2iNorrRRXITifnDLlRrhaA==} + dev: false - clone@1.0.4: {} + /clone@1.0.4: + resolution: {integrity: sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==} + engines: {node: '>=0.8'} - co@4.6.0: {} + /co@4.6.0: + resolution: {integrity: sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==} + engines: {iojs: '>= 1.0.0', node: '>= 0.12.0'} - code-point-at@1.1.0: {} + /code-point-at@1.1.0: + resolution: {integrity: sha512-RpAVKQA5T63xEj6/giIbUEtZwJ4UFIc3ZtvEkiaUERylqe8xb5IvqcgOurZLahv93CLKfxcw5YI+DZcUBRyLXA==} + engines: {node: '>=0.10.0'} + dev: false - collect-v8-coverage@1.0.2: {} + /collect-v8-coverage@1.0.2: + resolution: {integrity: sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q==} - color-convert@1.9.3: + /color-convert@1.9.3: + resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} dependencies: color-name: 1.1.3 - color-convert@2.0.1: + /color-convert@2.0.1: + resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} + engines: {node: '>=7.0.0'} dependencies: color-name: 1.1.4 - color-name@1.1.3: {} + /color-name@1.1.3: + resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} - color-name@1.1.4: {} + /color-name@1.1.4: + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} - color-support@1.1.3: {} + /color-support@1.1.3: + resolution: {integrity: sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==} + hasBin: true + dev: false - colorette@2.0.20: {} + /colorette@2.0.20: + resolution: {integrity: sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==} + dev: false - combined-stream@1.0.8: + /combined-stream@1.0.8: + resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} + engines: {node: '>= 0.8'} dependencies: delayed-stream: 1.0.0 - commander@2.20.3: {} + /commander@2.20.3: + resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} + dev: true - commander@4.1.1: {} + /commander@4.1.1: + resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==} + engines: {node: '>= 6'} + dev: true - comment-json@4.2.3: + /comment-json@4.2.3: + resolution: {integrity: sha512-SsxdiOf064DWoZLH799Ata6u7iV658A11PlWtZATDlXPpKGJnbJZ5Z24ybixAi+LUUqJ/GKowAejtC5GFUG7Tw==} + engines: {node: '>= 6'} dependencies: array-timsort: 1.0.3 core-util-is: 1.0.3 esprima: 4.0.1 has-own-prop: 2.0.0 repeat-string: 1.6.1 + dev: true - commitizen@4.3.0(@types/node@20.3.1)(typescript@5.1.3): + /commitizen@4.3.0(@types/node@20.3.1)(typescript@5.1.3): + resolution: {integrity: sha512-H0iNtClNEhT0fotHvGV3E9tDejDeS04sN1veIebsKYGMuGscFaswRoYJKmT3eW85eIJAs0F28bG2+a/9wCOfPw==} + engines: {node: '>= 12'} + hasBin: true dependencies: cachedir: 2.3.0 cz-conventional-changelog: 3.3.0(@types/node@20.3.1)(typescript@5.1.3) @@ -6986,63 +3186,100 @@ snapshots: transitivePeerDependencies: - '@types/node' - typescript + dev: true - compare-func@2.0.0: + /compare-func@2.0.0: + resolution: {integrity: sha512-zHig5N+tPWARooBnb0Zx1MFcdfpyJrfTJ3Y5L+IFvUm8rM74hHz66z0gw0x4tijh5CorKkKUCnW82R2vmpeCRA==} dependencies: array-ify: 1.0.0 dot-prop: 5.3.0 + dev: true - component-emitter@1.3.1: {} + /component-emitter@1.3.1: + resolution: {integrity: sha512-T0+barUSQRTUQASh8bx02dl+DhF54GtIDY13Y3m9oWTklKbb3Wv974meRpeZ3lp1JpLVECWWNHC4vaG2XHXouQ==} + dev: true - concat-map@0.0.1: {} + /concat-map@0.0.1: + resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} - concat-stream@1.5.1: + /concat-stream@1.5.1: + resolution: {integrity: sha512-eYF1Q4RxUUwq8ApyPD9ebWsYjVrJmTMLGzbGXv4qTZ5iP7FLm+oWN4x2XIzLEZ745xiwRM9DmIB0Ix1Nz8Epmg==} + engines: {'0': node >= 0.8} dependencies: inherits: 2.0.4 readable-stream: 2.0.6 typedarray: 0.0.7 + dev: false - concat-stream@2.0.0: + /concat-stream@2.0.0: + resolution: {integrity: sha512-MWufYdFw53ccGjCA+Ol7XJYpAlW6/prSMzuPOTRnJGcGzuhLn4Scrz7qf6o8bROZ514ltazcIFJZevcfbo0x7A==} + engines: {'0': node >= 6.0} dependencies: buffer-from: 1.1.2 inherits: 2.0.4 readable-stream: 3.6.2 typedarray: 0.0.6 + dev: true - consola@2.15.3: {} + /consola@2.15.3: + resolution: {integrity: sha512-9vAdYbHj6x2fLKC4+oPH0kFzY/orMZyG2Aj+kNylHxKGJ/Ed4dpNyAQYwJOdqO4zdM7XpVHmyejQDcQHrnuXbw==} - console-control-strings@1.1.0: {} + /console-control-strings@1.1.0: + resolution: {integrity: sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==} + dev: false - content-disposition@0.5.4: + /content-disposition@0.5.4: + resolution: {integrity: sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==} + engines: {node: '>= 0.6'} dependencies: safe-buffer: 5.2.1 + dev: false - conventional-changelog-angular@5.0.13: + /conventional-changelog-angular@5.0.13: + resolution: {integrity: sha512-i/gipMxs7s8L/QeuavPF2hLnJgH6pEZAttySB6aiQLWcX3puWDL3ACVmvBhJGxnAy52Qc15ua26BufY6KpmrVA==} + engines: {node: '>=10'} dependencies: compare-func: 2.0.0 q: 1.5.1 + dev: true - conventional-changelog-angular@7.0.0: + /conventional-changelog-angular@7.0.0: + resolution: {integrity: sha512-ROjNchA9LgfNMTTFSIWPzebCwOGFdgkEq45EnvvrmSLvCtAw0HSmrCs7/ty+wAeYUZyNay0YMUNYFTRL72PkBQ==} + engines: {node: '>=16'} dependencies: compare-func: 2.0.0 + dev: true - conventional-changelog-atom@2.0.8: + /conventional-changelog-atom@2.0.8: + resolution: {integrity: sha512-xo6v46icsFTK3bb7dY/8m2qvc8sZemRgdqLb/bjpBsH2UyOS8rKNTgcb5025Hri6IpANPApbXMg15QLb1LJpBw==} + engines: {node: '>=10'} dependencies: q: 1.5.1 + dev: true - conventional-changelog-codemirror@2.0.8: + /conventional-changelog-codemirror@2.0.8: + resolution: {integrity: sha512-z5DAsn3uj1Vfp7po3gpt2Boc+Bdwmw2++ZHa5Ak9k0UKsYAO5mH1UBTN0qSCuJZREIhX6WU4E1p3IW2oRCNzQw==} + engines: {node: '>=10'} dependencies: q: 1.5.1 + dev: true - conventional-changelog-config-spec@2.1.0: {} + /conventional-changelog-config-spec@2.1.0: + resolution: {integrity: sha512-IpVePh16EbbB02V+UA+HQnnPIohgXvJRxHcS5+Uwk4AT5LjzCZJm5sp/yqs5C6KZJ1jMsV4paEV13BN1pvDuxQ==} + dev: true - conventional-changelog-conventionalcommits@4.6.3: + /conventional-changelog-conventionalcommits@4.6.3: + resolution: {integrity: sha512-LTTQV4fwOM4oLPad317V/QNQ1FY4Hju5qeBIM1uTHbrnCE+Eg4CdRZ3gO2pUeR+tzWdp80M2j3qFFEDWVqOV4g==} + engines: {node: '>=10'} dependencies: compare-func: 2.0.0 lodash: 4.17.21 q: 1.5.1 + dev: true - conventional-changelog-core@4.2.4: + /conventional-changelog-core@4.2.4: + resolution: {integrity: sha512-gDVS+zVJHE2v4SLc6B0sLsPiloR0ygU7HaDW14aNJE1v4SlqJPILPl/aJC7YdtRE4CybBf8gDwObBvKha8Xlyg==} + engines: {node: '>=10'} dependencies: add-stream: 1.0.0 conventional-changelog-writer: 5.0.1 @@ -7058,31 +3295,53 @@ snapshots: read-pkg: 3.0.0 read-pkg-up: 3.0.0 through2: 4.0.2 + dev: true - conventional-changelog-ember@2.0.9: + /conventional-changelog-ember@2.0.9: + resolution: {integrity: sha512-ulzIReoZEvZCBDhcNYfDIsLTHzYHc7awh+eI44ZtV5cx6LVxLlVtEmcO+2/kGIHGtw+qVabJYjdI5cJOQgXh1A==} + engines: {node: '>=10'} dependencies: q: 1.5.1 + dev: true - conventional-changelog-eslint@3.0.9: + /conventional-changelog-eslint@3.0.9: + resolution: {integrity: sha512-6NpUCMgU8qmWmyAMSZO5NrRd7rTgErjrm4VASam2u5jrZS0n38V7Y9CzTtLT2qwz5xEChDR4BduoWIr8TfwvXA==} + engines: {node: '>=10'} dependencies: q: 1.5.1 + dev: true - conventional-changelog-express@2.0.6: + /conventional-changelog-express@2.0.6: + resolution: {integrity: sha512-SDez2f3iVJw6V563O3pRtNwXtQaSmEfTCaTBPCqn0oG0mfkq0rX4hHBq5P7De2MncoRixrALj3u3oQsNK+Q0pQ==} + engines: {node: '>=10'} dependencies: q: 1.5.1 + dev: true - conventional-changelog-jquery@3.0.11: + /conventional-changelog-jquery@3.0.11: + resolution: {integrity: sha512-x8AWz5/Td55F7+o/9LQ6cQIPwrCjfJQ5Zmfqi8thwUEKHstEn4kTIofXub7plf1xvFA2TqhZlq7fy5OmV6BOMw==} + engines: {node: '>=10'} dependencies: q: 1.5.1 + dev: true - conventional-changelog-jshint@2.0.9: + /conventional-changelog-jshint@2.0.9: + resolution: {integrity: sha512-wMLdaIzq6TNnMHMy31hql02OEQ8nCQfExw1SE0hYL5KvU+JCTuPaDO+7JiogGT2gJAxiUGATdtYYfh+nT+6riA==} + engines: {node: '>=10'} dependencies: compare-func: 2.0.0 q: 1.5.1 + dev: true - conventional-changelog-preset-loader@2.3.4: {} + /conventional-changelog-preset-loader@2.3.4: + resolution: {integrity: sha512-GEKRWkrSAZeTq5+YjUZOYxdHq+ci4dNwHvpaBC3+ENalzFWuCWa9EZXSuZBpkr72sMdKB+1fyDV4takK1Lf58g==} + engines: {node: '>=10'} + dev: true - conventional-changelog-writer@5.0.1: + /conventional-changelog-writer@5.0.1: + resolution: {integrity: sha512-5WsuKUfxW7suLblAbFnxAcrvf6r+0b7GvNaWUwUIk0bXMnENP/PEieGKVUQrjPqwPT4o3EPAASBXiY6iHooLOQ==} + engines: {node: '>=10'} + hasBin: true dependencies: conventional-commits-filter: 2.0.7 dateformat: 3.0.3 @@ -7093,8 +3352,11 @@ snapshots: semver: 6.3.1 split: 1.0.1 through2: 4.0.2 + dev: true - conventional-changelog@3.1.25: + /conventional-changelog@3.1.25: + resolution: {integrity: sha512-ryhi3fd1mKf3fSjbLXOfK2D06YwKNic1nC9mWqybBHdObPd8KJ2vjaXZfYj1U23t+V8T8n0d7gwnc9XbIdFbyQ==} + engines: {node: '>=10'} dependencies: conventional-changelog-angular: 5.0.13 conventional-changelog-atom: 2.0.8 @@ -7107,15 +3369,24 @@ snapshots: conventional-changelog-jquery: 3.0.11 conventional-changelog-jshint: 2.0.9 conventional-changelog-preset-loader: 2.3.4 + dev: true - conventional-commit-types@3.0.0: {} + /conventional-commit-types@3.0.0: + resolution: {integrity: sha512-SmmCYnOniSsAa9GqWOeLqc179lfr5TRu5b4QFDkbsrJ5TZjPJx85wtOr3zn+1dbeNiXDKGPbZ72IKbPhLXh/Lg==} + dev: true - conventional-commits-filter@2.0.7: + /conventional-commits-filter@2.0.7: + resolution: {integrity: sha512-ASS9SamOP4TbCClsRHxIHXRfcGCnIoQqkvAzCSbZzTFLfcTqJVugB0agRgsEELsqaeWgsXv513eS116wnlSSPA==} + engines: {node: '>=10'} dependencies: lodash.ismatch: 4.4.0 modify-values: 1.0.1 + dev: true - conventional-commits-parser@3.2.4: + /conventional-commits-parser@3.2.4: + resolution: {integrity: sha512-nK7sAtfi+QXbxHCYfhpZsfRtaitZLIA6889kFIouLvz6repszQDgxBu7wf2WbU+Dco7sAnNCJYERCwt54WPC2Q==} + engines: {node: '>=10'} + hasBin: true dependencies: JSONStream: 1.3.5 is-text-path: 1.0.1 @@ -7123,15 +3394,23 @@ snapshots: meow: 8.1.2 split2: 3.2.2 through2: 4.0.2 + dev: true - conventional-commits-parser@5.0.0: + /conventional-commits-parser@5.0.0: + resolution: {integrity: sha512-ZPMl0ZJbw74iS9LuX9YIAiW8pfM5p3yh2o/NbXHbkFuZzY5jvdi5jFycEOkmBW5H5I7nA+D6f3UcsCLP2vvSEA==} + engines: {node: '>=16'} + hasBin: true dependencies: JSONStream: 1.3.5 is-text-path: 2.0.0 meow: 12.1.1 split2: 4.2.0 + dev: true - conventional-recommended-bump@6.1.0: + /conventional-recommended-bump@6.1.0: + resolution: {integrity: sha512-uiApbSiNGM/kkdL9GTOLAqC4hbptObFo4wW2QRyHsKciGAfQuLU1ShZ1BIVI/+K2BE/W1AWYQMCXAsv4dyKPaw==} + engines: {node: '>=10'} + hasBin: true dependencies: concat-stream: 2.0.0 conventional-changelog-preset-loader: 2.3.4 @@ -7141,43 +3420,77 @@ snapshots: git-semver-tags: 4.1.1 meow: 8.1.2 q: 1.5.1 + dev: true - convert-source-map@1.9.0: {} + /convert-source-map@1.9.0: + resolution: {integrity: sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==} + dev: false - convert-source-map@2.0.0: {} + /convert-source-map@2.0.0: + resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} - cookie-signature@1.2.1: {} + /cookie-signature@1.2.1: + resolution: {integrity: sha512-78KWk9T26NhzXtuL26cIJ8/qNHANyJ/ZYrmEXFzUmhZdjpBv+DlWlOANRTGBt48YcyslsLrj0bMLFTmXvLRCOw==} + engines: {node: '>=6.6.0'} + dev: false - cookie@0.6.0: {} + /cookie@0.6.0: + resolution: {integrity: sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==} + engines: {node: '>= 0.6'} + dev: false - cookiejar@2.1.4: {} + /cookiejar@2.1.4: + resolution: {integrity: sha512-LDx6oHrK+PhzLKJU9j5S7/Y3jM/mUHvD/DeI1WQmJn652iPC5Y4TBzC9l+5OMOXlyTTA+SmVUPm0HQUwpD5Jqw==} + dev: true - core-util-is@1.0.3: {} + /core-util-is@1.0.3: + resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} - cosmiconfig-typescript-loader@5.0.0(@types/node@20.3.1)(cosmiconfig@9.0.0)(typescript@5.1.3): + /cosmiconfig-typescript-loader@5.0.0(@types/node@20.3.1)(cosmiconfig@9.0.0)(typescript@5.1.3): + resolution: {integrity: sha512-+8cK7jRAReYkMwMiG+bxhcNKiHJDM6bR9FD/nGBXOWdMLuYawjF5cGrtLilJ+LGd3ZjCXnJjR5DkfWPoIVlqJA==} + engines: {node: '>=v16'} + peerDependencies: + '@types/node': '*' + cosmiconfig: '>=8.2' + typescript: '>=4' dependencies: '@types/node': 20.3.1 cosmiconfig: 9.0.0(typescript@5.1.3) jiti: 1.21.0 typescript: 5.1.3 + dev: true - cosmiconfig@7.1.0: + /cosmiconfig@7.1.0: + resolution: {integrity: sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==} + engines: {node: '>=10'} dependencies: '@types/parse-json': 4.0.2 import-fresh: 3.3.0 parse-json: 5.2.0 path-type: 4.0.0 yaml: 1.10.2 + dev: true - cosmiconfig@9.0.0(typescript@5.1.3): + /cosmiconfig@9.0.0(typescript@5.1.3): + resolution: {integrity: sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==} + engines: {node: '>=14'} + peerDependencies: + typescript: '>=4.9.5' + peerDependenciesMeta: + typescript: + optional: true dependencies: env-paths: 2.2.1 import-fresh: 3.3.0 js-yaml: 4.1.0 parse-json: 5.2.0 typescript: 5.1.3 + dev: true - create-jest@29.7.0(@types/node@20.3.1)(ts-node@10.9.1): + /create-jest@29.7.0(@types/node@20.3.1)(ts-node@10.9.1): + resolution: {integrity: sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + hasBin: true dependencies: '@jest/types': 29.6.3 chalk: 4.1.2 @@ -7192,22 +3505,29 @@ snapshots: - supports-color - ts-node - create-require@1.1.1: {} + /create-require@1.1.1: + resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==} - cross-spawn@7.0.3: + /cross-spawn@7.0.3: + resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} + engines: {node: '>= 8'} dependencies: path-key: 3.1.1 shebang-command: 2.0.0 which: 2.0.2 - css@2.2.4: + /css@2.2.4: + resolution: {integrity: sha512-oUnjmWpy0niI3x/mPL8dVEI1l7MnG3+HHyRPHf+YFSbK+svOhXpmSOcDURUh2aOCgl2grzrOPt1nHLuCVFULLw==} dependencies: inherits: 2.0.4 source-map: 0.6.1 source-map-resolve: 0.5.3 urix: 0.1.0 + dev: false - cz-conventional-changelog@3.3.0(@types/node@20.3.1)(typescript@5.1.3): + /cz-conventional-changelog@3.3.0(@types/node@20.3.1)(typescript@5.1.3): + resolution: {integrity: sha512-U466fIzU5U22eES5lTNiNbZ+d8dfcHcssH4o7QsdWaCcRs/feIPCxKYSWkYBNs5mny7MvEfwpTLWjvbm94hecw==} + engines: {node: '>= 10'} dependencies: chalk: 2.4.2 commitizen: 4.3.0(@types/node@20.3.1)(typescript@5.1.3) @@ -7220,198 +3540,372 @@ snapshots: transitivePeerDependencies: - '@types/node' - typescript + dev: true - dargs@7.0.0: {} + /dargs@7.0.0: + resolution: {integrity: sha512-2iy1EkLdlBzQGvbweYRFxmFath8+K7+AKB0TlhHWkNuH+TmovaMH/Wp7V7R4u7f4SnX3OgLsU9t1NI9ioDnUpg==} + engines: {node: '>=8'} + dev: true - dargs@8.1.0: {} + /dargs@8.1.0: + resolution: {integrity: sha512-wAV9QHOsNbwnWdNW2FYvE1P56wtgSbM+3SZcdGiWQILwVjACCXDCI3Ai8QlCjMDB8YK5zySiXZYBiwGmNY3lnw==} + engines: {node: '>=12'} + dev: true - dateformat@3.0.3: {} + /dateformat@3.0.3: + resolution: {integrity: sha512-jyCETtSl3VMZMWeRo7iY1FL19ges1t55hMo5yaam4Jrsm5EPL89UQkoQRyiI+Yf4k8r2ZpdngkV8hr1lIdjb3Q==} + dev: true - dateformat@4.6.3: {} + /dateformat@4.6.3: + resolution: {integrity: sha512-2P0p0pFGzHS5EMnhdxQi7aJN+iMheud0UhG4dlE1DLAlvL8JHjJJTX/CSm4JXwV0Ka5nGk3zC5mcb5bUQUxxMA==} + dev: false - debug-fabulous@0.0.4: + /debug-fabulous@0.0.4: + resolution: {integrity: sha512-mmVKpY/O4UIl6ZDn5Owf8jEauO6uQiuF4Jz9iTuflSmvqNm6/64xARk/qCq5ZJxu141Ic2lCmL1TSMHIYoyiTw==} dependencies: debug: 2.6.9 lazy-debug-legacy: 0.0.1(debug@2.6.9) object-assign: 4.1.0 transitivePeerDependencies: - supports-color + dev: false - debug@2.6.9: + /debug@2.6.9: + resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true dependencies: ms: 2.0.0 + dev: false - debug@4.3.4: + /debug@4.3.4: + resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true dependencies: ms: 2.1.2 - decamelize-keys@1.1.1: + /decamelize-keys@1.1.1: + resolution: {integrity: sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg==} + engines: {node: '>=0.10.0'} dependencies: decamelize: 1.2.0 map-obj: 1.0.1 + dev: true - decamelize@1.2.0: {} + /decamelize@1.2.0: + resolution: {integrity: sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==} + engines: {node: '>=0.10.0'} - decode-uri-component@0.2.2: {} + /decode-uri-component@0.2.2: + resolution: {integrity: sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==} + engines: {node: '>=0.10'} + dev: false - dedent@0.7.0: {} + /dedent@0.7.0: + resolution: {integrity: sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==} + dev: true - dedent@1.5.1: {} + /dedent@1.5.1: + resolution: {integrity: sha512-+LxW+KLWxu3HW3M2w2ympwtqPrqYRzU8fqi6Fhd18fBALe15blJPI/I4+UHveMVG6lJqB4JNd4UG0S5cnVHwIg==} + peerDependencies: + babel-plugin-macros: ^3.1.0 + peerDependenciesMeta: + babel-plugin-macros: + optional: true - deep-is@0.1.4: {} + /deep-is@0.1.4: + resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} + dev: true - deep-override@1.0.2: {} + /deep-override@1.0.2: + resolution: {integrity: sha512-+bAuLuYqaVVUWPaq8rmU8NLTX85p4I5k5/cVdhBioEfH7k+5NlGdv4NoJVQcJRByqzzTWWzTpih+pU1wBTmMow==} + dev: true - deepmerge@4.3.1: {} + /deepmerge@4.3.1: + resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} + engines: {node: '>=0.10.0'} - defaults@1.0.4: + /defaults@1.0.4: + resolution: {integrity: sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==} dependencies: clone: 1.0.4 - define-data-property@1.1.2: + /define-data-property@1.1.2: + resolution: {integrity: sha512-SRtsSqsDbgpJBbW3pABMCOt6rQyeM8s8RiyeSN8jYG8sYmt/kGJejbydttUsnDs1tadr19tvhT4ShwMyoqAm4g==} + engines: {node: '>= 0.4'} dependencies: es-errors: 1.3.0 get-intrinsic: 1.2.4 gopd: 1.0.1 has-property-descriptors: 1.0.1 + dev: true - delayed-stream@1.0.0: {} + /delayed-stream@1.0.0: + resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} + engines: {node: '>=0.4.0'} - delegates@1.0.0: {} + /delegates@1.0.0: + resolution: {integrity: sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==} + dev: false - depd@2.0.0: {} + /depd@2.0.0: + resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} + engines: {node: '>= 0.8'} + dev: false - detect-file@1.0.0: {} + /detect-file@1.0.0: + resolution: {integrity: sha512-DtCOLG98P007x7wiiOmfI0fi3eIKyWiLTGJ2MDnVi/E04lWGbf+JzrRHMm0rgIIZJGtHpKpbVgLWHrv8xXpc3Q==} + engines: {node: '>=0.10.0'} + dev: true - detect-indent@6.1.0: {} + /detect-indent@6.1.0: + resolution: {integrity: sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==} + engines: {node: '>=8'} + dev: true - detect-libc@2.0.2: {} + /detect-libc@2.0.2: + resolution: {integrity: sha512-UX6sGumvvqSaXgdKGUsgZWqcUyIXZ/vZTrlRT/iobiKhGL0zL4d3osHj3uqllWJK+i+sixDS/3COVEOFbupFyw==} + engines: {node: '>=8'} + dev: false - detect-newline@2.1.0: {} + /detect-newline@2.1.0: + resolution: {integrity: sha512-CwffZFvlJffUg9zZA0uqrjQayUTC8ob94pnr5sFwaVv3IOmkfUHcWH+jXaQK3askE51Cqe8/9Ql/0uXNwqZ8Zg==} + engines: {node: '>=0.10.0'} + dev: false - detect-newline@3.1.0: {} + /detect-newline@3.1.0: + resolution: {integrity: sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==} + engines: {node: '>=8'} - dezalgo@1.0.4: + /dezalgo@1.0.4: + resolution: {integrity: sha512-rXSP0bf+5n0Qonsb+SVVfNfIsimO4HEtmnIpPHY8Q1UCzKlQrDMfdobr8nJOOsRgWCyMRqeSBQzmWUMq7zvVig==} dependencies: asap: 2.0.6 wrappy: 1.0.2 + dev: true - diff-sequences@29.6.3: {} + /diff-sequences@29.6.3: + resolution: {integrity: sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - diff@4.0.2: {} + /diff@4.0.2: + resolution: {integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==} + engines: {node: '>=0.3.1'} - dir-glob@3.0.1: + /dir-glob@3.0.1: + resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} + engines: {node: '>=8'} dependencies: path-type: 4.0.0 + dev: true - doctrine@3.0.0: + /doctrine@3.0.0: + resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} + engines: {node: '>=6.0.0'} dependencies: esutils: 2.0.3 + dev: true - dot-prop@5.3.0: + /dot-prop@5.3.0: + resolution: {integrity: sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==} + engines: {node: '>=8'} dependencies: is-obj: 2.0.0 + dev: true - dot@1.1.3: {} + /dot@1.1.3: + resolution: {integrity: sha512-/nt74Rm+PcfnirXGEdhZleTwGC2LMnuKTeeTIlI82xb5loBBoXNYzr2ezCroPSMtilK8EZIfcNZwOcHN+ib1Lg==} + engines: {'0': node >=0.2.6} + hasBin: true + dev: false - dotenv-expand@10.0.0: {} + /dotenv-expand@10.0.0: + resolution: {integrity: sha512-GopVGCpVS1UKH75VKHGuQFqS1Gusej0z4FyQkPdwjil2gNIv+LNsqBlboOzpJFZKVT95GkCyWJbBSdFEFUWI2A==} + engines: {node: '>=12'} + dev: false - dotenv@16.3.1: {} + /dotenv@16.3.1: + resolution: {integrity: sha512-IPzF4w4/Rd94bA9imS68tZBaYyBWSCE47V1RGuMrB94iyTOIEwRmVL2x/4An+6mETpLrKJ5hQkB8W4kFAadeIQ==} + engines: {node: '>=12'} + dev: false - dotgitignore@2.1.0: + /dotgitignore@2.1.0: + resolution: {integrity: sha512-sCm11ak2oY6DglEPpCB8TixLjWAxd3kJTs6UIcSasNYxXdFPV+YKlye92c8H4kKFqV5qYMIh7d+cYecEg0dIkA==} + engines: {node: '>=6'} dependencies: find-up: 3.0.0 minimatch: 3.1.2 + dev: true - duplexify@3.7.1: + /duplexify@3.7.1: + resolution: {integrity: sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==} dependencies: end-of-stream: 1.4.4 inherits: 2.0.4 readable-stream: 2.3.8 stream-shift: 1.0.3 + dev: false - duplexify@4.1.2: + /duplexify@4.1.2: + resolution: {integrity: sha512-fz3OjcNCHmRP12MJoZMPglx8m4rrFP8rovnk4vT8Fs+aonZoCwGg10dSsQsfP/E62eZcPTMSMP6686fu9Qlqtw==} dependencies: end-of-stream: 1.4.4 inherits: 2.0.4 readable-stream: 3.6.2 stream-shift: 1.0.3 + dev: false - eastasianwidth@0.2.0: {} + /eastasianwidth@0.2.0: + resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} + dev: false - ecdsa-sig-formatter@1.0.11: + /ecdsa-sig-formatter@1.0.11: + resolution: {integrity: sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==} dependencies: safe-buffer: 5.2.1 + dev: false - electron-to-chromium@1.4.659: {} + /electron-to-chromium@1.4.659: + resolution: {integrity: sha512-sRJ3nV3HowrYpBtPF9bASQV7OW49IgZC01Xiq43WfSE3RTCkK0/JidoCmR73Hyc1mN+l/H4Yqx0eNiomvExFZg==} - emittery@0.13.1: {} + /emittery@0.13.1: + resolution: {integrity: sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==} + engines: {node: '>=12'} - emoji-regex@8.0.0: {} + /emoji-regex@8.0.0: + resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} - emoji-regex@9.2.2: {} + /emoji-regex@9.2.2: + resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} + dev: false - encoding@0.1.13: + /encoding@0.1.13: + resolution: {integrity: sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==} + requiresBuild: true dependencies: iconv-lite: 0.6.3 + dev: false optional: true - end-of-stream@1.4.4: + /end-of-stream@1.4.4: + resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} dependencies: once: 1.4.0 - enhanced-resolve@5.15.0: + /enhanced-resolve@5.15.0: + resolution: {integrity: sha512-LXYT42KJ7lpIKECr2mAXIaMldcNCh/7E0KBKOu4KSfkHmP+mZmSs+8V5gBAqisWBy0OO4W5Oyys0GO1Y8KtdKg==} + engines: {node: '>=10.13.0'} dependencies: graceful-fs: 4.2.11 tapable: 2.2.1 + dev: true - env-paths@2.2.1: {} + /env-paths@2.2.1: + resolution: {integrity: sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==} + engines: {node: '>=6'} - err-code@2.0.3: {} + /err-code@2.0.3: + resolution: {integrity: sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==} + dev: false - error-ex@1.3.2: + /error-ex@1.3.2: + resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} dependencies: is-arrayish: 0.2.1 - es-errors@1.3.0: {} + /es-errors@1.3.0: + resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} + engines: {node: '>= 0.4'} + dev: true - es-module-lexer@1.4.1: {} + /es-module-lexer@1.4.1: + resolution: {integrity: sha512-cXLGjP0c4T3flZJKQSuziYoq7MlT+rnvfZjfp7h+I7K9BNX54kP9nyWvdbwjQ4u1iWbOL4u96fgeZLToQlZC7w==} + dev: true - escalade@3.1.2: {} + /escalade@3.1.2: + resolution: {integrity: sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==} + engines: {node: '>=6'} - escape-html@1.0.3: {} + /escape-html@1.0.3: + resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==} + dev: false - escape-string-regexp@1.0.5: {} + /escape-string-regexp@1.0.5: + resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} + engines: {node: '>=0.8.0'} - escape-string-regexp@2.0.0: {} + /escape-string-regexp@2.0.0: + resolution: {integrity: sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==} + engines: {node: '>=8'} - escape-string-regexp@4.0.0: {} + /escape-string-regexp@4.0.0: + resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} + engines: {node: '>=10'} + dev: true - eslint-config-prettier@9.0.0(eslint@8.42.0): + /eslint-config-prettier@9.0.0(eslint@8.42.0): + resolution: {integrity: sha512-IcJsTkJae2S35pRsRAwoCE+925rJJStOdkKnLVgtE+tEpqU0EVVM7OqrwxqgptKdX29NUwC82I5pXsGFIgSevw==} + hasBin: true + peerDependencies: + eslint: '>=7.0.0' dependencies: eslint: 8.42.0 + dev: true - eslint-plugin-prettier@5.0.0(eslint-config-prettier@9.0.0)(eslint@8.42.0)(prettier@3.0.0): + /eslint-plugin-prettier@5.0.0(eslint-config-prettier@9.0.0)(eslint@8.42.0)(prettier@3.0.0): + resolution: {integrity: sha512-AgaZCVuYDXHUGxj/ZGu1u8H8CYgDY3iG6w5kUFw4AzMVXzB7VvbKgYR4nATIN+OvUrghMbiDLeimVjVY5ilq3w==} + engines: {node: ^14.18.0 || >=16.0.0} + peerDependencies: + '@types/eslint': '>=8.0.0' + eslint: '>=8.0.0' + eslint-config-prettier: '*' + prettier: '>=3.0.0' + peerDependenciesMeta: + '@types/eslint': + optional: true + eslint-config-prettier: + optional: true dependencies: eslint: 8.42.0 eslint-config-prettier: 9.0.0(eslint@8.42.0) prettier: 3.0.0 prettier-linter-helpers: 1.0.0 synckit: 0.8.8 + dev: true - eslint-scope@5.1.1: + /eslint-scope@5.1.1: + resolution: {integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==} + engines: {node: '>=8.0.0'} dependencies: esrecurse: 4.3.0 estraverse: 4.3.0 + dev: true - eslint-scope@7.2.2: + /eslint-scope@7.2.2: + resolution: {integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dependencies: esrecurse: 4.3.0 estraverse: 5.3.0 + dev: true - eslint-visitor-keys@3.4.3: {} + /eslint-visitor-keys@3.4.3: + resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dev: true - eslint@8.42.0: + /eslint@8.42.0: + resolution: {integrity: sha512-ulg9Ms6E1WPf67PHaEY4/6E2tEn5/f7FXGzr3t9cBMugOmf1INYvuUwwh1aXQN4MfJ6a5K2iNwP3w4AColvI9A==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + hasBin: true dependencies: '@eslint-community/eslint-utils': 4.4.0(eslint@8.42.0) '@eslint-community/regexpp': 4.10.0 @@ -7454,36 +3948,67 @@ snapshots: text-table: 0.2.0 transitivePeerDependencies: - supports-color + dev: true - espree@9.6.1: + /espree@9.6.1: + resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dependencies: acorn: 8.11.3 acorn-jsx: 5.3.2(acorn@8.11.3) eslint-visitor-keys: 3.4.3 + dev: true - esprima@4.0.1: {} + /esprima@4.0.1: + resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} + engines: {node: '>=4'} + hasBin: true - esquery@1.5.0: + /esquery@1.5.0: + resolution: {integrity: sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==} + engines: {node: '>=0.10'} dependencies: estraverse: 5.3.0 + dev: true - esrecurse@4.3.0: + /esrecurse@4.3.0: + resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} + engines: {node: '>=4.0'} dependencies: estraverse: 5.3.0 + dev: true - estraverse@4.3.0: {} + /estraverse@4.3.0: + resolution: {integrity: sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==} + engines: {node: '>=4.0'} + dev: true - estraverse@5.3.0: {} + /estraverse@5.3.0: + resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} + engines: {node: '>=4.0'} + dev: true - esutils@2.0.3: {} + /esutils@2.0.3: + resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} + engines: {node: '>=0.10.0'} + dev: true - event-target-shim@5.0.1: {} + /event-target-shim@5.0.1: + resolution: {integrity: sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==} + engines: {node: '>=6'} + dev: false - eventemitter2@6.4.9: {} + /eventemitter2@6.4.9: + resolution: {integrity: sha512-JEPTiaOt9f04oa6NOkc4aH+nVp5I3wEjpHbIPqfgCdD5v5bUzy7xQqwcVO2aDQgOWhI28da57HksMrzK9HlRxg==} + dev: false - events@3.3.0: {} + /events@3.3.0: + resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==} + engines: {node: '>=0.8.x'} - execa@4.1.0: + /execa@4.1.0: + resolution: {integrity: sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA==} + engines: {node: '>=10'} dependencies: cross-spawn: 7.0.3 get-stream: 5.2.0 @@ -7494,8 +4019,11 @@ snapshots: onetime: 5.1.2 signal-exit: 3.0.7 strip-final-newline: 2.0.0 + dev: true - execa@5.1.1: + /execa@5.1.1: + resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} + engines: {node: '>=10'} dependencies: cross-spawn: 7.0.3 get-stream: 6.0.1 @@ -7507,7 +4035,9 @@ snapshots: signal-exit: 3.0.7 strip-final-newline: 2.0.0 - execa@8.0.1: + /execa@8.0.1: + resolution: {integrity: sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==} + engines: {node: '>=16.17'} dependencies: cross-spawn: 7.0.3 get-stream: 8.0.1 @@ -7518,22 +4048,36 @@ snapshots: onetime: 6.0.0 signal-exit: 4.1.0 strip-final-newline: 3.0.0 + dev: true - exit@0.1.2: {} + /exit@0.1.2: + resolution: {integrity: sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==} + engines: {node: '>= 0.8.0'} - expand-brackets@0.1.5: + /expand-brackets@0.1.5: + resolution: {integrity: sha512-hxx03P2dJxss6ceIeri9cmYOT4SRs3Zk3afZwWpOsRqLqprhTR8u++SlC+sFGsQr7WGFPdMF7Gjc1njDLDK6UA==} + engines: {node: '>=0.10.0'} dependencies: is-posix-bracket: 0.1.1 + dev: false - expand-range@1.8.2: + /expand-range@1.8.2: + resolution: {integrity: sha512-AFASGfIlnIbkKPQwX1yHaDjFvh/1gyKJODme52V6IORh69uEYgZp0o9C+qsIGNVEiuuhQU0CSSl++Rlegg1qvA==} + engines: {node: '>=0.10.0'} dependencies: fill-range: 2.2.4 + dev: false - expand-tilde@2.0.2: + /expand-tilde@2.0.2: + resolution: {integrity: sha512-A5EmesHW6rfnZ9ysHQjPdJRni0SRar0tjtG5MNtm9n5TUvsYU8oozprtRD4AqHxcZWWlVuAmQo2nWKfN9oyjTw==} + engines: {node: '>=0.10.0'} dependencies: homedir-polyfill: 1.0.3 + dev: true - expect@29.7.0: + /expect@29.7.0: + resolution: {integrity: sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: '@jest/expect-utils': 29.7.0 jest-get-type: 29.6.3 @@ -7541,45 +4085,72 @@ snapshots: jest-message-util: 29.7.0 jest-util: 29.7.0 - exponential-backoff@3.1.1: {} + /exponential-backoff@3.1.1: + resolution: {integrity: sha512-dX7e/LHVJ6W3DE1MHWi9S1EYzDESENfLrYohG2G++ovZrYOkm4Knwa0mc1cn84xJOR4KEU0WSchhLbd0UklbHw==} + dev: false - extend-shallow@2.0.1: + /extend-shallow@2.0.1: + resolution: {integrity: sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==} + engines: {node: '>=0.10.0'} dependencies: is-extendable: 0.1.1 + dev: false - extend@3.0.2: {} + /extend@3.0.2: + resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} + dev: false - external-editor@3.1.0: + /external-editor@3.1.0: + resolution: {integrity: sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==} + engines: {node: '>=4'} dependencies: chardet: 0.7.0 iconv-lite: 0.4.24 tmp: 0.0.33 + dev: true - extglob@0.3.2: + /extglob@0.3.2: + resolution: {integrity: sha512-1FOj1LOwn42TMrruOHGt18HemVnbwAmAak7krWk+wa93KXxGbK+2jpezm+ytJYDaBX0/SPLZFHKM7m+tKobWGg==} + engines: {node: '>=0.10.0'} dependencies: is-extglob: 1.0.0 + dev: false - fast-content-type-parse@1.1.0: {} + /fast-content-type-parse@1.1.0: + resolution: {integrity: sha512-fBHHqSTFLVnR61C+gltJuE5GkVQMV0S2nqUO8TJ+5Z3qAKG8vAx4FKai1s5jq/inV1+sREynIWSuQ6HgoSXpDQ==} + dev: false - fast-copy@3.0.1: {} + /fast-copy@3.0.1: + resolution: {integrity: sha512-Knr7NOtK3HWRYGtHoJrjkaWepqT8thIVGAwt0p0aUs1zqkAzXZV4vo9fFNwyb5fcqK1GKYFYxldQdIDVKhUAfA==} + dev: false - fast-decode-uri-component@1.0.1: {} + /fast-decode-uri-component@1.0.1: + resolution: {integrity: sha512-WKgKWg5eUxvRZGwW8FvfbaH7AXSh2cL+3j5fMGzUMCxWBJ3dV3a7Wz8y2f/uQ0e3B6WmodD3oS54jTQ9HVTIIg==} + dev: false - fast-deep-equal@3.1.3: {} + /fast-deep-equal@3.1.3: + resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} - fast-diff@1.3.0: {} + /fast-diff@1.3.0: + resolution: {integrity: sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==} + dev: true - fast-glob@3.3.2: + /fast-glob@3.3.2: + resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==} + engines: {node: '>=8.6.0'} 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.5 + dev: true - fast-json-stable-stringify@2.1.0: {} + /fast-json-stable-stringify@2.1.0: + resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} - fast-json-stringify@5.12.0: + /fast-json-stringify@5.12.0: + resolution: {integrity: sha512-7Nnm9UPa7SfHRbHVA1kJQrGXCRzB7LMlAAqHXQFkEQqueJm1V8owm0FsE/2Do55/4CcdhwiLQERaKomOnKQkyA==} dependencies: '@fastify/merge-json-schemas': 0.1.1 ajv: 8.12.0 @@ -7588,26 +4159,43 @@ snapshots: fast-uri: 2.3.0 json-schema-ref-resolver: 1.0.1 rfdc: 1.3.1 + dev: false - fast-levenshtein@2.0.6: {} + /fast-levenshtein@2.0.6: + resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} + dev: true - fast-querystring@1.1.2: + /fast-querystring@1.1.2: + resolution: {integrity: sha512-g6KuKWmFXc0fID8WWH0jit4g0AGBoJhCkJMb1RmbsSEUNvQ+ZC8D6CUZ+GtF8nMzSPXnhiePyyqqipzNNEnHjg==} dependencies: fast-decode-uri-component: 1.0.1 + dev: false - fast-redact@3.3.0: {} + /fast-redact@3.3.0: + resolution: {integrity: sha512-6T5V1QK1u4oF+ATxs1lWUmlEk6P2T9HqJG3e2DnHOdVgZy2rFJBoEnrIedcTXlkAHU/zKC+7KETJ+KGGKwxgMQ==} + engines: {node: '>=6'} + dev: false - fast-safe-stringify@2.1.1: {} + /fast-safe-stringify@2.1.1: + resolution: {integrity: sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==} - fast-uri@2.3.0: {} + /fast-uri@2.3.0: + resolution: {integrity: sha512-eel5UKGn369gGEWOqBShmFJWfq/xSJvsgDzgLYC845GneayWvXBf0lJCBn5qTABfewy1ZDPoaR5OZCP+kssfuw==} + dev: false - fastify-ip@1.0.0: + /fastify-ip@1.0.0: + resolution: {integrity: sha512-ht6hS48UDmdHd9jARn2BphJUgw5u/nm8ItO9EceM2uSVhlusrkF07CfNvpuJHxFX8Nx+Eik/VJz0QzxOn3KMJA==} + engines: {node: '>=18.x'} dependencies: fastify-plugin: 4.5.1 + dev: false - fastify-plugin@4.5.1: {} + /fastify-plugin@4.5.1: + resolution: {integrity: sha512-stRHYGeuqpEZTL1Ef0Ovr2ltazUT9g844X5z/zEBFLG8RYlpDiOCIG+ATvYEp+/zmc7sN29mcIMp8gvYplYPIQ==} + dev: false - fastify@4.26.2: + /fastify@4.26.2: + resolution: {integrity: sha512-90pjTuPGrfVKtdpLeLzND5nyC4woXZN5VadiNQCicj/iJU4viNHKhsAnb7jmv1vu2IzkLXyBiCzdWuzeXgQ5Ug==} dependencies: '@fastify/ajv-compiler': 3.5.0 '@fastify/error': 3.4.1 @@ -7627,114 +4215,190 @@ snapshots: toad-cache: 3.7.0 transitivePeerDependencies: - supports-color + dev: false - fastq@1.17.1: + /fastq@1.17.1: + resolution: {integrity: sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==} dependencies: reusify: 1.0.4 - fb-watchman@2.0.2: + /fb-watchman@2.0.2: + resolution: {integrity: sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==} dependencies: bser: 2.1.1 - figures@3.2.0: + /figures@3.2.0: + resolution: {integrity: sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==} + engines: {node: '>=8'} dependencies: escape-string-regexp: 1.0.5 + dev: true - file-entry-cache@6.0.1: + /file-entry-cache@6.0.1: + resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} + engines: {node: ^10.12.0 || >=12.0.0} dependencies: flat-cache: 3.2.0 + dev: true - file-uri-to-path@1.0.0: {} + /file-uri-to-path@1.0.0: + resolution: {integrity: sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==} + dev: false - filename-regex@2.0.1: {} + /filename-regex@2.0.1: + resolution: {integrity: sha512-BTCqyBaWBTsauvnHiE8i562+EdJj+oUpkqWp2R1iCoR8f6oo8STRu3of7WJJ0TqWtxN50a5YFpzYK4Jj9esYfQ==} + engines: {node: '>=0.10.0'} + dev: false - fill-range@2.2.4: + /fill-range@2.2.4: + resolution: {integrity: sha512-cnrcCbj01+j2gTG921VZPnHbjmdAf8oQV/iGeV2kZxGSyfYjjTyY79ErsK1WJWMpw6DaApEX72binqJE+/d+5Q==} + engines: {node: '>=0.10.0'} dependencies: is-number: 2.1.0 isobject: 2.1.0 randomatic: 3.1.1 repeat-element: 1.1.4 repeat-string: 1.6.1 + dev: false - fill-range@7.0.1: + /fill-range@7.0.1: + resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} + engines: {node: '>=8'} dependencies: to-regex-range: 5.0.1 - find-my-way@8.1.0: + /find-my-way@8.1.0: + resolution: {integrity: sha512-41QwjCGcVTODUmLLqTMeoHeiozbMXYMAE1CKFiDyi9zVZ2Vjh0yz3MF0WQZoIb+cmzP/XlbFjlF2NtJmvZHznA==} + engines: {node: '>=14'} dependencies: fast-deep-equal: 3.1.3 fast-querystring: 1.1.2 safe-regex2: 2.0.0 + dev: false - find-node-modules@2.1.3: + /find-node-modules@2.1.3: + resolution: {integrity: sha512-UC2I2+nx1ZuOBclWVNdcnbDR5dlrOdVb7xNjmT/lHE+LsgztWks3dG7boJ37yTS/venXw84B/mAW9uHVoC5QRg==} dependencies: findup-sync: 4.0.0 merge: 2.1.1 + dev: true - find-root@1.1.0: {} + /find-root@1.1.0: + resolution: {integrity: sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==} + dev: true - find-up@1.1.2: + /find-up@1.1.2: + resolution: {integrity: sha512-jvElSjyuo4EMQGoTwo1uJU5pQMwTW5lS1x05zzfJuTIyLR3zwO27LYrxNg+dlvKpGOuGy/MzBdXh80g0ve5+HA==} + engines: {node: '>=0.10.0'} dependencies: path-exists: 2.1.0 pinkie-promise: 2.0.1 + dev: false - find-up@2.1.0: + /find-up@2.1.0: + resolution: {integrity: sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ==} + engines: {node: '>=4'} dependencies: locate-path: 2.0.0 + dev: true - find-up@3.0.0: + /find-up@3.0.0: + resolution: {integrity: sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==} + engines: {node: '>=6'} dependencies: locate-path: 3.0.0 + dev: true - find-up@4.1.0: + /find-up@4.1.0: + resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} + engines: {node: '>=8'} dependencies: locate-path: 5.0.0 path-exists: 4.0.0 - find-up@5.0.0: + /find-up@5.0.0: + resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} + engines: {node: '>=10'} dependencies: locate-path: 6.0.0 path-exists: 4.0.0 + dev: true - find-up@7.0.0: + /find-up@7.0.0: + resolution: {integrity: sha512-YyZM99iHrqLKjmt4LJDj58KI+fYyufRLBSYcqycxf//KpBk9FoewoGX0450m9nB44qrZnovzC2oeP5hUibxc/g==} + engines: {node: '>=18'} dependencies: locate-path: 7.2.0 path-exists: 5.0.0 unicorn-magic: 0.1.0 + dev: true - findup-sync@4.0.0: + /findup-sync@4.0.0: + resolution: {integrity: sha512-6jvvn/12IC4quLBL1KNokxC7wWTvYncaVUYSoxWw7YykPLuRrnv4qdHcSOywOI5RpkOVGeQRtWM8/q+G6W6qfQ==} + engines: {node: '>= 8'} dependencies: detect-file: 1.0.0 is-glob: 4.0.3 micromatch: 4.0.5 resolve-dir: 1.0.1 + dev: true - first-chunk-stream@1.0.0: {} + /first-chunk-stream@1.0.0: + resolution: {integrity: sha512-ArRi5axuv66gEsyl3UuK80CzW7t56hem73YGNYxNWTGNKFJUadSb9Gu9SHijYEUi8ulQMf1bJomYNwSCPHhtTQ==} + engines: {node: '>=0.10.0'} + dev: false - flat-cache@3.2.0: + /flat-cache@3.2.0: + resolution: {integrity: sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==} + engines: {node: ^10.12.0 || >=12.0.0} dependencies: flatted: 3.2.9 keyv: 4.5.4 rimraf: 3.0.2 + dev: true - flatted@3.2.9: {} + /flatted@3.2.9: + resolution: {integrity: sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==} + dev: true - follow-redirects@1.15.5(debug@2.6.9): + /follow-redirects@1.15.5(debug@2.6.9): + resolution: {integrity: sha512-vSFWUON1B+yAw1VN4xMfxgn5fTUiaOzAJCKBwIIgT/+7CuGy9+r+5gITvP62j3RmaD5Ph65UaERdOSRGUzZtgw==} + engines: {node: '>=4.0'} + peerDependencies: + debug: '*' + peerDependenciesMeta: + debug: + optional: true dependencies: debug: 2.6.9 + dev: false - for-in@1.0.2: {} + /for-in@1.0.2: + resolution: {integrity: sha512-7EwmXrOjyL+ChxMhmG5lnW9MPt1aIeZEwKhQzoBUdTV0N3zuwWDZYVJatDvZ2OyzPUvdIAZDsCetk3coyMfcnQ==} + engines: {node: '>=0.10.0'} + dev: false - for-own@0.1.5: + /for-own@0.1.5: + resolution: {integrity: sha512-SKmowqGTJoPzLO1T0BBJpkfp3EMacCMOuH40hOUbrbzElVktk4DioXVM99QkLCyKoiuOmyjgcWMpVz2xjE7LZw==} + engines: {node: '>=0.10.0'} dependencies: for-in: 1.0.2 + dev: false - foreground-child@3.1.1: + /foreground-child@3.1.1: + resolution: {integrity: sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==} + engines: {node: '>=14'} dependencies: cross-spawn: 7.0.3 signal-exit: 4.1.0 + dev: false - fork-ts-checker-webpack-plugin@8.0.0(typescript@5.1.3)(webpack@5.87.0): + /fork-ts-checker-webpack-plugin@8.0.0(typescript@5.1.3)(webpack@5.87.0): + resolution: {integrity: sha512-mX3qW3idpueT2klaQXBzrIM/pHw+T0B/V9KHEvNrqijTq9NFnMZU6oreVxDYcf33P8a5cW+67PjodNHthGnNVg==} + engines: {node: '>=12.13.0', yarn: '>=1.0.0'} + peerDependencies: + typescript: '>3.6.0' + webpack: ^5.11.0 dependencies: '@babel/code-frame': 7.23.5 chalk: 4.1.2 @@ -7750,60 +4414,90 @@ snapshots: tapable: 2.2.1 typescript: 5.1.3 webpack: 5.87.0 + dev: true - form-data-lite@1.0.3: + /form-data-lite@1.0.3: + resolution: {integrity: sha512-P7xPqAiOPKzC9Q9aywAZJCQq4QOE5WokPb3HrcWRh7C57RKytueJzoORZAVgHBNvK/lL7E+FxjQjd4X/zbecEQ==} dependencies: asynckit: 0.4.0 combined-stream: 1.0.8 mime-lite: 1.0.3 + dev: true - form-data@4.0.0: + /form-data@4.0.0: + resolution: {integrity: sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==} + engines: {node: '>= 6'} dependencies: asynckit: 0.4.0 combined-stream: 1.0.8 mime-types: 2.1.35 - formidable@2.1.2: + /formidable@2.1.2: + resolution: {integrity: sha512-CM3GuJ57US06mlpQ47YcunuUZ9jpm8Vx+P2CGt2j7HpgkKZO/DJYQ0Bobim8G6PFQmK5lOqOOdUXboU+h73A4g==} dependencies: dezalgo: 1.0.4 hexoid: 1.0.0 once: 1.4.0 qs: 6.11.2 + dev: true - forwarded@0.2.0: {} + /forwarded@0.2.0: + resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==} + engines: {node: '>= 0.6'} + dev: false - from2@2.3.0: + /from2@2.3.0: + resolution: {integrity: sha512-OMcX/4IC/uqEPVgGeyfN22LJk6AZrMkRZHxcHBMBvHScDGgwTm2GT2Wkgtocyd3JfZffjj2kYUDXXII0Fk9W0g==} dependencies: inherits: 2.0.4 readable-stream: 2.3.8 + dev: false - fs-extra@10.1.0: + /fs-extra@10.1.0: + resolution: {integrity: sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==} + engines: {node: '>=12'} dependencies: graceful-fs: 4.2.11 jsonfile: 6.1.0 universalify: 2.0.1 + dev: true - fs-extra@9.1.0: + /fs-extra@9.1.0: + resolution: {integrity: sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==} + engines: {node: '>=10'} dependencies: at-least-node: 1.0.0 graceful-fs: 4.2.11 jsonfile: 6.1.0 universalify: 2.0.1 + dev: true - fs-minipass@2.1.0: + /fs-minipass@2.1.0: + resolution: {integrity: sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==} + engines: {node: '>= 8'} dependencies: minipass: 3.3.6 - fs-monkey@1.0.5: {} + /fs-monkey@1.0.5: + resolution: {integrity: sha512-8uMbBjrhzW76TYgEV27Y5E//W2f/lTFmx78P2w19FZSxarhI/798APGQyuGCwmkNxgwGRhrLfvWyLBvNtuOmew==} + dev: true - fs.realpath@1.0.0: {} + /fs.realpath@1.0.0: + resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} - fsevents@2.3.3: + /fsevents@2.3.3: + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + requiresBuild: true optional: true - function-bind@1.1.2: {} + /function-bind@1.1.2: + resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} - gauge@3.0.2: + /gauge@3.0.2: + resolution: {integrity: sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==} + engines: {node: '>=10'} dependencies: aproba: 2.0.0 color-support: 1.1.3 @@ -7814,8 +4508,11 @@ snapshots: string-width: 4.2.3 strip-ansi: 6.0.1 wide-align: 1.1.5 + dev: false - gauge@4.0.4: + /gauge@4.0.4: + resolution: {integrity: sha512-f9m+BEN5jkg6a0fZjleidjN51VE1X+mPFQ2DJ0uv1V39oCLCbsGe6yjbBnp7eK7z/+GAon99a3nHuqbuuthyPg==} + engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} dependencies: aproba: 2.0.0 color-support: 1.1.3 @@ -7825,87 +4522,141 @@ snapshots: string-width: 4.2.3 strip-ansi: 6.0.1 wide-align: 1.1.5 + dev: false - gensync@1.0.0-beta.2: {} + /gensync@1.0.0-beta.2: + resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} + engines: {node: '>=6.9.0'} - get-caller-file@2.0.5: {} + /get-caller-file@2.0.5: + resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} + engines: {node: 6.* || 8.* || >= 10.*} - get-intrinsic@1.2.4: + /get-intrinsic@1.2.4: + resolution: {integrity: sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==} + engines: {node: '>= 0.4'} dependencies: es-errors: 1.3.0 function-bind: 1.1.2 has-proto: 1.0.1 has-symbols: 1.0.3 hasown: 2.0.0 + dev: true - get-package-type@0.1.0: {} + /get-package-type@0.1.0: + resolution: {integrity: sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==} + engines: {node: '>=8.0.0'} - get-pkg-repo@4.2.1: + /get-pkg-repo@4.2.1: + resolution: {integrity: sha512-2+QbHjFRfGB74v/pYWjd5OhU3TDIC2Gv/YKUTk/tCvAz0pkn/Mz6P3uByuBimLOcPvN2jYdScl3xGFSrx0jEcA==} + engines: {node: '>=6.9.0'} + hasBin: true dependencies: '@hutson/parse-repository-url': 3.0.2 hosted-git-info: 4.1.0 through2: 2.0.5 yargs: 16.2.0 + dev: true - get-stream@5.2.0: + /get-stream@5.2.0: + resolution: {integrity: sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==} + engines: {node: '>=8'} dependencies: pump: 3.0.0 + dev: true - get-stream@6.0.1: {} + /get-stream@6.0.1: + resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} + engines: {node: '>=10'} - get-stream@8.0.1: {} + /get-stream@8.0.1: + resolution: {integrity: sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==} + engines: {node: '>=16'} + dev: true - git-raw-commits@2.0.11: + /git-raw-commits@2.0.11: + resolution: {integrity: sha512-VnctFhw+xfj8Va1xtfEqCUD2XDrbAPSJx+hSrE5K7fGdjZruW7XV+QOrN7LF/RJyvspRiD2I0asWsxFp0ya26A==} + engines: {node: '>=10'} + hasBin: true dependencies: dargs: 7.0.0 lodash: 4.17.21 meow: 8.1.2 split2: 3.2.2 through2: 4.0.2 + dev: true - git-raw-commits@4.0.0: + /git-raw-commits@4.0.0: + resolution: {integrity: sha512-ICsMM1Wk8xSGMowkOmPrzo2Fgmfo4bMHLNX6ytHjajRJUqvHOw/TFapQ+QG75c3X/tTDDhOSRPGC52dDbNM8FQ==} + engines: {node: '>=16'} + hasBin: true dependencies: dargs: 8.1.0 meow: 12.1.1 split2: 4.2.0 + dev: true - git-remote-origin-url@2.0.0: + /git-remote-origin-url@2.0.0: + resolution: {integrity: sha512-eU+GGrZgccNJcsDH5LkXR3PB9M958hxc7sbA8DFJjrv9j4L2P/eZfKhM+QD6wyzpiv+b1BpK0XrYCxkovtjSLw==} + engines: {node: '>=4'} dependencies: gitconfiglocal: 1.0.0 pify: 2.3.0 + dev: true - git-semver-tags@4.1.1: + /git-semver-tags@4.1.1: + resolution: {integrity: sha512-OWyMt5zBe7xFs8vglMmhM9lRQzCWL3WjHtxNNfJTMngGym7pC1kh8sP6jevfydJ6LP3ZvGxfb6ABYgPUM0mtsA==} + engines: {node: '>=10'} + hasBin: true dependencies: meow: 8.1.2 semver: 6.3.1 + dev: true - gitconfiglocal@1.0.0: + /gitconfiglocal@1.0.0: + resolution: {integrity: sha512-spLUXeTAVHxDtKsJc8FkFVgFtMdEN9qPGpL23VfSHx4fP4+Ds097IXLvymbnDH8FnmxX5Nr9bPw3A+AQ6mWEaQ==} dependencies: ini: 1.3.8 + dev: true - glob-base@0.3.0: + /glob-base@0.3.0: + resolution: {integrity: sha512-ab1S1g1EbO7YzauaJLkgLp7DZVAqj9M/dvKlTt8DkXA2tiOIcSMrlVI2J1RZyB5iJVccEscjGn+kpOG9788MHA==} + engines: {node: '>=0.10.0'} dependencies: glob-parent: 2.0.0 is-glob: 2.0.1 + dev: false - glob-parent@2.0.0: + /glob-parent@2.0.0: + resolution: {integrity: sha512-JDYOvfxio/t42HKdxkAYaCiBN7oYiuxykOxKxdaUW5Qn0zaYN3gRQWolrwdnf0shM9/EP0ebuuTmyoXNr1cC5w==} dependencies: is-glob: 2.0.1 + dev: false - glob-parent@3.1.0: + /glob-parent@3.1.0: + resolution: {integrity: sha512-E8Ak/2+dZY6fnzlR7+ueWvhsH1SjHr4jjss4YS/h4py44jY9MhK/VFdaZJAWDz6BbL21KeteKxFSFpq8OS5gVA==} dependencies: is-glob: 3.1.0 path-dirname: 1.0.2 + dev: false - glob-parent@5.1.2: + /glob-parent@5.1.2: + resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} + engines: {node: '>= 6'} dependencies: is-glob: 4.0.3 + dev: true - glob-parent@6.0.2: + /glob-parent@6.0.2: + resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} + engines: {node: '>=10.13.0'} dependencies: is-glob: 4.0.3 + dev: true - glob-stream@5.3.5: + /glob-stream@5.3.5: + resolution: {integrity: sha512-piN8XVAO2sNxwVLokL4PswgJvK/uQ6+awwXUVRTGF+rRfgCZpn4hOqxiRuTEbU/k3qgKl0DACYQ/0Sge54UMQg==} + engines: {node: '>= 0.10'} dependencies: extend: 3.0.2 glob: 5.0.15 @@ -7915,26 +4666,36 @@ snapshots: through2: 0.6.5 to-absolute-glob: 0.1.1 unique-stream: 2.3.1 + dev: false - glob-to-regexp@0.4.1: {} + /glob-to-regexp@0.4.1: + resolution: {integrity: sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==} + dev: true - glob@10.3.10: + /glob@10.3.10: + resolution: {integrity: sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==} + engines: {node: '>=16 || 14 >=14.17'} + hasBin: true dependencies: foreground-child: 3.1.1 jackspeak: 2.3.6 minimatch: 9.0.3 minipass: 7.0.4 path-scurry: 1.10.1 + dev: false - glob@5.0.15: + /glob@5.0.15: + resolution: {integrity: sha512-c9IPMazfRITpmAAKi22dK1VKxGDX9ehhqfABDriL/lzO92xcUKEJPQHrVA/2YHSNFB4iFlykVmWvwo48nr3OxA==} dependencies: inflight: 1.0.6 inherits: 2.0.4 minimatch: 3.1.2 once: 1.4.0 path-is-absolute: 1.0.1 + dev: false - glob@7.2.3: + /glob@7.2.3: + resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} dependencies: fs.realpath: 1.0.0 inflight: 1.0.6 @@ -7943,46 +4704,68 @@ snapshots: once: 1.4.0 path-is-absolute: 1.0.1 - glob@8.1.0: + /glob@8.1.0: + resolution: {integrity: sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==} + engines: {node: '>=12'} dependencies: fs.realpath: 1.0.0 inflight: 1.0.6 inherits: 2.0.4 minimatch: 5.1.6 once: 1.4.0 + dev: false - glob@9.3.5: + /glob@9.3.5: + resolution: {integrity: sha512-e1LleDykUz2Iu+MTYdkSsuWX8lvAjAcs0Xef0lNIu0S2wOAzuTxCJtcd9S3cijlwYF18EsU3rzb8jPVobxDh9Q==} + engines: {node: '>=16 || 14 >=14.17'} dependencies: fs.realpath: 1.0.0 minimatch: 8.0.4 minipass: 4.2.8 path-scurry: 1.10.1 + dev: true - global-directory@4.0.1: + /global-directory@4.0.1: + resolution: {integrity: sha512-wHTUcDUoZ1H5/0iVqEudYW4/kAlN5cZ3j/bXn0Dpbizl9iaUVeWSHqiOjsgk6OW2bkLclbBjzewBz6weQ1zA2Q==} + engines: {node: '>=18'} dependencies: ini: 4.1.1 + dev: true - global-modules@1.0.0: + /global-modules@1.0.0: + resolution: {integrity: sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==} + engines: {node: '>=0.10.0'} dependencies: global-prefix: 1.0.2 is-windows: 1.0.2 resolve-dir: 1.0.1 + dev: true - global-prefix@1.0.2: + /global-prefix@1.0.2: + resolution: {integrity: sha512-5lsx1NUDHtSjfg0eHlmYvZKv8/nVqX4ckFbM+FrGcQ+04KWcWFo9P5MxPZYSzUvyzmdTbI7Eix8Q4IbELDqzKg==} + engines: {node: '>=0.10.0'} dependencies: expand-tilde: 2.0.2 homedir-polyfill: 1.0.3 ini: 1.3.8 is-windows: 1.0.2 which: 1.3.1 + dev: true - globals@11.12.0: {} + /globals@11.12.0: + resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} + engines: {node: '>=4'} - globals@13.24.0: + /globals@13.24.0: + resolution: {integrity: sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==} + engines: {node: '>=8'} dependencies: type-fest: 0.20.2 + dev: true - globby@11.1.0: + /globby@11.1.0: + resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} + engines: {node: '>=10'} dependencies: array-union: 2.1.0 dir-glob: 3.0.1 @@ -7990,18 +4773,28 @@ snapshots: ignore: 5.3.1 merge2: 1.4.1 slash: 3.0.0 + dev: true - gopd@1.0.1: + /gopd@1.0.1: + resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==} dependencies: get-intrinsic: 1.2.4 + dev: true - graceful-fs@4.2.11: {} + /graceful-fs@4.2.11: + resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} - grapheme-splitter@1.0.4: {} + /grapheme-splitter@1.0.4: + resolution: {integrity: sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==} + dev: true - graphemer@1.4.0: {} + /graphemer@1.4.0: + resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} + dev: true - gulp-sourcemaps@1.12.1: + /gulp-sourcemaps@1.12.1: + resolution: {integrity: sha512-2NYnMpB67LJhc36sEv+hNY05UOy1lD9DPtLi+en4hbGH+085G9Zzh3cet2VEqrDlQrLk9Eho0MM9dZ3Z+dL0XA==} + engines: {node: '>=0.10.0'} dependencies: '@gulp-sourcemaps/map-sources': 1.0.0 acorn: 4.0.13 @@ -8016,8 +4809,12 @@ snapshots: vinyl: 1.2.0 transitivePeerDependencies: - supports-color + dev: false - handlebars@4.7.8: + /handlebars@4.7.8: + resolution: {integrity: sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==} + engines: {node: '>=0.4.7'} + hasBin: true dependencies: minimist: 1.2.8 neo-async: 2.6.2 @@ -8025,131 +4822,231 @@ snapshots: wordwrap: 1.0.0 optionalDependencies: uglify-js: 3.17.4 + dev: true - hard-rejection@2.1.0: {} + /hard-rejection@2.1.0: + resolution: {integrity: sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==} + engines: {node: '>=6'} + dev: true - has-ansi@2.0.0: + /has-ansi@2.0.0: + resolution: {integrity: sha512-C8vBJ8DwUCx19vhm7urhTuUsr4/IyP6l4VzNQDv+ryHQObW3TTTp9yB68WpYgRe2bbaGuZ/se74IqFeVnMnLZg==} + engines: {node: '>=0.10.0'} dependencies: ansi-regex: 2.1.1 + dev: false - has-flag@3.0.0: {} + /has-flag@3.0.0: + resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} + engines: {node: '>=4'} - has-flag@4.0.0: {} + /has-flag@4.0.0: + resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} + engines: {node: '>=8'} - has-own-prop@2.0.0: {} + /has-own-prop@2.0.0: + resolution: {integrity: sha512-Pq0h+hvsVm6dDEa8x82GnLSYHOzNDt7f0ddFa3FqcQlgzEiptPqL+XrOJNavjOzSYiYWIrgeVYYgGlLmnxwilQ==} + engines: {node: '>=8'} + dev: true - has-property-descriptors@1.0.1: + /has-property-descriptors@1.0.1: + resolution: {integrity: sha512-VsX8eaIewvas0xnvinAe9bw4WfIeODpGYikiWYLH+dma0Jw6KHYqWiWfhQlgOVK8D6PvjubK5Uc4P0iIhIcNVg==} dependencies: get-intrinsic: 1.2.4 + dev: true - has-proto@1.0.1: {} + /has-proto@1.0.1: + resolution: {integrity: sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==} + engines: {node: '>= 0.4'} + dev: true - has-symbols@1.0.3: {} + /has-symbols@1.0.3: + resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==} + engines: {node: '>= 0.4'} + dev: true - has-unicode@2.0.1: {} + /has-unicode@2.0.1: + resolution: {integrity: sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==} + dev: false - hasown@2.0.0: + /hasown@2.0.0: + resolution: {integrity: sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==} + engines: {node: '>= 0.4'} dependencies: function-bind: 1.1.2 - helmet@7.1.0: {} + /helmet@7.1.0: + resolution: {integrity: sha512-g+HZqgfbpXdCkme/Cd/mZkV0aV3BZZZSugecH03kl38m/Kmdx8jKjBikpDj2cr+Iynv4KpYEviojNdTJActJAg==} + engines: {node: '>=16.0.0'} + dev: false - help-me@5.0.0: {} + /help-me@5.0.0: + resolution: {integrity: sha512-7xgomUX6ADmcYzFik0HzAxh/73YlKR9bmFzf51CZwR+b6YtzU2m0u49hQCqV6SvlqIqsaxovfwdvbnsw3b/zpg==} + dev: false - hexoid@1.0.0: {} + /hexoid@1.0.0: + resolution: {integrity: sha512-QFLV0taWQOZtvIRIAdBChesmogZrtuXvVWsFHZTk2SU+anspqZ2vMnoLg7IE1+Uk16N19APic1BuF8bC8c2m5g==} + engines: {node: '>=8'} + dev: true - homedir-polyfill@1.0.3: + /homedir-polyfill@1.0.3: + resolution: {integrity: sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==} + engines: {node: '>=0.10.0'} dependencies: parse-passwd: 1.0.0 + dev: true - hosted-git-info@2.8.9: {} + /hosted-git-info@2.8.9: + resolution: {integrity: sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==} - hosted-git-info@4.1.0: + /hosted-git-info@4.1.0: + resolution: {integrity: sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==} + engines: {node: '>=10'} dependencies: lru-cache: 6.0.0 + dev: true - html-escaper@2.0.2: {} + /html-escaper@2.0.2: + resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==} - http-cache-semantics@4.1.1: {} + /http-cache-semantics@4.1.1: + resolution: {integrity: sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==} + dev: false - http-errors@2.0.0: + /http-errors@2.0.0: + resolution: {integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==} + engines: {node: '>= 0.8'} dependencies: depd: 2.0.0 inherits: 2.0.4 setprototypeof: 1.2.0 statuses: 2.0.1 toidentifier: 1.0.1 + dev: false - http-proxy-agent@5.0.0: + /http-proxy-agent@5.0.0: + resolution: {integrity: sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==} + engines: {node: '>= 6'} dependencies: '@tootallnate/once': 2.0.0 agent-base: 6.0.2 debug: 4.3.4 transitivePeerDependencies: - supports-color + dev: false - https-proxy-agent@5.0.1: + /https-proxy-agent@5.0.1: + resolution: {integrity: sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==} + engines: {node: '>= 6'} dependencies: agent-base: 6.0.2 debug: 4.3.4 transitivePeerDependencies: - supports-color + dev: false - human-signals@1.1.1: {} + /human-signals@1.1.1: + resolution: {integrity: sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==} + engines: {node: '>=8.12.0'} + dev: true - human-signals@2.1.0: {} + /human-signals@2.1.0: + resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} + engines: {node: '>=10.17.0'} - human-signals@5.0.0: {} + /human-signals@5.0.0: + resolution: {integrity: sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==} + engines: {node: '>=16.17.0'} + dev: true - humanize-ms@1.2.1: + /humanize-ms@1.2.1: + resolution: {integrity: sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==} dependencies: ms: 2.1.3 + dev: false - husky@9.0.11: {} + /husky@9.0.11: + resolution: {integrity: sha512-AB6lFlbwwyIqMdHYhwPe+kjOC3Oc5P3nThEoW/AaO2BX3vJDjWPFxYLxokUZOo6RNX20He3AaT8sESs9NJcmEw==} + engines: {node: '>=18'} + hasBin: true + dev: true - iconv-lite@0.4.24: + /iconv-lite@0.4.24: + resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} + engines: {node: '>=0.10.0'} dependencies: safer-buffer: 2.1.2 + dev: true - iconv-lite@0.6.3: + /iconv-lite@0.6.3: + resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} + engines: {node: '>=0.10.0'} dependencies: safer-buffer: 2.1.2 + dev: false optional: true - ieee754@1.2.1: {} + /ieee754@1.2.1: + resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} - ignore@5.3.1: {} + /ignore@5.3.1: + resolution: {integrity: sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==} + engines: {node: '>= 4'} + dev: true - import-fresh@3.3.0: + /import-fresh@3.3.0: + resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} + engines: {node: '>=6'} dependencies: parent-module: 1.0.1 resolve-from: 4.0.0 + dev: true - import-local@3.1.0: + /import-local@3.1.0: + resolution: {integrity: sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==} + engines: {node: '>=8'} + hasBin: true dependencies: pkg-dir: 4.2.0 resolve-cwd: 3.0.0 - import-meta-resolve@4.0.0: {} + /import-meta-resolve@4.0.0: + resolution: {integrity: sha512-okYUR7ZQPH+efeuMJGlq4f8ubUgO50kByRPyt/Cy1Io4PSRsPjxME+YlVaCOx+NIToW7hCsZNFJyTPFFKepRSA==} + dev: true - imurmurhash@0.1.4: {} + /imurmurhash@0.1.4: + resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} + engines: {node: '>=0.8.19'} - indent-string@4.0.0: {} + /indent-string@4.0.0: + resolution: {integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==} + engines: {node: '>=8'} - infer-owner@1.0.4: {} + /infer-owner@1.0.4: + resolution: {integrity: sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==} + dev: false - inflight@1.0.6: + /inflight@1.0.6: + resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} dependencies: once: 1.4.0 wrappy: 1.0.2 - inherits@2.0.4: {} + /inherits@2.0.4: + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} - ini@1.3.8: {} + /ini@1.3.8: + resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} + dev: true - ini@4.1.1: {} + /ini@4.1.1: + resolution: {integrity: sha512-QQnnxNyfvmHFIsj7gkPcYymR8Jdw/o7mp5ZFihxn6h8Ci6fh3Dx4E1gPjpQEpIuPo9XVNY/ZUwh4BPMjGyL01g==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + dev: true - inquirer@8.2.4: + /inquirer@8.2.4: + resolution: {integrity: sha512-nn4F01dxU8VeKfq192IjLsxu0/OmMZ4Lg3xKAns148rCaXP6ntAoEkVYZThWjwON8AlzdZZi6oqnhNbxUG9hVg==} + engines: {node: '>=12.0.0'} dependencies: ansi-escapes: 4.3.2 chalk: 4.1.2 @@ -8166,8 +5063,11 @@ snapshots: strip-ansi: 6.0.1 through: 2.3.8 wrap-ansi: 7.0.0 + dev: true - inquirer@8.2.5: + /inquirer@8.2.5: + resolution: {integrity: sha512-QAgPDQMEgrDssk1XiwwHoOGYF9BAbUcc1+j+FhEvaOt8/cKRqyLn0U5qA6F74fGhTMGxf92pOvPBeh29jQJDTQ==} + engines: {node: '>=12.0.0'} dependencies: ansi-escapes: 4.3.2 chalk: 4.1.2 @@ -8184,124 +5084,238 @@ snapshots: strip-ansi: 6.0.1 through: 2.3.8 wrap-ansi: 7.0.0 + dev: true - interpret@1.4.0: {} + /interpret@1.4.0: + resolution: {integrity: sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==} + engines: {node: '>= 0.10'} + dev: true - into-stream@6.0.0: + /into-stream@6.0.0: + resolution: {integrity: sha512-XHbaOAvP+uFKUFsOgoNPRjLkwB+I22JFPFe5OjTkQ0nwgj6+pSjb4NmB6VMxaPshLiOf+zcpOCBQuLwC1KHhZA==} + engines: {node: '>=10'} dependencies: from2: 2.3.0 p-is-promise: 3.0.0 + dev: false - invert-kv@1.0.0: {} + /invert-kv@1.0.0: + resolution: {integrity: sha512-xgs2NH9AE66ucSq4cNG1nhSFghr5l6tdL15Pk+jl46bmmBapgoaY/AacXyaDznAqmGL99TiLSQgO/XazFSKYeQ==} + engines: {node: '>=0.10.0'} + dev: false - ip-address@9.0.5: + /ip-address@9.0.5: + resolution: {integrity: sha512-zHtQzGojZXTwZTHQqra+ETKd4Sn3vgi7uBmlPoXVWZqYvuKmtI0l/VZTjqGmJY9x88GGOaZ9+G9ES8hC4T4X8g==} + engines: {node: '>= 12'} dependencies: jsbn: 1.1.0 sprintf-js: 1.1.3 + dev: false - ipaddr.js@1.9.1: {} + /ipaddr.js@1.9.1: + resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==} + engines: {node: '>= 0.10'} + dev: false - is-arrayish@0.2.1: {} + /is-arrayish@0.2.1: + resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} - is-binary-path@2.1.0: + /is-binary-path@2.1.0: + resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} + engines: {node: '>=8'} dependencies: binary-extensions: 2.2.0 + dev: true - is-buffer@1.1.6: {} + /is-buffer@1.1.6: + resolution: {integrity: sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==} + dev: false - is-core-module@2.13.1: + /is-core-module@2.13.1: + resolution: {integrity: sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==} dependencies: hasown: 2.0.0 - is-dotfile@1.0.3: {} + /is-dotfile@1.0.3: + resolution: {integrity: sha512-9YclgOGtN/f8zx0Pr4FQYMdibBiTaH3sn52vjYip4ZSf6C4/6RfTEZ+MR4GvKhCxdPh21Bg42/WL55f6KSnKpg==} + engines: {node: '>=0.10.0'} + dev: false - is-equal-shallow@0.1.3: + /is-equal-shallow@0.1.3: + resolution: {integrity: sha512-0EygVC5qPvIyb+gSz7zdD5/AAoS6Qrx1e//6N4yv4oNm30kqvdmG66oZFWVlQHUWe5OjP08FuTw2IdT0EOTcYA==} + engines: {node: '>=0.10.0'} dependencies: is-primitive: 2.0.0 + dev: false - is-extendable@0.1.1: {} + /is-extendable@0.1.1: + resolution: {integrity: sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==} + engines: {node: '>=0.10.0'} + dev: false - is-extglob@1.0.0: {} + /is-extglob@1.0.0: + resolution: {integrity: sha512-7Q+VbVafe6x2T+Tu6NcOf6sRklazEPmBoB3IWk3WdGZM2iGUwU/Oe3Wtq5lSEkDTTlpp8yx+5t4pzO/i9Ty1ww==} + engines: {node: '>=0.10.0'} + dev: false - is-extglob@2.1.1: {} + /is-extglob@2.1.1: + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} - is-fullwidth-code-point@1.0.0: + /is-fullwidth-code-point@1.0.0: + resolution: {integrity: sha512-1pqUqRjkhPJ9miNq9SwMfdvi6lBJcd6eFxvfaivQhaH3SgisfiuudvFntdKOmxuee/77l+FPjKrQjWvmPjWrRw==} + engines: {node: '>=0.10.0'} dependencies: number-is-nan: 1.0.1 + dev: false - is-fullwidth-code-point@3.0.0: {} + /is-fullwidth-code-point@3.0.0: + resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} + engines: {node: '>=8'} - is-generator-fn@2.1.0: {} + /is-generator-fn@2.1.0: + resolution: {integrity: sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==} + engines: {node: '>=6'} - is-glob@2.0.1: + /is-glob@2.0.1: + resolution: {integrity: sha512-a1dBeB19NXsf/E0+FHqkagizel/LQw2DjSQpvQrj3zT+jYPpaUCryPnrQajXKFLCMuf4I6FhRpaGtw4lPrG6Eg==} + engines: {node: '>=0.10.0'} dependencies: is-extglob: 1.0.0 + dev: false - is-glob@3.1.0: + /is-glob@3.1.0: + resolution: {integrity: sha512-UFpDDrPgM6qpnFNI+rh/p3bUaq9hKLZN8bMUWzxmcnZVS3omf4IPK+BrewlnWjO1WmUsMYuSjKh4UJuV4+Lqmw==} + engines: {node: '>=0.10.0'} dependencies: is-extglob: 2.1.1 + dev: false - is-glob@4.0.3: + /is-glob@4.0.3: + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} dependencies: is-extglob: 2.1.1 + dev: true - is-interactive@1.0.0: {} + /is-interactive@1.0.0: + resolution: {integrity: sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==} + engines: {node: '>=8'} - is-lambda@1.0.1: {} + /is-lambda@1.0.1: + resolution: {integrity: sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ==} + dev: false - is-number@2.1.0: + /is-number@2.1.0: + resolution: {integrity: sha512-QUzH43Gfb9+5yckcrSA0VBDwEtDUchrk4F6tfJZQuNzDJbEDB9cZNzSfXGQ1jqmdDY/kl41lUOWM9syA8z8jlg==} + engines: {node: '>=0.10.0'} dependencies: kind-of: 3.2.2 + dev: false - is-number@4.0.0: {} + /is-number@4.0.0: + resolution: {integrity: sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==} + engines: {node: '>=0.10.0'} + dev: false - is-number@7.0.0: {} + /is-number@7.0.0: + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + engines: {node: '>=0.12.0'} - is-obj@2.0.0: {} + /is-obj@2.0.0: + resolution: {integrity: sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==} + engines: {node: '>=8'} + dev: true - is-path-inside@3.0.3: {} + /is-path-inside@3.0.3: + resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} + engines: {node: '>=8'} + dev: true - is-plain-obj@1.1.0: {} + /is-plain-obj@1.1.0: + resolution: {integrity: sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==} + engines: {node: '>=0.10.0'} + dev: true - is-posix-bracket@0.1.1: {} + /is-posix-bracket@0.1.1: + resolution: {integrity: sha512-Yu68oeXJ7LeWNmZ3Zov/xg/oDBnBK2RNxwYY1ilNJX+tKKZqgPK+qOn/Gs9jEu66KDY9Netf5XLKNGzas/vPfQ==} + engines: {node: '>=0.10.0'} + dev: false - is-primitive@2.0.0: {} + /is-primitive@2.0.0: + resolution: {integrity: sha512-N3w1tFaRfk3UrPfqeRyD+GYDASU3W5VinKhlORy8EWVf/sIdDL9GAcew85XmktCfH+ngG7SRXEVDoO18WMdB/Q==} + engines: {node: '>=0.10.0'} + dev: false - is-stream@1.1.0: {} + /is-stream@1.1.0: + resolution: {integrity: sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==} + engines: {node: '>=0.10.0'} + dev: false - is-stream@2.0.1: {} + /is-stream@2.0.1: + resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} + engines: {node: '>=8'} - is-stream@3.0.0: {} + /is-stream@3.0.0: + resolution: {integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dev: true - is-text-path@1.0.1: + /is-text-path@1.0.1: + resolution: {integrity: sha512-xFuJpne9oFz5qDaodwmmG08e3CawH/2ZV8Qqza1Ko7Sk8POWbkRdwIoAWVhqvq0XeUzANEhKo2n0IXUGBm7A/w==} + engines: {node: '>=0.10.0'} dependencies: text-extensions: 1.9.0 + dev: true - is-text-path@2.0.0: + /is-text-path@2.0.0: + resolution: {integrity: sha512-+oDTluR6WEjdXEJMnC2z6A4FRwFoYuvShVVEGsS7ewc0UTi2QtAKMDJuL4BDEVt+5T7MjFo12RP8ghOM75oKJw==} + engines: {node: '>=8'} dependencies: text-extensions: 2.4.0 + dev: true - is-unicode-supported@0.1.0: {} + /is-unicode-supported@0.1.0: + resolution: {integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==} + engines: {node: '>=10'} - is-utf8@0.2.1: {} + /is-utf8@0.2.1: + resolution: {integrity: sha512-rMYPYvCzsXywIsldgLaSoPlw5PfoB/ssr7hY4pLfcodrA5M/eArza1a9VmTiNIBNMjOGr1Ow9mTyU2o69U6U9Q==} - is-valid-glob@0.3.0: {} + /is-valid-glob@0.3.0: + resolution: {integrity: sha512-CvG8EtJZ8FyzVOGPzrDorzyN65W1Ld8BVnqshRCah6pFIsprGx3dKgFtjLn/Vw9kGqR4OlR84U7yhT9ZVTyWIQ==} + engines: {node: '>=0.10.0'} + dev: false - is-windows@1.0.2: {} + /is-windows@1.0.2: + resolution: {integrity: sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==} + engines: {node: '>=0.10.0'} + dev: true - isarray@0.0.1: {} + /isarray@0.0.1: + resolution: {integrity: sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==} + dev: false - isarray@1.0.0: {} + /isarray@1.0.0: + resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} - isexe@2.0.0: {} + /isexe@2.0.0: + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} - isobject@2.1.0: + /isobject@2.1.0: + resolution: {integrity: sha512-+OUdGJlgjOBZDfxnDjYYG6zp487z0JGNQq3cYQYg5f5hKR+syHMsaztzGeml/4kGG55CSpKSpWTY+jYGgsHLgA==} + engines: {node: '>=0.10.0'} dependencies: isarray: 1.0.0 + dev: false - istanbul-lib-coverage@3.2.2: {} + /istanbul-lib-coverage@3.2.2: + resolution: {integrity: sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==} + engines: {node: '>=8'} - istanbul-lib-instrument@5.2.1: + /istanbul-lib-instrument@5.2.1: + resolution: {integrity: sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==} + engines: {node: '>=8'} dependencies: '@babel/core': 7.23.9 '@babel/parser': 7.23.9 @@ -8311,7 +5325,9 @@ snapshots: transitivePeerDependencies: - supports-color - istanbul-lib-instrument@6.0.1: + /istanbul-lib-instrument@6.0.1: + resolution: {integrity: sha512-EAMEJBsYuyyztxMxW3g7ugGPkrZsV57v0Hmv3mm1uQsmB+QnZuepg731CRaIgeUVSdmsTngOkSnauNF8p7FIhA==} + engines: {node: '>=10'} dependencies: '@babel/core': 7.23.9 '@babel/parser': 7.23.9 @@ -8321,13 +5337,17 @@ snapshots: transitivePeerDependencies: - supports-color - istanbul-lib-report@3.0.1: + /istanbul-lib-report@3.0.1: + resolution: {integrity: sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==} + engines: {node: '>=10'} dependencies: istanbul-lib-coverage: 3.2.2 make-dir: 4.0.0 supports-color: 7.2.0 - istanbul-lib-source-maps@4.0.1: + /istanbul-lib-source-maps@4.0.1: + resolution: {integrity: sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==} + engines: {node: '>=10'} dependencies: debug: 4.3.4 istanbul-lib-coverage: 3.2.2 @@ -8335,26 +5355,37 @@ snapshots: transitivePeerDependencies: - supports-color - istanbul-reports@3.1.6: + /istanbul-reports@3.1.6: + resolution: {integrity: sha512-TLgnMkKg3iTDsQ9PbPTdpfAK2DzjF9mqUG7RMgcQl8oFjad8ob4laGxv5XV5U9MAfx8D6tSJiUyuAwzLicaxlg==} + engines: {node: '>=8'} dependencies: html-escaper: 2.0.2 istanbul-lib-report: 3.0.1 - iterare@1.2.1: {} + /iterare@1.2.1: + resolution: {integrity: sha512-RKYVTCjAnRthyJes037NX/IiqeidgN1xc3j1RjFfECFp28A1GVwK9nA+i0rJPaHqSZwygLzRnFlzUuHFoWWy+Q==} + engines: {node: '>=6'} - jackspeak@2.3.6: + /jackspeak@2.3.6: + resolution: {integrity: sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==} + engines: {node: '>=14'} dependencies: '@isaacs/cliui': 8.0.2 optionalDependencies: '@pkgjs/parseargs': 0.11.0 + dev: false - jest-changed-files@29.7.0: + /jest-changed-files@29.7.0: + resolution: {integrity: sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: execa: 5.1.1 jest-util: 29.7.0 p-limit: 3.1.0 - jest-circus@29.7.0: + /jest-circus@29.7.0: + resolution: {integrity: sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: '@jest/environment': 29.7.0 '@jest/expect': 29.7.0 @@ -8380,7 +5411,15 @@ snapshots: - babel-plugin-macros - supports-color - jest-cli@29.7.0(@types/node@20.3.1)(ts-node@10.9.1): + /jest-cli@29.7.0(@types/node@20.3.1)(ts-node@10.9.1): + resolution: {integrity: sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + hasBin: true + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true dependencies: '@jest/core': 29.7.0(ts-node@10.9.1) '@jest/test-result': 29.7.0 @@ -8399,7 +5438,17 @@ snapshots: - supports-color - ts-node - jest-config@29.7.0(@types/node@20.3.1)(ts-node@10.9.1): + /jest-config@29.7.0(@types/node@20.3.1)(ts-node@10.9.1): + resolution: {integrity: sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + peerDependencies: + '@types/node': '*' + ts-node: '>=9.0.0' + peerDependenciesMeta: + '@types/node': + optional: true + ts-node: + optional: true dependencies: '@babel/core': 7.23.9 '@jest/test-sequencer': 29.7.0 @@ -8429,18 +5478,24 @@ snapshots: - babel-plugin-macros - supports-color - jest-diff@29.7.0: + /jest-diff@29.7.0: + resolution: {integrity: sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: chalk: 4.1.2 diff-sequences: 29.6.3 jest-get-type: 29.6.3 pretty-format: 29.7.0 - jest-docblock@29.7.0: + /jest-docblock@29.7.0: + resolution: {integrity: sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: detect-newline: 3.1.0 - jest-each@29.7.0: + /jest-each@29.7.0: + resolution: {integrity: sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: '@jest/types': 29.6.3 chalk: 4.1.2 @@ -8448,7 +5503,9 @@ snapshots: jest-util: 29.7.0 pretty-format: 29.7.0 - jest-environment-node@29.7.0: + /jest-environment-node@29.7.0: + resolution: {integrity: sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: '@jest/environment': 29.7.0 '@jest/fake-timers': 29.7.0 @@ -8457,9 +5514,13 @@ snapshots: jest-mock: 29.7.0 jest-util: 29.7.0 - jest-get-type@29.6.3: {} + /jest-get-type@29.6.3: + resolution: {integrity: sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - jest-haste-map@29.7.0: + /jest-haste-map@29.7.0: + resolution: {integrity: sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: '@jest/types': 29.6.3 '@types/graceful-fs': 4.1.9 @@ -8475,19 +5536,25 @@ snapshots: optionalDependencies: fsevents: 2.3.3 - jest-leak-detector@29.7.0: + /jest-leak-detector@29.7.0: + resolution: {integrity: sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: jest-get-type: 29.6.3 pretty-format: 29.7.0 - jest-matcher-utils@29.7.0: + /jest-matcher-utils@29.7.0: + resolution: {integrity: sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: chalk: 4.1.2 jest-diff: 29.7.0 jest-get-type: 29.6.3 pretty-format: 29.7.0 - jest-message-util@29.7.0: + /jest-message-util@29.7.0: + resolution: {integrity: sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: '@babel/code-frame': 7.23.5 '@jest/types': 29.6.3 @@ -8499,26 +5566,41 @@ snapshots: slash: 3.0.0 stack-utils: 2.0.6 - jest-mock@29.7.0: + /jest-mock@29.7.0: + resolution: {integrity: sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: '@jest/types': 29.6.3 '@types/node': 20.3.1 jest-util: 29.7.0 - jest-pnp-resolver@1.2.3(jest-resolve@29.7.0): + /jest-pnp-resolver@1.2.3(jest-resolve@29.7.0): + resolution: {integrity: sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==} + engines: {node: '>=6'} + peerDependencies: + jest-resolve: '*' + peerDependenciesMeta: + jest-resolve: + optional: true dependencies: jest-resolve: 29.7.0 - jest-regex-util@29.6.3: {} + /jest-regex-util@29.6.3: + resolution: {integrity: sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - jest-resolve-dependencies@29.7.0: + /jest-resolve-dependencies@29.7.0: + resolution: {integrity: sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: jest-regex-util: 29.6.3 jest-snapshot: 29.7.0 transitivePeerDependencies: - supports-color - jest-resolve@29.7.0: + /jest-resolve@29.7.0: + resolution: {integrity: sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: chalk: 4.1.2 graceful-fs: 4.2.11 @@ -8530,7 +5612,9 @@ snapshots: resolve.exports: 2.0.2 slash: 3.0.0 - jest-runner@29.7.0: + /jest-runner@29.7.0: + resolution: {integrity: sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: '@jest/console': 29.7.0 '@jest/environment': 29.7.0 @@ -8556,7 +5640,9 @@ snapshots: transitivePeerDependencies: - supports-color - jest-runtime@29.7.0: + /jest-runtime@29.7.0: + resolution: {integrity: sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: '@jest/environment': 29.7.0 '@jest/fake-timers': 29.7.0 @@ -8583,7 +5669,9 @@ snapshots: transitivePeerDependencies: - supports-color - jest-snapshot@29.7.0: + /jest-snapshot@29.7.0: + resolution: {integrity: sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: '@babel/core': 7.23.9 '@babel/generator': 7.23.6 @@ -8608,7 +5696,9 @@ snapshots: transitivePeerDependencies: - supports-color - jest-util@29.7.0: + /jest-util@29.7.0: + resolution: {integrity: sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: '@jest/types': 29.6.3 '@types/node': 20.3.1 @@ -8617,7 +5707,9 @@ snapshots: graceful-fs: 4.2.11 picomatch: 2.3.1 - jest-validate@29.7.0: + /jest-validate@29.7.0: + resolution: {integrity: sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: '@jest/types': 29.6.3 camelcase: 6.3.0 @@ -8626,7 +5718,9 @@ snapshots: leven: 3.1.0 pretty-format: 29.7.0 - jest-watcher@29.7.0: + /jest-watcher@29.7.0: + resolution: {integrity: sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: '@jest/test-result': 29.7.0 '@jest/types': 29.6.3 @@ -8637,20 +5731,33 @@ snapshots: jest-util: 29.7.0 string-length: 4.0.2 - jest-worker@27.5.1: + /jest-worker@27.5.1: + resolution: {integrity: sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==} + engines: {node: '>= 10.13.0'} dependencies: '@types/node': 20.3.1 merge-stream: 2.0.0 supports-color: 8.1.1 + dev: true - jest-worker@29.7.0: + /jest-worker@29.7.0: + resolution: {integrity: sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: '@types/node': 20.3.1 jest-util: 29.7.0 merge-stream: 2.0.0 supports-color: 8.1.1 - jest@29.5.0(@types/node@20.3.1)(ts-node@10.9.1): + /jest@29.5.0(@types/node@20.3.1)(ts-node@10.9.1): + resolution: {integrity: sha512-juMg3he2uru1QoXX078zTa7pO85QyB9xajZc6bU+d9yEGwrKX6+vGmJQ3UdVZsvTEUARIdObzH68QItim6OSSQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + hasBin: true + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true dependencies: '@jest/core': 29.7.0(ts-node@10.9.1) '@jest/types': 29.6.3 @@ -8662,62 +5769,110 @@ snapshots: - supports-color - ts-node - jiti@1.21.0: {} + /jiti@1.21.0: + resolution: {integrity: sha512-gFqAIbuKyyso/3G2qhiO2OM6shY6EPP/R0+mkDbyspxKazh8BXDC5FiFsUjlczgdNz/vfra0da2y+aHrusLG/Q==} + hasBin: true + dev: true - joycon@3.1.1: {} + /joycon@3.1.1: + resolution: {integrity: sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw==} + engines: {node: '>=10'} + dev: false - js-tokens@4.0.0: {} + /js-tokens@4.0.0: + resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} - js-yaml@3.14.1: + /js-yaml@3.14.1: + resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==} + hasBin: true dependencies: argparse: 1.0.10 esprima: 4.0.1 - js-yaml@4.1.0: + /js-yaml@4.1.0: + resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} + hasBin: true dependencies: argparse: 2.0.1 - jsbn@1.1.0: {} + /jsbn@1.1.0: + resolution: {integrity: sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A==} + dev: false - jsesc@2.5.2: {} + /jsesc@2.5.2: + resolution: {integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==} + engines: {node: '>=4'} + hasBin: true - json-buffer@3.0.1: {} + /json-buffer@3.0.1: + resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} + dev: true - json-parse-better-errors@1.0.2: {} + /json-parse-better-errors@1.0.2: + resolution: {integrity: sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==} + dev: true - json-parse-even-better-errors@2.3.1: {} + /json-parse-even-better-errors@2.3.1: + resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} - json-query@2.2.2: {} + /json-query@2.2.2: + resolution: {integrity: sha512-y+IcVZSdqNmS4fO8t1uZF6RMMs0xh3SrTjJr9bp1X3+v0Q13+7Cyv12dSmKwDswp/H427BVtpkLWhGxYu3ZWRA==} + dev: true - json-schema-ref-resolver@1.0.1: + /json-schema-ref-resolver@1.0.1: + resolution: {integrity: sha512-EJAj1pgHc1hxF6vo2Z3s69fMjO1INq6eGHXZ8Z6wCQeldCuwxGK9Sxf4/cScGn3FZubCVUehfWtcDM/PLteCQw==} dependencies: fast-deep-equal: 3.1.3 + dev: false - json-schema-traverse@0.4.1: {} + /json-schema-traverse@0.4.1: + resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} + dev: true - json-schema-traverse@1.0.0: {} + /json-schema-traverse@1.0.0: + resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} - json-stable-stringify-without-jsonify@1.0.1: {} + /json-stable-stringify-without-jsonify@1.0.1: + resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} - json-stringify-safe@5.0.1: {} + /json-stringify-safe@5.0.1: + resolution: {integrity: sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==} + dev: true - json5@2.2.3: {} + /json5@2.2.3: + resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} + engines: {node: '>=6'} + hasBin: true - jsonc-parser@3.0.0: {} + /jsonc-parser@3.0.0: + resolution: {integrity: sha512-fQzRfAbIBnR0IQvftw9FJveWiHp72Fg20giDrHz6TdfB12UH/uue0D3hm57UB5KgAVuniLMCaS8P1IMj9NR7cA==} + dev: false - jsonc-parser@3.2.0: {} + /jsonc-parser@3.2.0: + resolution: {integrity: sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==} + dev: true - jsonfile@6.1.0: + /jsonfile@6.1.0: + resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==} dependencies: universalify: 2.0.1 optionalDependencies: graceful-fs: 4.2.11 + dev: true - jsonparse@1.3.1: {} + /jsonparse@1.3.1: + resolution: {integrity: sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==} + engines: {'0': node >= 0.2.0} + dev: true - jsonrepair@3.7.0: {} + /jsonrepair@3.7.0: + resolution: {integrity: sha512-TwE50n4P4gdVfMQF2q+X+IGy4ntFfcuHHE8zjRyBcdtrRK0ORZsjOZD6zmdylk4p277nQBAlHgsEPWtMIQk4LQ==} + hasBin: true + dev: false - jsonwebtoken@9.0.2: + /jsonwebtoken@9.0.2: + resolution: {integrity: sha512-PRp66vJ865SSqOlgqS8hujT5U4AOgMfhrwYIuIhfKaoSCZcirrmASQr8CX7cUg+RMih+hgznrjp99o+W4pJLHQ==} + engines: {node: '>=12', npm: '>=6'} dependencies: jws: 3.2.2 lodash.includes: 4.3.0 @@ -8729,151 +5884,261 @@ snapshots: lodash.once: 4.1.1 ms: 2.1.3 semver: 7.6.0 + dev: false - jwa@1.4.1: + /jwa@1.4.1: + resolution: {integrity: sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==} dependencies: buffer-equal-constant-time: 1.0.1 ecdsa-sig-formatter: 1.0.11 safe-buffer: 5.2.1 + dev: false - jws@3.2.2: + /jws@3.2.2: + resolution: {integrity: sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==} dependencies: jwa: 1.4.1 safe-buffer: 5.2.1 + dev: false - keyv@4.5.4: + /keyv@4.5.4: + resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} dependencies: json-buffer: 3.0.1 + dev: true - kind-of@3.2.2: + /kind-of@3.2.2: + resolution: {integrity: sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==} + engines: {node: '>=0.10.0'} dependencies: is-buffer: 1.1.6 + dev: false - kind-of@6.0.3: {} + /kind-of@6.0.3: + resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==} + engines: {node: '>=0.10.0'} - kleur@3.0.3: {} + /kleur@3.0.3: + resolution: {integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==} + engines: {node: '>=6'} - kleur@4.1.5: {} + /kleur@4.1.5: + resolution: {integrity: sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==} + engines: {node: '>=6'} + dev: true - klona@2.0.6: {} + /klona@2.0.6: + resolution: {integrity: sha512-dhG34DXATL5hSxJbIexCft8FChFXtmskoZYnoPWjXQuebWYCNkVeV3KkGegCK9CP1oswI/vQibS2GY7Em/sJJA==} + engines: {node: '>= 8'} + dev: true - lazy-debug-legacy@0.0.1(debug@2.6.9): + /lazy-debug-legacy@0.0.1(debug@2.6.9): + resolution: {integrity: sha512-GFWaIBcBjxWWKI5OghwYEsPOR8JFh2xEcc3ZFV0ONYL0oHz0PHINJCfxJyztUq2XzcHncyO7fsRR550Gtfnk6g==} + peerDependencies: + debug: '*' dependencies: debug: 2.6.9 + dev: false - lazystream@1.0.1: + /lazystream@1.0.1: + resolution: {integrity: sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw==} + engines: {node: '>= 0.6.3'} dependencies: readable-stream: 2.3.8 + dev: false - lcid@1.0.0: + /lcid@1.0.0: + resolution: {integrity: sha512-YiGkH6EnGrDGqLMITnGjXtGmNtjoXw9SVUzcaos8RBi7Ps0VBylkq+vOcY9QE5poLasPCR849ucFUkl0UzUyOw==} + engines: {node: '>=0.10.0'} dependencies: invert-kv: 1.0.0 + dev: false - leven@3.1.0: {} + /leven@3.1.0: + resolution: {integrity: sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==} + engines: {node: '>=6'} - levn@0.4.1: + /levn@0.4.1: + resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} + engines: {node: '>= 0.8.0'} dependencies: prelude-ls: 1.2.1 type-check: 0.4.0 + dev: true - libphonenumber-js@1.10.58: {} + /libphonenumber-js@1.10.58: + resolution: {integrity: sha512-53A0IpJFL9LdHbpeatwizf8KSwPICrqn9H0g3Y7WQ+Jgeu9cQ4Ew3WrRtrLBu/CX2lXd5+rgT01/tGlkbkzOjw==} - light-my-request@5.12.0: + /light-my-request@5.12.0: + resolution: {integrity: sha512-P526OX6E7aeCIfw/9UyJNsAISfcFETghysaWHQAlQYayynShT08MOj4c6fBCvTWBrHXSvqBAKDp3amUPSCQI4w==} dependencies: cookie: 0.6.0 process-warning: 3.0.0 set-cookie-parser: 2.6.0 + dev: false - lightcookie@1.0.25: {} + /lightcookie@1.0.25: + resolution: {integrity: sha512-SrY/+eBPaKAMnsn7mCsoOMZzoQyCyHHHZlFCu2fjo28XxSyCLjlooKiTxyrXTg8NPaHp1YzWi0lcGG1gDi6KHw==} + deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. + dev: true - lines-and-columns@1.2.4: {} + /lines-and-columns@1.2.4: + resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} - load-json-file@1.1.0: + /load-json-file@1.1.0: + resolution: {integrity: sha512-cy7ZdNRXdablkXYNI049pthVeXFurRyb9+hA/dZzerZ0pGTx42z+y+ssxBaVV2l70t1muq5IdKhn4UtcoGUY9A==} + engines: {node: '>=0.10.0'} dependencies: graceful-fs: 4.2.11 parse-json: 2.2.0 pify: 2.3.0 pinkie-promise: 2.0.1 strip-bom: 2.0.0 + dev: false - load-json-file@4.0.0: + /load-json-file@4.0.0: + resolution: {integrity: sha512-Kx8hMakjX03tiGTLAIdJ+lL0htKnXjEZN6hk/tozf/WOuYGdZBJrZ+rCJRbVCugsjB3jMLn9746NsQIf5VjBMw==} + engines: {node: '>=4'} dependencies: graceful-fs: 4.2.11 parse-json: 4.0.0 pify: 3.0.0 strip-bom: 3.0.0 + dev: true - loader-runner@4.3.0: {} + /loader-runner@4.3.0: + resolution: {integrity: sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==} + engines: {node: '>=6.11.5'} + dev: true - locate-path@2.0.0: + /locate-path@2.0.0: + resolution: {integrity: sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA==} + engines: {node: '>=4'} dependencies: p-locate: 2.0.0 path-exists: 3.0.0 + dev: true - locate-path@3.0.0: + /locate-path@3.0.0: + resolution: {integrity: sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==} + engines: {node: '>=6'} dependencies: p-locate: 3.0.0 path-exists: 3.0.0 + dev: true - locate-path@5.0.0: + /locate-path@5.0.0: + resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} + engines: {node: '>=8'} dependencies: p-locate: 4.1.0 - locate-path@6.0.0: + /locate-path@6.0.0: + resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} + engines: {node: '>=10'} dependencies: p-locate: 5.0.0 + dev: true - locate-path@7.2.0: + /locate-path@7.2.0: + resolution: {integrity: sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} dependencies: p-locate: 6.0.0 + dev: true - lodash._reinterpolate@3.0.0: {} + /lodash._reinterpolate@3.0.0: + resolution: {integrity: sha512-xYHt68QRoYGjeeM/XOE1uJtvXQAgvszfBhjV4yvsQH0u2i9I6cI6c6/eG4Hh3UAOVn0y/xAXwmTzEay49Q//HA==} + dev: false - lodash.assign@4.2.0: {} + /lodash.assign@4.2.0: + resolution: {integrity: sha512-hFuH8TY+Yji7Eja3mGiuAxBqLagejScbG8GbG0j6o9vzn0YL14My+ktnqtZgFTosKymC9/44wP6s7xyuLfnClw==} + dev: false - lodash.assigninwith@4.2.0: {} + /lodash.assigninwith@4.2.0: + resolution: {integrity: sha512-oYOjtZzQnecm7PJcxrDbL20OHv3tTtOQdRBSnlor6s0MO6VOFTOC+JyBIJUNUEzsBi1I0oslWtFAAG6QQbFIWQ==} + dev: false - lodash.camelcase@4.3.0: {} + /lodash.camelcase@4.3.0: + resolution: {integrity: sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==} + dev: true - lodash.clonedeep@4.5.0: {} + /lodash.clonedeep@4.5.0: + resolution: {integrity: sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ==} + dev: false - lodash.includes@4.3.0: {} + /lodash.includes@4.3.0: + resolution: {integrity: sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w==} + dev: false - lodash.isboolean@3.0.3: {} + /lodash.isboolean@3.0.3: + resolution: {integrity: sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg==} + dev: false - lodash.isequal@4.5.0: {} + /lodash.isequal@4.5.0: + resolution: {integrity: sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==} + dev: false - lodash.isinteger@4.0.4: {} + /lodash.isinteger@4.0.4: + resolution: {integrity: sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA==} + dev: false - lodash.ismatch@4.4.0: {} + /lodash.ismatch@4.4.0: + resolution: {integrity: sha512-fPMfXjGQEV9Xsq/8MTSgUf255gawYRbjwMyDbcvDhXgV7enSZA0hynz6vMPnpAb5iONEzBHBPsT+0zes5Z301g==} + dev: true - lodash.isnumber@3.0.3: {} + /lodash.isnumber@3.0.3: + resolution: {integrity: sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw==} + dev: false - lodash.isplainobject@4.0.6: {} + /lodash.isplainobject@4.0.6: + resolution: {integrity: sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==} - lodash.isstring@4.0.1: {} + /lodash.isstring@4.0.1: + resolution: {integrity: sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==} + dev: false - lodash.kebabcase@4.1.1: {} + /lodash.kebabcase@4.1.1: + resolution: {integrity: sha512-N8XRTIMMqqDgSy4VLKPnJ/+hpGZN+PHQiJnSenYqPaVV/NCqEogTnAdZLQiGKhxX+JCs8waWq2t1XHWKOmlY8g==} + dev: true - lodash.keys@4.2.0: {} + /lodash.keys@4.2.0: + resolution: {integrity: sha512-J79MkJcp7Df5mizHiVNpjoHXLi4HLjh9VLS/M7lQSGoQ+0oQ+lWEigREkqKyizPB1IawvQLLKY8mzEcm1tkyxQ==} + dev: false - lodash.map@4.6.0: {} + /lodash.map@4.6.0: + resolution: {integrity: sha512-worNHGKLDetmcEYDvh2stPCrrQRkP20E4l0iIS7F8EvzMqBBi7ltvFN5m1HvTf1P7Jk1txKhvFcmYsCr8O2F1Q==} + dev: true - lodash.memoize@4.1.2: {} + /lodash.memoize@4.1.2: + resolution: {integrity: sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==} - lodash.merge@4.6.2: {} + /lodash.merge@4.6.2: + resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} + dev: true - lodash.mergewith@4.6.2: {} + /lodash.mergewith@4.6.2: + resolution: {integrity: sha512-GK3g5RPZWTRSeLSpgP8Xhra+pnjBC56q9FZYe1d5RN3TJ35dbkGy3YqBSMbyCrlbi+CM9Z3Jk5yTL7RCsqboyQ==} + dev: true - lodash.once@4.1.1: {} + /lodash.once@4.1.1: + resolution: {integrity: sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==} + dev: false - lodash.rest@4.0.5: {} + /lodash.rest@4.0.5: + resolution: {integrity: sha512-hsypEpebNAt0hj1aX9isQqi2CIZoNS1lP6PSWhB3hcMnBivobYzPZRPYq4cr38+RtvrlxQTgaW+sIuHAhBoHrA==} + dev: false - lodash.snakecase@4.1.1: {} + /lodash.snakecase@4.1.1: + resolution: {integrity: sha512-QZ1d4xoBHYUeuouhEq3lk3Uq7ldgyFXGBhg04+oRLnIz8o9T65Eh+8YdroUwn846zchkA9yDsDl5CVVaV2nqYw==} + dev: true - lodash.startcase@4.4.0: {} + /lodash.startcase@4.4.0: + resolution: {integrity: sha512-+WKqsK294HMSc2jEbNgpHpd0JfIBhp7rEV4aqXWqFr6AlXov+SlcgB1Fv01y2kGe3Gc8nMW7VA0SrGuSkRfIEg==} + dev: true - lodash.template@4.2.4: + /lodash.template@4.2.4: + resolution: {integrity: sha512-PmEQ9TtYbeYg6lNwJpSjkp4J4KttYLuKF1C6jeFBidyzbOFu0KvVnLicZBf0sGfScARwgOBqxnV/rWuaqRwang==} dependencies: lodash._reinterpolate: 3.0.0 lodash.assigninwith: 4.2.0 @@ -8881,59 +6146,97 @@ snapshots: lodash.rest: 4.0.5 lodash.templatesettings: 4.2.0 lodash.tostring: 4.1.4 + dev: false - lodash.templatesettings@4.2.0: + /lodash.templatesettings@4.2.0: + resolution: {integrity: sha512-stgLz+i3Aa9mZgnjr/O+v9ruKZsPsndy7qPZOchbqk2cnTU1ZaldKK+v7m54WoKIyxiuMZTKT2H81F8BeAc3ZQ==} dependencies: lodash._reinterpolate: 3.0.0 + dev: false - lodash.tostring@4.1.4: {} + /lodash.tostring@4.1.4: + resolution: {integrity: sha512-xWHJ0LY7cSz/C/4ghNNiYA1Ong0VLdzAzrjDHvOzN+eJHzDEHme2+k+w/9Pk8dtdwcASMUbxN1/mtj6mFI25Ng==} + dev: false - lodash.uniq@4.5.0: {} + /lodash.uniq@4.5.0: + resolution: {integrity: sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==} + dev: true - lodash.upperfirst@4.3.1: {} + /lodash.upperfirst@4.3.1: + resolution: {integrity: sha512-sReKOYJIJf74dhJONhU4e0/shzi1trVbSWDOhKYE5XV2O+H7Sb2Dihwuc7xWxVl+DgFPyTqIN3zMfT9cq5iWDg==} + dev: true - lodash@4.17.21: {} + /lodash@4.17.21: + resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} - log-symbols@4.1.0: + /log-symbols@4.1.0: + resolution: {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==} + engines: {node: '>=10'} dependencies: chalk: 4.1.2 is-unicode-supported: 0.1.0 - longest@2.0.1: {} + /longest@2.0.1: + resolution: {integrity: sha512-Ajzxb8CM6WAnFjgiloPsI3bF+WCxcvhdIG3KNA2KN962+tdBsHcuQ4k4qX/EcS/2CRkcc0iAkR956Nib6aXU/Q==} + engines: {node: '>=0.10.0'} + dev: true - lru-cache@10.2.0: {} + /lru-cache@10.2.0: + resolution: {integrity: sha512-2bIM8x+VAf6JT4bKAljS1qUWgMsqZRPGJS6FSahIMPVvctcNhyVp7AJu7quxOW9jwkryBReKZY5tY5JYv2n/7Q==} + engines: {node: 14 || >=16.14} - lru-cache@5.1.1: + /lru-cache@5.1.1: + resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} dependencies: yallist: 3.1.1 - lru-cache@6.0.0: + /lru-cache@6.0.0: + resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} + engines: {node: '>=10'} dependencies: yallist: 4.0.0 - lru-cache@7.18.3: {} + /lru-cache@7.18.3: + resolution: {integrity: sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==} + engines: {node: '>=12'} + dev: false - macos-release@2.5.1: {} + /macos-release@2.5.1: + resolution: {integrity: sha512-DXqXhEM7gW59OjZO8NIjBCz9AQ1BEMrfiOAl4AYByHCtVHRF4KoGNO8mqQeM8lRCtQe/UnJ4imO/d2HdkKsd+A==} + engines: {node: '>=6'} + dev: true - magic-string@0.25.7: + /magic-string@0.25.7: + resolution: {integrity: sha512-4CrMT5DOHTDk4HYDlzmwu4FVCcIYI8gauveasrdCu2IKIFOJ3f0v/8MDGJCDL9oD2ppz/Av1b0Nj345H9M+XIA==} dependencies: sourcemap-codec: 1.4.8 + dev: false - magic-string@0.30.0: + /magic-string@0.30.0: + resolution: {integrity: sha512-LA+31JYDJLs82r2ScLrlz1GjSgu66ZV518eyWT+S8VhyQn/JL0u9MeBOvQMGYiPk1DBiSN9DDMOcXvigJZaViQ==} + engines: {node: '>=12'} dependencies: '@jridgewell/sourcemap-codec': 1.4.15 + dev: true - make-dir@3.1.0: + /make-dir@3.1.0: + resolution: {integrity: sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==} + engines: {node: '>=8'} dependencies: semver: 6.3.1 - make-dir@4.0.0: + /make-dir@4.0.0: + resolution: {integrity: sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==} + engines: {node: '>=10'} dependencies: semver: 7.6.0 - make-error@1.3.6: {} + /make-error@1.3.6: + resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} - make-fetch-happen@10.2.1: + /make-fetch-happen@10.2.1: + resolution: {integrity: sha512-NgOPbRiaQM10DYXvN3/hhGVI2M5MtITFryzBGxHM5p4wnFxsVCbxkrBrDsk+EZ5OB4jEOT7AjDxtdF+KVEFT7w==} + engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} dependencies: agentkeepalive: 4.5.0 cacache: 16.1.3 @@ -8954,30 +6257,53 @@ snapshots: transitivePeerDependencies: - bluebird - supports-color + dev: false - makeerror@1.0.12: + /makeerror@1.0.12: + resolution: {integrity: sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==} dependencies: tmpl: 1.0.5 - map-obj@1.0.1: {} + /map-obj@1.0.1: + resolution: {integrity: sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==} + engines: {node: '>=0.10.0'} + dev: true - map-obj@4.3.0: {} + /map-obj@4.3.0: + resolution: {integrity: sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==} + engines: {node: '>=8'} + dev: true - map-stream@0.0.6: {} + /map-stream@0.0.6: + resolution: {integrity: sha512-RG9wAgznUY0foT30MMfnXh4jS0ObmOuxoGKe/ppYvM55RfquNdIvEEf6e+euczNVVzJIVbkgxg7GJBpYDhQ/Zg==} + dev: false - matchit@1.1.0: + /matchit@1.1.0: + resolution: {integrity: sha512-+nGYoOlfHmxe5BW5tE0EMJppXEwdSf8uBA1GTZC7Q77kbT35+VKLYJMzVNWCHSsga1ps1tPYFtFyvxvKzWVmMA==} + engines: {node: '>=6'} dependencies: '@arr/every': 1.0.1 + dev: true - math-random@1.0.4: {} + /math-random@1.0.4: + resolution: {integrity: sha512-rUxjysqif/BZQH2yhd5Aaq7vXMSx9NdEsQcyA07uEzIvxgI7zIr33gGsh+RU0/XjmQpCW7RsVof1vlkvQVCK5A==} + dev: false - memfs@3.5.3: + /memfs@3.5.3: + resolution: {integrity: sha512-UERzLsxzllchadvbPs5aolHh65ISpKpM+ccLbOJ8/vvpBKmAWf+la7dXFy7Mr0ySHbdHrFv5kGFCUHHe6GFEmw==} + engines: {node: '>= 4.0.0'} dependencies: fs-monkey: 1.0.5 + dev: true - meow@12.1.1: {} + /meow@12.1.1: + resolution: {integrity: sha512-BhXM0Au22RwUneMPwSCnyhTOizdWoIEPU9sp0Aqa1PnDMR5Wv2FGXYDjuzJEIX+Eo2Rb8xuYe5jrnm5QowQFkw==} + engines: {node: '>=16.10'} + dev: true - meow@8.1.2: + /meow@8.1.2: + resolution: {integrity: sha512-r85E3NdZ+mpYk1C6RjPFEMSE+s1iZMuHtsHAqY0DT3jZczl0diWUZ8g6oU7h0M9cD2EL+PzaYghhCLzR0ZNn5Q==} + engines: {node: '>=10'} dependencies: '@types/minimist': 1.2.5 camelcase-keys: 6.2.2 @@ -8990,20 +6316,34 @@ snapshots: trim-newlines: 3.0.1 type-fest: 0.18.1 yargs-parser: 20.2.9 + dev: true - merge-stream@1.0.1: + /merge-stream@1.0.1: + resolution: {integrity: sha512-e6RM36aegd4f+r8BZCcYXlO2P3H6xbUM6ktL2Xmf45GAOit9bI4z6/3VU7JwllVO1L7u0UDSg/EhzQ5lmMLolA==} dependencies: readable-stream: 2.3.8 + dev: false - merge-stream@2.0.0: {} + /merge-stream@2.0.0: + resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} - merge2@1.4.1: {} + /merge2@1.4.1: + resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} + engines: {node: '>= 8'} + dev: true - merge@2.1.1: {} + /merge@2.1.1: + resolution: {integrity: sha512-jz+Cfrg9GWOZbQAnDQ4hlVnQky+341Yk5ru8bZSe6sIDTCIg8n9i/u7hSQGSVOF3C7lH6mGtqjkiT9G4wFLL0w==} + dev: true - methods@1.1.2: {} + /methods@1.1.2: + resolution: {integrity: sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==} + engines: {node: '>= 0.6'} + dev: true - micromatch@2.3.11: + /micromatch@2.3.11: + resolution: {integrity: sha512-LnU2XFEk9xxSJ6rfgAry/ty5qwUTyHYOBU0g4R6tIw5ljwgGIBmiKhRWLw5NpMOnrgUNcDJ4WMp8rl3sYVHLNA==} + engines: {node: '>=0.10.0'} dependencies: arr-diff: 2.0.0 array-unique: 0.2.1 @@ -9018,108 +6358,188 @@ snapshots: object.omit: 2.0.1 parse-glob: 3.0.4 regex-cache: 0.4.4 + dev: false - micromatch@4.0.5: + /micromatch@4.0.5: + resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} + engines: {node: '>=8.6'} dependencies: braces: 3.0.2 picomatch: 2.3.1 - mime-db@1.52.0: {} + /mime-db@1.52.0: + resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} + engines: {node: '>= 0.6'} - mime-lite@1.0.3: {} + /mime-lite@1.0.3: + resolution: {integrity: sha512-V85l97zJSTG8FEvmdTlmNYb0UMrVBwvRjw7bWTf/aT6KjFwtz3iTz8D2tuFIp7lwiaO2C5ecnrEmSkkMRCrqVw==} + dev: true - mime-types@2.1.35: + /mime-types@2.1.35: + resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} + engines: {node: '>= 0.6'} dependencies: mime-db: 1.52.0 - mime@2.6.0: {} + /mime@2.6.0: + resolution: {integrity: sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==} + engines: {node: '>=4.0.0'} + hasBin: true + dev: true - mime@3.0.0: {} + /mime@3.0.0: + resolution: {integrity: sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==} + engines: {node: '>=10.0.0'} + hasBin: true + dev: false - mimic-fn@2.1.0: {} + /mimic-fn@2.1.0: + resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} + engines: {node: '>=6'} - mimic-fn@4.0.0: {} + /mimic-fn@4.0.0: + resolution: {integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==} + engines: {node: '>=12'} + dev: true - min-indent@1.0.1: {} + /min-indent@1.0.1: + resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==} + engines: {node: '>=4'} + dev: true - minimatch@3.1.2: + /minimatch@3.1.2: + resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} dependencies: brace-expansion: 1.1.11 - minimatch@5.1.6: + /minimatch@5.1.6: + resolution: {integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==} + engines: {node: '>=10'} dependencies: brace-expansion: 2.0.1 + dev: false - minimatch@8.0.4: + /minimatch@8.0.4: + resolution: {integrity: sha512-W0Wvr9HyFXZRGIDgCicunpQ299OKXs9RgZfaukz4qAW/pJhcpUfupc9c+OObPOFueNy8VSrZgEmDtk6Kh4WzDA==} + engines: {node: '>=16 || 14 >=14.17'} dependencies: brace-expansion: 2.0.1 + dev: true - minimatch@9.0.3: + /minimatch@9.0.3: + resolution: {integrity: sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==} + engines: {node: '>=16 || 14 >=14.17'} dependencies: brace-expansion: 2.0.1 + dev: false - minimist-options@4.1.0: + /minimist-options@4.1.0: + resolution: {integrity: sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==} + engines: {node: '>= 6'} dependencies: arrify: 1.0.1 is-plain-obj: 1.1.0 kind-of: 6.0.3 + dev: true - minimist@1.2.7: {} + /minimist@1.2.7: + resolution: {integrity: sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g==} + dev: true - minimist@1.2.8: {} + /minimist@1.2.8: + resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} - minipass-collect@1.0.2: + /minipass-collect@1.0.2: + resolution: {integrity: sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==} + engines: {node: '>= 8'} dependencies: minipass: 3.3.6 + dev: false - minipass-fetch@2.1.2: + /minipass-fetch@2.1.2: + resolution: {integrity: sha512-LT49Zi2/WMROHYoqGgdlQIZh8mLPZmOrN2NdJjMXxYe4nkN6FUyuPuOAOedNJDrx0IRGg9+4guZewtp8hE6TxA==} + engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} dependencies: minipass: 3.3.6 minipass-sized: 1.0.3 minizlib: 2.1.2 optionalDependencies: encoding: 0.1.13 + dev: false - minipass-flush@1.0.5: + /minipass-flush@1.0.5: + resolution: {integrity: sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==} + engines: {node: '>= 8'} dependencies: minipass: 3.3.6 + dev: false - minipass-pipeline@1.2.4: + /minipass-pipeline@1.2.4: + resolution: {integrity: sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==} + engines: {node: '>=8'} dependencies: minipass: 3.3.6 + dev: false - minipass-sized@1.0.3: + /minipass-sized@1.0.3: + resolution: {integrity: sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==} + engines: {node: '>=8'} dependencies: minipass: 3.3.6 + dev: false - minipass@3.3.6: + /minipass@3.3.6: + resolution: {integrity: sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==} + engines: {node: '>=8'} dependencies: yallist: 4.0.0 - minipass@4.2.8: {} + /minipass@4.2.8: + resolution: {integrity: sha512-fNzuVyifolSLFL4NzpF+wEF4qrgqaaKX0haXPQEdQ7NKAN+WecoKMHV09YcuL/DHxrUsYQOK3MiuDf7Ip2OXfQ==} + engines: {node: '>=8'} + dev: true - minipass@5.0.0: {} + /minipass@5.0.0: + resolution: {integrity: sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==} + engines: {node: '>=8'} - minipass@7.0.4: {} + /minipass@7.0.4: + resolution: {integrity: sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==} + engines: {node: '>=16 || 14 >=14.17'} - minizlib@2.1.2: + /minizlib@2.1.2: + resolution: {integrity: sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==} + engines: {node: '>= 8'} dependencies: minipass: 3.3.6 yallist: 4.0.0 - mkdirp@0.5.6: + /mkdirp@0.5.6: + resolution: {integrity: sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==} + hasBin: true dependencies: minimist: 1.2.8 + dev: false - mkdirp@1.0.4: {} + /mkdirp@1.0.4: + resolution: {integrity: sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==} + engines: {node: '>=10'} + hasBin: true - mnemonist@0.39.6: + /mnemonist@0.39.6: + resolution: {integrity: sha512-A/0v5Z59y63US00cRSLiloEIw3t5G+MiKz4BhX21FI+YBJXBOGW0ohFxTxO08dsOYlzxo87T7vGfZKYp2bcAWA==} dependencies: obliterator: 2.0.4 + dev: false - modify-values@1.0.1: {} + /modify-values@1.0.1: + resolution: {integrity: sha512-xV2bxeN6F7oYjZWTe/YPAy6MN2M+sL4u/Rlm2AHCIVGfo2p1yGmBHQ6vHehl4bRTZBdHu3TSkWdYgkwpYzAGSw==} + engines: {node: '>=0.10.0'} + dev: true - module@1.2.5: + /module@1.2.5: + resolution: {integrity: sha512-Y+j9HcHf8V6YtNBkLbPmREAUi5xGbAdb9ycXpo2roABDPrJEzd79kmoH5Ib9lpxcNVsHWa1LhRZJcflUq2+N3w==} + hasBin: true dependencies: chalk: 1.1.3 concat-stream: 1.5.1 @@ -9130,47 +6550,94 @@ snapshots: yargs: 4.6.0 transitivePeerDependencies: - supports-color + dev: false - ms@2.0.0: {} + /ms@2.0.0: + resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==} + dev: false - ms@2.1.2: {} + /ms@2.1.2: + resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} - ms@2.1.3: {} + /ms@2.1.3: + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + dev: false - mute-stream@0.0.8: {} + /mute-stream@0.0.8: + resolution: {integrity: sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==} + dev: true - nan@2.19.0: {} + /nan@2.19.0: + resolution: {integrity: sha512-nO1xXxfh/RWNxfd/XPfbIfFk5vgLsAxUR9y5O0cHMJu/AW9U95JLXqthYHjEp+8gQ5p96K9jUp8nbVOxCdRbtw==} + dev: false - nanoid@3.3.7: {} + /nanoid@3.3.7: + resolution: {integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + dev: false - natural-compare-lite@1.4.0: {} + /natural-compare-lite@1.4.0: + resolution: {integrity: sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==} + dev: true - natural-compare@1.4.0: {} + /natural-compare@1.4.0: + resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} - negotiator@0.6.3: {} + /negotiator@0.6.3: + resolution: {integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==} + engines: {node: '>= 0.6'} + dev: false - neo-async@2.6.2: {} + /neo-async@2.6.2: + resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} + dev: true - nestjs-cls@4.2.0(@nestjs/common@10.0.0)(@nestjs/core@10.0.0)(reflect-metadata@0.1.13)(rxjs@7.8.1): + /nestjs-cls@4.2.0(@nestjs/common@10.0.0)(@nestjs/core@10.0.0)(reflect-metadata@0.1.13)(rxjs@7.8.1): + resolution: {integrity: sha512-sdvdhBmM9eb9d1URtcK7642S3ufD9ZWaKRt4Ouf1gIGmd73YniiKCxxOFwChRqDU+sr7hwxT560JaA27R/7RJQ==} + engines: {node: '>=16'} + peerDependencies: + '@nestjs/common': '> 7.0.0 < 11' + '@nestjs/core': '> 7.0.0 < 11' + reflect-metadata: '*' + rxjs: '>= 7' dependencies: '@nestjs/common': 10.0.0(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.1.13)(rxjs@7.8.1) '@nestjs/core': 10.0.0(@nestjs/common@10.0.0)(reflect-metadata@0.1.13)(rxjs@7.8.1) reflect-metadata: 0.1.13 rxjs: 7.8.1 + dev: false - nestjs-oauth2@0.0.7(@nestjs/common@10.0.0)(rxjs@7.8.1): + /nestjs-oauth2@0.0.7(@nestjs/common@10.0.0)(rxjs@7.8.1): + resolution: {integrity: sha512-P4HfJziGsMl4+aTclr9vkqfbI84odja1kOjKZw095A+b4ksVczOC4J/AH4BydsIAPVsj/5RJj4aGFoWV90Bu1w==} + peerDependencies: + '@nestjs/common': ^9.0.0 + rxjs: ^7.x dependencies: '@golevelup/nestjs-modules': 0.6.1(@nestjs/common@10.0.0)(rxjs@7.8.1) '@nestjs/common': 10.0.0(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.1.13)(rxjs@7.8.1) oauth: 0.10.0 rxjs: 7.8.1 + dev: false - nestjs-pino@4.0.0(@nestjs/common@10.0.0)(pino-http@9.0.0): + /nestjs-pino@4.0.0(@nestjs/common@10.0.0)(pino-http@9.0.0): + resolution: {integrity: sha512-XhCg/R+l3w0BFP6MHyR6lU/BHVEV0tV9z24G0vuA9FD3sv+TQNvnO9uVsF1l/oVspgGfQ9Qulmb2UbsfYlI0+g==} + engines: {node: '>= 14'} + requiresBuild: true + peerDependencies: + '@nestjs/common': ^8.0.0 || ^9.0.0 || ^10.0.0 + pino-http: ^6.4.0 || ^7.0.0 || ^8.0.0 || ^9.0.0 dependencies: '@nestjs/common': 10.0.0(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.1.13)(rxjs@7.8.1) pino-http: 9.0.0 + dev: false - nestjs-prisma@0.23.0(@nestjs/common@10.0.0)(@prisma/client@5.10.2)(prisma@5.10.2): + /nestjs-prisma@0.23.0(@nestjs/common@10.0.0)(@prisma/client@5.10.2)(prisma@5.10.2): + resolution: {integrity: sha512-0pIMDasayP+vMFSztcs85zu4WSPTKM85F8vIrqn7GsUBboEcKhI8eCeVghhNyKDGzEBaNAYNJlo2MAWdNuN7Tw==} + peerDependencies: + '@nestjs/common': ^7.0.0 || ^8.0.0 || ^9.0.0 || ^10.0.0 + '@prisma/client': ^2.0.0 || ^3.0.0 || ^4.0.0 || ^5.0.0 + prisma: ^2.0.0 || ^3.0.0 || ^4.0.0 || ^5.0.0 dependencies: '@angular-devkit/core': 13.3.11 '@angular-devkit/schematics': 13.3.11 @@ -9180,20 +6647,37 @@ snapshots: prisma: 5.10.2 transitivePeerDependencies: - chokidar + dev: false - node-abort-controller@3.1.1: {} + /node-abort-controller@3.1.1: + resolution: {integrity: sha512-AGK2yQKIjRuqnc6VkX2Xj5d+QW8xZ87pa1UK6yA6ouUyuxfHuMP6umE5QK7UmTeOAymo+Zx1Fxiuw9rVx8taHQ==} + dev: true - node-addon-api@5.1.0: {} + /node-addon-api@5.1.0: + resolution: {integrity: sha512-eh0GgfEkpnoWDq+VY8OyvYhFEzBk6jIYbRKdIlyTiAXIVJ8PyBaKb0rp7oDtoddbdoHWhq8wwr+XZ81F1rpNdA==} + dev: false - node-emoji@1.11.0: + /node-emoji@1.11.0: + resolution: {integrity: sha512-wo2DpQkQp7Sjm2A0cq+sN7EHKO6Sl0ctXeBdFZrL9T9+UywORbufTcTZxom8YqpLQt/FqNMUkOpkZrJVYSKD3A==} dependencies: lodash: 4.17.21 + dev: true - node-fetch@2.7.0: + /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 dependencies: whatwg-url: 5.0.0 - node-gyp@9.4.1: + /node-gyp@9.4.1: + resolution: {integrity: sha512-OQkWKbjQKbGkMf/xqI1jjy3oCTgMKJac58G2+bjZb3fza6gW2YrCSdMQYaoTb70crvE//Gngr4f0AgVHmqHvBQ==} + engines: {node: ^12.13 || ^14.13 || >=16} + hasBin: true dependencies: env-paths: 2.2.1 exponential-backoff: 3.1.1 @@ -9209,97 +6693,158 @@ snapshots: transitivePeerDependencies: - bluebird - supports-color + dev: false - node-int64@0.4.0: {} + /node-int64@0.4.0: + resolution: {integrity: sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==} - node-releases@2.0.14: {} + /node-releases@2.0.14: + resolution: {integrity: sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==} - nopt@5.0.0: + /nopt@5.0.0: + resolution: {integrity: sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==} + engines: {node: '>=6'} + hasBin: true dependencies: abbrev: 1.1.1 + dev: false - nopt@6.0.0: + /nopt@6.0.0: + resolution: {integrity: sha512-ZwLpbTgdhuZUnZzjd7nb1ZV+4DoiC6/sfiVKok72ym/4Tlf+DFdlHYmT2JPmcNNWV6Pi3SDf1kT+A4r9RTuT9g==} + engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + hasBin: true dependencies: abbrev: 1.1.1 + dev: false - normalize-package-data@2.5.0: + /normalize-package-data@2.5.0: + resolution: {integrity: sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==} dependencies: hosted-git-info: 2.8.9 resolve: 1.22.8 semver: 5.7.2 validate-npm-package-license: 3.0.4 - normalize-package-data@3.0.3: + /normalize-package-data@3.0.3: + resolution: {integrity: sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==} + engines: {node: '>=10'} dependencies: hosted-git-info: 4.1.0 is-core-module: 2.13.1 semver: 7.6.0 validate-npm-package-license: 3.0.4 + dev: true - normalize-path@2.1.1: + /normalize-path@2.1.1: + resolution: {integrity: sha512-3pKJwH184Xo/lnH6oyP1q2pMd7HcypqqmRs91/6/i2CGtWwIKGCkOOMTm/zXbgTEWHw1uNpNi/igc3ePOYHb6w==} + engines: {node: '>=0.10.0'} dependencies: remove-trailing-separator: 1.1.0 + dev: false - normalize-path@3.0.0: {} + /normalize-path@3.0.0: + resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} + engines: {node: '>=0.10.0'} - npm-run-path@4.0.1: + /npm-run-path@4.0.1: + resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} + engines: {node: '>=8'} dependencies: path-key: 3.1.1 - npm-run-path@5.3.0: + /npm-run-path@5.3.0: + resolution: {integrity: sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} dependencies: path-key: 4.0.0 + dev: true - npmlog@5.0.1: + /npmlog@5.0.1: + resolution: {integrity: sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==} dependencies: are-we-there-yet: 2.0.0 console-control-strings: 1.1.0 gauge: 3.0.2 set-blocking: 2.0.0 + dev: false - npmlog@6.0.2: + /npmlog@6.0.2: + resolution: {integrity: sha512-/vBvz5Jfr9dT/aFWd0FIRf+T/Q2WBsLENygUaFUqstqsycmZAP/t5BvFJTK0viFmSUxiUKTUplWy5vt+rvKIxg==} + engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} dependencies: are-we-there-yet: 3.0.1 console-control-strings: 1.1.0 gauge: 4.0.4 set-blocking: 2.0.0 + dev: false - number-is-nan@1.0.1: {} + /number-is-nan@1.0.1: + resolution: {integrity: sha512-4jbtZXNAsfZbAHiiqjLPBiCl16dES1zI4Hpzzxw61Tk+loF+sBDBKx1ICKKKwIqQ7M0mFn1TmkN7euSncWgHiQ==} + engines: {node: '>=0.10.0'} + dev: false - oauth@0.10.0: {} + /oauth@0.10.0: + resolution: {integrity: sha512-1orQ9MT1vHFGQxhuy7E/0gECD3fd2fCC+PIX+/jgmU/gI3EpRocXtmtvxCO5x3WZ443FLTLFWNDjl5MPJf9u+Q==} + dev: false - object-assign@4.1.0: {} + /object-assign@4.1.0: + resolution: {integrity: sha512-Lbc7GfN7XFaK30bzUN3cDYLOkT0dH05S0ax1QikylHUD9+Z9PRF3G1iYwX3kcz+6AlzTFGkUgMxz6l3aUwbwTA==} + engines: {node: '>=0.10.0'} + dev: false - object-assign@4.1.1: {} + /object-assign@4.1.1: + resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} + engines: {node: '>=0.10.0'} + dev: false - object-inspect@1.13.1: {} + /object-inspect@1.13.1: + resolution: {integrity: sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==} + dev: true - object.omit@2.0.1: + /object.omit@2.0.1: + resolution: {integrity: sha512-UiAM5mhmIuKLsOvrL+B0U2d1hXHF3bFYWIuH1LMpuV2EJEHG1Ntz06PgLEHjm6VFd87NpH8rastvPoyv6UW2fA==} + engines: {node: '>=0.10.0'} dependencies: for-own: 0.1.5 is-extendable: 0.1.1 + dev: false - obliterator@2.0.4: {} + /obliterator@2.0.4: + resolution: {integrity: sha512-lgHwxlxV1qIg1Eap7LgIeoBWIMFibOjbrYPIPJZcI1mmGAI2m3lNYpK12Y+GBdPQ0U1hRwSord7GIaawz962qQ==} + dev: false - on-exit-leak-free@2.1.2: {} + /on-exit-leak-free@2.1.2: + resolution: {integrity: sha512-0eJJY6hXLGf1udHwfNftBqH+g73EU4B504nZeKpz1sYRKafAghwxEJunB2O7rDZkL4PGfsMVnTXZ2EjibbqcsA==} + engines: {node: '>=14.0.0'} + dev: false - once@1.4.0: + /once@1.4.0: + resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} dependencies: wrappy: 1.0.2 - onetime@5.1.2: + /onetime@5.1.2: + resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} + engines: {node: '>=6'} dependencies: mimic-fn: 2.1.0 - onetime@6.0.0: + /onetime@6.0.0: + resolution: {integrity: sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==} + engines: {node: '>=12'} dependencies: mimic-fn: 4.0.0 + dev: true - openapi-fuzzer-core@1.0.6: + /openapi-fuzzer-core@1.0.6: + resolution: {integrity: sha512-FJNJIfgUFuv4NmVGq9MYdoKra2GrkDy2uhIjE2YGlw30UA1glf4SXLMhI4UwdcJ8jisKdIxi7lXrfej8GvNW5w==} dependencies: klona: 2.0.6 + dev: true - optionator@0.9.3: + /optionator@0.9.3: + resolution: {integrity: sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==} + engines: {node: '>= 0.8.0'} dependencies: '@aashutoshrathi/word-wrap': 1.2.6 deep-is: 0.1.4 @@ -9307,8 +6852,11 @@ snapshots: levn: 0.4.1 prelude-ls: 1.2.1 type-check: 0.4.0 + dev: true - ora@5.4.1: + /ora@5.4.1: + resolution: {integrity: sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==} + engines: {node: '>=10'} dependencies: bl: 4.1.0 chalk: 4.1.2 @@ -9320,73 +6868,126 @@ snapshots: strip-ansi: 6.0.1 wcwidth: 1.0.1 - ordered-read-streams@0.3.0: + /ordered-read-streams@0.3.0: + resolution: {integrity: sha512-xQvd8qvx9U1iYY9aVqPpoF5V9uaWJKV6ZGljkh/jkiNX0DiQsjbWvRumbh10QTMDE8DheaOEU8xi0szbrgjzcw==} dependencies: is-stream: 1.1.0 readable-stream: 2.3.8 + dev: false - os-homedir@1.0.2: {} + /os-homedir@1.0.2: + resolution: {integrity: sha512-B5JU3cabzk8c67mRRd3ECmROafjYMXbuzlwtqdM8IbS8ktlTix8aFGb2bAGKrSRIlnfKwovGUUr72JUPyOb6kQ==} + engines: {node: '>=0.10.0'} + dev: false - os-locale@1.4.0: + /os-locale@1.4.0: + resolution: {integrity: sha512-PRT7ZORmwu2MEFt4/fv3Q+mEfN4zetKxufQrkShY2oGvUms9r8otu5HfdyIFHkYXjO7laNsoVGmM2MANfuTA8g==} + engines: {node: '>=0.10.0'} dependencies: lcid: 1.0.0 + dev: false - os-name@4.0.1: + /os-name@4.0.1: + resolution: {integrity: sha512-xl9MAoU97MH1Xt5K9ERft2YfCAoaO6msy1OBA0ozxEC0x0TmIoE6K3QvgJMMZA9yKGLmHXNY/YZoDbiGDj4zYw==} + engines: {node: '>=10'} dependencies: macos-release: 2.5.1 windows-release: 4.0.0 + dev: true - os-tmpdir@1.0.2: {} + /os-tmpdir@1.0.2: + resolution: {integrity: sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==} + engines: {node: '>=0.10.0'} + dev: true - p-is-promise@3.0.0: {} + /p-is-promise@3.0.0: + resolution: {integrity: sha512-Wo8VsW4IRQSKVXsJCn7TomUaVtyfjVDn3nUP7kE967BQk0CwFpdbZs0X0uk5sW9mkBa9eNM7hCMaG93WUAwxYQ==} + engines: {node: '>=8'} + dev: false - p-limit@1.3.0: + /p-limit@1.3.0: + resolution: {integrity: sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==} + engines: {node: '>=4'} dependencies: p-try: 1.0.0 + dev: true - p-limit@2.3.0: + /p-limit@2.3.0: + resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} + engines: {node: '>=6'} dependencies: p-try: 2.2.0 - p-limit@3.1.0: + /p-limit@3.1.0: + resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} + engines: {node: '>=10'} dependencies: yocto-queue: 0.1.0 - p-limit@4.0.0: + /p-limit@4.0.0: + resolution: {integrity: sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} dependencies: yocto-queue: 1.0.0 + dev: true - p-locate@2.0.0: + /p-locate@2.0.0: + resolution: {integrity: sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg==} + engines: {node: '>=4'} dependencies: p-limit: 1.3.0 + dev: true - p-locate@3.0.0: + /p-locate@3.0.0: + resolution: {integrity: sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==} + engines: {node: '>=6'} dependencies: p-limit: 2.3.0 + dev: true - p-locate@4.1.0: + /p-locate@4.1.0: + resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} + engines: {node: '>=8'} dependencies: p-limit: 2.3.0 - p-locate@5.0.0: + /p-locate@5.0.0: + resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} + engines: {node: '>=10'} dependencies: p-limit: 3.1.0 + dev: true - p-locate@6.0.0: + /p-locate@6.0.0: + resolution: {integrity: sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} dependencies: p-limit: 4.0.0 + dev: true - p-map@4.0.0: + /p-map@4.0.0: + resolution: {integrity: sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==} + engines: {node: '>=10'} dependencies: aggregate-error: 3.1.0 + dev: false - p-try@1.0.0: {} + /p-try@1.0.0: + resolution: {integrity: sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww==} + engines: {node: '>=4'} + dev: true - p-try@2.2.0: {} + /p-try@2.2.0: + resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} + engines: {node: '>=6'} - pactum-matchers@1.1.6: {} + /pactum-matchers@1.1.6: + resolution: {integrity: sha512-55io32NeOKbLpHKKPzYDOr+N2dseTzMbj1Gj1y+zvOkKK6NDf5BT5pxglfqLN/ra3ig5zvbrKFUqZIWjAWboog==} + dev: true - pactum@3.6.3: + /pactum@3.6.3: + resolution: {integrity: sha512-iAizqD9sgJsVVKm0sBzDm2ZjqBMJBr/ZTbKOYawfT014EsoSIzuHIsolpslRKsHlru6MFwlg530XrEpaBmElrA==} + engines: {node: '>=10'} dependencies: '@exodus/schemasafe': 1.3.0 deep-override: 1.0.2 @@ -9399,135 +7000,229 @@ snapshots: parse-graphql: 1.0.0 phin: 3.7.0 polka: 0.5.2 + dev: true - parent-module@1.0.1: + /parent-module@1.0.1: + resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} + engines: {node: '>=6'} dependencies: callsites: 3.1.0 + dev: true - parse-glob@3.0.4: + /parse-glob@3.0.4: + resolution: {integrity: sha512-FC5TeK0AwXzq3tUBFtH74naWkPQCEWs4K+xMxWZBlKDWu0bVHXGZa+KKqxKidd7xwhdZ19ZNuF2uO1M/r196HA==} + engines: {node: '>=0.10.0'} dependencies: glob-base: 0.3.0 is-dotfile: 1.0.3 is-extglob: 1.0.0 is-glob: 2.0.1 + dev: false - parse-graphql@1.0.0: {} + /parse-graphql@1.0.0: + resolution: {integrity: sha512-NjvQHHaiPCxPZrhm/kKnorxOv7r/eA+tE0VW5E8iJMH9wTqFA1V0YK/7nbpxVu3JdXUxyWTKMez9lsHUtAwa0w==} + dev: true - parse-json@2.2.0: + /parse-json@2.2.0: + resolution: {integrity: sha512-QR/GGaKCkhwk1ePQNYDRKYZ3mwU9ypsKhB0XyFnLQdomyEqk3e8wpW3V5Jp88zbxK4n5ST1nqo+g9juTpownhQ==} + engines: {node: '>=0.10.0'} dependencies: error-ex: 1.3.2 + dev: false - parse-json@4.0.0: + /parse-json@4.0.0: + resolution: {integrity: sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==} + engines: {node: '>=4'} dependencies: error-ex: 1.3.2 json-parse-better-errors: 1.0.2 + dev: true - parse-json@5.2.0: + /parse-json@5.2.0: + resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} + engines: {node: '>=8'} dependencies: '@babel/code-frame': 7.23.5 error-ex: 1.3.2 json-parse-even-better-errors: 2.3.1 lines-and-columns: 1.2.4 - parse-passwd@1.0.0: {} + /parse-passwd@1.0.0: + resolution: {integrity: sha512-1Y1A//QUXEZK7YKz+rD9WydcE1+EuPr6ZBgKecAB8tmoW6UFv0NREVJe1p+jRxtThkcbbKkfwIbWJe/IeE6m2Q==} + engines: {node: '>=0.10.0'} + dev: true - passport-jwt@4.0.1: + /passport-jwt@4.0.1: + resolution: {integrity: sha512-UCKMDYhNuGOBE9/9Ycuoyh7vP6jpeTp/+sfMJl7nLff/t6dps+iaeE0hhNkKN8/HZHcJ7lCdOyDxHdDoxoSvdQ==} dependencies: jsonwebtoken: 9.0.2 passport-strategy: 1.0.0 + dev: false - passport-local@1.0.0: + /passport-local@1.0.0: + resolution: {integrity: sha512-9wCE6qKznvf9mQYYbgJ3sVOHmCWoUNMVFoZzNoznmISbhnNNPhN9xfY3sLmScHMetEJeoY7CXwfhCe7argfQow==} + engines: {node: '>= 0.4.0'} dependencies: passport-strategy: 1.0.0 + dev: false - passport-strategy@1.0.0: {} + /passport-strategy@1.0.0: + resolution: {integrity: sha512-CB97UUvDKJde2V0KDWWB3lyf6PC3FaZP7YxZ2G8OAtn9p4HI9j9JLP9qjOGZFvyl8uwNT8qM+hGnz/n16NI7oA==} + engines: {node: '>= 0.4.0'} + dev: false - passport@0.7.0: + /passport@0.7.0: + resolution: {integrity: sha512-cPLl+qZpSc+ireUvt+IzqbED1cHHkDoVYMo30jbJIdOOjQ1MQYZBPiNvmi8UM6lJuOpTPXJGZQk0DtC4y61MYQ==} + engines: {node: '>= 0.4.0'} dependencies: passport-strategy: 1.0.0 pause: 0.0.1 utils-merge: 1.0.1 + dev: false - path-dirname@1.0.2: {} + /path-dirname@1.0.2: + resolution: {integrity: sha512-ALzNPpyNq9AqXMBjeymIjFDAkAFH06mHJH/cSBHAgU0s4vfpBn6b2nf8tiRLvagKD8RbTpq2FKTBg7cl9l3c7Q==} + dev: false - path-exists@2.1.0: + /path-exists@2.1.0: + resolution: {integrity: sha512-yTltuKuhtNeFJKa1PiRzfLAU5182q1y4Eb4XCJ3PBqyzEDkAZRzBrKKBct682ls9reBVHf9udYLN5Nd+K1B9BQ==} + engines: {node: '>=0.10.0'} dependencies: pinkie-promise: 2.0.1 + dev: false - path-exists@3.0.0: {} + /path-exists@3.0.0: + resolution: {integrity: sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==} + engines: {node: '>=4'} + dev: true - path-exists@4.0.0: {} + /path-exists@4.0.0: + resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} + engines: {node: '>=8'} - path-exists@5.0.0: {} + /path-exists@5.0.0: + resolution: {integrity: sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dev: true - path-is-absolute@1.0.1: {} + /path-is-absolute@1.0.1: + resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} + engines: {node: '>=0.10.0'} - path-key@3.1.1: {} + /path-key@3.1.1: + resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} + engines: {node: '>=8'} - path-key@4.0.0: {} + /path-key@4.0.0: + resolution: {integrity: sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==} + engines: {node: '>=12'} + dev: true - path-parse@1.0.7: {} + /path-parse@1.0.7: + resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} - path-scurry@1.10.1: + /path-scurry@1.10.1: + resolution: {integrity: sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ==} + engines: {node: '>=16 || 14 >=14.17'} dependencies: lru-cache: 10.2.0 minipass: 7.0.4 - path-to-regexp@3.2.0: {} + /path-to-regexp@3.2.0: + resolution: {integrity: sha512-jczvQbCUS7XmS7o+y1aEO9OBVFeZBQ1MDSEqmO7xSoPgOPoowY/SxLpZ6Vh97/8qHZOteiCKb7gkG9gA2ZUxJA==} - path-to-regexp@6.2.1: {} + /path-to-regexp@6.2.1: + resolution: {integrity: sha512-JLyh7xT1kizaEvcaXOQwOc2/Yhw6KZOvPf1S8401UyLk86CU79LN3vl7ztXGm/pZ+YjoyAJ4rxmHwbkBXJX+yw==} + dev: false - path-type@1.1.0: + /path-type@1.1.0: + resolution: {integrity: sha512-S4eENJz1pkiQn9Znv33Q+deTOKmbl+jj1Fl+qiP/vYezj+S8x+J3Uo0ISrx/QoEvIlOaDWJhPaRd1flJ9HXZqg==} + engines: {node: '>=0.10.0'} dependencies: graceful-fs: 4.2.11 pify: 2.3.0 pinkie-promise: 2.0.1 + dev: false - path-type@3.0.0: + /path-type@3.0.0: + resolution: {integrity: sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==} + engines: {node: '>=4'} dependencies: pify: 3.0.0 + dev: true - path-type@4.0.0: {} + /path-type@4.0.0: + resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} + engines: {node: '>=8'} + dev: true - pause@0.0.1: {} + /pause@0.0.1: + resolution: {integrity: sha512-KG8UEiEVkR3wGEb4m5yZkVCzigAD+cVEJck2CzYZO37ZGJfctvVptVO192MwrtPhzONn6go8ylnOdMhKqi4nfg==} + dev: false - peek-stream@1.1.3: + /peek-stream@1.1.3: + resolution: {integrity: sha512-FhJ+YbOSBb9/rIl2ZeE/QHEsWn7PqNYt8ARAY3kIgNGOk13g9FGyIY6JIl/xB/3TFRVoTv5as0l11weORrTekA==} dependencies: buffer-from: 1.1.2 duplexify: 3.7.1 through2: 2.0.5 + dev: false - phin@3.7.0: + /phin@3.7.0: + resolution: {integrity: sha512-DqnVNrpYhKGBZppNKprD+UJylMeEKOZxHgPB+ZP6mGzf3uA2uox4Ep9tUm+rUc8WLIdHT3HcAE4X8fhwQA9JKg==} + engines: {node: '>= 8'} + deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. dependencies: centra: 2.6.0 + dev: true - picocolors@1.0.0: {} + /picocolors@1.0.0: + resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} - picomatch@2.3.1: {} + /picomatch@2.3.1: + resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} + engines: {node: '>=8.6'} - pify@2.3.0: {} + /pify@2.3.0: + resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==} + engines: {node: '>=0.10.0'} - pify@3.0.0: {} + /pify@3.0.0: + resolution: {integrity: sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==} + engines: {node: '>=4'} + dev: true - pinkie-promise@2.0.1: + /pinkie-promise@2.0.1: + resolution: {integrity: sha512-0Gni6D4UcLTbv9c57DfxDGdr41XfgUjqWZu492f0cIGr16zDU06BWP/RAEvOuo7CQ0CNjHaLlM59YJJFm3NWlw==} + engines: {node: '>=0.10.0'} dependencies: pinkie: 2.0.4 + dev: false - pinkie@2.0.4: {} + /pinkie@2.0.4: + resolution: {integrity: sha512-MnUuEycAemtSaeFSjXKW/aroV7akBbY+Sv+RkyqFjgAe73F+MR0TBWKBRDkmfWq/HiFmdavfZ1G7h4SPZXaCSg==} + engines: {node: '>=0.10.0'} + dev: false - pino-abstract-transport@1.1.0: + /pino-abstract-transport@1.1.0: + resolution: {integrity: sha512-lsleG3/2a/JIWUtf9Q5gUNErBqwIu1tUKTT3dUzaf5DySw9ra1wcqKjJjLX1VTY64Wk1eEOYsVGSaGfCK85ekA==} dependencies: readable-stream: 4.5.2 split2: 4.2.0 + dev: false - pino-http@9.0.0: + /pino-http@9.0.0: + resolution: {integrity: sha512-Q9QDNEz0vQmbJtMFjOVr2c9yL92vHudjmr3s3m6J1hbw3DBGFZJm3TIj9TWyynZ4GEsEA9SOtni4heRUr6lNOg==} dependencies: get-caller-file: 2.0.5 pino: 8.18.0 pino-std-serializers: 6.2.2 process-warning: 3.0.0 + dev: false - pino-pretty@10.3.1: + /pino-pretty@10.3.1: + resolution: {integrity: sha512-az8JbIYeN/1iLj2t0jR9DV48/LQ3RC6hZPpapKPkb84Q+yTidMCpgWxIT3N0flnBDilyBQ1luWNpOeJptjdp/g==} + hasBin: true dependencies: colorette: 2.0.20 dateformat: 4.6.3 @@ -9543,10 +7238,15 @@ snapshots: secure-json-parse: 2.7.0 sonic-boom: 3.8.0 strip-json-comments: 3.1.1 + dev: false - pino-std-serializers@6.2.2: {} + /pino-std-serializers@6.2.2: + resolution: {integrity: sha512-cHjPPsE+vhj/tnhCy/wiMh3M3z3h/j15zHQX+S9GkTBgqJuTuJzYJ4gUyACLhDaJ7kk9ba9iRDmbH2tJU03OiA==} + dev: false - pino@8.18.0: + /pino@8.18.0: + resolution: {integrity: sha512-Mz/gKiRyuXu4HnpHgi1YWdHQCoWMufapzooisvFn78zl4dZciAxS+YeRkUxXl1ee/SzU80YCz1zpECCh4oC6Aw==} + hasBin: true dependencies: atomic-sleep: 1.0.0 fast-redact: 3.3.0 @@ -9559,173 +7259,294 @@ snapshots: safe-stable-stringify: 2.4.3 sonic-boom: 3.8.0 thread-stream: 2.4.1 + dev: false - pirates@4.0.6: {} + /pirates@4.0.6: + resolution: {integrity: sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==} + engines: {node: '>= 6'} - pkg-conf@1.1.3: + /pkg-conf@1.1.3: + resolution: {integrity: sha512-9hHgE5+Xai/ChrnahNP8Ke0VNF/s41IZIB/d24eMHEaRamdPg+wwlRm2lTb5wMvE8eTIKrYZsrxfuOwt3dpsIQ==} + engines: {node: '>=0.10.0'} dependencies: find-up: 1.1.2 load-json-file: 1.1.0 object-assign: 4.1.1 symbol: 0.2.3 + dev: false - pkg-dir@4.2.0: + /pkg-dir@4.2.0: + resolution: {integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==} + engines: {node: '>=8'} dependencies: find-up: 4.1.0 - pluralize-esm@9.0.5: {} + /pluralize-esm@9.0.5: + resolution: {integrity: sha512-Kb2dcpMsIutFw2hYrN0EhsAXOUJTd6FVMIxvNAkZCMQLVt9NGZqQczvGpYDxNWCZeCWLHUPxQIBudWzt1h7VVA==} + engines: {node: '>=14.0.0'} + dev: true - pluralize@8.0.0: {} + /pluralize@8.0.0: + resolution: {integrity: sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==} + engines: {node: '>=4'} + dev: true - polka@0.5.2: + /polka@0.5.2: + resolution: {integrity: sha512-FVg3vDmCqP80tOrs+OeNlgXYmFppTXdjD5E7I4ET1NjvtNmQrb1/mJibybKkb/d4NA7YWAr1ojxuhpL3FHqdlw==} dependencies: '@polka/url': 0.5.0 trouter: 2.0.1 + dev: true - prelude-ls@1.2.1: {} + /prelude-ls@1.2.1: + resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} + engines: {node: '>= 0.8.0'} + dev: true - preserve@0.2.0: {} + /preserve@0.2.0: + resolution: {integrity: sha512-s/46sYeylUfHNjI+sA/78FAHlmIuKqI9wNnzEOGehAlUUYeObv5C2mOinXBjyUyWmJ2SfcS2/ydApH4hTF4WXQ==} + engines: {node: '>=0.10.0'} + dev: false - prettier-linter-helpers@1.0.0: + /prettier-linter-helpers@1.0.0: + resolution: {integrity: sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==} + engines: {node: '>=6.0.0'} dependencies: fast-diff: 1.3.0 + dev: true - prettier@2.8.8: {} + /prettier@2.8.8: + resolution: {integrity: sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==} + engines: {node: '>=10.13.0'} + hasBin: true + dev: true - prettier@3.0.0: {} + /prettier@3.0.0: + resolution: {integrity: sha512-zBf5eHpwHOGPC47h0zrPyNn+eAEIdEzfywMoYn2XPi0P44Zp0tSq64rq0xAREh4auw2cJZHo9QUob+NqCQky4g==} + engines: {node: '>=14'} + hasBin: true + dev: true - pretty-format@29.7.0: + /pretty-format@29.7.0: + resolution: {integrity: sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: '@jest/schemas': 29.6.3 ansi-styles: 5.2.0 react-is: 18.2.0 - prisma-nested-middleware@4.0.0(@prisma/client@5.10.2): + /prisma-nested-middleware@4.0.0(@prisma/client@5.10.2): + resolution: {integrity: sha512-WSx0nl7KNXEzGaNC87fuDBOdAjj3V6um/JoQUo24PaMzMy8tvOYfb2Mw25OZhnrMXNTBhqgk4rJTUW3CVcDsHQ==} + peerDependencies: + '@prisma/client': '*' dependencies: '@open-draft/deferred-promise': 2.2.0 '@prisma/client': 5.10.2(prisma@5.10.2) lodash: 4.17.21 + dev: false - prisma-soft-delete-middleware@1.3.1(@prisma/client@5.10.2): + /prisma-soft-delete-middleware@1.3.1(@prisma/client@5.10.2): + resolution: {integrity: sha512-oQ2Ba8wb23ho6PqMXkOSTQTXNKouLmZuILYDHrnKk1Ui3cGIXuj9zNWyJkoaTcWHznsiAaoP1Oy8ytDhwQNQqA==} + peerDependencies: + '@prisma/client': '*' dependencies: '@prisma/client': 5.10.2(prisma@5.10.2) prisma-nested-middleware: 4.0.0(@prisma/client@5.10.2) + dev: false - prisma@5.10.2: + /prisma@5.10.2: + resolution: {integrity: sha512-hqb/JMz9/kymRE25pMWCxkdyhbnIWrq+h7S6WysJpdnCvhstbJSNP/S6mScEcqiB8Qv2F+0R3yG+osRaWqZacQ==} + engines: {node: '>=16.13'} + hasBin: true + requiresBuild: true dependencies: '@prisma/engines': 5.10.2 - process-nextick-args@1.0.7: {} + /process-nextick-args@1.0.7: + resolution: {integrity: sha512-yN0WQmuCX63LP/TMvAg31nvT6m4vDqJEiiv2CAZqWOGNWutc9DfDk1NPYYmKUFmaVM2UwDowH4u5AHWYP/jxKw==} + dev: false - process-nextick-args@2.0.1: {} + /process-nextick-args@2.0.1: + resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} - process-warning@3.0.0: {} + /process-warning@3.0.0: + resolution: {integrity: sha512-mqn0kFRl0EoqhnL0GQ0veqFHyIN1yig9RHh/InzORTUiZHFRAur+aMtRkELNwGs9aNwKS6tg/An4NYBPGwvtzQ==} + dev: false - process@0.11.10: {} + /process@0.11.10: + resolution: {integrity: sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==} + engines: {node: '>= 0.6.0'} + dev: false - promise-coalesce@1.1.2: {} + /promise-coalesce@1.1.2: + resolution: {integrity: sha512-zLaJ9b8hnC564fnJH6NFSOGZYYdzrAJn2JUUIwzoQb32fG2QAakpDNM+CZo1km6keXkRXRM+hml1BFAPVnPkxg==} + engines: {node: '>=16'} + dev: false - promise-inflight@1.0.1: {} + /promise-inflight@1.0.1: + resolution: {integrity: sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==} + peerDependencies: + bluebird: '*' + peerDependenciesMeta: + bluebird: + optional: true + dev: false - promise-retry@2.0.1: + /promise-retry@2.0.1: + resolution: {integrity: sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==} + engines: {node: '>=10'} dependencies: err-code: 2.0.3 retry: 0.12.0 + dev: false - prompts@2.4.2: + /prompts@2.4.2: + resolution: {integrity: sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==} + engines: {node: '>= 6'} dependencies: kleur: 3.0.3 sisteransi: 1.0.5 - proxy-addr@2.0.7: + /proxy-addr@2.0.7: + resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==} + engines: {node: '>= 0.10'} dependencies: forwarded: 0.2.0 ipaddr.js: 1.9.1 + dev: false - proxy-from-env@1.1.0: {} + /proxy-from-env@1.1.0: + resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} + dev: false - pump@3.0.0: + /pump@3.0.0: + resolution: {integrity: sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==} dependencies: end-of-stream: 1.4.4 once: 1.4.0 - pumpify@2.0.1: + /pumpify@2.0.1: + resolution: {integrity: sha512-m7KOje7jZxrmutanlkS1daj1dS6z6BgslzOXmcSEpIlCxM3VJH7lG5QLeck/6hgF6F4crFf01UtQmNsJfweTAw==} dependencies: duplexify: 4.1.2 inherits: 2.0.4 pump: 3.0.0 + dev: false - punycode@2.3.1: {} + /punycode@2.3.1: + resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} + engines: {node: '>=6'} - pure-rand@6.0.4: {} + /pure-rand@6.0.4: + resolution: {integrity: sha512-LA0Y9kxMYv47GIPJy6MI84fqTd2HmYZI83W/kM/SkKfDlajnZYfmXFTxkbY+xSBPkLJxltMa9hIkmdc29eguMA==} - q@1.5.1: {} + /q@1.5.1: + resolution: {integrity: sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==} + engines: {node: '>=0.6.0', teleport: '>=0.2.0'} + dev: true - qs@6.11.2: + /qs@6.11.2: + resolution: {integrity: sha512-tDNIz22aBzCDxLtVH++VnTfzxlfeK5CbqohpSqpJgj1Wg/cQbStNAz3NuqCs5vV+pjBsK4x4pN9HlVh7rcYRiA==} + engines: {node: '>=0.6'} dependencies: side-channel: 1.0.5 + dev: true - queue-microtask@1.2.3: {} + /queue-microtask@1.2.3: + resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + dev: true - quick-format-unescaped@4.0.4: {} + /quick-format-unescaped@4.0.4: + resolution: {integrity: sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg==} + dev: false - quick-lru@4.0.1: {} + /quick-lru@4.0.1: + resolution: {integrity: sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==} + engines: {node: '>=8'} + dev: true - randomatic@3.1.1: + /randomatic@3.1.1: + resolution: {integrity: sha512-TuDE5KxZ0J461RVjrJZCJc+J+zCkTb1MbH9AQUq68sMhOMcy9jLcb3BrZKgp9q9Ncltdg4QVqWrH02W2EFFVYw==} + engines: {node: '>= 0.10.0'} dependencies: is-number: 4.0.0 kind-of: 6.0.3 math-random: 1.0.4 + dev: false - randombytes@2.1.0: + /randombytes@2.1.0: + resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} dependencies: safe-buffer: 5.2.1 + dev: true - react-is@18.2.0: {} + /react-is@18.2.0: + resolution: {integrity: sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==} - read-pkg-up@1.0.1: + /read-pkg-up@1.0.1: + resolution: {integrity: sha512-WD9MTlNtI55IwYUS27iHh9tK3YoIVhxis8yKhLpTqWtml739uXc9NWTpxoHkfZf3+DkCCsXox94/VWZniuZm6A==} + engines: {node: '>=0.10.0'} dependencies: find-up: 1.1.2 read-pkg: 1.1.0 + dev: false - read-pkg-up@3.0.0: + /read-pkg-up@3.0.0: + resolution: {integrity: sha512-YFzFrVvpC6frF1sz8psoHDBGF7fLPc+llq/8NB43oagqWkx8ar5zYtsTORtOjw9W2RHLpWP+zTWwBvf1bCmcSw==} + engines: {node: '>=4'} dependencies: find-up: 2.1.0 read-pkg: 3.0.0 + dev: true - read-pkg-up@7.0.1: + /read-pkg-up@7.0.1: + resolution: {integrity: sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==} + engines: {node: '>=8'} dependencies: find-up: 4.1.0 read-pkg: 5.2.0 type-fest: 0.8.1 + dev: true - read-pkg@1.1.0: + /read-pkg@1.1.0: + resolution: {integrity: sha512-7BGwRHqt4s/uVbuyoeejRn4YmFnYZiFl4AuaeXHlgZf3sONF0SOGlxs2Pw8g6hCKupo08RafIO5YXFNOKTfwsQ==} + engines: {node: '>=0.10.0'} dependencies: load-json-file: 1.1.0 normalize-package-data: 2.5.0 path-type: 1.1.0 + dev: false - read-pkg@3.0.0: + /read-pkg@3.0.0: + resolution: {integrity: sha512-BLq/cCO9two+lBgiTYNqD6GdtK8s4NpaWrl6/rCO9w0TUS8oJl7cmToOZfRYllKTISY6nt1U7jQ53brmKqY6BA==} + engines: {node: '>=4'} dependencies: load-json-file: 4.0.0 normalize-package-data: 2.5.0 path-type: 3.0.0 + dev: true - read-pkg@5.2.0: + /read-pkg@5.2.0: + resolution: {integrity: sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==} + engines: {node: '>=8'} dependencies: '@types/normalize-package-data': 2.4.4 normalize-package-data: 2.5.0 parse-json: 5.2.0 type-fest: 0.6.0 + dev: true - readable-stream@1.0.34: + /readable-stream@1.0.34: + resolution: {integrity: sha512-ok1qVCJuRkNmvebYikljxJA/UEsKwLl2nI1OmaqAu4/UE+h0wKCHok4XkL/gvi39OacXvw59RJUOFUkDib2rHg==} dependencies: core-util-is: 1.0.3 inherits: 2.0.4 isarray: 0.0.1 string_decoder: 0.10.31 + dev: false - readable-stream@2.0.6: + /readable-stream@2.0.6: + resolution: {integrity: sha512-TXcFfb63BQe1+ySzsHZI/5v1aJPCShfqvWJ64ayNImXMsN1Cd0YGk/wm8KB7/OeessgPc9QvS9Zou8QTkFzsLw==} dependencies: core-util-is: 1.0.3 inherits: 2.0.4 @@ -9733,8 +7554,10 @@ snapshots: process-nextick-args: 1.0.7 string_decoder: 0.10.31 util-deprecate: 1.0.2 + dev: false - readable-stream@2.3.8: + /readable-stream@2.3.8: + resolution: {integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==} dependencies: core-util-is: 1.0.3 inherits: 2.0.4 @@ -9744,150 +7567,259 @@ snapshots: string_decoder: 1.1.1 util-deprecate: 1.0.2 - readable-stream@3.6.2: + /readable-stream@3.6.2: + resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} + engines: {node: '>= 6'} dependencies: inherits: 2.0.4 string_decoder: 1.3.0 util-deprecate: 1.0.2 - readable-stream@4.5.2: + /readable-stream@4.5.2: + resolution: {integrity: sha512-yjavECdqeZ3GLXNgRXgeQEdz9fvDDkNKyHnbHRFtOr7/LcfgBcmct7t/ET+HaCTqfh06OzoAxrkN/IfjJBVe+g==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dependencies: abort-controller: 3.0.0 buffer: 6.0.3 events: 3.3.0 process: 0.11.10 string_decoder: 1.3.0 + dev: false - readdirp@3.6.0: + /readdirp@3.6.0: + resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} + engines: {node: '>=8.10.0'} dependencies: picomatch: 2.3.1 + dev: true - real-require@0.2.0: {} + /real-require@0.2.0: + resolution: {integrity: sha512-57frrGM/OCTLqLOAh0mhVA9VBMHd+9U7Zb2THMGdBUoZVOtGbJzjxsYGDJ3A9AYYCP4hn6y1TVbaOfzWtm5GFg==} + engines: {node: '>= 12.13.0'} + dev: false - rechoir@0.6.2: + /rechoir@0.6.2: + resolution: {integrity: sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==} + engines: {node: '>= 0.10'} dependencies: resolve: 1.22.8 + dev: true - redent@3.0.0: + /redent@3.0.0: + resolution: {integrity: sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==} + engines: {node: '>=8'} dependencies: indent-string: 4.0.0 strip-indent: 3.0.0 + dev: true - reflect-metadata@0.1.13: {} + /reflect-metadata@0.1.13: + resolution: {integrity: sha512-Ts1Y/anZELhSsjMcU605fU9RE4Oi3p5ORujwbIKXfWa+0Zxs510Qrmrce5/Jowq3cHSZSJqBjypxmHarc+vEWg==} - regex-cache@0.4.4: + /regex-cache@0.4.4: + resolution: {integrity: sha512-nVIZwtCjkC9YgvWkpM55B5rBhBYRZhAaJbgcFYXXsHnbZ9UZI9nnVWYZpBlCqv9ho2eZryPnWrZGsOdPwVWXWQ==} + engines: {node: '>=0.10.0'} dependencies: is-equal-shallow: 0.1.3 + dev: false - remove-trailing-separator@1.1.0: {} + /remove-trailing-separator@1.1.0: + resolution: {integrity: sha512-/hS+Y0u3aOfIETiaiirUFwDBDzmXPvO+jAfKTitUngIPzdKc6Z0LoFjM/CK5PL4C+eKwHohlHAb6H0VFfmmUsw==} + dev: false - repeat-element@1.1.4: {} + /repeat-element@1.1.4: + resolution: {integrity: sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ==} + engines: {node: '>=0.10.0'} + dev: false - repeat-string@1.6.1: {} + /repeat-string@1.6.1: + resolution: {integrity: sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==} + engines: {node: '>=0.10'} - replace-ext@0.0.1: {} + /replace-ext@0.0.1: + resolution: {integrity: sha512-AFBWBy9EVRTa/LhEcG8QDP3FvpwZqmvN2QFDuJswFeaVhWnZMp8q3E6Zd90SR04PlIwfGdyVjNyLPyen/ek5CQ==} + engines: {node: '>= 0.4'} + dev: false - require-directory@2.1.1: {} + /require-directory@2.1.1: + resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} + engines: {node: '>=0.10.0'} - require-from-string@2.0.2: {} + /require-from-string@2.0.2: + resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} + engines: {node: '>=0.10.0'} - require-main-filename@1.0.1: {} + /require-main-filename@1.0.1: + resolution: {integrity: sha512-IqSUtOVP4ksd1C/ej5zeEh/BIP2ajqpn8c5x+q99gvcIG/Qf0cud5raVnE/Dwd0ua9TXYDoDc0RE5hBSdz22Ug==} + dev: false - resolve-cwd@3.0.0: + /resolve-cwd@3.0.0: + resolution: {integrity: sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==} + engines: {node: '>=8'} dependencies: resolve-from: 5.0.0 - resolve-dir@1.0.1: + /resolve-dir@1.0.1: + resolution: {integrity: sha512-R7uiTjECzvOsWSfdM0QKFNBVFcK27aHOUwdvK53BcW8zqnGdYp0Fbj82cy54+2A4P2tFM22J5kRfe1R+lM/1yg==} + engines: {node: '>=0.10.0'} dependencies: expand-tilde: 2.0.2 global-modules: 1.0.0 + dev: true - resolve-from@4.0.0: {} + /resolve-from@4.0.0: + resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} + engines: {node: '>=4'} + dev: true - resolve-from@5.0.0: {} + /resolve-from@5.0.0: + resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} + engines: {node: '>=8'} - resolve-url@0.2.1: {} + /resolve-url@0.2.1: + resolution: {integrity: sha512-ZuF55hVUQaaczgOIwqWzkEcEidmlD/xl44x1UZnhOXcYuFN2S6+rcxpG+C1N3So0wvNI3DmJICUFfu2SxhBmvg==} + deprecated: https://github.com/lydell/resolve-url#deprecated + dev: false - resolve.exports@2.0.2: {} + /resolve.exports@2.0.2: + resolution: {integrity: sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg==} + engines: {node: '>=10'} - resolve@1.22.8: + /resolve@1.22.8: + resolution: {integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==} + hasBin: true dependencies: is-core-module: 2.13.1 path-parse: 1.0.7 supports-preserve-symlinks-flag: 1.0.0 - restore-cursor@3.1.0: + /restore-cursor@3.1.0: + resolution: {integrity: sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==} + engines: {node: '>=8'} dependencies: onetime: 5.1.2 signal-exit: 3.0.7 - ret@0.2.2: {} + /ret@0.2.2: + resolution: {integrity: sha512-M0b3YWQs7R3Z917WRQy1HHA7Ba7D8hvZg6UE5mLykJxQVE2ju0IXbGlaHPPlkY+WN7wFP+wUMXmBFA0aV6vYGQ==} + engines: {node: '>=4'} + dev: false - retry@0.12.0: {} + /retry@0.12.0: + resolution: {integrity: sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==} + engines: {node: '>= 4'} + dev: false - reusify@1.0.4: {} + /reusify@1.0.4: + resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} + engines: {iojs: '>=1.0.0', node: '>=0.10.0'} - rfdc@1.3.1: {} + /rfdc@1.3.1: + resolution: {integrity: sha512-r5a3l5HzYlIC68TpmYKlxWjmOP6wiPJ1vWv2HeLhNsRZMrCkxeqxiHlQ21oXmQ4F3SiryXBHhAD7JZqvOJjFmg==} + dev: false - rimraf@3.0.2: + /rimraf@3.0.2: + resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} + hasBin: true dependencies: glob: 7.2.3 - rimraf@4.4.1: + /rimraf@4.4.1: + resolution: {integrity: sha512-Gk8NlF062+T9CqNGn6h4tls3k6T1+/nXdOcSZVikNVtlRdYpA7wRJJMoXmuvOnLW844rPjdQ7JgXCYM6PPC/og==} + engines: {node: '>=14'} + hasBin: true dependencies: glob: 9.3.5 + dev: true - run-async@2.4.1: {} + /run-async@2.4.1: + resolution: {integrity: sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==} + engines: {node: '>=0.12.0'} + dev: true - run-parallel@1.2.0: + /run-parallel@1.2.0: + resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} dependencies: queue-microtask: 1.2.3 + dev: true - rxjs@6.6.7: + /rxjs@6.6.7: + resolution: {integrity: sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==} + engines: {npm: '>=2.0.0'} dependencies: tslib: 1.14.1 + dev: false - rxjs@7.8.1: + /rxjs@7.8.1: + resolution: {integrity: sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==} dependencies: tslib: 2.6.2 - safe-buffer@5.1.2: {} + /safe-buffer@5.1.2: + resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} - safe-buffer@5.2.1: {} + /safe-buffer@5.2.1: + resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} - safe-regex2@2.0.0: + /safe-regex2@2.0.0: + resolution: {integrity: sha512-PaUSFsUaNNuKwkBijoAPHAK6/eM6VirvyPWlZ7BAQy4D+hCvh4B6lIG+nPdhbFfIbP+gTGBcrdsOaUs0F+ZBOQ==} dependencies: ret: 0.2.2 + dev: false - safe-stable-stringify@2.4.3: {} + /safe-stable-stringify@2.4.3: + resolution: {integrity: sha512-e2bDA2WJT0wxseVd4lsDP4+3ONX6HpMXQa1ZhFQ7SU+GjvORCmShbCMltrtIDfkYhVHrOcPtj+KhmDBdPdZD1g==} + engines: {node: '>=10'} + dev: false - safer-buffer@2.1.2: {} + /safer-buffer@2.1.2: + resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} - schema-utils@3.3.0: + /schema-utils@3.3.0: + resolution: {integrity: sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==} + engines: {node: '>= 10.13.0'} dependencies: '@types/json-schema': 7.0.15 ajv: 6.12.6 ajv-keywords: 3.5.2(ajv@6.12.6) + dev: true - secure-json-parse@2.7.0: {} + /secure-json-parse@2.7.0: + resolution: {integrity: sha512-6aU+Rwsezw7VR8/nyvKTx8QpWH9FrcYiXXlqC4z5d5XQBDRqtbfsRjnwGyqbi3gddNtWHuEk9OANUotL26qKUw==} + dev: false - semver@5.7.2: {} + /semver@5.7.2: + resolution: {integrity: sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==} + hasBin: true - semver@6.3.1: {} + /semver@6.3.1: + resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} + hasBin: true - semver@7.6.0: + /semver@7.6.0: + resolution: {integrity: sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==} + engines: {node: '>=10'} + hasBin: true dependencies: lru-cache: 6.0.0 - serialize-javascript@6.0.2: + /serialize-javascript@6.0.2: + resolution: {integrity: sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==} dependencies: randombytes: 2.1.0 + dev: true - set-blocking@2.0.0: {} + /set-blocking@2.0.0: + resolution: {integrity: sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==} + dev: false - set-cookie-parser@2.6.0: {} + /set-cookie-parser@2.6.0: + resolution: {integrity: sha512-RVnVQxTXuerk653XfuliOxBP81Sf0+qfQE73LIYKcyMYHG94AuH0kgrQpRDuTZnSmjpysHmzxJXKNfa6PjFhyQ==} + dev: false - set-function-length@1.2.1: + /set-function-length@1.2.1: + resolution: {integrity: sha512-j4t6ccc+VsKwYHso+kElc5neZpjtq9EnRICFZtWyBsLojhmeF/ZBd/elqm22WJh/BziDe/SBiOeAt0m2mfLD0g==} + engines: {node: '>= 0.4'} dependencies: define-data-property: 1.1.2 es-errors: 1.3.0 @@ -9895,120 +7827,192 @@ snapshots: get-intrinsic: 1.2.4 gopd: 1.0.1 has-property-descriptors: 1.0.1 + dev: true - setprototypeof@1.2.0: {} + /setprototypeof@1.2.0: + resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} + dev: false - shebang-command@2.0.0: + /shebang-command@2.0.0: + resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} + engines: {node: '>=8'} dependencies: shebang-regex: 3.0.0 - shebang-regex@3.0.0: {} + /shebang-regex@3.0.0: + resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} + engines: {node: '>=8'} - shelljs@0.8.5: + /shelljs@0.8.5: + resolution: {integrity: sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==} + engines: {node: '>=4'} + hasBin: true dependencies: glob: 7.2.3 interpret: 1.4.0 rechoir: 0.6.2 + dev: true - side-channel@1.0.5: + /side-channel@1.0.5: + resolution: {integrity: sha512-QcgiIWV4WV7qWExbN5llt6frQB/lBven9pqliLXfGPB+K9ZYXxDozp0wLkHS24kWCm+6YXH/f0HhnObZnZOBnQ==} + engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.6 es-errors: 1.3.0 get-intrinsic: 1.2.4 object-inspect: 1.13.1 + dev: true - signal-exit@3.0.7: {} + /signal-exit@3.0.7: + resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} - signal-exit@4.1.0: {} + /signal-exit@4.1.0: + resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} + engines: {node: '>=14'} - sisteransi@1.0.5: {} + /sisteransi@1.0.5: + resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} - slash@3.0.0: {} + /slash@3.0.0: + resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} + engines: {node: '>=8'} - smart-buffer@4.2.0: {} + /smart-buffer@4.2.0: + resolution: {integrity: sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==} + engines: {node: '>= 6.0.0', npm: '>= 3.0.0'} + dev: false - socks-proxy-agent@7.0.0: + /socks-proxy-agent@7.0.0: + resolution: {integrity: sha512-Fgl0YPZ902wEsAyiQ+idGd1A7rSFx/ayC1CQVMw5P+EQx2V0SgpGtf6OKFhVjPflPUl9YMmEOnmfjCdMUsygww==} + engines: {node: '>= 10'} dependencies: agent-base: 6.0.2 debug: 4.3.4 socks: 2.8.3 transitivePeerDependencies: - supports-color + dev: false - socks@2.8.3: + /socks@2.8.3: + resolution: {integrity: sha512-l5x7VUUWbjVFbafGLxPWkYsHIhEvmF85tbIeFZWc8ZPtoMyybuEhL7Jye/ooC4/d48FgOjSJXgsF/AJPYCW8Zw==} + engines: {node: '>= 10.0.0', npm: '>= 3.0.0'} dependencies: ip-address: 9.0.5 smart-buffer: 4.2.0 + dev: false - sonic-boom@3.8.0: + /sonic-boom@3.8.0: + resolution: {integrity: sha512-ybz6OYOUjoQQCQ/i4LU8kaToD8ACtYP+Cj5qd2AO36bwbdewxWJ3ArmJ2cr6AvxlL2o0PqnCcPGUgkILbfkaCA==} dependencies: atomic-sleep: 1.0.0 + dev: false - source-map-resolve@0.5.3: + /source-map-resolve@0.5.3: + resolution: {integrity: sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==} + deprecated: See https://github.com/lydell/source-map-resolve#deprecated dependencies: atob: 2.1.2 decode-uri-component: 0.2.2 resolve-url: 0.2.1 source-map-url: 0.4.1 urix: 0.1.0 + dev: false - source-map-support@0.5.13: + /source-map-support@0.5.13: + resolution: {integrity: sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==} dependencies: buffer-from: 1.1.2 source-map: 0.6.1 - source-map-support@0.5.21: + /source-map-support@0.5.21: + resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} dependencies: buffer-from: 1.1.2 source-map: 0.6.1 + dev: true - source-map-url@0.4.1: {} + /source-map-url@0.4.1: + resolution: {integrity: sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw==} + deprecated: See https://github.com/lydell/source-map-url#deprecated + dev: false - source-map@0.6.1: {} + /source-map@0.6.1: + resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} + engines: {node: '>=0.10.0'} - source-map@0.7.3: {} + /source-map@0.7.3: + resolution: {integrity: sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==} + engines: {node: '>= 8'} + dev: false - source-map@0.7.4: {} + /source-map@0.7.4: + resolution: {integrity: sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==} + engines: {node: '>= 8'} + dev: true - sourcemap-codec@1.4.8: {} + /sourcemap-codec@1.4.8: + resolution: {integrity: sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==} + deprecated: Please use @jridgewell/sourcemap-codec instead + dev: false - spdx-correct@3.2.0: + /spdx-correct@3.2.0: + resolution: {integrity: sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==} dependencies: spdx-expression-parse: 3.0.1 spdx-license-ids: 3.0.17 - spdx-exceptions@2.4.0: {} + /spdx-exceptions@2.4.0: + resolution: {integrity: sha512-hcjppoJ68fhxA/cjbN4T8N6uCUejN8yFw69ttpqtBeCbF3u13n7mb31NB9jKwGTTWWnt9IbRA/mf1FprYS8wfw==} - spdx-expression-parse@3.0.1: + /spdx-expression-parse@3.0.1: + resolution: {integrity: sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==} dependencies: spdx-exceptions: 2.4.0 spdx-license-ids: 3.0.17 - spdx-license-ids@3.0.17: {} + /spdx-license-ids@3.0.17: + resolution: {integrity: sha512-sh8PWc/ftMqAAdFiBu6Fy6JUOYjqDJBJvIhpfDMyHrr0Rbp5liZqd4TjtQ/RgfLjKFZb+LMx5hpml5qOWy0qvg==} - split2@3.2.2: + /split2@3.2.2: + resolution: {integrity: sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg==} dependencies: readable-stream: 3.6.2 + dev: true - split2@4.2.0: {} + /split2@4.2.0: + resolution: {integrity: sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==} + engines: {node: '>= 10.x'} - split@1.0.1: + /split@1.0.1: + resolution: {integrity: sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg==} dependencies: through: 2.3.8 + dev: true - sprintf-js@1.0.3: {} + /sprintf-js@1.0.3: + resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} - sprintf-js@1.1.3: {} + /sprintf-js@1.1.3: + resolution: {integrity: sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==} + dev: false - ssri@9.0.1: + /ssri@9.0.1: + resolution: {integrity: sha512-o57Wcn66jMQvfHG1FlYbWeZWW/dHZhJXjpIcTfXldXEk5nz5lStPo3mK0OJQfGR3RbZUlbISexbljkJzuEj/8Q==} + engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} dependencies: minipass: 3.3.6 + dev: false - stack-utils@2.0.6: + /stack-utils@2.0.6: + resolution: {integrity: sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==} + engines: {node: '>=10'} dependencies: escape-string-regexp: 2.0.0 - standard-version@9.5.0: + /standard-version@9.5.0: + resolution: {integrity: sha512-3zWJ/mmZQsOaO+fOlsa0+QK90pwhNd042qEcw6hKFNoLFs7peGyvPffpEBbK/DSGPbyOvli0mUIFv5A4qTjh2Q==} + engines: {node: '>=10'} + hasBin: true dependencies: chalk: 2.4.2 conventional-changelog: 3.1.25 @@ -10024,82 +8028,136 @@ snapshots: semver: 7.6.0 stringify-package: 1.0.1 yargs: 16.2.0 + dev: true - statuses@2.0.1: {} + /statuses@2.0.1: + resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==} + engines: {node: '>= 0.8'} + dev: false - stream-shift@1.0.3: {} + /stream-shift@1.0.3: + resolution: {integrity: sha512-76ORR0DO1o1hlKwTbi/DM3EXWGf3ZJYO8cXX5RJwnul2DEg2oyoZyjLNoQM8WsvZiFKCRfC1O0J7iCvie3RZmQ==} + dev: false - string-length@4.0.2: + /string-length@4.0.2: + resolution: {integrity: sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==} + engines: {node: '>=10'} dependencies: char-regex: 1.0.2 strip-ansi: 6.0.1 - string-width@1.0.2: + /string-width@1.0.2: + resolution: {integrity: sha512-0XsVpQLnVCXHJfyEs8tC0zpTVIr5PKKsQtkT29IwupnPTjtPmQ3xT/4yCREF9hYkV/3M3kzcUTSAZT6a6h81tw==} + engines: {node: '>=0.10.0'} dependencies: code-point-at: 1.1.0 is-fullwidth-code-point: 1.0.0 strip-ansi: 3.0.1 + dev: false - string-width@4.2.3: + /string-width@4.2.3: + resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} + engines: {node: '>=8'} dependencies: emoji-regex: 8.0.0 is-fullwidth-code-point: 3.0.0 strip-ansi: 6.0.1 - string-width@5.1.2: + /string-width@5.1.2: + resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} + engines: {node: '>=12'} dependencies: eastasianwidth: 0.2.0 emoji-regex: 9.2.2 strip-ansi: 7.1.0 + dev: false - string_decoder@0.10.31: {} + /string_decoder@0.10.31: + resolution: {integrity: sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==} + dev: false - string_decoder@1.1.1: + /string_decoder@1.1.1: + resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==} dependencies: safe-buffer: 5.1.2 - string_decoder@1.3.0: + /string_decoder@1.3.0: + resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} dependencies: safe-buffer: 5.2.1 - stringify-package@1.0.1: {} + /stringify-package@1.0.1: + resolution: {integrity: sha512-sa4DUQsYciMP1xhKWGuFM04fB0LG/9DlluZoSVywUMRNvzid6XucHK0/90xGxRoHrAaROrcHK1aPKaijCtSrhg==} + deprecated: This module is not used anymore, and has been replaced by @npmcli/package-json + dev: true - strip-ansi@3.0.1: + /strip-ansi@3.0.1: + resolution: {integrity: sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==} + engines: {node: '>=0.10.0'} dependencies: ansi-regex: 2.1.1 + dev: false - strip-ansi@6.0.1: + /strip-ansi@6.0.1: + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} + engines: {node: '>=8'} dependencies: ansi-regex: 5.0.1 - strip-ansi@7.1.0: + /strip-ansi@7.1.0: + resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} + engines: {node: '>=12'} dependencies: ansi-regex: 6.0.1 + dev: false - strip-bom-stream@1.0.0: + /strip-bom-stream@1.0.0: + resolution: {integrity: sha512-7jfJB9YpI2Z0aH3wu10ZqitvYJaE0s5IzFuWE+0pbb4Q/armTloEUShymkDO47YSLnjAW52mlXT//hs9wXNNJQ==} + engines: {node: '>=0.10.0'} dependencies: first-chunk-stream: 1.0.0 strip-bom: 2.0.0 + dev: false - strip-bom@2.0.0: + /strip-bom@2.0.0: + resolution: {integrity: sha512-kwrX1y7czp1E69n2ajbG65mIo9dqvJ+8aBQXOGVxqwvNbsXdFM6Lq37dLAY3mknUwru8CfcCbfOLL/gMo+fi3g==} + engines: {node: '>=0.10.0'} dependencies: is-utf8: 0.2.1 + dev: false - strip-bom@3.0.0: {} + /strip-bom@3.0.0: + resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} + engines: {node: '>=4'} + dev: true - strip-bom@4.0.0: {} + /strip-bom@4.0.0: + resolution: {integrity: sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==} + engines: {node: '>=8'} - strip-final-newline@2.0.0: {} + /strip-final-newline@2.0.0: + resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} + engines: {node: '>=6'} - strip-final-newline@3.0.0: {} + /strip-final-newline@3.0.0: + resolution: {integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==} + engines: {node: '>=12'} + dev: true - strip-indent@3.0.0: + /strip-indent@3.0.0: + resolution: {integrity: sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==} + engines: {node: '>=8'} dependencies: min-indent: 1.0.1 + dev: true - strip-json-comments@3.1.1: {} + /strip-json-comments@3.1.1: + resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} + engines: {node: '>=8'} - superagent@8.1.2: + /superagent@8.1.2: + resolution: {integrity: sha512-6WTxW1EB6yCxV5VFOIPQruWGHqc3yI7hEmZK6h+pyk69Lk/Ut7rLUY6W/ONF2MjBuGjvmMiIpsrVJ2vjrHlslA==} + engines: {node: '>=6.4.0 <13 || >=14'} dependencies: component-emitter: 1.3.1 cookiejar: 2.1.4 @@ -10113,44 +8171,74 @@ snapshots: semver: 7.6.0 transitivePeerDependencies: - supports-color + dev: true - supertest@6.3.3: + /supertest@6.3.3: + resolution: {integrity: sha512-EMCG6G8gDu5qEqRQ3JjjPs6+FYT1a7Hv5ApHvtSghmOFJYtsU5S+pSb6Y2EUeCEY3CmEL3mmQ8YWlPOzQomabA==} + engines: {node: '>=6.4.0'} dependencies: methods: 1.1.2 superagent: 8.1.2 transitivePeerDependencies: - supports-color + dev: true - supports-color@2.0.0: {} + /supports-color@2.0.0: + resolution: {integrity: sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==} + engines: {node: '>=0.8.0'} + dev: false - supports-color@5.5.0: + /supports-color@5.5.0: + resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} + engines: {node: '>=4'} dependencies: has-flag: 3.0.0 - supports-color@7.2.0: + /supports-color@7.2.0: + resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} + engines: {node: '>=8'} dependencies: has-flag: 4.0.0 - supports-color@8.1.1: + /supports-color@8.1.1: + resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} + engines: {node: '>=10'} dependencies: has-flag: 4.0.0 - supports-preserve-symlinks-flag@1.0.0: {} + /supports-preserve-symlinks-flag@1.0.0: + resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} + engines: {node: '>= 0.4'} - swagger-ui-dist@5.11.2: {} + /swagger-ui-dist@5.11.2: + resolution: {integrity: sha512-jQG0cRgJNMZ7aCoiFofnoojeSaa/+KgWaDlfgs8QN+BXoGMpxeMVY5OEnjq4OlNvF3yjftO8c9GRAgcHlO+u7A==} + dev: false - symbol-observable@4.0.0: {} + /symbol-observable@4.0.0: + resolution: {integrity: sha512-b19dMThMV4HVFynSAM1++gBHAbk2Tc/osgLIBZMKsyqh34jb2e8Os7T6ZW/Bt3pJFdBTd2JwAnAAEQV7rSNvcQ==} + engines: {node: '>=0.10'} + dev: true - symbol@0.2.3: {} + /symbol@0.2.3: + resolution: {integrity: sha512-IUW+ek7apEaW5bFhS6WpYoNtVpNTlNoqB/PH7YiMWQTxSPeXCzG4PILVakwXivJt3ZXWeO1fIJnUd/L9A/VeGA==} + dev: false - synckit@0.8.8: + /synckit@0.8.8: + resolution: {integrity: sha512-HwOKAP7Wc5aRGYdKH+dw0PRRpbO841v2DENBtjnR5HFWoiNByAl7vrx3p0G/rCyYXQsrxqtX48TImFtPcIHSpQ==} + engines: {node: ^14.18.0 || >=16.0.0} dependencies: '@pkgr/core': 0.1.1 tslib: 2.6.2 + dev: true - tapable@2.2.1: {} + /tapable@2.2.1: + resolution: {integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==} + engines: {node: '>=6'} + dev: true - tar@6.2.0: + /tar@6.2.0: + resolution: {integrity: sha512-/Wo7DcT0u5HUV486xg675HtjNd3BXZ6xDbzsCUZPt5iw8bTQ63bP0Raut3mvro9u+CUyq7YQd8Cx55fsZXxqLQ==} + engines: {node: '>=10'} dependencies: chownr: 2.0.0 fs-minipass: 2.1.0 @@ -10159,7 +8247,21 @@ snapshots: mkdirp: 1.0.4 yallist: 4.0.0 - terser-webpack-plugin@5.3.10(webpack@5.87.0): + /terser-webpack-plugin@5.3.10(webpack@5.87.0): + resolution: {integrity: sha512-BKFPWlPDndPs+NGGCr1U59t0XScL5317Y0UReNrHaw9/FwhPENlq6bfgs+4yPfyP51vqC1bQ4rp1EfXW5ZSH9w==} + engines: {node: '>= 10.13.0'} + peerDependencies: + '@swc/core': '*' + esbuild: '*' + uglify-js: '*' + webpack: ^5.1.0 + peerDependenciesMeta: + '@swc/core': + optional: true + esbuild: + optional: true + uglify-js: + optional: true dependencies: '@jridgewell/trace-mapping': 0.3.22 jest-worker: 27.5.1 @@ -10167,8 +8269,23 @@ snapshots: serialize-javascript: 6.0.2 terser: 5.27.0 webpack: 5.87.0 + dev: true - terser-webpack-plugin@5.3.10(webpack@5.90.1): + /terser-webpack-plugin@5.3.10(webpack@5.90.1): + resolution: {integrity: sha512-BKFPWlPDndPs+NGGCr1U59t0XScL5317Y0UReNrHaw9/FwhPENlq6bfgs+4yPfyP51vqC1bQ4rp1EfXW5ZSH9w==} + engines: {node: '>= 10.13.0'} + peerDependencies: + '@swc/core': '*' + esbuild: '*' + uglify-js: '*' + webpack: ^5.1.0 + peerDependenciesMeta: + '@swc/core': + optional: true + esbuild: + optional: true + uglify-js: + optional: true dependencies: '@jridgewell/trace-mapping': 0.3.22 jest-worker: 27.5.1 @@ -10176,95 +8293,177 @@ snapshots: serialize-javascript: 6.0.2 terser: 5.27.0 webpack: 5.90.1 + dev: true - terser@5.27.0: + /terser@5.27.0: + resolution: {integrity: sha512-bi1HRwVRskAjheeYl291n3JC4GgO/Ty4z1nVs5AAsmonJulGxpSektecnNedrwK9C7vpvVtcX3cw00VSLt7U2A==} + engines: {node: '>=10'} + hasBin: true dependencies: '@jridgewell/source-map': 0.3.5 acorn: 8.11.3 commander: 2.20.3 source-map-support: 0.5.21 + dev: true - test-exclude@6.0.0: + /test-exclude@6.0.0: + resolution: {integrity: sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==} + engines: {node: '>=8'} dependencies: '@istanbuljs/schema': 0.1.3 glob: 7.2.3 minimatch: 3.1.2 - text-extensions@1.9.0: {} + /text-extensions@1.9.0: + resolution: {integrity: sha512-wiBrwC1EhBelW12Zy26JeOUkQ5mRu+5o8rpsJk5+2t+Y5vE7e842qtZDQ2g1NpX/29HdyFeJ4nSIhI47ENSxlQ==} + engines: {node: '>=0.10'} + dev: true - text-extensions@2.4.0: {} + /text-extensions@2.4.0: + resolution: {integrity: sha512-te/NtwBwfiNRLf9Ijqx3T0nlqZiQ2XrrtBvu+cLL8ZRrGkO0NHTug8MYFKyoSrv/sHTaSKfilUkizV6XhxMJ3g==} + engines: {node: '>=8'} + dev: true - text-table@0.2.0: {} + /text-table@0.2.0: + resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} + dev: true - thread-stream@2.4.1: + /thread-stream@2.4.1: + resolution: {integrity: sha512-d/Ex2iWd1whipbT681JmTINKw0ZwOUBZm7+Gjs64DHuX34mmw8vJL2bFAaNacaW72zYiTJxSHi5abUuOi5nsfg==} dependencies: real-require: 0.2.0 + dev: false - through2-filter@2.0.0: + /through2-filter@2.0.0: + resolution: {integrity: sha512-miwWajb1B80NvIVKXFPN/o7+vJc4jYUvnZCwvhicRAoTxdD9wbcjri70j+BenCrN/JXEPKDjhpw4iY7yiNsCGg==} dependencies: through2: 2.0.5 xtend: 4.0.2 + dev: false - through2-filter@3.0.0: + /through2-filter@3.0.0: + resolution: {integrity: sha512-jaRjI2WxN3W1V8/FMZ9HKIBXixtiqs3SQSX4/YGIiP3gL6djW48VoZq9tDqeCWs3MT8YY5wb/zli8VW8snY1CA==} dependencies: through2: 2.0.5 xtend: 4.0.2 + dev: false - through2@0.6.5: + /through2@0.6.5: + resolution: {integrity: sha512-RkK/CCESdTKQZHdmKICijdKKsCRVHs5KsLZ6pACAmF/1GPUQhonHSXWNERctxEp7RmvjdNbZTL5z9V7nSCXKcg==} dependencies: readable-stream: 1.0.34 xtend: 4.0.2 + dev: false - through2@2.0.5: + /through2@2.0.5: + resolution: {integrity: sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==} dependencies: readable-stream: 2.3.8 xtend: 4.0.2 - through2@4.0.2: + /through2@4.0.2: + resolution: {integrity: sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==} dependencies: readable-stream: 3.6.2 + dev: true - through@2.3.8: {} + /through@2.3.8: + resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==} + dev: true - tildify@1.2.0: + /tildify@1.2.0: + resolution: {integrity: sha512-Y9q1GaV/BO65Z9Yf4NOGMuwt3SGdptkZBnaaKfTQakrDyCLiuO1Kc5wxW4xLdsjzunRtqtOdhekiUFmZbklwYQ==} + engines: {node: '>=0.10.0'} dependencies: os-homedir: 1.0.2 + dev: false - tmp@0.0.33: + /tmp@0.0.33: + resolution: {integrity: sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==} + engines: {node: '>=0.6.0'} dependencies: os-tmpdir: 1.0.2 + dev: true - tmpl@1.0.5: {} + /tmpl@1.0.5: + resolution: {integrity: sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==} - to-absolute-glob@0.1.1: + /to-absolute-glob@0.1.1: + resolution: {integrity: sha512-Vvl5x6zNf9iVG1QTWeknmWrKzZxaeKfIDRibrZCR3b2V/2NlFJuD2HV7P7AVjaKLZNqLPHqyr0jGrW0fTcxCPQ==} + engines: {node: '>=0.10.0'} dependencies: extend-shallow: 2.0.1 + dev: false - to-fast-properties@2.0.0: {} + /to-fast-properties@2.0.0: + resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==} + engines: {node: '>=4'} - to-regex-range@5.0.1: + /to-regex-range@5.0.1: + resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} + engines: {node: '>=8.0'} dependencies: is-number: 7.0.0 - toad-cache@3.7.0: {} + /toad-cache@3.7.0: + resolution: {integrity: sha512-/m8M+2BJUpoJdgAHoG+baCwBT+tf2VraSfkBgl0Y00qIWt41DJ8R5B8nsEw0I58YwF5IZH6z24/2TobDKnqSWw==} + engines: {node: '>=12'} + dev: false - toidentifier@1.0.1: {} + /toidentifier@1.0.1: + resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} + engines: {node: '>=0.6'} + dev: false - tr46@0.0.3: {} + /tr46@0.0.3: + resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} - tree-kill@1.2.2: {} + /tree-kill@1.2.2: + resolution: {integrity: sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==} + hasBin: true + dev: true - trim-newlines@3.0.1: {} + /trim-newlines@3.0.1: + resolution: {integrity: sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==} + engines: {node: '>=8'} + dev: true - trouter@2.0.1: + /trouter@2.0.1: + resolution: {integrity: sha512-kr8SKKw94OI+xTGOkfsvwZQ8mWoikZDd2n8XZHjJVZUARZT+4/VV6cacRS6CLsH9bNm+HFIPU1Zx4CnNnb4qlQ==} + engines: {node: '>=6'} dependencies: matchit: 1.1.0 + dev: true - ts-api-utils@1.2.1(typescript@5.1.3): + /ts-api-utils@1.2.1(typescript@5.1.3): + resolution: {integrity: sha512-RIYA36cJn2WiH9Hy77hdF9r7oEwxAtB/TS9/S4Qd90Ap4z5FSiin5zEiTL44OII1Y3IIlEvxwxFUVgrHSZ/UpA==} + engines: {node: '>=16'} + peerDependencies: + typescript: '>=4.2.0' dependencies: typescript: 5.1.3 + dev: true - ts-jest@29.1.0(@babel/core@7.23.9)(jest@29.5.0)(typescript@5.0.4): + /ts-jest@29.1.0(@babel/core@7.23.9)(jest@29.5.0)(typescript@5.0.4): + resolution: {integrity: sha512-ZhNr7Z4PcYa+JjMl62ir+zPiNJfXJN6E8hSLnaUKhOgqcn8vb3e537cpkd0FuAfRK3sR1LSqM1MOhliXNgOFPA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + hasBin: true + peerDependencies: + '@babel/core': '>=7.0.0-beta.0 <8' + '@jest/types': ^29.0.0 + babel-jest: ^29.0.0 + esbuild: '*' + jest: ^29.0.0 + typescript: '>=4.3 <6' + peerDependenciesMeta: + '@babel/core': + optional: true + '@jest/types': + optional: true + babel-jest: + optional: true + esbuild: + optional: true dependencies: '@babel/core': 7.23.9 bs-logger: 0.2.6 @@ -10277,8 +8476,28 @@ snapshots: semver: 7.6.0 typescript: 5.0.4 yargs-parser: 21.1.1 + dev: false - ts-jest@29.1.0(@babel/core@7.23.9)(jest@29.5.0)(typescript@5.1.3): + /ts-jest@29.1.0(@babel/core@7.23.9)(jest@29.5.0)(typescript@5.1.3): + resolution: {integrity: sha512-ZhNr7Z4PcYa+JjMl62ir+zPiNJfXJN6E8hSLnaUKhOgqcn8vb3e537cpkd0FuAfRK3sR1LSqM1MOhliXNgOFPA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + hasBin: true + peerDependencies: + '@babel/core': '>=7.0.0-beta.0 <8' + '@jest/types': ^29.0.0 + babel-jest: ^29.0.0 + esbuild: '*' + jest: ^29.0.0 + typescript: '>=4.3 <6' + peerDependenciesMeta: + '@babel/core': + optional: true + '@jest/types': + optional: true + babel-jest: + optional: true + esbuild: + optional: true dependencies: '@babel/core': 7.23.9 bs-logger: 0.2.6 @@ -10291,8 +8510,14 @@ snapshots: semver: 7.6.0 typescript: 5.1.3 yargs-parser: 21.1.1 + dev: true - ts-loader@9.4.3(typescript@5.1.3)(webpack@5.90.1): + /ts-loader@9.4.3(typescript@5.1.3)(webpack@5.90.1): + resolution: {integrity: sha512-n3hBnm6ozJYzwiwt5YRiJZkzktftRpMiBApHaJPoWLA+qetQBAXkHqCLM6nwSdRDimqVtA5ocIkcTRLMTt7yzA==} + engines: {node: '>=12.0.0'} + peerDependencies: + typescript: '*' + webpack: ^5.0.0 dependencies: chalk: 4.1.2 enhanced-resolve: 5.15.0 @@ -10300,8 +8525,21 @@ snapshots: semver: 7.6.0 typescript: 5.1.3 webpack: 5.90.1 + dev: true - ts-node@10.9.1(@types/node@20.3.1)(typescript@5.1.3): + /ts-node@10.9.1(@types/node@20.3.1)(typescript@5.1.3): + resolution: {integrity: sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==} + hasBin: true + peerDependencies: + '@swc/core': '>=1.2.50' + '@swc/wasm': '>=1.2.50' + '@types/node': '*' + typescript: '>=2.7' + peerDependenciesMeta: + '@swc/core': + optional: true + '@swc/wasm': + optional: true dependencies: '@cspotcode/source-map-support': 0.8.1 '@tsconfig/node10': 1.0.9 @@ -10319,97 +8557,180 @@ snapshots: v8-compile-cache-lib: 3.0.1 yn: 3.1.1 - ts-toolbelt@9.6.0: {} + /ts-toolbelt@9.6.0: + resolution: {integrity: sha512-nsZd8ZeNUzukXPlJmTBwUAuABDe/9qtVDelJeT/qW0ow3ZS3BsQJtNkan1802aM9Uf68/Y8ljw86Hu0h5IUW3w==} + dev: true - tsconfig-paths-webpack-plugin@4.0.1: + /tsconfig-paths-webpack-plugin@4.0.1: + resolution: {integrity: sha512-m5//KzLoKmqu2MVix+dgLKq70MnFi8YL8sdzQZ6DblmCdfuq/y3OqvJd5vMndg2KEVCOeNz8Es4WVZhYInteLw==} + engines: {node: '>=10.13.0'} dependencies: chalk: 4.1.2 enhanced-resolve: 5.15.0 tsconfig-paths: 4.2.0 + dev: true - tsconfig-paths@4.2.0: + /tsconfig-paths@4.2.0: + resolution: {integrity: sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg==} + engines: {node: '>=6'} dependencies: json5: 2.2.3 minimist: 1.2.8 strip-bom: 3.0.0 + dev: true - tslib@1.14.1: {} + /tslib@1.14.1: + resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==} + dev: false - tslib@2.5.0: {} + /tslib@2.5.0: + resolution: {integrity: sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==} + dev: false - tslib@2.5.3: {} + /tslib@2.5.3: + resolution: {integrity: sha512-mSxlJJwl3BMEQCUNnxXBU9jP4JBktcEGhURcPR6VQVlnP0FdDEsIaz0C35dXNGLyRfrATNofF0F5p2KPxQgB+w==} - tslib@2.6.2: {} + /tslib@2.6.2: + resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==} - type-check@0.4.0: + /type-check@0.4.0: + resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} + engines: {node: '>= 0.8.0'} dependencies: prelude-ls: 1.2.1 + dev: true - type-detect@4.0.8: {} + /type-detect@4.0.8: + resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==} + engines: {node: '>=4'} - type-fest@0.18.1: {} + /type-fest@0.18.1: + resolution: {integrity: sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==} + engines: {node: '>=10'} + dev: true - type-fest@0.20.2: {} + /type-fest@0.20.2: + resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} + engines: {node: '>=10'} + dev: true - type-fest@0.21.3: {} + /type-fest@0.21.3: + resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==} + engines: {node: '>=10'} - type-fest@0.6.0: {} + /type-fest@0.6.0: + resolution: {integrity: sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==} + engines: {node: '>=8'} + dev: true - type-fest@0.8.1: {} + /type-fest@0.8.1: + resolution: {integrity: sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==} + engines: {node: '>=8'} + dev: true - typedarray@0.0.6: {} + /typedarray@0.0.6: + resolution: {integrity: sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==} + dev: true - typedarray@0.0.7: {} + /typedarray@0.0.7: + resolution: {integrity: sha512-ueeb9YybpjhivjbHP2LdFDAjbS948fGEPj+ACAMs4xCMmh72OCOMQWBQKlaN4ZNQ04yfLSDLSx1tGRIoWimObQ==} + dev: false - typescript@5.0.4: {} + /typescript@5.0.4: + resolution: {integrity: sha512-cW9T5W9xY37cc+jfEnaUvX91foxtHkza3Nw3wkoF4sSlKn0MONdkdEndig/qPBWXNkmplh3NzayQzCiHM4/hqw==} + engines: {node: '>=12.20'} + hasBin: true + dev: false - typescript@5.1.3: {} + /typescript@5.1.3: + resolution: {integrity: sha512-XH627E9vkeqhlZFQuL+UsyAXEnibT0kWR2FWONlr4sTjvxyJYnyefgrkyECLzM5NenmKzRAy2rR/OlYLA1HkZw==} + engines: {node: '>=14.17'} + hasBin: true - uglify-js@3.17.4: + /uglify-js@3.17.4: + resolution: {integrity: sha512-T9q82TJI9e/C1TAxYvfb16xO120tMVFZrGA3f9/P4424DNu6ypK103y0GPFVa17yotwSyZW5iYXgjYHkGrJW/g==} + engines: {node: '>=0.8.0'} + hasBin: true + requiresBuild: true + dev: true optional: true - uid@2.0.2: + /uid@2.0.2: + resolution: {integrity: sha512-u3xV3X7uzvi5b1MncmZo3i2Aw222Zk1keqLA1YkHldREkAhAqi65wuPfe7lHx8H/Wzy+8CE7S7uS3jekIM5s8g==} + engines: {node: '>=8'} dependencies: '@lukeed/csprng': 1.1.0 - unicorn-magic@0.1.0: {} + /unicorn-magic@0.1.0: + resolution: {integrity: sha512-lRfVq8fE8gz6QMBuDM6a+LO3IAzTi05H6gCVaUpir2E1Rwpo4ZUog45KpNXKC/Mn3Yb9UDuHumeFTo9iV/D9FQ==} + engines: {node: '>=18'} + dev: true - unique-filename@2.0.1: + /unique-filename@2.0.1: + resolution: {integrity: sha512-ODWHtkkdx3IAR+veKxFV+VBkUMcN+FaqzUUd7IZzt+0zhDZFPFxhlqwPF3YQvMHx1TD0tdgYl+kuPnJ8E6ql7A==} + engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} dependencies: unique-slug: 3.0.0 + dev: false - unique-slug@3.0.0: + /unique-slug@3.0.0: + resolution: {integrity: sha512-8EyMynh679x/0gqE9fT9oilG+qEt+ibFyqjuVTsZn1+CMxH+XLlpvr2UZx4nVcCwTpx81nICr2JQFkM+HPLq4w==} + engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} dependencies: imurmurhash: 0.1.4 + dev: false - unique-stream@2.3.1: + /unique-stream@2.3.1: + resolution: {integrity: sha512-2nY4TnBE70yoxHkDli7DMazpWiP7xMdCYqU2nBRO0UB+ZpEkGsSija7MvmvnZFUeC+mrgiUfcHSr3LmRFIg4+A==} dependencies: json-stable-stringify-without-jsonify: 1.0.1 through2-filter: 3.0.0 + dev: false - universalify@2.0.1: {} + /universalify@2.0.1: + resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==} + engines: {node: '>= 10.0.0'} + dev: true - update-browserslist-db@1.0.13(browserslist@4.22.3): + /update-browserslist-db@1.0.13(browserslist@4.22.3): + resolution: {integrity: sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==} + hasBin: true + peerDependencies: + browserslist: '>= 4.21.0' dependencies: browserslist: 4.22.3 escalade: 3.1.2 picocolors: 1.0.0 - uri-js@4.4.1: + /uri-js@4.4.1: + resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} dependencies: punycode: 2.3.1 - urix@0.1.0: {} + /urix@0.1.0: + resolution: {integrity: sha512-Am1ousAhSLBeB9cG/7k7r2R0zj50uDRlZHPGbazid5s9rlF1F/QKYObEKSIunSjIOkJZqwRRLpvewjEkM7pSqg==} + deprecated: Please see https://github.com/lydell/urix#deprecated + dev: false - util-deprecate@1.0.2: {} + /util-deprecate@1.0.2: + resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} - utils-merge@1.0.1: {} + /utils-merge@1.0.1: + resolution: {integrity: sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==} + engines: {node: '>= 0.4.0'} + dev: false - uuid@9.0.0: {} + /uuid@9.0.0: + resolution: {integrity: sha512-MXcSTerfPa4uqyzStbRoTgt5XIe3x5+42+q1sDuy3R5MDk66URdLMOZe5aPX/SQd+kuYAh0FdP/pO28IkQyTeg==} + hasBin: true + dev: false - v8-compile-cache-lib@3.0.1: {} + /v8-compile-cache-lib@3.0.1: + resolution: {integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==} - v8-sandbox@3.2.10(debug@2.6.9): + /v8-sandbox@3.2.10(debug@2.6.9): + resolution: {integrity: sha512-BIIohkY8ULJ63o084YCPMVItEurrH8HIiPufbTtI6AD9HXNnC6QmJTvN97CpvakRkSk0isK4a4diSmwVG2pyFQ==} + requiresBuild: true dependencies: async: 3.2.5 axios: 1.6.7(debug@2.6.9) @@ -10422,23 +8743,34 @@ snapshots: - bluebird - debug - supports-color + dev: false - v8-to-istanbul@9.2.0: + /v8-to-istanbul@9.2.0: + resolution: {integrity: sha512-/EH/sDgxU2eGxajKdwLCDmQ4FWq+kpi3uCmBGpw1xJtnAxEjlD8j8PEiGWpCIMIs3ciNAgH0d3TTJiUkYzyZjA==} + engines: {node: '>=10.12.0'} dependencies: '@jridgewell/trace-mapping': 0.3.22 '@types/istanbul-lib-coverage': 2.0.6 convert-source-map: 2.0.0 - vali-date@1.0.0: {} + /vali-date@1.0.0: + resolution: {integrity: sha512-sgECfZthyaCKW10N0fm27cg8HYTFK5qMWgypqkXMQ4Wbl/zZKx7xZICgcoxIIE+WFAP/MBL2EFwC/YvLxw3Zeg==} + engines: {node: '>=0.10.0'} + dev: false - validate-npm-package-license@3.0.4: + /validate-npm-package-license@3.0.4: + resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==} dependencies: spdx-correct: 3.2.0 spdx-expression-parse: 3.0.1 - validator@13.11.0: {} + /validator@13.11.0: + resolution: {integrity: sha512-Ii+sehpSfZy+At5nPdnyMhx78fEoPDkR2XW/zimHEL3MyGJQOCQ7WeP20jPYRz7ZCpcKLB21NxuXHF3bxjStBQ==} + engines: {node: '>= 0.10'} - vinyl-fs@2.4.3: + /vinyl-fs@2.4.3: + resolution: {integrity: sha512-XxYoy5HpHrVd76tpnI5Vv/+b/xlEVusOmn4LjQ01s2JyiDMNaUm3Rb7Y3xTkRw+YoRBVoUrCs7EAIFNXyIlI8Q==} + engines: {node: '>=0.10'} dependencies: duplexify: 3.7.1 glob-stream: 5.3.5 @@ -10459,33 +8791,57 @@ snapshots: vinyl: 1.2.0 transitivePeerDependencies: - supports-color + dev: false - vinyl@1.2.0: + /vinyl@1.2.0: + resolution: {integrity: sha512-Ci3wnR2uuSAWFMSglZuB8Z2apBdtOyz8CV7dC6/U1XbltXBC+IuutUkXQISz01P+US2ouBuesSbV6zILZ6BuzQ==} + engines: {node: '>= 0.9'} dependencies: clone: 1.0.4 clone-stats: 0.0.1 replace-ext: 0.0.1 + dev: false - walker@1.0.8: + /walker@1.0.8: + resolution: {integrity: sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==} dependencies: makeerror: 1.0.12 - watchpack@2.4.0: + /watchpack@2.4.0: + resolution: {integrity: sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==} + engines: {node: '>=10.13.0'} dependencies: glob-to-regexp: 0.4.1 graceful-fs: 4.2.11 + dev: true - wcwidth@1.0.1: + /wcwidth@1.0.1: + resolution: {integrity: sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==} dependencies: defaults: 1.0.4 - webidl-conversions@3.0.1: {} + /webidl-conversions@3.0.1: + resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} - webpack-node-externals@3.0.0: {} + /webpack-node-externals@3.0.0: + resolution: {integrity: sha512-LnL6Z3GGDPht/AigwRh2dvL9PQPFQ8skEpVrWZXLWBYmqcaojHNN0onvHzie6rq7EWKrrBfPYqNEzTJgiwEQDQ==} + engines: {node: '>=6'} + dev: true - webpack-sources@3.2.3: {} + /webpack-sources@3.2.3: + resolution: {integrity: sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==} + engines: {node: '>=10.13.0'} + dev: true - webpack@5.87.0: + /webpack@5.87.0: + resolution: {integrity: sha512-GOu1tNbQ7p1bDEoFRs2YPcfyGs8xq52yyPBZ3m2VGnXGtV9MxjrkABHm4V9Ia280OefsSLzvbVoXcfLxjKY/Iw==} + engines: {node: '>=10.13.0'} + hasBin: true + peerDependencies: + webpack-cli: '*' + peerDependenciesMeta: + webpack-cli: + optional: true dependencies: '@types/eslint-scope': 3.7.7 '@types/estree': 1.0.5 @@ -10515,8 +8871,17 @@ snapshots: - '@swc/core' - esbuild - uglify-js + dev: true - webpack@5.90.1: + /webpack@5.90.1: + resolution: {integrity: sha512-SstPdlAC5IvgFnhiRok8hqJo/+ArAbNv7rhU4fnWGHNVfN59HSQFaxZDSAL3IFG2YmqxuRs+IU33milSxbPlog==} + engines: {node: '>=10.13.0'} + hasBin: true + peerDependencies: + webpack-cli: '*' + peerDependenciesMeta: + webpack-cli: + optional: true dependencies: '@types/eslint-scope': 3.7.7 '@types/estree': 1.0.5 @@ -10546,80 +8911,133 @@ snapshots: - '@swc/core' - esbuild - uglify-js + dev: true - whatwg-url@5.0.0: + /whatwg-url@5.0.0: + resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} dependencies: tr46: 0.0.3 webidl-conversions: 3.0.1 - which@1.3.1: + /which@1.3.1: + resolution: {integrity: sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==} + hasBin: true dependencies: isexe: 2.0.0 + dev: true - which@2.0.2: + /which@2.0.2: + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} + hasBin: true dependencies: isexe: 2.0.0 - wide-align@1.1.5: + /wide-align@1.1.5: + resolution: {integrity: sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==} dependencies: string-width: 4.2.3 + dev: false - window-size@0.2.0: {} + /window-size@0.2.0: + resolution: {integrity: sha512-UD7d8HFA2+PZsbKyaOCEy8gMh1oDtHgJh1LfgjQ4zVXmYjAT/kvz3PueITKuqDiIXQe7yzpPnxX3lNc+AhQMyw==} + engines: {node: '>= 0.10.0'} + hasBin: true + dev: false - windows-release@4.0.0: + /windows-release@4.0.0: + resolution: {integrity: sha512-OxmV4wzDKB1x7AZaZgXMVsdJ1qER1ed83ZrTYd5Bwq2HfJVg3DJS8nqlAG4sMoJ7mu8cuRmLEYyU13BKwctRAg==} + engines: {node: '>=10'} dependencies: execa: 4.1.0 + dev: true - word-wrap@1.2.5: {} + /word-wrap@1.2.5: + resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} + engines: {node: '>=0.10.0'} + dev: true - wordwrap@1.0.0: {} + /wordwrap@1.0.0: + resolution: {integrity: sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==} + dev: true - wrap-ansi@2.1.0: + /wrap-ansi@2.1.0: + resolution: {integrity: sha512-vAaEaDM946gbNpH5pLVNR+vX2ht6n0Bt3GXwVB1AuAqZosOvHNF3P7wDnh8KLkSqgUh0uh77le7Owgoz+Z9XBw==} + engines: {node: '>=0.10.0'} dependencies: string-width: 1.0.2 strip-ansi: 3.0.1 + dev: false - wrap-ansi@7.0.0: + /wrap-ansi@7.0.0: + resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} + engines: {node: '>=10'} dependencies: ansi-styles: 4.3.0 string-width: 4.2.3 strip-ansi: 6.0.1 - wrap-ansi@8.1.0: + /wrap-ansi@8.1.0: + resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} + engines: {node: '>=12'} dependencies: ansi-styles: 6.2.1 string-width: 5.1.2 strip-ansi: 7.1.0 + dev: false - wrappy@1.0.2: {} + /wrappy@1.0.2: + resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} - write-file-atomic@4.0.2: + /write-file-atomic@4.0.2: + resolution: {integrity: sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==} + engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} dependencies: imurmurhash: 0.1.4 signal-exit: 3.0.7 - xtend@4.0.2: {} + /xtend@4.0.2: + resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==} + engines: {node: '>=0.4'} - y18n@3.2.2: {} + /y18n@3.2.2: + resolution: {integrity: sha512-uGZHXkHnhF0XeeAPgnKfPv1bgKAYyVvmNL1xlKsPYZPaIHxGti2hHqvOCQv71XMsLxu1QjergkqogUnms5D3YQ==} + dev: false - y18n@5.0.8: {} + /y18n@5.0.8: + resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} + engines: {node: '>=10'} - yallist@3.1.1: {} + /yallist@3.1.1: + resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} - yallist@4.0.0: {} + /yallist@4.0.0: + resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} - yaml@1.10.2: {} + /yaml@1.10.2: + resolution: {integrity: sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==} + engines: {node: '>= 6'} + dev: true - yargs-parser@2.4.1: + /yargs-parser@2.4.1: + resolution: {integrity: sha512-9pIKIJhnI5tonzG6OnCFlz/yln8xHYcGl+pn3xR0Vzff0vzN1PbNRaelgfgRUwZ3s4i3jvxT9WhmUGL4whnasA==} dependencies: camelcase: 3.0.0 lodash.assign: 4.2.0 + dev: false - yargs-parser@20.2.9: {} + /yargs-parser@20.2.9: + resolution: {integrity: sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==} + engines: {node: '>=10'} + dev: true - yargs-parser@21.1.1: {} + /yargs-parser@21.1.1: + resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} + engines: {node: '>=12'} - yargs@16.2.0: + /yargs@16.2.0: + resolution: {integrity: sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==} + engines: {node: '>=10'} dependencies: cliui: 7.0.4 escalade: 3.1.2 @@ -10628,8 +9046,11 @@ snapshots: string-width: 4.2.3 y18n: 5.0.8 yargs-parser: 20.2.9 + dev: true - yargs@17.7.2: + /yargs@17.7.2: + resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} + engines: {node: '>=12'} dependencies: cliui: 8.0.1 escalade: 3.1.2 @@ -10639,7 +9060,8 @@ snapshots: y18n: 5.0.8 yargs-parser: 21.1.1 - yargs@4.6.0: + /yargs@4.6.0: + resolution: {integrity: sha512-KmjJbWBkYiSRUChcOSa4rtBxDXf0j4ISz+tpeNa4LKIBllgKnkemJ3x4yo4Yydp3wPU4/xJTaKTLLZ8V7zhI7A==} dependencies: camelcase: 2.1.1 cliui: 3.2.0 @@ -10653,9 +9075,17 @@ snapshots: window-size: 0.2.0 y18n: 3.2.2 yargs-parser: 2.4.1 + dev: false - yn@3.1.1: {} + /yn@3.1.1: + resolution: {integrity: sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==} + engines: {node: '>=6'} - yocto-queue@0.1.0: {} + /yocto-queue@0.1.0: + resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} + engines: {node: '>=10'} - yocto-queue@1.0.0: {} + /yocto-queue@1.0.0: + resolution: {integrity: sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==} + engines: {node: '>=12.20'} + dev: true From ace2edd04d202083e325fd3bb4d2cbfe0e930cea Mon Sep 17 00:00:00 2001 From: dev-callgent Date: Thu, 22 Aug 2024 17:54:20 +0800 Subject: [PATCH 034/183] ci: docker file Signed-off-by: dev-callgent --- Dockerfile | 17 +++++++-- package.json | 6 ++-- pnpm-lock.yaml | 98 +++++++++++++++++++++++++------------------------- 3 files changed, 67 insertions(+), 54 deletions(-) diff --git a/Dockerfile b/Dockerfile index 1390a0c..536215a 100644 --- a/Dockerfile +++ b/Dockerfile @@ -5,6 +5,8 @@ WORKDIR /app # A wildcard is used to ensure both package.json AND package-lock.json are copied COPY package*.json ./ +COPY pnpm-lock.yaml ./ +COPY prisma ./prisma/ # Install app dependencies RUN npm install -g pnpm @@ -14,7 +16,18 @@ COPY . . # Generate Prisma client using the Prisma CLI. RUN npx prisma generate -RUN pnpm run build +RUN pnpm build + +FROM node:18.19.1 +RUN npm install -g pnpm + +WORKDIR /app + +COPY --from=builder /app/node_modules ./node_modules +COPY --from=builder /app/package*.json ./ +COPY --from=builder /app/dist ./dist +COPY --from=builder /app/prisma ./prisma +COPY .env* ./ EXPOSE 3000 -CMD [ "pnpm", "run", "start:prod" ] \ No newline at end of file +CMD /bin/bash -c "npx prisma migrate deploy && pnpm start:prod" diff --git a/package.json b/package.json index d5bdb91..3896725 100644 --- a/package.json +++ b/package.json @@ -38,7 +38,7 @@ "@fastify/helmet": "^11.1.1", "@fastify/static": "^6.12.0", "@nestjs-cls/transactional": "^2.2.0", - "@nestjs-cls/transactional-adapter-prisma": "^1.1.0", + "@nestjs-cls/transactional-adapter-prisma": "^1.2.4", "@nestjs/cache-manager": "^2.2.0", "@nestjs/common": "^10.0.0", "@nestjs/config": "^3.1.1", @@ -49,7 +49,7 @@ "@nestjs/platform-fastify": "^10.3.4", "@nestjs/swagger": "^7.3.0", "@nodeteam/nestjs-prisma-pagination": "^1.0.6", - "@prisma/client": "5.10.2", + "@prisma/client": "5.18.0", "axios": "^1.6.7", "bcrypt": "^5.1.1", "class-transformer": "^0.5.1", @@ -105,7 +105,7 @@ "pactum": "^3.6.3", "pactum-matchers": "^1.1.6", "prettier": "^3.0.0", - "prisma": "^5.10.2", + "prisma": "^5.18.0", "source-map-support": "^0.5.21", "standard-version": "^9.5.0", "supertest": "^6.3.3", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 23be625..8161c1c 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -23,8 +23,8 @@ dependencies: specifier: ^2.2.0 version: 2.2.0(@nestjs/common@10.0.0)(@nestjs/core@10.0.0)(nestjs-cls@4.2.0)(reflect-metadata@0.1.13)(rxjs@7.8.1) '@nestjs-cls/transactional-adapter-prisma': - specifier: ^1.1.0 - version: 1.1.0(@nestjs-cls/transactional@2.2.0)(@prisma/client@5.10.2)(nestjs-cls@4.2.0)(prisma@5.10.2) + specifier: ^1.2.4 + version: 1.2.4(@nestjs-cls/transactional@2.2.0)(@prisma/client@5.18.0)(nestjs-cls@4.2.0)(prisma@5.18.0) '@nestjs/cache-manager': specifier: ^2.2.0 version: 2.2.0(@nestjs/common@10.0.0)(@nestjs/core@10.0.0)(cache-manager@5.4.0)(reflect-metadata@0.1.13)(rxjs@7.8.1) @@ -56,8 +56,8 @@ dependencies: specifier: ^1.0.6 version: 1.0.6(@babel/core@7.23.9)(@nestjs/core@10.0.0)(@types/node@20.3.1)(cache-manager@5.4.0)(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.1.13)(rxjs@7.8.1)(ts-node@10.9.1) '@prisma/client': - specifier: 5.10.2 - version: 5.10.2(prisma@5.10.2) + specifier: 5.18.0 + version: 5.18.0(prisma@5.18.0) axios: specifier: ^1.6.7 version: 1.6.7(debug@2.6.9) @@ -105,7 +105,7 @@ dependencies: version: 4.0.0(@nestjs/common@10.0.0)(pino-http@9.0.0) nestjs-prisma: specifier: ^0.23.0 - version: 0.23.0(@nestjs/common@10.0.0)(@prisma/client@5.10.2)(prisma@5.10.2) + version: 0.23.0(@nestjs/common@10.0.0)(@prisma/client@5.18.0)(prisma@5.18.0) passport-jwt: specifier: ^4.0.1 version: 4.0.1 @@ -123,7 +123,7 @@ dependencies: version: 10.3.1 prisma-soft-delete-middleware: specifier: ^1.3.1 - version: 1.3.1(@prisma/client@5.10.2) + version: 1.3.1(@prisma/client@5.18.0) reflect-metadata: specifier: ^0.1.13 version: 0.1.13 @@ -137,7 +137,7 @@ dependencies: devDependencies: '@chax-at/transactional-prisma-testing': specifier: ^1.1.0 - version: 1.1.0(@prisma/client@5.10.2) + version: 1.1.0(@prisma/client@5.18.0) '@commitlint/cli': specifier: ^19.2.0 version: 19.2.0(@types/node@20.3.1)(typescript@5.1.3) @@ -220,8 +220,8 @@ devDependencies: specifier: ^3.0.0 version: 3.0.0 prisma: - specifier: ^5.10.2 - version: 5.10.2 + specifier: ^5.18.0 + version: 5.18.0 source-map-support: specifier: ^0.5.21 version: 0.5.21 @@ -642,13 +642,13 @@ packages: /@bcoe/v8-coverage@0.2.3: resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==} - /@chax-at/transactional-prisma-testing@1.1.0(@prisma/client@5.10.2): + /@chax-at/transactional-prisma-testing@1.1.0(@prisma/client@5.18.0): resolution: {integrity: sha512-BT2KRg2mfHbjW3gb3u5RtXjwvodywA8uvOX5Szm2J6KotgYJ/vRnCJ8LKp+kb/dbHhnPIrOCTtj6AY1Xku8Wng==} engines: {node: '>= 14'} peerDependencies: '@prisma/client': ^4.7.0 || 5 dependencies: - '@prisma/client': 5.10.2(prisma@5.10.2) + '@prisma/client': 5.18.0(prisma@5.18.0) dev: true /@colors/colors@1.5.0: @@ -1319,19 +1319,19 @@ packages: resolution: {integrity: sha512-9b8mPpKrfeGRuhFH5iO1iwCLeIIsV6+H1sRfxbkoGXIyQE2BTsPd9zqSqQJ+pv5sJ/hT5M1zvOFL02MnEezFug==} dev: false - /@nestjs-cls/transactional-adapter-prisma@1.1.0(@nestjs-cls/transactional@2.2.0)(@prisma/client@5.10.2)(nestjs-cls@4.2.0)(prisma@5.10.2): - resolution: {integrity: sha512-iTwt0uN+GTQOM9ZkSnbznWhPmKG10UDetVzZ3MZMdKZMRpkAZUnp5ClrmFUo3e37hUO/EYdfzi/g7wesO9owug==} + /@nestjs-cls/transactional-adapter-prisma@1.2.4(@nestjs-cls/transactional@2.2.0)(@prisma/client@5.18.0)(nestjs-cls@4.2.0)(prisma@5.18.0): + resolution: {integrity: sha512-W/Ej+T3QG81//d4YuXsuHnV9WFvWTQBQk1BSiowyq7d812lyr3zk8ZMwmAhB7JAY80cJMeBY6i3TBlP0QVIczQ==} engines: {node: '>=18'} peerDependencies: - '@nestjs-cls/transactional': ^2.2.0 + '@nestjs-cls/transactional': ^2.4.2 '@prisma/client': '> 4 < 6' - nestjs-cls: ^4.2.0 + nestjs-cls: ^4.4.1 prisma: '> 4 < 6' dependencies: '@nestjs-cls/transactional': 2.2.0(@nestjs/common@10.0.0)(@nestjs/core@10.0.0)(nestjs-cls@4.2.0)(reflect-metadata@0.1.13)(rxjs@7.8.1) - '@prisma/client': 5.10.2(prisma@5.10.2) + '@prisma/client': 5.18.0(prisma@5.18.0) nestjs-cls: 4.2.0(@nestjs/common@10.0.0)(@nestjs/core@10.0.0)(reflect-metadata@0.1.13)(rxjs@7.8.1) - prisma: 5.10.2 + prisma: 5.18.0 dev: false /@nestjs-cls/transactional@2.2.0(@nestjs/common@10.0.0)(@nestjs/core@10.0.0)(nestjs-cls@4.2.0)(reflect-metadata@0.1.13)(rxjs@7.8.1): @@ -1775,8 +1775,8 @@ packages: - supports-color dev: true - /@prisma/client@5.10.2(prisma@5.10.2): - resolution: {integrity: sha512-ef49hzB2yJZCvM5gFHMxSFL9KYrIP9udpT5rYo0CsHD4P9IKj473MbhU1gjKKftiwWBTIyrt9jukprzZXazyag==} + /@prisma/client@5.18.0(prisma@5.18.0): + resolution: {integrity: sha512-BWivkLh+af1kqC89zCJYkHsRcyWsM8/JHpsDMM76DjP3ZdEquJhXa4IeX+HkWPnwJ5FanxEJFZZDTWiDs/Kvyw==} engines: {node: '>=16.13'} requiresBuild: true peerDependencies: @@ -1785,7 +1785,7 @@ packages: prisma: optional: true dependencies: - prisma: 5.10.2 + prisma: 5.18.0 /@prisma/debug@4.16.2: resolution: {integrity: sha512-7L7WbG0qNNZYgLpsVB8rCHCXEyHFyIycRlRDNwkVfjQmACC2OW6AWCYCbfdjQhkF/t7+S3njj8wAWAocSs+Brw==} @@ -1797,27 +1797,27 @@ packages: - supports-color dev: true - /@prisma/debug@5.10.2: - resolution: {integrity: sha512-bkBOmH9dpEBbMKFJj8V+Zp8IZHIBjy3fSyhLhxj4FmKGb/UBSt9doyfA6k1UeUREsMJft7xgPYBbHSOYBr8XCA==} + /@prisma/debug@5.18.0: + resolution: {integrity: sha512-f+ZvpTLidSo3LMJxQPVgAxdAjzv5OpzAo/eF8qZqbwvgi2F5cTOI9XCpdRzJYA0iGfajjwjOKKrVq64vkxEfUw==} - /@prisma/engines-version@5.10.0-34.5a9203d0590c951969e85a7d07215503f4672eb9: - resolution: {integrity: sha512-uCy/++3Jx/O3ufM+qv2H1L4tOemTNqcP/gyEVOlZqTpBvYJUe0tWtW0y3o2Ueq04mll4aM5X3f6ugQftOSLdFQ==} + /@prisma/engines-version@5.18.0-25.4c784e32044a8a016d99474bd02a3b6123742169: + resolution: {integrity: sha512-a/+LpJj8vYU3nmtkg+N3X51ddbt35yYrRe8wqHTJtYQt7l1f8kjIBcCs6sHJvodW/EK5XGvboOiwm47fmNrbgg==} - /@prisma/engines@5.10.2: - resolution: {integrity: sha512-HkSJvix6PW8YqEEt3zHfCYYJY69CXsNdhU+wna+4Y7EZ+AwzeupMnUThmvaDA7uqswiHkgm5/SZ6/4CStjaGmw==} + /@prisma/engines@5.18.0: + resolution: {integrity: sha512-ofmpGLeJ2q2P0wa/XaEgTnX/IsLnvSp/gZts0zjgLNdBhfuj2lowOOPmDcfKljLQUXMvAek3lw5T01kHmCG8rg==} requiresBuild: true dependencies: - '@prisma/debug': 5.10.2 - '@prisma/engines-version': 5.10.0-34.5a9203d0590c951969e85a7d07215503f4672eb9 - '@prisma/fetch-engine': 5.10.2 - '@prisma/get-platform': 5.10.2 + '@prisma/debug': 5.18.0 + '@prisma/engines-version': 5.18.0-25.4c784e32044a8a016d99474bd02a3b6123742169 + '@prisma/fetch-engine': 5.18.0 + '@prisma/get-platform': 5.18.0 - /@prisma/fetch-engine@5.10.2: - resolution: {integrity: sha512-dSmXcqSt6DpTmMaLQ9K8ZKzVAMH3qwGCmYEZr/uVnzVhxRJ1EbT/w2MMwIdBNq1zT69Rvh0h75WMIi0mrIw7Hg==} + /@prisma/fetch-engine@5.18.0: + resolution: {integrity: sha512-I/3u0x2n31rGaAuBRx2YK4eB7R/1zCuayo2DGwSpGyrJWsZesrV7QVw7ND0/Suxeo/vLkJ5OwuBqHoCxvTHpOg==} dependencies: - '@prisma/debug': 5.10.2 - '@prisma/engines-version': 5.10.0-34.5a9203d0590c951969e85a7d07215503f4672eb9 - '@prisma/get-platform': 5.10.2 + '@prisma/debug': 5.18.0 + '@prisma/engines-version': 5.18.0-25.4c784e32044a8a016d99474bd02a3b6123742169 + '@prisma/get-platform': 5.18.0 /@prisma/generator-helper@4.16.2: resolution: {integrity: sha512-bMOH7y73Ui7gpQrioFeavMQA+Tf8ksaVf8Nhs9rQNzuSg8SSV6E9baczob0L5KGZTSgYoqnrRxuo03kVJYrnIg==} @@ -1830,10 +1830,10 @@ packages: - supports-color dev: true - /@prisma/get-platform@5.10.2: - resolution: {integrity: sha512-nqXP6vHiY2PIsebBAuDeWiUYg8h8mfjBckHh6Jezuwej0QJNnjDiOq30uesmg+JXxGk99nqyG3B7wpcOODzXvg==} + /@prisma/get-platform@5.18.0: + resolution: {integrity: sha512-Tk+m7+uhqcKDgnMnFN0lRiH7Ewea0OEsZZs9pqXa7i3+7svS3FSCqDBCaM9x5fmhhkufiG0BtunJVDka+46DlA==} dependencies: - '@prisma/debug': 5.10.2 + '@prisma/debug': 5.18.0 /@schematics/angular@13.3.11: resolution: {integrity: sha512-imKBnKYEse0SBVELZO/753nkpt3eEgpjrYkB+AFWF9YfO/4RGnYXDHoH8CFkzxPH9QQCgNrmsVFNiYGS+P/S1A==} @@ -6632,7 +6632,7 @@ packages: pino-http: 9.0.0 dev: false - /nestjs-prisma@0.23.0(@nestjs/common@10.0.0)(@prisma/client@5.10.2)(prisma@5.10.2): + /nestjs-prisma@0.23.0(@nestjs/common@10.0.0)(@prisma/client@5.18.0)(prisma@5.18.0): resolution: {integrity: sha512-0pIMDasayP+vMFSztcs85zu4WSPTKM85F8vIrqn7GsUBboEcKhI8eCeVghhNyKDGzEBaNAYNJlo2MAWdNuN7Tw==} peerDependencies: '@nestjs/common': ^7.0.0 || ^8.0.0 || ^9.0.0 || ^10.0.0 @@ -6642,9 +6642,9 @@ packages: '@angular-devkit/core': 13.3.11 '@angular-devkit/schematics': 13.3.11 '@nestjs/common': 10.0.0(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.1.13)(rxjs@7.8.1) - '@prisma/client': 5.10.2(prisma@5.10.2) + '@prisma/client': 5.18.0(prisma@5.18.0) '@schematics/angular': 13.3.11 - prisma: 5.10.2 + prisma: 5.18.0 transitivePeerDependencies: - chokidar dev: false @@ -7335,32 +7335,32 @@ packages: ansi-styles: 5.2.0 react-is: 18.2.0 - /prisma-nested-middleware@4.0.0(@prisma/client@5.10.2): + /prisma-nested-middleware@4.0.0(@prisma/client@5.18.0): resolution: {integrity: sha512-WSx0nl7KNXEzGaNC87fuDBOdAjj3V6um/JoQUo24PaMzMy8tvOYfb2Mw25OZhnrMXNTBhqgk4rJTUW3CVcDsHQ==} peerDependencies: '@prisma/client': '*' dependencies: '@open-draft/deferred-promise': 2.2.0 - '@prisma/client': 5.10.2(prisma@5.10.2) + '@prisma/client': 5.18.0(prisma@5.18.0) lodash: 4.17.21 dev: false - /prisma-soft-delete-middleware@1.3.1(@prisma/client@5.10.2): + /prisma-soft-delete-middleware@1.3.1(@prisma/client@5.18.0): resolution: {integrity: sha512-oQ2Ba8wb23ho6PqMXkOSTQTXNKouLmZuILYDHrnKk1Ui3cGIXuj9zNWyJkoaTcWHznsiAaoP1Oy8ytDhwQNQqA==} peerDependencies: '@prisma/client': '*' dependencies: - '@prisma/client': 5.10.2(prisma@5.10.2) - prisma-nested-middleware: 4.0.0(@prisma/client@5.10.2) + '@prisma/client': 5.18.0(prisma@5.18.0) + prisma-nested-middleware: 4.0.0(@prisma/client@5.18.0) dev: false - /prisma@5.10.2: - resolution: {integrity: sha512-hqb/JMz9/kymRE25pMWCxkdyhbnIWrq+h7S6WysJpdnCvhstbJSNP/S6mScEcqiB8Qv2F+0R3yG+osRaWqZacQ==} + /prisma@5.18.0: + resolution: {integrity: sha512-+TrSIxZsh64OPOmaSgVPH7ALL9dfU0jceYaMJXsNrTkFHO7/3RANi5K2ZiPB1De9+KDxCWn7jvRq8y8pvk+o9g==} engines: {node: '>=16.13'} hasBin: true requiresBuild: true dependencies: - '@prisma/engines': 5.10.2 + '@prisma/engines': 5.18.0 /process-nextick-args@1.0.7: resolution: {integrity: sha512-yN0WQmuCX63LP/TMvAg31nvT6m4vDqJEiiv2CAZqWOGNWutc9DfDk1NPYYmKUFmaVM2UwDowH4u5AHWYP/jxKw==} From 509285075d9f30b08ddab69c7b3199600a2bea98 Mon Sep 17 00:00:00 2001 From: dev-callgent Date: Thu, 22 Aug 2024 18:07:28 +0800 Subject: [PATCH 035/183] ci: docker file Signed-off-by: dev-callgent --- Dockerfile | 1 - 1 file changed, 1 deletion(-) diff --git a/Dockerfile b/Dockerfile index 536215a..31dbb3d 100644 --- a/Dockerfile +++ b/Dockerfile @@ -27,7 +27,6 @@ COPY --from=builder /app/node_modules ./node_modules COPY --from=builder /app/package*.json ./ COPY --from=builder /app/dist ./dist COPY --from=builder /app/prisma ./prisma -COPY .env* ./ EXPOSE 3000 CMD /bin/bash -c "npx prisma migrate deploy && pnpm start:prod" From 4bff20bb053c6aa57149890afd6ce1fcc301b74c Mon Sep 17 00:00:00 2001 From: dev-callgent <160819054+dev-callgent@users.noreply.github.com> Date: Thu, 22 Aug 2024 18:18:29 +0800 Subject: [PATCH 036/183] Update bootstrap.ts Signed-off-by: dev-callgent <160819054+dev-callgent@users.noreply.github.com> --- src/bootstrap.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/bootstrap.ts b/src/bootstrap.ts index df9746b..1b7e440 100644 --- a/src/bootstrap.ts +++ b/src/bootstrap.ts @@ -76,6 +76,7 @@ async function bootstrap(app: NestFastifyApplication, port: string) { useContainer(app.select(AppModule), { fallbackOnErrors: true }); const configService = app.get(ConfigService); + this.logger.info(configService.get('DATABASE_URL')); if (configService.get('ALLOW_CORS')) app.register(fastifyCors, { origin: [ From 2ad16c318860c0e810e7c0234ae13342290bda34 Mon Sep 17 00:00:00 2001 From: dev-callgent Date: Thu, 22 Aug 2024 18:47:00 +0800 Subject: [PATCH 037/183] Revert "Update bootstrap.ts" This reverts commit 4bff20bb053c6aa57149890afd6ce1fcc301b74c. Signed-off-by: dev-callgent --- src/bootstrap.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/src/bootstrap.ts b/src/bootstrap.ts index 1b7e440..df9746b 100644 --- a/src/bootstrap.ts +++ b/src/bootstrap.ts @@ -76,7 +76,6 @@ async function bootstrap(app: NestFastifyApplication, port: string) { useContainer(app.select(AppModule), { fallbackOnErrors: true }); const configService = app.get(ConfigService); - this.logger.info(configService.get('DATABASE_URL')); if (configService.get('ALLOW_CORS')) app.register(fastifyCors, { origin: [ From 2587a1a358419fda60ac40c263569deda5f025d7 Mon Sep 17 00:00:00 2001 From: dev-callgent <160819054+dev-callgent@users.noreply.github.com> Date: Thu, 22 Aug 2024 19:06:40 +0800 Subject: [PATCH 038/183] Update Dockerfile Signed-off-by: dev-callgent <160819054+dev-callgent@users.noreply.github.com> --- Dockerfile | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/Dockerfile b/Dockerfile index 31dbb3d..3e8c752 100644 --- a/Dockerfile +++ b/Dockerfile @@ -25,8 +25,9 @@ WORKDIR /app COPY --from=builder /app/node_modules ./node_modules COPY --from=builder /app/package*.json ./ -COPY --from=builder /app/dist ./dist COPY --from=builder /app/prisma ./prisma +COPY --from=builder /app/dist ./dist +COPY .env.dev ./ EXPOSE 3000 -CMD /bin/bash -c "npx prisma migrate deploy && pnpm start:prod" +CMD /bin/bash -c "if [ -n "$DATABASE_URL" ]; then echo "" >> .env; echo "DATABASE_URL=$DATABASE_URL" >> .env fi ; npx prisma migrate deploy && pnpm start:prod" From 39d7781476a676455b57d89fbd3b64f15eaba681 Mon Sep 17 00:00:00 2001 From: dev-callgent <160819054+dev-callgent@users.noreply.github.com> Date: Thu, 22 Aug 2024 19:12:41 +0800 Subject: [PATCH 039/183] Update Dockerfile Signed-off-by: dev-callgent <160819054+dev-callgent@users.noreply.github.com> --- Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Dockerfile b/Dockerfile index 3e8c752..a995787 100644 --- a/Dockerfile +++ b/Dockerfile @@ -30,4 +30,4 @@ COPY --from=builder /app/dist ./dist COPY .env.dev ./ EXPOSE 3000 -CMD /bin/bash -c "if [ -n "$DATABASE_URL" ]; then echo "" >> .env; echo "DATABASE_URL=$DATABASE_URL" >> .env fi ; npx prisma migrate deploy && pnpm start:prod" +CMD /bin/bash -c 'if [ -n "$DATABASE_URL" ]; then echo "" >> .env; echo "DATABASE_URL=$DATABASE_URL" >> .env fi ; npx prisma migrate deploy && pnpm start:prod' From 2c818968d47e625f7256d6324964550f329ba952 Mon Sep 17 00:00:00 2001 From: dev-callgent <160819054+dev-callgent@users.noreply.github.com> Date: Thu, 22 Aug 2024 19:18:08 +0800 Subject: [PATCH 040/183] Update Dockerfile Signed-off-by: dev-callgent <160819054+dev-callgent@users.noreply.github.com> --- Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Dockerfile b/Dockerfile index a995787..28c2ef8 100644 --- a/Dockerfile +++ b/Dockerfile @@ -30,4 +30,4 @@ COPY --from=builder /app/dist ./dist COPY .env.dev ./ EXPOSE 3000 -CMD /bin/bash -c 'if [ -n "$DATABASE_URL" ]; then echo "" >> .env; echo "DATABASE_URL=$DATABASE_URL" >> .env fi ; npx prisma migrate deploy && pnpm start:prod' +CMD /bin/bash -c 'if [ -n "$DATABASE_URL" ]; then echo "" >> .env; echo "DATABASE_URL=$DATABASE_URL" >> .env; fi ; npx prisma migrate deploy && pnpm start:prod' From 8d7951efdde8b5be6528d26f281966f39d2363b2 Mon Sep 17 00:00:00 2001 From: dev-callgent Date: Tue, 27 Aug 2024 11:26:20 +0800 Subject: [PATCH 041/183] fix: uaas e2e test Signed-off-by: dev-callgent --- .env.dev | 1 + .../0_row_level_security/migration.sql | 7 +----- .../20240822033907_init/migration.sql | 8 +------ prisma/schema.prisma | 9 ++----- prisma/seed-test.ts | 24 +++++++++++++++++++ src/agents/agents.service.ts | 5 +++- src/agents/llm.service.ts | 5 ++-- .../bff-callgent-functions.controller.ts | 2 +- .../callgent-functions.controller.ts | 8 +++---- .../callgent-functions.service.ts | 2 +- .../builtin/restapi/restapi.controller.ts | 14 ++++++----- .../adaptors/endpoint-adaptor.interface.ts | 4 ++-- src/endpoints/endpoints.service.ts | 4 ++-- .../event-listeners.service.ts | 2 +- src/infra/repo/prisma.middlewares.ts | 7 +++++- test/e2e/endpoints.e2e-spec.ts | 2 +- 16 files changed, 62 insertions(+), 42 deletions(-) diff --git a/.env.dev b/.env.dev index 921b142..3d4efb3 100644 --- a/.env.dev +++ b/.env.dev @@ -25,6 +25,7 @@ DATABASE_URL=postgresql://${POSTGRES_USER}:${POSTGRES_PASSWORD}@nest-postgres:54 # To have acccess to the database container from your local machine # use the DATABASE_URL below which replaces nest-postgres (container name) with localhost DATABASE_URL=postgresql://${POSTGRES_USER}:${POSTGRES_PASSWORD}@localhost:5432/${POSTGRES_DB}?schema=public&timezone=UTC +PRISMA_TRANSACTION_TIMEOUT=120000 DEFAULT_API_VERSION='1' DOCUMENTATION_VERSION='0.0.1' # DEV_ONLY no doc/test data generated if null diff --git a/prisma/migrations/0_row_level_security/migration.sql b/prisma/migrations/0_row_level_security/migration.sql index fc51a57..6fe2b67 100644 --- a/prisma/migrations/0_row_level_security/migration.sql +++ b/prisma/migrations/0_row_level_security/migration.sql @@ -121,9 +121,8 @@ CREATE TABLE "EndpointAuth" ( -- CreateTable CREATE TABLE "EventStore" ( - "pk" SERIAL NOT NULL, + "pk" BIGSERIAL NOT NULL, "id" VARCHAR(36) NOT NULL, - "tenantPk" INTEGER NOT NULL DEFAULT (current_setting('tenancy.tenantPk')::int), "srcId" VARCHAR(36) NOT NULL, "targetId" VARCHAR(36), "eventType" VARCHAR(36) NOT NULL, @@ -220,7 +219,6 @@ ALTER TABLE "CallgentFunction" ENABLE ROW LEVEL SECURITY; ALTER TABLE "Endpoint" ENABLE ROW LEVEL SECURITY; ALTER TABLE "EndpointAuth" ENABLE ROW LEVEL SECURITY; ALTER TABLE "EventListener" ENABLE ROW LEVEL SECURITY; -ALTER TABLE "EventStore" ENABLE ROW LEVEL SECURITY; ALTER TABLE "Task" ENABLE ROW LEVEL SECURITY; ALTER TABLE "TaskAction" ENABLE ROW LEVEL SECURITY; @@ -232,7 +230,6 @@ ALTER TABLE "CallgentFunction" FORCE ROW LEVEL SECURITY; ALTER TABLE "Endpoint" FORCE ROW LEVEL SECURITY; ALTER TABLE "EndpointAuth" FORCE ROW LEVEL SECURITY; ALTER TABLE "EventListener" FORCE ROW LEVEL SECURITY; -ALTER TABLE "EventStore" FORCE ROW LEVEL SECURITY; ALTER TABLE "Task" FORCE ROW LEVEL SECURITY; ALTER TABLE "TaskAction" FORCE ROW LEVEL SECURITY; @@ -244,7 +241,6 @@ CREATE POLICY tenant_isolation_policy ON "CallgentFunction" USING (("tenantPk" = CREATE POLICY tenant_isolation_policy ON "Endpoint" USING (("tenantPk" = 0) OR ("tenantPk" = current_setting('tenancy.tenantPk', TRUE)::int)); CREATE POLICY tenant_isolation_policy ON "EndpointAuth" USING (("tenantPk" = 0) OR ("tenantPk" = current_setting('tenancy.tenantPk', TRUE)::int)); CREATE POLICY tenant_isolation_policy ON "EventListener" USING (("tenantPk" = 0) OR ("tenantPk" = current_setting('tenancy.tenantPk', TRUE)::int)); -CREATE POLICY tenant_isolation_policy ON "EventStore" USING (("tenantPk" = 0) OR ("tenantPk" = current_setting('tenancy.tenantPk', TRUE)::int)); CREATE POLICY tenant_isolation_policy ON "Task" USING (("tenantPk" = 0) OR ("tenantPk" = current_setting('tenancy.tenantPk', TRUE)::int)); CREATE POLICY tenant_isolation_policy ON "TaskAction" USING (("tenantPk" = 0) OR ("tenantPk" = current_setting('tenancy.tenantPk', TRUE)::int)); @@ -256,6 +252,5 @@ CREATE POLICY bypass_rls_policy ON "CallgentFunction" USING (current_setting('te CREATE POLICY bypass_rls_policy ON "Endpoint" USING (current_setting('tenancy.bypass_rls', TRUE)::text = 'on'); CREATE POLICY bypass_rls_policy ON "EndpointAuth" USING (current_setting('tenancy.bypass_rls', TRUE)::text = 'on'); CREATE POLICY bypass_rls_policy ON "EventListener" USING (current_setting('tenancy.bypass_rls', TRUE)::text = 'on'); -CREATE POLICY bypass_rls_policy ON "EventStore" USING (current_setting('tenancy.bypass_rls', TRUE)::text = 'on'); CREATE POLICY bypass_rls_policy ON "Task" USING (current_setting('tenancy.bypass_rls', TRUE)::text = 'on'); CREATE POLICY bypass_rls_policy ON "TaskAction" USING (current_setting('tenancy.bypass_rls', TRUE)::text = 'on'); diff --git a/prisma/migrations/20240822033907_init/migration.sql b/prisma/migrations/20240822033907_init/migration.sql index 74f3eb3..78c9cd0 100644 --- a/prisma/migrations/20240822033907_init/migration.sql +++ b/prisma/migrations/20240822033907_init/migration.sql @@ -36,9 +36,6 @@ ALTER TABLE "EndpointAuth" ALTER COLUMN "tenantPk" SET DEFAULT (current_setting( -- AlterTable ALTER TABLE "EventListener" ALTER COLUMN "tenantPk" SET DEFAULT (current_setting('tenancy.tenantPk')::int); --- AlterTable -ALTER TABLE "EventStore" ALTER COLUMN "tenantPk" SET DEFAULT (current_setting('tenancy.tenantPk')::int); - -- AlterTable ALTER TABLE "Task" ALTER COLUMN "tenantPk" SET DEFAULT (current_setting('tenancy.tenantPk')::int); @@ -103,7 +100,7 @@ CREATE TABLE "LlmTemplate" ( -- CreateTable CREATE TABLE "LlmCache" ( - "pk" SERIAL NOT NULL, + "pk" BIGSERIAL NOT NULL, "name" VARCHAR(32) NOT NULL, "prompt" VARCHAR(4096) NOT NULL, "result" VARCHAR(4096) NOT NULL, @@ -208,9 +205,6 @@ CREATE INDEX "EventStore_srcId_idx" ON "EventStore"("srcId"); -- CreateIndex CREATE INDEX "EventStore_targetId_idx" ON "EventStore"("targetId"); --- CreateIndex -CREATE INDEX "EventStore_tenantPk_idx" ON "EventStore"("tenantPk"); - -- CreateIndex CREATE UNIQUE INDEX "Task_id_key" ON "Task"("id"); diff --git a/prisma/schema.prisma b/prisma/schema.prisma index 6c0bb99..272214d 100644 --- a/prisma/schema.prisma +++ b/prisma/schema.prisma @@ -413,7 +413,7 @@ model LlmTemplate { /// @DtoIgnoreModel model LlmCache { /// @DtoEntityHidden - pk Int @id @default(autoincrement()) + pk BigInt @id @default(autoincrement()) name String @db.VarChar(32) prompt String @db.VarChar(4096) @@ -491,15 +491,11 @@ enum EventCallbackType { model EventStore { /// @DtoEntityHidden - pk Int @id @default(autoincrement()) + pk BigInt @id @default(autoincrement()) /// @DtoCreateApiResponse /// @DtoUpdateApiResponse /// @DtoPlainApiResponse id String @unique @db.VarChar(36) - /// @DtoReadOnly - /// @DtoEntityHidden - // add to migration.sql - tenantPk Int @default(dbgenerated("(current_setting('tenancy.tenantPk')::int)")) /// @Description src entity id which bind to the listener srcId String @db.VarChar(36) @@ -532,5 +528,4 @@ model EventStore { @@index([srcId]) @@index([targetId]) - @@index([tenantPk]) } diff --git a/prisma/seed-test.ts b/prisma/seed-test.ts index 7dda115..d6202a0 100644 --- a/prisma/seed-test.ts +++ b/prisma/seed-test.ts @@ -149,6 +149,30 @@ function initTestData() { 'given below service functions:\nclass new-test-callgent {\n "function name: POST:/boards/list": {"params":[invoker,apiKey], "documents":"This function lists all boards.\n\n@param {Function} invoker - A function that makes the actual API call.\n@param {string} apiKey - Your secret API key.\n\n@returns {Promise} A promise that resolves to an object containing the API result.\n@property {Array} boards - An array of board objects.\n@property {string} boards[].id - A unique identifier for the board.\n@property {string} boards[].created - Time at which the board was created, in ISO 8601 format.\n@property {boolean} boards[].isPrivate - Whether or not the board is set as private in the administrative settings.\n@property {string} boards[].name - The board\'s name.\n@property {number} boards[].postCount - The number of non-deleted posts associated with the board. This number includes posts that are marked as closed or complete.\n@property {boolean} boards[].privateComments - Whether or not comments left on posts can be viewed by other end-users.\n@property {string} boards[].url - The URL to the board\'s page.\n@property {boolean} hasMore - Specifies whether this query returns more boards than the limit."},\n\n}\nand an service `invoker` function.\n\nPlease choose one function to fulfill below request:\n{\n"requesting function": "POST:/boards/list",\n"request from": "restAPI",\n"request_object": {"url":"/boards/list","method":"POST","headers":{"host":"127.0.0.1:3300","connection":"close","content-length":"0"},"query":{}},\n}\nand code for request_object to chosen function args mapping. if any data missing/unclear/ambiguous from request_object to invocation args, please ask question to the caller in below json.question field.\n\noutput a single-line json object:\n{ "funName": "the function name to be invoked", "params":"param names of the chosen function", "mapping": "the js function (invoker, request_object)=>{...;return functionArgsArray;}, full implementation to return the **real** args from request_object to invoke the chosen service function. don\'t use data not exist or ambiguous in request", "question": "question to ask the caller if anything not sure or missing for request to args mapping, *no* guess or assumption of the mapping. null if the mapping is crystal clear." }"}', '{"funName":"POST:/boards/list","params":["invoker","apiKey"],"mapping":"(invoker, request_object)=>{ let apiKey = request_object.params.ids; return [invoker, apiKey]; }","question":"What is the API key for this request? It is not provided in the request_object."}', ), + addLlmCache( + 5, + 'api2Function', + 'Please convert below API doc of format restAPI:\n{ "GET:/positions": {"summary":"List all job positions","description":"Retrieve a list of all available job positions.","operationId":"listPositions","responses":{"200":{"description":"A list of job positions","content":{"application/json":{"schema":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","description":"Unique identifier for the job position"},"title":{"type":"string","description":"Title of the job position"},"description":{"type":"string","description":"Description of the job position"},"location":{"type":"string","description":"Location of the job position"},"requirements":{"type":"array","items":{"type":"string"},"description":"List of requirements for the job position"},"createdAt":{"type":"string","format":"date-time","description":"Timestamp when the job position was created"},"updatedAt":{"type":"string","format":"date-time","description":"Timestamp when the job position was last updated"}}}}}}},"500":{"description":"Internal Server Error"}}} }\n\ninto a js function, the function must be as follows:\n// the `invoker` function do the real invocation\nasync (invoker: (req:{ path: string; method: string; headers?: { [key: string]: string }; query?: { [key: string]: string }; params?: { [key: string]: string }; files?: { [key: string]: any }; body?: any; form?: any;})=>Promise<{ apiResult: any; headers?: { [key: string]: string }; status?: number; statusText?: string;}>, ...apiParams) {...; const json = await invoker(...); ...; return apiResult; }\n\nplease generate the js function with **full implementation and error handling**! output a single-line json object:\n{"funName":"function name", "params":["invoker", ...apiParams]"documents":"formal js function documentation with description of params and response object with **all properties elaborated** exactly same as the API doc", "fullCode":"(invoker, ...)=>{...; const json = await invoker(...); ...; return apiResult;}"}', + '{"funName":"listPositions","params":["invoker"],"documents":"/**\n * List all job positions\n * Retrieve a list of all available job positions.\n * @param {Function} invoker - The function that performs the real invocation.\n * @returns {Promise} - A promise that resolves to an object containing the API result.\n * @property {Array} apiResult - A list of job positions.\n * @property {string} apiResult[].id - Unique identifier for the job position.\n * @property {string} apiResult[].title - Title of the job position.\n * @property {string} apiResult[].description - Description of the job position.\n * @property {string} apiResult[].location - Location of the job position.\n * @property {Array} apiResult[].requirements - List of requirements for the job position.\n * @property {string} apiResult[].createdAt - Timestamp when the job position was created.\n * @property {string} apiResult[].updatedAt - Timestamp when the job position was last updated.\n */","fullCode":"async (invoker) => {\n try {\n const json = await invoker({\n path: \'/positions\',\n method: \'GET\'\n });\n if (json.status === 200) {\n return json.apiResult;\n } else if (json.status === 500) {\n throw new Error(\'Internal Server Error\');\n } else {\n throw new Error(\'Unexpected status code: \' + json.status);\n }\n } catch (error) {\n console.error(\'Error fetching job positions:\', error);\n throw error;\n }\n}"}', + ), + addLlmCache( + 6, + 'api2Function', + 'Please convert below API doc of format restAPI:\n{ "GET:/positions/{positionId}": {"summary":"View a specific job position","description":"Retrieve details of a specific job position by its ID.","operationId":"viewPosition","parameters":[{"name":"positionId","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the job position to retrieve"}],"responses":{"200":{"description":"Details of the job position","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string","description":"Unique identifier for the job position"},"title":{"type":"string","description":"Title of the job position"},"description":{"type":"string","description":"Description of the job position"},"location":{"type":"string","description":"Location of the job position"},"requirements":{"type":"array","items":{"type":"string"},"description":"List of requirements for the job position"},"createdAt":{"type":"string","format":"date-time","description":"Timestamp when the job position was created"},"updatedAt":{"type":"string","format":"date-time","description":"Timestamp when the job position was last updated"}}}}}},"404":{"description":"Job position not found"},"500":{"description":"Internal Server Error"}}} }\n\ninto a js function, the function must be as follows:\n// the `invoker` function do the real invocation\nasync (invoker: (req:{ path: string; method: string; headers?: { [key: string]: string }; query?: { [key: string]: string }; params?: { [key: string]: string }; files?: { [key: string]: any }; body?: any; form?: any;})=>Promise<{ apiResult: any; headers?: { [key: string]: string }; status?: number; statusText?: string;}>, ...apiParams) {...; const json = await invoker(...); ...; return apiResult; }\n\nplease generate the js function with **full implementation and error handling**! output a single-line json object:\n{"funName":"function name", "params":["invoker", ...apiParams]"documents":"formal js function documentation with description of params and response object with **all properties elaborated** exactly same as the API doc", "fullCode":"(invoker, ...)=>{...; const json = await invoker(...); ...; return apiResult;}"}', + '{"funName":"viewPosition","params":["invoker","positionId"],"documents":"/**\\n * View a specific job position\\n * Retrieve details of a specific job position by its ID.\\n * @param {Function} invoker - The function that performs the real invocation.\\n * @param {string} positionId - The ID of the job position to retrieve.\\n * @returns {Promise} - A promise that resolves to the job position details.\\n * @property {string} id - Unique identifier for the job position.\\n * @property {string} title - Title of the job position.\\n * @property {string} description - Description of the job position.\\n * @property {string} location - Location of the job position.\\n * @property {Array} requirements - List of requirements for the job position.\\n * @property {string} createdAt - Timestamp when the job position was created.\\n * @property {string} updatedAt - Timestamp when the job position was last updated.\\n */","fullCode":"async (invoker, positionId) => {\\n try {\\n const json = await invoker({\\n path: `/positions/${positionId}`,\\n method: \'GET\',\\n params: { positionId }\\n });\\n if (json.status === 200) {\\n return json.apiResult;\\n } else if (json.status === 404) {\\n throw new Error(\'Job position not found\');\\n } else if (json.status === 500) {\\n throw new Error(\'Internal Server Error\');\\n }\\n } catch (error) {\\n throw new Error(`Error fetching job position: ${error.message}`);\\n }\\n}"}', + ), + addLlmCache( + 7, + 'api2Function', + 'Please convert below API doc of format restAPI:\n{ "POST:/positions/{positionId}/apply": {"summary":"Apply for a position","description":"Submit an application for a specific job position.","operationId":"applyForPosition","parameters":[{"name":"positionId","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the job position to apply for"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"applicantName":{"type":"string","description":"Name of the applicant"},"email":{"type":"string","format":"email","description":"Email address of the applicant"},"resume":{"type":"string","format":"binary","description":"Resume of the applicant"},"coverLetter":{"type":"string","description":"Cover letter of the applicant"},"appliedAt":{"type":"string","format":"date-time","description":"Timestamp when the application was submitted"}}}}}},"responses":{"201":{"description":"Application submitted successfully"},"400":{"description":"Invalid input"},"404":{"description":"Job position not found"},"500":{"description":"Internal Server Error"}}} }\n\ninto a js function, the function must be as follows:\n// the `invoker` function do the real invocation\nasync (invoker: (req:{ path: string; method: string; headers?: { [key: string]: string }; query?: { [key: string]: string }; params?: { [key: string]: string }; files?: { [key: string]: any }; body?: any; form?: any;})=>Promise<{ apiResult: any; headers?: { [key: string]: string }; status?: number; statusText?: string;}>, ...apiParams) {...; const json = await invoker(...); ...; return apiResult; }\n\nplease generate the js function with **full implementation and error handling**! output a single-line json object:\n{"funName":"function name", "params":["invoker", ...apiParams]"documents":"formal js function documentation with description of params and response object with **all properties elaborated** exactly same as the API doc", "fullCode":"(invoker, ...)=>{...; const json = await invoker(...); ...; return apiResult;}"}', + '{"funName":"applyForPosition","params":["invoker","positionId","applicantName","email","resume","coverLetter","appliedAt"],"documents":"/**\\n * Apply for a position\\n * @param {Function} invoker - The function that performs the actual API invocation.\\n * @param {string} positionId - The ID of the job position to apply for.\\n * @param {string} applicantName - Name of the applicant.\\n * @param {string} email - Email address of the applicant.\\n * @param {string} resume - Resume of the applicant.\\n * @param {string} coverLetter - Cover letter of the applicant.\\n * @param {string} appliedAt - Timestamp when the application was submitted.\\n * @returns {Promise<{apiResult: any, headers?: { [key: string]: string }, status?: number, statusText?: string}>} The result of the API call.\\n */","fullCode":"async (invoker, positionId, applicantName, email, resume, coverLetter, appliedAt) => {\\n try {\\n const req = {\\n path: `/positions/${positionId}/apply`,\\n method: \'POST\',\\n headers: {\\n \'Content-Type\': \'application/json\'\\n },\\n body: {\\n applicantName,\\n email,\\n resume,\\n coverLetter,\\n appliedAt\\n }\\n };\\n const json = await invoker(req);\\n if (json.status === 201) {\\n return { apiResult: json.apiResult, headers: json.headers, status: json.status, statusText: json.statusText };\\n } else if (json.status === 400) {\\n throw new Error(\'Invalid input\');\\n } else if (json.status === 404) {\\n throw new Error(\'Job position not found\');\\n } else if (json.status === 500) {\\n throw new Error(\'Internal Server Error\');\\n } else {\\n throw new Error(\'Unknown error\');\\n }\\n } catch (error) {\\n console.error(\'Error applying for position:\', error.message);\\n throw error;\\n }\\n}"}', + ), + addLlmCache( + 8, + 'map2Function', + 'given below service functions:\nclass test-callgent {\n "function name: GET:/positions": {"params":[invoker], "documents":"List all job positions"},\n\n}\nand an service `invoker` function.\n\nPlease choose one function to fulfill below request:\n{\n"requesting function": "GET:/positions",\n"request from": "restAPI",\n"request_object": {"url":"/positions","method":"GET","headers":{"user-agent":"Apifox/1.0.0 (https://apifox.com)","accept":"*/*","host":"127.0.0.1:3000","accept-encoding":"gzip, deflate, br","connection":"keep-alive"},"query":{}},\n}\nand code for request_object to chosen function args mapping. if any data missing/unclear/ambiguous from request_object to invocation args, please ask question to the caller in below json.question field.\n\noutput a single-line json object:\n{ "funName": "the function name to be invoked", "params":"param names of the chosen function", "mapping": "the js function (invoker, request_object)=>{...;return functionArgsArray;}, full implementation to return the **real** args from request_object to invoke the chosen service function. don\'t use data not exist or ambiguous in request", "question": "question to ask the caller if anything not sure or missing for request to args mapping, *no* guess or assumption of the mapping. null if the mapping is crystal clear." }"}', + '{ "funName": "GET:/positions", "params": ["invoker"], "mapping": "(invoker, request_object)=>{return [invoker];}", "question": "null" }', + ), ]; } diff --git a/src/agents/agents.service.ts b/src/agents/agents.service.ts index 0e53dbd..35f5a39 100644 --- a/src/agents/agents.service.ts +++ b/src/agents/agents.service.ts @@ -64,7 +64,10 @@ export class AgentsService { reqEvent.context.function = mapped; if (mapped.question) { - if (!progressive) throw new BadRequestException(mapped.question); + if (!progressive) + throw new BadRequestException( + 'Question from service: ' + mapped.question, + ); // emit progressive requesting event const { event: prEvent, statusCode } = diff --git a/src/agents/llm.service.ts b/src/agents/llm.service.ts index a11e7b6..82d1cba 100644 --- a/src/agents/llm.service.ts +++ b/src/agents/llm.service.ts @@ -1,4 +1,4 @@ -import { TransactionHost } from '@nestjs-cls/transactional'; +import { Transactional, TransactionHost } from '@nestjs-cls/transactional'; import { TransactionalAdapterPrisma } from '@nestjs-cls/transactional-adapter-prisma'; import { Injectable } from '@nestjs/common'; import { ConfigService } from '@nestjs/config'; @@ -24,6 +24,7 @@ export class LLMService { * @param args prompt args * @param returnType if not empty, try to parse the response as the specified json */ + @Transactional() async template( template: string, args: { [key: string]: any }, @@ -57,7 +58,7 @@ export class LLMService { this._checkJsonType(returnType, ret, isArray); } - if (notCached) this._llmCache(template, prompt, result); + if (notCached) await this._llmCache(template, prompt, result); return ret; } diff --git a/src/bff/callgent-functions/bff-callgent-functions.controller.ts b/src/bff/callgent-functions/bff-callgent-functions.controller.ts index dc36965..9e000ed 100644 --- a/src/bff/callgent-functions/bff-callgent-functions.controller.ts +++ b/src/bff/callgent-functions/bff-callgent-functions.controller.ts @@ -21,7 +21,7 @@ export class BffCallgentFunctionsController { @Body() apiTxt: CallgentApiText, ) { - const endpoint = EntityIdExists.entity(apiTxt, 'endpoint'); + const endpoint = EntityIdExists.entity(apiTxt, 'endpointId'); await this.callgentFunctionService.importBatch( endpoint, apiTxt, diff --git a/src/callgent-functions/callgent-functions.controller.ts b/src/callgent-functions/callgent-functions.controller.ts index 960bf89..7c4a3fd 100644 --- a/src/callgent-functions/callgent-functions.controller.ts +++ b/src/callgent-functions/callgent-functions.controller.ts @@ -33,7 +33,7 @@ import { UpdateCallgentFunctionDto } from './dto/update-callgent-function.dto'; export class CallgentApis extends ApiSpec { @EntityIdExists('endpoint', 'id') - endpoint: string; + endpointId: string; } export class CallgentApiText { @@ -43,7 +43,7 @@ export class CallgentApiText { }) @IsNotEmpty() @EntityIdExists('endpoint', 'id') - endpoint: string; + endpointId: string; @ApiProperty({ required: true, @@ -82,7 +82,7 @@ export class CallgentFunctionsController { @Body() apis: CallgentApis, ) { - const endpoint = EntityIdExists.entity(apis, 'endpoint'); + const endpoint = EntityIdExists.entity(apis, 'endpointId'); return { data: await this.callgentFunctionService.createBatch( endpoint, @@ -102,7 +102,7 @@ export class CallgentFunctionsController { @Body() apiTxt: CallgentApiText, ) { - const endpoint = EntityIdExists.entity(apiTxt, 'endpoint'); + const endpoint = EntityIdExists.entity(apiTxt, 'endpointId'); return { data: await this.callgentFunctionService.importBatch( endpoint, diff --git a/src/callgent-functions/callgent-functions.service.ts b/src/callgent-functions/callgent-functions.service.ts index d873980..c63bfc2 100644 --- a/src/callgent-functions/callgent-functions.service.ts +++ b/src/callgent-functions/callgent-functions.service.ts @@ -98,7 +98,7 @@ export class CallgentFunctionsService { id: Utils.uuid(), funName: e.name, documents: e.content.summary, - fullCode: '', + fullCode: e.fullCode, endpointId: endpoint.id, callgentId: endpoint.callgentId, createdBy: createdBy, diff --git a/src/endpoints/adaptors/builtin/restapi/restapi.controller.ts b/src/endpoints/adaptors/builtin/restapi/restapi.controller.ts index bc822ab..aa054c9 100644 --- a/src/endpoints/adaptors/builtin/restapi/restapi.controller.ts +++ b/src/endpoints/adaptors/builtin/restapi/restapi.controller.ts @@ -40,7 +40,7 @@ export class RestApiController { description: "comma separated callgent ids, eg: 'id1,id2,id3'. ", }) @ApiParam({ - name: 'endpoint', + name: 'endpointId', required: false, description: 'endpoint id, optional: "/callgents/the-id`//`invoke/api/"', }) @@ -57,16 +57,18 @@ export class RestApiController { description: 'progressive request responder', }) @ApiHeader({ name: 'x-callgent-callback', required: false }) - @All(':id/:endpoint/invoke/api/*') + @ApiHeader({ name: 'x-callgent-timeout', required: false }) + @All(':id/:endpointId/invoke/api/*') async execute( @Req() req, @Param('id') callgentId: string, - @Param('endpoint') endpoint?: string, + @Param('endpointId') endpointId?: string, @Headers('x-callgent-taskId') taskId?: string, @Headers('x-callgent-progressive') progressive?: string, @Headers('x-callgent-callback') callback?: string, + @Headers('x-callgent-timeout') timeout?: string, ) { - const basePath = `${callgentId}/${endpoint}/invoke/api/`; + const basePath = `${callgentId}/${endpointId}/invoke/api/`; let funName = req.url.substr(req.url.indexOf(basePath) + basePath.length); if (funName) funName = RestAPIAdaptor.formalActionName(req.method, '/' + funName); @@ -78,7 +80,7 @@ export class RestApiController { EndpointType.CLIENT, callgentId, 'restAPI', - endpoint, + endpointId, ); if (!cep) throw new NotFoundException( @@ -99,7 +101,7 @@ export class RestApiController { progressive, funName, }), - // FIXME sync timeout + parseInt(timeout) || 0, // sync timeout ); // FIXME data if (statusCode < 400) return { event, statusCode, message }; diff --git a/src/endpoints/adaptors/endpoint-adaptor.interface.ts b/src/endpoints/adaptors/endpoint-adaptor.interface.ts index 4069148..cf1bf58 100644 --- a/src/endpoints/adaptors/endpoint-adaptor.interface.ts +++ b/src/endpoints/adaptors/endpoint-adaptor.interface.ts @@ -47,7 +47,7 @@ export abstract class EndpointAdaptor { try { json = await $RefParser.dereference(json); } catch (err) { - throw new BadRequestException(err); + throw new BadRequestException('Only openAPI.JSON is supported'); } const { paths } = json; @@ -79,7 +79,7 @@ export abstract class EndpointAdaptor { return ret; } - throw new BadRequestException('Unsupported format: ' + format); + throw new BadRequestException('Only openAPI.JSON is supported'); } static formalActionName = (method, path) => diff --git a/src/endpoints/endpoints.service.ts b/src/endpoints/endpoints.service.ts index a44cb1e..dddf813 100644 --- a/src/endpoints/endpoints.service.ts +++ b/src/endpoints/endpoints.service.ts @@ -111,11 +111,11 @@ export class EndpointsService { type: EndpointType, callgentId: string, adaptorKey: string, - endpoint?: string, + endpointId?: string, ) { const prisma = this.txHost.tx as PrismaClient; return this.tenancyService.bypassTenancy(prisma).then(() => - this.findFirstByType(type, callgentId, adaptorKey, endpoint).then( + this.findFirstByType(type, callgentId, adaptorKey, endpointId).then( async (v) => { v && this.tenancyService.setTenantId(v.tenantPk); await this.tenancyService.bypassTenancy(prisma, false); diff --git a/src/event-listeners/event-listeners.service.ts b/src/event-listeners/event-listeners.service.ts index d91f3ad..93b14a5 100644 --- a/src/event-listeners/event-listeners.service.ts +++ b/src/event-listeners/event-listeners.service.ts @@ -45,7 +45,7 @@ export class EventListenersService { result, Utils.sleep(timeout).then(() => { return { - event, + event: { ...event, rawReq: undefined }, statusCode: event.statusCode, message: `Sync invocation timeout(${timeout}ms), will respond via callback`, }; diff --git a/src/infra/repo/prisma.middlewares.ts b/src/infra/repo/prisma.middlewares.ts index d12d5b8..e4251be 100644 --- a/src/infra/repo/prisma.middlewares.ts +++ b/src/infra/repo/prisma.middlewares.ts @@ -13,7 +13,12 @@ export const mainPrismaServiceOptions = ( ): PrismaServiceOptions => { const logLevels = config.get('LOG_LEVELS_PRISMA'); return { - prismaOptions: { log: logLevels ? JSON.parse(logLevels) : [] }, + prismaOptions: { + log: logLevels ? JSON.parse(logLevels) : [], + transactionOptions: { + timeout: parseInt(config.get('PRISMA_TRANSACTION_TIMEOUT', '5000')), + }, + }, middlewares: [ loggingMiddleware({ logger: new Logger('Prisma'), diff --git a/test/e2e/endpoints.e2e-spec.ts b/test/e2e/endpoints.e2e-spec.ts index 15a78eb..dd07abe 100644 --- a/test/e2e/endpoints.e2e-spec.ts +++ b/test/e2e/endpoints.e2e-spec.ts @@ -64,7 +64,7 @@ export const prepareCannyCallgent = async () => { const { json: { data: functionCount }, } = await addCallgentFunctions({ - endpoint: serverEndpoint.id, + endpointId: serverEndpoint.id, text: jsonData, format: 'openAPI', }); From aeba935c2fcae61491d5b12f6865c7410b30a5f8 Mon Sep 17 00:00:00 2001 From: dev-callgent Date: Wed, 28 Aug 2024 16:32:58 +0800 Subject: [PATCH 042/183] fix: map 2 function Signed-off-by: dev-callgent --- package.json | 2 +- pnpm-lock.yaml | 16 +++++------ .../migration.sql | 27 +++++++++++++++++++ prisma/schema.prisma | 5 ++-- prisma/seed.ts | 8 ++++++ src/agents/agents.service.ts | 9 ++++++- src/event-listeners/event-object.ts | 2 +- 7 files changed, 56 insertions(+), 13 deletions(-) create mode 100644 prisma/migrations/20240828045122_event_listener_desc/migration.sql diff --git a/package.json b/package.json index 3896725..d26f531 100644 --- a/package.json +++ b/package.json @@ -50,7 +50,7 @@ "@nestjs/swagger": "^7.3.0", "@nodeteam/nestjs-prisma-pagination": "^1.0.6", "@prisma/client": "5.18.0", - "axios": "^1.6.7", + "axios": "^1.7.5", "bcrypt": "^5.1.1", "class-transformer": "^0.5.1", "class-validator": "^0.14.1", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 8161c1c..adefaaf 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -59,8 +59,8 @@ dependencies: specifier: 5.18.0 version: 5.18.0(prisma@5.18.0) axios: - specifier: ^1.6.7 - version: 1.6.7(debug@2.6.9) + specifier: ^1.7.5 + version: 1.7.5(debug@2.6.9) bcrypt: specifier: ^5.1.1 version: 5.1.1 @@ -2686,10 +2686,10 @@ packages: - supports-color dev: false - /axios@1.6.7(debug@2.6.9): - resolution: {integrity: sha512-/hDJGff6/c7u0hDkvkGxR/oy6CbCs8ziCsC7SqmhjfozqiJGc8Z11wrv9z9lYfY4K8l+H9TpjcMDX0xOZmx+RA==} + /axios@1.7.5(debug@2.6.9): + resolution: {integrity: sha512-fZu86yCo+svH3uqJ/yTdQ0QHpQu5oL+/QE+QPSv6BZSkDAoky9vytxp7u5qk83OJFS3kEBcesWni9WTZAv3tSw==} dependencies: - follow-redirects: 1.15.5(debug@2.6.9) + follow-redirects: 1.15.6(debug@2.6.9) form-data: 4.0.0 proxy-from-env: 1.1.0 transitivePeerDependencies: @@ -4361,8 +4361,8 @@ packages: resolution: {integrity: sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==} dev: true - /follow-redirects@1.15.5(debug@2.6.9): - resolution: {integrity: sha512-vSFWUON1B+yAw1VN4xMfxgn5fTUiaOzAJCKBwIIgT/+7CuGy9+r+5gITvP62j3RmaD5Ph65UaERdOSRGUzZtgw==} + /follow-redirects@1.15.6(debug@2.6.9): + resolution: {integrity: sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==} engines: {node: '>=4.0'} peerDependencies: debug: '*' @@ -8733,7 +8733,7 @@ packages: requiresBuild: true dependencies: async: 3.2.5 - axios: 1.6.7(debug@2.6.9) + axios: 1.7.5(debug@2.6.9) bindings: 1.5.0 lodash: 4.17.21 nan: 2.19.0 diff --git a/prisma/migrations/20240828045122_event_listener_desc/migration.sql b/prisma/migrations/20240828045122_event_listener_desc/migration.sql new file mode 100644 index 0000000..94a977c --- /dev/null +++ b/prisma/migrations/20240828045122_event_listener_desc/migration.sql @@ -0,0 +1,27 @@ +-- AlterTable +ALTER TABLE "Callgent" ALTER COLUMN "tenantPk" SET DEFAULT (current_setting('tenancy.tenantPk')::int); + +-- AlterTable +ALTER TABLE "CallgentFunction" ALTER COLUMN "tenantPk" SET DEFAULT (current_setting('tenancy.tenantPk')::int); + +-- AlterTable +ALTER TABLE "Endpoint" ALTER COLUMN "tenantPk" SET DEFAULT (current_setting('tenancy.tenantPk')::int); + +-- AlterTable +ALTER TABLE "EndpointAuth" ALTER COLUMN "tenantPk" SET DEFAULT (current_setting('tenancy.tenantPk')::int); + +-- AlterTable +ALTER TABLE "EventListener" ADD COLUMN "description" VARCHAR(2000) NOT NULL DEFAULT '', +ALTER COLUMN "tenantPk" SET DEFAULT (current_setting('tenancy.tenantPk')::int); + +-- AlterTable +ALTER TABLE "Task" ALTER COLUMN "tenantPk" SET DEFAULT (current_setting('tenancy.tenantPk')::int); + +-- AlterTable +ALTER TABLE "TaskAction" ALTER COLUMN "tenantPk" SET DEFAULT (current_setting('tenancy.tenantPk')::int); + +-- AlterTable +ALTER TABLE "User" ALTER COLUMN "tenantPk" SET DEFAULT (current_setting('tenancy.tenantPk')::int); + +-- AlterTable +ALTER TABLE "UserIdentity" ALTER COLUMN "tenantPk" SET DEFAULT (current_setting('tenancy.tenantPk')::int); diff --git a/prisma/schema.prisma b/prisma/schema.prisma index 272214d..77fd577 100644 --- a/prisma/schema.prisma +++ b/prisma/schema.prisma @@ -468,6 +468,7 @@ model EventListener { serviceType ServiceType // callgent, service serviceName String @db.VarChar(255) funName String @db.VarChar(255) + description String @default("") @db.VarChar(2000) // TODO add the listener's input/output props in event.context, for automatic checking /// @DtoReadOnly @@ -491,11 +492,11 @@ enum EventCallbackType { model EventStore { /// @DtoEntityHidden - pk BigInt @id @default(autoincrement()) + pk BigInt @id @default(autoincrement()) /// @DtoCreateApiResponse /// @DtoUpdateApiResponse /// @DtoPlainApiResponse - id String @unique @db.VarChar(36) + id String @unique @db.VarChar(36) /// @Description src entity id which bind to the listener srcId String @db.VarChar(36) diff --git a/prisma/seed.ts b/prisma/seed.ts index 99e8c64..66248eb 100644 --- a/prisma/seed.ts +++ b/prisma/seed.ts @@ -37,6 +37,7 @@ function initEventListeners() { serviceType: 'SERVICE', serviceName: 'EndpointsService', funName: 'preprocessClientRequest', + description: 'Find the CEP, then preprocess the request', createdBy: 'GLOBAL', priority: (priority += 100), }, @@ -50,6 +51,8 @@ function initEventListeners() { serviceType: 'SERVICE', serviceName: 'CallgentFunctionsService', funName: 'loadFunctions', + description: + 'Load all entries of the callgent into event.context.functions', createdBy: 'GLOBAL', priority: (priority += 100), }, @@ -63,6 +66,8 @@ function initEventListeners() { serviceType: 'SERVICE', serviceName: 'EventStoresService', funName: 'loadTargetEvents', + description: + 'Load all events of same targetId into event.context.tgtEvents', createdBy: 'GLOBAL', priority: (priority += 100), }, @@ -76,6 +81,8 @@ function initEventListeners() { serviceType: 'SERVICE', serviceName: 'AgentsService', funName: 'map2Function', + description: + 'Map the request event to a endpoint function, put into event.context.map2Function and event.context.functions[0]', createdBy: 'GLOBAL', priority: (priority += 100), }, @@ -89,6 +96,7 @@ function initEventListeners() { serviceType: 'SERVICE', serviceName: 'SandBoxService', funName: 'map2Args', + description: 'Map the request event to the function arguments', createdBy: 'GLOBAL', priority: (priority += 100), }, diff --git a/src/agents/agents.service.ts b/src/agents/agents.service.ts index 35f5a39..cc6a1b3 100644 --- a/src/agents/agents.service.ts +++ b/src/agents/agents.service.ts @@ -61,7 +61,7 @@ export class AgentsService { }, { funName: '', mapping: '', question: '' }, ); // TODO check `funName` exists in callgentFunctions, validating `mapping` - reqEvent.context.function = mapped; + reqEvent.context.map2Function = mapped; if (mapped.question) { if (!progressive) @@ -81,6 +81,13 @@ export class AgentsService { if (statusCode == 1) return { event: reqEvent, callbackName: 'map2FunctionProgressive' }; throw new HttpException(prEvent.message, statusCode); + } else { + const functions = reqEvent.context.functions.filter( + (f) => f.name == mapped.funName, + ); + if (functions?.length != 1) + throw new BadRequestException('Failed to map to function: ' + mapped); + reqEvent.context.functions = functions; } } diff --git a/src/event-listeners/event-object.ts b/src/event-listeners/event-object.ts index 75ebf31..87f43eb 100644 --- a/src/event-listeners/event-object.ts +++ b/src/event-listeners/event-object.ts @@ -18,7 +18,7 @@ export class EventObject { } public readonly id: string; public statusCode = -1; // for response only - public readonly context: { [key: string]: JsonValue } = {}; + public readonly context: { [key: string]: any } = {}; public message: string; public stopPropagation = false; public defaultPrevented = false; From daf59810acc00569b548eff4684f43f40579b83e Mon Sep 17 00:00:00 2001 From: dev-callgent Date: Thu, 29 Aug 2024 15:56:10 +0800 Subject: [PATCH 043/183] refactor: store callgent-function as formal openapi.json Signed-off-by: dev-callgent --- package.json | 3 +- pnpm-lock.yaml | 9 ++ .../migration.sql | 49 +++++++++ prisma/schema.prisma | 19 ++-- src/agents/agents.service.ts | 30 +++--- src/app.module.ts | 2 + .../callgent-tree.controller.ts | 9 +- .../bff-callgent-functions.controller.ts | 11 +- .../callgent-functions.controller.ts | 5 +- .../callgent-functions.service.ts | 33 +++--- .../adaptors/builtin/email/email.adaptor.ts | 6 +- .../builtin/restapi/restapi.controller.ts | 7 +- .../adaptors/builtin/web/webpage.adaptor.ts | 5 - .../adaptors/endpoint-adaptor.interface.ts | 101 ++++++++++-------- src/endpoints/endpoints.service.ts | 6 +- src/infra/libs/utils.ts | 3 + src/sandbox/sandbox.module.ts | 7 ++ src/sandbox/sandbox.service.spec.ts | 18 ++++ src/sandbox/sandbox.service.ts | 8 ++ 19 files changed, 218 insertions(+), 113 deletions(-) create mode 100644 prisma/migrations/20240829075201_callgent_function_refactor/migration.sql create mode 100644 src/sandbox/sandbox.module.ts create mode 100644 src/sandbox/sandbox.service.spec.ts create mode 100644 src/sandbox/sandbox.service.ts diff --git a/package.json b/package.json index d26f531..315649d 100644 --- a/package.json +++ b/package.json @@ -74,7 +74,8 @@ "prisma-soft-delete-middleware": "^1.3.1", "reflect-metadata": "^0.1.13", "rxjs": "^7.8.1", - "v8-sandbox": "^3.2.10" + "v8-sandbox": "^3.2.10", + "yaml": "^2.5.0" }, "devDependencies": { "@chax-at/transactional-prisma-testing": "^1.1.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index adefaaf..f74b243 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -133,6 +133,9 @@ dependencies: v8-sandbox: specifier: ^3.2.10 version: 3.2.10(debug@2.6.9) + yaml: + specifier: ^2.5.0 + version: 2.5.0 devDependencies: '@chax-at/transactional-prisma-testing': @@ -9019,6 +9022,12 @@ packages: engines: {node: '>= 6'} dev: true + /yaml@2.5.0: + resolution: {integrity: sha512-2wWLbGbYDiSqqIKoPjar3MPgB94ErzCtrNE1FdqGuaO0pi2JGjmE8aW8TDZwzU7vuxcGRdL/4gPQwQ7hD5AMSw==} + engines: {node: '>= 14'} + hasBin: true + dev: false + /yargs-parser@2.4.1: resolution: {integrity: sha512-9pIKIJhnI5tonzG6OnCFlz/yln8xHYcGl+pn3xR0Vzff0vzN1PbNRaelgfgRUwZ3s4i3jvxT9WhmUGL4whnasA==} dependencies: diff --git a/prisma/migrations/20240829075201_callgent_function_refactor/migration.sql b/prisma/migrations/20240829075201_callgent_function_refactor/migration.sql new file mode 100644 index 0000000..812dd8b --- /dev/null +++ b/prisma/migrations/20240829075201_callgent_function_refactor/migration.sql @@ -0,0 +1,49 @@ +/* + Warnings: + + - You are about to drop the column `content` on the `CallgentFunction` table. All the data in the column will be lost. + - You are about to drop the column `documents` on the `CallgentFunction` table. All the data in the column will be lost. + - You are about to drop the column `fullCode` on the `CallgentFunction` table. All the data in the column will be lost. + - You are about to drop the column `funName` on the `CallgentFunction` table. All the data in the column will be lost. + - You are about to drop the column `params` on the `CallgentFunction` table. All the data in the column will be lost. + - Added the required column `method` to the `CallgentFunction` table without a default value. This is not possible if the table is not empty. + - Added the required column `path` to the `CallgentFunction` table without a default value. This is not possible if the table is not empty. + - Added the required column `signature` to the `CallgentFunction` table without a default value. This is not possible if the table is not empty. + +*/ +-- AlterTable +ALTER TABLE "Callgent" ALTER COLUMN "tenantPk" SET DEFAULT (current_setting('tenancy.tenantPk')::int); + +-- AlterTable +ALTER TABLE "CallgentFunction" DROP COLUMN "content", +DROP COLUMN "documents", +DROP COLUMN "fullCode", +DROP COLUMN "funName", +DROP COLUMN "params", +ADD COLUMN "method" VARCHAR(15) NOT NULL, +ADD COLUMN "path" VARCHAR(1000) NOT NULL, +ADD COLUMN "signature" JSON NOT NULL, +ADD COLUMN "summary" VARCHAR(1023) NOT NULL DEFAULT '', +ALTER COLUMN "tenantPk" SET DEFAULT (current_setting('tenancy.tenantPk')::int), +ALTER COLUMN "name" SET DATA TYPE VARCHAR(1023); + +-- AlterTable +ALTER TABLE "Endpoint" ALTER COLUMN "tenantPk" SET DEFAULT (current_setting('tenancy.tenantPk')::int); + +-- AlterTable +ALTER TABLE "EndpointAuth" ALTER COLUMN "tenantPk" SET DEFAULT (current_setting('tenancy.tenantPk')::int); + +-- AlterTable +ALTER TABLE "EventListener" ALTER COLUMN "tenantPk" SET DEFAULT (current_setting('tenancy.tenantPk')::int); + +-- AlterTable +ALTER TABLE "Task" ALTER COLUMN "tenantPk" SET DEFAULT (current_setting('tenancy.tenantPk')::int); + +-- AlterTable +ALTER TABLE "TaskAction" ALTER COLUMN "tenantPk" SET DEFAULT (current_setting('tenancy.tenantPk')::int); + +-- AlterTable +ALTER TABLE "User" ALTER COLUMN "tenantPk" SET DEFAULT (current_setting('tenancy.tenantPk')::int); + +-- AlterTable +ALTER TABLE "UserIdentity" ALTER COLUMN "tenantPk" SET DEFAULT (current_setting('tenancy.tenantPk')::int); diff --git a/prisma/schema.prisma b/prisma/schema.prisma index 77fd577..8d7cf11 100644 --- a/prisma/schema.prisma +++ b/prisma/schema.prisma @@ -174,6 +174,7 @@ model Callgent { @@index([tenantPk]) } +/// @description callgent function in openAPI.json format model CallgentFunction { /// @DtoEntityHidden pk Int @id @default(autoincrement()) @@ -186,16 +187,14 @@ model CallgentFunction { // add to migration.sql tenantPk Int @default(dbgenerated("(current_setting('tenancy.tenantPk')::int)")) - name String @db.VarChar(255) - /// @description js function name to invoke this callgent function - funName String @db.VarChar(255) - params String[] @db.VarChar(31) - /// @description js function api docs - documents String @db.VarChar(4095) - /// @description js actual code to invoke this callgent function - fullCode String @db.VarChar(1023) - /// @description endpoint id or command or code - content Json @db.Json + /// @DtoCreateApiResponse + /// @DtoUpdateApiResponse + /// @DtoPlainApiResponse + name String @db.VarChar(1023) /// @description `${method} ${path}` + path String @db.VarChar(1000) /// @description openAPI path + method String @db.VarChar(15) /// @description openAPI method + summary String @default("") @db.VarChar(1023) + signature Json @db.Json /// @description declaration of API params and responses // @DtoReadOnly /// @CustomValidator(EntityIdExists, 'callgent', 'id', ../../infra/repo/validators/entity-exists.validator) diff --git a/src/agents/agents.service.ts b/src/agents/agents.service.ts index cc6a1b3..eb06ece 100644 --- a/src/agents/agents.service.ts +++ b/src/agents/agents.service.ts @@ -14,21 +14,21 @@ export class AgentsService { private readonly eventListenersService: EventListenersService, ) {} - async api2Function( - format: string, - handle: string, - args: { [key: string]: string }, - ) { - return this.llmService.template( - 'api2Function', - { - format, - handle, - ...args, - }, - { funName: '', params: [''], documents: '', fullCode: '' }, - ); - } + // async api2Function( + // format: string, + // handle: string, + // args: { [key: string]: string }, + // ) { + // return this.llmService.template( + // 'api2Function', + // { + // format, + // handle, + // ...args, + // }, + // { funName: '', params: [''], documents: '', fullCode: '' }, + // ); + // } /** args mapping to a single invocation, w/o vars/flows/functions */ async map2Function( diff --git a/src/app.module.ts b/src/app.module.ts index db24f1a..6b41c02 100644 --- a/src/app.module.ts +++ b/src/app.module.ts @@ -19,6 +19,7 @@ import { TasksModule } from './tasks/tasks.module'; import { UsersModule } from './users/users.module'; import { CallgentTreeModule } from './bff/bff-callgent-tree/callgent-tree.module'; import { BffCallgentFunctionsModule } from './bff/callgent-functions/bff-callgent-functions.module'; +import { SandboxModule } from './sandbox/sandbox.module'; @Module({ imports: [ @@ -45,6 +46,7 @@ import { BffCallgentFunctionsModule } from './bff/callgent-functions/bff-callgen EmailsModule, CallgentTreeModule, BffCallgentFunctionsModule, + SandboxModule, ], controllers: [AppController], providers: [AppService], diff --git a/src/bff/bff-callgent-tree/callgent-tree.controller.ts b/src/bff/bff-callgent-tree/callgent-tree.controller.ts index 4540167..8a8e4c1 100644 --- a/src/bff/bff-callgent-tree/callgent-tree.controller.ts +++ b/src/bff/bff-callgent-tree/callgent-tree.controller.ts @@ -69,15 +69,10 @@ export class CallgentTreeController { if (ep.type == 'CLIENT') { CEP.push(ep); } else if (ep.type == 'SERVER') { - const funcs = await this.callgentFunctionsService.findMany({ - select: { fullCode: false, callgentId: false, content: false }, + ep.children = await this.callgentFunctionsService.findMany({ + select: { pk: false, signature: false, callgentId: false }, where: { endpointId: ep.id }, }); - ep.children = funcs.map((f) => ({ - ...f, - id: f.id, - pk: undefined, - })); SEP.push(ep); } else if (ep.type == 'EVENT') { EEP.push(ep); diff --git a/src/bff/callgent-functions/bff-callgent-functions.controller.ts b/src/bff/callgent-functions/bff-callgent-functions.controller.ts index 9e000ed..66f70eb 100644 --- a/src/bff/callgent-functions/bff-callgent-functions.controller.ts +++ b/src/bff/callgent-functions/bff-callgent-functions.controller.ts @@ -1,10 +1,19 @@ -import { Body, Controller, Inject, Post, Req, UseGuards } from '@nestjs/common'; +import { + BadRequestException, + Body, + Controller, + Inject, + Post, + Req, + UseGuards, +} from '@nestjs/common'; import { ApiTags } from '@nestjs/swagger'; import { CallgentApiText } from '../../callgent-functions/callgent-functions.controller'; import { CallgentFunctionsService } from '../../callgent-functions/callgent-functions.service'; import { EndpointDto } from '../../endpoints/dto/endpoint.dto'; import { JwtGuard } from '../../infra/auth/jwt/jwt.guard'; import { EntityIdExists } from '../../infra/repo/validators/entity-exists.validator'; +import { EndpointType } from '@prisma/client'; @ApiTags('bff') @UseGuards(JwtGuard) diff --git a/src/callgent-functions/callgent-functions.controller.ts b/src/callgent-functions/callgent-functions.controller.ts index 7c4a3fd..5cdaef4 100644 --- a/src/callgent-functions/callgent-functions.controller.ts +++ b/src/callgent-functions/callgent-functions.controller.ts @@ -54,10 +54,11 @@ export class CallgentApiText { @ApiProperty({ required: false, - description: 'The format of the api content text', + description: 'The format of the api content: json, yaml, text', + enum: ['json', 'yaml', 'text'], }) @IsOptional() - format?: string; + format?: 'json' | 'yaml' | 'text'; } @ApiTags('CallgentFunctions') diff --git a/src/callgent-functions/callgent-functions.service.ts b/src/callgent-functions/callgent-functions.service.ts index c63bfc2..df7208e 100644 --- a/src/callgent-functions/callgent-functions.service.ts +++ b/src/callgent-functions/callgent-functions.service.ts @@ -2,7 +2,7 @@ import { TransactionHost, Transactional } from '@nestjs-cls/transactional'; import { TransactionalAdapterPrisma } from '@nestjs-cls/transactional-adapter-prisma'; import { BadRequestException, Inject, Injectable } from '@nestjs/common'; import { PaginatorTypes, paginator } from '@nodeteam/nestjs-prisma-pagination'; -import { Prisma, PrismaClient } from '@prisma/client'; +import { EndpointType, Prisma, PrismaClient } from '@prisma/client'; import { ApiSpec } from '../endpoints/adaptors/endpoint-adaptor.interface'; import { EndpointDto } from '../endpoints/dto/endpoint.dto'; import { EndpointsService } from '../endpoints/endpoints.service'; @@ -23,8 +23,7 @@ export class CallgentFunctionsService { protected readonly defSelect: Prisma.CallgentFunctionSelect = { pk: false, tenantPk: false, - fullCode: false, - content: false, + signature: false, callgentId: false, createdBy: false, deletedAt: false, @@ -92,18 +91,14 @@ export class CallgentFunctionsService { const { apis } = spec; // validation const actMap = apis.map( - (e) => { - return { - ...e, - id: Utils.uuid(), - funName: e.name, - documents: e.content.summary, - fullCode: e.fullCode, - endpointId: endpoint.id, - callgentId: endpoint.callgentId, - createdBy: createdBy, - }; - }, + (f) => ({ + ...f, + id: Utils.uuid(), + name: Utils.formalApiName(f.method, f.path), + endpointId: endpoint.id, + callgentId: endpoint.callgentId, + createdBy: createdBy, + }), ); const prisma = this.txHost.tx as PrismaClient; @@ -116,9 +111,14 @@ export class CallgentFunctionsService { @Transactional() async importBatch( endpoint: EndpointDto, - apiTxt: { text: string; format?: string }, + apiTxt: { text: string; format?: 'json' | 'yaml' | 'text' }, createdBy: string, ) { + if (endpoint?.type != EndpointType.SERVER) + throw new BadRequestException( + 'Function entries can only be imported into Server Endpoint. ', + ); + const apis = await this.endpointsService.parseApis(endpoint, apiTxt); return this.createBatch(endpoint, apis, createdBy); } @@ -187,6 +187,7 @@ export class CallgentFunctionsService { @Transactional() update(dto: UpdateCallgentFunctionDto) { if (!dto.id) return; + dto.name = Utils.formalApiName(dto.method, dto.path); const prisma = this.txHost.tx as PrismaClient; return selectHelper(this.defSelect, (select) => prisma.callgentFunction.update({ diff --git a/src/endpoints/adaptors/builtin/email/email.adaptor.ts b/src/endpoints/adaptors/builtin/email/email.adaptor.ts index 3dd142f..18d3fd1 100644 --- a/src/endpoints/adaptors/builtin/email/email.adaptor.ts +++ b/src/endpoints/adaptors/builtin/email/email.adaptor.ts @@ -4,9 +4,8 @@ import { EndpointDto } from '../../../dto/endpoint.dto'; import { ClientRequestEvent } from '../../../events/client-request.event'; import { EndpointAdaptorName } from '../../endpoint-adaptor.decorator'; import { - ApiSpec, EndpointAdaptor, - EndpointConfig, + EndpointConfig } from '../../endpoint-adaptor.interface'; @EndpointAdaptorName('Email', 'both') @@ -42,9 +41,6 @@ export class EmailAdaptor extends EndpointAdaptor { // } - parseApis(apiTxt: { text: string; format?: string }): Promise { - return super.parseApis(apiTxt); - } readData(name: string, hints?: { [key: string]: any }): Promise { throw new Error('Method not implemented.'); } diff --git a/src/endpoints/adaptors/builtin/restapi/restapi.controller.ts b/src/endpoints/adaptors/builtin/restapi/restapi.controller.ts index aa054c9..947040a 100644 --- a/src/endpoints/adaptors/builtin/restapi/restapi.controller.ts +++ b/src/endpoints/adaptors/builtin/restapi/restapi.controller.ts @@ -12,12 +12,12 @@ import { } from '@nestjs/common'; import { ApiHeader, ApiOperation, ApiParam, ApiTags } from '@nestjs/swagger'; import { EndpointType } from '@prisma/client'; +import { CallgentsService } from '../../../../callgents/callgents.service'; import { EventListenersService } from '../../../../event-listeners/event-listeners.service'; import { JwtGuard } from '../../../../infra/auth/jwt/jwt.guard'; +import { Utils } from '../../../../infra/libs/utils'; import { EndpointsService } from '../../../endpoints.service'; import { ClientRequestEvent } from '../../../events/client-request.event'; -import { RestAPIAdaptor } from './restapi.adaptor'; -import { CallgentsService } from '../../../../callgents/callgents.service'; /** global rest-api endpoint entry */ @ApiTags('Client Endpoint: Rest-API') @@ -70,8 +70,7 @@ export class RestApiController { ) { const basePath = `${callgentId}/${endpointId}/invoke/api/`; let funName = req.url.substr(req.url.indexOf(basePath) + basePath.length); - if (funName) - funName = RestAPIAdaptor.formalActionName(req.method, '/' + funName); + if (funName) funName = Utils.formalApiName(req.method, '/' + funName); const caller = req.user?.sub || req.ip || req.socket.remoteAddress; // TODO owner defaults to caller callgent diff --git a/src/endpoints/adaptors/builtin/web/webpage.adaptor.ts b/src/endpoints/adaptors/builtin/web/webpage.adaptor.ts index 2b978df..07c400a 100644 --- a/src/endpoints/adaptors/builtin/web/webpage.adaptor.ts +++ b/src/endpoints/adaptors/builtin/web/webpage.adaptor.ts @@ -4,7 +4,6 @@ import { EndpointDto } from '../../../dto/endpoint.dto'; import { ClientRequestEvent } from '../../../events/client-request.event'; import { EndpointAdaptorName } from '../../endpoint-adaptor.decorator'; import { - ApiSpec, EndpointAdaptor, EndpointConfig, } from '../../endpoint-adaptor.interface'; @@ -87,10 +86,6 @@ export class WebpageAdaptor extends EndpointAdaptor { // } - parseApis(apiTxt: { text: string; format?: string }): Promise { - throw new Error('Method not implemented.'); - } - readData(name: string, hints?: { [key: string]: any }): Promise { throw new Error('Method not implemented.'); } diff --git a/src/endpoints/adaptors/endpoint-adaptor.interface.ts b/src/endpoints/adaptors/endpoint-adaptor.interface.ts index cf1bf58..06286e8 100644 --- a/src/endpoints/adaptors/endpoint-adaptor.interface.ts +++ b/src/endpoints/adaptors/endpoint-adaptor.interface.ts @@ -1,9 +1,11 @@ import $RefParser from '@apidevtools/json-schema-ref-parser'; -import { BadRequestException } from '@nestjs/common'; +import { BadRequestException, NotFoundException } from '@nestjs/common'; import { ApiProperty } from '@nestjs/swagger'; import { AgentsService } from '../../agents/agents.service'; import { EndpointDto } from '../dto/endpoint.dto'; import { ClientRequestEvent } from '../events/client-request.event'; +import yaml from 'yaml'; +import { Prisma } from '@prisma/client'; export abstract class EndpointAdaptor { protected readonly agentsService: AgentsService; @@ -38,64 +40,73 @@ export abstract class EndpointAdaptor { /** send response back to client */ abstract callback(resp: any): Promise; - /** parse api spec from text */ - async parseApis({ text, format }: { text: string; format?: string }) { + /** parse api to openAPI.JSON format */ + async parseApis({ + text, + format, + }: { + text: string; + format?: 'json' | 'yaml' | 'text'; + }) { const ret: ApiSpec = { apis: [] }; - if (!format || format === 'openAPI') { - let json = JSON.parse(text); - try { - json = await $RefParser.dereference(json); - } catch (err) { - throw new BadRequestException('Only openAPI.JSON is supported'); + let json: any; + try { + if (format == 'yaml') { + json = yaml.parse(text); + } else if (format == 'json') { + json = JSON.parse(text); } - const { paths } = json; - - if (paths) { - const ps = Object.entries(paths); - for (const [path, pathApis] of ps) { - const entries = Object.entries(pathApis); - for (const [method, restApi] of entries) { - // wrap schema - - const apiName = EndpointAdaptor.formalActionName(method, path); - const func = await this.agentsService.api2Function( - 'restAPI', - '(req:{ path: string; method: string; headers?: { [key: string]: string }; query?: { [key: string]: string }; params?: { [key: string]: string }; files?: { [key: string]: any }; body?: any; form?: any;})=>Promise<{ apiResult: any; headers?: { [key: string]: string }; status?: number; statusText?: string;}>', - { - apiName, - apiContent: JSON.stringify(restApi), - }, - ); - ret.apis.push({ - name: apiName, - ...func, - content: restApi, - }); - } + + if (!json?.openapi || !json.paths) { + // convert text to openAPI.JSON + throw new Error('Not implemented.'); + } + } catch (err) { + throw new BadRequestException( + `Failed to parse content as ${format || 'text'} format, msg: ${ + err.message + }`, + ); + } + try { + json = await $RefParser.dereference(json); + } catch (err) { + throw new BadRequestException( + 'Invalid openAPI.JSON, failed to dereference.', + ); + } + const { paths, components } = json; // TODO: save components onto SEP + + const ps = paths && Object.entries(paths); + if (ps?.length) { + for (const [path, pathApis] of ps) { + const entries = Object.entries(pathApis); + for (const [method, restApi] of entries) { + const summary = restApi.summary; + delete restApi.summary; + ret.apis.push({ + path: path.toLowerCase(), + method: method.toUpperCase(), + summary, + signature: restApi, + }); } } - return ret; } - - throw new BadRequestException('Only openAPI.JSON is supported'); + throw new NotFoundException('No API found in the text.'); } - - static formalActionName = (method, path) => - `${(method || 'GET').toUpperCase()}:${path}`; } export interface AdaptedDataSource {} export class ApiSpec { apis: { - name: string; - funName: string; - params: string[]; - documents: string; - fullCode: string; - content: any; + path: string; + method: string; + summary: string; + signature: Prisma.JsonObject; }[]; } diff --git a/src/endpoints/endpoints.service.ts b/src/endpoints/endpoints.service.ts index dddf813..58fafe2 100644 --- a/src/endpoints/endpoints.service.ts +++ b/src/endpoints/endpoints.service.ts @@ -275,12 +275,14 @@ export class EndpointsService { throw new NotFoundException(`Endpoint not found, id=${id}`); } + /** parse APIs to openAPI.json format */ async parseApis( endpoint: EndpointDto, - apiTxt: { text: string; format?: string }, + apiTxt: { text: string; format?: 'json' | 'yaml' | 'text' }, ) { const adaptor = this.getAdaptor(endpoint.adaptorKey, endpoint.type); - return adaptor.parseApis(apiTxt); + // TODO read endpoint.components + return adaptor.parseApis(apiTxt); //, endpoint.components); } /** preprocess req from cep, by adaptor */ diff --git a/src/infra/libs/utils.ts b/src/infra/libs/utils.ts index 939bd85..74a276d 100644 --- a/src/infra/libs/utils.ts +++ b/src/infra/libs/utils.ts @@ -74,6 +74,9 @@ export class Utils { static sleep(ms: number) { return new Promise((resolve) => setTimeout(resolve, ms)); } + + static formalApiName = (method: string, path: string) => + `${method.toUpperCase()} ${path.toLowerCase()}`; } /** to make some props optional, e.g. Optional */ diff --git a/src/sandbox/sandbox.module.ts b/src/sandbox/sandbox.module.ts new file mode 100644 index 0000000..c069e0a --- /dev/null +++ b/src/sandbox/sandbox.module.ts @@ -0,0 +1,7 @@ +import { Module } from '@nestjs/common'; +import { SandboxService } from './sandbox.service'; + +@Module({ + providers: [SandboxService] +}) +export class SandboxModule {} diff --git a/src/sandbox/sandbox.service.spec.ts b/src/sandbox/sandbox.service.spec.ts new file mode 100644 index 0000000..c1348de --- /dev/null +++ b/src/sandbox/sandbox.service.spec.ts @@ -0,0 +1,18 @@ +import { Test, TestingModule } from '@nestjs/testing'; +import { SandboxService } from './sandbox.service'; + +describe('SandboxService', () => { + let service: SandboxService; + + beforeEach(async () => { + const module: TestingModule = await Test.createTestingModule({ + providers: [SandboxService], + }).compile(); + + service = module.get(SandboxService); + }); + + it('should be defined', () => { + expect(service).toBeDefined(); + }); +}); diff --git a/src/sandbox/sandbox.service.ts b/src/sandbox/sandbox.service.ts new file mode 100644 index 0000000..4c1243b --- /dev/null +++ b/src/sandbox/sandbox.service.ts @@ -0,0 +1,8 @@ +import { Injectable } from '@nestjs/common'; + +@Injectable() +export class SandboxService { + async map2Args() { + // TODO: implement + } +} From fa081e385b877d4eccd457ce99bcfef85c1e6452 Mon Sep 17 00:00:00 2001 From: dev-callgent Date: Fri, 30 Aug 2024 14:57:36 +0800 Subject: [PATCH 044/183] refactor: map 2 function Signed-off-by: dev-callgent --- .../migration.sql | 1 + prisma/schema.prisma | 11 ++++++----- prisma/seed.ts | 16 +++++++--------- src/agents/agents.service.ts | 8 +++++--- .../callgent-functions.service.ts | 2 +- .../adaptors/endpoint-adaptor.interface.ts | 10 +++++++++- src/event-listeners/event-listeners.service.ts | 1 + src/infra/repo/select.helper.ts | 3 ++- 8 files changed, 32 insertions(+), 20 deletions(-) diff --git a/prisma/migrations/20240829075201_callgent_function_refactor/migration.sql b/prisma/migrations/20240829075201_callgent_function_refactor/migration.sql index 812dd8b..ea331b5 100644 --- a/prisma/migrations/20240829075201_callgent_function_refactor/migration.sql +++ b/prisma/migrations/20240829075201_callgent_function_refactor/migration.sql @@ -23,6 +23,7 @@ DROP COLUMN "params", ADD COLUMN "method" VARCHAR(15) NOT NULL, ADD COLUMN "path" VARCHAR(1000) NOT NULL, ADD COLUMN "signature" JSON NOT NULL, +ADD COLUMN "summary" VARCHAR(511) NOT NULL DEFAULT '', ADD COLUMN "summary" VARCHAR(1023) NOT NULL DEFAULT '', ALTER COLUMN "tenantPk" SET DEFAULT (current_setting('tenancy.tenantPk')::int), ALTER COLUMN "name" SET DATA TYPE VARCHAR(1023); diff --git a/prisma/schema.prisma b/prisma/schema.prisma index 8d7cf11..98dda51 100644 --- a/prisma/schema.prisma +++ b/prisma/schema.prisma @@ -190,11 +190,12 @@ model CallgentFunction { /// @DtoCreateApiResponse /// @DtoUpdateApiResponse /// @DtoPlainApiResponse - name String @db.VarChar(1023) /// @description `${method} ${path}` - path String @db.VarChar(1000) /// @description openAPI path - method String @db.VarChar(15) /// @description openAPI method - summary String @default("") @db.VarChar(1023) - signature Json @db.Json /// @description declaration of API params and responses + name String @db.VarChar(1023) /// @description `${method} ${path}` + path String @db.VarChar(1000) /// @description openAPI path + method String @db.VarChar(15) /// @description openAPI method + summary String @default("") @db.VarChar(511) + description String @default("") @db.VarChar(1023) + signature Json @db.Json /// @description declaration of API params and responses // @DtoReadOnly /// @CustomValidator(EntityIdExists, 'callgent', 'id', ../../infra/repo/validators/entity-exists.validator) diff --git a/prisma/seed.ts b/prisma/seed.ts index 66248eb..d796a54 100644 --- a/prisma/seed.ts +++ b/prisma/seed.ts @@ -144,23 +144,21 @@ please generate the js function with **full implementation and error handling**! { pk: 2, name: 'map2Function', - prompt: `given below service functions: -class {{=it.callgentName}} {{{~ it.callgentFunctions :fun }} - "function name: {{=fun.name}}": {"params":[{{=fun.params}}], "documents":"{{=fun.documents}}"}, -{{~}} -} -and an service \`invoker\` function. + prompt: `given below service APIs: +service {{=it.callgentName}} {{{~ it.callgentFunctions :fun }} + "API: {{=fun.name}}": {"endpoint": "{{=fun.name}}", "summary":"{{=fun.summary}}", {{=fun.description ? '"description":"'+fun.description+'", ':''}}"signature":{{=JSON.stringify(fun.signature)}} }, +{{~}}} -Please choose one function to fulfill below request: +Please choose one API to fulfill below request: { -{{ if (it.funName) { }}"requesting function": "{{=it.funName}}", +{{ if (it.funName) { }}"requesting endpoint": "{{=it.funName}}", {{ } }}"request from": "{{=it.cepAdaptor}}", "request_object": {{=JSON.stringify(it.req)}}, } and code for request_object to chosen function args mapping. if any data missing/unclear/ambiguous from request_object to invocation args, please ask question to the caller in below json.question field. output a single-line json object: -{ "funName": "the function name to be invoked", "params":"param names of the chosen function", "mapping": "the js function (invoker, request_object)=>{...;return functionArgsArray;}, full implementation to return the **real** args from request_object to invoke the chosen service function. don't use data not exist or ambiguous in request", "question": "question to ask the caller if anything not sure or missing for request to args mapping, *no* guess or assumption of the mapping. null if the mapping is crystal clear." }"}`, +{ "endpoint": "the chosen API endpoint to be invoked", "args":"request params/body/headers/..., with same structure as the signature JSON object(no more args than it), or null if no args needed", "mapping": "if the the request_object is structured (or null if unstructured), generate the js function (request_object)=>{...;return API_signature_args;}, full implementation to return the **real** args from request_object to invoke the API. don't use data not exist or ambiguous in request", "question": "question to ask the caller if anything not sure or missing for request to args mapping, *no* guess or assumption of the mapping. null if the mapping is crystal clear." }"}`, }, ]; diff --git a/src/agents/agents.service.ts b/src/agents/agents.service.ts index eb06ece..60af3e6 100644 --- a/src/agents/agents.service.ts +++ b/src/agents/agents.service.ts @@ -30,7 +30,9 @@ export class AgentsService { // ); // } - /** args mapping to a single invocation, w/o vars/flows/functions */ + /** + * map req to an API function, generate args(with vars/conversations), argsMapping function if applicable + */ async map2Function( reqEvent: ClientRequestEvent, ): Promise { @@ -59,7 +61,7 @@ export class AgentsService { cepAdaptor, callgentFunctions, }, - { funName: '', mapping: '', question: '' }, + { endpoint: '', args: '', mapping: '', question: '' }, ); // TODO check `funName` exists in callgentFunctions, validating `mapping` reqEvent.context.map2Function = mapped; @@ -83,7 +85,7 @@ export class AgentsService { throw new HttpException(prEvent.message, statusCode); } else { const functions = reqEvent.context.functions.filter( - (f) => f.name == mapped.funName, + (f) => f.name == mapped.endpoint, ); if (functions?.length != 1) throw new BadRequestException('Failed to map to function: ' + mapped); diff --git a/src/callgent-functions/callgent-functions.service.ts b/src/callgent-functions/callgent-functions.service.ts index df7208e..f532745 100644 --- a/src/callgent-functions/callgent-functions.service.ts +++ b/src/callgent-functions/callgent-functions.service.ts @@ -37,7 +37,7 @@ export class CallgentFunctionsService { // TODO if too many functions, use summary first const { data: funcs } = await this.findAll({ - select: { createdAt: false, updatedAt: false }, + select: { createdAt: false, updatedAt: false, signature: null }, where: { callgentId: callgentId, name: funName }, perPage: Number.MAX_SAFE_INTEGER, }); diff --git a/src/endpoints/adaptors/endpoint-adaptor.interface.ts b/src/endpoints/adaptors/endpoint-adaptor.interface.ts index 06286e8..9919323 100644 --- a/src/endpoints/adaptors/endpoint-adaptor.interface.ts +++ b/src/endpoints/adaptors/endpoint-adaptor.interface.ts @@ -83,12 +83,19 @@ export abstract class EndpointAdaptor { for (const [path, pathApis] of ps) { const entries = Object.entries(pathApis); for (const [method, restApi] of entries) { - const summary = restApi.summary; + const summary = `${ + restApi.operationId ? restApi.operationId + ': ' : '' + }${restApi.summary}`; + const description = restApi.description; + delete restApi.summary; + delete restApi.description; + delete restApi.operationId; ret.apis.push({ path: path.toLowerCase(), method: method.toUpperCase(), summary, + description, signature: restApi, }); } @@ -106,6 +113,7 @@ export class ApiSpec { path: string; method: string; summary: string; + description: string; signature: Prisma.JsonObject; }[]; } diff --git a/src/event-listeners/event-listeners.service.ts b/src/event-listeners/event-listeners.service.ts index 93b14a5..4f1eacd 100644 --- a/src/event-listeners/event-listeners.service.ts +++ b/src/event-listeners/event-listeners.service.ts @@ -43,6 +43,7 @@ export class EventListenersService { return timeout > 0 ? Promise.race([ result, + // FIXME: timeout response will cause tx close, fails listeners execution! Utils.sleep(timeout).then(() => { return { event: { ...event, rawReq: undefined }, diff --git a/src/infra/repo/select.helper.ts b/src/infra/repo/select.helper.ts index b3babd2..c1ac6dd 100644 --- a/src/infra/repo/select.helper.ts +++ b/src/infra/repo/select.helper.ts @@ -45,7 +45,8 @@ function mergeSelects(defaultSelect: S, select: S): S { select = { ...select }; Object.entries(defaultSelect).forEach(([key, value]) => { if (!(key in select)) select[key] = value; - else if (null === select[key]) delete select[key]; + else if (null === select[key] || undefined === select[key]) + delete select[key]; }); return select; From ef176a23d722a423996b518bc93e93db941c6433 Mon Sep 17 00:00:00 2001 From: dev-callgent Date: Fri, 30 Aug 2024 15:08:33 +0800 Subject: [PATCH 045/183] ci: security/dependabot/11 Signed-off-by: dev-callgent --- package.json | 1 + pnpm-lock.yaml | 17 ++++++++++------- 2 files changed, 11 insertions(+), 7 deletions(-) diff --git a/package.json b/package.json index 315649d..152e21e 100644 --- a/package.json +++ b/package.json @@ -52,6 +52,7 @@ "@prisma/client": "5.18.0", "axios": "^1.7.5", "bcrypt": "^5.1.1", + "braces": "^3.0.3", "class-transformer": "^0.5.1", "class-validator": "^0.14.1", "dot": "^1.1.3", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index f74b243..4c708ef 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -64,6 +64,9 @@ dependencies: bcrypt: specifier: ^5.1.1 version: 5.1.1 + braces: + specifier: ^3.0.3 + version: 3.0.3 class-transformer: specifier: ^0.5.1 version: 0.5.1 @@ -2822,11 +2825,11 @@ packages: repeat-element: 1.1.4 dev: false - /braces@3.0.2: - resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} + /braces@3.0.3: + resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} engines: {node: '>=8'} dependencies: - fill-range: 7.0.1 + fill-range: 7.1.1 /browserslist@4.22.3: resolution: {integrity: sha512-UAp55yfwNv0klWNapjs/ktHoguxuQNGnOzxYmfnXIS+8AsRDZkSDxg7R1AX3GKzn078SBI5dzwzj/Yx0Or0e3A==} @@ -3006,7 +3009,7 @@ packages: engines: {node: '>= 8.10.0'} dependencies: anymatch: 3.1.3 - braces: 3.0.2 + braces: 3.0.3 glob-parent: 5.1.2 is-binary-path: 2.1.0 is-glob: 4.0.3 @@ -4264,8 +4267,8 @@ packages: repeat-string: 1.6.1 dev: false - /fill-range@7.0.1: - resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} + /fill-range@7.1.1: + resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} engines: {node: '>=8'} dependencies: to-regex-range: 5.0.1 @@ -6367,7 +6370,7 @@ packages: resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} engines: {node: '>=8.6'} dependencies: - braces: 3.0.2 + braces: 3.0.3 picomatch: 2.3.1 /mime-db@1.52.0: From d3c0fe4cd33849167c88b7ca9de4bb7f2a0eba0f Mon Sep 17 00:00:00 2001 From: dev-callgent Date: Mon, 2 Sep 2024 16:11:56 +0800 Subject: [PATCH 046/183] feat: sparkpost relay-webhook integration Signed-off-by: dev-callgent --- .env.dev | 6 + .env.test | 6 + prisma/schema.prisma | 6 +- prisma/seed.ts | 10 +- src/agents/agents.service.ts | 24 ++-- .../callgent-functions.controller.ts | 2 +- .../callgent-functions.service.ts | 4 +- .../dto/sparkpost-relay-object.interface.ts | 97 ++++++++++++++ src/emails/emails.controller.spec.ts | 18 +++ src/emails/emails.controller.ts | 40 ++++++ src/emails/emails.module.ts | 2 + src/emails/emails.service.ts | 90 +++++++++++-- .../adaptors/builtin/email/email.adaptor.ts | 55 +++++--- .../builtin/restapi/restapi.adaptor.ts | 31 +++-- .../builtin/restapi/restapi.controller.ts | 23 ++-- .../adaptors/builtin/web/webpage.adaptor.ts | 29 +++-- ....interface.ts => endpoint-adaptor.base.ts} | 9 +- src/endpoints/endpoints.module.ts | 2 +- src/endpoints/endpoints.service.ts | 23 +++- .../listeners/callgent-created.listener.ts | 4 +- src/event-listeners/event-listeners.module.ts | 2 + .../event-listeners.service.ts | 118 ++++++++---------- src/event-listeners/event-object.ts | 1 - src/event-stores/event-stores.service.ts | 33 ++++- src/infra/auth/jwt/jwt.service.ts | 14 ++- src/task-actions/task-actions.service.ts | 8 +- src/users/auth.controller.ts | 47 ++++++- src/users/users.service.ts | 2 +- 28 files changed, 540 insertions(+), 166 deletions(-) create mode 100644 src/emails/dto/sparkpost-relay-object.interface.ts create mode 100644 src/emails/emails.controller.spec.ts create mode 100644 src/emails/emails.controller.ts rename src/endpoints/adaptors/{endpoint-adaptor.interface.ts => endpoint-adaptor.base.ts} (95%) diff --git a/.env.dev b/.env.dev index 3d4efb3..696fb05 100644 --- a/.env.dev +++ b/.env.dev @@ -51,5 +51,11 @@ CALLGENT_SITE_URL=https://callgent.com CALLGENT_SITE_NAME=Callgent.com EMAIL_DEFAULT_SENDER={"name": "Callgent", "email": "noreply@callgent.com"} +EMAIL_RELAY_HOST=my.callgent.com + # https://app.brevo.com/settings/keys/api EMAIL_BREVO_API_KEY=key +EMAIL_SPARKPOST_API_KEY=xxx +EMAIL_SPARKPOST_RELAY_CLIENT_ID=spark-post-relayer +EMAIL_SPARKPOST_RELAY_CLIENT_SECRET=xxx +EMAIL_SPARKPOST_RELAY_EXPIRES_IN=86400 diff --git a/.env.test b/.env.test index 81c63d4..789724a 100644 --- a/.env.test +++ b/.env.test @@ -51,5 +51,11 @@ CALLGENT_SITE_URL=https://callgent.com CALLGENT_SITE_NAME=Callgent.com EMAIL_DEFAULT_SENDER={"name": "Callgent", "email": "noreply@callgent.com"} +EMAIL_RELAY_HOST=my.callgent.com + # https://app.brevo.com/settings/keys/api EMAIL_BREVO_API_KEY=key +EMAIL_SPARKPOST_API_KEY=xxx +EMAIL_SPARKPOST_RELAY_CLIENT_ID=spark-post-relayer +EMAIL_SPARKPOST_RELAY_CLIENT_SECRET=xxx +EMAIL_SPARKPOST_RELAY_EXPIRES_IN=86400 diff --git a/prisma/schema.prisma b/prisma/schema.prisma index 98dda51..d461fe8 100644 --- a/prisma/schema.prisma +++ b/prisma/schema.prisma @@ -504,7 +504,7 @@ model EventStore { targetId String? @db.VarChar(36) eventType String @db.VarChar(36) dataType String @db.VarChar(36) - /// @Description callback url or parent event id + /// @Description callback url or parent event id to invoke callback String? @db.VarChar(1023) /// @Description callback type, 'URL' or 'EVENT' callbackType EventCallbackType @default(EVENT) @@ -512,13 +512,13 @@ model EventStore { data Json? @db.Json context Json? @db.Json - /// @description statusCode, -1: processing, 0: done, 1: pending, >1: error + /// @description statusCode, -1: processing, 0: done, 1: pending: waiting for external event trigger to to resume calling current-listener.funName, >1: error statusCode Int @default(-1) message String? @db.VarChar(255) stopPropagation Boolean defaultPrevented Boolean listenerId String? @db.VarChar(36) - funName String? @db.VarChar(255) + funName String? @db.VarChar(255) /// @description listener's function to call on pending event activated. createdAt DateTime @default(now()) updatedAt DateTime @default(now()) @updatedAt diff --git a/prisma/seed.ts b/prisma/seed.ts index d796a54..933b679 100644 --- a/prisma/seed.ts +++ b/prisma/seed.ts @@ -82,21 +82,21 @@ function initEventListeners() { serviceName: 'AgentsService', funName: 'map2Function', description: - 'Map the request event to a endpoint function, put into event.context.map2Function and event.context.functions[0]', + 'Map the request to a endpoint function and corresponding args, put into event.context.map2Function and event.context.functions[0]', createdBy: 'GLOBAL', priority: (priority += 100), }, { pk: elId++, - id: 'CR-MAP-2-ARGS', + id: 'CR-INVOKE-SEP', srcId: 'GLOBAL', tenantPk: 0, eventType: 'CLIENT_REQUEST', dataType: '*', serviceType: 'SERVICE', - serviceName: 'SandBoxService', - funName: 'map2Args', - description: 'Map the request event to the function arguments', + serviceName: 'EndpointsService', + funName: 'invokeSEP', + description: 'Do actual invocation through the SEP adaptor', createdBy: 'GLOBAL', priority: (priority += 100), }, diff --git a/src/agents/agents.service.ts b/src/agents/agents.service.ts index 60af3e6..bfb2b46 100644 --- a/src/agents/agents.service.ts +++ b/src/agents/agents.service.ts @@ -1,6 +1,6 @@ import { BadRequestException, HttpException, Injectable } from '@nestjs/common'; import { CallgentFunctionDto } from '../callgent-functions/dto/callgent-function.dto'; -import { AdaptedDataSource } from '../endpoints/adaptors/endpoint-adaptor.interface'; +import { AdaptedDataSource } from '../endpoints/adaptors/endpoint-adaptor.base'; import { TaskActionDto } from '../task-actions/dto/task-action.dto'; import { LLMService } from './llm.service'; import { ClientRequestEvent } from '../endpoints/events/client-request.event'; @@ -35,7 +35,7 @@ export class AgentsService { */ async map2Function( reqEvent: ClientRequestEvent, - ): Promise { + ): Promise { const { id, srcId, @@ -52,6 +52,8 @@ export class AgentsService { // FIXME map from all targetId events + // TODO how to use mapping function: for specific req & function + const mapped = await this.llmService.template( 'map2Function', { @@ -72,16 +74,20 @@ export class AgentsService { ); // emit progressive requesting event - const { event: prEvent, statusCode } = + const { data: prEvent, statusCode } = await this.eventListenersService.emit( - new ProgressiveRequestEvent(srcId, id, cepAdaptor, { progressive }), + new ProgressiveRequestEvent(srcId, id, cepAdaptor, { + progressive, + // mapped, + }), ); - if (!statusCode) { + if (!statusCode) // direct return, no persistent async return this.map2FunctionProgressive(prEvent, reqEvent); - } + if (statusCode == 1) - return { event: reqEvent, callbackName: 'map2FunctionProgressive' }; + // pending + return { data: reqEvent, callbackName: 'map2FunctionProgressive' }; throw new HttpException(prEvent.message, statusCode); } else { const functions = reqEvent.context.functions.filter( @@ -95,9 +101,9 @@ export class AgentsService { /** progressive response, to continue mapping */ async map2FunctionProgressive( - event: ProgressiveRequestEvent, + data: ProgressiveRequestEvent, reqEvent?: ClientRequestEvent, - ): Promise { + ): Promise { // handle resp } diff --git a/src/callgent-functions/callgent-functions.controller.ts b/src/callgent-functions/callgent-functions.controller.ts index 5cdaef4..d3224f6 100644 --- a/src/callgent-functions/callgent-functions.controller.ts +++ b/src/callgent-functions/callgent-functions.controller.ts @@ -22,7 +22,7 @@ import { getSchemaPath, } from '@nestjs/swagger'; import { IsNotEmpty, IsOptional } from 'class-validator'; -import { ApiSpec } from '../endpoints/adaptors/endpoint-adaptor.interface'; +import { ApiSpec } from '../endpoints/adaptors/endpoint-adaptor.base'; import { EndpointDto } from '../endpoints/dto/endpoint.dto'; import { JwtGuard } from '../infra/auth/jwt/jwt.guard'; import { EntityIdExists } from '../infra/repo/validators/entity-exists.validator'; diff --git a/src/callgent-functions/callgent-functions.service.ts b/src/callgent-functions/callgent-functions.service.ts index f532745..63bab55 100644 --- a/src/callgent-functions/callgent-functions.service.ts +++ b/src/callgent-functions/callgent-functions.service.ts @@ -3,7 +3,7 @@ import { TransactionalAdapterPrisma } from '@nestjs-cls/transactional-adapter-pr import { BadRequestException, Inject, Injectable } from '@nestjs/common'; import { PaginatorTypes, paginator } from '@nodeteam/nestjs-prisma-pagination'; import { EndpointType, Prisma, PrismaClient } from '@prisma/client'; -import { ApiSpec } from '../endpoints/adaptors/endpoint-adaptor.interface'; +import { ApiSpec } from '../endpoints/adaptors/endpoint-adaptor.base'; import { EndpointDto } from '../endpoints/dto/endpoint.dto'; import { EndpointsService } from '../endpoints/endpoints.service'; import { ClientRequestEvent } from '../endpoints/events/client-request.event'; @@ -32,7 +32,7 @@ export class CallgentFunctionsService { @Transactional() async loadFunctions( reqEvent: ClientRequestEvent, - ): Promise { + ): Promise { const { funName, callgentId } = reqEvent.data; // TODO if too many functions, use summary first diff --git a/src/emails/dto/sparkpost-relay-object.interface.ts b/src/emails/dto/sparkpost-relay-object.interface.ts new file mode 100644 index 0000000..2934fef --- /dev/null +++ b/src/emails/dto/sparkpost-relay-object.interface.ts @@ -0,0 +1,97 @@ +/** + * Represents a single email header. + */ +interface Header { + [key: string]: string; +} + +/** + * Represents the content parsed from the incoming message. + */ +interface Content { + /** + * Contents of the last text/html part of the message. + */ + html: string; + + /** + * Contents of the last text/plain part of the message. + */ + text: string; + + /** + * "Subject" header value (decoded from email). + */ + subject: string; + + /** + * "To" header value (decoded from email), RFC2822 address list. + */ + to: string[]; + + /** + * "CC" header value (decoded from email), RFC2822 address list. + */ + cc?: string[]; + + /** + * Ordered array of email top-level headers. This array preserves ordering and allows for multiple occurrences of a header (e.g. to support trace headers such as "Received"). + */ + headers: Header[]; + + /** + * Raw MIME content for an email. If the Raw MIME content contains at least one non UTF-8 encoded character, the entire email_rfc822 value will be base64 encoded and email_rfc822_is_base64 will be set to true. + */ + email_rfc822: string; + + /** + * Whether the email_rfc822 value is base64 encoded. + */ + email_rfc822_is_base64: boolean; +} + +/** + * Represents the relay message. + */ +export interface RelayMessage { + /** + * The content parsed from the incoming message. + */ + content: Content; + + /** + * Customer ID of the customer that created the relay webhook. + */ + customer_id: string; + + /** + * Email address used to compose the "From" header. + */ + friendly_from: string; + + /** + * SMTP envelope "MAIL FROM", matches "Return-Path" header address. + */ + msg_from: string; + + /** + * SMTP envelope "RCPT TO". + */ + rcpt_to: string; + + /** + * ID of the relay webhook which triggered this relay message. + */ + webhook_id: string; + + /** + * Protocol of the originating inbound message. + */ + protocol?: string; +} + +export interface EmailRelayObject { + msys: { + relay_message: RelayMessage; + }; +} diff --git a/src/emails/emails.controller.spec.ts b/src/emails/emails.controller.spec.ts new file mode 100644 index 0000000..d4558e5 --- /dev/null +++ b/src/emails/emails.controller.spec.ts @@ -0,0 +1,18 @@ +import { Test, TestingModule } from '@nestjs/testing'; +import { EmailsController } from './emails.controller'; + +describe('EmailsController', () => { + let controller: EmailsController; + + beforeEach(async () => { + const module: TestingModule = await Test.createTestingModule({ + controllers: [EmailsController], + }).compile(); + + controller = module.get(EmailsController); + }); + + it('should be defined', () => { + expect(controller).toBeDefined(); + }); +}); diff --git a/src/emails/emails.controller.ts b/src/emails/emails.controller.ts new file mode 100644 index 0000000..7869f71 --- /dev/null +++ b/src/emails/emails.controller.ts @@ -0,0 +1,40 @@ +import { + BadRequestException, + Body, + Controller, + Headers, + HttpCode, + HttpStatus, + Post, +} from '@nestjs/common'; +import { ConfigService } from '@nestjs/config'; +import { JwtAuthService } from '../infra/auth/jwt/jwt.service'; +import { EmailsService } from './emails.service'; +import { EmailRelayObject } from './dto/sparkpost-relay-object.interface'; + +@Controller('emails') +export class EmailsController { + constructor( + private readonly jwtAuthService: JwtAuthService, + private readonly configService: ConfigService, + private readonly emailsService: EmailsService, + ) {} + + /** @see https://developers.sparkpost.com/api/relay-webhooks/ */ + @HttpCode(HttpStatus.OK) + @Post('relay/spark-post') + async handleRelayEvent( + @Headers('Authorization') authorization: string, + @Body() relays: EmailRelayObject[], + ) { + const { sub } = this.jwtAuthService.verify(authorization?.substring(7)); + if (sub !== this.configService.get('EMAIL_SPARKPOST_RELAY_CLIENT_ID')) + throw new BadRequestException('Invalid Client ID'); + + // handle relay event + relays?.forEach((relay) => + this.emailsService.handleRelayMessage(relay.msys.relay_message), + ); + return; // return 200 to consume the event + } +} diff --git a/src/emails/emails.module.ts b/src/emails/emails.module.ts index 0e8c311..6c0b688 100644 --- a/src/emails/emails.module.ts +++ b/src/emails/emails.module.ts @@ -1,10 +1,12 @@ import { Global, Module } from '@nestjs/common'; import { EmailTemplateProvider } from './email-template.provider'; import { EmailsService } from './emails.service'; +import { EmailsController } from './emails.controller'; @Global() @Module({ providers: [EmailsService, EmailTemplateProvider], exports: [EmailsService], + controllers: [EmailsController], }) export class EmailsModule {} diff --git a/src/emails/emails.service.ts b/src/emails/emails.service.ts index 6e28a9c..d1915be 100644 --- a/src/emails/emails.service.ts +++ b/src/emails/emails.service.ts @@ -1,8 +1,9 @@ import { Injectable, Logger, OnModuleInit } from '@nestjs/common'; import { ConfigService } from '@nestjs/config'; import axios from 'axios'; -import { EmailTemplateProvider } from './email-template.provider'; import path from 'path'; +import { EmailTemplateProvider } from './email-template.provider'; +import { RelayMessage } from './dto/sparkpost-relay-object.interface'; @Injectable() export class EmailsService implements OnModuleInit { @@ -16,7 +17,7 @@ export class EmailsService implements OnModuleInit { await this.emailTemplates.loadTemplates(path.join(__dirname, 'templates')); } - async sendTemplateMail( + async sendTemplateEmail( to: { name: string; email: string }[], template: string, context: { [key: string]: any } = {}, @@ -29,7 +30,7 @@ export class EmailsService implements OnModuleInit { }); const subject = this._extractSubject(content); if (!subject) throw new Error('No subject found. template=' + template); - return this.sendMail(to, subject, content, sender); + return this.sendEmail(to, subject, content, sender); } private _extractSubject(content: string) { @@ -38,15 +39,20 @@ export class EmailsService implements OnModuleInit { return content.substring(idx + 7, content.indexOf('')).trim(); } - async sendMail( - to: string[] | { name: string; email: string }[], + async sendEmail( + to: + | string + | { name: string; email: string } + | (string | { name: string; email: string })[], subject: string, htmlContent: string, - sender?: { name: string; email: string }, + sender?: string | { name: string; email: string }, ) { const apiKey = this.configService.get('EMAIL_BREVO_API_KEY'); - sender || - (sender = JSON.parse(this.configService.get('EMAIL_DEFAULT_SENDER'))); + to = this._formalizeEmails(to) as { name: string; email: string }[]; + sender = sender + ? this._formalizeEmails(sender)[0] + : (sender = JSON.parse(this.configService.get('EMAIL_DEFAULT_SENDER'))); // https://developers.brevo.com/reference/sendtransacemail const url = 'https://api.brevo.com/v3/smtp/email'; @@ -62,10 +68,26 @@ export class EmailsService implements OnModuleInit { 'api-key': apiKey, 'content-type': 'application/json', }; - await axios.post(url, data, { headers }).then(function (data) { - Logger.debug('API called successfully. Returned data: %j', data?.data); + return axios.post(url, data, { headers }).then(function (resp) { + const sent = resp.status < 300; + if (!sent) { + this.logger.error('Failed to send email. resp: %j', { + ...resp, + request: { url, data }, + }); + } + return sent; }); - return true; + } + private _formalizeEmails( + emails: + | (string | { name: string; email: string }) + | (string | { name: string; email: string })[], + ) { + if (!Array.isArray(emails)) emails = [emails]; + return emails.map((d) => + (d as any).email ? (d as { email: string }) : { email: d as string }, + ); } // private _getTemplateId(template: string) { @@ -75,4 +97,50 @@ export class EmailsService implements OnModuleInit { // throw new Error('Brevo email template not found: ' + templateKey); // return parseInt(templateId); // } + + /** + * + * @returns `${relayType}+${id}@${mailHost}` + */ + getRelayAddress(id: string, relayType: EmailRelayKey) { + const mailHost = this.configService.get('EMAIL_RELAY_HOST'); + return `${relayType}+${id}@${mailHost}`; + } + + /** + * sparkpost relay message + * @see https://developers.sparkpost.com/api/relay-webhooks/ + */ + handleRelayMessage(msg: RelayMessage): void { + let { rcpt_to: mailTo } = msg; + mailTo = mailTo.toLowerCase(); + const mailHost = this.configService.get('EMAIL_RELAY_HOST'); + if (!mailTo.endsWith(mailHost)) + return this.logger.error('Invalid relay host, ignored message: %j', msg); + + mailTo = mailTo.substring(0, mailTo.indexOf('@')); + const [relayKey, relayId] = mailTo.split('+'); + switch (relayKey) { + case 'request': + this.logger.debug('relay request: %j', msg); + // TODO + break; + case 'callgent': + this.logger.debug('relay callgent: %j', msg); + // TODO + break; + default: + this.logger.error( + 'Invalid relay key %s, ignored message: %j', + relayKey, + msg, + ); + } + } } + +/** + * 'request': request call from email SEP. + * 'callgent': callgent email CEP. + */ +export type EmailRelayKey = 'request' | 'callgent'; diff --git a/src/endpoints/adaptors/builtin/email/email.adaptor.ts b/src/endpoints/adaptors/builtin/email/email.adaptor.ts index 18d3fd1..3b4442d 100644 --- a/src/endpoints/adaptors/builtin/email/email.adaptor.ts +++ b/src/endpoints/adaptors/builtin/email/email.adaptor.ts @@ -1,16 +1,18 @@ -import { Inject } from '@nestjs/common'; +import { Inject, NotImplementedException } from '@nestjs/common'; import { AgentsService } from '../../../../agents/agents.service'; +import { CallgentFunctionDto } from '../../../../callgent-functions/dto/callgent-function.dto'; +import { EmailsService } from '../../../../emails/emails.service'; import { EndpointDto } from '../../../dto/endpoint.dto'; import { ClientRequestEvent } from '../../../events/client-request.event'; +import { EndpointAdaptor, EndpointConfig } from '../../endpoint-adaptor.base'; import { EndpointAdaptorName } from '../../endpoint-adaptor.decorator'; -import { - EndpointAdaptor, - EndpointConfig -} from '../../endpoint-adaptor.interface'; @EndpointAdaptorName('Email', 'both') export class EmailAdaptor extends EndpointAdaptor { - constructor(@Inject('AgentsService') readonly agentsService: AgentsService) { + constructor( + @Inject('AgentsService') readonly agentsService: AgentsService, + private readonly emailsService: EmailsService, + ) { super(agentsService); } @@ -19,7 +21,7 @@ export class EmailAdaptor extends EndpointAdaptor { rawReq: object, reqEndpoint?: EndpointDto, ): Promise { - throw new Error('Method not implemented.'); + throw new NotImplementedException('Method not implemented.'); } getConfig(): EndpointConfig { @@ -33,7 +35,7 @@ export class EmailAdaptor extends EndpointAdaptor { /** generate operation script based on the Chrome plugin */ async initServer(initParams: object, endpoint: EndpointDto) { - // throw new Error('Method not implemented.'); + // throw new NotImplementedException('Method not implemented.'); return ''; } @@ -42,18 +44,43 @@ export class EmailAdaptor extends EndpointAdaptor { } readData(name: string, hints?: { [key: string]: any }): Promise { - throw new Error('Method not implemented.'); + throw new NotImplementedException('Method not implemented.'); } req2Json(req: object) { - throw new Error('Method not implemented.'); + throw new NotImplementedException('Method not implemented.'); } - async invoke(params: object) { - throw new Error('Method not implemented.'); + callback(resp: any): Promise { + throw new NotImplementedException('Method not implemented.'); } - callback(resp: any): Promise { - throw new Error('Method not implemented.'); + /** + * constructs an email sent to sep.host + * + * @param fun - callgent function + * @param args - function arguments + * @param sep - server endpoint + * @param reqEvent - client request event + */ + async invoke( + fun: CallgentFunctionDto, + args: object, + sep: EndpointDto, + reqEvent: ClientRequestEvent, + ) { + const emailFrom = this.emailsService.getRelayAddress(reqEvent.id, 'request'); + const { host: emailTo } = sep; + const subject = ''; + const body = ''; + return this.emailsService + .sendEmail(emailTo, subject, body, emailFrom) + .then((res) => ({ + statusCode: res ? -1 : 500, // processing or error + event: { ...reqEvent, rawReq: undefined }, + message: res + ? 'Service called via email, please wait for async response' + : 'Failed to call service via email', + })); } } diff --git a/src/endpoints/adaptors/builtin/restapi/restapi.adaptor.ts b/src/endpoints/adaptors/builtin/restapi/restapi.adaptor.ts index d1599bb..a35674b 100644 --- a/src/endpoints/adaptors/builtin/restapi/restapi.adaptor.ts +++ b/src/endpoints/adaptors/builtin/restapi/restapi.adaptor.ts @@ -1,12 +1,14 @@ -import { BadRequestException, Inject } from '@nestjs/common'; +import { + BadRequestException, + Inject, + NotImplementedException, +} from '@nestjs/common'; import { AgentsService } from '../../../../agents/agents.service'; +import { CallgentFunctionDto } from '../../../../callgent-functions/dto/callgent-function.dto'; import { EndpointDto } from '../../../dto/endpoint.dto'; import { ClientRequestEvent } from '../../../events/client-request.event'; +import { EndpointAdaptor, EndpointConfig } from '../../endpoint-adaptor.base'; import { EndpointAdaptorName } from '../../endpoint-adaptor.decorator'; -import { - EndpointAdaptor, - EndpointConfig, -} from '../../endpoint-adaptor.interface'; class RequestJson { url: string; @@ -120,7 +122,7 @@ export class RestAPIAdaptor extends EndpointAdaptor { /** generate a web page endpoint */ initClient(params: object, endpoint: EndpointDto): Promise { - throw new Error('Method not implemented.'); + throw new NotImplementedException('Method not implemented.'); } /** generate operation script based on the Chrome plugin */ @@ -131,13 +133,13 @@ export class RestAPIAdaptor extends EndpointAdaptor { // const reqTemplate = endpoint.reqParamTemplate; // - script to operate the page // auth handler - throw new Error('Method not implemented.'); + throw new NotImplementedException('Method not implemented.'); } async preprocess( reqEvent: ClientRequestEvent, endpoint: EndpointDto, - ): Promise { + ): Promise { if (!reqEvent.rawReq) throw new BadRequestException( 'Missing request object for ClientRequestEvent', @@ -205,15 +207,20 @@ export class RestAPIAdaptor extends EndpointAdaptor { } async readData(name: string, hints?: { [key: string]: any }) { - throw new Error('Method not implemented.'); + throw new NotImplementedException('Method not implemented.'); } - async invoke(req: RequestJson): Promise { + async invoke( + fun: CallgentFunctionDto, + args: object, + sep: EndpointDto, + reqEvent: ClientRequestEvent, + ): Promise { // - throw new Error('Method not implemented.'); + throw new NotImplementedException('Method not implemented.'); } callback(resp: any): Promise { - throw new Error('Method not implemented.'); + throw new NotImplementedException('Method not implemented.'); } } diff --git a/src/endpoints/adaptors/builtin/restapi/restapi.controller.ts b/src/endpoints/adaptors/builtin/restapi/restapi.controller.ts index 947040a..18ad655 100644 --- a/src/endpoints/adaptors/builtin/restapi/restapi.controller.ts +++ b/src/endpoints/adaptors/builtin/restapi/restapi.controller.ts @@ -91,19 +91,18 @@ export class RestApiController { if (!callgent) throw new NotFoundException('callgent not found: ' + callgentId); - const { event, statusCode, message } = - await this.eventListenersService.emit( - new ClientRequestEvent(cep.id, taskId, cep.adaptorKey, req, callback, { - callgentId, - callgentName: callgent.name, - caller, - progressive, - funName, - }), - parseInt(timeout) || 0, // sync timeout - ); + const { data, statusCode, message } = await this.eventListenersService.emit( + new ClientRequestEvent(cep.id, taskId, cep.adaptorKey, req, callback, { + callgentId, + callgentName: callgent.name, + caller, + progressive, + funName, + }), + parseInt(timeout) || 0, // sync timeout + ); // FIXME data - if (statusCode < 400) return { event, statusCode, message }; + if (statusCode < 400) return { data, statusCode, message }; throw new HttpException(message, statusCode); } diff --git a/src/endpoints/adaptors/builtin/web/webpage.adaptor.ts b/src/endpoints/adaptors/builtin/web/webpage.adaptor.ts index 07c400a..999bf3d 100644 --- a/src/endpoints/adaptors/builtin/web/webpage.adaptor.ts +++ b/src/endpoints/adaptors/builtin/web/webpage.adaptor.ts @@ -1,12 +1,10 @@ -import { Inject } from '@nestjs/common'; +import { Inject, NotImplementedException } from '@nestjs/common'; import { AgentsService } from '../../../../agents/agents.service'; +import { CallgentFunctionDto } from '../../../../callgent-functions/dto/callgent-function.dto'; import { EndpointDto } from '../../../dto/endpoint.dto'; import { ClientRequestEvent } from '../../../events/client-request.event'; +import { EndpointAdaptor, EndpointConfig } from '../../endpoint-adaptor.base'; import { EndpointAdaptorName } from '../../endpoint-adaptor.decorator'; -import { - EndpointAdaptor, - EndpointConfig, -} from '../../endpoint-adaptor.interface'; @EndpointAdaptorName('webpage', 'both') export class WebpageAdaptor extends EndpointAdaptor { @@ -19,7 +17,7 @@ export class WebpageAdaptor extends EndpointAdaptor { rawReq: object, reqEndpoint?: EndpointDto, ): Promise { - throw new Error('Method not implemented.'); + throw new NotImplementedException('Method not implemented.'); } getConfig(): EndpointConfig { @@ -70,7 +68,7 @@ export class WebpageAdaptor extends EndpointAdaptor { /** generate a web page endpoint */ initClient(params: object, endpoint: EndpointDto): Promise { - throw new Error('Method not implemented.'); + throw new NotImplementedException('Method not implemented.'); } /** generate operation script based on the Chrome plugin */ @@ -79,7 +77,7 @@ export class WebpageAdaptor extends EndpointAdaptor { const url = endpoint.host['Page URL']; // - script to operate the page // auth handler - throw new Error('Method not implemented.'); + throw new NotImplementedException('Method not implemented.'); } async preprocess(reqEvent: ClientRequestEvent, endpoint: EndpointDto) { @@ -87,18 +85,23 @@ export class WebpageAdaptor extends EndpointAdaptor { } readData(name: string, hints?: { [key: string]: any }): Promise { - throw new Error('Method not implemented.'); + throw new NotImplementedException('Method not implemented.'); } req2Json(req: object) { - throw new Error('Method not implemented.'); + throw new NotImplementedException('Method not implemented.'); } - async invoke(params: object) { - throw new Error('Method not implemented.'); + async invoke( + fun: CallgentFunctionDto, + args: object, + sep: EndpointDto, + reqEvent: ClientRequestEvent, + ) { + throw new NotImplementedException('Method not implemented.'); } callback(resp: any): Promise { - throw new Error('Method not implemented.'); + throw new NotImplementedException('Method not implemented.'); } } diff --git a/src/endpoints/adaptors/endpoint-adaptor.interface.ts b/src/endpoints/adaptors/endpoint-adaptor.base.ts similarity index 95% rename from src/endpoints/adaptors/endpoint-adaptor.interface.ts rename to src/endpoints/adaptors/endpoint-adaptor.base.ts index 9919323..af6fec9 100644 --- a/src/endpoints/adaptors/endpoint-adaptor.interface.ts +++ b/src/endpoints/adaptors/endpoint-adaptor.base.ts @@ -6,6 +6,7 @@ import { EndpointDto } from '../dto/endpoint.dto'; import { ClientRequestEvent } from '../events/client-request.event'; import yaml from 'yaml'; import { Prisma } from '@prisma/client'; +import { CallgentFunctionDto } from '../../callgent-functions/dto/callgent-function.dto'; export abstract class EndpointAdaptor { protected readonly agentsService: AgentsService; @@ -29,7 +30,6 @@ export abstract class EndpointAdaptor { /** please declare hints in api-doc */ abstract readData(name: string, hints?: { [key: string]: any }): Promise; - abstract invoke(params: object): Promise; /** get callback param */ abstract getCallback( callback: string, @@ -104,6 +104,13 @@ export abstract class EndpointAdaptor { } throw new NotFoundException('No API found in the text.'); } + + abstract invoke( + fun: CallgentFunctionDto, + args: object, + sep: EndpointDto, + reqEvent: ClientRequestEvent, + ): Promise; } export interface AdaptedDataSource {} diff --git a/src/endpoints/endpoints.module.ts b/src/endpoints/endpoints.module.ts index 0ae760b..7478305 100644 --- a/src/endpoints/endpoints.module.ts +++ b/src/endpoints/endpoints.module.ts @@ -1,4 +1,5 @@ import { Module } from '@nestjs/common'; +import { CallgentsModule } from '../callgents/callgents.module'; import { EmailAdaptor } from './adaptors/builtin/email/email.adaptor'; import { RestAPIAdaptor } from './adaptors/builtin/restapi/restapi.adaptor'; import { RestApiController } from './adaptors/builtin/restapi/restapi.controller'; @@ -6,7 +7,6 @@ import { WebpageAdaptor } from './adaptors/builtin/web/webpage.adaptor'; import { EndpointsController } from './endpoints.controller'; import { EndpointsService } from './endpoints.service'; import { CallgentCreatedListener } from './listeners/callgent-created.listener'; -import { CallgentsModule } from '../callgents/callgents.module'; @Module({ imports: [CallgentsModule], diff --git a/src/endpoints/endpoints.service.ts b/src/endpoints/endpoints.service.ts index 58fafe2..1b09642 100644 --- a/src/endpoints/endpoints.service.ts +++ b/src/endpoints/endpoints.service.ts @@ -10,14 +10,16 @@ import { Injectable, InjectionToken, NotFoundException, + NotImplementedException, } from '@nestjs/common'; import { ModuleRef, ModulesContainer } from '@nestjs/core'; import { EndpointType, Prisma, PrismaClient } from '@prisma/client'; +import { CallgentFunctionDto } from '../callgent-functions/dto/callgent-function.dto'; import { Utils } from '../infra/libs/utils'; import { selectHelper } from '../infra/repo/select.helper'; import { PrismaTenancyService } from '../infra/repo/tenancy/prisma-tenancy.service'; +import { EndpointAdaptor } from './adaptors/endpoint-adaptor.base'; import { IS_CALLGENT_ENDPOINT_ADAPTOR } from './adaptors/endpoint-adaptor.decorator'; -import { EndpointAdaptor } from './adaptors/endpoint-adaptor.interface'; import { EndpointDto } from './dto/endpoint.dto'; import { UpdateEndpointDto } from './dto/update-endpoint.dto'; import { ClientRequestEvent } from './events/client-request.event'; @@ -202,7 +204,7 @@ export class EndpointsService { @Transactional() update(id: string, dto: UpdateEndpointDto) { - throw new Error('Method not implemented.'); + throw new NotImplementedException('Method not implemented.'); } @Transactional() @@ -289,7 +291,7 @@ export class EndpointsService { @Transactional() async preprocessClientRequest( reqEvent: ClientRequestEvent, - ): Promise { + ): Promise { const adaptor = this.getAdaptor(reqEvent.dataType, EndpointType.CLIENT); if (!adaptor) throw new Error( @@ -300,4 +302,19 @@ export class EndpointsService { await adaptor.preprocess(reqEvent, endpoint); } + + /** preprocess req from cep, by adaptor */ + @Transactional() + async invokeSEP(reqEvent: ClientRequestEvent) { + const { map2Function, functions } = reqEvent.context; + if (!map2Function || !functions?.length) + throw new Error('Failed to invoke, No mapping function found'); + + const func = functions[0] as CallgentFunctionDto; + const sep = await this.findOne(func.endpointId); + const adapter = sep && this.getAdaptor(sep.adaptorKey, EndpointType.SERVER); + + if (!adapter) throw new Error('Failed to invoke, No SEP adaptor found'); + adapter.invoke(func, map2Function.args, sep, reqEvent); + } } diff --git a/src/endpoints/listeners/callgent-created.listener.ts b/src/endpoints/listeners/callgent-created.listener.ts index 7fd595a..abbecec 100644 --- a/src/endpoints/listeners/callgent-created.listener.ts +++ b/src/endpoints/listeners/callgent-created.listener.ts @@ -3,6 +3,7 @@ import { Inject, Injectable, Logger } from '@nestjs/common'; import { OnEvent } from '@nestjs/event-emitter'; import { CallgentCreatedEvent } from '../../callgents/events/callgent-created.event'; import { EndpointsService } from '../endpoints.service'; +import { EmailsService } from '../../emails/emails.service'; @Injectable() export class CallgentCreatedListener { @@ -10,6 +11,7 @@ export class CallgentCreatedListener { constructor( @Inject('EndpointsService') private readonly endpointsService: EndpointsService, + private readonly emailsService: EmailsService, ) {} /** create a callgent with default api client endpoint, and Email client/server endpoint */ @@ -45,7 +47,7 @@ export class CallgentCreatedListener { callgentId: callgent.id, type: 'CLIENT', adaptorKey: 'Email', - host: `callgent+${callgent.id}@my.callgent.com`, + host: this.emailsService.getRelayAddress(callgent.id, 'callgent'), createdBy: callgent.createdBy, }) .then((endpoint) => { diff --git a/src/event-listeners/event-listeners.module.ts b/src/event-listeners/event-listeners.module.ts index f7883d1..d06ff1a 100644 --- a/src/event-listeners/event-listeners.module.ts +++ b/src/event-listeners/event-listeners.module.ts @@ -1,8 +1,10 @@ import { Global, Module } from '@nestjs/common'; +import { EventStoresModule } from '../event-stores/event-stores.module'; import { EventListenersService } from './event-listeners.service'; @Global() @Module({ + imports: [EventStoresModule], providers: [EventListenersService], exports: [EventListenersService], }) diff --git a/src/event-listeners/event-listeners.service.ts b/src/event-listeners/event-listeners.service.ts index 4f1eacd..e6a1459 100644 --- a/src/event-listeners/event-listeners.service.ts +++ b/src/event-listeners/event-listeners.service.ts @@ -2,12 +2,14 @@ import { TransactionHost, Transactional } from '@nestjs-cls/transactional'; import { TransactionalAdapterPrisma } from '@nestjs-cls/transactional-adapter-prisma'; import { BadRequestException, + Inject, Injectable, Logger, NotFoundException, } from '@nestjs/common'; import { ModuleRef } from '@nestjs/core'; import { EventStore, Prisma, PrismaClient, ServiceType } from '@prisma/client'; +import { EventStoresService } from '../event-stores/event-stores.service'; import { Utils } from '../infra/libs/utils'; import { CreateEventListenerDto } from './dto/create-event-listener.dto'; import { UpdateEventListenerDto } from './dto/update-event-listener.dto'; @@ -23,20 +25,22 @@ export class EventListenersService { constructor( private readonly txHost: TransactionHost, private readonly moduleRef: ModuleRef, + @Inject('EventStoresService') + private readonly eventStoresService: EventStoresService, ) {} /** - * @returns: { event, message?, statusCode?: -1-processing, 0-done, 1-pending, >1-error} + * @returns: { data: event, message?, statusCode?: -1-processing, 0-done, 1-pending, >1-error} */ @Transactional() async emit( - event: T, + data: T, timeout = 0, - ): Promise<{ event: T; statusCode?: number; message?: string }> { + ): Promise<{ data: T; statusCode?: number; message?: string }> { // load persist listeners - const listeners = await this.loadListeners(event); + const listeners = await this.loadListeners(data); - const result = this._invokeListeners(listeners, event).then((result) => + const result = this._invokeListeners(listeners, data).then((result) => this._invokeCallback(result, true), ); @@ -46,8 +50,8 @@ export class EventListenersService { // FIXME: timeout response will cause tx close, fails listeners execution! Utils.sleep(timeout).then(() => { return { - event: { ...event, rawReq: undefined }, - statusCode: event.statusCode, + data: { ...data, rawReq: undefined }, + statusCode: data.statusCode, message: `Sync invocation timeout(${timeout}ms), will respond via callback`, }; }), @@ -59,12 +63,10 @@ export class EventListenersService { @Transactional() async resume( eventId: string, - ): Promise<{ event: T; statusCode?: number; message?: string }> { - const prisma = this.txHost.tx as PrismaClient; - const event = await prisma.eventStore.findUnique({ - where: { id: eventId }, - }); + ): Promise<{ data: T; statusCode?: number; message?: string }> { + const event = await this.eventStoresService.findOne(eventId); if (!event) throw new NotFoundException('Event not found, id=' + eventId); + // -1: processing, 0: done, 1: pending, >1: error if (event.statusCode <= 0) throw new BadRequestException( @@ -84,13 +86,13 @@ export class EventListenersService { * @param urlOnly `EVENT` type callback only applicable on resuming */ protected async _invokeCallback( - result: { event: T; statusCode?: number; message?: string }, + result: { data: T; statusCode?: number; message?: string }, urlOnly = true, - ): Promise<{ event: T; statusCode?: number; message?: string }> { + ): Promise<{ data: T; statusCode?: number; message?: string }> { if (result.statusCode) return result; // not done, no cb const { - event: { callbackType, callback }, + data: { callbackType, callback }, } = result; if (!callback) return result; if (callbackType === 'EVENT') @@ -101,49 +103,55 @@ export class EventListenersService { private async _invokeListeners( listeners: EventListener[], - event: T, + data: T, funName?: string, - ): Promise<{ event: T; statusCode?: number; message?: string }> { + ): Promise<{ data: T; statusCode?: number; message?: string }> { // invoke listeners, supports persisted-async let statusCode = -1; for (let idx = 0; idx < listeners.length; ) { const listener = listeners[idx++]; try { - const result = await this._invokeListener(listener, event, funName); + const result = await this._invokeListener(listener, data, funName); if (result) { - result.event && (event = result.event); - result.funName && (funName = result.funName); + result.data && (data = result.data); + result.callbackName && (funName = result.callbackName); } else funName = undefined; statusCode = funName ? 1 // pending - : event.stopPropagation || idx >= listeners.length + : data.stopPropagation || idx >= listeners.length ? 0 // done : -1; // processing - if (funName || event.stopPropagation) break; + if (funName || data.stopPropagation) break; } catch (e) { statusCode = e.status || 2; // error - const message = (event.message = `[ERROR] ${e.name}: ${e.message}`); + const message = (data.message = `[ERROR] ${e.name}: ${e.message}`); e.status < 500 || this.logger.error(e); - return { event, statusCode, message }; + return { data: data, statusCode, message }; } finally { + // if statusCode > 0, stay in current listener const nextListener = statusCode > 0 ? listener : statusCode == 0 ? null : listeners[idx]; - await this.upsertEvent(event, funName, nextListener?.id, statusCode); + await this.eventStoresService.upsertEvent( + data, + funName, + nextListener?.id, + statusCode, + ); } } - return { event, statusCode }; + return { data: data, statusCode }; } async loadListeners( - event: { + data: { srcId: string; eventType: string; dataType: string; }, deleted = false, ) { - const { srcId: srcId, eventType, dataType } = event; + const { srcId: srcId, eventType, dataType } = data; const prisma = this.txHost.tx as PrismaClient; const AND: Prisma.EventListenerWhereInput[] = [ @@ -178,15 +186,15 @@ export class EventListenersService { } /** load listeners by event id after event.listenerId[including] */ - async resumeListeners(event: EventStore) { - let listeners = await this.loadListeners(event, true); - if (event.listenerId) { + async resumeListeners(data: EventStore) { + let listeners = await this.loadListeners(data, true); + if (data.listenerId) { const idx = listeners.findIndex( - (listener) => listener.id === event.listenerId, + (listener) => listener.id === data.listenerId, ); if (idx < 0) throw new NotFoundException( - `Invalid listener id ${event.listenerId} for event ${event.id}`, + `Invalid listener id ${data.listenerId} for event ${data.id}`, ); listeners = listeners.splice(0, idx); @@ -196,20 +204,22 @@ export class EventListenersService { protected async _invokeListener( listener: EventListener, - event: T, + data: T, funName?: string, - ): Promise<{ event: T; funName?: string }> { + ): Promise<{ data: T; callbackName?: string }> { if (listener.serviceType == ServiceType.CALLGENT) { - return this._invokeCallgent(listener, event, funName); + return this._invokeCallgent(listener, data, funName); } else { - return this._invokeService(listener, event, funName); + return this._invokeService(listener, data, funName); } } + + /** service.func_signature(event): Promise<{ data: T; funName?: string }> */ protected async _invokeService( target: { id: string; serviceName: string; funName: string }, - event: EventObject, + data: EventObject, funName?: string, - ): Promise<{ event: T; funName?: string }> { + ): Promise<{ data: T; funName?: string }> { const service = this.moduleRef.get(target.serviceName, { strict: false }); if (!service) throw new Error( @@ -221,15 +231,15 @@ export class EventListenersService { `Service ${target.serviceName}.${target.funName} not found for event listener#${target.id}`, ); - return fun.apply(service, [event]); + return fun.apply(service, [data]); } protected async _invokeCallgent( target: { id: string; serviceName: string; funName: string }, - event: T, + data: T, funName?: string, - ): Promise<{ event: T; funName?: string }> { - return { event }; + ): Promise<{ data: T; callbackName?: string }> { + return { data }; } @Transactional() @@ -250,26 +260,4 @@ export class EventListenersService { const prisma = this.txHost.tx as PrismaClient; return prisma.eventListener.deleteMany({ where }); } - - @Transactional() - upsertEvent( - event: EventObject, - funName: string, - listenerId: string, - status: number, - ) { - const prisma = this.txHost.tx as PrismaClient; - event.statusCode = status; - const data: Prisma.EventStoreCreateInput = { - ...event, - funName, - listenerId, - }; - delete (data as any).rawReq; - return prisma.eventStore.upsert({ - where: { id: event.id }, - create: data, - update: data, - }); - } } diff --git a/src/event-listeners/event-object.ts b/src/event-listeners/event-object.ts index 87f43eb..c6b738c 100644 --- a/src/event-listeners/event-object.ts +++ b/src/event-listeners/event-object.ts @@ -1,5 +1,4 @@ import { EventCallbackType } from '@prisma/client'; -import { JsonValue } from '@prisma/client/runtime/library'; import { Utils } from '../infra/libs/utils'; export class EventObject { diff --git a/src/event-stores/event-stores.service.ts b/src/event-stores/event-stores.service.ts index c571a0d..79441c0 100644 --- a/src/event-stores/event-stores.service.ts +++ b/src/event-stores/event-stores.service.ts @@ -1,7 +1,7 @@ -import { TransactionHost } from '@nestjs-cls/transactional'; +import { Transactional, TransactionHost } from '@nestjs-cls/transactional'; import { TransactionalAdapterPrisma } from '@nestjs-cls/transactional-adapter-prisma'; import { Injectable, NotFoundException } from '@nestjs/common'; -import { PrismaClient } from '@prisma/client'; +import { Prisma, PrismaClient } from '@prisma/client'; import { EventObject } from '../event-listeners/event-object'; import { Utils } from '../infra/libs/utils'; @@ -26,4 +26,33 @@ export class EventStoresService { event.context.tgtEvents = es; } else event.targetId = Utils.uuid(); // create new targetId } + + findOne(eventId: string) { + const prisma = this.txHost.tx as PrismaClient; + return prisma.eventStore.findUnique({ + where: { id: eventId }, + }); + } + + @Transactional() + upsertEvent( + event: EventObject, + funName: string, + listenerId: string, + status: number, + ) { + const prisma = this.txHost.tx as PrismaClient; + event.statusCode = status; + const data: Prisma.EventStoreCreateInput = { + ...event, + funName, + listenerId, + }; + delete (data as any).rawReq; + return prisma.eventStore.upsert({ + where: { id: event.id }, + create: data, + update: data, + }); + } } diff --git a/src/infra/auth/jwt/jwt.service.ts b/src/infra/auth/jwt/jwt.service.ts index 95bc83b..79c3b09 100644 --- a/src/infra/auth/jwt/jwt.service.ts +++ b/src/infra/auth/jwt/jwt.service.ts @@ -1,4 +1,4 @@ -import { Injectable } from '@nestjs/common'; +import { Injectable, UnauthorizedException } from '@nestjs/common'; import { ConfigService } from '@nestjs/config'; import { JwtService } from '@nestjs/jwt'; import { Utils } from '../../libs/utils'; @@ -40,11 +40,13 @@ export class JwtAuthService { /** * @returns decoded object + * @throws UnauthorizedException */ - verify(token: string) { - return ( - this.jwtService.verify(token) && - this.jwtService.decode(token, { json: true, complete: true }) - ); + verify(token: string): JwtPayload { + try { + return this.jwtService.verify(token, { complete: true })?.payload; + } catch (error) { + throw new UnauthorizedException(error.message); + } } } diff --git a/src/task-actions/task-actions.service.ts b/src/task-actions/task-actions.service.ts index a6fc7d6..d384e2f 100644 --- a/src/task-actions/task-actions.service.ts +++ b/src/task-actions/task-actions.service.ts @@ -1,6 +1,10 @@ import { TransactionHost, Transactional } from '@nestjs-cls/transactional'; import { TransactionalAdapterPrisma } from '@nestjs-cls/transactional-adapter-prisma'; -import { Injectable, NotFoundException } from '@nestjs/common'; +import { + Injectable, + NotFoundException, + NotImplementedException, +} from '@nestjs/common'; import { PrismaClient } from '@prisma/client'; import { CallgentFunctionDto } from '../callgent-functions/dto/callgent-function.dto'; import { CallgentDto } from '../callgents/dto/callgent.dto'; @@ -138,7 +142,7 @@ export class TaskActionsService { // 根据req请求,在给定的方法集中,匹配需要用到的方法子集 // 可能用到多个, - throw new Error('Method not implemented.'); + throw new NotImplementedException('Method not implemented.'); } /** invocation flow, and lifecycle events */ diff --git a/src/users/auth.controller.ts b/src/users/auth.controller.ts index faff4df..ebedbc2 100644 --- a/src/users/auth.controller.ts +++ b/src/users/auth.controller.ts @@ -1,5 +1,13 @@ import { CacheTTL } from '@nestjs/cache-manager'; -import { Body, Controller, Post } from '@nestjs/common'; +import { + BadRequestException, + Body, + Controller, + HttpCode, + HttpStatus, + Post, + UnauthorizedException, +} from '@nestjs/common'; import { ConfigService } from '@nestjs/config'; import { ApiOkResponse, ApiTags, getSchemaPath } from '@nestjs/swagger'; import { JwtAuthService } from '../infra/auth/jwt/jwt.service'; @@ -65,4 +73,41 @@ export class AuthController extends LocalAuthController { meta: { token }, }; } + + /** oauth2 credentials auth */ + @Post('tokens') + @HttpCode(HttpStatus.OK) + async getTokenByOauth2Credentials( + @Body() + { + grant_type, + username, + password, + }: { + grant_type: string; + username: string; + password: string; + }, + ) { + if (grant_type !== 'credentials') + throw new BadRequestException('Unsupported grant type'); + + const user = this.configService.get('EMAIL_SPARKPOST_RELAY_CLIENT_ID'); + const pwd = this.configService.get('EMAIL_SPARKPOST_RELAY_CLIENT_SECRET'); + if (user !== username || pwd !== password) + throw new UnauthorizedException('Invalid credentials'); + + const expires_in = parseInt( + this.configService.get('EMAIL_SPARKPOST_RELAY_EXPIRES_IN'), + ); + return { + access_token: this.jwtService.sign({ + sub: user, + iss: 'sparkpost-relay', + aud: 'sparkpost-relay', + }), + token_type: 'Bearer', + expires_in, + }; + } } diff --git a/src/users/users.service.ts b/src/users/users.service.ts index 47f5bce..fe80e89 100644 --- a/src/users/users.service.ts +++ b/src/users/users.service.ts @@ -271,7 +271,7 @@ export class UsersService { 'API_KEY', ); // send email - return this.emailsService.sendTemplateMail( + return this.emailsService.sendTemplateEmail( [{ email, name: ui?.name || email }], 'validation-email', { token, resetPwd, create }, From 64a687d297613c462a1ba90630061b4c33575407 Mon Sep 17 00:00:00 2001 From: dev-callgent Date: Mon, 2 Sep 2024 17:14:26 +0800 Subject: [PATCH 047/183] feat: sparkpost relay-webhook integration Signed-off-by: dev-callgent --- .../migration.sql | 25 ------------------- .../migration.sql | 24 ------------------ 2 files changed, 49 deletions(-) diff --git a/prisma/migrations/20240828045122_event_listener_desc/migration.sql b/prisma/migrations/20240828045122_event_listener_desc/migration.sql index 94a977c..facb702 100644 --- a/prisma/migrations/20240828045122_event_listener_desc/migration.sql +++ b/prisma/migrations/20240828045122_event_listener_desc/migration.sql @@ -1,27 +1,2 @@ --- AlterTable -ALTER TABLE "Callgent" ALTER COLUMN "tenantPk" SET DEFAULT (current_setting('tenancy.tenantPk')::int); - --- AlterTable -ALTER TABLE "CallgentFunction" ALTER COLUMN "tenantPk" SET DEFAULT (current_setting('tenancy.tenantPk')::int); - --- AlterTable -ALTER TABLE "Endpoint" ALTER COLUMN "tenantPk" SET DEFAULT (current_setting('tenancy.tenantPk')::int); - --- AlterTable -ALTER TABLE "EndpointAuth" ALTER COLUMN "tenantPk" SET DEFAULT (current_setting('tenancy.tenantPk')::int); - -- AlterTable ALTER TABLE "EventListener" ADD COLUMN "description" VARCHAR(2000) NOT NULL DEFAULT '', -ALTER COLUMN "tenantPk" SET DEFAULT (current_setting('tenancy.tenantPk')::int); - --- AlterTable -ALTER TABLE "Task" ALTER COLUMN "tenantPk" SET DEFAULT (current_setting('tenancy.tenantPk')::int); - --- AlterTable -ALTER TABLE "TaskAction" ALTER COLUMN "tenantPk" SET DEFAULT (current_setting('tenancy.tenantPk')::int); - --- AlterTable -ALTER TABLE "User" ALTER COLUMN "tenantPk" SET DEFAULT (current_setting('tenancy.tenantPk')::int); - --- AlterTable -ALTER TABLE "UserIdentity" ALTER COLUMN "tenantPk" SET DEFAULT (current_setting('tenancy.tenantPk')::int); diff --git a/prisma/migrations/20240829075201_callgent_function_refactor/migration.sql b/prisma/migrations/20240829075201_callgent_function_refactor/migration.sql index ea331b5..8b0d7c2 100644 --- a/prisma/migrations/20240829075201_callgent_function_refactor/migration.sql +++ b/prisma/migrations/20240829075201_callgent_function_refactor/migration.sql @@ -11,8 +11,6 @@ - Added the required column `signature` to the `CallgentFunction` table without a default value. This is not possible if the table is not empty. */ --- AlterTable -ALTER TABLE "Callgent" ALTER COLUMN "tenantPk" SET DEFAULT (current_setting('tenancy.tenantPk')::int); -- AlterTable ALTER TABLE "CallgentFunction" DROP COLUMN "content", @@ -23,28 +21,6 @@ DROP COLUMN "params", ADD COLUMN "method" VARCHAR(15) NOT NULL, ADD COLUMN "path" VARCHAR(1000) NOT NULL, ADD COLUMN "signature" JSON NOT NULL, -ADD COLUMN "summary" VARCHAR(511) NOT NULL DEFAULT '', ADD COLUMN "summary" VARCHAR(1023) NOT NULL DEFAULT '', ALTER COLUMN "tenantPk" SET DEFAULT (current_setting('tenancy.tenantPk')::int), ALTER COLUMN "name" SET DATA TYPE VARCHAR(1023); - --- AlterTable -ALTER TABLE "Endpoint" ALTER COLUMN "tenantPk" SET DEFAULT (current_setting('tenancy.tenantPk')::int); - --- AlterTable -ALTER TABLE "EndpointAuth" ALTER COLUMN "tenantPk" SET DEFAULT (current_setting('tenancy.tenantPk')::int); - --- AlterTable -ALTER TABLE "EventListener" ALTER COLUMN "tenantPk" SET DEFAULT (current_setting('tenancy.tenantPk')::int); - --- AlterTable -ALTER TABLE "Task" ALTER COLUMN "tenantPk" SET DEFAULT (current_setting('tenancy.tenantPk')::int); - --- AlterTable -ALTER TABLE "TaskAction" ALTER COLUMN "tenantPk" SET DEFAULT (current_setting('tenancy.tenantPk')::int); - --- AlterTable -ALTER TABLE "User" ALTER COLUMN "tenantPk" SET DEFAULT (current_setting('tenancy.tenantPk')::int); - --- AlterTable -ALTER TABLE "UserIdentity" ALTER COLUMN "tenantPk" SET DEFAULT (current_setting('tenancy.tenantPk')::int); From 0278cd2db3d5cf8111a615e7f6a91c38312ceb61 Mon Sep 17 00:00:00 2001 From: dev-callgent <160819054+dev-callgent@users.noreply.github.com> Date: Mon, 2 Sep 2024 17:55:24 +0800 Subject: [PATCH 048/183] Update auth.controller.ts Signed-off-by: dev-callgent <160819054+dev-callgent@users.noreply.github.com> --- src/users/auth.controller.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/users/auth.controller.ts b/src/users/auth.controller.ts index ebedbc2..c7af77a 100644 --- a/src/users/auth.controller.ts +++ b/src/users/auth.controller.ts @@ -90,7 +90,7 @@ export class AuthController extends LocalAuthController { }, ) { if (grant_type !== 'credentials') - throw new BadRequestException('Unsupported grant type'); + throw new BadRequestException('Unsupported grant type ' + grant_type); const user = this.configService.get('EMAIL_SPARKPOST_RELAY_CLIENT_ID'); const pwd = this.configService.get('EMAIL_SPARKPOST_RELAY_CLIENT_SECRET'); From 19a95f053583c7988ca6e83580a259a7cf9759f3 Mon Sep 17 00:00:00 2001 From: dev-callgent Date: Mon, 2 Sep 2024 18:01:35 +0800 Subject: [PATCH 049/183] feat: sparkpost relay-webhook integration Signed-off-by: dev-callgent --- .../20240829075201_callgent_function_refactor/migration.sql | 3 ++- src/users/auth.controller.ts | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/prisma/migrations/20240829075201_callgent_function_refactor/migration.sql b/prisma/migrations/20240829075201_callgent_function_refactor/migration.sql index 8b0d7c2..80f053b 100644 --- a/prisma/migrations/20240829075201_callgent_function_refactor/migration.sql +++ b/prisma/migrations/20240829075201_callgent_function_refactor/migration.sql @@ -21,6 +21,7 @@ DROP COLUMN "params", ADD COLUMN "method" VARCHAR(15) NOT NULL, ADD COLUMN "path" VARCHAR(1000) NOT NULL, ADD COLUMN "signature" JSON NOT NULL, -ADD COLUMN "summary" VARCHAR(1023) NOT NULL DEFAULT '', +ADD COLUMN "summary" VARCHAR(511) NOT NULL DEFAULT '', +ADD COLUMN "description" VARCHAR(1023) NOT NULL DEFAULT '', ALTER COLUMN "tenantPk" SET DEFAULT (current_setting('tenancy.tenantPk')::int), ALTER COLUMN "name" SET DATA TYPE VARCHAR(1023); diff --git a/src/users/auth.controller.ts b/src/users/auth.controller.ts index ebedbc2..c7af77a 100644 --- a/src/users/auth.controller.ts +++ b/src/users/auth.controller.ts @@ -90,7 +90,7 @@ export class AuthController extends LocalAuthController { }, ) { if (grant_type !== 'credentials') - throw new BadRequestException('Unsupported grant type'); + throw new BadRequestException('Unsupported grant type ' + grant_type); const user = this.configService.get('EMAIL_SPARKPOST_RELAY_CLIENT_ID'); const pwd = this.configService.get('EMAIL_SPARKPOST_RELAY_CLIENT_SECRET'); From caaa0a49230d6f4f51bc0fd3fba5d55d3c800ad7 Mon Sep 17 00:00:00 2001 From: dev-callgent <160819054+dev-callgent@users.noreply.github.com> Date: Mon, 2 Sep 2024 18:03:03 +0800 Subject: [PATCH 050/183] Update auth.controller.ts Signed-off-by: dev-callgent <160819054+dev-callgent@users.noreply.github.com> --- src/users/auth.controller.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/users/auth.controller.ts b/src/users/auth.controller.ts index c7af77a..d660086 100644 --- a/src/users/auth.controller.ts +++ b/src/users/auth.controller.ts @@ -89,7 +89,7 @@ export class AuthController extends LocalAuthController { password: string; }, ) { - if (grant_type !== 'credentials') + if (grant_type !== 'client_credentials') throw new BadRequestException('Unsupported grant type ' + grant_type); const user = this.configService.get('EMAIL_SPARKPOST_RELAY_CLIENT_ID'); From 2ed0104eae934453e47497d7060fb505670d6599 Mon Sep 17 00:00:00 2001 From: dev-callgent <160819054+dev-callgent@users.noreply.github.com> Date: Mon, 2 Sep 2024 18:12:37 +0800 Subject: [PATCH 051/183] Update auth.controller.ts Signed-off-by: dev-callgent <160819054+dev-callgent@users.noreply.github.com> --- src/users/auth.controller.ts | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/users/auth.controller.ts b/src/users/auth.controller.ts index d660086..75a0d31 100644 --- a/src/users/auth.controller.ts +++ b/src/users/auth.controller.ts @@ -81,20 +81,20 @@ export class AuthController extends LocalAuthController { @Body() { grant_type, - username, - password, + client_id, + client_secret, }: { grant_type: string; - username: string; - password: string; + client_id: string; + client_secret: string; }, ) { if (grant_type !== 'client_credentials') throw new BadRequestException('Unsupported grant type ' + grant_type); - const user = this.configService.get('EMAIL_SPARKPOST_RELAY_CLIENT_ID'); + const cid = this.configService.get('EMAIL_SPARKPOST_RELAY_CLIENT_ID'); const pwd = this.configService.get('EMAIL_SPARKPOST_RELAY_CLIENT_SECRET'); - if (user !== username || pwd !== password) + if (cid !== client_id || pwd !== client_secret) throw new UnauthorizedException('Invalid credentials'); const expires_in = parseInt( @@ -102,7 +102,7 @@ export class AuthController extends LocalAuthController { ); return { access_token: this.jwtService.sign({ - sub: user, + sub: cid, iss: 'sparkpost-relay', aud: 'sparkpost-relay', }), From 0067133f8d6b53fc42fc4c722a78b3fb56060c9b Mon Sep 17 00:00:00 2001 From: dev-callgent <160819054+dev-callgent@users.noreply.github.com> Date: Mon, 2 Sep 2024 18:21:45 +0800 Subject: [PATCH 052/183] Update emails.service.ts Signed-off-by: dev-callgent <160819054+dev-callgent@users.noreply.github.com> --- src/emails/emails.service.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/emails/emails.service.ts b/src/emails/emails.service.ts index d1915be..c748f7f 100644 --- a/src/emails/emails.service.ts +++ b/src/emails/emails.service.ts @@ -112,7 +112,7 @@ export class EmailsService implements OnModuleInit { * @see https://developers.sparkpost.com/api/relay-webhooks/ */ handleRelayMessage(msg: RelayMessage): void { - let { rcpt_to: mailTo } = msg; + let mailTo = msg?.rcpt_to; mailTo = mailTo.toLowerCase(); const mailHost = this.configService.get('EMAIL_RELAY_HOST'); if (!mailTo.endsWith(mailHost)) From 1a6157c5560eb5a49fcd16b363510602e106a1d7 Mon Sep 17 00:00:00 2001 From: dev-callgent <160819054+dev-callgent@users.noreply.github.com> Date: Mon, 2 Sep 2024 18:30:21 +0800 Subject: [PATCH 053/183] Update emails.service.ts Signed-off-by: dev-callgent <160819054+dev-callgent@users.noreply.github.com> --- src/emails/emails.service.ts | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/emails/emails.service.ts b/src/emails/emails.service.ts index c748f7f..c1fff4e 100644 --- a/src/emails/emails.service.ts +++ b/src/emails/emails.service.ts @@ -112,10 +112,9 @@ export class EmailsService implements OnModuleInit { * @see https://developers.sparkpost.com/api/relay-webhooks/ */ handleRelayMessage(msg: RelayMessage): void { - let mailTo = msg?.rcpt_to; - mailTo = mailTo.toLowerCase(); + let mailTo = msg?.rcpt_to?.toLowerCase(); const mailHost = this.configService.get('EMAIL_RELAY_HOST'); - if (!mailTo.endsWith(mailHost)) + if (!mailTo?.endsWith(mailHost)) return this.logger.error('Invalid relay host, ignored message: %j', msg); mailTo = mailTo.substring(0, mailTo.indexOf('@')); From 459db768a1e86e250717ff232c9b80a23046ed1d Mon Sep 17 00:00:00 2001 From: dev-callgent Date: Tue, 3 Sep 2024 17:34:40 +0800 Subject: [PATCH 054/183] refactor: db relation and migrations Signed-off-by: dev-callgent --- .env.dev | 2 +- .env.test | 2 +- .../20240822033907_init/migration.sql | 25 ------- .../migration.sql | 2 +- prisma/schema.prisma | 5 +- prisma/seed-test.ts | 4 +- src/agents/agents.service.ts | 6 +- .../callgent-functions.service.ts | 2 +- .../dto/sparkpost-relay-object.interface.ts | 4 +- src/emails/emails.controller.ts | 11 +-- src/emails/emails.module.ts | 5 +- src/emails/emails.service.ts | 71 ++++++++++--------- src/emails/events/email-relay.event.ts | 12 ++++ .../listeners/request-relay-event.listener.ts | 33 +++++++++ .../adaptors/builtin/email/email.adaptor.ts | 24 ++++--- .../builtin/restapi/restapi.adaptor.ts | 10 +-- .../adaptors/builtin/web/webpage.adaptor.ts | 7 +- .../adaptors/endpoint-adaptor.base.ts | 25 +++++-- src/endpoints/endpoints.service.ts | 41 ++++++++--- src/endpoints/events/client-request.event.ts | 5 +- .../listeners/callgent-created.listener.ts | 7 +- .../event-listeners.service.ts | 18 +++-- src/users/auth.controller.ts | 16 ++--- 23 files changed, 213 insertions(+), 124 deletions(-) create mode 100644 src/emails/events/email-relay.event.ts create mode 100644 src/emails/listeners/request-relay-event.listener.ts diff --git a/.env.dev b/.env.dev index 696fb05..59bb2cf 100644 --- a/.env.dev +++ b/.env.dev @@ -51,7 +51,7 @@ CALLGENT_SITE_URL=https://callgent.com CALLGENT_SITE_NAME=Callgent.com EMAIL_DEFAULT_SENDER={"name": "Callgent", "email": "noreply@callgent.com"} -EMAIL_RELAY_HOST=my.callgent.com +EMAIL_RELAY_HOST=mytest.callgent.com # https://app.brevo.com/settings/keys/api EMAIL_BREVO_API_KEY=key diff --git a/.env.test b/.env.test index 789724a..52307ae 100644 --- a/.env.test +++ b/.env.test @@ -51,7 +51,7 @@ CALLGENT_SITE_URL=https://callgent.com CALLGENT_SITE_NAME=Callgent.com EMAIL_DEFAULT_SENDER={"name": "Callgent", "email": "noreply@callgent.com"} -EMAIL_RELAY_HOST=my.callgent.com +EMAIL_RELAY_HOST=mytest.callgent.com # https://app.brevo.com/settings/keys/api EMAIL_BREVO_API_KEY=key diff --git a/prisma/migrations/20240822033907_init/migration.sql b/prisma/migrations/20240822033907_init/migration.sql index 78c9cd0..f7c5ee5 100644 --- a/prisma/migrations/20240822033907_init/migration.sql +++ b/prisma/migrations/20240822033907_init/migration.sql @@ -19,35 +19,10 @@ -- CreateEnum CREATE TYPE "EndpointAuthType" AS ENUM ('NONE', 'APP', 'USER'); --- AlterTable -ALTER TABLE "Callgent" ALTER COLUMN "tenantPk" SET DEFAULT (current_setting('tenancy.tenantPk')::int); - --- AlterTable -ALTER TABLE "CallgentFunction" ALTER COLUMN "tenantPk" SET DEFAULT (current_setting('tenancy.tenantPk')::int); - -- AlterTable ALTER TABLE "Endpoint" ADD COLUMN "name" VARCHAR(2047) NOT NULL DEFAULT '', -ALTER COLUMN "tenantPk" SET DEFAULT (current_setting('tenancy.tenantPk')::int), ALTER COLUMN "host" SET DATA TYPE VARCHAR(2047); --- AlterTable -ALTER TABLE "EndpointAuth" ALTER COLUMN "tenantPk" SET DEFAULT (current_setting('tenancy.tenantPk')::int); - --- AlterTable -ALTER TABLE "EventListener" ALTER COLUMN "tenantPk" SET DEFAULT (current_setting('tenancy.tenantPk')::int); - --- AlterTable -ALTER TABLE "Task" ALTER COLUMN "tenantPk" SET DEFAULT (current_setting('tenancy.tenantPk')::int); - --- AlterTable -ALTER TABLE "TaskAction" ALTER COLUMN "tenantPk" SET DEFAULT (current_setting('tenancy.tenantPk')::int); - --- AlterTable -ALTER TABLE "User" ALTER COLUMN "tenantPk" SET DEFAULT (current_setting('tenancy.tenantPk')::int); - --- AlterTable -ALTER TABLE "UserIdentity" ALTER COLUMN "tenantPk" SET DEFAULT (current_setting('tenancy.tenantPk')::int); - -- CreateTable CREATE TABLE "Tenant" ( "pk" SERIAL NOT NULL, diff --git a/prisma/migrations/20240828045122_event_listener_desc/migration.sql b/prisma/migrations/20240828045122_event_listener_desc/migration.sql index facb702..03579f7 100644 --- a/prisma/migrations/20240828045122_event_listener_desc/migration.sql +++ b/prisma/migrations/20240828045122_event_listener_desc/migration.sql @@ -1,2 +1,2 @@ -- AlterTable -ALTER TABLE "EventListener" ADD COLUMN "description" VARCHAR(2000) NOT NULL DEFAULT '', +ALTER TABLE "EventListener" ADD COLUMN "description" VARCHAR(2000) NOT NULL DEFAULT ''; diff --git a/prisma/schema.prisma b/prisma/schema.prisma index d461fe8..a9bb899 100644 --- a/prisma/schema.prisma +++ b/prisma/schema.prisma @@ -170,6 +170,8 @@ model Callgent { /// @DtoEntityHidden deletedAt DateTime? /// @description logical deletion. + endpoints Endpoint[] + @@unique([tenantPk, name]) @@index([tenantPk]) } @@ -348,7 +350,8 @@ model Endpoint { /// @DtoUpdateApiResponse /// @DtoPlainApiResponse /// @CustomValidator(EntityIdExists, 'callgent', 'id', ../../infra/repo/validators/entity-exists.validator) - callgentId String @db.VarChar(36) /// @description callgent owning the endpoint + callgentId String @db.VarChar(36) /// @description callgent owning the endpoint + callgent Callgent @relation(fields: [callgentId], references: [id]) /// @DtoReadOnly /// @DtoEntityHidden diff --git a/prisma/seed-test.ts b/prisma/seed-test.ts index d6202a0..fad40b5 100644 --- a/prisma/seed-test.ts +++ b/prisma/seed-test.ts @@ -170,8 +170,8 @@ function initTestData() { addLlmCache( 8, 'map2Function', - 'given below service functions:\nclass test-callgent {\n "function name: GET:/positions": {"params":[invoker], "documents":"List all job positions"},\n\n}\nand an service `invoker` function.\n\nPlease choose one function to fulfill below request:\n{\n"requesting function": "GET:/positions",\n"request from": "restAPI",\n"request_object": {"url":"/positions","method":"GET","headers":{"user-agent":"Apifox/1.0.0 (https://apifox.com)","accept":"*/*","host":"127.0.0.1:3000","accept-encoding":"gzip, deflate, br","connection":"keep-alive"},"query":{}},\n}\nand code for request_object to chosen function args mapping. if any data missing/unclear/ambiguous from request_object to invocation args, please ask question to the caller in below json.question field.\n\noutput a single-line json object:\n{ "funName": "the function name to be invoked", "params":"param names of the chosen function", "mapping": "the js function (invoker, request_object)=>{...;return functionArgsArray;}, full implementation to return the **real** args from request_object to invoke the chosen service function. don\'t use data not exist or ambiguous in request", "question": "question to ask the caller if anything not sure or missing for request to args mapping, *no* guess or assumption of the mapping. null if the mapping is crystal clear." }"}', - '{ "funName": "GET:/positions", "params": ["invoker"], "mapping": "(invoker, request_object)=>{return [invoker];}", "question": "null" }', + 'given below service APIs:\nservice test-callgent {\n "API: GET /positions": {"endpoint": "GET /positions", "summary":"listPositions: List all job positions", "description":"Retrieve a list of all available job positions.", "signature":{"responses":{"200":{"description":"A list of job positions","content":{"application/json":{"schema":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","description":"Unique identifier for the job position"},"title":{"type":"string","description":"Title of the job position"},"description":{"type":"string","description":"Description of the job position"},"location":{"type":"string","description":"Location of the job position"},"requirements":{"type":"array","items":{"type":"string"},"description":"List of requirements for the job position"},"createdAt":{"type":"string","format":"date-time","description":"Timestamp when the job position was created"},"updatedAt":{"type":"string","format":"date-time","description":"Timestamp when the job position was last updated"}}}}}}},"500":{"description":"Internal Server Error"}}} },\n}\n\nPlease choose one API to fulfill below request:\n{\n"requesting endpoint": "GET /positions",\n"request from": "restAPI",\n"request_object": {"url":"/positions","method":"GET","headers":{"user-agent":"Apifox/1.0.0 (https://apifox.com)","accept":"*/*","host":"127.0.0.1:3000","accept-encoding":"gzip, deflate, br","connection":"keep-alive"},"query":{}},\n}\nand code for request_object to chosen function args mapping. if any data missing/unclear/ambiguous from request_object to invocation args, please ask question to the caller in below json.question field.\n\noutput a single-line json object:\n{ "endpoint": "the chosen API endpoint to be invoked", "args":"request params/body/headers/..., with same structure as the signature JSON object(no more args than it), or null if no args needed", "mapping": "if the the request_object is structured (or null if unstructured), generate the js function (request_object)=>{...;return API_signature_args;}, full implementation to return the **real** args from request_object to invoke the API. don\'t use data not exist or ambiguous in request", "question": "question to ask the caller if anything not sure or missing for request to args mapping, *no* guess or assumption of the mapping. null if the mapping is crystal clear." }"}', + '{ "endpoint": "GET /positions", "args": null, "mapping": "(request_object)=>{return null;}", "question": null }', ), ]; } diff --git a/src/agents/agents.service.ts b/src/agents/agents.service.ts index bfb2b46..a5a7816 100644 --- a/src/agents/agents.service.ts +++ b/src/agents/agents.service.ts @@ -35,7 +35,7 @@ export class AgentsService { */ async map2Function( reqEvent: ClientRequestEvent, - ): Promise { + ): Promise { const { id, srcId, @@ -87,7 +87,7 @@ export class AgentsService { if (statusCode == 1) // pending - return { data: reqEvent, callbackName: 'map2FunctionProgressive' }; + return { data: reqEvent, resumeFunName: 'map2FunctionProgressive' }; throw new HttpException(prEvent.message, statusCode); } else { const functions = reqEvent.context.functions.filter( @@ -103,7 +103,7 @@ export class AgentsService { async map2FunctionProgressive( data: ProgressiveRequestEvent, reqEvent?: ClientRequestEvent, - ): Promise { + ): Promise { // handle resp } diff --git a/src/callgent-functions/callgent-functions.service.ts b/src/callgent-functions/callgent-functions.service.ts index 63bab55..13c6d5b 100644 --- a/src/callgent-functions/callgent-functions.service.ts +++ b/src/callgent-functions/callgent-functions.service.ts @@ -32,7 +32,7 @@ export class CallgentFunctionsService { @Transactional() async loadFunctions( reqEvent: ClientRequestEvent, - ): Promise { + ): Promise { const { funName, callgentId } = reqEvent.data; // TODO if too many functions, use summary first diff --git a/src/emails/dto/sparkpost-relay-object.interface.ts b/src/emails/dto/sparkpost-relay-object.interface.ts index 2934fef..6cbecb8 100644 --- a/src/emails/dto/sparkpost-relay-object.interface.ts +++ b/src/emails/dto/sparkpost-relay-object.interface.ts @@ -53,7 +53,7 @@ interface Content { /** * Represents the relay message. */ -export interface RelayMessage { +export interface RelayEmail { /** * The content parsed from the incoming message. */ @@ -92,6 +92,6 @@ export interface RelayMessage { export interface EmailRelayObject { msys: { - relay_message: RelayMessage; + relay_message: RelayEmail; }; } diff --git a/src/emails/emails.controller.ts b/src/emails/emails.controller.ts index 7869f71..3a3332d 100644 --- a/src/emails/emails.controller.ts +++ b/src/emails/emails.controller.ts @@ -27,13 +27,16 @@ export class EmailsController { @Headers('Authorization') authorization: string, @Body() relays: EmailRelayObject[], ) { - const { sub } = this.jwtAuthService.verify(authorization?.substring(7)); - if (sub !== this.configService.get('EMAIL_SPARKPOST_RELAY_CLIENT_ID')) - throw new BadRequestException('Invalid Client ID'); + // test hosts don't need to be authenticated + if (this.configService.get('EMAIL_RELAY_HOST').indexOf('test') < 0) { + const { sub } = this.jwtAuthService.verify(authorization?.substring(7)); + if (sub !== this.configService.get('EMAIL_SPARKPOST_RELAY_CLIENT_ID')) + throw new BadRequestException('Invalid Client ID'); + } // handle relay event relays?.forEach((relay) => - this.emailsService.handleRelayMessage(relay.msys.relay_message), + this.emailsService.handleRelayEmail(relay.msys.relay_message), ); return; // return 200 to consume the event } diff --git a/src/emails/emails.module.ts b/src/emails/emails.module.ts index 6c0b688..ccff13f 100644 --- a/src/emails/emails.module.ts +++ b/src/emails/emails.module.ts @@ -1,11 +1,12 @@ import { Global, Module } from '@nestjs/common'; import { EmailTemplateProvider } from './email-template.provider'; -import { EmailsService } from './emails.service'; import { EmailsController } from './emails.controller'; +import { EmailsService } from './emails.service'; +import { RequestRelayListener } from './listeners/request-relay-event.listener'; @Global() @Module({ - providers: [EmailsService, EmailTemplateProvider], + providers: [EmailsService, EmailTemplateProvider, RequestRelayListener], exports: [EmailsService], controllers: [EmailsController], }) diff --git a/src/emails/emails.service.ts b/src/emails/emails.service.ts index d1915be..21dbef6 100644 --- a/src/emails/emails.service.ts +++ b/src/emails/emails.service.ts @@ -1,9 +1,12 @@ import { Injectable, Logger, OnModuleInit } from '@nestjs/common'; import { ConfigService } from '@nestjs/config'; +import { EventEmitter2 } from '@nestjs/event-emitter'; import axios from 'axios'; import path from 'path'; +import { RelayEmail } from './dto/sparkpost-relay-object.interface'; import { EmailTemplateProvider } from './email-template.provider'; -import { RelayMessage } from './dto/sparkpost-relay-object.interface'; +import { EmailRelayEvent } from './events/email-relay.event'; +import { Transactional } from '@nestjs-cls/transactional'; @Injectable() export class EmailsService implements OnModuleInit { @@ -11,6 +14,7 @@ export class EmailsService implements OnModuleInit { constructor( private readonly configService: ConfigService, private emailTemplates: EmailTemplateProvider, + private readonly eventEmitter: EventEmitter2, ) {} async onModuleInit() { @@ -68,16 +72,22 @@ export class EmailsService implements OnModuleInit { 'api-key': apiKey, 'content-type': 'application/json', }; - return axios.post(url, data, { headers }).then(function (resp) { - const sent = resp.status < 300; - if (!sent) { - this.logger.error('Failed to send email. resp: %j', { - ...resp, - request: { url, data }, - }); - } - return sent; - }); + this.logger.debug('Sending email to %j. from: %j', to, sender); + try { + return axios.post(url, data, { headers }).then(function (resp) { + const sent = resp.status < 300; + if (!sent) { + this.logger.error('Failed to send email. resp: %j', { + ...resp, + request: { url, data }, + }); + } + return sent; + }); + } catch (err) { + this.logger.error('Failed to send email to %j. err: %s', to, err.message); + throw err; + } } private _formalizeEmails( emails: @@ -99,7 +109,6 @@ export class EmailsService implements OnModuleInit { // } /** - * * @returns `${relayType}+${id}@${mailHost}` */ getRelayAddress(id: string, relayType: EmailRelayKey) { @@ -111,36 +120,34 @@ export class EmailsService implements OnModuleInit { * sparkpost relay message * @see https://developers.sparkpost.com/api/relay-webhooks/ */ - handleRelayMessage(msg: RelayMessage): void { - let { rcpt_to: mailTo } = msg; - mailTo = mailTo.toLowerCase(); + @Transactional() + handleRelayEmail(email: RelayEmail): void { + let mailTo = email?.rcpt_to?.toLowerCase(); const mailHost = this.configService.get('EMAIL_RELAY_HOST'); - if (!mailTo.endsWith(mailHost)) - return this.logger.error('Invalid relay host, ignored message: %j', msg); + if (!mailTo?.endsWith(mailHost)) + return this.logger.error('Invalid relay host, ignored: %j', email); mailTo = mailTo.substring(0, mailTo.indexOf('@')); const [relayKey, relayId] = mailTo.split('+'); switch (relayKey) { case 'request': - this.logger.debug('relay request: %j', msg); - // TODO - break; case 'callgent': - this.logger.debug('relay callgent: %j', msg); - // TODO + // this.logger.debug('relay %j', msg); + // FIXME persistent emit, to prevent lost event + this.eventEmitter.emit( + EmailRelayEvent.eventPrefix + relayKey, + new EmailRelayEvent(relayKey as EmailRelayKey, relayId, email), + ); break; default: - this.logger.error( - 'Invalid relay key %s, ignored message: %j', - relayKey, - msg, - ); + this.logger.error('Invalid relay key %s, ignored: %j', mailTo, email); } } } -/** - * 'request': request call from email SEP. - * 'callgent': callgent email CEP. - */ -export type EmailRelayKey = 'request' | 'callgent'; +export enum EmailRelayKey { + /** ClientRequestEvent callback from email SEP */ + request = 'request', + /** callgent email CEP */ + callgent = 'callgent', +} diff --git a/src/emails/events/email-relay.event.ts b/src/emails/events/email-relay.event.ts new file mode 100644 index 0000000..b8741fa --- /dev/null +++ b/src/emails/events/email-relay.event.ts @@ -0,0 +1,12 @@ +import { RelayEmail } from '../dto/sparkpost-relay-object.interface'; +import { EmailRelayKey } from '../emails.service'; + +export class EmailRelayEvent { + public static readonly eventPrefix = 'email.relay.' as const; + + constructor( + public readonly relayKey: EmailRelayKey, + public readonly relayId: string, + public readonly email: RelayEmail, + ) {} +} diff --git a/src/emails/listeners/request-relay-event.listener.ts b/src/emails/listeners/request-relay-event.listener.ts new file mode 100644 index 0000000..48761af --- /dev/null +++ b/src/emails/listeners/request-relay-event.listener.ts @@ -0,0 +1,33 @@ +import { Transactional } from '@nestjs-cls/transactional'; +import { Injectable, Logger } from '@nestjs/common'; +import { OnEvent } from '@nestjs/event-emitter'; +import { JsonObject } from '@prisma/client/runtime/library'; +import { EventListenersService } from '../../event-listeners/event-listeners.service'; +import { EmailRelayKey } from '../emails.service'; +import { EmailRelayEvent } from '../events/email-relay.event'; + +@Injectable() +export class RequestRelayListener { + private readonly logger = new Logger(RequestRelayListener.name); + constructor(private readonly eventListenersService: EventListenersService) {} + + @Transactional() + @OnEvent(EmailRelayEvent.eventPrefix + EmailRelayKey.request) + async handleEvent(event: EmailRelayEvent) { + this.logger.debug('Handling event: %j', event); + + const { relayId: reqEventId, email } = event; + // extract resp from msg + const resp = email as object; + const reqEvent = await this.eventListenersService.loadEvent(reqEventId); + if (!reqEvent || reqEvent.eventType != 'CLIENT_REQUEST') + return this.logger.error('Event not found: %j', event); + + reqEvent.data + ? ((reqEvent.data as JsonObject).resp = resp) + : (reqEvent.data = { resp }); + + // resuming event chain + this.eventListenersService.resume(reqEvent); + } +} diff --git a/src/endpoints/adaptors/builtin/email/email.adaptor.ts b/src/endpoints/adaptors/builtin/email/email.adaptor.ts index 3b4442d..52802da 100644 --- a/src/endpoints/adaptors/builtin/email/email.adaptor.ts +++ b/src/endpoints/adaptors/builtin/email/email.adaptor.ts @@ -1,11 +1,15 @@ import { Inject, NotImplementedException } from '@nestjs/common'; import { AgentsService } from '../../../../agents/agents.service'; import { CallgentFunctionDto } from '../../../../callgent-functions/dto/callgent-function.dto'; -import { EmailsService } from '../../../../emails/emails.service'; +import { + EmailRelayKey, + EmailsService, +} from '../../../../emails/emails.service'; import { EndpointDto } from '../../../dto/endpoint.dto'; import { ClientRequestEvent } from '../../../events/client-request.event'; import { EndpointAdaptor, EndpointConfig } from '../../endpoint-adaptor.base'; import { EndpointAdaptorName } from '../../endpoint-adaptor.decorator'; +import { EventObject } from '../../../../event-listeners/event-object'; @EndpointAdaptorName('Email', 'both') export class EmailAdaptor extends EndpointAdaptor { @@ -63,21 +67,25 @@ export class EmailAdaptor extends EndpointAdaptor { * @param sep - server endpoint * @param reqEvent - client request event */ - async invoke( + async invoke( fun: CallgentFunctionDto, args: object, sep: EndpointDto, - reqEvent: ClientRequestEvent, + reqEvent: T, ) { - const emailFrom = this.emailsService.getRelayAddress(reqEvent.id, 'request'); + const emailFrom = this.emailsService.getRelayAddress( + reqEvent.id, + EmailRelayKey.request, + ); const { host: emailTo } = sep; - const subject = ''; - const body = ''; + const subject = `Please Respond to call: '${fun.name}', from Callgent ${}`; + const body = 'xxx'; return this.emailsService .sendEmail(emailTo, subject, body, emailFrom) .then((res) => ({ - statusCode: res ? -1 : 500, // processing or error - event: { ...reqEvent, rawReq: undefined }, + statusCode: res ? 1 : 500, // pending or error + data: reqEvent, + resumeFunName: 'postInvokeSEP', message: res ? 'Service called via email, please wait for async response' : 'Failed to call service via email', diff --git a/src/endpoints/adaptors/builtin/restapi/restapi.adaptor.ts b/src/endpoints/adaptors/builtin/restapi/restapi.adaptor.ts index a35674b..2f316c1 100644 --- a/src/endpoints/adaptors/builtin/restapi/restapi.adaptor.ts +++ b/src/endpoints/adaptors/builtin/restapi/restapi.adaptor.ts @@ -5,6 +5,7 @@ import { } from '@nestjs/common'; import { AgentsService } from '../../../../agents/agents.service'; import { CallgentFunctionDto } from '../../../../callgent-functions/dto/callgent-function.dto'; +import { EventObject } from '../../../../event-listeners/event-object'; import { EndpointDto } from '../../../dto/endpoint.dto'; import { ClientRequestEvent } from '../../../events/client-request.event'; import { EndpointAdaptor, EndpointConfig } from '../../endpoint-adaptor.base'; @@ -139,7 +140,7 @@ export class RestAPIAdaptor extends EndpointAdaptor { async preprocess( reqEvent: ClientRequestEvent, endpoint: EndpointDto, - ): Promise { + ): Promise { if (!reqEvent.rawReq) throw new BadRequestException( 'Missing request object for ClientRequestEvent', @@ -157,6 +158,7 @@ export class RestAPIAdaptor extends EndpointAdaptor { } reqEvent.data.req = this.req2Json(reqEvent.rawReq); + delete reqEvent.rawReq; } // async invoke() {} @@ -210,12 +212,12 @@ export class RestAPIAdaptor extends EndpointAdaptor { throw new NotImplementedException('Method not implemented.'); } - async invoke( + async invoke( fun: CallgentFunctionDto, args: object, sep: EndpointDto, - reqEvent: ClientRequestEvent, - ): Promise { + reqEvent: T, + ): Promise<{ data: T; resumeFunName?: string }> { // throw new NotImplementedException('Method not implemented.'); } diff --git a/src/endpoints/adaptors/builtin/web/webpage.adaptor.ts b/src/endpoints/adaptors/builtin/web/webpage.adaptor.ts index 999bf3d..9439295 100644 --- a/src/endpoints/adaptors/builtin/web/webpage.adaptor.ts +++ b/src/endpoints/adaptors/builtin/web/webpage.adaptor.ts @@ -1,6 +1,7 @@ import { Inject, NotImplementedException } from '@nestjs/common'; import { AgentsService } from '../../../../agents/agents.service'; import { CallgentFunctionDto } from '../../../../callgent-functions/dto/callgent-function.dto'; +import { EventObject } from '../../../../event-listeners/event-object'; import { EndpointDto } from '../../../dto/endpoint.dto'; import { ClientRequestEvent } from '../../../events/client-request.event'; import { EndpointAdaptor, EndpointConfig } from '../../endpoint-adaptor.base'; @@ -92,12 +93,12 @@ export class WebpageAdaptor extends EndpointAdaptor { throw new NotImplementedException('Method not implemented.'); } - async invoke( + async invoke( fun: CallgentFunctionDto, args: object, sep: EndpointDto, - reqEvent: ClientRequestEvent, - ) { + reqEvent: T, + ): Promise<{ data: T; resumeFunName?: string }> { throw new NotImplementedException('Method not implemented.'); } diff --git a/src/endpoints/adaptors/endpoint-adaptor.base.ts b/src/endpoints/adaptors/endpoint-adaptor.base.ts index af6fec9..949f3f8 100644 --- a/src/endpoints/adaptors/endpoint-adaptor.base.ts +++ b/src/endpoints/adaptors/endpoint-adaptor.base.ts @@ -1,12 +1,13 @@ import $RefParser from '@apidevtools/json-schema-ref-parser'; import { BadRequestException, NotFoundException } from '@nestjs/common'; import { ApiProperty } from '@nestjs/swagger'; +import { Prisma } from '@prisma/client'; +import yaml from 'yaml'; import { AgentsService } from '../../agents/agents.service'; +import { CallgentFunctionDto } from '../../callgent-functions/dto/callgent-function.dto'; +import { EventObject } from '../../event-listeners/event-object'; import { EndpointDto } from '../dto/endpoint.dto'; import { ClientRequestEvent } from '../events/client-request.event'; -import yaml from 'yaml'; -import { Prisma } from '@prisma/client'; -import { CallgentFunctionDto } from '../../callgent-functions/dto/callgent-function.dto'; export abstract class EndpointAdaptor { protected readonly agentsService: AgentsService; @@ -56,11 +57,21 @@ export abstract class EndpointAdaptor { json = yaml.parse(text); } else if (format == 'json') { json = JSON.parse(text); + } else { + try { + json = JSON.parse(text); + } catch (err) { + try { + json = yaml.parse(text); + } catch (err) { + // pass + } + } } if (!json?.openapi || !json.paths) { // convert text to openAPI.JSON - throw new Error('Not implemented.'); + throw new Error('TODO: Not implemented.'); } } catch (err) { throw new BadRequestException( @@ -105,12 +116,12 @@ export abstract class EndpointAdaptor { throw new NotFoundException('No API found in the text.'); } - abstract invoke( + abstract invoke( fun: CallgentFunctionDto, args: object, sep: EndpointDto, - reqEvent: ClientRequestEvent, - ): Promise; + reqEvent: T, + ): Promise<{ data: T; resumeFunName?: string }>; } export interface AdaptedDataSource {} diff --git a/src/endpoints/endpoints.service.ts b/src/endpoints/endpoints.service.ts index 1b09642..13db0ff 100644 --- a/src/endpoints/endpoints.service.ts +++ b/src/endpoints/endpoints.service.ts @@ -87,9 +87,13 @@ export class EndpointsService { } @Transactional() - findOne(id: string) { + findOne(id: string, select?: Prisma.EndpointSelect) { const prisma = this.txHost.tx as PrismaClient; - return prisma.endpoint.findUnique({ where: { id } }); + return selectHelper( + select, + (select) => prisma.endpoint.findUnique({ select, where: { id } }), + this.defSelect, + ); } @Transactional() @@ -150,8 +154,8 @@ export class EndpointsService { const prisma = this.txHost.tx as PrismaClient; return selectHelper( select, - async (select) => - await prisma.endpoint.findMany({ + (select) => + prisma.endpoint.findMany({ where, select, orderBy, @@ -291,7 +295,7 @@ export class EndpointsService { @Transactional() async preprocessClientRequest( reqEvent: ClientRequestEvent, - ): Promise { + ): Promise { const adaptor = this.getAdaptor(reqEvent.dataType, EndpointType.CLIENT); if (!adaptor) throw new Error( @@ -303,7 +307,6 @@ export class EndpointsService { await adaptor.preprocess(reqEvent, endpoint); } - /** preprocess req from cep, by adaptor */ @Transactional() async invokeSEP(reqEvent: ClientRequestEvent) { const { map2Function, functions } = reqEvent.context; @@ -311,10 +314,32 @@ export class EndpointsService { throw new Error('Failed to invoke, No mapping function found'); const func = functions[0] as CallgentFunctionDto; - const sep = await this.findOne(func.endpointId); + const sep = await this.findOne(func.endpointId, {}); const adapter = sep && this.getAdaptor(sep.adaptorKey, EndpointType.SERVER); if (!adapter) throw new Error('Failed to invoke, No SEP adaptor found'); - adapter.invoke(func, map2Function.args, sep, reqEvent); + + // may returns pending result + return adapter + .invoke(func, map2Function.args, sep, reqEvent) + .then((res) => { + if (res?.resumeFunName) return res; + return this.postInvokeSEP(res.data); + }); + } + + /** called after pending invokeSEP, convert resp to formal object */ + @Transactional() + async postInvokeSEP(reqEvent: ClientRequestEvent) { + const { + data: { resp }, + context: { functions }, + } = reqEvent; + if (!functions?.length) + throw new Error('Failed to invoke, No mapping function found'); + + const func = functions[0] as CallgentFunctionDto; + + return { data: reqEvent }; // do nothing } } diff --git a/src/endpoints/events/client-request.event.ts b/src/endpoints/events/client-request.event.ts index f0f107b..b93cf31 100644 --- a/src/endpoints/events/client-request.event.ts +++ b/src/endpoints/events/client-request.event.ts @@ -16,8 +16,8 @@ export class ClientRequestEvent extends EventObject { /** empty to create new task */ taskId: string, dataType: string, - /** raw request, will not be persisted */ - public readonly rawReq: any, + /** raw request, temp prop, will not be persisted */ + public rawReq: any, callback: string, public readonly data: { callgentId: string; @@ -25,6 +25,7 @@ export class ClientRequestEvent extends EventObject { /** empty means anonymous */ caller?: string; req?: JsonValue; + resp?: JsonValue; /** requested callgent function name */ funName?: string; /** url template for progressive requesting, `callgent:funName[@callgent]` to invoke callgent */ diff --git a/src/endpoints/listeners/callgent-created.listener.ts b/src/endpoints/listeners/callgent-created.listener.ts index abbecec..ff68614 100644 --- a/src/endpoints/listeners/callgent-created.listener.ts +++ b/src/endpoints/listeners/callgent-created.listener.ts @@ -3,7 +3,7 @@ import { Inject, Injectable, Logger } from '@nestjs/common'; import { OnEvent } from '@nestjs/event-emitter'; import { CallgentCreatedEvent } from '../../callgents/events/callgent-created.event'; import { EndpointsService } from '../endpoints.service'; -import { EmailsService } from '../../emails/emails.service'; +import { EmailRelayKey, EmailsService } from '../../emails/emails.service'; @Injectable() export class CallgentCreatedListener { @@ -47,7 +47,10 @@ export class CallgentCreatedListener { callgentId: callgent.id, type: 'CLIENT', adaptorKey: 'Email', - host: this.emailsService.getRelayAddress(callgent.id, 'callgent'), + host: this.emailsService.getRelayAddress( + callgent.id, + EmailRelayKey.callgent, + ), createdBy: callgent.createdBy, }) .then((endpoint) => { diff --git a/src/event-listeners/event-listeners.service.ts b/src/event-listeners/event-listeners.service.ts index e6a1459..16a98cd 100644 --- a/src/event-listeners/event-listeners.service.ts +++ b/src/event-listeners/event-listeners.service.ts @@ -59,18 +59,22 @@ export class EventListenersService { : result; } + loadEvent = (eventId: string) => this.eventStoresService.findOne(eventId); + /** resume pending event, from external callback */ @Transactional() async resume( - eventId: string, + event: string | EventStore, ): Promise<{ data: T; statusCode?: number; message?: string }> { - const event = await this.eventStoresService.findOne(eventId); - if (!event) throw new NotFoundException('Event not found, id=' + eventId); + if (typeof event === 'string') + event = (await this.loadEvent(event)) || event; + if (!event || typeof event === 'string') + throw new NotFoundException('Event not found, id=' + event); // -1: processing, 0: done, 1: pending, >1: error if (event.statusCode <= 0) throw new BadRequestException( - `Cannot resume event with status ${event.statusCode}, id=${eventId}`, + `Cannot resume event with status ${event.statusCode}, id=${event.id}`, ); const listeners = await this.resumeListeners(event); @@ -114,7 +118,7 @@ export class EventListenersService { const result = await this._invokeListener(listener, data, funName); if (result) { result.data && (data = result.data); - result.callbackName && (funName = result.callbackName); + result.resumeFunName && (funName = result.resumeFunName); } else funName = undefined; statusCode = funName @@ -206,7 +210,7 @@ export class EventListenersService { listener: EventListener, data: T, funName?: string, - ): Promise<{ data: T; callbackName?: string }> { + ): Promise<{ data: T; resumeFunName?: string }> { if (listener.serviceType == ServiceType.CALLGENT) { return this._invokeCallgent(listener, data, funName); } else { @@ -238,7 +242,7 @@ export class EventListenersService { target: { id: string; serviceName: string; funName: string }, data: T, funName?: string, - ): Promise<{ data: T; callbackName?: string }> { + ): Promise<{ data: T; resumeFunName?: string }> { return { data }; } diff --git a/src/users/auth.controller.ts b/src/users/auth.controller.ts index c7af77a..75a0d31 100644 --- a/src/users/auth.controller.ts +++ b/src/users/auth.controller.ts @@ -81,20 +81,20 @@ export class AuthController extends LocalAuthController { @Body() { grant_type, - username, - password, + client_id, + client_secret, }: { grant_type: string; - username: string; - password: string; + client_id: string; + client_secret: string; }, ) { - if (grant_type !== 'credentials') + if (grant_type !== 'client_credentials') throw new BadRequestException('Unsupported grant type ' + grant_type); - const user = this.configService.get('EMAIL_SPARKPOST_RELAY_CLIENT_ID'); + const cid = this.configService.get('EMAIL_SPARKPOST_RELAY_CLIENT_ID'); const pwd = this.configService.get('EMAIL_SPARKPOST_RELAY_CLIENT_SECRET'); - if (user !== username || pwd !== password) + if (cid !== client_id || pwd !== client_secret) throw new UnauthorizedException('Invalid credentials'); const expires_in = parseInt( @@ -102,7 +102,7 @@ export class AuthController extends LocalAuthController { ); return { access_token: this.jwtService.sign({ - sub: user, + sub: cid, iss: 'sparkpost-relay', aud: 'sparkpost-relay', }), From 5b7a7240643919beb069c93bef3adcd3b8e93f37 Mon Sep 17 00:00:00 2001 From: dev-callgent Date: Wed, 4 Sep 2024 12:14:06 +0800 Subject: [PATCH 055/183] refactor: status code Signed-off-by: dev-callgent --- .../20240904040336_refactor_status_code/migration.sql | 5 +++++ prisma/schema.prisma | 9 +++++---- .../adaptors/builtin/restapi/restapi.controller.ts | 3 ++- src/event-listeners/event-object.ts | 2 +- src/event-stores/event-stores.service.ts | 4 ++-- src/infra/logging/pino-pretty-transport.ts | 2 +- src/users/users.service.ts | 3 +-- 7 files changed, 17 insertions(+), 11 deletions(-) create mode 100644 prisma/migrations/20240904040336_refactor_status_code/migration.sql diff --git a/prisma/migrations/20240904040336_refactor_status_code/migration.sql b/prisma/migrations/20240904040336_refactor_status_code/migration.sql new file mode 100644 index 0000000..345bfb4 --- /dev/null +++ b/prisma/migrations/20240904040336_refactor_status_code/migration.sql @@ -0,0 +1,5 @@ +-- AlterTable +ALTER TABLE "EventStore" ALTER COLUMN "statusCode" SET DEFAULT 1; + +-- AlterTable +ALTER TABLE "PersistedAsync" ALTER COLUMN "statusCode" SET DEFAULT 1; diff --git a/prisma/schema.prisma b/prisma/schema.prisma index a9bb899..425e3c7 100644 --- a/prisma/schema.prisma +++ b/prisma/schema.prisma @@ -234,7 +234,7 @@ model Task { // add to migration.sql tenantPk Int @default(dbgenerated("(current_setting('tenancy.tenantPk')::int)")) - statusCode Int @default(-1) /// @description Task statusCode, -1: pending, 0: done, <-1: failed + statusCode Int @default(1) /// @description Task statusCode, 1: pending, 0: done, <0: failed name String? @db.VarChar(64) /// @description task name brief String? @db.VarChar(255) /// @description task brief or description content Json? /// @description optional task content @@ -350,6 +350,7 @@ model Endpoint { /// @DtoUpdateApiResponse /// @DtoPlainApiResponse /// @CustomValidator(EntityIdExists, 'callgent', 'id', ../../infra/repo/validators/entity-exists.validator) + /// @DtoRelationIncludeId callgentId String @db.VarChar(36) /// @description callgent owning the endpoint callgent Callgent @relation(fields: [callgentId], references: [id]) @@ -431,7 +432,7 @@ model PersistedAsync { /// @DtoEntityHidden pk BigInt @id @default(autoincrement()) - statusCode Int @default(-1) /// @description statusCode, -1: pending, 1: sent, 0: done, <-1: failed + statusCode Int @default(1) /// @description statusCode, 1: pending, 2: sent, 0: done, <0: failed service String @db.VarChar(127) /// @description callback service name method String @db.VarChar(127) /// @description callback method name @@ -515,8 +516,8 @@ model EventStore { data Json? @db.Json context Json? @db.Json - /// @description statusCode, -1: processing, 0: done, 1: pending: waiting for external event trigger to to resume calling current-listener.funName, >1: error - statusCode Int @default(-1) + /// @description statusCode, 1: processing, 0: done, 2: pending: waiting for external event trigger to to resume calling current-listener.funName, <0: error + statusCode Int @default(1) message String? @db.VarChar(255) stopPropagation Boolean defaultPrevented Boolean diff --git a/src/endpoints/adaptors/builtin/restapi/restapi.controller.ts b/src/endpoints/adaptors/builtin/restapi/restapi.controller.ts index 18ad655..6bda713 100644 --- a/src/endpoints/adaptors/builtin/restapi/restapi.controller.ts +++ b/src/endpoints/adaptors/builtin/restapi/restapi.controller.ts @@ -102,7 +102,8 @@ export class RestApiController { parseInt(timeout) || 0, // sync timeout ); // FIXME data - if (statusCode < 400) return { data, statusCode, message }; + if (0 <= statusCode && statusCode < 400) + return { data, statusCode, message }; throw new HttpException(message, statusCode); } diff --git a/src/event-listeners/event-object.ts b/src/event-listeners/event-object.ts index c6b738c..bc7a6fd 100644 --- a/src/event-listeners/event-object.ts +++ b/src/event-listeners/event-object.ts @@ -16,7 +16,7 @@ export class EventObject { this.id = Utils.uuid(); } public readonly id: string; - public statusCode = -1; // for response only + public statusCode = 1; // for response only public readonly context: { [key: string]: any } = {}; public message: string; public stopPropagation = false; diff --git a/src/event-stores/event-stores.service.ts b/src/event-stores/event-stores.service.ts index 79441c0..4a1e3b5 100644 --- a/src/event-stores/event-stores.service.ts +++ b/src/event-stores/event-stores.service.ts @@ -39,10 +39,10 @@ export class EventStoresService { event: EventObject, funName: string, listenerId: string, - status: number, + statusCode: number, ) { const prisma = this.txHost.tx as PrismaClient; - event.statusCode = status; + event.statusCode = statusCode; const data: Prisma.EventStoreCreateInput = { ...event, funName, diff --git a/src/infra/logging/pino-pretty-transport.ts b/src/infra/logging/pino-pretty-transport.ts index 6062ca9..b98da0c 100644 --- a/src/infra/logging/pino-pretty-transport.ts +++ b/src/infra/logging/pino-pretty-transport.ts @@ -17,7 +17,7 @@ export default (opts: PrettyOptions) => { } let resInfo: any = ''; const statusCode = (res as any)?.statusCode; - if (err && (!statusCode || statusCode >= 500)) { + if (err && (!statusCode || statusCode > 499)) { resInfo = `\n\x1b[31m[ERROR ${ statusCode || '' }]\x1b[0m ${JSON.stringify( diff --git a/src/users/users.service.ts b/src/users/users.service.ts index fe80e89..bd4b9a9 100644 --- a/src/users/users.service.ts +++ b/src/users/users.service.ts @@ -32,10 +32,9 @@ export class UsersService { private readonly authTokensService: AuthTokensService, private readonly eventEmitter: EventEmitter2, ) {} - protected readonly defSelect: Prisma.CallgentSelect = { + protected readonly defSelect: Prisma.UserSelect = { pk: false, tenantPk: false, - createdBy: false, deletedAt: false, }; From b5ba05e2ec48df30caea86151e5a7e4f81da1323 Mon Sep 17 00:00:00 2001 From: dev-callgent Date: Wed, 4 Sep 2024 12:15:56 +0800 Subject: [PATCH 056/183] feat: sparkpost relay-webhook integration Signed-off-by: dev-callgent --- prisma/seed-test.ts | 2 +- src/agents/agents.service.ts | 6 +- .../callgent-tree.controller.ts | 8 ++- src/callgents/callgents.service.ts | 2 +- src/emails/emails.service.ts | 33 ++++++++--- .../listeners/request-relay-event.listener.ts | 11 ++-- src/emails/templates/relay-sep-invoke.dot | 59 +++++++++++++++++++ src/emails/templates/validation-email.dot | 3 +- .../adaptors/builtin/email/email.adaptor.ts | 16 +++-- .../builtin/restapi/restapi.adaptor.ts | 10 ++-- src/endpoints/endpoints.service.ts | 12 +++- .../event-listeners.service.ts | 49 +++++++++------ 12 files changed, 162 insertions(+), 49 deletions(-) create mode 100644 src/emails/templates/relay-sep-invoke.dot diff --git a/prisma/seed-test.ts b/prisma/seed-test.ts index fad40b5..ab7e676 100644 --- a/prisma/seed-test.ts +++ b/prisma/seed-test.ts @@ -170,7 +170,7 @@ function initTestData() { addLlmCache( 8, 'map2Function', - 'given below service APIs:\nservice test-callgent {\n "API: GET /positions": {"endpoint": "GET /positions", "summary":"listPositions: List all job positions", "description":"Retrieve a list of all available job positions.", "signature":{"responses":{"200":{"description":"A list of job positions","content":{"application/json":{"schema":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","description":"Unique identifier for the job position"},"title":{"type":"string","description":"Title of the job position"},"description":{"type":"string","description":"Description of the job position"},"location":{"type":"string","description":"Location of the job position"},"requirements":{"type":"array","items":{"type":"string"},"description":"List of requirements for the job position"},"createdAt":{"type":"string","format":"date-time","description":"Timestamp when the job position was created"},"updatedAt":{"type":"string","format":"date-time","description":"Timestamp when the job position was last updated"}}}}}}},"500":{"description":"Internal Server Error"}}} },\n}\n\nPlease choose one API to fulfill below request:\n{\n"requesting endpoint": "GET /positions",\n"request from": "restAPI",\n"request_object": {"url":"/positions","method":"GET","headers":{"user-agent":"Apifox/1.0.0 (https://apifox.com)","accept":"*/*","host":"127.0.0.1:3000","accept-encoding":"gzip, deflate, br","connection":"keep-alive"},"query":{}},\n}\nand code for request_object to chosen function args mapping. if any data missing/unclear/ambiguous from request_object to invocation args, please ask question to the caller in below json.question field.\n\noutput a single-line json object:\n{ "endpoint": "the chosen API endpoint to be invoked", "args":"request params/body/headers/..., with same structure as the signature JSON object(no more args than it), or null if no args needed", "mapping": "if the the request_object is structured (or null if unstructured), generate the js function (request_object)=>{...;return API_signature_args;}, full implementation to return the **real** args from request_object to invoke the API. don\'t use data not exist or ambiguous in request", "question": "question to ask the caller if anything not sure or missing for request to args mapping, *no* guess or assumption of the mapping. null if the mapping is crystal clear." }"}', + 'given below service APIs:\nservice test-callgent {\n "API: GET /positions": {"endpoint": "GET /positions", "summary":"listPositions: List all job positions", "description":"Retrieve a list of all available job positions.", "signature":{"responses":{"200":{"description":"A list of job positions","content":{"application/json":{"schema":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","description":"Unique identifier for the job position"},"title":{"type":"string","description":"Title of the job position"},"description":{"type":"string","description":"Description of the job position"},"location":{"type":"string","description":"Location of the job position"},"requirements":{"type":"array","items":{"type":"string"},"description":"List of requirements for the job position"},"createdAt":{"type":"string","format":"date-time","description":"Timestamp when the job position was created"},"updatedAt":{"type":"string","format":"date-time","description":"Timestamp when the job position was last updated"}}}}}}},"500":{"description":"Internal Server Error"}}} },\n}\n\nPlease choose one API to fulfill below request:\n{\n"requesting endpoint": "GET /positions",\n"request from": "restAPI",\n"request_object": {"url":"/positions","method":"GET","headers":{"accept":"*/*","accept-encoding":"gzip, deflate, br","cache-control":"no-cache","connection":"keep-alive","host":"127.0.0.1:3000","user-agent":"Apifox/1.0.0 (https://apifox.com)"},"query":{}},\n}\nand code for request_object to chosen function args mapping. if any data missing/unclear/ambiguous from request_object to invocation args, please ask question to the caller in below json.question field.\n\noutput a single-line json object:\n{ "endpoint": "the chosen API endpoint to be invoked", "args":"request params/body/headers/..., with same structure as the signature JSON object(no more args than it), or null if no args needed", "mapping": "if the the request_object is structured (or null if unstructured), generate the js function (request_object)=>{...;return API_signature_args;}, full implementation to return the **real** args from request_object to invoke the API. don\'t use data not exist or ambiguous in request", "question": "question to ask the caller if anything not sure or missing for request to args mapping, *no* guess or assumption of the mapping. null if the mapping is crystal clear." }"}', '{ "endpoint": "GET /positions", "args": null, "mapping": "(request_object)=>{return null;}", "question": null }', ), ]; diff --git a/src/agents/agents.service.ts b/src/agents/agents.service.ts index a5a7816..bb5a29c 100644 --- a/src/agents/agents.service.ts +++ b/src/agents/agents.service.ts @@ -65,6 +65,10 @@ export class AgentsService { }, { endpoint: '', args: '', mapping: '', question: '' }, ); // TODO check `funName` exists in callgentFunctions, validating `mapping` + if (!mapped) + throw new Error( + 'LLM service not available: map2Function for event#' + id, + ); reqEvent.context.map2Function = mapped; if (mapped.question) { @@ -85,7 +89,7 @@ export class AgentsService { // direct return, no persistent async return this.map2FunctionProgressive(prEvent, reqEvent); - if (statusCode == 1) + if (statusCode == 2) // pending return { data: reqEvent, resumeFunName: 'map2FunctionProgressive' }; throw new HttpException(prEvent.message, statusCode); diff --git a/src/bff/bff-callgent-tree/callgent-tree.controller.ts b/src/bff/bff-callgent-tree/callgent-tree.controller.ts index 8a8e4c1..9aced48 100644 --- a/src/bff/bff-callgent-tree/callgent-tree.controller.ts +++ b/src/bff/bff-callgent-tree/callgent-tree.controller.ts @@ -11,9 +11,9 @@ import { UseGuards, } from '@nestjs/common'; import { ApiTags } from '@nestjs/swagger'; -import { Callgent } from '@prisma/client'; import { CallgentFunctionsService } from '../../callgent-functions/callgent-functions.service'; import { CallgentsService } from '../../callgents/callgents.service'; +import { CallgentDto } from '../../callgents/dto/callgent.dto'; import { CreateCallgentDto } from '../../callgents/dto/create-callgent.dto'; import { EndpointsService } from '../../endpoints/endpoints.service'; import { JwtGuard } from '../../infra/auth/jwt/jwt.guard'; @@ -49,14 +49,16 @@ export class CallgentTreeController { */ @Post('callgent-endpoints') async create(@Req() req, @Body() dto: CreateCallgentDto) { - let callgent = await this.callgentsService.getByName(dto.name); + let callgent = (await this.callgentsService.getByName( + dto.name, + )) as CallgentDto; if (!callgent) callgent = await this.callgentsService.create(dto, req.user.sub); const data = await this._callgentTree(callgent); return { data }; } - private async _callgentTree(callgent: Callgent) { + private async _callgentTree(callgent: CallgentDto) { const endpoints = await this.endpointsService.findAll({ select: { callgentId: false }, where: { callgentId: callgent.id }, diff --git a/src/callgents/callgents.service.ts b/src/callgents/callgents.service.ts index 760f1e9..45507ac 100644 --- a/src/callgents/callgents.service.ts +++ b/src/callgents/callgents.service.ts @@ -146,7 +146,7 @@ export class CallgentsService { } @Transactional() - getByName(name: string, select?: Prisma.CallgentSelect) { + async getByName(name: string, select?: Prisma.CallgentSelect) { const tenantPk = this.tenancyService.getTenantId(); const prisma = this.txHost.tx as PrismaClient; return selectHelper( diff --git a/src/emails/emails.service.ts b/src/emails/emails.service.ts index 21dbef6..6d78552 100644 --- a/src/emails/emails.service.ts +++ b/src/emails/emails.service.ts @@ -21,15 +21,28 @@ export class EmailsService implements OnModuleInit { await this.emailTemplates.loadTemplates(path.join(__dirname, 'templates')); } + /** + * @param template - template file name + */ async sendTemplateEmail( - to: { name: string; email: string }[], + to: + | string + | { name: string; email: string } + | (string | { name: string; email: string })[], template: string, context: { [key: string]: any } = {}, - sender?: { name: string; email: string }, + sender?: string | { name: string; email: string }, ): Promise { + to = this._formalizeEmails(to) as { name: string; email: string }[]; + sender = this._formalizeEmails(sender)[0] as { + name: string; + email: string; + }; + const content = this.emailTemplates.render(template, { ...context, to, + sender, configs: this.configService, }); const subject = this._extractSubject(content); @@ -95,9 +108,11 @@ export class EmailsService implements OnModuleInit { | (string | { name: string; email: string })[], ) { if (!Array.isArray(emails)) emails = [emails]; - return emails.map((d) => - (d as any).email ? (d as { email: string }) : { email: d as string }, - ); + return emails.map((d) => { + const email = (d as any).email || d; + const name = (d as any).name || email.split('@')[0]; + return { name, email }; + }); } // private _getTemplateId(template: string) { @@ -122,13 +137,15 @@ export class EmailsService implements OnModuleInit { */ @Transactional() handleRelayEmail(email: RelayEmail): void { - let mailTo = email?.rcpt_to?.toLowerCase(); + const mailTo = email?.rcpt_to; const mailHost = this.configService.get('EMAIL_RELAY_HOST'); if (!mailTo?.endsWith(mailHost)) return this.logger.error('Invalid relay host, ignored: %j', email); - mailTo = mailTo.substring(0, mailTo.indexOf('@')); - const [relayKey, relayId] = mailTo.split('+'); + const relayKey = mailTo.substring(0, mailTo.indexOf('+')); + const relayId = email.content.subject.substring( + email.content.subject.lastIndexOf('#') + 1, + ); switch (relayKey) { case 'request': case 'callgent': diff --git a/src/emails/listeners/request-relay-event.listener.ts b/src/emails/listeners/request-relay-event.listener.ts index 48761af..0896c96 100644 --- a/src/emails/listeners/request-relay-event.listener.ts +++ b/src/emails/listeners/request-relay-event.listener.ts @@ -1,4 +1,4 @@ -import { Transactional } from '@nestjs-cls/transactional'; +import { Propagation, Transactional } from '@nestjs-cls/transactional'; import { Injectable, Logger } from '@nestjs/common'; import { OnEvent } from '@nestjs/event-emitter'; import { JsonObject } from '@prisma/client/runtime/library'; @@ -11,7 +11,7 @@ export class RequestRelayListener { private readonly logger = new Logger(RequestRelayListener.name); constructor(private readonly eventListenersService: EventListenersService) {} - @Transactional() + @Transactional(Propagation.RequiresNew) @OnEvent(EmailRelayEvent.eventPrefix + EmailRelayKey.request) async handleEvent(event: EmailRelayEvent) { this.logger.debug('Handling event: %j', event); @@ -21,13 +21,16 @@ export class RequestRelayListener { const resp = email as object; const reqEvent = await this.eventListenersService.loadEvent(reqEventId); if (!reqEvent || reqEvent.eventType != 'CLIENT_REQUEST') - return this.logger.error('Event not found: %j', event); + return this.logger.error( + 'CLIENT_REQUEST event not found: %s', + reqEventId, + ); reqEvent.data ? ((reqEvent.data as JsonObject).resp = resp) : (reqEvent.data = { resp }); // resuming event chain - this.eventListenersService.resume(reqEvent); + await this.eventListenersService.resume(reqEvent); } } diff --git a/src/emails/templates/relay-sep-invoke.dot b/src/emails/templates/relay-sep-invoke.dot new file mode 100644 index 0000000..ebc788a --- /dev/null +++ b/src/emails/templates/relay-sep-invoke.dot @@ -0,0 +1,59 @@ + + + + + +[Callgent] Function calling: '{{=it.fun.name}}' from Callgent {{=it.sep.callgent.name}}. #{{=it.relayId}} + + + +

Hello {{=it.to[0].name }}!

+ +

Somebody is calling: '{{=it.fun.name}}' from Callgent {{=it.sep.callgent.name}}. Below is the detailed request information:

+
+ +
+ Function Calling +
+ + {{=it.fun.name}} +
+ {{ if (it.fun.summary) { }} +
+ + {{=it.fun.summary}} +
+ {{ } }} + {{ if (it.fun.description) { }} +
+ + {{=it.fun.description}} +
+ {{ } }} +
+ +{{ if (it.args && it.args.length) { }} +
+ Function Arguments +
+ + {{=it.fun.name}} +
+ {{ if (it.fun.summary) { }} +
+ + {{=it.fun.summary}} +
+ {{ } }} + {{ if (it.fun.description) { }} +
+ + {{=it.fun.description}} +
+ {{ } }} +
+{{ } }} + + + + diff --git a/src/emails/templates/validation-email.dot b/src/emails/templates/validation-email.dot index 740cdb8..f3d995a 100644 --- a/src/emails/templates/validation-email.dot +++ b/src/emails/templates/validation-email.dot @@ -3,9 +3,10 @@ {{=it.resetPwd ? 'Reset password instructions' : 'Verify your email address' }} + -

Welcome {{=it.to[0].name}}!

+

Welcome {{=it.to[0].name }}!

{{=it.resetPwd ? 'Someone has requested a link to change your password. You can do this' : 'You can confirm your account email' }} through the link below:

diff --git a/src/endpoints/adaptors/builtin/email/email.adaptor.ts b/src/endpoints/adaptors/builtin/email/email.adaptor.ts index 52802da..b9078cf 100644 --- a/src/endpoints/adaptors/builtin/email/email.adaptor.ts +++ b/src/endpoints/adaptors/builtin/email/email.adaptor.ts @@ -5,11 +5,12 @@ import { EmailRelayKey, EmailsService, } from '../../../../emails/emails.service'; +import { EventObject } from '../../../../event-listeners/event-object'; import { EndpointDto } from '../../../dto/endpoint.dto'; +import { Endpoint } from '../../../entities/endpoint.entity'; import { ClientRequestEvent } from '../../../events/client-request.event'; import { EndpointAdaptor, EndpointConfig } from '../../endpoint-adaptor.base'; import { EndpointAdaptorName } from '../../endpoint-adaptor.decorator'; -import { EventObject } from '../../../../event-listeners/event-object'; @EndpointAdaptorName('Email', 'both') export class EmailAdaptor extends EndpointAdaptor { @@ -70,7 +71,7 @@ export class EmailAdaptor extends EndpointAdaptor { async invoke( fun: CallgentFunctionDto, args: object, - sep: EndpointDto, + sep: Endpoint, reqEvent: T, ) { const emailFrom = this.emailsService.getRelayAddress( @@ -78,12 +79,15 @@ export class EmailAdaptor extends EndpointAdaptor { EmailRelayKey.request, ); const { host: emailTo } = sep; - const subject = `Please Respond to call: '${fun.name}', from Callgent ${}`; - const body = 'xxx'; return this.emailsService - .sendEmail(emailTo, subject, body, emailFrom) + .sendTemplateEmail( + emailTo, + 'relay-sep-invoke', + { relayId: reqEvent.id, fun, sep, args }, + emailFrom, + ) .then((res) => ({ - statusCode: res ? 1 : 500, // pending or error + statusCode: res ? 2 : 500, // pending or error data: reqEvent, resumeFunName: 'postInvokeSEP', message: res diff --git a/src/endpoints/adaptors/builtin/restapi/restapi.adaptor.ts b/src/endpoints/adaptors/builtin/restapi/restapi.adaptor.ts index 2f316c1..61661d7 100644 --- a/src/endpoints/adaptors/builtin/restapi/restapi.adaptor.ts +++ b/src/endpoints/adaptors/builtin/restapi/restapi.adaptor.ts @@ -192,10 +192,12 @@ export class RestAPIAdaptor extends EndpointAdaptor { const type = request.isFormSubmission ? 'form' : 'body'; // filter all x-callgent- args - const headers = { ...rawHeaders }; - Object.keys(headers).forEach((key) => { - if (key.startsWith('x-callgent-')) delete headers[key]; - }); + const headers = {}; + Object.keys(rawHeaders) + .sort() + .forEach((key) => { + if (!key.startsWith('x-callgent-')) headers[key] = rawHeaders[key]; + }); // FIXME change authorization to x-callgent-authorization return { diff --git a/src/endpoints/endpoints.service.ts b/src/endpoints/endpoints.service.ts index 13db0ff..233f9d1 100644 --- a/src/endpoints/endpoints.service.ts +++ b/src/endpoints/endpoints.service.ts @@ -314,7 +314,17 @@ export class EndpointsService { throw new Error('Failed to invoke, No mapping function found'); const func = functions[0] as CallgentFunctionDto; - const sep = await this.findOne(func.endpointId, {}); + const sep = await this.findOne(func.endpointId, { + id: true, + name: true, + type: true, + adaptorKey: true, + priority: true, + host: true, + content: true, + callgentId: true, + callgent: { select: { id: true, name: true } }, + }); const adapter = sep && this.getAdaptor(sep.adaptorKey, EndpointType.SERVER); if (!adapter) throw new Error('Failed to invoke, No SEP adaptor found'); diff --git a/src/event-listeners/event-listeners.service.ts b/src/event-listeners/event-listeners.service.ts index 16a98cd..e760c56 100644 --- a/src/event-listeners/event-listeners.service.ts +++ b/src/event-listeners/event-listeners.service.ts @@ -1,4 +1,8 @@ -import { TransactionHost, Transactional } from '@nestjs-cls/transactional'; +import { + Propagation, + TransactionHost, + Transactional, +} from '@nestjs-cls/transactional'; import { TransactionalAdapterPrisma } from '@nestjs-cls/transactional-adapter-prisma'; import { BadRequestException, @@ -30,7 +34,7 @@ export class EventListenersService { ) {} /** - * @returns: { data: event, message?, statusCode?: -1-processing, 0-done, 1-pending, >1-error} + * @returns: { data: event, message?, statusCode?: 1-processing, 0-done, 2-pending, (<0 || >399)-error} */ @Transactional() async emit( @@ -40,6 +44,7 @@ export class EventListenersService { // load persist listeners const listeners = await this.loadListeners(data); + // timeout response will cause current tx close, so Propagation.RequiresNew! const result = this._invokeListeners(listeners, data).then((result) => this._invokeCallback(result, true), ); @@ -47,14 +52,11 @@ export class EventListenersService { return timeout > 0 ? Promise.race([ result, - // FIXME: timeout response will cause tx close, fails listeners execution! - Utils.sleep(timeout).then(() => { - return { - data: { ...data, rawReq: undefined }, - statusCode: data.statusCode, - message: `Sync invocation timeout(${timeout}ms), will respond via callback`, - }; - }), + Utils.sleep(timeout).then(() => ({ + data: { ...data, rawReq: undefined }, + statusCode: data.statusCode, + message: `Sync invocation timeout(${timeout}ms), will respond via callback`, + })), ]) : result; } @@ -71,8 +73,8 @@ export class EventListenersService { if (!event || typeof event === 'string') throw new NotFoundException('Event not found, id=' + event); - // -1: processing, 0: done, 1: pending, >1: error - if (event.statusCode <= 0) + // 1: processing, 0: done, 2: pending, <0: error + if (event.statusCode != 2) throw new BadRequestException( `Cannot resume event with status ${event.statusCode}, id=${event.id}`, ); @@ -105,13 +107,15 @@ export class EventListenersService { // URL callback } - private async _invokeListeners( + /** timeout response will cause current tx close, so Propagation.RequiresNew! */ + @Transactional(Propagation.RequiresNew) + protected async _invokeListeners( listeners: EventListener[], data: T, funName?: string, ): Promise<{ data: T; statusCode?: number; message?: string }> { // invoke listeners, supports persisted-async - let statusCode = -1; + let statusCode = 1; for (let idx = 0; idx < listeners.length; ) { const listener = listeners[idx++]; try { @@ -122,20 +126,24 @@ export class EventListenersService { } else funName = undefined; statusCode = funName - ? 1 // pending + ? 2 // pending : data.stopPropagation || idx >= listeners.length ? 0 // done - : -1; // processing + : 1; // processing if (funName || data.stopPropagation) break; } catch (e) { - statusCode = e.status || 2; // error + statusCode = e.status || -1; // error const message = (data.message = `[ERROR] ${e.name}: ${e.message}`); e.status < 500 || this.logger.error(e); return { data: data, statusCode, message }; } finally { - // if statusCode > 0, stay in current listener const nextListener = - statusCode > 0 ? listener : statusCode == 0 ? null : listeners[idx]; + statusCode == 1 + ? listeners[idx] // processing: next + : statusCode == 0 || (statusCode > 2 && statusCode < 399) + ? null // success: null + : listener; // error/pending: current + await this.eventStoresService.upsertEvent( data, funName, @@ -206,6 +214,7 @@ export class EventListenersService { return listeners.filter((listener) => !listener.deletedAt); } + @Transactional() protected async _invokeListener( listener: EventListener, data: T, @@ -219,6 +228,7 @@ export class EventListenersService { } /** service.func_signature(event): Promise<{ data: T; funName?: string }> */ + @Transactional() protected async _invokeService( target: { id: string; serviceName: string; funName: string }, data: EventObject, @@ -238,6 +248,7 @@ export class EventListenersService { return fun.apply(service, [data]); } + @Transactional() protected async _invokeCallgent( target: { id: string; serviceName: string; funName: string }, data: T, From 7ec3a20f0c9f35a23e318785386d854de8773a51 Mon Sep 17 00:00:00 2001 From: dev-callgent Date: Thu, 5 Sep 2024 09:55:31 +0800 Subject: [PATCH 057/183] refactor: callgent-function.raw-json Signed-off-by: dev-callgent --- .../migration.sql | 13 +++++++ .../migration.sql | 33 ++++++++++++++++ prisma/schema.prisma | 4 +- prisma/seed-test.ts | 2 +- prisma/seed.ts | 2 +- .../callgent-tree.controller.ts | 7 +++- .../callgent-functions.service.ts | 11 +++++- src/emails/templates/relay-sep-invoke.dot | 38 ++++++++----------- .../adaptors/builtin/email/email.adaptor.ts | 10 ++++- .../adaptors/endpoint-adaptor.base.ts | 32 ++++++++++++---- src/endpoints/endpoints.service.ts | 5 ++- src/users/users.service.ts | 2 +- 12 files changed, 119 insertions(+), 40 deletions(-) create mode 100644 prisma/migrations/20240904065010_callgent_function_responses/migration.sql create mode 100644 prisma/migrations/20240905015133_callgent_function/migration.sql diff --git a/prisma/migrations/20240904065010_callgent_function_responses/migration.sql b/prisma/migrations/20240904065010_callgent_function_responses/migration.sql new file mode 100644 index 0000000..4d9194e --- /dev/null +++ b/prisma/migrations/20240904065010_callgent_function_responses/migration.sql @@ -0,0 +1,13 @@ +/* + Warnings: + + - You are about to drop the column `signature` on the `CallgentFunction` table. All the data in the column will be lost. + +*/ +-- AlterTable +ALTER TABLE "CallgentFunction" DROP COLUMN "signature", +ADD COLUMN "params" JSON, +ADD COLUMN "responses" JSON; + +-- AlterTable +ALTER TABLE "Task" ALTER COLUMN "statusCode" SET DEFAULT 1; diff --git a/prisma/migrations/20240905015133_callgent_function/migration.sql b/prisma/migrations/20240905015133_callgent_function/migration.sql new file mode 100644 index 0000000..69b054c --- /dev/null +++ b/prisma/migrations/20240905015133_callgent_function/migration.sql @@ -0,0 +1,33 @@ +/* + Warnings: + + - Added the required column `rawJson` to the `CallgentFunction` table without a default value. This is not possible if the table is not empty. + +*/ +-- AlterTable +ALTER TABLE "Callgent" ALTER COLUMN "tenantPk" SET DEFAULT (current_setting('tenancy.tenantPk')::int); + +-- AlterTable +ALTER TABLE "CallgentFunction" ADD COLUMN "rawJson" JSON NOT NULL, +ALTER COLUMN "tenantPk" SET DEFAULT (current_setting('tenancy.tenantPk')::int); + +-- AlterTable +ALTER TABLE "Endpoint" ALTER COLUMN "tenantPk" SET DEFAULT (current_setting('tenancy.tenantPk')::int); + +-- AlterTable +ALTER TABLE "EndpointAuth" ALTER COLUMN "tenantPk" SET DEFAULT (current_setting('tenancy.tenantPk')::int); + +-- AlterTable +ALTER TABLE "EventListener" ALTER COLUMN "tenantPk" SET DEFAULT (current_setting('tenancy.tenantPk')::int); + +-- AlterTable +ALTER TABLE "Task" ALTER COLUMN "tenantPk" SET DEFAULT (current_setting('tenancy.tenantPk')::int); + +-- AlterTable +ALTER TABLE "TaskAction" ALTER COLUMN "tenantPk" SET DEFAULT (current_setting('tenancy.tenantPk')::int); + +-- AlterTable +ALTER TABLE "User" ALTER COLUMN "tenantPk" SET DEFAULT (current_setting('tenancy.tenantPk')::int); + +-- AlterTable +ALTER TABLE "UserIdentity" ALTER COLUMN "tenantPk" SET DEFAULT (current_setting('tenancy.tenantPk')::int); diff --git a/prisma/schema.prisma b/prisma/schema.prisma index 425e3c7..5fc0446 100644 --- a/prisma/schema.prisma +++ b/prisma/schema.prisma @@ -197,7 +197,9 @@ model CallgentFunction { method String @db.VarChar(15) /// @description openAPI method summary String @default("") @db.VarChar(511) description String @default("") @db.VarChar(1023) - signature Json @db.Json /// @description declaration of API params and responses + params Json? @db.Json /// @description declaration of API params + responses Json? @db.Json /// @description declaration of API responses + rawJson Json @db.Json // @DtoReadOnly /// @CustomValidator(EntityIdExists, 'callgent', 'id', ../../infra/repo/validators/entity-exists.validator) diff --git a/prisma/seed-test.ts b/prisma/seed-test.ts index ab7e676..c716f5c 100644 --- a/prisma/seed-test.ts +++ b/prisma/seed-test.ts @@ -170,7 +170,7 @@ function initTestData() { addLlmCache( 8, 'map2Function', - 'given below service APIs:\nservice test-callgent {\n "API: GET /positions": {"endpoint": "GET /positions", "summary":"listPositions: List all job positions", "description":"Retrieve a list of all available job positions.", "signature":{"responses":{"200":{"description":"A list of job positions","content":{"application/json":{"schema":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","description":"Unique identifier for the job position"},"title":{"type":"string","description":"Title of the job position"},"description":{"type":"string","description":"Description of the job position"},"location":{"type":"string","description":"Location of the job position"},"requirements":{"type":"array","items":{"type":"string"},"description":"List of requirements for the job position"},"createdAt":{"type":"string","format":"date-time","description":"Timestamp when the job position was created"},"updatedAt":{"type":"string","format":"date-time","description":"Timestamp when the job position was last updated"}}}}}}},"500":{"description":"Internal Server Error"}}} },\n}\n\nPlease choose one API to fulfill below request:\n{\n"requesting endpoint": "GET /positions",\n"request from": "restAPI",\n"request_object": {"url":"/positions","method":"GET","headers":{"accept":"*/*","accept-encoding":"gzip, deflate, br","cache-control":"no-cache","connection":"keep-alive","host":"127.0.0.1:3000","user-agent":"Apifox/1.0.0 (https://apifox.com)"},"query":{}},\n}\nand code for request_object to chosen function args mapping. if any data missing/unclear/ambiguous from request_object to invocation args, please ask question to the caller in below json.question field.\n\noutput a single-line json object:\n{ "endpoint": "the chosen API endpoint to be invoked", "args":"request params/body/headers/..., with same structure as the signature JSON object(no more args than it), or null if no args needed", "mapping": "if the the request_object is structured (or null if unstructured), generate the js function (request_object)=>{...;return API_signature_args;}, full implementation to return the **real** args from request_object to invoke the API. don\'t use data not exist or ambiguous in request", "question": "question to ask the caller if anything not sure or missing for request to args mapping, *no* guess or assumption of the mapping. null if the mapping is crystal clear." }"}', + 'given below service APIs:\nservice test-callgent {\n "API: GET /positions": {"endpoint": "GET /positions", "summary":"listPositions: List all job positions", "description":"Retrieve a list of all available job positions.", "params":{}, "responses":{"200":{"description":"A list of job positions","content":{"application/json":{"schema":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","description":"Unique identifier for the job position"},"title":{"type":"string","description":"Title of the job position"},"description":{"type":"string","description":"Description of the job position"},"location":{"type":"string","description":"Location of the job position"},"requirements":{"type":"array","items":{"type":"string"},"description":"List of requirements for the job position"},"createdAt":{"type":"string","format":"date-time","description":"Timestamp when the job position was created"},"updatedAt":{"type":"string","format":"date-time","description":"Timestamp when the job position was last updated"}}}}}}},"500":{"description":"Internal Server Error"}} },\n}\n\nPlease choose one API to fulfill below request:\n{\n"requesting endpoint": "GET /positions",\n"request from": "restAPI",\n"request_object": {"url":"/positions","method":"GET","headers":{"accept":"*/*","accept-encoding":"gzip, deflate, br","cache-control":"no-cache","connection":"keep-alive","host":"127.0.0.1:3000","user-agent":"Apifox/1.0.0 (https://apifox.com)"},"query":{}},\n}\nand code for request_object to chosen function args mapping. if any data missing/unclear/ambiguous from request_object to invocation args, please ask question to the caller in below json.question field.\n\noutput a single-line json object:\n{ "endpoint": "the chosen API endpoint to be invoked", "args":"request params/body/headers/..., with same structure as the signature JSON object(no more args than it), or null if no args needed", "mapping": "if the the request_object is structured (or null if unstructured), generate the js function (request_object)=>{...;return API_signature_args;}, full implementation to return the **real** args from request_object to invoke the API. don\'t use data not exist or ambiguous in request", "question": "question to ask the caller if anything not sure or missing for request to args mapping, *no* guess or assumption of the mapping. null if the mapping is crystal clear." }"}', '{ "endpoint": "GET /positions", "args": null, "mapping": "(request_object)=>{return null;}", "question": null }', ), ]; diff --git a/prisma/seed.ts b/prisma/seed.ts index 933b679..be89e7e 100644 --- a/prisma/seed.ts +++ b/prisma/seed.ts @@ -146,7 +146,7 @@ please generate the js function with **full implementation and error handling**! name: 'map2Function', prompt: `given below service APIs: service {{=it.callgentName}} {{{~ it.callgentFunctions :fun }} - "API: {{=fun.name}}": {"endpoint": "{{=fun.name}}", "summary":"{{=fun.summary}}", {{=fun.description ? '"description":"'+fun.description+'", ':''}}"signature":{{=JSON.stringify(fun.signature)}} }, + "API: {{=fun.name}}": {"endpoint": "{{=fun.name}}", "summary":"{{=fun.summary}}", {{=fun.description ? '"description":"'+fun.description+'", ':''}}"params":{{=JSON.stringify(fun.params)}}, "responses":{{=JSON.stringify(fun.responses)}} }, {{~}}} Please choose one API to fulfill below request: diff --git a/src/bff/bff-callgent-tree/callgent-tree.controller.ts b/src/bff/bff-callgent-tree/callgent-tree.controller.ts index 9aced48..f8bffb3 100644 --- a/src/bff/bff-callgent-tree/callgent-tree.controller.ts +++ b/src/bff/bff-callgent-tree/callgent-tree.controller.ts @@ -72,7 +72,12 @@ export class CallgentTreeController { CEP.push(ep); } else if (ep.type == 'SERVER') { ep.children = await this.callgentFunctionsService.findMany({ - select: { pk: false, signature: false, callgentId: false }, + select: { + pk: false, + params: false, + responses: false, + callgentId: false, + }, where: { endpointId: ep.id }, }); SEP.push(ep); diff --git a/src/callgent-functions/callgent-functions.service.ts b/src/callgent-functions/callgent-functions.service.ts index 13c6d5b..8022e9e 100644 --- a/src/callgent-functions/callgent-functions.service.ts +++ b/src/callgent-functions/callgent-functions.service.ts @@ -23,7 +23,9 @@ export class CallgentFunctionsService { protected readonly defSelect: Prisma.CallgentFunctionSelect = { pk: false, tenantPk: false, - signature: false, + rawJson: false, + params: false, + responses: false, callgentId: false, createdBy: false, deletedAt: false, @@ -37,7 +39,12 @@ export class CallgentFunctionsService { // TODO if too many functions, use summary first const { data: funcs } = await this.findAll({ - select: { createdAt: false, updatedAt: false, signature: null }, + select: { + createdAt: false, + updatedAt: false, + params: null, + responses: null, + }, where: { callgentId: callgentId, name: funName }, perPage: Number.MAX_SAFE_INTEGER, }); diff --git a/src/emails/templates/relay-sep-invoke.dot b/src/emails/templates/relay-sep-invoke.dot index ebc788a..a0a0d14 100644 --- a/src/emails/templates/relay-sep-invoke.dot +++ b/src/emails/templates/relay-sep-invoke.dot @@ -12,48 +12,40 @@

Somebody is calling: '{{=it.fun.name}}' from Callgent {{=it.sep.callgent.name}}. Below is the detailed request information:


-
- Function Calling +
+ Function Calling:
- + Name: {{=it.fun.name}}
{{ if (it.fun.summary) { }}
- + Summary: {{=it.fun.summary}}
{{ } }} {{ if (it.fun.description) { }}
- + Description: {{=it.fun.description}}
{{ } }} -
+ -{{ if (it.args && it.args.length) { }} -
- Function Arguments +{{ if (it.args) { }} +{{~ Object.keys(it.args) :key}} +
+ Function Arguments:
- + Name: {{=it.fun.name}}
- {{ if (it.fun.summary) { }} -
- - {{=it.fun.summary}} -
- {{ } }} - {{ if (it.fun.description) { }} -
- - {{=it.fun.description}} -
- {{ } }} -
+ {{ } }} +
+
+{{=new Date().toLocaleString('sv-SE') }} diff --git a/src/endpoints/adaptors/builtin/email/email.adaptor.ts b/src/endpoints/adaptors/builtin/email/email.adaptor.ts index b9078cf..8805185 100644 --- a/src/endpoints/adaptors/builtin/email/email.adaptor.ts +++ b/src/endpoints/adaptors/builtin/email/email.adaptor.ts @@ -79,12 +79,14 @@ export class EmailAdaptor extends EndpointAdaptor { EmailRelayKey.request, ); const { host: emailTo } = sep; + + args = this._argsList(args); return this.emailsService .sendTemplateEmail( emailTo, 'relay-sep-invoke', { relayId: reqEvent.id, fun, sep, args }, - emailFrom, + { email: emailFrom, name: 'Callgent Invoker' }, ) .then((res) => ({ statusCode: res ? 2 : 500, // pending or error @@ -95,4 +97,10 @@ export class EmailAdaptor extends EndpointAdaptor { : 'Failed to call service via email', })); } + + private _argsList(args: object): object[] { + const list = []; + if (!args) return list; + const { parameters, requestBody } = args; + } } diff --git a/src/endpoints/adaptors/endpoint-adaptor.base.ts b/src/endpoints/adaptors/endpoint-adaptor.base.ts index 949f3f8..a14efc7 100644 --- a/src/endpoints/adaptors/endpoint-adaptor.base.ts +++ b/src/endpoints/adaptors/endpoint-adaptor.base.ts @@ -41,7 +41,10 @@ export abstract class EndpointAdaptor { /** send response back to client */ abstract callback(resp: any): Promise; - /** parse api to openAPI.JSON format */ + /** + * parse APIs to openAPI.json format + * @see https://github.com/OAI/OpenAPI-Specification/blob/main/schemas/v3.0/schema.json + */ async parseApis({ text, format, @@ -87,7 +90,11 @@ export abstract class EndpointAdaptor { 'Invalid openAPI.JSON, failed to dereference.', ); } - const { paths, components } = json; // TODO: save components onto SEP + const { openapi, paths } = json; // TODO: save components onto SEP + if (!openapi?.startsWith('3.0')) + throw new BadRequestException( + 'Only openAPI `3.0.x` is supported now, openapi=' + openapi, + ); const ps = paths && Object.entries(paths); if (ps?.length) { @@ -97,17 +104,24 @@ export abstract class EndpointAdaptor { const summary = `${ restApi.operationId ? restApi.operationId + ': ' : '' }${restApi.summary}`; - const description = restApi.description; + let description = restApi.description || ''; + if (restApi.tags?.length) + description += ` Tags: ${restApi.tags.join(', ')}`; + const responses = restApi.responses; + const params = { + parameters: restApi.parameters, + requestBody: restApi.requestBody, + }; + // TODO restApi.callbacks - delete restApi.summary; - delete restApi.description; - delete restApi.operationId; ret.apis.push({ path: path.toLowerCase(), method: method.toUpperCase(), summary, description, - signature: restApi, + params, + responses, + rawJson: restApi, }); } } @@ -132,7 +146,9 @@ export class ApiSpec { method: string; summary: string; description: string; - signature: Prisma.JsonObject; + params: Prisma.JsonObject; + responses: Prisma.JsonObject; + rawJson: Prisma.JsonObject; }[]; } diff --git a/src/endpoints/endpoints.service.ts b/src/endpoints/endpoints.service.ts index 233f9d1..40e4bbd 100644 --- a/src/endpoints/endpoints.service.ts +++ b/src/endpoints/endpoints.service.ts @@ -281,7 +281,10 @@ export class EndpointsService { throw new NotFoundException(`Endpoint not found, id=${id}`); } - /** parse APIs to openAPI.json format */ + /** + * parse APIs to openAPI.json format + * @see https://github.com/OAI/OpenAPI-Specification/blob/main/schemas/v3.0/schema.json + */ async parseApis( endpoint: EndpointDto, apiTxt: { text: string; format?: 'json' | 'yaml' | 'text' }, diff --git a/src/users/users.service.ts b/src/users/users.service.ts index bd4b9a9..cdb4a84 100644 --- a/src/users/users.service.ts +++ b/src/users/users.service.ts @@ -271,7 +271,7 @@ export class UsersService { ); // send email return this.emailsService.sendTemplateEmail( - [{ email, name: ui?.name || email }], + [{ email, name: ui?.name || email.split('@')[0] }], 'validation-email', { token, resetPwd, create }, ); From 6775e1f9204230850b2cca887cf0276a136f6eeb Mon Sep 17 00:00:00 2001 From: dev-callgent Date: Thu, 5 Sep 2024 12:04:05 +0800 Subject: [PATCH 058/183] feat: sparkpost relay-webhook integration Signed-off-by: dev-callgent --- package.json | 1 + pnpm-lock.yaml | 8 ++++++ prisma/seed.ts | 2 +- src/emails/templates/relay-sep-invoke.dot | 28 +++++++++++++++---- .../adaptors/builtin/email/email.adaptor.ts | 27 +++++++++++++++--- 5 files changed, 55 insertions(+), 11 deletions(-) diff --git a/package.json b/package.json index 152e21e..0ee5d98 100644 --- a/package.json +++ b/package.json @@ -59,6 +59,7 @@ "fastify": "4.26.2", "fastify-ip": "^1.0.0", "glob": "^10.3.10", + "http-status": "^1.7.4", "jsonrepair": "^3.7.0", "module": "^1.2.5", "ms": "^2.1.3", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 4c708ef..5e9a5ca 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -85,6 +85,9 @@ dependencies: glob: specifier: ^10.3.10 version: 10.3.10 + http-status: + specifier: ^1.7.4 + version: 1.7.4 jsonrepair: specifier: ^3.7.0 version: 3.7.0 @@ -4941,6 +4944,11 @@ packages: - supports-color dev: false + /http-status@1.7.4: + resolution: {integrity: sha512-c2qSwNtTlHVYAhMj9JpGdyo0No/+DiKXCJ9pHtZ2Yf3QmPnBIytKSRT7BuyIiQ7icXLynavGmxUqkOjSrAuMuA==} + engines: {node: '>= 0.4.0'} + dev: false + /https-proxy-agent@5.0.1: resolution: {integrity: sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==} engines: {node: '>= 6'} diff --git a/prisma/seed.ts b/prisma/seed.ts index be89e7e..5d4d48f 100644 --- a/prisma/seed.ts +++ b/prisma/seed.ts @@ -158,7 +158,7 @@ Please choose one API to fulfill below request: and code for request_object to chosen function args mapping. if any data missing/unclear/ambiguous from request_object to invocation args, please ask question to the caller in below json.question field. output a single-line json object: -{ "endpoint": "the chosen API endpoint to be invoked", "args":"request params/body/headers/..., with same structure as the signature JSON object(no more args than it), or null if no args needed", "mapping": "if the the request_object is structured (or null if unstructured), generate the js function (request_object)=>{...;return API_signature_args;}, full implementation to return the **real** args from request_object to invoke the API. don't use data not exist or ambiguous in request", "question": "question to ask the caller if anything not sure or missing for request to args mapping, *no* guess or assumption of the mapping. null if the mapping is crystal clear." }"}`, +{ "endpoint": "the chosen API endpoint to be invoked", "args":"params/body/headers/..., with same structure as the 'params' JSON object(no more args than it) with additional 'value' prop, or null if no args needed", "mapping": "if the the request_object is structured (or null if unstructured), generate the js function (request_object)=>{...;return API_signature_args;}, full implementation to return the **real** args from request_object to invoke the API. don't use data not exist or ambiguous in request", "question": "question to ask the caller if anything not sure or missing for request to args mapping, *no* guess or assumption of the mapping. null if the mapping is crystal clear." }"}`, }, ]; diff --git a/src/emails/templates/relay-sep-invoke.dot b/src/emails/templates/relay-sep-invoke.dot index a0a0d14..bfa7c25 100644 --- a/src/emails/templates/relay-sep-invoke.dot +++ b/src/emails/templates/relay-sep-invoke.dot @@ -4,7 +4,7 @@ [Callgent] Function calling: '{{=it.fun.name}}' from Callgent {{=it.sep.callgent.name}}. #{{=it.relayId}} - +

Hello {{=it.to[0].name }}!

@@ -32,20 +32,36 @@ {{ } }} -{{ if (it.args) { }} -{{~ Object.keys(it.args) :key}} +{{ if (it.args.length) { }}
Function Arguments: + {{~it.args :arg}}
- Name: - {{=it.fun.name}} + {{=arg.name || 'Request Body'}}{{=arg.required ? '*' : ''}}: + {{=arg.description}} +
{{=JSON.stringify(arg.value)}}
+ {{~}}
{{ } }} + +{{ if (it.responses.length) { }} +
+ Possible Responses: + {{~it.responses :resp}} +
+ Response {{=resp.name}}: + {{=resp.description}} +
{{=resp.content ? JSON.stringify(resp.content) : ''}}
+
+ {{~}} +
+{{ } }}

-{{=new Date().toLocaleString('sv-SE') }} + +{{=new Date().toUTCString() }} diff --git a/src/endpoints/adaptors/builtin/email/email.adaptor.ts b/src/endpoints/adaptors/builtin/email/email.adaptor.ts index 8805185..664a381 100644 --- a/src/endpoints/adaptors/builtin/email/email.adaptor.ts +++ b/src/endpoints/adaptors/builtin/email/email.adaptor.ts @@ -11,6 +11,7 @@ import { Endpoint } from '../../../entities/endpoint.entity'; import { ClientRequestEvent } from '../../../events/client-request.event'; import { EndpointAdaptor, EndpointConfig } from '../../endpoint-adaptor.base'; import { EndpointAdaptorName } from '../../endpoint-adaptor.decorator'; +import * as httpStatus from 'http-status'; @EndpointAdaptorName('Email', 'both') export class EmailAdaptor extends EndpointAdaptor { @@ -80,12 +81,13 @@ export class EmailAdaptor extends EndpointAdaptor { ); const { host: emailTo } = sep; - args = this._argsList(args); + args = this._argsList30x(args); + const responses = this._responses30x(fun.responses); return this.emailsService .sendTemplateEmail( emailTo, 'relay-sep-invoke', - { relayId: reqEvent.id, fun, sep, args }, + { relayId: reqEvent.id, fun, sep, args, responses }, { email: emailFrom, name: 'Callgent Invoker' }, ) .then((res) => ({ @@ -98,9 +100,26 @@ export class EmailAdaptor extends EndpointAdaptor { })); } - private _argsList(args: object): object[] { + private _argsList30x(args: object): object[] { const list = []; if (!args) return list; - const { parameters, requestBody } = args; + const { parameters, requestBody } = args as any; + parameters?.forEach((p) => list.push(p.value)); + // no name means it's a request body + requestBody && list.push(requestBody); // TODO format + } + + private _responses30x(responses: any) { + const list = []; + if (!responses) return list; + if (responses.default) + list.push({ ...responses.default, name: 'Default Response' }); + Object.keys(responses).forEach((k) => { + if (k == 'default') return; + // FIXME format headers, links, also change 'relay-sep-invoke.dot' + const { headers, links, content, description } = responses[k]; + list.push({ name: httpStatus[k] || k, description, content }); // TODO format + }); + return list; } } From 7c578e8a50354288c4743ee6bde21f390bd2d80d Mon Sep 17 00:00:00 2001 From: dev-callgent Date: Thu, 5 Sep 2024 14:45:07 +0800 Subject: [PATCH 059/183] feat: sparkpost relay-webhook integration Signed-off-by: dev-callgent --- src/emails/templates/relay-sep-invoke.dot | 4 +- .../adaptors/builtin/email/email.adaptor.ts | 65 +++++++++++++++++-- 2 files changed, 62 insertions(+), 7 deletions(-) diff --git a/src/emails/templates/relay-sep-invoke.dot b/src/emails/templates/relay-sep-invoke.dot index bfa7c25..a951e60 100644 --- a/src/emails/templates/relay-sep-invoke.dot +++ b/src/emails/templates/relay-sep-invoke.dot @@ -37,7 +37,7 @@ Function Arguments: {{~it.args :arg}}
- {{=arg.name || 'Request Body'}}{{=arg.required ? '*' : ''}}: + {{=arg.name}}{{=arg.required ? '*' : ''}}: {{=arg.description}}
{{=JSON.stringify(arg.value)}}
@@ -51,7 +51,7 @@ Possible Responses: {{~it.responses :resp}}
- Response {{=resp.name}}: + Response {{=resp.name}}: {{=resp.description}}
{{=resp.content ? JSON.stringify(resp.content) : ''}}
diff --git a/src/endpoints/adaptors/builtin/email/email.adaptor.ts b/src/endpoints/adaptors/builtin/email/email.adaptor.ts index 664a381..f0e9073 100644 --- a/src/endpoints/adaptors/builtin/email/email.adaptor.ts +++ b/src/endpoints/adaptors/builtin/email/email.adaptor.ts @@ -1,4 +1,8 @@ -import { Inject, NotImplementedException } from '@nestjs/common'; +import { + BadRequestException, + Inject, + NotImplementedException, +} from '@nestjs/common'; import { AgentsService } from '../../../../agents/agents.service'; import { CallgentFunctionDto } from '../../../../callgent-functions/dto/callgent-function.dto'; import { @@ -104,9 +108,20 @@ export class EmailAdaptor extends EndpointAdaptor { const list = []; if (!args) return list; const { parameters, requestBody } = args as any; - parameters?.forEach((p) => list.push(p.value)); - // no name means it's a request body - requestBody && list.push(requestBody); // TODO format + parameters?.forEach((p) => { + if (!p.value) + throw new BadRequestException('Missing value for parameter:' + p.name); + list.push(p.value); + }); + if (requestBody) { + if (!requestBody.value) + throw new BadRequestException('Missing value for requestBody'); + list.push({ + ...requestBody, + name: 'Request Body', + content: this._formatMediaType(requestBody.content), + }); // TODO format + } } private _responses30x(responses: any) { @@ -118,8 +133,48 @@ export class EmailAdaptor extends EndpointAdaptor { if (k == 'default') return; // FIXME format headers, links, also change 'relay-sep-invoke.dot' const { headers, links, content, description } = responses[k]; - list.push({ name: httpStatus[k] || k, description, content }); // TODO format + list.push({ + name: httpStatus[k] || k, + description, + content: this._formatMediaType(content), + }); // TODO format }); return list; } + + private _formatMediaType(content: any) { + const list = []; + if (!content) return content; + + Object.values(content).forEach((c: any) => { + if (c.schema) { + list.push(this._formatSchema(c.schema)); + } else if (c.examples) { + // TODO examples + list.push(...c.examples); + } else if (c.example) list.push(c.example); + }); + + return list.length == 1 ? list[0] : list; + } + private _formatSchema(schema: any) { + if (schema.type == 'array') { + return [this._formatSchema(schema.items)]; + } else if (schema.type == 'object') { + const props = {}; + Object.entries(schema.properties).forEach((entry: [string, any]) => { + const [k, v] = entry; + props[k + `${v.required ? '*' : ''}`] = this._formatSchema({ + ...v, + required: undefined, + }); + }); + return props; + } else if (schema.type == 'string') { + let pre = schema.format ? `format: ${schema.format}, ` : ''; + pre += schema.pattern ? `pattern: ${schema.pattern}, ` : ''; + pre += schema.enum ? `enums: ${JSON.stringify(schema.enum)}, ` : ''; + return pre + (schema.description || 'string'); + } else return schema; + } } From 7f43d18848752df13f7b65d89d731cecf1074530 Mon Sep 17 00:00:00 2001 From: dev-callgent Date: Sun, 8 Sep 2024 00:34:41 +0800 Subject: [PATCH 060/183] feat: sep-email response handling Signed-off-by: dev-callgent --- .env.dev | 2 +- .../migration.sql | 3 + prisma/schema.prisma | 4 +- prisma/seed-test.ts | 6 ++ prisma/seed.ts | 19 ++++ src/agents/agents.service.ts | 86 +++++++++---------- src/agents/llm.service.ts | 7 +- src/emails/emails.controller.ts | 6 +- src/emails/templates/relay-sep-invoke.dot | 2 +- .../adaptors/builtin/email/email.adaptor.ts | 50 +++++------ .../builtin/restapi/restapi.adaptor.ts | 20 ++--- .../builtin/restapi/restapi.controller.ts | 3 +- .../adaptors/builtin/web/webpage.adaptor.ts | 10 +-- .../adaptors/endpoint-adaptor.base.ts | 6 +- src/endpoints/endpoints.service.ts | 15 +++- src/endpoints/events/client-request.event.ts | 2 - .../event-listeners.service.ts | 61 +++++++------ src/event-stores/event-stores.service.ts | 7 +- src/executions/executions.service.ts | 61 ------------- src/task-actions/task-actions.service.ts | 60 ------------- 20 files changed, 178 insertions(+), 252 deletions(-) create mode 100644 prisma/migrations/20240907160349_llm_cache_max_length/migration.sql diff --git a/.env.dev b/.env.dev index 59bb2cf..707d470 100644 --- a/.env.dev +++ b/.env.dev @@ -25,7 +25,7 @@ DATABASE_URL=postgresql://${POSTGRES_USER}:${POSTGRES_PASSWORD}@nest-postgres:54 # To have acccess to the database container from your local machine # use the DATABASE_URL below which replaces nest-postgres (container name) with localhost DATABASE_URL=postgresql://${POSTGRES_USER}:${POSTGRES_PASSWORD}@localhost:5432/${POSTGRES_DB}?schema=public&timezone=UTC -PRISMA_TRANSACTION_TIMEOUT=120000 +PRISMA_TRANSACTION_TIMEOUT=120000000 DEFAULT_API_VERSION='1' DOCUMENTATION_VERSION='0.0.1' # DEV_ONLY no doc/test data generated if null diff --git a/prisma/migrations/20240907160349_llm_cache_max_length/migration.sql b/prisma/migrations/20240907160349_llm_cache_max_length/migration.sql new file mode 100644 index 0000000..d0b2272 --- /dev/null +++ b/prisma/migrations/20240907160349_llm_cache_max_length/migration.sql @@ -0,0 +1,3 @@ +-- AlterTable +ALTER TABLE "LlmCache" ALTER COLUMN "prompt" SET DATA TYPE VARCHAR(8192), +ALTER COLUMN "result" SET DATA TYPE VARCHAR(8192); diff --git a/prisma/schema.prisma b/prisma/schema.prisma index 5fc0446..95776d7 100644 --- a/prisma/schema.prisma +++ b/prisma/schema.prisma @@ -422,8 +422,8 @@ model LlmCache { pk BigInt @id @default(autoincrement()) name String @db.VarChar(32) - prompt String @db.VarChar(4096) - result String @db.VarChar(4096) + prompt String @db.VarChar(8192) + result String @db.VarChar(8192) createdAt DateTime @default(now()) diff --git a/prisma/seed-test.ts b/prisma/seed-test.ts index c716f5c..d1b3511 100644 --- a/prisma/seed-test.ts +++ b/prisma/seed-test.ts @@ -173,6 +173,12 @@ function initTestData() { 'given below service APIs:\nservice test-callgent {\n "API: GET /positions": {"endpoint": "GET /positions", "summary":"listPositions: List all job positions", "description":"Retrieve a list of all available job positions.", "params":{}, "responses":{"200":{"description":"A list of job positions","content":{"application/json":{"schema":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","description":"Unique identifier for the job position"},"title":{"type":"string","description":"Title of the job position"},"description":{"type":"string","description":"Description of the job position"},"location":{"type":"string","description":"Location of the job position"},"requirements":{"type":"array","items":{"type":"string"},"description":"List of requirements for the job position"},"createdAt":{"type":"string","format":"date-time","description":"Timestamp when the job position was created"},"updatedAt":{"type":"string","format":"date-time","description":"Timestamp when the job position was last updated"}}}}}}},"500":{"description":"Internal Server Error"}} },\n}\n\nPlease choose one API to fulfill below request:\n{\n"requesting endpoint": "GET /positions",\n"request from": "restAPI",\n"request_object": {"url":"/positions","method":"GET","headers":{"accept":"*/*","accept-encoding":"gzip, deflate, br","cache-control":"no-cache","connection":"keep-alive","host":"127.0.0.1:3000","user-agent":"Apifox/1.0.0 (https://apifox.com)"},"query":{}},\n}\nand code for request_object to chosen function args mapping. if any data missing/unclear/ambiguous from request_object to invocation args, please ask question to the caller in below json.question field.\n\noutput a single-line json object:\n{ "endpoint": "the chosen API endpoint to be invoked", "args":"request params/body/headers/..., with same structure as the signature JSON object(no more args than it), or null if no args needed", "mapping": "if the the request_object is structured (or null if unstructured), generate the js function (request_object)=>{...;return API_signature_args;}, full implementation to return the **real** args from request_object to invoke the API. don\'t use data not exist or ambiguous in request", "question": "question to ask the caller if anything not sure or missing for request to args mapping, *no* guess or assumption of the mapping. null if the mapping is crystal clear." }"}', '{ "endpoint": "GET /positions", "args": null, "mapping": "(request_object)=>{return null;}", "question": null }', ), + addLlmCache( + 9, + 'convert2Response', + 'Given the openAPI endpoint:\n{"endpoint": "GET /positions", "summary":"listPositions: List all job positions", "description":"Retrieve a list of all available job positions.", "params":{}, "responses":{"200":{"description":"A list of job positions","content":{"application/json":{"schema":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","description":"Unique identifier for the job position"},"title":{"type":"string","description":"Title of the job position"},"description":{"type":"string","description":"Description of the job position"},"location":{"type":"string","description":"Location of the job position"},"requirements":{"type":"array","items":{"type":"string"},"description":"List of requirements for the job position"},"createdAt":{"type":"string","format":"date-time","description":"Timestamp when the job position was created"},"updatedAt":{"type":"string","format":"date-time","description":"Timestamp when the job position was last updated"}}}}}}},"500":{"description":"Internal Server Error"}} }\n\ninvoked with the following request:\n<--- request begin ---\n[]\n--- request end --->\n\nwe receive below response content:\n<--- response begin ---\nWe are pleased to inform you about the following job positions available at our company:\r\n\r\n1. Software Engineer\r\n   - Description: Develop and maintain software applications.\r\n   - Location: San Francisco, CA\r\n   - Requirements:\r\n     - Bachelor\'s degree in Computer Science or related field\r\n     - 3+ years of experience in software development\r\n     - Proficient in Java or Python\r\n   - Created At: October 1, 2023, 12:00 PM\r\n   - Updated At: October 1, 2023, 12:00 PM\r\n\r\n2. Product Manager\r\n   - Description: Define product strategy and roadmap.\r\n   - Location: New York, NY\r\n   - Requirements:\r\n     - Bachelor\'s degree in Business or related field\r\n     - 5+ years of experience in product management\r\n     - Strong analytical and problem-solving skills\r\n   - Created At: October 2, 2023, 10:00 AM\r\n   - Updated At: October 2, 2023, 10:00 AM\r\n\r\n3. Data Scientist\r\n   - Description: Analyze and interpret complex data to assist in decision-making.\r\n   - Location: Seattle, WA\r\n   - Requirements:\r\n     - Master\'s degree in Data Science or related field\r\n     - 2+ years of experience in data analysis\r\n     - Proficient in Python and SQL\r\n   - Created At: October 3, 2023, 8:00 AM\r\n   - Updated At: October 3, 2023, 8:00 AM\r\n\r\nPlease review the details and let us know if you are interested in any of these positions.\r\n\r\nBest regards\r\n> From: "Callgent Invoker"\r\n> Date: Thu, Sep 5, 2024, 14:44\r\n> Subject: [Callgent] Function calling: \'GET /positions\' from Callgent test-callgent. #xY5WGrPph-jn2HHn4_aLi\r\n> To: "dev"\r\n> [image: https://hgggdgi.r.bh.d.sendibt3.com/tr/op/CYIv2yvoVWHCvjQ__eO-QxCY-FkqVvmIPWtQz6OMpAh55LRbe8vKq9aHSdoB0TikwlnXx5U6VsnDPf9637MS7iqb_BpOIcAej4CvQCx2hCA2upHiNg6mXVisqoSvihA0UM9ymGtL9RJsmgdosYMyVW2iHwS9m9UcLtnagkPE-HXmIE8L4EkAApInhajwSZuVsine_ltWzXmBzfU9jp6e5g]\r\n> Hello dev!\r\n> Somebody is calling: \'GET /positions\' from Callgent test-callgent. Below is the detailed request information:\r\n> Function Calling:\r\n> Name:GET /positions\r\n> Summary:listPositions: List all job positions\r\n> Description:Retrieve a list of all available job positions.\r\n> Possible Responses:\r\n> Response OK:A list of job positions\r\n> [{"id":"Unique identifier for the job position","title":"Title of the job position","description":"Description of the job position","location":"Location of the job position","requirements":["string"],"createdAt":"format: date-time, Timestamp when the job position was created","updatedAt":"format: date-time, Timestamp when the job position was last updated"}]\r\n> Response Internal Server Error:Internal Server Error\r\n> \r\n> \r\n> Thu, 05 Sep 2024 06:44:13 GMT\r\n\n--- response end --->\n\nPlease formalize the response content as a single-lined JSON object:\n{"response-code": "the exact response code(integer) defined in API", "data": "extracted response value with respect to the corresponding API response schema"}', + '{\n "response-code": 200,\n "data": [\n {\n "id": "1",\n "title": "Software Engineer",\n "description": "Develop and maintain software applications.",\n "location": "San Francisco, CA",\n "requirements": [\n "Bachelor\'s degree in Computer Science or related field",\n "3+ years of experience in software development",\n "Proficient in Java or Python"\n ],\n "createdAt": "2023-10-01T12:00:00Z",\n "updatedAt": "2023-10-01T12:00:00Z"\n },\n {\n "id": "2",\n "title": "Product Manager",\n "description": "Define product strategy and roadmap.",\n "location": "New York, NY",\n "requirements": [\n "Bachelor\'s degree in Business or related field",\n "5+ years of experience in product management",\n "Strong analytical and problem-solving skills"\n ],\n "createdAt": "2023-10-02T10:00:00Z",\n "updatedAt": "2023-10-02T10:00:00Z"\n },\n {\n "id": "3",\n "title": "Data Scientist",\n "description": "Analyze and interpret complex data to assist in decision-making.",\n "location": "Seattle, WA",\n "requirements": [\n "Master\'s degree in Data Science or related field",\n "2+ years of experience in data analysis",\n "Proficient in Python and SQL"\n ],\n "createdAt": "2023-10-03T08:00:00Z",\n "updatedAt": "2023-10-03T08:00:00Z"\n }\n ]\n}', + ), ]; } diff --git a/prisma/seed.ts b/prisma/seed.ts index 5d4d48f..e4e8e50 100644 --- a/prisma/seed.ts +++ b/prisma/seed.ts @@ -160,6 +160,25 @@ and code for request_object to chosen function args mapping. if any data missing output a single-line json object: { "endpoint": "the chosen API endpoint to be invoked", "args":"params/body/headers/..., with same structure as the 'params' JSON object(no more args than it) with additional 'value' prop, or null if no args needed", "mapping": "if the the request_object is structured (or null if unstructured), generate the js function (request_object)=>{...;return API_signature_args;}, full implementation to return the **real** args from request_object to invoke the API. don't use data not exist or ambiguous in request", "question": "question to ask the caller if anything not sure or missing for request to args mapping, *no* guess or assumption of the mapping. null if the mapping is crystal clear." }"}`, }, + { + pk: 3, + name: 'convert2Response', + prompt: `Given the openAPI endpoint: +{"endpoint": "{{=it.fun.name}}", "summary":"{{=it.fun.summary}}", {{=it.fun.description ? '"description":"'+it.fun.description+'", ':''}}"params":{{=JSON.stringify(it.fun.params)}}, "responses":{{=JSON.stringify(it.fun.responses)}} } + +invoked with the following request: +<--- request begin --- +{{=JSON.stringify(it.args)}} +--- request end ---> + +we receive below response content: +<--- response begin --- +{{=it.resp}} +--- response end ---> + +Please formalize the response content as a single-lined JSON object: +{"response-code": "the exact response code(integer) defined in API", "data": "extracted response value with respect to the corresponding API response schema"}`, + }, ]; return llmTemplates.map((llmTpl) => diff --git a/src/agents/agents.service.ts b/src/agents/agents.service.ts index bb5a29c..f3e0a04 100644 --- a/src/agents/agents.service.ts +++ b/src/agents/agents.service.ts @@ -1,11 +1,9 @@ import { BadRequestException, HttpException, Injectable } from '@nestjs/common'; import { CallgentFunctionDto } from '../callgent-functions/dto/callgent-function.dto'; -import { AdaptedDataSource } from '../endpoints/adaptors/endpoint-adaptor.base'; -import { TaskActionDto } from '../task-actions/dto/task-action.dto'; -import { LLMService } from './llm.service'; import { ClientRequestEvent } from '../endpoints/events/client-request.event'; import { EventListenersService } from '../event-listeners/event-listeners.service'; import { ProgressiveRequestEvent } from './events/progressive-request.event'; +import { LLMService } from './llm.service'; @Injectable() export class AgentsService { @@ -56,19 +54,10 @@ export class AgentsService { const mapped = await this.llmService.template( 'map2Function', - { - req, - funName, - callgentName, - cepAdaptor, - callgentFunctions, - }, - { endpoint: '', args: '', mapping: '', question: '' }, + { req, funName, callgentName, cepAdaptor, callgentFunctions }, + { endpoint: '', args: {}, mapping: '', question: '' }, + id, ); // TODO check `funName` exists in callgentFunctions, validating `mapping` - if (!mapped) - throw new Error( - 'LLM service not available: map2Function for event#' + id, - ); reqEvent.context.map2Function = mapped; if (mapped.question) { @@ -100,6 +89,8 @@ export class AgentsService { if (functions?.length != 1) throw new BadRequestException('Failed to map to function: ' + mapped); reqEvent.context.functions = functions; + + mapped.args = this._args2List30x(mapped.args); } } @@ -111,41 +102,42 @@ export class AgentsService { // handle resp } - async genScript( - CallgentFunctions: { [callgentName: string]: CallgentFunctionDto[] }, - taskAction: TaskActionDto, - ) { - const ms = Object.values(CallgentFunctions)?.flat(); - - if (ms.length > 1) { - // routing + private _args2List30x(args: object) { + const list = []; + if (!args) return list; + const { parameters, requestBody } = args as any; + parameters?.forEach((p) => { + if (!p.value) + throw new BadRequestException('Missing value for parameter:' + p.name); + list.push(p); + }); + if (requestBody) { + if (!requestBody.value) + throw new BadRequestException('Missing value for requestBody'); + list.push({ + ...requestBody, + name: 'Request Body', + // content: this._formatMediaType(requestBody.content), + }); // TODO format } - - // return this.llmService.template( - // 'api2Function', - // { - // format, - // handle, - // ...args, - // }, - // { signature: '', documents: '', fullCode: '' }, - // ); + return list; } - async genPseudoCmd( - callgents: { id: string; name: string; summary: string }[], - taskaAction: TaskActionDto, - ) {} - - async routeAction(actions: CallgentFunctionDto[], req: AdaptedDataSource) { - if (!actions?.length) return; - // FIXME:是否需要task上下文来决定路由, - return actions[0]; - } + /** convert resp content into one of fun.responses */ + async convert2Response( + args: { name: string; value: any }[], + resp: string, + fun: CallgentFunctionDto, + eventId: string, + ) { + args = args?.map((a) => ({ name: a.name, value: a.value })) || []; + const mapped = await this.llmService.template( + 'convert2Response', + { args, resp, fun }, + { 'response-code': 200, data: {} }, + eventId, + ); // TODO check `funName` exists in callgentFunctions, validating `mapping` - /** map request params from task ctx */ - async mapParams(content: any, req: AdaptedDataSource) { - // 从任务上下文中获取参数,并返回标准json参数结构?由server适配器封装为想要的格式 - return []; + return { statusCode: mapped['response-code'], data: mapped.data }; } } diff --git a/src/agents/llm.service.ts b/src/agents/llm.service.ts index 82d1cba..88e5d2d 100644 --- a/src/agents/llm.service.ts +++ b/src/agents/llm.service.ts @@ -29,6 +29,7 @@ export class LLMService { template: string, args: { [key: string]: any }, returnType?: T, + bizKey?: string, ): Promise { const prompt = await this._prompt(template, args); @@ -44,7 +45,10 @@ export class LLMService { temperature: 0.5, }); - if (!resp?.choices?.length) return; + if (!resp?.choices?.length) + throw new Error( + `LLM service not available: template=${template} bizKey=${bizKey}`, + ); const choice = resp.choices[0] as NonStreamingChoice; result = choice.message?.content; @@ -77,6 +81,7 @@ export class LLMService { } protected async _llmCache(name: string, prompt: string, result?: string) { + if (prompt.length > 8190) return; const prisma = this.txHost.tx as PrismaClient; if (result) return prisma.llmCache.upsert({ diff --git a/src/emails/emails.controller.ts b/src/emails/emails.controller.ts index 3a3332d..95e6847 100644 --- a/src/emails/emails.controller.ts +++ b/src/emails/emails.controller.ts @@ -35,8 +35,10 @@ export class EmailsController { } // handle relay event - relays?.forEach((relay) => - this.emailsService.handleRelayEmail(relay.msys.relay_message), + relays?.forEach( + (relay) => + relay?.msys?.relay_message && + this.emailsService.handleRelayEmail(relay.msys.relay_message), ); return; // return 200 to consume the event } diff --git a/src/emails/templates/relay-sep-invoke.dot b/src/emails/templates/relay-sep-invoke.dot index a951e60..a0ac53c 100644 --- a/src/emails/templates/relay-sep-invoke.dot +++ b/src/emails/templates/relay-sep-invoke.dot @@ -13,7 +13,7 @@
- Function Calling: + Calling Function:
Name: {{=it.fun.name}} diff --git a/src/endpoints/adaptors/builtin/email/email.adaptor.ts b/src/endpoints/adaptors/builtin/email/email.adaptor.ts index f0e9073..c20ba8c 100644 --- a/src/endpoints/adaptors/builtin/email/email.adaptor.ts +++ b/src/endpoints/adaptors/builtin/email/email.adaptor.ts @@ -1,10 +1,13 @@ +import { Transactional } from '@nestjs-cls/transactional'; import { BadRequestException, Inject, NotImplementedException, } from '@nestjs/common'; +import * as httpStatus from 'http-status'; import { AgentsService } from '../../../../agents/agents.service'; import { CallgentFunctionDto } from '../../../../callgent-functions/dto/callgent-function.dto'; +import { RelayEmail } from '../../../../emails/dto/sparkpost-relay-object.interface'; import { EmailRelayKey, EmailsService, @@ -15,7 +18,6 @@ import { Endpoint } from '../../../entities/endpoint.entity'; import { ClientRequestEvent } from '../../../events/client-request.event'; import { EndpointAdaptor, EndpointConfig } from '../../endpoint-adaptor.base'; import { EndpointAdaptorName } from '../../endpoint-adaptor.decorator'; -import * as httpStatus from 'http-status'; @EndpointAdaptorName('Email', 'both') export class EmailAdaptor extends EndpointAdaptor { @@ -26,11 +28,7 @@ export class EmailAdaptor extends EndpointAdaptor { super(agentsService); } - getCallback( - callback: string, - rawReq: object, - reqEndpoint?: EndpointDto, - ): Promise { + getCallback(callback: string, reqEndpoint?: EndpointDto): Promise { throw new NotImplementedException('Method not implemented.'); } @@ -53,6 +51,23 @@ export class EmailAdaptor extends EndpointAdaptor { // } + @Transactional() + async postprocess(reqEvent: ClientRequestEvent, fun: CallgentFunctionDto) { + const resp = reqEvent?.data?.resp as unknown as RelayEmail; + if (!resp?.content?.html) + throw new BadRequestException( + 'Missing response for reqEvent#' + reqEvent.id, + ); + + // convert resp to api format + reqEvent.data.resp = await this.agentsService.convert2Response( + reqEvent?.context?.map2Function?.args, + resp.content.text || resp.content.html, + fun, + reqEvent.id, + ); + } + readData(name: string, hints?: { [key: string]: any }): Promise { throw new NotImplementedException('Method not implemented.'); } @@ -85,7 +100,6 @@ export class EmailAdaptor extends EndpointAdaptor { ); const { host: emailTo } = sep; - args = this._argsList30x(args); const responses = this._responses30x(fun.responses); return this.emailsService .sendTemplateEmail( @@ -104,26 +118,6 @@ export class EmailAdaptor extends EndpointAdaptor { })); } - private _argsList30x(args: object): object[] { - const list = []; - if (!args) return list; - const { parameters, requestBody } = args as any; - parameters?.forEach((p) => { - if (!p.value) - throw new BadRequestException('Missing value for parameter:' + p.name); - list.push(p.value); - }); - if (requestBody) { - if (!requestBody.value) - throw new BadRequestException('Missing value for requestBody'); - list.push({ - ...requestBody, - name: 'Request Body', - content: this._formatMediaType(requestBody.content), - }); // TODO format - } - } - private _responses30x(responses: any) { const list = []; if (!responses) return list; @@ -175,6 +169,6 @@ export class EmailAdaptor extends EndpointAdaptor { pre += schema.pattern ? `pattern: ${schema.pattern}, ` : ''; pre += schema.enum ? `enums: ${JSON.stringify(schema.enum)}, ` : ''; return pre + (schema.description || 'string'); - } else return schema; + } else return schema; // TODO: similar to string } } diff --git a/src/endpoints/adaptors/builtin/restapi/restapi.adaptor.ts b/src/endpoints/adaptors/builtin/restapi/restapi.adaptor.ts index 61661d7..78110aa 100644 --- a/src/endpoints/adaptors/builtin/restapi/restapi.adaptor.ts +++ b/src/endpoints/adaptors/builtin/restapi/restapi.adaptor.ts @@ -139,11 +139,12 @@ export class RestAPIAdaptor extends EndpointAdaptor { async preprocess( reqEvent: ClientRequestEvent, - endpoint: EndpointDto, + // endpoint: EndpointDto, ): Promise { - if (!reqEvent.rawReq) + const req = reqEvent?.data.req; + if (!req) throw new BadRequestException( - 'Missing request object for ClientRequestEvent', + 'Missing request object for ClientRequestEvent#' + reqEvent.id, ); const { callback, @@ -157,17 +158,16 @@ export class RestAPIAdaptor extends EndpointAdaptor { if (!progressive) { } - reqEvent.data.req = this.req2Json(reqEvent.rawReq); - delete reqEvent.rawReq; + reqEvent.data.req = this.req2Json(req); + } + + async postprocess(reqEvent: ClientRequestEvent, fun: CallgentFunctionDto) { + // } // async invoke() {} - async getCallback( - callback: string, - rawReq: object, - reqEndpoint?: EndpointDto, - ) { + async getCallback(callback: string, reqEndpoint?: EndpointDto) { // FIXME return callback; } diff --git a/src/endpoints/adaptors/builtin/restapi/restapi.controller.ts b/src/endpoints/adaptors/builtin/restapi/restapi.controller.ts index 6bda713..236134f 100644 --- a/src/endpoints/adaptors/builtin/restapi/restapi.controller.ts +++ b/src/endpoints/adaptors/builtin/restapi/restapi.controller.ts @@ -92,12 +92,13 @@ export class RestApiController { throw new NotFoundException('callgent not found: ' + callgentId); const { data, statusCode, message } = await this.eventListenersService.emit( - new ClientRequestEvent(cep.id, taskId, cep.adaptorKey, req, callback, { + new ClientRequestEvent(cep.id, taskId, cep.adaptorKey, callback, { callgentId, callgentName: callgent.name, caller, progressive, funName, + req, }), parseInt(timeout) || 0, // sync timeout ); diff --git a/src/endpoints/adaptors/builtin/web/webpage.adaptor.ts b/src/endpoints/adaptors/builtin/web/webpage.adaptor.ts index 9439295..12a2c6b 100644 --- a/src/endpoints/adaptors/builtin/web/webpage.adaptor.ts +++ b/src/endpoints/adaptors/builtin/web/webpage.adaptor.ts @@ -13,11 +13,7 @@ export class WebpageAdaptor extends EndpointAdaptor { super(agentsService); } - getCallback( - callback: string, - rawReq: object, - reqEndpoint?: EndpointDto, - ): Promise { + getCallback(callback: string, reqEndpoint?: EndpointDto): Promise { throw new NotImplementedException('Method not implemented.'); } @@ -85,6 +81,10 @@ export class WebpageAdaptor extends EndpointAdaptor { // } + async postprocess(reqEvent: ClientRequestEvent, fun: CallgentFunctionDto) { + // + } + readData(name: string, hints?: { [key: string]: any }): Promise { throw new NotImplementedException('Method not implemented.'); } diff --git a/src/endpoints/adaptors/endpoint-adaptor.base.ts b/src/endpoints/adaptors/endpoint-adaptor.base.ts index a14efc7..26375a7 100644 --- a/src/endpoints/adaptors/endpoint-adaptor.base.ts +++ b/src/endpoints/adaptors/endpoint-adaptor.base.ts @@ -15,7 +15,12 @@ export abstract class EndpointAdaptor { this.agentsService = agentsService; } + /** preprocess request */ abstract preprocess(reqEvent: ClientRequestEvent, endpoint: EndpointDto); + + /** postprocess response */ + abstract postprocess(reqEvent: ClientRequestEvent, fun: CallgentFunctionDto); + /** Endpoint config. */ abstract getConfig(): EndpointConfig; @@ -34,7 +39,6 @@ export abstract class EndpointAdaptor { /** get callback param */ abstract getCallback( callback: string, - rawReq: unknown, reqEndpoint?: EndpointDto, ): Promise; diff --git a/src/endpoints/endpoints.service.ts b/src/endpoints/endpoints.service.ts index 40e4bbd..5d64ebd 100644 --- a/src/endpoints/endpoints.service.ts +++ b/src/endpoints/endpoints.service.ts @@ -329,7 +329,6 @@ export class EndpointsService { callgent: { select: { id: true, name: true } }, }); const adapter = sep && this.getAdaptor(sep.adaptorKey, EndpointType.SERVER); - if (!adapter) throw new Error('Failed to invoke, No SEP adaptor found'); // may returns pending result @@ -352,6 +351,20 @@ export class EndpointsService { throw new Error('Failed to invoke, No mapping function found'); const func = functions[0] as CallgentFunctionDto; + const sep = await this.findOne(func.endpointId, { + id: true, + name: true, + type: true, + adaptorKey: true, + priority: true, + host: true, + content: true, + callgentId: true, + callgent: { select: { id: true, name: true } }, + }); + const adapter = sep && this.getAdaptor(sep.adaptorKey, EndpointType.SERVER); + if (!adapter) throw new Error('Failed to invoke, No SEP adaptor found'); + await adapter.postprocess(reqEvent, func); return { data: reqEvent }; // do nothing } diff --git a/src/endpoints/events/client-request.event.ts b/src/endpoints/events/client-request.event.ts index b93cf31..ac21c40 100644 --- a/src/endpoints/events/client-request.event.ts +++ b/src/endpoints/events/client-request.event.ts @@ -16,8 +16,6 @@ export class ClientRequestEvent extends EventObject { /** empty to create new task */ taskId: string, dataType: string, - /** raw request, temp prop, will not be persisted */ - public rawReq: any, callback: string, public readonly data: { callgentId: string; diff --git a/src/event-listeners/event-listeners.service.ts b/src/event-listeners/event-listeners.service.ts index e760c56..909227b 100644 --- a/src/event-listeners/event-listeners.service.ts +++ b/src/event-listeners/event-listeners.service.ts @@ -10,6 +10,7 @@ import { Injectable, Logger, NotFoundException, + UnprocessableEntityException, } from '@nestjs/common'; import { ModuleRef } from '@nestjs/core'; import { EventStore, Prisma, PrismaClient, ServiceType } from '@prisma/client'; @@ -53,7 +54,7 @@ export class EventListenersService { ? Promise.race([ result, Utils.sleep(timeout).then(() => ({ - data: { ...data, rawReq: undefined }, + data, statusCode: data.statusCode, message: `Sync invocation timeout(${timeout}ms), will respond via callback`, })), @@ -80,6 +81,11 @@ export class EventListenersService { ); const listeners = await this.resumeListeners(event); + if (!listeners.length) + throw new UnprocessableEntityException( + `Failed to resume: no listeners found for event, id=${event.id}`, + ); + const result = await this._invokeListeners( listeners, event as any, @@ -111,7 +117,7 @@ export class EventListenersService { @Transactional(Propagation.RequiresNew) protected async _invokeListeners( listeners: EventListener[], - data: T, + event: T, funName?: string, ): Promise<{ data: T; statusCode?: number; message?: string }> { // invoke listeners, supports persisted-async @@ -119,23 +125,23 @@ export class EventListenersService { for (let idx = 0; idx < listeners.length; ) { const listener = listeners[idx++]; try { - const result = await this._invokeListener(listener, data, funName); - if (result) { - result.data && (data = result.data); - result.resumeFunName && (funName = result.resumeFunName); - } else funName = undefined; + const result = await this._invokeListener(listener, event, funName); + // if no result, reuse event + result?.data && (event = result.data); + // if no result, empty funName + funName = result?.resumeFunName; statusCode = funName ? 2 // pending - : data.stopPropagation || idx >= listeners.length + : event.stopPropagation || idx >= listeners.length ? 0 // done : 1; // processing - if (funName || data.stopPropagation) break; + if (funName || event.stopPropagation) break; } catch (e) { statusCode = e.status || -1; // error - const message = (data.message = `[ERROR] ${e.name}: ${e.message}`); + const message = (event.message = `[ERROR] ${e.name}: ${e.message}`); e.status < 500 || this.logger.error(e); - return { data: data, statusCode, message }; + return { data: event, statusCode, message }; } finally { const nextListener = statusCode == 1 @@ -145,14 +151,14 @@ export class EventListenersService { : listener; // error/pending: current await this.eventStoresService.upsertEvent( - data, - funName, - nextListener?.id, + event, + funName || null, + nextListener?.id || null, statusCode, ); } } - return { data: data, statusCode }; + return { data: event, statusCode }; } async loadListeners( @@ -199,31 +205,30 @@ export class EventListenersService { /** load listeners by event id after event.listenerId[including] */ async resumeListeners(data: EventStore) { - let listeners = await this.loadListeners(data, true); + const listeners = await this.loadListeners(data, true); + if (data.listenerId) { - const idx = listeners.findIndex( - (listener) => listener.id === data.listenerId, - ); + const idx = listeners.findIndex((l) => l.id == data.listenerId); if (idx < 0) throw new NotFoundException( `Invalid listener id ${data.listenerId} for event ${data.id}`, ); - - listeners = listeners.splice(0, idx); + idx > 0 && listeners.splice(0, idx); } + return listeners.filter((listener) => !listener.deletedAt); } @Transactional() protected async _invokeListener( listener: EventListener, - data: T, + event: T, funName?: string, ): Promise<{ data: T; resumeFunName?: string }> { if (listener.serviceType == ServiceType.CALLGENT) { - return this._invokeCallgent(listener, data, funName); + return this._invokeCallgent(listener, event, funName); } else { - return this._invokeService(listener, data, funName); + return this._invokeService(listener, event, funName); } } @@ -231,7 +236,7 @@ export class EventListenersService { @Transactional() protected async _invokeService( target: { id: string; serviceName: string; funName: string }, - data: EventObject, + event: EventObject, funName?: string, ): Promise<{ data: T; funName?: string }> { const service = this.moduleRef.get(target.serviceName, { strict: false }); @@ -245,16 +250,16 @@ export class EventListenersService { `Service ${target.serviceName}.${target.funName} not found for event listener#${target.id}`, ); - return fun.apply(service, [data]); + return fun.apply(service, [event]); } @Transactional() protected async _invokeCallgent( target: { id: string; serviceName: string; funName: string }, - data: T, + event: T, funName?: string, ): Promise<{ data: T; resumeFunName?: string }> { - return { data }; + return { data: event }; } @Transactional() diff --git a/src/event-stores/event-stores.service.ts b/src/event-stores/event-stores.service.ts index 4a1e3b5..b69add7 100644 --- a/src/event-stores/event-stores.service.ts +++ b/src/event-stores/event-stores.service.ts @@ -41,6 +41,12 @@ export class EventStoresService { listenerId: string, statusCode: number, ) { + if (statusCode === 0) { + // if event success, keep the latest listenerId and funName + funName || (funName = undefined); + listenerId || (listenerId = undefined); + } + const prisma = this.txHost.tx as PrismaClient; event.statusCode = statusCode; const data: Prisma.EventStoreCreateInput = { @@ -48,7 +54,6 @@ export class EventStoresService { funName, listenerId, }; - delete (data as any).rawReq; return prisma.eventStore.upsert({ where: { id: event.id }, create: data, diff --git a/src/executions/executions.service.ts b/src/executions/executions.service.ts index b39a719..1af4906 100644 --- a/src/executions/executions.service.ts +++ b/src/executions/executions.service.ts @@ -34,7 +34,6 @@ export class ExecutionsService { @Transactional() async execute( callgentIds: string[], - rawReq: object, reqAdaptorKey: string, ctx: { taskId?: string; caller?: JwtPayload; callback?: string } = {}, reqEndpointId?: string, @@ -100,64 +99,4 @@ export class ExecutionsService { // action, // ); } - - /** invocation flow, and lifecycle events */ - // protected async _invocationFlow( - // req: any, - // callgentId: string, - // actionName?: string, - // ) { - // const prisma = this.txHost.tx as PrismaClient; - - // // specific/AI routing from req, get action params/code, TODO: [and specific mapping] - // const where = actionName - // ? { AND: [{ name: actionName }, { callgentId }] } - // : { callgentId }; - // const take = actionName ? 1 : undefined; - // const actions = await prisma.callgentFunction.findMany({ where, take }); - // const action = actionName - // ? actions.find((a) => a.name == actionName) - // : await this._routing(req, actions); - // if (!action) - // throw new BadRequestException( - // 'Action entry not found on callgent: ' + callgentId, - // ); - - // // may reply ack to client directly, async result - // const resp = await this.callout(action, req); - - // // task ctx io - // // response to client or next cmd - // } - - // protected async _routing(req: any, actions: CallgentFunctionDto[]) { - // return this.agentsService.routeAction(actions, req); - // } - - /** call out to server */ - /** invoke with callback */ - // @Transactional() - // async callout(action: CallgentFunctionDto, req: any) { - // // get server endpoint(sep), and sAdaptor - // const sEndpoint = null; // await this.findOne(action.endpointId); - // if (!sEndpoint) - // throw new NotFoundException( - // `Endpoint not found, id=${action.endpointId}`, - // ); - // const sAdaptor = null; // this.getAdaptor(sEndpoint.adaptorKey, sEndpoint.type); - // if (!sAdaptor) - // throw new NotFoundException( - // `Endpoint#${action.endpointId} adaptor not found, adaptorKey=${sEndpoint.adaptorKey}`, - // ); - - // //// async/sync execute action command, given action params/code/req/[specific mapping], with cb - // // do specific/AI mapping from task ctx - // const params = await this.agentsService.mapParams(action.content, req); - // // [async preparing] - // // invoking adaptor - // const resp = await sAdaptor.invoke(params); - // // response handling - // return resp; - // //// end exec. - // } } diff --git a/src/task-actions/task-actions.service.ts b/src/task-actions/task-actions.service.ts index d384e2f..399b4cc 100644 --- a/src/task-actions/task-actions.service.ts +++ b/src/task-actions/task-actions.service.ts @@ -144,64 +144,4 @@ export class TaskActionsService { // 可能用到多个, throw new NotImplementedException('Method not implemented.'); } - - /** invocation flow, and lifecycle events */ - // protected async _invocationFlow( - // req: RequestPack, - // callgentId: string, - // actionName?: string, - // ) { - // const prisma = this.txHost.tx as PrismaClient; - - // // specific/AI routing from req, get action params/code, TODO: [and specific mapping] - // const where = actionName - // ? { AND: [{ name: actionName }, { callgentId }] } - // : { callgentId }; - // const take = actionName ? 1 : undefined; - // const actions = await prisma.callgentFunction.findMany({ where, take }); - // const action = actionName - // ? actions.find((a) => a.name == actionName) - // : await this._routing(req, actions); - // if (!action) - // throw new BadRequestException( - // 'Action entry not found on callgent: ' + callgentId, - // ); - - // // may reply ack to client directly, async result - // const resp = await this.callout(action, req); - - // // task ctx io - // // response to client or next cmd - // } - - // protected async _routing(req: RequestPack, actions: CallgentFunctionDto[]) { - // return this.agentsService.routeAction(actions, req); - // } - - /** call out to server */ - /** invoke with callback */ - // @Transactional() - // async callout(action: CallgentFunctionDto, req: RequestPack) { - // // get server endpoint(sep), and sAdaptor - // const sEndpoint = await this.findOne(action.endpointId); - // if (!sEndpoint) - // throw new NotFoundException( - // `Endpoint not found, id=${action.endpointId}`, - // ); - // const sAdaptor = this.getAdaptor(sEndpoint.adaptorKey, sEndpoint.type); - // if (!sAdaptor) - // throw new NotFoundException( - // `Endpoint#${action.endpointId} adaptor not found, adaptorKey=${sEndpoint.adaptorKey}`, - // ); - - // //// async/sync execute action command, given action params/code/req/[specific mapping], with cb - // // do specific/AI mapping from task ctx - // const params = await this.agentsService.mapParams(action.content, req); - // // [async preparing] - // // invoking adaptor - // const resp = await sAdaptor.invoke(params); - // // response handling - // return resp; - // //// end exec. - // } } From b2bf5b960473a85e89c4a63cdf902f1b4c465fb9 Mon Sep 17 00:00:00 2001 From: dev-callgent Date: Sun, 8 Sep 2024 15:50:38 +0800 Subject: [PATCH 061/183] feat: sep-email response handling Signed-off-by: dev-callgent --- prisma/seed-test.ts | 4 ++-- prisma/seed.ts | 2 +- src/agents/agents.service.ts | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/prisma/seed-test.ts b/prisma/seed-test.ts index d1b3511..6432c06 100644 --- a/prisma/seed-test.ts +++ b/prisma/seed-test.ts @@ -176,8 +176,8 @@ function initTestData() { addLlmCache( 9, 'convert2Response', - 'Given the openAPI endpoint:\n{"endpoint": "GET /positions", "summary":"listPositions: List all job positions", "description":"Retrieve a list of all available job positions.", "params":{}, "responses":{"200":{"description":"A list of job positions","content":{"application/json":{"schema":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","description":"Unique identifier for the job position"},"title":{"type":"string","description":"Title of the job position"},"description":{"type":"string","description":"Description of the job position"},"location":{"type":"string","description":"Location of the job position"},"requirements":{"type":"array","items":{"type":"string"},"description":"List of requirements for the job position"},"createdAt":{"type":"string","format":"date-time","description":"Timestamp when the job position was created"},"updatedAt":{"type":"string","format":"date-time","description":"Timestamp when the job position was last updated"}}}}}}},"500":{"description":"Internal Server Error"}} }\n\ninvoked with the following request:\n<--- request begin ---\n[]\n--- request end --->\n\nwe receive below response content:\n<--- response begin ---\nWe are pleased to inform you about the following job positions available at our company:\r\n\r\n1. Software Engineer\r\n   - Description: Develop and maintain software applications.\r\n   - Location: San Francisco, CA\r\n   - Requirements:\r\n     - Bachelor\'s degree in Computer Science or related field\r\n     - 3+ years of experience in software development\r\n     - Proficient in Java or Python\r\n   - Created At: October 1, 2023, 12:00 PM\r\n   - Updated At: October 1, 2023, 12:00 PM\r\n\r\n2. Product Manager\r\n   - Description: Define product strategy and roadmap.\r\n   - Location: New York, NY\r\n   - Requirements:\r\n     - Bachelor\'s degree in Business or related field\r\n     - 5+ years of experience in product management\r\n     - Strong analytical and problem-solving skills\r\n   - Created At: October 2, 2023, 10:00 AM\r\n   - Updated At: October 2, 2023, 10:00 AM\r\n\r\n3. Data Scientist\r\n   - Description: Analyze and interpret complex data to assist in decision-making.\r\n   - Location: Seattle, WA\r\n   - Requirements:\r\n     - Master\'s degree in Data Science or related field\r\n     - 2+ years of experience in data analysis\r\n     - Proficient in Python and SQL\r\n   - Created At: October 3, 2023, 8:00 AM\r\n   - Updated At: October 3, 2023, 8:00 AM\r\n\r\nPlease review the details and let us know if you are interested in any of these positions.\r\n\r\nBest regards\r\n> From: "Callgent Invoker"\r\n> Date: Thu, Sep 5, 2024, 14:44\r\n> Subject: [Callgent] Function calling: \'GET /positions\' from Callgent test-callgent. #xY5WGrPph-jn2HHn4_aLi\r\n> To: "dev"\r\n> [image: https://hgggdgi.r.bh.d.sendibt3.com/tr/op/CYIv2yvoVWHCvjQ__eO-QxCY-FkqVvmIPWtQz6OMpAh55LRbe8vKq9aHSdoB0TikwlnXx5U6VsnDPf9637MS7iqb_BpOIcAej4CvQCx2hCA2upHiNg6mXVisqoSvihA0UM9ymGtL9RJsmgdosYMyVW2iHwS9m9UcLtnagkPE-HXmIE8L4EkAApInhajwSZuVsine_ltWzXmBzfU9jp6e5g]\r\n> Hello dev!\r\n> Somebody is calling: \'GET /positions\' from Callgent test-callgent. Below is the detailed request information:\r\n> Function Calling:\r\n> Name:GET /positions\r\n> Summary:listPositions: List all job positions\r\n> Description:Retrieve a list of all available job positions.\r\n> Possible Responses:\r\n> Response OK:A list of job positions\r\n> [{"id":"Unique identifier for the job position","title":"Title of the job position","description":"Description of the job position","location":"Location of the job position","requirements":["string"],"createdAt":"format: date-time, Timestamp when the job position was created","updatedAt":"format: date-time, Timestamp when the job position was last updated"}]\r\n> Response Internal Server Error:Internal Server Error\r\n> \r\n> \r\n> Thu, 05 Sep 2024 06:44:13 GMT\r\n\n--- response end --->\n\nPlease formalize the response content as a single-lined JSON object:\n{"response-code": "the exact response code(integer) defined in API", "data": "extracted response value with respect to the corresponding API response schema"}', - '{\n "response-code": 200,\n "data": [\n {\n "id": "1",\n "title": "Software Engineer",\n "description": "Develop and maintain software applications.",\n "location": "San Francisco, CA",\n "requirements": [\n "Bachelor\'s degree in Computer Science or related field",\n "3+ years of experience in software development",\n "Proficient in Java or Python"\n ],\n "createdAt": "2023-10-01T12:00:00Z",\n "updatedAt": "2023-10-01T12:00:00Z"\n },\n {\n "id": "2",\n "title": "Product Manager",\n "description": "Define product strategy and roadmap.",\n "location": "New York, NY",\n "requirements": [\n "Bachelor\'s degree in Business or related field",\n "5+ years of experience in product management",\n "Strong analytical and problem-solving skills"\n ],\n "createdAt": "2023-10-02T10:00:00Z",\n "updatedAt": "2023-10-02T10:00:00Z"\n },\n {\n "id": "3",\n "title": "Data Scientist",\n "description": "Analyze and interpret complex data to assist in decision-making.",\n "location": "Seattle, WA",\n "requirements": [\n "Master\'s degree in Data Science or related field",\n "2+ years of experience in data analysis",\n "Proficient in Python and SQL"\n ],\n "createdAt": "2023-10-03T08:00:00Z",\n "updatedAt": "2023-10-03T08:00:00Z"\n }\n ]\n}', + 'Given the openAPI endpoint:\n{"endpoint": "GET /positions", "summary":"listPositions: List all job positions", "description":"Retrieve a list of all available job positions.", "params":{}, "responses":{"200":{"description":"A list of job positions","content":{"application/json":{"schema":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","description":"Unique identifier for the job position"},"title":{"type":"string","description":"Title of the job position"},"description":{"type":"string","description":"Description of the job position"},"location":{"type":"string","description":"Location of the job position"},"requirements":{"type":"array","items":{"type":"string"},"description":"List of requirements for the job position"},"createdAt":{"type":"string","format":"date-time","description":"Timestamp when the job position was created"},"updatedAt":{"type":"string","format":"date-time","description":"Timestamp when the job position was last updated"}}}}}}},"500":{"description":"Internal Server Error"}} }\n\ninvoked with the following request:\n<--- request begin ---\n[]\n--- request end --->\n\nwe receive below response content:\n<--- response begin ---\nWe are pleased to inform you about the following job positions available at our company:\r\n\r\n1. Software Engineer\r\n   - Description: Develop and maintain software applications.\r\n   - Location: San Francisco, CA\r\n   - Requirements:\r\n     - Bachelor\'s degree in Computer Science or related field\r\n     - 3+ years of experience in software development\r\n     - Proficient in Java or Python\r\n   - Created At: October 1, 2023, 12:00 PM\r\n   - Updated At: October 1, 2023, 12:00 PM\r\n\r\n2. Product Manager\r\n   - Description: Define product strategy and roadmap.\r\n   - Location: New York, NY\r\n   - Requirements:\r\n     - Bachelor\'s degree in Business or related field\r\n     - 5+ years of experience in product management\r\n     - Strong analytical and problem-solving skills\r\n   - Created At: October 2, 2023, 10:00 AM\r\n   - Updated At: October 2, 2023, 10:00 AM\r\n\r\n3. Data Scientist\r\n   - Description: Analyze and interpret complex data to assist in decision-making.\r\n   - Location: Seattle, WA\r\n   - Requirements:\r\n     - Master\'s degree in Data Science or related field\r\n     - 2+ years of experience in data analysis\r\n     - Proficient in Python and SQL\r\n   - Created At: October 3, 2023, 8:00 AM\r\n   - Updated At: October 3, 2023, 8:00 AM\r\n\r\nPlease review the details and let us know if you are interested in any of these positions.\r\n\r\nBest regards\r\n> From: "Callgent Invoker"\r\n> Date: Thu, Sep 5, 2024, 14:44\r\n> Subject: [Callgent] Function calling: \'GET /positions\' from Callgent test-callgent. #xY5WGrPph-jn2HHn4_aLi\r\n> To: "dev"\r\n> [image: https://hgggdgi.r.bh.d.sendibt3.com/tr/op/CYIv2yvoVWHCvjQ__eO-QxCY-FkqVvmIPWtQz6OMpAh55LRbe8vKq9aHSdoB0TikwlnXx5U6VsnDPf9637MS7iqb_BpOIcAej4CvQCx2hCA2upHiNg6mXVisqoSvihA0UM9ymGtL9RJsmgdosYMyVW2iHwS9m9UcLtnagkPE-HXmIE8L4EkAApInhajwSZuVsine_ltWzXmBzfU9jp6e5g]\r\n> Hello dev!\r\n> Somebody is calling: \'GET /positions\' from Callgent test-callgent. Below is the detailed request information:\r\n> Function Calling:\r\n> Name:GET /positions\r\n> Summary:listPositions: List all job positions\r\n> Description:Retrieve a list of all available job positions.\r\n> Possible Responses:\r\n> Response OK:A list of job positions\r\n> [{"id":"Unique identifier for the job position","title":"Title of the job position","description":"Description of the job position","location":"Location of the job position","requirements":["string"],"createdAt":"format: date-time, Timestamp when the job position was created","updatedAt":"format: date-time, Timestamp when the job position was last updated"}]\r\n> Response Internal Server Error:Internal Server Error\r\n> \r\n> \r\n> Thu, 05 Sep 2024 06:44:13 GMT\r\n\n--- response end --->\n\nPlease formalize the response content as a single-lined JSON object:\n{"statusCode": "the exact response code(integer) defined in API", "data": "extracted response value with respect to the corresponding API response schema, or undefined if abnormal response", "error": "message": "error message if abnormal response, otherwise undefined"}', + '{\n "statusCode": 200,\n "data": [\n {\n "id": "1",\n "title": "Software Engineer",\n "description": "Develop and maintain software applications.",\n "location": "San Francisco, CA",\n "requirements": [\n "Bachelor\'s degree in Computer Science or related field",\n "3+ years of experience in software development",\n "Proficient in Java or Python"\n ],\n "createdAt": "2023-10-01T12:00:00Z",\n "updatedAt": "2023-10-01T12:00:00Z"\n },\n {\n "id": "2",\n "title": "Product Manager",\n "description": "Define product strategy and roadmap.",\n "location": "New York, NY",\n "requirements": [\n "Bachelor\'s degree in Business or related field",\n "5+ years of experience in product management",\n "Strong analytical and problem-solving skills"\n ],\n "createdAt": "2023-10-02T10:00:00Z",\n "updatedAt": "2023-10-02T10:00:00Z"\n },\n {\n "id": "3",\n "title": "Data Scientist",\n "description": "Analyze and interpret complex data to assist in decision-making.",\n "location": "Seattle, WA",\n "requirements": [\n "Master\'s degree in Data Science or related field",\n "2+ years of experience in data analysis",\n "Proficient in Python and SQL"\n ],\n "createdAt": "2023-10-03T08:00:00Z",\n "updatedAt": "2023-10-03T08:00:00Z"\n }\n ]\n}', ), ]; } diff --git a/prisma/seed.ts b/prisma/seed.ts index e4e8e50..977d812 100644 --- a/prisma/seed.ts +++ b/prisma/seed.ts @@ -177,7 +177,7 @@ we receive below response content: --- response end ---> Please formalize the response content as a single-lined JSON object: -{"response-code": "the exact response code(integer) defined in API", "data": "extracted response value with respect to the corresponding API response schema"}`, +{"statusCode": "the exact response code(integer) defined in API", "data": "extracted response value with respect to the corresponding API response schema, or undefined if abnormal response", "error": "message": "error message if abnormal response, otherwise undefined"}`, }, ]; diff --git a/src/agents/agents.service.ts b/src/agents/agents.service.ts index f3e0a04..5b915e0 100644 --- a/src/agents/agents.service.ts +++ b/src/agents/agents.service.ts @@ -134,10 +134,10 @@ export class AgentsService { const mapped = await this.llmService.template( 'convert2Response', { args, resp, fun }, - { 'response-code': 200, data: {} }, + { statusCode: 200, data: {} }, eventId, ); // TODO check `funName` exists in callgentFunctions, validating `mapping` - return { statusCode: mapped['response-code'], data: mapped.data }; + return { statusCode: mapped.statusCode, data: mapped.data }; } } From bff6ed9f8c9de92bc61c6821a8121fde935522dd Mon Sep 17 00:00:00 2001 From: dev-callgent Date: Wed, 11 Sep 2024 12:54:44 +0800 Subject: [PATCH 062/183] fix: llm cache data Signed-off-by: dev-callgent --- .env.dev | 11 ++- README.md | 2 +- prisma/seed-test.ts | 79 ++++++++++--------- src/app.module.ts | 2 + .../callgent-hub.controller.spec.ts | 18 +++++ .../callgent-hub/callgent-hub.controller.ts | 59 ++++++++++++++ src/bff/callgent-hub/callgent-hub.module.ts | 9 +++ .../callgent-functions.service.ts | 2 +- src/callgents/callgents.service.ts | 59 +++++++++----- src/emails/emails.service.ts | 7 +- src/endpoints/endpoints.service.ts | 2 +- src/infra/auth/local/local-auth.controller.ts | 2 +- .../oauth-client/oauth-client.controller.ts | 2 +- .../repo/tenancy/prisma-tenancy.provider.ts | 3 +- src/tasks/tasks.service.ts | 2 +- src/users/auth.controller.ts | 2 +- 16 files changed, 191 insertions(+), 70 deletions(-) create mode 100644 src/bff/callgent-hub/callgent-hub.controller.spec.ts create mode 100644 src/bff/callgent-hub/callgent-hub.controller.ts create mode 100644 src/bff/callgent-hub/callgent-hub.module.ts diff --git a/.env.dev b/.env.dev index 707d470..6970315 100644 --- a/.env.dev +++ b/.env.dev @@ -16,8 +16,15 @@ LOG_LEVELS_PRISMA=["query","info","warn","error"] ALLOW_CORS=1 -POSTGRES_USER=postgres -POSTGRES_PASSWORD=postgres +# CREATE USER callgent WITH PASSWORD 'c@llgent123'; +# GRANT ALL PRIVILEGES ON DATABASE callgent TO callgent; +# GRANT USAGE ON SCHEMA public TO callgent; +# GRANT SELECT, INSERT, UPDATE, DELETE ON ALL TABLES IN SCHEMA public TO callgent; +# GRANT USAGE, SELECT ON ALL SEQUENCES IN SCHEMA public TO callgent; +# ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT SELECT, INSERT, UPDATE, DELETE ON TABLES TO callgent; +# ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT USAGE, SELECT ON SEQUENCES TO callgent; +POSTGRES_USER=callgent +POSTGRES_PASSWORD=c@llgent123 POSTGRES_DB=callgent # See https://www.prisma.io/docs/concepts/database-connectors/postgres diff --git a/README.md b/README.md index 480a60d..88a49f2 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@

- Static Badge + Static Badge chat on Discord diff --git a/prisma/seed-test.ts b/prisma/seed-test.ts index 6432c06..fe931cf 100644 --- a/prisma/seed-test.ts +++ b/prisma/seed-test.ts @@ -5,7 +5,10 @@ const prisma = new PrismaClient({ }); async function main() { - return await Promise.all(initTestData()); + return await prisma.$transaction(async (prisma) => { + await prisma.$executeRaw`SELECT set_config('tenancy.bypass_rls', 'on', ${true})`; + await Promise.all(initTestData()); + }); } // execute the main function @@ -125,52 +128,52 @@ function initTestData() { create: cepDto, }) .then((cep) => console.log({ cep })), - addLlmCache( - 1, - 'api2Function', - 'Please convert below API doc of format restAPI:\n{ "POST:/boards/list": {"summary":"List all boards","requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"apiKey":{"type":"string","description":"Your secret API key."}},"required":["apiKey"]}}},"required":true},"responses":{"200":{"description":"A dictionary with a \\"boards\\" property that contains an array of board objects.","content":{"application/json":{"schema":{"type":"object","properties":{"boards":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","description":"A unique identifier for the board."},"created":{"type":"string","description":"Time at which the board was created, in ISO 8601 format."},"isPrivate":{"type":"boolean","description":"Whether or not the board is set as private in the administrative settings."},"name":{"type":"string","description":"The board\'s name."},"postCount":{"type":"integer","description":"The number of non-deleted posts associated with the board. This number includes posts that are marked as closed or complete."},"privateComments":{"type":"boolean","description":"Whether or not comments left on posts can be viewed by other end-users."},"url":{"type":"string","description":"The URL to the board\'s page."}}}},"hasMore":{"type":"boolean","description":"Specifies whether this query returns more boards than the limit."}}}}}}}} }\n\ninto a js function, the function must be as follows:\n// the `invoker` function do the real invocation\nasync (invoker: (req:{ path: string; method: string; headers?: { [key: string]: string }; query?: { [key: string]: string }; params?: { [key: string]: string }; files?: { [key: string]: any }; body?: any; form?: any;})=>Promise<{ apiResult: any; headers?: { [key: string]: string }; status?: number; statusText?: string;}>, ...apiParams) {...; const json = await invoker(...); ...; return apiResult; }\n\nplease generate the js function with **full implementation and error handling**! output a single-line json object:\n{"funName":"function name", "params":["invoker", ...apiParams]"documents":"formal js function documentation with description of params and response object with **all properties elaborated** exactly same as the API doc", "fullCode":"(invoker, ...)=>{...; const json = await invoker(...); ...; return apiResult;}"}', - '{"funName":"listBoards","params":["invoker","apiKey"],"documents":"This function lists all boards.\\n\\n@param {Function} invoker - A function that makes the actual API call.\\n@param {string} apiKey - Your secret API key.\\n\\n@returns {Promise} A promise that resolves to an object containing the API result.\\n@property {Array} boards - An array of board objects.\\n@property {string} boards[].id - A unique identifier for the board.\\n@property {string} boards[].created - Time at which the board was created, in ISO 8601 format.\\n@property {boolean} boards[].isPrivate - Whether or not the board is set as private in the administrative settings.\\n@property {string} boards[].name - The board\'s name.\\n@property {number} boards[].postCount - The number of non-deleted posts associated with the board. This number includes posts that are marked as closed or complete.\\n@property {boolean} boards[].privateComments - Whether or not comments left on posts can be viewed by other end-users.\\n@property {string} boards[].url - The URL to the board\'s page.\\n@property {boolean} hasMore - Specifies whether this query returns more boards than the limit.","fullCode":"(invoker, apiKey) => {\\n const requestBody = {\\n apiKey\\n };\\n const options = {\\n method: \'POST\',\\n path: \'/boards/list\',\\n body: JSON.stringify(requestBody),\\n headers: {\'Content-Type\': \'application/json\'},\\n };\\n try {\\n const json = await invoker(options);\\n if (json.status !== 200) {\\n throw new Error(Request failed with status ${json.status});\\n }\\n return json.apiResult;\\n } catch (error) {\\n console.error(error);\\n throw error;\\n }\\n}"}', - ), - addLlmCache( - 2, - 'api2Function', - 'Please convert below API doc of format restAPI:\n{ "POST:/boards/retrieve": {"summary":"Retrieve board","requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"apiKey":{"type":"string","description":"Your secret API key."},"id":{"type":"string","description":"The board\'s unique identifier."}},"required":["apiKey","id"]}}},"required":true},"responses":{"200":{"description":"Returns a board object, if a valid id was supplied.","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string","description":"A unique identifier for the board."},"created":{"type":"string","description":"Time at which the board was created, in ISO 8601 format."},"isPrivate":{"type":"boolean","description":"Whether or not the board is set as private in the administrative settings."},"name":{"type":"string","description":"The board\'s name."},"postCount":{"type":"integer","description":"The number of non-deleted posts associated with the board. This number includes posts that are marked as closed or complete."},"privateComments":{"type":"boolean","description":"Whether or not comments left on posts can be viewed by other end-users."},"url":{"type":"string","description":"The URL to the board\'s page."}}}}}}}} }\n\ninto a js function, the function must be as follows:\n// the `invoker` function do the real invocation\nasync (invoker: (req:{ path: string; method: string; headers?: { [key: string]: string }; query?: { [key: string]: string }; params?: { [key: string]: string }; files?: { [key: string]: any }; body?: any; form?: any;})=>Promise<{ apiResult: any; headers?: { [key: string]: string }; status?: number; statusText?: string;}>, ...apiParams) {...; const json = await invoker(...); ...; return apiResult; }\n\nplease generate the js function with **full implementation and error handling**! output a single-line json object:\n{"funName":"function name", "params":["invoker", ...apiParams]"documents":"formal js function documentation with description of params and response object with **all properties elaborated** exactly same as the API doc", "fullCode":"(invoker, ...)=>{...; const json = await invoker(...); ...; return apiResult;}"}', - '{"funName":"retrieveBoard","params":["invoker","apiKey","id"],"documents":"This function retrieves a board object given a valid API key and board ID.\\n\\nParameters:\\n- invoker: A function that performs the actual API call.\\n- apiKey: Your secret API key.\\n- pk: The board\'s unique identifier.\\n\\nReturns:\\nAn object containing the board details if a valid id was supplied. The object properties are:\\n- pk: A unique identifier for the board.\\n- created: Time at which the board was created, in ISO 8601 format.\\n- isPrivate: Whether or not the board is set as private in the administrative settings.\\n- name: The board\'s name.\\n- postCount: The number of non-deleted posts associated with the board. This number includes posts that are marked as closed or complete.\\n- privateComments: Whether or not comments left on posts can be viewed by other end-users.\\n- url: The URL to the board\'s page.","fullCode":"(invoker, apiKey, id) => {\\n const req = {\\n path: \'/boards/retrieve\',\\n method: \'POST\',\\n headers: { \'Content-Type\': \'application/json\' },\\n body: JSON.stringify({\\n apiKey, id\\n })\\n };\\n try {\\n const resp = await invoker(req);\\n if (resp.status !== 200) {\\n throw new Error(`Failed to retrieve board. Status: ${resp.status}`);\\n }\\n return resp.result;\\n } catch (error) {\\n console.error(error);\\n throw error;\\n }\\n}"}', - ), - addLlmCache( - 3, - 'api2Function', - 'Please convert below API doc of format restAPI:\n{ "POST:/categories/list": {"summary":"List categories","requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"apiKey":{"type":"string","description":"Your secret API key."},"boardID":{"type":"string","description":"The id of the board you\'d like to fetch categories for."},"limit":{"type":"integer","description":"The number of categories you\'d like to fetch. Defaults to 10 if not specified. Max of 10000."},"skip":{"type":"integer","description":"The number of categories you\'d like to skip before starting to fetch. Defaults to 0 if not specified."}},"required":["apiKey"]}}},"required":true},"responses":{"200":{"description":"A dictionary with a \\"categories\\" property that contains an array of tag objects. There\'s also a \\"hasMore\\" property that specifies whether this query returns more categories than the limit.","content":{"application/json":{"schema":{"type":"object","properties":{"categories":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","description":"A unique identifier for the category."},"board":{"type":"object","properties":{"id":{"type":"string","description":"A unique identifier for the board."},"created":{"type":"string","description":"Time at which the board was created, in ISO 8601 format."},"isPrivate":{"type":"boolean","description":"Whether or not the board is set as private in the administrative settings."},"name":{"type":"string","description":"The board\'s name."},"postCount":{"type":"integer","description":"The number of non-deleted posts associated with the board. This number includes posts that are marked as closed or complete."},"privateComments":{"type":"boolean","description":"Whether or not comments left on posts can be viewed by other end-users."},"url":{"type":"string","description":"The URL to the board\'s page."}},"description":"The board this category is associated with."},"created":{"type":"string","description":"Time at which the category was created, in ISO 8601 format."},"name":{"type":"string","description":"The name of the category."},"parentID":{"type":"string","description":"The id of the parent category. If this category is not a sub category, this field will be null."},"postCount":{"type":"integer","description":"The number of posts that have been assigned this category."},"url":{"type":"string","description":"The URL to the board, filtered to just posts that have been assigned this category."}}}},"hasMore":{"type":"boolean","description":"Specifies whether this query returns more categories than the limit."}}}}}}}} }\n\ninto a js function, the function must be as follows:\n// the `invoker` function do the real invocation\nasync (invoker: (req:{ path: string; method: string; headers?: { [key: string]: string }; query?: { [key: string]: string }; params?: { [key: string]: string }; files?: { [key: string]: any }; body?: any; form?: any;})=>Promise<{ apiResult: any; headers?: { [key: string]: string }; status?: number; statusText?: string;}>, ...apiParams) {...; const json = await invoker(...); ...; return apiResult; }\n\nplease generate the js function with **full implementation and error handling**! output a single-line json object:\n{"funName":"function name", "params":["invoker", ...apiParams]"documents":"formal js function documentation with description of params and response object with **all properties elaborated** exactly same as the API doc", "fullCode":"(invoker, ...)=>{...; const json = await invoker(...); ...; return apiResult;}"}', - '{"funName":"listCategories","params":["invoker","apiKey","boardID","limit","skip"],"documents":"This function lists categories based on the provided API key, board ID, limit, and skip parameters.\\n\\nParameters:\\n- `invoker`: A function that performs the actual API call.\\n- `apiKey`: Your secret API key.\\n- `boardID`: The id of the board you\'d like to fetch categories for.\\n- `limit`: The number of categories you\'d like to fetch. Defaults to 10 if not specified. Max of 10000.\\n- `skip`: The number of categories you\'d like to skip before starting to fetch. Defaults to 0 if not specified.\\n\\nReturns:\\nAn object containing the categories and a hasMore property that specifies whether this query returns more categories than the limit.","fullCode":"(invoker, apiKey, boardID, limit = 10, skip = 0) => {\\n const reqBody = {\\n apiKey, boardID,\\n limit: Math.min(Math.max(limit, 0), 10000),\\n skip: Math.max(skip, 0)\\n };\\n const resp = await invoker({\\n path: \'/categories/list\',\\n method: \'POST\',\\n body: reqBody\\n });\\n if (resp.status !== 200) {\\n throw new Error(`API request failed with status ${resp.status}: ${resp.statusText}`);\\n }\\n return resp.result;\\n}"}', - ), + // addLlmCache( + // 1, + // 'api2Function', + // 'Please convert below API doc of format restAPI:\n{ "POST:/boards/list": {"summary":"List all boards","requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"apiKey":{"type":"string","description":"Your secret API key."}},"required":["apiKey"]}}},"required":true},"responses":{"200":{"description":"A dictionary with a \\"boards\\" property that contains an array of board objects.","content":{"application/json":{"schema":{"type":"object","properties":{"boards":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","description":"A unique identifier for the board."},"created":{"type":"string","description":"Time at which the board was created, in ISO 8601 format."},"isPrivate":{"type":"boolean","description":"Whether or not the board is set as private in the administrative settings."},"name":{"type":"string","description":"The board\'s name."},"postCount":{"type":"integer","description":"The number of non-deleted posts associated with the board. This number includes posts that are marked as closed or complete."},"privateComments":{"type":"boolean","description":"Whether or not comments left on posts can be viewed by other end-users."},"url":{"type":"string","description":"The URL to the board\'s page."}}}},"hasMore":{"type":"boolean","description":"Specifies whether this query returns more boards than the limit."}}}}}}}} }\n\ninto a js function, the function must be as follows:\n// the `invoker` function do the real invocation\nasync (invoker: (req:{ path: string; method: string; headers?: { [key: string]: string }; query?: { [key: string]: string }; params?: { [key: string]: string }; files?: { [key: string]: any }; body?: any; form?: any;})=>Promise<{ apiResult: any; headers?: { [key: string]: string }; status?: number; statusText?: string;}>, ...apiParams) {...; const json = await invoker(...); ...; return apiResult; }\n\nplease generate the js function with **full implementation and error handling**! output a single-line json object:\n{"funName":"function name", "params":["invoker", ...apiParams]"documents":"formal js function documentation with description of params and response object with **all properties elaborated** exactly same as the API doc", "fullCode":"(invoker, ...)=>{...; const json = await invoker(...); ...; return apiResult;}"}', + // '{"funName":"listBoards","params":["invoker","apiKey"],"documents":"This function lists all boards.\\n\\n@param {Function} invoker - A function that makes the actual API call.\\n@param {string} apiKey - Your secret API key.\\n\\n@returns {Promise} A promise that resolves to an object containing the API result.\\n@property {Array} boards - An array of board objects.\\n@property {string} boards[].id - A unique identifier for the board.\\n@property {string} boards[].created - Time at which the board was created, in ISO 8601 format.\\n@property {boolean} boards[].isPrivate - Whether or not the board is set as private in the administrative settings.\\n@property {string} boards[].name - The board\'s name.\\n@property {number} boards[].postCount - The number of non-deleted posts associated with the board. This number includes posts that are marked as closed or complete.\\n@property {boolean} boards[].privateComments - Whether or not comments left on posts can be viewed by other end-users.\\n@property {string} boards[].url - The URL to the board\'s page.\\n@property {boolean} hasMore - Specifies whether this query returns more boards than the limit.","fullCode":"(invoker, apiKey) => {\\n const requestBody = {\\n apiKey\\n };\\n const options = {\\n method: \'POST\',\\n path: \'/boards/list\',\\n body: JSON.stringify(requestBody),\\n headers: {\'Content-Type\': \'application/json\'},\\n };\\n try {\\n const json = await invoker(options);\\n if (json.status !== 200) {\\n throw new Error(Request failed with status ${json.status});\\n }\\n return json.apiResult;\\n } catch (error) {\\n console.error(error);\\n throw error;\\n }\\n}"}', + // ), + // addLlmCache( + // 2, + // 'api2Function', + // 'Please convert below API doc of format restAPI:\n{ "POST:/boards/retrieve": {"summary":"Retrieve board","requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"apiKey":{"type":"string","description":"Your secret API key."},"id":{"type":"string","description":"The board\'s unique identifier."}},"required":["apiKey","id"]}}},"required":true},"responses":{"200":{"description":"Returns a board object, if a valid id was supplied.","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string","description":"A unique identifier for the board."},"created":{"type":"string","description":"Time at which the board was created, in ISO 8601 format."},"isPrivate":{"type":"boolean","description":"Whether or not the board is set as private in the administrative settings."},"name":{"type":"string","description":"The board\'s name."},"postCount":{"type":"integer","description":"The number of non-deleted posts associated with the board. This number includes posts that are marked as closed or complete."},"privateComments":{"type":"boolean","description":"Whether or not comments left on posts can be viewed by other end-users."},"url":{"type":"string","description":"The URL to the board\'s page."}}}}}}}} }\n\ninto a js function, the function must be as follows:\n// the `invoker` function do the real invocation\nasync (invoker: (req:{ path: string; method: string; headers?: { [key: string]: string }; query?: { [key: string]: string }; params?: { [key: string]: string }; files?: { [key: string]: any }; body?: any; form?: any;})=>Promise<{ apiResult: any; headers?: { [key: string]: string }; status?: number; statusText?: string;}>, ...apiParams) {...; const json = await invoker(...); ...; return apiResult; }\n\nplease generate the js function with **full implementation and error handling**! output a single-line json object:\n{"funName":"function name", "params":["invoker", ...apiParams]"documents":"formal js function documentation with description of params and response object with **all properties elaborated** exactly same as the API doc", "fullCode":"(invoker, ...)=>{...; const json = await invoker(...); ...; return apiResult;}"}', + // '{"funName":"retrieveBoard","params":["invoker","apiKey","id"],"documents":"This function retrieves a board object given a valid API key and board ID.\\n\\nParameters:\\n- invoker: A function that performs the actual API call.\\n- apiKey: Your secret API key.\\n- pk: The board\'s unique identifier.\\n\\nReturns:\\nAn object containing the board details if a valid id was supplied. The object properties are:\\n- pk: A unique identifier for the board.\\n- created: Time at which the board was created, in ISO 8601 format.\\n- isPrivate: Whether or not the board is set as private in the administrative settings.\\n- name: The board\'s name.\\n- postCount: The number of non-deleted posts associated with the board. This number includes posts that are marked as closed or complete.\\n- privateComments: Whether or not comments left on posts can be viewed by other end-users.\\n- url: The URL to the board\'s page.","fullCode":"(invoker, apiKey, id) => {\\n const req = {\\n path: \'/boards/retrieve\',\\n method: \'POST\',\\n headers: { \'Content-Type\': \'application/json\' },\\n body: JSON.stringify({\\n apiKey, id\\n })\\n };\\n try {\\n const resp = await invoker(req);\\n if (resp.status !== 200) {\\n throw new Error(`Failed to retrieve board. Status: ${resp.status}`);\\n }\\n return resp.result;\\n } catch (error) {\\n console.error(error);\\n throw error;\\n }\\n}"}', + // ), + // addLlmCache( + // 3, + // 'api2Function', + // 'Please convert below API doc of format restAPI:\n{ "POST:/categories/list": {"summary":"List categories","requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"apiKey":{"type":"string","description":"Your secret API key."},"boardID":{"type":"string","description":"The id of the board you\'d like to fetch categories for."},"limit":{"type":"integer","description":"The number of categories you\'d like to fetch. Defaults to 10 if not specified. Max of 10000."},"skip":{"type":"integer","description":"The number of categories you\'d like to skip before starting to fetch. Defaults to 0 if not specified."}},"required":["apiKey"]}}},"required":true},"responses":{"200":{"description":"A dictionary with a \\"categories\\" property that contains an array of tag objects. There\'s also a \\"hasMore\\" property that specifies whether this query returns more categories than the limit.","content":{"application/json":{"schema":{"type":"object","properties":{"categories":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","description":"A unique identifier for the category."},"board":{"type":"object","properties":{"id":{"type":"string","description":"A unique identifier for the board."},"created":{"type":"string","description":"Time at which the board was created, in ISO 8601 format."},"isPrivate":{"type":"boolean","description":"Whether or not the board is set as private in the administrative settings."},"name":{"type":"string","description":"The board\'s name."},"postCount":{"type":"integer","description":"The number of non-deleted posts associated with the board. This number includes posts that are marked as closed or complete."},"privateComments":{"type":"boolean","description":"Whether or not comments left on posts can be viewed by other end-users."},"url":{"type":"string","description":"The URL to the board\'s page."}},"description":"The board this category is associated with."},"created":{"type":"string","description":"Time at which the category was created, in ISO 8601 format."},"name":{"type":"string","description":"The name of the category."},"parentID":{"type":"string","description":"The id of the parent category. If this category is not a sub category, this field will be null."},"postCount":{"type":"integer","description":"The number of posts that have been assigned this category."},"url":{"type":"string","description":"The URL to the board, filtered to just posts that have been assigned this category."}}}},"hasMore":{"type":"boolean","description":"Specifies whether this query returns more categories than the limit."}}}}}}}} }\n\ninto a js function, the function must be as follows:\n// the `invoker` function do the real invocation\nasync (invoker: (req:{ path: string; method: string; headers?: { [key: string]: string }; query?: { [key: string]: string }; params?: { [key: string]: string }; files?: { [key: string]: any }; body?: any; form?: any;})=>Promise<{ apiResult: any; headers?: { [key: string]: string }; status?: number; statusText?: string;}>, ...apiParams) {...; const json = await invoker(...); ...; return apiResult; }\n\nplease generate the js function with **full implementation and error handling**! output a single-line json object:\n{"funName":"function name", "params":["invoker", ...apiParams]"documents":"formal js function documentation with description of params and response object with **all properties elaborated** exactly same as the API doc", "fullCode":"(invoker, ...)=>{...; const json = await invoker(...); ...; return apiResult;}"}', + // '{"funName":"listCategories","params":["invoker","apiKey","boardID","limit","skip"],"documents":"This function lists categories based on the provided API key, board ID, limit, and skip parameters.\\n\\nParameters:\\n- `invoker`: A function that performs the actual API call.\\n- `apiKey`: Your secret API key.\\n- `boardID`: The id of the board you\'d like to fetch categories for.\\n- `limit`: The number of categories you\'d like to fetch. Defaults to 10 if not specified. Max of 10000.\\n- `skip`: The number of categories you\'d like to skip before starting to fetch. Defaults to 0 if not specified.\\n\\nReturns:\\nAn object containing the categories and a hasMore property that specifies whether this query returns more categories than the limit.","fullCode":"(invoker, apiKey, boardID, limit = 10, skip = 0) => {\\n const reqBody = {\\n apiKey, boardID,\\n limit: Math.min(Math.max(limit, 0), 10000),\\n skip: Math.max(skip, 0)\\n };\\n const resp = await invoker({\\n path: \'/categories/list\',\\n method: \'POST\',\\n body: reqBody\\n });\\n if (resp.status !== 200) {\\n throw new Error(`API request failed with status ${resp.status}: ${resp.statusText}`);\\n }\\n return resp.result;\\n}"}', + // ), addLlmCache( 4, 'map2Function', 'given below service functions:\nclass new-test-callgent {\n "function name: POST:/boards/list": {"params":[invoker,apiKey], "documents":"This function lists all boards.\n\n@param {Function} invoker - A function that makes the actual API call.\n@param {string} apiKey - Your secret API key.\n\n@returns {Promise} A promise that resolves to an object containing the API result.\n@property {Array} boards - An array of board objects.\n@property {string} boards[].id - A unique identifier for the board.\n@property {string} boards[].created - Time at which the board was created, in ISO 8601 format.\n@property {boolean} boards[].isPrivate - Whether or not the board is set as private in the administrative settings.\n@property {string} boards[].name - The board\'s name.\n@property {number} boards[].postCount - The number of non-deleted posts associated with the board. This number includes posts that are marked as closed or complete.\n@property {boolean} boards[].privateComments - Whether or not comments left on posts can be viewed by other end-users.\n@property {string} boards[].url - The URL to the board\'s page.\n@property {boolean} hasMore - Specifies whether this query returns more boards than the limit."},\n\n}\nand an service `invoker` function.\n\nPlease choose one function to fulfill below request:\n{\n"requesting function": "POST:/boards/list",\n"request from": "restAPI",\n"request_object": {"url":"/boards/list","method":"POST","headers":{"host":"127.0.0.1:3300","connection":"close","content-length":"0"},"query":{}},\n}\nand code for request_object to chosen function args mapping. if any data missing/unclear/ambiguous from request_object to invocation args, please ask question to the caller in below json.question field.\n\noutput a single-line json object:\n{ "funName": "the function name to be invoked", "params":"param names of the chosen function", "mapping": "the js function (invoker, request_object)=>{...;return functionArgsArray;}, full implementation to return the **real** args from request_object to invoke the chosen service function. don\'t use data not exist or ambiguous in request", "question": "question to ask the caller if anything not sure or missing for request to args mapping, *no* guess or assumption of the mapping. null if the mapping is crystal clear." }"}', '{"funName":"POST:/boards/list","params":["invoker","apiKey"],"mapping":"(invoker, request_object)=>{ let apiKey = request_object.params.ids; return [invoker, apiKey]; }","question":"What is the API key for this request? It is not provided in the request_object."}', ), - addLlmCache( - 5, - 'api2Function', - 'Please convert below API doc of format restAPI:\n{ "GET:/positions": {"summary":"List all job positions","description":"Retrieve a list of all available job positions.","operationId":"listPositions","responses":{"200":{"description":"A list of job positions","content":{"application/json":{"schema":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","description":"Unique identifier for the job position"},"title":{"type":"string","description":"Title of the job position"},"description":{"type":"string","description":"Description of the job position"},"location":{"type":"string","description":"Location of the job position"},"requirements":{"type":"array","items":{"type":"string"},"description":"List of requirements for the job position"},"createdAt":{"type":"string","format":"date-time","description":"Timestamp when the job position was created"},"updatedAt":{"type":"string","format":"date-time","description":"Timestamp when the job position was last updated"}}}}}}},"500":{"description":"Internal Server Error"}}} }\n\ninto a js function, the function must be as follows:\n// the `invoker` function do the real invocation\nasync (invoker: (req:{ path: string; method: string; headers?: { [key: string]: string }; query?: { [key: string]: string }; params?: { [key: string]: string }; files?: { [key: string]: any }; body?: any; form?: any;})=>Promise<{ apiResult: any; headers?: { [key: string]: string }; status?: number; statusText?: string;}>, ...apiParams) {...; const json = await invoker(...); ...; return apiResult; }\n\nplease generate the js function with **full implementation and error handling**! output a single-line json object:\n{"funName":"function name", "params":["invoker", ...apiParams]"documents":"formal js function documentation with description of params and response object with **all properties elaborated** exactly same as the API doc", "fullCode":"(invoker, ...)=>{...; const json = await invoker(...); ...; return apiResult;}"}', - '{"funName":"listPositions","params":["invoker"],"documents":"/**\n * List all job positions\n * Retrieve a list of all available job positions.\n * @param {Function} invoker - The function that performs the real invocation.\n * @returns {Promise} - A promise that resolves to an object containing the API result.\n * @property {Array} apiResult - A list of job positions.\n * @property {string} apiResult[].id - Unique identifier for the job position.\n * @property {string} apiResult[].title - Title of the job position.\n * @property {string} apiResult[].description - Description of the job position.\n * @property {string} apiResult[].location - Location of the job position.\n * @property {Array} apiResult[].requirements - List of requirements for the job position.\n * @property {string} apiResult[].createdAt - Timestamp when the job position was created.\n * @property {string} apiResult[].updatedAt - Timestamp when the job position was last updated.\n */","fullCode":"async (invoker) => {\n try {\n const json = await invoker({\n path: \'/positions\',\n method: \'GET\'\n });\n if (json.status === 200) {\n return json.apiResult;\n } else if (json.status === 500) {\n throw new Error(\'Internal Server Error\');\n } else {\n throw new Error(\'Unexpected status code: \' + json.status);\n }\n } catch (error) {\n console.error(\'Error fetching job positions:\', error);\n throw error;\n }\n}"}', - ), - addLlmCache( - 6, - 'api2Function', - 'Please convert below API doc of format restAPI:\n{ "GET:/positions/{positionId}": {"summary":"View a specific job position","description":"Retrieve details of a specific job position by its ID.","operationId":"viewPosition","parameters":[{"name":"positionId","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the job position to retrieve"}],"responses":{"200":{"description":"Details of the job position","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string","description":"Unique identifier for the job position"},"title":{"type":"string","description":"Title of the job position"},"description":{"type":"string","description":"Description of the job position"},"location":{"type":"string","description":"Location of the job position"},"requirements":{"type":"array","items":{"type":"string"},"description":"List of requirements for the job position"},"createdAt":{"type":"string","format":"date-time","description":"Timestamp when the job position was created"},"updatedAt":{"type":"string","format":"date-time","description":"Timestamp when the job position was last updated"}}}}}},"404":{"description":"Job position not found"},"500":{"description":"Internal Server Error"}}} }\n\ninto a js function, the function must be as follows:\n// the `invoker` function do the real invocation\nasync (invoker: (req:{ path: string; method: string; headers?: { [key: string]: string }; query?: { [key: string]: string }; params?: { [key: string]: string }; files?: { [key: string]: any }; body?: any; form?: any;})=>Promise<{ apiResult: any; headers?: { [key: string]: string }; status?: number; statusText?: string;}>, ...apiParams) {...; const json = await invoker(...); ...; return apiResult; }\n\nplease generate the js function with **full implementation and error handling**! output a single-line json object:\n{"funName":"function name", "params":["invoker", ...apiParams]"documents":"formal js function documentation with description of params and response object with **all properties elaborated** exactly same as the API doc", "fullCode":"(invoker, ...)=>{...; const json = await invoker(...); ...; return apiResult;}"}', - '{"funName":"viewPosition","params":["invoker","positionId"],"documents":"/**\\n * View a specific job position\\n * Retrieve details of a specific job position by its ID.\\n * @param {Function} invoker - The function that performs the real invocation.\\n * @param {string} positionId - The ID of the job position to retrieve.\\n * @returns {Promise} - A promise that resolves to the job position details.\\n * @property {string} id - Unique identifier for the job position.\\n * @property {string} title - Title of the job position.\\n * @property {string} description - Description of the job position.\\n * @property {string} location - Location of the job position.\\n * @property {Array} requirements - List of requirements for the job position.\\n * @property {string} createdAt - Timestamp when the job position was created.\\n * @property {string} updatedAt - Timestamp when the job position was last updated.\\n */","fullCode":"async (invoker, positionId) => {\\n try {\\n const json = await invoker({\\n path: `/positions/${positionId}`,\\n method: \'GET\',\\n params: { positionId }\\n });\\n if (json.status === 200) {\\n return json.apiResult;\\n } else if (json.status === 404) {\\n throw new Error(\'Job position not found\');\\n } else if (json.status === 500) {\\n throw new Error(\'Internal Server Error\');\\n }\\n } catch (error) {\\n throw new Error(`Error fetching job position: ${error.message}`);\\n }\\n}"}', - ), - addLlmCache( - 7, - 'api2Function', - 'Please convert below API doc of format restAPI:\n{ "POST:/positions/{positionId}/apply": {"summary":"Apply for a position","description":"Submit an application for a specific job position.","operationId":"applyForPosition","parameters":[{"name":"positionId","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the job position to apply for"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"applicantName":{"type":"string","description":"Name of the applicant"},"email":{"type":"string","format":"email","description":"Email address of the applicant"},"resume":{"type":"string","format":"binary","description":"Resume of the applicant"},"coverLetter":{"type":"string","description":"Cover letter of the applicant"},"appliedAt":{"type":"string","format":"date-time","description":"Timestamp when the application was submitted"}}}}}},"responses":{"201":{"description":"Application submitted successfully"},"400":{"description":"Invalid input"},"404":{"description":"Job position not found"},"500":{"description":"Internal Server Error"}}} }\n\ninto a js function, the function must be as follows:\n// the `invoker` function do the real invocation\nasync (invoker: (req:{ path: string; method: string; headers?: { [key: string]: string }; query?: { [key: string]: string }; params?: { [key: string]: string }; files?: { [key: string]: any }; body?: any; form?: any;})=>Promise<{ apiResult: any; headers?: { [key: string]: string }; status?: number; statusText?: string;}>, ...apiParams) {...; const json = await invoker(...); ...; return apiResult; }\n\nplease generate the js function with **full implementation and error handling**! output a single-line json object:\n{"funName":"function name", "params":["invoker", ...apiParams]"documents":"formal js function documentation with description of params and response object with **all properties elaborated** exactly same as the API doc", "fullCode":"(invoker, ...)=>{...; const json = await invoker(...); ...; return apiResult;}"}', - '{"funName":"applyForPosition","params":["invoker","positionId","applicantName","email","resume","coverLetter","appliedAt"],"documents":"/**\\n * Apply for a position\\n * @param {Function} invoker - The function that performs the actual API invocation.\\n * @param {string} positionId - The ID of the job position to apply for.\\n * @param {string} applicantName - Name of the applicant.\\n * @param {string} email - Email address of the applicant.\\n * @param {string} resume - Resume of the applicant.\\n * @param {string} coverLetter - Cover letter of the applicant.\\n * @param {string} appliedAt - Timestamp when the application was submitted.\\n * @returns {Promise<{apiResult: any, headers?: { [key: string]: string }, status?: number, statusText?: string}>} The result of the API call.\\n */","fullCode":"async (invoker, positionId, applicantName, email, resume, coverLetter, appliedAt) => {\\n try {\\n const req = {\\n path: `/positions/${positionId}/apply`,\\n method: \'POST\',\\n headers: {\\n \'Content-Type\': \'application/json\'\\n },\\n body: {\\n applicantName,\\n email,\\n resume,\\n coverLetter,\\n appliedAt\\n }\\n };\\n const json = await invoker(req);\\n if (json.status === 201) {\\n return { apiResult: json.apiResult, headers: json.headers, status: json.status, statusText: json.statusText };\\n } else if (json.status === 400) {\\n throw new Error(\'Invalid input\');\\n } else if (json.status === 404) {\\n throw new Error(\'Job position not found\');\\n } else if (json.status === 500) {\\n throw new Error(\'Internal Server Error\');\\n } else {\\n throw new Error(\'Unknown error\');\\n }\\n } catch (error) {\\n console.error(\'Error applying for position:\', error.message);\\n throw error;\\n }\\n}"}', - ), + // addLlmCache( + // 5, + // 'api2Function', + // 'Please convert below API doc of format restAPI:\n{ "GET:/positions": {"summary":"List all job positions","description":"Retrieve a list of all available job positions.","operationId":"listPositions","responses":{"200":{"description":"A list of job positions","content":{"application/json":{"schema":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","description":"Unique identifier for the job position"},"title":{"type":"string","description":"Title of the job position"},"description":{"type":"string","description":"Description of the job position"},"location":{"type":"string","description":"Location of the job position"},"requirements":{"type":"array","items":{"type":"string"},"description":"List of requirements for the job position"},"createdAt":{"type":"string","format":"date-time","description":"Timestamp when the job position was created"},"updatedAt":{"type":"string","format":"date-time","description":"Timestamp when the job position was last updated"}}}}}}},"500":{"description":"Internal Server Error"}}} }\n\ninto a js function, the function must be as follows:\n// the `invoker` function do the real invocation\nasync (invoker: (req:{ path: string; method: string; headers?: { [key: string]: string }; query?: { [key: string]: string }; params?: { [key: string]: string }; files?: { [key: string]: any }; body?: any; form?: any;})=>Promise<{ apiResult: any; headers?: { [key: string]: string }; status?: number; statusText?: string;}>, ...apiParams) {...; const json = await invoker(...); ...; return apiResult; }\n\nplease generate the js function with **full implementation and error handling**! output a single-line json object:\n{"funName":"function name", "params":["invoker", ...apiParams]"documents":"formal js function documentation with description of params and response object with **all properties elaborated** exactly same as the API doc", "fullCode":"(invoker, ...)=>{...; const json = await invoker(...); ...; return apiResult;}"}', + // '{"funName":"listPositions","params":["invoker"],"documents":"/**\n * List all job positions\n * Retrieve a list of all available job positions.\n * @param {Function} invoker - The function that performs the real invocation.\n * @returns {Promise} - A promise that resolves to an object containing the API result.\n * @property {Array} apiResult - A list of job positions.\n * @property {string} apiResult[].id - Unique identifier for the job position.\n * @property {string} apiResult[].title - Title of the job position.\n * @property {string} apiResult[].description - Description of the job position.\n * @property {string} apiResult[].location - Location of the job position.\n * @property {Array} apiResult[].requirements - List of requirements for the job position.\n * @property {string} apiResult[].createdAt - Timestamp when the job position was created.\n * @property {string} apiResult[].updatedAt - Timestamp when the job position was last updated.\n */","fullCode":"async (invoker) => {\n try {\n const json = await invoker({\n path: \'/positions\',\n method: \'GET\'\n });\n if (json.status === 200) {\n return json.apiResult;\n } else if (json.status === 500) {\n throw new Error(\'Internal Server Error\');\n } else {\n throw new Error(\'Unexpected status code: \' + json.status);\n }\n } catch (error) {\n console.error(\'Error fetching job positions:\', error);\n throw error;\n }\n}"}', + // ), + // addLlmCache( + // 6, + // 'api2Function', + // 'Please convert below API doc of format restAPI:\n{ "GET:/positions/{positionId}": {"summary":"View a specific job position","description":"Retrieve details of a specific job position by its ID.","operationId":"viewPosition","parameters":[{"name":"positionId","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the job position to retrieve"}],"responses":{"200":{"description":"Details of the job position","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string","description":"Unique identifier for the job position"},"title":{"type":"string","description":"Title of the job position"},"description":{"type":"string","description":"Description of the job position"},"location":{"type":"string","description":"Location of the job position"},"requirements":{"type":"array","items":{"type":"string"},"description":"List of requirements for the job position"},"createdAt":{"type":"string","format":"date-time","description":"Timestamp when the job position was created"},"updatedAt":{"type":"string","format":"date-time","description":"Timestamp when the job position was last updated"}}}}}},"404":{"description":"Job position not found"},"500":{"description":"Internal Server Error"}}} }\n\ninto a js function, the function must be as follows:\n// the `invoker` function do the real invocation\nasync (invoker: (req:{ path: string; method: string; headers?: { [key: string]: string }; query?: { [key: string]: string }; params?: { [key: string]: string }; files?: { [key: string]: any }; body?: any; form?: any;})=>Promise<{ apiResult: any; headers?: { [key: string]: string }; status?: number; statusText?: string;}>, ...apiParams) {...; const json = await invoker(...); ...; return apiResult; }\n\nplease generate the js function with **full implementation and error handling**! output a single-line json object:\n{"funName":"function name", "params":["invoker", ...apiParams]"documents":"formal js function documentation with description of params and response object with **all properties elaborated** exactly same as the API doc", "fullCode":"(invoker, ...)=>{...; const json = await invoker(...); ...; return apiResult;}"}', + // '{"funName":"viewPosition","params":["invoker","positionId"],"documents":"/**\\n * View a specific job position\\n * Retrieve details of a specific job position by its ID.\\n * @param {Function} invoker - The function that performs the real invocation.\\n * @param {string} positionId - The ID of the job position to retrieve.\\n * @returns {Promise} - A promise that resolves to the job position details.\\n * @property {string} id - Unique identifier for the job position.\\n * @property {string} title - Title of the job position.\\n * @property {string} description - Description of the job position.\\n * @property {string} location - Location of the job position.\\n * @property {Array} requirements - List of requirements for the job position.\\n * @property {string} createdAt - Timestamp when the job position was created.\\n * @property {string} updatedAt - Timestamp when the job position was last updated.\\n */","fullCode":"async (invoker, positionId) => {\\n try {\\n const json = await invoker({\\n path: `/positions/${positionId}`,\\n method: \'GET\',\\n params: { positionId }\\n });\\n if (json.status === 200) {\\n return json.apiResult;\\n } else if (json.status === 404) {\\n throw new Error(\'Job position not found\');\\n } else if (json.status === 500) {\\n throw new Error(\'Internal Server Error\');\\n }\\n } catch (error) {\\n throw new Error(`Error fetching job position: ${error.message}`);\\n }\\n}"}', + // ), + // addLlmCache( + // 7, + // 'api2Function', + // 'Please convert below API doc of format restAPI:\n{ "POST:/positions/{positionId}/apply": {"summary":"Apply for a position","description":"Submit an application for a specific job position.","operationId":"applyForPosition","parameters":[{"name":"positionId","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the job position to apply for"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"applicantName":{"type":"string","description":"Name of the applicant"},"email":{"type":"string","format":"email","description":"Email address of the applicant"},"resume":{"type":"string","format":"binary","description":"Resume of the applicant"},"coverLetter":{"type":"string","description":"Cover letter of the applicant"},"appliedAt":{"type":"string","format":"date-time","description":"Timestamp when the application was submitted"}}}}}},"responses":{"201":{"description":"Application submitted successfully"},"400":{"description":"Invalid input"},"404":{"description":"Job position not found"},"500":{"description":"Internal Server Error"}}} }\n\ninto a js function, the function must be as follows:\n// the `invoker` function do the real invocation\nasync (invoker: (req:{ path: string; method: string; headers?: { [key: string]: string }; query?: { [key: string]: string }; params?: { [key: string]: string }; files?: { [key: string]: any }; body?: any; form?: any;})=>Promise<{ apiResult: any; headers?: { [key: string]: string }; status?: number; statusText?: string;}>, ...apiParams) {...; const json = await invoker(...); ...; return apiResult; }\n\nplease generate the js function with **full implementation and error handling**! output a single-line json object:\n{"funName":"function name", "params":["invoker", ...apiParams]"documents":"formal js function documentation with description of params and response object with **all properties elaborated** exactly same as the API doc", "fullCode":"(invoker, ...)=>{...; const json = await invoker(...); ...; return apiResult;}"}', + // '{"funName":"applyForPosition","params":["invoker","positionId","applicantName","email","resume","coverLetter","appliedAt"],"documents":"/**\\n * Apply for a position\\n * @param {Function} invoker - The function that performs the actual API invocation.\\n * @param {string} positionId - The ID of the job position to apply for.\\n * @param {string} applicantName - Name of the applicant.\\n * @param {string} email - Email address of the applicant.\\n * @param {string} resume - Resume of the applicant.\\n * @param {string} coverLetter - Cover letter of the applicant.\\n * @param {string} appliedAt - Timestamp when the application was submitted.\\n * @returns {Promise<{apiResult: any, headers?: { [key: string]: string }, status?: number, statusText?: string}>} The result of the API call.\\n */","fullCode":"async (invoker, positionId, applicantName, email, resume, coverLetter, appliedAt) => {\\n try {\\n const req = {\\n path: `/positions/${positionId}/apply`,\\n method: \'POST\',\\n headers: {\\n \'Content-Type\': \'application/json\'\\n },\\n body: {\\n applicantName,\\n email,\\n resume,\\n coverLetter,\\n appliedAt\\n }\\n };\\n const json = await invoker(req);\\n if (json.status === 201) {\\n return { apiResult: json.apiResult, headers: json.headers, status: json.status, statusText: json.statusText };\\n } else if (json.status === 400) {\\n throw new Error(\'Invalid input\');\\n } else if (json.status === 404) {\\n throw new Error(\'Job position not found\');\\n } else if (json.status === 500) {\\n throw new Error(\'Internal Server Error\');\\n } else {\\n throw new Error(\'Unknown error\');\\n }\\n } catch (error) {\\n console.error(\'Error applying for position:\', error.message);\\n throw error;\\n }\\n}"}', + // ), addLlmCache( 8, 'map2Function', - 'given below service APIs:\nservice test-callgent {\n "API: GET /positions": {"endpoint": "GET /positions", "summary":"listPositions: List all job positions", "description":"Retrieve a list of all available job positions.", "params":{}, "responses":{"200":{"description":"A list of job positions","content":{"application/json":{"schema":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","description":"Unique identifier for the job position"},"title":{"type":"string","description":"Title of the job position"},"description":{"type":"string","description":"Description of the job position"},"location":{"type":"string","description":"Location of the job position"},"requirements":{"type":"array","items":{"type":"string"},"description":"List of requirements for the job position"},"createdAt":{"type":"string","format":"date-time","description":"Timestamp when the job position was created"},"updatedAt":{"type":"string","format":"date-time","description":"Timestamp when the job position was last updated"}}}}}}},"500":{"description":"Internal Server Error"}} },\n}\n\nPlease choose one API to fulfill below request:\n{\n"requesting endpoint": "GET /positions",\n"request from": "restAPI",\n"request_object": {"url":"/positions","method":"GET","headers":{"accept":"*/*","accept-encoding":"gzip, deflate, br","cache-control":"no-cache","connection":"keep-alive","host":"127.0.0.1:3000","user-agent":"Apifox/1.0.0 (https://apifox.com)"},"query":{}},\n}\nand code for request_object to chosen function args mapping. if any data missing/unclear/ambiguous from request_object to invocation args, please ask question to the caller in below json.question field.\n\noutput a single-line json object:\n{ "endpoint": "the chosen API endpoint to be invoked", "args":"request params/body/headers/..., with same structure as the signature JSON object(no more args than it), or null if no args needed", "mapping": "if the the request_object is structured (or null if unstructured), generate the js function (request_object)=>{...;return API_signature_args;}, full implementation to return the **real** args from request_object to invoke the API. don\'t use data not exist or ambiguous in request", "question": "question to ask the caller if anything not sure or missing for request to args mapping, *no* guess or assumption of the mapping. null if the mapping is crystal clear." }"}', + 'given below service APIs:\nservice test-callgent {\n "API: GET /positions": {"endpoint": "GET /positions", "summary":"listPositions: List all job positions", "description":"Retrieve a list of all available job positions.", "params":{}, "responses":{"200":{"description":"A list of job positions","content":{"application/json":{"schema":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","description":"Unique identifier for the job position"},"title":{"type":"string","description":"Title of the job position"},"description":{"type":"string","description":"Description of the job position"},"location":{"type":"string","description":"Location of the job position"},"requirements":{"type":"array","items":{"type":"string"},"description":"List of requirements for the job position"},"createdAt":{"type":"string","format":"date-time","description":"Timestamp when the job position was created"},"updatedAt":{"type":"string","format":"date-time","description":"Timestamp when the job position was last updated"}}}}}}},"500":{"description":"Internal Server Error"}} },\n}\n\nPlease choose one API to fulfill below request:\n{\n"requesting endpoint": "GET /positions",\n"request from": "restAPI",\n"request_object": {"url":"/positions","method":"GET","headers":{"accept":"*/*","accept-encoding":"gzip, deflate, br","cache-control":"no-cache","connection":"keep-alive","host":"127.0.0.1:3000","user-agent":"Apifox/1.0.0 (https://apifox.com)"},"query":{}},\n}\nand code for request_object to chosen function args mapping. if any data missing/unclear/ambiguous from request_object to invocation args, please ask question to the caller in below json.question field.\n\noutput a single-line json object:\n{ "endpoint": "the chosen API endpoint to be invoked", "args":"params/body/headers/..., with same structure as the \'params\' JSON object(no more args than it) with additional \'value\' prop, or null if no args needed", "mapping": "if the the request_object is structured (or null if unstructured), generate the js function (request_object)=>{...;return API_signature_args;}, full implementation to return the **real** args from request_object to invoke the API. don\'t use data not exist or ambiguous in request", "question": "question to ask the caller if anything not sure or missing for request to args mapping, *no* guess or assumption of the mapping. null if the mapping is crystal clear." }"}', '{ "endpoint": "GET /positions", "args": null, "mapping": "(request_object)=>{return null;}", "question": null }', ), addLlmCache( diff --git a/src/app.module.ts b/src/app.module.ts index 6b41c02..3e62356 100644 --- a/src/app.module.ts +++ b/src/app.module.ts @@ -20,6 +20,7 @@ import { UsersModule } from './users/users.module'; import { CallgentTreeModule } from './bff/bff-callgent-tree/callgent-tree.module'; import { BffCallgentFunctionsModule } from './bff/callgent-functions/bff-callgent-functions.module'; import { SandboxModule } from './sandbox/sandbox.module'; +import { CallgentHubModule } from './bff/callgent-hub/callgent-hub.module'; @Module({ imports: [ @@ -47,6 +48,7 @@ import { SandboxModule } from './sandbox/sandbox.module'; CallgentTreeModule, BffCallgentFunctionsModule, SandboxModule, + CallgentHubModule, ], controllers: [AppController], providers: [AppService], diff --git a/src/bff/callgent-hub/callgent-hub.controller.spec.ts b/src/bff/callgent-hub/callgent-hub.controller.spec.ts new file mode 100644 index 0000000..3ef2018 --- /dev/null +++ b/src/bff/callgent-hub/callgent-hub.controller.spec.ts @@ -0,0 +1,18 @@ +import { Test, TestingModule } from '@nestjs/testing'; +import { CallgentHubController } from './callgent-hub.controller'; + +describe('CallgentHubController', () => { + let controller: CallgentHubController; + + beforeEach(async () => { + const module: TestingModule = await Test.createTestingModule({ + controllers: [CallgentHubController], + }).compile(); + + controller = module.get(CallgentHubController); + }); + + it('should be defined', () => { + expect(controller).toBeDefined(); + }); +}); diff --git a/src/bff/callgent-hub/callgent-hub.controller.ts b/src/bff/callgent-hub/callgent-hub.controller.ts new file mode 100644 index 0000000..111f499 --- /dev/null +++ b/src/bff/callgent-hub/callgent-hub.controller.ts @@ -0,0 +1,59 @@ +import { Controller, Get, Query } from '@nestjs/common'; +import { + ApiOkResponse, + ApiQuery, + ApiTags, + getSchemaPath, +} from '@nestjs/swagger'; +import { CallgentsService } from '../../callgents/callgents.service'; +import { CallgentDto } from '../../callgents/dto/callgent.dto'; +import { RestApiResponse } from '../../restapi/response.interface'; + +@ApiTags('Hub') +@Controller('hub') +export class CallgentHubController { + constructor(private readonly callgentService: CallgentsService) {} + + @ApiQuery({ name: 'query', required: false, type: String }) + @ApiQuery({ name: 'page', required: false, type: Number }) + @ApiQuery({ name: 'perPage', required: false, type: Number }) + @ApiOkResponse({ + schema: { + anyOf: [ + { $ref: getSchemaPath(RestApiResponse) }, + { + properties: { + data: { + type: 'array', + items: { $ref: getSchemaPath(CallgentDto) }, + }, + }, + }, + ], + }, + }) + @Get('callgents') + async findAll( + @Query() + query: { + queryString?: string; + page?: 1; + perPage?: 10; + // TODO orderBy?: string; + }, + ) { + const where = query.queryString + ? { + name: { contains: query.queryString }, + } + : undefined; + const list = await this.callgentService.findAllInHub({ + page: query.page, + perPage: query.perPage, + where, + // orderBy, + }); + list.data?.forEach((item: any) => (item.children = [])); + return list; + } +} diff --git a/src/bff/callgent-hub/callgent-hub.module.ts b/src/bff/callgent-hub/callgent-hub.module.ts new file mode 100644 index 0000000..8ae9f23 --- /dev/null +++ b/src/bff/callgent-hub/callgent-hub.module.ts @@ -0,0 +1,9 @@ +import { Module } from '@nestjs/common'; +import { CallgentsModule } from '../../callgents/callgents.module'; +import { CallgentHubController } from './callgent-hub.controller'; + +@Module({ + imports: [CallgentsModule], + controllers: [CallgentHubController], +}) +export class CallgentHubModule {} diff --git a/src/callgent-functions/callgent-functions.service.ts b/src/callgent-functions/callgent-functions.service.ts index 8022e9e..d4c36c8 100644 --- a/src/callgent-functions/callgent-functions.service.ts +++ b/src/callgent-functions/callgent-functions.service.ts @@ -133,7 +133,7 @@ export class CallgentFunctionsService { findAll({ select, where, - orderBy = { id: 'desc' }, + orderBy = { pk: 'desc' }, page, perPage, }: { diff --git a/src/callgents/callgents.service.ts b/src/callgents/callgents.service.ts index 45507ac..1454df9 100644 --- a/src/callgents/callgents.service.ts +++ b/src/callgents/callgents.service.ts @@ -54,7 +54,7 @@ export class CallgentsService { findAll({ select, where, - orderBy = { id: 'desc' }, + orderBy = { pk: 'desc' }, page, perPage, }: { @@ -164,23 +164,6 @@ export class CallgentsService { }); } - @Transactional() - async duplicateOverTenancy( - dupId: string, - dto: CreateCallgentDto, - createdBy: string, - ) { - const prisma = this.txHost.tx as PrismaClient; - - await this.tenancyService.bypassTenancy(prisma); - const dup = await prisma.callgent.findUnique({ where: { id: dupId } }); - if (!dup) - throw new NotFoundException('callgent to duplicate not found: ' + dupId); - - await this.tenancyService.bypassTenancy(prisma, false); - return this.create(dto, createdBy, { id: null }); - } - /** * Cross tenancy execution when client endpoint is provided. * [endpoint://]callgent.please('act', with_args) @@ -234,4 +217,44 @@ export class CallgentsService { // pre-meta, pre-routing, pre-mapping } + + /// hub actions + + /** hub are those in tenantPk = -1 */ + private async _onHubAction(fn: () => Promise): Promise { + const tenantPk = this.tenancyService.getTenantId(); + try { + this.tenancyService.setTenantId(-1); + return fn.apply(this); + } finally { + this.tenancyService.setTenantId(tenantPk); + } + } + @Transactional() + async findAllInHub(params: { + select?: Prisma.CallgentSelect; + where?: Prisma.CallgentWhereInput; + orderBy?: Prisma.CallgentOrderByWithRelationInput; + page?: number; + perPage?: number; + }) { + return this._onHubAction(() => this.findAll(params)); + } + + @Transactional() + async duplicateOverTenancy( + dupId: string, + dto: CreateCallgentDto, + createdBy: string, + ) { + const prisma = this.txHost.tx as PrismaClient; + + await this.tenancyService.bypassTenancy(prisma); // FIXME + const dup = await prisma.callgent.findUnique({ where: { id: dupId } }); + if (!dup) + throw new NotFoundException('Callgent to duplicate not found: ' + dupId); + + await this.tenancyService.bypassTenancy(prisma, false); + return this.create(dto, createdBy, { id: null }); + } } diff --git a/src/emails/emails.service.ts b/src/emails/emails.service.ts index 6d78552..6754fd5 100644 --- a/src/emails/emails.service.ts +++ b/src/emails/emails.service.ts @@ -34,10 +34,9 @@ export class EmailsService implements OnModuleInit { sender?: string | { name: string; email: string }, ): Promise { to = this._formalizeEmails(to) as { name: string; email: string }[]; - sender = this._formalizeEmails(sender)[0] as { - name: string; - email: string; - }; + sender = sender + ? this._formalizeEmails(sender)[0] + : (sender = JSON.parse(this.configService.get('EMAIL_DEFAULT_SENDER'))); const content = this.emailTemplates.render(template, { ...context, diff --git a/src/endpoints/endpoints.service.ts b/src/endpoints/endpoints.service.ts index 5d64ebd..16f2326 100644 --- a/src/endpoints/endpoints.service.ts +++ b/src/endpoints/endpoints.service.ts @@ -145,7 +145,7 @@ export class EndpointsService { findAll({ select, where, - orderBy = { id: 'desc' }, + orderBy = { pk: 'desc' }, }: { select?: Prisma.EndpointSelect; where?: Prisma.EndpointWhereInput; diff --git a/src/infra/auth/local/local-auth.controller.ts b/src/infra/auth/local/local-auth.controller.ts index 63c1f49..a58880f 100644 --- a/src/infra/auth/local/local-auth.controller.ts +++ b/src/infra/auth/local/local-auth.controller.ts @@ -5,7 +5,7 @@ import { AuthUtils } from '../auth.utils'; import { JwtAuthService } from '../jwt/jwt.service'; import { LocalAuthGuard } from './local-auth.guard'; -// @ApiTags('authentication') +// @ApiTags('Authentication') // @Controller('auth') export class LocalAuthController { constructor( diff --git a/src/infra/auth/oauth-client/oauth-client.controller.ts b/src/infra/auth/oauth-client/oauth-client.controller.ts index 1d97007..ce1f95e 100644 --- a/src/infra/auth/oauth-client/oauth-client.controller.ts +++ b/src/infra/auth/oauth-client/oauth-client.controller.ts @@ -22,7 +22,7 @@ import { JwtAuthService } from '../jwt/jwt.service'; /** oauth for root user */ @CacheTTL(-1) -@ApiTags('authentication') +@ApiTags('Authentication') @Controller('auth') export class OAuthClientController { private readonly logger = new Logger(OAuthClientController.name); diff --git a/src/infra/repo/tenancy/prisma-tenancy.provider.ts b/src/infra/repo/tenancy/prisma-tenancy.provider.ts index b7866ce..0557e98 100644 --- a/src/infra/repo/tenancy/prisma-tenancy.provider.ts +++ b/src/infra/repo/tenancy/prisma-tenancy.provider.ts @@ -14,7 +14,8 @@ export const prismaTenancyUseFactory = ( async $allOperations({ args, query }) { const tenantPk = store.get(PrismaTenancyService.TENANT_ID_KEY); - if (tenantPk) { + // may be 0 + if (Number.isFinite(tenantPk)) { const existingTx = store.get(getTransactionClsKey()); // 2 ops diff --git a/src/tasks/tasks.service.ts b/src/tasks/tasks.service.ts index 58a22e1..db1517a 100644 --- a/src/tasks/tasks.service.ts +++ b/src/tasks/tasks.service.ts @@ -82,7 +82,7 @@ export class TasksService { findAll({ select, where, - orderBy = { id: 'desc' }, + orderBy = { pk: 'desc' }, page, perPage, }: { diff --git a/src/users/auth.controller.ts b/src/users/auth.controller.ts index 75a0d31..3fe5a23 100644 --- a/src/users/auth.controller.ts +++ b/src/users/auth.controller.ts @@ -18,7 +18,7 @@ import { UpdateUserDto } from './dto/update-user.dto'; import { UsersService } from './users.service'; @CacheTTL(0) -@ApiTags('authentication') +@ApiTags('Authentication') @Controller('auth') export class AuthController extends LocalAuthController { constructor( From cbe4624596dd49564e5a621e4cf2abb5905f61b6 Mon Sep 17 00:00:00 2001 From: dev-callgent Date: Wed, 18 Sep 2024 16:45:37 +0800 Subject: [PATCH 063/183] fix: http status code must positive Signed-off-by: dev-callgent --- .../adaptors/builtin/restapi/restapi.controller.ts | 14 ++++++++------ src/endpoints/events/client-request.event.ts | 2 +- src/event-listeners/event-object.ts | 2 +- 3 files changed, 10 insertions(+), 8 deletions(-) diff --git a/src/endpoints/adaptors/builtin/restapi/restapi.controller.ts b/src/endpoints/adaptors/builtin/restapi/restapi.controller.ts index 236134f..4cf6ef6 100644 --- a/src/endpoints/adaptors/builtin/restapi/restapi.controller.ts +++ b/src/endpoints/adaptors/builtin/restapi/restapi.controller.ts @@ -8,6 +8,7 @@ import { NotFoundException, Param, Req, + Res, UseGuards, } from '@nestjs/common'; import { ApiHeader, ApiOperation, ApiParam, ApiTags } from '@nestjs/swagger'; @@ -61,6 +62,7 @@ export class RestApiController { @All(':id/:endpointId/invoke/api/*') async execute( @Req() req, + @Res() res, @Param('id') callgentId: string, @Param('endpointId') endpointId?: string, @Headers('x-callgent-taskId') taskId?: string, @@ -72,7 +74,7 @@ export class RestApiController { let funName = req.url.substr(req.url.indexOf(basePath) + basePath.length); if (funName) funName = Utils.formalApiName(req.method, '/' + funName); - const caller = req.user?.sub || req.ip || req.socket.remoteAddress; + const callerId = req.user?.sub; // || req.ip || req.socket.remoteAddress; // TODO owner defaults to caller callgent // find callgent cep, then set tenantPk const cep = await this.endpointsService.$findFirstByType( @@ -95,7 +97,7 @@ export class RestApiController { new ClientRequestEvent(cep.id, taskId, cep.adaptorKey, callback, { callgentId, callgentName: callgent.name, - caller, + callerId, progressive, funName, req, @@ -103,10 +105,10 @@ export class RestApiController { parseInt(timeout) || 0, // sync timeout ); // FIXME data - if (0 <= statusCode && statusCode < 400) - return { data, statusCode, message }; - - throw new HttpException(message, statusCode); + res + .status(statusCode < 0 ? 418 : statusCode < 200 ? 200 : statusCode) + .send({ data, statusCode, message }); + // code cannot < 0 } @ApiOperation({ diff --git a/src/endpoints/events/client-request.event.ts b/src/endpoints/events/client-request.event.ts index ac21c40..789d171 100644 --- a/src/endpoints/events/client-request.event.ts +++ b/src/endpoints/events/client-request.event.ts @@ -21,7 +21,7 @@ export class ClientRequestEvent extends EventObject { callgentId: string; callgentName: string; /** empty means anonymous */ - caller?: string; + callerId?: string; req?: JsonValue; resp?: JsonValue; /** requested callgent function name */ diff --git a/src/event-listeners/event-object.ts b/src/event-listeners/event-object.ts index bc7a6fd..b4f7891 100644 --- a/src/event-listeners/event-object.ts +++ b/src/event-listeners/event-object.ts @@ -16,7 +16,7 @@ export class EventObject { this.id = Utils.uuid(); } public readonly id: string; - public statusCode = 1; // for response only + public statusCode = 1; // readonly, for response public readonly context: { [key: string]: any } = {}; public message: string; public stopPropagation = false; From 189e3c9c21273af158c6c763f16c6a5cc67d7d01 Mon Sep 17 00:00:00 2001 From: dev-callgent Date: Wed, 18 Sep 2024 17:36:02 +0800 Subject: [PATCH 064/183] feat: callgent auth Signed-off-by: dev-callgent --- .env.dev | 2 +- .../0_row_level_security/migration.sql | 18 +- .../migration.sql | 39 ++++ prisma/schema.prisma | 76 +++---- prisma/seed.ts | 31 ++- src/app.module.ts | 10 +- .../callgent-tree.controller.ts | 5 +- .../bff-callgent-functions.controller.ts | 21 +- .../callgent-functions.controller.ts | 4 +- .../callgent-functions.service.ts | 26 ++- src/callgent-realms/callgent-realms.module.ts | 14 ++ .../callgent-realms.service.spec.ts | 18 ++ .../callgent-realms.service.ts | 185 ++++++++++++++++++ src/callgent-realms/dto/realm-scheme.vo.ts | 22 +++ .../processors/api-key-auth.processor.ts | 52 +++++ .../processors/auth-processor.base.ts | 77 ++++++++ src/callgents/callgents.service.ts | 7 +- .../adaptors/endpoint-adaptor.base.ts | 10 +- src/endpoints/endpoints.service.ts | 12 -- .../event-listeners.service.ts | 8 +- src/infra/repo/prisma.middlewares.ts | 1 + .../repo/tenancy/prisma-tenancy.provider.ts | 1 + src/users/users.module.ts | 1 + src/users/users.service.ts | 54 +++-- 24 files changed, 579 insertions(+), 115 deletions(-) create mode 100644 prisma/migrations/20240918072319_callgent_realm/migration.sql create mode 100644 src/callgent-realms/callgent-realms.module.ts create mode 100644 src/callgent-realms/callgent-realms.service.spec.ts create mode 100644 src/callgent-realms/callgent-realms.service.ts create mode 100644 src/callgent-realms/dto/realm-scheme.vo.ts create mode 100644 src/callgent-realms/processors/api-key-auth.processor.ts create mode 100644 src/callgent-realms/processors/auth-processor.base.ts diff --git a/.env.dev b/.env.dev index 6970315..bc6a051 100644 --- a/.env.dev +++ b/.env.dev @@ -18,7 +18,7 @@ ALLOW_CORS=1 # CREATE USER callgent WITH PASSWORD 'c@llgent123'; # GRANT ALL PRIVILEGES ON DATABASE callgent TO callgent; -# GRANT USAGE ON SCHEMA public TO callgent; +# GRANT USAGE, CREATE ON SCHEMA public TO callgent; # GRANT SELECT, INSERT, UPDATE, DELETE ON ALL TABLES IN SCHEMA public TO callgent; # GRANT USAGE, SELECT ON ALL SEQUENCES IN SCHEMA public TO callgent; # ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT SELECT, INSERT, UPDATE, DELETE ON TABLES TO callgent; diff --git a/prisma/migrations/0_row_level_security/migration.sql b/prisma/migrations/0_row_level_security/migration.sql index 6fe2b67..645851f 100644 --- a/prisma/migrations/0_row_level_security/migration.sql +++ b/prisma/migrations/0_row_level_security/migration.sql @@ -234,15 +234,15 @@ ALTER TABLE "Task" FORCE ROW LEVEL SECURITY; ALTER TABLE "TaskAction" FORCE ROW LEVEL SECURITY; -- Create row security policies -CREATE POLICY tenant_isolation_policy ON "User" USING (("tenantPk" = 0) OR ("tenantPk" = current_setting('tenancy.tenantPk', TRUE)::int)); -CREATE POLICY tenant_isolation_policy ON "UserIdentity" USING (("tenantPk" = 0) OR ("tenantPk" = current_setting('tenancy.tenantPk', TRUE)::int)); -CREATE POLICY tenant_isolation_policy ON "Callgent" USING (("tenantPk" = 0) OR ("tenantPk" = current_setting('tenancy.tenantPk', TRUE)::int)); -CREATE POLICY tenant_isolation_policy ON "CallgentFunction" USING (("tenantPk" = 0) OR ("tenantPk" = current_setting('tenancy.tenantPk', TRUE)::int)); -CREATE POLICY tenant_isolation_policy ON "Endpoint" USING (("tenantPk" = 0) OR ("tenantPk" = current_setting('tenancy.tenantPk', TRUE)::int)); -CREATE POLICY tenant_isolation_policy ON "EndpointAuth" USING (("tenantPk" = 0) OR ("tenantPk" = current_setting('tenancy.tenantPk', TRUE)::int)); -CREATE POLICY tenant_isolation_policy ON "EventListener" USING (("tenantPk" = 0) OR ("tenantPk" = current_setting('tenancy.tenantPk', TRUE)::int)); -CREATE POLICY tenant_isolation_policy ON "Task" USING (("tenantPk" = 0) OR ("tenantPk" = current_setting('tenancy.tenantPk', TRUE)::int)); -CREATE POLICY tenant_isolation_policy ON "TaskAction" USING (("tenantPk" = 0) OR ("tenantPk" = current_setting('tenancy.tenantPk', TRUE)::int)); +CREATE POLICY tenant_isolation_policy ON "User" USING ("tenantPk" = COALESCE(NULLIF(current_setting('tenancy.tenantPk', TRUE), ''), '0')::int); +CREATE POLICY tenant_isolation_policy ON "UserIdentity" USING ("tenantPk" = COALESCE(NULLIF(current_setting('tenancy.tenantPk', TRUE), ''), '0')::int); +CREATE POLICY tenant_isolation_policy ON "Callgent" USING ("tenantPk" = COALESCE(NULLIF(current_setting('tenancy.tenantPk', TRUE), ''), '0')::int); +CREATE POLICY tenant_isolation_policy ON "CallgentFunction" USING ("tenantPk" = COALESCE(NULLIF(current_setting('tenancy.tenantPk', TRUE), ''), '0')::int); +CREATE POLICY tenant_isolation_policy ON "Endpoint" USING ("tenantPk" = COALESCE(NULLIF(current_setting('tenancy.tenantPk', TRUE), ''), '0')::int); +CREATE POLICY tenant_isolation_policy ON "EndpointAuth" USING ("tenantPk" = COALESCE(NULLIF(current_setting('tenancy.tenantPk', TRUE), ''), '0')::int); +CREATE POLICY tenant_isolation_policy ON "EventListener" USING ("tenantPk" = COALESCE(NULLIF(current_setting('tenancy.tenantPk', TRUE), ''), '0')::int); +CREATE POLICY tenant_isolation_policy ON "Task" USING ("tenantPk" = COALESCE(NULLIF(current_setting('tenancy.tenantPk', TRUE), ''), '0')::int); +CREATE POLICY tenant_isolation_policy ON "TaskAction" USING ("tenantPk" = COALESCE(NULLIF(current_setting('tenancy.tenantPk', TRUE), ''), '0')::int); -- Create policies to bypass RLS (optional) CREATE POLICY bypass_rls_policy ON "User" USING (current_setting('tenancy.bypass_rls', TRUE)::text = 'on'); diff --git a/prisma/migrations/20240918072319_callgent_realm/migration.sql b/prisma/migrations/20240918072319_callgent_realm/migration.sql new file mode 100644 index 0000000..e54c5d2 --- /dev/null +++ b/prisma/migrations/20240918072319_callgent_realm/migration.sql @@ -0,0 +1,39 @@ +/* + Warnings: + + - You are about to drop the `EndpointAuth` table. If the table is not empty, all the data it contains will be lost. + +*/ + +-- AlterTable +ALTER TABLE "CallgentFunction" ADD COLUMN "securities" JSON; + +-- AlterTable +ALTER TABLE "Endpoint" ADD COLUMN "securities" JSON; + +-- DropTable +DROP TABLE "EndpointAuth"; + +-- DropEnum +DROP TYPE "EndpointAuthType"; + +-- CreateTable +CREATE TABLE "CallgentRealm" ( + "pk" SERIAL NOT NULL, + "callgentId" VARCHAR(36) NOT NULL, + "authType" VARCHAR(16) NOT NULL, + "provider" VARCHAR(64) NOT NULL, + "realm" VARCHAR(16) NOT NULL DEFAULT '', + "scheme" JSON, + "secret" JSON, + "perUser" BOOLEAN NOT NULL DEFAULT false, + "enabled" BOOLEAN NOT NULL DEFAULT true, + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updatedAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "deletedAt" TIMESTAMP(3), + + CONSTRAINT "CallgentRealm_pkey" PRIMARY KEY ("pk") +); + +-- CreateIndex +CREATE INDEX "CallgentRealm_callgentId_idx" ON "CallgentRealm"("callgentId"); diff --git a/prisma/schema.prisma b/prisma/schema.prisma index 95776d7..c7f3585 100644 --- a/prisma/schema.prisma +++ b/prisma/schema.prisma @@ -22,12 +22,14 @@ generator nestjsDto { datasource db { provider = "postgres" url = env("DATABASE_URL") - relationMode = "prisma" + relationMode = "prisma" // no foreign constraints in db, pls add @@index on manually } -// db sharding base on tenantPk: +// # foreign key using pk, instead of id, for better performance + +// # db sharding base on tenantPk: // 1. pk segmentation, ALTER SEQUENCE [表名]_[id]_seq RESTART WITH 1001; -// 2.chard tenant based on tenant_id, eq (0~10000] db1, (10000,20000] db2 +// 2. shard tenant based on tenant_id, eq (0~10000] db1, (10000,20000] db2 //////////////////// Authentication and Account //////////////////////////// @@ -96,7 +98,7 @@ model UserIdentity { /// @DtoUpdateApiResponse /// @DtoPlainApiResponse uid String @db.VarChar(255) /// @description userId from provider. - credentials String @db.VarChar(2048) /// @description user cridentials + credentials String @db.VarChar(2048) /// @description auth secret or token name String? @db.VarChar(255) /// @MinLength(6) /// @IsEmail @@ -117,6 +119,7 @@ model UserIdentity { /// @DtoEntityHidden userId String @db.VarChar(36) + // expiresAt DateTime? @db.Timestamp(0) // @description TODO: token expiration time createdAt DateTime @default(now()) updatedAt DateTime @default(now()) @updatedAt // DONOT FORGET TO ADD the model into `createSoftDeleteMiddleware` @@ -197,6 +200,7 @@ model CallgentFunction { method String @db.VarChar(15) /// @description openAPI method summary String @default("") @db.VarChar(511) description String @default("") @db.VarChar(1023) + securities Json? @db.Json /// @description { realmPK: ["scopes"] } params Json? @db.Json /// @description declaration of API params responses Json? @db.Json /// @description declaration of API responses rawJson Json @db.Json @@ -224,6 +228,34 @@ model CallgentFunction { @@index([endpointId]) } +/// @description security realms for callgent +model CallgentRealm { + pk Int @id @default(autoincrement()) + + // unique realm specified by the 4 fields + callgentId String @db.VarChar(36) + authType String @db.VarChar(16) /// @description auth type, 'apiKey' | 'http' | 'oauth2' | 'openIdConnect' | ..etc. + provider String @db.VarChar(64) /// @description auth provider key, usually the domain of the provider + realm String @default("") @db.VarChar(16) /// @description provider defined realm name + + /// @DtoCastType(RealmSchemeVO, ../dto/realm-scheme.vo) + scheme Json? @db.Json /// @description security scheme, with all public configs + secret Json? @db.Json /// @description security secret, with all private configs + perUser Boolean @default(false) /// @description whether the realm is per user auth + enabled Boolean @default(true) /// @description whether the realm is enabled + + createdAt DateTime @default(now()) + updatedAt DateTime @default(now()) @updatedAt + // DONOT FORGET TO ADD the model into `createSoftDeleteMiddleware` + /// @DtoReadOnly + /// @DtoEntityHidden + deletedAt DateTime? /// @description logical deletion. + + @@index(callgentId) +} + +// model RealmToken merged into UserIdentity + model Task { /// @DtoEntityHidden pk Int @id @default(autoincrement()) @@ -300,6 +332,7 @@ model TaskAction { @@index([taskId]) } +/// @description Platform auth tokens /// @DtoIgnoreModel model AuthToken { /// @DtoEntityHidden @@ -348,6 +381,9 @@ model Endpoint { host String @db.VarChar(2047) /// @description host address, e.g. '/api/callgents/rbhes0-w4rff/{id}/invoke/api/', where `{id}` will be replaced with current endpoint id initParams Json? @db.Json /// @description initializing parameters content Json? @db.Json /// @description generated content/code by init method + /// @DtoReadOnly + /// @DtoPlainApiResponse + securities Json? @db.Json /// @description { realmPK: ["scopes"] } /// @DtoUpdateApiResponse /// @DtoPlainApiResponse @@ -370,38 +406,6 @@ model Endpoint { @@index([callgentId]) } -enum EndpointAuthType { - NONE /// @description no auth, or treat auth as normal progressive params - APP /// @description all task same auth - USER /// @description auth each task owner/assignee -} - -/// @description endpoint app or user auth credentials -model EndpointAuth { - /// @DtoEntityHidden - pk Int @id @default(autoincrement()) - /// @DtoReadOnly - /// @DtoEntityHidden - // add to migration.sql - tenantPk Int @default(dbgenerated("(current_setting('tenancy.tenantPk')::int)")) - - /// @CustomValidator(EntityIdExists, 'endpoint', 'id', ../../infra/repo/validators/entity-exists.validator) - endpointId String @db.VarChar(36) /// @description endpoint id. - userKey String? @db.VarChar(63) /// @description unique user key, e.g. assignee userId - - credentials Json @db.Json /// @description auth credentials - - /// @DtoReadOnly - /// @DtoEntityHidden - createdBy String @db.VarChar(36) - createdAt DateTime @default(now()) - updatedAt DateTime @default(now()) @updatedAt - - @@unique([endpointId, userKey]) - @@index([tenantPk]) - @@index([endpointId]) -} - /// @DtoIgnoreModel model LlmTemplate { /// @DtoEntityHidden diff --git a/prisma/seed.ts b/prisma/seed.ts index 977d812..a294def 100644 --- a/prisma/seed.ts +++ b/prisma/seed.ts @@ -37,7 +37,22 @@ function initEventListeners() { serviceType: 'SERVICE', serviceName: 'EndpointsService', funName: 'preprocessClientRequest', - description: 'Find the CEP, then preprocess the request', + description: + 'Find the CEP, then preprocess the request, replace raw request.', + createdBy: 'GLOBAL', + priority: (priority += 100), + }, + { + pk: elId++, + id: 'CR-CEP-AUTH', + srcId: 'GLOBAL', + tenantPk: 0, + eventType: 'CLIENT_REQUEST', + dataType: '*', + serviceType: 'SERVICE', + serviceName: 'CallgentRealmsService', + funName: 'checkCepAuth', + description: 'Auth-check before cep invocation.', createdBy: 'GLOBAL', priority: (priority += 100), }, @@ -86,6 +101,20 @@ function initEventListeners() { createdBy: 'GLOBAL', priority: (priority += 100), }, + { + pk: elId++, + id: 'CR-SEP-AUTH', + srcId: 'GLOBAL', + tenantPk: 0, + eventType: 'CLIENT_REQUEST', + dataType: '*', + serviceType: 'SERVICE', + serviceName: 'CallgentRealmsService', + funName: 'checkSepAuth', + description: 'Auth-check before sep invocation.', + createdBy: 'GLOBAL', + priority: (priority += 100), + }, { pk: elId++, id: 'CR-INVOKE-SEP', diff --git a/src/app.module.ts b/src/app.module.ts index 3e62356..66eb8a6 100644 --- a/src/app.module.ts +++ b/src/app.module.ts @@ -5,7 +5,11 @@ import { AgentsModule } from './agents/agents.module'; import { AppController } from './app.controller'; import { AppService } from './app.service'; import { AuthTokensModule } from './auth-tokens/auth-tokens.module'; +import { CallgentTreeModule } from './bff/bff-callgent-tree/callgent-tree.module'; +import { BffCallgentFunctionsModule } from './bff/callgent-functions/bff-callgent-functions.module'; +import { CallgentHubModule } from './bff/callgent-hub/callgent-hub.module'; import { CallgentFunctionsModule } from './callgent-functions/callgent-functions.module'; +import { CallgentRealmsModule } from './callgent-realms/callgent-realms.module'; import { CallgentsModule } from './callgents/callgents.module'; import { EmailsModule } from './emails/emails.module'; import { EndpointsModule } from './endpoints/endpoints.module'; @@ -14,13 +18,10 @@ import { EventStoresModule } from './event-stores/event-stores.module'; import { AuthModule } from './infra/auth/auth.module'; import { LoggingModule } from './infra/logging/logging.module'; import { ReposModule } from './infra/repo/repos.module'; +import { SandboxModule } from './sandbox/sandbox.module'; import { TaskActionsModule } from './task-actions/task-actions.module'; import { TasksModule } from './tasks/tasks.module'; import { UsersModule } from './users/users.module'; -import { CallgentTreeModule } from './bff/bff-callgent-tree/callgent-tree.module'; -import { BffCallgentFunctionsModule } from './bff/callgent-functions/bff-callgent-functions.module'; -import { SandboxModule } from './sandbox/sandbox.module'; -import { CallgentHubModule } from './bff/callgent-hub/callgent-hub.module'; @Module({ imports: [ @@ -49,6 +50,7 @@ import { CallgentHubModule } from './bff/callgent-hub/callgent-hub.module'; BffCallgentFunctionsModule, SandboxModule, CallgentHubModule, + CallgentRealmsModule, ], controllers: [AppController], providers: [AppService], diff --git a/src/bff/bff-callgent-tree/callgent-tree.controller.ts b/src/bff/bff-callgent-tree/callgent-tree.controller.ts index f8bffb3..96e62d2 100644 --- a/src/bff/bff-callgent-tree/callgent-tree.controller.ts +++ b/src/bff/bff-callgent-tree/callgent-tree.controller.ts @@ -10,7 +10,7 @@ import { Req, UseGuards, } from '@nestjs/common'; -import { ApiTags } from '@nestjs/swagger'; +import { ApiSecurity, ApiTags } from '@nestjs/swagger'; import { CallgentFunctionsService } from '../../callgent-functions/callgent-functions.service'; import { CallgentsService } from '../../callgents/callgents.service'; import { CallgentDto } from '../../callgents/dto/callgent.dto'; @@ -18,7 +18,8 @@ import { CreateCallgentDto } from '../../callgents/dto/create-callgent.dto'; import { EndpointsService } from '../../endpoints/endpoints.service'; import { JwtGuard } from '../../infra/auth/jwt/jwt.guard'; -@ApiTags('bff') +@ApiTags('BFF') +@ApiSecurity('defaultBearerAuth') @UseGuards(JwtGuard) @Controller('bff') export class CallgentTreeController { diff --git a/src/bff/callgent-functions/bff-callgent-functions.controller.ts b/src/bff/callgent-functions/bff-callgent-functions.controller.ts index 66f70eb..59fe55e 100644 --- a/src/bff/callgent-functions/bff-callgent-functions.controller.ts +++ b/src/bff/callgent-functions/bff-callgent-functions.controller.ts @@ -1,21 +1,12 @@ -import { - BadRequestException, - Body, - Controller, - Inject, - Post, - Req, - UseGuards, -} from '@nestjs/common'; -import { ApiTags } from '@nestjs/swagger'; +import { Body, Controller, Inject, Post, Req, UseGuards } from '@nestjs/common'; +import { ApiOperation, ApiSecurity, ApiTags } from '@nestjs/swagger'; import { CallgentApiText } from '../../callgent-functions/callgent-functions.controller'; import { CallgentFunctionsService } from '../../callgent-functions/callgent-functions.service'; import { EndpointDto } from '../../endpoints/dto/endpoint.dto'; import { JwtGuard } from '../../infra/auth/jwt/jwt.guard'; import { EntityIdExists } from '../../infra/repo/validators/entity-exists.validator'; -import { EndpointType } from '@prisma/client'; - -@ApiTags('bff') +@ApiTags('BFF') +@ApiSecurity('defaultBearerAuth') @UseGuards(JwtGuard) @Controller('bff/callgent-functions') export class BffCallgentFunctionsController { @@ -24,6 +15,10 @@ export class BffCallgentFunctionsController { private readonly callgentFunctionService: CallgentFunctionsService, ) {} + @ApiOperation({ + summary: 'Parse import text and create batch.', + description: 'return { data: imported_functions_count } on success', + }) @Post('import') async importBatch( @Req() req, diff --git a/src/callgent-functions/callgent-functions.controller.ts b/src/callgent-functions/callgent-functions.controller.ts index d3224f6..a1663e7 100644 --- a/src/callgent-functions/callgent-functions.controller.ts +++ b/src/callgent-functions/callgent-functions.controller.ts @@ -7,17 +7,15 @@ import { Param, Post, Put, - Query, Req, UseGuards, } from '@nestjs/common'; import { - ApiSecurity, ApiExtraModels, ApiOkResponse, ApiOperation, ApiProperty, - ApiQuery, + ApiSecurity, ApiTags, getSchemaPath, } from '@nestjs/swagger'; diff --git a/src/callgent-functions/callgent-functions.service.ts b/src/callgent-functions/callgent-functions.service.ts index d4c36c8..0ef8c31 100644 --- a/src/callgent-functions/callgent-functions.service.ts +++ b/src/callgent-functions/callgent-functions.service.ts @@ -1,6 +1,11 @@ import { TransactionHost, Transactional } from '@nestjs-cls/transactional'; import { TransactionalAdapterPrisma } from '@nestjs-cls/transactional-adapter-prisma'; -import { BadRequestException, Inject, Injectable } from '@nestjs/common'; +import { + BadRequestException, + Inject, + Injectable, + NotFoundException, +} from '@nestjs/common'; import { PaginatorTypes, paginator } from '@nodeteam/nestjs-prisma-pagination'; import { EndpointType, Prisma, PrismaClient } from '@prisma/client'; import { ApiSpec } from '../endpoints/adaptors/endpoint-adaptor.base'; @@ -31,7 +36,6 @@ export class CallgentFunctionsService { deletedAt: false, }; - @Transactional() async loadFunctions( reqEvent: ClientRequestEvent, ): Promise { @@ -49,7 +53,7 @@ export class CallgentFunctionsService { perPage: Number.MAX_SAFE_INTEGER, }); if (!funcs.length) - throw new BadRequestException( + throw new NotFoundException( `No function found on callgent#${callgentId}${ funName ? ' name=' + funName : '' }`, @@ -95,7 +99,7 @@ export class CallgentFunctionsService { 'endpoint must be of type `SERVER`, id=' + endpoint.id, ); - const { apis } = spec; + const { apis, securitySchemes } = spec; // validation const actMap = apis.map( (f) => ({ @@ -108,10 +112,20 @@ export class CallgentFunctionsService { }), ); + // create api functions const prisma = this.txHost.tx as PrismaClient; const { count: actionsCount } = await prisma.callgentFunction.createMany({ data: actMap, }); + + // 根据adaptor,auth type,判定可选的auth servers + // FIXME save securitySchemes on endpoint + // await this.endpointsService.saveSecuritySchemes( + // endpoint.id, + // securitySchemes, + // ); + // FIXME add auth-listener for this sep, + return actionsCount; } @@ -126,8 +140,8 @@ export class CallgentFunctionsService { 'Function entries can only be imported into Server Endpoint. ', ); - const apis = await this.endpointsService.parseApis(endpoint, apiTxt); - return this.createBatch(endpoint, apis, createdBy); + const apiSpec = await this.endpointsService.parseApis(endpoint, apiTxt); + return this.createBatch(endpoint, apiSpec, createdBy); } findAll({ diff --git a/src/callgent-realms/callgent-realms.module.ts b/src/callgent-realms/callgent-realms.module.ts new file mode 100644 index 0000000..c5e072c --- /dev/null +++ b/src/callgent-realms/callgent-realms.module.ts @@ -0,0 +1,14 @@ +import { Module } from '@nestjs/common'; +import { EndpointsModule } from '../endpoints/endpoints.module'; +import { UsersModule } from '../users/users.module'; +import { CallgentRealmsService } from './callgent-realms.service'; +import { ApiKeyAuthProcessor } from './processors/api-key-auth.processor'; + +@Module({ + imports: [EndpointsModule, UsersModule], + providers: [ + { provide: 'CallgentRealmsService', useClass: CallgentRealmsService }, + { provide: 'apiKey-authProcessor', useClass: ApiKeyAuthProcessor }, + ], +}) +export class CallgentRealmsModule {} diff --git a/src/callgent-realms/callgent-realms.service.spec.ts b/src/callgent-realms/callgent-realms.service.spec.ts new file mode 100644 index 0000000..f749ab7 --- /dev/null +++ b/src/callgent-realms/callgent-realms.service.spec.ts @@ -0,0 +1,18 @@ +import { Test, TestingModule } from '@nestjs/testing'; +import { CallgentRealmsService } from './callgent-realms.service'; + +describe('CallgentRealmsService', () => { + let service: CallgentRealmsService; + + beforeEach(async () => { + const module: TestingModule = await Test.createTestingModule({ + providers: [CallgentRealmsService], + }).compile(); + + service = module.get(CallgentRealmsService); + }); + + it('should be defined', () => { + expect(service).toBeDefined(); + }); +}); diff --git a/src/callgent-realms/callgent-realms.service.ts b/src/callgent-realms/callgent-realms.service.ts new file mode 100644 index 0000000..e74d128 --- /dev/null +++ b/src/callgent-realms/callgent-realms.service.ts @@ -0,0 +1,185 @@ +import { Transactional, TransactionHost } from '@nestjs-cls/transactional'; +import { TransactionalAdapterPrisma } from '@nestjs-cls/transactional-adapter-prisma'; +import { + Inject, + Injectable, + NotFoundException, + UnauthorizedException, +} from '@nestjs/common'; +import { ModuleRef } from '@nestjs/core'; +import { Prisma, PrismaClient } from '@prisma/client'; +import { EndpointsService } from '../endpoints/endpoints.service'; +import { ClientRequestEvent } from '../endpoints/events/client-request.event'; +import { selectHelper } from '../infra/repo/select.helper'; +import { UsersService } from '../users/users.service'; +import { CallgentRealm } from './entities/callgent-realm.entity'; +import { AuthProcessor } from './processors/auth-processor.base'; + +/** each callgent may have several security realms */ +@Injectable() +export class CallgentRealmsService { + constructor( + private readonly txHost: TransactionHost, + @Inject('EndpointsService') + private readonly endpointsService: EndpointsService, + private readonly usersService: UsersService, + private readonly moduleRef: ModuleRef, + ) {} + protected readonly defSelect: Prisma.CallgentRealmSelect = { + createdAt: false, + updatedAt: false, + deletedAt: false, + }; + + /** same as sep auth, except token cannot be attached to request event */ + async checkCepAuth( + reqEvent: ClientRequestEvent, + ): Promise { + const cep = await this.endpointsService.findOne(reqEvent.srcId); + if (!cep) + throw new NotFoundException( + 'Client endpoint not found, id: ' + reqEvent.srcId, + ); + + return this.checkAuths(reqEvent, cep.securities as any); + } + + /** + * check auth on the chosen callgent function. + * automatically starts auth process to retrieve token. + * may callback to cep for user credentials. + */ + async checkSepAuth( + reqEvent: ClientRequestEvent, + ): Promise { + // functions: CallgentFunction[], @see AgentsService.map2Function + const { securities, endpointId: sepId } = + reqEvent.context.functions?.length && reqEvent.context.functions[0]; + + const sep = sepId && (await this.endpointsService.findOne(reqEvent.srcId)); + if (!sep) + throw new NotFoundException( + 'Server endpoint not found, id: ' + reqEvent.srcId, + ); + return this.checkAuths(reqEvent, securities, true); + } + + /** + * @returns false if check fail + */ + async checkAuths( + reqEvent: ClientRequestEvent, + securities: { [realmPk: number]: string[] }, + sep = false, + ) { + const entries = securities && Object.entries(securities); + if (!entries?.length) return; // no auth, check ok + + for (const security of entries) { + reqEvent.context.security = security; + const result = await this._checkAuth(reqEvent); + if (result) return result; + } + + // check auth failed + throw new UnauthorizedException( + `Check ${sep ? 'SEP' : 'CEP'} authentications failed.`, + ); + } + + /** @returns false if check fail, else { data, resumeFunName? } */ + @Transactional() + protected async _checkAuth( + reqEvent: ClientRequestEvent, + ): Promise { + const security = reqEvent.context.security; + // load callgent realm config + const realm = await this.findOne(security[0]); + // return false if disabled + if (!realm?.enabled) return false; + + const processor = this._getAuthProcessor(realm.authType); + + // read existing from token store + const token = await this.findUserToken(realm, reqEvent.data.callerId); + if (token) { + // invoke validation url. TODO security as arg + const result = await processor.validateToken(token, reqEvent, realm); + if (result) return { data: reqEvent }; // valid/attached token + // async + if (result !== false) + return { data: reqEvent, resumeFunName: 'postValidateToken' }; + // else invalid, continue to refresh token process + } + + // if not valid, start auth process + const ret = await processor.authProcess(reqEvent, realm); + if (ret) return ret; // async + + // self provider same as third + return this.postAuthProcess(reqEvent); + } + + /** if valid, goon, if not start process, if unsure re-validate */ + async postValidateToken( + reqEvent: ClientRequestEvent, + ): Promise {} + + /** delegate to auth processor */ + async postAcquireSecret( + reqEvent: ClientRequestEvent, + ): Promise { + const security = reqEvent.context.security; + const realm = await this.findOne(security[0], {}); + const processor = this._getAuthProcessor(realm.authType); + return processor.postAcquireSecret(reqEvent, realm); + } + + /** delegate to auth processor */ + async postExchangeToken( + reqEvent: ClientRequestEvent, + ): Promise { + const security = reqEvent.context.security; + const realm = await this.findOne(security[0], {}); + const processor = this._getAuthProcessor(realm.authType); + return processor.postExchangeToken(reqEvent, realm); + } + + /** + * after auth process + * @returns false if check fail(no error, go on to next check), else { data, resumeFunName? } + */ + async postAuthProcess( + reqEvent: ClientRequestEvent, + ): Promise { + // store new token/or bind to existing, better auto login the user + // attach to req if needed + + return false; + } + + findUserToken(realm: CallgentRealm, userId: string) { + if (userId && realm.scheme?.perUser) + return this.usersService.$findFirstUserIdentity(userId, '' + realm.pk); + } + + findOne(pk: number, select?: Prisma.CallgentRealmSelect) { + const prisma = this.txHost.tx as PrismaClient; + return selectHelper( + select, + (select) => + prisma.callgentRealm.findUnique({ + select, + where: { pk }, + }), + this.defSelect, + ) as unknown as Promise; + } + + /** + * @param authType @see AuthType + */ + protected _getAuthProcessor(authType: string): AuthProcessor { + return this.moduleRef.get(authType + '-authProcessor'); + } +} diff --git a/src/callgent-realms/dto/realm-scheme.vo.ts b/src/callgent-realms/dto/realm-scheme.vo.ts new file mode 100644 index 0000000..a0d8943 --- /dev/null +++ b/src/callgent-realms/dto/realm-scheme.vo.ts @@ -0,0 +1,22 @@ +import { + OAuthFlowsObject, + SecuritySchemeObject, + SecuritySchemeType, +} from '@nestjs/swagger/dist/interfaces/open-api-spec.interface'; + +export class RealmSchemeVO implements SecuritySchemeObject { + /** whether issuing tokens per user */ + perUser?: boolean; + + /** token validation url, empty means attaching to request to validate */ + validationUrl?: string; + + type: SecuritySchemeType; + description?: string; + name?: string; + in?: string; + scheme?: string; + bearerFormat?: string; + flows?: OAuthFlowsObject; + openIdConnectUrl?: string; +} diff --git a/src/callgent-realms/processors/api-key-auth.processor.ts b/src/callgent-realms/processors/api-key-auth.processor.ts new file mode 100644 index 0000000..8febc02 --- /dev/null +++ b/src/callgent-realms/processors/api-key-auth.processor.ts @@ -0,0 +1,52 @@ +import { Injectable } from '@nestjs/common'; +import { ClientRequestEvent } from '../../endpoints/events/client-request.event'; +import { EventObject } from '../../event-listeners/event-object'; +import { UserIdentity } from '../../user-identities/entities/user-identity.entity'; +import { CallgentRealm } from '../entities/callgent-realm.entity'; +import { AuthProcessor } from './auth-processor.base'; + +@Injectable() +export class ApiKeyAuthProcessor extends AuthProcessor { + _validateToken( + token: UserIdentity, + realm: CallgentRealm, + ): Promise { + throw new Error('Method not implemented.'); + } + + _attachToken( + token: UserIdentity, + reqEvent: EventObject, + realm: CallgentRealm, + ): Promise { + throw new Error('Method not implemented.'); + } + + providerCallback(): Promise { + throw new Error('Method not implemented.'); + } + + authProcess( + reqEvent: ClientRequestEvent, + realm: CallgentRealm, + ): Promise { + throw new Error('Method not implemented.'); + } + + postAcquireSecret( + reqEvent: ClientRequestEvent, + realm: CallgentRealm, + ): Promise { + throw new Error('Method not implemented.'); + } + + postExchangeToken( + reqEvent: ClientRequestEvent, + realm: CallgentRealm, + ): Promise { + throw new Error('Method not implemented.'); + } +} diff --git a/src/callgent-realms/processors/auth-processor.base.ts b/src/callgent-realms/processors/auth-processor.base.ts new file mode 100644 index 0000000..1b18be1 --- /dev/null +++ b/src/callgent-realms/processors/auth-processor.base.ts @@ -0,0 +1,77 @@ +import { SecuritySchemeType } from '@nestjs/swagger/dist/interfaces/open-api-spec.interface'; +import { EventObject } from '../../event-listeners/event-object'; +import { UserIdentity } from '../../user-identities/entities/user-identity.entity'; +import { CallgentRealm } from '../entities/callgent-realm.entity'; +import { ClientRequestEvent } from '../../endpoints/events/client-request.event'; + +export type AuthType = SecuritySchemeType; // | ''; + +export abstract class AuthProcessor { + /** + * validate token via realm.scheme.validationUrl; if url empty, just attach token to req if allowed. + * this may be persistent-async + * @returns true if valid/attached, false invalid, void if async + */ + async validateToken( + token: UserIdentity, + reqEvent: EventObject, + realm: CallgentRealm, + ): Promise { + if (realm.scheme.validationUrl) return this._validateToken(token, realm); + + return this._attachToken(token, reqEvent, realm); + } + + /** + * @returns boolean if valid/invalid, void if async + */ + abstract _validateToken( + token: UserIdentity, + realm: CallgentRealm, + ): Promise; + + /** + * attach token to request, independent of sep? + * @returns true if attached + * @throws Error if not allowed to attach + */ + abstract _attachToken( + token: UserIdentity, + reqEvent: EventObject, + realm: CallgentRealm, + ): Promise; + + /** any async invocation callback from auth provider */ + abstract providerCallback(): Promise; + + /** + * common steps for auth process: + * 1. [request client, redirect to provider, acquire secret] + * 2. acquire secret from caller, [may async] + * 3. send secret to provider, to exchange token + * 4. [redirect back to client to get provider token, then send token to caller] + * @returns void if done; {data: reqEvent, resumeFunName?: 'postAcquireSecret' | 'postExchangeToken'} if async, CallgentRealmsService will call resumeFunName which delegate to current processor + */ + abstract authProcess( + reqEvent: ClientRequestEvent, + realm: CallgentRealm, + ): Promise; + + /** + * start to exchange secret to token from provider + * @returns secret string + */ + abstract postAcquireSecret( + reqEvent: ClientRequestEvent, + realm: CallgentRealm, + ): Promise; + + /** extract, store and use the token */ + abstract postExchangeToken( + reqEvent: ClientRequestEvent, + realm: CallgentRealm, + ): Promise; +} diff --git a/src/callgents/callgents.service.ts b/src/callgents/callgents.service.ts index 1454df9..5c575bc 100644 --- a/src/callgents/callgents.service.ts +++ b/src/callgents/callgents.service.ts @@ -87,7 +87,6 @@ export class CallgentsService { ); } - @Transactional() async findMany(ids: string[], select?: Prisma.CallgentSelect) { const prisma = this.txHost.tx as PrismaClient; @@ -131,7 +130,6 @@ export class CallgentsService { ); } - @Transactional() findOne(id: string, select?: Prisma.CallgentSelect) { const prisma = this.txHost.tx as PrismaClient; return selectHelper( @@ -145,7 +143,6 @@ export class CallgentsService { ); } - @Transactional() async getByName(name: string, select?: Prisma.CallgentSelect) { const tenantPk = this.tenancyService.getTenantId(); const prisma = this.txHost.tx as PrismaClient; @@ -169,6 +166,7 @@ export class CallgentsService { * [endpoint://]callgent.please('act', with_args) * @param act API action name * @param endpoint client endpoint to call API. unnecessary in internal calls + * @deprecated */ @Transactional() async please( @@ -225,12 +223,11 @@ export class CallgentsService { const tenantPk = this.tenancyService.getTenantId(); try { this.tenancyService.setTenantId(-1); - return fn.apply(this); + return await fn.apply(this); } finally { this.tenancyService.setTenantId(tenantPk); } } - @Transactional() async findAllInHub(params: { select?: Prisma.CallgentSelect; where?: Prisma.CallgentWhereInput; diff --git a/src/endpoints/adaptors/endpoint-adaptor.base.ts b/src/endpoints/adaptors/endpoint-adaptor.base.ts index 26375a7..d7132b5 100644 --- a/src/endpoints/adaptors/endpoint-adaptor.base.ts +++ b/src/endpoints/adaptors/endpoint-adaptor.base.ts @@ -15,7 +15,7 @@ export abstract class EndpointAdaptor { this.agentsService = agentsService; } - /** preprocess request */ + /** preprocess request, replace raw request */ abstract preprocess(reqEvent: ClientRequestEvent, endpoint: EndpointDto); /** postprocess response */ @@ -94,11 +94,12 @@ export abstract class EndpointAdaptor { 'Invalid openAPI.JSON, failed to dereference.', ); } - const { openapi, paths } = json; // TODO: save components onto SEP + const { openapi, paths, components } = json; // TODO: save components onto SEP if (!openapi?.startsWith('3.0')) throw new BadRequestException( 'Only openAPI `3.0.x` is supported now, openapi=' + openapi, ); + ret.securitySchemes = components?.securitySchemes; const ps = paths && Object.entries(paths); if (ps?.length) { @@ -116,6 +117,8 @@ export abstract class EndpointAdaptor { parameters: restApi.parameters, requestBody: restApi.requestBody, }; + const securities = restApi.security; + // TODO restApi.callbacks ret.apis.push({ @@ -123,6 +126,7 @@ export abstract class EndpointAdaptor { method: method.toUpperCase(), summary, description, + securities, params, responses, rawJson: restApi, @@ -150,10 +154,12 @@ export class ApiSpec { method: string; summary: string; description: string; + securities?: Prisma.JsonObject; params: Prisma.JsonObject; responses: Prisma.JsonObject; rawJson: Prisma.JsonObject; }[]; + securitySchemes?: Prisma.JsonObject; } export class EndpointParam { diff --git a/src/endpoints/endpoints.service.ts b/src/endpoints/endpoints.service.ts index 16f2326..a851e79 100644 --- a/src/endpoints/endpoints.service.ts +++ b/src/endpoints/endpoints.service.ts @@ -86,7 +86,6 @@ export class EndpointsService { ); } - @Transactional() findOne(id: string, select?: Prisma.EndpointSelect) { const prisma = this.txHost.tx as PrismaClient; return selectHelper( @@ -96,7 +95,6 @@ export class EndpointsService { ); } - @Transactional() findFirstByType( type: EndpointType, callgentId: string, @@ -131,16 +129,6 @@ export class EndpointsService { ); } - @Transactional() - findOneAuth(id: string, userKey: string) { - const prisma = this.txHost.tx as PrismaClient; - return prisma.endpointAuth.findUnique({ - where: { - endpointId_userKey: { endpointId: id, userKey: userKey }, - }, - }); - } - @Transactional() findAll({ select, diff --git a/src/event-listeners/event-listeners.service.ts b/src/event-listeners/event-listeners.service.ts index 909227b..dbfbfef 100644 --- a/src/event-listeners/event-listeners.service.ts +++ b/src/event-listeners/event-listeners.service.ts @@ -162,15 +162,17 @@ export class EventListenersService { } async loadListeners( - data: { + { + srcId, + eventType, + dataType, + }: { srcId: string; eventType: string; dataType: string; }, deleted = false, ) { - const { srcId: srcId, eventType, dataType } = data; - const prisma = this.txHost.tx as PrismaClient; const AND: Prisma.EventListenerWhereInput[] = [ { diff --git a/src/infra/repo/prisma.middlewares.ts b/src/infra/repo/prisma.middlewares.ts index e4251be..d96ec5c 100644 --- a/src/infra/repo/prisma.middlewares.ts +++ b/src/infra/repo/prisma.middlewares.ts @@ -37,6 +37,7 @@ export const mainPrismaServiceOptions = ( Endpoint: deleteHandle, Task: deleteHandle, TaskAction: deleteHandle, + CallgentRealm: deleteHandle, }, }), ], diff --git a/src/infra/repo/tenancy/prisma-tenancy.provider.ts b/src/infra/repo/tenancy/prisma-tenancy.provider.ts index 0557e98..991b9fe 100644 --- a/src/infra/repo/tenancy/prisma-tenancy.provider.ts +++ b/src/infra/repo/tenancy/prisma-tenancy.provider.ts @@ -24,6 +24,7 @@ export const prismaTenancyUseFactory = ( if (existingTx) { await op; } else { + // TODO ?? store.set(getTransactionClsKey(), newTx); const [, result] = await newTx.$transaction([op, query(args)]); return result; } diff --git a/src/users/users.module.ts b/src/users/users.module.ts index fbb31d5..ec416b3 100644 --- a/src/users/users.module.ts +++ b/src/users/users.module.ts @@ -10,5 +10,6 @@ import { UsersService } from './users.service'; imports: [AuthTokensModule], controllers: [UsersController, AuthController], providers: [UsersService, AuthLoginListener, AuthLoginedListener], + exports: [UsersService], }) export class UsersModule {} diff --git a/src/users/users.service.ts b/src/users/users.service.ts index cdb4a84..4ba41a1 100644 --- a/src/users/users.service.ts +++ b/src/users/users.service.ts @@ -72,25 +72,43 @@ export class UsersService { ) { const prisma = this.txHost.tx as PrismaClient; if (options?.noTenant) await this.tenancyService.bypassTenancy(prisma); + try { + // find user identity + const where = options?.evenInvalid + ? { + AND: { + uid, + provider, + OR: [{ deletedAt: null }, { deletedAt: { not: null } }], + }, + } + : { + AND: { uid, provider, user: { tenant: { statusCode: { gt: 0 } } } }, + }; + const ui = await prisma.userIdentity.findFirst({ + where, + include: { + user: { include: { tenant: true } }, + }, + }); + return ui; + } finally { + if (options?.noTenant) + await this.tenancyService.bypassTenancy(prisma, false); + } + } - // find user identity - const where = options?.evenInvalid - ? { - AND: { - uid, - provider, - OR: [{ deletedAt: null }, { deletedAt: { not: null } }], - }, - } - : { AND: { uid, provider, user: { tenant: { statusCode: { gt: 0 } } } } }; - const ui = await prisma.userIdentity.findFirst({ - where, - include: { - user: { include: { tenant: true } }, - }, - }); - - return ui; + /** for CallgentRealm, there is at most 1 identity per user per realm */ + async $findFirstUserIdentity(userId: string, provider: string) { + const prisma = this.txHost.tx as PrismaClient; + await this.tenancyService.bypassTenancy(prisma); + try { + return prisma.userIdentity.findFirst({ + where: { userId, provider }, + }); + } finally { + await this.tenancyService.bypassTenancy(prisma, false); + } } /** From 4b982c7b6cbe5a799814bb8f3ea67ffe4a682cf3 Mon Sep 17 00:00:00 2001 From: dev-callgent Date: Sat, 21 Sep 2024 10:36:06 +0800 Subject: [PATCH 065/183] feat: callgent auth Signed-off-by: dev-callgent --- .../migration.sql | 7 +- prisma/schema.prisma | 23 ++-- prisma/seed.ts | 6 +- .../callgent-functions.module.ts | 3 +- .../callgent-functions.service.ts | 68 +++++++-- src/callgent-realms/callgent-realms.module.ts | 1 + .../callgent-realms.service.ts | 130 +++++++++++++++--- src/callgent-realms/dto/realm-scheme.vo.ts | 9 +- src/callgent-realms/dto/realm-security.vo.ts | 17 +++ .../processors/api-key-auth.processor.ts | 47 ++++++- .../processors/auth-processor.base.ts | 84 ++++++++++- .../adaptors/endpoint-adaptor.base.ts | 19 ++- src/endpoints/endpoints.service.ts | 4 +- src/executions/command.executor.ts | 18 --- src/executions/command.schema.ts | 56 -------- src/executions/executions.module.ts | 9 -- src/executions/executions.service.spec.ts | 18 --- src/executions/executions.service.ts | 102 -------------- 18 files changed, 354 insertions(+), 267 deletions(-) create mode 100644 src/callgent-realms/dto/realm-security.vo.ts delete mode 100644 src/executions/command.executor.ts delete mode 100644 src/executions/command.schema.ts delete mode 100644 src/executions/executions.module.ts delete mode 100644 src/executions/executions.service.spec.ts delete mode 100644 src/executions/executions.service.ts diff --git a/prisma/migrations/20240918072319_callgent_realm/migration.sql b/prisma/migrations/20240918072319_callgent_realm/migration.sql index e54c5d2..5ff9601 100644 --- a/prisma/migrations/20240918072319_callgent_realm/migration.sql +++ b/prisma/migrations/20240918072319_callgent_realm/migration.sql @@ -6,10 +6,10 @@ */ -- AlterTable -ALTER TABLE "CallgentFunction" ADD COLUMN "securities" JSON; +ALTER TABLE "CallgentFunction" ADD COLUMN "securities" JSON[]; -- AlterTable -ALTER TABLE "Endpoint" ADD COLUMN "securities" JSON; +ALTER TABLE "Endpoint" ADD COLUMN "securities" JSON[]; -- DropTable DROP TABLE "EndpointAuth"; @@ -21,8 +21,8 @@ DROP TYPE "EndpointAuthType"; CREATE TABLE "CallgentRealm" ( "pk" SERIAL NOT NULL, "callgentId" VARCHAR(36) NOT NULL, + "realmKey" VARCHAR(256) NOT NULL, "authType" VARCHAR(16) NOT NULL, - "provider" VARCHAR(64) NOT NULL, "realm" VARCHAR(16) NOT NULL DEFAULT '', "scheme" JSON, "secret" JSON, @@ -37,3 +37,4 @@ CREATE TABLE "CallgentRealm" ( -- CreateIndex CREATE INDEX "CallgentRealm_callgentId_idx" ON "CallgentRealm"("callgentId"); +CREATE UNIQUE INDEX "CallgentRealm_callgentId_realmKey_key" ON "CallgentRealm"("callgentId", "realmKey"); diff --git a/prisma/schema.prisma b/prisma/schema.prisma index c7f3585..fbeb35d 100644 --- a/prisma/schema.prisma +++ b/prisma/schema.prisma @@ -200,7 +200,8 @@ model CallgentFunction { method String @db.VarChar(15) /// @description openAPI method summary String @default("") @db.VarChar(511) description String @default("") @db.VarChar(1023) - securities Json? @db.Json /// @description { realmPK: ["scopes"] } + /// @DtoCastType(RealmSecurityVO, ../../callgent-realms/dto/realm-security.vo) + securities Json[] @db.Json /// @description { realmPK: ["scopes"] } params Json? @db.Json /// @description declaration of API params responses Json? @db.Json /// @description declaration of API responses rawJson Json @db.Json @@ -232,17 +233,17 @@ model CallgentFunction { model CallgentRealm { pk Int @id @default(autoincrement()) - // unique realm specified by the 4 fields callgentId String @db.VarChar(36) - authType String @db.VarChar(16) /// @description auth type, 'apiKey' | 'http' | 'oauth2' | 'openIdConnect' | ..etc. - provider String @db.VarChar(64) /// @description auth provider key, usually the domain of the provider - realm String @default("") @db.VarChar(16) /// @description provider defined realm name + realmKey String @db.VarChar(256) /// @description unique[callgentId, realmKey], to identify same realm in callgent. + authType String @db.VarChar(16) /// @description auth type, 'apiKey' | 'http' | 'oauth2' | 'openIdConnect' | ..etc. + realm String @default("") @db.VarChar(16) /// @description provider defined realm name, or '' for default realm /// @DtoCastType(RealmSchemeVO, ../dto/realm-scheme.vo) - scheme Json? @db.Json /// @description security scheme, with all public configs - secret Json? @db.Json /// @description security secret, with all private configs - perUser Boolean @default(false) /// @description whether the realm is per user auth - enabled Boolean @default(true) /// @description whether the realm is enabled + scheme Json? @db.Json /// @description security scheme, with all public configs + secret Json? @db.Json /// @description security secret, with all private configs + + perUser Boolean @default(false) /// @description whether the realm is per user auth + enabled Boolean @default(true) /// @description whether the realm is enabled createdAt DateTime @default(now()) updatedAt DateTime @default(now()) @updatedAt @@ -251,6 +252,7 @@ model CallgentRealm { /// @DtoEntityHidden deletedAt DateTime? /// @description logical deletion. + @@unique([callgentId, realmKey]) @@index(callgentId) } @@ -383,7 +385,8 @@ model Endpoint { content Json? @db.Json /// @description generated content/code by init method /// @DtoReadOnly /// @DtoPlainApiResponse - securities Json? @db.Json /// @description { realmPK: ["scopes"] } + /// @DtoCastType(RealmSecurityVO, ../../callgent-realms/dto/realm-security.vo) + securities Json[] @db.Json /// @description { realmPK: ["scopes"] } /// @DtoUpdateApiResponse /// @DtoPlainApiResponse diff --git a/prisma/seed.ts b/prisma/seed.ts index a294def..cad958c 100644 --- a/prisma/seed.ts +++ b/prisma/seed.ts @@ -52,7 +52,8 @@ function initEventListeners() { serviceType: 'SERVICE', serviceName: 'CallgentRealmsService', funName: 'checkCepAuth', - description: 'Auth-check before cep invocation.', + description: + 'Auth-check before cep invocation. current security: reqEvent.context.security: RealmSecurityVO[]', createdBy: 'GLOBAL', priority: (priority += 100), }, @@ -111,7 +112,8 @@ function initEventListeners() { serviceType: 'SERVICE', serviceName: 'CallgentRealmsService', funName: 'checkSepAuth', - description: 'Auth-check before sep invocation.', + description: + 'Auth-check before sep invocation. current security: reqEvent.context.security: RealmSecurityVO[]', createdBy: 'GLOBAL', priority: (priority += 100), }, diff --git a/src/callgent-functions/callgent-functions.module.ts b/src/callgent-functions/callgent-functions.module.ts index 7458865..41684d6 100644 --- a/src/callgent-functions/callgent-functions.module.ts +++ b/src/callgent-functions/callgent-functions.module.ts @@ -1,10 +1,11 @@ import { Module } from '@nestjs/common'; +import { CallgentRealmsModule } from '../callgent-realms/callgent-realms.module'; import { EndpointsModule } from '../endpoints/endpoints.module'; import { CallgentFunctionsController } from './callgent-functions.controller'; import { CallgentFunctionsService } from './callgent-functions.service'; @Module({ - imports: [EndpointsModule], + imports: [EndpointsModule, CallgentRealmsModule], providers: [ { provide: 'CallgentFunctionsService', useClass: CallgentFunctionsService }, ], diff --git a/src/callgent-functions/callgent-functions.service.ts b/src/callgent-functions/callgent-functions.service.ts index 0ef8c31..d42f70c 100644 --- a/src/callgent-functions/callgent-functions.service.ts +++ b/src/callgent-functions/callgent-functions.service.ts @@ -8,6 +8,8 @@ import { } from '@nestjs/common'; import { PaginatorTypes, paginator } from '@nodeteam/nestjs-prisma-pagination'; import { EndpointType, Prisma, PrismaClient } from '@prisma/client'; +import { CallgentRealmsService } from '../callgent-realms/callgent-realms.service'; +import { CallgentRealm } from '../callgent-realms/entities/callgent-realm.entity'; import { ApiSpec } from '../endpoints/adaptors/endpoint-adaptor.base'; import { EndpointDto } from '../endpoints/dto/endpoint.dto'; import { EndpointsService } from '../endpoints/endpoints.service'; @@ -15,6 +17,7 @@ import { ClientRequestEvent } from '../endpoints/events/client-request.event'; import { Utils } from '../infra/libs/utils'; import { selectHelper } from '../infra/repo/select.helper'; import { UpdateCallgentFunctionDto } from './dto/update-callgent-function.dto'; +import { RealmSecurityVO } from '../callgent-realms/dto/realm-security.vo'; const paginate: PaginatorTypes.PaginateFunction = paginator({ perPage: 10 }); @@ -24,6 +27,8 @@ export class CallgentFunctionsService { private readonly txHost: TransactionHost, @Inject('EndpointsService') private readonly endpointsService: EndpointsService, + @Inject('CallgentRealmsService') + private readonly callgentRealmsService: CallgentRealmsService, ) {} protected readonly defSelect: Prisma.CallgentFunctionSelect = { pk: false, @@ -98,18 +103,61 @@ export class CallgentFunctionsService { throw new BadRequestException( 'endpoint must be of type `SERVER`, id=' + endpoint.id, ); + const { apis, securitySchemes, servers, securities } = spec; + // TODO set endpoint.host from servers? + + // create callgent realms from securitySchemes + const realmMap: { [name: string]: CallgentRealm } = {}; + if (securitySchemes) { + await Promise.all( + Object.entries(securitySchemes).map(async ([name, scheme]) => { + const realm = await this.callgentRealmsService.upsertRealm( + endpoint, + scheme, + {}, + servers, + ); + realmMap[name] = realm as any; + }), + ); + } - const { apis, securitySchemes } = spec; // validation const actMap = apis.map( - (f) => ({ - ...f, - id: Utils.uuid(), - name: Utils.formalApiName(f.method, f.path), - endpointId: endpoint.id, - callgentId: endpoint.callgentId, - createdBy: createdBy, - }), + (f) => { + const ret = { + ...f, + id: Utils.uuid(), + name: Utils.formalApiName(f.method, f.path), + endpointId: endpoint.id, + callgentId: endpoint.callgentId, + createdBy: createdBy, + }; + if (securities?.length || ret.securities?.length) { + const securitiesMerged = [ + ...(securities || []), + ...(ret.securities || []), + ].map((security) => { + const result: RealmSecurityVO = {}; + Object.entries(security).forEach(([name, scopes]) => { + const realm = realmMap[name]; + if (!Number.isFinite(realm?.pk)) + throw new BadRequestException( + 'Unknown security scheme name: ' + name, + ); + const item = this.callgentRealmsService.constructSecurity( + realm, + endpoint, + ); + + result[name] = { ...item, scopes }; + }); + return result; + }); + ret.securities = securitiesMerged as any; + } + return ret; + }, ); // create api functions @@ -214,7 +262,7 @@ export class CallgentFunctionsService { prisma.callgentFunction.update({ select, where: { id: dto.id }, - data: dto, + data: dto as any, }), ); } diff --git a/src/callgent-realms/callgent-realms.module.ts b/src/callgent-realms/callgent-realms.module.ts index c5e072c..cc303b8 100644 --- a/src/callgent-realms/callgent-realms.module.ts +++ b/src/callgent-realms/callgent-realms.module.ts @@ -10,5 +10,6 @@ import { ApiKeyAuthProcessor } from './processors/api-key-auth.processor'; { provide: 'CallgentRealmsService', useClass: CallgentRealmsService }, { provide: 'apiKey-authProcessor', useClass: ApiKeyAuthProcessor }, ], + exports: ['CallgentRealmsService'], }) export class CallgentRealmsModule {} diff --git a/src/callgent-realms/callgent-realms.service.ts b/src/callgent-realms/callgent-realms.service.ts index e74d128..cc03671 100644 --- a/src/callgent-realms/callgent-realms.service.ts +++ b/src/callgent-realms/callgent-realms.service.ts @@ -7,11 +7,16 @@ import { UnauthorizedException, } from '@nestjs/common'; import { ModuleRef } from '@nestjs/core'; +import { ServerObject } from '@nestjs/swagger/dist/interfaces/open-api-spec.interface'; import { Prisma, PrismaClient } from '@prisma/client'; +import { EndpointDto } from '../endpoints/dto/endpoint.dto'; import { EndpointsService } from '../endpoints/endpoints.service'; import { ClientRequestEvent } from '../endpoints/events/client-request.event'; import { selectHelper } from '../infra/repo/select.helper'; import { UsersService } from '../users/users.service'; +import { CallgentRealmDto } from './dto/callgent-realm.dto'; +import { RealmSchemeVO } from './dto/realm-scheme.vo'; +import { RealmSecurityItem, RealmSecurityVO } from './dto/realm-security.vo'; import { CallgentRealm } from './entities/callgent-realm.entity'; import { AuthProcessor } from './processors/auth-processor.base'; @@ -31,6 +36,59 @@ export class CallgentRealmsService { deletedAt: false, }; + //// auth config start //// + + /** + * try to map to existing realm + */ + @Transactional() + async upsertRealm( + endpoint: EndpointDto, + scheme: Omit & { provider?: string }, + realm: Partial, + servers: ServerObject[], + ) { + const authType = realm.scheme.type; + const processor = this._getAuthProcessor(authType); + realm = processor.constructRealm(endpoint, scheme, realm, servers); + const realmKey = realm.realmKey; + const callgentId = endpoint.callgentId; + const prisma = this.txHost.tx as PrismaClient; + + const existing = await prisma.callgentRealm.findFirst({ + select: { pk: true }, + where: { OR: [{ callgentId, realmKey }, { pk: realm.pk }] }, + }); + if (existing) + return prisma.callgentRealm.update({ + where: { pk: existing.pk }, + data: { + ...realm, + authType, + realmKey, + scheme: realm.scheme as any, + }, + }); + + return prisma.callgentRealm.create({ + data: { + ...realm, + callgentId, + realmKey, + authType, + scheme: realm.scheme as any, + }, + }); + } + + /** construct security guard on endpoint */ + constructSecurity(realm: CallgentRealm, endpoint: EndpointDto) { + const processor = this._getAuthProcessor(realm.authType); + return processor.constructSecurity(endpoint, realm); + } + + //// auth check start, auth config end //// + /** same as sep auth, except token cannot be attached to request event */ async checkCepAuth( reqEvent: ClientRequestEvent, @@ -41,7 +99,7 @@ export class CallgentRealmsService { 'Client endpoint not found, id: ' + reqEvent.srcId, ); - return this.checkAuths(reqEvent, cep.securities as any); + return this.checkSecurities(reqEvent, cep.securities as any); } /** @@ -61,24 +119,23 @@ export class CallgentRealmsService { throw new NotFoundException( 'Server endpoint not found, id: ' + reqEvent.srcId, ); - return this.checkAuths(reqEvent, securities, true); + return this.checkSecurities(reqEvent, securities, true); } /** * @returns false if check fail */ - async checkAuths( + async checkSecurities( reqEvent: ClientRequestEvent, - securities: { [realmPk: number]: string[] }, + securities: RealmSecurityVO[], sep = false, ) { - const entries = securities && Object.entries(securities); - if (!entries?.length) return; // no auth, check ok + if (!securities?.length) return; // no auth, check ok - for (const security of entries) { + for (const security of securities) { reqEvent.context.security = security; - const result = await this._checkAuth(reqEvent); - if (result) return result; + const result = await this._checkSecurity(reqEvent); + if (result) return result; // check ok } // check auth failed @@ -87,19 +144,35 @@ export class CallgentRealmsService { ); } - /** @returns false if check fail, else { data, resumeFunName? } */ + /** + * + * @returns false if check fail, else { data, resumeFunName? } + */ @Transactional() - protected async _checkAuth( + protected async _checkSecurity( reqEvent: ClientRequestEvent, ): Promise { - const security = reqEvent.context.security; - // load callgent realm config - const realm = await this.findOne(security[0]); + const security: RealmSecurityVO = reqEvent.context.security; + const items = Object.values(security); + + // FIXME persist-async for items list, by adding index into req.ctx + // for (const item of items) { + // const result = await this._checkAuth(item, reqEvent); + // if (!result) return result; // any check fail + // } + + return this._checkSecurityItem(items[0], reqEvent); + } + + protected async _checkSecurityItem( + item: RealmSecurityItem, + reqEvent: ClientRequestEvent, + ) { + reqEvent.context.securityItem = item; + const { realm, processor } = await this._loadRealm(item, true); // return false if disabled if (!realm?.enabled) return false; - const processor = this._getAuthProcessor(realm.authType); - // read existing from token store const token = await this.findUserToken(realm, reqEvent.data.callerId); if (token) { @@ -129,9 +202,8 @@ export class CallgentRealmsService { async postAcquireSecret( reqEvent: ClientRequestEvent, ): Promise { - const security = reqEvent.context.security; - const realm = await this.findOne(security[0], {}); - const processor = this._getAuthProcessor(realm.authType); + const item: RealmSecurityItem = reqEvent.context.securityItem; + const { realm, processor } = await this._loadRealm(item); return processor.postAcquireSecret(reqEvent, realm); } @@ -139,12 +211,26 @@ export class CallgentRealmsService { async postExchangeToken( reqEvent: ClientRequestEvent, ): Promise { - const security = reqEvent.context.security; - const realm = await this.findOne(security[0], {}); - const processor = this._getAuthProcessor(realm.authType); + const item: RealmSecurityItem = reqEvent.context.securityItem; + const { realm, processor } = await this._loadRealm(item); return processor.postExchangeToken(reqEvent, realm); } + /** + * @param noError if false, throw error if realm not enabled + */ + protected async _loadRealm(security: RealmSecurityItem, noError = false) { + const realm = await this.findOne(security.realmPk, {}); + if (!realm?.enabled) { + if (noError) return { realm }; + throw new UnauthorizedException( + 'Invalid security realm ' + security.realmPk, + ); + } + const processor = this._getAuthProcessor(realm.authType); + return { realm, processor }; + } + /** * after auth process * @returns false if check fail(no error, go on to next check), else { data, resumeFunName? } diff --git a/src/callgent-realms/dto/realm-scheme.vo.ts b/src/callgent-realms/dto/realm-scheme.vo.ts index a0d8943..c81922d 100644 --- a/src/callgent-realms/dto/realm-scheme.vo.ts +++ b/src/callgent-realms/dto/realm-scheme.vo.ts @@ -1,17 +1,20 @@ import { OAuthFlowsObject, - SecuritySchemeObject, SecuritySchemeType, } from '@nestjs/swagger/dist/interfaces/open-api-spec.interface'; -export class RealmSchemeVO implements SecuritySchemeObject { +export type AuthType = SecuritySchemeType | 'password'; // | ''; + +export class RealmSchemeVO { /** whether issuing tokens per user */ perUser?: boolean; + /** service provider url */ + provider: string; /** token validation url, empty means attaching to request to validate */ validationUrl?: string; - type: SecuritySchemeType; + type: AuthType; description?: string; name?: string; in?: string; diff --git a/src/callgent-realms/dto/realm-security.vo.ts b/src/callgent-realms/dto/realm-security.vo.ts new file mode 100644 index 0000000..6e50384 --- /dev/null +++ b/src/callgent-realms/dto/realm-security.vo.ts @@ -0,0 +1,17 @@ +/** + * Reference properties to realm-scheme. + * multiple realms with and-relation + */ +export class RealmSecurityVO { + [realmPk: string]: RealmSecurityItem; +} + +export class RealmSecurityItem { + realmPk: number; + + /** scopes for the security operation */ + scopes?: string[]; + + /** whether to attach token to request, or validate token separately */ + attach?: boolean; +} diff --git a/src/callgent-realms/processors/api-key-auth.processor.ts b/src/callgent-realms/processors/api-key-auth.processor.ts index 8febc02..52e65ff 100644 --- a/src/callgent-realms/processors/api-key-auth.processor.ts +++ b/src/callgent-realms/processors/api-key-auth.processor.ts @@ -1,12 +1,57 @@ -import { Injectable } from '@nestjs/common'; +import { BadRequestException, Injectable } from '@nestjs/common'; +import { SecuritySchemeObject } from '@nestjs/swagger/dist/interfaces/open-api-spec.interface'; +import { EndpointDto } from '../../endpoints/dto/endpoint.dto'; import { ClientRequestEvent } from '../../endpoints/events/client-request.event'; import { EventObject } from '../../event-listeners/event-object'; import { UserIdentity } from '../../user-identities/entities/user-identity.entity'; +import { CallgentRealmDto } from '../dto/callgent-realm.dto'; +import { RealmSchemeVO } from '../dto/realm-scheme.vo'; import { CallgentRealm } from '../entities/callgent-realm.entity'; import { AuthProcessor } from './auth-processor.base'; @Injectable() export class ApiKeyAuthProcessor extends AuthProcessor { + protected implyProvider( + scheme: SecuritySchemeObject, + endpoint: EndpointDto, + servers?: { url: string }[], + ) { + let url; + if (endpoint.type != 'CLIENT') { + url = endpoint.host; // whatever adaptor it is, host need to be a url + } else if (servers?.length > 0) { + url = servers[0].url; + } + if (!url) + throw new BadRequestException( + 'Cannot imply security provider, please specify it manually', + ); + + try { + return new URL(url).hostname; + } catch (e) { + throw new BadRequestException('Invalid security provider: must be url.'); + } + } + + /** @returns ApiKey:in:name:provider:realm */ + protected getRealmKey(scheme: RealmSchemeVO, realm?: string) { + return `${scheme.type}:${scheme.in || ''}:${scheme.name || ''}:${ + scheme.provider + }:${realm || ''}`; + } + + protected checkEnabled( + scheme: RealmSchemeVO, + realm: Partial, + ) { + return realm.scheme.provider && !!realm.secret; + } + + protected isPerUser() { + return false; + } + _validateToken( token: UserIdentity, realm: CallgentRealm, diff --git a/src/callgent-realms/processors/auth-processor.base.ts b/src/callgent-realms/processors/auth-processor.base.ts index 1b18be1..7954239 100644 --- a/src/callgent-realms/processors/auth-processor.base.ts +++ b/src/callgent-realms/processors/auth-processor.base.ts @@ -1,25 +1,95 @@ -import { SecuritySchemeType } from '@nestjs/swagger/dist/interfaces/open-api-spec.interface'; +import { UnauthorizedException } from '@nestjs/common'; +import { + SecuritySchemeObject, + ServerObject, +} from '@nestjs/swagger/dist/interfaces/open-api-spec.interface'; +import { EndpointDto } from '../../endpoints/dto/endpoint.dto'; +import { ClientRequestEvent } from '../../endpoints/events/client-request.event'; import { EventObject } from '../../event-listeners/event-object'; import { UserIdentity } from '../../user-identities/entities/user-identity.entity'; +import { CallgentRealmDto } from '../dto/callgent-realm.dto'; +import { AuthType, RealmSchemeVO } from '../dto/realm-scheme.vo'; +import { RealmSecurityItem, RealmSecurityVO } from '../dto/realm-security.vo'; import { CallgentRealm } from '../entities/callgent-realm.entity'; -import { ClientRequestEvent } from '../../endpoints/events/client-request.event'; - -export type AuthType = SecuritySchemeType; // | ''; export abstract class AuthProcessor { + /** fill in necessary realm properties */ + constructRealm( + endpoint: EndpointDto, + scheme: Omit & { provider?: string }, + realm: Partial, + servers?: ServerObject[], + ) { + // imply provider + if (!realm.scheme.provider) + realm.scheme.provider = this.implyProvider( + realm.scheme, + endpoint, + servers, + ); + realm.realmKey = this.getRealmKey(realm.scheme, realm.realm); + realm.perUser = this.isPerUser(scheme as any, realm); + realm.enabled = this.checkEnabled(scheme as any, realm); + + return realm; + } + + /** construct a security guard on endpoint */ + constructSecurity(endpoint: EndpointDto, realm: CallgentRealm) { + let attach: boolean; + if (endpoint.type != 'CLIENT') { + try { + const provider = this.implyProvider(realm.scheme, endpoint); + if (provider == realm.scheme.provider) attach = true; + } catch (e) { + // ignore + } + } + return { realmPk: realm.pk, attach }; + } + /** - * validate token via realm.scheme.validationUrl; if url empty, just attach token to req if allowed. + * imply auth service provider + * @returns provider domain, must not be empty + * @throws Error if fail to imply + */ + protected abstract implyProvider( + scheme: Omit & { type: AuthType }, + endpoint: EndpointDto, + servers?: { url: string }[], + ): string; + + /** @returns realm key to identify the same realms */ + protected abstract getRealmKey(scheme: RealmSchemeVO, realm?: string): string; + + protected abstract checkEnabled( + scheme: RealmSchemeVO, + realm: Partial, + ): boolean; + + protected abstract isPerUser( + scheme: RealmSchemeVO, + realm: Partial, + ): boolean; + + /** + * validate auth token * this may be persistent-async * @returns true if valid/attached, false invalid, void if async + * @throws Error if not allowed to attach and validationUrl empty */ async validateToken( token: UserIdentity, reqEvent: EventObject, realm: CallgentRealm, ): Promise { - if (realm.scheme.validationUrl) return this._validateToken(token, realm); + const security: RealmSecurityVO = reqEvent.context.security; - return this._attachToken(token, reqEvent, realm); + if (security?.attach) return this._attachToken(token, reqEvent, realm); + if (realm.scheme.validationUrl) return this._validateToken(token, realm); + throw new UnauthorizedException( + 'Cannot validate auth token, validationUrl must not empty.', + ); } /** diff --git a/src/endpoints/adaptors/endpoint-adaptor.base.ts b/src/endpoints/adaptors/endpoint-adaptor.base.ts index d7132b5..b0d6514 100644 --- a/src/endpoints/adaptors/endpoint-adaptor.base.ts +++ b/src/endpoints/adaptors/endpoint-adaptor.base.ts @@ -1,6 +1,11 @@ import $RefParser from '@apidevtools/json-schema-ref-parser'; import { BadRequestException, NotFoundException } from '@nestjs/common'; import { ApiProperty } from '@nestjs/swagger'; +import { + SecurityRequirementObject, + SecuritySchemeObject, + ServerObject, +} from '@nestjs/swagger/dist/interfaces/open-api-spec.interface'; import { Prisma } from '@prisma/client'; import yaml from 'yaml'; import { AgentsService } from '../../agents/agents.service'; @@ -94,12 +99,14 @@ export abstract class EndpointAdaptor { 'Invalid openAPI.JSON, failed to dereference.', ); } - const { openapi, paths, components } = json; // TODO: save components onto SEP + const { openapi, paths, components, security, servers } = json; // TODO: save components onto SEP if (!openapi?.startsWith('3.0')) throw new BadRequestException( 'Only openAPI `3.0.x` is supported now, openapi=' + openapi, ); ret.securitySchemes = components?.securitySchemes; + ret.servers = servers; + ret.securities = security; const ps = paths && Object.entries(paths); if (ps?.length) { @@ -154,12 +161,18 @@ export class ApiSpec { method: string; summary: string; description: string; - securities?: Prisma.JsonObject; + /** array with or-relation, SecurityRequirementObject with and-relation */ + securities?: SecurityRequirementObject[]; params: Prisma.JsonObject; responses: Prisma.JsonObject; rawJson: Prisma.JsonObject; }[]; - securitySchemes?: Prisma.JsonObject; + securitySchemes?: { + [name: string]: SecuritySchemeObject & { provider?: string }; + }; + servers?: ServerObject[]; + /** array with or-relation, SecurityRequirementObject with and-relation */ + securities?: SecurityRequirementObject[]; } export class EndpointParam { diff --git a/src/endpoints/endpoints.service.ts b/src/endpoints/endpoints.service.ts index a851e79..31c5c8e 100644 --- a/src/endpoints/endpoints.service.ts +++ b/src/endpoints/endpoints.service.ts @@ -295,7 +295,7 @@ export class EndpointsService { const endpoint = await this.findOne(reqEvent.srcId); - await adaptor.preprocess(reqEvent, endpoint); + await adaptor.preprocess(reqEvent, endpoint as any); } @Transactional() @@ -321,7 +321,7 @@ export class EndpointsService { // may returns pending result return adapter - .invoke(func, map2Function.args, sep, reqEvent) + .invoke(func, map2Function.args, sep as any, reqEvent) .then((res) => { if (res?.resumeFunName) return res; return this.postInvokeSEP(res.data); diff --git a/src/executions/command.executor.ts b/src/executions/command.executor.ts deleted file mode 100644 index 6d5c97f..0000000 --- a/src/executions/command.executor.ts +++ /dev/null @@ -1,18 +0,0 @@ -import { Injectable } from '@nestjs/common'; -import { Command, Instruction } from './command.schema'; - -@Injectable() -export class CommandExecutor { - async exec(cmd: Command, ctx) { - // const { func, exec } = this._flow(cmd); - - // 当伪代码形成vars后,指令会读取值, - // 需要赋值到vars?还是resp传递下去,赋值由mapping代码来做 - - // return cmd; - } - - protected async _exec(ins: Instruction | Instruction[]) { - return ins; - } -} diff --git a/src/executions/command.schema.ts b/src/executions/command.schema.ts deleted file mode 100644 index c7bb094..0000000 --- a/src/executions/command.schema.ts +++ /dev/null @@ -1,56 +0,0 @@ -/** through `callgent` to call method/assignee, with args */ -export class Invocation { - /** callgent */ - callgent: { id: string; name: string }; - func: string; - /** expression referring to callgent response data */ - args?: { [key: string]: string }; -} - -export type Instruction = - | Invocation - | Command - | 'continue' - | 'break' - | 'return' - | 'throw'; -// | 'exit'; - -export class Command { - /** name of command */ - name?: string; - /** boolean expression */ - if?: string; - /** iteration over a collection */ - for?: { exp: string; var: string }; - /** boolean expression */ - while?: string; - /** Instruction flow */ - exec: Instruction | Instruction[]; - /** Instruction flow */ - else?: Instruction | Instruction[]; - pseudo? = false; -} - -// invocation produce variable data, -// invocation refer to data by expressions, -// list of instructions as a command - -// ask a callgent to do sth, on some event: -// callgent.register event do: callgent.act(args) -// ask a callgent to do sth, on some condition: -// when resp.?, then callgent.act(args) - -// guys, please send an email at 3pm to xx, ask him whether and where want to go -// if yes, book a table at where he want to go -// TODO callgent routing - -// @b.observe('time event', '3pm', [ -// b_mail_send = @b_mail.act('send', { to: 'xx', subject: 'ask whether and where want to go' }), -// if b_mail_send.resp.yes, then b_table_book = @b_table.act('book', { where: b_mail_send.resp.where }) -// ]) - -// 1. callgent routing -// 2. entry routing -// 3. args mapping/generation, progressively -// 4. invocation diff --git a/src/executions/executions.module.ts b/src/executions/executions.module.ts deleted file mode 100644 index 35b322c..0000000 --- a/src/executions/executions.module.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { Module } from '@nestjs/common'; -import { CommandExecutor } from './command.executor'; -import { ExecutionsService } from './executions.service'; - -@Module({ - providers: [CommandExecutor, ExecutionsService], - exports: [ExecutionsService], -}) -export class ExecutionsModule {} diff --git a/src/executions/executions.service.spec.ts b/src/executions/executions.service.spec.ts deleted file mode 100644 index 0328dcf..0000000 --- a/src/executions/executions.service.spec.ts +++ /dev/null @@ -1,18 +0,0 @@ -import { Test, TestingModule } from '@nestjs/testing'; -import { ExecutionsService } from './executions.service'; - -describe('ExecutionsService', () => { - let service: ExecutionsService; - - beforeEach(async () => { - const module: TestingModule = await Test.createTestingModule({ - providers: [ExecutionsService], - }).compile(); - - service = module.get(ExecutionsService); - }); - - it('should be defined', () => { - expect(service).toBeDefined(); - }); -}); diff --git a/src/executions/executions.service.ts b/src/executions/executions.service.ts deleted file mode 100644 index 1af4906..0000000 --- a/src/executions/executions.service.ts +++ /dev/null @@ -1,102 +0,0 @@ -import { TransactionHost, Transactional } from '@nestjs-cls/transactional'; -import { TransactionalAdapterPrisma } from '@nestjs-cls/transactional-adapter-prisma'; -import { - BadRequestException, - Inject, - Injectable, - NotFoundException, -} from '@nestjs/common'; -import { EndpointType, PrismaClient } from '@prisma/client'; -import { CallgentsService } from '../callgents/callgents.service'; -import { EndpointDto } from '../endpoints/dto/endpoint.dto'; -import { EndpointsService } from '../endpoints/endpoints.service'; -import { JwtPayload } from '../infra/auth/jwt/jwt.service'; -import { CommandExecutor } from './command.executor'; - -/** - * An execution belongs to a task. Triggered by an external user or system, - * to one or more callgents. - */ -@Injectable() -export class ExecutionsService { - constructor( - private readonly txHost: TransactionHost, - private readonly callgentsService: CallgentsService, - @Inject('EndpointsService') - private readonly endpointsService: EndpointsService, - private readonly commandExecutor: CommandExecutor, - ) {} - - /** - * external client call in to a group of callgents. - * @param action ignored if multiple callgents - */ - @Transactional() - async execute( - callgentIds: string[], - reqAdaptorKey: string, - ctx: { taskId?: string; caller?: JwtPayload; callback?: string } = {}, - reqEndpointId?: string, - action?: string, - ) { - if (!callgentIds?.length) - throw new BadRequestException('callgentIds must be specified'); - - // client adaptor - const reqAdaptor = this.endpointsService.getAdaptor( - reqAdaptorKey, - EndpointType.CLIENT, - ); - if (!reqAdaptor) - throw new NotFoundException( - `Client endpoint adaptor not found, key=${reqAdaptorKey}`, - ); - - let reqEndpoint: EndpointDto; - if (reqEndpointId) { - reqEndpoint = await this.endpointsService.findOne(reqEndpointId); - if ( - !reqEndpoint || - reqEndpoint.type != EndpointType.CLIENT || - reqEndpoint.adaptorKey != reqAdaptorKey || - !callgentIds.includes(reqEndpoint.callgentId) - ) - throw new NotFoundException(`Endpoint not found, id=${reqEndpointId}`); - } - - // load callgents - const prisma = this.txHost.tx as PrismaClient; - const callgents = await prisma.callgent.findMany({ - where: { id: { in: callgentIds } }, - select: { id: true, name: true, summary: true }, - }); - if (callgents.length != callgentIds.length) - throw new NotFoundException( - `Callgent not found, id=${callgentIds - .filter((x) => !callgents.find((y) => y.id == x)) - .join(', ')}`, - ); - - // const req = reqAdaptor.toJson(rawReq, true, reqEndpoint); - - // FIXME when to persist req/resp into task - // FIXME task ctx, and vars stack - const stateCtx = { stack: [ctx] }; - - // FIXME merge system callgents, e.g., system event register, cmd entry creation - - // generate pseudo-command, and upserted vars stack - // const cmd = await this.agentsService.genPseudoCmd(callgents, stateCtx as any); - - // create a temp server endpoint to execute the cmd - - // entering regular instructions execution - // this.commandExecutor.cmd(cmd, stateCtx); - - // return this._invocationFlow( - // { endpoint: reqEndpoint, adaptor: reqAdaptor, req: rawReq }, - // callgentIds[0], - // action, - // ); - } -} From 318bdf21d1f85f74203e016fd2f1253148f16a4b Mon Sep 17 00:00:00 2001 From: dev-callgent Date: Sat, 21 Sep 2024 20:35:04 +0800 Subject: [PATCH 066/183] feat: callgent auth Signed-off-by: dev-callgent --- prisma/schema.prisma | 7 +- src/agents/agents.service.ts | 19 +++-- .../callgent-realms.service.ts | 8 +- src/callgent-realms/dto/realm-security.vo.ts | 24 ++++-- .../processors/api-key-auth.processor.ts | 10 ++- .../processors/auth-processor.base.ts | 18 ++--- src/callgents/callgents.service.ts | 2 + .../builtin/restapi/restapi.adaptor.ts | 19 ----- .../builtin/restapi/restapi.controller.ts | 12 ++- .../event-listeners.service.ts | 77 ++++++++++--------- src/event-listeners/event-object.ts | 2 - src/event-stores/event-stores.service.ts | 1 - 12 files changed, 99 insertions(+), 100 deletions(-) diff --git a/prisma/schema.prisma b/prisma/schema.prisma index fbeb35d..1aa68b2 100644 --- a/prisma/schema.prisma +++ b/prisma/schema.prisma @@ -158,9 +158,6 @@ model Callgent { tenantPk Int @default(dbgenerated("(current_setting('tenancy.tenantPk')::int)")) name String @db.VarChar(255) - /// @DtoCreateApiResponse - /// @DtoUpdateApiResponse - /// @DtoPlainApiResponse summary String? @db.VarChar(4095) /// @DtoReadOnly @@ -201,7 +198,7 @@ model CallgentFunction { summary String @default("") @db.VarChar(511) description String @default("") @db.VarChar(1023) /// @DtoCastType(RealmSecurityVO, ../../callgent-realms/dto/realm-security.vo) - securities Json[] @db.Json /// @description { realmPK: ["scopes"] } + securities Json[] @db.Json /// @description RealmSecurityVO[], where RealmSecurityVO{ [realmName]: RealmSecurityItem } params Json? @db.Json /// @description declaration of API params responses Json? @db.Json /// @description declaration of API responses rawJson Json @db.Json @@ -386,7 +383,7 @@ model Endpoint { /// @DtoReadOnly /// @DtoPlainApiResponse /// @DtoCastType(RealmSecurityVO, ../../callgent-realms/dto/realm-security.vo) - securities Json[] @db.Json /// @description { realmPK: ["scopes"] } + securities Json[] @db.Json /// @description RealmSecurityVO[], where RealmSecurityVO{ [realmName]: RealmSecurityItem } /// @DtoUpdateApiResponse /// @DtoPlainApiResponse diff --git a/src/agents/agents.service.ts b/src/agents/agents.service.ts index 5b915e0..47fe8e4 100644 --- a/src/agents/agents.service.ts +++ b/src/agents/agents.service.ts @@ -67,13 +67,16 @@ export class AgentsService { ); // emit progressive requesting event - const { data: prEvent, statusCode } = - await this.eventListenersService.emit( - new ProgressiveRequestEvent(srcId, id, cepAdaptor, { - progressive, - // mapped, - }), - ); + const { + data: prEvent, + statusCode, + message, + } = await this.eventListenersService.emit( + new ProgressiveRequestEvent(srcId, id, cepAdaptor, { + progressive, + // mapped, + }), + ); if (!statusCode) // direct return, no persistent async return this.map2FunctionProgressive(prEvent, reqEvent); @@ -81,7 +84,7 @@ export class AgentsService { if (statusCode == 2) // pending return { data: reqEvent, resumeFunName: 'map2FunctionProgressive' }; - throw new HttpException(prEvent.message, statusCode); + throw new HttpException(message, statusCode); } else { const functions = reqEvent.context.functions.filter( (f) => f.name == mapped.endpoint, diff --git a/src/callgent-realms/callgent-realms.service.ts b/src/callgent-realms/callgent-realms.service.ts index cc03671..6024ec8 100644 --- a/src/callgent-realms/callgent-realms.service.ts +++ b/src/callgent-realms/callgent-realms.service.ts @@ -45,10 +45,10 @@ export class CallgentRealmsService { async upsertRealm( endpoint: EndpointDto, scheme: Omit & { provider?: string }, - realm: Partial, + realm: Partial>, servers: ServerObject[], ) { - const authType = realm.scheme.type; + const authType = scheme.type; const processor = this._getAuthProcessor(authType); realm = processor.constructRealm(endpoint, scheme, realm, servers); const realmKey = realm.realmKey; @@ -66,7 +66,7 @@ export class CallgentRealmsService { ...realm, authType, realmKey, - scheme: realm.scheme as any, + scheme: scheme as any, }, }); @@ -76,7 +76,7 @@ export class CallgentRealmsService { callgentId, realmKey, authType, - scheme: realm.scheme as any, + scheme: scheme as any, }, }); } diff --git a/src/callgent-realms/dto/realm-security.vo.ts b/src/callgent-realms/dto/realm-security.vo.ts index 6e50384..e5c2089 100644 --- a/src/callgent-realms/dto/realm-security.vo.ts +++ b/src/callgent-realms/dto/realm-security.vo.ts @@ -1,17 +1,27 @@ -/** - * Reference properties to realm-scheme. - * multiple realms with and-relation - */ -export class RealmSecurityVO { - [realmPk: string]: RealmSecurityItem; -} +import { ApiExtraModels, ApiProperty } from '@nestjs/swagger'; export class RealmSecurityItem { + @ApiProperty({ + type: 'integer', + format: 'int32', + required: true, + }) realmPk: number; /** scopes for the security operation */ + @ApiProperty({ isArray: true, required: false, type: 'string' }) scopes?: string[]; /** whether to attach token to request, or validate token separately */ + @ApiProperty({ type: 'boolean', required: false }) attach?: boolean; } + +/** + * Reference properties to realm-scheme. + * multiple realms with and-relation + */ +@ApiExtraModels(RealmSecurityItem) +export class RealmSecurityVO { + [realmPk: string]: RealmSecurityItem; +} diff --git a/src/callgent-realms/processors/api-key-auth.processor.ts b/src/callgent-realms/processors/api-key-auth.processor.ts index 52e65ff..ca7f864 100644 --- a/src/callgent-realms/processors/api-key-auth.processor.ts +++ b/src/callgent-realms/processors/api-key-auth.processor.ts @@ -16,7 +16,7 @@ export class ApiKeyAuthProcessor extends AuthProcessor { endpoint: EndpointDto, servers?: { url: string }[], ) { - let url; + let url: string; if (endpoint.type != 'CLIENT') { url = endpoint.host; // whatever adaptor it is, host need to be a url } else if (servers?.length > 0) { @@ -30,7 +30,9 @@ export class ApiKeyAuthProcessor extends AuthProcessor { try { return new URL(url).hostname; } catch (e) { - throw new BadRequestException('Invalid security provider: must be url.'); + throw new BadRequestException( + 'Invalid security provider, must be url: ' + url, + ); } } @@ -43,9 +45,9 @@ export class ApiKeyAuthProcessor extends AuthProcessor { protected checkEnabled( scheme: RealmSchemeVO, - realm: Partial, + realm: Partial>, ) { - return realm.scheme.provider && !!realm.secret; + return scheme.provider && !!realm.secret; } protected isPerUser() { diff --git a/src/callgent-realms/processors/auth-processor.base.ts b/src/callgent-realms/processors/auth-processor.base.ts index 7954239..4e9c717 100644 --- a/src/callgent-realms/processors/auth-processor.base.ts +++ b/src/callgent-realms/processors/auth-processor.base.ts @@ -9,7 +9,7 @@ import { EventObject } from '../../event-listeners/event-object'; import { UserIdentity } from '../../user-identities/entities/user-identity.entity'; import { CallgentRealmDto } from '../dto/callgent-realm.dto'; import { AuthType, RealmSchemeVO } from '../dto/realm-scheme.vo'; -import { RealmSecurityItem, RealmSecurityVO } from '../dto/realm-security.vo'; +import { RealmSecurityVO } from '../dto/realm-security.vo'; import { CallgentRealm } from '../entities/callgent-realm.entity'; export abstract class AuthProcessor { @@ -17,17 +17,13 @@ export abstract class AuthProcessor { constructRealm( endpoint: EndpointDto, scheme: Omit & { provider?: string }, - realm: Partial, + realm: Partial>, servers?: ServerObject[], ) { // imply provider - if (!realm.scheme.provider) - realm.scheme.provider = this.implyProvider( - realm.scheme, - endpoint, - servers, - ); - realm.realmKey = this.getRealmKey(realm.scheme, realm.realm); + if (!scheme.provider) + scheme.provider = this.implyProvider(scheme, endpoint, servers); + realm.realmKey = this.getRealmKey(scheme as any, realm.realm); realm.perUser = this.isPerUser(scheme as any, realm); realm.enabled = this.checkEnabled(scheme as any, realm); @@ -64,12 +60,12 @@ export abstract class AuthProcessor { protected abstract checkEnabled( scheme: RealmSchemeVO, - realm: Partial, + realm: Partial>, ): boolean; protected abstract isPerUser( scheme: RealmSchemeVO, - realm: Partial, + realm: Partial>, ): boolean; /** diff --git a/src/callgents/callgents.service.ts b/src/callgents/callgents.service.ts index 5c575bc..f7db7a7 100644 --- a/src/callgents/callgents.service.ts +++ b/src/callgents/callgents.service.ts @@ -218,6 +218,7 @@ export class CallgentsService { /// hub actions + @Transactional() /** hub are those in tenantPk = -1 */ private async _onHubAction(fn: () => Promise): Promise { const tenantPk = this.tenancyService.getTenantId(); @@ -228,6 +229,7 @@ export class CallgentsService { this.tenancyService.setTenantId(tenantPk); } } + async findAllInHub(params: { select?: Prisma.CallgentSelect; where?: Prisma.CallgentWhereInput; diff --git a/src/endpoints/adaptors/builtin/restapi/restapi.adaptor.ts b/src/endpoints/adaptors/builtin/restapi/restapi.adaptor.ts index 78110aa..82100d9 100644 --- a/src/endpoints/adaptors/builtin/restapi/restapi.adaptor.ts +++ b/src/endpoints/adaptors/builtin/restapi/restapi.adaptor.ts @@ -11,25 +11,6 @@ import { ClientRequestEvent } from '../../../events/client-request.event'; import { EndpointAdaptor, EndpointConfig } from '../../endpoint-adaptor.base'; import { EndpointAdaptorName } from '../../endpoint-adaptor.decorator'; -class RequestJson { - url: string; - method: string; - headers?: { [key: string]: string }; - query?: { [key: string]: string }; - params?: { [key: string]: string }; - files?: { [key: string]: any }; - body?: any; - form?: any; -} - -class ResponseJson { - data: any; - dataType: string; - headers?: { [key: string]: string }; - status?: number; - statusText?: string; -} - @EndpointAdaptorName('restAPI', 'both') export class RestAPIAdaptor extends EndpointAdaptor { constructor(@Inject('AgentsService') readonly agentsService: AgentsService) { diff --git a/src/endpoints/adaptors/builtin/restapi/restapi.controller.ts b/src/endpoints/adaptors/builtin/restapi/restapi.controller.ts index 4cf6ef6..a556505 100644 --- a/src/endpoints/adaptors/builtin/restapi/restapi.controller.ts +++ b/src/endpoints/adaptors/builtin/restapi/restapi.controller.ts @@ -3,7 +3,6 @@ import { Controller, Get, Headers, - HttpException, Inject, NotFoundException, Param, @@ -11,7 +10,13 @@ import { Res, UseGuards, } from '@nestjs/common'; -import { ApiHeader, ApiOperation, ApiParam, ApiTags } from '@nestjs/swagger'; +import { + ApiHeader, + ApiOperation, + ApiParam, + ApiTags, + ApiUnauthorizedResponse, +} from '@nestjs/swagger'; import { EndpointType } from '@prisma/client'; import { CallgentsService } from '../../../../callgents/callgents.service'; import { EventListenersService } from '../../../../event-listeners/event-listeners.service'; @@ -38,7 +43,7 @@ export class RestApiController { @ApiParam({ name: 'id', required: true, - description: "comma separated callgent ids, eg: 'id1,id2,id3'. ", + description: 'Callgent id', }) @ApiParam({ name: 'endpointId', @@ -60,6 +65,7 @@ export class RestApiController { @ApiHeader({ name: 'x-callgent-callback', required: false }) @ApiHeader({ name: 'x-callgent-timeout', required: false }) @All(':id/:endpointId/invoke/api/*') + @ApiUnauthorizedResponse() async execute( @Req() req, @Res() res, diff --git a/src/event-listeners/event-listeners.service.ts b/src/event-listeners/event-listeners.service.ts index dbfbfef..e8704f3 100644 --- a/src/event-listeners/event-listeners.service.ts +++ b/src/event-listeners/event-listeners.service.ts @@ -55,7 +55,7 @@ export class EventListenersService { result, Utils.sleep(timeout).then(() => ({ data, - statusCode: data.statusCode, + statusCode: 1, message: `Sync invocation timeout(${timeout}ms), will respond via callback`, })), ]) @@ -121,44 +121,49 @@ export class EventListenersService { funName?: string, ): Promise<{ data: T; statusCode?: number; message?: string }> { // invoke listeners, supports persisted-async - let statusCode = 1; - for (let idx = 0; idx < listeners.length; ) { - const listener = listeners[idx++]; - try { - const result = await this._invokeListener(listener, event, funName); - // if no result, reuse event - result?.data && (event = result.data); - // if no result, empty funName - funName = result?.resumeFunName; + let [statusCode, idx] = [1, 0]; + try { + for (; idx < listeners.length; ) { + const listener = listeners[idx++]; + try { + const result = await this._invokeListener(listener, event, funName); + // if no result, reuse event + result?.data && (event = result.data); + // if no result, empty funName + funName = result?.resumeFunName; - statusCode = funName - ? 2 // pending - : event.stopPropagation || idx >= listeners.length - ? 0 // done - : 1; // processing - if (funName || event.stopPropagation) break; - } catch (e) { - statusCode = e.status || -1; // error - const message = (event.message = `[ERROR] ${e.name}: ${e.message}`); - e.status < 500 || this.logger.error(e); - return { data: event, statusCode, message }; - } finally { - const nextListener = - statusCode == 1 - ? listeners[idx] // processing: next - : statusCode == 0 || (statusCode > 2 && statusCode < 399) - ? null // success: null - : listener; // error/pending: current - - await this.eventStoresService.upsertEvent( - event, - funName || null, - nextListener?.id || null, - statusCode, - ); + statusCode = funName + ? 2 // pending + : event.stopPropagation || idx >= listeners.length + ? 0 // done + : 1; // processing + if (funName || event.stopPropagation) break; + } catch (e) { + statusCode = e.status || -1; // error + const message = `[ERROR] ${e.name}: ${e.message}`; + e.status < 500 || this.logger.error(e); + return { + data: { ...event, context: undefined }, + statusCode, + message, + }; + } } + return { data: { ...event, context: undefined }, statusCode }; + } finally { + const nextListener = + statusCode == 1 + ? listeners[idx] // processing: next + : statusCode == 0 || (statusCode > 2 && statusCode < 399) + ? null // success: null + : listeners[idx - 1]; // error/pending: current + await this.eventStoresService.upsertEvent( + event, + funName || null, + nextListener?.id || null, + statusCode, + ); } - return { data: event, statusCode }; } async loadListeners( diff --git a/src/event-listeners/event-object.ts b/src/event-listeners/event-object.ts index b4f7891..4c420f4 100644 --- a/src/event-listeners/event-object.ts +++ b/src/event-listeners/event-object.ts @@ -16,9 +16,7 @@ export class EventObject { this.id = Utils.uuid(); } public readonly id: string; - public statusCode = 1; // readonly, for response public readonly context: { [key: string]: any } = {}; - public message: string; public stopPropagation = false; public defaultPrevented = false; } diff --git a/src/event-stores/event-stores.service.ts b/src/event-stores/event-stores.service.ts index b69add7..eaaea97 100644 --- a/src/event-stores/event-stores.service.ts +++ b/src/event-stores/event-stores.service.ts @@ -48,7 +48,6 @@ export class EventStoresService { } const prisma = this.txHost.tx as PrismaClient; - event.statusCode = statusCode; const data: Prisma.EventStoreCreateInput = { ...event, funName, From 4c582a0b589dcff15f8593ffcaf7931f9ada320e Mon Sep 17 00:00:00 2001 From: dev-callgent Date: Sat, 21 Sep 2024 21:16:36 +0800 Subject: [PATCH 067/183] feat: callgent auth Signed-off-by: dev-callgent --- src/app.module.ts | 2 +- .../callgent-tree.controller.spec.ts | 0 .../callgent-tree.controller.ts | 0 .../callgent-tree.module.ts | 0 4 files changed, 1 insertion(+), 1 deletion(-) rename src/bff/{bff-callgent-tree => callgent-tree}/callgent-tree.controller.spec.ts (100%) rename src/bff/{bff-callgent-tree => callgent-tree}/callgent-tree.controller.ts (100%) rename src/bff/{bff-callgent-tree => callgent-tree}/callgent-tree.module.ts (100%) diff --git a/src/app.module.ts b/src/app.module.ts index 66eb8a6..1c06845 100644 --- a/src/app.module.ts +++ b/src/app.module.ts @@ -5,7 +5,7 @@ import { AgentsModule } from './agents/agents.module'; import { AppController } from './app.controller'; import { AppService } from './app.service'; import { AuthTokensModule } from './auth-tokens/auth-tokens.module'; -import { CallgentTreeModule } from './bff/bff-callgent-tree/callgent-tree.module'; +import { CallgentTreeModule } from './bff/callgent-tree/callgent-tree.module'; import { BffCallgentFunctionsModule } from './bff/callgent-functions/bff-callgent-functions.module'; import { CallgentHubModule } from './bff/callgent-hub/callgent-hub.module'; import { CallgentFunctionsModule } from './callgent-functions/callgent-functions.module'; diff --git a/src/bff/bff-callgent-tree/callgent-tree.controller.spec.ts b/src/bff/callgent-tree/callgent-tree.controller.spec.ts similarity index 100% rename from src/bff/bff-callgent-tree/callgent-tree.controller.spec.ts rename to src/bff/callgent-tree/callgent-tree.controller.spec.ts diff --git a/src/bff/bff-callgent-tree/callgent-tree.controller.ts b/src/bff/callgent-tree/callgent-tree.controller.ts similarity index 100% rename from src/bff/bff-callgent-tree/callgent-tree.controller.ts rename to src/bff/callgent-tree/callgent-tree.controller.ts diff --git a/src/bff/bff-callgent-tree/callgent-tree.module.ts b/src/bff/callgent-tree/callgent-tree.module.ts similarity index 100% rename from src/bff/bff-callgent-tree/callgent-tree.module.ts rename to src/bff/callgent-tree/callgent-tree.module.ts From aeedd9a3daa21b32e10aa2100ddde8837294c694 Mon Sep 17 00:00:00 2001 From: dev-callgent Date: Sun, 22 Sep 2024 00:04:43 +0800 Subject: [PATCH 068/183] feat: callgent realm apis Signed-off-by: dev-callgent --- .../migration.sql | 14 +- prisma/schema.prisma | 37 ++++- .../callgent-hub/callgent-hub.controller.ts | 2 +- .../callgent-realms.controller.spec.ts | 18 +++ .../callgent-realms.controller.ts | 134 ++++++++++++++++++ src/callgent-realms/callgent-realms.module.ts | 2 + .../callgent-realms.service.ts | 89 +++++++++++- .../processors/api-key-auth.processor.ts | 16 ++- .../processors/auth-processor.base.ts | 16 ++- src/callgents/callgents.controller.ts | 16 +-- src/callgents/callgents.service.ts | 42 +++--- src/users/users.controller.ts | 2 +- 12 files changed, 332 insertions(+), 56 deletions(-) create mode 100644 src/callgent-realms/callgent-realms.controller.spec.ts create mode 100644 src/callgent-realms/callgent-realms.controller.ts diff --git a/prisma/migrations/20240918072319_callgent_realm/migration.sql b/prisma/migrations/20240918072319_callgent_realm/migration.sql index 5ff9601..108cdaf 100644 --- a/prisma/migrations/20240918072319_callgent_realm/migration.sql +++ b/prisma/migrations/20240918072319_callgent_realm/migration.sql @@ -20,11 +20,12 @@ DROP TYPE "EndpointAuthType"; -- CreateTable CREATE TABLE "CallgentRealm" ( "pk" SERIAL NOT NULL, + "tenantPk" INTEGER NOT NULL DEFAULT (current_setting('tenancy.tenantPk')::int), "callgentId" VARCHAR(36) NOT NULL, "realmKey" VARCHAR(256) NOT NULL, "authType" VARCHAR(16) NOT NULL, "realm" VARCHAR(16) NOT NULL DEFAULT '', - "scheme" JSON, + "scheme" JSON NOT NULL, "secret" JSON, "perUser" BOOLEAN NOT NULL DEFAULT false, "enabled" BOOLEAN NOT NULL DEFAULT true, @@ -38,3 +39,14 @@ CREATE TABLE "CallgentRealm" ( -- CreateIndex CREATE INDEX "CallgentRealm_callgentId_idx" ON "CallgentRealm"("callgentId"); CREATE UNIQUE INDEX "CallgentRealm_callgentId_realmKey_key" ON "CallgentRealm"("callgentId", "realmKey"); +-- CreateIndex +CREATE INDEX "CallgentRealm_tenantPk_idx" ON "CallgentRealm"("tenantPk"); + +-- Enable Row Level Security +ALTER TABLE "CallgentRealm" ENABLE ROW LEVEL SECURITY; +-- Force Row Level Security for table owners +ALTER TABLE "CallgentRealm" FORCE ROW LEVEL SECURITY; +-- Create row security policies +CREATE POLICY tenant_isolation_policy ON "CallgentRealm" USING ("tenantPk" = COALESCE(NULLIF(current_setting('tenancy.tenantPk', TRUE), ''), '0')::int); +-- Create policies to bypass RLS (optional) +CREATE POLICY bypass_rls_policy ON "CallgentRealm" USING (current_setting('tenancy.bypass_rls', TRUE)::text = 'on'); diff --git a/prisma/schema.prisma b/prisma/schema.prisma index 1aa68b2..7a5677b 100644 --- a/prisma/schema.prisma +++ b/prisma/schema.prisma @@ -228,19 +228,43 @@ model CallgentFunction { /// @description security realms for callgent model CallgentRealm { - pk Int @id @default(autoincrement()) + /// @DtoReadOnly + /// @DtoPlainApiResponse + pk Int @id @default(autoincrement()) + /// @DtoReadOnly + /// @DtoEntityHidden + // add to migration.sql + tenantPk Int @default(dbgenerated("(current_setting('tenancy.tenantPk')::int)")) + /// @DtoUpdateApiResponse + /// @DtoPlainApiResponse + /// @CustomValidator(EntityIdExists, 'callgent', 'id', ../../infra/repo/validators/entity-exists.validator) callgentId String @db.VarChar(36) + /// @DtoCreateApiResponse + /// @DtoUpdateApiResponse + /// @DtoPlainApiResponse realmKey String @db.VarChar(256) /// @description unique[callgentId, realmKey], to identify same realm in callgent. - authType String @db.VarChar(16) /// @description auth type, 'apiKey' | 'http' | 'oauth2' | 'openIdConnect' | ..etc. - realm String @default("") @db.VarChar(16) /// @description provider defined realm name, or '' for default realm + /// @DtoCreateApiResponse + /// @DtoUpdateApiResponse + /// @DtoPlainApiResponse + authType String @db.VarChar(16) /// @description auth type, 'apiKey' | 'http' | 'oauth2' | 'openIdConnect' | 'password' | ..etc. + /// @description provider defined realm name, or '' for default realm + /// @IsOptional() + realm String? @default("") @db.VarChar(16) + /// @DtoUpdateOptional /// @DtoCastType(RealmSchemeVO, ../dto/realm-scheme.vo) - scheme Json? @db.Json /// @description security scheme, with all public configs + scheme Json @db.Json /// @description security scheme, with all public configs secret Json? @db.Json /// @description security secret, with all private configs - perUser Boolean @default(false) /// @description whether the realm is per user auth - enabled Boolean @default(true) /// @description whether the realm is enabled + /// @DtoCreateApiResponse + /// @DtoUpdateApiResponse + /// @DtoPlainApiResponse + perUser Boolean @default(false) /// @description whether the realm is per user auth + /// @DtoCreateApiResponse + /// @DtoUpdateApiResponse + /// @DtoPlainApiResponse + enabled Boolean @default(true) /// @description whether the realm is enabled createdAt DateTime @default(now()) updatedAt DateTime @default(now()) @updatedAt @@ -251,6 +275,7 @@ model CallgentRealm { @@unique([callgentId, realmKey]) @@index(callgentId) + @@index(tenantPk) } // model RealmToken merged into UserIdentity diff --git a/src/bff/callgent-hub/callgent-hub.controller.ts b/src/bff/callgent-hub/callgent-hub.controller.ts index 111f499..7927c72 100644 --- a/src/bff/callgent-hub/callgent-hub.controller.ts +++ b/src/bff/callgent-hub/callgent-hub.controller.ts @@ -19,7 +19,7 @@ export class CallgentHubController { @ApiQuery({ name: 'perPage', required: false, type: Number }) @ApiOkResponse({ schema: { - anyOf: [ + allOf: [ { $ref: getSchemaPath(RestApiResponse) }, { properties: { diff --git a/src/callgent-realms/callgent-realms.controller.spec.ts b/src/callgent-realms/callgent-realms.controller.spec.ts new file mode 100644 index 0000000..2ba66e5 --- /dev/null +++ b/src/callgent-realms/callgent-realms.controller.spec.ts @@ -0,0 +1,18 @@ +import { Test, TestingModule } from '@nestjs/testing'; +import { CallgentRealmsController } from './callgent-realms.controller'; + +describe('CallgentRealmsController', () => { + let controller: CallgentRealmsController; + + beforeEach(async () => { + const module: TestingModule = await Test.createTestingModule({ + controllers: [CallgentRealmsController], + }).compile(); + + controller = module.get(CallgentRealmsController); + }); + + it('should be defined', () => { + expect(controller).toBeDefined(); + }); +}); diff --git a/src/callgent-realms/callgent-realms.controller.ts b/src/callgent-realms/callgent-realms.controller.ts new file mode 100644 index 0000000..d078585 --- /dev/null +++ b/src/callgent-realms/callgent-realms.controller.ts @@ -0,0 +1,134 @@ +import { + Body, + Controller, + Get, + Inject, + Param, + Put, + UseGuards, +} from '@nestjs/common'; +import { + ApiExtraModels, + ApiOkResponse, + ApiSecurity, + ApiTags, + getSchemaPath, +} from '@nestjs/swagger'; +import { JwtGuard } from '../infra/auth/jwt/jwt.guard'; +import { RestApiResponse } from '../restapi/response.interface'; +import { CallgentRealmsService } from './callgent-realms.service'; +import { CallgentRealmDto } from './dto/callgent-realm.dto'; +import { UpdateCallgentRealmDto } from './dto/update-callgent-realm.dto'; + +@ApiTags('CallgentRealms') +@ApiSecurity('defaultBearerAuth') +@ApiExtraModels(RestApiResponse, CallgentRealmDto) +@UseGuards(JwtGuard) +@Controller('callgent-realms') +export class CallgentRealmsController { + constructor( + @Inject('CallgentRealmsService') + private readonly callgentRealmsService: CallgentRealmsService, + ) {} + + @ApiOkResponse({ + schema: { + allOf: [ + { $ref: getSchemaPath(RestApiResponse) }, + { + properties: { + data: { + $ref: getSchemaPath(CallgentRealmDto), + }, + }, + }, + { + properties: { + data: { + properties: { + secret: { + type: 'boolean', + description: 'secret is masked, true means set', + }, + }, + }, + }, + }, + ], + }, + }) + @Get(':callgentId/:realmKey') + async findOne( + @Param('callgentId') callgentId: string, + @Param('realmKey') realmKey: string, + ) { + const data = await this.callgentRealmsService + .findOne(callgentId, realmKey, { pk: false }) + .then((r) => ({ ...r, secret: r.secret ? true : false })); + return { data }; + } + + @ApiOkResponse({ + schema: { + allOf: [ + { $ref: getSchemaPath(RestApiResponse) }, + { + properties: { + data: { + type: 'array', + items: { $ref: getSchemaPath(CallgentRealmDto) }, + }, + }, + }, + { + properties: { + data: { + type: 'array', + items: { + properties: { + secret: { + type: 'boolean', + description: 'secret is masked, true means set', + }, + }, + }, + }, + }, + }, + ], + }, + }) + @Get(':callgentId') + async findAll(@Param('callgentId') callgentId: string) { + const data = await this.callgentRealmsService + .findAll({ + select: { pk: false }, + where: { callgentId }, + }) + .then((r) => r.map((d) => ({ ...d, secret: d.secret ? true : false }))); + return { data }; + } + + @ApiOkResponse({ + schema: { + allOf: [ + { $ref: getSchemaPath(RestApiResponse) }, + { properties: { data: { $ref: getSchemaPath(CallgentRealmDto) } } }, + ], + }, + }) + @Put(':callgentId/:realmKey') + async update( + @Param('callgentId') callgentId: string, + @Param('realmKey') realmKey: string, + @Body() dto: UpdateCallgentRealmDto, + ) { + const data = await this.callgentRealmsService.update( + callgentId, + realmKey, + dto, + { pk: false }, + ); + return { data }; + } +} diff --git a/src/callgent-realms/callgent-realms.module.ts b/src/callgent-realms/callgent-realms.module.ts index cc303b8..3b8179b 100644 --- a/src/callgent-realms/callgent-realms.module.ts +++ b/src/callgent-realms/callgent-realms.module.ts @@ -3,6 +3,7 @@ import { EndpointsModule } from '../endpoints/endpoints.module'; import { UsersModule } from '../users/users.module'; import { CallgentRealmsService } from './callgent-realms.service'; import { ApiKeyAuthProcessor } from './processors/api-key-auth.processor'; +import { CallgentRealmsController } from './callgent-realms.controller'; @Module({ imports: [EndpointsModule, UsersModule], @@ -11,5 +12,6 @@ import { ApiKeyAuthProcessor } from './processors/api-key-auth.processor'; { provide: 'apiKey-authProcessor', useClass: ApiKeyAuthProcessor }, ], exports: ['CallgentRealmsService'], + controllers: [CallgentRealmsController], }) export class CallgentRealmsModule {} diff --git a/src/callgent-realms/callgent-realms.service.ts b/src/callgent-realms/callgent-realms.service.ts index 6024ec8..d0cd5a6 100644 --- a/src/callgent-realms/callgent-realms.service.ts +++ b/src/callgent-realms/callgent-realms.service.ts @@ -1,6 +1,7 @@ import { Transactional, TransactionHost } from '@nestjs-cls/transactional'; import { TransactionalAdapterPrisma } from '@nestjs-cls/transactional-adapter-prisma'; import { + BadRequestException, Inject, Injectable, NotFoundException, @@ -17,6 +18,7 @@ import { UsersService } from '../users/users.service'; import { CallgentRealmDto } from './dto/callgent-realm.dto'; import { RealmSchemeVO } from './dto/realm-scheme.vo'; import { RealmSecurityItem, RealmSecurityVO } from './dto/realm-security.vo'; +import { UpdateCallgentRealmDto } from './dto/update-callgent-realm.dto'; import { CallgentRealm } from './entities/callgent-realm.entity'; import { AuthProcessor } from './processors/auth-processor.base'; @@ -45,12 +47,12 @@ export class CallgentRealmsService { async upsertRealm( endpoint: EndpointDto, scheme: Omit & { provider?: string }, - realm: Partial>, + realm: Partial>, servers: ServerObject[], ) { const authType = scheme.type; const processor = this._getAuthProcessor(authType); - realm = processor.constructRealm(endpoint, scheme, realm, servers); + realm = processor.constructRealm(scheme, realm, endpoint, servers); const realmKey = realm.realmKey; const callgentId = endpoint.callgentId; const prisma = this.txHost.tx as PrismaClient; @@ -220,7 +222,7 @@ export class CallgentRealmsService { * @param noError if false, throw error if realm not enabled */ protected async _loadRealm(security: RealmSecurityItem, noError = false) { - const realm = await this.findOne(security.realmPk, {}); + const realm = await this._findOne(security.realmPk, {}); if (!realm?.enabled) { if (noError) return { realm }; throw new UnauthorizedException( @@ -249,7 +251,15 @@ export class CallgentRealmsService { return this.usersService.$findFirstUserIdentity(userId, '' + realm.pk); } - findOne(pk: number, select?: Prisma.CallgentRealmSelect) { + /** + * @param authType @see AuthType + */ + protected _getAuthProcessor(authType: string): AuthProcessor { + return this.moduleRef.get(authType + '-authProcessor'); + } + + @Transactional() + protected _findOne(pk: number, select?: Prisma.CallgentRealmSelect) { const prisma = this.txHost.tx as PrismaClient; return selectHelper( select, @@ -262,10 +272,75 @@ export class CallgentRealmsService { ) as unknown as Promise; } + @Transactional() + findOne( + callgentId: string, + realmKey: string, + select?: Prisma.CallgentRealmSelect, + ) { + const prisma = this.txHost.tx as PrismaClient; + return selectHelper( + select, + (select) => + prisma.callgentRealm.findUnique({ + select, + where: { callgentId_realmKey: { callgentId, realmKey } }, + }), + this.defSelect, + ) as unknown as Promise; + } + + @Transactional() + findAll({ + select, + where, + orderBy = { pk: 'desc' }, + }: { + select?: Prisma.CallgentRealmSelect; + where?: Prisma.CallgentRealmWhereInput; + orderBy?: Prisma.CallgentRealmOrderByWithRelationInput; + }) { + const prisma = this.txHost.tx as PrismaClient; + return selectHelper( + select, + (select) => + prisma.callgentRealm.findMany({ + where, + select, + orderBy, + }), + this.defSelect, + ); + } + /** - * @param authType @see AuthType + * update realm, refresh { realmKey, enabled } */ - protected _getAuthProcessor(authType: string): AuthProcessor { - return this.moduleRef.get(authType + '-authProcessor'); + @Transactional() + async update( + callgentId: string, + realmKey: string, + dto: UpdateCallgentRealmDto, + select?: Prisma.CallgentRealmSelect, + ) { + const prisma = this.txHost.tx as PrismaClient; + const old = await this.findOne(callgentId, realmKey); + dto = { ...old, ...dto }; // merge + if (!dto.scheme) throw new BadRequestException('realm.scheme is required'); + + dto.authType = dto.scheme.type; + const processor = this._getAuthProcessor(dto.authType); + dto = processor.constructRealm(dto.scheme, dto as any); + + return selectHelper( + select, + (select) => + prisma.callgentRealm.update({ + select, + where: { callgentId_realmKey: { callgentId, realmKey } }, + data: { ...dto, scheme: dto.scheme as any }, + }), + this.defSelect, + ); } } diff --git a/src/callgent-realms/processors/api-key-auth.processor.ts b/src/callgent-realms/processors/api-key-auth.processor.ts index ca7f864..8a177bd 100644 --- a/src/callgent-realms/processors/api-key-auth.processor.ts +++ b/src/callgent-realms/processors/api-key-auth.processor.ts @@ -4,7 +4,6 @@ import { EndpointDto } from '../../endpoints/dto/endpoint.dto'; import { ClientRequestEvent } from '../../endpoints/events/client-request.event'; import { EventObject } from '../../event-listeners/event-object'; import { UserIdentity } from '../../user-identities/entities/user-identity.entity'; -import { CallgentRealmDto } from '../dto/callgent-realm.dto'; import { RealmSchemeVO } from '../dto/realm-scheme.vo'; import { CallgentRealm } from '../entities/callgent-realm.entity'; import { AuthProcessor } from './auth-processor.base'; @@ -13,11 +12,11 @@ import { AuthProcessor } from './auth-processor.base'; export class ApiKeyAuthProcessor extends AuthProcessor { protected implyProvider( scheme: SecuritySchemeObject, - endpoint: EndpointDto, + endpoint?: EndpointDto, servers?: { url: string }[], ) { let url: string; - if (endpoint.type != 'CLIENT') { + if (endpoint && endpoint.type != 'CLIENT') { url = endpoint.host; // whatever adaptor it is, host need to be a url } else if (servers?.length > 0) { url = servers[0].url; @@ -45,9 +44,16 @@ export class ApiKeyAuthProcessor extends AuthProcessor { protected checkEnabled( scheme: RealmSchemeVO, - realm: Partial>, + realm: Partial>, ) { - return scheme.provider && !!realm.secret; + if (!realm.secret || !scheme.provider) return false; + return this.validateSecretFormat(realm); + } + + protected validateSecretFormat( + realm: Partial>, + ) { + return typeof realm.secret == 'string'; } protected isPerUser() { diff --git a/src/callgent-realms/processors/auth-processor.base.ts b/src/callgent-realms/processors/auth-processor.base.ts index 4e9c717..04e3b2f 100644 --- a/src/callgent-realms/processors/auth-processor.base.ts +++ b/src/callgent-realms/processors/auth-processor.base.ts @@ -7,7 +7,6 @@ import { EndpointDto } from '../../endpoints/dto/endpoint.dto'; import { ClientRequestEvent } from '../../endpoints/events/client-request.event'; import { EventObject } from '../../event-listeners/event-object'; import { UserIdentity } from '../../user-identities/entities/user-identity.entity'; -import { CallgentRealmDto } from '../dto/callgent-realm.dto'; import { AuthType, RealmSchemeVO } from '../dto/realm-scheme.vo'; import { RealmSecurityVO } from '../dto/realm-security.vo'; import { CallgentRealm } from '../entities/callgent-realm.entity'; @@ -15,9 +14,9 @@ import { CallgentRealm } from '../entities/callgent-realm.entity'; export abstract class AuthProcessor { /** fill in necessary realm properties */ constructRealm( - endpoint: EndpointDto, scheme: Omit & { provider?: string }, - realm: Partial>, + realm: Partial>, + endpoint?: EndpointDto, servers?: ServerObject[], ) { // imply provider @@ -51,7 +50,7 @@ export abstract class AuthProcessor { */ protected abstract implyProvider( scheme: Omit & { type: AuthType }, - endpoint: EndpointDto, + endpoint?: EndpointDto, servers?: { url: string }[], ): string; @@ -60,12 +59,17 @@ export abstract class AuthProcessor { protected abstract checkEnabled( scheme: RealmSchemeVO, - realm: Partial>, + realm: Partial>, + ): boolean; + + protected abstract validateSecretFormat( + realm: Partial>, + scheme: RealmSchemeVO, ): boolean; protected abstract isPerUser( scheme: RealmSchemeVO, - realm: Partial>, + realm: Partial>, ): boolean; /** diff --git a/src/callgents/callgents.controller.ts b/src/callgents/callgents.controller.ts index 0cbbfa2..e830ee9 100644 --- a/src/callgents/callgents.controller.ts +++ b/src/callgents/callgents.controller.ts @@ -32,7 +32,7 @@ import { UpdateCallgentDto } from './dto/update-callgent.dto'; @UseGuards(JwtGuard) @Controller('callgents') export class CallgentsController { - constructor(private readonly callgentService: CallgentsService) {} + constructor(private readonly callgentsService: CallgentsService) {} @ApiCreatedResponse({ schema: { @@ -45,7 +45,7 @@ export class CallgentsController { @Post() async create(@Req() req, @Body() dto: CreateCallgentDto) { return { - data: await this.callgentService.create(dto, req.user.sub), + data: await this.callgentsService.create(dto, req.user.sub), }; } @@ -59,7 +59,7 @@ export class CallgentsController { }) @Get('/:id') async findOne(@Param('id') id: string) { - return { data: await this.callgentService.findOne(id) }; + return { data: await this.callgentsService.findOne(id) }; } @ApiQuery({ name: 'query', required: false, type: String }) @@ -67,7 +67,7 @@ export class CallgentsController { @ApiQuery({ name: 'perPage', required: false, type: Number }) @ApiOkResponse({ schema: { - anyOf: [ + allOf: [ { $ref: getSchemaPath(RestApiResponse) }, { properties: { @@ -89,7 +89,7 @@ export class CallgentsController { name: { contains: query.queryString }, } : undefined; - const list = await this.callgentService.findAll({ + const list = await this.callgentsService.findMany({ page: query.page, perPage: query.perPage, where, @@ -109,7 +109,7 @@ export class CallgentsController { @Put('/:id') async update(@Param('id') id: string, @Body() dto: UpdateCallgentDto) { dto.id = id; - return { data: await this.callgentService.update(dto) }; + return { data: await this.callgentsService.update(dto) }; } @ApiCreatedResponse({ @@ -127,7 +127,7 @@ export class CallgentsController { @Body() dto: CreateCallgentDto, ) { return { - data: await this.callgentService.duplicateOverTenancy( + data: await this.callgentsService.duplicateOverTenancy( id, dto, req.user.sub, @@ -149,6 +149,6 @@ export class CallgentsController { }) @Delete('/:id') async remove(@Param('id') id: string) { - return { data: await this.callgentService.delete(id) }; + return { data: await this.callgentsService.delete(id) }; } } diff --git a/src/callgents/callgents.service.ts b/src/callgents/callgents.service.ts index f7db7a7..6d2af5b 100644 --- a/src/callgents/callgents.service.ts +++ b/src/callgents/callgents.service.ts @@ -51,7 +51,7 @@ export class CallgentsService { } @Transactional() - findAll({ + findMany({ select, where, orderBy = { pk: 'desc' }, @@ -87,27 +87,27 @@ export class CallgentsService { ); } - async findMany(ids: string[], select?: Prisma.CallgentSelect) { - const prisma = this.txHost.tx as PrismaClient; + // async findAll(ids: string[], select?: Prisma.CallgentSelect) { + // const prisma = this.txHost.tx as PrismaClient; - const callgents = await selectHelper( - select, - async (select) => - await prisma.callgent.findMany({ - where: { id: { in: ids } }, - select, - }), - this.defSelect, - ); + // const callgents = await selectHelper( + // select, + // async (select) => + // await prisma.callgent.findMany({ + // where: { id: { in: ids } }, + // select, + // }), + // this.defSelect, + // ); - if (callgents.length != ids.length) - throw new NotFoundException( - `Callgent not found, id=${ids - .filter((x) => !callgents.find((y) => y.id == x)) - .join(', ')}`, - ); - return callgents; - } + // if (callgents.length != ids.length) + // throw new NotFoundException( + // `Callgent not found, id=${ids + // .filter((x) => !callgents.find((y) => y.id == x)) + // .join(', ')}`, + // ); + // return callgents; + // } @Transactional() delete(id: string) { @@ -237,7 +237,7 @@ export class CallgentsService { page?: number; perPage?: number; }) { - return this._onHubAction(() => this.findAll(params)); + return this._onHubAction(() => this.findMany(params)); } @Transactional() diff --git a/src/users/users.controller.ts b/src/users/users.controller.ts index 791d6a4..780e63a 100644 --- a/src/users/users.controller.ts +++ b/src/users/users.controller.ts @@ -81,7 +81,7 @@ export class UsersController { }) @ApiCreatedResponse({ schema: { - anyOf: [ + allOf: [ { $ref: getSchemaPath(RestApiResponse) }, { properties: { data: { type: 'boolean' } } }, ], From 1d934afde4345288e9f687adcd5d7ce415dd75ad Mon Sep 17 00:00:00 2001 From: dev-callgent Date: Sun, 22 Sep 2024 21:24:03 +0800 Subject: [PATCH 069/183] feat: callgent auth process Signed-off-by: dev-callgent --- .../callgent-realms.controller.ts | 28 ++++-- .../callgent-realms.service.ts | 36 ++++--- src/callgent-realms/dto/realm-scheme.vo.ts | 12 +++ .../processors/api-key-auth.processor.ts | 95 +++++++++++++------ .../processors/auth-processor.base.ts | 78 ++++++++++----- .../adaptors/builtin/email/email.adaptor.ts | 5 +- .../builtin/restapi/restapi.adaptor.ts | 23 +++-- .../adaptors/builtin/web/webpage.adaptor.ts | 10 +- .../adaptors/endpoint-adaptor.base.ts | 9 +- src/endpoints/endpoints.service.ts | 4 +- src/infra/repo/prisma.middlewares.ts | 5 +- 11 files changed, 206 insertions(+), 99 deletions(-) diff --git a/src/callgent-realms/callgent-realms.controller.ts b/src/callgent-realms/callgent-realms.controller.ts index d078585..a19be24 100644 --- a/src/callgent-realms/callgent-realms.controller.ts +++ b/src/callgent-realms/callgent-realms.controller.ts @@ -62,9 +62,10 @@ export class CallgentRealmsController { @Param('callgentId') callgentId: string, @Param('realmKey') realmKey: string, ) { + // TODO realmKey may be in body const data = await this.callgentRealmsService .findOne(callgentId, realmKey, { pk: false }) - .then((r) => ({ ...r, secret: r.secret ? true : false })); + .then((r) => r && { ...r, secret: r.secret ? true : false }); return { data }; } @@ -105,7 +106,7 @@ export class CallgentRealmsController { select: { pk: false }, where: { callgentId }, }) - .then((r) => r.map((d) => ({ ...d, secret: d.secret ? true : false }))); + .then((r) => r?.map((d) => ({ ...d, secret: d.secret ? true : false }))); return { data }; } @@ -114,6 +115,18 @@ export class CallgentRealmsController { allOf: [ { $ref: getSchemaPath(RestApiResponse) }, { properties: { data: { $ref: getSchemaPath(CallgentRealmDto) } } }, + { + properties: { + data: { + properties: { + secret: { + type: 'boolean', + description: 'secret is masked, true means set', + }, + }, + }, + }, + }, ], }, }) @@ -123,12 +136,11 @@ export class CallgentRealmsController { @Param('realmKey') realmKey: string, @Body() dto: UpdateCallgentRealmDto, ) { - const data = await this.callgentRealmsService.update( - callgentId, - realmKey, - dto, - { pk: false }, - ); + // TODO realmKey may be in body + const data = await this.callgentRealmsService + .update(callgentId, realmKey, dto, { pk: false }) + .then((r) => r && { ...r, secret: r.secret ? true : false }); + return { data }; } } diff --git a/src/callgent-realms/callgent-realms.service.ts b/src/callgent-realms/callgent-realms.service.ts index d0cd5a6..e04f97e 100644 --- a/src/callgent-realms/callgent-realms.service.ts +++ b/src/callgent-realms/callgent-realms.service.ts @@ -15,7 +15,6 @@ import { EndpointsService } from '../endpoints/endpoints.service'; import { ClientRequestEvent } from '../endpoints/events/client-request.event'; import { selectHelper } from '../infra/repo/select.helper'; import { UsersService } from '../users/users.service'; -import { CallgentRealmDto } from './dto/callgent-realm.dto'; import { RealmSchemeVO } from './dto/realm-scheme.vo'; import { RealmSecurityItem, RealmSecurityVO } from './dto/realm-security.vo'; import { UpdateCallgentRealmDto } from './dto/update-callgent-realm.dto'; @@ -33,6 +32,7 @@ export class CallgentRealmsService { private readonly moduleRef: ModuleRef, ) {} protected readonly defSelect: Prisma.CallgentRealmSelect = { + tenantPk: false, createdAt: false, updatedAt: false, deletedAt: false, @@ -176,30 +176,26 @@ export class CallgentRealmsService { if (!realm?.enabled) return false; // read existing from token store - const token = await this.findUserToken(realm, reqEvent.data.callerId); - if (token) { + const userToken = await this.findUserToken(realm, reqEvent.data.callerId); + if (userToken) { // invoke validation url. TODO security as arg - const result = await processor.validateToken(token, reqEvent, realm); - if (result) return { data: reqEvent }; // valid/attached token - // async - if (result !== false) - return { data: reqEvent, resumeFunName: 'postValidateToken' }; + const result = await processor.validateToken( + userToken.credentials, + reqEvent, + realm, + ); + if (result) return result; // valid/attach or async // else invalid, continue to refresh token process } // if not valid, start auth process - const ret = await processor.authProcess(reqEvent, realm); + const ret = await processor.authProcess(realm, item, reqEvent); if (ret) return ret; // async // self provider same as third return this.postAuthProcess(reqEvent); } - /** if valid, goon, if not start process, if unsure re-validate */ - async postValidateToken( - reqEvent: ClientRequestEvent, - ): Promise {} - /** delegate to auth processor */ async postAcquireSecret( reqEvent: ClientRequestEvent, @@ -218,6 +214,18 @@ export class CallgentRealmsService { return processor.postExchangeToken(reqEvent, realm); } + /** + * delegate to auth processor, + * if valid, goon, if not start process, if unsure re-validate + */ + async postValidateToken( + reqEvent: ClientRequestEvent, + ): Promise { + const item: RealmSecurityItem = reqEvent.context.securityItem; + const { realm, processor } = await this._loadRealm(item); + return processor.postValidateToken(reqEvent, realm); + } + /** * @param noError if false, throw error if realm not enabled */ diff --git a/src/callgent-realms/dto/realm-scheme.vo.ts b/src/callgent-realms/dto/realm-scheme.vo.ts index c81922d..c120462 100644 --- a/src/callgent-realms/dto/realm-scheme.vo.ts +++ b/src/callgent-realms/dto/realm-scheme.vo.ts @@ -23,3 +23,15 @@ export class RealmSchemeVO { flows?: OAuthFlowsObject; openIdConnectUrl?: string; } + +/** + * #/definitions/APIKeySecurityScheme + * @see https://github.com/OAI/OpenAPI-Specification/blob/main/schemas/v3.0/schema.json + */ +export interface APIKeySecurityScheme { + type: 'apiKey'; + name: string; + in: 'header' | 'query' | 'cookie'; + description?: string; + [key: `x-${string}`]: any; +} diff --git a/src/callgent-realms/processors/api-key-auth.processor.ts b/src/callgent-realms/processors/api-key-auth.processor.ts index 8a177bd..3e4548b 100644 --- a/src/callgent-realms/processors/api-key-auth.processor.ts +++ b/src/callgent-realms/processors/api-key-auth.processor.ts @@ -1,10 +1,13 @@ -import { BadRequestException, Injectable } from '@nestjs/common'; +import { + BadRequestException, + Injectable, + UnauthorizedException, +} from '@nestjs/common'; import { SecuritySchemeObject } from '@nestjs/swagger/dist/interfaces/open-api-spec.interface'; import { EndpointDto } from '../../endpoints/dto/endpoint.dto'; import { ClientRequestEvent } from '../../endpoints/events/client-request.event'; -import { EventObject } from '../../event-listeners/event-object'; -import { UserIdentity } from '../../user-identities/entities/user-identity.entity'; -import { RealmSchemeVO } from '../dto/realm-scheme.vo'; +import { APIKeySecurityScheme, RealmSchemeVO } from '../dto/realm-scheme.vo'; +import { RealmSecurityItem } from '../dto/realm-security.vo'; import { CallgentRealm } from '../entities/callgent-realm.entity'; import { AuthProcessor } from './auth-processor.base'; @@ -60,46 +63,80 @@ export class ApiKeyAuthProcessor extends AuthProcessor { return false; } - _validateToken( - token: UserIdentity, + /** api-key is the token, needn't exchange process */ + async authProcess( realm: CallgentRealm, - ): Promise { - throw new Error('Method not implemented.'); - } + item: RealmSecurityItem, + reqEvent: ClientRequestEvent, + ): Promise { + const result = await this.validateToken( + realm.secret as string, + reqEvent, + realm, + ); + if (result) return result; - _attachToken( - token: UserIdentity, - reqEvent: EventObject, - realm: CallgentRealm, - ): Promise { - throw new Error('Method not implemented.'); + throw new UnauthorizedException( + 'Invalid api-key token, callgentId=' + realm.callgentId, + ); } - providerCallback(): Promise { - throw new Error('Method not implemented.'); + /** attach to validationUrl */ + async _validateTokenByUrl( + token: string, + realm: CallgentRealm, + ): Promise { + // get validationUrl with token } - authProcess( + async _attachToken( + token: string, reqEvent: ClientRequestEvent, realm: CallgentRealm, - ): Promise { - throw new Error('Method not implemented.'); + ): Promise { + // {"type":"apiKey","in":"header","name":"x-callgent-authorization","provider":"api.callgent.com"} + const scheme: APIKeySecurityScheme = realm.scheme as any; + const req = reqEvent.data.req as any; + + const [name, value] = [scheme.name, realm.secret as string]; + let in0 = scheme.in; + switch (in0) { + case 'cookie': + if (!req.headers) req.headers = {}; + req.headers.cookie = `${req.headers.cookie || ''}${ + req.headers.cookie ? ';' : '' + }${name}=${encodeURIComponent(value)}`; + break; + case 'header': + in0 += 's'; + case 'query': + if (!req[in0]) req[in0] = {}; + req[in0][name] = realm.secret; + break; + } + return true; } - postAcquireSecret( + /** check response from validationUrl */ + postValidateToken( reqEvent: ClientRequestEvent, realm: CallgentRealm, ): Promise { throw new Error('Method not implemented.'); } - postExchangeToken( - reqEvent: ClientRequestEvent, - realm: CallgentRealm, - ): Promise { - throw new Error('Method not implemented.'); + async providerCallback() { + throw new Error('Not applicable.'); + } + + async postAcquireSecret() { + throw new Error('Not applicable.'); + } + + async postExchangeToken() { + throw new Error('Not applicable.'); } } diff --git a/src/callgent-realms/processors/auth-processor.base.ts b/src/callgent-realms/processors/auth-processor.base.ts index 04e3b2f..e914e69 100644 --- a/src/callgent-realms/processors/auth-processor.base.ts +++ b/src/callgent-realms/processors/auth-processor.base.ts @@ -5,10 +5,8 @@ import { } from '@nestjs/swagger/dist/interfaces/open-api-spec.interface'; import { EndpointDto } from '../../endpoints/dto/endpoint.dto'; import { ClientRequestEvent } from '../../endpoints/events/client-request.event'; -import { EventObject } from '../../event-listeners/event-object'; -import { UserIdentity } from '../../user-identities/entities/user-identity.entity'; import { AuthType, RealmSchemeVO } from '../dto/realm-scheme.vo'; -import { RealmSecurityVO } from '../dto/realm-security.vo'; +import { RealmSecurityItem } from '../dto/realm-security.vo'; import { CallgentRealm } from '../entities/callgent-realm.entity'; export abstract class AuthProcessor { @@ -73,41 +71,67 @@ export abstract class AuthProcessor { ): boolean; /** - * validate auth token + * validate auth token. * this may be persistent-async - * @returns true if valid/attached, false invalid, void if async + * @returns void if invalid; { data: event; resumeFunName?: 'postValidateToken' } if valid/or async * @throws Error if not allowed to attach and validationUrl empty */ async validateToken( - token: UserIdentity, - reqEvent: EventObject, + token: string, + reqEvent: ClientRequestEvent, realm: CallgentRealm, - ): Promise { - const security: RealmSecurityVO = reqEvent.context.security; - - if (security?.attach) return this._attachToken(token, reqEvent, realm); - if (realm.scheme.validationUrl) return this._validateToken(token, realm); - throw new UnauthorizedException( - 'Cannot validate auth token, validationUrl must not empty.', - ); + ): Promise { + const security: RealmSecurityItem = reqEvent.context.securityItem; + + // true valid/attached, false invalid, else async + let result: boolean | void; + + if (security?.attach) + result = await this._attachToken(token, reqEvent, realm); + else if (realm.scheme.validationUrl) + result = await this._validateTokenByUrl(token, realm); + else + throw new UnauthorizedException( + 'Cannot validate auth token, validationUrl must not empty. callgentId=' + + realm.callgentId, + ); + + if (result) return { data: reqEvent }; // valid/attached token + // void, async + if (result !== false) + return { data: reqEvent, resumeFunName: 'postValidateToken' }; + // else invalid, continue to refresh token process } /** + * start to exchange secret to token from provider + * @returns secret string + */ + abstract postValidateToken( + reqEvent: ClientRequestEvent, + realm: CallgentRealm, + ): Promise; + + /** + * validate token from realm.scheme.validationUrl * @returns boolean if valid/invalid, void if async */ - abstract _validateToken( - token: UserIdentity, + protected abstract _validateTokenByUrl( + token: string, realm: CallgentRealm, ): Promise; /** - * attach token to request, independent of sep? + * attach token to request * @returns true if attached * @throws Error if not allowed to attach */ abstract _attachToken( - token: UserIdentity, - reqEvent: EventObject, + token: string, + reqEvent: ClientRequestEvent, realm: CallgentRealm, ): Promise; @@ -116,18 +140,24 @@ export abstract class AuthProcessor { /** * common steps for auth process: - * 1. [request client, redirect to provider, acquire secret] + * 1. [request client, redirect to provider, try acquire secret] * 2. acquire secret from caller, [may async] * 3. send secret to provider, to exchange token * 4. [redirect back to client to get provider token, then send token to caller] - * @returns void if done; {data: reqEvent, resumeFunName?: 'postAcquireSecret' | 'postExchangeToken'} if async, CallgentRealmsService will call resumeFunName which delegate to current processor + * 5. [attach token to req if needed] + * @returns void or { data } if done; {data: reqEvent, resumeFunName?: 'postAcquireSecret' | 'postExchangeToken'} if async, CallgentRealmsService will call resumeFunName which delegate to current processor */ abstract authProcess( - reqEvent: ClientRequestEvent, realm: CallgentRealm, + item: RealmSecurityItem, + reqEvent: ClientRequestEvent, ): Promise; /** diff --git a/src/endpoints/adaptors/builtin/email/email.adaptor.ts b/src/endpoints/adaptors/builtin/email/email.adaptor.ts index c20ba8c..aef331e 100644 --- a/src/endpoints/adaptors/builtin/email/email.adaptor.ts +++ b/src/endpoints/adaptors/builtin/email/email.adaptor.ts @@ -12,7 +12,6 @@ import { EmailRelayKey, EmailsService, } from '../../../../emails/emails.service'; -import { EventObject } from '../../../../event-listeners/event-object'; import { EndpointDto } from '../../../dto/endpoint.dto'; import { Endpoint } from '../../../entities/endpoint.entity'; import { ClientRequestEvent } from '../../../events/client-request.event'; @@ -88,11 +87,11 @@ export class EmailAdaptor extends EndpointAdaptor { * @param sep - server endpoint * @param reqEvent - client request event */ - async invoke( + async invoke( fun: CallgentFunctionDto, args: object, sep: Endpoint, - reqEvent: T, + reqEvent: ClientRequestEvent, ) { const emailFrom = this.emailsService.getRelayAddress( reqEvent.id, diff --git a/src/endpoints/adaptors/builtin/restapi/restapi.adaptor.ts b/src/endpoints/adaptors/builtin/restapi/restapi.adaptor.ts index 82100d9..5662961 100644 --- a/src/endpoints/adaptors/builtin/restapi/restapi.adaptor.ts +++ b/src/endpoints/adaptors/builtin/restapi/restapi.adaptor.ts @@ -5,11 +5,11 @@ import { } from '@nestjs/common'; import { AgentsService } from '../../../../agents/agents.service'; import { CallgentFunctionDto } from '../../../../callgent-functions/dto/callgent-function.dto'; -import { EventObject } from '../../../../event-listeners/event-object'; import { EndpointDto } from '../../../dto/endpoint.dto'; import { ClientRequestEvent } from '../../../events/client-request.event'; import { EndpointAdaptor, EndpointConfig } from '../../endpoint-adaptor.base'; import { EndpointAdaptorName } from '../../endpoint-adaptor.decorator'; +import axios, { AxiosResponse } from 'axios'; @EndpointAdaptorName('restAPI', 'both') export class RestAPIAdaptor extends EndpointAdaptor { @@ -172,11 +172,12 @@ export class RestAPIAdaptor extends EndpointAdaptor { const type = request.isFormSubmission ? 'form' : 'body'; - // filter all x-callgent- args + // filter all x-callgent-* args const headers = {}; Object.keys(rawHeaders) .sort() .forEach((key) => { + key = key.toLowerCase(); if (!key.startsWith('x-callgent-')) headers[key] = rawHeaders[key]; }); @@ -191,18 +192,26 @@ export class RestAPIAdaptor extends EndpointAdaptor { }; } + resp2json(resp: AxiosResponse) { + const {} = resp; + return {}; + } + async readData(name: string, hints?: { [key: string]: any }) { throw new NotImplementedException('Method not implemented.'); } - async invoke( + async invoke( fun: CallgentFunctionDto, args: object, sep: EndpointDto, - reqEvent: T, - ): Promise<{ data: T; resumeFunName?: string }> { - // - throw new NotImplementedException('Method not implemented.'); + reqEvent: ClientRequestEvent, + ) { + const resp = await axios.request({ + ...(reqEvent.data.req as any), + baseURL: sep.host, + }); + reqEvent.data.resp = this.resp2json(resp); } callback(resp: any): Promise { diff --git a/src/endpoints/adaptors/builtin/web/webpage.adaptor.ts b/src/endpoints/adaptors/builtin/web/webpage.adaptor.ts index 12a2c6b..1d8986e 100644 --- a/src/endpoints/adaptors/builtin/web/webpage.adaptor.ts +++ b/src/endpoints/adaptors/builtin/web/webpage.adaptor.ts @@ -1,8 +1,8 @@ import { Inject, NotImplementedException } from '@nestjs/common'; import { AgentsService } from '../../../../agents/agents.service'; import { CallgentFunctionDto } from '../../../../callgent-functions/dto/callgent-function.dto'; -import { EventObject } from '../../../../event-listeners/event-object'; import { EndpointDto } from '../../../dto/endpoint.dto'; +import { Endpoint } from '../../../entities/endpoint.entity'; import { ClientRequestEvent } from '../../../events/client-request.event'; import { EndpointAdaptor, EndpointConfig } from '../../endpoint-adaptor.base'; import { EndpointAdaptorName } from '../../endpoint-adaptor.decorator'; @@ -93,12 +93,12 @@ export class WebpageAdaptor extends EndpointAdaptor { throw new NotImplementedException('Method not implemented.'); } - async invoke( + async invoke( fun: CallgentFunctionDto, args: object, - sep: EndpointDto, - reqEvent: T, - ): Promise<{ data: T; resumeFunName?: string }> { + sep: Endpoint, + reqEvent: ClientRequestEvent, + ): Promise<{ data: ClientRequestEvent; resumeFunName?: string }> { throw new NotImplementedException('Method not implemented.'); } diff --git a/src/endpoints/adaptors/endpoint-adaptor.base.ts b/src/endpoints/adaptors/endpoint-adaptor.base.ts index b0d6514..c4c0ef3 100644 --- a/src/endpoints/adaptors/endpoint-adaptor.base.ts +++ b/src/endpoints/adaptors/endpoint-adaptor.base.ts @@ -10,7 +10,6 @@ import { Prisma } from '@prisma/client'; import yaml from 'yaml'; import { AgentsService } from '../../agents/agents.service'; import { CallgentFunctionDto } from '../../callgent-functions/dto/callgent-function.dto'; -import { EventObject } from '../../event-listeners/event-object'; import { EndpointDto } from '../dto/endpoint.dto'; import { ClientRequestEvent } from '../events/client-request.event'; @@ -145,16 +144,14 @@ export abstract class EndpointAdaptor { throw new NotFoundException('No API found in the text.'); } - abstract invoke( + abstract invoke( fun: CallgentFunctionDto, args: object, sep: EndpointDto, - reqEvent: T, - ): Promise<{ data: T; resumeFunName?: string }>; + reqEvent: ClientRequestEvent, + ): Promise; } -export interface AdaptedDataSource {} - export class ApiSpec { apis: { path: string; diff --git a/src/endpoints/endpoints.service.ts b/src/endpoints/endpoints.service.ts index 31c5c8e..d8db300 100644 --- a/src/endpoints/endpoints.service.ts +++ b/src/endpoints/endpoints.service.ts @@ -323,8 +323,8 @@ export class EndpointsService { return adapter .invoke(func, map2Function.args, sep as any, reqEvent) .then((res) => { - if (res?.resumeFunName) return res; - return this.postInvokeSEP(res.data); + if (res && res.resumeFunName) return res; + return this.postInvokeSEP((res && res.data) || reqEvent); }); } diff --git a/src/infra/repo/prisma.middlewares.ts b/src/infra/repo/prisma.middlewares.ts index d96ec5c..8ba87b6 100644 --- a/src/infra/repo/prisma.middlewares.ts +++ b/src/infra/repo/prisma.middlewares.ts @@ -37,7 +37,10 @@ export const mainPrismaServiceOptions = ( Endpoint: deleteHandle, Task: deleteHandle, TaskAction: deleteHandle, - CallgentRealm: deleteHandle, + CallgentRealm: { + ...deleteHandle, + allowCompoundUniqueIndexWhere: true, + }, }, }), ], From 8b268c6e0db3aca7c667929e8c273e8a724ba301 Mon Sep 17 00:00:00 2001 From: dev-callgent Date: Tue, 24 Sep 2024 14:44:39 +0800 Subject: [PATCH 070/183] feat: callgent rest-sep invocation Signed-off-by: dev-callgent --- DEVLOG.md | 17 ++++--- package.json | 1 + pnpm-lock.yaml | 28 +++++++++++ src/agents/agents.service.ts | 4 +- src/bootstrap.ts | 2 + .../processors/api-key-auth.processor.ts | 2 +- .../adaptors/builtin/email/email.adaptor.ts | 4 +- .../builtin/restapi/restapi.adaptor.ts | 47 ++++++++++++------- .../builtin/restapi/restapi.controller.ts | 3 +- src/endpoints/endpoints.service.ts | 3 +- src/endpoints/events/client-request.event.ts | 4 +- .../event-listeners.service.ts | 8 +++- src/task-actions/task-actions.service.ts | 2 +- 13 files changed, 86 insertions(+), 39 deletions(-) diff --git a/DEVLOG.md b/DEVLOG.md index 87c5b77..872b1c8 100644 --- a/DEVLOG.md +++ b/DEVLOG.md @@ -80,27 +80,30 @@ npx prisma migrate dev --name init ``` ### multi-tenancy + 1. write default value for `tenancy.tenantPk` in db + ```text tenantPk Int @default(dbgenerated("(current_setting('tenancy.tenantPk'))::int")) ``` -2. enable postgres row level security(RLS), so that we can filter data by `tenantPk` automatically: +1. enable postgres row level security(RLS), so that we can filter data by `tenantPk` automatically: config in prisma/migrations/01_row_level_security/migration.sql, @see -3. set `tenantPk` into `cls` context: +2. set `tenantPk` into `cls` context: + ```ts cls.set('TENANT_ID', .. ``` -4. extend `PrismaClient` to set `tenantPk` before any query +3. extend `PrismaClient` to set `tenantPk` before any query ```sql SELECT set_config('tenancy.tenantPk', cls.get('TENANT_ID') ... ``` -5. bypass rls, for example, by admin, or looking up the logon user to determine their tenant ID: +4. bypass rls, for example, by admin, or looking up the logon user to determine their tenant ID: ```sql CREATE POLICY bypass_rls_policy ON "User" USING (current_setting('tenancy.bypass_rls', TRUE)::text = 'on'); @@ -188,9 +191,9 @@ login with email and password, TODO: email verification is required. need NOT scope to get user email: -- google: add '' scope on oauth screen -- github, contains email by default, -- facebook?: add 'email' scope on oauth screen +* google: add '' scope on oauth screen +* github, contains email by default, +* facebook?: add 'email' scope on oauth screen ##### to add a new oauth client diff --git a/package.json b/package.json index 0ee5d98..2484fec 100644 --- a/package.json +++ b/package.json @@ -36,6 +36,7 @@ "@fastify/cookie": "^9.3.1", "@fastify/cors": "^9.0.1", "@fastify/helmet": "^11.1.1", + "@fastify/multipart": "8.3.0", "@fastify/static": "^6.12.0", "@nestjs-cls/transactional": "^2.2.0", "@nestjs-cls/transactional-adapter-prisma": "^1.2.4", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 5e9a5ca..734f12e 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -16,6 +16,9 @@ dependencies: '@fastify/helmet': specifier: ^11.1.1 version: 11.1.1 + '@fastify/multipart': + specifier: 8.3.0 + version: 8.3.0 '@fastify/static': specifier: ^6.12.0 version: 6.12.0 @@ -894,6 +897,11 @@ packages: fast-uri: 2.3.0 dev: false + /@fastify/busboy@2.1.1: + resolution: {integrity: sha512-vBZP4NlzfOlerQTnba4aqZoMhE/a9HY7HRqoOPaETQcSQuWEIyZMHGfVu6w9wGtGK5fED5qRs2DteVCjOH60sA==} + engines: {node: '>=14'} + dev: false + /@fastify/compress@7.0.0: resolution: {integrity: sha512-jo/NaBVHP1OXIf8Kmr3bZyYQB0gAIgcy5c8rRKTPjhklHO7lRs/6ZFckUVT0NtbKSvrTuIcmSkxYpjyv3FNHXA==} dependencies: @@ -921,6 +929,10 @@ packages: mnemonist: 0.39.6 dev: false + /@fastify/deepmerge@1.3.0: + resolution: {integrity: sha512-J8TOSBq3SoZbDhM9+R/u77hP93gz/rajSA+K2kGyijPpORPWUXHUpTaleoj+92As0S9uPRP7Oi8IqMf0u+ro6A==} + dev: false + /@fastify/error@3.4.1: resolution: {integrity: sha512-wWSvph+29GR783IhmvdwWnN4bUxTD01Vm5Xad4i7i1VuAOItLvbPAb69sb0IQ2N57yprvhNIwAP5B6xfKTmjmQ==} dev: false @@ -960,6 +972,17 @@ packages: reusify: 1.0.4 dev: false + /@fastify/multipart@8.3.0: + resolution: {integrity: sha512-A8h80TTyqUzaMVH0Cr9Qcm6RxSkVqmhK/MVBYHYeRRSUbUYv08WecjWKSlG2aSnD4aGI841pVxAjC+G1GafUeQ==} + dependencies: + '@fastify/busboy': 2.1.1 + '@fastify/deepmerge': 1.3.0 + '@fastify/error': 3.4.1 + fastify-plugin: 4.5.1 + secure-json-parse: 2.7.0 + stream-wormhole: 1.1.0 + dev: false + /@fastify/send@2.1.0: resolution: {integrity: sha512-yNYiY6sDkexoJR0D8IDy3aRP3+L4wdqCpvx5WP+VtEU58sn7USmKynBzDQex5X42Zzvw2gNzzYgP90UfWShLFA==} dependencies: @@ -8053,6 +8076,11 @@ packages: resolution: {integrity: sha512-76ORR0DO1o1hlKwTbi/DM3EXWGf3ZJYO8cXX5RJwnul2DEg2oyoZyjLNoQM8WsvZiFKCRfC1O0J7iCvie3RZmQ==} dev: false + /stream-wormhole@1.1.0: + resolution: {integrity: sha512-gHFfL3px0Kctd6Po0M8TzEvt3De/xu6cnRrjlfYNhwbhLPLwigI2t1nc6jrzNuaYg5C4YF78PPFuQPzRiqn9ew==} + engines: {node: '>=4.0.0'} + dev: false + /string-length@4.0.2: resolution: {integrity: sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==} engines: {node: '>=10'} diff --git a/src/agents/agents.service.ts b/src/agents/agents.service.ts index 47fe8e4..8175ef7 100644 --- a/src/agents/agents.service.ts +++ b/src/agents/agents.service.ts @@ -38,8 +38,8 @@ export class AgentsService { id, srcId, dataType: cepAdaptor, - data: { callgentName, req, funName, progressive }, - context: { tgtEvents }, + data: { callgentName, funName, progressive }, + context: { tgtEvents, req }, } = reqEvent; const callgentFunctions = reqEvent.context .functions as unknown as CallgentFunctionDto[]; diff --git a/src/bootstrap.ts b/src/bootstrap.ts index df9746b..929af96 100644 --- a/src/bootstrap.ts +++ b/src/bootstrap.ts @@ -2,6 +2,7 @@ import compression from '@fastify/compress'; import fastifyCookie from '@fastify/cookie'; import fastifyCors from '@fastify/cors'; import helmet from '@fastify/helmet'; +import fastifyMultipart from '@fastify/multipart'; import { Logger as ConsoleLogger, ValidationPipe, @@ -32,6 +33,7 @@ async function bootstrap(app: NestFastifyApplication, port: string) { app.register(helmet); app.register(fastifyIp); + app.register(fastifyMultipart); app.register(compression, { encodings: ['gzip', 'deflate'] }); // express compatibility diff --git a/src/callgent-realms/processors/api-key-auth.processor.ts b/src/callgent-realms/processors/api-key-auth.processor.ts index 3e4548b..edbc370 100644 --- a/src/callgent-realms/processors/api-key-auth.processor.ts +++ b/src/callgent-realms/processors/api-key-auth.processor.ts @@ -99,7 +99,7 @@ export class ApiKeyAuthProcessor extends AuthProcessor { ): Promise { // {"type":"apiKey","in":"header","name":"x-callgent-authorization","provider":"api.callgent.com"} const scheme: APIKeySecurityScheme = realm.scheme as any; - const req = reqEvent.data.req as any; + const req = reqEvent.context.req as any; const [name, value] = [scheme.name, realm.secret as string]; let in0 = scheme.in; diff --git a/src/endpoints/adaptors/builtin/email/email.adaptor.ts b/src/endpoints/adaptors/builtin/email/email.adaptor.ts index aef331e..65d69b8 100644 --- a/src/endpoints/adaptors/builtin/email/email.adaptor.ts +++ b/src/endpoints/adaptors/builtin/email/email.adaptor.ts @@ -52,14 +52,14 @@ export class EmailAdaptor extends EndpointAdaptor { @Transactional() async postprocess(reqEvent: ClientRequestEvent, fun: CallgentFunctionDto) { - const resp = reqEvent?.data?.resp as unknown as RelayEmail; + const resp = reqEvent?.context?.resp as unknown as RelayEmail; if (!resp?.content?.html) throw new BadRequestException( 'Missing response for reqEvent#' + reqEvent.id, ); // convert resp to api format - reqEvent.data.resp = await this.agentsService.convert2Response( + reqEvent.context.resp = await this.agentsService.convert2Response( reqEvent?.context?.map2Function?.args, resp.content.text || resp.content.html, fun, diff --git a/src/endpoints/adaptors/builtin/restapi/restapi.adaptor.ts b/src/endpoints/adaptors/builtin/restapi/restapi.adaptor.ts index 5662961..6b2e328 100644 --- a/src/endpoints/adaptors/builtin/restapi/restapi.adaptor.ts +++ b/src/endpoints/adaptors/builtin/restapi/restapi.adaptor.ts @@ -3,13 +3,13 @@ import { Inject, NotImplementedException, } from '@nestjs/common'; +import axios, { AxiosResponse } from 'axios'; import { AgentsService } from '../../../../agents/agents.service'; import { CallgentFunctionDto } from '../../../../callgent-functions/dto/callgent-function.dto'; import { EndpointDto } from '../../../dto/endpoint.dto'; import { ClientRequestEvent } from '../../../events/client-request.event'; import { EndpointAdaptor, EndpointConfig } from '../../endpoint-adaptor.base'; import { EndpointAdaptorName } from '../../endpoint-adaptor.decorator'; -import axios, { AxiosResponse } from 'axios'; @EndpointAdaptorName('restAPI', 'both') export class RestAPIAdaptor extends EndpointAdaptor { @@ -122,7 +122,7 @@ export class RestAPIAdaptor extends EndpointAdaptor { reqEvent: ClientRequestEvent, // endpoint: EndpointDto, ): Promise { - const req = reqEvent?.data.req; + const req = reqEvent?.context.req; if (!req) throw new BadRequestException( 'Missing request object for ClientRequestEvent#' + reqEvent.id, @@ -139,7 +139,7 @@ export class RestAPIAdaptor extends EndpointAdaptor { if (!progressive) { } - reqEvent.data.req = this.req2Json(req); + reqEvent.context.req = this.req2Json(req); } async postprocess(reqEvent: ClientRequestEvent, fun: CallgentFunctionDto) { @@ -161,16 +161,18 @@ export class RestAPIAdaptor extends EndpointAdaptor { ); const url = request.url.substr(request.url.indexOf('/invoke/api/') + 11); - let files: Record = {}; - if (request.file) { - files[request.file.fieldname] = request.file; - } else if (raw.files) { - for (const [key, value] of Object.entries(raw.files)) { - files[key] = value; - } - } else files = undefined; + // FIXME https://www.npmjs.com/package/@fastify/multipart + // request.file() + // let files: Record = {}; + // if (request.file) { + // files[request.file.fieldname] = request.file; + // } else if (raw.files) { + // for (const [key, value] of Object.entries(raw.files)) { + // files[key] = value; + // } + // } else files = undefined; - const type = request.isFormSubmission ? 'form' : 'body'; + // const type = request.isFormSubmission ? 'form' : 'body'; // filter all x-callgent-* args const headers = {}; @@ -178,7 +180,12 @@ export class RestAPIAdaptor extends EndpointAdaptor { .sort() .forEach((key) => { key = key.toLowerCase(); - if (!key.startsWith('x-callgent-')) headers[key] = rawHeaders[key]; + if ( + !key.startsWith('x-callgent-') && + key !== 'content-length' && + key !== 'host' + ) + headers[key] = rawHeaders[key]; }); // FIXME change authorization to x-callgent-authorization @@ -186,9 +193,9 @@ export class RestAPIAdaptor extends EndpointAdaptor { url, method, headers: { ...headers }, // filter callgent authorization - query, - files, - [type]: body, + params: query, // axios + // files, + data: body, // TODO axios FormData, URLSearchParams, Blob.. }; } @@ -208,10 +215,14 @@ export class RestAPIAdaptor extends EndpointAdaptor { reqEvent: ClientRequestEvent, ) { const resp = await axios.request({ - ...(reqEvent.data.req as any), + ...reqEvent.context.req, baseURL: sep.host, + withCredentials: !!reqEvent.context.securityItem, + // httpsAgent: new https.Agent({ + // rejectUnauthorized: false, + // }), }); - reqEvent.data.resp = this.resp2json(resp); + reqEvent.context.resp = this.resp2json(resp); } callback(resp: any): Promise { diff --git a/src/endpoints/adaptors/builtin/restapi/restapi.controller.ts b/src/endpoints/adaptors/builtin/restapi/restapi.controller.ts index a556505..6977637 100644 --- a/src/endpoints/adaptors/builtin/restapi/restapi.controller.ts +++ b/src/endpoints/adaptors/builtin/restapi/restapi.controller.ts @@ -100,13 +100,12 @@ export class RestApiController { throw new NotFoundException('callgent not found: ' + callgentId); const { data, statusCode, message } = await this.eventListenersService.emit( - new ClientRequestEvent(cep.id, taskId, cep.adaptorKey, callback, { + new ClientRequestEvent(cep.id, taskId, cep.adaptorKey, callback, req, { callgentId, callgentName: callgent.name, callerId, progressive, funName, - req, }), parseInt(timeout) || 0, // sync timeout ); diff --git a/src/endpoints/endpoints.service.ts b/src/endpoints/endpoints.service.ts index d8db300..7840fb6 100644 --- a/src/endpoints/endpoints.service.ts +++ b/src/endpoints/endpoints.service.ts @@ -332,8 +332,7 @@ export class EndpointsService { @Transactional() async postInvokeSEP(reqEvent: ClientRequestEvent) { const { - data: { resp }, - context: { functions }, + context: { functions, resp }, } = reqEvent; if (!functions?.length) throw new Error('Failed to invoke, No mapping function found'); diff --git a/src/endpoints/events/client-request.event.ts b/src/endpoints/events/client-request.event.ts index 789d171..abff3a1 100644 --- a/src/endpoints/events/client-request.event.ts +++ b/src/endpoints/events/client-request.event.ts @@ -17,13 +17,12 @@ export class ClientRequestEvent extends EventObject { taskId: string, dataType: string, callback: string, + req: object, public readonly data: { callgentId: string; callgentName: string; /** empty means anonymous */ callerId?: string; - req?: JsonValue; - resp?: JsonValue; /** requested callgent function name */ funName?: string; /** url template for progressive requesting, `callgent:funName[@callgent]` to invoke callgent */ @@ -31,5 +30,6 @@ export class ClientRequestEvent extends EventObject { }, ) { super(cepId, 'CLIENT_REQUEST', dataType, taskId, callback, 'URL'); + this.context.req = req; } } diff --git a/src/event-listeners/event-listeners.service.ts b/src/event-listeners/event-listeners.service.ts index e8704f3..dd02914 100644 --- a/src/event-listeners/event-listeners.service.ts +++ b/src/event-listeners/event-listeners.service.ts @@ -140,7 +140,8 @@ export class EventListenersService { if (funName || event.stopPropagation) break; } catch (e) { statusCode = e.status || -1; // error - const message = `[ERROR] ${e.name}: ${e.message}`; + const message = + e.response?.data?.message || `[${e.name}] ${e.message}`; e.status < 500 || this.logger.error(e); return { data: { ...event, context: undefined }, @@ -149,7 +150,10 @@ export class EventListenersService { }; } } - return { data: { ...event, context: undefined }, statusCode }; + return { + data: { ...event, context: undefined }, + statusCode, + }; } finally { const nextListener = statusCode == 1 diff --git a/src/task-actions/task-actions.service.ts b/src/task-actions/task-actions.service.ts index 399b4cc..7812591 100644 --- a/src/task-actions/task-actions.service.ts +++ b/src/task-actions/task-actions.service.ts @@ -28,7 +28,7 @@ export class TaskActionsService { // @Transactional() // async createTaskAction(reqEvent: ClientRequestEvent) { // const { taskId, caller, progressive, callback, funName } = reqEvent.data; - // const req = (reqEvent.processed.req || reqEvent.data.req) as any; + // const req = (reqEvent.processed.req || reqEvent.context.req) as any; // // new task // const task = taskId From eecd4b4b439d019183da0d545530ca7af29ca7f5 Mon Sep 17 00:00:00 2001 From: dev-callgent Date: Wed, 25 Sep 2024 08:22:42 +0800 Subject: [PATCH 071/183] feat: callgent rest-sep invocation Signed-off-by: dev-callgent --- .../builtin/restapi/restapi.adaptor.ts | 20 +++++++++++-------- .../builtin/restapi/restapi.controller.ts | 8 ++++---- .../adaptors/endpoint-adaptor.base.ts | 2 +- src/endpoints/endpoints.controller.ts | 2 ++ src/users/users.controller.ts | 6 +++++- 5 files changed, 24 insertions(+), 14 deletions(-) diff --git a/src/endpoints/adaptors/builtin/restapi/restapi.adaptor.ts b/src/endpoints/adaptors/builtin/restapi/restapi.adaptor.ts index 6b2e328..4eb2911 100644 --- a/src/endpoints/adaptors/builtin/restapi/restapi.adaptor.ts +++ b/src/endpoints/adaptors/builtin/restapi/restapi.adaptor.ts @@ -180,12 +180,7 @@ export class RestAPIAdaptor extends EndpointAdaptor { .sort() .forEach((key) => { key = key.toLowerCase(); - if ( - !key.startsWith('x-callgent-') && - key !== 'content-length' && - key !== 'host' - ) - headers[key] = rawHeaders[key]; + if (!key.startsWith('x-callgent-')) headers[key] = rawHeaders[key]; }); // FIXME change authorization to x-callgent-authorization @@ -200,8 +195,12 @@ export class RestAPIAdaptor extends EndpointAdaptor { } resp2json(resp: AxiosResponse) { - const {} = resp; - return {}; + const { data, headers: rawHeaders, status, statusText } = resp; + const headers = {}; + Object.entries(rawHeaders).forEach( + ([name, val]) => (headers[name.toLowerCase()] = val), + ); + return { data, headers, status, statusText }; } async readData(name: string, hints?: { [key: string]: any }) { @@ -216,6 +215,11 @@ export class RestAPIAdaptor extends EndpointAdaptor { ) { const resp = await axios.request({ ...reqEvent.context.req, + headers: { + ...reqEvent.context.req.headers, + host: undefined, + 'content-length': undefined, + }, baseURL: sep.host, withCredentials: !!reqEvent.context.securityItem, // httpsAgent: new https.Agent({ diff --git a/src/endpoints/adaptors/builtin/restapi/restapi.controller.ts b/src/endpoints/adaptors/builtin/restapi/restapi.controller.ts index 6977637..1e4d4fe 100644 --- a/src/endpoints/adaptors/builtin/restapi/restapi.controller.ts +++ b/src/endpoints/adaptors/builtin/restapi/restapi.controller.ts @@ -48,13 +48,13 @@ export class RestApiController { @ApiParam({ name: 'endpointId', required: false, - description: 'endpoint id, optional: "/callgents/the-id`//`invoke/api/"', + description: 'endpoint id, optional: "/callgents/the-id`//`invoke/"', }) @ApiParam({ name: 'NOTE: swagger does not support wildcard param. Just document here', required: false, description: - '../invoke/api/`resource-path-here`. the wildcard path, optional: "../invoke/api/"', + '../invoke/`resource-path-here`. the wildcard path, optional: "../invoke/"', }) @ApiHeader({ name: 'x-callgent-taskId', required: false }) @ApiHeader({ @@ -64,7 +64,7 @@ export class RestApiController { }) @ApiHeader({ name: 'x-callgent-callback', required: false }) @ApiHeader({ name: 'x-callgent-timeout', required: false }) - @All(':id/:endpointId/invoke/api/*') + @All(':id/:endpointId/invoke/*') @ApiUnauthorizedResponse() async execute( @Req() req, @@ -76,7 +76,7 @@ export class RestApiController { @Headers('x-callgent-callback') callback?: string, @Headers('x-callgent-timeout') timeout?: string, ) { - const basePath = `${callgentId}/${endpointId}/invoke/api/`; + const basePath = `${callgentId}/${endpointId}/invoke/`; let funName = req.url.substr(req.url.indexOf(basePath) + basePath.length); if (funName) funName = Utils.formalApiName(req.method, '/' + funName); diff --git a/src/endpoints/adaptors/endpoint-adaptor.base.ts b/src/endpoints/adaptors/endpoint-adaptor.base.ts index c4c0ef3..55c54d3 100644 --- a/src/endpoints/adaptors/endpoint-adaptor.base.ts +++ b/src/endpoints/adaptors/endpoint-adaptor.base.ts @@ -95,7 +95,7 @@ export abstract class EndpointAdaptor { json = await $RefParser.dereference(json); } catch (err) { throw new BadRequestException( - 'Invalid openAPI.JSON, failed to dereference.', + 'Invalid openAPI.JSON, failed to dereference, ' + err.message, ); } const { openapi, paths, components, security, servers } = json; // TODO: save components onto SEP diff --git a/src/endpoints/endpoints.controller.ts b/src/endpoints/endpoints.controller.ts index 037af07..1d03504 100644 --- a/src/endpoints/endpoints.controller.ts +++ b/src/endpoints/endpoints.controller.ts @@ -12,6 +12,7 @@ import { UseGuards, } from '@nestjs/common'; import { + ApiExtraModels, ApiOkResponse, ApiSecurity, ApiTags, @@ -26,6 +27,7 @@ import { EndpointsService } from './endpoints.service'; @ApiTags('Endpoints') @ApiSecurity('defaultBearerAuth') +@ApiExtraModels(EndpointDto) @UseGuards(JwtGuard) @Controller('endpoints') export class EndpointsController { diff --git a/src/users/users.controller.ts b/src/users/users.controller.ts index 780e63a..73dca72 100644 --- a/src/users/users.controller.ts +++ b/src/users/users.controller.ts @@ -105,7 +105,11 @@ export class UsersController { }, }) @ApiConsumes('text/plain') - @ApiBody({ required: false, description: 'pwd if reset', type: 'string' }) + @ApiBody({ + required: false, + description: 'pwd if reset', + schema: { type: 'string' }, + }) @Patch('confirm-email/:token') async confirmEmail( @Res() res, From 916f22b7fc0e129176f53d679da9f963af740a84 Mon Sep 17 00:00:00 2001 From: dev-callgent Date: Wed, 25 Sep 2024 12:50:52 +0800 Subject: [PATCH 072/183] feat: prisma sql log with params Signed-off-by: dev-callgent --- .env.dev | 2 +- prisma/seed-test.ts | 15 +++++++++++++++ src/infra/repo/prisma.middlewares.ts | 1 + src/infra/repo/repos.module.ts | 23 +++++++++++++++++++++-- 4 files changed, 38 insertions(+), 3 deletions(-) diff --git a/.env.dev b/.env.dev index bc6a051..9720e14 100644 --- a/.env.dev +++ b/.env.dev @@ -12,7 +12,7 @@ LOG_LEVEL=debug # async log buffer length LOG_BUFFER_LENGTH=4096 -LOG_LEVELS_PRISMA=["query","info","warn","error"] +LOG_LEVELS_PRISMA=[{"emit":"event", "level":"query"},"info","warn","error"] ALLOW_CORS=1 diff --git a/prisma/seed-test.ts b/prisma/seed-test.ts index fe931cf..3a33b70 100644 --- a/prisma/seed-test.ts +++ b/prisma/seed-test.ts @@ -69,6 +69,14 @@ function initTestData() { createdBy: userId, }; + const callgentHubDto: Prisma.CallgentUncheckedCreateInput = { + pk: 2, + id: 'TEST_HUB_CALLGENT_ID', + name: 'hub-callgent', + tenantPk: -1, + createdBy: userId, + }; + const cepDto: Prisma.EndpointUncheckedCreateInput = { pk: 1, id: 'TEST_CEP_ID', @@ -114,6 +122,13 @@ function initTestData() { create: authTokenDto, }) .then((authToken) => console.log({ authToken })), + prisma.callgent + .upsert({ + where: { pk: 2 }, + update: callgentHubDto, + create: callgentHubDto, + }) + .then((callgent) => console.log({ callgent })), prisma.callgent .upsert({ where: { pk: 1 }, diff --git a/src/infra/repo/prisma.middlewares.ts b/src/infra/repo/prisma.middlewares.ts index 8ba87b6..833e074 100644 --- a/src/infra/repo/prisma.middlewares.ts +++ b/src/infra/repo/prisma.middlewares.ts @@ -14,6 +14,7 @@ export const mainPrismaServiceOptions = ( const logLevels = config.get('LOG_LEVELS_PRISMA'); return { prismaOptions: { + errorFormat: 'pretty', log: logLevels ? JSON.parse(logLevels) : [], transactionOptions: { timeout: parseInt(config.get('PRISMA_TRANSACTION_TIMEOUT', '5000')), diff --git a/src/infra/repo/repos.module.ts b/src/infra/repo/repos.module.ts index 7cbb2d1..def98a8 100644 --- a/src/infra/repo/repos.module.ts +++ b/src/infra/repo/repos.module.ts @@ -1,7 +1,8 @@ import { CacheInterceptor, CacheModule } from '@nestjs/cache-manager'; -import { Global, Module } from '@nestjs/common'; +import { Global, Module, OnModuleInit } from '@nestjs/common'; import { PrismaModule, + PrismaService, providePrismaClientExceptionFilter, } from 'nestjs-prisma'; // allow explicit queries/update for soft deleted records: deleted: true @@ -9,6 +10,7 @@ import { ClsPluginTransactional } from '@nestjs-cls/transactional'; import { TransactionalAdapterPrisma } from '@nestjs-cls/transactional-adapter-prisma'; import { ConfigService } from '@nestjs/config'; import { APP_INTERCEPTOR } from '@nestjs/core'; +import { Prisma } from '@prisma/client'; import { ClsModule } from 'nestjs-cls'; import { mainPrismaServiceOptions } from './prisma.middlewares'; import { PrismaTenancyOnPgModule } from './tenancy/prisma-tenancy.module'; @@ -53,4 +55,21 @@ import { ValidatorModule } from './validators/validator.module'; providePrismaClientExceptionFilter(), ], }) -export class ReposModule {} +export class ReposModule implements OnModuleInit { + constructor(private readonly prismaService: PrismaService) {} + + onModuleInit() { + this.prismaService.$on('query', (e) => { + const sql = e.query.trim().toLowerCase(); + if ( + sql.startsWith('select') || + sql.startsWith('insert') || + sql.startsWith('update') || + sql.startsWith('delete') + ) + console.log( + `\x1b[33m[SQL]\x1b[0m: ${e.query}; \x1b[34m${e.params}\x1b[0m`, + ); + }); + } +} From 5bf694921a3d498aabc0e796c689facc593381e7 Mon Sep 17 00:00:00 2001 From: dev-callgent Date: Wed, 25 Sep 2024 13:18:50 +0800 Subject: [PATCH 073/183] feat: callgent rest-sep invocation Signed-off-by: dev-callgent --- prisma/schema.prisma | 2 +- src/endpoints/adaptors/builtin/restapi/restapi.adaptor.ts | 6 +++--- .../adaptors/builtin/restapi/restapi.controller.ts | 6 +++--- src/endpoints/listeners/callgent-created.listener.ts | 2 +- test/e2e/endpoints.e2e-spec.ts | 2 +- 5 files changed, 9 insertions(+), 9 deletions(-) diff --git a/prisma/schema.prisma b/prisma/schema.prisma index 7a5677b..4897f9e 100644 --- a/prisma/schema.prisma +++ b/prisma/schema.prisma @@ -402,7 +402,7 @@ model Endpoint { adaptorKey String @db.VarChar(127) /// @description endpoint adaptor key priority Int @default(0) /// @description priority in the callgent - host String @db.VarChar(2047) /// @description host address, e.g. '/api/callgents/rbhes0-w4rff/{id}/invoke/api/', where `{id}` will be replaced with current endpoint id + host String @db.VarChar(2047) /// @description host address, e.g. '/api/callgents/rbhes0-w4rff/{id}/invoke/', where `{id}` will be replaced with current endpoint id initParams Json? @db.Json /// @description initializing parameters content Json? @db.Json /// @description generated content/code by init method /// @DtoReadOnly diff --git a/src/endpoints/adaptors/builtin/restapi/restapi.adaptor.ts b/src/endpoints/adaptors/builtin/restapi/restapi.adaptor.ts index 4eb2911..124793c 100644 --- a/src/endpoints/adaptors/builtin/restapi/restapi.adaptor.ts +++ b/src/endpoints/adaptors/builtin/restapi/restapi.adaptor.ts @@ -155,11 +155,11 @@ export class RestAPIAdaptor extends EndpointAdaptor { req2Json(request) { const { method, headers: rawHeaders, query, body, raw } = request; - if (request.url.indexOf('/invoke/api/') < 0) + if (request.url.indexOf('/invoke-api/') < 0) throw new Error( - 'Unsupported URL, should be /callgents/:ids/:endpoint/invoke/api/*', + 'Unsupported URL, should be /callgents/:ids/:endpoint/invoke-api/*', ); - const url = request.url.substr(request.url.indexOf('/invoke/api/') + 11); + const url = request.url.substr(request.url.indexOf('/invoke-api/') + 11); // FIXME https://www.npmjs.com/package/@fastify/multipart // request.file() diff --git a/src/endpoints/adaptors/builtin/restapi/restapi.controller.ts b/src/endpoints/adaptors/builtin/restapi/restapi.controller.ts index 1e4d4fe..b7bb3f0 100644 --- a/src/endpoints/adaptors/builtin/restapi/restapi.controller.ts +++ b/src/endpoints/adaptors/builtin/restapi/restapi.controller.ts @@ -54,7 +54,7 @@ export class RestApiController { name: 'NOTE: swagger does not support wildcard param. Just document here', required: false, description: - '../invoke/`resource-path-here`. the wildcard path, optional: "../invoke/"', + '../invoke-api/`resource-path-here`. the wildcard path, optional: "../invoke-api/"', }) @ApiHeader({ name: 'x-callgent-taskId', required: false }) @ApiHeader({ @@ -64,7 +64,7 @@ export class RestApiController { }) @ApiHeader({ name: 'x-callgent-callback', required: false }) @ApiHeader({ name: 'x-callgent-timeout', required: false }) - @All(':id/:endpointId/invoke/*') + @All(':id/:endpointId/invoke-api/*') @ApiUnauthorizedResponse() async execute( @Req() req, @@ -76,7 +76,7 @@ export class RestApiController { @Headers('x-callgent-callback') callback?: string, @Headers('x-callgent-timeout') timeout?: string, ) { - const basePath = `${callgentId}/${endpointId}/invoke/`; + const basePath = `${callgentId}/${endpointId}/invoke-api/`; let funName = req.url.substr(req.url.indexOf(basePath) + basePath.length); if (funName) funName = Utils.formalApiName(req.method, '/' + funName); diff --git a/src/endpoints/listeners/callgent-created.listener.ts b/src/endpoints/listeners/callgent-created.listener.ts index ff68614..af6ffff 100644 --- a/src/endpoints/listeners/callgent-created.listener.ts +++ b/src/endpoints/listeners/callgent-created.listener.ts @@ -30,7 +30,7 @@ export class CallgentCreatedListener { callgentId: callgent.id, type: 'CLIENT', adaptorKey: 'restAPI', - host: `/api/callgents/${callgent.id}/{id}/invoke/api/`, + host: `/api/callgents/${callgent.id}/{id}/invoke-api/`, createdBy: callgent.createdBy, }) .then((endpoint) => { diff --git a/test/e2e/endpoints.e2e-spec.ts b/test/e2e/endpoints.e2e-spec.ts index dd07abe..af992f9 100644 --- a/test/e2e/endpoints.e2e-spec.ts +++ b/test/e2e/endpoints.e2e-spec.ts @@ -98,7 +98,7 @@ export const addEndpointAuth = (endpointAuthDto: CreateEndpointAuthDto) => { export const invokeCallgentByApi = (callgentId, body?: any) => { return pactum .spec() - .post(`/api/callgents/${callgentId}//invoke/api/boards/list`) + .post(`/api/callgents/${callgentId}//invoke-api/boards/list`) .withHeaders('x-callgent-authorization', TestConstant.authToken) .withBody(body) .expectStatus(200); From 073e2f9824b56db7a98e0a6fd0c302831805750e Mon Sep 17 00:00:00 2001 From: dev-callgent Date: Wed, 25 Sep 2024 14:35:53 +0800 Subject: [PATCH 074/183] fix: prisma seed Signed-off-by: dev-callgent --- prisma/seed-test.ts | 83 ++++++++++++++++++++++----------------------- prisma/seed.ts | 53 ++++++++++++----------------- 2 files changed, 62 insertions(+), 74 deletions(-) diff --git a/prisma/seed-test.ts b/prisma/seed-test.ts index 3a33b70..7aaed2c 100644 --- a/prisma/seed-test.ts +++ b/prisma/seed-test.ts @@ -1,44 +1,48 @@ import { Prisma, PrismaClient } from '@prisma/client'; - -const prisma = new PrismaClient({ - log: ['query', 'info', 'warn', 'error'], -}); +import { DefaultArgs } from '@prisma/client/runtime/library'; async function main() { - return await prisma.$transaction(async (prisma) => { - await prisma.$executeRaw`SELECT set_config('tenancy.bypass_rls', 'on', ${true})`; - await Promise.all(initTestData()); + const prisma = new PrismaClient({ + log: ['query', 'info', 'warn', 'error'], }); + + return await prisma + .$transaction(async (prisma) => { + await prisma.$executeRaw`SELECT set_config('tenancy.bypass_rls', 'on', ${true})`; + await Promise.all(initTestData(prisma)); + }) + .catch((e) => { + console.error(e); + process.exit(1); + }) + .finally(async () => { + // close Prisma Client at the end + await prisma.$disconnect(); + }); } // execute the main function -main() - .catch((e) => { - console.error(e); - process.exit(1); - }) - .finally(async () => { - // close Prisma Client at the end - await prisma.$disconnect(); - }); +main(); -function initTestData() { +function initTestData( + prisma: Omit< + PrismaClient, + '$connect' | '$disconnect' | '$on' | '$transaction' | '$use' | '$extends' + >, +) { const tenant: Prisma.TenantUncheckedCreateInput = { - pk: 1, id: 'TEST_TENANT_ID', statusCode: 1, }; const userId = 'TEST_USER_ID'; const u: Prisma.UserUncheckedCreateInput = { - pk: 1, id: userId, name: 'test-user', tenantPk: 1, }; const ui: Prisma.UserIdentityUncheckedCreateInput = { - pk: 1, tenantPk: 1, provider: 'local', uid: 'test@callgent.com', @@ -52,7 +56,6 @@ function initTestData() { }; const authTokenDto: Prisma.AuthTokenUncheckedCreateInput = { - pk: 1, token: 'TEST-ONLY-API_KEY', type: 'API_KEY', payload: { @@ -62,7 +65,6 @@ function initTestData() { }; const callgentDto: Prisma.CallgentUncheckedCreateInput = { - pk: 1, id: 'TEST_CALLGENT_ID', name: 'test-callgent', tenantPk: 1, @@ -70,7 +72,6 @@ function initTestData() { }; const callgentHubDto: Prisma.CallgentUncheckedCreateInput = { - pk: 2, id: 'TEST_HUB_CALLGENT_ID', name: 'hub-callgent', tenantPk: -1, @@ -78,7 +79,6 @@ function initTestData() { }; const cepDto: Prisma.EndpointUncheckedCreateInput = { - pk: 1, id: 'TEST_CEP_ID', callgentId: 'TEST_CALLGENT_ID', type: 'CLIENT', @@ -91,24 +91,23 @@ function initTestData() { return [ prisma.tenant .upsert({ - where: { pk: 1 }, + where: { id: tenant.id }, update: tenant, create: tenant, }) - .then((tenant) => { + .then(async (tenant) => { console.log({ tenant }); - prisma.user + await prisma.user .upsert({ - where: { pk: 1 }, + where: { id: u.id }, update: u, create: u, }) - .then((user) => { - (ui as any).pk = 1; + .then(async (user) => { (ui as any).userId = user.id; - prisma.userIdentity + await prisma.userIdentity .upsert({ - where: { pk: 1 }, + where: { provider_uid: { provider: ui.provider, uid: ui.uid } }, update: ui, create: ui, }) @@ -117,28 +116,28 @@ function initTestData() { }), prisma.authToken .upsert({ - where: { pk: 1 }, + where: { token: authTokenDto.token }, update: authTokenDto, create: authTokenDto, }) .then((authToken) => console.log({ authToken })), prisma.callgent .upsert({ - where: { pk: 2 }, + where: { id: callgentHubDto.id }, update: callgentHubDto, create: callgentHubDto, }) .then((callgent) => console.log({ callgent })), prisma.callgent .upsert({ - where: { pk: 1 }, + where: { id: callgentDto.id }, update: callgentDto, create: callgentDto, }) .then((callgent) => console.log({ callgent })), prisma.endpoint .upsert({ - where: { pk: 1 }, + where: { id: cepDto.id }, update: cepDto, create: cepDto, }) @@ -162,7 +161,7 @@ function initTestData() { // '{"funName":"listCategories","params":["invoker","apiKey","boardID","limit","skip"],"documents":"This function lists categories based on the provided API key, board ID, limit, and skip parameters.\\n\\nParameters:\\n- `invoker`: A function that performs the actual API call.\\n- `apiKey`: Your secret API key.\\n- `boardID`: The id of the board you\'d like to fetch categories for.\\n- `limit`: The number of categories you\'d like to fetch. Defaults to 10 if not specified. Max of 10000.\\n- `skip`: The number of categories you\'d like to skip before starting to fetch. Defaults to 0 if not specified.\\n\\nReturns:\\nAn object containing the categories and a hasMore property that specifies whether this query returns more categories than the limit.","fullCode":"(invoker, apiKey, boardID, limit = 10, skip = 0) => {\\n const reqBody = {\\n apiKey, boardID,\\n limit: Math.min(Math.max(limit, 0), 10000),\\n skip: Math.max(skip, 0)\\n };\\n const resp = await invoker({\\n path: \'/categories/list\',\\n method: \'POST\',\\n body: reqBody\\n });\\n if (resp.status !== 200) {\\n throw new Error(`API request failed with status ${resp.status}: ${resp.statusText}`);\\n }\\n return resp.result;\\n}"}', // ), addLlmCache( - 4, + prisma, 'map2Function', 'given below service functions:\nclass new-test-callgent {\n "function name: POST:/boards/list": {"params":[invoker,apiKey], "documents":"This function lists all boards.\n\n@param {Function} invoker - A function that makes the actual API call.\n@param {string} apiKey - Your secret API key.\n\n@returns {Promise} A promise that resolves to an object containing the API result.\n@property {Array} boards - An array of board objects.\n@property {string} boards[].id - A unique identifier for the board.\n@property {string} boards[].created - Time at which the board was created, in ISO 8601 format.\n@property {boolean} boards[].isPrivate - Whether or not the board is set as private in the administrative settings.\n@property {string} boards[].name - The board\'s name.\n@property {number} boards[].postCount - The number of non-deleted posts associated with the board. This number includes posts that are marked as closed or complete.\n@property {boolean} boards[].privateComments - Whether or not comments left on posts can be viewed by other end-users.\n@property {string} boards[].url - The URL to the board\'s page.\n@property {boolean} hasMore - Specifies whether this query returns more boards than the limit."},\n\n}\nand an service `invoker` function.\n\nPlease choose one function to fulfill below request:\n{\n"requesting function": "POST:/boards/list",\n"request from": "restAPI",\n"request_object": {"url":"/boards/list","method":"POST","headers":{"host":"127.0.0.1:3300","connection":"close","content-length":"0"},"query":{}},\n}\nand code for request_object to chosen function args mapping. if any data missing/unclear/ambiguous from request_object to invocation args, please ask question to the caller in below json.question field.\n\noutput a single-line json object:\n{ "funName": "the function name to be invoked", "params":"param names of the chosen function", "mapping": "the js function (invoker, request_object)=>{...;return functionArgsArray;}, full implementation to return the **real** args from request_object to invoke the chosen service function. don\'t use data not exist or ambiguous in request", "question": "question to ask the caller if anything not sure or missing for request to args mapping, *no* guess or assumption of the mapping. null if the mapping is crystal clear." }"}', '{"funName":"POST:/boards/list","params":["invoker","apiKey"],"mapping":"(invoker, request_object)=>{ let apiKey = request_object.params.ids; return [invoker, apiKey]; }","question":"What is the API key for this request? It is not provided in the request_object."}', @@ -186,13 +185,13 @@ function initTestData() { // '{"funName":"applyForPosition","params":["invoker","positionId","applicantName","email","resume","coverLetter","appliedAt"],"documents":"/**\\n * Apply for a position\\n * @param {Function} invoker - The function that performs the actual API invocation.\\n * @param {string} positionId - The ID of the job position to apply for.\\n * @param {string} applicantName - Name of the applicant.\\n * @param {string} email - Email address of the applicant.\\n * @param {string} resume - Resume of the applicant.\\n * @param {string} coverLetter - Cover letter of the applicant.\\n * @param {string} appliedAt - Timestamp when the application was submitted.\\n * @returns {Promise<{apiResult: any, headers?: { [key: string]: string }, status?: number, statusText?: string}>} The result of the API call.\\n */","fullCode":"async (invoker, positionId, applicantName, email, resume, coverLetter, appliedAt) => {\\n try {\\n const req = {\\n path: `/positions/${positionId}/apply`,\\n method: \'POST\',\\n headers: {\\n \'Content-Type\': \'application/json\'\\n },\\n body: {\\n applicantName,\\n email,\\n resume,\\n coverLetter,\\n appliedAt\\n }\\n };\\n const json = await invoker(req);\\n if (json.status === 201) {\\n return { apiResult: json.apiResult, headers: json.headers, status: json.status, statusText: json.statusText };\\n } else if (json.status === 400) {\\n throw new Error(\'Invalid input\');\\n } else if (json.status === 404) {\\n throw new Error(\'Job position not found\');\\n } else if (json.status === 500) {\\n throw new Error(\'Internal Server Error\');\\n } else {\\n throw new Error(\'Unknown error\');\\n }\\n } catch (error) {\\n console.error(\'Error applying for position:\', error.message);\\n throw error;\\n }\\n}"}', // ), addLlmCache( - 8, + prisma, 'map2Function', 'given below service APIs:\nservice test-callgent {\n "API: GET /positions": {"endpoint": "GET /positions", "summary":"listPositions: List all job positions", "description":"Retrieve a list of all available job positions.", "params":{}, "responses":{"200":{"description":"A list of job positions","content":{"application/json":{"schema":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","description":"Unique identifier for the job position"},"title":{"type":"string","description":"Title of the job position"},"description":{"type":"string","description":"Description of the job position"},"location":{"type":"string","description":"Location of the job position"},"requirements":{"type":"array","items":{"type":"string"},"description":"List of requirements for the job position"},"createdAt":{"type":"string","format":"date-time","description":"Timestamp when the job position was created"},"updatedAt":{"type":"string","format":"date-time","description":"Timestamp when the job position was last updated"}}}}}}},"500":{"description":"Internal Server Error"}} },\n}\n\nPlease choose one API to fulfill below request:\n{\n"requesting endpoint": "GET /positions",\n"request from": "restAPI",\n"request_object": {"url":"/positions","method":"GET","headers":{"accept":"*/*","accept-encoding":"gzip, deflate, br","cache-control":"no-cache","connection":"keep-alive","host":"127.0.0.1:3000","user-agent":"Apifox/1.0.0 (https://apifox.com)"},"query":{}},\n}\nand code for request_object to chosen function args mapping. if any data missing/unclear/ambiguous from request_object to invocation args, please ask question to the caller in below json.question field.\n\noutput a single-line json object:\n{ "endpoint": "the chosen API endpoint to be invoked", "args":"params/body/headers/..., with same structure as the \'params\' JSON object(no more args than it) with additional \'value\' prop, or null if no args needed", "mapping": "if the the request_object is structured (or null if unstructured), generate the js function (request_object)=>{...;return API_signature_args;}, full implementation to return the **real** args from request_object to invoke the API. don\'t use data not exist or ambiguous in request", "question": "question to ask the caller if anything not sure or missing for request to args mapping, *no* guess or assumption of the mapping. null if the mapping is crystal clear." }"}', '{ "endpoint": "GET /positions", "args": null, "mapping": "(request_object)=>{return null;}", "question": null }', ), addLlmCache( - 9, + prisma, 'convert2Response', 'Given the openAPI endpoint:\n{"endpoint": "GET /positions", "summary":"listPositions: List all job positions", "description":"Retrieve a list of all available job positions.", "params":{}, "responses":{"200":{"description":"A list of job positions","content":{"application/json":{"schema":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","description":"Unique identifier for the job position"},"title":{"type":"string","description":"Title of the job position"},"description":{"type":"string","description":"Description of the job position"},"location":{"type":"string","description":"Location of the job position"},"requirements":{"type":"array","items":{"type":"string"},"description":"List of requirements for the job position"},"createdAt":{"type":"string","format":"date-time","description":"Timestamp when the job position was created"},"updatedAt":{"type":"string","format":"date-time","description":"Timestamp when the job position was last updated"}}}}}}},"500":{"description":"Internal Server Error"}} }\n\ninvoked with the following request:\n<--- request begin ---\n[]\n--- request end --->\n\nwe receive below response content:\n<--- response begin ---\nWe are pleased to inform you about the following job positions available at our company:\r\n\r\n1. Software Engineer\r\n   - Description: Develop and maintain software applications.\r\n   - Location: San Francisco, CA\r\n   - Requirements:\r\n     - Bachelor\'s degree in Computer Science or related field\r\n     - 3+ years of experience in software development\r\n     - Proficient in Java or Python\r\n   - Created At: October 1, 2023, 12:00 PM\r\n   - Updated At: October 1, 2023, 12:00 PM\r\n\r\n2. Product Manager\r\n   - Description: Define product strategy and roadmap.\r\n   - Location: New York, NY\r\n   - Requirements:\r\n     - Bachelor\'s degree in Business or related field\r\n     - 5+ years of experience in product management\r\n     - Strong analytical and problem-solving skills\r\n   - Created At: October 2, 2023, 10:00 AM\r\n   - Updated At: October 2, 2023, 10:00 AM\r\n\r\n3. Data Scientist\r\n   - Description: Analyze and interpret complex data to assist in decision-making.\r\n   - Location: Seattle, WA\r\n   - Requirements:\r\n     - Master\'s degree in Data Science or related field\r\n     - 2+ years of experience in data analysis\r\n     - Proficient in Python and SQL\r\n   - Created At: October 3, 2023, 8:00 AM\r\n   - Updated At: October 3, 2023, 8:00 AM\r\n\r\nPlease review the details and let us know if you are interested in any of these positions.\r\n\r\nBest regards\r\n> From: "Callgent Invoker"\r\n> Date: Thu, Sep 5, 2024, 14:44\r\n> Subject: [Callgent] Function calling: \'GET /positions\' from Callgent test-callgent. #xY5WGrPph-jn2HHn4_aLi\r\n> To: "dev"\r\n> [image: https://hgggdgi.r.bh.d.sendibt3.com/tr/op/CYIv2yvoVWHCvjQ__eO-QxCY-FkqVvmIPWtQz6OMpAh55LRbe8vKq9aHSdoB0TikwlnXx5U6VsnDPf9637MS7iqb_BpOIcAej4CvQCx2hCA2upHiNg6mXVisqoSvihA0UM9ymGtL9RJsmgdosYMyVW2iHwS9m9UcLtnagkPE-HXmIE8L4EkAApInhajwSZuVsine_ltWzXmBzfU9jp6e5g]\r\n> Hello dev!\r\n> Somebody is calling: \'GET /positions\' from Callgent test-callgent. Below is the detailed request information:\r\n> Function Calling:\r\n> Name:GET /positions\r\n> Summary:listPositions: List all job positions\r\n> Description:Retrieve a list of all available job positions.\r\n> Possible Responses:\r\n> Response OK:A list of job positions\r\n> [{"id":"Unique identifier for the job position","title":"Title of the job position","description":"Description of the job position","location":"Location of the job position","requirements":["string"],"createdAt":"format: date-time, Timestamp when the job position was created","updatedAt":"format: date-time, Timestamp when the job position was last updated"}]\r\n> Response Internal Server Error:Internal Server Error\r\n> \r\n> \r\n> Thu, 05 Sep 2024 06:44:13 GMT\r\n\n--- response end --->\n\nPlease formalize the response content as a single-lined JSON object:\n{"statusCode": "the exact response code(integer) defined in API", "data": "extracted response value with respect to the corresponding API response schema, or undefined if abnormal response", "error": "message": "error message if abnormal response, otherwise undefined"}', '{\n "statusCode": 200,\n "data": [\n {\n "id": "1",\n "title": "Software Engineer",\n "description": "Develop and maintain software applications.",\n "location": "San Francisco, CA",\n "requirements": [\n "Bachelor\'s degree in Computer Science or related field",\n "3+ years of experience in software development",\n "Proficient in Java or Python"\n ],\n "createdAt": "2023-10-01T12:00:00Z",\n "updatedAt": "2023-10-01T12:00:00Z"\n },\n {\n "id": "2",\n "title": "Product Manager",\n "description": "Define product strategy and roadmap.",\n "location": "New York, NY",\n "requirements": [\n "Bachelor\'s degree in Business or related field",\n "5+ years of experience in product management",\n "Strong analytical and problem-solving skills"\n ],\n "createdAt": "2023-10-02T10:00:00Z",\n "updatedAt": "2023-10-02T10:00:00Z"\n },\n {\n "id": "3",\n "title": "Data Scientist",\n "description": "Analyze and interpret complex data to assist in decision-making.",\n "location": "Seattle, WA",\n "requirements": [\n "Master\'s degree in Data Science or related field",\n "2+ years of experience in data analysis",\n "Proficient in Python and SQL"\n ],\n "createdAt": "2023-10-03T08:00:00Z",\n "updatedAt": "2023-10-03T08:00:00Z"\n }\n ]\n}', @@ -201,15 +200,15 @@ function initTestData() { } async function addLlmCache( - pk: number, + prisma, name: string, prompt: string, result: string, ) { - const llmCacheDto = { pk, name, prompt, result }; + const llmCacheDto = { name, prompt, result }; return prisma.llmCache .upsert({ - where: { pk }, + where: { prompt_name: { name, prompt } }, update: llmCacheDto, create: llmCacheDto, }) diff --git a/prisma/seed.ts b/prisma/seed.ts index cad958c..73cbf85 100644 --- a/prisma/seed.ts +++ b/prisma/seed.ts @@ -1,34 +1,32 @@ import { Prisma, PrismaClient } from '@prisma/client'; -const prisma = new PrismaClient({ - log: ['query', 'info', 'warn', 'error'], -}); - async function main() { - return await Promise.all(initData()); + const prisma = new PrismaClient({ + log: ['query', 'info', 'warn', 'error'], + }); + + return await Promise.all(initData(prisma)) + .catch((e) => { + console.error(e); + process.exit(1); + }) + .finally(async () => { + // close Prisma Client at the end + await prisma.$disconnect(); + }); } // execute the main function -main() - .catch((e) => { - console.error(e); - process.exit(1); - }) - .finally(async () => { - // close Prisma Client at the end - await prisma.$disconnect(); - }); +main(); -function initData() { - return [...initEventListeners(), initLlmTemplates()]; +function initData(prisma: PrismaClient) { + return [...initEventListeners(prisma), initLlmTemplates(prisma)]; } -function initEventListeners() { - let elId = 1, - priority = -100; +function initEventListeners(prisma: PrismaClient) { + let priority = -100; const els: Prisma.EventListenerUncheckedCreateInput[] = [ { - pk: elId++, id: 'CR-ADAPTOR-PREPROCESS', srcId: 'GLOBAL', tenantPk: 0, @@ -43,7 +41,6 @@ function initEventListeners() { priority: (priority += 100), }, { - pk: elId++, id: 'CR-CEP-AUTH', srcId: 'GLOBAL', tenantPk: 0, @@ -58,7 +55,6 @@ function initEventListeners() { priority: (priority += 100), }, { - pk: elId++, id: 'CR-LOAD-FUNCTIONS', srcId: 'GLOBAL', tenantPk: 0, @@ -73,7 +69,6 @@ function initEventListeners() { priority: (priority += 100), }, { - pk: elId++, id: 'CR-LOAD-TARGET', srcId: 'GLOBAL', tenantPk: 0, @@ -88,7 +83,6 @@ function initEventListeners() { priority: (priority += 100), }, { - pk: elId++, id: 'CR-MAP-2-FUNCTION', srcId: 'GLOBAL', tenantPk: 0, @@ -103,7 +97,6 @@ function initEventListeners() { priority: (priority += 100), }, { - pk: elId++, id: 'CR-SEP-AUTH', srcId: 'GLOBAL', tenantPk: 0, @@ -118,7 +111,6 @@ function initEventListeners() { priority: (priority += 100), }, { - pk: elId++, id: 'CR-INVOKE-SEP', srcId: 'GLOBAL', tenantPk: 0, @@ -149,7 +141,7 @@ function initEventListeners() { return els.map((el) => prisma.eventListener .upsert({ - where: { pk: el.pk }, + where: { id: el.id }, update: el, create: el, }) @@ -157,10 +149,9 @@ function initEventListeners() { ); } -async function initLlmTemplates() { +async function initLlmTemplates(prisma: PrismaClient) { const llmTemplates: Prisma.LlmTemplateUncheckedCreateInput[] = [ { - pk: 1, name: 'api2Function', prompt: `Please convert below API doc of format {{=it.format}}: { "{{=it.apiName}}": {{=it.apiContent}} } @@ -173,7 +164,6 @@ please generate the js function with **full implementation and error handling**! {"funName":"function name", "params":["invoker", ...apiParams]"documents":"formal js function documentation with description of params and response object with **all properties elaborated** exactly same as the API doc", "fullCode":"(invoker, ...)=>{...; const json = await invoker(...); ...; return apiResult;}"}`, }, { - pk: 2, name: 'map2Function', prompt: `given below service APIs: service {{=it.callgentName}} {{{~ it.callgentFunctions :fun }} @@ -192,7 +182,6 @@ output a single-line json object: { "endpoint": "the chosen API endpoint to be invoked", "args":"params/body/headers/..., with same structure as the 'params' JSON object(no more args than it) with additional 'value' prop, or null if no args needed", "mapping": "if the the request_object is structured (or null if unstructured), generate the js function (request_object)=>{...;return API_signature_args;}, full implementation to return the **real** args from request_object to invoke the API. don't use data not exist or ambiguous in request", "question": "question to ask the caller if anything not sure or missing for request to args mapping, *no* guess or assumption of the mapping. null if the mapping is crystal clear." }"}`, }, { - pk: 3, name: 'convert2Response', prompt: `Given the openAPI endpoint: {"endpoint": "{{=it.fun.name}}", "summary":"{{=it.fun.summary}}", {{=it.fun.description ? '"description":"'+it.fun.description+'", ':''}}"params":{{=JSON.stringify(it.fun.params)}}, "responses":{{=JSON.stringify(it.fun.responses)}} } @@ -215,7 +204,7 @@ Please formalize the response content as a single-lined JSON object: return llmTemplates.map((llmTpl) => prisma.llmTemplate .upsert({ - where: { pk: llmTpl.pk }, + where: { name: llmTpl.name }, update: llmTpl, create: llmTpl, }) From 8d0cb5acd122aedb5adac808f6ec09e7cae53795 Mon Sep 17 00:00:00 2001 From: dev-callgent Date: Thu, 26 Sep 2024 13:15:20 +0800 Subject: [PATCH 075/183] feat: callgent hub Signed-off-by: dev-callgent --- .env.dev | 1 + .../20240926035336_callgent_hub/migration.sql | 5 + prisma/schema.prisma | 4 + prisma/seed.ts | 28 ++- src/app.module.ts | 4 +- .../bff-callgent-functions.controller.ts | 2 +- .../callgent-hub/callgent-hub.controller.ts | 59 ------ src/bff/callgent-hub/callgent-hub.module.ts | 9 - .../callgent-tree/callgent-tree.controller.ts | 2 +- .../callgent-functions.service.ts | 13 +- .../callgent-hub.controller.spec.ts | 0 src/callgent-hub/callgent-hub.controller.ts | 97 ++++++++++ src/callgent-hub/callgent-hub.module.ts | 19 ++ src/callgent-hub/callgent-hub.service.spec.ts | 18 ++ src/callgent-hub/callgent-hub.service.ts | 182 ++++++++++++++++++ .../callgent-realms.service.ts | 8 + src/callgents/callgents.controller.ts | 23 --- src/callgents/callgents.service.ts | 46 +---- .../listeners/callgent-created.listener.ts | 1 + src/infra/repo/repos.module.ts | 8 +- 20 files changed, 379 insertions(+), 150 deletions(-) create mode 100644 prisma/migrations/20240926035336_callgent_hub/migration.sql delete mode 100644 src/bff/callgent-hub/callgent-hub.controller.ts delete mode 100644 src/bff/callgent-hub/callgent-hub.module.ts rename src/{bff => }/callgent-hub/callgent-hub.controller.spec.ts (100%) create mode 100644 src/callgent-hub/callgent-hub.controller.ts create mode 100644 src/callgent-hub/callgent-hub.module.ts create mode 100644 src/callgent-hub/callgent-hub.service.spec.ts create mode 100644 src/callgent-hub/callgent-hub.service.ts diff --git a/.env.dev b/.env.dev index 9720e14..d5c6e59 100644 --- a/.env.dev +++ b/.env.dev @@ -17,6 +17,7 @@ LOG_LEVELS_PRISMA=[{"emit":"event", "level":"query"},"info","warn","error"] ALLOW_CORS=1 # CREATE USER callgent WITH PASSWORD 'c@llgent123'; +# ALTER ROLE callgent CREATEDB; # GRANT ALL PRIVILEGES ON DATABASE callgent TO callgent; # GRANT USAGE, CREATE ON SCHEMA public TO callgent; # GRANT SELECT, INSERT, UPDATE, DELETE ON ALL TABLES IN SCHEMA public TO callgent; diff --git a/prisma/migrations/20240926035336_callgent_hub/migration.sql b/prisma/migrations/20240926035336_callgent_hub/migration.sql new file mode 100644 index 0000000..30826fa --- /dev/null +++ b/prisma/migrations/20240926035336_callgent_hub/migration.sql @@ -0,0 +1,5 @@ +-- AlterTable +ALTER TABLE "Callgent" ADD COLUMN "duplicatePk" INTEGER; + +-- AlterTable +ALTER TABLE "CallgentRealm" ALTER COLUMN "realm" DROP NOT NULL; diff --git a/prisma/schema.prisma b/prisma/schema.prisma index 4897f9e..a342c7e 100644 --- a/prisma/schema.prisma +++ b/prisma/schema.prisma @@ -160,6 +160,10 @@ model Callgent { name String @db.VarChar(255) summary String? @db.VarChar(4095) + /// @DtoReadOnly + /// @DtoEntityHidden + duplicatePk Int? /// @description duplicated from + /// @DtoReadOnly /// @DtoEntityHidden createdBy String @db.VarChar(36) diff --git a/prisma/seed.ts b/prisma/seed.ts index 73cbf85..4544aaf 100644 --- a/prisma/seed.ts +++ b/prisma/seed.ts @@ -1,11 +1,16 @@ import { Prisma, PrismaClient } from '@prisma/client'; +import { DefaultArgs } from '@prisma/client/runtime/library'; async function main() { const prisma = new PrismaClient({ log: ['query', 'info', 'warn', 'error'], }); - return await Promise.all(initData(prisma)) + return await prisma + .$transaction(async (prisma) => { + await prisma.$executeRaw`SELECT set_config('tenancy.bypass_rls', 'on', ${true})`; + await Promise.all(initData(prisma)); + }) .catch((e) => { console.error(e); process.exit(1); @@ -19,11 +24,21 @@ async function main() { // execute the main function main(); -function initData(prisma: PrismaClient) { +function initData( + prisma: Omit< + PrismaClient, + '$connect' | '$disconnect' | '$on' | '$transaction' | '$use' | '$extends' + >, +) { return [...initEventListeners(prisma), initLlmTemplates(prisma)]; } -function initEventListeners(prisma: PrismaClient) { +function initEventListeners( + prisma: Omit< + PrismaClient, + '$connect' | '$disconnect' | '$on' | '$transaction' | '$use' | '$extends' + >, +) { let priority = -100; const els: Prisma.EventListenerUncheckedCreateInput[] = [ { @@ -149,7 +164,12 @@ function initEventListeners(prisma: PrismaClient) { ); } -async function initLlmTemplates(prisma: PrismaClient) { +async function initLlmTemplates( + prisma: Omit< + PrismaClient, + '$connect' | '$disconnect' | '$on' | '$transaction' | '$use' | '$extends' + >, +) { const llmTemplates: Prisma.LlmTemplateUncheckedCreateInput[] = [ { name: 'api2Function', diff --git a/src/app.module.ts b/src/app.module.ts index 1c06845..a321fa2 100644 --- a/src/app.module.ts +++ b/src/app.module.ts @@ -5,10 +5,10 @@ import { AgentsModule } from './agents/agents.module'; import { AppController } from './app.controller'; import { AppService } from './app.service'; import { AuthTokensModule } from './auth-tokens/auth-tokens.module'; -import { CallgentTreeModule } from './bff/callgent-tree/callgent-tree.module'; import { BffCallgentFunctionsModule } from './bff/callgent-functions/bff-callgent-functions.module'; -import { CallgentHubModule } from './bff/callgent-hub/callgent-hub.module'; +import { CallgentTreeModule } from './bff/callgent-tree/callgent-tree.module'; import { CallgentFunctionsModule } from './callgent-functions/callgent-functions.module'; +import { CallgentHubModule } from './callgent-hub/callgent-hub.module'; import { CallgentRealmsModule } from './callgent-realms/callgent-realms.module'; import { CallgentsModule } from './callgents/callgents.module'; import { EmailsModule } from './emails/emails.module'; diff --git a/src/bff/callgent-functions/bff-callgent-functions.controller.ts b/src/bff/callgent-functions/bff-callgent-functions.controller.ts index 59fe55e..7e0c3ab 100644 --- a/src/bff/callgent-functions/bff-callgent-functions.controller.ts +++ b/src/bff/callgent-functions/bff-callgent-functions.controller.ts @@ -32,7 +32,7 @@ export class BffCallgentFunctionsController { req.user?.sub, ); - const data = await this.callgentFunctionService.findMany({ + const data = await this.callgentFunctionService.findAll({ where: { endpointId: endpoint.id }, }); diff --git a/src/bff/callgent-hub/callgent-hub.controller.ts b/src/bff/callgent-hub/callgent-hub.controller.ts deleted file mode 100644 index 7927c72..0000000 --- a/src/bff/callgent-hub/callgent-hub.controller.ts +++ /dev/null @@ -1,59 +0,0 @@ -import { Controller, Get, Query } from '@nestjs/common'; -import { - ApiOkResponse, - ApiQuery, - ApiTags, - getSchemaPath, -} from '@nestjs/swagger'; -import { CallgentsService } from '../../callgents/callgents.service'; -import { CallgentDto } from '../../callgents/dto/callgent.dto'; -import { RestApiResponse } from '../../restapi/response.interface'; - -@ApiTags('Hub') -@Controller('hub') -export class CallgentHubController { - constructor(private readonly callgentService: CallgentsService) {} - - @ApiQuery({ name: 'query', required: false, type: String }) - @ApiQuery({ name: 'page', required: false, type: Number }) - @ApiQuery({ name: 'perPage', required: false, type: Number }) - @ApiOkResponse({ - schema: { - allOf: [ - { $ref: getSchemaPath(RestApiResponse) }, - { - properties: { - data: { - type: 'array', - items: { $ref: getSchemaPath(CallgentDto) }, - }, - }, - }, - ], - }, - }) - @Get('callgents') - async findAll( - @Query() - query: { - queryString?: string; - page?: 1; - perPage?: 10; - // TODO orderBy?: string; - }, - ) { - const where = query.queryString - ? { - name: { contains: query.queryString }, - } - : undefined; - const list = await this.callgentService.findAllInHub({ - page: query.page, - perPage: query.perPage, - where, - // orderBy, - }); - list.data?.forEach((item: any) => (item.children = [])); - return list; - } -} diff --git a/src/bff/callgent-hub/callgent-hub.module.ts b/src/bff/callgent-hub/callgent-hub.module.ts deleted file mode 100644 index 8ae9f23..0000000 --- a/src/bff/callgent-hub/callgent-hub.module.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { Module } from '@nestjs/common'; -import { CallgentsModule } from '../../callgents/callgents.module'; -import { CallgentHubController } from './callgent-hub.controller'; - -@Module({ - imports: [CallgentsModule], - controllers: [CallgentHubController], -}) -export class CallgentHubModule {} diff --git a/src/bff/callgent-tree/callgent-tree.controller.ts b/src/bff/callgent-tree/callgent-tree.controller.ts index 96e62d2..be6942a 100644 --- a/src/bff/callgent-tree/callgent-tree.controller.ts +++ b/src/bff/callgent-tree/callgent-tree.controller.ts @@ -72,7 +72,7 @@ export class CallgentTreeController { if (ep.type == 'CLIENT') { CEP.push(ep); } else if (ep.type == 'SERVER') { - ep.children = await this.callgentFunctionsService.findMany({ + ep.children = await this.callgentFunctionsService.findAll({ select: { pk: false, params: false, diff --git a/src/callgent-functions/callgent-functions.service.ts b/src/callgent-functions/callgent-functions.service.ts index d42f70c..e2fb552 100644 --- a/src/callgent-functions/callgent-functions.service.ts +++ b/src/callgent-functions/callgent-functions.service.ts @@ -47,7 +47,7 @@ export class CallgentFunctionsService { const { funName, callgentId } = reqEvent.data; // TODO if too many functions, use summary first - const { data: funcs } = await this.findAll({ + const { data: funcs } = await this.findMany({ select: { createdAt: false, updatedAt: false, @@ -97,6 +97,13 @@ export class CallgentFunctionsService { // // doInvoke // } + @Transactional() + async create(data: Prisma.CallgentFunctionUncheckedCreateInput) { + const prisma = this.txHost.tx as PrismaClient; + const id = Utils.uuid(); + return prisma.callgentFunction.create({ data: { ...data, id } }); + } + @Transactional() async createBatch(endpoint: EndpointDto, spec: ApiSpec, createdBy: string) { if (endpoint.type != 'SERVER') @@ -192,7 +199,7 @@ export class CallgentFunctionsService { return this.createBatch(endpoint, apiSpec, createdBy); } - findAll({ + findMany({ select, where, orderBy = { pk: 'desc' }, @@ -228,7 +235,7 @@ export class CallgentFunctionsService { ); } - findMany({ + findAll({ select, where, orderBy, diff --git a/src/bff/callgent-hub/callgent-hub.controller.spec.ts b/src/callgent-hub/callgent-hub.controller.spec.ts similarity index 100% rename from src/bff/callgent-hub/callgent-hub.controller.spec.ts rename to src/callgent-hub/callgent-hub.controller.spec.ts diff --git a/src/callgent-hub/callgent-hub.controller.ts b/src/callgent-hub/callgent-hub.controller.ts new file mode 100644 index 0000000..235bf26 --- /dev/null +++ b/src/callgent-hub/callgent-hub.controller.ts @@ -0,0 +1,97 @@ +import { + Body, + Controller, + Get, + Param, + Post, + Query, + Req, + UseGuards, +} from '@nestjs/common'; +import { + ApiCreatedResponse, + ApiOkResponse, + ApiOperation, + ApiQuery, + ApiTags, + getSchemaPath, +} from '@nestjs/swagger'; +import { CallgentDto } from '../callgents/dto/callgent.dto'; +import { CreateCallgentDto } from '../callgents/dto/create-callgent.dto'; +import { RestApiResponse } from '../restapi/response.interface'; +import { CallgentHubService } from './callgent-hub.service'; +import { JwtGuard } from '../infra/auth/jwt/jwt.guard'; + +@ApiTags('Hub') +@Controller('hub') +export class CallgentHubController { + constructor(private readonly callgentHubService: CallgentHubService) {} + + @ApiQuery({ name: 'query', required: false, type: String }) + @ApiQuery({ name: 'page', required: false, type: Number }) + @ApiQuery({ name: 'perPage', required: false, type: Number }) + @ApiOkResponse({ + schema: { + allOf: [ + { $ref: getSchemaPath(RestApiResponse) }, + { + properties: { + data: { + type: 'array', + items: { $ref: getSchemaPath(CallgentDto) }, + }, + }, + }, + ], + }, + }) + @Get('callgents') + async findAll( + @Query() + query: { + queryString?: string; + page?: 1; + perPage?: 10; + // TODO orderBy?: string; + }, + ) { + const where = query.queryString + ? { + name: { contains: query.queryString }, + } + : undefined; + const list = await this.callgentHubService.findAllInHub({ + page: query.page, + perPage: query.perPage, + where, + // orderBy, + }); + list.data?.forEach((item: any) => (item.children = [])); + return list; + } + + @ApiOperation({ summary: 'Duplicate a callgent from Hub.' }) + @ApiCreatedResponse({ + schema: { + allOf: [ + { $ref: getSchemaPath(RestApiResponse) }, + { properties: { data: { $ref: getSchemaPath(CallgentDto) } } }, + ], + }, + }) + @UseGuards(JwtGuard) + @Post(':id/duplicate') + async duplicateFromHub( + @Param('id') id: string, + @Req() req, + @Body() dto: CreateCallgentDto, + ) { + return { + data: await this.callgentHubService.duplicateFromHub( + id, + dto, + req.user.sub, + ), + }; + } +} diff --git a/src/callgent-hub/callgent-hub.module.ts b/src/callgent-hub/callgent-hub.module.ts new file mode 100644 index 0000000..c52794b --- /dev/null +++ b/src/callgent-hub/callgent-hub.module.ts @@ -0,0 +1,19 @@ +import { Module } from '@nestjs/common'; +import { CallgentFunctionsModule } from '../callgent-functions/callgent-functions.module'; +import { CallgentRealmsModule } from '../callgent-realms/callgent-realms.module'; +import { CallgentsModule } from '../callgents/callgents.module'; +import { EndpointsModule } from '../endpoints/endpoints.module'; +import { CallgentHubController } from './callgent-hub.controller'; +import { CallgentHubService } from './callgent-hub.service'; + +@Module({ + imports: [ + CallgentsModule, + CallgentRealmsModule, + EndpointsModule, + CallgentFunctionsModule, + ], + controllers: [CallgentHubController], + providers: [CallgentHubService], +}) +export class CallgentHubModule {} diff --git a/src/callgent-hub/callgent-hub.service.spec.ts b/src/callgent-hub/callgent-hub.service.spec.ts new file mode 100644 index 0000000..1c3403c --- /dev/null +++ b/src/callgent-hub/callgent-hub.service.spec.ts @@ -0,0 +1,18 @@ +import { Test, TestingModule } from '@nestjs/testing'; +import { CallgentHubService } from './callgent-hub.service'; + +describe('CallgentHubService', () => { + let service: CallgentHubService; + + beforeEach(async () => { + const module: TestingModule = await Test.createTestingModule({ + providers: [CallgentHubService], + }).compile(); + + service = module.get(CallgentHubService); + }); + + it('should be defined', () => { + expect(service).toBeDefined(); + }); +}); diff --git a/src/callgent-hub/callgent-hub.service.ts b/src/callgent-hub/callgent-hub.service.ts new file mode 100644 index 0000000..970633f --- /dev/null +++ b/src/callgent-hub/callgent-hub.service.ts @@ -0,0 +1,182 @@ +import { Transactional, TransactionHost } from '@nestjs-cls/transactional'; +import { TransactionalAdapterPrisma } from '@nestjs-cls/transactional-adapter-prisma'; +import { Inject, Injectable, NotFoundException } from '@nestjs/common'; +import { CallgentRealm, Prisma, PrismaClient } from '@prisma/client'; +import { CallgentFunctionsService } from '../callgent-functions/callgent-functions.service'; +import { CallgentRealmsService } from '../callgent-realms/callgent-realms.service'; +import { RealmSecurityVO } from '../callgent-realms/dto/realm-security.vo'; +import { CallgentsService } from '../callgents/callgents.service'; +import { CreateCallgentDto } from '../callgents/dto/create-callgent.dto'; +import { EndpointsService } from '../endpoints/endpoints.service'; +import { PrismaTenancyService } from '../infra/repo/tenancy/prisma-tenancy.service'; + +@Injectable() +export class CallgentHubService { + constructor( + private readonly txHost: TransactionHost, + private readonly tenancyService: PrismaTenancyService, + private readonly callgentsService: CallgentsService, + @Inject('CallgentRealmsService') + private readonly callgentRealmsService: CallgentRealmsService, + @Inject('EndpointsService') + private readonly endpointsService: EndpointsService, + @Inject('CallgentFunctionsService') + private readonly callgentFunctionsService: CallgentFunctionsService, + ) {} + + @Transactional() + /** hub are those in tenantPk = -1 */ + private async _onHubAction(fn: () => Promise): Promise { + const tenantPk = this.tenancyService.getTenantId(); + try { + this.tenancyService.setTenantId(-1); + return await fn.apply(this); + } finally { + this.tenancyService.setTenantId(tenantPk); + } + } + + async findAllInHub(params: { + select?: Prisma.CallgentSelect; + where?: Prisma.CallgentWhereInput; + orderBy?: Prisma.CallgentOrderByWithRelationInput; + page?: number; + perPage?: number; + }) { + return this._onHubAction(() => this.callgentsService.findMany(params)); + } + + /** + * Callgent, Endpoint, CallgentFunction, CallgentRealm. + */ + @Transactional() + async duplicateFromHub( + dupId: string, + dto: CreateCallgentDto, + createdBy: string, + ) { + const from = await this._onHubAction(async () => { + const prisma = this.txHost.tx as PrismaClient; + const dup = await prisma.callgent.findUnique({ + where: { id: dupId }, + select: { + pk: true, + id: true, + name: true, + summary: true, + endpoints: { + select: { + id: true, + name: true, + type: true, + adaptorKey: true, + priority: true, + host: true, + initParams: true, + content: true, + securities: true, + }, + }, + }, + }); + if (!dup) + throw new NotFoundException('Callgent in hub not found: ' + dupId); + return dup; + }); + + const eps = from.endpoints; + from.endpoints = undefined; + const callgent = await this.callgentsService.create( + { ...from, ...dto, duplicatePk: from.pk }, + createdBy, + ); + const callgentId = callgent.id; + + const realms = await this.callgentRealmsService.findAll({ + where: { callgentId: from.id }, + orderBy: { pk: 'asc' }, + select: { + pk: true, + realmKey: true, + authType: true, + realm: true, + scheme: true, + secret: false, // don't duplicate secret + perUser: true, + }, + }); + const realmMap: { [pk: number]: CallgentRealm } = {}; + await Promise.all( + realms.map(async (r) => { + const realm = await this.callgentRealmsService.create({ + ...r, + callgentId, + }); + realmMap[r.pk] = realm; + }), + ); + + const endpointMap = {}; + await Promise.all( + eps.map(async (epOld) => { + const securities: any[] = dupSecurities(epOld.securities); + + const ep = await this.endpointsService.create({ + ...epOld, + callgentId, + securities, + createdBy, + }); + endpointMap[epOld.id] = ep; + + const functions = await this.callgentFunctionsService.findAll({ + where: { endpointId: epOld.id }, + orderBy: { pk: 'asc' }, + select: { + name: true, + path: true, + method: true, + summary: true, + description: true, + securities: true, + params: true, + responses: true, + rawJson: true, + }, + }); + functions.map((fun) => { + const securities: any[] = dupSecurities(fun.securities); + this.callgentFunctionsService.create({ + ...fun, + securities, + callgentId, + endpointId: ep.id, + createdBy, + }); + }); + }), + ); + return callgent; + + function dupSecurities(securities: any[]): RealmSecurityVO[] { + return securities?.map((security) => { + const ret: RealmSecurityVO = {}; + Object.values(security).forEach((item: any) => { + const realm = realmMap[item.realmPk]; + ret['' + realm.pk] = { ...item, realmPk: realm.pk }; + }); + return ret; + }); + } + } + + /** + * Callgent, Endpoint, CallgentFunction, CallgentRealm. + */ + @Transactional() + async duplicateToHub( + dupId: string, + dto: CreateCallgentDto, + createdBy: string, + ) {} +} diff --git a/src/callgent-realms/callgent-realms.service.ts b/src/callgent-realms/callgent-realms.service.ts index e04f97e..dd41449 100644 --- a/src/callgent-realms/callgent-realms.service.ts +++ b/src/callgent-realms/callgent-realms.service.ts @@ -40,6 +40,14 @@ export class CallgentRealmsService { //// auth config start //// + @Transactional() + async create(realm: Prisma.CallgentRealmUncheckedCreateInput) { + const prisma = this.txHost.tx as PrismaClient; + const processor = this._getAuthProcessor(realm.authType); + realm = processor.constructRealm(realm.scheme as any, realm as any) as any; + return prisma.callgentRealm.create({ data: { ...realm, pk: undefined } }); + } + /** * try to map to existing realm */ diff --git a/src/callgents/callgents.controller.ts b/src/callgents/callgents.controller.ts index e830ee9..7d1ed70 100644 --- a/src/callgents/callgents.controller.ts +++ b/src/callgents/callgents.controller.ts @@ -112,29 +112,6 @@ export class CallgentsController { return { data: await this.callgentsService.update(dto) }; } - @ApiCreatedResponse({ - schema: { - allOf: [ - { $ref: getSchemaPath(RestApiResponse) }, - { properties: { data: { $ref: getSchemaPath(CallgentDto) } } }, - ], - }, - }) - @Post(':id/duplicate') - async duplicateOverTenancy( - @Param('id') id: string, - @Req() req, - @Body() dto: CreateCallgentDto, - ) { - return { - data: await this.callgentsService.duplicateOverTenancy( - id, - dto, - req.user.sub, - ), - }; - } - @ApiOkResponse({ schema: { allOf: [ diff --git a/src/callgents/callgents.service.ts b/src/callgents/callgents.service.ts index 6d2af5b..6c0ccaf 100644 --- a/src/callgents/callgents.service.ts +++ b/src/callgents/callgents.service.ts @@ -24,18 +24,19 @@ export class CallgentsService { protected readonly defSelect: Prisma.CallgentSelect = { pk: false, tenantPk: false, + duplicatePk: false, createdBy: false, deletedAt: false, }; @Transactional() async create( - dto: CreateCallgentDto, + dto: CreateCallgentDto & { duplicatePk?: number }, createdBy: string, select?: Prisma.CallgentSelect, ) { const data = dto as Prisma.CallgentUncheckedCreateInput; - (data.id = Utils.uuid()), (data.createdBy = createdBy); + (data.id = Utils.uuid()), (data.createdBy = createdBy), delete data.pk; const prisma = this.txHost.tx as PrismaClient; const ret: Callgent = await selectHelper( @@ -215,45 +216,4 @@ export class CallgentsService { // pre-meta, pre-routing, pre-mapping } - - /// hub actions - - @Transactional() - /** hub are those in tenantPk = -1 */ - private async _onHubAction(fn: () => Promise): Promise { - const tenantPk = this.tenancyService.getTenantId(); - try { - this.tenancyService.setTenantId(-1); - return await fn.apply(this); - } finally { - this.tenancyService.setTenantId(tenantPk); - } - } - - async findAllInHub(params: { - select?: Prisma.CallgentSelect; - where?: Prisma.CallgentWhereInput; - orderBy?: Prisma.CallgentOrderByWithRelationInput; - page?: number; - perPage?: number; - }) { - return this._onHubAction(() => this.findMany(params)); - } - - @Transactional() - async duplicateOverTenancy( - dupId: string, - dto: CreateCallgentDto, - createdBy: string, - ) { - const prisma = this.txHost.tx as PrismaClient; - - await this.tenancyService.bypassTenancy(prisma); // FIXME - const dup = await prisma.callgent.findUnique({ where: { id: dupId } }); - if (!dup) - throw new NotFoundException('Callgent to duplicate not found: ' + dupId); - - await this.tenancyService.bypassTenancy(prisma, false); - return this.create(dto, createdBy, { id: null }); - } } diff --git a/src/endpoints/listeners/callgent-created.listener.ts b/src/endpoints/listeners/callgent-created.listener.ts index af6ffff..4192072 100644 --- a/src/endpoints/listeners/callgent-created.listener.ts +++ b/src/endpoints/listeners/callgent-created.listener.ts @@ -21,6 +21,7 @@ export class CallgentCreatedListener { this.logger.debug('Handling event: %j', event); const callgent = event.callgent; + if (callgent.duplicatePk) return; // duplicated callgent // add default endpoints const results = await Promise.all([ diff --git a/src/infra/repo/repos.module.ts b/src/infra/repo/repos.module.ts index def98a8..ecad43f 100644 --- a/src/infra/repo/repos.module.ts +++ b/src/infra/repo/repos.module.ts @@ -1,5 +1,5 @@ import { CacheInterceptor, CacheModule } from '@nestjs/cache-manager'; -import { Global, Module, OnModuleInit } from '@nestjs/common'; +import { Global, Logger, Module, OnModuleInit } from '@nestjs/common'; import { PrismaModule, PrismaService, @@ -10,7 +10,6 @@ import { ClsPluginTransactional } from '@nestjs-cls/transactional'; import { TransactionalAdapterPrisma } from '@nestjs-cls/transactional-adapter-prisma'; import { ConfigService } from '@nestjs/config'; import { APP_INTERCEPTOR } from '@nestjs/core'; -import { Prisma } from '@prisma/client'; import { ClsModule } from 'nestjs-cls'; import { mainPrismaServiceOptions } from './prisma.middlewares'; import { PrismaTenancyOnPgModule } from './tenancy/prisma-tenancy.module'; @@ -56,6 +55,7 @@ import { ValidatorModule } from './validators/validator.module'; ], }) export class ReposModule implements OnModuleInit { + private readonly logger = new Logger('SQL'); constructor(private readonly prismaService: PrismaService) {} onModuleInit() { @@ -67,9 +67,7 @@ export class ReposModule implements OnModuleInit { sql.startsWith('update') || sql.startsWith('delete') ) - console.log( - `\x1b[33m[SQL]\x1b[0m: ${e.query}; \x1b[34m${e.params}\x1b[0m`, - ); + this.logger.debug(`${e.query}; \x1b[34m${e.params}\x1b[0m`); }); } } From cb3a355f757f320a0810d39bb36f72d0b49dabbd Mon Sep 17 00:00:00 2001 From: dev-callgent Date: Fri, 27 Sep 2024 15:15:48 +0800 Subject: [PATCH 076/183] feat: callgent hub Signed-off-by: dev-callgent --- .../20240926035336_callgent_hub/migration.sql | 41 ++- .../migrations/20240926102127_1/migration.sql | 40 +++ prisma/schema.prisma | 28 +- prisma/seed-test.ts | 12 + prisma/seed.ts | 83 +++++- src/callgent-hub/callgent-hub.controller.ts | 55 +++- src/callgent-hub/callgent-hub.service.ts | 266 ++++++++++-------- src/callgent-realms/dto/realm-scheme.vo.ts | 3 + src/callgents/callgents.controller.ts | 2 +- src/callgents/callgents.service.ts | 13 +- src/endpoints/endpoints.controller.ts | 2 +- .../listeners/callgent-created.listener.ts | 2 +- src/users/users.controller.ts | 2 +- 13 files changed, 416 insertions(+), 133 deletions(-) create mode 100644 prisma/migrations/20240926102127_1/migration.sql diff --git a/prisma/migrations/20240926035336_callgent_hub/migration.sql b/prisma/migrations/20240926035336_callgent_hub/migration.sql index 30826fa..bd65dca 100644 --- a/prisma/migrations/20240926035336_callgent_hub/migration.sql +++ b/prisma/migrations/20240926035336_callgent_hub/migration.sql @@ -1,5 +1,44 @@ -- AlterTable -ALTER TABLE "Callgent" ADD COLUMN "duplicatePk" INTEGER; +ALTER TABLE "Callgent" ADD COLUMN "forkedPk" INTEGER, +ADD COLUMN "mainTagId" INTEGER; -- AlterTable ALTER TABLE "CallgentRealm" ALTER COLUMN "realm" DROP NOT NULL; + +-- CreateTable +CREATE TABLE "Tag" ( + "id" SERIAL NOT NULL, + "name" VARCHAR(30) NOT NULL, + "avatar" VARCHAR(1023), + "description" VARCHAR(1024) NOT NULL, + + CONSTRAINT "Tag_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "CallgentTag" ( + "pk" SERIAL NOT NULL, + "tagId" INTEGER NOT NULL, + "callgentId" VARCHAR(36) NOT NULL, + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + + CONSTRAINT "CallgentTag_pkey" PRIMARY KEY ("pk") +); + +-- CreateIndex +CREATE UNIQUE INDEX "Tag_name_key" ON "Tag"("name"); + +-- CreateIndex +CREATE INDEX "CallgentTag_tagId_idx" ON "CallgentTag"("tagId"); + +-- CreateIndex +CREATE INDEX "CallgentTag_callgentId_idx" ON "CallgentTag"("callgentId"); + +-- CreateIndex +CREATE UNIQUE INDEX "CallgentTag_callgentId_tagId_key" ON "CallgentTag"("callgentId", "tagId"); + +-- CreateIndex +CREATE INDEX "Callgent_forkedPk_idx" ON "Callgent"("forkedPk"); + +-- CreateIndex +CREATE INDEX "Callgent_mainTagId_idx" ON "Callgent"("mainTagId"); diff --git a/prisma/migrations/20240926102127_1/migration.sql b/prisma/migrations/20240926102127_1/migration.sql new file mode 100644 index 0000000..16ad59c --- /dev/null +++ b/prisma/migrations/20240926102127_1/migration.sql @@ -0,0 +1,40 @@ +-- AlterTable +ALTER TABLE "Callgent" ADD COLUMN "mainTagId" INTEGER; + +-- CreateTable +CREATE TABLE "Tag" ( + "id" SERIAL NOT NULL, + "name" VARCHAR(30) NOT NULL, + "avatar" VARCHAR(1023), + "description" VARCHAR(1024) NOT NULL, + + CONSTRAINT "Tag_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "CallgentTag" ( + "pk" SERIAL NOT NULL, + "tagId" INTEGER NOT NULL, + "callgentId" VARCHAR(36) NOT NULL, + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + + CONSTRAINT "CallgentTag_pkey" PRIMARY KEY ("pk") +); + +-- CreateIndex +CREATE UNIQUE INDEX "Tag_name_key" ON "Tag"("name"); + +-- CreateIndex +CREATE INDEX "CallgentTag_tagId_idx" ON "CallgentTag"("tagId"); + +-- CreateIndex +CREATE INDEX "CallgentTag_callgentId_idx" ON "CallgentTag"("callgentId"); + +-- CreateIndex +CREATE UNIQUE INDEX "CallgentTag_callgentId_tagId_key" ON "CallgentTag"("callgentId", "tagId"); + +-- CreateIndex +CREATE INDEX "Callgent_forkedPk_idx" ON "Callgent"("forkedPk"); + +-- CreateIndex +CREATE INDEX "Callgent_mainTagId_idx" ON "Callgent"("mainTagId"); diff --git a/prisma/schema.prisma b/prisma/schema.prisma index a342c7e..3591732 100644 --- a/prisma/schema.prisma +++ b/prisma/schema.prisma @@ -145,6 +145,14 @@ model PublicMailHost { //////////////////// Callgent //////////////////////////// +/// @DtoIgnoreModel +model Tag { + id Int @id @default(autoincrement()) + name String @unique @db.VarChar(30) + avatar String? @db.VarChar(1023) + description String @db.VarChar(1024) +} + model Callgent { /// @DtoEntityHidden pk Int @id @default(autoincrement()) @@ -162,7 +170,9 @@ model Callgent { /// @DtoReadOnly /// @DtoEntityHidden - duplicatePk Int? /// @description duplicated from + forkedPk Int? /// @description forked from + /// @CustomValidator(EntityIdExists, 'tag', 'id', ../../infra/repo/validators/entity-exists.validator) + mainTagId Int? /// @DtoReadOnly /// @DtoEntityHidden @@ -178,6 +188,22 @@ model Callgent { @@unique([tenantPk, name]) @@index([tenantPk]) + @@index([forkedPk]) + @@index([mainTagId]) +} + +/// @DtoIgnoreModel +model CallgentTag { + pk Int @id @default(autoincrement()) + + tagId Int + callgentId String @db.VarChar(36) + + createdAt DateTime @default(now()) + + @@unique([callgentId, tagId]) + @@index([tagId]) + @@index([callgentId]) } /// @description callgent function in openAPI.json format diff --git a/prisma/seed-test.ts b/prisma/seed-test.ts index 7aaed2c..2494df7 100644 --- a/prisma/seed-test.ts +++ b/prisma/seed-test.ts @@ -190,6 +190,18 @@ function initTestData( 'given below service APIs:\nservice test-callgent {\n "API: GET /positions": {"endpoint": "GET /positions", "summary":"listPositions: List all job positions", "description":"Retrieve a list of all available job positions.", "params":{}, "responses":{"200":{"description":"A list of job positions","content":{"application/json":{"schema":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","description":"Unique identifier for the job position"},"title":{"type":"string","description":"Title of the job position"},"description":{"type":"string","description":"Description of the job position"},"location":{"type":"string","description":"Location of the job position"},"requirements":{"type":"array","items":{"type":"string"},"description":"List of requirements for the job position"},"createdAt":{"type":"string","format":"date-time","description":"Timestamp when the job position was created"},"updatedAt":{"type":"string","format":"date-time","description":"Timestamp when the job position was last updated"}}}}}}},"500":{"description":"Internal Server Error"}} },\n}\n\nPlease choose one API to fulfill below request:\n{\n"requesting endpoint": "GET /positions",\n"request from": "restAPI",\n"request_object": {"url":"/positions","method":"GET","headers":{"accept":"*/*","accept-encoding":"gzip, deflate, br","cache-control":"no-cache","connection":"keep-alive","host":"127.0.0.1:3000","user-agent":"Apifox/1.0.0 (https://apifox.com)"},"query":{}},\n}\nand code for request_object to chosen function args mapping. if any data missing/unclear/ambiguous from request_object to invocation args, please ask question to the caller in below json.question field.\n\noutput a single-line json object:\n{ "endpoint": "the chosen API endpoint to be invoked", "args":"params/body/headers/..., with same structure as the \'params\' JSON object(no more args than it) with additional \'value\' prop, or null if no args needed", "mapping": "if the the request_object is structured (or null if unstructured), generate the js function (request_object)=>{...;return API_signature_args;}, full implementation to return the **real** args from request_object to invoke the API. don\'t use data not exist or ambiguous in request", "question": "question to ask the caller if anything not sure or missing for request to args mapping, *no* guess or assumption of the mapping. null if the mapping is crystal clear." }"}', '{ "endpoint": "GET /positions", "args": null, "mapping": "(request_object)=>{return null;}", "question": null }', ), + addLlmCache( + prisma, + 'map2Function', + 'given below service APIs:\nservice test-callgent {\n "API: POST /api/users/send-confirm-email": {"endpoint": "POST /api/users/send-confirm-email", "summary":"UsersController_sendConfirmEmail: Reset password by sending validation email with reset url", "description":" Tags: Users", "params":{"parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"email":{"type":"string","example":"user@example.com","nullable":false},"create":{"type":"boolean","description":"If true, a new user will be created if not exists.","nullable":true},"resetPwd":{"type":"boolean","description":"If set to false, only validating email. Note: new user forces resetPwd.","nullable":true}},"required":["email"]}}}}}, "responses":{"201":{"description":"","content":{"application/json":{"schema":{"allOf":[{"type":"object","properties":{"statusCode":{"type":"number","description":"Status code, empty means success"},"message":{"type":"string"},"data":{"type":"object"},"meta":{"type":"object","description":"Pagination, usage, quotation, profiling, versions, HATEOAS, etc."}},"required":["data"]},{"properties":{"data":{"type":"boolean"}}}]}}}}} },\n}\n\nPlease choose one API to fulfill below request:\n{\n"requesting endpoint": "POST /api/users/send-confirm-email",\n"request from": "restAPI",\n"request_object": {"url":"/api/users/send-confirm-email","method":"POST","headers":{"accept":"*/*","accept-encoding":"gzip, deflate, br","cache-control":"no-cache","connection":"keep-alive","content-length":"53","content-type":"application/json","host":"127.0.0.1:3000","user-agent":"Apifox/1.0.0 (https://apifox.com)"},"params":{},"data":{"email":"dev@callgent.com","resetPwd":true}},\n}\nand code for request_object to chosen function args mapping. if any data missing/unclear/ambiguous from request_object to invocation args, please ask question to the caller in below json.question field.\n\noutput a single-line json object:\n{ "endpoint": "the chosen API endpoint to be invoked", "args":"params/body/headers/..., with same structure as the \'params\' JSON object(no more args than it) with additional \'value\' prop, or null if no args needed", "mapping": "if the the request_object is structured (or null if unstructured), generate the js function (request_object)=>{...;return API_signature_args;}, full implementation to return the **real** args from request_object to invoke the API. don\'t use data not exist or ambiguous in request", "question": "question to ask the caller if anything not sure or missing for request to args mapping, *no* guess or assumption of the mapping. null if the mapping is crystal clear." }"}', + '```json\n{\n "endpoint": "POST /api/users/send-confirm-email",\n "args": {\n "params": null,\n "body": {\n "email": { "value": "dev@callgent.com" },\n "resetPwd": { "value": true }\n },\n "headers": null\n },\n "mapping": "(request_object) => {\n const { data } = request_object;\n return {\n body: {\n email: { value: data.email },\n resetPwd: { value: data.resetPwd }\n }\n };\n }",\n "question": null\n}\n```', + ), + addLlmCache( + prisma, + 'map2Function', + 'given below service APIs:\nservice test-callgent {\n "API: POST /api/users/send-confirm-email": {"endpoint": "POST /api/users/send-confirm-email", "summary":"UsersController_sendConfirmEmail: Reset password by sending validation email with reset url", "description":" Tags: Users", "params":{"parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"email":{"type":"string","example":"user@example.com","nullable":false},"create":{"type":"boolean","description":"If true, a new user will be created if not exists.","nullable":true},"resetPwd":{"type":"boolean","description":"If set to false, only validating email. Note: new user forces resetPwd.","nullable":true}},"required":["email"]}}}}}, "responses":{"201":{"description":"","content":{"application/json":{"schema":{"allOf":[{"type":"object","properties":{"statusCode":{"type":"number","description":"Status code, empty means success"},"message":{"type":"string"},"data":{"type":"object"},"meta":{"type":"object","description":"Pagination, usage, quotation, profiling, versions, HATEOAS, etc."}},"required":["data"]},{"properties":{"data":{"type":"boolean"}}}]}}}}} },\n}\n\nPlease choose one API to fulfill below request:\n{\n"requesting endpoint": "POST /api/users/send-confirm-email",\n"request from": "restAPI",\n"request_object": {"url":"/api/users/send-confirm-email","method":"POST","headers":{"accept":"*/*","accept-encoding":"gzip, deflate, br","connection":"keep-alive","content-length":"53","content-type":"application/json","host":"127.0.0.1:3000","user-agent":"Apifox/1.0.0 (https://apifox.com)"},"params":{},"data":{"email":"dev@callgent.com","resetPwd":true}},\n}\nand code for request_object to chosen function args mapping. if any data missing/unclear/ambiguous from request_object to invocation args, please ask question to the caller in below json.question field.\n\noutput a single-line json object:\n{ "endpoint": "the chosen API endpoint to be invoked", "args":"params/body/headers/..., with same structure as the \'params\' JSON object(no more args than it) with additional \'value\' prop, or null if no args needed", "mapping": "if the the request_object is structured (or null if unstructured), generate the js function (request_object)=>{...;return API_signature_args;}, full implementation to return the **real** args from request_object to invoke the API. don\'t use data not exist or ambiguous in request", "question": "question to ask the caller if anything not sure or missing for request to args mapping, *no* guess or assumption of the mapping. null if the mapping is crystal clear." }"}', + '```json\n{\n "endpoint": "POST /api/users/send-confirm-email",\n "args": {\n "params": null,\n "body": {\n "email": { "value": "dev@callgent.com" },\n "resetPwd": { "value": true }\n },\n "headers": null\n },\n "mapping": "(request_object) => {\n const { data } = request_object;\n return {\n body: {\n email: { value: data.email },\n resetPwd: { value: data.resetPwd }\n }\n };\n }",\n "question": null\n}\n```', + ), addLlmCache( prisma, 'convert2Response', diff --git a/prisma/seed.ts b/prisma/seed.ts index 4544aaf..5c3b3b1 100644 --- a/prisma/seed.ts +++ b/prisma/seed.ts @@ -30,7 +30,11 @@ function initData( '$connect' | '$disconnect' | '$on' | '$transaction' | '$use' | '$extends' >, ) { - return [...initEventListeners(prisma), initLlmTemplates(prisma)]; + return [ + ...initEventListeners(prisma), + initLlmTemplates(prisma), + ...initTags(prisma), + ]; } function initEventListeners( @@ -231,3 +235,80 @@ Please formalize the response content as a single-lined JSON object: .then((llmTpl) => console.log({ llmTpl })), ); } +function initTags( + prisma: Omit< + PrismaClient, + '$connect' | '$disconnect' | '$on' | '$transaction' | '$use' | '$extends' + >, +) { + const tags: Prisma.TagCreateInput[] = [ + { + name: 'App Security', + description: + 'APIs to enhance the security of applications by protecting them from various cybersecurity threats', + }, + { + name: 'Artificial Intelligence', + description: + 'Ready to use APIs to add Artificial intelligence capabilities to your app such as predictive analysis, bots, and language conversions', + }, + { + name: 'Communication', + description: + 'APIs enabling the exchange of information and news via messaging, meetings, push notifications, survey forms', + }, + { + name: 'Data Analytics', + description: + 'APIs enabling seamless data generation, processing, analysis, and visualization', + }, + { + name: 'Database', + description: + 'Find database APIs on the Postman Public API Network. Discover public APIs to retrieve data and work with databases', + }, + { + name: 'Developer Productivity', + description: + 'Must-fork APIs to improve productivity during the software development lifecycle and fasten the execution process', + }, + { + name: 'DevOps', + description: + 'APIs recommended by Postman to enable quick CI/CD, build automation, containerization, config management during code deployment process', + }, + { + name: 'E-commerce', + description: + 'Ready to use APIs to streamline online shopping, logistics, catalogs, and inventory management to create exceptional e-commerce applications.', + }, + { + name: 'eSignature', + description: + 'Handpicked APIs for seamless e-signatures and document signing, empowering developers to build exceptional applications.', + }, + { + name: 'Financial Services', + description: + 'Banking and stock market APIs for managing personal finance, real-time trading and integrating with financial institutions', + }, + { + name: 'Payments', + description: + 'APIs to seamlessly integrate and manage payments in your apps', + }, + { + name: 'Travel', + description: + 'Exciting Travel APIs handpicked by Postman for seamless retrieval of real', + }, + ]; + + return tags.map((t) => + prisma.tag.upsert({ + where: { name: t.name }, + update: t, + create: t, + }), + ); +} diff --git a/src/callgent-hub/callgent-hub.controller.ts b/src/callgent-hub/callgent-hub.controller.ts index 235bf26..4d6259c 100644 --- a/src/callgent-hub/callgent-hub.controller.ts +++ b/src/callgent-hub/callgent-hub.controller.ts @@ -12,15 +12,30 @@ import { ApiCreatedResponse, ApiOkResponse, ApiOperation, + ApiProperty, ApiQuery, ApiTags, getSchemaPath, } from '@nestjs/swagger'; +import { IsInt, IsNotEmpty } from 'class-validator'; import { CallgentDto } from '../callgents/dto/callgent.dto'; import { CreateCallgentDto } from '../callgents/dto/create-callgent.dto'; +import { JwtGuard } from '../infra/auth/jwt/jwt.guard'; import { RestApiResponse } from '../restapi/response.interface'; import { CallgentHubService } from './callgent-hub.service'; -import { JwtGuard } from '../infra/auth/jwt/jwt.guard'; +import { EntityIdExists } from '../infra/repo/validators/entity-exists.validator'; + +export class CreateCallgentDtoEx extends CreateCallgentDto { + @ApiProperty({ + type: 'integer', + format: 'int32', + required: true, + }) + @IsNotEmpty() + @IsInt() + @EntityIdExists('tag', 'id') + mainTagId: number; +} @ApiTags('Hub') @Controller('hub') @@ -32,7 +47,7 @@ export class CallgentHubController { @ApiQuery({ name: 'perPage', required: false, type: Number }) @ApiOkResponse({ schema: { - allOf: [ + anyOf: [ { $ref: getSchemaPath(RestApiResponse) }, { properties: { @@ -70,7 +85,7 @@ export class CallgentHubController { return list; } - @ApiOperation({ summary: 'Duplicate a callgent from Hub.' }) + @ApiOperation({ summary: 'Fork a callgent from the Callgent Hub.' }) @ApiCreatedResponse({ schema: { allOf: [ @@ -80,18 +95,38 @@ export class CallgentHubController { }, }) @UseGuards(JwtGuard) - @Post(':id/duplicate') - async duplicateFromHub( + @Post('callgents/:id/fork') + async forkFromHub( @Param('id') id: string, @Req() req, @Body() dto: CreateCallgentDto, ) { return { - data: await this.callgentHubService.duplicateFromHub( - id, - dto, - req.user.sub, - ), + data: await this.callgentHubService.forkFromHub(id, dto, req.user.sub), + }; + } + + @ApiOperation({ + summary: 'Commit a callgent to the Callgent Hub.', + description: 'Only original callgent can go into the hub;', + }) + @ApiCreatedResponse({ + schema: { + allOf: [ + { $ref: getSchemaPath(RestApiResponse) }, + { properties: { data: { $ref: getSchemaPath(CallgentDto) } } }, + ], + }, + }) + @UseGuards(JwtGuard) + @Post('callgents/:id/commit') + async commitToHub( + @Param('id') id: string, + @Req() req, + @Body() dto: CreateCallgentDtoEx, + ) { + return { + data: await this.callgentHubService.commitToHub(id, dto, req.user.sub), }; } } diff --git a/src/callgent-hub/callgent-hub.service.ts b/src/callgent-hub/callgent-hub.service.ts index 970633f..1d1bc66 100644 --- a/src/callgent-hub/callgent-hub.service.ts +++ b/src/callgent-hub/callgent-hub.service.ts @@ -1,7 +1,12 @@ import { Transactional, TransactionHost } from '@nestjs-cls/transactional'; import { TransactionalAdapterPrisma } from '@nestjs-cls/transactional-adapter-prisma'; -import { Inject, Injectable, NotFoundException } from '@nestjs/common'; -import { CallgentRealm, Prisma, PrismaClient } from '@prisma/client'; +import { + BadRequestException, + Inject, + Injectable, + NotFoundException, +} from '@nestjs/common'; +import { CallgentRealm, Prisma } from '@prisma/client'; import { CallgentFunctionsService } from '../callgent-functions/callgent-functions.service'; import { CallgentRealmsService } from '../callgent-realms/callgent-realms.service'; import { RealmSecurityVO } from '../callgent-realms/dto/realm-security.vo'; @@ -12,6 +17,7 @@ import { PrismaTenancyService } from '../infra/repo/tenancy/prisma-tenancy.servi @Injectable() export class CallgentHubService { + public readonly hubTenantPK = -1; constructor( private readonly txHost: TransactionHost, private readonly tenancyService: PrismaTenancyService, @@ -29,7 +35,7 @@ export class CallgentHubService { private async _onHubAction(fn: () => Promise): Promise { const tenantPk = this.tenancyService.getTenantId(); try { - this.tenancyService.setTenantId(-1); + this.tenancyService.setTenantId(this.hubTenantPK); return await fn.apply(this); } finally { this.tenancyService.setTenantId(tenantPk); @@ -50,133 +56,165 @@ export class CallgentHubService { * Callgent, Endpoint, CallgentFunction, CallgentRealm. */ @Transactional() - async duplicateFromHub( - dupId: string, + async forkFromHub(dupId: string, dto: CreateCallgentDto, createdBy: string) { + const currentTenant = this.tenancyService.getTenantId(); + return this._duplicateCallgent( + dupId, + dto, + createdBy, + this.hubTenantPK, + currentTenant, + ); + } + + /** + * Callgent, Endpoint, CallgentFunction, CallgentRealm. + */ + @Transactional() + async commitToHub(dupId: string, dto: CreateCallgentDto, createdBy: string) { + const currentTenant = this.tenancyService.getTenantId(); + return this._duplicateCallgent( + dupId, + dto, + createdBy, + currentTenant, + this.hubTenantPK, + ); + } + + protected async _duplicateCallgent( + fromId: string, dto: CreateCallgentDto, createdBy: string, + fromTenant: number, + toTenant: number, ) { - const from = await this._onHubAction(async () => { - const prisma = this.txHost.tx as PrismaClient; - const dup = await prisma.callgent.findUnique({ - where: { id: dupId }, - select: { - pk: true, - id: true, - name: true, - summary: true, - endpoints: { - select: { - id: true, - name: true, - type: true, - adaptorKey: true, - priority: true, - host: true, - initParams: true, - content: true, - securities: true, - }, + const origTenant = this.tenancyService.getTenantId(); + try { + this.tenancyService.setTenantId(fromTenant); + const from = await this.callgentsService.findOne(fromId, { + pk: true, + id: true, + name: true, + summary: true, + endpoints: { + select: { + id: true, + name: true, + type: true, + adaptorKey: true, + priority: true, + host: true, + initParams: true, + content: true, + securities: true, }, }, }); - if (!dup) - throw new NotFoundException('Callgent in hub not found: ' + dupId); - return dup; - }); + if (!from) throw new NotFoundException(); + if (toTenant == this.hubTenantPK && from.forkedPk) + throw new BadRequestException( + 'Only original callgent can be committed to hub.', + ); - const eps = from.endpoints; - from.endpoints = undefined; - const callgent = await this.callgentsService.create( - { ...from, ...dto, duplicatePk: from.pk }, - createdBy, - ); - const callgentId = callgent.id; + const eps = from.endpoints; + from.endpoints = undefined; + this.tenancyService.setTenantId(toTenant); + const callgent = await this.callgentsService.create( + { ...from, ...dto, forkedPk: from.pk }, + createdBy, + ); + const callgentId = callgent.id; - const realms = await this.callgentRealmsService.findAll({ - where: { callgentId: from.id }, - orderBy: { pk: 'asc' }, - select: { - pk: true, - realmKey: true, - authType: true, - realm: true, - scheme: true, - secret: false, // don't duplicate secret - perUser: true, - }, - }); - const realmMap: { [pk: number]: CallgentRealm } = {}; - await Promise.all( - realms.map(async (r) => { - const realm = await this.callgentRealmsService.create({ - ...r, - callgentId, - }); - realmMap[r.pk] = realm; - }), - ); + this.tenancyService.setTenantId(fromTenant); + const realms = await this.callgentRealmsService.findAll({ + where: { callgentId: from.id }, + orderBy: { pk: 'asc' }, + select: { + pk: true, + realmKey: true, + authType: true, + realm: true, + scheme: true, + secret: false, // don't fork secret + perUser: true, + }, + }); + this.tenancyService.setTenantId(toTenant); + const realmMap: { [pk: number]: CallgentRealm } = {}; + await Promise.all( + realms.map(async (r) => { + const realm = await this.callgentRealmsService.create({ + ...r, + callgentId, + }); + realmMap[r.pk] = realm; + }), + ); - const endpointMap = {}; - await Promise.all( - eps.map(async (epOld) => { - const securities: any[] = dupSecurities(epOld.securities); + this.tenancyService.setTenantId(fromTenant); + const functionMap = {}; + await Promise.all( + eps.map(async (epOld) => { + const functions = await this.callgentFunctionsService.findAll({ + where: { endpointId: epOld.id }, + orderBy: { pk: 'asc' }, + select: { + name: true, + path: true, + method: true, + summary: true, + description: true, + securities: true, + params: true, + responses: true, + rawJson: true, + }, + }); + functionMap[epOld.id] = functions; + }), + ); - const ep = await this.endpointsService.create({ - ...epOld, - callgentId, - securities, - createdBy, - }); - endpointMap[epOld.id] = ep; + this.tenancyService.setTenantId(toTenant); + await Promise.all( + eps.map(async (epOld) => { + const securities: any[] = dupSecurities(epOld.securities); - const functions = await this.callgentFunctionsService.findAll({ - where: { endpointId: epOld.id }, - orderBy: { pk: 'asc' }, - select: { - name: true, - path: true, - method: true, - summary: true, - description: true, - securities: true, - params: true, - responses: true, - rawJson: true, - }, - }); - functions.map((fun) => { - const securities: any[] = dupSecurities(fun.securities); - this.callgentFunctionsService.create({ - ...fun, - securities, + const ep = await this.endpointsService.create({ + ...epOld, callgentId, - endpointId: ep.id, + securities, createdBy, }); - }); - }), - ); - return callgent; - function dupSecurities(securities: any[]): RealmSecurityVO[] { - return securities?.map((security) => { - const ret: RealmSecurityVO = {}; - Object.values(security).forEach((item: any) => { - const realm = realmMap[item.realmPk]; - ret['' + realm.pk] = { ...item, realmPk: realm.pk }; + return Promise.all( + functionMap[epOld.id].map((fun) => { + const securities: any[] = dupSecurities(fun.securities); + return this.callgentFunctionsService.create({ + ...fun, + securities, + callgentId, + endpointId: ep.id, + createdBy, + }); + }), + ); + }), + ); + return callgent; + + function dupSecurities(securities: any[]): RealmSecurityVO[] { + return securities?.map((security) => { + const ret: RealmSecurityVO = {}; + Object.values(security).forEach((item: any) => { + const realm = realmMap[item.realmPk]; + ret['' + realm.pk] = { ...item, realmPk: realm.pk }; + }); + return ret; }); - return ret; - }); + } + } finally { + this.tenancyService.setTenantId(origTenant); } } - - /** - * Callgent, Endpoint, CallgentFunction, CallgentRealm. - */ - @Transactional() - async duplicateToHub( - dupId: string, - dto: CreateCallgentDto, - createdBy: string, - ) {} } diff --git a/src/callgent-realms/dto/realm-scheme.vo.ts b/src/callgent-realms/dto/realm-scheme.vo.ts index c120462..b172a03 100644 --- a/src/callgent-realms/dto/realm-scheme.vo.ts +++ b/src/callgent-realms/dto/realm-scheme.vo.ts @@ -5,6 +5,9 @@ import { export type AuthType = SecuritySchemeType | 'password'; // | ''; +/** + * @see SecuritySchemeObject + */ export class RealmSchemeVO { /** whether issuing tokens per user */ perUser?: boolean; diff --git a/src/callgents/callgents.controller.ts b/src/callgents/callgents.controller.ts index 7d1ed70..4392b02 100644 --- a/src/callgents/callgents.controller.ts +++ b/src/callgents/callgents.controller.ts @@ -67,7 +67,7 @@ export class CallgentsController { @ApiQuery({ name: 'perPage', required: false, type: Number }) @ApiOkResponse({ schema: { - allOf: [ + anyOf: [ { $ref: getSchemaPath(RestApiResponse) }, { properties: { diff --git a/src/callgents/callgents.service.ts b/src/callgents/callgents.service.ts index 6c0ccaf..0879555 100644 --- a/src/callgents/callgents.service.ts +++ b/src/callgents/callgents.service.ts @@ -24,14 +24,14 @@ export class CallgentsService { protected readonly defSelect: Prisma.CallgentSelect = { pk: false, tenantPk: false, - duplicatePk: false, + forkedPk: false, createdBy: false, deletedAt: false, }; @Transactional() async create( - dto: CreateCallgentDto & { duplicatePk?: number }, + dto: CreateCallgentDto & { forkedPk?: number }, createdBy: string, select?: Prisma.CallgentSelect, ) { @@ -44,6 +44,15 @@ export class CallgentsService { (select) => prisma.callgent.create({ select, data }), this.defSelect, ); + if (dto.mainTagId) { + const tag = { callgentId: data.id, tagId: dto.mainTagId }; + await prisma.callgentTag.upsert({ + where: { callgentId_tagId: tag }, + create: tag, + update: tag, + }); + } + await this.eventEmitter.emitAsync( CallgentCreatedEvent.eventName, new CallgentCreatedEvent({ ...data, ...ret }), diff --git a/src/endpoints/endpoints.controller.ts b/src/endpoints/endpoints.controller.ts index 1d03504..5fd4199 100644 --- a/src/endpoints/endpoints.controller.ts +++ b/src/endpoints/endpoints.controller.ts @@ -100,7 +100,7 @@ export class EndpointsController { @ApiOkResponse({ schema: { - allOf: [ + anyOf: [ { $ref: getSchemaPath(RestApiResponse) }, { properties: { diff --git a/src/endpoints/listeners/callgent-created.listener.ts b/src/endpoints/listeners/callgent-created.listener.ts index 4192072..7bc31f2 100644 --- a/src/endpoints/listeners/callgent-created.listener.ts +++ b/src/endpoints/listeners/callgent-created.listener.ts @@ -21,7 +21,7 @@ export class CallgentCreatedListener { this.logger.debug('Handling event: %j', event); const callgent = event.callgent; - if (callgent.duplicatePk) return; // duplicated callgent + if (callgent.forkedPk) return; // forked callgent // add default endpoints const results = await Promise.all([ diff --git a/src/users/users.controller.ts b/src/users/users.controller.ts index 73dca72..33fe9a0 100644 --- a/src/users/users.controller.ts +++ b/src/users/users.controller.ts @@ -81,7 +81,7 @@ export class UsersController { }) @ApiCreatedResponse({ schema: { - allOf: [ + anyOf: [ { $ref: getSchemaPath(RestApiResponse) }, { properties: { data: { type: 'boolean' } } }, ], From a83a1a806aeca0096395f6559528065bd5a15dd2 Mon Sep 17 00:00:00 2001 From: dev-callgent Date: Fri, 27 Sep 2024 16:50:05 +0800 Subject: [PATCH 077/183] feat: bff with callgent realms Signed-off-by: dev-callgent --- src/bff/callgent-tree/callgent-tree.controller.ts | 10 ++++++++++ src/bff/callgent-tree/callgent-tree.module.ts | 8 +++++++- src/callgent-realms/callgent-realms.service.ts | 2 +- 3 files changed, 18 insertions(+), 2 deletions(-) diff --git a/src/bff/callgent-tree/callgent-tree.controller.ts b/src/bff/callgent-tree/callgent-tree.controller.ts index be6942a..035901c 100644 --- a/src/bff/callgent-tree/callgent-tree.controller.ts +++ b/src/bff/callgent-tree/callgent-tree.controller.ts @@ -12,6 +12,7 @@ import { } from '@nestjs/common'; import { ApiSecurity, ApiTags } from '@nestjs/swagger'; import { CallgentFunctionsService } from '../../callgent-functions/callgent-functions.service'; +import { CallgentRealmsService } from '../../callgent-realms/callgent-realms.service'; import { CallgentsService } from '../../callgents/callgents.service'; import { CallgentDto } from '../../callgents/dto/callgent.dto'; import { CreateCallgentDto } from '../../callgents/dto/create-callgent.dto'; @@ -29,6 +30,8 @@ export class CallgentTreeController { private readonly endpointsService: EndpointsService, @Inject('CallgentFunctionsService') private readonly callgentFunctionsService: CallgentFunctionsService, + @Inject('CallgentRealmsService') + private readonly callgentRealmsService: CallgentRealmsService, ) {} private readonly logger = new Logger(CallgentTreeController.name); @@ -92,8 +95,15 @@ export class CallgentTreeController { }), ); + const realms = + (await this.callgentRealmsService.findAll({ + where: { callgentId: callgent.id }, + select: { pk: false, callgentId: false, secret: false }, + })) || []; + const data = { id: callgent.id, + realms, name: callgent.name, createdAt: callgent.createdAt, updatedAt: callgent.updatedAt, diff --git a/src/bff/callgent-tree/callgent-tree.module.ts b/src/bff/callgent-tree/callgent-tree.module.ts index 6bc598a..f9ef5e0 100644 --- a/src/bff/callgent-tree/callgent-tree.module.ts +++ b/src/bff/callgent-tree/callgent-tree.module.ts @@ -1,11 +1,17 @@ import { Module } from '@nestjs/common'; import { CallgentFunctionsModule } from '../../callgent-functions/callgent-functions.module'; +import { CallgentRealmsModule } from '../../callgent-realms/callgent-realms.module'; import { CallgentsModule } from '../../callgents/callgents.module'; import { EndpointsModule } from '../../endpoints/endpoints.module'; import { CallgentTreeController } from './callgent-tree.controller'; @Module({ - imports: [CallgentsModule, EndpointsModule, CallgentFunctionsModule], + imports: [ + CallgentsModule, + EndpointsModule, + CallgentFunctionsModule, + CallgentRealmsModule, + ], controllers: [CallgentTreeController], }) export class CallgentTreeModule {} diff --git a/src/callgent-realms/callgent-realms.service.ts b/src/callgent-realms/callgent-realms.service.ts index dd41449..3990c46 100644 --- a/src/callgent-realms/callgent-realms.service.ts +++ b/src/callgent-realms/callgent-realms.service.ts @@ -49,7 +49,7 @@ export class CallgentRealmsService { } /** - * try to map to existing realm + * try to map to existing realm. FIXME: update securities when realm changed */ @Transactional() async upsertRealm( From e09a28e1ff9832b84f48a1f87b27ddfcf603eae9 Mon Sep 17 00:00:00 2001 From: dev-callgent Date: Fri, 27 Sep 2024 22:14:34 +0800 Subject: [PATCH 078/183] feat: bff with callgent realms Signed-off-by: dev-callgent --- .../20240926035336_callgent_hub/migration.sql | 1 + prisma/schema.prisma | 3 +- .../callgent-tree/callgent-tree.controller.ts | 2 +- .../callgent-realms.controller.ts | 29 +++++++++++++++++-- .../callgent-realms.service.ts | 20 +++++++++++-- src/callgent-realms/dto/realm-scheme.vo.ts | 11 +++++++ .../processors/api-key-auth.processor.ts | 20 ++++++++----- .../processors/auth-processor.base.ts | 3 +- 8 files changed, 71 insertions(+), 18 deletions(-) diff --git a/prisma/migrations/20240926035336_callgent_hub/migration.sql b/prisma/migrations/20240926035336_callgent_hub/migration.sql index bd65dca..d18fe43 100644 --- a/prisma/migrations/20240926035336_callgent_hub/migration.sql +++ b/prisma/migrations/20240926035336_callgent_hub/migration.sql @@ -4,6 +4,7 @@ ADD COLUMN "mainTagId" INTEGER; -- AlterTable ALTER TABLE "CallgentRealm" ALTER COLUMN "realm" DROP NOT NULL; +ALTER TABLE "CallgentRealm" ALTER COLUMN "realm" TYPE varchar(16); -- CreateTable CREATE TABLE "Tag" ( diff --git a/prisma/schema.prisma b/prisma/schema.prisma index 3591732..ae20182 100644 --- a/prisma/schema.prisma +++ b/prisma/schema.prisma @@ -275,13 +275,12 @@ model CallgentRealm { /// @DtoPlainApiResponse realmKey String @db.VarChar(256) /// @description unique[callgentId, realmKey], to identify same realm in callgent. - /// @DtoCreateApiResponse /// @DtoUpdateApiResponse /// @DtoPlainApiResponse authType String @db.VarChar(16) /// @description auth type, 'apiKey' | 'http' | 'oauth2' | 'openIdConnect' | 'password' | ..etc. /// @description provider defined realm name, or '' for default realm /// @IsOptional() - realm String? @default("") @db.VarChar(16) + realm String? @default("") @db.VarChar(36) /// @DtoUpdateOptional /// @DtoCastType(RealmSchemeVO, ../dto/realm-scheme.vo) scheme Json @db.Json /// @description security scheme, with all public configs diff --git a/src/bff/callgent-tree/callgent-tree.controller.ts b/src/bff/callgent-tree/callgent-tree.controller.ts index 035901c..679414d 100644 --- a/src/bff/callgent-tree/callgent-tree.controller.ts +++ b/src/bff/callgent-tree/callgent-tree.controller.ts @@ -98,7 +98,7 @@ export class CallgentTreeController { const realms = (await this.callgentRealmsService.findAll({ where: { callgentId: callgent.id }, - select: { pk: false, callgentId: false, secret: false }, + select: { callgentId: false, secret: false }, })) || []; const data = { diff --git a/src/callgent-realms/callgent-realms.controller.ts b/src/callgent-realms/callgent-realms.controller.ts index a19be24..017b1b1 100644 --- a/src/callgent-realms/callgent-realms.controller.ts +++ b/src/callgent-realms/callgent-realms.controller.ts @@ -1,13 +1,17 @@ import { + BadRequestException, Body, Controller, Get, Inject, Param, + Post, Put, + Req, UseGuards, } from '@nestjs/common'; import { + ApiCreatedResponse, ApiExtraModels, ApiOkResponse, ApiSecurity, @@ -18,7 +22,9 @@ import { JwtGuard } from '../infra/auth/jwt/jwt.guard'; import { RestApiResponse } from '../restapi/response.interface'; import { CallgentRealmsService } from './callgent-realms.service'; import { CallgentRealmDto } from './dto/callgent-realm.dto'; +import { CreateCallgentRealmDto } from './dto/create-callgent-realm.dto'; import { UpdateCallgentRealmDto } from './dto/update-callgent-realm.dto'; +import { isAuthType } from './dto/realm-scheme.vo'; @ApiTags('CallgentRealms') @ApiSecurity('defaultBearerAuth') @@ -64,7 +70,7 @@ export class CallgentRealmsController { ) { // TODO realmKey may be in body const data = await this.callgentRealmsService - .findOne(callgentId, realmKey, { pk: false }) + .findOne(callgentId, realmKey) .then((r) => r && { ...r, secret: r.secret ? true : false }); return { data }; } @@ -103,7 +109,6 @@ export class CallgentRealmsController { async findAll(@Param('callgentId') callgentId: string) { const data = await this.callgentRealmsService .findAll({ - select: { pk: false }, where: { callgentId }, }) .then((r) => r?.map((d) => ({ ...d, secret: d.secret ? true : false }))); @@ -143,4 +148,24 @@ export class CallgentRealmsController { return { data }; } + + @ApiCreatedResponse({ + schema: { + allOf: [ + { $ref: getSchemaPath(RestApiResponse) }, + { properties: { data: { $ref: getSchemaPath(CallgentRealmDto) } } }, + ], + }, + }) + @Post() + async create(@Body() dto: CreateCallgentRealmDto) { + if (!isAuthType(dto.authType)) + throw new BadRequestException('Invalid authType'); + return { + data: await this.callgentRealmsService.create({ + ...dto, + scheme: dto.scheme as any, + }), + }; + } } diff --git a/src/callgent-realms/callgent-realms.service.ts b/src/callgent-realms/callgent-realms.service.ts index 3990c46..d363eb3 100644 --- a/src/callgent-realms/callgent-realms.service.ts +++ b/src/callgent-realms/callgent-realms.service.ts @@ -32,6 +32,7 @@ export class CallgentRealmsService { private readonly moduleRef: ModuleRef, ) {} protected readonly defSelect: Prisma.CallgentRealmSelect = { + pk: false, tenantPk: false, createdAt: false, updatedAt: false, @@ -41,11 +42,24 @@ export class CallgentRealmsService { //// auth config start //// @Transactional() - async create(realm: Prisma.CallgentRealmUncheckedCreateInput) { + async create( + realm: Omit & { + realmKey?: string; + }, + select?: Prisma.CallgentRealmSelect, + ) { const prisma = this.txHost.tx as PrismaClient; const processor = this._getAuthProcessor(realm.authType); realm = processor.constructRealm(realm.scheme as any, realm as any) as any; - return prisma.callgentRealm.create({ data: { ...realm, pk: undefined } }); + return selectHelper( + select, + (select) => + prisma.callgentRealm.create({ + data: { ...(realm as any), pk: undefined }, + select, + }), + this.defSelect, + ); } /** @@ -238,7 +252,7 @@ export class CallgentRealmsService { * @param noError if false, throw error if realm not enabled */ protected async _loadRealm(security: RealmSecurityItem, noError = false) { - const realm = await this._findOne(security.realmPk, {}); + const realm = await this._findOne(security.realmPk, { pk: null }); if (!realm?.enabled) { if (noError) return { realm }; throw new UnauthorizedException( diff --git a/src/callgent-realms/dto/realm-scheme.vo.ts b/src/callgent-realms/dto/realm-scheme.vo.ts index b172a03..5add9cc 100644 --- a/src/callgent-realms/dto/realm-scheme.vo.ts +++ b/src/callgent-realms/dto/realm-scheme.vo.ts @@ -4,7 +4,18 @@ import { } from '@nestjs/swagger/dist/interfaces/open-api-spec.interface'; export type AuthType = SecuritySchemeType | 'password'; // | ''; +const authTypes: AuthType[] = [ + 'apiKey', + 'http', + 'oauth2', + 'openIdConnect', + 'apiKey', + 'password', +]; +export function isAuthType(t: string): t is AuthType { + return authTypes.includes(t as AuthType); +} /** * @see SecuritySchemeObject */ diff --git a/src/callgent-realms/processors/api-key-auth.processor.ts b/src/callgent-realms/processors/api-key-auth.processor.ts index edbc370..653cce5 100644 --- a/src/callgent-realms/processors/api-key-auth.processor.ts +++ b/src/callgent-realms/processors/api-key-auth.processor.ts @@ -18,11 +18,15 @@ export class ApiKeyAuthProcessor extends AuthProcessor { endpoint?: EndpointDto, servers?: { url: string }[], ) { - let url: string; - if (endpoint && endpoint.type != 'CLIENT') { - url = endpoint.host; // whatever adaptor it is, host need to be a url - } else if (servers?.length > 0) { - url = servers[0].url; + let url: string = (scheme as any).provider; + if (url) { + if (!url.toLowerCase().startsWith('http')) url = 'http://' + url; + } else { + if (endpoint && endpoint.type != 'CLIENT') { + url = endpoint.host; // whatever adaptor it is, host need to be a url + } else if (servers?.length > 0) { + url = servers[0].url; + } } if (!url) throw new BadRequestException( @@ -40,9 +44,9 @@ export class ApiKeyAuthProcessor extends AuthProcessor { /** @returns ApiKey:in:name:provider:realm */ protected getRealmKey(scheme: RealmSchemeVO, realm?: string) { - return `${scheme.type}:${scheme.in || ''}:${scheme.name || ''}:${ - scheme.provider - }:${realm || ''}`; + return `apiKey:${scheme.in || ''}:${scheme.name || ''}:${scheme.provider}:${ + realm || '' + }`; } protected checkEnabled( diff --git a/src/callgent-realms/processors/auth-processor.base.ts b/src/callgent-realms/processors/auth-processor.base.ts index e914e69..9a94b5b 100644 --- a/src/callgent-realms/processors/auth-processor.base.ts +++ b/src/callgent-realms/processors/auth-processor.base.ts @@ -18,8 +18,7 @@ export abstract class AuthProcessor { servers?: ServerObject[], ) { // imply provider - if (!scheme.provider) - scheme.provider = this.implyProvider(scheme, endpoint, servers); + scheme.provider = this.implyProvider(scheme, endpoint, servers); realm.realmKey = this.getRealmKey(scheme as any, realm.realm); realm.perUser = this.isPerUser(scheme as any, realm); realm.enabled = this.checkEnabled(scheme as any, realm); From 8d8dc920b554bf364c53ebeb8ae85bb6b433c9f6 Mon Sep 17 00:00:00 2001 From: dev-callgent Date: Fri, 27 Sep 2024 22:18:25 +0800 Subject: [PATCH 079/183] feat: bff with callgent realms Signed-off-by: dev-callgent --- src/callgent-realms/processors/api-key-auth.processor.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/callgent-realms/processors/api-key-auth.processor.ts b/src/callgent-realms/processors/api-key-auth.processor.ts index 653cce5..a7d2da2 100644 --- a/src/callgent-realms/processors/api-key-auth.processor.ts +++ b/src/callgent-realms/processors/api-key-auth.processor.ts @@ -53,7 +53,8 @@ export class ApiKeyAuthProcessor extends AuthProcessor { scheme: RealmSchemeVO, realm: Partial>, ) { - if (!realm.secret || !scheme.provider) return false; + if (!realm.secret || !scheme.provider || !scheme.name || !scheme.in) + return false; return this.validateSecretFormat(realm); } From 71b74e10d77aa5883e43bc875da671fad28b47d3 Mon Sep 17 00:00:00 2001 From: dev-callgent Date: Fri, 27 Sep 2024 22:33:24 +0800 Subject: [PATCH 080/183] feat: bff with callgent realms Signed-off-by: dev-callgent --- src/callgent-realms/callgent-realms.controller.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/callgent-realms/callgent-realms.controller.ts b/src/callgent-realms/callgent-realms.controller.ts index 017b1b1..870b6ed 100644 --- a/src/callgent-realms/callgent-realms.controller.ts +++ b/src/callgent-realms/callgent-realms.controller.ts @@ -117,7 +117,7 @@ export class CallgentRealmsController { @ApiOkResponse({ schema: { - allOf: [ + anyOf: [ { $ref: getSchemaPath(RestApiResponse) }, { properties: { data: { $ref: getSchemaPath(CallgentRealmDto) } } }, { @@ -151,7 +151,7 @@ export class CallgentRealmsController { @ApiCreatedResponse({ schema: { - allOf: [ + anyOf: [ { $ref: getSchemaPath(RestApiResponse) }, { properties: { data: { $ref: getSchemaPath(CallgentRealmDto) } } }, ], From bdc0758c94e3e0ccc748abc5bd7934b44d07fd28 Mon Sep 17 00:00:00 2001 From: dev-callgent Date: Sat, 28 Sep 2024 21:26:57 +0800 Subject: [PATCH 081/183] feat: bff with callgent realms Signed-off-by: dev-callgent --- .../migrations/20240926102127_1/migration.sql | 40 ------------------ .../20240928132200_callgent_hub/migration.sql | 9 ++++ prisma/schema.prisma | 6 +-- .../callgent-realms.controller.ts | 41 +++++++++++------- .../callgent-realms.service.ts | 42 ++++++++++++++++++- src/infra/repo/prisma.middlewares.ts | 4 -- 6 files changed, 77 insertions(+), 65 deletions(-) delete mode 100644 prisma/migrations/20240926102127_1/migration.sql create mode 100644 prisma/migrations/20240928132200_callgent_hub/migration.sql diff --git a/prisma/migrations/20240926102127_1/migration.sql b/prisma/migrations/20240926102127_1/migration.sql deleted file mode 100644 index 16ad59c..0000000 --- a/prisma/migrations/20240926102127_1/migration.sql +++ /dev/null @@ -1,40 +0,0 @@ --- AlterTable -ALTER TABLE "Callgent" ADD COLUMN "mainTagId" INTEGER; - --- CreateTable -CREATE TABLE "Tag" ( - "id" SERIAL NOT NULL, - "name" VARCHAR(30) NOT NULL, - "avatar" VARCHAR(1023), - "description" VARCHAR(1024) NOT NULL, - - CONSTRAINT "Tag_pkey" PRIMARY KEY ("id") -); - --- CreateTable -CREATE TABLE "CallgentTag" ( - "pk" SERIAL NOT NULL, - "tagId" INTEGER NOT NULL, - "callgentId" VARCHAR(36) NOT NULL, - "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, - - CONSTRAINT "CallgentTag_pkey" PRIMARY KEY ("pk") -); - --- CreateIndex -CREATE UNIQUE INDEX "Tag_name_key" ON "Tag"("name"); - --- CreateIndex -CREATE INDEX "CallgentTag_tagId_idx" ON "CallgentTag"("tagId"); - --- CreateIndex -CREATE INDEX "CallgentTag_callgentId_idx" ON "CallgentTag"("callgentId"); - --- CreateIndex -CREATE UNIQUE INDEX "CallgentTag_callgentId_tagId_key" ON "CallgentTag"("callgentId", "tagId"); - --- CreateIndex -CREATE INDEX "Callgent_forkedPk_idx" ON "Callgent"("forkedPk"); - --- CreateIndex -CREATE INDEX "Callgent_mainTagId_idx" ON "Callgent"("mainTagId"); diff --git a/prisma/migrations/20240928132200_callgent_hub/migration.sql b/prisma/migrations/20240928132200_callgent_hub/migration.sql new file mode 100644 index 0000000..755faab --- /dev/null +++ b/prisma/migrations/20240928132200_callgent_hub/migration.sql @@ -0,0 +1,9 @@ +/* + Warnings: + + - You are about to drop the column `deletedAt` on the `CallgentRealm` table. All the data in the column will be lost. + +*/ +-- AlterTable +ALTER TABLE "CallgentRealm" DROP COLUMN "deletedAt", +ALTER COLUMN "realm" SET DATA TYPE VARCHAR(36); diff --git a/prisma/schema.prisma b/prisma/schema.prisma index ae20182..91c1a1e 100644 --- a/prisma/schema.prisma +++ b/prisma/schema.prisma @@ -297,10 +297,6 @@ model CallgentRealm { createdAt DateTime @default(now()) updatedAt DateTime @default(now()) @updatedAt - // DONOT FORGET TO ADD the model into `createSoftDeleteMiddleware` - /// @DtoReadOnly - /// @DtoEntityHidden - deletedAt DateTime? /// @description logical deletion. @@unique([callgentId, realmKey]) @@index(callgentId) @@ -437,7 +433,7 @@ model Endpoint { /// @DtoReadOnly /// @DtoPlainApiResponse /// @DtoCastType(RealmSecurityVO, ../../callgent-realms/dto/realm-security.vo) - securities Json[] @db.Json /// @description RealmSecurityVO[], where RealmSecurityVO{ [realmName]: RealmSecurityItem } + securities Json[] @db.Json /// @description RealmSecurityVO[], where RealmSecurityVO{ [realmPk]: RealmSecurityItem } /// @DtoUpdateApiResponse /// @DtoPlainApiResponse diff --git a/src/callgent-realms/callgent-realms.controller.ts b/src/callgent-realms/callgent-realms.controller.ts index 870b6ed..696d942 100644 --- a/src/callgent-realms/callgent-realms.controller.ts +++ b/src/callgent-realms/callgent-realms.controller.ts @@ -2,12 +2,12 @@ import { BadRequestException, Body, Controller, + Delete, Get, Inject, Param, Post, Put, - Req, UseGuards, } from '@nestjs/common'; import { @@ -23,8 +23,8 @@ import { RestApiResponse } from '../restapi/response.interface'; import { CallgentRealmsService } from './callgent-realms.service'; import { CallgentRealmDto } from './dto/callgent-realm.dto'; import { CreateCallgentRealmDto } from './dto/create-callgent-realm.dto'; -import { UpdateCallgentRealmDto } from './dto/update-callgent-realm.dto'; import { isAuthType } from './dto/realm-scheme.vo'; +import { UpdateCallgentRealmDto } from './dto/update-callgent-realm.dto'; @ApiTags('CallgentRealms') @ApiSecurity('defaultBearerAuth') @@ -44,25 +44,14 @@ export class CallgentRealmsController { { properties: { data: { - $ref: getSchemaPath(CallgentRealmDto), - }, - }, - }, + $ref: getSchemaPath(CallgentRealmDto) }}}, { properties: { data: { properties: { secret: { type: 'boolean', - description: 'secret is masked, true means set', - }, - }, - }, - }, - }, - ], - }, - }) + description: 'secret is masked, true means set'}}}}}]}}) @Get(':callgentId/:realmKey') async findOne( @Param('callgentId') callgentId: string, @@ -168,4 +157,26 @@ export class CallgentRealmsController { }), }; } + + @ApiOkResponse({ + schema: { + anyOf: [ + { $ref: getSchemaPath(RestApiResponse) }, + { + properties: { + data: { $ref: getSchemaPath(CallgentRealmDto) }, + }, + }, + ], + }, + }) + @Delete(':callgentId/:realmKey') + async remove( + @Param('callgentId') callgentId: string, + @Param('realmKey') realmKey: string, + ) { + return { + data: await this.callgentRealmsService.delete(callgentId, realmKey), + }; + } } diff --git a/src/callgent-realms/callgent-realms.service.ts b/src/callgent-realms/callgent-realms.service.ts index d363eb3..8047db4 100644 --- a/src/callgent-realms/callgent-realms.service.ts +++ b/src/callgent-realms/callgent-realms.service.ts @@ -36,7 +36,6 @@ export class CallgentRealmsService { tenantPk: false, createdAt: false, updatedAt: false, - deletedAt: false, }; //// auth config start //// @@ -373,4 +372,45 @@ export class CallgentRealmsService { this.defSelect, ); } + + @Transactional() + async delete(callgentId: string, realmKey: string) { + const prisma = this.txHost.tx as PrismaClient; + const realm = await prisma.callgentRealm.delete({ + where: { callgentId_realmKey: { callgentId, realmKey } }, + }); + if (!realm) return; + const pk = realm.pk + ''; + + // clear securities + await Promise.all([ + prisma.$executeRaw`UPDATE "Endpoint" + SET "securities" = ( + SELECT array_agg(sec::jsonb - ${pk}) + FILTER (WHERE (sec::jsonb - ${pk})::text != '{}') + FROM unnest("securities") AS sec + ) + WHERE "callgentId"=${callgentId} and EXISTS ( + SELECT 1 + FROM unnest("securities") AS elem + WHERE elem::jsonb ? ${pk} + )`, + prisma.$executeRaw`UPDATE "CallgentFunction" + SET "securities" = ( + SELECT array_agg(sec::jsonb - ${pk}) + FILTER (WHERE (sec::jsonb - ${pk})::text != '{}') + FROM unnest("securities") AS sec + ) + WHERE "callgentId"=${callgentId} and EXISTS ( + SELECT 1 + FROM unnest("securities") AS elem + WHERE elem::jsonb ? ${pk} + )`, + ]); + + delete realm.pk; + delete realm.tenantPk; + realm.secret = !!realm.secret; + return realm; + } } diff --git a/src/infra/repo/prisma.middlewares.ts b/src/infra/repo/prisma.middlewares.ts index 833e074..53b0fc9 100644 --- a/src/infra/repo/prisma.middlewares.ts +++ b/src/infra/repo/prisma.middlewares.ts @@ -38,10 +38,6 @@ export const mainPrismaServiceOptions = ( Endpoint: deleteHandle, Task: deleteHandle, TaskAction: deleteHandle, - CallgentRealm: { - ...deleteHandle, - allowCompoundUniqueIndexWhere: true, - }, }, }), ], From 0da7151948cadb93fbbb554b06f0a91b0c6a1515 Mon Sep 17 00:00:00 2001 From: dev-callgent Date: Sat, 28 Sep 2024 21:54:21 +0800 Subject: [PATCH 082/183] feat: bff with callgent realms Signed-off-by: dev-callgent --- src/callgent-hub/callgent-hub.service.ts | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/src/callgent-hub/callgent-hub.service.ts b/src/callgent-hub/callgent-hub.service.ts index 1d1bc66..73c5aca 100644 --- a/src/callgent-hub/callgent-hub.service.ts +++ b/src/callgent-hub/callgent-hub.service.ts @@ -144,10 +144,13 @@ export class CallgentHubService { const realmMap: { [pk: number]: CallgentRealm } = {}; await Promise.all( realms.map(async (r) => { - const realm = await this.callgentRealmsService.create({ - ...r, - callgentId, - }); + const realm = await this.callgentRealmsService.create( + { + ...r, + callgentId, + }, + { pk: null }, + ); realmMap[r.pk] = realm; }), ); From f08de817491e5e023b489996dd7f566795ab508a Mon Sep 17 00:00:00 2001 From: dev-callgent Date: Sat, 28 Sep 2024 21:58:26 +0800 Subject: [PATCH 083/183] docs: dev log Signed-off-by: dev-callgent --- DEVLOG.md | 118 ++++++++++++++++++++++++++++++------------------------ 1 file changed, 66 insertions(+), 52 deletions(-) diff --git a/DEVLOG.md b/DEVLOG.md index 872b1c8..b09884b 100644 --- a/DEVLOG.md +++ b/DEVLOG.md @@ -1,83 +1,97 @@ # Developer Guide + This is guide for developers to setup the development environment. Before you start to get prepared for the develop environment, you need to make sure your basic tools are installed correctly. * Nodejs (Notice: To build the project, the right version is needed, otherwise installation can not be corrected, see .node-version) -* pnpm +* pnpm * docker ## Development Setup -- copy `.env.dev` to `.env` -- install dependencies -```shell -pnpm i -``` +* copy `.env.dev` to `.env` -- install dababase postgres with vector plugin -```shell -docker pull ankane/pgvector -``` +* install dependencies -- start postgres db in docker -```shell -docker run --name callgent-postgres -p 5432:5432 -e POSTGRES_PASSWORD=postgres -e PG_VECTOR_EXTENSION=true -d ankane/pgvector -``` + ```shell + pnpm i + ``` -- init db -```shell -npx prisma generate # generate PrismaClient -npx prisma migrate dev # init db schema -npx prisma db seed # init db data -``` +* install dababase postgres with vector plugin -- init db test data -```shell -pnpm run prisma:seed-test # init db test data -``` + ```shell + docker pull ankane/pgvector + ``` -- start server -```shell -pnpm run start:dev -``` +* start postgres db in docker + + ```shell + docker run --name callgent-postgres -p 5432:5432 -e POSTGRES_PASSWORD=postgres -e PG_VECTOR_EXTENSION=true -d ankane/pgvector + ``` + +* init db + + ```shell + npx prisma generate # generate PrismaClient + npx prisma migrate dev # init db schema + npx prisma db seed # init db data + ``` + +* init db test data + + ```shell + npx prisma migrate reset # reset db to initial state + pnpm run prisma:seed-test # init db test data + ``` + +* start server + + ```shell + pnpm run start:dev + ``` If all the above steps are done, and nothing failed, you can access the API at `http://localhost:3000/api` -- run tests -```shell -pnpm run test:e2e -``` +* run tests + + ```shell + pnpm run test:e2e + ``` ## Development Logs ### init project -- init project -```shell -pnpm i -g @nestjs/cli -nest new callgent-api -cd callgent-api -``` + +* init project + + ```shell + pnpm i -g @nestjs/cli + nest new callgent-api + cd callgent-api + ``` ### add dependencies ### integrate prisma -- automatically setup the library, scripts and Docker files -```shell -nest add nestjs-prisma -``` -- integrate prisma plugins +* automatically setup the library, scripts and Docker files -- ReposModule + ```shell + nest add nestjs-prisma + ``` -- init db -```shell -npx prisma init -``` +* integrate prisma plugins +* ReposModule +* init db -- create prisma schema, then init db -```shell -npx prisma migrate dev --name init -``` + ```shell + npx prisma init + ``` + +* create prisma schema, then init db + + ```shell + npx prisma migrate dev --name init + ``` ### multi-tenancy From e0c7a61ba984907b6ec2a3370f83a5615c2f05a1 Mon Sep 17 00:00:00 2001 From: dev-callgent Date: Sun, 29 Sep 2024 12:17:10 +0800 Subject: [PATCH 084/183] feat: update securities Signed-off-by: dev-callgent --- .../callgent-functions.service.ts | 27 ++++++-- .../callgent-realms.controller.ts | 41 +++++++++++- src/callgent-realms/callgent-realms.module.ts | 2 +- .../callgent-realms.service.ts | 64 +++++++++++++++++-- src/callgent-realms/dto/realm-security.vo.ts | 22 +++++-- .../processors/auth-processor.base.ts | 13 +++- src/callgents/callgents.controller.ts | 2 +- src/endpoints/endpoints.controller.ts | 17 +++++ src/endpoints/endpoints.service.ts | 16 ++++- 9 files changed, 175 insertions(+), 29 deletions(-) diff --git a/src/callgent-functions/callgent-functions.service.ts b/src/callgent-functions/callgent-functions.service.ts index e2fb552..414383f 100644 --- a/src/callgent-functions/callgent-functions.service.ts +++ b/src/callgent-functions/callgent-functions.service.ts @@ -155,9 +155,10 @@ export class CallgentFunctionsService { const item = this.callgentRealmsService.constructSecurity( realm, endpoint, + scopes, ); - result[name] = { ...item, scopes }; + result['' + item.realmPk] = item; }); return result; }); @@ -274,13 +275,25 @@ export class CallgentFunctionsService { ); } - findOne(id: string) { + findOne(id: string, select?: Prisma.CallgentFunctionSelect) { const prisma = this.txHost.tx as PrismaClient; - return selectHelper(this.defSelect, (select) => - prisma.callgentFunction.findUnique({ - select, - where: { id }, - }), + return selectHelper( + select, + (select) => + prisma.callgentFunction.findUnique({ + select, + where: { id }, + }), + this.defSelect, ); } + + @Transactional() + async updateSecurities(id: string, securities: RealmSecurityVO[]) { + const prisma = this.txHost.tx as PrismaClient; + return prisma.callgentFunction.update({ + where: { id }, + data: { securities: securities as any }, + }); + } } diff --git a/src/callgent-realms/callgent-realms.controller.ts b/src/callgent-realms/callgent-realms.controller.ts index 696d942..bc6ff5e 100644 --- a/src/callgent-realms/callgent-realms.controller.ts +++ b/src/callgent-realms/callgent-realms.controller.ts @@ -11,9 +11,12 @@ import { UseGuards, } from '@nestjs/common'; import { + ApiBody, ApiCreatedResponse, ApiExtraModels, ApiOkResponse, + ApiOperation, + ApiParam, ApiSecurity, ApiTags, getSchemaPath, @@ -24,11 +27,12 @@ import { CallgentRealmsService } from './callgent-realms.service'; import { CallgentRealmDto } from './dto/callgent-realm.dto'; import { CreateCallgentRealmDto } from './dto/create-callgent-realm.dto'; import { isAuthType } from './dto/realm-scheme.vo'; +import { RealmSecurityItemForm } from './dto/realm-security.vo'; import { UpdateCallgentRealmDto } from './dto/update-callgent-realm.dto'; @ApiTags('CallgentRealms') @ApiSecurity('defaultBearerAuth') -@ApiExtraModels(RestApiResponse, CallgentRealmDto) +@ApiExtraModels(RestApiResponse, CallgentRealmDto, RealmSecurityItemForm) @UseGuards(JwtGuard) @Controller('callgent-realms') export class CallgentRealmsController { @@ -44,14 +48,25 @@ export class CallgentRealmsController { { properties: { data: { - $ref: getSchemaPath(CallgentRealmDto) }}}, + $ref: getSchemaPath(CallgentRealmDto), + }, + }, + }, { properties: { data: { properties: { secret: { type: 'boolean', - description: 'secret is masked, true means set'}}}}}]}}) + description: 'secret is masked, true means set', + }, + }, + }, + }, + }, + ], + }, + }) @Get(':callgentId/:realmKey') async findOne( @Param('callgentId') callgentId: string, @@ -179,4 +194,24 @@ export class CallgentRealmsController { data: await this.callgentRealmsService.delete(callgentId, realmKey), }; } + + @ApiOperation({ summary: 'Update securities on endpoint/callgent function' }) + /// securities + @ApiParam({ name: 'type', type: 'string', enum: ['endpoint', 'function'] }) + @ApiBody({ isArray: true, type: RealmSecurityItemForm }) + @Post('securities/:type/:id') + async updateSecurities( + @Param('realmKey') realmKey: string, + @Param('type') type: 'endpoint' | 'function', + @Param('id') id: string, + @Body() securities: RealmSecurityItemForm[], // TODO: RealmSecurityVO + ) { + return { + data: await this.callgentRealmsService.updateSecurities( + type, + id, + securities, + ), + }; + } } diff --git a/src/callgent-realms/callgent-realms.module.ts b/src/callgent-realms/callgent-realms.module.ts index 3b8179b..92f1846 100644 --- a/src/callgent-realms/callgent-realms.module.ts +++ b/src/callgent-realms/callgent-realms.module.ts @@ -1,9 +1,9 @@ import { Module } from '@nestjs/common'; import { EndpointsModule } from '../endpoints/endpoints.module'; import { UsersModule } from '../users/users.module'; +import { CallgentRealmsController } from './callgent-realms.controller'; import { CallgentRealmsService } from './callgent-realms.service'; import { ApiKeyAuthProcessor } from './processors/api-key-auth.processor'; -import { CallgentRealmsController } from './callgent-realms.controller'; @Module({ imports: [EndpointsModule, UsersModule], diff --git a/src/callgent-realms/callgent-realms.service.ts b/src/callgent-realms/callgent-realms.service.ts index 8047db4..1c71888 100644 --- a/src/callgent-realms/callgent-realms.service.ts +++ b/src/callgent-realms/callgent-realms.service.ts @@ -10,13 +10,18 @@ import { import { ModuleRef } from '@nestjs/core'; import { ServerObject } from '@nestjs/swagger/dist/interfaces/open-api-spec.interface'; import { Prisma, PrismaClient } from '@prisma/client'; +import { CallgentFunctionsService } from '../callgent-functions/callgent-functions.service'; import { EndpointDto } from '../endpoints/dto/endpoint.dto'; import { EndpointsService } from '../endpoints/endpoints.service'; import { ClientRequestEvent } from '../endpoints/events/client-request.event'; import { selectHelper } from '../infra/repo/select.helper'; import { UsersService } from '../users/users.service'; import { RealmSchemeVO } from './dto/realm-scheme.vo'; -import { RealmSecurityItem, RealmSecurityVO } from './dto/realm-security.vo'; +import { + RealmSecurityItem, + RealmSecurityItemForm, + RealmSecurityVO, +} from './dto/realm-security.vo'; import { UpdateCallgentRealmDto } from './dto/update-callgent-realm.dto'; import { CallgentRealm } from './entities/callgent-realm.entity'; import { AuthProcessor } from './processors/auth-processor.base'; @@ -30,7 +35,14 @@ export class CallgentRealmsService { private readonly endpointsService: EndpointsService, private readonly usersService: UsersService, private readonly moduleRef: ModuleRef, - ) {} + ) { + // a little hack: circular relation + this.callgentFunctionsService = this.moduleRef.get( + 'CallgentFunctionsService', + { strict: false }, + ); + } + private readonly callgentFunctionsService: CallgentFunctionsService; protected readonly defSelect: Prisma.CallgentRealmSelect = { pk: false, tenantPk: false, @@ -62,7 +74,7 @@ export class CallgentRealmsService { } /** - * try to map to existing realm. FIXME: update securities when realm changed + * try to map to existing realm. FIXME: update securities when realm changed, see this.delete */ @Transactional() async upsertRealm( @@ -105,9 +117,51 @@ export class CallgentRealmsService { } /** construct security guard on endpoint */ - constructSecurity(realm: CallgentRealm, endpoint: EndpointDto) { + constructSecurity( + realm: CallgentRealm, + endpoint: EndpointDto, + scopes?: string[], + ) { const processor = this._getAuthProcessor(realm.authType); - return processor.constructSecurity(endpoint, realm); + return processor.constructSecurity(endpoint, realm, scopes); + } + + // TODO: RealmSecurityVO + async updateSecurities( + type: 'endpoint' | 'function', + id: string, + securities: RealmSecurityItemForm[], + ) { + let endpoint, targetService: EndpointsService | CallgentFunctionsService; + if (type == 'endpoint') { + targetService = this.endpointsService; + endpoint = await this.endpointsService.findOne(id); + } else { + targetService = this.callgentFunctionsService; + const fun = await this.callgentFunctionsService.findOne(id, { + endpointId: true, + }); + endpoint = await this.endpointsService.findOne(fun.endpointId); + } + if (!endpoint) throw new NotFoundException('Not found ' + type); + + const secs = await Promise.all( + securities.map(async (security) => { + const realm = await this.findOne( + endpoint.callgentId, + security.realmKey, + { + pk: true, + }, + ); + if (!realm) throw new NotFoundException('Not found realm'); + + const sec = this.constructSecurity(realm, endpoint, security.scopes); + return { ['' + sec.realmPk]: sec }; + }), + ); + + return targetService.updateSecurities(id, secs).then((e) => !!e); } //// auth check start, auth config end //// diff --git a/src/callgent-realms/dto/realm-security.vo.ts b/src/callgent-realms/dto/realm-security.vo.ts index e5c2089..10a13ff 100644 --- a/src/callgent-realms/dto/realm-security.vo.ts +++ b/src/callgent-realms/dto/realm-security.vo.ts @@ -1,11 +1,10 @@ -import { ApiExtraModels, ApiProperty } from '@nestjs/swagger'; +import { + ApiExtraModels, + ApiProperty, + ApiResponseProperty, +} from '@nestjs/swagger'; export class RealmSecurityItem { - @ApiProperty({ - type: 'integer', - format: 'int32', - required: true, - }) realmPk: number; /** scopes for the security operation */ @@ -13,10 +12,19 @@ export class RealmSecurityItem { scopes?: string[]; /** whether to attach token to request, or validate token separately */ - @ApiProperty({ type: 'boolean', required: false }) + @ApiResponseProperty({ type: 'boolean' }) attach?: boolean; } +export class RealmSecurityItemForm { + @ApiProperty({ required: true, type: 'string' }) + realmKey: string; + + /** scopes for the security operation */ + @ApiProperty({ isArray: true, required: false, type: 'string' }) + scopes?: string[]; +} + /** * Reference properties to realm-scheme. * multiple realms with and-relation diff --git a/src/callgent-realms/processors/auth-processor.base.ts b/src/callgent-realms/processors/auth-processor.base.ts index 9a94b5b..17e8026 100644 --- a/src/callgent-realms/processors/auth-processor.base.ts +++ b/src/callgent-realms/processors/auth-processor.base.ts @@ -27,17 +27,24 @@ export abstract class AuthProcessor { } /** construct a security guard on endpoint */ - constructSecurity(endpoint: EndpointDto, realm: CallgentRealm) { + constructSecurity( + endpoint: EndpointDto, + realm: CallgentRealm, + scopes?: string[], + ): RealmSecurityItem { let attach: boolean; if (endpoint.type != 'CLIENT') { try { - const provider = this.implyProvider(realm.scheme, endpoint); + const provider = this.implyProvider( + { ...realm.scheme, provider: undefined } as any, + endpoint, + ); if (provider == realm.scheme.provider) attach = true; } catch (e) { // ignore } } - return { realmPk: realm.pk, attach }; + return { realmPk: realm.pk, attach, scopes }; } /** diff --git a/src/callgents/callgents.controller.ts b/src/callgents/callgents.controller.ts index 4392b02..8c9faaa 100644 --- a/src/callgents/callgents.controller.ts +++ b/src/callgents/callgents.controller.ts @@ -51,7 +51,7 @@ export class CallgentsController { @ApiOkResponse({ schema: { - allOf: [ + anyOf: [ { $ref: getSchemaPath(RestApiResponse) }, { properties: { data: { $ref: getSchemaPath(CallgentDto) } } }, ], diff --git a/src/endpoints/endpoints.controller.ts b/src/endpoints/endpoints.controller.ts index 5fd4199..f3d38ac 100644 --- a/src/endpoints/endpoints.controller.ts +++ b/src/endpoints/endpoints.controller.ts @@ -12,6 +12,7 @@ import { UseGuards, } from '@nestjs/common'; import { + ApiCreatedResponse, ApiExtraModels, ApiOkResponse, ApiSecurity, @@ -50,6 +51,14 @@ export class EndpointsController { // return adaptor.getConfig(); // } + @ApiCreatedResponse({ + schema: { + anyOf: [ + { $ref: getSchemaPath(RestApiResponse) }, + { properties: { data: { $ref: getSchemaPath(EndpointDto) } } }, + ], + }, + }) @Post(':adaptorKey/create') async createEndpoint( @Req() req, @@ -65,6 +74,14 @@ export class EndpointsController { }; } + @ApiOkResponse({ + schema: { + anyOf: [ + { $ref: getSchemaPath(RestApiResponse) }, + { properties: { data: { $ref: getSchemaPath(EndpointDto) } } }, + ], + }, + }) @Put(':id') async updateEndpoint( @Param('id') id: string, diff --git a/src/endpoints/endpoints.service.ts b/src/endpoints/endpoints.service.ts index 7840fb6..b7544a6 100644 --- a/src/endpoints/endpoints.service.ts +++ b/src/endpoints/endpoints.service.ts @@ -10,11 +10,11 @@ import { Injectable, InjectionToken, NotFoundException, - NotImplementedException, } from '@nestjs/common'; import { ModuleRef, ModulesContainer } from '@nestjs/core'; import { EndpointType, Prisma, PrismaClient } from '@prisma/client'; import { CallgentFunctionDto } from '../callgent-functions/dto/callgent-function.dto'; +import { RealmSecurityVO } from '../callgent-realms/dto/realm-security.vo'; import { Utils } from '../infra/libs/utils'; import { selectHelper } from '../infra/repo/select.helper'; import { PrismaTenancyService } from '../infra/repo/tenancy/prisma-tenancy.service'; @@ -196,7 +196,10 @@ export class EndpointsService { @Transactional() update(id: string, dto: UpdateEndpointDto) { - throw new NotImplementedException('Method not implemented.'); + const prisma = this.txHost.tx as PrismaClient; + return selectHelper(this.defSelect, (select) => + prisma.endpoint.update({ select, where: { id }, data: dto }), + ); } @Transactional() @@ -355,4 +358,13 @@ export class EndpointsService { return { data: reqEvent }; // do nothing } + + @Transactional() + async updateSecurities(id: string, securities: RealmSecurityVO[]) { + const prisma = this.txHost.tx as PrismaClient; + return prisma.endpoint.update({ + where: { id }, + data: { securities: securities as any }, + }); + } } From 65ece1b3b0c398963135a965ba08889ac60dc888 Mon Sep 17 00:00:00 2001 From: dev-callgent Date: Sun, 29 Sep 2024 12:44:33 +0800 Subject: [PATCH 085/183] feat: update securities Signed-off-by: dev-callgent --- src/callgent-realms/callgent-realms.service.ts | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/callgent-realms/callgent-realms.service.ts b/src/callgent-realms/callgent-realms.service.ts index 1c71888..aa97bd2 100644 --- a/src/callgent-realms/callgent-realms.service.ts +++ b/src/callgent-realms/callgent-realms.service.ts @@ -150,9 +150,7 @@ export class CallgentRealmsService { const realm = await this.findOne( endpoint.callgentId, security.realmKey, - { - pk: true, - }, + { pk: null }, ); if (!realm) throw new NotFoundException('Not found realm'); From 25e6bfbeefcb3f149dc6095ed6e8f3cf8b1d6bd3 Mon Sep 17 00:00:00 2001 From: dev-callgent Date: Sun, 29 Sep 2024 19:26:54 +0800 Subject: [PATCH 086/183] feat: callgent stats Signed-off-by: dev-callgent --- .../migration.sql | 31 +++++++++++++++++++ prisma/schema.prisma | 22 +++++++++++-- src/callgent-hub/callgent-hub.service.ts | 14 +++++++-- .../callgent-realms.controller.ts | 1 - src/callgents/callgents.service.ts | 8 ++++- 5 files changed, 70 insertions(+), 6 deletions(-) create mode 100644 prisma/migrations/20240929104035_callgent_stats/migration.sql diff --git a/prisma/migrations/20240929104035_callgent_stats/migration.sql b/prisma/migrations/20240929104035_callgent_stats/migration.sql new file mode 100644 index 0000000..0c1838f --- /dev/null +++ b/prisma/migrations/20240929104035_callgent_stats/migration.sql @@ -0,0 +1,31 @@ +-- AlterTable +ALTER TABLE "Callgent" ADD COLUMN "avatar" VARCHAR(1023), +ADD COLUMN "favorited" INTEGER NOT NULL DEFAULT 0, +ADD COLUMN "forked" INTEGER NOT NULL DEFAULT 0, +ADD COLUMN "liked" INTEGER NOT NULL DEFAULT 0, +ADD COLUMN "viewed" INTEGER NOT NULL DEFAULT 0, +ALTER COLUMN "tenantPk" SET DEFAULT (current_setting('tenancy.tenantPk')::int); + +-- AlterTable +ALTER TABLE "CallgentFunction" ALTER COLUMN "tenantPk" SET DEFAULT (current_setting('tenancy.tenantPk')::int); + +-- AlterTable +ALTER TABLE "CallgentRealm" ALTER COLUMN "tenantPk" SET DEFAULT (current_setting('tenancy.tenantPk')::int); + +-- AlterTable +ALTER TABLE "Endpoint" ALTER COLUMN "tenantPk" SET DEFAULT (current_setting('tenancy.tenantPk')::int); + +-- AlterTable +ALTER TABLE "EventListener" ALTER COLUMN "tenantPk" SET DEFAULT (current_setting('tenancy.tenantPk')::int); + +-- AlterTable +ALTER TABLE "Task" ALTER COLUMN "tenantPk" SET DEFAULT (current_setting('tenancy.tenantPk')::int); + +-- AlterTable +ALTER TABLE "TaskAction" ALTER COLUMN "tenantPk" SET DEFAULT (current_setting('tenancy.tenantPk')::int); + +-- AlterTable +ALTER TABLE "User" ALTER COLUMN "tenantPk" SET DEFAULT (current_setting('tenancy.tenantPk')::int); + +-- AlterTable +ALTER TABLE "UserIdentity" ALTER COLUMN "tenantPk" SET DEFAULT (current_setting('tenancy.tenantPk')::int); diff --git a/prisma/schema.prisma b/prisma/schema.prisma index 91c1a1e..796248d 100644 --- a/prisma/schema.prisma +++ b/prisma/schema.prisma @@ -166,8 +166,26 @@ model Callgent { tenantPk Int @default(dbgenerated("(current_setting('tenancy.tenantPk')::int)")) name String @db.VarChar(255) + avatar String? @db.VarChar(1023) summary String? @db.VarChar(4095) + /// @DtoCreateApiResponse + /// @DtoUpdateApiResponse + /// @DtoPlainApiResponse + liked Int @default(0) + /// @DtoCreateApiResponse + /// @DtoUpdateApiResponse + /// @DtoPlainApiResponse + viewed Int @default(0) + /// @DtoCreateApiResponse + /// @DtoUpdateApiResponse + /// @DtoPlainApiResponse + forked Int @default(0) + /// @DtoCreateApiResponse + /// @DtoUpdateApiResponse + /// @DtoPlainApiResponse + favorited Int @default(0) + /// @DtoReadOnly /// @DtoEntityHidden forkedPk Int? /// @description forked from @@ -295,8 +313,8 @@ model CallgentRealm { /// @DtoPlainApiResponse enabled Boolean @default(true) /// @description whether the realm is enabled - createdAt DateTime @default(now()) - updatedAt DateTime @default(now()) @updatedAt + createdAt DateTime @default(now()) + updatedAt DateTime @default(now()) @updatedAt @@unique([callgentId, realmKey]) @@index(callgentId) diff --git a/src/callgent-hub/callgent-hub.service.ts b/src/callgent-hub/callgent-hub.service.ts index 73c5aca..56816cc 100644 --- a/src/callgent-hub/callgent-hub.service.ts +++ b/src/callgent-hub/callgent-hub.service.ts @@ -6,7 +6,7 @@ import { Injectable, NotFoundException, } from '@nestjs/common'; -import { CallgentRealm, Prisma } from '@prisma/client'; +import { CallgentRealm, Prisma, PrismaClient } from '@prisma/client'; import { CallgentFunctionsService } from '../callgent-functions/callgent-functions.service'; import { CallgentRealmsService } from '../callgent-realms/callgent-realms.service'; import { RealmSecurityVO } from '../callgent-realms/dto/realm-security.vo'; @@ -112,10 +112,20 @@ export class CallgentHubService { }, }); if (!from) throw new NotFoundException(); - if (toTenant == this.hubTenantPK && from.forkedPk) + if (toTenant == this.hubTenantPK && from.forkedPk) { + // to hub throw new BadRequestException( 'Only original callgent can be committed to hub.', ); + } else { + // from hub + const prisma = this.txHost.tx as PrismaClient; + await prisma.callgent.update({ + where: { id: fromId }, + select: { id: true }, + data: { forked: { increment: 1 } }, + }); + } const eps = from.endpoints; from.endpoints = undefined; diff --git a/src/callgent-realms/callgent-realms.controller.ts b/src/callgent-realms/callgent-realms.controller.ts index bc6ff5e..346f925 100644 --- a/src/callgent-realms/callgent-realms.controller.ts +++ b/src/callgent-realms/callgent-realms.controller.ts @@ -201,7 +201,6 @@ export class CallgentRealmsController { @ApiBody({ isArray: true, type: RealmSecurityItemForm }) @Post('securities/:type/:id') async updateSecurities( - @Param('realmKey') realmKey: string, @Param('type') type: 'endpoint' | 'function', @Param('id') id: string, @Body() securities: RealmSecurityItemForm[], // TODO: RealmSecurityVO diff --git a/src/callgents/callgents.service.ts b/src/callgents/callgents.service.ts index 0879555..4ef27e0 100644 --- a/src/callgents/callgents.service.ts +++ b/src/callgents/callgents.service.ts @@ -140,8 +140,14 @@ export class CallgentsService { ); } - findOne(id: string, select?: Prisma.CallgentSelect) { + @Transactional() + async findOne(id: string, select?: Prisma.CallgentSelect) { const prisma = this.txHost.tx as PrismaClient; + await prisma.callgent.update({ + where: { id }, + select: { id: true }, + data: { viewed: { increment: 1 } }, + }); return selectHelper( select, (select) => From 23a252bd97d008d3bc0155356c6baab3a4f840c3 Mon Sep 17 00:00:00 2001 From: dev-callgent Date: Sun, 29 Sep 2024 19:35:07 +0800 Subject: [PATCH 087/183] feat: callgent stats Signed-off-by: dev-callgent --- .../migration.sql | 29 ++----------------- prisma/schema.prisma | 5 +++- 2 files changed, 7 insertions(+), 27 deletions(-) diff --git a/prisma/migrations/20240929104035_callgent_stats/migration.sql b/prisma/migrations/20240929104035_callgent_stats/migration.sql index 0c1838f..664c91e 100644 --- a/prisma/migrations/20240929104035_callgent_stats/migration.sql +++ b/prisma/migrations/20240929104035_callgent_stats/migration.sql @@ -1,31 +1,8 @@ -- AlterTable ALTER TABLE "Callgent" ADD COLUMN "avatar" VARCHAR(1023), -ADD COLUMN "favorited" INTEGER NOT NULL DEFAULT 0, +ADD COLUMN "favorite" INTEGER NOT NULL DEFAULT 0, ADD COLUMN "forked" INTEGER NOT NULL DEFAULT 0, ADD COLUMN "liked" INTEGER NOT NULL DEFAULT 0, ADD COLUMN "viewed" INTEGER NOT NULL DEFAULT 0, -ALTER COLUMN "tenantPk" SET DEFAULT (current_setting('tenancy.tenantPk')::int); - --- AlterTable -ALTER TABLE "CallgentFunction" ALTER COLUMN "tenantPk" SET DEFAULT (current_setting('tenancy.tenantPk')::int); - --- AlterTable -ALTER TABLE "CallgentRealm" ALTER COLUMN "tenantPk" SET DEFAULT (current_setting('tenancy.tenantPk')::int); - --- AlterTable -ALTER TABLE "Endpoint" ALTER COLUMN "tenantPk" SET DEFAULT (current_setting('tenancy.tenantPk')::int); - --- AlterTable -ALTER TABLE "EventListener" ALTER COLUMN "tenantPk" SET DEFAULT (current_setting('tenancy.tenantPk')::int); - --- AlterTable -ALTER TABLE "Task" ALTER COLUMN "tenantPk" SET DEFAULT (current_setting('tenancy.tenantPk')::int); - --- AlterTable -ALTER TABLE "TaskAction" ALTER COLUMN "tenantPk" SET DEFAULT (current_setting('tenancy.tenantPk')::int); - --- AlterTable -ALTER TABLE "User" ALTER COLUMN "tenantPk" SET DEFAULT (current_setting('tenancy.tenantPk')::int); - --- AlterTable -ALTER TABLE "UserIdentity" ALTER COLUMN "tenantPk" SET DEFAULT (current_setting('tenancy.tenantPk')::int); +ADD COLUMN "featured" BOOLEAN NOT NULL DEFAULT false, +ADD COLUMN "official" BOOLEAN NOT NULL DEFAULT false; diff --git a/prisma/schema.prisma b/prisma/schema.prisma index 796248d..4591cdf 100644 --- a/prisma/schema.prisma +++ b/prisma/schema.prisma @@ -184,7 +184,10 @@ model Callgent { /// @DtoCreateApiResponse /// @DtoUpdateApiResponse /// @DtoPlainApiResponse - favorited Int @default(0) + favorite Int @default(0) + + official Boolean @default(false) + featured Boolean @default(false) /// @DtoReadOnly /// @DtoEntityHidden From c2d6c26b3fd1dda9d1e572694fcb6f9ca5aea70a Mon Sep 17 00:00:00 2001 From: dev-callgent Date: Tue, 1 Oct 2024 10:18:33 +0800 Subject: [PATCH 088/183] ci: prisma log Signed-off-by: dev-callgent --- .env.dev | 3 +++ .env.test | 3 +++ src/infra/repo/prisma.middlewares.ts | 8 +++++++- src/infra/repo/repos.module.ts | 4 +++- 4 files changed, 16 insertions(+), 2 deletions(-) diff --git a/.env.dev b/.env.dev index d5c6e59..3114e5f 100644 --- a/.env.dev +++ b/.env.dev @@ -67,3 +67,6 @@ EMAIL_SPARKPOST_API_KEY=xxx EMAIL_SPARKPOST_RELAY_CLIENT_ID=spark-post-relayer EMAIL_SPARKPOST_RELAY_CLIENT_SECRET=xxx EMAIL_SPARKPOST_RELAY_EXPIRES_IN=86400 + +# slow sql threshold, default 10000 +SLOW_SQL_THRESHOLD=10000 diff --git a/.env.test b/.env.test index 52307ae..99a3af9 100644 --- a/.env.test +++ b/.env.test @@ -59,3 +59,6 @@ EMAIL_SPARKPOST_API_KEY=xxx EMAIL_SPARKPOST_RELAY_CLIENT_ID=spark-post-relayer EMAIL_SPARKPOST_RELAY_CLIENT_SECRET=xxx EMAIL_SPARKPOST_RELAY_EXPIRES_IN=86400 + +# slow sql threshold, default 10000 +SLOW_SQL_THRESHOLD=10000 diff --git a/src/infra/repo/prisma.middlewares.ts b/src/infra/repo/prisma.middlewares.ts index 53b0fc9..b8cebc2 100644 --- a/src/infra/repo/prisma.middlewares.ts +++ b/src/infra/repo/prisma.middlewares.ts @@ -12,18 +12,24 @@ export const mainPrismaServiceOptions = ( config: ConfigService, ): PrismaServiceOptions => { const logLevels = config.get('LOG_LEVELS_PRISMA'); + const slowSqlTh = parseInt(config.get('SLOW_SQL_THRESHOLD', '10000')); + const txTimeout = parseInt(config.get('PRISMA_TRANSACTION_TIMEOUT', '5000')); return { prismaOptions: { errorFormat: 'pretty', log: logLevels ? JSON.parse(logLevels) : [], transactionOptions: { - timeout: parseInt(config.get('PRISMA_TRANSACTION_TIMEOUT', '5000')), + timeout: txTimeout, }, }, middlewares: [ loggingMiddleware({ logger: new Logger('Prisma'), logLevel: config.get('LOG_LEVEL'), + logMessage: (query) => + `${query.model || ''}.${query.action} took ${ + query.executionTime > slowSqlTh ? '\x1b[31m' : '' + }${query.executionTime}ms\x1b[0m`, }), // TODO, upgrade to extension: https://github.com/olivierwilkinson/prisma-extension-soft-delete createSoftDeleteMiddleware({ diff --git a/src/infra/repo/repos.module.ts b/src/infra/repo/repos.module.ts index ecad43f..6ee1f03 100644 --- a/src/infra/repo/repos.module.ts +++ b/src/infra/repo/repos.module.ts @@ -67,7 +67,9 @@ export class ReposModule implements OnModuleInit { sql.startsWith('update') || sql.startsWith('delete') ) - this.logger.debug(`${e.query}; \x1b[34m${e.params}\x1b[0m`); + this.logger.debug( + `${e.query.replace(/\s+/g, ' ')}; \x1b[34m${e.params}\x1b[0m`, + ); }); } } From 412ee348674cbfb9a3d1b0c782290fdc717415cc Mon Sep 17 00:00:00 2001 From: dev-callgent Date: Mon, 7 Oct 2024 08:31:37 +0800 Subject: [PATCH 089/183] ci: prisma log Signed-off-by: dev-callgent --- .env.test | 4 +--- src/infra/repo/prisma.middlewares.ts | 6 +++--- 2 files changed, 4 insertions(+), 6 deletions(-) diff --git a/.env.test b/.env.test index 99a3af9..a5caa66 100644 --- a/.env.test +++ b/.env.test @@ -12,7 +12,7 @@ LOG_LEVEL=debug # async log buffer length LOG_BUFFER_LENGTH=4096 -LOG_LEVELS_PRISMA=["query","info","warn","error"] +LOG_LEVELS_PRISMA=[{"emit":"event", "level":"query"},"info","warn","error"] POSTGRES_USER=postgres @@ -42,8 +42,6 @@ GITHUB_OAUTH_CLIENT_SECRET = 76dc98b5554636b5c924cd4854ad3f62e4f0cc3b GOOGLE_OAUTH_CLIENT_ID = 183236050953-rg2khnknb0tif2a5urepho0k22call16.apps.googleusercontent.com GOOGLE_OAUTH_CLIENT_SECRET = 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 -TEST_CANNY_IO_API_KEY=567b9c2f-9708-3ccb-4189-e0a5f4e130ba - LLM_MODEL=mistralai/mistral-small LLM_CACHE_ENABLE=1 OPENROUTER_API_KEY=sk-or-v1-your-api-key diff --git a/src/infra/repo/prisma.middlewares.ts b/src/infra/repo/prisma.middlewares.ts index b8cebc2..fc32628 100644 --- a/src/infra/repo/prisma.middlewares.ts +++ b/src/infra/repo/prisma.middlewares.ts @@ -27,9 +27,9 @@ export const mainPrismaServiceOptions = ( logger: new Logger('Prisma'), logLevel: config.get('LOG_LEVEL'), logMessage: (query) => - `${query.model || ''}.${query.action} took ${ - query.executionTime > slowSqlTh ? '\x1b[31m' : '' - }${query.executionTime}ms\x1b[0m`, + `${query.model || ''}.${query.action} took \x1b[3${ + query.executionTime > slowSqlTh ? '1' : '2' + }m${query.executionTime}ms\x1b[0m`, }), // TODO, upgrade to extension: https://github.com/olivierwilkinson/prisma-extension-soft-delete createSoftDeleteMiddleware({ From 599f4b6cd0e728043e8b7541df01d6c1b92bb3a1 Mon Sep 17 00:00:00 2001 From: dev-callgent Date: Wed, 9 Oct 2024 09:00:26 +0800 Subject: [PATCH 090/183] refactor: rest cep api Signed-off-by: dev-callgent --- src/callgent-realms/callgent-realms.module.ts | 2 + .../processors/api-key-auth.processor.ts | 8 +- .../processors/http-auth.processor.ts | 145 ++++++++++++++++++ .../builtin/restapi/restapi.adaptor.ts | 11 +- .../builtin/restapi/restapi.controller.ts | 20 +-- .../adaptors/builtin/web/webpage.adaptor.ts | 2 +- .../adaptors/endpoint-adaptor.base.ts | 10 +- .../listeners/callgent-created.listener.ts | 2 +- test/e2e/endpoints.e2e-spec.ts | 2 +- 9 files changed, 183 insertions(+), 19 deletions(-) create mode 100644 src/callgent-realms/processors/http-auth.processor.ts diff --git a/src/callgent-realms/callgent-realms.module.ts b/src/callgent-realms/callgent-realms.module.ts index 92f1846..c90defc 100644 --- a/src/callgent-realms/callgent-realms.module.ts +++ b/src/callgent-realms/callgent-realms.module.ts @@ -4,12 +4,14 @@ import { UsersModule } from '../users/users.module'; import { CallgentRealmsController } from './callgent-realms.controller'; import { CallgentRealmsService } from './callgent-realms.service'; import { ApiKeyAuthProcessor } from './processors/api-key-auth.processor'; +import { HttpAuthProcessor } from './processors/http-auth.processor'; @Module({ imports: [EndpointsModule, UsersModule], providers: [ { provide: 'CallgentRealmsService', useClass: CallgentRealmsService }, { provide: 'apiKey-authProcessor', useClass: ApiKeyAuthProcessor }, + { provide: 'http-authProcessor', useClass: HttpAuthProcessor }, ], exports: ['CallgentRealmsService'], controllers: [CallgentRealmsController], diff --git a/src/callgent-realms/processors/api-key-auth.processor.ts b/src/callgent-realms/processors/api-key-auth.processor.ts index a7d2da2..b90a8ad 100644 --- a/src/callgent-realms/processors/api-key-auth.processor.ts +++ b/src/callgent-realms/processors/api-key-auth.processor.ts @@ -25,7 +25,13 @@ export class ApiKeyAuthProcessor extends AuthProcessor { if (endpoint && endpoint.type != 'CLIENT') { url = endpoint.host; // whatever adaptor it is, host need to be a url } else if (servers?.length > 0) { - url = servers[0].url; + const server = servers.find((server) => { + try { + new URL(server.url); + return true; + } catch (e) {} + }); + url = server?.url; } } if (!url) diff --git a/src/callgent-realms/processors/http-auth.processor.ts b/src/callgent-realms/processors/http-auth.processor.ts new file mode 100644 index 0000000..4696991 --- /dev/null +++ b/src/callgent-realms/processors/http-auth.processor.ts @@ -0,0 +1,145 @@ +import { + BadRequestException, + Injectable, + UnauthorizedException, +} from '@nestjs/common'; +import { SecuritySchemeObject } from '@nestjs/swagger/dist/interfaces/open-api-spec.interface'; +import { EndpointDto } from '../../endpoints/dto/endpoint.dto'; +import { ClientRequestEvent } from '../../endpoints/events/client-request.event'; +import { APIKeySecurityScheme, RealmSchemeVO } from '../dto/realm-scheme.vo'; +import { RealmSecurityItem } from '../dto/realm-security.vo'; +import { CallgentRealm } from '../entities/callgent-realm.entity'; +import { AuthProcessor } from './auth-processor.base'; + +@Injectable() +export class HttpAuthProcessor extends AuthProcessor { + protected implyProvider( + scheme: SecuritySchemeObject, + endpoint?: EndpointDto, + servers?: { url: string }[], + ) { + let url: string = (scheme as any).provider; + if (url) { + if (!url.toLowerCase().startsWith('http')) url = 'http://' + url; + } else { + if (endpoint && endpoint.type != 'CLIENT') { + url = endpoint.host; // whatever adaptor it is, host need to be a url + } else if (servers?.length > 0) { + url = servers[0].url; + } + } + if (!url) + throw new BadRequestException( + 'Cannot imply security provider, please specify it manually', + ); + + try { + return new URL(url).hostname; + } catch (e) { + throw new BadRequestException( + 'Invalid security provider, must be url: ' + url, + ); + } + } + + /** @returns http:scheme:provider:realm */ + protected getRealmKey(scheme: RealmSchemeVO, realm?: string) { + return `http:${scheme.scheme || ''}:${scheme.provider}:${realm || ''}`; + } + + protected checkEnabled( + scheme: RealmSchemeVO, + realm: Partial>, + ) { + if (!realm.secret || !scheme.provider || !scheme.name || !scheme.in) + return false; + return this.validateSecretFormat(realm); + } + + protected validateSecretFormat( + realm: Partial>, + ) { + return typeof realm.secret == 'string'; + } + + protected isPerUser() { + return false; + } + + /** api-key is the token, needn't exchange process */ + async authProcess( + realm: CallgentRealm, + item: RealmSecurityItem, + reqEvent: ClientRequestEvent, + ): Promise { + const result = await this.validateToken( + realm.secret as string, + reqEvent, + realm, + ); + if (result) return result; + + throw new UnauthorizedException( + 'Invalid api-key token, callgentId=' + realm.callgentId, + ); + } + + /** attach to validationUrl */ + async _validateTokenByUrl( + token: string, + realm: CallgentRealm, + ): Promise { + // get validationUrl with token + } + + async _attachToken( + token: string, + reqEvent: ClientRequestEvent, + realm: CallgentRealm, + ): Promise { + // {"type":"apiKey","in":"header","name":"x-callgent-authorization","provider":"api.callgent.com"} + const scheme: APIKeySecurityScheme = realm.scheme as any; + const req = reqEvent.context.req as any; + + const [name, value] = [scheme.name, realm.secret as string]; + let in0 = scheme.in; + switch (in0) { + case 'cookie': + if (!req.headers) req.headers = {}; + req.headers.cookie = `${req.headers.cookie || ''}${ + req.headers.cookie ? ';' : '' + }${name}=${encodeURIComponent(value)}`; + break; + case 'header': + in0 += 's'; + case 'query': + if (!req[in0]) req[in0] = {}; + req[in0][name] = realm.secret; + break; + } + return true; + } + + /** check response from validationUrl */ + postValidateToken( + reqEvent: ClientRequestEvent, + realm: CallgentRealm, + ): Promise { + throw new Error('Method not implemented.'); + } + + async providerCallback() { + throw new Error('Not applicable.'); + } + + async postAcquireSecret() { + throw new Error('Not applicable.'); + } + + async postExchangeToken() { + throw new Error('Not applicable.'); + } +} diff --git a/src/endpoints/adaptors/builtin/restapi/restapi.adaptor.ts b/src/endpoints/adaptors/builtin/restapi/restapi.adaptor.ts index 124793c..6deb0b6 100644 --- a/src/endpoints/adaptors/builtin/restapi/restapi.adaptor.ts +++ b/src/endpoints/adaptors/builtin/restapi/restapi.adaptor.ts @@ -121,7 +121,7 @@ export class RestAPIAdaptor extends EndpointAdaptor { async preprocess( reqEvent: ClientRequestEvent, // endpoint: EndpointDto, - ): Promise { + ) { const req = reqEvent?.context.req; if (!req) throw new BadRequestException( @@ -155,11 +155,14 @@ export class RestAPIAdaptor extends EndpointAdaptor { req2Json(request) { const { method, headers: rawHeaders, query, body, raw } = request; - if (request.url.indexOf('/invoke-api/') < 0) + if (request.url.indexOf('/rest/invoke/') < 0) throw new Error( - 'Unsupported URL, should be /callgents/:ids/:endpoint/invoke-api/*', + 'Unsupported URL, should be /rest/invoke/:callgentId/:endpoint/*', ); - const url = request.url.substr(request.url.indexOf('/invoke-api/') + 11); + let idx = request.url.indexOf('/rest/invoke/'); + idx = request.url.indexOf('/', idx + 13); + idx = request.url.indexOf('/', idx + 1); + const url = request.url.substr(idx); // FIXME https://www.npmjs.com/package/@fastify/multipart // request.file() diff --git a/src/endpoints/adaptors/builtin/restapi/restapi.controller.ts b/src/endpoints/adaptors/builtin/restapi/restapi.controller.ts index b7bb3f0..9fecc98 100644 --- a/src/endpoints/adaptors/builtin/restapi/restapi.controller.ts +++ b/src/endpoints/adaptors/builtin/restapi/restapi.controller.ts @@ -28,7 +28,7 @@ import { ClientRequestEvent } from '../../../events/client-request.event'; /** global rest-api endpoint entry */ @ApiTags('Client Endpoint: Rest-API') @UseGuards(new JwtGuard(true)) -@Controller('callgents') +@Controller('rest') export class RestApiController { constructor( protected readonly callgentsService: CallgentsService, @@ -41,20 +41,21 @@ export class RestApiController { description: 'rest-api client endpoint entry of multiple callgents', }) @ApiParam({ - name: 'id', + name: 'callgentId', required: true, description: 'Callgent id', }) @ApiParam({ name: 'endpointId', required: false, - description: 'endpoint id, optional: "/callgents/the-id`//`invoke/"', + description: + 'Client endpoint id, mey empty: "/rest/invoke/:callgent-id`//`.."', }) @ApiParam({ name: 'NOTE: swagger does not support wildcard param. Just document here', required: false, description: - '../invoke-api/`resource-path-here`. the wildcard path, optional: "../invoke-api/"', + 'rest/invoke/:callgentId/:endpointId/`resource-path-here`. the wildcard path, may be empty', }) @ApiHeader({ name: 'x-callgent-taskId', required: false }) @ApiHeader({ @@ -64,19 +65,20 @@ export class RestApiController { }) @ApiHeader({ name: 'x-callgent-callback', required: false }) @ApiHeader({ name: 'x-callgent-timeout', required: false }) - @All(':id/:endpointId/invoke-api/*') + @All('invoke/:callgentId/:endpointId/*') + @ApiOperation({ summary: 'To invoke the specific functional endpoint.' }) @ApiUnauthorizedResponse() - async execute( + async invoke( @Req() req, @Res() res, - @Param('id') callgentId: string, + @Param('callgentId') callgentId: string, @Param('endpointId') endpointId?: string, @Headers('x-callgent-taskId') taskId?: string, @Headers('x-callgent-progressive') progressive?: string, @Headers('x-callgent-callback') callback?: string, @Headers('x-callgent-timeout') timeout?: string, ) { - const basePath = `${callgentId}/${endpointId}/invoke-api/`; + const basePath = `invoke/${callgentId}/${endpointId}/`; let funName = req.url.substr(req.url.indexOf(basePath) + basePath.length); if (funName) funName = Utils.formalApiName(req.method, '/' + funName); @@ -120,7 +122,7 @@ export class RestApiController { description: 'Inquiry the result of an invocation request. TODO: Socket Mode', }) - @Get('/invoke/result/:requestId') + @Get('/result/:requestId') async invokeResult(@Param('requestId') reqId: string) { // FIXME return null; diff --git a/src/endpoints/adaptors/builtin/web/webpage.adaptor.ts b/src/endpoints/adaptors/builtin/web/webpage.adaptor.ts index 1d8986e..684bdcd 100644 --- a/src/endpoints/adaptors/builtin/web/webpage.adaptor.ts +++ b/src/endpoints/adaptors/builtin/web/webpage.adaptor.ts @@ -7,7 +7,7 @@ import { ClientRequestEvent } from '../../../events/client-request.event'; import { EndpointAdaptor, EndpointConfig } from '../../endpoint-adaptor.base'; import { EndpointAdaptorName } from '../../endpoint-adaptor.decorator'; -@EndpointAdaptorName('webpage', 'both') +@EndpointAdaptorName('webpage', 'client') export class WebpageAdaptor extends EndpointAdaptor { constructor(@Inject('AgentsService') readonly agentsService: AgentsService) { super(agentsService); diff --git a/src/endpoints/adaptors/endpoint-adaptor.base.ts b/src/endpoints/adaptors/endpoint-adaptor.base.ts index 55c54d3..ca48f65 100644 --- a/src/endpoints/adaptors/endpoint-adaptor.base.ts +++ b/src/endpoints/adaptors/endpoint-adaptor.base.ts @@ -20,10 +20,16 @@ export abstract class EndpointAdaptor { } /** preprocess request, replace raw request */ - abstract preprocess(reqEvent: ClientRequestEvent, endpoint: EndpointDto); + abstract preprocess( + reqEvent: ClientRequestEvent, + endpoint: EndpointDto, + ): Promise; /** postprocess response */ - abstract postprocess(reqEvent: ClientRequestEvent, fun: CallgentFunctionDto); + abstract postprocess( + reqEvent: ClientRequestEvent, + fun: CallgentFunctionDto, + ): Promise; /** Endpoint config. */ abstract getConfig(): EndpointConfig; diff --git a/src/endpoints/listeners/callgent-created.listener.ts b/src/endpoints/listeners/callgent-created.listener.ts index 7bc31f2..703dd72 100644 --- a/src/endpoints/listeners/callgent-created.listener.ts +++ b/src/endpoints/listeners/callgent-created.listener.ts @@ -31,7 +31,7 @@ export class CallgentCreatedListener { callgentId: callgent.id, type: 'CLIENT', adaptorKey: 'restAPI', - host: `/api/callgents/${callgent.id}/{id}/invoke-api/`, + host: `/api/rest/invoke/${callgent.id}/{id}/`, createdBy: callgent.createdBy, }) .then((endpoint) => { diff --git a/test/e2e/endpoints.e2e-spec.ts b/test/e2e/endpoints.e2e-spec.ts index af992f9..6b3778f 100644 --- a/test/e2e/endpoints.e2e-spec.ts +++ b/test/e2e/endpoints.e2e-spec.ts @@ -98,7 +98,7 @@ export const addEndpointAuth = (endpointAuthDto: CreateEndpointAuthDto) => { export const invokeCallgentByApi = (callgentId, body?: any) => { return pactum .spec() - .post(`/api/callgents/${callgentId}//invoke-api/boards/list`) + .post(`/api/rest/invoke/${callgentId}//boards/list`) .withHeaders('x-callgent-authorization', TestConstant.authToken) .withBody(body) .expectStatus(200); From 5413fa3391060f864805260da11bee329d62b078 Mon Sep 17 00:00:00 2001 From: dev-callgent Date: Wed, 9 Oct 2024 09:15:34 +0800 Subject: [PATCH 091/183] refactor: rest cep api Signed-off-by: dev-callgent --- src/endpoints/adaptors/builtin/restapi/restapi.controller.ts | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/endpoints/adaptors/builtin/restapi/restapi.controller.ts b/src/endpoints/adaptors/builtin/restapi/restapi.controller.ts index 9fecc98..a0d6801 100644 --- a/src/endpoints/adaptors/builtin/restapi/restapi.controller.ts +++ b/src/endpoints/adaptors/builtin/restapi/restapi.controller.ts @@ -37,9 +37,6 @@ export class RestApiController { protected readonly eventListenersService: EventListenersService, ) {} - @ApiOperation({ - description: 'rest-api client endpoint entry of multiple callgents', - }) @ApiParam({ name: 'callgentId', required: true, From 95c913c8f689ed96a35e58a295108aabd58b013d Mon Sep 17 00:00:00 2001 From: dev-callgent Date: Wed, 9 Oct 2024 09:45:18 +0800 Subject: [PATCH 092/183] feat: unstructured callgent request Signed-off-by: dev-callgent --- .../builtin/restapi/restapi.controller.ts | 27 +++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/src/endpoints/adaptors/builtin/restapi/restapi.controller.ts b/src/endpoints/adaptors/builtin/restapi/restapi.controller.ts index a0d6801..12a915a 100644 --- a/src/endpoints/adaptors/builtin/restapi/restapi.controller.ts +++ b/src/endpoints/adaptors/builtin/restapi/restapi.controller.ts @@ -1,11 +1,13 @@ import { All, + Body, Controller, Get, Headers, Inject, NotFoundException, Param, + Post, Req, Res, UseGuards, @@ -14,10 +16,12 @@ import { ApiHeader, ApiOperation, ApiParam, + ApiProperty, ApiTags, ApiUnauthorizedResponse, } from '@nestjs/swagger'; import { EndpointType } from '@prisma/client'; +import { IsNotEmpty, IsString } from 'class-validator'; import { CallgentsService } from '../../../../callgents/callgents.service'; import { EventListenersService } from '../../../../event-listeners/event-listeners.service'; import { JwtGuard } from '../../../../infra/auth/jwt/jwt.guard'; @@ -25,6 +29,18 @@ import { Utils } from '../../../../infra/libs/utils'; import { EndpointsService } from '../../../endpoints.service'; import { ClientRequestEvent } from '../../../events/client-request.event'; +export class Requirement { + @ApiProperty({ + description: 'Requirement for callgent to fulfill.', + example: + 'I want to apply for the Senior Algorithm Engineer based in Singapore.', + required: true, + }) + @IsNotEmpty() + @IsString() + requirement: string; +} + /** global rest-api endpoint entry */ @ApiTags('Client Endpoint: Rest-API') @UseGuards(new JwtGuard(true)) @@ -37,6 +53,17 @@ export class RestApiController { protected readonly eventListenersService: EventListenersService, ) {} + @ApiOperation({ + summary: 'To request the callgent with requirement description', + description: + 'AI agent will generate code to invoke several functional endpoints to fulfill the requirement.', + }) + @Post('request') + @ApiUnauthorizedResponse() + async request(@Body() req: Requirement) { + // TODO + } + @ApiParam({ name: 'callgentId', required: true, From bad72d3d849eac2ad7a853312e5288dd2ff9ba33 Mon Sep 17 00:00:00 2001 From: dev-callgent Date: Wed, 9 Oct 2024 20:02:08 +0800 Subject: [PATCH 093/183] refactor: rename endpoint to entry Signed-off-by: dev-callgent --- .../migration.sql | 70 +++++++++ prisma/schema.prisma | 36 ++--- prisma/seed-test.ts | 4 +- prisma/seed.ts | 4 +- src/agents/agents.service.ts | 2 +- src/app.module.ts | 4 +- .../bff-callgent-functions.controller.ts | 8 +- .../callgent-tree/callgent-tree.controller.ts | 30 ++-- src/bff/callgent-tree/callgent-tree.module.ts | 4 +- .../callgent-functions.controller.ts | 22 +-- .../callgent-functions.module.ts | 4 +- .../callgent-functions.service.ts | 46 +++--- src/callgent-hub/callgent-hub.module.ts | 4 +- src/callgent-hub/callgent-hub.service.ts | 26 ++-- .../callgent-realms.controller.ts | 6 +- src/callgent-realms/callgent-realms.module.ts | 4 +- .../callgent-realms.service.ts | 85 ++++++----- .../processors/api-key-auth.processor.ts | 10 +- .../processors/auth-processor.base.ts | 18 +-- .../processors/http-auth.processor.ts | 10 +- src/callgents/callgents.service.ts | 32 ++--- src/endpoints/endpoints.controller.ts | 134 ------------------ .../adaptors/builtin/email/email.adaptor.ts | 28 ++-- .../builtin/restapi/restapi.adaptor.ts | 30 ++-- .../builtin/restapi/restapi.controller.ts | 32 ++--- .../adaptors/builtin/web/webpage.adaptor.ts | 28 ++-- .../adaptors/entry-adaptor.base.ts} | 67 ++++----- .../adaptors/entry-adaptor.decorator.ts} | 4 +- .../entries.controller.spec.ts} | 10 +- src/entries/entries.controller.ts | 131 +++++++++++++++++ .../entries.module.ts} | 18 +-- .../entries.service.spec.ts} | 10 +- .../entries.service.ts} | 116 +++++++-------- .../events/client-request.event.ts | 5 +- .../listeners/callgent-created.listener.ts | 32 ++--- src/infra/repo/prisma.middlewares.ts | 2 +- src/task-actions/task-actions.module.ts | 9 +- src/task-actions/task-actions.service.ts | 14 +- test/e2e/callgents.e2e-spec.ts | 2 +- ...points.e2e-spec.ts => entries.e2e-spec.ts} | 34 ++--- 40 files changed, 593 insertions(+), 542 deletions(-) create mode 100644 prisma/migrations/20241009102710_rename_ep_2_entry/migration.sql delete mode 100644 src/endpoints/endpoints.controller.ts rename src/{endpoints => entries}/adaptors/builtin/email/email.adaptor.ts (86%) rename src/{endpoints => entries}/adaptors/builtin/restapi/restapi.adaptor.ts (89%) rename src/{endpoints => entries}/adaptors/builtin/restapi/restapi.controller.ts (88%) rename src/{endpoints => entries}/adaptors/builtin/web/webpage.adaptor.ts (79%) rename src/{endpoints/adaptors/endpoint-adaptor.base.ts => entries/adaptors/entry-adaptor.base.ts} (82%) rename src/{endpoints/adaptors/endpoint-adaptor.decorator.ts => entries/adaptors/entry-adaptor.decorator.ts} (60%) rename src/{endpoints/endpoints.controller.spec.ts => entries/entries.controller.spec.ts} (50%) create mode 100644 src/entries/entries.controller.ts rename src/{endpoints/endpoints.module.ts => entries/entries.module.ts} (62%) rename src/{endpoints/endpoints.service.spec.ts => entries/entries.service.spec.ts} (53%) rename src/{endpoints/endpoints.service.ts => entries/entries.service.ts} (72%) rename src/{endpoints => entries}/events/client-request.event.ts (86%) rename src/{endpoints => entries}/listeners/callgent-created.listener.ts (70%) rename test/e2e/{endpoints.e2e-spec.ts => entries.e2e-spec.ts} (70%) diff --git a/prisma/migrations/20241009102710_rename_ep_2_entry/migration.sql b/prisma/migrations/20241009102710_rename_ep_2_entry/migration.sql new file mode 100644 index 0000000..4b2730c --- /dev/null +++ b/prisma/migrations/20241009102710_rename_ep_2_entry/migration.sql @@ -0,0 +1,70 @@ +/* + Warnings: + + - You are about to drop the column `endpointId` on the `CallgentFunction` table. All the data in the column will be lost. + - You are about to drop the column `cepId` on the `TaskAction` table. All the data in the column will be lost. + - You are about to drop the `Endpoint` table. If the table is not empty, all the data it contains will be lost. + +*/ +-- CreateEnum +CREATE TYPE "EntryType" AS ENUM ('CLIENT', 'SERVER', 'EVENT'); + +-- DropIndex +DROP INDEX "CallgentFunction_endpointId_idx"; + +-- AlterTable +ALTER TABLE "CallgentFunction" DROP COLUMN "endpointId", +ADD COLUMN "entryId" VARCHAR(36); + +-- AlterTable +ALTER TABLE "TaskAction" DROP COLUMN "cepId", +ADD COLUMN "ceId" VARCHAR(36); + +-- DropTable +DROP TABLE "Endpoint"; + +-- DropEnum +DROP TYPE "EndpointType"; + +-- CreateTable +CREATE TABLE "Entry" ( + "pk" SERIAL NOT NULL, + "id" VARCHAR(36) NOT NULL, + "tenantPk" INTEGER NOT NULL DEFAULT (current_setting('tenancy.tenantPk')::int), + "name" VARCHAR(2047) NOT NULL DEFAULT '', + "type" "EntryType" NOT NULL, + "adaptorKey" VARCHAR(127) NOT NULL, + "priority" INTEGER NOT NULL DEFAULT 0, + "host" VARCHAR(2047) NOT NULL, + "initParams" JSON, + "content" JSON, + "securities" JSON[], + "callgentId" VARCHAR(36) NOT NULL, + "createdBy" VARCHAR(36) NOT NULL, + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updatedAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "deletedAt" TIMESTAMP(3), + + CONSTRAINT "Entry_pkey" PRIMARY KEY ("pk") +); + +-- CreateIndex +CREATE UNIQUE INDEX "Entry_id_key" ON "Entry"("id"); + +-- CreateIndex +CREATE INDEX "Entry_tenantPk_idx" ON "Entry"("tenantPk"); + +-- CreateIndex +CREATE INDEX "Entry_callgentId_idx" ON "Entry"("callgentId"); + +-- CreateIndex +CREATE INDEX "CallgentFunction_entryId_idx" ON "CallgentFunction"("entryId"); + +-- Enable Row Level Security +ALTER TABLE "Entry" ENABLE ROW LEVEL SECURITY; +-- Force Row Level Security for table owners +ALTER TABLE "Entry" FORCE ROW LEVEL SECURITY; +-- Create row security policies +CREATE POLICY tenant_isolation_policy ON "Entry" USING ("tenantPk" = COALESCE(NULLIF(current_setting('tenancy.tenantPk', TRUE), ''), '0')::int); +-- Create policies to bypass RLS (optional) +CREATE POLICY bypass_rls_policy ON "Entry" USING (current_setting('tenancy.bypass_rls', TRUE)::text = 'on'); diff --git a/prisma/schema.prisma b/prisma/schema.prisma index 4591cdf..4691535 100644 --- a/prisma/schema.prisma +++ b/prisma/schema.prisma @@ -172,15 +172,15 @@ model Callgent { /// @DtoCreateApiResponse /// @DtoUpdateApiResponse /// @DtoPlainApiResponse - liked Int @default(0) + liked Int @default(0) /// @DtoCreateApiResponse /// @DtoUpdateApiResponse /// @DtoPlainApiResponse - viewed Int @default(0) + viewed Int @default(0) /// @DtoCreateApiResponse /// @DtoUpdateApiResponse /// @DtoPlainApiResponse - forked Int @default(0) + forked Int @default(0) /// @DtoCreateApiResponse /// @DtoUpdateApiResponse /// @DtoPlainApiResponse @@ -205,7 +205,7 @@ model Callgent { /// @DtoEntityHidden deletedAt DateTime? /// @description logical deletion. - endpoints Endpoint[] + entries Entry[] @@unique([tenantPk, name]) @@index([tenantPk]) @@ -257,9 +257,9 @@ model CallgentFunction { // @DtoReadOnly /// @CustomValidator(EntityIdExists, 'callgent', 'id', ../../infra/repo/validators/entity-exists.validator) callgentId String @db.VarChar(36) - /// @description actual server endpoint, when action type is `ENDPOINT` - /// @CustomValidator(EntityIdExists, 'endpoint', 'id', ../../infra/repo/validators/entity-exists.validator) - endpointId String? @db.VarChar(36) + /// @description An endpoint is bound to a server entry + /// @CustomValidator(EntityIdExists, 'entry', 'id', ../../infra/repo/validators/entity-exists.validator) + entryId String? @db.VarChar(36) /// @DtoReadOnly /// @DtoEntityHidden @@ -274,7 +274,7 @@ model CallgentFunction { @@unique([callgentId, name]) @@index([tenantPk]) @@index([callgentId]) - @@index([endpointId]) + @@index([entryId]) } /// @description security realms for callgent @@ -370,7 +370,7 @@ model TaskAction { // client side information /// @description action owner callgent id, responsible for progressive response - cepId String? @db.VarChar(36) /// @description client endpoint id + ceId String? @db.VarChar(36) /// @description client entry id funName String? @db.VarChar(255) /// @description optional callgent function name cAdaptor String @db.VarChar(36) /// @description client adaptor key callback Json? @db.Json /// @description callback url template or callgent function @@ -419,14 +419,14 @@ model AuthToken { updatedAt DateTime @default(now()) @updatedAt } -enum EndpointType { +enum EntryType { CLIENT SERVER EVENT } -/// @description a callgent may have multiple endpoints, including cep & sep -model Endpoint { +/// @description a callgent may have multiple entries, including client/server/event entries +model Entry { /// @DtoEntityHidden pk Int @id @default(autoincrement()) /// @DtoCreateApiResponse @@ -438,17 +438,17 @@ model Endpoint { // add to migration.sql tenantPk Int @default(dbgenerated("(current_setting('tenancy.tenantPk')::int)")) - name String @default("") @db.VarChar(2047) + name String @default("") @db.VarChar(2047) /// @DtoUpdateApiResponse /// @DtoPlainApiResponse - type EndpointType /// @description endpoint type: CLIENT, SERVER OR EVENT + type EntryType /// @description entry type: CLIENT, SERVER OR EVENT /// @DtoCreateApiResponse /// @DtoUpdateApiResponse /// @DtoPlainApiResponse - adaptorKey String @db.VarChar(127) /// @description endpoint adaptor key - priority Int @default(0) /// @description priority in the callgent + adaptorKey String @db.VarChar(127) /// @description entry adaptor key + priority Int @default(0) /// @description priority in the callgent - host String @db.VarChar(2047) /// @description host address, e.g. '/api/callgents/rbhes0-w4rff/{id}/invoke/', where `{id}` will be replaced with current endpoint id + host String @db.VarChar(2047) /// @description host address, e.g. '/api/callgents/rbhes0-w4rff/{id}/invoke/', where `{id}` will be replaced with current entry id initParams Json? @db.Json /// @description initializing parameters content Json? @db.Json /// @description generated content/code by init method /// @DtoReadOnly @@ -460,7 +460,7 @@ model Endpoint { /// @DtoPlainApiResponse /// @CustomValidator(EntityIdExists, 'callgent', 'id', ../../infra/repo/validators/entity-exists.validator) /// @DtoRelationIncludeId - callgentId String @db.VarChar(36) /// @description callgent owning the endpoint + callgentId String @db.VarChar(36) /// @description callgent owning the entry callgent Callgent @relation(fields: [callgentId], references: [id]) /// @DtoReadOnly diff --git a/prisma/seed-test.ts b/prisma/seed-test.ts index 2494df7..3a36b43 100644 --- a/prisma/seed-test.ts +++ b/prisma/seed-test.ts @@ -78,7 +78,7 @@ function initTestData( createdBy: userId, }; - const cepDto: Prisma.EndpointUncheckedCreateInput = { + const cepDto: Prisma.EntryUncheckedCreateInput = { id: 'TEST_CEP_ID', callgentId: 'TEST_CALLGENT_ID', type: 'CLIENT', @@ -135,7 +135,7 @@ function initTestData( create: callgentDto, }) .then((callgent) => console.log({ callgent })), - prisma.endpoint + prisma.entry .upsert({ where: { id: cepDto.id }, update: cepDto, diff --git a/prisma/seed.ts b/prisma/seed.ts index 5c3b3b1..823f3c9 100644 --- a/prisma/seed.ts +++ b/prisma/seed.ts @@ -52,7 +52,7 @@ function initEventListeners( eventType: 'CLIENT_REQUEST', dataType: '*', serviceType: 'SERVICE', - serviceName: 'EndpointsService', + serviceName: 'EntriesService', funName: 'preprocessClientRequest', description: 'Find the CEP, then preprocess the request, replace raw request.', @@ -136,7 +136,7 @@ function initEventListeners( eventType: 'CLIENT_REQUEST', dataType: '*', serviceType: 'SERVICE', - serviceName: 'EndpointsService', + serviceName: 'EntriesService', funName: 'invokeSEP', description: 'Do actual invocation through the SEP adaptor', createdBy: 'GLOBAL', diff --git a/src/agents/agents.service.ts b/src/agents/agents.service.ts index 8175ef7..c5356cb 100644 --- a/src/agents/agents.service.ts +++ b/src/agents/agents.service.ts @@ -1,6 +1,6 @@ import { BadRequestException, HttpException, Injectable } from '@nestjs/common'; import { CallgentFunctionDto } from '../callgent-functions/dto/callgent-function.dto'; -import { ClientRequestEvent } from '../endpoints/events/client-request.event'; +import { ClientRequestEvent } from '../entries/events/client-request.event'; import { EventListenersService } from '../event-listeners/event-listeners.service'; import { ProgressiveRequestEvent } from './events/progressive-request.event'; import { LLMService } from './llm.service'; diff --git a/src/app.module.ts b/src/app.module.ts index a321fa2..931540e 100644 --- a/src/app.module.ts +++ b/src/app.module.ts @@ -12,7 +12,7 @@ import { CallgentHubModule } from './callgent-hub/callgent-hub.module'; import { CallgentRealmsModule } from './callgent-realms/callgent-realms.module'; import { CallgentsModule } from './callgents/callgents.module'; import { EmailsModule } from './emails/emails.module'; -import { EndpointsModule } from './endpoints/endpoints.module'; +import { EntriesModule } from './entries/entries.module'; import { EventListenersModule } from './event-listeners/event-listeners.module'; import { EventStoresModule } from './event-stores/event-stores.module'; import { AuthModule } from './infra/auth/auth.module'; @@ -39,7 +39,7 @@ import { UsersModule } from './users/users.module'; CallgentsModule, TasksModule, AuthTokensModule, - EndpointsModule, + EntriesModule, CallgentFunctionsModule, AgentsModule, TaskActionsModule, diff --git a/src/bff/callgent-functions/bff-callgent-functions.controller.ts b/src/bff/callgent-functions/bff-callgent-functions.controller.ts index 7e0c3ab..391d2c6 100644 --- a/src/bff/callgent-functions/bff-callgent-functions.controller.ts +++ b/src/bff/callgent-functions/bff-callgent-functions.controller.ts @@ -2,7 +2,7 @@ import { Body, Controller, Inject, Post, Req, UseGuards } from '@nestjs/common'; import { ApiOperation, ApiSecurity, ApiTags } from '@nestjs/swagger'; import { CallgentApiText } from '../../callgent-functions/callgent-functions.controller'; import { CallgentFunctionsService } from '../../callgent-functions/callgent-functions.service'; -import { EndpointDto } from '../../endpoints/dto/endpoint.dto'; +import { EntryDto } from '../../entries/dto/entry.dto'; import { JwtGuard } from '../../infra/auth/jwt/jwt.guard'; import { EntityIdExists } from '../../infra/repo/validators/entity-exists.validator'; @ApiTags('BFF') @@ -25,15 +25,15 @@ export class BffCallgentFunctionsController { @Body() apiTxt: CallgentApiText, ) { - const endpoint = EntityIdExists.entity(apiTxt, 'endpointId'); + const entry = EntityIdExists.entity(apiTxt, 'entryId'); await this.callgentFunctionService.importBatch( - endpoint, + entry, apiTxt, req.user?.sub, ); const data = await this.callgentFunctionService.findAll({ - where: { endpointId: endpoint.id }, + where: { entryId: entry.id }, }); return { data }; diff --git a/src/bff/callgent-tree/callgent-tree.controller.ts b/src/bff/callgent-tree/callgent-tree.controller.ts index 679414d..4c60ea1 100644 --- a/src/bff/callgent-tree/callgent-tree.controller.ts +++ b/src/bff/callgent-tree/callgent-tree.controller.ts @@ -16,7 +16,7 @@ import { CallgentRealmsService } from '../../callgent-realms/callgent-realms.ser import { CallgentsService } from '../../callgents/callgents.service'; import { CallgentDto } from '../../callgents/dto/callgent.dto'; import { CreateCallgentDto } from '../../callgents/dto/create-callgent.dto'; -import { EndpointsService } from '../../endpoints/endpoints.service'; +import { EntriesService } from '../../entries/entries.service'; import { JwtGuard } from '../../infra/auth/jwt/jwt.guard'; @ApiTags('BFF') @@ -26,8 +26,8 @@ import { JwtGuard } from '../../infra/auth/jwt/jwt.guard'; export class CallgentTreeController { constructor( private readonly callgentsService: CallgentsService, - @Inject('EndpointsService') - private readonly endpointsService: EndpointsService, + @Inject('EntriesService') + private readonly entriesService: EntriesService, @Inject('CallgentFunctionsService') private readonly callgentFunctionsService: CallgentFunctionsService, @Inject('CallgentRealmsService') @@ -36,9 +36,9 @@ export class CallgentTreeController { private readonly logger = new Logger(CallgentTreeController.name); /** - * @returns callgent with endpoints tree + * @returns callgent with entries tree */ - @Get('callgent-endpoints/:id') + @Get('callgent-entries/:id') async findOne(@Param('id') id: string) { const callgent = await this.callgentsService.findOne(id); if (!callgent) throw new NotFoundException(); @@ -49,9 +49,9 @@ export class CallgentTreeController { } /** - * @returns new or existing callgent with endpoints tree + * @returns new or existing callgent with entries tree */ - @Post('callgent-endpoints') + @Post('callgent-entries') async create(@Req() req, @Body() dto: CreateCallgentDto) { let callgent = (await this.callgentsService.getByName( dto.name, @@ -63,14 +63,14 @@ export class CallgentTreeController { } private async _callgentTree(callgent: CallgentDto) { - const endpoints = await this.endpointsService.findAll({ + const entries = await this.entriesService.findAll({ select: { callgentId: false }, where: { callgentId: callgent.id }, }); const [CEP, SEP, EEP] = [[], [], []]; await Promise.all( - endpoints.map(async (ep: any) => { + entries.map(async (ep: any) => { ep = { ...ep, id: ep.id, pk: undefined }; if (ep.type == 'CLIENT') { CEP.push(ep); @@ -82,16 +82,14 @@ export class CallgentTreeController { responses: false, callgentId: false, }, - where: { endpointId: ep.id }, + where: { entryId: ep.id }, }); SEP.push(ep); } else if (ep.type == 'EVENT') { EEP.push(ep); // TODO listeners as children } else - this.logger.error( - `Unknown endpoint type: ${ep.type}, ep.id=${ep.id}`, - ); + this.logger.error(`Unknown entry type: ${ep.type}, ep.id=${ep.id}`); }), ); @@ -110,19 +108,19 @@ export class CallgentTreeController { children: [ { id: 'CLIENT', - name: 'Client Endpoints (CEP)', + name: 'Client Entries (CEN)', hint: 'Adaptor to accept request to the callgent', children: CEP, }, { id: 'SERVER', - name: 'Server Endpoints (SEP)', + name: 'Server Entries (SEN)', hint: 'Adaptor to forward the request to actual service', children: SEP, }, { id: 'EVENT', - name: 'Event Endpoints (EEP)', + name: 'Event Entries (EEN)', hint: 'To accept service events and trigger your registered listener', children: EEP, }, diff --git a/src/bff/callgent-tree/callgent-tree.module.ts b/src/bff/callgent-tree/callgent-tree.module.ts index f9ef5e0..955c7b9 100644 --- a/src/bff/callgent-tree/callgent-tree.module.ts +++ b/src/bff/callgent-tree/callgent-tree.module.ts @@ -2,13 +2,13 @@ import { Module } from '@nestjs/common'; import { CallgentFunctionsModule } from '../../callgent-functions/callgent-functions.module'; import { CallgentRealmsModule } from '../../callgent-realms/callgent-realms.module'; import { CallgentsModule } from '../../callgents/callgents.module'; -import { EndpointsModule } from '../../endpoints/endpoints.module'; +import { EntriesModule } from '../../entries/entries.module'; import { CallgentTreeController } from './callgent-tree.controller'; @Module({ imports: [ CallgentsModule, - EndpointsModule, + EntriesModule, CallgentFunctionsModule, CallgentRealmsModule, ], diff --git a/src/callgent-functions/callgent-functions.controller.ts b/src/callgent-functions/callgent-functions.controller.ts index a1663e7..a19302c 100644 --- a/src/callgent-functions/callgent-functions.controller.ts +++ b/src/callgent-functions/callgent-functions.controller.ts @@ -20,8 +20,8 @@ import { getSchemaPath, } from '@nestjs/swagger'; import { IsNotEmpty, IsOptional } from 'class-validator'; -import { ApiSpec } from '../endpoints/adaptors/endpoint-adaptor.base'; -import { EndpointDto } from '../endpoints/dto/endpoint.dto'; +import { ApiSpec } from '../entries/adaptors/entry-adaptor.base'; +import { EntryDto } from '../entries/dto/entry.dto'; import { JwtGuard } from '../infra/auth/jwt/jwt.guard'; import { EntityIdExists } from '../infra/repo/validators/entity-exists.validator'; import { RestApiResponse } from '../restapi/response.interface'; @@ -30,18 +30,18 @@ import { CallgentFunctionDto } from './dto/callgent-function.dto'; import { UpdateCallgentFunctionDto } from './dto/update-callgent-function.dto'; export class CallgentApis extends ApiSpec { - @EntityIdExists('endpoint', 'id') - endpointId: string; + @EntityIdExists('entry', 'id') + entryId: string; } export class CallgentApiText { @ApiProperty({ required: true, - description: 'The callgent server-endpoint id', + description: 'The callgent server-entry id', }) @IsNotEmpty() - @EntityIdExists('endpoint', 'id') - endpointId: string; + @EntityIdExists('entry', 'id') + entryId: string; @ApiProperty({ required: true, @@ -81,10 +81,10 @@ export class CallgentFunctionsController { @Body() apis: CallgentApis, ) { - const endpoint = EntityIdExists.entity(apis, 'endpointId'); + const entry = EntityIdExists.entity(apis, 'entryId'); return { data: await this.callgentFunctionService.createBatch( - endpoint, + entry, apis, req.user?.sub, ), @@ -101,10 +101,10 @@ export class CallgentFunctionsController { @Body() apiTxt: CallgentApiText, ) { - const endpoint = EntityIdExists.entity(apiTxt, 'endpointId'); + const entry = EntityIdExists.entity(apiTxt, 'entryId'); return { data: await this.callgentFunctionService.importBatch( - endpoint, + entry, apiTxt, req.user?.sub, ), diff --git a/src/callgent-functions/callgent-functions.module.ts b/src/callgent-functions/callgent-functions.module.ts index 41684d6..395374c 100644 --- a/src/callgent-functions/callgent-functions.module.ts +++ b/src/callgent-functions/callgent-functions.module.ts @@ -1,11 +1,11 @@ import { Module } from '@nestjs/common'; import { CallgentRealmsModule } from '../callgent-realms/callgent-realms.module'; -import { EndpointsModule } from '../endpoints/endpoints.module'; +import { EntriesModule } from '../entries/entries.module'; import { CallgentFunctionsController } from './callgent-functions.controller'; import { CallgentFunctionsService } from './callgent-functions.service'; @Module({ - imports: [EndpointsModule, CallgentRealmsModule], + imports: [EntriesModule, CallgentRealmsModule], providers: [ { provide: 'CallgentFunctionsService', useClass: CallgentFunctionsService }, ], diff --git a/src/callgent-functions/callgent-functions.service.ts b/src/callgent-functions/callgent-functions.service.ts index 414383f..1b26d2c 100644 --- a/src/callgent-functions/callgent-functions.service.ts +++ b/src/callgent-functions/callgent-functions.service.ts @@ -7,17 +7,17 @@ import { NotFoundException, } from '@nestjs/common'; import { PaginatorTypes, paginator } from '@nodeteam/nestjs-prisma-pagination'; -import { EndpointType, Prisma, PrismaClient } from '@prisma/client'; +import { EntryType, Prisma, PrismaClient } from '@prisma/client'; import { CallgentRealmsService } from '../callgent-realms/callgent-realms.service'; +import { RealmSecurityVO } from '../callgent-realms/dto/realm-security.vo'; import { CallgentRealm } from '../callgent-realms/entities/callgent-realm.entity'; -import { ApiSpec } from '../endpoints/adaptors/endpoint-adaptor.base'; -import { EndpointDto } from '../endpoints/dto/endpoint.dto'; -import { EndpointsService } from '../endpoints/endpoints.service'; -import { ClientRequestEvent } from '../endpoints/events/client-request.event'; +import { ApiSpec } from '../entries/adaptors/entry-adaptor.base'; +import { EntryDto } from '../entries/dto/entry.dto'; +import { EntriesService } from '../entries/entries.service'; +import { ClientRequestEvent } from '../entries/events/client-request.event'; import { Utils } from '../infra/libs/utils'; import { selectHelper } from '../infra/repo/select.helper'; import { UpdateCallgentFunctionDto } from './dto/update-callgent-function.dto'; -import { RealmSecurityVO } from '../callgent-realms/dto/realm-security.vo'; const paginate: PaginatorTypes.PaginateFunction = paginator({ perPage: 10 }); @@ -25,8 +25,8 @@ const paginate: PaginatorTypes.PaginateFunction = paginator({ perPage: 10 }); export class CallgentFunctionsService { constructor( private readonly txHost: TransactionHost, - @Inject('EndpointsService') - private readonly endpointsService: EndpointsService, + @Inject('EntriesService') + private readonly endpointsService: EntriesService, @Inject('CallgentRealmsService') private readonly callgentRealmsService: CallgentRealmsService, ) {} @@ -105,13 +105,13 @@ export class CallgentFunctionsService { } @Transactional() - async createBatch(endpoint: EndpointDto, spec: ApiSpec, createdBy: string) { - if (endpoint.type != 'SERVER') + async createBatch(entry: EntryDto, spec: ApiSpec, createdBy: string) { + if (entry.type != 'SERVER') throw new BadRequestException( - 'endpoint must be of type `SERVER`, id=' + endpoint.id, + 'entry must be of type `SERVER`, id=' + entry.id, ); const { apis, securitySchemes, servers, securities } = spec; - // TODO set endpoint.host from servers? + // TODO set entry.host from servers? // create callgent realms from securitySchemes const realmMap: { [name: string]: CallgentRealm } = {}; @@ -119,7 +119,7 @@ export class CallgentFunctionsService { await Promise.all( Object.entries(securitySchemes).map(async ([name, scheme]) => { const realm = await this.callgentRealmsService.upsertRealm( - endpoint, + entry, scheme, {}, servers, @@ -136,8 +136,8 @@ export class CallgentFunctionsService { ...f, id: Utils.uuid(), name: Utils.formalApiName(f.method, f.path), - endpointId: endpoint.id, - callgentId: endpoint.callgentId, + entryId: entry.id, + callgentId: entry.callgentId, createdBy: createdBy, }; if (securities?.length || ret.securities?.length) { @@ -154,7 +154,7 @@ export class CallgentFunctionsService { ); const item = this.callgentRealmsService.constructSecurity( realm, - endpoint, + entry, scopes, ); @@ -175,9 +175,9 @@ export class CallgentFunctionsService { }); // 根据adaptor,auth type,判定可选的auth servers - // FIXME save securitySchemes on endpoint + // FIXME save securitySchemes on entry // await this.endpointsService.saveSecuritySchemes( - // endpoint.id, + // entry.id, // securitySchemes, // ); // FIXME add auth-listener for this sep, @@ -187,17 +187,17 @@ export class CallgentFunctionsService { @Transactional() async importBatch( - endpoint: EndpointDto, + entry: EntryDto, apiTxt: { text: string; format?: 'json' | 'yaml' | 'text' }, createdBy: string, ) { - if (endpoint?.type != EndpointType.SERVER) + if (entry?.type != EntryType.SERVER) throw new BadRequestException( - 'Function entries can only be imported into Server Endpoint. ', + 'Function entries can only be imported into Server Entry. ', ); - const apiSpec = await this.endpointsService.parseApis(endpoint, apiTxt); - return this.createBatch(endpoint, apiSpec, createdBy); + const apiSpec = await this.endpointsService.parseApis(entry, apiTxt); + return this.createBatch(entry, apiSpec, createdBy); } findMany({ diff --git a/src/callgent-hub/callgent-hub.module.ts b/src/callgent-hub/callgent-hub.module.ts index c52794b..302699f 100644 --- a/src/callgent-hub/callgent-hub.module.ts +++ b/src/callgent-hub/callgent-hub.module.ts @@ -2,7 +2,7 @@ import { Module } from '@nestjs/common'; import { CallgentFunctionsModule } from '../callgent-functions/callgent-functions.module'; import { CallgentRealmsModule } from '../callgent-realms/callgent-realms.module'; import { CallgentsModule } from '../callgents/callgents.module'; -import { EndpointsModule } from '../endpoints/endpoints.module'; +import { EntriesModule } from '../entries/entries.module'; import { CallgentHubController } from './callgent-hub.controller'; import { CallgentHubService } from './callgent-hub.service'; @@ -10,7 +10,7 @@ import { CallgentHubService } from './callgent-hub.service'; imports: [ CallgentsModule, CallgentRealmsModule, - EndpointsModule, + EntriesModule, CallgentFunctionsModule, ], controllers: [CallgentHubController], diff --git a/src/callgent-hub/callgent-hub.service.ts b/src/callgent-hub/callgent-hub.service.ts index 56816cc..ad1b1c7 100644 --- a/src/callgent-hub/callgent-hub.service.ts +++ b/src/callgent-hub/callgent-hub.service.ts @@ -12,7 +12,7 @@ import { CallgentRealmsService } from '../callgent-realms/callgent-realms.servic import { RealmSecurityVO } from '../callgent-realms/dto/realm-security.vo'; import { CallgentsService } from '../callgents/callgents.service'; import { CreateCallgentDto } from '../callgents/dto/create-callgent.dto'; -import { EndpointsService } from '../endpoints/endpoints.service'; +import { EntriesService } from '../entries/entries.service'; import { PrismaTenancyService } from '../infra/repo/tenancy/prisma-tenancy.service'; @Injectable() @@ -24,8 +24,8 @@ export class CallgentHubService { private readonly callgentsService: CallgentsService, @Inject('CallgentRealmsService') private readonly callgentRealmsService: CallgentRealmsService, - @Inject('EndpointsService') - private readonly endpointsService: EndpointsService, + @Inject('EntriesService') + private readonly entriesService: EntriesService, @Inject('CallgentFunctionsService') private readonly callgentFunctionsService: CallgentFunctionsService, ) {} @@ -53,7 +53,7 @@ export class CallgentHubService { } /** - * Callgent, Endpoint, CallgentFunction, CallgentRealm. + * Callgent, Entry, CallgentFunction, CallgentRealm. */ @Transactional() async forkFromHub(dupId: string, dto: CreateCallgentDto, createdBy: string) { @@ -68,7 +68,7 @@ export class CallgentHubService { } /** - * Callgent, Endpoint, CallgentFunction, CallgentRealm. + * Callgent, Entry, CallgentFunction, CallgentRealm. */ @Transactional() async commitToHub(dupId: string, dto: CreateCallgentDto, createdBy: string) { @@ -97,7 +97,7 @@ export class CallgentHubService { id: true, name: true, summary: true, - endpoints: { + entries: { select: { id: true, name: true, @@ -127,8 +127,8 @@ export class CallgentHubService { }); } - const eps = from.endpoints; - from.endpoints = undefined; + const ens = from.entries; + from.entries = undefined; this.tenancyService.setTenantId(toTenant); const callgent = await this.callgentsService.create( { ...from, ...dto, forkedPk: from.pk }, @@ -168,9 +168,9 @@ export class CallgentHubService { this.tenancyService.setTenantId(fromTenant); const functionMap = {}; await Promise.all( - eps.map(async (epOld) => { + ens.map(async (epOld) => { const functions = await this.callgentFunctionsService.findAll({ - where: { endpointId: epOld.id }, + where: { entryId: epOld.id }, orderBy: { pk: 'asc' }, select: { name: true, @@ -190,10 +190,10 @@ export class CallgentHubService { this.tenancyService.setTenantId(toTenant); await Promise.all( - eps.map(async (epOld) => { + ens.map(async (epOld) => { const securities: any[] = dupSecurities(epOld.securities); - const ep = await this.endpointsService.create({ + const ep = await this.entriesService.create({ ...epOld, callgentId, securities, @@ -207,7 +207,7 @@ export class CallgentHubService { ...fun, securities, callgentId, - endpointId: ep.id, + entryId: ep.id, createdBy, }); }), diff --git a/src/callgent-realms/callgent-realms.controller.ts b/src/callgent-realms/callgent-realms.controller.ts index 346f925..5f3e0cf 100644 --- a/src/callgent-realms/callgent-realms.controller.ts +++ b/src/callgent-realms/callgent-realms.controller.ts @@ -195,13 +195,13 @@ export class CallgentRealmsController { }; } - @ApiOperation({ summary: 'Update securities on endpoint/callgent function' }) + @ApiOperation({ summary: 'Update securities on entry/callgent function' }) /// securities - @ApiParam({ name: 'type', type: 'string', enum: ['endpoint', 'function'] }) + @ApiParam({ name: 'type', type: 'string', enum: ['entry', 'function'] }) @ApiBody({ isArray: true, type: RealmSecurityItemForm }) @Post('securities/:type/:id') async updateSecurities( - @Param('type') type: 'endpoint' | 'function', + @Param('type') type: 'entry' | 'function', @Param('id') id: string, @Body() securities: RealmSecurityItemForm[], // TODO: RealmSecurityVO ) { diff --git a/src/callgent-realms/callgent-realms.module.ts b/src/callgent-realms/callgent-realms.module.ts index c90defc..823d28b 100644 --- a/src/callgent-realms/callgent-realms.module.ts +++ b/src/callgent-realms/callgent-realms.module.ts @@ -1,5 +1,5 @@ import { Module } from '@nestjs/common'; -import { EndpointsModule } from '../endpoints/endpoints.module'; +import { EntriesModule } from '../entries/entries.module'; import { UsersModule } from '../users/users.module'; import { CallgentRealmsController } from './callgent-realms.controller'; import { CallgentRealmsService } from './callgent-realms.service'; @@ -7,7 +7,7 @@ import { ApiKeyAuthProcessor } from './processors/api-key-auth.processor'; import { HttpAuthProcessor } from './processors/http-auth.processor'; @Module({ - imports: [EndpointsModule, UsersModule], + imports: [EntriesModule, UsersModule], providers: [ { provide: 'CallgentRealmsService', useClass: CallgentRealmsService }, { provide: 'apiKey-authProcessor', useClass: ApiKeyAuthProcessor }, diff --git a/src/callgent-realms/callgent-realms.service.ts b/src/callgent-realms/callgent-realms.service.ts index aa97bd2..a856519 100644 --- a/src/callgent-realms/callgent-realms.service.ts +++ b/src/callgent-realms/callgent-realms.service.ts @@ -5,15 +5,16 @@ import { Inject, Injectable, NotFoundException, + OnModuleInit, UnauthorizedException, } from '@nestjs/common'; import { ModuleRef } from '@nestjs/core'; import { ServerObject } from '@nestjs/swagger/dist/interfaces/open-api-spec.interface'; import { Prisma, PrismaClient } from '@prisma/client'; import { CallgentFunctionsService } from '../callgent-functions/callgent-functions.service'; -import { EndpointDto } from '../endpoints/dto/endpoint.dto'; -import { EndpointsService } from '../endpoints/endpoints.service'; -import { ClientRequestEvent } from '../endpoints/events/client-request.event'; +import { EntryDto } from '../entries/dto/entry.dto'; +import { EntriesService } from '../entries/entries.service'; +import { ClientRequestEvent } from '../entries/events/client-request.event'; import { selectHelper } from '../infra/repo/select.helper'; import { UsersService } from '../users/users.service'; import { RealmSchemeVO } from './dto/realm-scheme.vo'; @@ -28,21 +29,14 @@ import { AuthProcessor } from './processors/auth-processor.base'; /** each callgent may have several security realms */ @Injectable() -export class CallgentRealmsService { +export class CallgentRealmsService implements OnModuleInit { constructor( private readonly txHost: TransactionHost, - @Inject('EndpointsService') - private readonly endpointsService: EndpointsService, + @Inject('EntriesService') + private readonly entriesService: EntriesService, private readonly usersService: UsersService, private readonly moduleRef: ModuleRef, - ) { - // a little hack: circular relation - this.callgentFunctionsService = this.moduleRef.get( - 'CallgentFunctionsService', - { strict: false }, - ); - } - private readonly callgentFunctionsService: CallgentFunctionsService; + ) {} protected readonly defSelect: Prisma.CallgentRealmSelect = { pk: false, tenantPk: false, @@ -50,6 +44,15 @@ export class CallgentRealmsService { updatedAt: false, }; + private callgentFunctionsService: CallgentFunctionsService; + onModuleInit() { + // a little hack: circular relation + this.callgentFunctionsService = this.moduleRef.get( + 'CallgentFunctionsService', + { strict: false }, + ); + } + //// auth config start //// @Transactional() @@ -78,16 +81,16 @@ export class CallgentRealmsService { */ @Transactional() async upsertRealm( - endpoint: EndpointDto, + entry: EntryDto, scheme: Omit & { provider?: string }, realm: Partial>, servers: ServerObject[], ) { const authType = scheme.type; const processor = this._getAuthProcessor(authType); - realm = processor.constructRealm(scheme, realm, endpoint, servers); + realm = processor.constructRealm(scheme, realm, entry, servers); const realmKey = realm.realmKey; - const callgentId = endpoint.callgentId; + const callgentId = entry.callgentId; const prisma = this.txHost.tx as PrismaClient; const existing = await prisma.callgentRealm.findFirst({ @@ -116,45 +119,39 @@ export class CallgentRealmsService { }); } - /** construct security guard on endpoint */ - constructSecurity( - realm: CallgentRealm, - endpoint: EndpointDto, - scopes?: string[], - ) { + /** construct security guard on entry */ + constructSecurity(realm: CallgentRealm, entry: EntryDto, scopes?: string[]) { const processor = this._getAuthProcessor(realm.authType); - return processor.constructSecurity(endpoint, realm, scopes); + return processor.constructSecurity(entry, realm, scopes); } // TODO: RealmSecurityVO async updateSecurities( - type: 'endpoint' | 'function', + type: 'entry' | 'function', id: string, securities: RealmSecurityItemForm[], ) { - let endpoint, targetService: EndpointsService | CallgentFunctionsService; - if (type == 'endpoint') { - targetService = this.endpointsService; - endpoint = await this.endpointsService.findOne(id); + let entry, targetService: EntriesService | CallgentFunctionsService; + if (type == 'entry') { + targetService = this.entriesService; + entry = await this.entriesService.findOne(id); } else { targetService = this.callgentFunctionsService; const fun = await this.callgentFunctionsService.findOne(id, { - endpointId: true, + entryId: true, }); - endpoint = await this.endpointsService.findOne(fun.endpointId); + entry = fun && (await this.entriesService.findOne(fun.entryId)); } - if (!endpoint) throw new NotFoundException('Not found ' + type); + if (!entry) throw new NotFoundException('Not found ' + type); const secs = await Promise.all( securities.map(async (security) => { - const realm = await this.findOne( - endpoint.callgentId, - security.realmKey, - { pk: null }, - ); + const realm = await this.findOne(entry.callgentId, security.realmKey, { + pk: null, + }); if (!realm) throw new NotFoundException('Not found realm'); - const sec = this.constructSecurity(realm, endpoint, security.scopes); + const sec = this.constructSecurity(realm, entry, security.scopes); return { ['' + sec.realmPk]: sec }; }), ); @@ -168,10 +165,10 @@ export class CallgentRealmsService { async checkCepAuth( reqEvent: ClientRequestEvent, ): Promise { - const cep = await this.endpointsService.findOne(reqEvent.srcId); + const cep = await this.entriesService.findOne(reqEvent.srcId); if (!cep) throw new NotFoundException( - 'Client endpoint not found, id: ' + reqEvent.srcId, + 'Client entry not found, id: ' + reqEvent.srcId, ); return this.checkSecurities(reqEvent, cep.securities as any); @@ -186,13 +183,13 @@ export class CallgentRealmsService { reqEvent: ClientRequestEvent, ): Promise { // functions: CallgentFunction[], @see AgentsService.map2Function - const { securities, endpointId: sepId } = + const { securities, entryId: sepId } = reqEvent.context.functions?.length && reqEvent.context.functions[0]; - const sep = sepId && (await this.endpointsService.findOne(reqEvent.srcId)); + const sep = sepId && (await this.entriesService.findOne(reqEvent.srcId)); if (!sep) throw new NotFoundException( - 'Server endpoint not found, id: ' + reqEvent.srcId, + 'Server entry not found, id: ' + reqEvent.srcId, ); return this.checkSecurities(reqEvent, securities, true); } @@ -436,7 +433,7 @@ export class CallgentRealmsService { // clear securities await Promise.all([ - prisma.$executeRaw`UPDATE "Endpoint" + prisma.$executeRaw`UPDATE "Entry" SET "securities" = ( SELECT array_agg(sec::jsonb - ${pk}) FILTER (WHERE (sec::jsonb - ${pk})::text != '{}') diff --git a/src/callgent-realms/processors/api-key-auth.processor.ts b/src/callgent-realms/processors/api-key-auth.processor.ts index b90a8ad..fa97051 100644 --- a/src/callgent-realms/processors/api-key-auth.processor.ts +++ b/src/callgent-realms/processors/api-key-auth.processor.ts @@ -4,8 +4,8 @@ import { UnauthorizedException, } from '@nestjs/common'; import { SecuritySchemeObject } from '@nestjs/swagger/dist/interfaces/open-api-spec.interface'; -import { EndpointDto } from '../../endpoints/dto/endpoint.dto'; -import { ClientRequestEvent } from '../../endpoints/events/client-request.event'; +import { EntryDto } from '../../entries/dto/entry.dto'; +import { ClientRequestEvent } from '../../entries/events/client-request.event'; import { APIKeySecurityScheme, RealmSchemeVO } from '../dto/realm-scheme.vo'; import { RealmSecurityItem } from '../dto/realm-security.vo'; import { CallgentRealm } from '../entities/callgent-realm.entity'; @@ -15,15 +15,15 @@ import { AuthProcessor } from './auth-processor.base'; export class ApiKeyAuthProcessor extends AuthProcessor { protected implyProvider( scheme: SecuritySchemeObject, - endpoint?: EndpointDto, + entry?: EntryDto, servers?: { url: string }[], ) { let url: string = (scheme as any).provider; if (url) { if (!url.toLowerCase().startsWith('http')) url = 'http://' + url; } else { - if (endpoint && endpoint.type != 'CLIENT') { - url = endpoint.host; // whatever adaptor it is, host need to be a url + if (entry && entry.type != 'CLIENT') { + url = entry.host; // whatever adaptor it is, host need to be a url } else if (servers?.length > 0) { const server = servers.find((server) => { try { diff --git a/src/callgent-realms/processors/auth-processor.base.ts b/src/callgent-realms/processors/auth-processor.base.ts index 17e8026..d5a9e20 100644 --- a/src/callgent-realms/processors/auth-processor.base.ts +++ b/src/callgent-realms/processors/auth-processor.base.ts @@ -3,8 +3,8 @@ import { SecuritySchemeObject, ServerObject, } from '@nestjs/swagger/dist/interfaces/open-api-spec.interface'; -import { EndpointDto } from '../../endpoints/dto/endpoint.dto'; -import { ClientRequestEvent } from '../../endpoints/events/client-request.event'; +import { EntryDto } from '../../entries/dto/entry.dto'; +import { ClientRequestEvent } from '../../entries/events/client-request.event'; import { AuthType, RealmSchemeVO } from '../dto/realm-scheme.vo'; import { RealmSecurityItem } from '../dto/realm-security.vo'; import { CallgentRealm } from '../entities/callgent-realm.entity'; @@ -14,11 +14,11 @@ export abstract class AuthProcessor { constructRealm( scheme: Omit & { provider?: string }, realm: Partial>, - endpoint?: EndpointDto, + entry?: EntryDto, servers?: ServerObject[], ) { // imply provider - scheme.provider = this.implyProvider(scheme, endpoint, servers); + scheme.provider = this.implyProvider(scheme, entry, servers); realm.realmKey = this.getRealmKey(scheme as any, realm.realm); realm.perUser = this.isPerUser(scheme as any, realm); realm.enabled = this.checkEnabled(scheme as any, realm); @@ -26,18 +26,18 @@ export abstract class AuthProcessor { return realm; } - /** construct a security guard on endpoint */ + /** construct a security guard on entry */ constructSecurity( - endpoint: EndpointDto, + entry: EntryDto, realm: CallgentRealm, scopes?: string[], ): RealmSecurityItem { let attach: boolean; - if (endpoint.type != 'CLIENT') { + if (entry.type != 'CLIENT') { try { const provider = this.implyProvider( { ...realm.scheme, provider: undefined } as any, - endpoint, + entry, ); if (provider == realm.scheme.provider) attach = true; } catch (e) { @@ -54,7 +54,7 @@ export abstract class AuthProcessor { */ protected abstract implyProvider( scheme: Omit & { type: AuthType }, - endpoint?: EndpointDto, + entry?: EntryDto, servers?: { url: string }[], ): string; diff --git a/src/callgent-realms/processors/http-auth.processor.ts b/src/callgent-realms/processors/http-auth.processor.ts index 4696991..1ef780f 100644 --- a/src/callgent-realms/processors/http-auth.processor.ts +++ b/src/callgent-realms/processors/http-auth.processor.ts @@ -4,8 +4,8 @@ import { UnauthorizedException, } from '@nestjs/common'; import { SecuritySchemeObject } from '@nestjs/swagger/dist/interfaces/open-api-spec.interface'; -import { EndpointDto } from '../../endpoints/dto/endpoint.dto'; -import { ClientRequestEvent } from '../../endpoints/events/client-request.event'; +import { EntryDto } from '../../entries/dto/entry.dto'; +import { ClientRequestEvent } from '../../entries/events/client-request.event'; import { APIKeySecurityScheme, RealmSchemeVO } from '../dto/realm-scheme.vo'; import { RealmSecurityItem } from '../dto/realm-security.vo'; import { CallgentRealm } from '../entities/callgent-realm.entity'; @@ -15,15 +15,15 @@ import { AuthProcessor } from './auth-processor.base'; export class HttpAuthProcessor extends AuthProcessor { protected implyProvider( scheme: SecuritySchemeObject, - endpoint?: EndpointDto, + entry?: EntryDto, servers?: { url: string }[], ) { let url: string = (scheme as any).provider; if (url) { if (!url.toLowerCase().startsWith('http')) url = 'http://' + url; } else { - if (endpoint && endpoint.type != 'CLIENT') { - url = endpoint.host; // whatever adaptor it is, host need to be a url + if (entry && entry.type != 'CLIENT') { + url = entry.host; // whatever adaptor it is, host need to be a url } else if (servers?.length > 0) { url = servers[0].url; } diff --git a/src/callgents/callgents.service.ts b/src/callgents/callgents.service.ts index 4ef27e0..4b6fb0e 100644 --- a/src/callgents/callgents.service.ts +++ b/src/callgents/callgents.service.ts @@ -178,45 +178,45 @@ export class CallgentsService { } /** - * Cross tenancy execution when client endpoint is provided. - * [endpoint://]callgent.please('act', with_args) + * Cross tenancy execution when client entry is provided. + * [entry://]callgent.please('act', with_args) * @param act API action name - * @param endpoint client endpoint to call API. unnecessary in internal calls + * @param entry client entry to call API. unnecessary in internal calls * @deprecated */ @Transactional() async please( act: string, args: any[], - endpoint: { callgentId: string; id?: string; adaptorKey?: string }, + entry: { callgentId: string; id?: string; adaptorKey?: string }, ) { - // invoke callgent action api, through endpoint + // invoke callgent action api, through entry const prisma = this.txHost.tx as PrismaClient; - const withEndpoint = endpoint?.id || endpoint?.adaptorKey; + const withEntry = entry?.id || entry?.adaptorKey; // load targets - if (withEndpoint) this.tenancyService.bypassTenancy(prisma); + if (withEntry) this.tenancyService.bypassTenancy(prisma); const [callgent, actions, epClient] = await Promise.all([ - prisma.callgent.findUnique({ where: { id: endpoint.callgentId } }), + prisma.callgent.findUnique({ where: { id: entry.callgentId } }), prisma.callgentFunction.findMany({ - where: { name: act, callgentId: endpoint.callgentId }, + where: { name: act, callgentId: entry.callgentId }, }), - withEndpoint && - prisma.endpoint.findFirst({ where: { ...endpoint, type: 'CLIENT' } }), + withEntry && + prisma.entry.findFirst({ where: { ...entry, type: 'CLIENT' } }), ]); // check targets if (!callgent) - throw new NotFoundException('callgent not found: ' + endpoint.callgentId); + throw new NotFoundException('callgent not found: ' + entry.callgentId); if (actions.length === 0) throw new NotFoundException( - `callgent=${endpoint.callgentId} API action not found: ${act}`, + `callgent=${entry.callgentId} API action not found: ${act}`, ); - if (withEndpoint) { + if (withEntry) { if (!epClient) throw new NotFoundException( - `Client endpoint not found for callgent=${endpoint.callgentId}: ${ - endpoint.id || endpoint.adaptorKey + `Client entry not found for callgent=${entry.callgentId}: ${ + entry.id || entry.adaptorKey }`, ); this.tenancyService.setTenantId(callgent.tenantPk); diff --git a/src/endpoints/endpoints.controller.ts b/src/endpoints/endpoints.controller.ts deleted file mode 100644 index f3d38ac..0000000 --- a/src/endpoints/endpoints.controller.ts +++ /dev/null @@ -1,134 +0,0 @@ -import { - Body, - Controller, - Delete, - Get, - Inject, - Param, - Post, - Put, - Query, - Req, - UseGuards, -} from '@nestjs/common'; -import { - ApiCreatedResponse, - ApiExtraModels, - ApiOkResponse, - ApiSecurity, - ApiTags, - getSchemaPath, -} from '@nestjs/swagger'; -import { JwtGuard } from '../infra/auth/jwt/jwt.guard'; -import { RestApiResponse } from '../restapi/response.interface'; -import { CreateEndpointDto } from './dto/create-endpoint.dto'; -import { EndpointDto } from './dto/endpoint.dto'; -import { UpdateEndpointDto } from './dto/update-endpoint.dto'; -import { EndpointsService } from './endpoints.service'; - -@ApiTags('Endpoints') -@ApiSecurity('defaultBearerAuth') -@ApiExtraModels(EndpointDto) -@UseGuards(JwtGuard) -@Controller('endpoints') -export class EndpointsController { - constructor( - @Inject('EndpointsService') - private readonly endpointsService: EndpointsService, - ) {} - - @Get('adaptors') - listAdaptors(@Query('client') client?: boolean) { - return this.endpointsService.list(client); - } - - // @ApiOkResponse({ type: EndpointConfig }) - // @Get(':endpointType/config') - // getConfig(@Param('endpointType') endpointType: EndpointType) { - // return this.endpointsService.getAdaptor(endpointType); - // if (!adaptor) - // throw new NotFoundException('No endpoint found with key:', endpointType); - // return adaptor.getConfig(); - // } - - @ApiCreatedResponse({ - schema: { - anyOf: [ - { $ref: getSchemaPath(RestApiResponse) }, - { properties: { data: { $ref: getSchemaPath(EndpointDto) } } }, - ], - }, - }) - @Post(':adaptorKey/create') - async createEndpoint( - @Req() req, - @Param('adaptorKey') adaptorKey: string, - @Body() dto: CreateEndpointDto, - ) { - return { - data: await this.endpointsService.create({ - ...dto, - adaptorKey, - createdBy: req.user.sub, - }), - }; - } - - @ApiOkResponse({ - schema: { - anyOf: [ - { $ref: getSchemaPath(RestApiResponse) }, - { properties: { data: { $ref: getSchemaPath(EndpointDto) } } }, - ], - }, - }) - @Put(':id') - async updateEndpoint( - @Param('id') id: string, - @Body() dto: UpdateEndpointDto, - ) { - return { - data: await this.endpointsService.update(id, dto), - }; - } - - /** for auth type `APP`, userKey is ignored */ - // @Put('auth') - // async upsertEndpointAuth(@Req() req, @Body() dto: CreateEndpointAuthDto) { - // const endpoint = EntityIdExists.entity(dto, 'endpoint'); - // return { - // data: await this.endpointsService.upsertEndpointAuth( - // { ...dto, createdBy: req.user.sub }, - // endpoint, - // ), - // }; - // } - - @Post(':id/init') - initEndpoint(@Param('id') id: string, @Body() initParams: object) { - this.endpointsService.init(id, initParams); - } - - /** manual test endpoint */ - @Post(':id/test') - testEndpoint(@Param('id') id: string, @Body() any: any) { - // - } - - @ApiOkResponse({ - schema: { - anyOf: [ - { $ref: getSchemaPath(RestApiResponse) }, - { - properties: { - data: { $ref: getSchemaPath(EndpointDto) }, - }, - }, - ], - }, - }) - @Delete('/:id') - async remove(@Param('id') id: string) { - return { data: await this.endpointsService.delete(id) }; - } -} diff --git a/src/endpoints/adaptors/builtin/email/email.adaptor.ts b/src/entries/adaptors/builtin/email/email.adaptor.ts similarity index 86% rename from src/endpoints/adaptors/builtin/email/email.adaptor.ts rename to src/entries/adaptors/builtin/email/email.adaptor.ts index 65d69b8..4f40818 100644 --- a/src/endpoints/adaptors/builtin/email/email.adaptor.ts +++ b/src/entries/adaptors/builtin/email/email.adaptor.ts @@ -12,14 +12,14 @@ import { EmailRelayKey, EmailsService, } from '../../../../emails/emails.service'; -import { EndpointDto } from '../../../dto/endpoint.dto'; -import { Endpoint } from '../../../entities/endpoint.entity'; +import { EntryDto } from '../../../dto/entry.dto'; +import { Entry } from '../../../entities/entry.entity'; import { ClientRequestEvent } from '../../../events/client-request.event'; -import { EndpointAdaptor, EndpointConfig } from '../../endpoint-adaptor.base'; -import { EndpointAdaptorName } from '../../endpoint-adaptor.decorator'; +import { EntryAdaptor, EntryConfig } from '../../entry-adaptor.base'; +import { EntryAdaptorName } from '../../entry-adaptor.decorator'; -@EndpointAdaptorName('Email', 'both') -export class EmailAdaptor extends EndpointAdaptor { +@EntryAdaptorName('Email', 'both') +export class EmailAdaptor extends EntryAdaptor { constructor( @Inject('AgentsService') readonly agentsService: AgentsService, private readonly emailsService: EmailsService, @@ -27,26 +27,26 @@ export class EmailAdaptor extends EndpointAdaptor { super(agentsService); } - getCallback(callback: string, reqEndpoint?: EndpointDto): Promise { + getCallback(callback: string, reqEntry?: EntryDto): Promise { throw new NotImplementedException('Method not implemented.'); } - getConfig(): EndpointConfig { + getConfig(): EntryConfig { return {}; } - /** generate a web page endpoint */ - async initClient(params: object, endpoint: EndpointDto) { + /** generate a web page entry */ + async initClient(params: object, entry: Entry) { return ''; } /** generate operation script based on the Chrome plugin */ - async initServer(initParams: object, endpoint: EndpointDto) { + async initServer(initParams: object, entry: EntryDto) { // throw new NotImplementedException('Method not implemented.'); return ''; } - async preprocess(reqEvent: ClientRequestEvent, endpoint: EndpointDto) { + async preprocess(reqEvent: ClientRequestEvent, entry: EntryDto) { // } @@ -84,13 +84,13 @@ export class EmailAdaptor extends EndpointAdaptor { * * @param fun - callgent function * @param args - function arguments - * @param sep - server endpoint + * @param sep - server entry * @param reqEvent - client request event */ async invoke( fun: CallgentFunctionDto, args: object, - sep: Endpoint, + sep: Entry, reqEvent: ClientRequestEvent, ) { const emailFrom = this.emailsService.getRelayAddress( diff --git a/src/endpoints/adaptors/builtin/restapi/restapi.adaptor.ts b/src/entries/adaptors/builtin/restapi/restapi.adaptor.ts similarity index 89% rename from src/endpoints/adaptors/builtin/restapi/restapi.adaptor.ts rename to src/entries/adaptors/builtin/restapi/restapi.adaptor.ts index 6deb0b6..04110f7 100644 --- a/src/endpoints/adaptors/builtin/restapi/restapi.adaptor.ts +++ b/src/entries/adaptors/builtin/restapi/restapi.adaptor.ts @@ -6,18 +6,18 @@ import { import axios, { AxiosResponse } from 'axios'; import { AgentsService } from '../../../../agents/agents.service'; import { CallgentFunctionDto } from '../../../../callgent-functions/dto/callgent-function.dto'; -import { EndpointDto } from '../../../dto/endpoint.dto'; +import { EntryDto } from '../../../dto/entry.dto'; import { ClientRequestEvent } from '../../../events/client-request.event'; -import { EndpointAdaptor, EndpointConfig } from '../../endpoint-adaptor.base'; -import { EndpointAdaptorName } from '../../endpoint-adaptor.decorator'; +import { EntryAdaptor, EntryConfig } from '../../entry-adaptor.base'; +import { EntryAdaptorName } from '../../entry-adaptor.decorator'; -@EndpointAdaptorName('restAPI', 'both') -export class RestAPIAdaptor extends EndpointAdaptor { +@EntryAdaptorName('restAPI', 'both') +export class RestAPIAdaptor extends EntryAdaptor { constructor(@Inject('AgentsService') readonly agentsService: AgentsService) { super(agentsService); } - getConfig(): EndpointConfig { + getConfig(): EntryConfig { return { server: { host: { @@ -102,17 +102,17 @@ export class RestAPIAdaptor extends EndpointAdaptor { }; } - /** generate a web page endpoint */ - initClient(params: object, endpoint: EndpointDto): Promise { + /** generate a web page entry */ + initClient(params: object, entry: EntryDto): Promise { throw new NotImplementedException('Method not implemented.'); } /** generate operation script based on the Chrome plugin */ - initServer(initParams: object, endpoint: EndpointDto): Promise { + initServer(initParams: object, entry: EntryDto): Promise { // - scrape the web page - const url = endpoint.host['Page URL']; + const url = entry.host['Page URL']; // - script to fill params into the page - // const reqTemplate = endpoint.reqParamTemplate; + // const reqTemplate = entry.reqParamTemplate; // - script to operate the page // auth handler throw new NotImplementedException('Method not implemented.'); @@ -120,7 +120,7 @@ export class RestAPIAdaptor extends EndpointAdaptor { async preprocess( reqEvent: ClientRequestEvent, - // endpoint: EndpointDto, + // entry: EntryDto, ) { const req = reqEvent?.context.req; if (!req) @@ -148,7 +148,7 @@ export class RestAPIAdaptor extends EndpointAdaptor { // async invoke() {} - async getCallback(callback: string, reqEndpoint?: EndpointDto) { + async getCallback(callback: string, reqEntry?: EntryDto) { // FIXME return callback; } @@ -157,7 +157,7 @@ export class RestAPIAdaptor extends EndpointAdaptor { const { method, headers: rawHeaders, query, body, raw } = request; if (request.url.indexOf('/rest/invoke/') < 0) throw new Error( - 'Unsupported URL, should be /rest/invoke/:callgentId/:endpoint/*', + 'Unsupported URL, should be /rest/invoke/:callgentId/:entry/*', ); let idx = request.url.indexOf('/rest/invoke/'); idx = request.url.indexOf('/', idx + 13); @@ -213,7 +213,7 @@ export class RestAPIAdaptor extends EndpointAdaptor { async invoke( fun: CallgentFunctionDto, args: object, - sep: EndpointDto, + sep: EntryDto, reqEvent: ClientRequestEvent, ) { const resp = await axios.request({ diff --git a/src/endpoints/adaptors/builtin/restapi/restapi.controller.ts b/src/entries/adaptors/builtin/restapi/restapi.controller.ts similarity index 88% rename from src/endpoints/adaptors/builtin/restapi/restapi.controller.ts rename to src/entries/adaptors/builtin/restapi/restapi.controller.ts index 12a915a..139399f 100644 --- a/src/endpoints/adaptors/builtin/restapi/restapi.controller.ts +++ b/src/entries/adaptors/builtin/restapi/restapi.controller.ts @@ -20,13 +20,13 @@ import { ApiTags, ApiUnauthorizedResponse, } from '@nestjs/swagger'; -import { EndpointType } from '@prisma/client'; +import { EntryType } from '@prisma/client'; import { IsNotEmpty, IsString } from 'class-validator'; import { CallgentsService } from '../../../../callgents/callgents.service'; import { EventListenersService } from '../../../../event-listeners/event-listeners.service'; import { JwtGuard } from '../../../../infra/auth/jwt/jwt.guard'; import { Utils } from '../../../../infra/libs/utils'; -import { EndpointsService } from '../../../endpoints.service'; +import { EntriesService } from '../../../entries.service'; import { ClientRequestEvent } from '../../../events/client-request.event'; export class Requirement { @@ -41,15 +41,15 @@ export class Requirement { requirement: string; } -/** global rest-api endpoint entry */ -@ApiTags('Client Endpoint: Rest-API') +/** global rest-api entry entry */ +@ApiTags('Client Entry: Rest-API') @UseGuards(new JwtGuard(true)) @Controller('rest') export class RestApiController { constructor( protected readonly callgentsService: CallgentsService, - @Inject('EndpointsService') - protected readonly endpointsService: EndpointsService, + @Inject('EntriesService') + protected readonly entriesService: EntriesService, protected readonly eventListenersService: EventListenersService, ) {} @@ -70,16 +70,16 @@ export class RestApiController { description: 'Callgent id', }) @ApiParam({ - name: 'endpointId', + name: 'entryId', required: false, description: - 'Client endpoint id, mey empty: "/rest/invoke/:callgent-id`//`.."', + 'Client entry id, mey empty: "/rest/invoke/:callgent-id`//`.."', }) @ApiParam({ name: 'NOTE: swagger does not support wildcard param. Just document here', required: false, description: - 'rest/invoke/:callgentId/:endpointId/`resource-path-here`. the wildcard path, may be empty', + 'rest/invoke/:callgentId/:entryId/`resource-path-here`. the wildcard path, may be empty', }) @ApiHeader({ name: 'x-callgent-taskId', required: false }) @ApiHeader({ @@ -89,35 +89,35 @@ export class RestApiController { }) @ApiHeader({ name: 'x-callgent-callback', required: false }) @ApiHeader({ name: 'x-callgent-timeout', required: false }) - @All('invoke/:callgentId/:endpointId/*') + @All('invoke/:callgentId/:entryId/*') @ApiOperation({ summary: 'To invoke the specific functional endpoint.' }) @ApiUnauthorizedResponse() async invoke( @Req() req, @Res() res, @Param('callgentId') callgentId: string, - @Param('endpointId') endpointId?: string, + @Param('entryId') entryId?: string, @Headers('x-callgent-taskId') taskId?: string, @Headers('x-callgent-progressive') progressive?: string, @Headers('x-callgent-callback') callback?: string, @Headers('x-callgent-timeout') timeout?: string, ) { - const basePath = `invoke/${callgentId}/${endpointId}/`; + const basePath = `invoke/${callgentId}/${entryId}/`; let funName = req.url.substr(req.url.indexOf(basePath) + basePath.length); if (funName) funName = Utils.formalApiName(req.method, '/' + funName); const callerId = req.user?.sub; // || req.ip || req.socket.remoteAddress; // TODO owner defaults to caller callgent // find callgent cep, then set tenantPk - const cep = await this.endpointsService.$findFirstByType( - EndpointType.CLIENT, + const cep = await this.entriesService.$findFirstByType( + EntryType.CLIENT, callgentId, 'restAPI', - endpointId, + entryId, ); if (!cep) throw new NotFoundException( - 'restAPI endpoint not found for callgent: ' + callgentId, + 'restAPI entry not found for callgent: ' + callgentId, ); const callgent = await this.callgentsService.findOne(callgentId, { name: true, diff --git a/src/endpoints/adaptors/builtin/web/webpage.adaptor.ts b/src/entries/adaptors/builtin/web/webpage.adaptor.ts similarity index 79% rename from src/endpoints/adaptors/builtin/web/webpage.adaptor.ts rename to src/entries/adaptors/builtin/web/webpage.adaptor.ts index 684bdcd..1397b89 100644 --- a/src/endpoints/adaptors/builtin/web/webpage.adaptor.ts +++ b/src/entries/adaptors/builtin/web/webpage.adaptor.ts @@ -1,23 +1,23 @@ import { Inject, NotImplementedException } from '@nestjs/common'; import { AgentsService } from '../../../../agents/agents.service'; import { CallgentFunctionDto } from '../../../../callgent-functions/dto/callgent-function.dto'; -import { EndpointDto } from '../../../dto/endpoint.dto'; -import { Endpoint } from '../../../entities/endpoint.entity'; +import { EntryDto } from '../../../dto/entry.dto'; +import { Entry } from '../../../entities/entry.entity'; import { ClientRequestEvent } from '../../../events/client-request.event'; -import { EndpointAdaptor, EndpointConfig } from '../../endpoint-adaptor.base'; -import { EndpointAdaptorName } from '../../endpoint-adaptor.decorator'; +import { EntryAdaptor, EntryConfig } from '../../entry-adaptor.base'; +import { EntryAdaptorName } from '../../entry-adaptor.decorator'; -@EndpointAdaptorName('webpage', 'client') -export class WebpageAdaptor extends EndpointAdaptor { +@EntryAdaptorName('webpage', 'client') +export class WebpageAdaptor extends EntryAdaptor { constructor(@Inject('AgentsService') readonly agentsService: AgentsService) { super(agentsService); } - getCallback(callback: string, reqEndpoint?: EndpointDto): Promise { + getCallback(callback: string, reqEntry?: EntryDto): Promise { throw new NotImplementedException('Method not implemented.'); } - getConfig(): EndpointConfig { + getConfig(): EntryConfig { return { host: { address: { type: 'url', name: 'Page URL' } }, server: { @@ -63,21 +63,21 @@ export class WebpageAdaptor extends EndpointAdaptor { }; } - /** generate a web page endpoint */ - initClient(params: object, endpoint: EndpointDto): Promise { + /** generate a web page entry */ + initClient(params: object, entry: EntryDto): Promise { throw new NotImplementedException('Method not implemented.'); } /** generate operation script based on the Chrome plugin */ - initServer(initParams: object, endpoint: EndpointDto): Promise { + initServer(initParams: object, entry: EntryDto): Promise { // - scrape the web page - const url = endpoint.host['Page URL']; + const url = entry.host['Page URL']; // - script to operate the page // auth handler throw new NotImplementedException('Method not implemented.'); } - async preprocess(reqEvent: ClientRequestEvent, endpoint: EndpointDto) { + async preprocess(reqEvent: ClientRequestEvent, entry: EntryDto) { // } @@ -96,7 +96,7 @@ export class WebpageAdaptor extends EndpointAdaptor { async invoke( fun: CallgentFunctionDto, args: object, - sep: Endpoint, + sep: Entry, reqEvent: ClientRequestEvent, ): Promise<{ data: ClientRequestEvent; resumeFunName?: string }> { throw new NotImplementedException('Method not implemented.'); diff --git a/src/endpoints/adaptors/endpoint-adaptor.base.ts b/src/entries/adaptors/entry-adaptor.base.ts similarity index 82% rename from src/endpoints/adaptors/endpoint-adaptor.base.ts rename to src/entries/adaptors/entry-adaptor.base.ts index ca48f65..c9c0b5f 100644 --- a/src/endpoints/adaptors/endpoint-adaptor.base.ts +++ b/src/entries/adaptors/entry-adaptor.base.ts @@ -10,10 +10,10 @@ import { Prisma } from '@prisma/client'; import yaml from 'yaml'; import { AgentsService } from '../../agents/agents.service'; import { CallgentFunctionDto } from '../../callgent-functions/dto/callgent-function.dto'; -import { EndpointDto } from '../dto/endpoint.dto'; +import { EntryDto } from '../dto/entry.dto'; import { ClientRequestEvent } from '../events/client-request.event'; -export abstract class EndpointAdaptor { +export abstract class EntryAdaptor { protected readonly agentsService: AgentsService; constructor(agentsService: AgentsService) { this.agentsService = agentsService; @@ -22,7 +22,7 @@ export abstract class EndpointAdaptor { /** preprocess request, replace raw request */ abstract preprocess( reqEvent: ClientRequestEvent, - endpoint: EndpointDto, + entry: EntryDto, ): Promise; /** postprocess response */ @@ -31,26 +31,17 @@ export abstract class EndpointAdaptor { fun: CallgentFunctionDto, ): Promise; - /** Endpoint config. */ - abstract getConfig(): EndpointConfig; + /** Entry config. */ + abstract getConfig(): EntryConfig; - /** init the endpoint. result in generated content */ - abstract initClient( - initParams: object, - endpoint: EndpointDto, - ): Promise; - abstract initServer( - initParams: object, - endpoint: EndpointDto, - ): Promise; + /** init the entry. result in generated content */ + abstract initClient(initParams: object, entry: EntryDto): Promise; + abstract initServer(initParams: object, entry: EntryDto): Promise; /** please declare hints in api-doc */ abstract readData(name: string, hints?: { [key: string]: any }): Promise; /** get callback param */ - abstract getCallback( - callback: string, - reqEndpoint?: EndpointDto, - ): Promise; + abstract getCallback(callback: string, reqEntry?: EntryDto): Promise; /** send response back to client */ abstract callback(resp: any): Promise; @@ -153,7 +144,7 @@ export abstract class EndpointAdaptor { abstract invoke( fun: CallgentFunctionDto, args: object, - sep: EndpointDto, + sep: EntryDto, reqEvent: ClientRequestEvent, ): Promise; } @@ -178,7 +169,7 @@ export class ApiSpec { securities?: SecurityRequirementObject[]; } -export class EndpointParam { +export class EntryParam { @ApiProperty({ description: 'param type. `readonly` shows some instructions in markdown format', @@ -224,7 +215,7 @@ export class EndpointParam { @ApiProperty() optional?: boolean; @ApiProperty({ description: 'Default value, or select options' }) - value?: any | { [key: string]: EndpointParam[] }; + value?: any | { [key: string]: EntryParam[] }; @ApiProperty() constraint?: string; @ApiProperty() @@ -233,12 +224,12 @@ export class EndpointParam { // hidden?: boolean | (form: object) => boolean; } -class EndpointHost { +class EntryHost { @ApiProperty({ description: 'host address', example: 'task+sdfhjw4349fe@my.callgent.com', }) - address: EndpointParam; + address: EntryParam; @ApiProperty({ description: 'default auth type', @@ -247,29 +238,29 @@ class EndpointHost { authType?: 'NONE' | 'APP' | 'USER'; @ApiProperty({ description: 'Authentication Configuration' }) - authConfig?: EndpointParam[]; + authConfig?: EntryParam[]; } -class Endpoint { +class Entry { @ApiProperty({ - description: 'Optional endpoint host config', + description: 'Optional entry host config', }) - host?: EndpointHost; - @ApiProperty({ description: 'Endpoint requesting params template' }) - params?: EndpointParam[]; + host?: EntryHost; + @ApiProperty({ description: 'Entry requesting params template' }) + params?: EntryParam[]; @ApiProperty({ description: 'Whether allow additional params' }) addParams?: boolean; - @ApiProperty({ description: 'Endpoint initialization params template' }) - initParams?: EndpointParam[]; + @ApiProperty({ description: 'Entry initialization params template' }) + initParams?: EntryParam[]; } -export class EndpointConfig { - @ApiProperty({ description: 'Endpoint host' }) - host?: EndpointHost; +export class EntryConfig { + @ApiProperty({ description: 'Entry host' }) + host?: EntryHost; - @ApiProperty({ description: 'The task client endpoint' }) - client?: Endpoint; + @ApiProperty({ description: 'The task client entry' }) + client?: Entry; - @ApiProperty({ description: 'The task server endpoint' }) - server?: Endpoint; + @ApiProperty({ description: 'The task server entry' }) + server?: Entry; } diff --git a/src/endpoints/adaptors/endpoint-adaptor.decorator.ts b/src/entries/adaptors/entry-adaptor.decorator.ts similarity index 60% rename from src/endpoints/adaptors/endpoint-adaptor.decorator.ts rename to src/entries/adaptors/entry-adaptor.decorator.ts index 18dd239..c36da99 100644 --- a/src/endpoints/adaptors/endpoint-adaptor.decorator.ts +++ b/src/entries/adaptors/entry-adaptor.decorator.ts @@ -1,7 +1,7 @@ import { SetMetadata } from '@nestjs/common'; -export const IS_CALLGENT_ENDPOINT_ADAPTOR = 'isCallgentEndpointAdaptor'; -export const EndpointAdaptorName = ( +export const IS_CALLGENT_ENDPOINT_ADAPTOR = 'isCallgentEntryAdaptor'; +export const EntryAdaptorName = ( name: string, type: 'client' | 'server' | 'both', ) => SetMetadata(IS_CALLGENT_ENDPOINT_ADAPTOR, `${name}:${type}`); diff --git a/src/endpoints/endpoints.controller.spec.ts b/src/entries/entries.controller.spec.ts similarity index 50% rename from src/endpoints/endpoints.controller.spec.ts rename to src/entries/entries.controller.spec.ts index c95ca05..aad7468 100644 --- a/src/endpoints/endpoints.controller.spec.ts +++ b/src/entries/entries.controller.spec.ts @@ -1,15 +1,15 @@ import { Test, TestingModule } from '@nestjs/testing'; -import { EndpointsController } from './endpoints.controller'; +import { EntriesController } from '../entries/entries.controller'; -describe('EndpointsController', () => { - let controller: EndpointsController; +describe('EntriesController', () => { + let controller: EntriesController; beforeEach(async () => { const module: TestingModule = await Test.createTestingModule({ - controllers: [EndpointsController], + controllers: [EntriesController], }).compile(); - controller = module.get(EndpointsController); + controller = module.get(EntriesController); }); it('should be defined', () => { diff --git a/src/entries/entries.controller.ts b/src/entries/entries.controller.ts new file mode 100644 index 0000000..474215a --- /dev/null +++ b/src/entries/entries.controller.ts @@ -0,0 +1,131 @@ +import { + Body, + Controller, + Delete, + Get, + Inject, + Param, + Post, + Put, + Query, + Req, + UseGuards, +} from '@nestjs/common'; +import { + ApiCreatedResponse, + ApiExtraModels, + ApiOkResponse, + ApiSecurity, + ApiTags, + getSchemaPath, +} from '@nestjs/swagger'; +import { JwtGuard } from '../infra/auth/jwt/jwt.guard'; +import { RestApiResponse } from '../restapi/response.interface'; +import { CreateEntryDto } from './dto/create-entry.dto'; +import { EntryDto } from './dto/entry.dto'; +import { UpdateEntryDto } from './dto/update-entry.dto'; +import { EntriesService } from './entries.service'; + +@ApiTags('Entries') +@ApiSecurity('defaultBearerAuth') +@ApiExtraModels(EntryDto) +@UseGuards(JwtGuard) +@Controller('entries') +export class EntriesController { + constructor( + @Inject('EntriesService') + private readonly entriesService: EntriesService, + ) {} + + @Get('adaptors') + listAdaptors(@Query('client') client?: boolean) { + return this.entriesService.list(client); + } + + // @ApiOkResponse({ type: EntryConfig }) + // @Get(':endpointType/config') + // getConfig(@Param('endpointType') endpointType: EntryType) { + // return this.entriesService.getAdaptor(endpointType); + // if (!adaptor) + // throw new NotFoundException('No entry found with key:', endpointType); + // return adaptor.getConfig(); + // } + + @ApiCreatedResponse({ + schema: { + anyOf: [ + { $ref: getSchemaPath(RestApiResponse) }, + { properties: { data: { $ref: getSchemaPath(EntryDto) } } }, + ], + }, + }) + @Post(':adaptorKey/create') + async createEntry( + @Req() req, + @Param('adaptorKey') adaptorKey: string, + @Body() dto: CreateEntryDto, + ) { + return { + data: await this.entriesService.create({ + ...dto, + adaptorKey, + createdBy: req.user.sub, + }), + }; + } + + @ApiOkResponse({ + schema: { + anyOf: [ + { $ref: getSchemaPath(RestApiResponse) }, + { properties: { data: { $ref: getSchemaPath(EntryDto) } } }, + ], + }, + }) + @Put(':id') + async updateEntry(@Param('id') id: string, @Body() dto: UpdateEntryDto) { + return { + data: await this.entriesService.update(id, dto), + }; + } + + /** for auth type `APP`, userKey is ignored */ + // @Put('auth') + // async upsertEntryAuth(@Req() req, @Body() dto: CreateEntryAuthDto) { + // const entry = EntityIdExists.entity(dto, 'entry'); + // return { + // data: await this.entriesService.upsertEntryAuth( + // { ...dto, createdBy: req.user.sub }, + // entry, + // ), + // }; + // } + + @Post(':id/init') + initEntry(@Param('id') id: string, @Body() initParams: object) { + this.entriesService.init(id, initParams); + } + + /** manual test entry */ + @Post(':id/test') + testEntry(@Param('id') id: string, @Body() any: any) { + // + } + + @ApiOkResponse({ + schema: { + anyOf: [ + { $ref: getSchemaPath(RestApiResponse) }, + { + properties: { + data: { $ref: getSchemaPath(EntryDto) }, + }, + }, + ], + }, + }) + @Delete('/:id') + async remove(@Param('id') id: string) { + return { data: await this.entriesService.delete(id) }; + } +} diff --git a/src/endpoints/endpoints.module.ts b/src/entries/entries.module.ts similarity index 62% rename from src/endpoints/endpoints.module.ts rename to src/entries/entries.module.ts index 7478305..08b2d44 100644 --- a/src/endpoints/endpoints.module.ts +++ b/src/entries/entries.module.ts @@ -4,29 +4,29 @@ import { EmailAdaptor } from './adaptors/builtin/email/email.adaptor'; import { RestAPIAdaptor } from './adaptors/builtin/restapi/restapi.adaptor'; import { RestApiController } from './adaptors/builtin/restapi/restapi.controller'; import { WebpageAdaptor } from './adaptors/builtin/web/webpage.adaptor'; -import { EndpointsController } from './endpoints.controller'; -import { EndpointsService } from './endpoints.service'; +import { EntriesController } from './entries.controller'; +import { EntriesService } from './entries.service'; import { CallgentCreatedListener } from './listeners/callgent-created.listener'; @Module({ imports: [CallgentsModule], providers: [ - { provide: 'EndpointsService', useClass: EndpointsService }, + { provide: 'EntriesService', useClass: EntriesService }, CallgentCreatedListener, { - provide: 'restAPI-EndpointAdaptor', + provide: 'restAPI-EntryAdaptor', useClass: RestAPIAdaptor, }, { - provide: 'Webpage-EndpointAdaptor', + provide: 'Webpage-EntryAdaptor', useClass: WebpageAdaptor, }, { - provide: 'Email-EndpointAdaptor', + provide: 'Email-EntryAdaptor', useClass: EmailAdaptor, }, ], - controllers: [EndpointsController, RestApiController], - exports: ['EndpointsService'], + controllers: [EntriesController, RestApiController], + exports: ['EntriesService'], }) -export class EndpointsModule {} +export class EntriesModule {} diff --git a/src/endpoints/endpoints.service.spec.ts b/src/entries/entries.service.spec.ts similarity index 53% rename from src/endpoints/endpoints.service.spec.ts rename to src/entries/entries.service.spec.ts index 112ad54..56f65db 100644 --- a/src/endpoints/endpoints.service.spec.ts +++ b/src/entries/entries.service.spec.ts @@ -1,15 +1,15 @@ import { Test, TestingModule } from '@nestjs/testing'; -import { EndpointsService } from './endpoints.service'; +import { EntriesService } from './Entries.service'; -describe('EndpointsService', () => { - let service: EndpointsService; +describe('EntriesService', () => { + let service: EntriesService; beforeEach(async () => { const module: TestingModule = await Test.createTestingModule({ - providers: [EndpointsService], + providers: [EntriesService], }).compile(); - service = module.get(EndpointsService); + service = module.get(EntriesService); }); it('should be defined', () => { diff --git a/src/endpoints/endpoints.service.ts b/src/entries/entries.service.ts similarity index 72% rename from src/endpoints/endpoints.service.ts rename to src/entries/entries.service.ts index b7544a6..ac3a0cc 100644 --- a/src/endpoints/endpoints.service.ts +++ b/src/entries/entries.service.ts @@ -12,20 +12,20 @@ import { NotFoundException, } from '@nestjs/common'; import { ModuleRef, ModulesContainer } from '@nestjs/core'; -import { EndpointType, Prisma, PrismaClient } from '@prisma/client'; +import { EntryType, Prisma, PrismaClient } from '@prisma/client'; import { CallgentFunctionDto } from '../callgent-functions/dto/callgent-function.dto'; import { RealmSecurityVO } from '../callgent-realms/dto/realm-security.vo'; import { Utils } from '../infra/libs/utils'; import { selectHelper } from '../infra/repo/select.helper'; import { PrismaTenancyService } from '../infra/repo/tenancy/prisma-tenancy.service'; -import { EndpointAdaptor } from './adaptors/endpoint-adaptor.base'; -import { IS_CALLGENT_ENDPOINT_ADAPTOR } from './adaptors/endpoint-adaptor.decorator'; -import { EndpointDto } from './dto/endpoint.dto'; -import { UpdateEndpointDto } from './dto/update-endpoint.dto'; +import { EntryAdaptor } from './adaptors/entry-adaptor.base'; +import { IS_CALLGENT_ENDPOINT_ADAPTOR } from './adaptors/entry-adaptor.decorator'; +import { EntryDto } from './dto/entry.dto'; +import { UpdateEntryDto } from './dto/update-entry.dto'; import { ClientRequestEvent } from './events/client-request.event'; @Injectable() -export class EndpointsService { +export class EntriesService { constructor( private readonly moduleRef: ModuleRef, @Inject(ModulesContainer) @@ -33,7 +33,7 @@ export class EndpointsService { private readonly txHost: TransactionHost, private readonly tenancyService: PrismaTenancyService, ) {} - protected readonly defSelect: Prisma.EndpointSelect = { + protected readonly defSelect: Prisma.EntrySelect = { pk: false, tenantPk: false, createdBy: false, @@ -73,7 +73,7 @@ export class EndpointsService { const list = client ? this.clientAdaptorsList : this.serverAdaptorsList; if (key in list) throw new Error( - `Conflict endpoint adaptor key ${key}:[${String(adaptorKey)}, ${ + `Conflict entry adaptor key ${key}:[${String(adaptorKey)}, ${ list[key] }]`, ); @@ -86,24 +86,24 @@ export class EndpointsService { ); } - findOne(id: string, select?: Prisma.EndpointSelect) { + findOne(id: string, select?: Prisma.EntrySelect) { const prisma = this.txHost.tx as PrismaClient; return selectHelper( select, - (select) => prisma.endpoint.findUnique({ select, where: { id } }), + (select) => prisma.entry.findUnique({ select, where: { id } }), this.defSelect, ); } findFirstByType( - type: EndpointType, + type: EntryType, callgentId: string, adaptorKey: string, id?: string, ) { id || (id = undefined); const prisma = this.txHost.tx as PrismaClient; - return prisma.endpoint.findFirst({ + return prisma.entry.findFirst({ where: { callgentId, adaptorKey, type, id }, orderBy: { priority: 'desc' }, }); @@ -112,14 +112,14 @@ export class EndpointsService { /** bypassTenancy before query, setTenantId after query */ @Transactional() async $findFirstByType( - type: EndpointType, + type: EntryType, callgentId: string, adaptorKey: string, - endpointId?: string, + entryId?: string, ) { const prisma = this.txHost.tx as PrismaClient; return this.tenancyService.bypassTenancy(prisma).then(() => - this.findFirstByType(type, callgentId, adaptorKey, endpointId).then( + this.findFirstByType(type, callgentId, adaptorKey, entryId).then( async (v) => { v && this.tenancyService.setTenantId(v.tenantPk); await this.tenancyService.bypassTenancy(prisma, false); @@ -135,15 +135,15 @@ export class EndpointsService { where, orderBy = { pk: 'desc' }, }: { - select?: Prisma.EndpointSelect; - where?: Prisma.EndpointWhereInput; - orderBy?: Prisma.EndpointOrderByWithRelationInput; + select?: Prisma.EntrySelect; + where?: Prisma.EntryWhereInput; + orderBy?: Prisma.EntryOrderByWithRelationInput; }) { const prisma = this.txHost.tx as PrismaClient; return selectHelper( select, (select) => - prisma.endpoint.findMany({ + prisma.entry.findMany({ where, select, orderBy, @@ -152,7 +152,7 @@ export class EndpointsService { ); } - getAdaptor(adaptorKey: string, endpointType?: EndpointType): EndpointAdaptor { + getAdaptor(adaptorKey: string, endpointType?: EntryType): EntryAdaptor { const list = endpointType == 'SERVER' ? this.serverAdaptorsList @@ -168,14 +168,14 @@ export class EndpointsService { @Transactional() async create( - dto: Omit, - select?: Prisma.EndpointSelect, + dto: Omit, + select?: Prisma.EntrySelect, ) { const prisma = this.txHost.tx as PrismaClient; const service = this.getAdaptor(dto.adaptorKey, dto.type); if (!service) throw new BadRequestException( - 'Invalid endpoint adaptor key=' + dto.adaptorKey, + 'Invalid entry adaptor key=' + dto.adaptorKey, ); const id = Utils.uuid(); @@ -186,7 +186,7 @@ export class EndpointsService { return selectHelper( select, (select) => - prisma.endpoint.create({ + prisma.entry.create({ select, data: { ...dto, id }, }), @@ -195,10 +195,10 @@ export class EndpointsService { } @Transactional() - update(id: string, dto: UpdateEndpointDto) { + update(id: string, dto: UpdateEntryDto) { const prisma = this.txHost.tx as PrismaClient; return selectHelper(this.defSelect, (select) => - prisma.endpoint.update({ select, where: { id }, data: dto }), + prisma.entry.update({ select, where: { id }, data: dto }), ); } @@ -206,35 +206,35 @@ export class EndpointsService { delete(id: string) { const prisma = this.txHost.tx as PrismaClient; return selectHelper(this.defSelect, (select) => - prisma.endpoint.delete({ select, where: { id } }), + prisma.entry.delete({ select, where: { id } }), ); } // @Transactional() - // upsertEndpointAuth( - // dto: Prisma.EndpointAuthUncheckedCreateInput, - // endpoint: EndpointDto, + // upsertEntryAuth( + // dto: Prisma.EntryAuthUncheckedCreateInput, + // entry: EntryDto, // ) { - // if (!endpoint) throw new BadRequestException('endpoint not found'); - // if (endpoint.authType == 'NONE') + // if (!entry) throw new BadRequestException('entry not found'); + // if (entry.authType == 'NONE') // throw new BadRequestException("auth type `NONE` needn't be set"); - // else if (endpoint.authType == 'USER') { + // else if (entry.authType == 'USER') { // if (!dto.userKey) // throw new BadRequestException( // '`userKey` is required for auth type `USER`', // ); - // } else if (endpoint.authType == 'APP') dto.userKey = ''; + // } else if (entry.authType == 'APP') dto.userKey = ''; // // else - // // throw new BadRequestException('Invalid auth type: ' + endpoint.authType); - // dto.endpointId = endpoint.id; + // // throw new BadRequestException('Invalid auth type: ' + entry.authType); + // dto.entryId = entry.id; // const prisma = this.txHost.tx as PrismaClient; - // return selectHelper(this.defSelect as Prisma.EndpointAuthSelect, (select) => + // return selectHelper(this.defSelect as Prisma.EntryAuthSelect, (select) => // prisma.endpointAuth.upsert({ // select, // where: { // endpointId_userKey: { - // endpointId: dto.endpointId, + // entryId: dto.entryId, // userKey: dto.userKey, // }, // }, @@ -249,16 +249,16 @@ export class EndpointsService { return; const prisma = this.txHost.tx as PrismaClient; - const endpoint = await this.findOne(id); - if (endpoint) { - const adaptor = this.getAdaptor(endpoint.adaptorKey, endpoint.type); + const entry = await this.findOne(id); + if (entry) { + const adaptor = this.getAdaptor(entry.adaptorKey, entry.type); if (adaptor) { // FIXME issue client token - // const content = await (endpoint.type == 'SERVER' + // const content = await (entry.type == 'SERVER' // ? adaptor.initSender - // : adaptor.initReceiver)(initParams, endpoint as any); + // : adaptor.initReceiver)(initParams, entry as any); // if (content) - // prisma.endpoint.update({ + // prisma.entry.update({ // where: { id }, // data: { content }, // }); @@ -266,10 +266,10 @@ export class EndpointsService { return; } throw new NotFoundException( - `Invalid endpoint adaptor, adaptorKey=${endpoint.adaptorKey}`, + `Invalid entry adaptor, adaptorKey=${entry.adaptorKey}`, ); } - throw new NotFoundException(`Endpoint not found, id=${id}`); + throw new NotFoundException(`Entry not found, id=${id}`); } /** @@ -277,12 +277,12 @@ export class EndpointsService { * @see https://github.com/OAI/OpenAPI-Specification/blob/main/schemas/v3.0/schema.json */ async parseApis( - endpoint: EndpointDto, + entry: EntryDto, apiTxt: { text: string; format?: 'json' | 'yaml' | 'text' }, ) { - const adaptor = this.getAdaptor(endpoint.adaptorKey, endpoint.type); - // TODO read endpoint.components - return adaptor.parseApis(apiTxt); //, endpoint.components); + const adaptor = this.getAdaptor(entry.adaptorKey, entry.type); + // TODO read entry.components + return adaptor.parseApis(apiTxt); //, entry.components); } /** preprocess req from cep, by adaptor */ @@ -290,15 +290,15 @@ export class EndpointsService { async preprocessClientRequest( reqEvent: ClientRequestEvent, ): Promise { - const adaptor = this.getAdaptor(reqEvent.dataType, EndpointType.CLIENT); + const adaptor = this.getAdaptor(reqEvent.dataType, EntryType.CLIENT); if (!adaptor) throw new Error( `Invalid adaptor ${reqEvent.dataType} from cep ${reqEvent.srcId}`, ); - const endpoint = await this.findOne(reqEvent.srcId); + const entry = await this.findOne(reqEvent.srcId); - await adaptor.preprocess(reqEvent, endpoint as any); + await adaptor.preprocess(reqEvent, entry as any); } @Transactional() @@ -308,7 +308,7 @@ export class EndpointsService { throw new Error('Failed to invoke, No mapping function found'); const func = functions[0] as CallgentFunctionDto; - const sep = await this.findOne(func.endpointId, { + const sep = await this.findOne(func.entryId, { id: true, name: true, type: true, @@ -319,7 +319,7 @@ export class EndpointsService { callgentId: true, callgent: { select: { id: true, name: true } }, }); - const adapter = sep && this.getAdaptor(sep.adaptorKey, EndpointType.SERVER); + const adapter = sep && this.getAdaptor(sep.adaptorKey, EntryType.SERVER); if (!adapter) throw new Error('Failed to invoke, No SEP adaptor found'); // may returns pending result @@ -341,7 +341,7 @@ export class EndpointsService { throw new Error('Failed to invoke, No mapping function found'); const func = functions[0] as CallgentFunctionDto; - const sep = await this.findOne(func.endpointId, { + const sep = await this.findOne(func.entryId, { id: true, name: true, type: true, @@ -352,7 +352,7 @@ export class EndpointsService { callgentId: true, callgent: { select: { id: true, name: true } }, }); - const adapter = sep && this.getAdaptor(sep.adaptorKey, EndpointType.SERVER); + const adapter = sep && this.getAdaptor(sep.adaptorKey, EntryType.SERVER); if (!adapter) throw new Error('Failed to invoke, No SEP adaptor found'); await adapter.postprocess(reqEvent, func); @@ -362,7 +362,7 @@ export class EndpointsService { @Transactional() async updateSecurities(id: string, securities: RealmSecurityVO[]) { const prisma = this.txHost.tx as PrismaClient; - return prisma.endpoint.update({ + return prisma.entry.update({ where: { id }, data: { securities: securities as any }, }); diff --git a/src/endpoints/events/client-request.event.ts b/src/entries/events/client-request.event.ts similarity index 86% rename from src/endpoints/events/client-request.event.ts rename to src/entries/events/client-request.event.ts index abff3a1..4da315b 100644 --- a/src/endpoints/events/client-request.event.ts +++ b/src/entries/events/client-request.event.ts @@ -1,8 +1,7 @@ -import { JsonValue } from '@prisma/client/runtime/library'; import { EventObject } from '../../event-listeners/event-object'; /** - * event from client endpoint, processing: + * event from client entry, processing: * 1. adaptor preprocessing * 2. create task action * 3. function mapping @@ -11,7 +10,7 @@ import { EventObject } from '../../event-listeners/event-object'; */ export class ClientRequestEvent extends EventObject { constructor( - /** client endpoint id */ + /** client entry id */ cepId: string, /** empty to create new task */ taskId: string, diff --git a/src/endpoints/listeners/callgent-created.listener.ts b/src/entries/listeners/callgent-created.listener.ts similarity index 70% rename from src/endpoints/listeners/callgent-created.listener.ts rename to src/entries/listeners/callgent-created.listener.ts index 703dd72..450aded 100644 --- a/src/endpoints/listeners/callgent-created.listener.ts +++ b/src/entries/listeners/callgent-created.listener.ts @@ -2,19 +2,19 @@ import { Transactional } from '@nestjs-cls/transactional'; import { Inject, Injectable, Logger } from '@nestjs/common'; import { OnEvent } from '@nestjs/event-emitter'; import { CallgentCreatedEvent } from '../../callgents/events/callgent-created.event'; -import { EndpointsService } from '../endpoints.service'; +import { EntriesService } from '../entries.service'; import { EmailRelayKey, EmailsService } from '../../emails/emails.service'; @Injectable() export class CallgentCreatedListener { private readonly logger = new Logger(CallgentCreatedListener.name); constructor( - @Inject('EndpointsService') - private readonly endpointsService: EndpointsService, + @Inject('EntriesService') + private readonly entriesService: EntriesService, private readonly emailsService: EmailsService, ) {} - /** create a callgent with default api client endpoint, and Email client/server endpoint */ + /** create a callgent with default api client entry, and Email client/server entry */ @Transactional() @OnEvent(CallgentCreatedEvent.eventName, { async: false }) async handleEvent(event: CallgentCreatedEvent) { @@ -23,10 +23,10 @@ export class CallgentCreatedListener { const callgent = event.callgent; if (callgent.forkedPk) return; // forked callgent - // add default endpoints + // add default entries const results = await Promise.all([ - // API client endpoint - this.endpointsService + // API client entry + this.entriesService .create({ callgentId: callgent.id, type: 'CLIENT', @@ -34,16 +34,16 @@ export class CallgentCreatedListener { host: `/api/rest/invoke/${callgent.id}/{id}/`, createdBy: callgent.createdBy, }) - .then((endpoint) => { + .then((entry) => { // no await init, it may be slow, init must restart a new tx - this.endpointsService.init(endpoint.id, []); - return endpoint; + this.entriesService.init(entry.id, []); + return entry; }), - // TODO API event endpoint + // TODO API event entry - // Email client endpoint - this.endpointsService + // Email client entry + this.entriesService .create({ callgentId: callgent.id, type: 'CLIENT', @@ -54,10 +54,10 @@ export class CallgentCreatedListener { ), createdBy: callgent.createdBy, }) - .then((endpoint) => { + .then((entry) => { // no await init, it may be slow - this.endpointsService.init(endpoint.id, []); - return endpoint; + this.entriesService.init(entry.id, []); + return entry; }), ]); diff --git a/src/infra/repo/prisma.middlewares.ts b/src/infra/repo/prisma.middlewares.ts index fc32628..588ee36 100644 --- a/src/infra/repo/prisma.middlewares.ts +++ b/src/infra/repo/prisma.middlewares.ts @@ -41,7 +41,7 @@ export const mainPrismaServiceOptions = ( // https://github.com/olivierwilkinson/prisma-soft-delete-middleware?tab=readme-ov-file#excluding-soft-deleted-records-in-a-findunique-operation Callgent: { ...deleteHandle, allowCompoundUniqueIndexWhere: true }, CallgentFunction: deleteHandle, - Endpoint: deleteHandle, + Entry: deleteHandle, Task: deleteHandle, TaskAction: deleteHandle, }, diff --git a/src/task-actions/task-actions.module.ts b/src/task-actions/task-actions.module.ts index 90dda99..1407c52 100644 --- a/src/task-actions/task-actions.module.ts +++ b/src/task-actions/task-actions.module.ts @@ -1,13 +1,18 @@ import { Module } from '@nestjs/common'; import { CallgentFunctionsModule } from '../callgent-functions/callgent-functions.module'; import { CallgentsModule } from '../callgents/callgents.module'; -import { EndpointsModule } from '../endpoints/endpoints.module'; +import { EntriesModule } from '../entries/entries.module'; import { TasksModule } from '../tasks/tasks.module'; import { TaskActionsService } from './task-actions.service'; @Module({ providers: [{ provide: 'TaskActionsService', useClass: TaskActionsService }], - imports: [CallgentsModule, EndpointsModule, CallgentFunctionsModule, TasksModule], + imports: [ + CallgentsModule, + EntriesModule, + CallgentFunctionsModule, + TasksModule, + ], exports: ['TaskActionsService'], }) export class TaskActionsModule {} diff --git a/src/task-actions/task-actions.service.ts b/src/task-actions/task-actions.service.ts index 7812591..5ab6706 100644 --- a/src/task-actions/task-actions.service.ts +++ b/src/task-actions/task-actions.service.ts @@ -1,15 +1,9 @@ -import { TransactionHost, Transactional } from '@nestjs-cls/transactional'; +import { TransactionHost } from '@nestjs-cls/transactional'; import { TransactionalAdapterPrisma } from '@nestjs-cls/transactional-adapter-prisma'; -import { - Injectable, - NotFoundException, - NotImplementedException, -} from '@nestjs/common'; -import { PrismaClient } from '@prisma/client'; +import { Injectable, NotImplementedException } from '@nestjs/common'; import { CallgentFunctionDto } from '../callgent-functions/dto/callgent-function.dto'; import { CallgentDto } from '../callgents/dto/callgent.dto'; -import { ClientRequestEvent } from '../endpoints/events/client-request.event'; -import { Utils } from '../infra/libs/utils'; +import { ClientRequestEvent } from '../entries/events/client-request.event'; import { TasksService } from '../tasks/tasks.service'; import { TaskActionDto } from './dto/task-action.dto'; @@ -57,7 +51,7 @@ export class TaskActionsService { async __createTaskAction(e: ClientRequestEvent) { // init task action - // const { taskAction, callgents, reqEndpoint, reqAdaptor } = + // const { taskAction, callgents, reqEntry, reqAdaptor } = // await this._$createTaskAction(e); // sync respond in time limit diff --git a/test/e2e/callgents.e2e-spec.ts b/test/e2e/callgents.e2e-spec.ts index cb5026c..ce3c107 100644 --- a/test/e2e/callgents.e2e-spec.ts +++ b/test/e2e/callgents.e2e-spec.ts @@ -15,7 +15,7 @@ describe('CallgentsController (e2e)', () => { afterEach(afterEachFn); const endpoint = '/api/callgents'; - + it(`${endpoint} (POST): create new callgent no auth, 401`, async () => { await createCallgent({}, false); }); diff --git a/test/e2e/endpoints.e2e-spec.ts b/test/e2e/entries.e2e-spec.ts similarity index 70% rename from test/e2e/endpoints.e2e-spec.ts rename to test/e2e/entries.e2e-spec.ts index 6b3778f..f5a57ce 100644 --- a/test/e2e/endpoints.e2e-spec.ts +++ b/test/e2e/entries.e2e-spec.ts @@ -1,7 +1,7 @@ import * as fs from 'node:fs/promises'; import * as pactum from 'pactum'; -import { CreateEndpointAuthDto } from '../../src/endpoint-auths/dto/create-endpoint-auth.dto'; -import { CreateEndpointDto } from '../../src/endpoints/dto/create-endpoint.dto'; +import { CreateEntryAuthDto } from '../../src/entry-auths/dto/create-entry-auth.dto'; +import { CreateEntryDto } from '../../src/entries/dto/create-entry.dto'; import { afterAllFn, afterEachFn, @@ -14,30 +14,30 @@ import { createCallgent } from './callgents.e2e-spec'; /** * - create a callgent, - * - choose webpage receiver endpoint, + * - choose webpage receiver entry, * - config entry, params * - config init params * - init & test response: success, progressive, failure * - confirm * - progressive request */ -describe('Callgent Endpoint (e2e)', () => { +describe('Callgent Entry (e2e)', () => { beforeAll(beforeAllFn); afterAll(afterAllFn); beforeEach(beforeEachFnTenanted); afterEach(afterEachFn); - it(`(POST): add a new canny.io rest-api server endpoint to invoke 400`, async () => { + it(`(POST): add a new canny.io rest-api server entry to invoke 400`, async () => { const callgent = await prepareCannyCallgent(); // request for task by callgent api await invokeCallgentByApi(callgent.id).expectStatus(400); }); - it(`(POST): add a new canny.io rest-api server endpoint to invoke 200`, async () => { + it(`(POST): add a new canny.io rest-api server entry to invoke 200`, async () => { const callgent = await prepareCannyCallgent(); - // mount server endpoint auth + // mount server entry auth // request for task by callgent api await invokeCallgentByApi(callgent.id).expectStatus(400); @@ -50,10 +50,10 @@ export const prepareCannyCallgent = async () => { json: { data: callgent }, } = await createCallgent(); - // add api server endpoint + // add api server entry const { - json: { data: serverEndpoint }, - } = await createEndpoint('restAPI', { + json: { data: serverEntry }, + } = await createEntry('restAPI', { callgentId: callgent.id, type: 'SERVER', host: 'https://canny.io/api/v1', @@ -64,32 +64,32 @@ export const prepareCannyCallgent = async () => { const { json: { data: functionCount }, } = await addCallgentFunctions({ - endpointId: serverEndpoint.id, + entryId: serverEntry.id, text: jsonData, format: 'openAPI', }); - console.log({ serverEndpoint, functionCount }); + console.log({ serverEntryunctionCount }); return callgent; }; -export const createEndpoint = ( +export const createEntry = ( adaptorKey: string, - endpointDto: CreateEndpointDto, + endpointDto: CreateEntryDto, ) => { return pactum .spec() - .post(`/api/endpoints/${adaptorKey}/create`) + .post(`/api/Entries/${adaptorKey}/create`) .withHeaders('x-callgent-authorization', TestConstant.authToken) .withBody(endpointDto) .expectStatus(201); }; -export const addEndpointAuth = (endpointAuthDto: CreateEndpointAuthDto) => { +export const addEntryAuth = (endpointAuthDto: CreateEntryAuthDto) => { return pactum .spec() - .put(`/api/endpoints/auth`) + .put(`/api/Entries/auth`) .withHeaders('x-callgent-authorization', TestConstant.authToken) .withBody(endpointAuthDto) .expectStatus(200); From 2febd122c472ac5b60612f7caedd3496bcf58dbc Mon Sep 17 00:00:00 2001 From: dev-callgent Date: Thu, 10 Oct 2024 08:53:19 +0800 Subject: [PATCH 094/183] refactor: rename callgent-function to endpoint Signed-off-by: dev-callgent --- .../migration.sql | 56 +++++++++++++++++++ prisma/schema.prisma | 10 ++-- prisma/seed.ts | 4 +- src/agents/agents.service.ts | 16 +++--- src/app.module.ts | 8 +-- .../bff-callgent-functions.controller.spec.ts | 18 ------ .../bff-callgent-functions.module.ts | 9 --- .../callgent-tree/callgent-tree.controller.ts | 8 +-- src/bff/callgent-tree/callgent-tree.module.ts | 4 +- .../bff-endpoints.controller.spec.ts | 18 ++++++ .../bff-endpoints.controller.ts} | 16 +++--- src/bff/endpoints/bff-endpoints.module.ts | 9 +++ .../callgent-functions.controller.spec.ts | 18 ------ .../callgent-functions.module.ts | 15 ----- .../callgent-functions.service.spec.ts | 18 ------ src/callgent-hub/callgent-hub.module.ts | 4 +- src/callgent-hub/callgent-hub.service.ts | 14 ++--- .../callgent-realms.controller.ts | 2 +- .../callgent-realms.service.ts | 20 +++---- src/callgents/callgents.service.ts | 2 +- src/endpoints/endpoints.controller.spec.ts | 18 ++++++ .../endpoints.controller.ts} | 49 +++++++--------- src/endpoints/endpoints.module.ts | 15 +++++ src/endpoints/endpoints.service.spec.ts | 18 ++++++ .../endpoints.service.ts} | 48 ++++++++-------- .../adaptors/builtin/email/email.adaptor.ts | 8 +-- .../builtin/restapi/restapi.adaptor.ts | 6 +- .../adaptors/builtin/web/webpage.adaptor.ts | 6 +- src/entries/adaptors/entry-adaptor.base.ts | 6 +- src/entries/entries.service.ts | 6 +- src/entries/events/client-request.event.ts | 2 +- src/infra/repo/prisma.middlewares.ts | 2 +- src/task-actions/task-actions.module.ts | 4 +- src/task-actions/task-actions.service.ts | 16 +++--- ...ions.e2e-spec.ts => endpoints.e2e-spec.ts} | 10 ++-- test/e2e/entries.e2e-spec.ts | 4 +- 36 files changed, 268 insertions(+), 219 deletions(-) create mode 100644 prisma/migrations/20241010003123_rename_fun_2_ep/migration.sql delete mode 100644 src/bff/callgent-functions/bff-callgent-functions.controller.spec.ts delete mode 100644 src/bff/callgent-functions/bff-callgent-functions.module.ts create mode 100644 src/bff/endpoints/bff-endpoints.controller.spec.ts rename src/bff/{callgent-functions/bff-callgent-functions.controller.ts => endpoints/bff-endpoints.controller.ts} (64%) create mode 100644 src/bff/endpoints/bff-endpoints.module.ts delete mode 100644 src/callgent-functions/callgent-functions.controller.spec.ts delete mode 100644 src/callgent-functions/callgent-functions.module.ts delete mode 100644 src/callgent-functions/callgent-functions.service.spec.ts create mode 100644 src/endpoints/endpoints.controller.spec.ts rename src/{callgent-functions/callgent-functions.controller.ts => endpoints/endpoints.controller.ts} (71%) create mode 100644 src/endpoints/endpoints.module.ts create mode 100644 src/endpoints/endpoints.service.spec.ts rename src/{callgent-functions/callgent-functions.service.ts => endpoints/endpoints.service.ts} (84%) rename test/e2e/{callgent-functions.e2e-spec.ts => endpoints.e2e-spec.ts} (59%) diff --git a/prisma/migrations/20241010003123_rename_fun_2_ep/migration.sql b/prisma/migrations/20241010003123_rename_fun_2_ep/migration.sql new file mode 100644 index 0000000..c4ab17d --- /dev/null +++ b/prisma/migrations/20241010003123_rename_fun_2_ep/migration.sql @@ -0,0 +1,56 @@ +/* + Warnings: + + - You are about to drop the `CallgentFunction` table. If the table is not empty, all the data it contains will be lost. + +*/ +-- DropTable +DROP TABLE "CallgentFunction"; + +-- CreateTable +CREATE TABLE "Endpoint" ( + "pk" SERIAL NOT NULL, + "id" VARCHAR(36) NOT NULL, + "tenantPk" INTEGER NOT NULL DEFAULT (current_setting('tenancy.tenantPk')::int), + "name" VARCHAR(1023) NOT NULL, + "path" VARCHAR(1000) NOT NULL, + "method" VARCHAR(15) NOT NULL, + "summary" VARCHAR(511) NOT NULL DEFAULT '', + "description" VARCHAR(1023) NOT NULL DEFAULT '', + "securities" JSON[], + "params" JSON, + "responses" JSON, + "rawJson" JSON NOT NULL, + "callgentId" VARCHAR(36) NOT NULL, + "entryId" VARCHAR(36), + "createdBy" VARCHAR(36) NOT NULL, + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updatedAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "deletedAt" TIMESTAMP(3), + + CONSTRAINT "Endpoint_pkey" PRIMARY KEY ("pk") +); + +-- CreateIndex +CREATE UNIQUE INDEX "Endpoint_id_key" ON "Endpoint"("id"); + +-- CreateIndex +CREATE INDEX "Endpoint_tenantPk_idx" ON "Endpoint"("tenantPk"); + +-- CreateIndex +CREATE INDEX "Endpoint_callgentId_idx" ON "Endpoint"("callgentId"); + +-- CreateIndex +CREATE INDEX "Endpoint_entryId_idx" ON "Endpoint"("entryId"); + +-- CreateIndex +CREATE UNIQUE INDEX "Endpoint_callgentId_name_key" ON "Endpoint"("callgentId", "name"); + +-- Enable Row Level Security +ALTER TABLE "Endpoint" ENABLE ROW LEVEL SECURITY; +-- Force Row Level Security for table owners +ALTER TABLE "Endpoint" FORCE ROW LEVEL SECURITY; +-- Create row security policies +CREATE POLICY tenant_isolation_policy ON "Endpoint" USING ("tenantPk" = COALESCE(NULLIF(current_setting('tenancy.tenantPk', TRUE), ''), '0')::int); +-- Create policies to bypass RLS (optional) +CREATE POLICY bypass_rls_policy ON "Endpoint" USING (current_setting('tenancy.bypass_rls', TRUE)::text = 'on'); diff --git a/prisma/schema.prisma b/prisma/schema.prisma index 4691535..49f7b02 100644 --- a/prisma/schema.prisma +++ b/prisma/schema.prisma @@ -227,8 +227,8 @@ model CallgentTag { @@index([callgentId]) } -/// @description callgent function in openAPI.json format -model CallgentFunction { +/// @description endpoint in openAPI.json format +model Endpoint { /// @DtoEntityHidden pk Int @id @default(autoincrement()) /// @DtoCreateApiResponse @@ -371,10 +371,10 @@ model TaskAction { // client side information /// @description action owner callgent id, responsible for progressive response ceId String? @db.VarChar(36) /// @description client entry id - funName String? @db.VarChar(255) /// @description optional callgent function name + funName String? @db.VarChar(255) /// @description optional endpoint name cAdaptor String @db.VarChar(36) /// @description client adaptor key - callback Json? @db.Json /// @description callback url template or callgent function - progressive String? @db.VarChar(36) /// @description progressive requesting url template or callgent function + callback Json? @db.Json /// @description callback url template or endpoint + progressive String? @db.VarChar(36) /// @description progressive requesting url template or endpoint // processing returns Boolean @default(false) /// @description whether action has response object diff --git a/prisma/seed.ts b/prisma/seed.ts index 823f3c9..83d83cf 100644 --- a/prisma/seed.ts +++ b/prisma/seed.ts @@ -80,7 +80,7 @@ function initEventListeners( eventType: 'CLIENT_REQUEST', dataType: '*', serviceType: 'SERVICE', - serviceName: 'CallgentFunctionsService', + serviceName: 'EndpointsService', funName: 'loadFunctions', description: 'Load all entries of the callgent into event.context.functions', @@ -190,7 +190,7 @@ please generate the js function with **full implementation and error handling**! { name: 'map2Function', prompt: `given below service APIs: -service {{=it.callgentName}} {{{~ it.callgentFunctions :fun }} +service {{=it.callgentName}} {{{~ it.endpoints :fun }} "API: {{=fun.name}}": {"endpoint": "{{=fun.name}}", "summary":"{{=fun.summary}}", {{=fun.description ? '"description":"'+fun.description+'", ':''}}"params":{{=JSON.stringify(fun.params)}}, "responses":{{=JSON.stringify(fun.responses)}} }, {{~}}} diff --git a/src/agents/agents.service.ts b/src/agents/agents.service.ts index c5356cb..44b7d77 100644 --- a/src/agents/agents.service.ts +++ b/src/agents/agents.service.ts @@ -1,5 +1,5 @@ import { BadRequestException, HttpException, Injectable } from '@nestjs/common'; -import { CallgentFunctionDto } from '../callgent-functions/dto/callgent-function.dto'; +import { EndpointDto } from '../endpoints/dto/endpoint.dto'; import { ClientRequestEvent } from '../entries/events/client-request.event'; import { EventListenersService } from '../event-listeners/event-listeners.service'; import { ProgressiveRequestEvent } from './events/progressive-request.event'; @@ -41,9 +41,9 @@ export class AgentsService { data: { callgentName, funName, progressive }, context: { tgtEvents, req }, } = reqEvent; - const callgentFunctions = reqEvent.context - .functions as unknown as CallgentFunctionDto[]; - if (!callgentFunctions?.length) + const endpoints = reqEvent.context + .functions as unknown as EndpointDto[]; + if (!endpoints?.length) throw new BadRequestException( 'No functions for mapping, ClientRequestEvent#' + id, ); @@ -54,10 +54,10 @@ export class AgentsService { const mapped = await this.llmService.template( 'map2Function', - { req, funName, callgentName, cepAdaptor, callgentFunctions }, + { req, funName, callgentName, cepAdaptor, endpoints }, { endpoint: '', args: {}, mapping: '', question: '' }, id, - ); // TODO check `funName` exists in callgentFunctions, validating `mapping` + ); // TODO check `funName` exists in endpoints, validating `mapping` reqEvent.context.map2Function = mapped; if (mapped.question) { @@ -130,7 +130,7 @@ export class AgentsService { async convert2Response( args: { name: string; value: any }[], resp: string, - fun: CallgentFunctionDto, + fun: EndpointDto, eventId: string, ) { args = args?.map((a) => ({ name: a.name, value: a.value })) || []; @@ -139,7 +139,7 @@ export class AgentsService { { args, resp, fun }, { statusCode: 200, data: {} }, eventId, - ); // TODO check `funName` exists in callgentFunctions, validating `mapping` + ); // TODO check `funName` exists in endpoints, validating `mapping` return { statusCode: mapped.statusCode, data: mapped.data }; } diff --git a/src/app.module.ts b/src/app.module.ts index 931540e..48a4d63 100644 --- a/src/app.module.ts +++ b/src/app.module.ts @@ -5,9 +5,9 @@ import { AgentsModule } from './agents/agents.module'; import { AppController } from './app.controller'; import { AppService } from './app.service'; import { AuthTokensModule } from './auth-tokens/auth-tokens.module'; -import { BffCallgentFunctionsModule } from './bff/callgent-functions/bff-callgent-functions.module'; +import { BffEndpointsModule } from './bff/endpoints/bff-endpoints.module'; import { CallgentTreeModule } from './bff/callgent-tree/callgent-tree.module'; -import { CallgentFunctionsModule } from './callgent-functions/callgent-functions.module'; +import { EndpointsModule } from './endpoints/endpoints.module'; import { CallgentHubModule } from './callgent-hub/callgent-hub.module'; import { CallgentRealmsModule } from './callgent-realms/callgent-realms.module'; import { CallgentsModule } from './callgents/callgents.module'; @@ -40,14 +40,14 @@ import { UsersModule } from './users/users.module'; TasksModule, AuthTokensModule, EntriesModule, - CallgentFunctionsModule, + EndpointsModule, AgentsModule, TaskActionsModule, EventListenersModule, EventStoresModule, EmailsModule, CallgentTreeModule, - BffCallgentFunctionsModule, + BffEndpointsModule, SandboxModule, CallgentHubModule, CallgentRealmsModule, diff --git a/src/bff/callgent-functions/bff-callgent-functions.controller.spec.ts b/src/bff/callgent-functions/bff-callgent-functions.controller.spec.ts deleted file mode 100644 index 0e27939..0000000 --- a/src/bff/callgent-functions/bff-callgent-functions.controller.spec.ts +++ /dev/null @@ -1,18 +0,0 @@ -import { Test, TestingModule } from '@nestjs/testing'; -import { BffCallgentFunctionsController } from './bff-callgent-functions.controller'; - -describe('BffCallgentFunctionsController', () => { - let controller: BffCallgentFunctionsController; - - beforeEach(async () => { - const module: TestingModule = await Test.createTestingModule({ - controllers: [BffCallgentFunctionsController], - }).compile(); - - controller = module.get(BffCallgentFunctionsController); - }); - - it('should be defined', () => { - expect(controller).toBeDefined(); - }); -}); diff --git a/src/bff/callgent-functions/bff-callgent-functions.module.ts b/src/bff/callgent-functions/bff-callgent-functions.module.ts deleted file mode 100644 index be5e738..0000000 --- a/src/bff/callgent-functions/bff-callgent-functions.module.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { Module } from '@nestjs/common'; -import { BffCallgentFunctionsController } from './bff-callgent-functions.controller'; -import { CallgentFunctionsModule } from '../../callgent-functions/callgent-functions.module'; - -@Module({ - imports: [CallgentFunctionsModule], - controllers: [BffCallgentFunctionsController], -}) -export class BffCallgentFunctionsModule {} diff --git a/src/bff/callgent-tree/callgent-tree.controller.ts b/src/bff/callgent-tree/callgent-tree.controller.ts index 4c60ea1..df41649 100644 --- a/src/bff/callgent-tree/callgent-tree.controller.ts +++ b/src/bff/callgent-tree/callgent-tree.controller.ts @@ -11,7 +11,7 @@ import { UseGuards, } from '@nestjs/common'; import { ApiSecurity, ApiTags } from '@nestjs/swagger'; -import { CallgentFunctionsService } from '../../callgent-functions/callgent-functions.service'; +import { EndpointsService } from '../../endpoints/endpoints.service'; import { CallgentRealmsService } from '../../callgent-realms/callgent-realms.service'; import { CallgentsService } from '../../callgents/callgents.service'; import { CallgentDto } from '../../callgents/dto/callgent.dto'; @@ -28,8 +28,8 @@ export class CallgentTreeController { private readonly callgentsService: CallgentsService, @Inject('EntriesService') private readonly entriesService: EntriesService, - @Inject('CallgentFunctionsService') - private readonly callgentFunctionsService: CallgentFunctionsService, + @Inject('EndpointsService') + private readonly endpointsService: EndpointsService, @Inject('CallgentRealmsService') private readonly callgentRealmsService: CallgentRealmsService, ) {} @@ -75,7 +75,7 @@ export class CallgentTreeController { if (ep.type == 'CLIENT') { CEP.push(ep); } else if (ep.type == 'SERVER') { - ep.children = await this.callgentFunctionsService.findAll({ + ep.children = await this.endpointsService.findAll({ select: { pk: false, params: false, diff --git a/src/bff/callgent-tree/callgent-tree.module.ts b/src/bff/callgent-tree/callgent-tree.module.ts index 955c7b9..20fea38 100644 --- a/src/bff/callgent-tree/callgent-tree.module.ts +++ b/src/bff/callgent-tree/callgent-tree.module.ts @@ -1,5 +1,5 @@ import { Module } from '@nestjs/common'; -import { CallgentFunctionsModule } from '../../callgent-functions/callgent-functions.module'; +import { EndpointsModule } from '../../endpoints/endpoints.module'; import { CallgentRealmsModule } from '../../callgent-realms/callgent-realms.module'; import { CallgentsModule } from '../../callgents/callgents.module'; import { EntriesModule } from '../../entries/entries.module'; @@ -9,7 +9,7 @@ import { CallgentTreeController } from './callgent-tree.controller'; imports: [ CallgentsModule, EntriesModule, - CallgentFunctionsModule, + EndpointsModule, CallgentRealmsModule, ], controllers: [CallgentTreeController], diff --git a/src/bff/endpoints/bff-endpoints.controller.spec.ts b/src/bff/endpoints/bff-endpoints.controller.spec.ts new file mode 100644 index 0000000..3b2d488 --- /dev/null +++ b/src/bff/endpoints/bff-endpoints.controller.spec.ts @@ -0,0 +1,18 @@ +import { Test, TestingModule } from '@nestjs/testing'; +import { BffEndpointsController } from './bff-endpoints.controller'; + +describe('BffEndpointsController', () => { + let controller: BffEndpointsController; + + beforeEach(async () => { + const module: TestingModule = await Test.createTestingModule({ + controllers: [BffEndpointsController], + }).compile(); + + controller = module.get(BffEndpointsController); + }); + + it('should be defined', () => { + expect(controller).toBeDefined(); + }); +}); diff --git a/src/bff/callgent-functions/bff-callgent-functions.controller.ts b/src/bff/endpoints/bff-endpoints.controller.ts similarity index 64% rename from src/bff/callgent-functions/bff-callgent-functions.controller.ts rename to src/bff/endpoints/bff-endpoints.controller.ts index 391d2c6..a1a7116 100644 --- a/src/bff/callgent-functions/bff-callgent-functions.controller.ts +++ b/src/bff/endpoints/bff-endpoints.controller.ts @@ -1,18 +1,18 @@ import { Body, Controller, Inject, Post, Req, UseGuards } from '@nestjs/common'; import { ApiOperation, ApiSecurity, ApiTags } from '@nestjs/swagger'; -import { CallgentApiText } from '../../callgent-functions/callgent-functions.controller'; -import { CallgentFunctionsService } from '../../callgent-functions/callgent-functions.service'; +import { CallgentApiText } from '../../endpoints/endpoints.controller'; +import { EndpointsService } from '../../endpoints/endpoints.service'; import { EntryDto } from '../../entries/dto/entry.dto'; import { JwtGuard } from '../../infra/auth/jwt/jwt.guard'; import { EntityIdExists } from '../../infra/repo/validators/entity-exists.validator'; @ApiTags('BFF') @ApiSecurity('defaultBearerAuth') @UseGuards(JwtGuard) -@Controller('bff/callgent-functions') -export class BffCallgentFunctionsController { +@Controller('bff/endpoints') +export class BffEndpointsController { constructor( - @Inject('CallgentFunctionsService') - private readonly callgentFunctionService: CallgentFunctionsService, + @Inject('EndpointsService') + private readonly endpointService: EndpointsService, ) {} @ApiOperation({ @@ -26,13 +26,13 @@ export class BffCallgentFunctionsController { apiTxt: CallgentApiText, ) { const entry = EntityIdExists.entity(apiTxt, 'entryId'); - await this.callgentFunctionService.importBatch( + await this.endpointService.importBatch( entry, apiTxt, req.user?.sub, ); - const data = await this.callgentFunctionService.findAll({ + const data = await this.endpointService.findAll({ where: { entryId: entry.id }, }); diff --git a/src/bff/endpoints/bff-endpoints.module.ts b/src/bff/endpoints/bff-endpoints.module.ts new file mode 100644 index 0000000..48b37bc --- /dev/null +++ b/src/bff/endpoints/bff-endpoints.module.ts @@ -0,0 +1,9 @@ +import { Module } from '@nestjs/common'; +import { BffEndpointsController } from './bff-endpoints.controller'; +import { EndpointsModule } from '../../endpoints/endpoints.module'; + +@Module({ + imports: [EndpointsModule], + controllers: [BffEndpointsController], +}) +export class BffEndpointsModule {} diff --git a/src/callgent-functions/callgent-functions.controller.spec.ts b/src/callgent-functions/callgent-functions.controller.spec.ts deleted file mode 100644 index c66a529..0000000 --- a/src/callgent-functions/callgent-functions.controller.spec.ts +++ /dev/null @@ -1,18 +0,0 @@ -import { Test, TestingModule } from '@nestjs/testing'; -import { CallgentFunctionsController } from './callgent-functions.controller'; - -describe('CallgentFunctionsController', () => { - let controller: CallgentFunctionsController; - - beforeEach(async () => { - const module: TestingModule = await Test.createTestingModule({ - controllers: [CallgentFunctionsController], - }).compile(); - - controller = module.get(CallgentFunctionsController); - }); - - it('should be defined', () => { - expect(controller).toBeDefined(); - }); -}); diff --git a/src/callgent-functions/callgent-functions.module.ts b/src/callgent-functions/callgent-functions.module.ts deleted file mode 100644 index 395374c..0000000 --- a/src/callgent-functions/callgent-functions.module.ts +++ /dev/null @@ -1,15 +0,0 @@ -import { Module } from '@nestjs/common'; -import { CallgentRealmsModule } from '../callgent-realms/callgent-realms.module'; -import { EntriesModule } from '../entries/entries.module'; -import { CallgentFunctionsController } from './callgent-functions.controller'; -import { CallgentFunctionsService } from './callgent-functions.service'; - -@Module({ - imports: [EntriesModule, CallgentRealmsModule], - providers: [ - { provide: 'CallgentFunctionsService', useClass: CallgentFunctionsService }, - ], - controllers: [CallgentFunctionsController], - exports: ['CallgentFunctionsService'], -}) -export class CallgentFunctionsModule {} diff --git a/src/callgent-functions/callgent-functions.service.spec.ts b/src/callgent-functions/callgent-functions.service.spec.ts deleted file mode 100644 index ca48c6d..0000000 --- a/src/callgent-functions/callgent-functions.service.spec.ts +++ /dev/null @@ -1,18 +0,0 @@ -import { Test, TestingModule } from '@nestjs/testing'; -import { CallgentFunctionsService } from './callgent-functions.service'; - -describe('CallgentFunctionsService', () => { - let service: CallgentFunctionsService; - - beforeEach(async () => { - const module: TestingModule = await Test.createTestingModule({ - providers: [CallgentFunctionsService], - }).compile(); - - service = module.get(CallgentFunctionsService); - }); - - it('should be defined', () => { - expect(service).toBeDefined(); - }); -}); diff --git a/src/callgent-hub/callgent-hub.module.ts b/src/callgent-hub/callgent-hub.module.ts index 302699f..65ffa50 100644 --- a/src/callgent-hub/callgent-hub.module.ts +++ b/src/callgent-hub/callgent-hub.module.ts @@ -1,5 +1,5 @@ import { Module } from '@nestjs/common'; -import { CallgentFunctionsModule } from '../callgent-functions/callgent-functions.module'; +import { EndpointsModule } from '../endpoints/endpoints.module'; import { CallgentRealmsModule } from '../callgent-realms/callgent-realms.module'; import { CallgentsModule } from '../callgents/callgents.module'; import { EntriesModule } from '../entries/entries.module'; @@ -11,7 +11,7 @@ import { CallgentHubService } from './callgent-hub.service'; CallgentsModule, CallgentRealmsModule, EntriesModule, - CallgentFunctionsModule, + EndpointsModule, ], controllers: [CallgentHubController], providers: [CallgentHubService], diff --git a/src/callgent-hub/callgent-hub.service.ts b/src/callgent-hub/callgent-hub.service.ts index ad1b1c7..5212773 100644 --- a/src/callgent-hub/callgent-hub.service.ts +++ b/src/callgent-hub/callgent-hub.service.ts @@ -7,7 +7,7 @@ import { NotFoundException, } from '@nestjs/common'; import { CallgentRealm, Prisma, PrismaClient } from '@prisma/client'; -import { CallgentFunctionsService } from '../callgent-functions/callgent-functions.service'; +import { EndpointsService } from '../endpoints/endpoints.service'; import { CallgentRealmsService } from '../callgent-realms/callgent-realms.service'; import { RealmSecurityVO } from '../callgent-realms/dto/realm-security.vo'; import { CallgentsService } from '../callgents/callgents.service'; @@ -26,8 +26,8 @@ export class CallgentHubService { private readonly callgentRealmsService: CallgentRealmsService, @Inject('EntriesService') private readonly entriesService: EntriesService, - @Inject('CallgentFunctionsService') - private readonly callgentFunctionsService: CallgentFunctionsService, + @Inject('EndpointsService') + private readonly endpointsService: EndpointsService, ) {} @Transactional() @@ -53,7 +53,7 @@ export class CallgentHubService { } /** - * Callgent, Entry, CallgentFunction, CallgentRealm. + * Callgent, Entry, Endpoint, CallgentRealm. */ @Transactional() async forkFromHub(dupId: string, dto: CreateCallgentDto, createdBy: string) { @@ -68,7 +68,7 @@ export class CallgentHubService { } /** - * Callgent, Entry, CallgentFunction, CallgentRealm. + * Callgent, Entry, Endpoint, CallgentRealm. */ @Transactional() async commitToHub(dupId: string, dto: CreateCallgentDto, createdBy: string) { @@ -169,7 +169,7 @@ export class CallgentHubService { const functionMap = {}; await Promise.all( ens.map(async (epOld) => { - const functions = await this.callgentFunctionsService.findAll({ + const functions = await this.endpointsService.findAll({ where: { entryId: epOld.id }, orderBy: { pk: 'asc' }, select: { @@ -203,7 +203,7 @@ export class CallgentHubService { return Promise.all( functionMap[epOld.id].map((fun) => { const securities: any[] = dupSecurities(fun.securities); - return this.callgentFunctionsService.create({ + return this.endpointsService.create({ ...fun, securities, callgentId, diff --git a/src/callgent-realms/callgent-realms.controller.ts b/src/callgent-realms/callgent-realms.controller.ts index 5f3e0cf..2b1af0b 100644 --- a/src/callgent-realms/callgent-realms.controller.ts +++ b/src/callgent-realms/callgent-realms.controller.ts @@ -195,7 +195,7 @@ export class CallgentRealmsController { }; } - @ApiOperation({ summary: 'Update securities on entry/callgent function' }) + @ApiOperation({ summary: 'Update securities on entry/endpoint' }) /// securities @ApiParam({ name: 'type', type: 'string', enum: ['entry', 'function'] }) @ApiBody({ isArray: true, type: RealmSecurityItemForm }) diff --git a/src/callgent-realms/callgent-realms.service.ts b/src/callgent-realms/callgent-realms.service.ts index a856519..c69943f 100644 --- a/src/callgent-realms/callgent-realms.service.ts +++ b/src/callgent-realms/callgent-realms.service.ts @@ -11,7 +11,7 @@ import { import { ModuleRef } from '@nestjs/core'; import { ServerObject } from '@nestjs/swagger/dist/interfaces/open-api-spec.interface'; import { Prisma, PrismaClient } from '@prisma/client'; -import { CallgentFunctionsService } from '../callgent-functions/callgent-functions.service'; +import { EndpointsService } from '../endpoints/endpoints.service'; import { EntryDto } from '../entries/dto/entry.dto'; import { EntriesService } from '../entries/entries.service'; import { ClientRequestEvent } from '../entries/events/client-request.event'; @@ -44,11 +44,11 @@ export class CallgentRealmsService implements OnModuleInit { updatedAt: false, }; - private callgentFunctionsService: CallgentFunctionsService; + private endpointsService: EndpointsService; onModuleInit() { // a little hack: circular relation - this.callgentFunctionsService = this.moduleRef.get( - 'CallgentFunctionsService', + this.endpointsService = this.moduleRef.get( + 'EndpointsService', { strict: false }, ); } @@ -131,13 +131,13 @@ export class CallgentRealmsService implements OnModuleInit { id: string, securities: RealmSecurityItemForm[], ) { - let entry, targetService: EntriesService | CallgentFunctionsService; + let entry, targetService: EntriesService | EndpointsService; if (type == 'entry') { targetService = this.entriesService; entry = await this.entriesService.findOne(id); } else { - targetService = this.callgentFunctionsService; - const fun = await this.callgentFunctionsService.findOne(id, { + targetService = this.endpointsService; + const fun = await this.endpointsService.findOne(id, { entryId: true, }); entry = fun && (await this.entriesService.findOne(fun.entryId)); @@ -175,14 +175,14 @@ export class CallgentRealmsService implements OnModuleInit { } /** - * check auth on the chosen callgent function. + * check auth on the chosen endpoint. * automatically starts auth process to retrieve token. * may callback to cep for user credentials. */ async checkSepAuth( reqEvent: ClientRequestEvent, ): Promise { - // functions: CallgentFunction[], @see AgentsService.map2Function + // functions: Endpoint[], @see AgentsService.map2Function const { securities, entryId: sepId } = reqEvent.context.functions?.length && reqEvent.context.functions[0]; @@ -444,7 +444,7 @@ export class CallgentRealmsService implements OnModuleInit { FROM unnest("securities") AS elem WHERE elem::jsonb ? ${pk} )`, - prisma.$executeRaw`UPDATE "CallgentFunction" + prisma.$executeRaw`UPDATE "Endpoint" SET "securities" = ( SELECT array_agg(sec::jsonb - ${pk}) FILTER (WHERE (sec::jsonb - ${pk})::text != '{}') diff --git a/src/callgents/callgents.service.ts b/src/callgents/callgents.service.ts index 4b6fb0e..7b96f32 100644 --- a/src/callgents/callgents.service.ts +++ b/src/callgents/callgents.service.ts @@ -198,7 +198,7 @@ export class CallgentsService { if (withEntry) this.tenancyService.bypassTenancy(prisma); const [callgent, actions, epClient] = await Promise.all([ prisma.callgent.findUnique({ where: { id: entry.callgentId } }), - prisma.callgentFunction.findMany({ + prisma.endpoint.findMany({ where: { name: act, callgentId: entry.callgentId }, }), withEntry && diff --git a/src/endpoints/endpoints.controller.spec.ts b/src/endpoints/endpoints.controller.spec.ts new file mode 100644 index 0000000..c95ca05 --- /dev/null +++ b/src/endpoints/endpoints.controller.spec.ts @@ -0,0 +1,18 @@ +import { Test, TestingModule } from '@nestjs/testing'; +import { EndpointsController } from './endpoints.controller'; + +describe('EndpointsController', () => { + let controller: EndpointsController; + + beforeEach(async () => { + const module: TestingModule = await Test.createTestingModule({ + controllers: [EndpointsController], + }).compile(); + + controller = module.get(EndpointsController); + }); + + it('should be defined', () => { + expect(controller).toBeDefined(); + }); +}); diff --git a/src/callgent-functions/callgent-functions.controller.ts b/src/endpoints/endpoints.controller.ts similarity index 71% rename from src/callgent-functions/callgent-functions.controller.ts rename to src/endpoints/endpoints.controller.ts index a19302c..1bb5065 100644 --- a/src/callgent-functions/callgent-functions.controller.ts +++ b/src/endpoints/endpoints.controller.ts @@ -25,9 +25,9 @@ import { EntryDto } from '../entries/dto/entry.dto'; import { JwtGuard } from '../infra/auth/jwt/jwt.guard'; import { EntityIdExists } from '../infra/repo/validators/entity-exists.validator'; import { RestApiResponse } from '../restapi/response.interface'; -import { CallgentFunctionsService } from './callgent-functions.service'; -import { CallgentFunctionDto } from './dto/callgent-function.dto'; -import { UpdateCallgentFunctionDto } from './dto/update-callgent-function.dto'; +import { EndpointsService } from './endpoints.service'; +import { EndpointDto } from './dto/endpoint.dto'; +import { UpdateEndpointDto } from './dto/update-endpoint.dto'; export class CallgentApis extends ApiSpec { @EntityIdExists('entry', 'id') @@ -59,20 +59,20 @@ export class CallgentApiText { format?: 'json' | 'yaml' | 'text'; } -@ApiTags('CallgentFunctions') +@ApiTags('Endpoints') @ApiSecurity('defaultBearerAuth') -@ApiExtraModels(RestApiResponse, CallgentFunctionDto) +@ApiExtraModels(RestApiResponse, EndpointDto) @UseGuards(JwtGuard) -@Controller('callgent-functions') -export class CallgentFunctionsController { +@Controller('endpoints') +export class EndpointsController { constructor( - @Inject('CallgentFunctionsService') - private readonly callgentFunctionService: CallgentFunctionsService, + @Inject('EndpointsService') + private readonly endpointService: EndpointsService, ) {} @ApiOperation({ summary: - 'Create batch of new CallgentFunction. Exception if existing one with same name in the same callgent', + 'Create batch of new Endpoint. Exception if existing one with same name in the same callgent', description: 'return { data: imported_functions_count } on success', }) @Post() @@ -83,11 +83,7 @@ export class CallgentFunctionsController { ) { const entry = EntityIdExists.entity(apis, 'entryId'); return { - data: await this.callgentFunctionService.createBatch( - entry, - apis, - req.user?.sub, - ), + data: await this.endpointService.createBatch(entry, apis, req.user?.sub), }; } @@ -103,7 +99,7 @@ export class CallgentFunctionsController { ) { const entry = EntityIdExists.entity(apiTxt, 'entryId'); return { - data: await this.callgentFunctionService.importBatch( + data: await this.endpointService.importBatch( entry, apiTxt, req.user?.sub, @@ -117,7 +113,7 @@ export class CallgentFunctionsController { { $ref: getSchemaPath(RestApiResponse) }, { properties: { - data: { $ref: getSchemaPath(CallgentFunctionDto) }, + data: { $ref: getSchemaPath(EndpointDto) }, }, }, ], @@ -125,7 +121,7 @@ export class CallgentFunctionsController { }) @Get('/:id') async findOne(@Param('id') id: string) { - return { data: await this.callgentFunctionService.findOne(id) }; + return { data: await this.endpointService.findOne(id) }; } // @ApiQuery({ name: 'query', required: false, type: String }) @@ -139,7 +135,7 @@ export class CallgentFunctionsController { // properties: { // data: { // type: 'array', - // items: { $ref: getSchemaPath(CallgentFunctionDto) }, + // items: { $ref: getSchemaPath(EndpointDto) }, // }, // }, // }, @@ -155,7 +151,7 @@ export class CallgentFunctionsController { // name: { contains: query.queryString }, // } // : undefined; - // return this.callgentFunctionService.findAll({ + // return this.endpointService.findAll({ // page: query.page, // perPage: query.perPage, // where, @@ -166,17 +162,14 @@ export class CallgentFunctionsController { schema: { allOf: [ { $ref: getSchemaPath(RestApiResponse) }, - { properties: { data: { $ref: getSchemaPath(CallgentFunctionDto) } } }, + { properties: { data: { $ref: getSchemaPath(EndpointDto) } } }, ], }, }) @Put('/:id') - async update( - @Param('id') id: string, - @Body() dto: UpdateCallgentFunctionDto, - ) { + async update(@Param('id') id: string, @Body() dto: UpdateEndpointDto) { dto.id = id; - return { data: await this.callgentFunctionService.update(dto) }; + return { data: await this.endpointService.update(dto) }; } @ApiOkResponse({ @@ -185,7 +178,7 @@ export class CallgentFunctionsController { { $ref: getSchemaPath(RestApiResponse) }, { properties: { - data: { $ref: getSchemaPath(CallgentFunctionDto) }, + data: { $ref: getSchemaPath(EndpointDto) }, }, }, ], @@ -193,6 +186,6 @@ export class CallgentFunctionsController { }) @Delete('/:id') async delete(@Param('id') id: string) { - return { data: await this.callgentFunctionService.delete(id) }; + return { data: await this.endpointService.delete(id) }; } } diff --git a/src/endpoints/endpoints.module.ts b/src/endpoints/endpoints.module.ts new file mode 100644 index 0000000..9129d75 --- /dev/null +++ b/src/endpoints/endpoints.module.ts @@ -0,0 +1,15 @@ +import { Module } from '@nestjs/common'; +import { CallgentRealmsModule } from '../callgent-realms/callgent-realms.module'; +import { EntriesModule } from '../entries/entries.module'; +import { EndpointsController } from './endpoints.controller'; +import { EndpointsService } from './endpoints.service'; + +@Module({ + imports: [EntriesModule, CallgentRealmsModule], + providers: [ + { provide: 'EndpointsService', useClass: EndpointsService }, + ], + controllers: [EndpointsController], + exports: ['EndpointsService'], +}) +export class EndpointsModule {} diff --git a/src/endpoints/endpoints.service.spec.ts b/src/endpoints/endpoints.service.spec.ts new file mode 100644 index 0000000..112ad54 --- /dev/null +++ b/src/endpoints/endpoints.service.spec.ts @@ -0,0 +1,18 @@ +import { Test, TestingModule } from '@nestjs/testing'; +import { EndpointsService } from './endpoints.service'; + +describe('EndpointsService', () => { + let service: EndpointsService; + + beforeEach(async () => { + const module: TestingModule = await Test.createTestingModule({ + providers: [EndpointsService], + }).compile(); + + service = module.get(EndpointsService); + }); + + it('should be defined', () => { + expect(service).toBeDefined(); + }); +}); diff --git a/src/callgent-functions/callgent-functions.service.ts b/src/endpoints/endpoints.service.ts similarity index 84% rename from src/callgent-functions/callgent-functions.service.ts rename to src/endpoints/endpoints.service.ts index 1b26d2c..6e179a4 100644 --- a/src/callgent-functions/callgent-functions.service.ts +++ b/src/endpoints/endpoints.service.ts @@ -17,12 +17,12 @@ import { EntriesService } from '../entries/entries.service'; import { ClientRequestEvent } from '../entries/events/client-request.event'; import { Utils } from '../infra/libs/utils'; import { selectHelper } from '../infra/repo/select.helper'; -import { UpdateCallgentFunctionDto } from './dto/update-callgent-function.dto'; +import { UpdateEndpointDto } from './dto/update-endpoint.dto'; const paginate: PaginatorTypes.PaginateFunction = paginator({ perPage: 10 }); @Injectable() -export class CallgentFunctionsService { +export class EndpointsService { constructor( private readonly txHost: TransactionHost, @Inject('EntriesService') @@ -30,7 +30,7 @@ export class CallgentFunctionsService { @Inject('CallgentRealmsService') private readonly callgentRealmsService: CallgentRealmsService, ) {} - protected readonly defSelect: Prisma.CallgentFunctionSelect = { + protected readonly defSelect: Prisma.EndpointSelect = { pk: false, tenantPk: false, rawJson: false, @@ -73,14 +73,14 @@ export class CallgentFunctionsService { // protected async _invoke( // taskAction: TaskActionDto, // callgent: CallgentDto, - // callgentFunctions: CallgentFunctionDto[], + // endpoints: EndpointDto[], // ) { // // FIXME task ctx msgs // // 生成args映射方法, // const { funName, mapping, question } = await this._mapping( // taskAction, // callgent.name, - // callgentFunctions, + // endpoints, // ); // if (question) { // // invoke event owner for more request info @@ -91,17 +91,17 @@ export class CallgentFunctionsService { // // ); // } - // const fun = callgentFunctions.find((f) => f.name === funName); + // const fun = endpoints.find((f) => f.name === funName); // if (!fun) return; // FIXME // // doInvoke // } @Transactional() - async create(data: Prisma.CallgentFunctionUncheckedCreateInput) { + async create(data: Prisma.EndpointUncheckedCreateInput) { const prisma = this.txHost.tx as PrismaClient; const id = Utils.uuid(); - return prisma.callgentFunction.create({ data: { ...data, id } }); + return prisma.endpoint.create({ data: { ...data, id } }); } @Transactional() @@ -130,7 +130,7 @@ export class CallgentFunctionsService { } // validation - const actMap = apis.map( + const actMap = apis.map( (f) => { const ret = { ...f, @@ -170,7 +170,7 @@ export class CallgentFunctionsService { // create api functions const prisma = this.txHost.tx as PrismaClient; - const { count: actionsCount } = await prisma.callgentFunction.createMany({ + const { count: actionsCount } = await prisma.endpoint.createMany({ data: actMap, }); @@ -207,9 +207,9 @@ export class CallgentFunctionsService { page, perPage, }: { - select?: Prisma.CallgentFunctionSelect; - where?: Prisma.CallgentFunctionWhereInput; - orderBy?: Prisma.CallgentFunctionOrderByWithRelationInput; + select?: Prisma.EndpointSelect; + where?: Prisma.EndpointWhereInput; + orderBy?: Prisma.EndpointOrderByWithRelationInput; page?: number; perPage?: number; }) { @@ -218,7 +218,7 @@ export class CallgentFunctionsService { select, async (select) => { const result = paginate( - prisma.callgentFunction, + prisma.endpoint, { select, where, @@ -241,14 +241,14 @@ export class CallgentFunctionsService { where, orderBy, }: { - select?: Prisma.CallgentFunctionSelect; - where?: Prisma.CallgentFunctionWhereInput; - orderBy?: Prisma.CallgentFunctionOrderByWithRelationInput; + select?: Prisma.EndpointSelect; + where?: Prisma.EndpointWhereInput; + orderBy?: Prisma.EndpointOrderByWithRelationInput; }) { const prisma = this.txHost.tx as PrismaClient; return selectHelper( select, - (select) => prisma.callgentFunction.findMany({ where, select, orderBy }), + (select) => prisma.endpoint.findMany({ where, select, orderBy }), this.defSelect, ); } @@ -257,17 +257,17 @@ export class CallgentFunctionsService { delete(id: string) { const prisma = this.txHost.tx as PrismaClient; return selectHelper(this.defSelect, (select) => - prisma.callgentFunction.delete({ select, where: { id } }), + prisma.endpoint.delete({ select, where: { id } }), ); } @Transactional() - update(dto: UpdateCallgentFunctionDto) { + update(dto: UpdateEndpointDto) { if (!dto.id) return; dto.name = Utils.formalApiName(dto.method, dto.path); const prisma = this.txHost.tx as PrismaClient; return selectHelper(this.defSelect, (select) => - prisma.callgentFunction.update({ + prisma.endpoint.update({ select, where: { id: dto.id }, data: dto as any, @@ -275,12 +275,12 @@ export class CallgentFunctionsService { ); } - findOne(id: string, select?: Prisma.CallgentFunctionSelect) { + findOne(id: string, select?: Prisma.EndpointSelect) { const prisma = this.txHost.tx as PrismaClient; return selectHelper( select, (select) => - prisma.callgentFunction.findUnique({ + prisma.endpoint.findUnique({ select, where: { id }, }), @@ -291,7 +291,7 @@ export class CallgentFunctionsService { @Transactional() async updateSecurities(id: string, securities: RealmSecurityVO[]) { const prisma = this.txHost.tx as PrismaClient; - return prisma.callgentFunction.update({ + return prisma.endpoint.update({ where: { id }, data: { securities: securities as any }, }); diff --git a/src/entries/adaptors/builtin/email/email.adaptor.ts b/src/entries/adaptors/builtin/email/email.adaptor.ts index 4f40818..43f757b 100644 --- a/src/entries/adaptors/builtin/email/email.adaptor.ts +++ b/src/entries/adaptors/builtin/email/email.adaptor.ts @@ -6,7 +6,7 @@ import { } from '@nestjs/common'; import * as httpStatus from 'http-status'; import { AgentsService } from '../../../../agents/agents.service'; -import { CallgentFunctionDto } from '../../../../callgent-functions/dto/callgent-function.dto'; +import { EndpointDto } from '../../../../endpoints/dto/endpoint.dto'; import { RelayEmail } from '../../../../emails/dto/sparkpost-relay-object.interface'; import { EmailRelayKey, @@ -51,7 +51,7 @@ export class EmailAdaptor extends EntryAdaptor { } @Transactional() - async postprocess(reqEvent: ClientRequestEvent, fun: CallgentFunctionDto) { + async postprocess(reqEvent: ClientRequestEvent, fun: EndpointDto) { const resp = reqEvent?.context?.resp as unknown as RelayEmail; if (!resp?.content?.html) throw new BadRequestException( @@ -82,13 +82,13 @@ export class EmailAdaptor extends EntryAdaptor { /** * constructs an email sent to sep.host * - * @param fun - callgent function + * @param fun - endpoint * @param args - function arguments * @param sep - server entry * @param reqEvent - client request event */ async invoke( - fun: CallgentFunctionDto, + fun: EndpointDto, args: object, sep: Entry, reqEvent: ClientRequestEvent, diff --git a/src/entries/adaptors/builtin/restapi/restapi.adaptor.ts b/src/entries/adaptors/builtin/restapi/restapi.adaptor.ts index 04110f7..488cbed 100644 --- a/src/entries/adaptors/builtin/restapi/restapi.adaptor.ts +++ b/src/entries/adaptors/builtin/restapi/restapi.adaptor.ts @@ -5,7 +5,7 @@ import { } from '@nestjs/common'; import axios, { AxiosResponse } from 'axios'; import { AgentsService } from '../../../../agents/agents.service'; -import { CallgentFunctionDto } from '../../../../callgent-functions/dto/callgent-function.dto'; +import { EndpointDto } from '../../../../endpoints/dto/endpoint.dto'; import { EntryDto } from '../../../dto/entry.dto'; import { ClientRequestEvent } from '../../../events/client-request.event'; import { EntryAdaptor, EntryConfig } from '../../entry-adaptor.base'; @@ -142,7 +142,7 @@ export class RestAPIAdaptor extends EntryAdaptor { reqEvent.context.req = this.req2Json(req); } - async postprocess(reqEvent: ClientRequestEvent, fun: CallgentFunctionDto) { + async postprocess(reqEvent: ClientRequestEvent, fun: EndpointDto) { // } @@ -211,7 +211,7 @@ export class RestAPIAdaptor extends EntryAdaptor { } async invoke( - fun: CallgentFunctionDto, + fun: EndpointDto, args: object, sep: EntryDto, reqEvent: ClientRequestEvent, diff --git a/src/entries/adaptors/builtin/web/webpage.adaptor.ts b/src/entries/adaptors/builtin/web/webpage.adaptor.ts index 1397b89..fe14dca 100644 --- a/src/entries/adaptors/builtin/web/webpage.adaptor.ts +++ b/src/entries/adaptors/builtin/web/webpage.adaptor.ts @@ -1,6 +1,6 @@ import { Inject, NotImplementedException } from '@nestjs/common'; import { AgentsService } from '../../../../agents/agents.service'; -import { CallgentFunctionDto } from '../../../../callgent-functions/dto/callgent-function.dto'; +import { EndpointDto } from '../../../../endpoints/dto/endpoint.dto'; import { EntryDto } from '../../../dto/entry.dto'; import { Entry } from '../../../entities/entry.entity'; import { ClientRequestEvent } from '../../../events/client-request.event'; @@ -81,7 +81,7 @@ export class WebpageAdaptor extends EntryAdaptor { // } - async postprocess(reqEvent: ClientRequestEvent, fun: CallgentFunctionDto) { + async postprocess(reqEvent: ClientRequestEvent, fun: EndpointDto) { // } @@ -94,7 +94,7 @@ export class WebpageAdaptor extends EntryAdaptor { } async invoke( - fun: CallgentFunctionDto, + fun: EndpointDto, args: object, sep: Entry, reqEvent: ClientRequestEvent, diff --git a/src/entries/adaptors/entry-adaptor.base.ts b/src/entries/adaptors/entry-adaptor.base.ts index c9c0b5f..f53fa1b 100644 --- a/src/entries/adaptors/entry-adaptor.base.ts +++ b/src/entries/adaptors/entry-adaptor.base.ts @@ -9,7 +9,7 @@ import { import { Prisma } from '@prisma/client'; import yaml from 'yaml'; import { AgentsService } from '../../agents/agents.service'; -import { CallgentFunctionDto } from '../../callgent-functions/dto/callgent-function.dto'; +import { EndpointDto } from '../../endpoints/dto/endpoint.dto'; import { EntryDto } from '../dto/entry.dto'; import { ClientRequestEvent } from '../events/client-request.event'; @@ -28,7 +28,7 @@ export abstract class EntryAdaptor { /** postprocess response */ abstract postprocess( reqEvent: ClientRequestEvent, - fun: CallgentFunctionDto, + fun: EndpointDto, ): Promise; /** Entry config. */ @@ -142,7 +142,7 @@ export abstract class EntryAdaptor { } abstract invoke( - fun: CallgentFunctionDto, + fun: EndpointDto, args: object, sep: EntryDto, reqEvent: ClientRequestEvent, diff --git a/src/entries/entries.service.ts b/src/entries/entries.service.ts index ac3a0cc..6cb61e6 100644 --- a/src/entries/entries.service.ts +++ b/src/entries/entries.service.ts @@ -13,7 +13,7 @@ import { } from '@nestjs/common'; import { ModuleRef, ModulesContainer } from '@nestjs/core'; import { EntryType, Prisma, PrismaClient } from '@prisma/client'; -import { CallgentFunctionDto } from '../callgent-functions/dto/callgent-function.dto'; +import { EndpointDto } from '../endpoints/dto/endpoint.dto'; import { RealmSecurityVO } from '../callgent-realms/dto/realm-security.vo'; import { Utils } from '../infra/libs/utils'; import { selectHelper } from '../infra/repo/select.helper'; @@ -307,7 +307,7 @@ export class EntriesService { if (!map2Function || !functions?.length) throw new Error('Failed to invoke, No mapping function found'); - const func = functions[0] as CallgentFunctionDto; + const func = functions[0] as EndpointDto; const sep = await this.findOne(func.entryId, { id: true, name: true, @@ -340,7 +340,7 @@ export class EntriesService { if (!functions?.length) throw new Error('Failed to invoke, No mapping function found'); - const func = functions[0] as CallgentFunctionDto; + const func = functions[0] as EndpointDto; const sep = await this.findOne(func.entryId, { id: true, name: true, diff --git a/src/entries/events/client-request.event.ts b/src/entries/events/client-request.event.ts index 4da315b..807ebcb 100644 --- a/src/entries/events/client-request.event.ts +++ b/src/entries/events/client-request.event.ts @@ -22,7 +22,7 @@ export class ClientRequestEvent extends EventObject { callgentName: string; /** empty means anonymous */ callerId?: string; - /** requested callgent function name */ + /** requested endpoint name */ funName?: string; /** url template for progressive requesting, `callgent:funName[@callgent]` to invoke callgent */ progressive?: string; diff --git a/src/infra/repo/prisma.middlewares.ts b/src/infra/repo/prisma.middlewares.ts index 588ee36..928f604 100644 --- a/src/infra/repo/prisma.middlewares.ts +++ b/src/infra/repo/prisma.middlewares.ts @@ -40,7 +40,7 @@ export const mainPrismaServiceOptions = ( // need to exclude soft deleted records in a compound findUnique operation // https://github.com/olivierwilkinson/prisma-soft-delete-middleware?tab=readme-ov-file#excluding-soft-deleted-records-in-a-findunique-operation Callgent: { ...deleteHandle, allowCompoundUniqueIndexWhere: true }, - CallgentFunction: deleteHandle, + Endpoint: deleteHandle, Entry: deleteHandle, Task: deleteHandle, TaskAction: deleteHandle, diff --git a/src/task-actions/task-actions.module.ts b/src/task-actions/task-actions.module.ts index 1407c52..8db3c0a 100644 --- a/src/task-actions/task-actions.module.ts +++ b/src/task-actions/task-actions.module.ts @@ -1,5 +1,5 @@ import { Module } from '@nestjs/common'; -import { CallgentFunctionsModule } from '../callgent-functions/callgent-functions.module'; +import { EndpointsModule } from '../endpoints/endpoints.module'; import { CallgentsModule } from '../callgents/callgents.module'; import { EntriesModule } from '../entries/entries.module'; import { TasksModule } from '../tasks/tasks.module'; @@ -10,7 +10,7 @@ import { TaskActionsService } from './task-actions.service'; imports: [ CallgentsModule, EntriesModule, - CallgentFunctionsModule, + EndpointsModule, TasksModule, ], exports: ['TaskActionsService'], diff --git a/src/task-actions/task-actions.service.ts b/src/task-actions/task-actions.service.ts index 5ab6706..217116e 100644 --- a/src/task-actions/task-actions.service.ts +++ b/src/task-actions/task-actions.service.ts @@ -1,7 +1,7 @@ import { TransactionHost } from '@nestjs-cls/transactional'; import { TransactionalAdapterPrisma } from '@nestjs-cls/transactional-adapter-prisma'; import { Injectable, NotImplementedException } from '@nestjs/common'; -import { CallgentFunctionDto } from '../callgent-functions/dto/callgent-function.dto'; +import { EndpointDto } from '../endpoints/dto/endpoint.dto'; import { CallgentDto } from '../callgents/dto/callgent.dto'; import { ClientRequestEvent } from '../entries/events/client-request.event'; import { TasksService } from '../tasks/tasks.service'; @@ -92,13 +92,13 @@ export class TaskActionsService { const taskVars = {}; // may get sync response - // return this._interpret(taskAction, callgents, callgentFunctions, taskVars); + // return this._interpret(taskAction, callgents, endpoints, taskVars); } protected async _interpret( taskAction: TaskActionDto, callgents: CallgentDto[], - callgentFunctions: { [callgentName: string]: CallgentFunctionDto[] }, + endpoints: { [callgentName: string]: EndpointDto[] }, taskVars: { [name: string]: any }, ) { let resp, @@ -106,7 +106,7 @@ export class TaskActionsService { // interpret request, execute step by step for (;;) { const { funName, mapping, progressive, vars } = await this._routing( - callgentFunctions, + endpoints, taskAction, resp, { ...taskVars, ...reqVars }, @@ -125,14 +125,14 @@ export class TaskActionsService { } protected async _routing( - CallgentFunctions: { [callgentName: string]: CallgentFunctionDto[] }, + Endpoints: { [callgentName: string]: EndpointDto[] }, taskAction: TaskActionDto, resp: any, vars: { [name: string]: any }, ): Promise<{ funName; mapping; progressive; vars }> { - // const botNames = Object.keys(CallgentFunctions); - // if (botNames.length == 1 && CallgentFunctions[botNames[0]].length == 1) - // return CallgentFunctions[botNames[0]]; + // const botNames = Object.keys(Endpoints); + // if (botNames.length == 1 && Endpoints[botNames[0]].length == 1) + // return Endpoints[botNames[0]]; // 根据req请求,在给定的方法集中,匹配需要用到的方法子集 // 可能用到多个, diff --git a/test/e2e/callgent-functions.e2e-spec.ts b/test/e2e/endpoints.e2e-spec.ts similarity index 59% rename from test/e2e/callgent-functions.e2e-spec.ts rename to test/e2e/endpoints.e2e-spec.ts index 707e4ef..d4812d9 100644 --- a/test/e2e/callgent-functions.e2e-spec.ts +++ b/test/e2e/endpoints.e2e-spec.ts @@ -1,5 +1,5 @@ import * as pactum from 'pactum'; -import { CallgentApiText } from '../../src/callgent-functions/callgent-functions.controller'; +import { CallgentApiText } from '../../src/endpoints/endpoints.controller'; import { afterAllFn, afterEachFn, @@ -8,19 +8,19 @@ import { } from '../app-init.e2e'; import { TestConstant } from '../test-constants'; -describe('CallgentFunctionsController (e2e)', () => { +describe('EndpointsController (e2e)', () => { beforeAll(beforeAllFn); afterAll(afterAllFn); beforeEach(beforeEachFnTenanted); afterEach(afterEachFn); - it('should add callgent functions', () => {}); + it('should add endpoints', () => {}); }); -export const addCallgentFunctions = (apiTxt: CallgentApiText) => { +export const addEndpoints = (apiTxt: CallgentApiText) => { return pactum .spec() - .post('/api/callgent-functions/import') + .post('/api/endpoints/import') .withHeaders('x-callgent-authorization', TestConstant.authToken) .withBody(apiTxt) .expectStatus(201); diff --git a/test/e2e/entries.e2e-spec.ts b/test/e2e/entries.e2e-spec.ts index f5a57ce..516b6e5 100644 --- a/test/e2e/entries.e2e-spec.ts +++ b/test/e2e/entries.e2e-spec.ts @@ -9,7 +9,7 @@ import { beforeEachFnTenanted, } from '../app-init.e2e'; import { TestConstant } from '../test-constants'; -import { addCallgentFunctions } from './callgent-functions.e2e-spec'; +import { addEndpoints } from './endpoints.e2e-spec'; import { createCallgent } from './callgents.e2e-spec'; /** @@ -63,7 +63,7 @@ export const prepareCannyCallgent = async () => { const jsonData = await fs.readFile('./test/e2e/data/canny-apis.json', 'utf8'); const { json: { data: functionCount }, - } = await addCallgentFunctions({ + } = await addEndpoints({ entryId: serverEntry.id, text: jsonData, format: 'openAPI', From ed62583f46ee05213e2372df8a6e78a78bd33d46 Mon Sep 17 00:00:00 2001 From: dev-callgent Date: Sat, 12 Oct 2024 08:42:55 +0800 Subject: [PATCH 095/183] refactor: rename funName to epName Signed-off-by: dev-callgent --- prisma/schema.prisma | 2 +- prisma/seed-test.ts | 48 +++---------------- prisma/seed.ts | 29 +++++++---- src/agents/agents.service.ts | 26 +++++----- .../events/progressive-request.event.ts | 2 +- src/callgent-hub/callgent-hub.service.ts | 8 ++-- .../callgent-realms.service.ts | 4 +- src/endpoints/endpoints.service.ts | 22 ++++----- .../adaptors/builtin/email/email.adaptor.ts | 2 +- .../builtin/restapi/restapi.controller.ts | 34 +++++++------ src/entries/entries.service.ts | 14 +++--- src/entries/events/client-request.event.ts | 9 ++-- src/event-listeners/event-object.ts | 2 +- 13 files changed, 92 insertions(+), 110 deletions(-) diff --git a/prisma/schema.prisma b/prisma/schema.prisma index 49f7b02..950ac5e 100644 --- a/prisma/schema.prisma +++ b/prisma/schema.prisma @@ -25,7 +25,7 @@ datasource db { relationMode = "prisma" // no foreign constraints in db, pls add @@index on manually } -// # foreign key using pk, instead of id, for better performance +// TODO # foreign key using pk, instead of id, for better performance? // # db sharding base on tenantPk: // 1. pk segmentation, ALTER SEQUENCE [表名]_[id]_seq RESTART WITH 1001; diff --git a/prisma/seed-test.ts b/prisma/seed-test.ts index 3a36b43..638e74b 100644 --- a/prisma/seed-test.ts +++ b/prisma/seed-test.ts @@ -142,63 +142,27 @@ function initTestData( create: cepDto, }) .then((cep) => console.log({ cep })), - // addLlmCache( - // 1, - // 'api2Function', - // 'Please convert below API doc of format restAPI:\n{ "POST:/boards/list": {"summary":"List all boards","requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"apiKey":{"type":"string","description":"Your secret API key."}},"required":["apiKey"]}}},"required":true},"responses":{"200":{"description":"A dictionary with a \\"boards\\" property that contains an array of board objects.","content":{"application/json":{"schema":{"type":"object","properties":{"boards":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","description":"A unique identifier for the board."},"created":{"type":"string","description":"Time at which the board was created, in ISO 8601 format."},"isPrivate":{"type":"boolean","description":"Whether or not the board is set as private in the administrative settings."},"name":{"type":"string","description":"The board\'s name."},"postCount":{"type":"integer","description":"The number of non-deleted posts associated with the board. This number includes posts that are marked as closed or complete."},"privateComments":{"type":"boolean","description":"Whether or not comments left on posts can be viewed by other end-users."},"url":{"type":"string","description":"The URL to the board\'s page."}}}},"hasMore":{"type":"boolean","description":"Specifies whether this query returns more boards than the limit."}}}}}}}} }\n\ninto a js function, the function must be as follows:\n// the `invoker` function do the real invocation\nasync (invoker: (req:{ path: string; method: string; headers?: { [key: string]: string }; query?: { [key: string]: string }; params?: { [key: string]: string }; files?: { [key: string]: any }; body?: any; form?: any;})=>Promise<{ apiResult: any; headers?: { [key: string]: string }; status?: number; statusText?: string;}>, ...apiParams) {...; const json = await invoker(...); ...; return apiResult; }\n\nplease generate the js function with **full implementation and error handling**! output a single-line json object:\n{"funName":"function name", "params":["invoker", ...apiParams]"documents":"formal js function documentation with description of params and response object with **all properties elaborated** exactly same as the API doc", "fullCode":"(invoker, ...)=>{...; const json = await invoker(...); ...; return apiResult;}"}', - // '{"funName":"listBoards","params":["invoker","apiKey"],"documents":"This function lists all boards.\\n\\n@param {Function} invoker - A function that makes the actual API call.\\n@param {string} apiKey - Your secret API key.\\n\\n@returns {Promise} A promise that resolves to an object containing the API result.\\n@property {Array} boards - An array of board objects.\\n@property {string} boards[].id - A unique identifier for the board.\\n@property {string} boards[].created - Time at which the board was created, in ISO 8601 format.\\n@property {boolean} boards[].isPrivate - Whether or not the board is set as private in the administrative settings.\\n@property {string} boards[].name - The board\'s name.\\n@property {number} boards[].postCount - The number of non-deleted posts associated with the board. This number includes posts that are marked as closed or complete.\\n@property {boolean} boards[].privateComments - Whether or not comments left on posts can be viewed by other end-users.\\n@property {string} boards[].url - The URL to the board\'s page.\\n@property {boolean} hasMore - Specifies whether this query returns more boards than the limit.","fullCode":"(invoker, apiKey) => {\\n const requestBody = {\\n apiKey\\n };\\n const options = {\\n method: \'POST\',\\n path: \'/boards/list\',\\n body: JSON.stringify(requestBody),\\n headers: {\'Content-Type\': \'application/json\'},\\n };\\n try {\\n const json = await invoker(options);\\n if (json.status !== 200) {\\n throw new Error(Request failed with status ${json.status});\\n }\\n return json.apiResult;\\n } catch (error) {\\n console.error(error);\\n throw error;\\n }\\n}"}', - // ), - // addLlmCache( - // 2, - // 'api2Function', - // 'Please convert below API doc of format restAPI:\n{ "POST:/boards/retrieve": {"summary":"Retrieve board","requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"apiKey":{"type":"string","description":"Your secret API key."},"id":{"type":"string","description":"The board\'s unique identifier."}},"required":["apiKey","id"]}}},"required":true},"responses":{"200":{"description":"Returns a board object, if a valid id was supplied.","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string","description":"A unique identifier for the board."},"created":{"type":"string","description":"Time at which the board was created, in ISO 8601 format."},"isPrivate":{"type":"boolean","description":"Whether or not the board is set as private in the administrative settings."},"name":{"type":"string","description":"The board\'s name."},"postCount":{"type":"integer","description":"The number of non-deleted posts associated with the board. This number includes posts that are marked as closed or complete."},"privateComments":{"type":"boolean","description":"Whether or not comments left on posts can be viewed by other end-users."},"url":{"type":"string","description":"The URL to the board\'s page."}}}}}}}} }\n\ninto a js function, the function must be as follows:\n// the `invoker` function do the real invocation\nasync (invoker: (req:{ path: string; method: string; headers?: { [key: string]: string }; query?: { [key: string]: string }; params?: { [key: string]: string }; files?: { [key: string]: any }; body?: any; form?: any;})=>Promise<{ apiResult: any; headers?: { [key: string]: string }; status?: number; statusText?: string;}>, ...apiParams) {...; const json = await invoker(...); ...; return apiResult; }\n\nplease generate the js function with **full implementation and error handling**! output a single-line json object:\n{"funName":"function name", "params":["invoker", ...apiParams]"documents":"formal js function documentation with description of params and response object with **all properties elaborated** exactly same as the API doc", "fullCode":"(invoker, ...)=>{...; const json = await invoker(...); ...; return apiResult;}"}', - // '{"funName":"retrieveBoard","params":["invoker","apiKey","id"],"documents":"This function retrieves a board object given a valid API key and board ID.\\n\\nParameters:\\n- invoker: A function that performs the actual API call.\\n- apiKey: Your secret API key.\\n- pk: The board\'s unique identifier.\\n\\nReturns:\\nAn object containing the board details if a valid id was supplied. The object properties are:\\n- pk: A unique identifier for the board.\\n- created: Time at which the board was created, in ISO 8601 format.\\n- isPrivate: Whether or not the board is set as private in the administrative settings.\\n- name: The board\'s name.\\n- postCount: The number of non-deleted posts associated with the board. This number includes posts that are marked as closed or complete.\\n- privateComments: Whether or not comments left on posts can be viewed by other end-users.\\n- url: The URL to the board\'s page.","fullCode":"(invoker, apiKey, id) => {\\n const req = {\\n path: \'/boards/retrieve\',\\n method: \'POST\',\\n headers: { \'Content-Type\': \'application/json\' },\\n body: JSON.stringify({\\n apiKey, id\\n })\\n };\\n try {\\n const resp = await invoker(req);\\n if (resp.status !== 200) {\\n throw new Error(`Failed to retrieve board. Status: ${resp.status}`);\\n }\\n return resp.result;\\n } catch (error) {\\n console.error(error);\\n throw error;\\n }\\n}"}', - // ), - // addLlmCache( - // 3, - // 'api2Function', - // 'Please convert below API doc of format restAPI:\n{ "POST:/categories/list": {"summary":"List categories","requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"apiKey":{"type":"string","description":"Your secret API key."},"boardID":{"type":"string","description":"The id of the board you\'d like to fetch categories for."},"limit":{"type":"integer","description":"The number of categories you\'d like to fetch. Defaults to 10 if not specified. Max of 10000."},"skip":{"type":"integer","description":"The number of categories you\'d like to skip before starting to fetch. Defaults to 0 if not specified."}},"required":["apiKey"]}}},"required":true},"responses":{"200":{"description":"A dictionary with a \\"categories\\" property that contains an array of tag objects. There\'s also a \\"hasMore\\" property that specifies whether this query returns more categories than the limit.","content":{"application/json":{"schema":{"type":"object","properties":{"categories":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","description":"A unique identifier for the category."},"board":{"type":"object","properties":{"id":{"type":"string","description":"A unique identifier for the board."},"created":{"type":"string","description":"Time at which the board was created, in ISO 8601 format."},"isPrivate":{"type":"boolean","description":"Whether or not the board is set as private in the administrative settings."},"name":{"type":"string","description":"The board\'s name."},"postCount":{"type":"integer","description":"The number of non-deleted posts associated with the board. This number includes posts that are marked as closed or complete."},"privateComments":{"type":"boolean","description":"Whether or not comments left on posts can be viewed by other end-users."},"url":{"type":"string","description":"The URL to the board\'s page."}},"description":"The board this category is associated with."},"created":{"type":"string","description":"Time at which the category was created, in ISO 8601 format."},"name":{"type":"string","description":"The name of the category."},"parentID":{"type":"string","description":"The id of the parent category. If this category is not a sub category, this field will be null."},"postCount":{"type":"integer","description":"The number of posts that have been assigned this category."},"url":{"type":"string","description":"The URL to the board, filtered to just posts that have been assigned this category."}}}},"hasMore":{"type":"boolean","description":"Specifies whether this query returns more categories than the limit."}}}}}}}} }\n\ninto a js function, the function must be as follows:\n// the `invoker` function do the real invocation\nasync (invoker: (req:{ path: string; method: string; headers?: { [key: string]: string }; query?: { [key: string]: string }; params?: { [key: string]: string }; files?: { [key: string]: any }; body?: any; form?: any;})=>Promise<{ apiResult: any; headers?: { [key: string]: string }; status?: number; statusText?: string;}>, ...apiParams) {...; const json = await invoker(...); ...; return apiResult; }\n\nplease generate the js function with **full implementation and error handling**! output a single-line json object:\n{"funName":"function name", "params":["invoker", ...apiParams]"documents":"formal js function documentation with description of params and response object with **all properties elaborated** exactly same as the API doc", "fullCode":"(invoker, ...)=>{...; const json = await invoker(...); ...; return apiResult;}"}', - // '{"funName":"listCategories","params":["invoker","apiKey","boardID","limit","skip"],"documents":"This function lists categories based on the provided API key, board ID, limit, and skip parameters.\\n\\nParameters:\\n- `invoker`: A function that performs the actual API call.\\n- `apiKey`: Your secret API key.\\n- `boardID`: The id of the board you\'d like to fetch categories for.\\n- `limit`: The number of categories you\'d like to fetch. Defaults to 10 if not specified. Max of 10000.\\n- `skip`: The number of categories you\'d like to skip before starting to fetch. Defaults to 0 if not specified.\\n\\nReturns:\\nAn object containing the categories and a hasMore property that specifies whether this query returns more categories than the limit.","fullCode":"(invoker, apiKey, boardID, limit = 10, skip = 0) => {\\n const reqBody = {\\n apiKey, boardID,\\n limit: Math.min(Math.max(limit, 0), 10000),\\n skip: Math.max(skip, 0)\\n };\\n const resp = await invoker({\\n path: \'/categories/list\',\\n method: \'POST\',\\n body: reqBody\\n });\\n if (resp.status !== 200) {\\n throw new Error(`API request failed with status ${resp.status}: ${resp.statusText}`);\\n }\\n return resp.result;\\n}"}', - // ), addLlmCache( prisma, - 'map2Function', - 'given below service functions:\nclass new-test-callgent {\n "function name: POST:/boards/list": {"params":[invoker,apiKey], "documents":"This function lists all boards.\n\n@param {Function} invoker - A function that makes the actual API call.\n@param {string} apiKey - Your secret API key.\n\n@returns {Promise} A promise that resolves to an object containing the API result.\n@property {Array} boards - An array of board objects.\n@property {string} boards[].id - A unique identifier for the board.\n@property {string} boards[].created - Time at which the board was created, in ISO 8601 format.\n@property {boolean} boards[].isPrivate - Whether or not the board is set as private in the administrative settings.\n@property {string} boards[].name - The board\'s name.\n@property {number} boards[].postCount - The number of non-deleted posts associated with the board. This number includes posts that are marked as closed or complete.\n@property {boolean} boards[].privateComments - Whether or not comments left on posts can be viewed by other end-users.\n@property {string} boards[].url - The URL to the board\'s page.\n@property {boolean} hasMore - Specifies whether this query returns more boards than the limit."},\n\n}\nand an service `invoker` function.\n\nPlease choose one function to fulfill below request:\n{\n"requesting function": "POST:/boards/list",\n"request from": "restAPI",\n"request_object": {"url":"/boards/list","method":"POST","headers":{"host":"127.0.0.1:3300","connection":"close","content-length":"0"},"query":{}},\n}\nand code for request_object to chosen function args mapping. if any data missing/unclear/ambiguous from request_object to invocation args, please ask question to the caller in below json.question field.\n\noutput a single-line json object:\n{ "funName": "the function name to be invoked", "params":"param names of the chosen function", "mapping": "the js function (invoker, request_object)=>{...;return functionArgsArray;}, full implementation to return the **real** args from request_object to invoke the chosen service function. don\'t use data not exist or ambiguous in request", "question": "question to ask the caller if anything not sure or missing for request to args mapping, *no* guess or assumption of the mapping. null if the mapping is crystal clear." }"}', - '{"funName":"POST:/boards/list","params":["invoker","apiKey"],"mapping":"(invoker, request_object)=>{ let apiKey = request_object.params.ids; return [invoker, apiKey]; }","question":"What is the API key for this request? It is not provided in the request_object."}', + 'map2Endpoints', + 'given below service endpoints:\nclass new-test-callgent {\n "endpoint name: POST:/boards/list": {"params":[invoker,apiKey], "documents":"This function lists all boards.\n\n@param {Function} invoker - A function that makes the actual API call.\n@param {string} apiKey - Your secret API key.\n\n@returns {Promise} A promise that resolves to an object containing the API result.\n@property {Array} boards - An array of board objects.\n@property {string} boards[].id - A unique identifier for the board.\n@property {string} boards[].created - Time at which the board was created, in ISO 8601 format.\n@property {boolean} boards[].isPrivate - Whether or not the board is set as private in the administrative settings.\n@property {string} boards[].name - The board\'s name.\n@property {number} boards[].postCount - The number of non-deleted posts associated with the board. This number includes posts that are marked as closed or complete.\n@property {boolean} boards[].privateComments - Whether or not comments left on posts can be viewed by other end-users.\n@property {string} boards[].url - The URL to the board\'s page.\n@property {boolean} hasMore - Specifies whether this query returns more boards than the limit."},\n\n}\nand an service `invoker` function.\n\nPlease choose one function to fulfill below request:\n{\n"requesting function": "POST:/boards/list",\n"request from": "restAPI",\n"request_object": {"url":"/boards/list","method":"POST","headers":{"host":"127.0.0.1:3300","connection":"close","content-length":"0"},"query":{}},\n}\nand code for request_object to chosen function args mapping. if any data missing/unclear/ambiguous from request_object to invocation args, please ask question to the caller in below json.question field.\n\noutput a single-line json object:\n{ "epName": "the endpoint name to be invoked", "params":"param names of the chosen function", "mapping": "the js function (invoker, request_object)=>{...;return functionArgsArray;}, full implementation to return the **real** args from request_object to invoke the chosen service function. don\'t use data not exist or ambiguous in request", "question": "question to ask the caller if anything not sure or missing for request to args mapping, *no* guess or assumption of the mapping. null if the mapping is crystal clear." }"}', + '{"endpoint":"POST:/boards/list","args":["invoker","apiKey"],"mapping":"(invoker, request_object)=>{ let apiKey = request_object.params.ids; return [invoker, apiKey]; }","question":"What is the API key for this request? It is not provided in the request_object."}', ), - // addLlmCache( - // 5, - // 'api2Function', - // 'Please convert below API doc of format restAPI:\n{ "GET:/positions": {"summary":"List all job positions","description":"Retrieve a list of all available job positions.","operationId":"listPositions","responses":{"200":{"description":"A list of job positions","content":{"application/json":{"schema":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","description":"Unique identifier for the job position"},"title":{"type":"string","description":"Title of the job position"},"description":{"type":"string","description":"Description of the job position"},"location":{"type":"string","description":"Location of the job position"},"requirements":{"type":"array","items":{"type":"string"},"description":"List of requirements for the job position"},"createdAt":{"type":"string","format":"date-time","description":"Timestamp when the job position was created"},"updatedAt":{"type":"string","format":"date-time","description":"Timestamp when the job position was last updated"}}}}}}},"500":{"description":"Internal Server Error"}}} }\n\ninto a js function, the function must be as follows:\n// the `invoker` function do the real invocation\nasync (invoker: (req:{ path: string; method: string; headers?: { [key: string]: string }; query?: { [key: string]: string }; params?: { [key: string]: string }; files?: { [key: string]: any }; body?: any; form?: any;})=>Promise<{ apiResult: any; headers?: { [key: string]: string }; status?: number; statusText?: string;}>, ...apiParams) {...; const json = await invoker(...); ...; return apiResult; }\n\nplease generate the js function with **full implementation and error handling**! output a single-line json object:\n{"funName":"function name", "params":["invoker", ...apiParams]"documents":"formal js function documentation with description of params and response object with **all properties elaborated** exactly same as the API doc", "fullCode":"(invoker, ...)=>{...; const json = await invoker(...); ...; return apiResult;}"}', - // '{"funName":"listPositions","params":["invoker"],"documents":"/**\n * List all job positions\n * Retrieve a list of all available job positions.\n * @param {Function} invoker - The function that performs the real invocation.\n * @returns {Promise} - A promise that resolves to an object containing the API result.\n * @property {Array} apiResult - A list of job positions.\n * @property {string} apiResult[].id - Unique identifier for the job position.\n * @property {string} apiResult[].title - Title of the job position.\n * @property {string} apiResult[].description - Description of the job position.\n * @property {string} apiResult[].location - Location of the job position.\n * @property {Array} apiResult[].requirements - List of requirements for the job position.\n * @property {string} apiResult[].createdAt - Timestamp when the job position was created.\n * @property {string} apiResult[].updatedAt - Timestamp when the job position was last updated.\n */","fullCode":"async (invoker) => {\n try {\n const json = await invoker({\n path: \'/positions\',\n method: \'GET\'\n });\n if (json.status === 200) {\n return json.apiResult;\n } else if (json.status === 500) {\n throw new Error(\'Internal Server Error\');\n } else {\n throw new Error(\'Unexpected status code: \' + json.status);\n }\n } catch (error) {\n console.error(\'Error fetching job positions:\', error);\n throw error;\n }\n}"}', - // ), - // addLlmCache( - // 6, - // 'api2Function', - // 'Please convert below API doc of format restAPI:\n{ "GET:/positions/{positionId}": {"summary":"View a specific job position","description":"Retrieve details of a specific job position by its ID.","operationId":"viewPosition","parameters":[{"name":"positionId","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the job position to retrieve"}],"responses":{"200":{"description":"Details of the job position","content":{"application/json":{"schema":{"type":"object","properties":{"id":{"type":"string","description":"Unique identifier for the job position"},"title":{"type":"string","description":"Title of the job position"},"description":{"type":"string","description":"Description of the job position"},"location":{"type":"string","description":"Location of the job position"},"requirements":{"type":"array","items":{"type":"string"},"description":"List of requirements for the job position"},"createdAt":{"type":"string","format":"date-time","description":"Timestamp when the job position was created"},"updatedAt":{"type":"string","format":"date-time","description":"Timestamp when the job position was last updated"}}}}}},"404":{"description":"Job position not found"},"500":{"description":"Internal Server Error"}}} }\n\ninto a js function, the function must be as follows:\n// the `invoker` function do the real invocation\nasync (invoker: (req:{ path: string; method: string; headers?: { [key: string]: string }; query?: { [key: string]: string }; params?: { [key: string]: string }; files?: { [key: string]: any }; body?: any; form?: any;})=>Promise<{ apiResult: any; headers?: { [key: string]: string }; status?: number; statusText?: string;}>, ...apiParams) {...; const json = await invoker(...); ...; return apiResult; }\n\nplease generate the js function with **full implementation and error handling**! output a single-line json object:\n{"funName":"function name", "params":["invoker", ...apiParams]"documents":"formal js function documentation with description of params and response object with **all properties elaborated** exactly same as the API doc", "fullCode":"(invoker, ...)=>{...; const json = await invoker(...); ...; return apiResult;}"}', - // '{"funName":"viewPosition","params":["invoker","positionId"],"documents":"/**\\n * View a specific job position\\n * Retrieve details of a specific job position by its ID.\\n * @param {Function} invoker - The function that performs the real invocation.\\n * @param {string} positionId - The ID of the job position to retrieve.\\n * @returns {Promise} - A promise that resolves to the job position details.\\n * @property {string} id - Unique identifier for the job position.\\n * @property {string} title - Title of the job position.\\n * @property {string} description - Description of the job position.\\n * @property {string} location - Location of the job position.\\n * @property {Array} requirements - List of requirements for the job position.\\n * @property {string} createdAt - Timestamp when the job position was created.\\n * @property {string} updatedAt - Timestamp when the job position was last updated.\\n */","fullCode":"async (invoker, positionId) => {\\n try {\\n const json = await invoker({\\n path: `/positions/${positionId}`,\\n method: \'GET\',\\n params: { positionId }\\n });\\n if (json.status === 200) {\\n return json.apiResult;\\n } else if (json.status === 404) {\\n throw new Error(\'Job position not found\');\\n } else if (json.status === 500) {\\n throw new Error(\'Internal Server Error\');\\n }\\n } catch (error) {\\n throw new Error(`Error fetching job position: ${error.message}`);\\n }\\n}"}', - // ), - // addLlmCache( - // 7, - // 'api2Function', - // 'Please convert below API doc of format restAPI:\n{ "POST:/positions/{positionId}/apply": {"summary":"Apply for a position","description":"Submit an application for a specific job position.","operationId":"applyForPosition","parameters":[{"name":"positionId","in":"path","required":true,"schema":{"type":"string"},"description":"The ID of the job position to apply for"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"applicantName":{"type":"string","description":"Name of the applicant"},"email":{"type":"string","format":"email","description":"Email address of the applicant"},"resume":{"type":"string","format":"binary","description":"Resume of the applicant"},"coverLetter":{"type":"string","description":"Cover letter of the applicant"},"appliedAt":{"type":"string","format":"date-time","description":"Timestamp when the application was submitted"}}}}}},"responses":{"201":{"description":"Application submitted successfully"},"400":{"description":"Invalid input"},"404":{"description":"Job position not found"},"500":{"description":"Internal Server Error"}}} }\n\ninto a js function, the function must be as follows:\n// the `invoker` function do the real invocation\nasync (invoker: (req:{ path: string; method: string; headers?: { [key: string]: string }; query?: { [key: string]: string }; params?: { [key: string]: string }; files?: { [key: string]: any }; body?: any; form?: any;})=>Promise<{ apiResult: any; headers?: { [key: string]: string }; status?: number; statusText?: string;}>, ...apiParams) {...; const json = await invoker(...); ...; return apiResult; }\n\nplease generate the js function with **full implementation and error handling**! output a single-line json object:\n{"funName":"function name", "params":["invoker", ...apiParams]"documents":"formal js function documentation with description of params and response object with **all properties elaborated** exactly same as the API doc", "fullCode":"(invoker, ...)=>{...; const json = await invoker(...); ...; return apiResult;}"}', - // '{"funName":"applyForPosition","params":["invoker","positionId","applicantName","email","resume","coverLetter","appliedAt"],"documents":"/**\\n * Apply for a position\\n * @param {Function} invoker - The function that performs the actual API invocation.\\n * @param {string} positionId - The ID of the job position to apply for.\\n * @param {string} applicantName - Name of the applicant.\\n * @param {string} email - Email address of the applicant.\\n * @param {string} resume - Resume of the applicant.\\n * @param {string} coverLetter - Cover letter of the applicant.\\n * @param {string} appliedAt - Timestamp when the application was submitted.\\n * @returns {Promise<{apiResult: any, headers?: { [key: string]: string }, status?: number, statusText?: string}>} The result of the API call.\\n */","fullCode":"async (invoker, positionId, applicantName, email, resume, coverLetter, appliedAt) => {\\n try {\\n const req = {\\n path: `/positions/${positionId}/apply`,\\n method: \'POST\',\\n headers: {\\n \'Content-Type\': \'application/json\'\\n },\\n body: {\\n applicantName,\\n email,\\n resume,\\n coverLetter,\\n appliedAt\\n }\\n };\\n const json = await invoker(req);\\n if (json.status === 201) {\\n return { apiResult: json.apiResult, headers: json.headers, status: json.status, statusText: json.statusText };\\n } else if (json.status === 400) {\\n throw new Error(\'Invalid input\');\\n } else if (json.status === 404) {\\n throw new Error(\'Job position not found\');\\n } else if (json.status === 500) {\\n throw new Error(\'Internal Server Error\');\\n } else {\\n throw new Error(\'Unknown error\');\\n }\\n } catch (error) {\\n console.error(\'Error applying for position:\', error.message);\\n throw error;\\n }\\n}"}', - // ), addLlmCache( prisma, - 'map2Function', + 'map2Endpoints', 'given below service APIs:\nservice test-callgent {\n "API: GET /positions": {"endpoint": "GET /positions", "summary":"listPositions: List all job positions", "description":"Retrieve a list of all available job positions.", "params":{}, "responses":{"200":{"description":"A list of job positions","content":{"application/json":{"schema":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","description":"Unique identifier for the job position"},"title":{"type":"string","description":"Title of the job position"},"description":{"type":"string","description":"Description of the job position"},"location":{"type":"string","description":"Location of the job position"},"requirements":{"type":"array","items":{"type":"string"},"description":"List of requirements for the job position"},"createdAt":{"type":"string","format":"date-time","description":"Timestamp when the job position was created"},"updatedAt":{"type":"string","format":"date-time","description":"Timestamp when the job position was last updated"}}}}}}},"500":{"description":"Internal Server Error"}} },\n}\n\nPlease choose one API to fulfill below request:\n{\n"requesting endpoint": "GET /positions",\n"request from": "restAPI",\n"request_object": {"url":"/positions","method":"GET","headers":{"accept":"*/*","accept-encoding":"gzip, deflate, br","cache-control":"no-cache","connection":"keep-alive","host":"127.0.0.1:3000","user-agent":"Apifox/1.0.0 (https://apifox.com)"},"query":{}},\n}\nand code for request_object to chosen function args mapping. if any data missing/unclear/ambiguous from request_object to invocation args, please ask question to the caller in below json.question field.\n\noutput a single-line json object:\n{ "endpoint": "the chosen API endpoint to be invoked", "args":"params/body/headers/..., with same structure as the \'params\' JSON object(no more args than it) with additional \'value\' prop, or null if no args needed", "mapping": "if the the request_object is structured (or null if unstructured), generate the js function (request_object)=>{...;return API_signature_args;}, full implementation to return the **real** args from request_object to invoke the API. don\'t use data not exist or ambiguous in request", "question": "question to ask the caller if anything not sure or missing for request to args mapping, *no* guess or assumption of the mapping. null if the mapping is crystal clear." }"}', '{ "endpoint": "GET /positions", "args": null, "mapping": "(request_object)=>{return null;}", "question": null }', ), addLlmCache( prisma, - 'map2Function', + 'map2Endpoints', 'given below service APIs:\nservice test-callgent {\n "API: POST /api/users/send-confirm-email": {"endpoint": "POST /api/users/send-confirm-email", "summary":"UsersController_sendConfirmEmail: Reset password by sending validation email with reset url", "description":" Tags: Users", "params":{"parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"email":{"type":"string","example":"user@example.com","nullable":false},"create":{"type":"boolean","description":"If true, a new user will be created if not exists.","nullable":true},"resetPwd":{"type":"boolean","description":"If set to false, only validating email. Note: new user forces resetPwd.","nullable":true}},"required":["email"]}}}}}, "responses":{"201":{"description":"","content":{"application/json":{"schema":{"allOf":[{"type":"object","properties":{"statusCode":{"type":"number","description":"Status code, empty means success"},"message":{"type":"string"},"data":{"type":"object"},"meta":{"type":"object","description":"Pagination, usage, quotation, profiling, versions, HATEOAS, etc."}},"required":["data"]},{"properties":{"data":{"type":"boolean"}}}]}}}}} },\n}\n\nPlease choose one API to fulfill below request:\n{\n"requesting endpoint": "POST /api/users/send-confirm-email",\n"request from": "restAPI",\n"request_object": {"url":"/api/users/send-confirm-email","method":"POST","headers":{"accept":"*/*","accept-encoding":"gzip, deflate, br","cache-control":"no-cache","connection":"keep-alive","content-length":"53","content-type":"application/json","host":"127.0.0.1:3000","user-agent":"Apifox/1.0.0 (https://apifox.com)"},"params":{},"data":{"email":"dev@callgent.com","resetPwd":true}},\n}\nand code for request_object to chosen function args mapping. if any data missing/unclear/ambiguous from request_object to invocation args, please ask question to the caller in below json.question field.\n\noutput a single-line json object:\n{ "endpoint": "the chosen API endpoint to be invoked", "args":"params/body/headers/..., with same structure as the \'params\' JSON object(no more args than it) with additional \'value\' prop, or null if no args needed", "mapping": "if the the request_object is structured (or null if unstructured), generate the js function (request_object)=>{...;return API_signature_args;}, full implementation to return the **real** args from request_object to invoke the API. don\'t use data not exist or ambiguous in request", "question": "question to ask the caller if anything not sure or missing for request to args mapping, *no* guess or assumption of the mapping. null if the mapping is crystal clear." }"}', '```json\n{\n "endpoint": "POST /api/users/send-confirm-email",\n "args": {\n "params": null,\n "body": {\n "email": { "value": "dev@callgent.com" },\n "resetPwd": { "value": true }\n },\n "headers": null\n },\n "mapping": "(request_object) => {\n const { data } = request_object;\n return {\n body: {\n email: { value: data.email },\n resetPwd: { value: data.resetPwd }\n }\n };\n }",\n "question": null\n}\n```', ), addLlmCache( prisma, - 'map2Function', + 'map2Endpoints', 'given below service APIs:\nservice test-callgent {\n "API: POST /api/users/send-confirm-email": {"endpoint": "POST /api/users/send-confirm-email", "summary":"UsersController_sendConfirmEmail: Reset password by sending validation email with reset url", "description":" Tags: Users", "params":{"parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"email":{"type":"string","example":"user@example.com","nullable":false},"create":{"type":"boolean","description":"If true, a new user will be created if not exists.","nullable":true},"resetPwd":{"type":"boolean","description":"If set to false, only validating email. Note: new user forces resetPwd.","nullable":true}},"required":["email"]}}}}}, "responses":{"201":{"description":"","content":{"application/json":{"schema":{"allOf":[{"type":"object","properties":{"statusCode":{"type":"number","description":"Status code, empty means success"},"message":{"type":"string"},"data":{"type":"object"},"meta":{"type":"object","description":"Pagination, usage, quotation, profiling, versions, HATEOAS, etc."}},"required":["data"]},{"properties":{"data":{"type":"boolean"}}}]}}}}} },\n}\n\nPlease choose one API to fulfill below request:\n{\n"requesting endpoint": "POST /api/users/send-confirm-email",\n"request from": "restAPI",\n"request_object": {"url":"/api/users/send-confirm-email","method":"POST","headers":{"accept":"*/*","accept-encoding":"gzip, deflate, br","connection":"keep-alive","content-length":"53","content-type":"application/json","host":"127.0.0.1:3000","user-agent":"Apifox/1.0.0 (https://apifox.com)"},"params":{},"data":{"email":"dev@callgent.com","resetPwd":true}},\n}\nand code for request_object to chosen function args mapping. if any data missing/unclear/ambiguous from request_object to invocation args, please ask question to the caller in below json.question field.\n\noutput a single-line json object:\n{ "endpoint": "the chosen API endpoint to be invoked", "args":"params/body/headers/..., with same structure as the \'params\' JSON object(no more args than it) with additional \'value\' prop, or null if no args needed", "mapping": "if the the request_object is structured (or null if unstructured), generate the js function (request_object)=>{...;return API_signature_args;}, full implementation to return the **real** args from request_object to invoke the API. don\'t use data not exist or ambiguous in request", "question": "question to ask the caller if anything not sure or missing for request to args mapping, *no* guess or assumption of the mapping. null if the mapping is crystal clear." }"}', '```json\n{\n "endpoint": "POST /api/users/send-confirm-email",\n "args": {\n "params": null,\n "body": {\n "email": { "value": "dev@callgent.com" },\n "resetPwd": { "value": true }\n },\n "headers": null\n },\n "mapping": "(request_object) => {\n const { data } = request_object;\n return {\n body: {\n email: { value: data.email },\n resetPwd: { value: data.resetPwd }\n }\n };\n }",\n "question": null\n}\n```', ), diff --git a/prisma/seed.ts b/prisma/seed.ts index 83d83cf..a052cc7 100644 --- a/prisma/seed.ts +++ b/prisma/seed.ts @@ -82,8 +82,7 @@ function initEventListeners( serviceType: 'SERVICE', serviceName: 'EndpointsService', funName: 'loadFunctions', - description: - 'Load all entries of the callgent into event.context.functions', + description: 'Load all endpoints into event.context.endpoints', createdBy: 'GLOBAL', priority: (priority += 100), }, @@ -102,16 +101,30 @@ function initEventListeners( priority: (priority += 100), }, { - id: 'CR-MAP-2-FUNCTION', + id: 'CR-MAP-2-ENDPOINT', srcId: 'GLOBAL', tenantPk: 0, eventType: 'CLIENT_REQUEST', dataType: '*', serviceType: 'SERVICE', serviceName: 'AgentsService', - funName: 'map2Function', + funName: 'map2Endpoints', + description: + 'Map the request to endpoints and corresponding args, put into event.context.map2Endpoints and event.context.endpoints[0]', + createdBy: 'GLOBAL', + priority: (priority += 100), + }, + { + id: 'CR-GENERATE-WEBPAGE', + srcId: 'GLOBAL', + tenantPk: 0, + eventType: 'CLIENT_REQUEST', + dataType: 'Webpage', + serviceType: 'SERVICE', + serviceName: 'AgentsService', + funName: 'map2Endpoints', description: - 'Map the request to a endpoint function and corresponding args, put into event.context.map2Function and event.context.functions[0]', + 'Map the request to a endpoint function and corresponding args, put into event.context.map2Endpoints and event.context.endpoints[0]', createdBy: 'GLOBAL', priority: (priority += 100), }, @@ -185,10 +198,10 @@ into a js function, the function must be as follows: async (invoker: {{=it.handle}}, ...apiParams) {...; const json = await invoker(...); ...; return apiResult; } please generate the js function with **full implementation and error handling**! output a single-line json object: -{"funName":"function name", "params":["invoker", ...apiParams]"documents":"formal js function documentation with description of params and response object with **all properties elaborated** exactly same as the API doc", "fullCode":"(invoker, ...)=>{...; const json = await invoker(...); ...; return apiResult;}"}`, +{"epName":"endpoint name", "params":["invoker", ...apiParams]"documents":"formal js function documentation with description of params and response object with **all properties elaborated** exactly same as the API doc", "fullCode":"(invoker, ...)=>{...; const json = await invoker(...); ...; return apiResult;}"}`, }, { - name: 'map2Function', + name: 'map2Endpoints', prompt: `given below service APIs: service {{=it.callgentName}} {{{~ it.endpoints :fun }} "API: {{=fun.name}}": {"endpoint": "{{=fun.name}}", "summary":"{{=fun.summary}}", {{=fun.description ? '"description":"'+fun.description+'", ':''}}"params":{{=JSON.stringify(fun.params)}}, "responses":{{=JSON.stringify(fun.responses)}} }, @@ -196,7 +209,7 @@ service {{=it.callgentName}} {{{~ it.endpoints :fun }} Please choose one API to fulfill below request: { -{{ if (it.funName) { }}"requesting endpoint": "{{=it.funName}}", +{{ if (it.epName) { }}"requesting endpoint": "{{=it.epName}}", {{ } }}"request from": "{{=it.cepAdaptor}}", "request_object": {{=JSON.stringify(it.req)}}, } diff --git a/src/agents/agents.service.ts b/src/agents/agents.service.ts index 44b7d77..9f6ccbf 100644 --- a/src/agents/agents.service.ts +++ b/src/agents/agents.service.ts @@ -24,28 +24,28 @@ export class AgentsService { // handle, // ...args, // }, - // { funName: '', params: [''], documents: '', fullCode: '' }, + // { epName: '', params: [''], documents: '', fullCode: '' }, // ); // } /** * map req to an API function, generate args(with vars/conversations), argsMapping function if applicable */ - async map2Function( + async map2Endpoints( reqEvent: ClientRequestEvent, ): Promise { const { id, srcId, dataType: cepAdaptor, - data: { callgentName, funName, progressive }, + data: { callgentName, epName, progressive }, context: { tgtEvents, req }, } = reqEvent; const endpoints = reqEvent.context - .functions as unknown as EndpointDto[]; + .endpoints as unknown as EndpointDto[]; if (!endpoints?.length) throw new BadRequestException( - 'No functions for mapping, ClientRequestEvent#' + id, + 'No endpoints for mapping, ClientRequestEvent#' + id, ); // FIXME map from all targetId events @@ -53,12 +53,12 @@ export class AgentsService { // TODO how to use mapping function: for specific req & function const mapped = await this.llmService.template( - 'map2Function', - { req, funName, callgentName, cepAdaptor, endpoints }, + 'map2Endpoints', + { req, epName, callgentName, cepAdaptor, endpoints }, { endpoint: '', args: {}, mapping: '', question: '' }, id, - ); // TODO check `funName` exists in endpoints, validating `mapping` - reqEvent.context.map2Function = mapped; + ); // TODO check `epName` exists in endpoints, validating `mapping` + reqEvent.context.map2Endpoints = mapped; if (mapped.question) { if (!progressive) @@ -86,12 +86,12 @@ export class AgentsService { return { data: reqEvent, resumeFunName: 'map2FunctionProgressive' }; throw new HttpException(message, statusCode); } else { - const functions = reqEvent.context.functions.filter( + const endpoints = reqEvent.context.endpoints.filter( (f) => f.name == mapped.endpoint, ); - if (functions?.length != 1) + if (endpoints?.length != 1) throw new BadRequestException('Failed to map to function: ' + mapped); - reqEvent.context.functions = functions; + reqEvent.context.endpoints = endpoints; mapped.args = this._args2List30x(mapped.args); } @@ -139,7 +139,7 @@ export class AgentsService { { args, resp, fun }, { statusCode: 200, data: {} }, eventId, - ); // TODO check `funName` exists in endpoints, validating `mapping` + ); // TODO check `epName` exists in endpoints, validating `mapping` return { statusCode: mapped.statusCode, data: mapped.data }; } diff --git a/src/agents/events/progressive-request.event.ts b/src/agents/events/progressive-request.event.ts index e16870e..8faece3 100644 --- a/src/agents/events/progressive-request.event.ts +++ b/src/agents/events/progressive-request.event.ts @@ -7,7 +7,7 @@ export class ProgressiveRequestEvent extends EventObject { fromEvent: string, dataType: string, public readonly data: { - /** url template for progressive requesting, `callgent:funName[@callgent]` to invoke callgent */ + /** url template for progressive requesting, `callgent:epName[@callgent]` to invoke callgent */ progressive: string; }, ) { diff --git a/src/callgent-hub/callgent-hub.service.ts b/src/callgent-hub/callgent-hub.service.ts index 5212773..6a33425 100644 --- a/src/callgent-hub/callgent-hub.service.ts +++ b/src/callgent-hub/callgent-hub.service.ts @@ -166,10 +166,10 @@ export class CallgentHubService { ); this.tenancyService.setTenantId(fromTenant); - const functionMap = {}; + const endpointMap = {}; await Promise.all( ens.map(async (epOld) => { - const functions = await this.endpointsService.findAll({ + const endpoints = await this.endpointsService.findAll({ where: { entryId: epOld.id }, orderBy: { pk: 'asc' }, select: { @@ -184,7 +184,7 @@ export class CallgentHubService { rawJson: true, }, }); - functionMap[epOld.id] = functions; + endpointMap[epOld.id] = endpoints; }), ); @@ -201,7 +201,7 @@ export class CallgentHubService { }); return Promise.all( - functionMap[epOld.id].map((fun) => { + endpointMap[epOld.id].map((fun) => { const securities: any[] = dupSecurities(fun.securities); return this.endpointsService.create({ ...fun, diff --git a/src/callgent-realms/callgent-realms.service.ts b/src/callgent-realms/callgent-realms.service.ts index c69943f..539cba1 100644 --- a/src/callgent-realms/callgent-realms.service.ts +++ b/src/callgent-realms/callgent-realms.service.ts @@ -182,9 +182,9 @@ export class CallgentRealmsService implements OnModuleInit { async checkSepAuth( reqEvent: ClientRequestEvent, ): Promise { - // functions: Endpoint[], @see AgentsService.map2Function + // endpoints: Endpoint[], @see AgentsService.map2Endpoints const { securities, entryId: sepId } = - reqEvent.context.functions?.length && reqEvent.context.functions[0]; + reqEvent.context.endpoints?.length && reqEvent.context.endpoints[0]; const sep = sepId && (await this.entriesService.findOne(reqEvent.srcId)); if (!sep) diff --git a/src/endpoints/endpoints.service.ts b/src/endpoints/endpoints.service.ts index 6e179a4..5992337 100644 --- a/src/endpoints/endpoints.service.ts +++ b/src/endpoints/endpoints.service.ts @@ -44,31 +44,31 @@ export class EndpointsService { async loadFunctions( reqEvent: ClientRequestEvent, ): Promise { - const { funName, callgentId } = reqEvent.data; + const { epName, callgentId } = reqEvent.data; - // TODO if too many functions, use summary first - const { data: funcs } = await this.findMany({ + // TODO if too many endpoints, use summary first + const { data: eps } = await this.findMany({ select: { createdAt: false, updatedAt: false, params: null, responses: null, }, - where: { callgentId: callgentId, name: funName }, + where: { callgentId: callgentId, name: epName }, perPage: Number.MAX_SAFE_INTEGER, }); - if (!funcs.length) + if (!eps.length) throw new NotFoundException( `No function found on callgent#${callgentId}${ - funName ? ' name=' + funName : '' + epName ? ' name=' + epName : '' }`, ); - reqEvent.context.functions = funcs as any[]; + reqEvent.context.endpoints = eps as any[]; } /** * a single function invocation. simple with no vars/flow controls/lambdas/parallels. - * system callgents are involved: collection functions, timer, etc. + * system callgents are involved: collection endpoints, timer, etc. */ // protected async _invoke( // taskAction: TaskActionDto, @@ -77,7 +77,7 @@ export class EndpointsService { // ) { // // FIXME task ctx msgs // // 生成args映射方法, - // const { funName, mapping, question } = await this._mapping( + // const { epName, mapping, question } = await this._mapping( // taskAction, // callgent.name, // endpoints, @@ -91,7 +91,7 @@ export class EndpointsService { // // ); // } - // const fun = endpoints.find((f) => f.name === funName); + // const fun = endpoints.find((f) => f.name === epName); // if (!fun) return; // FIXME // // doInvoke @@ -168,7 +168,7 @@ export class EndpointsService { }, ); - // create api functions + // create api endpoints const prisma = this.txHost.tx as PrismaClient; const { count: actionsCount } = await prisma.endpoint.createMany({ data: actMap, diff --git a/src/entries/adaptors/builtin/email/email.adaptor.ts b/src/entries/adaptors/builtin/email/email.adaptor.ts index 43f757b..9bd9c52 100644 --- a/src/entries/adaptors/builtin/email/email.adaptor.ts +++ b/src/entries/adaptors/builtin/email/email.adaptor.ts @@ -60,7 +60,7 @@ export class EmailAdaptor extends EntryAdaptor { // convert resp to api format reqEvent.context.resp = await this.agentsService.convert2Response( - reqEvent?.context?.map2Function?.args, + reqEvent?.context?.map2Endpoints?.args, resp.content.text || resp.content.html, fun, reqEvent.id, diff --git a/src/entries/adaptors/builtin/restapi/restapi.controller.ts b/src/entries/adaptors/builtin/restapi/restapi.controller.ts index 139399f..6bd6ee7 100644 --- a/src/entries/adaptors/builtin/restapi/restapi.controller.ts +++ b/src/entries/adaptors/builtin/restapi/restapi.controller.ts @@ -58,7 +58,7 @@ export class RestApiController { description: 'AI agent will generate code to invoke several functional endpoints to fulfill the requirement.', }) - @Post('request') + @Post('request/:callgentId/:entryId') @ApiUnauthorizedResponse() async request(@Body() req: Requirement) { // TODO @@ -103,8 +103,8 @@ export class RestApiController { @Headers('x-callgent-timeout') timeout?: string, ) { const basePath = `invoke/${callgentId}/${entryId}/`; - let funName = req.url.substr(req.url.indexOf(basePath) + basePath.length); - if (funName) funName = Utils.formalApiName(req.method, '/' + funName); + let epName = req.url.substr(req.url.indexOf(basePath) + basePath.length); + if (epName) epName = Utils.formalApiName(req.method, '/' + epName); const callerId = req.user?.sub; // || req.ip || req.socket.remoteAddress; // TODO owner defaults to caller callgent @@ -125,21 +125,27 @@ export class RestApiController { if (!callgent) throw new NotFoundException('callgent not found: ' + callgentId); - const { data, statusCode, message } = await this.eventListenersService.emit( - new ClientRequestEvent(cep.id, taskId, cep.adaptorKey, callback, req, { - callgentId, - callgentName: callgent.name, - callerId, - progressive, - funName, - }), + const result = await this.eventListenersService.emit( + new ClientRequestEvent( + cep.id, + taskId, + cep.adaptorKey, + req, + { + callgentId, + callgentName: callgent.name, + callerId, + progressive, + epName, + }, + callback, + ), parseInt(timeout) || 0, // sync timeout ); // FIXME data - res - .status(statusCode < 0 ? 418 : statusCode < 200 ? 200 : statusCode) - .send({ data, statusCode, message }); + const code = result.statusCode || 200; // code cannot < 0 + res.status(code < 0 ? 418 : code < 200 ? 200 : code).send(result); } @ApiOperation({ diff --git a/src/entries/entries.service.ts b/src/entries/entries.service.ts index 6cb61e6..5055563 100644 --- a/src/entries/entries.service.ts +++ b/src/entries/entries.service.ts @@ -303,11 +303,11 @@ export class EntriesService { @Transactional() async invokeSEP(reqEvent: ClientRequestEvent) { - const { map2Function, functions } = reqEvent.context; - if (!map2Function || !functions?.length) + const { map2Endpoints, endpoints } = reqEvent.context; + if (!map2Endpoints || !endpoints?.length) throw new Error('Failed to invoke, No mapping function found'); - const func = functions[0] as EndpointDto; + const func = endpoints[0] as EndpointDto; const sep = await this.findOne(func.entryId, { id: true, name: true, @@ -324,7 +324,7 @@ export class EntriesService { // may returns pending result return adapter - .invoke(func, map2Function.args, sep as any, reqEvent) + .invoke(func, map2Endpoints.args, sep as any, reqEvent) .then((res) => { if (res && res.resumeFunName) return res; return this.postInvokeSEP((res && res.data) || reqEvent); @@ -335,12 +335,12 @@ export class EntriesService { @Transactional() async postInvokeSEP(reqEvent: ClientRequestEvent) { const { - context: { functions, resp }, + context: { endpoints, resp }, } = reqEvent; - if (!functions?.length) + if (!endpoints?.length) throw new Error('Failed to invoke, No mapping function found'); - const func = functions[0] as EndpointDto; + const func = endpoints[0] as EndpointDto; const sep = await this.findOne(func.entryId, { id: true, name: true, diff --git a/src/entries/events/client-request.event.ts b/src/entries/events/client-request.event.ts index 807ebcb..5f56583 100644 --- a/src/entries/events/client-request.event.ts +++ b/src/entries/events/client-request.event.ts @@ -11,11 +11,10 @@ import { EventObject } from '../../event-listeners/event-object'; export class ClientRequestEvent extends EventObject { constructor( /** client entry id */ - cepId: string, + entryId: string, /** empty to create new task */ taskId: string, dataType: string, - callback: string, req: object, public readonly data: { callgentId: string; @@ -23,12 +22,12 @@ export class ClientRequestEvent extends EventObject { /** empty means anonymous */ callerId?: string; /** requested endpoint name */ - funName?: string; - /** url template for progressive requesting, `callgent:funName[@callgent]` to invoke callgent */ + epName?: string /** url template for progressive requesting, `callgent:epName[@callgent]` to invoke callgent */; progressive?: string; }, + callback?: string, ) { - super(cepId, 'CLIENT_REQUEST', dataType, taskId, callback, 'URL'); + super(entryId, 'CLIENT_REQUEST', dataType, taskId, callback, 'URL'); this.context.req = req; } } diff --git a/src/event-listeners/event-object.ts b/src/event-listeners/event-object.ts index 4c420f4..3e90bad 100644 --- a/src/event-listeners/event-object.ts +++ b/src/event-listeners/event-object.ts @@ -9,7 +9,7 @@ export class EventObject { public readonly dataType: string, /** target id to relate several events */ public targetId: string, - /** url template for response callback, `callgent:funName[@callgent]` to invoke callgent */ + /** url template for response callback, `callgent:epName[@callgent]` to invoke callgent */ public callback?: string, public readonly callbackType: EventCallbackType = 'EVENT', ) { From f318cf0efd86fb2130619c0c43ce176f5f2c1f63 Mon Sep 17 00:00:00 2001 From: dev-callgent Date: Sat, 12 Oct 2024 09:53:35 +0800 Subject: [PATCH 096/183] feat: webpage entry: service Signed-off-by: dev-callgent --- .../migration.sql | 13 + prisma/schema.prisma | 14 +- prisma/seed.ts | 12 +- src/endpoints/endpoints.service.ts | 4 +- .../adaptors/builtin/web/webpage.adaptor.ts | 44 +-- .../builtin/web/webpage.controller.ts | 270 ++++++++++++++++++ .../adaptors/builtin/web/webpage.service.ts | 26 ++ src/entries/entries.module.ts | 5 +- src/entries/entries.service.ts | 5 +- .../event-listeners.service.ts | 6 + src/event-listeners/event-object.ts | 2 +- 11 files changed, 360 insertions(+), 41 deletions(-) create mode 100644 prisma/migrations/20241012014016_refactor_epname/migration.sql create mode 100644 src/entries/adaptors/builtin/web/webpage.controller.ts create mode 100644 src/entries/adaptors/builtin/web/webpage.service.ts diff --git a/prisma/migrations/20241012014016_refactor_epname/migration.sql b/prisma/migrations/20241012014016_refactor_epname/migration.sql new file mode 100644 index 0000000..e4101e1 --- /dev/null +++ b/prisma/migrations/20241012014016_refactor_epname/migration.sql @@ -0,0 +1,13 @@ +/* + Warnings: + + - You are about to drop the column `defaultPrevented` on the `EventStore` table. All the data in the column will be lost. + - You are about to drop the column `funName` on the `TaskAction` table. All the data in the column will be lost. + - Added the required column `preventDefault` to the `EventStore` table without a default value. This is not possible if the table is not empty. + +*/ +-- AlterTable +ALTER TABLE "EventStore" RENAME COLUMN "defaultPrevented" TO "preventDefault"; + +-- AlterTable +ALTER TABLE "TaskAction" RENAME COLUMN "funName" TO "epName"; diff --git a/prisma/schema.prisma b/prisma/schema.prisma index 950ac5e..7509aaf 100644 --- a/prisma/schema.prisma +++ b/prisma/schema.prisma @@ -371,7 +371,7 @@ model TaskAction { // client side information /// @description action owner callgent id, responsible for progressive response ceId String? @db.VarChar(36) /// @description client entry id - funName String? @db.VarChar(255) /// @description optional endpoint name + epName String? @db.VarChar(255) /// @description optional endpoint name cAdaptor String @db.VarChar(36) /// @description client adaptor key callback Json? @db.Json /// @description callback url template or endpoint progressive String? @db.VarChar(36) /// @description progressive requesting url template or endpoint @@ -594,12 +594,12 @@ model EventStore { context Json? @db.Json /// @description statusCode, 1: processing, 0: done, 2: pending: waiting for external event trigger to to resume calling current-listener.funName, <0: error - statusCode Int @default(1) - message String? @db.VarChar(255) - stopPropagation Boolean - defaultPrevented Boolean - listenerId String? @db.VarChar(36) - funName String? @db.VarChar(255) /// @description listener's function to call on pending event activated. + statusCode Int @default(1) + message String? @db.VarChar(255) + stopPropagation Boolean /// @description stop propagation to next listeners + preventDefault Boolean /// @description prevent default action, going to next listeners + listenerId String? @db.VarChar(36) + funName String? @db.VarChar(255) /// @description listener's function to call on pending event activated. createdAt DateTime @default(now()) updatedAt DateTime @default(now()) @updatedAt diff --git a/prisma/seed.ts b/prisma/seed.ts index a052cc7..0affea8 100644 --- a/prisma/seed.ts +++ b/prisma/seed.ts @@ -74,14 +74,14 @@ function initEventListeners( priority: (priority += 100), }, { - id: 'CR-LOAD-FUNCTIONS', + id: 'CR-LOAD-ENDPOINTS', srcId: 'GLOBAL', tenantPk: 0, eventType: 'CLIENT_REQUEST', dataType: '*', serviceType: 'SERVICE', serviceName: 'EndpointsService', - funName: 'loadFunctions', + funName: 'loadEndpoints', description: 'Load all endpoints into event.context.endpoints', createdBy: 'GLOBAL', priority: (priority += 100), @@ -101,7 +101,7 @@ function initEventListeners( priority: (priority += 100), }, { - id: 'CR-MAP-2-ENDPOINT', + id: 'CR-MAP-2-ENDPOINTS', srcId: 'GLOBAL', tenantPk: 0, eventType: 'CLIENT_REQUEST', @@ -121,10 +121,10 @@ function initEventListeners( eventType: 'CLIENT_REQUEST', dataType: 'Webpage', serviceType: 'SERVICE', - serviceName: 'AgentsService', - funName: 'map2Endpoints', + serviceName: 'WebpagesService', + funName: 'genWebpage', description: - 'Map the request to a endpoint function and corresponding args, put into event.context.map2Endpoints and event.context.endpoints[0]', + 'Generate webpage[view/model/view-model] from request & endpoints', createdBy: 'GLOBAL', priority: (priority += 100), }, diff --git a/src/endpoints/endpoints.service.ts b/src/endpoints/endpoints.service.ts index 5992337..02d8b7f 100644 --- a/src/endpoints/endpoints.service.ts +++ b/src/endpoints/endpoints.service.ts @@ -41,7 +41,7 @@ export class EndpointsService { deletedAt: false, }; - async loadFunctions( + async loadEndpoints( reqEvent: ClientRequestEvent, ): Promise { const { epName, callgentId } = reqEvent.data; @@ -59,7 +59,7 @@ export class EndpointsService { }); if (!eps.length) throw new NotFoundException( - `No function found on callgent#${callgentId}${ + `No service endpoints found on callgent#${callgentId}${ epName ? ' name=' + epName : '' }`, ); diff --git a/src/entries/adaptors/builtin/web/webpage.adaptor.ts b/src/entries/adaptors/builtin/web/webpage.adaptor.ts index fe14dca..c5e89f9 100644 --- a/src/entries/adaptors/builtin/web/webpage.adaptor.ts +++ b/src/entries/adaptors/builtin/web/webpage.adaptor.ts @@ -7,12 +7,33 @@ import { ClientRequestEvent } from '../../../events/client-request.event'; import { EntryAdaptor, EntryConfig } from '../../entry-adaptor.base'; import { EntryAdaptorName } from '../../entry-adaptor.decorator'; -@EntryAdaptorName('webpage', 'client') +@EntryAdaptorName('Webpage', 'client') export class WebpageAdaptor extends EntryAdaptor { constructor(@Inject('AgentsService') readonly agentsService: AgentsService) { super(agentsService); } + async preprocess(reqEvent: ClientRequestEvent, entry: EntryDto) { + // + } + + async postprocess(reqEvent: ClientRequestEvent, fun: EndpointDto) { + // + } + + req2Json(req: object) { + throw new NotImplementedException('Method not implemented.'); + } + + async invoke( + fun: EndpointDto, + args: object, + sep: Entry, + reqEvent: ClientRequestEvent, + ): Promise<{ data: ClientRequestEvent; resumeFunName?: string }> { + throw new NotImplementedException('Method not implemented.'); + } + getCallback(callback: string, reqEntry?: EntryDto): Promise { throw new NotImplementedException('Method not implemented.'); } @@ -77,31 +98,10 @@ export class WebpageAdaptor extends EntryAdaptor { throw new NotImplementedException('Method not implemented.'); } - async preprocess(reqEvent: ClientRequestEvent, entry: EntryDto) { - // - } - - async postprocess(reqEvent: ClientRequestEvent, fun: EndpointDto) { - // - } - readData(name: string, hints?: { [key: string]: any }): Promise { throw new NotImplementedException('Method not implemented.'); } - req2Json(req: object) { - throw new NotImplementedException('Method not implemented.'); - } - - async invoke( - fun: EndpointDto, - args: object, - sep: Entry, - reqEvent: ClientRequestEvent, - ): Promise<{ data: ClientRequestEvent; resumeFunName?: string }> { - throw new NotImplementedException('Method not implemented.'); - } - callback(resp: any): Promise { throw new NotImplementedException('Method not implemented.'); } diff --git a/src/entries/adaptors/builtin/web/webpage.controller.ts b/src/entries/adaptors/builtin/web/webpage.controller.ts new file mode 100644 index 0000000..5d7da64 --- /dev/null +++ b/src/entries/adaptors/builtin/web/webpage.controller.ts @@ -0,0 +1,270 @@ +import { + All, + Body, + Controller, + Get, + Headers, + Inject, + NotFoundException, + Param, + Post, + Query, + Req, + Res, + UseGuards, +} from '@nestjs/common'; +import { + ApiHeader, + ApiOperation, + ApiParam, + ApiProperty, + ApiQuery, + ApiTags, + ApiUnauthorizedResponse, +} from '@nestjs/swagger'; +import { EntryType } from '@prisma/client'; +import { IsNotEmpty, IsString } from 'class-validator'; +import { CallgentsService } from '../../../../callgents/callgents.service'; +import { EventListenersService } from '../../../../event-listeners/event-listeners.service'; +import { JwtGuard } from '../../../../infra/auth/jwt/jwt.guard'; +import { Utils } from '../../../../infra/libs/utils'; +import { EntriesService } from '../../../entries.service'; +import { ClientRequestEvent } from '../../../events/client-request.event'; + +export class Requirement { + @ApiProperty({ + description: 'Requirement for callgent to fulfill.', + example: + 'I want to apply for the Senior Algorithm Engineer based in Singapore.', + required: true, + }) + @IsNotEmpty() + @IsString() + requirement: string; +} + +/** to generate web pages based on request and callgent endpoints */ +@ApiTags('Client Entry: Webpage') +@UseGuards(new JwtGuard(true)) +@Controller('webpage') +export class WebpageController { + constructor( + protected readonly callgentsService: CallgentsService, + @Inject('EntriesService') + protected readonly entriesService: EntriesService, + protected readonly eventListenersService: EventListenersService, + ) {} + + @ApiOperation({ + summary: + 'Request with requirement description, to instantly generate web page.', + description: + 'AI agent will instantly generate page to fulfill the requirement.', + }) + @ApiQuery({ + name: 'taskId', + required: false, + description: 'Conversation Id', + }) + @Get('request/:callgentId/:entryId') + async request( + @Body() requirement: Requirement, + @Param('callgentId') callgentId: string, + @Req() req, + @Res() res, + @Param('entryId') entryId?: string, + @Query('taskId') taskId?: string, + ) { + const { entry, callgent } = await this._load(callgentId, entryId); + + const result = await this.eventListenersService.emit( + new ClientRequestEvent( + entry.id, + taskId, + entry.adaptorKey, + requirement, + { + callgentId, + callgentName: callgent.name, + callerId: req.user?.sub, + // progressive, // 是否需要渐进式? + }, + // callback, // 是否需要异步返回结果 + ), + ); + // event listeners: + // preprocess, c-auth, load eps, load target events, map2Endpoints, + + // [gen view/model/view-model, response] + + // remove: | s-auth, invoke-service + + // return generated webpage + const code = result.statusCode || 200; + res.status(code < 0 ? 418 : code < 200 ? 200 : code).send(result); + } + + @ApiOperation({ summary: 'To invoke pregenerated pages.' }) + @ApiParam({ + name: 'callgentId', + required: true, + description: 'Callgent id', + }) + @ApiParam({ + name: 'entryId', + required: false, + description: + 'Client entry id, mey empty: "/rest/invoke/:callgent-id`//`.."', + }) + @ApiParam({ + name: 'NOTE: swagger does not support wildcard param. Just document here', + required: false, + description: + 'rest/invoke/:callgentId/:entryId/`resource-path-here`. the wildcard path, may be empty', + }) + @ApiHeader({ name: 'x-callgent-taskId', required: false }) + @ApiHeader({ + name: 'x-callgent-progressive', + required: false, + description: 'progressive request responder', + }) + @ApiHeader({ name: 'x-callgent-callback', required: false }) + @ApiHeader({ name: 'x-callgent-timeout', required: false }) + @All('invoke/:callgentId/:entryId/*') + @ApiUnauthorizedResponse() + async invoke( + @Req() req, + @Res() res, + @Param('callgentId') callgentId: string, + @Param('entryId') entryId?: string, + @Headers('x-callgent-taskId') taskId?: string, + @Headers('x-callgent-progressive') progressive?: string, + @Headers('x-callgent-callback') callback?: string, + @Headers('x-callgent-timeout') timeout?: string, + ) { + const basePath = `invoke/${callgentId}/${entryId}/`; + let epName = req.url.substr(req.url.indexOf(basePath) + basePath.length); + if (epName) epName = Utils.formalApiName(req.method, '/' + epName); + + const { entry, callgent } = await this._load(callgentId, entryId); + + const result = await this.eventListenersService.emit( + new ClientRequestEvent( + entry.id, + taskId, + entry.adaptorKey, + req, + { + callgentId, + callgentName: callgent.name, + callerId: req.user?.sub, + progressive, + epName, + }, + callback, + ), + parseInt(timeout) || 0, // sync timeout + ); + // FIXME data + const code = result.statusCode || 200; + // code cannot < 0 + res.status(code < 0 ? 418 : code < 200 ? 200 : code).send(result); + } + + private async _load(callgentId: string, entryId: string) { + // TODO owner defaults to caller callgent + // find callgent cep, then set tenantPk + const entry = await this.entriesService.$findFirstByType( + EntryType.CLIENT, + callgentId, + 'Webpage', + entryId, + ); + if (!entry) + throw new NotFoundException( + 'restAPI entry not found for callgent: ' + callgentId, + ); + const callgent = await this.callgentsService.findOne(callgentId, { + name: true, + }); + if (!callgent) + throw new NotFoundException('callgent not found: ' + callgentId); + return { entry, callgent }; + } + + @ApiOperation({ + description: + 'Inquiry the result of an invocation request. TODO: Socket Mode', + }) + @Get('/result/:requestId') + async invokeResult(@Param('requestId') reqId: string) { + // FIXME + return null; + } + + /** + * 1. push(task): { + * 2. mapping, + * 3. progressive param, ? manual/ai? + * 4. auth, invoke,-> } + * 5. reply -> confirm task + */ + // @Post('reply/:authToken') + // async postReply(@Param('authToken') authToken: string, @Body() body: object) { + // // verify the authToken + // const caller: JwtPayload = await this.verifyAppToken(authToken); + // if (!caller) throw new UnauthorizedException(); + + // // return this.called(authToken, body); + // } + + /** + * + * 1. called: { + * 2. verify + * 3. convert -> + * 4. create} + * 5. respond to caller -> + */ + // async called(authToken: string, callerType: string, body: object) { + // // verify the authToken + // const caller: JwtPayload = await this.verifyAppToken(authToken); + // if (!caller) throw new UnauthorizedException(); + + // const dto = await this.convertToTask(callerType, body, caller); + // if (!dto?.callgent) + // throw new BadRequestException('callgent id is missing'); + + // const [task] = await this.tasksService.create(dto); + + // // TODO instant syncResult to respond + // return task; + // } + + // /** jwt with aud == 'authToken' */ + // async verifyAppToken(authToken: string) { + // const payload: JwtPayload = await this.authTokensService.verify( + // authToken, + // 'API_KEY', + // ); + // return payload; + // } + + /** implementation for postmarkapp.com */ + // async convertToTask( + // callerType: string, + // body: object, + // caller: JwtPayload, + // ): Promise { + // const plugin: CallerPlugin = this.pluginsService.getPlugin(callerType); + // if (!plugin?.convertToTask) + // throw new BadRequestException( + // `plugin callerType=${callerType} not found`, + // ); + + // const task: TaskDto = await plugin.convertToTask(callerType, body, caller); + // if (!task) return; + + // return { ...task, callerType, createdBy: caller.sub }; + // } +} diff --git a/src/entries/adaptors/builtin/web/webpage.service.ts b/src/entries/adaptors/builtin/web/webpage.service.ts new file mode 100644 index 0000000..d1c6073 --- /dev/null +++ b/src/entries/adaptors/builtin/web/webpage.service.ts @@ -0,0 +1,26 @@ +import { TransactionHost, Transactional } from '@nestjs-cls/transactional'; +import { TransactionalAdapterPrisma } from '@nestjs-cls/transactional-adapter-prisma'; +import { Inject, Injectable } from '@nestjs/common'; +import { ModuleRef, ModulesContainer } from '@nestjs/core'; +import { PrismaTenancyService } from '../../../../infra/repo/tenancy/prisma-tenancy.service'; +import { ClientRequestEvent } from '../../../events/client-request.event'; + +@Injectable() +export class WebpageService { + constructor( + private readonly moduleRef: ModuleRef, + @Inject(ModulesContainer) + private readonly modulesContainer: ModulesContainer, + private readonly txHost: TransactionHost, + private readonly tenancyService: PrismaTenancyService, + ) {} + + /** Generate webpage[view/model/view-model], then respond the src code */ + @Transactional() + async genWebpage( + data: ClientRequestEvent, + ): Promise { + data.stopPropagation = true; // stop event propagation + return { data }; + } +} diff --git a/src/entries/entries.module.ts b/src/entries/entries.module.ts index 08b2d44..b992b15 100644 --- a/src/entries/entries.module.ts +++ b/src/entries/entries.module.ts @@ -4,6 +4,8 @@ import { EmailAdaptor } from './adaptors/builtin/email/email.adaptor'; import { RestAPIAdaptor } from './adaptors/builtin/restapi/restapi.adaptor'; import { RestApiController } from './adaptors/builtin/restapi/restapi.controller'; import { WebpageAdaptor } from './adaptors/builtin/web/webpage.adaptor'; +import { WebpageController } from './adaptors/builtin/web/webpage.controller'; +import { WebpageService } from './adaptors/builtin/web/webpage.service'; import { EntriesController } from './entries.controller'; import { EntriesService } from './entries.service'; import { CallgentCreatedListener } from './listeners/callgent-created.listener'; @@ -12,6 +14,7 @@ import { CallgentCreatedListener } from './listeners/callgent-created.listener'; imports: [CallgentsModule], providers: [ { provide: 'EntriesService', useClass: EntriesService }, + { provide: 'WebpageService', useClass: WebpageService }, CallgentCreatedListener, { provide: 'restAPI-EntryAdaptor', @@ -26,7 +29,7 @@ import { CallgentCreatedListener } from './listeners/callgent-created.listener'; useClass: EmailAdaptor, }, ], - controllers: [EntriesController, RestApiController], + controllers: [EntriesController, RestApiController, WebpageController], exports: ['EntriesService'], }) export class EntriesModule {} diff --git a/src/entries/entries.service.ts b/src/entries/entries.service.ts index 5055563..c1efe9b 100644 --- a/src/entries/entries.service.ts +++ b/src/entries/entries.service.ts @@ -10,11 +10,12 @@ import { Injectable, InjectionToken, NotFoundException, + OnModuleInit, } from '@nestjs/common'; import { ModuleRef, ModulesContainer } from '@nestjs/core'; import { EntryType, Prisma, PrismaClient } from '@prisma/client'; -import { EndpointDto } from '../endpoints/dto/endpoint.dto'; import { RealmSecurityVO } from '../callgent-realms/dto/realm-security.vo'; +import { EndpointDto } from '../endpoints/dto/endpoint.dto'; import { Utils } from '../infra/libs/utils'; import { selectHelper } from '../infra/repo/select.helper'; import { PrismaTenancyService } from '../infra/repo/tenancy/prisma-tenancy.service'; @@ -25,7 +26,7 @@ import { UpdateEntryDto } from './dto/update-entry.dto'; import { ClientRequestEvent } from './events/client-request.event'; @Injectable() -export class EntriesService { +export class EntriesService implements OnModuleInit { constructor( private readonly moduleRef: ModuleRef, @Inject(ModulesContainer) diff --git a/src/event-listeners/event-listeners.service.ts b/src/event-listeners/event-listeners.service.ts index dd02914..2731d82 100644 --- a/src/event-listeners/event-listeners.service.ts +++ b/src/event-listeners/event-listeners.service.ts @@ -124,6 +124,12 @@ export class EventListenersService { let [statusCode, idx] = [1, 0]; try { for (; idx < listeners.length; ) { + if (event.stopPropagation) break; + if (event.preventDefault) { + event.preventDefault = false; + continue; + } + const listener = listeners[idx++]; try { const result = await this._invokeListener(listener, event, funName); diff --git a/src/event-listeners/event-object.ts b/src/event-listeners/event-object.ts index 3e90bad..421233a 100644 --- a/src/event-listeners/event-object.ts +++ b/src/event-listeners/event-object.ts @@ -18,5 +18,5 @@ export class EventObject { public readonly id: string; public readonly context: { [key: string]: any } = {}; public stopPropagation = false; - public defaultPrevented = false; + public preventDefault = false; } From b9e4526faa5064fdefcac78557cbad4c07f32593 Mon Sep 17 00:00:00 2001 From: dev-callgent Date: Sun, 13 Oct 2024 20:24:12 +0800 Subject: [PATCH 097/183] feat: auto-gen host when creating centry Signed-off-by: dev-callgent --- prisma/schema.prisma | 3 +- src/app.controller.ts | 104 +--------- src/emails/emails.controller.ts | 4 +- .../adaptors/builtin/email/email.adaptor.ts | 15 +- .../builtin/restapi/restapi.adaptor.ts | 174 ++++++++-------- .../builtin/restapi/restapi.controller.ts | 4 +- .../adaptors/builtin/web/webpage.adaptor.ts | 97 ++++----- .../builtin/web/webpage.controller.ts | 80 +------- src/entries/adaptors/entry-adaptor.base.ts | 190 +++++++++--------- src/entries/entries.service.ts | 18 +- src/infra/libs/utils.ts | 1 + 11 files changed, 270 insertions(+), 420 deletions(-) diff --git a/prisma/schema.prisma b/prisma/schema.prisma index 7509aaf..a885e46 100644 --- a/prisma/schema.prisma +++ b/prisma/schema.prisma @@ -448,7 +448,8 @@ model Entry { adaptorKey String @db.VarChar(127) /// @description entry adaptor key priority Int @default(0) /// @description priority in the callgent - host String @db.VarChar(2047) /// @description host address, e.g. '/api/callgents/rbhes0-w4rff/{id}/invoke/', where `{id}` will be replaced with current entry id + /// @DtoCreateOptional + host String @db.VarChar(2047) /// @description host address, client entry host are *generated*, e.g. '/api/rest/invoke/rbhes0-w4rff/{id}', where `{id}` will be replaced with current entry id initParams Json? @db.Json /// @description initializing parameters content Json? @db.Json /// @description generated content/code by init method /// @DtoReadOnly diff --git a/src/app.controller.ts b/src/app.controller.ts index ac5fc12..e2fda7c 100644 --- a/src/app.controller.ts +++ b/src/app.controller.ts @@ -1,110 +1,8 @@ -import { Body, Controller, Get, Logger, Post } from '@nestjs/common'; +import { Controller, Logger } from '@nestjs/common'; import { AppService } from './app.service'; @Controller() export class AppController { constructor(private readonly appService: AppService) {} private readonly logger = new Logger(AppController.name); - - @Get() - getHello(): string { - return this.appService.getHello(); - } - - @Post() - postHello(@Body() body: any): string { - this.logger.warn(body); - const postmarkapp_com = { - FromName: 'JamesP', - MessageStream: 'inbound', - From: 'pang.ju@roles.chat', - FromFull: { - Email: 'pang.ju@roles.chat', - Name: 'JamesP', - MailboxHash: '', - }, - To: '"ddsfskldfjds+334rfgg@my.callgent.com" ', - ToFull: [ - { - Email: 'ddsfskldfjds+334rfgg@my.callgent.com', - Name: 'ddsfskldfjds+334rfgg@my.callgent.com', - MailboxHash: '334rfgg', - }, - ], - Cc: '', - CcFull: [], - Bcc: '', - BccFull: [], - OriginalRecipient: 'ddsfskldfjds+334rfgg@my.callgent.com', - Subject: 'Re: sfddsf', - MessageID: '3e157239-b8c7-4a88-9cba-51c3a5690a15', - ReplyTo: '', - MailboxHash: '334rfgg', - Date: 'Fri, 01 Mar 2024 22:46:07 +0800', - TextBody: - 'Sdfsdf sddfds\nAppController\n\nddsfskldfjds+334rfgg@my.callgent.com\n\n\nsdf\n> From: "JamesP"\n> Date: Fri, Mar 1, 2024, 22:43\n> Subject: sfddsf\n> To: "ddsfskldfjds+334rfgg@my.callgent.com"\n> Sdfsdfsdfdsvbbf df', - HtmlBody: - '
Sdfsdf <a href="dfd">sddfds</a>
AppController



sdf
From: "JamesP"<pang.ju@roles.chat>
Date: Fri, Mar 1, 2024, 22:43
Subject: sfddsf
Sdfsdfsdfdsvbbf df
', - StrippedTextReply: - 'Sdfsdf sddfds\nAppController\n\nddsfskldfjds+334rfgg@my.callgent.com\n\n\nsdf', - Tag: '', - Headers: [ - { Name: 'Return-Path', Value: '' }, - { - Name: 'Received', - Value: - 'by p-pm-inboundg03c-aws-useast1c.inbound.postmarkapp.com (Postfix, from userid 996)\tid 9921A4052B9; Fri, 1 Mar 2024 14:46:15 +0000 (UTC)', - }, - { - Name: 'X-Spam-Checker-Version', - Value: - 'SpamAssassin 3.4.0 (2014-02-07) on\tp-pm-inboundg03c-aws-useast1c', - }, - { Name: 'X-Spam-Status', Value: 'No' }, - { Name: 'X-Spam-Score', Value: '-0.0' }, - { - Name: 'X-Spam-Tests', - Value: - 'DKIM_SIGNED,DKIM_VALID,HTML_MESSAGE,RCVD_IN_ZEN_BLOCKED_OPENDNS,\tSPF_HELO_NONE,SPF_PASS,T_SCC_BODY_TEXT_LINE,URIBL_DBL_BLOCKED_OPENDNS,\tURIBL_ZEN_BLOCKED_OPENDNS', - }, - { - Name: 'Received-SPF', - Value: - "pass (roles.chat: Sender is authorized to use 'pang.ju@roles.chat' in 'mfrom' identity (mechanism 'include:_netblocks.m.feishu.cn' matched)) receiver=p-pm-inboundg03c-aws-useast1c; identity=mailfrom; envelope-from=\"pang.ju@roles.chat\"; helo=va-1-15.ptr.blmpb.com; client-ip=209.127.230.15", - }, - { - Name: 'Received', - Value: - 'from va-1-15.ptr.blmpb.com (va-1-15.ptr.blmpb.com [209.127.230.15])\t(using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits))\t(No client certificate requested)\tby p-pm-inboundg03c-aws-useast1c.inbound.postmarkapp.com (Postfix) with ESMTPS id E14E9405106\tfor ; Fri, 1 Mar 2024 14:46:14 +0000 (UTC)', - }, - { - Name: 'DKIM-Signature', - Value: - 'v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; s=s1; d=roles-chat.20200927.dkim.feishu.cn; t=1709304369; h=from:subject:mime-version:from:date:message-id:subject:to:cc: reply-to:content-type:mime-version:in-reply-to:message-id; bh=a15MvT8ivxkZjcqYjvMgzEbDMdmDpehIkoB9y/m4eLU=; b=AZb/VdLuQXeDShxHhCJXnu0F18wIPXMNH2qIuyBKSOiksPhaDWgHXTPGeQ7GPak5U9zr7N 7tZWyxqR7xtmdHqArxZMq6qAHKY2y3BGgZpQVN2xFALzH9oz7eT0/+1He11n2IXSVcuqBV Nu0KHxP+pX2UhuJfj78gFmOOQ/d8htBiaIqMcQJFIMWhOKh+aO3NV9xtjHlcryr8xp7ba1 CQ2TstmPJoxwgXSuKV5GJ9bTBHGcLwcXji8+kKlOvSdjghGJ269hrtbslJ1fD49ivRcvDs 4tvXTyon4bsX9bqDs6C4YF/Y1wrx5bp28dmfp84nMPDpOYFGln3icOZHMBl4Vg==', - }, - { - Name: 'In-Reply-To', - Value: - '<41158e7233075aeb6407512c20ae271901afcd14.65806463.2cb7.417b.8e55.5c47d139a2e8@feishu.cn>', - }, - { - Name: 'References', - Value: - '<41158e7233075aeb6407512c20ae271901afcd14.65806463.2cb7.417b.8e55.5c47d139a2e8@feishu.cn>', - }, - { - Name: 'Message-Id', - Value: - '<41158e7233075aeb6407512c20ae271901afcd14.8fbdff92.86c5.42e7.92e9.eef203910296@feishu.cn>', - }, - { Name: 'Mime-Version', Value: '1.0' }, - { - Name: 'X-Lms-Return-Path', - Value: '', - }, - ], - Attachments: [], - }; - return this.appService.getHello(); - } } diff --git a/src/emails/emails.controller.ts b/src/emails/emails.controller.ts index 95e6847..46c78c2 100644 --- a/src/emails/emails.controller.ts +++ b/src/emails/emails.controller.ts @@ -8,10 +8,12 @@ import { Post, } from '@nestjs/common'; import { ConfigService } from '@nestjs/config'; +import { ApiTags } from '@nestjs/swagger'; import { JwtAuthService } from '../infra/auth/jwt/jwt.service'; -import { EmailsService } from './emails.service'; import { EmailRelayObject } from './dto/sparkpost-relay-object.interface'; +import { EmailsService } from './emails.service'; +@ApiTags('Callbacks') @Controller('emails') export class EmailsController { constructor( diff --git a/src/entries/adaptors/builtin/email/email.adaptor.ts b/src/entries/adaptors/builtin/email/email.adaptor.ts index 9bd9c52..3aaa283 100644 --- a/src/entries/adaptors/builtin/email/email.adaptor.ts +++ b/src/entries/adaptors/builtin/email/email.adaptor.ts @@ -4,18 +4,19 @@ import { Inject, NotImplementedException, } from '@nestjs/common'; +import { Prisma } from '@prisma/client'; import * as httpStatus from 'http-status'; import { AgentsService } from '../../../../agents/agents.service'; -import { EndpointDto } from '../../../../endpoints/dto/endpoint.dto'; import { RelayEmail } from '../../../../emails/dto/sparkpost-relay-object.interface'; import { EmailRelayKey, EmailsService, } from '../../../../emails/emails.service'; +import { EndpointDto } from '../../../../endpoints/dto/endpoint.dto'; import { EntryDto } from '../../../dto/entry.dto'; import { Entry } from '../../../entities/entry.entity'; import { ClientRequestEvent } from '../../../events/client-request.event'; -import { EntryAdaptor, EntryConfig } from '../../entry-adaptor.base'; +import { EntryAdaptor } from '../../entry-adaptor.base'; import { EntryAdaptorName } from '../../entry-adaptor.decorator'; @EntryAdaptorName('Email', 'both') @@ -27,13 +28,17 @@ export class EmailAdaptor extends EntryAdaptor { super(agentsService); } + protected _genClientHost(data: Prisma.EntryUncheckedCreateInput) { + data.host = `invoke+${data.id}@my.callgent.com`; + } + getCallback(callback: string, reqEntry?: EntryDto): Promise { throw new NotImplementedException('Method not implemented.'); } - getConfig(): EntryConfig { - return {}; - } + // getConfig(): EntryConfig { + // return {}; + // } /** generate a web page entry */ async initClient(params: object, entry: Entry) { diff --git a/src/entries/adaptors/builtin/restapi/restapi.adaptor.ts b/src/entries/adaptors/builtin/restapi/restapi.adaptor.ts index 488cbed..1ead992 100644 --- a/src/entries/adaptors/builtin/restapi/restapi.adaptor.ts +++ b/src/entries/adaptors/builtin/restapi/restapi.adaptor.ts @@ -3,12 +3,13 @@ import { Inject, NotImplementedException, } from '@nestjs/common'; +import { Prisma } from '@prisma/client'; import axios, { AxiosResponse } from 'axios'; import { AgentsService } from '../../../../agents/agents.service'; import { EndpointDto } from '../../../../endpoints/dto/endpoint.dto'; import { EntryDto } from '../../../dto/entry.dto'; import { ClientRequestEvent } from '../../../events/client-request.event'; -import { EntryAdaptor, EntryConfig } from '../../entry-adaptor.base'; +import { EntryAdaptor } from '../../entry-adaptor.base'; import { EntryAdaptorName } from '../../entry-adaptor.decorator'; @EntryAdaptorName('restAPI', 'both') @@ -17,91 +18,96 @@ export class RestAPIAdaptor extends EntryAdaptor { super(agentsService); } - getConfig(): EntryConfig { - return { - server: { - host: { - address: { - type: 'url', - name: 'API root URL', - }, - authConfig: [ - { - name: 'tokenName', - label: 'Token Name', - type: 'text', - }, - { - name: 'tokenPosition', - label: 'Where is the Token', - type: 'select', - value: ['header', 'cookie', 'body', 'query'], - }, - { - name: 'credentialsType', - label: 'Credentials Type', - placeholder: - 'Method to exchange token from credentials: token = exchange(credentials, args)', - type: 'select', - value: { - constant: [ - { name: 'apiKey', label: 'API Key', type: 'password' }, - ], - oauth: [], - function: [], - }, - }, - ], - }, - addParams: true, - params: [ - { - type: 'readonly', - name: 'Note', - position: 'top', - value: - '> This is for simple web page operations. For complex pages such as SPA, you may need other tools, e.g. RPAs, [SeeAct](https://github.com/OSU-NLP-Group/SeeAct), etc.', - }, - { - type: 'readonly', - name: 'Download Chrome Plugin', - position: 'bottom', - value: - 'Before continue, please confirm this automation does NOT violate any ToS or regulations of the target website! \nYour need to install the [Callgent Web Page](https://chrome.google.com/webstore/detail/callgent-web-page/pefjgjgjgjgjgjgjgjgjgjgjgjgjgjgj) Chrome plugin, as the operation client. \n> Note: You need to keep the Chrome open to perform tasks.', - }, - ], - }, - client: { - host: { - address: { - type: 'domain', - name: 'Custom Domain', - value: 'page.callgent.com', - placeholder: 'Not applicable in Free plan.', - }, - }, - params: [ - { - type: 'url', - name: 'Callback URL', - optional: true, - placeholder: - 'Callback URL to receive response with request ID. TODO: api spec', - }, - { type: 'radio', name: 'Page Type', value: ['WEB', 'React', 'Vue'] }, - ], - addParams: true, - initParams: [ - { - name: 'Page Generation Prompt', - type: 'textarea', - placeholder: 'Prompt or content to generate the Web Page.', - }, - ], - }, - }; + protected _genClientHost(data: Prisma.EntryUncheckedCreateInput) { + // unstructured request url + data.host = `/api/rest/request/${data.callgentId}/${data.id}`; } + // getConfig(): EntryConfig { + // return { + // server: { + // host: { + // address: { + // type: 'url', + // name: 'API root URL', + // }, + // authConfig: [ + // { + // name: 'tokenName', + // label: 'Token Name', + // type: 'text', + // }, + // { + // name: 'tokenPosition', + // label: 'Where is the Token', + // type: 'select', + // value: ['header', 'cookie', 'body', 'query'], + // }, + // { + // name: 'credentialsType', + // label: 'Credentials Type', + // placeholder: + // 'Method to exchange token from credentials: token = exchange(credentials, args)', + // type: 'select', + // value: { + // constant: [ + // { name: 'apiKey', label: 'API Key', type: 'password' }, + // ], + // oauth: [], + // function: [], + // }, + // }, + // ], + // }, + // addParams: true, + // params: [ + // { + // type: 'readonly', + // name: 'Note', + // position: 'top', + // value: + // '> This is for simple web page operations. For complex pages such as SPA, you may need other tools, e.g. RPAs, [SeeAct](https://github.com/OSU-NLP-Group/SeeAct), etc.', + // }, + // { + // type: 'readonly', + // name: 'Download Chrome Plugin', + // position: 'bottom', + // value: + // 'Before continue, please confirm this automation does NOT violate any ToS or regulations of the target website! \nYour need to install the [Callgent Web Page](https://chrome.google.com/webstore/detail/callgent-web-page/pefjgjgjgjgjgjgjgjgjgjgjgjgjgjgj) Chrome plugin, as the operation client. \n> Note: You need to keep the Chrome open to perform tasks.', + // }, + // ], + // }, + // client: { + // host: { + // address: { + // type: 'domain', + // name: 'Custom Domain', + // value: 'page.callgent.com', + // placeholder: 'Not applicable in Free plan.', + // }, + // }, + // params: [ + // { + // type: 'url', + // name: 'Callback URL', + // optional: true, + // placeholder: + // 'Callback URL to receive response with request ID. TODO: api spec', + // }, + // { type: 'radio', name: 'Page Type', value: ['WEB', 'React', 'Vue'] }, + // ], + // addParams: true, + // initParams: [ + // { + // name: 'Page Generation Prompt', + // type: 'textarea', + // placeholder: 'Prompt or content to generate the Web Page.', + // }, + // ], + // }, + // }; + // } + /** generate a web page entry */ initClient(params: object, entry: EntryDto): Promise { throw new NotImplementedException('Method not implemented.'); diff --git a/src/entries/adaptors/builtin/restapi/restapi.controller.ts b/src/entries/adaptors/builtin/restapi/restapi.controller.ts index 6bd6ee7..233e9c6 100644 --- a/src/entries/adaptors/builtin/restapi/restapi.controller.ts +++ b/src/entries/adaptors/builtin/restapi/restapi.controller.ts @@ -64,6 +64,8 @@ export class RestApiController { // TODO } + @All('invoke/:callgentId/:entryId/*') + @ApiOperation({ summary: 'To invoke the specific functional endpoint.' }) @ApiParam({ name: 'callgentId', required: true, @@ -89,8 +91,6 @@ export class RestApiController { }) @ApiHeader({ name: 'x-callgent-callback', required: false }) @ApiHeader({ name: 'x-callgent-timeout', required: false }) - @All('invoke/:callgentId/:entryId/*') - @ApiOperation({ summary: 'To invoke the specific functional endpoint.' }) @ApiUnauthorizedResponse() async invoke( @Req() req, diff --git a/src/entries/adaptors/builtin/web/webpage.adaptor.ts b/src/entries/adaptors/builtin/web/webpage.adaptor.ts index c5e89f9..2072ba9 100644 --- a/src/entries/adaptors/builtin/web/webpage.adaptor.ts +++ b/src/entries/adaptors/builtin/web/webpage.adaptor.ts @@ -1,10 +1,11 @@ import { Inject, NotImplementedException } from '@nestjs/common'; +import { Prisma } from '@prisma/client'; import { AgentsService } from '../../../../agents/agents.service'; import { EndpointDto } from '../../../../endpoints/dto/endpoint.dto'; import { EntryDto } from '../../../dto/entry.dto'; import { Entry } from '../../../entities/entry.entity'; import { ClientRequestEvent } from '../../../events/client-request.event'; -import { EntryAdaptor, EntryConfig } from '../../entry-adaptor.base'; +import { EntryAdaptor } from '../../entry-adaptor.base'; import { EntryAdaptorName } from '../../entry-adaptor.decorator'; @EntryAdaptorName('Webpage', 'client') @@ -13,6 +14,10 @@ export class WebpageAdaptor extends EntryAdaptor { super(agentsService); } + protected _genClientHost(data: Prisma.EntryUncheckedCreateInput) { + data.host = `/api/webpage/request/${data.callgentId}/${data.id}`; + } + async preprocess(reqEvent: ClientRequestEvent, entry: EntryDto) { // } @@ -38,51 +43,51 @@ export class WebpageAdaptor extends EntryAdaptor { throw new NotImplementedException('Method not implemented.'); } - getConfig(): EntryConfig { - return { - host: { address: { type: 'url', name: 'Page URL' } }, - server: { - addParams: true, - params: [ - { - type: 'readonly', - name: 'Note', - position: 'top', - value: - '> This is for simple web page operations. For complex pages such as SPA, you may need other tools, e.g. RPAs, [SeeAct](https://github.com/OSU-NLP-Group/SeeAct), etc.', - }, - { - type: 'readonly', - name: 'Download Chrome Plugin', - position: 'bottom', - value: - 'Before continue, please confirm this automation does NOT violate any ToS or regulations of the target website! \nYour need to install the [Callgent Web Page](https://chrome.google.com/webstore/detail/callgent-web-page/pefjgjgjgjgjgjgjgjgjgjgjgjgjgjgj) Chrome plugin, as the operation client. \n> Note: You need to keep the Chrome open to perform tasks.', - }, - ], - }, - client: { - host: { - address: { - type: 'domain', - name: 'Custom Domain', - value: 'page.callgent.com', - placeholder: 'Not applicable in Free plan.', - }, - }, - params: [ - { type: 'radio', name: 'Page Type', value: ['WEB', 'React', 'Vue'] }, - ], - addParams: true, - initParams: [ - { - name: 'Page Generation Prompt', - type: 'textarea', - placeholder: 'Prompt or content to generate the Web Page.', - }, - ], - }, - }; - } + // getConfig(): EntryConfig { + // return { + // host: { address: { type: 'url', name: 'Page URL' } }, + // server: { + // addParams: true, + // params: [ + // { + // type: 'readonly', + // name: 'Note', + // position: 'top', + // value: + // '> This is for simple web page operations. For complex pages such as SPA, you may need other tools, e.g. RPAs, [SeeAct](https://github.com/OSU-NLP-Group/SeeAct), etc.', + // }, + // { + // type: 'readonly', + // name: 'Download Chrome Plugin', + // position: 'bottom', + // value: + // 'Before continue, please confirm this automation does NOT violate any ToS or regulations of the target website! \nYour need to install the [Callgent Web Page](https://chrome.google.com/webstore/detail/callgent-web-page/pefjgjgjgjgjgjgjgjgjgjgjgjgjgjgj) Chrome plugin, as the operation client. \n> Note: You need to keep the Chrome open to perform tasks.', + // }, + // ], + // }, + // client: { + // host: { + // address: { + // type: 'domain', + // name: 'Custom Domain', + // value: 'page.callgent.com', + // placeholder: 'Not applicable in Free plan.', + // }, + // }, + // params: [ + // { type: 'radio', name: 'Page Type', value: ['WEB', 'React', 'Vue'] }, + // ], + // addParams: true, + // initParams: [ + // { + // name: 'Page Generation Prompt', + // type: 'textarea', + // placeholder: 'Prompt or content to generate the Web Page.', + // }, + // ], + // }, + // }; + // } /** generate a web page entry */ initClient(params: object, entry: EntryDto): Promise { diff --git a/src/entries/adaptors/builtin/web/webpage.controller.ts b/src/entries/adaptors/builtin/web/webpage.controller.ts index 5d7da64..a4c965e 100644 --- a/src/entries/adaptors/builtin/web/webpage.controller.ts +++ b/src/entries/adaptors/builtin/web/webpage.controller.ts @@ -1,5 +1,4 @@ import { - All, Body, Controller, Get, @@ -7,7 +6,6 @@ import { Inject, NotFoundException, Param, - Post, Query, Req, Res, @@ -130,7 +128,7 @@ export class WebpageController { }) @ApiHeader({ name: 'x-callgent-callback', required: false }) @ApiHeader({ name: 'x-callgent-timeout', required: false }) - @All('invoke/:callgentId/:entryId/*') + @Get('invoke/:callgentId/:entryId/*') @ApiUnauthorizedResponse() async invoke( @Req() req, @@ -191,80 +189,4 @@ export class WebpageController { throw new NotFoundException('callgent not found: ' + callgentId); return { entry, callgent }; } - - @ApiOperation({ - description: - 'Inquiry the result of an invocation request. TODO: Socket Mode', - }) - @Get('/result/:requestId') - async invokeResult(@Param('requestId') reqId: string) { - // FIXME - return null; - } - - /** - * 1. push(task): { - * 2. mapping, - * 3. progressive param, ? manual/ai? - * 4. auth, invoke,-> } - * 5. reply -> confirm task - */ - // @Post('reply/:authToken') - // async postReply(@Param('authToken') authToken: string, @Body() body: object) { - // // verify the authToken - // const caller: JwtPayload = await this.verifyAppToken(authToken); - // if (!caller) throw new UnauthorizedException(); - - // // return this.called(authToken, body); - // } - - /** - * - * 1. called: { - * 2. verify - * 3. convert -> - * 4. create} - * 5. respond to caller -> - */ - // async called(authToken: string, callerType: string, body: object) { - // // verify the authToken - // const caller: JwtPayload = await this.verifyAppToken(authToken); - // if (!caller) throw new UnauthorizedException(); - - // const dto = await this.convertToTask(callerType, body, caller); - // if (!dto?.callgent) - // throw new BadRequestException('callgent id is missing'); - - // const [task] = await this.tasksService.create(dto); - - // // TODO instant syncResult to respond - // return task; - // } - - // /** jwt with aud == 'authToken' */ - // async verifyAppToken(authToken: string) { - // const payload: JwtPayload = await this.authTokensService.verify( - // authToken, - // 'API_KEY', - // ); - // return payload; - // } - - /** implementation for postmarkapp.com */ - // async convertToTask( - // callerType: string, - // body: object, - // caller: JwtPayload, - // ): Promise { - // const plugin: CallerPlugin = this.pluginsService.getPlugin(callerType); - // if (!plugin?.convertToTask) - // throw new BadRequestException( - // `plugin callerType=${callerType} not found`, - // ); - - // const task: TaskDto = await plugin.convertToTask(callerType, body, caller); - // if (!task) return; - - // return { ...task, callerType, createdBy: caller.sub }; - // } } diff --git a/src/entries/adaptors/entry-adaptor.base.ts b/src/entries/adaptors/entry-adaptor.base.ts index f53fa1b..185f0dc 100644 --- a/src/entries/adaptors/entry-adaptor.base.ts +++ b/src/entries/adaptors/entry-adaptor.base.ts @@ -1,6 +1,5 @@ import $RefParser from '@apidevtools/json-schema-ref-parser'; import { BadRequestException, NotFoundException } from '@nestjs/common'; -import { ApiProperty } from '@nestjs/swagger'; import { SecurityRequirementObject, SecuritySchemeObject, @@ -19,6 +18,17 @@ export abstract class EntryAdaptor { this.agentsService = agentsService; } + preCreate(data: Prisma.EntryUncheckedCreateInput) { + if (data.type == 'CLIENT') this._genClientHost(data); + else if (!data.host) throw new BadRequestException('host is required'); + // init entry name + data.name || (data.name = data.host); + } + + /** client host is auto generated by adaptor */ + // eslint-disable-next-line @typescript-eslint/no-unused-vars + protected _genClientHost(entry: Prisma.EntryUncheckedCreateInput) {} + /** preprocess request, replace raw request */ abstract preprocess( reqEvent: ClientRequestEvent, @@ -32,7 +42,7 @@ export abstract class EntryAdaptor { ): Promise; /** Entry config. */ - abstract getConfig(): EntryConfig; + // abstract getConfig(): EntryConfig; /** init the entry. result in generated content */ abstract initClient(initParams: object, entry: EntryDto): Promise; @@ -169,98 +179,98 @@ export class ApiSpec { securities?: SecurityRequirementObject[]; } -export class EntryParam { - @ApiProperty({ - description: - 'param type. `readonly` shows some instructions in markdown format', - }) - type: - | 'text' - | 'textarea' - | 'integer' - | 'float' - | 'boolean' - | 'date' - | 'time' - | 'datetime' - | 'password' - | 'email' - | 'tel' - | 'url' - | 'domain' - | 'cron' - | 'regex' - | 'file' - | 'image' - | 'radio' - | 'select' - | 'checkbox' - | 'multiselect' - | 'range' - | 'slider' - | 'color' - | 'yaml' - | 'json' - | 'markdown' - | 'file' - | 'image' - | 'script' - | 'readonly'; - @ApiProperty({ description: 'Param name' }) - name: string; - @ApiProperty({ description: 'Default to param name' }) - label?: string; - @ApiProperty() - placeholder?: string; - @ApiProperty() - optional?: boolean; - @ApiProperty({ description: 'Default value, or select options' }) - value?: any | { [key: string]: EntryParam[] }; - @ApiProperty() - constraint?: string; - @ApiProperty() - position?: number | 'bottom' | 'top'; - // @ApiProperty() - // hidden?: boolean | (form: object) => boolean; -} +// export class EntryParam { +// @ApiProperty({ +// description: +// 'param type. `readonly` shows some instructions in markdown format', +// }) +// type: +// | 'text' +// | 'textarea' +// | 'integer' +// | 'float' +// | 'boolean' +// | 'date' +// | 'time' +// | 'datetime' +// | 'password' +// | 'email' +// | 'tel' +// | 'url' +// | 'domain' +// | 'cron' +// | 'regex' +// | 'file' +// | 'image' +// | 'radio' +// | 'select' +// | 'checkbox' +// | 'multiselect' +// | 'range' +// | 'slider' +// | 'color' +// | 'yaml' +// | 'json' +// | 'markdown' +// | 'file' +// | 'image' +// | 'script' +// | 'readonly'; +// @ApiProperty({ description: 'Param name' }) +// name: string; +// @ApiProperty({ description: 'Default to param name' }) +// label?: string; +// @ApiProperty() +// placeholder?: string; +// @ApiProperty() +// optional?: boolean; +// @ApiProperty({ description: 'Default value, or select options' }) +// value?: any | { [key: string]: EntryParam[] }; +// @ApiProperty() +// constraint?: string; +// @ApiProperty() +// position?: number | 'bottom' | 'top'; +// // @ApiProperty() +// // hidden?: boolean | (form: object) => boolean; +// } -class EntryHost { - @ApiProperty({ - description: 'host address', - example: 'task+sdfhjw4349fe@my.callgent.com', - }) - address: EntryParam; +// class EntryHost { +// @ApiProperty({ +// description: 'host address', +// example: 'task+sdfhjw4349fe@my.callgent.com', +// }) +// address: EntryParam; - @ApiProperty({ - description: 'default auth type', - enum: ['NONE', 'APP', 'USER'], - }) - authType?: 'NONE' | 'APP' | 'USER'; +// @ApiProperty({ +// description: 'default auth type', +// enum: ['NONE', 'APP', 'USER'], +// }) +// authType?: 'NONE' | 'APP' | 'USER'; - @ApiProperty({ description: 'Authentication Configuration' }) - authConfig?: EntryParam[]; -} +// @ApiProperty({ description: 'Authentication Configuration' }) +// authConfig?: EntryParam[]; +// } -class Entry { - @ApiProperty({ - description: 'Optional entry host config', - }) - host?: EntryHost; - @ApiProperty({ description: 'Entry requesting params template' }) - params?: EntryParam[]; - @ApiProperty({ description: 'Whether allow additional params' }) - addParams?: boolean; - @ApiProperty({ description: 'Entry initialization params template' }) - initParams?: EntryParam[]; -} +// class Entry { +// @ApiProperty({ +// description: 'Optional entry host config', +// }) +// host?: EntryHost; +// @ApiProperty({ description: 'Entry requesting params template' }) +// params?: EntryParam[]; +// @ApiProperty({ description: 'Whether allow additional params' }) +// addParams?: boolean; +// @ApiProperty({ description: 'Entry initialization params template' }) +// initParams?: EntryParam[]; +// } -export class EntryConfig { - @ApiProperty({ description: 'Entry host' }) - host?: EntryHost; +// export class EntryConfig { +// @ApiProperty({ description: 'Entry host' }) +// host?: EntryHost; - @ApiProperty({ description: 'The task client entry' }) - client?: Entry; +// @ApiProperty({ description: 'The task client entry' }) +// client?: Entry; - @ApiProperty({ description: 'The task server entry' }) - server?: Entry; -} +// @ApiProperty({ description: 'The task server entry' }) +// server?: Entry; +// } diff --git a/src/entries/entries.service.ts b/src/entries/entries.service.ts index c1efe9b..89b23f4 100644 --- a/src/entries/entries.service.ts +++ b/src/entries/entries.service.ts @@ -16,7 +16,7 @@ import { ModuleRef, ModulesContainer } from '@nestjs/core'; import { EntryType, Prisma, PrismaClient } from '@prisma/client'; import { RealmSecurityVO } from '../callgent-realms/dto/realm-security.vo'; import { EndpointDto } from '../endpoints/dto/endpoint.dto'; -import { Utils } from '../infra/libs/utils'; +import { Optional, Requires, Utils } from '../infra/libs/utils'; import { selectHelper } from '../infra/repo/select.helper'; import { PrismaTenancyService } from '../infra/repo/tenancy/prisma-tenancy.service'; import { EntryAdaptor } from './adaptors/entry-adaptor.base'; @@ -169,27 +169,27 @@ export class EntriesService implements OnModuleInit { @Transactional() async create( - dto: Omit, + dto: Optional, select?: Prisma.EntrySelect, ) { const prisma = this.txHost.tx as PrismaClient; - const service = this.getAdaptor(dto.adaptorKey, dto.type); - if (!service) + const adaptor = this.getAdaptor(dto.adaptorKey, dto.type); + if (!adaptor) throw new BadRequestException( 'Invalid entry adaptor key=' + dto.adaptorKey, ); - const id = Utils.uuid(); - // init ep name - dto.host = dto.host.replace('{id}', id); - dto.name || (dto.name = dto.host); + dto.id = Utils.uuid(); + const data = dto as Prisma.EntryUncheckedCreateInput; + + adaptor.preCreate(data); return selectHelper( select, (select) => prisma.entry.create({ select, - data: { ...dto, id }, + data, }), this.defSelect, ); diff --git a/src/infra/libs/utils.ts b/src/infra/libs/utils.ts index 74a276d..f129151 100644 --- a/src/infra/libs/utils.ts +++ b/src/infra/libs/utils.ts @@ -81,3 +81,4 @@ export class Utils { /** to make some props optional, e.g. Optional */ export type Optional = Omit & Partial>; +export type Requires = T & Required>; From 553e188ac8e59eb34d6502fffabd9c232ba541e2 Mon Sep 17 00:00:00 2001 From: dev-callgent Date: Sun, 13 Oct 2024 22:36:00 +0800 Subject: [PATCH 098/183] chore(deps): update multiple versions Signed-off-by: dev-callgent --- package.json | 98 +- pnpm-lock.yaml | 2440 +++++++++++++++++++----------------------------- 2 files changed, 1031 insertions(+), 1507 deletions(-) diff --git a/package.json b/package.json index 2484fec..2a48b03 100644 --- a/package.json +++ b/package.json @@ -31,93 +31,91 @@ "release": "standard-version" }, "dependencies": { - "@apidevtools/json-schema-ref-parser": "^11.5.4", - "@fastify/compress": "^7.0.0", - "@fastify/cookie": "^9.3.1", + "@apidevtools/json-schema-ref-parser": "^11.7.2", + "@fastify/compress": "^7.0.3", + "@fastify/cookie": "^9.4.0", "@fastify/cors": "^9.0.1", "@fastify/helmet": "^11.1.1", "@fastify/multipart": "8.3.0", - "@fastify/static": "^6.12.0", - "@nestjs-cls/transactional": "^2.2.0", + "@fastify/static": "^7.0.4", + "@nestjs-cls/transactional": "^2.4.2", "@nestjs-cls/transactional-adapter-prisma": "^1.2.4", - "@nestjs/cache-manager": "^2.2.0", - "@nestjs/common": "^10.0.0", - "@nestjs/config": "^3.1.1", - "@nestjs/core": "^10.0.0", - "@nestjs/event-emitter": "^2.0.3", + "@nestjs/cache-manager": "^2.2.2", + "@nestjs/common": "^10.4.4", + "@nestjs/config": "^3.2.3", + "@nestjs/core": "^10.4.4", + "@nestjs/event-emitter": "^2.0.4", "@nestjs/jwt": "^10.2.0", "@nestjs/passport": "^10.0.3", "@nestjs/platform-fastify": "^10.3.4", - "@nestjs/swagger": "^7.3.0", + "@nestjs/swagger": "^7.4.2", "@nodeteam/nestjs-prisma-pagination": "^1.0.6", - "@prisma/client": "5.18.0", - "axios": "^1.7.5", + "@prisma/client": "5.20.0", + "axios": "^1.7.7", "bcrypt": "^5.1.1", "braces": "^3.0.3", "class-transformer": "^0.5.1", "class-validator": "^0.14.1", "dot": "^1.1.3", "fastify": "4.26.2", - "fastify-ip": "^1.0.0", - "glob": "^10.3.10", + "fastify-ip": "^1.1.0", + "glob": "^10.4.5", "http-status": "^1.7.4", - "jsonrepair": "^3.7.0", + "jsonrepair": "^3.8.1", "module": "^1.2.5", "ms": "^2.1.3", "nanoid": "3.3.7", - "nestjs-cls": "^4.2.0", + "nestjs-cls": "^4.4.1", "nestjs-oauth2": "^0.0.7", - "nestjs-pino": "^4.0.0", + "nestjs-pino": "^4.1.0", "nestjs-prisma": "^0.23.0", "passport-jwt": "^4.0.1", "passport-local": "^1.0.0", - "pino": "^8.18.0", - "pino-http": "^9.0.0", - "pino-pretty": "^10.3.1", + "pino": "^9.4.0", + "pino-http": "^10.3.0", + "pino-pretty": "^11.2.2", "prisma-soft-delete-middleware": "^1.3.1", - "reflect-metadata": "^0.1.13", + "reflect-metadata": "^0.2.2", "rxjs": "^7.8.1", - "v8-sandbox": "^3.2.10", - "yaml": "^2.5.0" + "yaml": "^2.6.0" }, "devDependencies": { - "@chax-at/transactional-prisma-testing": "^1.1.0", - "@commitlint/cli": "^19.2.0", - "@commitlint/config-angular": "^19.1.0", - "@nestjs/cli": "^10.0.0", - "@nestjs/schematics": "^10.0.0", - "@nestjs/testing": "^10.0.0", + "@chax-at/transactional-prisma-testing": "^1.2.0", + "@commitlint/cli": "^19.5.0", + "@commitlint/config-angular": "^19.5.0", + "@nestjs/cli": "^10.4.5", + "@nestjs/schematics": "^10.1.4", + "@nestjs/testing": "^10.4.4", "@pond918/prisma-generator-nestjs-dto": "^1.17.513", "@types/bcrypt": "^5.0.2", "@types/dot": "^1.1.7", - "@types/express": "^4.17.17", - "@types/jest": "^29.5.2", + "@types/jest": "^29.5.13", "@types/ms": "^0.7.34", - "@types/node": "^20.3.1", + "@types/node": "^22.7.5", "@types/passport-jwt": "^4.0.1", "@types/passport-local": "^1.0.38", - "@types/supertest": "^6.0.0", - "@typescript-eslint/eslint-plugin": "^6.0.0", - "@typescript-eslint/parser": "^6.0.0", - "commitizen": "^4.3.0", + "@types/supertest": "^6.0.2", + "@typescript-eslint/eslint-plugin": "^8.8.1", + "@typescript-eslint/parser": "^8.8.1", + "commitizen": "^4.3.1", "cz-conventional-changelog": "^3.3.0", - "eslint": "^8.42.0", - "eslint-config-prettier": "^9.0.0", - "eslint-plugin-prettier": "^5.0.0", - "husky": "^9.0.11", - "jest": "^29.5.0", - "pactum": "^3.6.3", - "pactum-matchers": "^1.1.6", - "prettier": "^3.0.0", - "prisma": "^5.18.0", + "eslint": "^9.12.0", + "eslint-config-prettier": "^9.1.0", + "eslint-plugin-prettier": "^5.2.1", + "husky": "^9.1.6", + "jest": "^29.7.0", + "pactum": "^3.7.1", + "pactum-matchers": "^1.1.7", + "prettier": "^3.3.3", + "prisma": "^5.20.0", "source-map-support": "^0.5.21", "standard-version": "^9.5.0", "supertest": "^6.3.3", - "ts-jest": "^29.1.0", - "ts-loader": "^9.4.3", - "ts-node": "^10.9.1", + "ts-jest": "^29.2.5", + "ts-loader": "^9.5.1", + "ts-node": "^10.9.2", "tsconfig-paths": "^4.2.0", - "typescript": "^5.1.3" + "typescript": "^5.6.3" }, "jest": { "moduleFileExtensions": [ diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 734f12e..785de06 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -2,14 +2,14 @@ lockfileVersion: '6.0' dependencies: '@apidevtools/json-schema-ref-parser': - specifier: ^11.5.4 - version: 11.5.4 + specifier: ^11.7.2 + version: 11.7.2 '@fastify/compress': - specifier: ^7.0.0 - version: 7.0.0 + specifier: ^7.0.3 + version: 7.0.3 '@fastify/cookie': - specifier: ^9.3.1 - version: 9.3.1 + specifier: ^9.4.0 + version: 9.4.0 '@fastify/cors': specifier: ^9.0.1 version: 9.0.1 @@ -20,50 +20,50 @@ dependencies: specifier: 8.3.0 version: 8.3.0 '@fastify/static': - specifier: ^6.12.0 - version: 6.12.0 + specifier: ^7.0.4 + version: 7.0.4 '@nestjs-cls/transactional': - specifier: ^2.2.0 - version: 2.2.0(@nestjs/common@10.0.0)(@nestjs/core@10.0.0)(nestjs-cls@4.2.0)(reflect-metadata@0.1.13)(rxjs@7.8.1) + specifier: ^2.4.2 + version: 2.4.2(@nestjs/common@10.4.4)(@nestjs/core@10.4.4)(nestjs-cls@4.4.1)(reflect-metadata@0.2.2)(rxjs@7.8.1) '@nestjs-cls/transactional-adapter-prisma': specifier: ^1.2.4 - version: 1.2.4(@nestjs-cls/transactional@2.2.0)(@prisma/client@5.18.0)(nestjs-cls@4.2.0)(prisma@5.18.0) + version: 1.2.4(@nestjs-cls/transactional@2.4.2)(@prisma/client@5.20.0)(nestjs-cls@4.4.1)(prisma@5.20.0) '@nestjs/cache-manager': - specifier: ^2.2.0 - version: 2.2.0(@nestjs/common@10.0.0)(@nestjs/core@10.0.0)(cache-manager@5.4.0)(reflect-metadata@0.1.13)(rxjs@7.8.1) + specifier: ^2.2.2 + version: 2.2.2(@nestjs/common@10.4.4)(@nestjs/core@10.4.4)(cache-manager@5.4.0)(rxjs@7.8.1) '@nestjs/common': - specifier: ^10.0.0 - version: 10.0.0(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.1.13)(rxjs@7.8.1) + specifier: ^10.4.4 + version: 10.4.4(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.2)(rxjs@7.8.1) '@nestjs/config': - specifier: ^3.1.1 - version: 3.1.1(@nestjs/common@10.0.0)(reflect-metadata@0.1.13) + specifier: ^3.2.3 + version: 3.2.3(@nestjs/common@10.4.4)(rxjs@7.8.1) '@nestjs/core': - specifier: ^10.0.0 - version: 10.0.0(@nestjs/common@10.0.0)(reflect-metadata@0.1.13)(rxjs@7.8.1) + specifier: ^10.4.4 + version: 10.4.4(@nestjs/common@10.4.4)(reflect-metadata@0.2.2)(rxjs@7.8.1) '@nestjs/event-emitter': - specifier: ^2.0.3 - version: 2.0.3(@nestjs/common@10.0.0)(@nestjs/core@10.0.0)(reflect-metadata@0.1.13) + specifier: ^2.0.4 + version: 2.0.4(@nestjs/common@10.4.4)(@nestjs/core@10.4.4) '@nestjs/jwt': specifier: ^10.2.0 - version: 10.2.0(@nestjs/common@10.0.0) + version: 10.2.0(@nestjs/common@10.4.4) '@nestjs/passport': specifier: ^10.0.3 - version: 10.0.3(@nestjs/common@10.0.0)(passport@0.7.0) + version: 10.0.3(@nestjs/common@10.4.4)(passport@0.7.0) '@nestjs/platform-fastify': specifier: ^10.3.4 - version: 10.3.4(@fastify/static@6.12.0)(@nestjs/common@10.0.0)(@nestjs/core@10.0.0) + version: 10.3.4(@fastify/static@7.0.4)(@nestjs/common@10.4.4)(@nestjs/core@10.4.4) '@nestjs/swagger': - specifier: ^7.3.0 - version: 7.3.0(@fastify/static@6.12.0)(@nestjs/common@10.0.0)(@nestjs/core@10.0.0)(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.1.13) + specifier: ^7.4.2 + version: 7.4.2(@fastify/static@7.0.4)(@nestjs/common@10.4.4)(@nestjs/core@10.4.4)(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.2) '@nodeteam/nestjs-prisma-pagination': specifier: ^1.0.6 - version: 1.0.6(@babel/core@7.23.9)(@nestjs/core@10.0.0)(@types/node@20.3.1)(cache-manager@5.4.0)(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.1.13)(rxjs@7.8.1)(ts-node@10.9.1) + version: 1.0.6(@babel/core@7.23.9)(@nestjs/core@10.4.4)(@types/node@22.7.5)(cache-manager@5.4.0)(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.2)(rxjs@7.8.1)(ts-node@10.9.2) '@prisma/client': - specifier: 5.18.0 - version: 5.18.0(prisma@5.18.0) + specifier: 5.20.0 + version: 5.20.0(prisma@5.20.0) axios: - specifier: ^1.7.5 - version: 1.7.5(debug@2.6.9) + specifier: ^1.7.7 + version: 1.7.7(debug@2.6.9) bcrypt: specifier: ^5.1.1 version: 5.1.1 @@ -83,17 +83,17 @@ dependencies: specifier: 4.26.2 version: 4.26.2 fastify-ip: - specifier: ^1.0.0 - version: 1.0.0 + specifier: ^1.1.0 + version: 1.1.0 glob: - specifier: ^10.3.10 - version: 10.3.10 + specifier: ^10.4.5 + version: 10.4.5 http-status: specifier: ^1.7.4 version: 1.7.4 jsonrepair: - specifier: ^3.7.0 - version: 3.7.0 + specifier: ^3.8.1 + version: 3.8.1 module: specifier: ^1.2.5 version: 1.2.5 @@ -104,17 +104,17 @@ dependencies: specifier: 3.3.7 version: 3.3.7 nestjs-cls: - specifier: ^4.2.0 - version: 4.2.0(@nestjs/common@10.0.0)(@nestjs/core@10.0.0)(reflect-metadata@0.1.13)(rxjs@7.8.1) + specifier: ^4.4.1 + version: 4.4.1(@nestjs/common@10.4.4)(@nestjs/core@10.4.4)(reflect-metadata@0.2.2)(rxjs@7.8.1) nestjs-oauth2: specifier: ^0.0.7 - version: 0.0.7(@nestjs/common@10.0.0)(rxjs@7.8.1) + version: 0.0.7(@nestjs/common@10.4.4)(rxjs@7.8.1) nestjs-pino: - specifier: ^4.0.0 - version: 4.0.0(@nestjs/common@10.0.0)(pino-http@9.0.0) + specifier: ^4.1.0 + version: 4.1.0(@nestjs/common@10.4.4)(pino-http@10.3.0) nestjs-prisma: specifier: ^0.23.0 - version: 0.23.0(@nestjs/common@10.0.0)(@prisma/client@5.18.0)(prisma@5.18.0) + version: 0.23.0(@nestjs/common@10.4.4)(@prisma/client@5.20.0)(prisma@5.20.0) passport-jwt: specifier: ^4.0.1 version: 4.0.1 @@ -122,49 +122,46 @@ dependencies: specifier: ^1.0.0 version: 1.0.0 pino: - specifier: ^8.18.0 - version: 8.18.0 + specifier: ^9.4.0 + version: 9.4.0 pino-http: - specifier: ^9.0.0 - version: 9.0.0 + specifier: ^10.3.0 + version: 10.3.0 pino-pretty: - specifier: ^10.3.1 - version: 10.3.1 + specifier: ^11.2.2 + version: 11.2.2 prisma-soft-delete-middleware: specifier: ^1.3.1 - version: 1.3.1(@prisma/client@5.18.0) + version: 1.3.1(@prisma/client@5.20.0) reflect-metadata: - specifier: ^0.1.13 - version: 0.1.13 + specifier: ^0.2.2 + version: 0.2.2 rxjs: specifier: ^7.8.1 version: 7.8.1 - v8-sandbox: - specifier: ^3.2.10 - version: 3.2.10(debug@2.6.9) yaml: - specifier: ^2.5.0 - version: 2.5.0 + specifier: ^2.6.0 + version: 2.6.0 devDependencies: '@chax-at/transactional-prisma-testing': - specifier: ^1.1.0 - version: 1.1.0(@prisma/client@5.18.0) + specifier: ^1.2.0 + version: 1.2.0(@prisma/client@5.20.0) '@commitlint/cli': - specifier: ^19.2.0 - version: 19.2.0(@types/node@20.3.1)(typescript@5.1.3) + specifier: ^19.5.0 + version: 19.5.0(@types/node@22.7.5)(typescript@5.6.3) '@commitlint/config-angular': - specifier: ^19.1.0 - version: 19.1.0 + specifier: ^19.5.0 + version: 19.5.0 '@nestjs/cli': - specifier: ^10.0.0 - version: 10.0.0 + specifier: ^10.4.5 + version: 10.4.5 '@nestjs/schematics': - specifier: ^10.0.0 - version: 10.0.0(chokidar@3.5.3)(typescript@5.1.3) + specifier: ^10.1.4 + version: 10.1.4(chokidar@3.6.0)(typescript@5.3.3) '@nestjs/testing': - specifier: ^10.0.0 - version: 10.0.0(@nestjs/common@10.0.0)(@nestjs/core@10.0.0) + specifier: ^10.4.4 + version: 10.4.4(@nestjs/common@10.4.4)(@nestjs/core@10.4.4) '@pond918/prisma-generator-nestjs-dto': specifier: ^1.17.513 version: 1.17.513 @@ -174,18 +171,15 @@ devDependencies: '@types/dot': specifier: ^1.1.7 version: 1.1.7 - '@types/express': - specifier: ^4.17.17 - version: 4.17.17 '@types/jest': - specifier: ^29.5.2 - version: 29.5.2 + specifier: ^29.5.13 + version: 29.5.13 '@types/ms': specifier: ^0.7.34 version: 0.7.34 '@types/node': - specifier: ^20.3.1 - version: 20.3.1 + specifier: ^22.7.5 + version: 22.7.5 '@types/passport-jwt': specifier: ^4.0.1 version: 4.0.1 @@ -193,47 +187,47 @@ devDependencies: specifier: ^1.0.38 version: 1.0.38 '@types/supertest': - specifier: ^6.0.0 - version: 6.0.0 + specifier: ^6.0.2 + version: 6.0.2 '@typescript-eslint/eslint-plugin': - specifier: ^6.0.0 - version: 6.0.0(@typescript-eslint/parser@6.0.0)(eslint@8.42.0)(typescript@5.1.3) + specifier: ^8.8.1 + version: 8.8.1(@typescript-eslint/parser@8.8.1)(eslint@9.12.0)(typescript@5.6.3) '@typescript-eslint/parser': - specifier: ^6.0.0 - version: 6.0.0(eslint@8.42.0)(typescript@5.1.3) + specifier: ^8.8.1 + version: 8.8.1(eslint@9.12.0)(typescript@5.6.3) commitizen: - specifier: ^4.3.0 - version: 4.3.0(@types/node@20.3.1)(typescript@5.1.3) + specifier: ^4.3.1 + version: 4.3.1(@types/node@22.7.5)(typescript@5.6.3) cz-conventional-changelog: specifier: ^3.3.0 - version: 3.3.0(@types/node@20.3.1)(typescript@5.1.3) + version: 3.3.0(@types/node@22.7.5)(typescript@5.6.3) eslint: - specifier: ^8.42.0 - version: 8.42.0 + specifier: ^9.12.0 + version: 9.12.0 eslint-config-prettier: - specifier: ^9.0.0 - version: 9.0.0(eslint@8.42.0) + specifier: ^9.1.0 + version: 9.1.0(eslint@9.12.0) eslint-plugin-prettier: - specifier: ^5.0.0 - version: 5.0.0(eslint-config-prettier@9.0.0)(eslint@8.42.0)(prettier@3.0.0) + specifier: ^5.2.1 + version: 5.2.1(eslint-config-prettier@9.1.0)(eslint@9.12.0)(prettier@3.3.3) husky: - specifier: ^9.0.11 - version: 9.0.11 + specifier: ^9.1.6 + version: 9.1.6 jest: - specifier: ^29.5.0 - version: 29.5.0(@types/node@20.3.1)(ts-node@10.9.1) + specifier: ^29.7.0 + version: 29.7.0(@types/node@22.7.5)(ts-node@10.9.2) pactum: - specifier: ^3.6.3 - version: 3.6.3 + specifier: ^3.7.1 + version: 3.7.1 pactum-matchers: - specifier: ^1.1.6 - version: 1.1.6 + specifier: ^1.1.7 + version: 1.1.7 prettier: - specifier: ^3.0.0 - version: 3.0.0 + specifier: ^3.3.3 + version: 3.3.3 prisma: - specifier: ^5.18.0 - version: 5.18.0 + specifier: ^5.20.0 + version: 5.20.0 source-map-support: specifier: ^0.5.21 version: 0.5.21 @@ -244,20 +238,20 @@ devDependencies: specifier: ^6.3.3 version: 6.3.3 ts-jest: - specifier: ^29.1.0 - version: 29.1.0(@babel/core@7.23.9)(jest@29.5.0)(typescript@5.1.3) + specifier: ^29.2.5 + version: 29.2.5(@babel/core@7.23.9)(jest@29.7.0)(typescript@5.6.3) ts-loader: - specifier: ^9.4.3 - version: 9.4.3(typescript@5.1.3)(webpack@5.90.1) + specifier: ^9.5.1 + version: 9.5.1(typescript@5.6.3)(webpack@5.94.0) ts-node: - specifier: ^10.9.1 - version: 10.9.1(@types/node@20.3.1)(typescript@5.1.3) + specifier: ^10.9.2 + version: 10.9.2(@types/node@22.7.5)(typescript@5.6.3) tsconfig-paths: specifier: ^4.2.0 version: 4.2.0 typescript: - specifier: ^5.1.3 - version: 5.1.3 + specifier: ^5.6.3 + version: 5.6.3 packages: @@ -290,9 +284,9 @@ packages: source-map: 0.7.3 dev: false - /@angular-devkit/core@16.1.0(chokidar@3.5.3): - resolution: {integrity: sha512-mrWpuDvttmhrCGcLc68RIXKtTzUhkBTsE5ZZFZNO1+FSC+vO/ZpyCpPd6C+6coM68NfXYjHlms5XF6KbxeGn/Q==} - 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@17.3.8(chokidar@3.6.0): + resolution: {integrity: sha512-Q8q0voCGudbdCgJ7lXdnyaxKHbNQBARH68zPQV72WT8NWy+Gw/tys870i6L58NWbBaCJEUcIj/kb6KoakSRu+Q==} + engines: {node: ^18.13.0 || >=20.9.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: '>= 1.13.0'} peerDependencies: chokidar: ^3.5.2 peerDependenciesMeta: @@ -301,21 +295,22 @@ packages: dependencies: ajv: 8.12.0 ajv-formats: 2.1.1(ajv@8.12.0) - chokidar: 3.5.3 - jsonc-parser: 3.2.0 + chokidar: 3.6.0 + jsonc-parser: 3.2.1 + picomatch: 4.0.1 rxjs: 7.8.1 source-map: 0.7.4 dev: true - /@angular-devkit/schematics-cli@16.1.0(chokidar@3.5.3): - resolution: {integrity: sha512-siBpRDmMMV7NB+NvaDHeJ4doHoSkFwIywwFj8GXnBCtobyxrBl1EyG1cKK+FHRydYtyYIk8FEoOpJA9oE9S2hg==} - 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@17.3.8(chokidar@3.6.0): + resolution: {integrity: sha512-TjmiwWJarX7oqvNiRAroQ5/LeKUatxBOCNEuKXO/PV8e7pn/Hr/BqfFm+UcYrQoFdZplmtNAfqmbqgVziKvCpA==} + engines: {node: ^18.13.0 || >=20.9.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: '>= 1.13.0'} hasBin: true dependencies: - '@angular-devkit/core': 16.1.0(chokidar@3.5.3) - '@angular-devkit/schematics': 16.1.0(chokidar@3.5.3) + '@angular-devkit/core': 17.3.8(chokidar@3.6.0) + '@angular-devkit/schematics': 17.3.8(chokidar@3.6.0) ansi-colors: 4.1.3 - inquirer: 8.2.4 + inquirer: 9.2.15 symbol-observable: 4.0.0 yargs-parser: 21.1.1 transitivePeerDependencies: @@ -335,21 +330,21 @@ packages: - chokidar dev: false - /@angular-devkit/schematics@16.1.0(chokidar@3.5.3): - resolution: {integrity: sha512-LM35PH9DT3eQRSZgrkk2bx1ZQjjVh8BCByTlr37/c+FnF9mNbeBsa1YkxrlsN/CwO+045OwEwRHnkM9Zcx0U/A==} - 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@17.3.8(chokidar@3.6.0): + resolution: {integrity: sha512-QRVEYpIfgkprNHc916JlPuNbLzOgrm9DZalHasnLUz4P6g7pR21olb8YCyM2OTJjombNhya9ZpckcADU5Qyvlg==} + engines: {node: ^18.13.0 || >=20.9.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: '>= 1.13.0'} dependencies: - '@angular-devkit/core': 16.1.0(chokidar@3.5.3) - jsonc-parser: 3.2.0 - magic-string: 0.30.0 + '@angular-devkit/core': 17.3.8(chokidar@3.6.0) + jsonc-parser: 3.2.1 + magic-string: 0.30.8 ora: 5.4.1 rxjs: 7.8.1 transitivePeerDependencies: - chokidar dev: true - /@apidevtools/json-schema-ref-parser@11.5.4: - resolution: {integrity: sha512-o2fsypTGU0WxRxbax8zQoHiIB4dyrkwYfcm8TxZ+bx9pCzcWZbQtiMqpgBvWA/nJ2TrGjK5adCLfTH8wUeU/Wg==} + /@apidevtools/json-schema-ref-parser@11.7.2: + resolution: {integrity: sha512-4gY54eEGEstClvEkGnwVkTkrx0sqwemEFG5OSRRn3tD91XH0+Q8XIkYIfo7IwEWPpJZwILb9GUXeShtplRc/eA==} engines: {node: '>= 16'} dependencies: '@jsdevtools/ono': 7.1.3 @@ -654,13 +649,13 @@ packages: /@bcoe/v8-coverage@0.2.3: resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==} - /@chax-at/transactional-prisma-testing@1.1.0(@prisma/client@5.18.0): - resolution: {integrity: sha512-BT2KRg2mfHbjW3gb3u5RtXjwvodywA8uvOX5Szm2J6KotgYJ/vRnCJ8LKp+kb/dbHhnPIrOCTtj6AY1Xku8Wng==} + /@chax-at/transactional-prisma-testing@1.2.0(@prisma/client@5.20.0): + resolution: {integrity: sha512-4GIEeHUlqcpggfz4t+t3tQb44uc67YWIzXnkB0m0Cy3jPOex/5fRhezebtqIxJzS2k4XIGxeJDij/Ajp0Mwy/Q==} engines: {node: '>= 14'} peerDependencies: '@prisma/client': ^4.7.0 || 5 dependencies: - '@prisma/client': 5.18.0(prisma@5.18.0) + '@prisma/client': 5.20.0(prisma@5.20.0) dev: true /@colors/colors@1.5.0: @@ -670,48 +665,48 @@ packages: dev: true optional: true - /@commitlint/cli@19.2.0(@types/node@20.3.1)(typescript@5.1.3): - resolution: {integrity: sha512-8XnQDMyQR+1/ldbmIyhonvnDS2enEw48Wompo/967fsEvy9Vj5/JbDutzmSBKxANWDVeEbR9QQm0yHpw6ArrFw==} + /@commitlint/cli@19.5.0(@types/node@22.7.5)(typescript@5.6.3): + resolution: {integrity: sha512-gaGqSliGwB86MDmAAKAtV9SV1SHdmN8pnGq4EJU4+hLisQ7IFfx4jvU4s+pk6tl0+9bv6yT+CaZkufOinkSJIQ==} engines: {node: '>=v18'} hasBin: true dependencies: - '@commitlint/format': 19.0.3 - '@commitlint/lint': 19.1.0 - '@commitlint/load': 19.2.0(@types/node@20.3.1)(typescript@5.1.3) - '@commitlint/read': 19.2.0 - '@commitlint/types': 19.0.3 - execa: 8.0.1 + '@commitlint/format': 19.5.0 + '@commitlint/lint': 19.5.0 + '@commitlint/load': 19.5.0(@types/node@22.7.5)(typescript@5.6.3) + '@commitlint/read': 19.5.0 + '@commitlint/types': 19.5.0 + tinyexec: 0.3.0 yargs: 17.7.2 transitivePeerDependencies: - '@types/node' - typescript dev: true - /@commitlint/config-angular-type-enum@19.1.0: - resolution: {integrity: sha512-eLjt7vSArP62kpDmmIZNdIBjPzbqY8jss6mVOcSDm4t1KfDw4UmPrtPh/7zcIL3GI5uf/7W8d2s3K0qisf9C+g==} + /@commitlint/config-angular-type-enum@19.5.0: + resolution: {integrity: sha512-4/6xrkElCSBb7+6oZXlBJ/zytkxXgmTg5gk1Voj3GAWShTivtWrPtDYvHmF858WhA695YKgxMHEPNN74UFkK8w==} engines: {node: '>=v18'} dev: true - /@commitlint/config-angular@19.1.0: - resolution: {integrity: sha512-qZyG9FHjPoG+VaHxH1OruWI8cmWWRe00sAS73jXAhACimT74k4Dex5jI2cKFcXSH8Ebh1yGwxfjzSgup5O0ykA==} + /@commitlint/config-angular@19.5.0: + resolution: {integrity: sha512-EPQBuSK4uVNUj2HhWSJjmfHqgPpST//h07oIzcPK2FauFGGGX0Vt+kzNxnQRDEEUvSAHDRNTDWNaFv66Hlle6A==} engines: {node: '>=v18'} dependencies: - '@commitlint/config-angular-type-enum': 19.1.0 + '@commitlint/config-angular-type-enum': 19.5.0 dev: true - /@commitlint/config-validator@19.0.3: - resolution: {integrity: sha512-2D3r4PKjoo59zBc2auodrSCaUnCSALCx54yveOFwwP/i2kfEAQrygwOleFWswLqK0UL/F9r07MFi5ev2ohyM4Q==} + /@commitlint/config-validator@19.5.0: + resolution: {integrity: sha512-CHtj92H5rdhKt17RmgALhfQt95VayrUo2tSqY9g2w+laAXyk7K/Ef6uPm9tn5qSIwSmrLjKaXK9eiNuxmQrDBw==} engines: {node: '>=v18'} dependencies: - '@commitlint/types': 19.0.3 + '@commitlint/types': 19.5.0 ajv: 8.12.0 dev: true - /@commitlint/ensure@19.0.3: - resolution: {integrity: sha512-SZEpa/VvBLoT+EFZVb91YWbmaZ/9rPH3ESrINOl0HD2kMYsjvl0tF7nMHh0EpTcv4+gTtZBAe1y/SS6/OhfZzQ==} + /@commitlint/ensure@19.5.0: + resolution: {integrity: sha512-Kv0pYZeMrdg48bHFEU5KKcccRfKmISSm9MvgIgkpI6m+ohFTB55qZlBW6eYqh/XDfRuIO0x4zSmvBjmOwWTwkg==} engines: {node: '>=v18'} dependencies: - '@commitlint/types': 19.0.3 + '@commitlint/types': 19.5.0 lodash.camelcase: 4.3.0 lodash.kebabcase: 4.1.1 lodash.snakecase: 4.1.1 @@ -719,48 +714,48 @@ packages: lodash.upperfirst: 4.3.1 dev: true - /@commitlint/execute-rule@19.0.0: - resolution: {integrity: sha512-mtsdpY1qyWgAO/iOK0L6gSGeR7GFcdW7tIjcNFxcWkfLDF5qVbPHKuGATFqRMsxcO8OUKNj0+3WOHB7EHm4Jdw==} + /@commitlint/execute-rule@19.5.0: + resolution: {integrity: sha512-aqyGgytXhl2ejlk+/rfgtwpPexYyri4t8/n4ku6rRJoRhGZpLFMqrZ+YaubeGysCP6oz4mMA34YSTaSOKEeNrg==} engines: {node: '>=v18'} dev: true - /@commitlint/format@19.0.3: - resolution: {integrity: sha512-QjjyGyoiVWzx1f5xOteKHNLFyhyweVifMgopozSgx1fGNrGV8+wp7k6n1t6StHdJ6maQJ+UUtO2TcEiBFRyR6Q==} + /@commitlint/format@19.5.0: + resolution: {integrity: sha512-yNy088miE52stCI3dhG/vvxFo9e4jFkU1Mj3xECfzp/bIS/JUay4491huAlVcffOoMK1cd296q0W92NlER6r3A==} engines: {node: '>=v18'} dependencies: - '@commitlint/types': 19.0.3 + '@commitlint/types': 19.5.0 chalk: 5.3.0 dev: true - /@commitlint/is-ignored@19.0.3: - resolution: {integrity: sha512-MqDrxJaRSVSzCbPsV6iOKG/Lt52Y+PVwFVexqImmYYFhe51iVJjK2hRhOG2jUAGiUHk4jpdFr0cZPzcBkSzXDQ==} + /@commitlint/is-ignored@19.5.0: + resolution: {integrity: sha512-0XQ7Llsf9iL/ANtwyZ6G0NGp5Y3EQ8eDQSxv/SRcfJ0awlBY4tHFAvwWbw66FVUaWICH7iE5en+FD9TQsokZ5w==} engines: {node: '>=v18'} dependencies: - '@commitlint/types': 19.0.3 - semver: 7.6.0 + '@commitlint/types': 19.5.0 + semver: 7.6.3 dev: true - /@commitlint/lint@19.1.0: - resolution: {integrity: sha512-ESjaBmL/9cxm+eePyEr6SFlBUIYlYpI80n+Ltm7IA3MAcrmiP05UMhJdAD66sO8jvo8O4xdGn/1Mt2G5VzfZKw==} + /@commitlint/lint@19.5.0: + resolution: {integrity: sha512-cAAQwJcRtiBxQWO0eprrAbOurtJz8U6MgYqLz+p9kLElirzSCc0vGMcyCaA1O7AqBuxo11l1XsY3FhOFowLAAg==} engines: {node: '>=v18'} dependencies: - '@commitlint/is-ignored': 19.0.3 - '@commitlint/parse': 19.0.3 - '@commitlint/rules': 19.0.3 - '@commitlint/types': 19.0.3 + '@commitlint/is-ignored': 19.5.0 + '@commitlint/parse': 19.5.0 + '@commitlint/rules': 19.5.0 + '@commitlint/types': 19.5.0 dev: true - /@commitlint/load@19.2.0(@types/node@20.3.1)(typescript@5.1.3): - resolution: {integrity: sha512-XvxxLJTKqZojCxaBQ7u92qQLFMMZc4+p9qrIq/9kJDy8DOrEa7P1yx7Tjdc2u2JxIalqT4KOGraVgCE7eCYJyQ==} + /@commitlint/load@19.5.0(@types/node@22.7.5)(typescript@5.6.3): + resolution: {integrity: sha512-INOUhkL/qaKqwcTUvCE8iIUf5XHsEPCLY9looJ/ipzi7jtGhgmtH7OOFiNvwYgH7mA8osUWOUDV8t4E2HAi4xA==} engines: {node: '>=v18'} dependencies: - '@commitlint/config-validator': 19.0.3 - '@commitlint/execute-rule': 19.0.0 - '@commitlint/resolve-extends': 19.1.0 - '@commitlint/types': 19.0.3 + '@commitlint/config-validator': 19.5.0 + '@commitlint/execute-rule': 19.5.0 + '@commitlint/resolve-extends': 19.5.0 + '@commitlint/types': 19.5.0 chalk: 5.3.0 - cosmiconfig: 9.0.0(typescript@5.1.3) - cosmiconfig-typescript-loader: 5.0.0(@types/node@20.3.1)(cosmiconfig@9.0.0)(typescript@5.1.3) + cosmiconfig: 9.0.0(typescript@5.6.3) + cosmiconfig-typescript-loader: 5.0.0(@types/node@22.7.5)(cosmiconfig@9.0.0)(typescript@5.6.3) lodash.isplainobject: 4.0.6 lodash.merge: 4.6.2 lodash.uniq: 4.5.0 @@ -769,68 +764,67 @@ packages: - typescript dev: true - /@commitlint/message@19.0.0: - resolution: {integrity: sha512-c9czf6lU+9oF9gVVa2lmKaOARJvt4soRsVmbR7Njwp9FpbBgste5i7l/2l5o8MmbwGh4yE1snfnsy2qyA2r/Fw==} + /@commitlint/message@19.5.0: + resolution: {integrity: sha512-R7AM4YnbxN1Joj1tMfCyBryOC5aNJBdxadTZkuqtWi3Xj0kMdutq16XQwuoGbIzL2Pk62TALV1fZDCv36+JhTQ==} engines: {node: '>=v18'} dev: true - /@commitlint/parse@19.0.3: - resolution: {integrity: sha512-Il+tNyOb8VDxN3P6XoBBwWJtKKGzHlitEuXA5BP6ir/3loWlsSqDr5aecl6hZcC/spjq4pHqNh0qPlfeWu38QA==} + /@commitlint/parse@19.5.0: + resolution: {integrity: sha512-cZ/IxfAlfWYhAQV0TwcbdR1Oc0/r0Ik1GEessDJ3Lbuma/MRO8FRQX76eurcXtmhJC//rj52ZSZuXUg0oIX0Fw==} engines: {node: '>=v18'} dependencies: - '@commitlint/types': 19.0.3 + '@commitlint/types': 19.5.0 conventional-changelog-angular: 7.0.0 conventional-commits-parser: 5.0.0 dev: true - /@commitlint/read@19.2.0: - resolution: {integrity: sha512-HlGeEd/jyp2a5Fb9mvtsaDm5hFCmj80dJYjLQkpG3DzWneWBc37YU3kM8Za1D1HUazZaTkdsWq73M3XDE4CvCA==} + /@commitlint/read@19.5.0: + resolution: {integrity: sha512-TjS3HLPsLsxFPQj6jou8/CZFAmOP2y+6V4PGYt3ihbQKTY1Jnv0QG28WRKl/d1ha6zLODPZqsxLEov52dhR9BQ==} engines: {node: '>=v18'} dependencies: - '@commitlint/top-level': 19.0.0 - '@commitlint/types': 19.0.3 - execa: 8.0.1 + '@commitlint/top-level': 19.5.0 + '@commitlint/types': 19.5.0 git-raw-commits: 4.0.0 minimist: 1.2.8 + tinyexec: 0.3.0 dev: true - /@commitlint/resolve-extends@19.1.0: - resolution: {integrity: sha512-z2riI+8G3CET5CPgXJPlzftH+RiWYLMYv4C9tSLdLXdr6pBNimSKukYP9MS27ejmscqCTVA4almdLh0ODD2KYg==} + /@commitlint/resolve-extends@19.5.0: + resolution: {integrity: sha512-CU/GscZhCUsJwcKTJS9Ndh3AKGZTNFIOoQB2n8CmFnizE0VnEuJoum+COW+C1lNABEeqk6ssfc1Kkalm4bDklA==} engines: {node: '>=v18'} dependencies: - '@commitlint/config-validator': 19.0.3 - '@commitlint/types': 19.0.3 + '@commitlint/config-validator': 19.5.0 + '@commitlint/types': 19.5.0 global-directory: 4.0.1 import-meta-resolve: 4.0.0 lodash.mergewith: 4.6.2 resolve-from: 5.0.0 dev: true - /@commitlint/rules@19.0.3: - resolution: {integrity: sha512-TspKb9VB6svklxNCKKwxhELn7qhtY1rFF8ls58DcFd0F97XoG07xugPjjbVnLqmMkRjZDbDIwBKt9bddOfLaPw==} + /@commitlint/rules@19.5.0: + resolution: {integrity: sha512-hDW5TPyf/h1/EufSHEKSp6Hs+YVsDMHazfJ2azIk9tHPXS6UqSz1dIRs1gpqS3eMXgtkT7JH6TW4IShdqOwhAw==} engines: {node: '>=v18'} dependencies: - '@commitlint/ensure': 19.0.3 - '@commitlint/message': 19.0.0 - '@commitlint/to-lines': 19.0.0 - '@commitlint/types': 19.0.3 - execa: 8.0.1 + '@commitlint/ensure': 19.5.0 + '@commitlint/message': 19.5.0 + '@commitlint/to-lines': 19.5.0 + '@commitlint/types': 19.5.0 dev: true - /@commitlint/to-lines@19.0.0: - resolution: {integrity: sha512-vkxWo+VQU5wFhiP9Ub9Sre0FYe019JxFikrALVoD5UGa8/t3yOJEpEhxC5xKiENKKhUkTpEItMTRAjHw2SCpZw==} + /@commitlint/to-lines@19.5.0: + resolution: {integrity: sha512-R772oj3NHPkodOSRZ9bBVNq224DOxQtNef5Pl8l2M8ZnkkzQfeSTr4uxawV2Sd3ui05dUVzvLNnzenDBO1KBeQ==} engines: {node: '>=v18'} dev: true - /@commitlint/top-level@19.0.0: - resolution: {integrity: sha512-KKjShd6u1aMGNkCkaX4aG1jOGdn7f8ZI8TR1VEuNqUOjWTOdcDSsmglinglJ18JTjuBX5I1PtjrhQCRcixRVFQ==} + /@commitlint/top-level@19.5.0: + resolution: {integrity: sha512-IP1YLmGAk0yWrImPRRc578I3dDUI5A2UBJx9FbSOjxe9sTlzFiwVJ+zeMLgAtHMtGZsC8LUnzmW1qRemkFU4ng==} engines: {node: '>=v18'} dependencies: find-up: 7.0.0 dev: true - /@commitlint/types@19.0.3: - resolution: {integrity: sha512-tpyc+7i6bPG9mvaBbtKUeghfyZSDgWquIDfMgqYtTbmZ9Y9VzEm2je9EYcQ0aoz5o7NvGS+rcDec93yO08MHYA==} + /@commitlint/types@19.5.0: + resolution: {integrity: sha512-DSHae2obMSMkAtTBSOulg5X7/z+rGLxcXQIkg3OmWvY6wifojge5uVMydfhUvs7yQj+V7jNmRZ2Xzl8GJyqRgg==} engines: {node: '>=v18'} dependencies: '@types/conventional-commits-parser': 5.0.0 @@ -843,13 +837,13 @@ packages: dependencies: '@jridgewell/trace-mapping': 0.3.9 - /@eslint-community/eslint-utils@4.4.0(eslint@8.42.0): + /@eslint-community/eslint-utils@4.4.0(eslint@9.12.0): resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 dependencies: - eslint: 8.42.0 + eslint: 9.12.0 eslint-visitor-keys: 3.4.3 dev: true @@ -858,14 +852,35 @@ packages: engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} dev: true - /@eslint/eslintrc@2.1.4: - resolution: {integrity: sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + /@eslint-community/regexpp@4.11.1: + resolution: {integrity: sha512-m4DVN9ZqskZoLU5GlWZadwDnYo3vAEydiUayB9widCl9ffWx2IvPnp6n3on5rJmziJSw9Bv+Z3ChDVdMwXCY8Q==} + engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} + dev: true + + /@eslint/config-array@0.18.0: + resolution: {integrity: sha512-fTxvnS1sRMu3+JjXwJG0j/i4RT9u4qJ+lqS/yCGap4lH4zZGzQ7tu+xZqQmcMZq5OBZDL4QRxQzRjkWcGt8IVw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + dependencies: + '@eslint/object-schema': 2.1.4 + debug: 4.3.4 + minimatch: 3.1.2 + transitivePeerDependencies: + - supports-color + dev: true + + /@eslint/core@0.6.0: + resolution: {integrity: sha512-8I2Q8ykA4J0x0o7cg67FPVnehcqWTBehu/lmY+bolPFHGjh49YzGBMXTvpqVgEbBdvNCSxj6iFgiIyHzf03lzg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + dev: true + + /@eslint/eslintrc@3.1.0: + resolution: {integrity: sha512-4Bfj15dVJdoy3RfZmmo86RK1Fwzn6SstsvK9JS+BaVKqC6QQQQyXekNaC+g+LKNgkQ+2VhGAzm6hO40AhMR3zQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} dependencies: ajv: 6.12.6 debug: 4.3.4 - espree: 9.6.1 - globals: 13.24.0 + espree: 10.2.0 + globals: 14.0.0 ignore: 5.3.1 import-fresh: 3.3.0 js-yaml: 4.1.0 @@ -875,9 +890,21 @@ packages: - supports-color dev: true - /@eslint/js@8.42.0: - resolution: {integrity: sha512-6SWlXpWU5AvId8Ac7zjzmIOqMOba/JWY8XZ4A7q7Gn1Vlfg/SFFIlrtHXt9nPn4op9ZPAkl91Jao+QQv3r/ukw==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + /@eslint/js@9.12.0: + resolution: {integrity: sha512-eohesHH8WFRUprDNyEREgqP6beG6htMeUYeCpkEgBCieCMme5r9zFWjzAJp//9S+Kub4rqE+jXe9Cp1a7IYIIA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + dev: true + + /@eslint/object-schema@2.1.4: + resolution: {integrity: sha512-BsWiH1yFGjXXS2yvrf5LyuoSIIbPrGUWob917o+BTKuZ7qJdxX8aJLRxs1fS9n6r7vESrq1OUqb68dANcFXuQQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + dev: true + + /@eslint/plugin-kit@0.2.0: + resolution: {integrity: sha512-vH9PiIMMwvhCx31Af3HiGzsVNULDbyVkHXwlemn/B0TFj/00ho3y55efXrUZTfQipxoHC5u4xq6zblww1zm1Ig==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + dependencies: + levn: 0.4.1 dev: true /@exodus/schemasafe@1.3.0: @@ -902,21 +929,21 @@ packages: engines: {node: '>=14'} dev: false - /@fastify/compress@7.0.0: - resolution: {integrity: sha512-jo/NaBVHP1OXIf8Kmr3bZyYQB0gAIgcy5c8rRKTPjhklHO7lRs/6ZFckUVT0NtbKSvrTuIcmSkxYpjyv3FNHXA==} + /@fastify/compress@7.0.3: + resolution: {integrity: sha512-xa9fo5/DgK1s0bkS6xrYgNn8HmofO5tJvbCDk8QuXshSgLd2cFZANv1ox/Qv7zswS7JroHwTlCVv/XGTVO98tg==} dependencies: '@fastify/accept-negotiator': 1.1.0 fastify-plugin: 4.5.1 - into-stream: 6.0.0 mime-db: 1.52.0 minipass: 7.0.4 peek-stream: 1.1.3 pump: 3.0.0 pumpify: 2.0.1 + readable-stream: 4.5.2 dev: false - /@fastify/cookie@9.3.1: - resolution: {integrity: sha512-h1NAEhB266+ZbZ0e9qUE6NnNR07i7DnNXWG9VbbZ8uC6O/hxHpl+Zoe5sw1yfdZ2U6XhToUGDnzQtWJdCaPwfg==} + /@fastify/cookie@9.4.0: + resolution: {integrity: sha512-Th+pt3kEkh4MQD/Q2q1bMuJIB5NX/D5SwSpOKu3G/tjoGbwfpurIMJsWSPS0SJJ4eyjtmQ8OipDQspf8RbUOlg==} dependencies: cookie-signature: 1.2.1 fastify-plugin: 4.5.1 @@ -993,28 +1020,24 @@ packages: mime: 3.0.0 dev: false - /@fastify/static@6.12.0: - resolution: {integrity: sha512-KK1B84E6QD/FcQWxDI2aiUCwHxMJBI1KeCUzm1BwYpPY1b742+jeKruGHP2uOluuM6OkBPI8CIANrXcCRtC2oQ==} + /@fastify/static@7.0.4: + resolution: {integrity: sha512-p2uKtaf8BMOZWLs6wu+Ihg7bWNBdjNgCwDza4MJtTqg+5ovKmcbgbR9Xs5/smZ1YISfzKOCNYmZV8LaCj+eJ1Q==} dependencies: '@fastify/accept-negotiator': 1.1.0 '@fastify/send': 2.1.0 content-disposition: 0.5.4 fastify-plugin: 4.5.1 - glob: 8.1.0 - p-limit: 3.1.0 - dev: false - - /@gar/promisify@1.1.3: - resolution: {integrity: sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw==} + fastq: 1.17.1 + glob: 10.4.5 dev: false - /@golevelup/nestjs-modules@0.6.1(@nestjs/common@10.0.0)(rxjs@7.8.1): + /@golevelup/nestjs-modules@0.6.1(@nestjs/common@10.4.4)(rxjs@7.8.1): resolution: {integrity: sha512-E0STg8In8fhIivnGDJAA70+XLPHzK5bMTkCnif9FbZ8waTYDQ3T/QQL0h73k+CUFeznn1hmuEW14sNaE+8cd7w==} peerDependencies: '@nestjs/common': ^9.x rxjs: ^7.x dependencies: - '@nestjs/common': 10.0.0(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.1.13)(rxjs@7.8.1) + '@nestjs/common': 10.4.4(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.2)(rxjs@7.8.1) lodash: 4.17.21 rxjs: 7.8.1 dev: false @@ -1027,15 +1050,17 @@ packages: through2: 2.0.5 dev: false - /@humanwhocodes/config-array@0.11.14: - resolution: {integrity: sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==} - engines: {node: '>=10.10.0'} + /@humanfs/core@0.19.0: + resolution: {integrity: sha512-2cbWIHbZVEweE853g8jymffCA+NCMiuqeECeBBLm8dg2oFdjuGJhgN4UAbI+6v0CKbbhvtXA4qV8YR5Ji86nmw==} + engines: {node: '>=18.18.0'} + dev: true + + /@humanfs/node@0.16.5: + resolution: {integrity: sha512-KSPA4umqSG4LHYRodq31VDwKAvaTF4xmVlzM8Aeh4PlU1JQ3IG0wiA8C25d3RQ9nJyM3mBHyI53K06VVL/oFFg==} + engines: {node: '>=18.18.0'} dependencies: - '@humanwhocodes/object-schema': 2.0.2 - debug: 4.3.4 - minimatch: 3.1.2 - transitivePeerDependencies: - - supports-color + '@humanfs/core': 0.19.0 + '@humanwhocodes/retry': 0.3.1 dev: true /@humanwhocodes/module-importer@1.0.1: @@ -1043,8 +1068,9 @@ packages: engines: {node: '>=12.22'} dev: true - /@humanwhocodes/object-schema@2.0.2: - resolution: {integrity: sha512-6EwiSjwWYP7pTckG6I5eyFANjPhmPjUX9JRLUSfNPC7FX7zK9gyZAfUEaECL6ALTpGX5AjnBq3C9XmVWPitNpw==} + /@humanwhocodes/retry@0.3.1: + resolution: {integrity: sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==} + engines: {node: '>=18.18'} dev: true /@hutson/parse-repository-url@3.0.2: @@ -1062,7 +1088,6 @@ packages: strip-ansi-cjs: /strip-ansi@6.0.1 wrap-ansi: 8.1.0 wrap-ansi-cjs: /wrap-ansi@7.0.0 - dev: false /@istanbuljs/load-nyc-config@1.1.0: resolution: {integrity: sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==} @@ -1083,13 +1108,13 @@ packages: engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: '@jest/types': 29.6.3 - '@types/node': 20.3.1 + '@types/node': 22.7.5 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.1): + /@jest/core@29.7.0(ts-node@10.9.2): resolution: {integrity: sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} peerDependencies: @@ -1103,14 +1128,14 @@ packages: '@jest/test-result': 29.7.0 '@jest/transform': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 20.3.1 + '@types/node': 22.7.5 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@20.3.1)(ts-node@10.9.1) + jest-config: 29.7.0(@types/node@22.7.5)(ts-node@10.9.2) jest-haste-map: 29.7.0 jest-message-util: 29.7.0 jest-regex-util: 29.6.3 @@ -1137,7 +1162,7 @@ packages: dependencies: '@jest/fake-timers': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 20.3.1 + '@types/node': 22.7.5 jest-mock: 29.7.0 /@jest/expect-utils@29.7.0: @@ -1161,7 +1186,7 @@ packages: dependencies: '@jest/types': 29.6.3 '@sinonjs/fake-timers': 10.3.0 - '@types/node': 20.3.1 + '@types/node': 22.7.5 jest-message-util: 29.7.0 jest-mock: 29.7.0 jest-util: 29.7.0 @@ -1192,7 +1217,7 @@ packages: '@jest/transform': 29.7.0 '@jest/types': 29.6.3 '@jridgewell/trace-mapping': 0.3.22 - '@types/node': 20.3.1 + '@types/node': 22.7.5 chalk: 4.1.2 collect-v8-coverage: 1.0.2 exit: 0.1.2 @@ -1274,7 +1299,7 @@ packages: '@jest/schemas': 29.6.3 '@types/istanbul-lib-coverage': 2.0.6 '@types/istanbul-reports': 3.0.4 - '@types/node': 20.3.1 + '@types/node': 22.7.5 '@types/yargs': 17.0.32 chalk: 4.1.2 @@ -1320,6 +1345,13 @@ packages: resolution: {integrity: sha512-4JQNk+3mVzK3xh2rqd6RB4J46qUR19azEHBneZyTZM+c456qOrbbM/5xcR8huNCCcbVt7+UmizG6GuUvPvKUYg==} dev: false + /@ljharb/through@2.3.13: + resolution: {integrity: sha512-/gKJun8NNiWGZJkGzI/Ragc53cOdcLNdzjLaIa+GEjguQs0ulsurx8WN0jijdK9yPqDvziX995sMRLyLt1uZMQ==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.7 + dev: true + /@lukeed/csprng@1.1.0: resolution: {integrity: sha512-Z7C/xXCiGWsg0KuKsHTKJxbWhpI3Vs5GwLfOean7MGyVFGqdRgBbAjOCh6u4bbjPc/8MJ2pZmK/0DLdCbivLDA==} engines: {node: '>=8'} @@ -1347,11 +1379,11 @@ packages: - supports-color dev: false - /@microsoft/tsdoc@0.14.2: - resolution: {integrity: sha512-9b8mPpKrfeGRuhFH5iO1iwCLeIIsV6+H1sRfxbkoGXIyQE2BTsPd9zqSqQJ+pv5sJ/hT5M1zvOFL02MnEezFug==} + /@microsoft/tsdoc@0.15.0: + resolution: {integrity: sha512-HZpPoABogPvjeJOdzCOSJsXeL/SMCBgBZMVC3X3d7YYp2gf31MfxhUoYUNwf1ERPJOnQc0wkFn9trqI6ZEdZuA==} dev: false - /@nestjs-cls/transactional-adapter-prisma@1.2.4(@nestjs-cls/transactional@2.2.0)(@prisma/client@5.18.0)(nestjs-cls@4.2.0)(prisma@5.18.0): + /@nestjs-cls/transactional-adapter-prisma@1.2.4(@nestjs-cls/transactional@2.4.2)(@prisma/client@5.20.0)(nestjs-cls@4.4.1)(prisma@5.20.0): resolution: {integrity: sha512-W/Ej+T3QG81//d4YuXsuHnV9WFvWTQBQk1BSiowyq7d812lyr3zk8ZMwmAhB7JAY80cJMeBY6i3TBlP0QVIczQ==} engines: {node: '>=18'} peerDependencies: @@ -1360,51 +1392,49 @@ packages: nestjs-cls: ^4.4.1 prisma: '> 4 < 6' dependencies: - '@nestjs-cls/transactional': 2.2.0(@nestjs/common@10.0.0)(@nestjs/core@10.0.0)(nestjs-cls@4.2.0)(reflect-metadata@0.1.13)(rxjs@7.8.1) - '@prisma/client': 5.18.0(prisma@5.18.0) - nestjs-cls: 4.2.0(@nestjs/common@10.0.0)(@nestjs/core@10.0.0)(reflect-metadata@0.1.13)(rxjs@7.8.1) - prisma: 5.18.0 + '@nestjs-cls/transactional': 2.4.2(@nestjs/common@10.4.4)(@nestjs/core@10.4.4)(nestjs-cls@4.4.1)(reflect-metadata@0.2.2)(rxjs@7.8.1) + '@prisma/client': 5.20.0(prisma@5.20.0) + nestjs-cls: 4.4.1(@nestjs/common@10.4.4)(@nestjs/core@10.4.4)(reflect-metadata@0.2.2)(rxjs@7.8.1) + prisma: 5.20.0 dev: false - /@nestjs-cls/transactional@2.2.0(@nestjs/common@10.0.0)(@nestjs/core@10.0.0)(nestjs-cls@4.2.0)(reflect-metadata@0.1.13)(rxjs@7.8.1): - resolution: {integrity: sha512-O3wWCiVjeOPLGPs/sPcAUhSe/xaNx8JuzBtGg4IqnVrZfbjDzeADtlHIO8YkYhHYAVbqvVtGFbfFjL5tDUGWsA==} + /@nestjs-cls/transactional@2.4.2(@nestjs/common@10.4.4)(@nestjs/core@10.4.4)(nestjs-cls@4.4.1)(reflect-metadata@0.2.2)(rxjs@7.8.1): + resolution: {integrity: sha512-bQZ4Xo5BOPnmKcBk/Qsh/VX8kHr+fKTfJ6Fcxu/RGmxzSwjRVgShNu0E57V8CZkZJ6YuIKJoDQHAoIbeRIffbQ==} engines: {node: '>=16'} peerDependencies: '@nestjs/common': '> 7.0.0 < 11' '@nestjs/core': '> 7.0.0 < 11' - nestjs-cls: ^4.2.0 + nestjs-cls: ^4.4.1 reflect-metadata: '*' rxjs: '>= 7' dependencies: - '@nestjs/common': 10.0.0(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.1.13)(rxjs@7.8.1) - '@nestjs/core': 10.0.0(@nestjs/common@10.0.0)(reflect-metadata@0.1.13)(rxjs@7.8.1) - nestjs-cls: 4.2.0(@nestjs/common@10.0.0)(@nestjs/core@10.0.0)(reflect-metadata@0.1.13)(rxjs@7.8.1) - reflect-metadata: 0.1.13 + '@nestjs/common': 10.4.4(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.2)(rxjs@7.8.1) + '@nestjs/core': 10.4.4(@nestjs/common@10.4.4)(reflect-metadata@0.2.2)(rxjs@7.8.1) + nestjs-cls: 4.4.1(@nestjs/common@10.4.4)(@nestjs/core@10.4.4)(reflect-metadata@0.2.2)(rxjs@7.8.1) + reflect-metadata: 0.2.2 rxjs: 7.8.1 dev: false - /@nestjs/cache-manager@2.2.0(@nestjs/common@10.0.0)(@nestjs/core@10.0.0)(cache-manager@5.4.0)(reflect-metadata@0.1.13)(rxjs@7.8.1): - resolution: {integrity: sha512-hAcX1f5moiK7B8KnPZVfV/up4nrZnaeN6w0o3M+UzNJNlw6bsIH6bn7jpGqzySAWPD9iYE/rg5IxTe1vSWyWZg==} + /@nestjs/cache-manager@2.2.2(@nestjs/common@10.4.4)(@nestjs/core@10.4.4)(cache-manager@5.4.0)(rxjs@7.8.1): + resolution: {integrity: sha512-+n7rpU1QABeW2WV17Dl1vZCG3vWjJU1MaamWgZvbGxYE9EeCM0lVLfw3z7acgDTNwOy+K68xuQPoIMxD0bhjlA==} peerDependencies: '@nestjs/common': ^9.0.0 || ^10.0.0 '@nestjs/core': ^9.0.0 || ^10.0.0 cache-manager: <=5 - reflect-metadata: ^0.1.12 rxjs: ^7.0.0 dependencies: - '@nestjs/common': 10.0.0(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.1.13)(rxjs@7.8.1) - '@nestjs/core': 10.0.0(@nestjs/common@10.0.0)(reflect-metadata@0.1.13)(rxjs@7.8.1) + '@nestjs/common': 10.4.4(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.2)(rxjs@7.8.1) + '@nestjs/core': 10.4.4(@nestjs/common@10.4.4)(reflect-metadata@0.2.2)(rxjs@7.8.1) cache-manager: 5.4.0 - reflect-metadata: 0.1.13 rxjs: 7.8.1 dev: false - /@nestjs/cli@10.0.0: - resolution: {integrity: sha512-14pju3ejAAUpFe1iK99v/b7Bw96phBMV58GXTSm3TcdgaI4O7UTLXTbMiUNyU+LGr/1CPIfThcWqFyKhDIC9VQ==} - engines: {node: '>= 16'} + /@nestjs/cli@10.4.5: + resolution: {integrity: sha512-FP7Rh13u8aJbHe+zZ7hM0CC4785g9Pw4lz4r2TTgRtf0zTxSWMkJaPEwyjX8SK9oWK2GsYxl+fKpwVZNbmnj9A==} + engines: {node: '>= 16.14'} hasBin: true peerDependencies: - '@swc/cli': ^0.1.62 + '@swc/cli': ^0.1.62 || ^0.3.0 || ^0.4.0 '@swc/core': ^1.3.62 peerDependenciesMeta: '@swc/cli': @@ -1412,27 +1442,24 @@ packages: '@swc/core': optional: true dependencies: - '@angular-devkit/core': 16.1.0(chokidar@3.5.3) - '@angular-devkit/schematics': 16.1.0(chokidar@3.5.3) - '@angular-devkit/schematics-cli': 16.1.0(chokidar@3.5.3) - '@nestjs/schematics': 10.0.0(chokidar@3.5.3)(typescript@5.1.3) + '@angular-devkit/core': 17.3.8(chokidar@3.6.0) + '@angular-devkit/schematics': 17.3.8(chokidar@3.6.0) + '@angular-devkit/schematics-cli': 17.3.8(chokidar@3.6.0) + '@nestjs/schematics': 10.1.4(chokidar@3.6.0)(typescript@5.3.3) chalk: 4.1.2 - chokidar: 3.5.3 - cli-table3: 0.6.3 + chokidar: 3.6.0 + cli-table3: 0.6.5 commander: 4.1.1 - fork-ts-checker-webpack-plugin: 8.0.0(typescript@5.1.3)(webpack@5.87.0) - inquirer: 8.2.5 + fork-ts-checker-webpack-plugin: 9.0.2(typescript@5.3.3)(webpack@5.94.0) + glob: 10.4.2 + inquirer: 8.2.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: 5.1.3 - webpack: 5.87.0 + tsconfig-paths-webpack-plugin: 4.1.0 + typescript: 5.3.3 + webpack: 5.94.0 webpack-node-externals: 3.0.0 transitivePeerDependencies: - esbuild @@ -1440,12 +1467,12 @@ packages: - webpack-cli dev: true - /@nestjs/common@10.0.0(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.1.13)(rxjs@7.8.1): - resolution: {integrity: sha512-Fa2GDQJrO5TTTcpISWfm0pdPS62V+8YbxeG5CA01zMUI+dCO3v3oFf+BSjqCGUUo7GDNzDsjAejwGXuqA54RPw==} + /@nestjs/common@10.4.4(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.2)(rxjs@7.8.1): + resolution: {integrity: sha512-0j2/zqRw9nvHV1GKTktER8B/hIC/Z8CYFjN/ZqUuvwayCH+jZZBhCR2oRyuvLTXdnlSmtCAg2xvQ0ULqQvzqhA==} peerDependencies: class-transformer: '*' class-validator: '*' - reflect-metadata: ^0.1.12 + reflect-metadata: ^0.1.12 || ^0.2.0 rxjs: ^7.1.0 peerDependenciesMeta: class-transformer: @@ -1456,12 +1483,12 @@ packages: class-transformer: 0.5.1 class-validator: 0.14.1 iterare: 1.2.1 - reflect-metadata: 0.1.13 + reflect-metadata: 0.2.2 rxjs: 7.8.1 - tslib: 2.5.3 + tslib: 2.7.0 uid: 2.0.2 - /@nestjs/common@9.4.0(cache-manager@5.4.0)(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.1.13)(rxjs@7.8.1): + /@nestjs/common@9.4.0(cache-manager@5.4.0)(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.2)(rxjs@7.8.1): resolution: {integrity: sha512-RUcVAQsEF4WPrmzFXEOUfZnPwrLTe1UVlzXTlSyfqfqbdWDPKDGlIPVelBLfc5/+RRUQ0I5iE4+CQvpCmkqldw==} peerDependencies: cache-manager: <=5 @@ -1481,35 +1508,34 @@ packages: class-transformer: 0.5.1 class-validator: 0.14.1 iterare: 1.2.1 - reflect-metadata: 0.1.13 + reflect-metadata: 0.2.2 rxjs: 7.8.1 tslib: 2.5.0 uid: 2.0.2 dev: false - /@nestjs/config@3.1.1(@nestjs/common@10.0.0)(reflect-metadata@0.1.13): - resolution: {integrity: sha512-qu5QlNiJdqQtOsnB6lx4JCXPQ96jkKUsOGd+JXfXwqJqZcOSAq6heNFg0opW4pq4J/VZoNwoo87TNnx9wthnqQ==} + /@nestjs/config@3.2.3(@nestjs/common@10.4.4)(rxjs@7.8.1): + resolution: {integrity: sha512-p6yv/CvoBewJ72mBq4NXgOAi2rSQNWx3a+IMJLVKS2uiwFCOQQuiIatGwq6MRjXV3Jr+B41iUO8FIf4xBrZ4/w==} peerDependencies: '@nestjs/common': ^8.0.0 || ^9.0.0 || ^10.0.0 - reflect-metadata: ^0.1.13 + rxjs: ^7.1.0 dependencies: - '@nestjs/common': 10.0.0(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.1.13)(rxjs@7.8.1) - dotenv: 16.3.1 + '@nestjs/common': 10.4.4(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.2)(rxjs@7.8.1) + dotenv: 16.4.5 dotenv-expand: 10.0.0 lodash: 4.17.21 - reflect-metadata: 0.1.13 - uuid: 9.0.0 + rxjs: 7.8.1 dev: false - /@nestjs/core@10.0.0(@nestjs/common@10.0.0)(reflect-metadata@0.1.13)(rxjs@7.8.1): - resolution: {integrity: sha512-HFTdj4vsF+2qOaq97ZPRDle6Q/KyL5lmMah0/ZR0ie+e1/tnlvmlqw589xFACTemLJFFOjZMy763v+icO9u72w==} + /@nestjs/core@10.4.4(@nestjs/common@10.4.4)(reflect-metadata@0.2.2)(rxjs@7.8.1): + resolution: {integrity: sha512-y9tjmAzU6LTh1cC/lWrRsCcOd80khSR0qAHAqwY2svbW+AhsR/XCzgpZrAAKJrm/dDfjLCZKyxJSayeirGcW5Q==} requiresBuild: true peerDependencies: '@nestjs/common': ^10.0.0 '@nestjs/microservices': ^10.0.0 '@nestjs/platform-express': ^10.0.0 '@nestjs/websockets': ^10.0.0 - reflect-metadata: ^0.1.12 + reflect-metadata: ^0.1.12 || ^0.2.0 rxjs: ^7.1.0 peerDependenciesMeta: '@nestjs/microservices': @@ -1519,42 +1545,40 @@ packages: '@nestjs/websockets': optional: true dependencies: - '@nestjs/common': 10.0.0(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.1.13)(rxjs@7.8.1) + '@nestjs/common': 10.4.4(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.2)(rxjs@7.8.1) '@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.13 + path-to-regexp: 3.3.0 + reflect-metadata: 0.2.2 rxjs: 7.8.1 - tslib: 2.5.3 + tslib: 2.7.0 uid: 2.0.2 transitivePeerDependencies: - encoding - /@nestjs/event-emitter@2.0.3(@nestjs/common@10.0.0)(@nestjs/core@10.0.0)(reflect-metadata@0.1.13): - resolution: {integrity: sha512-Pt7KAERrgK0OjvarSI3wfVhwZ8X1iLq1lXuodyRe+Zx3aLLP7fraFUHirASbFkB6KIQ1Zj+gZ1g8a9eu4GfFhw==} + /@nestjs/event-emitter@2.0.4(@nestjs/common@10.4.4)(@nestjs/core@10.4.4): + resolution: {integrity: sha512-quMiw8yOwoSul0pp3mOonGz8EyXWHSBTqBy8B0TbYYgpnG1Ix2wGUnuTksLWaaBiiOTDhciaZ41Y5fJZsSJE1Q==} peerDependencies: '@nestjs/common': ^8.0.0 || ^9.0.0 || ^10.0.0 '@nestjs/core': ^8.0.0 || ^9.0.0 || ^10.0.0 - reflect-metadata: ^0.1.12 dependencies: - '@nestjs/common': 10.0.0(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.1.13)(rxjs@7.8.1) - '@nestjs/core': 10.0.0(@nestjs/common@10.0.0)(reflect-metadata@0.1.13)(rxjs@7.8.1) + '@nestjs/common': 10.4.4(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.2)(rxjs@7.8.1) + '@nestjs/core': 10.4.4(@nestjs/common@10.4.4)(reflect-metadata@0.2.2)(rxjs@7.8.1) eventemitter2: 6.4.9 - reflect-metadata: 0.1.13 dev: false - /@nestjs/jwt@10.2.0(@nestjs/common@10.0.0): + /@nestjs/jwt@10.2.0(@nestjs/common@10.4.4): resolution: {integrity: sha512-x8cG90SURkEiLOehNaN2aRlotxT0KZESUliOPKKnjWiyJOcWurkF3w345WOX0P4MgFzUjGoZ1Sy0aZnxeihT0g==} peerDependencies: '@nestjs/common': ^8.0.0 || ^9.0.0 || ^10.0.0 dependencies: - '@nestjs/common': 10.0.0(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.1.13)(rxjs@7.8.1) + '@nestjs/common': 10.4.4(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.2)(rxjs@7.8.1) '@types/jsonwebtoken': 9.0.5 jsonwebtoken: 9.0.2 dev: false - /@nestjs/mapped-types@2.0.5(@nestjs/common@10.0.0)(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.1.13): + /@nestjs/mapped-types@2.0.5(@nestjs/common@10.4.4)(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.2): resolution: {integrity: sha512-bSJv4pd6EY99NX9CjBIyn4TVDoSit82DUZlL4I3bqNfy5Gt+gXTa86i3I/i0iIV9P4hntcGM5GyO+FhZAhxtyg==} peerDependencies: '@nestjs/common': ^8.0.0 || ^9.0.0 || ^10.0.0 @@ -1567,23 +1591,23 @@ packages: class-validator: optional: true dependencies: - '@nestjs/common': 10.0.0(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.1.13)(rxjs@7.8.1) + '@nestjs/common': 10.4.4(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.2)(rxjs@7.8.1) class-transformer: 0.5.1 class-validator: 0.14.1 - reflect-metadata: 0.1.13 + reflect-metadata: 0.2.2 dev: false - /@nestjs/passport@10.0.3(@nestjs/common@10.0.0)(passport@0.7.0): + /@nestjs/passport@10.0.3(@nestjs/common@10.4.4)(passport@0.7.0): resolution: {integrity: sha512-znJ9Y4S8ZDVY+j4doWAJ8EuuVO7SkQN3yOBmzxbGaXbvcSwFDAdGJ+OMCg52NdzIO4tQoN4pYKx8W6M0ArfFRQ==} peerDependencies: '@nestjs/common': ^8.0.0 || ^9.0.0 || ^10.0.0 passport: ^0.4.0 || ^0.5.0 || ^0.6.0 || ^0.7.0 dependencies: - '@nestjs/common': 10.0.0(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.1.13)(rxjs@7.8.1) + '@nestjs/common': 10.4.4(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.2)(rxjs@7.8.1) passport: 0.7.0 dev: false - /@nestjs/platform-fastify@10.3.4(@fastify/static@6.12.0)(@nestjs/common@10.0.0)(@nestjs/core@10.0.0): + /@nestjs/platform-fastify@10.3.4(@fastify/static@7.0.4)(@nestjs/common@10.4.4)(@nestjs/core@10.4.4): resolution: {integrity: sha512-rYoAdJ1ybBXPwO+KutWJ4siaqGDdMzwXS4ggJ5soQgD4maN2p1rvKE31MzERd1MqYXWprFIESFHuxkiHMZV6kg==} peerDependencies: '@fastify/static': ^6.0.0 || ^7.0.0 @@ -1599,9 +1623,9 @@ packages: '@fastify/cors': 9.0.1 '@fastify/formbody': 7.4.0 '@fastify/middie': 8.3.0 - '@fastify/static': 6.12.0 - '@nestjs/common': 10.0.0(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.1.13)(rxjs@7.8.1) - '@nestjs/core': 10.0.0(@nestjs/common@10.0.0)(reflect-metadata@0.1.13)(rxjs@7.8.1) + '@fastify/static': 7.0.4 + '@nestjs/common': 10.4.4(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.2)(rxjs@7.8.1) + '@nestjs/core': 10.4.4(@nestjs/common@10.4.4)(reflect-metadata@0.2.2)(rxjs@7.8.1) fastify: 4.26.2 light-my-request: 5.12.0 path-to-regexp: 3.2.0 @@ -1610,23 +1634,23 @@ packages: - supports-color dev: false - /@nestjs/schematics@10.0.0(chokidar@3.5.3)(typescript@5.1.3): - resolution: {integrity: sha512-gfUy/N1m1paN33BXq4d7HoCM+zM4rFxYjqAb8jkrBfBHiwyEhHHozfX/aRy/kOnAcy/VP8v4Zs4HKKrbRRlHnw==} + /@nestjs/schematics@10.1.4(chokidar@3.6.0)(typescript@5.3.3): + resolution: {integrity: sha512-QpY8ez9cTvXXPr3/KBrtSgXQHMSV6BkOUYy2c2TTe6cBqriEdGnCYqGl8cnfrQl3632q3lveQPaZ/c127dHsEw==} peerDependencies: typescript: '>=4.8.2' dependencies: - '@angular-devkit/core': 16.1.0(chokidar@3.5.3) - '@angular-devkit/schematics': 16.1.0(chokidar@3.5.3) + '@angular-devkit/core': 17.3.8(chokidar@3.6.0) + '@angular-devkit/schematics': 17.3.8(chokidar@3.6.0) comment-json: 4.2.3 - jsonc-parser: 3.2.0 + jsonc-parser: 3.3.1 pluralize: 8.0.0 - typescript: 5.1.3 + typescript: 5.3.3 transitivePeerDependencies: - chokidar dev: true - /@nestjs/swagger@7.3.0(@fastify/static@6.12.0)(@nestjs/common@10.0.0)(@nestjs/core@10.0.0)(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.1.13): - resolution: {integrity: sha512-zLkfKZ+ioYsIZ3dfv7Bj8YHnZMNAGWFUmx2ZDuLp/fBE4P8BSjB7hldzDueFXsmwaPL90v7lgyd82P+s7KME1Q==} + /@nestjs/swagger@7.4.2(@fastify/static@7.0.4)(@nestjs/common@10.4.4)(@nestjs/core@10.4.4)(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.2): + resolution: {integrity: sha512-Mu6TEn1M/owIvAx2B4DUQObQXqo2028R2s9rSZ/hJEgBK95+doTwS0DjmVA2wTeZTyVtXOoN7CsoM5pONBzvKQ==} peerDependencies: '@fastify/static': ^6.0.0 || ^7.0.0 '@nestjs/common': ^9.0.0 || ^10.0.0 @@ -1642,22 +1666,22 @@ packages: class-validator: optional: true dependencies: - '@fastify/static': 6.12.0 - '@microsoft/tsdoc': 0.14.2 - '@nestjs/common': 10.0.0(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.1.13)(rxjs@7.8.1) - '@nestjs/core': 10.0.0(@nestjs/common@10.0.0)(reflect-metadata@0.1.13)(rxjs@7.8.1) - '@nestjs/mapped-types': 2.0.5(@nestjs/common@10.0.0)(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.1.13) + '@fastify/static': 7.0.4 + '@microsoft/tsdoc': 0.15.0 + '@nestjs/common': 10.4.4(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.2)(rxjs@7.8.1) + '@nestjs/core': 10.4.4(@nestjs/common@10.4.4)(reflect-metadata@0.2.2)(rxjs@7.8.1) + '@nestjs/mapped-types': 2.0.5(@nestjs/common@10.4.4)(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.2) class-transformer: 0.5.1 class-validator: 0.14.1 js-yaml: 4.1.0 lodash: 4.17.21 - path-to-regexp: 3.2.0 - reflect-metadata: 0.1.13 - swagger-ui-dist: 5.11.2 + path-to-regexp: 3.3.0 + reflect-metadata: 0.2.2 + swagger-ui-dist: 5.17.14 dev: false - /@nestjs/testing@10.0.0(@nestjs/common@10.0.0)(@nestjs/core@10.0.0): - resolution: {integrity: sha512-U5q3+svkddpdSk51ZFCEnFpQuWxAwE4ahsX77FrqqCAYidr7HUtL/BHYOVzI5H9vUH6BvJxMbfo3tiUXQl/2aA==} + /@nestjs/testing@10.4.4(@nestjs/common@10.4.4)(@nestjs/core@10.4.4): + resolution: {integrity: sha512-qRGFj51A5RM7JqA8pcyEwSLA3Y0dle/PAZ8oxP0suimoCusRY3Tk7wYqutZdCNj1ATb678SDaUZDHk2pwSv9/g==} peerDependencies: '@nestjs/common': ^10.0.0 '@nestjs/core': ^10.0.0 @@ -1669,12 +1693,12 @@ packages: '@nestjs/platform-express': optional: true dependencies: - '@nestjs/common': 10.0.0(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.1.13)(rxjs@7.8.1) - '@nestjs/core': 10.0.0(@nestjs/common@10.0.0)(reflect-metadata@0.1.13)(rxjs@7.8.1) - tslib: 2.5.3 + '@nestjs/common': 10.4.4(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.2)(rxjs@7.8.1) + '@nestjs/core': 10.4.4(@nestjs/common@10.4.4)(reflect-metadata@0.2.2)(rxjs@7.8.1) + tslib: 2.7.0 dev: true - /@nestjs/testing@9.4.0(@nestjs/common@9.4.0)(@nestjs/core@10.0.0): + /@nestjs/testing@9.4.0(@nestjs/common@9.4.0)(@nestjs/core@10.4.4): resolution: {integrity: sha512-xZWp363P4otcebg++gSjUcdCfTK0RorORzyFq3aLaSAQOlq8kxfFDRIKzEATR4aOUfqTMMsAA8lhnMJWf35N6A==} peerDependencies: '@nestjs/common': ^9.0.0 @@ -1687,8 +1711,8 @@ packages: '@nestjs/platform-express': optional: true dependencies: - '@nestjs/common': 9.4.0(cache-manager@5.4.0)(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.1.13)(rxjs@7.8.1) - '@nestjs/core': 10.0.0(@nestjs/common@10.0.0)(reflect-metadata@0.1.13)(rxjs@7.8.1) + '@nestjs/common': 9.4.0(cache-manager@5.4.0)(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.2)(rxjs@7.8.1) + '@nestjs/core': 10.4.4(@nestjs/common@10.4.4)(reflect-metadata@0.2.2)(rxjs@7.8.1) tslib: 2.5.0 dev: false @@ -1713,12 +1737,12 @@ packages: fastq: 1.17.1 dev: true - /@nodeteam/nestjs-prisma-pagination@1.0.6(@babel/core@7.23.9)(@nestjs/core@10.0.0)(@types/node@20.3.1)(cache-manager@5.4.0)(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.1.13)(rxjs@7.8.1)(ts-node@10.9.1): + /@nodeteam/nestjs-prisma-pagination@1.0.6(@babel/core@7.23.9)(@nestjs/core@10.4.4)(@types/node@22.7.5)(cache-manager@5.4.0)(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.2)(rxjs@7.8.1)(ts-node@10.9.2): resolution: {integrity: sha512-ZTTXIlbnphmtBt4xFlFfV7an5e2EvmC/P4nj7s0nbSgq8bYovjMAbGxlmBh/shxfVaQeYCl78SoSnYWOjIQMCA==} dependencies: - '@nestjs/common': 9.4.0(cache-manager@5.4.0)(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.1.13)(rxjs@7.8.1) - '@nestjs/testing': 9.4.0(@nestjs/common@9.4.0)(@nestjs/core@10.0.0) - jest: 29.5.0(@types/node@20.3.1)(ts-node@10.9.1) + '@nestjs/common': 9.4.0(cache-manager@5.4.0)(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.2)(rxjs@7.8.1) + '@nestjs/testing': 9.4.0(@nestjs/common@9.4.0)(@nestjs/core@10.4.4) + jest: 29.5.0(@types/node@22.7.5)(ts-node@10.9.2) ts-jest: 29.1.0(@babel/core@7.23.9)(jest@29.5.0)(typescript@5.0.4) typescript: 5.0.4 transitivePeerDependencies: @@ -1741,23 +1765,6 @@ packages: - ts-node dev: false - /@npmcli/fs@2.1.2: - resolution: {integrity: sha512-yOJKRvohFOaLqipNtwYB9WugyZKhC/DZC4VYPmpaCzDBrA8YpK3qHZ8/HGscMnE4GqbkLNuVcCnxkeQEdGt6LQ==} - engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} - dependencies: - '@gar/promisify': 1.1.3 - semver: 7.6.0 - dev: false - - /@npmcli/move-file@2.0.1: - resolution: {integrity: sha512-mJd2Z5TjYWq/ttPLLGqArdtnC74J6bOzg4rMDnN+p1xTacZ2yPRCk2y0oSWQtygLR9YVQXgOcONrwtnk3JupxQ==} - engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} - deprecated: This functionality has been moved to @npmcli/fs - dependencies: - mkdirp: 1.0.4 - rimraf: 3.0.2 - dev: false - /@nuxtjs/opencollective@0.3.2: resolution: {integrity: sha512-um0xL3fO7Mf4fDxcqx9KryrB7zgRM5JSlvGN5AGkP6JLM5XEKyjeAiPbNxdXVXQ16isuAhYpvP88NgL2BGd6aA==} engines: {node: '>=8.0.0', npm: '>=5.0.0'} @@ -1777,7 +1784,6 @@ packages: resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} engines: {node: '>=14'} requiresBuild: true - dev: false optional: true /@pkgr/core@0.1.1: @@ -1807,8 +1813,8 @@ packages: - supports-color dev: true - /@prisma/client@5.18.0(prisma@5.18.0): - resolution: {integrity: sha512-BWivkLh+af1kqC89zCJYkHsRcyWsM8/JHpsDMM76DjP3ZdEquJhXa4IeX+HkWPnwJ5FanxEJFZZDTWiDs/Kvyw==} + /@prisma/client@5.20.0(prisma@5.20.0): + resolution: {integrity: sha512-CLv55ZuMuUawMsxoqxGtLT3bEZoa2W8L3Qnp6rDIFWy+ZBrUcOFKdoeGPSnbBqxc3SkdxJrF+D1veN/WNynZYA==} engines: {node: '>=16.13'} requiresBuild: true peerDependencies: @@ -1817,7 +1823,7 @@ packages: prisma: optional: true dependencies: - prisma: 5.18.0 + prisma: 5.20.0 /@prisma/debug@4.16.2: resolution: {integrity: sha512-7L7WbG0qNNZYgLpsVB8rCHCXEyHFyIycRlRDNwkVfjQmACC2OW6AWCYCbfdjQhkF/t7+S3njj8wAWAocSs+Brw==} @@ -1829,27 +1835,27 @@ packages: - supports-color dev: true - /@prisma/debug@5.18.0: - resolution: {integrity: sha512-f+ZvpTLidSo3LMJxQPVgAxdAjzv5OpzAo/eF8qZqbwvgi2F5cTOI9XCpdRzJYA0iGfajjwjOKKrVq64vkxEfUw==} + /@prisma/debug@5.20.0: + resolution: {integrity: sha512-oCx79MJ4HSujokA8S1g0xgZUGybD4SyIOydoHMngFYiwEwYDQ5tBQkK5XoEHuwOYDKUOKRn/J0MEymckc4IgsQ==} - /@prisma/engines-version@5.18.0-25.4c784e32044a8a016d99474bd02a3b6123742169: - resolution: {integrity: sha512-a/+LpJj8vYU3nmtkg+N3X51ddbt35yYrRe8wqHTJtYQt7l1f8kjIBcCs6sHJvodW/EK5XGvboOiwm47fmNrbgg==} + /@prisma/engines-version@5.20.0-12.06fc58a368dc7be9fbbbe894adf8d445d208c284: + resolution: {integrity: sha512-Lg8AS5lpi0auZe2Mn4gjuCg081UZf88k3cn0RCwHgR+6cyHHpttPZBElJTHf83ZGsRNAmVCZCfUGA57WB4u4JA==} - /@prisma/engines@5.18.0: - resolution: {integrity: sha512-ofmpGLeJ2q2P0wa/XaEgTnX/IsLnvSp/gZts0zjgLNdBhfuj2lowOOPmDcfKljLQUXMvAek3lw5T01kHmCG8rg==} + /@prisma/engines@5.20.0: + resolution: {integrity: sha512-DtqkP+hcZvPEbj8t8dK5df2b7d3B8GNauKqaddRRqQBBlgkbdhJkxhoJTrOowlS3vaRt2iMCkU0+CSNn0KhqAQ==} requiresBuild: true dependencies: - '@prisma/debug': 5.18.0 - '@prisma/engines-version': 5.18.0-25.4c784e32044a8a016d99474bd02a3b6123742169 - '@prisma/fetch-engine': 5.18.0 - '@prisma/get-platform': 5.18.0 + '@prisma/debug': 5.20.0 + '@prisma/engines-version': 5.20.0-12.06fc58a368dc7be9fbbbe894adf8d445d208c284 + '@prisma/fetch-engine': 5.20.0 + '@prisma/get-platform': 5.20.0 - /@prisma/fetch-engine@5.18.0: - resolution: {integrity: sha512-I/3u0x2n31rGaAuBRx2YK4eB7R/1zCuayo2DGwSpGyrJWsZesrV7QVw7ND0/Suxeo/vLkJ5OwuBqHoCxvTHpOg==} + /@prisma/fetch-engine@5.20.0: + resolution: {integrity: sha512-JVcaPXC940wOGpCOwuqQRTz6I9SaBK0c1BAyC1pcz9xBi+dzFgUu3G/p9GV1FhFs9OKpfSpIhQfUJE9y00zhqw==} dependencies: - '@prisma/debug': 5.18.0 - '@prisma/engines-version': 5.18.0-25.4c784e32044a8a016d99474bd02a3b6123742169 - '@prisma/get-platform': 5.18.0 + '@prisma/debug': 5.20.0 + '@prisma/engines-version': 5.20.0-12.06fc58a368dc7be9fbbbe894adf8d445d208c284 + '@prisma/get-platform': 5.20.0 /@prisma/generator-helper@4.16.2: resolution: {integrity: sha512-bMOH7y73Ui7gpQrioFeavMQA+Tf8ksaVf8Nhs9rQNzuSg8SSV6E9baczob0L5KGZTSgYoqnrRxuo03kVJYrnIg==} @@ -1862,10 +1868,10 @@ packages: - supports-color dev: true - /@prisma/get-platform@5.18.0: - resolution: {integrity: sha512-Tk+m7+uhqcKDgnMnFN0lRiH7Ewea0OEsZZs9pqXa7i3+7svS3FSCqDBCaM9x5fmhhkufiG0BtunJVDka+46DlA==} + /@prisma/get-platform@5.20.0: + resolution: {integrity: sha512-8/+CehTZZNzJlvuryRgc77hZCWrUDYd/PmlZ7p2yNXtmf2Una4BWnTbak3us6WVdqoz5wmptk6IhsXdG2v5fmA==} dependencies: - '@prisma/debug': 5.18.0 + '@prisma/debug': 5.20.0 /@schematics/angular@13.3.11: resolution: {integrity: sha512-imKBnKYEse0SBVELZO/753nkpt3eEgpjrYkB+AFWF9YfO/4RGnYXDHoH8CFkzxPH9QQCgNrmsVFNiYGS+P/S1A==} @@ -1891,11 +1897,6 @@ packages: dependencies: '@sinonjs/commons': 3.0.1 - /@tootallnate/once@2.0.0: - resolution: {integrity: sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==} - engines: {node: '>= 10'} - dev: false - /@tsconfig/node10@1.0.9: resolution: {integrity: sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==} @@ -1936,26 +1937,26 @@ packages: /@types/bcrypt@5.0.2: resolution: {integrity: sha512-6atioO8Y75fNcbmj0G7UjI9lXN2pQ/IGJ2FWT4a/btd0Lk9lQalHLKhkgKVZ3r+spnmWUKfbMi1GEe9wyHQfNQ==} dependencies: - '@types/node': 20.3.1 + '@types/node': 22.7.5 dev: true /@types/body-parser@1.19.5: resolution: {integrity: sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==} dependencies: '@types/connect': 3.4.38 - '@types/node': 20.3.1 + '@types/node': 22.7.5 dev: true /@types/connect@3.4.38: resolution: {integrity: sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==} dependencies: - '@types/node': 20.3.1 + '@types/node': 22.7.5 dev: true /@types/conventional-commits-parser@5.0.0: resolution: {integrity: sha512-loB369iXNmAZglwWATL+WRe+CRMmmBPtpolYzIebFaX4YA3x+BEfLqhUAV9WanycKI3TG1IMr5bMJDajDKLlUQ==} dependencies: - '@types/node': 20.3.1 + '@types/node': 22.7.5 dev: true /@types/cookiejar@2.1.5: @@ -1965,7 +1966,7 @@ packages: /@types/cross-spawn@6.0.2: resolution: {integrity: sha512-KuwNhp3eza+Rhu8IFI5HUXRP0LIhqH5cAjubUvGXXthh4YYBuP2ntwEX+Cz8GJoZUHlKo247wPWOfA9LYEq4cw==} dependencies: - '@types/node': 20.3.1 + '@types/node': 22.7.5 dev: true /@types/debug@4.1.8: @@ -1978,28 +1979,14 @@ packages: resolution: {integrity: sha512-RhMcnI18Y+401Nceh2pW5gTGgsdfZdvg9g0P/5HIBJ0jmZEv5KlkYvfQiHhw4/Vnb8NdePi/4UCs92ITExLxuQ==} dev: true - /@types/eslint-scope@3.7.7: - resolution: {integrity: sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==} - dependencies: - '@types/eslint': 8.56.2 - '@types/estree': 1.0.5 - dev: true - - /@types/eslint@8.56.2: - resolution: {integrity: sha512-uQDwm1wFHmbBbCZCqAlq6Do9LYwByNZHWzXppSnay9SuwJ+VRbjkbLABer54kcPnMSlG6Fdiy2yaFXm/z9Z5gw==} - dependencies: - '@types/estree': 1.0.5 - '@types/json-schema': 7.0.15 - dev: true - - /@types/estree@1.0.5: - resolution: {integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==} + /@types/estree@1.0.6: + resolution: {integrity: sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==} dev: true /@types/express-serve-static-core@4.17.43: resolution: {integrity: sha512-oaYtiBirUOPQGSWNGPWnzyAFJ0BP3cwvN4oWZQY+zUBwpVIGsKUkpBpSztp74drYcjavs7SKFZ4DX1V2QeN8rg==} dependencies: - '@types/node': 20.3.1 + '@types/node': 22.7.5 '@types/qs': 6.9.11 '@types/range-parser': 1.2.7 '@types/send': 0.17.4 @@ -2017,7 +2004,7 @@ packages: /@types/graceful-fs@4.1.9: resolution: {integrity: sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==} dependencies: - '@types/node': 20.3.1 + '@types/node': 22.7.5 /@types/http-errors@2.0.4: resolution: {integrity: sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA==} @@ -2036,8 +2023,8 @@ packages: dependencies: '@types/istanbul-lib-report': 3.0.3 - /@types/jest@29.5.2: - resolution: {integrity: sha512-mSoZVJF5YzGVCk+FsDxzDuH7s+SCkzrgKZzf0Z0T2WudhBUPoF6ktoTPC4R0ZoCPCV5xUvuU6ias5NvxcBcMMg==} + /@types/jest@29.5.13: + resolution: {integrity: sha512-wd+MVEZCHt23V0/L642O5APvspWply/rGY5BcW4SUETo2UzPU3Z26qr8jC2qxpimI2jjx9h7+2cj2FwIr01bXg==} dependencies: expect: 29.7.0 pretty-format: 29.7.0 @@ -2049,7 +2036,7 @@ packages: /@types/jsonwebtoken@9.0.5: resolution: {integrity: sha512-VRLSGzik+Unrup6BsouBeHsf4d1hOEgYWTm/7Nmw1sXoN1+tRly/Gy/po3yeahnP4jfnQWWAhQAqcNfH7ngOkA==} dependencies: - '@types/node': 20.3.1 + '@types/node': 22.7.5 /@types/methods@1.1.4: resolution: {integrity: sha512-ymXWVrDiCxTBE3+RIrrP533E70eA+9qu7zdWoHuOmGujkYtzf4HQF96b8nwHLqhuf4ykX61IGRIB38CC6/sImQ==} @@ -2071,17 +2058,15 @@ packages: resolution: {integrity: sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g==} dev: true - /@types/node@20.3.1: - resolution: {integrity: sha512-EhcH/wvidPy1WeML3TtYFGR83UzjxeWRen9V402T8aUGYsCHOmfoisV3ZSg03gAFIbLq8TnWOJ0f4cALtnSEUg==} + /@types/node@22.7.5: + resolution: {integrity: sha512-jML7s2NAzMWc//QSJ1a3prpk78cOPchGvXJsC3C6R6PSMoooztvRVQEz89gmBTBY1SPMaqo5teB4uNHPdetShQ==} + dependencies: + undici-types: 6.19.8 /@types/normalize-package-data@2.4.4: resolution: {integrity: sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==} dev: true - /@types/parse-json@4.0.2: - resolution: {integrity: sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==} - dev: true - /@types/passport-jwt@4.0.1: resolution: {integrity: sha512-Y0Ykz6nWP4jpxgEUYq8NoVZeCQPo1ZndJLfapI249g1jHChvRfZRO/LS3tqu26YgAS/laI1qx98sYGz0IalRXQ==} dependencies: @@ -2118,15 +2103,11 @@ packages: resolution: {integrity: sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==} dev: true - /@types/semver@7.5.6: - resolution: {integrity: sha512-dn1l8LaMea/IjDoHNd9J52uBbInB796CDffS6VdIxvqYCPSG0V0DzHp76GpaWnlhg88uYyPbXCDIowa86ybd5A==} - dev: true - /@types/send@0.17.4: resolution: {integrity: sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==} dependencies: '@types/mime': 1.3.5 - '@types/node': 20.3.1 + '@types/node': 22.7.5 dev: true /@types/serve-static@1.15.5: @@ -2134,7 +2115,7 @@ packages: dependencies: '@types/http-errors': 2.0.4 '@types/mime': 3.0.4 - '@types/node': 20.3.1 + '@types/node': 22.7.5 dev: true /@types/stack-utils@2.0.3: @@ -2145,13 +2126,12 @@ packages: dependencies: '@types/cookiejar': 2.1.5 '@types/methods': 1.1.4 - '@types/node': 20.3.1 + '@types/node': 22.7.5 dev: true - /@types/supertest@6.0.0: - resolution: {integrity: sha512-j3/Z2avY+H3yn+xp/ef//QyqqE+dg3rWh14Ewi/QZs6uVK+oOs7lFRXtjp2YHAqHJZ4OFGNmCxZO5vd7AuG/Dg==} + /@types/supertest@6.0.2: + resolution: {integrity: sha512-137ypx2lk/wTQbW6An6safu9hXmajAifU/s7szAHLN/FeIm5w7yR0Wkl9fdJMRSHwOn4HLAI0DaB2TOORuhPDg==} dependencies: - '@types/cookiejar': 2.1.5 '@types/methods': 1.1.4 '@types/superagent': 8.1.3 dev: true @@ -2167,142 +2147,134 @@ packages: dependencies: '@types/yargs-parser': 21.0.3 - /@typescript-eslint/eslint-plugin@6.0.0(@typescript-eslint/parser@6.0.0)(eslint@8.42.0)(typescript@5.1.3): - resolution: {integrity: sha512-xuv6ghKGoiq856Bww/yVYnXGsKa588kY3M0XK7uUW/3fJNNULKRfZfSBkMTSpqGG/8ZCXCadfh8G/z/B4aqS/A==} - engines: {node: ^16.0.0 || >=18.0.0} + /@typescript-eslint/eslint-plugin@8.8.1(@typescript-eslint/parser@8.8.1)(eslint@9.12.0)(typescript@5.6.3): + resolution: {integrity: sha512-xfvdgA8AP/vxHgtgU310+WBnLB4uJQ9XdyP17RebG26rLtDrQJV3ZYrcopX91GrHmMoH8bdSwMRh2a//TiJ1jQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - '@typescript-eslint/parser': ^6.0.0 || ^6.0.0-alpha - eslint: ^7.0.0 || ^8.0.0 + '@typescript-eslint/parser': ^8.0.0 || ^8.0.0-alpha.0 + eslint: ^8.57.0 || ^9.0.0 typescript: '*' peerDependenciesMeta: typescript: optional: true dependencies: '@eslint-community/regexpp': 4.10.0 - '@typescript-eslint/parser': 6.0.0(eslint@8.42.0)(typescript@5.1.3) - '@typescript-eslint/scope-manager': 6.0.0 - '@typescript-eslint/type-utils': 6.0.0(eslint@8.42.0)(typescript@5.1.3) - '@typescript-eslint/utils': 6.0.0(eslint@8.42.0)(typescript@5.1.3) - '@typescript-eslint/visitor-keys': 6.0.0 - debug: 4.3.4 - eslint: 8.42.0 - grapheme-splitter: 1.0.4 + '@typescript-eslint/parser': 8.8.1(eslint@9.12.0)(typescript@5.6.3) + '@typescript-eslint/scope-manager': 8.8.1 + '@typescript-eslint/type-utils': 8.8.1(eslint@9.12.0)(typescript@5.6.3) + '@typescript-eslint/utils': 8.8.1(eslint@9.12.0)(typescript@5.6.3) + '@typescript-eslint/visitor-keys': 8.8.1 + eslint: 9.12.0 graphemer: 1.4.0 ignore: 5.3.1 natural-compare: 1.4.0 - natural-compare-lite: 1.4.0 - semver: 7.6.0 - ts-api-utils: 1.2.1(typescript@5.1.3) - typescript: 5.1.3 + ts-api-utils: 1.3.0(typescript@5.6.3) + typescript: 5.6.3 transitivePeerDependencies: - supports-color dev: true - /@typescript-eslint/parser@6.0.0(eslint@8.42.0)(typescript@5.1.3): - resolution: {integrity: sha512-TNaufYSPrr1U8n+3xN+Yp9g31vQDJqhXzzPSHfQDLcaO4tU+mCfODPxCwf4H530zo7aUBE3QIdxCXamEnG04Tg==} - engines: {node: ^16.0.0 || >=18.0.0} + /@typescript-eslint/parser@8.8.1(eslint@9.12.0)(typescript@5.6.3): + resolution: {integrity: sha512-hQUVn2Lij2NAxVFEdvIGxT9gP1tq2yM83m+by3whWFsWC+1y8pxxxHUFE1UqDu2VsGi2i6RLcv4QvouM84U+ow==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - eslint: ^7.0.0 || ^8.0.0 + eslint: ^8.57.0 || ^9.0.0 typescript: '*' peerDependenciesMeta: typescript: optional: true dependencies: - '@typescript-eslint/scope-manager': 6.0.0 - '@typescript-eslint/types': 6.0.0 - '@typescript-eslint/typescript-estree': 6.0.0(typescript@5.1.3) - '@typescript-eslint/visitor-keys': 6.0.0 + '@typescript-eslint/scope-manager': 8.8.1 + '@typescript-eslint/types': 8.8.1 + '@typescript-eslint/typescript-estree': 8.8.1(typescript@5.6.3) + '@typescript-eslint/visitor-keys': 8.8.1 debug: 4.3.4 - eslint: 8.42.0 - typescript: 5.1.3 + eslint: 9.12.0 + typescript: 5.6.3 transitivePeerDependencies: - supports-color dev: true - /@typescript-eslint/scope-manager@6.0.0: - resolution: {integrity: sha512-o4q0KHlgCZTqjuaZ25nw5W57NeykZT9LiMEG4do/ovwvOcPnDO1BI5BQdCsUkjxFyrCL0cSzLjvIMfR9uo7cWg==} - engines: {node: ^16.0.0 || >=18.0.0} + /@typescript-eslint/scope-manager@8.8.1: + resolution: {integrity: sha512-X4JdU+66Mazev/J0gfXlcC/dV6JI37h+93W9BRYXrSn0hrE64IoWgVkO9MSJgEzoWkxONgaQpICWg8vAN74wlA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} dependencies: - '@typescript-eslint/types': 6.0.0 - '@typescript-eslint/visitor-keys': 6.0.0 + '@typescript-eslint/types': 8.8.1 + '@typescript-eslint/visitor-keys': 8.8.1 dev: true - /@typescript-eslint/type-utils@6.0.0(eslint@8.42.0)(typescript@5.1.3): - resolution: {integrity: sha512-ah6LJvLgkoZ/pyJ9GAdFkzeuMZ8goV6BH7eC9FPmojrnX9yNCIsfjB+zYcnex28YO3RFvBkV6rMV6WpIqkPvoQ==} - engines: {node: ^16.0.0 || >=18.0.0} + /@typescript-eslint/type-utils@8.8.1(eslint@9.12.0)(typescript@5.6.3): + resolution: {integrity: sha512-qSVnpcbLP8CALORf0za+vjLYj1Wp8HSoiI8zYU5tHxRVj30702Z1Yw4cLwfNKhTPWp5+P+k1pjmD5Zd1nhxiZA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - eslint: ^7.0.0 || ^8.0.0 typescript: '*' peerDependenciesMeta: typescript: optional: true dependencies: - '@typescript-eslint/typescript-estree': 6.0.0(typescript@5.1.3) - '@typescript-eslint/utils': 6.0.0(eslint@8.42.0)(typescript@5.1.3) + '@typescript-eslint/typescript-estree': 8.8.1(typescript@5.6.3) + '@typescript-eslint/utils': 8.8.1(eslint@9.12.0)(typescript@5.6.3) debug: 4.3.4 - eslint: 8.42.0 - ts-api-utils: 1.2.1(typescript@5.1.3) - typescript: 5.1.3 + ts-api-utils: 1.3.0(typescript@5.6.3) + typescript: 5.6.3 transitivePeerDependencies: + - eslint - supports-color dev: true - /@typescript-eslint/types@6.0.0: - resolution: {integrity: sha512-Zk9KDggyZM6tj0AJWYYKgF0yQyrcnievdhG0g5FqyU3Y2DRxJn4yWY21sJC0QKBckbsdKKjYDV2yVrrEvuTgxg==} - engines: {node: ^16.0.0 || >=18.0.0} + /@typescript-eslint/types@8.8.1: + resolution: {integrity: sha512-WCcTP4SDXzMd23N27u66zTKMuEevH4uzU8C9jf0RO4E04yVHgQgW+r+TeVTNnO1KIfrL8ebgVVYYMMO3+jC55Q==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} dev: true - /@typescript-eslint/typescript-estree@6.0.0(typescript@5.1.3): - resolution: {integrity: sha512-2zq4O7P6YCQADfmJ5OTDQTP3ktajnXIRrYAtHM9ofto/CJZV3QfJ89GEaM2BNGeSr1KgmBuLhEkz5FBkS2RQhQ==} - engines: {node: ^16.0.0 || >=18.0.0} + /@typescript-eslint/typescript-estree@8.8.1(typescript@5.6.3): + resolution: {integrity: sha512-A5d1R9p+X+1js4JogdNilDuuq+EHZdsH9MjTVxXOdVFfTJXunKJR/v+fNNyO4TnoOn5HqobzfRlc70NC6HTcdg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '*' peerDependenciesMeta: typescript: optional: true dependencies: - '@typescript-eslint/types': 6.0.0 - '@typescript-eslint/visitor-keys': 6.0.0 + '@typescript-eslint/types': 8.8.1 + '@typescript-eslint/visitor-keys': 8.8.1 debug: 4.3.4 - globby: 11.1.0 + fast-glob: 3.3.2 is-glob: 4.0.3 - semver: 7.6.0 - ts-api-utils: 1.2.1(typescript@5.1.3) - typescript: 5.1.3 + minimatch: 9.0.5 + semver: 7.6.3 + ts-api-utils: 1.3.0(typescript@5.6.3) + typescript: 5.6.3 transitivePeerDependencies: - supports-color dev: true - /@typescript-eslint/utils@6.0.0(eslint@8.42.0)(typescript@5.1.3): - resolution: {integrity: sha512-SOr6l4NB6HE4H/ktz0JVVWNXqCJTOo/mHnvIte1ZhBQ0Cvd04x5uKZa3zT6tiodL06zf5xxdK8COiDvPnQ27JQ==} - engines: {node: ^16.0.0 || >=18.0.0} + /@typescript-eslint/utils@8.8.1(eslint@9.12.0)(typescript@5.6.3): + resolution: {integrity: sha512-/QkNJDbV0bdL7H7d0/y0qBbV2HTtf0TIyjSDTvvmQEzeVx8jEImEbLuOA4EsvE8gIgqMitns0ifb5uQhMj8d9w==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - eslint: ^7.0.0 || ^8.0.0 + eslint: ^8.57.0 || ^9.0.0 dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@8.42.0) - '@types/json-schema': 7.0.15 - '@types/semver': 7.5.6 - '@typescript-eslint/scope-manager': 6.0.0 - '@typescript-eslint/types': 6.0.0 - '@typescript-eslint/typescript-estree': 6.0.0(typescript@5.1.3) - eslint: 8.42.0 - eslint-scope: 5.1.1 - semver: 7.6.0 + '@eslint-community/eslint-utils': 4.4.0(eslint@9.12.0) + '@typescript-eslint/scope-manager': 8.8.1 + '@typescript-eslint/types': 8.8.1 + '@typescript-eslint/typescript-estree': 8.8.1(typescript@5.6.3) + eslint: 9.12.0 transitivePeerDependencies: - supports-color - typescript dev: true - /@typescript-eslint/visitor-keys@6.0.0: - resolution: {integrity: sha512-cvJ63l8c0yXdeT5POHpL0Q1cZoRcmRKFCtSjNGJxPkcP571EfZMcNbzWAc7oK3D1dRzm/V5EwtkANTZxqvuuUA==} - engines: {node: ^16.0.0 || >=18.0.0} + /@typescript-eslint/visitor-keys@8.8.1: + resolution: {integrity: sha512-0/TdC3aeRAsW7MDvYRwEc1Uwm0TIBfzjPFgg60UU2Haj5qsCs9cc3zNgY71edqE3LbWfF/WoZQd3lJoDXFQpag==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} dependencies: - '@typescript-eslint/types': 6.0.0 + '@typescript-eslint/types': 8.8.1 eslint-visitor-keys: 3.4.3 dev: true - /@webassemblyjs/ast@1.11.6: - resolution: {integrity: sha512-IN1xI7PwOvLPgjcf180gC1bqn3q/QaOCwYUahIOhbYUu8KA/3tw2RT/T0Gidi1l7Hhj5D/INhJxiICObqpMu4Q==} + /@webassemblyjs/ast@1.12.1: + resolution: {integrity: sha512-EKfMUOPRRUTy5UII4qJDGPpqfwjOmZ5jeGFwid9mnoqIFK+e0vqoi1qH56JpmZSzEL53jKnNzScdmftJyG5xWg==} dependencies: '@webassemblyjs/helper-numbers': 1.11.6 '@webassemblyjs/helper-wasm-bytecode': 1.11.6 @@ -2316,8 +2288,8 @@ packages: resolution: {integrity: sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==} dev: true - /@webassemblyjs/helper-buffer@1.11.6: - resolution: {integrity: sha512-z3nFzdcp1mb8nEOFFk8DrYLpHvhKC3grJD2ardfKOzmbmJvEf/tPIqCY+sNcwZIY8ZD7IkB2l7/pqhUhqm7hLA==} + /@webassemblyjs/helper-buffer@1.12.1: + resolution: {integrity: sha512-nzJwQw99DNDKr9BVCOZcLuJJUlqkJh+kVzVl6Fmq/tI5ZtEyWT1KZMyOXltXLZJmDtvLCDgwsyrkohEtopTXCw==} dev: true /@webassemblyjs/helper-numbers@1.11.6: @@ -2332,13 +2304,13 @@ packages: resolution: {integrity: sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==} dev: true - /@webassemblyjs/helper-wasm-section@1.11.6: - resolution: {integrity: sha512-LPpZbSOwTpEC2cgn4hTydySy1Ke+XEu+ETXuoyvuyezHO3Kjdu90KK95Sh9xTbmjrCsUwvWwCOQQNta37VrS9g==} + /@webassemblyjs/helper-wasm-section@1.12.1: + resolution: {integrity: sha512-Jif4vfB6FJlUlSbgEMHUyk1j234GTNG9dBJ4XJdOySoj518Xj0oGsNi59cUQF4RRMS9ouBUxDDdyBVfPTypa5g==} dependencies: - '@webassemblyjs/ast': 1.11.6 - '@webassemblyjs/helper-buffer': 1.11.6 + '@webassemblyjs/ast': 1.12.1 + '@webassemblyjs/helper-buffer': 1.12.1 '@webassemblyjs/helper-wasm-bytecode': 1.11.6 - '@webassemblyjs/wasm-gen': 1.11.6 + '@webassemblyjs/wasm-gen': 1.12.1 dev: true /@webassemblyjs/ieee754@1.11.6: @@ -2357,42 +2329,42 @@ packages: resolution: {integrity: sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==} dev: true - /@webassemblyjs/wasm-edit@1.11.6: - resolution: {integrity: sha512-Ybn2I6fnfIGuCR+Faaz7YcvtBKxvoLV3Lebn1tM4o/IAJzmi9AWYIPWpyBfU8cC+JxAO57bk4+zdsTjJR+VTOw==} + /@webassemblyjs/wasm-edit@1.12.1: + resolution: {integrity: sha512-1DuwbVvADvS5mGnXbE+c9NfA8QRcZ6iKquqjjmR10k6o+zzsRVesil54DKexiowcFCPdr/Q0qaMgB01+SQ1u6g==} dependencies: - '@webassemblyjs/ast': 1.11.6 - '@webassemblyjs/helper-buffer': 1.11.6 + '@webassemblyjs/ast': 1.12.1 + '@webassemblyjs/helper-buffer': 1.12.1 '@webassemblyjs/helper-wasm-bytecode': 1.11.6 - '@webassemblyjs/helper-wasm-section': 1.11.6 - '@webassemblyjs/wasm-gen': 1.11.6 - '@webassemblyjs/wasm-opt': 1.11.6 - '@webassemblyjs/wasm-parser': 1.11.6 - '@webassemblyjs/wast-printer': 1.11.6 + '@webassemblyjs/helper-wasm-section': 1.12.1 + '@webassemblyjs/wasm-gen': 1.12.1 + '@webassemblyjs/wasm-opt': 1.12.1 + '@webassemblyjs/wasm-parser': 1.12.1 + '@webassemblyjs/wast-printer': 1.12.1 dev: true - /@webassemblyjs/wasm-gen@1.11.6: - resolution: {integrity: sha512-3XOqkZP/y6B4F0PBAXvI1/bky7GryoogUtfwExeP/v7Nzwo1QLcq5oQmpKlftZLbT+ERUOAZVQjuNVak6UXjPA==} + /@webassemblyjs/wasm-gen@1.12.1: + resolution: {integrity: sha512-TDq4Ojh9fcohAw6OIMXqiIcTq5KUXTGRkVxbSo1hQnSy6lAM5GSdfwWeSxpAo0YzgsgF182E/U0mDNhuA0tW7w==} dependencies: - '@webassemblyjs/ast': 1.11.6 + '@webassemblyjs/ast': 1.12.1 '@webassemblyjs/helper-wasm-bytecode': 1.11.6 '@webassemblyjs/ieee754': 1.11.6 '@webassemblyjs/leb128': 1.11.6 '@webassemblyjs/utf8': 1.11.6 dev: true - /@webassemblyjs/wasm-opt@1.11.6: - resolution: {integrity: sha512-cOrKuLRE7PCe6AsOVl7WasYf3wbSo4CeOk6PkrjS7g57MFfVUF9u6ysQBBODX0LdgSvQqRiGz3CXvIDKcPNy4g==} + /@webassemblyjs/wasm-opt@1.12.1: + resolution: {integrity: sha512-Jg99j/2gG2iaz3hijw857AVYekZe2SAskcqlWIZXjji5WStnOpVoat3gQfT/Q5tb2djnCjBtMocY/Su1GfxPBg==} dependencies: - '@webassemblyjs/ast': 1.11.6 - '@webassemblyjs/helper-buffer': 1.11.6 - '@webassemblyjs/wasm-gen': 1.11.6 - '@webassemblyjs/wasm-parser': 1.11.6 + '@webassemblyjs/ast': 1.12.1 + '@webassemblyjs/helper-buffer': 1.12.1 + '@webassemblyjs/wasm-gen': 1.12.1 + '@webassemblyjs/wasm-parser': 1.12.1 dev: true - /@webassemblyjs/wasm-parser@1.11.6: - resolution: {integrity: sha512-6ZwPeGzMJM3Dqp3hCsLgESxBGtT/OeCvCZ4TA1JUPYgmhAx38tTPR9JaKy0S5H3evQpO/h2uWs2j6Yc/fjkpTQ==} + /@webassemblyjs/wasm-parser@1.12.1: + resolution: {integrity: sha512-xikIi7c2FHXysxXe3COrVUPSheuBtpcfhbpFj4gmu7KRLYOzANztwUU0IbsqvMqzuNK2+glRGWCEqZo1WCLyAQ==} dependencies: - '@webassemblyjs/ast': 1.11.6 + '@webassemblyjs/ast': 1.12.1 '@webassemblyjs/helper-api-error': 1.11.6 '@webassemblyjs/helper-wasm-bytecode': 1.11.6 '@webassemblyjs/ieee754': 1.11.6 @@ -2400,10 +2372,10 @@ packages: '@webassemblyjs/utf8': 1.11.6 dev: true - /@webassemblyjs/wast-printer@1.11.6: - resolution: {integrity: sha512-JM7AhRcE+yW2GWYaKeHL5vt4xqee5N2WcezptmgyhNS+ScggqcT1OtXykhAb13Sn5Yas0j2uv9tHgrjwvzAP4A==} + /@webassemblyjs/wast-printer@1.12.1: + resolution: {integrity: sha512-+X4WAlOisVWQMikjbcvY2e0rwPsKQ9F688lksZhBcPycBBuii3O7m8FACbDMWDojpAqvjIncrG8J0XHKyQfVeA==} dependencies: - '@webassemblyjs/ast': 1.11.6 + '@webassemblyjs/ast': 1.12.1 '@xtuc/long': 4.2.2 dev: true @@ -2438,20 +2410,20 @@ packages: resolution: {integrity: sha512-2BjRTZxTPvheOvGbBslFSYOUkr+SjPtOnrLP33f+VIWLzezQpZcqVg7ja3L4dBXmzzgwT+a029jRx5PCi3JuiA==} dev: false - /acorn-import-assertions@1.9.0(acorn@8.11.3): - resolution: {integrity: sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==} + /acorn-import-attributes@1.9.5(acorn@8.11.3): + resolution: {integrity: sha512-n02Vykv5uA3eHGM/Z2dQrcD56kL8TyDb2p1+0P83PClMnC/nc+anbQRhIOWnSq4Ke/KvDPrY3C9hDtC/A3eHnQ==} peerDependencies: acorn: ^8 dependencies: acorn: 8.11.3 dev: true - /acorn-jsx@5.3.2(acorn@8.11.3): + /acorn-jsx@5.3.2(acorn@8.12.1): resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} peerDependencies: acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 dependencies: - acorn: 8.11.3 + acorn: 8.12.1 dev: true /acorn-walk@8.3.2: @@ -2469,6 +2441,12 @@ packages: engines: {node: '>=0.4.0'} hasBin: true + /acorn@8.12.1: + resolution: {integrity: sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==} + engines: {node: '>=0.4.0'} + hasBin: true + dev: true + /add-stream@1.0.0: resolution: {integrity: sha512-qQLMr+8o0WC4FZGQTcJiKBVC59JylcPSrTtk6usvmIDFUOCKegapy1VHQwRbFMOFyb/inzUVqHs+eMYKDM1YeQ==} dev: true @@ -2482,21 +2460,6 @@ packages: - supports-color dev: false - /agentkeepalive@4.5.0: - resolution: {integrity: sha512-5GG/5IbQQpC9FpkRGsSvZI5QYeSCzlJHdpBQntCsuTOxhKD8lqKhrleg2Yi7yvMIf82Ycmmqln9U8V9qwEiJew==} - engines: {node: '>= 8.0.0'} - dependencies: - humanize-ms: 1.2.1 - dev: false - - /aggregate-error@3.1.0: - resolution: {integrity: sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==} - engines: {node: '>=8'} - dependencies: - clean-stack: 2.2.0 - indent-string: 4.0.0 - dev: false - /ajv-formats@2.1.1(ajv@8.12.0): resolution: {integrity: sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==} peerDependencies: @@ -2575,7 +2538,6 @@ packages: /ansi-regex@6.0.1: resolution: {integrity: sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==} engines: {node: '>=12'} - dev: false /ansi-styles@2.2.1: resolution: {integrity: sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==} @@ -2601,7 +2563,6 @@ packages: /ansi-styles@6.2.1: resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} engines: {node: '>=12'} - dev: false /anymatch@3.1.3: resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} @@ -2626,14 +2587,6 @@ packages: readable-stream: 3.6.2 dev: false - /are-we-there-yet@3.0.1: - resolution: {integrity: sha512-QZW4EDmGwlYur0Yyf/b2uGucHQMa8aFUP7eu9ddR73vvhFyt4V0Vl3QHPcTNJ8l6qYOBdxgXdnBXQrHilfRQBg==} - engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} - dependencies: - delegates: 1.0.0 - readable-stream: 3.6.2 - dev: false - /arg@4.1.3: resolution: {integrity: sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==} @@ -2665,11 +2618,6 @@ packages: resolution: {integrity: sha512-/+3GRL7dDAGEfM6TseQk/U+mi18TU2Ms9I3UlLdUMhz2hbvGNTKdj9xniwXfUqgYhHxRx0+8UnKkvlNwVU+cWQ==} dev: true - /array-union@2.1.0: - resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} - engines: {node: '>=8'} - dev: true - /array-unique@0.2.1: resolution: {integrity: sha512-G2n5bG5fSUCpnsXz4+8FUkYsGPkNfLn9YvS66U5qbTIXI2Ynnlo4Bi42bWv+omKUCqz+ejzfClwne0alJWJPhg==} engines: {node: '>=0.10.0'} @@ -2686,7 +2634,7 @@ packages: /async@3.2.5: resolution: {integrity: sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg==} - dev: false + dev: true /asynckit@0.4.0: resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} @@ -2718,8 +2666,8 @@ packages: - supports-color dev: false - /axios@1.7.5(debug@2.6.9): - resolution: {integrity: sha512-fZu86yCo+svH3uqJ/yTdQ0QHpQu5oL+/QE+QPSv6BZSkDAoky9vytxp7u5qk83OJFS3kEBcesWni9WTZAv3tSw==} + /axios@1.7.7(debug@2.6.9): + resolution: {integrity: sha512-S4kL7XrjgBmvdGut0sN3yJxqYzrDOnivkBiN0OFs6hLiUam3UPvswUo0kqGyhqUZGEOytHyumEdXsAkgCOUf3Q==} dependencies: follow-redirects: 1.15.6(debug@2.6.9) form-data: 4.0.0 @@ -2818,12 +2766,6 @@ packages: engines: {node: '>=8'} dev: true - /bindings@1.5.0: - resolution: {integrity: sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==} - dependencies: - file-uri-to-path: 1.0.0 - dev: false - /bl@4.1.0: resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==} dependencies: @@ -2898,32 +2840,6 @@ packages: ieee754: 1.2.1 dev: false - /cacache@16.1.3: - resolution: {integrity: sha512-/+Emcj9DAXxX4cwlLmRI9c166RuL3w30zp4R7Joiv2cQTtTtA+jeuCAjH3ZlGnYS3tKENSrKhAzVVP9GVyzeYQ==} - engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} - dependencies: - '@npmcli/fs': 2.1.2 - '@npmcli/move-file': 2.0.1 - chownr: 2.0.0 - fs-minipass: 2.1.0 - glob: 8.1.0 - infer-owner: 1.0.4 - lru-cache: 7.18.3 - minipass: 3.3.6 - minipass-collect: 1.0.2 - minipass-flush: 1.0.5 - minipass-pipeline: 1.2.4 - mkdirp: 1.0.4 - p-map: 4.0.0 - promise-inflight: 1.0.1 - rimraf: 3.0.2 - ssri: 9.0.1 - tar: 6.2.0 - unique-filename: 2.0.1 - transitivePeerDependencies: - - bluebird - dev: false - /cache-manager@5.4.0: resolution: {integrity: sha512-FS7o8vqJosnLpu9rh2gQTo8EOzCRJLF1BJ4XDEUDMqcfvs7SJZs5iuoFTXLauzQ3S5v8sBAST1pCwMaurpyi1A==} dependencies: @@ -2937,10 +2853,11 @@ packages: engines: {node: '>=6'} dev: true - /call-bind@1.0.6: - resolution: {integrity: sha512-Mj50FLHtlsoVfRfnHaZvyrooHcrlceNZdL/QBvJJVd9Ta55qCQK0gs4ss2oZDeV9zFCs6ewzYgVE5yfVmfFpVg==} + /call-bind@1.0.7: + resolution: {integrity: sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==} engines: {node: '>= 0.4'} dependencies: + es-define-property: 1.0.0 es-errors: 1.3.0 function-bind: 1.1.2 get-intrinsic: 1.2.4 @@ -2988,7 +2905,6 @@ packages: /centra@2.6.0: resolution: {integrity: sha512-dgh+YleemrT8u85QL11Z6tYhegAs3MMxsaWAq/oXeAmYJ7VxL3SI9TZtnfaEvNDMAPolj25FXIb3S+HCI4wQaQ==} - deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. dev: true /chalk@1.1.3: @@ -3030,8 +2946,8 @@ packages: resolution: {integrity: sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==} dev: true - /chokidar@3.5.3: - resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==} + /chokidar@3.6.0: + resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} engines: {node: '>= 8.10.0'} dependencies: anymatch: 3.1.3 @@ -3071,11 +2987,6 @@ packages: libphonenumber-js: 1.10.58 validator: 13.11.0 - /clean-stack@2.2.0: - resolution: {integrity: sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==} - engines: {node: '>=6'} - dev: false - /cli-cursor@3.1.0: resolution: {integrity: sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==} engines: {node: '>=8'} @@ -3086,8 +2997,8 @@ 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.*} dependencies: string-width: 4.2.3 @@ -3100,6 +3011,11 @@ packages: engines: {node: '>= 10'} dev: true + /cli-width@4.1.0: + resolution: {integrity: sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==} + engines: {node: '>= 12'} + dev: true + /cliui@3.2.0: resolution: {integrity: sha512-0yayqDxWQbqk3ojkYqUKqaAQ6AfNKeKWRNA8kR0WXzAsdHpP4BIaOmMAG87JGuO6qcobyW4GjxHd9PmhEd+T9w==} dependencies: @@ -3196,13 +3112,13 @@ packages: repeat-string: 1.6.1 dev: true - /commitizen@4.3.0(@types/node@20.3.1)(typescript@5.1.3): - resolution: {integrity: sha512-H0iNtClNEhT0fotHvGV3E9tDejDeS04sN1veIebsKYGMuGscFaswRoYJKmT3eW85eIJAs0F28bG2+a/9wCOfPw==} + /commitizen@4.3.1(@types/node@22.7.5)(typescript@5.6.3): + resolution: {integrity: sha512-gwAPAVTy/j5YcOOebcCRIijn+mSjWJC+IYKivTu6aG8Ei/scoXgfsMRnuAk6b0GRste2J4NGxVdMN3ZpfNaVaw==} engines: {node: '>= 12'} hasBin: true dependencies: cachedir: 2.3.0 - cz-conventional-changelog: 3.3.0(@types/node@20.3.1)(typescript@5.1.3) + cz-conventional-changelog: 3.3.0(@types/node@22.7.5)(typescript@5.6.3) dedent: 0.7.0 detect-indent: 6.1.0 find-node-modules: 2.1.3 @@ -3478,7 +3394,7 @@ packages: /core-util-is@1.0.3: resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} - /cosmiconfig-typescript-loader@5.0.0(@types/node@20.3.1)(cosmiconfig@9.0.0)(typescript@5.1.3): + /cosmiconfig-typescript-loader@5.0.0(@types/node@22.7.5)(cosmiconfig@9.0.0)(typescript@5.6.3): resolution: {integrity: sha512-+8cK7jRAReYkMwMiG+bxhcNKiHJDM6bR9FD/nGBXOWdMLuYawjF5cGrtLilJ+LGd3ZjCXnJjR5DkfWPoIVlqJA==} engines: {node: '>=v16'} peerDependencies: @@ -3486,24 +3402,29 @@ packages: cosmiconfig: '>=8.2' typescript: '>=4' dependencies: - '@types/node': 20.3.1 - cosmiconfig: 9.0.0(typescript@5.1.3) + '@types/node': 22.7.5 + cosmiconfig: 9.0.0(typescript@5.6.3) jiti: 1.21.0 - typescript: 5.1.3 + typescript: 5.6.3 dev: true - /cosmiconfig@7.1.0: - resolution: {integrity: sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==} - engines: {node: '>=10'} + /cosmiconfig@8.3.6(typescript@5.3.3): + resolution: {integrity: sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==} + engines: {node: '>=14'} + peerDependencies: + typescript: '>=4.9.5' + peerDependenciesMeta: + typescript: + optional: true dependencies: - '@types/parse-json': 4.0.2 import-fresh: 3.3.0 + js-yaml: 4.1.0 parse-json: 5.2.0 path-type: 4.0.0 - yaml: 1.10.2 + typescript: 5.3.3 dev: true - /cosmiconfig@9.0.0(typescript@5.1.3): + /cosmiconfig@9.0.0(typescript@5.6.3): resolution: {integrity: sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==} engines: {node: '>=14'} peerDependencies: @@ -3516,10 +3437,10 @@ packages: import-fresh: 3.3.0 js-yaml: 4.1.0 parse-json: 5.2.0 - typescript: 5.1.3 + typescript: 5.6.3 dev: true - /create-jest@29.7.0(@types/node@20.3.1)(ts-node@10.9.1): + /create-jest@29.7.0(@types/node@22.7.5)(ts-node@10.9.2): resolution: {integrity: sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} hasBin: true @@ -3528,7 +3449,7 @@ packages: chalk: 4.1.2 exit: 0.1.2 graceful-fs: 4.2.11 - jest-config: 29.7.0(@types/node@20.3.1)(ts-node@10.9.1) + jest-config: 29.7.0(@types/node@22.7.5)(ts-node@10.9.2) jest-util: 29.7.0 prompts: 2.4.2 transitivePeerDependencies: @@ -3557,18 +3478,18 @@ packages: urix: 0.1.0 dev: false - /cz-conventional-changelog@3.3.0(@types/node@20.3.1)(typescript@5.1.3): + /cz-conventional-changelog@3.3.0(@types/node@22.7.5)(typescript@5.6.3): resolution: {integrity: sha512-U466fIzU5U22eES5lTNiNbZ+d8dfcHcssH4o7QsdWaCcRs/feIPCxKYSWkYBNs5mny7MvEfwpTLWjvbm94hecw==} engines: {node: '>= 10'} dependencies: chalk: 2.4.2 - commitizen: 4.3.0(@types/node@20.3.1)(typescript@5.1.3) + commitizen: 4.3.1(@types/node@22.7.5)(typescript@5.6.3) conventional-commit-types: 3.0.0 lodash.map: 4.6.0 longest: 2.0.1 word-wrap: 1.2.5 optionalDependencies: - '@commitlint/load': 19.2.0(@types/node@20.3.1)(typescript@5.1.3) + '@commitlint/load': 19.5.0(@types/node@22.7.5)(typescript@5.6.3) transitivePeerDependencies: - '@types/node' - typescript @@ -3732,20 +3653,6 @@ packages: resolution: {integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==} engines: {node: '>=0.3.1'} - /dir-glob@3.0.1: - resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} - engines: {node: '>=8'} - dependencies: - path-type: 4.0.0 - dev: true - - /doctrine@3.0.0: - resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} - engines: {node: '>=6.0.0'} - dependencies: - esutils: 2.0.3 - dev: true - /dot-prop@5.3.0: resolution: {integrity: sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==} engines: {node: '>=8'} @@ -3764,8 +3671,8 @@ packages: engines: {node: '>=12'} dev: false - /dotenv@16.3.1: - resolution: {integrity: sha512-IPzF4w4/Rd94bA9imS68tZBaYyBWSCE47V1RGuMrB94iyTOIEwRmVL2x/4An+6mETpLrKJ5hQkB8W4kFAadeIQ==} + /dotenv@16.4.5: + resolution: {integrity: sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg==} engines: {node: '>=12'} dev: false @@ -3797,7 +3704,6 @@ packages: /eastasianwidth@0.2.0: resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} - dev: false /ecdsa-sig-formatter@1.0.11: resolution: {integrity: sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==} @@ -3805,6 +3711,14 @@ packages: safe-buffer: 5.2.1 dev: false + /ejs@3.1.10: + resolution: {integrity: sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==} + engines: {node: '>=0.10.0'} + hasBin: true + dependencies: + jake: 10.9.2 + dev: true + /electron-to-chromium@1.4.659: resolution: {integrity: sha512-sRJ3nV3HowrYpBtPF9bASQV7OW49IgZC01Xiq43WfSE3RTCkK0/JidoCmR73Hyc1mN+l/H4Yqx0eNiomvExFZg==} @@ -3817,20 +3731,12 @@ packages: /emoji-regex@9.2.2: resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} - dev: false - - /encoding@0.1.13: - resolution: {integrity: sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==} - requiresBuild: true - dependencies: - iconv-lite: 0.6.3 - dev: false - optional: true /end-of-stream@1.4.4: resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} dependencies: once: 1.4.0 + dev: false /enhanced-resolve@5.15.0: resolution: {integrity: sha512-LXYT42KJ7lpIKECr2mAXIaMldcNCh/7E0KBKOu4KSfkHmP+mZmSs+8V5gBAqisWBy0OO4W5Oyys0GO1Y8KtdKg==} @@ -3840,19 +3746,31 @@ packages: tapable: 2.2.1 dev: true + /enhanced-resolve@5.17.1: + resolution: {integrity: sha512-LMHl3dXhTcfv8gM4kEzIUeTQ+7fpdA0l2tUf34BddXPkz2A5xJ5L/Pchd5BL6rdccM9QGvu0sWZzK1Z1t4wwyg==} + engines: {node: '>=10.13.0'} + dependencies: + graceful-fs: 4.2.11 + tapable: 2.2.1 + dev: true + /env-paths@2.2.1: resolution: {integrity: sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==} engines: {node: '>=6'} - - /err-code@2.0.3: - resolution: {integrity: sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==} - dev: false + dev: true /error-ex@1.3.2: resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} dependencies: is-arrayish: 0.2.1 + /es-define-property@1.0.0: + resolution: {integrity: sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==} + engines: {node: '>= 0.4'} + dependencies: + get-intrinsic: 1.2.4 + dev: true + /es-errors@1.3.0: resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} engines: {node: '>= 0.4'} @@ -3883,17 +3801,17 @@ packages: engines: {node: '>=10'} dev: true - /eslint-config-prettier@9.0.0(eslint@8.42.0): - resolution: {integrity: sha512-IcJsTkJae2S35pRsRAwoCE+925rJJStOdkKnLVgtE+tEpqU0EVVM7OqrwxqgptKdX29NUwC82I5pXsGFIgSevw==} + /eslint-config-prettier@9.1.0(eslint@9.12.0): + resolution: {integrity: sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw==} hasBin: true peerDependencies: eslint: '>=7.0.0' dependencies: - eslint: 8.42.0 + eslint: 9.12.0 dev: true - /eslint-plugin-prettier@5.0.0(eslint-config-prettier@9.0.0)(eslint@8.42.0)(prettier@3.0.0): - resolution: {integrity: sha512-AgaZCVuYDXHUGxj/ZGu1u8H8CYgDY3iG6w5kUFw4AzMVXzB7VvbKgYR4nATIN+OvUrghMbiDLeimVjVY5ilq3w==} + /eslint-plugin-prettier@5.2.1(eslint-config-prettier@9.1.0)(eslint@9.12.0)(prettier@3.3.3): + resolution: {integrity: sha512-gH3iR3g4JfF+yYPaJYkN7jEl9QbweL/YfkoRlNnuIEHEz1vHVlCmWOS+eGGiRuzHQXdJFCOTxRgvju9b8VUmrw==} engines: {node: ^14.18.0 || >=16.0.0} peerDependencies: '@types/eslint': '>=8.0.0' @@ -3906,11 +3824,11 @@ packages: eslint-config-prettier: optional: true dependencies: - eslint: 8.42.0 - eslint-config-prettier: 9.0.0(eslint@8.42.0) - prettier: 3.0.0 + eslint: 9.12.0 + eslint-config-prettier: 9.1.0(eslint@9.12.0) + prettier: 3.3.3 prettier-linter-helpers: 1.0.0 - synckit: 0.8.8 + synckit: 0.9.2 dev: true /eslint-scope@5.1.1: @@ -3921,9 +3839,9 @@ packages: estraverse: 4.3.0 dev: true - /eslint-scope@7.2.2: - resolution: {integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + /eslint-scope@8.1.0: + resolution: {integrity: sha512-14dSvlhaVhKKsa9Fx1l8A17s7ah7Ef7wCakJ10LYk6+GYmP9yDti2oq2SEwcyndt6knfcZyhyxwY3i9yL78EQw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} dependencies: esrecurse: 4.3.0 estraverse: 5.3.0 @@ -3934,61 +3852,67 @@ packages: engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dev: true - /eslint@8.42.0: - resolution: {integrity: sha512-ulg9Ms6E1WPf67PHaEY4/6E2tEn5/f7FXGzr3t9cBMugOmf1INYvuUwwh1aXQN4MfJ6a5K2iNwP3w4AColvI9A==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + /eslint-visitor-keys@4.1.0: + resolution: {integrity: sha512-Q7lok0mqMUSf5a/AdAZkA5a/gHcO6snwQClVNNvFKCAVlxXucdU8pKydU5ZVZjBx5xr37vGbFFWtLQYreLzrZg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + dev: true + + /eslint@9.12.0: + resolution: {integrity: sha512-UVIOlTEWxwIopRL1wgSQYdnVDcEvs2wyaO6DGo5mXqe3r16IoCNWkR29iHhyaP4cICWjbgbmFUGAhh0GJRuGZw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} hasBin: true + peerDependencies: + jiti: '*' + peerDependenciesMeta: + jiti: + optional: true dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@8.42.0) - '@eslint-community/regexpp': 4.10.0 - '@eslint/eslintrc': 2.1.4 - '@eslint/js': 8.42.0 - '@humanwhocodes/config-array': 0.11.14 + '@eslint-community/eslint-utils': 4.4.0(eslint@9.12.0) + '@eslint-community/regexpp': 4.11.1 + '@eslint/config-array': 0.18.0 + '@eslint/core': 0.6.0 + '@eslint/eslintrc': 3.1.0 + '@eslint/js': 9.12.0 + '@eslint/plugin-kit': 0.2.0 + '@humanfs/node': 0.16.5 '@humanwhocodes/module-importer': 1.0.1 - '@nodelib/fs.walk': 1.2.8 + '@humanwhocodes/retry': 0.3.1 + '@types/estree': 1.0.6 + '@types/json-schema': 7.0.15 ajv: 6.12.6 chalk: 4.1.2 cross-spawn: 7.0.3 debug: 4.3.4 - doctrine: 3.0.0 escape-string-regexp: 4.0.0 - eslint-scope: 7.2.2 - eslint-visitor-keys: 3.4.3 - espree: 9.6.1 + eslint-scope: 8.1.0 + eslint-visitor-keys: 4.1.0 + espree: 10.2.0 esquery: 1.5.0 esutils: 2.0.3 fast-deep-equal: 3.1.3 - file-entry-cache: 6.0.1 + file-entry-cache: 8.0.0 find-up: 5.0.0 glob-parent: 6.0.2 - globals: 13.24.0 - graphemer: 1.4.0 ignore: 5.3.1 - import-fresh: 3.3.0 imurmurhash: 0.1.4 is-glob: 4.0.3 - is-path-inside: 3.0.3 - js-yaml: 4.1.0 json-stable-stringify-without-jsonify: 1.0.1 - levn: 0.4.1 lodash.merge: 4.6.2 minimatch: 3.1.2 natural-compare: 1.4.0 optionator: 0.9.3 - strip-ansi: 6.0.1 - strip-json-comments: 3.1.1 text-table: 0.2.0 transitivePeerDependencies: - supports-color dev: true - /espree@9.6.1: - resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + /espree@10.2.0: + resolution: {integrity: sha512-upbkBJbckcCNBDBDXEbuhjbP68n+scUd3k/U2EkyM9nw+I/jPiL4cLF/Al06CF96wRltFda16sxDFrxsI1v0/g==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} dependencies: - acorn: 8.11.3 - acorn-jsx: 5.3.2(acorn@8.11.3) - eslint-visitor-keys: 3.4.3 + acorn: 8.12.1 + acorn-jsx: 5.3.2(acorn@8.12.1) + eslint-visitor-keys: 4.1.0 dev: true /esprima@4.0.1: @@ -4038,21 +3962,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'} - dependencies: - cross-spawn: 7.0.3 - 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 - dev: true - /execa@5.1.1: resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} engines: {node: '>=10'} @@ -4067,21 +3976,6 @@ packages: signal-exit: 3.0.7 strip-final-newline: 2.0.0 - /execa@8.0.1: - resolution: {integrity: sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==} - engines: {node: '>=16.17'} - dependencies: - cross-spawn: 7.0.3 - get-stream: 8.0.1 - human-signals: 5.0.0 - is-stream: 3.0.0 - merge-stream: 2.0.0 - npm-run-path: 5.3.0 - onetime: 6.0.0 - signal-exit: 4.1.0 - strip-final-newline: 3.0.0 - dev: true - /exit@0.1.2: resolution: {integrity: sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==} engines: {node: '>= 0.8.0'} @@ -4117,10 +4011,6 @@ packages: jest-message-util: 29.7.0 jest-util: 29.7.0 - /exponential-backoff@3.1.1: - resolution: {integrity: sha512-dX7e/LHVJ6W3DE1MHWi9S1EYzDESENfLrYohG2G++ovZrYOkm4Knwa0mc1cn84xJOR4KEU0WSchhLbd0UklbHw==} - dev: false - /extend-shallow@2.0.1: resolution: {integrity: sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==} engines: {node: '>=0.10.0'} @@ -4152,8 +4042,8 @@ packages: resolution: {integrity: sha512-fBHHqSTFLVnR61C+gltJuE5GkVQMV0S2nqUO8TJ+5Z3qAKG8vAx4FKai1s5jq/inV1+sREynIWSuQ6HgoSXpDQ==} dev: false - /fast-copy@3.0.1: - resolution: {integrity: sha512-Knr7NOtK3HWRYGtHoJrjkaWepqT8thIVGAwt0p0aUs1zqkAzXZV4vo9fFNwyb5fcqK1GKYFYxldQdIDVKhUAfA==} + /fast-copy@3.0.2: + resolution: {integrity: sha512-dl0O9Vhju8IrcLndv2eU4ldt1ftXMqqfgN4H1cpmGV7P6jeB9FwpN9a2c8DPGE1Ys88rNUJVYDHq73CGAGOPfQ==} dev: false /fast-decode-uri-component@1.0.1: @@ -4215,8 +4105,8 @@ packages: resolution: {integrity: sha512-eel5UKGn369gGEWOqBShmFJWfq/xSJvsgDzgLYC845GneayWvXBf0lJCBn5qTABfewy1ZDPoaR5OZCP+kssfuw==} dev: false - /fastify-ip@1.0.0: - resolution: {integrity: sha512-ht6hS48UDmdHd9jARn2BphJUgw5u/nm8ItO9EceM2uSVhlusrkF07CfNvpuJHxFX8Nx+Eik/VJz0QzxOn3KMJA==} + /fastify-ip@1.1.0: + resolution: {integrity: sha512-23M1Jbw5ftu1uMeVYsyqUfKs85SsfvopJZufdSinzbrYYQtD4V7TWn1Mc6IliQXHk0mdiLeKxYH4F3OZlxG5Ow==} engines: {node: '>=18.x'} dependencies: fastify-plugin: 4.5.1 @@ -4266,16 +4156,18 @@ packages: escape-string-regexp: 1.0.5 dev: true - /file-entry-cache@6.0.1: - resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} - engines: {node: ^10.12.0 || >=12.0.0} + /file-entry-cache@8.0.0: + resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==} + engines: {node: '>=16.0.0'} dependencies: - flat-cache: 3.2.0 + flat-cache: 4.0.1 dev: true - /file-uri-to-path@1.0.0: - resolution: {integrity: sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==} - dev: false + /filelist@1.0.4: + resolution: {integrity: sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==} + dependencies: + minimatch: 5.1.6 + dev: true /filename-regex@2.0.1: resolution: {integrity: sha512-BTCqyBaWBTsauvnHiE8i562+EdJj+oUpkqWp2R1iCoR8f6oo8STRu3of7WJJ0TqWtxN50a5YFpzYK4Jj9esYfQ==} @@ -4380,13 +4272,12 @@ packages: engines: {node: '>=0.10.0'} dev: false - /flat-cache@3.2.0: - resolution: {integrity: sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==} - engines: {node: ^10.12.0 || >=12.0.0} + /flat-cache@4.0.1: + resolution: {integrity: sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==} + engines: {node: '>=16'} dependencies: flatted: 3.2.9 keyv: 4.5.4 - rimraf: 3.0.2 dev: true /flatted@3.2.9: @@ -4423,10 +4314,9 @@ packages: dependencies: cross-spawn: 7.0.3 signal-exit: 4.1.0 - dev: false - /fork-ts-checker-webpack-plugin@8.0.0(typescript@5.1.3)(webpack@5.87.0): - resolution: {integrity: sha512-mX3qW3idpueT2klaQXBzrIM/pHw+T0B/V9KHEvNrqijTq9NFnMZU6oreVxDYcf33P8a5cW+67PjodNHthGnNVg==} + /fork-ts-checker-webpack-plugin@9.0.2(typescript@5.3.3)(webpack@5.94.0): + resolution: {integrity: sha512-Uochze2R8peoN1XqlSi/rGUkDQpRogtLFocP9+PGu68zk1BDAKXfdeCdyVZpgTk8V8WFVQXdEz426VKjXLO1Gg==} engines: {node: '>=12.13.0', yarn: '>=1.0.0'} peerDependencies: typescript: '>3.6.0' @@ -4434,18 +4324,18 @@ packages: dependencies: '@babel/code-frame': 7.23.5 chalk: 4.1.2 - chokidar: 3.5.3 - cosmiconfig: 7.1.0 + chokidar: 3.6.0 + cosmiconfig: 8.3.6(typescript@5.3.3) deepmerge: 4.3.1 fs-extra: 10.1.0 memfs: 3.5.3 minimatch: 3.1.2 node-abort-controller: 3.1.1 schema-utils: 3.3.0 - semver: 7.6.0 + semver: 7.6.3 tapable: 2.2.1 - typescript: 5.1.3 - webpack: 5.87.0 + typescript: 5.3.3 + webpack: 5.94.0 dev: true /form-data-lite@1.0.3: @@ -4478,13 +4368,6 @@ packages: engines: {node: '>= 0.6'} dev: false - /from2@2.3.0: - resolution: {integrity: sha512-OMcX/4IC/uqEPVgGeyfN22LJk6AZrMkRZHxcHBMBvHScDGgwTm2GT2Wkgtocyd3JfZffjj2kYUDXXII0Fk9W0g==} - dependencies: - inherits: 2.0.4 - readable-stream: 2.3.8 - dev: false - /fs-extra@10.1.0: resolution: {integrity: sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==} engines: {node: '>=12'} @@ -4542,20 +4425,6 @@ packages: wide-align: 1.1.5 dev: false - /gauge@4.0.4: - resolution: {integrity: sha512-f9m+BEN5jkg6a0fZjleidjN51VE1X+mPFQ2DJ0uv1V39oCLCbsGe6yjbBnp7eK7z/+GAon99a3nHuqbuuthyPg==} - engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} - dependencies: - aproba: 2.0.0 - color-support: 1.1.3 - console-control-strings: 1.1.0 - has-unicode: 2.0.1 - signal-exit: 3.0.7 - string-width: 4.2.3 - strip-ansi: 6.0.1 - wide-align: 1.1.5 - dev: false - /gensync@1.0.0-beta.2: resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} engines: {node: '>=6.9.0'} @@ -4590,22 +4459,10 @@ packages: yargs: 16.2.0 dev: true - /get-stream@5.2.0: - resolution: {integrity: sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==} - engines: {node: '>=8'} - dependencies: - pump: 3.0.0 - dev: true - /get-stream@6.0.1: resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} engines: {node: '>=10'} - /get-stream@8.0.1: - resolution: {integrity: sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==} - engines: {node: '>=16'} - dev: true - /git-raw-commits@2.0.11: resolution: {integrity: sha512-VnctFhw+xfj8Va1xtfEqCUD2XDrbAPSJx+hSrE5K7fGdjZruW7XV+QOrN7LF/RJyvspRiD2I0asWsxFp0ya26A==} engines: {node: '>=10'} @@ -4704,20 +4561,34 @@ packages: resolution: {integrity: sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==} dev: true - /glob@10.3.10: - resolution: {integrity: sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==} - engines: {node: '>=16 || 14 >=14.17'} + /glob@10.4.2: + resolution: {integrity: sha512-GwMlUF6PkPo3Gk21UxkCohOv0PLcIXVtKyLlpEI28R/cO/4eNOdmLk3CMW1wROV/WR/EsZOWAfBbBOqYvs88/w==} + engines: {node: '>=16 || 14 >=14.18'} hasBin: true dependencies: foreground-child: 3.1.1 - jackspeak: 2.3.6 - minimatch: 9.0.3 - minipass: 7.0.4 - path-scurry: 1.10.1 + jackspeak: 3.4.3 + minimatch: 9.0.5 + minipass: 7.1.2 + package-json-from-dist: 1.0.1 + path-scurry: 1.11.1 + dev: true + + /glob@10.4.5: + resolution: {integrity: sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==} + hasBin: true + dependencies: + foreground-child: 3.1.1 + jackspeak: 3.4.3 + minimatch: 9.0.5 + minipass: 7.1.2 + package-json-from-dist: 1.0.1 + path-scurry: 1.11.1 dev: false /glob@5.0.15: resolution: {integrity: sha512-c9IPMazfRITpmAAKi22dK1VKxGDX9ehhqfABDriL/lzO92xcUKEJPQHrVA/2YHSNFB4iFlykVmWvwo48nr3OxA==} + deprecated: Glob versions prior to v9 are no longer supported dependencies: inflight: 1.0.6 inherits: 2.0.4 @@ -4728,6 +4599,7 @@ packages: /glob@7.2.3: resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} + deprecated: Glob versions prior to v9 are no longer supported dependencies: fs.realpath: 1.0.0 inflight: 1.0.6 @@ -4736,27 +4608,6 @@ packages: once: 1.4.0 path-is-absolute: 1.0.1 - /glob@8.1.0: - resolution: {integrity: sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==} - engines: {node: '>=12'} - dependencies: - fs.realpath: 1.0.0 - inflight: 1.0.6 - inherits: 2.0.4 - minimatch: 5.1.6 - once: 1.4.0 - dev: false - - /glob@9.3.5: - resolution: {integrity: sha512-e1LleDykUz2Iu+MTYdkSsuWX8lvAjAcs0Xef0lNIu0S2wOAzuTxCJtcd9S3cijlwYF18EsU3rzb8jPVobxDh9Q==} - engines: {node: '>=16 || 14 >=14.17'} - dependencies: - fs.realpath: 1.0.0 - minimatch: 8.0.4 - minipass: 4.2.8 - path-scurry: 1.10.1 - dev: true - /global-directory@4.0.1: resolution: {integrity: sha512-wHTUcDUoZ1H5/0iVqEudYW4/kAlN5cZ3j/bXn0Dpbizl9iaUVeWSHqiOjsgk6OW2bkLclbBjzewBz6weQ1zA2Q==} engines: {node: '>=18'} @@ -4788,23 +4639,9 @@ packages: resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} engines: {node: '>=4'} - /globals@13.24.0: - resolution: {integrity: sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==} - engines: {node: '>=8'} - dependencies: - type-fest: 0.20.2 - dev: true - - /globby@11.1.0: - resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} - engines: {node: '>=10'} - dependencies: - array-union: 2.1.0 - dir-glob: 3.0.1 - fast-glob: 3.3.2 - ignore: 5.3.1 - merge2: 1.4.1 - slash: 3.0.0 + /globals@14.0.0: + resolution: {integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==} + engines: {node: '>=18'} dev: true /gopd@1.0.1: @@ -4816,10 +4653,6 @@ packages: /graceful-fs@4.2.11: resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} - /grapheme-splitter@1.0.4: - resolution: {integrity: sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==} - dev: true - /graphemer@1.4.0: resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} dev: true @@ -4941,10 +4774,6 @@ packages: /html-escaper@2.0.2: resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==} - /http-cache-semantics@4.1.1: - resolution: {integrity: sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==} - dev: false - /http-errors@2.0.0: resolution: {integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==} engines: {node: '>= 0.8'} @@ -4956,17 +4785,6 @@ packages: toidentifier: 1.0.1 dev: false - /http-proxy-agent@5.0.0: - resolution: {integrity: sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==} - engines: {node: '>= 6'} - dependencies: - '@tootallnate/once': 2.0.0 - agent-base: 6.0.2 - debug: 4.3.4 - transitivePeerDependencies: - - supports-color - dev: false - /http-status@1.7.4: resolution: {integrity: sha512-c2qSwNtTlHVYAhMj9JpGdyo0No/+DiKXCJ9pHtZ2Yf3QmPnBIytKSRT7BuyIiQ7icXLynavGmxUqkOjSrAuMuA==} engines: {node: '>= 0.4.0'} @@ -4982,28 +4800,12 @@ packages: - supports-color dev: false - /human-signals@1.1.1: - resolution: {integrity: sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==} - engines: {node: '>=8.12.0'} - dev: true - /human-signals@2.1.0: resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} engines: {node: '>=10.17.0'} - /human-signals@5.0.0: - resolution: {integrity: sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==} - engines: {node: '>=16.17.0'} - dev: true - - /humanize-ms@1.2.1: - resolution: {integrity: sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==} - dependencies: - ms: 2.1.3 - dev: false - - /husky@9.0.11: - resolution: {integrity: sha512-AB6lFlbwwyIqMdHYhwPe+kjOC3Oc5P3nThEoW/AaO2BX3vJDjWPFxYLxokUZOo6RNX20He3AaT8sESs9NJcmEw==} + /husky@9.1.6: + resolution: {integrity: sha512-sqbjZKK7kf44hfdE94EoX8MZNk0n7HeW37O4YrVGCF4wzgQjp+akPAkfUK5LZ6KuR/6sqeAVuXHji+RzQgOn5A==} engines: {node: '>=18'} hasBin: true dev: true @@ -5015,14 +4817,6 @@ packages: safer-buffer: 2.1.2 dev: true - /iconv-lite@0.6.3: - resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} - engines: {node: '>=0.10.0'} - dependencies: - safer-buffer: 2.1.2 - dev: false - optional: true - /ieee754@1.2.1: resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} @@ -5058,13 +4852,11 @@ packages: /indent-string@4.0.0: resolution: {integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==} engines: {node: '>=8'} - - /infer-owner@1.0.4: - resolution: {integrity: sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==} - dev: false + dev: true /inflight@1.0.6: resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} + deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful. dependencies: once: 1.4.0 wrappy: 1.0.2 @@ -5081,8 +4873,8 @@ packages: engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} dev: true - /inquirer@8.2.4: - resolution: {integrity: sha512-nn4F01dxU8VeKfq192IjLsxu0/OmMZ4Lg3xKAns148rCaXP6ntAoEkVYZThWjwON8AlzdZZi6oqnhNbxUG9hVg==} + /inquirer@8.2.5: + resolution: {integrity: sha512-QAgPDQMEgrDssk1XiwwHoOGYF9BAbUcc1+j+FhEvaOt8/cKRqyLn0U5qA6F74fGhTMGxf92pOvPBeh29jQJDTQ==} engines: {node: '>=12.0.0'} dependencies: ansi-escapes: 4.3.2 @@ -5102,8 +4894,8 @@ packages: wrap-ansi: 7.0.0 dev: true - /inquirer@8.2.5: - resolution: {integrity: sha512-QAgPDQMEgrDssk1XiwwHoOGYF9BAbUcc1+j+FhEvaOt8/cKRqyLn0U5qA6F74fGhTMGxf92pOvPBeh29jQJDTQ==} + /inquirer@8.2.6: + resolution: {integrity: sha512-M1WuAmb7pn9zdFRtQYk26ZBoY043Sse0wVDdk4Bppr+JOXyQYybdtvK+l9wUibhtjdjvtoiNy8tk+EgsYIUqKg==} engines: {node: '>=12.0.0'} dependencies: ansi-escapes: 4.3.2 @@ -5120,35 +4912,35 @@ packages: string-width: 4.2.3 strip-ansi: 6.0.1 through: 2.3.8 - wrap-ansi: 7.0.0 + wrap-ansi: 6.2.0 dev: true - /interpret@1.4.0: - resolution: {integrity: sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==} - engines: {node: '>= 0.10'} - dev: true - - /into-stream@6.0.0: - resolution: {integrity: sha512-XHbaOAvP+uFKUFsOgoNPRjLkwB+I22JFPFe5OjTkQ0nwgj6+pSjb4NmB6VMxaPshLiOf+zcpOCBQuLwC1KHhZA==} - engines: {node: '>=10'} + /inquirer@9.2.15: + resolution: {integrity: sha512-vI2w4zl/mDluHt9YEQ/543VTCwPKWiHzKtm9dM2V0NdFcqEexDAjUHzO1oA60HRNaVifGXXM1tRRNluLVHa0Kg==} + engines: {node: '>=18'} dependencies: - from2: 2.3.0 - p-is-promise: 3.0.0 - dev: false + '@ljharb/through': 2.3.13 + ansi-escapes: 4.3.2 + chalk: 5.3.0 + cli-cursor: 3.1.0 + cli-width: 4.1.0 + external-editor: 3.1.0 + figures: 3.2.0 + lodash: 4.17.21 + mute-stream: 1.0.0 + ora: 5.4.1 + run-async: 3.0.0 + rxjs: 7.8.1 + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi: 6.2.0 + dev: true /invert-kv@1.0.0: resolution: {integrity: sha512-xgs2NH9AE66ucSq4cNG1nhSFghr5l6tdL15Pk+jl46bmmBapgoaY/AacXyaDznAqmGL99TiLSQgO/XazFSKYeQ==} engines: {node: '>=0.10.0'} dev: false - /ip-address@9.0.5: - resolution: {integrity: sha512-zHtQzGojZXTwZTHQqra+ETKd4Sn3vgi7uBmlPoXVWZqYvuKmtI0l/VZTjqGmJY9x88GGOaZ9+G9ES8hC4T4X8g==} - engines: {node: '>= 12'} - dependencies: - jsbn: 1.1.0 - sprintf-js: 1.1.3 - dev: false - /ipaddr.js@1.9.1: resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==} engines: {node: '>= 0.10'} @@ -5239,10 +5031,6 @@ packages: resolution: {integrity: sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==} engines: {node: '>=8'} - /is-lambda@1.0.1: - resolution: {integrity: sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ==} - dev: false - /is-number@2.1.0: resolution: {integrity: sha512-QUzH43Gfb9+5yckcrSA0VBDwEtDUchrk4F6tfJZQuNzDJbEDB9cZNzSfXGQ1jqmdDY/kl41lUOWM9syA8z8jlg==} engines: {node: '>=0.10.0'} @@ -5264,11 +5052,6 @@ packages: engines: {node: '>=8'} dev: true - /is-path-inside@3.0.3: - resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} - engines: {node: '>=8'} - dev: true - /is-plain-obj@1.1.0: resolution: {integrity: sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==} engines: {node: '>=0.10.0'} @@ -5293,11 +5076,6 @@ packages: resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} engines: {node: '>=8'} - /is-stream@3.0.0: - resolution: {integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - dev: true - /is-text-path@1.0.1: resolution: {integrity: sha512-xFuJpne9oFz5qDaodwmmG08e3CawH/2ZV8Qqza1Ko7Sk8POWbkRdwIoAWVhqvq0XeUzANEhKo2n0IXUGBm7A/w==} engines: {node: '>=0.10.0'} @@ -5370,7 +5148,7 @@ packages: '@babel/parser': 7.23.9 '@istanbuljs/schema': 0.1.3 istanbul-lib-coverage: 3.2.2 - semver: 7.6.0 + semver: 7.6.3 transitivePeerDependencies: - supports-color @@ -5403,14 +5181,23 @@ packages: resolution: {integrity: sha512-RKYVTCjAnRthyJes037NX/IiqeidgN1xc3j1RjFfECFp28A1GVwK9nA+i0rJPaHqSZwygLzRnFlzUuHFoWWy+Q==} engines: {node: '>=6'} - /jackspeak@2.3.6: - resolution: {integrity: sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==} - engines: {node: '>=14'} + /jackspeak@3.4.3: + resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==} dependencies: '@isaacs/cliui': 8.0.2 optionalDependencies: '@pkgjs/parseargs': 0.11.0 - dev: false + + /jake@10.9.2: + resolution: {integrity: sha512-2P4SQ0HrLQ+fw6llpLnOaGAvN2Zu6778SJMrCUwns4fOoG9ayrTiZk3VV8sCPkVZF8ab0zksVpS8FDY5pRCNBA==} + engines: {node: '>=10'} + hasBin: true + dependencies: + async: 3.2.5 + chalk: 4.1.2 + filelist: 1.0.4 + minimatch: 3.1.2 + dev: true /jest-changed-files@29.7.0: resolution: {integrity: sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w==} @@ -5428,7 +5215,7 @@ packages: '@jest/expect': 29.7.0 '@jest/test-result': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 20.3.1 + '@types/node': 22.7.5 chalk: 4.1.2 co: 4.6.0 dedent: 1.5.1 @@ -5448,7 +5235,7 @@ packages: - babel-plugin-macros - supports-color - /jest-cli@29.7.0(@types/node@20.3.1)(ts-node@10.9.1): + /jest-cli@29.7.0(@types/node@22.7.5)(ts-node@10.9.2): resolution: {integrity: sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} hasBin: true @@ -5458,14 +5245,14 @@ packages: node-notifier: optional: true dependencies: - '@jest/core': 29.7.0(ts-node@10.9.1) + '@jest/core': 29.7.0(ts-node@10.9.2) '@jest/test-result': 29.7.0 '@jest/types': 29.6.3 chalk: 4.1.2 - create-jest: 29.7.0(@types/node@20.3.1)(ts-node@10.9.1) + create-jest: 29.7.0(@types/node@22.7.5)(ts-node@10.9.2) exit: 0.1.2 import-local: 3.1.0 - jest-config: 29.7.0(@types/node@20.3.1)(ts-node@10.9.1) + jest-config: 29.7.0(@types/node@22.7.5)(ts-node@10.9.2) jest-util: 29.7.0 jest-validate: 29.7.0 yargs: 17.7.2 @@ -5475,7 +5262,7 @@ packages: - supports-color - ts-node - /jest-config@29.7.0(@types/node@20.3.1)(ts-node@10.9.1): + /jest-config@29.7.0(@types/node@22.7.5)(ts-node@10.9.2): resolution: {integrity: sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} peerDependencies: @@ -5490,7 +5277,7 @@ packages: '@babel/core': 7.23.9 '@jest/test-sequencer': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 20.3.1 + '@types/node': 22.7.5 babel-jest: 29.7.0(@babel/core@7.23.9) chalk: 4.1.2 ci-info: 3.9.0 @@ -5510,7 +5297,7 @@ packages: pretty-format: 29.7.0 slash: 3.0.0 strip-json-comments: 3.1.1 - ts-node: 10.9.1(@types/node@20.3.1)(typescript@5.1.3) + ts-node: 10.9.2(@types/node@22.7.5)(typescript@5.6.3) transitivePeerDependencies: - babel-plugin-macros - supports-color @@ -5547,7 +5334,7 @@ packages: '@jest/environment': 29.7.0 '@jest/fake-timers': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 20.3.1 + '@types/node': 22.7.5 jest-mock: 29.7.0 jest-util: 29.7.0 @@ -5561,7 +5348,7 @@ packages: dependencies: '@jest/types': 29.6.3 '@types/graceful-fs': 4.1.9 - '@types/node': 20.3.1 + '@types/node': 22.7.5 anymatch: 3.1.3 fb-watchman: 2.0.2 graceful-fs: 4.2.11 @@ -5608,7 +5395,7 @@ packages: engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: '@jest/types': 29.6.3 - '@types/node': 20.3.1 + '@types/node': 22.7.5 jest-util: 29.7.0 /jest-pnp-resolver@1.2.3(jest-resolve@29.7.0): @@ -5658,7 +5445,7 @@ packages: '@jest/test-result': 29.7.0 '@jest/transform': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 20.3.1 + '@types/node': 22.7.5 chalk: 4.1.2 emittery: 0.13.1 graceful-fs: 4.2.11 @@ -5688,7 +5475,7 @@ packages: '@jest/test-result': 29.7.0 '@jest/transform': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 20.3.1 + '@types/node': 22.7.5 chalk: 4.1.2 cjs-module-lexer: 1.2.3 collect-v8-coverage: 1.0.2 @@ -5729,7 +5516,7 @@ packages: jest-util: 29.7.0 natural-compare: 1.4.0 pretty-format: 29.7.0 - semver: 7.6.0 + semver: 7.6.3 transitivePeerDependencies: - supports-color @@ -5738,7 +5525,7 @@ packages: engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: '@jest/types': 29.6.3 - '@types/node': 20.3.1 + '@types/node': 22.7.5 chalk: 4.1.2 ci-info: 3.9.0 graceful-fs: 4.2.11 @@ -5761,7 +5548,7 @@ packages: dependencies: '@jest/test-result': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 20.3.1 + '@types/node': 22.7.5 ansi-escapes: 4.3.2 chalk: 4.1.2 emittery: 0.13.1 @@ -5772,7 +5559,7 @@ packages: resolution: {integrity: sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==} engines: {node: '>= 10.13.0'} dependencies: - '@types/node': 20.3.1 + '@types/node': 22.7.5 merge-stream: 2.0.0 supports-color: 8.1.1 dev: true @@ -5781,12 +5568,12 @@ packages: resolution: {integrity: sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@types/node': 20.3.1 + '@types/node': 22.7.5 jest-util: 29.7.0 merge-stream: 2.0.0 supports-color: 8.1.1 - /jest@29.5.0(@types/node@20.3.1)(ts-node@10.9.1): + /jest@29.5.0(@types/node@22.7.5)(ts-node@10.9.2): resolution: {integrity: sha512-juMg3he2uru1QoXX078zTa7pO85QyB9xajZc6bU+d9yEGwrKX6+vGmJQ3UdVZsvTEUARIdObzH68QItim6OSSQ==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} hasBin: true @@ -5796,15 +5583,37 @@ packages: node-notifier: optional: true dependencies: - '@jest/core': 29.7.0(ts-node@10.9.1) + '@jest/core': 29.7.0(ts-node@10.9.2) + '@jest/types': 29.6.3 + import-local: 3.1.0 + jest-cli: 29.7.0(@types/node@22.7.5)(ts-node@10.9.2) + transitivePeerDependencies: + - '@types/node' + - babel-plugin-macros + - supports-color + - ts-node + dev: false + + /jest@29.7.0(@types/node@22.7.5)(ts-node@10.9.2): + resolution: {integrity: sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + hasBin: true + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + dependencies: + '@jest/core': 29.7.0(ts-node@10.9.2) '@jest/types': 29.6.3 import-local: 3.1.0 - jest-cli: 29.7.0(@types/node@20.3.1)(ts-node@10.9.1) + jest-cli: 29.7.0(@types/node@22.7.5)(ts-node@10.9.2) transitivePeerDependencies: - '@types/node' - babel-plugin-macros - supports-color - ts-node + dev: true /jiti@1.21.0: resolution: {integrity: sha512-gFqAIbuKyyso/3G2qhiO2OM6shY6EPP/R0+mkDbyspxKazh8BXDC5FiFsUjlczgdNz/vfra0da2y+aHrusLG/Q==} @@ -5832,10 +5641,6 @@ packages: dependencies: argparse: 2.0.1 - /jsbn@1.1.0: - resolution: {integrity: sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A==} - dev: false - /jsesc@2.5.2: resolution: {integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==} engines: {node: '>=4'} @@ -5885,8 +5690,12 @@ packages: resolution: {integrity: sha512-fQzRfAbIBnR0IQvftw9FJveWiHp72Fg20giDrHz6TdfB12UH/uue0D3hm57UB5KgAVuniLMCaS8P1IMj9NR7cA==} dev: false - /jsonc-parser@3.2.0: - resolution: {integrity: sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==} + /jsonc-parser@3.2.1: + resolution: {integrity: sha512-AilxAyFOAcK5wA1+LeaySVBrHsGQvUFCDWXKpZjzaL0PqW+xfBOttn8GNtWKFWqneyMZj41MWF9Kl6iPWLwgOA==} + dev: true + + /jsonc-parser@3.3.1: + resolution: {integrity: sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ==} dev: true /jsonfile@6.1.0: @@ -5902,8 +5711,8 @@ packages: engines: {'0': node >= 0.2.0} dev: true - /jsonrepair@3.7.0: - resolution: {integrity: sha512-TwE50n4P4gdVfMQF2q+X+IGy4ntFfcuHHE8zjRyBcdtrRK0ORZsjOZD6zmdylk4p277nQBAlHgsEPWtMIQk4LQ==} + /jsonrepair@3.8.1: + resolution: {integrity: sha512-5wnjaO53EJOhfLFY92nvBz2B9gqF9ql/D4HKUb1WOSBaqtVcAifFfmurblnhCJn/ySqKFA8U3n7nhGMAu/hEjQ==} hasBin: true dev: false @@ -6233,24 +6042,14 @@ packages: dependencies: yallist: 4.0.0 - /lru-cache@7.18.3: - resolution: {integrity: sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==} - engines: {node: '>=12'} - dev: false - - /macos-release@2.5.1: - resolution: {integrity: sha512-DXqXhEM7gW59OjZO8NIjBCz9AQ1BEMrfiOAl4AYByHCtVHRF4KoGNO8mqQeM8lRCtQe/UnJ4imO/d2HdkKsd+A==} - engines: {node: '>=6'} - dev: true - /magic-string@0.25.7: resolution: {integrity: sha512-4CrMT5DOHTDk4HYDlzmwu4FVCcIYI8gauveasrdCu2IKIFOJ3f0v/8MDGJCDL9oD2ppz/Av1b0Nj345H9M+XIA==} dependencies: sourcemap-codec: 1.4.8 dev: false - /magic-string@0.30.0: - resolution: {integrity: sha512-LA+31JYDJLs82r2ScLrlz1GjSgu66ZV518eyWT+S8VhyQn/JL0u9MeBOvQMGYiPk1DBiSN9DDMOcXvigJZaViQ==} + /magic-string@0.30.8: + resolution: {integrity: sha512-ISQTe55T2ao7XtlAStud6qwYPZjE4GK1S/BeVPus4jrq6JuOnQ00YKQC581RWhR122W7msZV263KzVeLoqidyQ==} engines: {node: '>=12'} dependencies: '@jridgewell/sourcemap-codec': 1.4.15 @@ -6266,36 +6065,11 @@ packages: resolution: {integrity: sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==} engines: {node: '>=10'} dependencies: - semver: 7.6.0 + semver: 7.6.3 /make-error@1.3.6: resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} - /make-fetch-happen@10.2.1: - resolution: {integrity: sha512-NgOPbRiaQM10DYXvN3/hhGVI2M5MtITFryzBGxHM5p4wnFxsVCbxkrBrDsk+EZ5OB4jEOT7AjDxtdF+KVEFT7w==} - engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} - dependencies: - agentkeepalive: 4.5.0 - cacache: 16.1.3 - http-cache-semantics: 4.1.1 - http-proxy-agent: 5.0.0 - https-proxy-agent: 5.0.1 - is-lambda: 1.0.1 - lru-cache: 7.18.3 - minipass: 3.3.6 - minipass-collect: 1.0.2 - minipass-fetch: 2.1.2 - minipass-flush: 1.0.5 - minipass-pipeline: 1.2.4 - negotiator: 0.6.3 - promise-retry: 2.0.1 - socks-proxy-agent: 7.0.0 - ssri: 9.0.1 - transitivePeerDependencies: - - bluebird - - supports-color - dev: false - /makeerror@1.0.12: resolution: {integrity: sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==} dependencies: @@ -6434,11 +6208,6 @@ packages: resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} engines: {node: '>=6'} - /mimic-fn@4.0.0: - resolution: {integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==} - engines: {node: '>=12'} - dev: true - /min-indent@1.0.1: resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==} engines: {node: '>=4'} @@ -6452,23 +6221,15 @@ packages: /minimatch@5.1.6: resolution: {integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==} engines: {node: '>=10'} - dependencies: - brace-expansion: 2.0.1 - dev: false - - /minimatch@8.0.4: - resolution: {integrity: sha512-W0Wvr9HyFXZRGIDgCicunpQ299OKXs9RgZfaukz4qAW/pJhcpUfupc9c+OObPOFueNy8VSrZgEmDtk6Kh4WzDA==} - engines: {node: '>=16 || 14 >=14.17'} dependencies: brace-expansion: 2.0.1 dev: true - /minimatch@9.0.3: - resolution: {integrity: sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==} + /minimatch@9.0.5: + resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} engines: {node: '>=16 || 14 >=14.17'} dependencies: brace-expansion: 2.0.1 - dev: false /minimist-options@4.1.0: resolution: {integrity: sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==} @@ -6486,56 +6247,12 @@ packages: /minimist@1.2.8: resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} - /minipass-collect@1.0.2: - resolution: {integrity: sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==} - engines: {node: '>= 8'} - dependencies: - minipass: 3.3.6 - dev: false - - /minipass-fetch@2.1.2: - resolution: {integrity: sha512-LT49Zi2/WMROHYoqGgdlQIZh8mLPZmOrN2NdJjMXxYe4nkN6FUyuPuOAOedNJDrx0IRGg9+4guZewtp8hE6TxA==} - engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} - dependencies: - minipass: 3.3.6 - minipass-sized: 1.0.3 - minizlib: 2.1.2 - optionalDependencies: - encoding: 0.1.13 - dev: false - - /minipass-flush@1.0.5: - resolution: {integrity: sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==} - engines: {node: '>= 8'} - dependencies: - minipass: 3.3.6 - dev: false - - /minipass-pipeline@1.2.4: - resolution: {integrity: sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==} - engines: {node: '>=8'} - dependencies: - minipass: 3.3.6 - dev: false - - /minipass-sized@1.0.3: - resolution: {integrity: sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==} - engines: {node: '>=8'} - dependencies: - minipass: 3.3.6 - dev: false - /minipass@3.3.6: resolution: {integrity: sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==} engines: {node: '>=8'} dependencies: yallist: 4.0.0 - /minipass@4.2.8: - resolution: {integrity: sha512-fNzuVyifolSLFL4NzpF+wEF4qrgqaaKX0haXPQEdQ7NKAN+WecoKMHV09YcuL/DHxrUsYQOK3MiuDf7Ip2OXfQ==} - engines: {node: '>=8'} - dev: true - /minipass@5.0.0: resolution: {integrity: sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==} engines: {node: '>=8'} @@ -6543,6 +6260,11 @@ packages: /minipass@7.0.4: resolution: {integrity: sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==} engines: {node: '>=16 || 14 >=14.17'} + dev: false + + /minipass@7.1.2: + resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} + engines: {node: '>=16 || 14 >=14.17'} /minizlib@2.1.2: resolution: {integrity: sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==} @@ -6604,9 +6326,10 @@ packages: resolution: {integrity: sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==} dev: true - /nan@2.19.0: - resolution: {integrity: sha512-nO1xXxfh/RWNxfd/XPfbIfFk5vgLsAxUR9y5O0cHMJu/AW9U95JLXqthYHjEp+8gQ5p96K9jUp8nbVOxCdRbtw==} - dev: false + /mute-stream@1.0.0: + resolution: {integrity: sha512-avsJQhyd+680gKXyG/sQc0nXaC6rBkPOfyHYcFb9+hdkqQkR9bdnkJ0AMZhke0oesPqIO+mFFJ+IdBc7mst4IA==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + dev: true /nanoid@3.3.7: resolution: {integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==} @@ -6614,24 +6337,15 @@ packages: hasBin: true dev: false - /natural-compare-lite@1.4.0: - resolution: {integrity: sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==} - dev: true - /natural-compare@1.4.0: resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} - /negotiator@0.6.3: - resolution: {integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==} - engines: {node: '>= 0.6'} - dev: false - /neo-async@2.6.2: resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} dev: true - /nestjs-cls@4.2.0(@nestjs/common@10.0.0)(@nestjs/core@10.0.0)(reflect-metadata@0.1.13)(rxjs@7.8.1): - resolution: {integrity: sha512-sdvdhBmM9eb9d1URtcK7642S3ufD9ZWaKRt4Ouf1gIGmd73YniiKCxxOFwChRqDU+sr7hwxT560JaA27R/7RJQ==} + /nestjs-cls@4.4.1(@nestjs/common@10.4.4)(@nestjs/core@10.4.4)(reflect-metadata@0.2.2)(rxjs@7.8.1): + resolution: {integrity: sha512-4yhldwm/cJ02lQ8ZAdM8KQ7gMfjAc1z3fo5QAQgXNyN4N6X5So9BCwv+BTLRugDCkELUo3qtzQHnKhGYL/ftPg==} engines: {node: '>=16'} peerDependencies: '@nestjs/common': '> 7.0.0 < 11' @@ -6639,37 +6353,37 @@ packages: reflect-metadata: '*' rxjs: '>= 7' dependencies: - '@nestjs/common': 10.0.0(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.1.13)(rxjs@7.8.1) - '@nestjs/core': 10.0.0(@nestjs/common@10.0.0)(reflect-metadata@0.1.13)(rxjs@7.8.1) - reflect-metadata: 0.1.13 + '@nestjs/common': 10.4.4(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.2)(rxjs@7.8.1) + '@nestjs/core': 10.4.4(@nestjs/common@10.4.4)(reflect-metadata@0.2.2)(rxjs@7.8.1) + reflect-metadata: 0.2.2 rxjs: 7.8.1 dev: false - /nestjs-oauth2@0.0.7(@nestjs/common@10.0.0)(rxjs@7.8.1): + /nestjs-oauth2@0.0.7(@nestjs/common@10.4.4)(rxjs@7.8.1): resolution: {integrity: sha512-P4HfJziGsMl4+aTclr9vkqfbI84odja1kOjKZw095A+b4ksVczOC4J/AH4BydsIAPVsj/5RJj4aGFoWV90Bu1w==} peerDependencies: '@nestjs/common': ^9.0.0 rxjs: ^7.x dependencies: - '@golevelup/nestjs-modules': 0.6.1(@nestjs/common@10.0.0)(rxjs@7.8.1) - '@nestjs/common': 10.0.0(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.1.13)(rxjs@7.8.1) + '@golevelup/nestjs-modules': 0.6.1(@nestjs/common@10.4.4)(rxjs@7.8.1) + '@nestjs/common': 10.4.4(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.2)(rxjs@7.8.1) oauth: 0.10.0 rxjs: 7.8.1 dev: false - /nestjs-pino@4.0.0(@nestjs/common@10.0.0)(pino-http@9.0.0): - resolution: {integrity: sha512-XhCg/R+l3w0BFP6MHyR6lU/BHVEV0tV9z24G0vuA9FD3sv+TQNvnO9uVsF1l/oVspgGfQ9Qulmb2UbsfYlI0+g==} + /nestjs-pino@4.1.0(@nestjs/common@10.4.4)(pino-http@10.3.0): + resolution: {integrity: sha512-I6zcddauD2TNMRbsraEIxNUvHcz0El5QRUYH5eY1+pBzj7R17U+Yoyypoc+akVdSLWJ1r0kDYAZPy2mlhXv6vw==} engines: {node: '>= 14'} requiresBuild: true peerDependencies: '@nestjs/common': ^8.0.0 || ^9.0.0 || ^10.0.0 - pino-http: ^6.4.0 || ^7.0.0 || ^8.0.0 || ^9.0.0 + pino-http: ^6.4.0 || ^7.0.0 || ^8.0.0 || ^9.0.0 || ^10.0.0 dependencies: - '@nestjs/common': 10.0.0(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.1.13)(rxjs@7.8.1) - pino-http: 9.0.0 + '@nestjs/common': 10.4.4(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.2)(rxjs@7.8.1) + pino-http: 10.3.0 dev: false - /nestjs-prisma@0.23.0(@nestjs/common@10.0.0)(@prisma/client@5.18.0)(prisma@5.18.0): + /nestjs-prisma@0.23.0(@nestjs/common@10.4.4)(@prisma/client@5.20.0)(prisma@5.20.0): resolution: {integrity: sha512-0pIMDasayP+vMFSztcs85zu4WSPTKM85F8vIrqn7GsUBboEcKhI8eCeVghhNyKDGzEBaNAYNJlo2MAWdNuN7Tw==} peerDependencies: '@nestjs/common': ^7.0.0 || ^8.0.0 || ^9.0.0 || ^10.0.0 @@ -6678,10 +6392,10 @@ packages: dependencies: '@angular-devkit/core': 13.3.11 '@angular-devkit/schematics': 13.3.11 - '@nestjs/common': 10.0.0(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.1.13)(rxjs@7.8.1) - '@prisma/client': 5.18.0(prisma@5.18.0) + '@nestjs/common': 10.4.4(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.2)(rxjs@7.8.1) + '@prisma/client': 5.20.0(prisma@5.20.0) '@schematics/angular': 13.3.11 - prisma: 5.18.0 + prisma: 5.20.0 transitivePeerDependencies: - chokidar dev: false @@ -6711,27 +6425,6 @@ packages: dependencies: whatwg-url: 5.0.0 - /node-gyp@9.4.1: - resolution: {integrity: sha512-OQkWKbjQKbGkMf/xqI1jjy3oCTgMKJac58G2+bjZb3fza6gW2YrCSdMQYaoTb70crvE//Gngr4f0AgVHmqHvBQ==} - engines: {node: ^12.13 || ^14.13 || >=16} - hasBin: true - dependencies: - env-paths: 2.2.1 - exponential-backoff: 3.1.1 - glob: 7.2.3 - graceful-fs: 4.2.11 - make-fetch-happen: 10.2.1 - nopt: 6.0.0 - npmlog: 6.0.2 - rimraf: 3.0.2 - semver: 7.6.0 - tar: 6.2.0 - which: 2.0.2 - transitivePeerDependencies: - - bluebird - - supports-color - dev: false - /node-int64@0.4.0: resolution: {integrity: sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==} @@ -6746,14 +6439,6 @@ packages: abbrev: 1.1.1 dev: false - /nopt@6.0.0: - resolution: {integrity: sha512-ZwLpbTgdhuZUnZzjd7nb1ZV+4DoiC6/sfiVKok72ym/4Tlf+DFdlHYmT2JPmcNNWV6Pi3SDf1kT+A4r9RTuT9g==} - engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} - hasBin: true - dependencies: - abbrev: 1.1.1 - dev: false - /normalize-package-data@2.5.0: resolution: {integrity: sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==} dependencies: @@ -6768,7 +6453,7 @@ packages: dependencies: hosted-git-info: 4.1.0 is-core-module: 2.13.1 - semver: 7.6.0 + semver: 7.6.3 validate-npm-package-license: 3.0.4 dev: true @@ -6789,13 +6474,6 @@ packages: dependencies: path-key: 3.1.1 - /npm-run-path@5.3.0: - resolution: {integrity: sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - dependencies: - path-key: 4.0.0 - dev: true - /npmlog@5.0.1: resolution: {integrity: sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==} dependencies: @@ -6805,16 +6483,6 @@ packages: set-blocking: 2.0.0 dev: false - /npmlog@6.0.2: - resolution: {integrity: sha512-/vBvz5Jfr9dT/aFWd0FIRf+T/Q2WBsLENygUaFUqstqsycmZAP/t5BvFJTK0viFmSUxiUKTUplWy5vt+rvKIxg==} - engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} - dependencies: - are-we-there-yet: 3.0.1 - console-control-strings: 1.1.0 - gauge: 4.0.4 - set-blocking: 2.0.0 - dev: false - /number-is-nan@1.0.1: resolution: {integrity: sha512-4jbtZXNAsfZbAHiiqjLPBiCl16dES1zI4Hpzzxw61Tk+loF+sBDBKx1ICKKKwIqQ7M0mFn1TmkN7euSncWgHiQ==} engines: {node: '>=0.10.0'} @@ -6866,13 +6534,6 @@ packages: dependencies: mimic-fn: 2.1.0 - /onetime@6.0.0: - resolution: {integrity: sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==} - engines: {node: '>=12'} - dependencies: - mimic-fn: 4.0.0 - dev: true - /openapi-fuzzer-core@1.0.6: resolution: {integrity: sha512-FJNJIfgUFuv4NmVGq9MYdoKra2GrkDy2uhIjE2YGlw30UA1glf4SXLMhI4UwdcJ8jisKdIxi7lXrfej8GvNW5w==} dependencies: @@ -6924,24 +6585,11 @@ packages: lcid: 1.0.0 dev: false - /os-name@4.0.1: - resolution: {integrity: sha512-xl9MAoU97MH1Xt5K9ERft2YfCAoaO6msy1OBA0ozxEC0x0TmIoE6K3QvgJMMZA9yKGLmHXNY/YZoDbiGDj4zYw==} - engines: {node: '>=10'} - dependencies: - macos-release: 2.5.1 - windows-release: 4.0.0 - dev: true - /os-tmpdir@1.0.2: resolution: {integrity: sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==} engines: {node: '>=0.10.0'} dev: true - /p-is-promise@3.0.0: - resolution: {integrity: sha512-Wo8VsW4IRQSKVXsJCn7TomUaVtyfjVDn3nUP7kE967BQk0CwFpdbZs0X0uk5sW9mkBa9eNM7hCMaG93WUAwxYQ==} - engines: {node: '>=8'} - dev: false - /p-limit@1.3.0: resolution: {integrity: sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==} engines: {node: '>=4'} @@ -7002,13 +6650,6 @@ packages: p-limit: 4.0.0 dev: true - /p-map@4.0.0: - resolution: {integrity: sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==} - engines: {node: '>=10'} - dependencies: - aggregate-error: 3.1.0 - dev: false - /p-try@1.0.0: resolution: {integrity: sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww==} engines: {node: '>=4'} @@ -7018,12 +6659,15 @@ packages: resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} engines: {node: '>=6'} - /pactum-matchers@1.1.6: - resolution: {integrity: sha512-55io32NeOKbLpHKKPzYDOr+N2dseTzMbj1Gj1y+zvOkKK6NDf5BT5pxglfqLN/ra3ig5zvbrKFUqZIWjAWboog==} + /package-json-from-dist@1.0.1: + resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==} + + /pactum-matchers@1.1.7: + resolution: {integrity: sha512-RqwewcUje6vhcYQGbPfdSXkcp/Vtwn4WmmTWLSmqp0CGxBroCEqRg3JMIjkjQTZCd2VmG+tTcQw+n4P/iuqv3Q==} dev: true - /pactum@3.6.3: - resolution: {integrity: sha512-iAizqD9sgJsVVKm0sBzDm2ZjqBMJBr/ZTbKOYawfT014EsoSIzuHIsolpslRKsHlru6MFwlg530XrEpaBmElrA==} + /pactum@3.7.1: + resolution: {integrity: sha512-r+R1dMy2MfRCQpAHohMyICusiMz14t0E+bhnLDScl2x4lXJKQAvQUGV/WWKUUxN2DS0Jdm0PUj6KjblfcSk1GA==} engines: {node: '>=10'} dependencies: '@exodus/schemasafe': 1.3.0 @@ -7033,7 +6677,7 @@ packages: klona: 2.0.6 lightcookie: 1.0.25 openapi-fuzzer-core: 1.0.6 - pactum-matchers: 1.1.6 + pactum-matchers: 1.1.7 parse-graphql: 1.0.0 phin: 3.7.0 polka: 0.5.2 @@ -7150,23 +6794,22 @@ packages: resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} engines: {node: '>=8'} - /path-key@4.0.0: - resolution: {integrity: sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==} - engines: {node: '>=12'} - dev: true - /path-parse@1.0.7: resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} - /path-scurry@1.10.1: - resolution: {integrity: sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ==} - engines: {node: '>=16 || 14 >=14.17'} + /path-scurry@1.11.1: + resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==} + engines: {node: '>=16 || 14 >=14.18'} dependencies: lru-cache: 10.2.0 - minipass: 7.0.4 + minipass: 7.1.2 /path-to-regexp@3.2.0: resolution: {integrity: sha512-jczvQbCUS7XmS7o+y1aEO9OBVFeZBQ1MDSEqmO7xSoPgOPoowY/SxLpZ6Vh97/8qHZOteiCKb7gkG9gA2ZUxJA==} + dev: false + + /path-to-regexp@3.3.0: + resolution: {integrity: sha512-qyCH421YQPS2WFDxDjftfc1ZR5WKQzVzqsp4n9M2kQhVOo/ByahFoUNJfl58kOcEGfQ//7weFTDhm+ss8Ecxgw==} /path-to-regexp@6.2.1: resolution: {integrity: sha512-JLyh7xT1kizaEvcaXOQwOc2/Yhw6KZOvPf1S8401UyLk86CU79LN3vl7ztXGm/pZ+YjoyAJ4rxmHwbkBXJX+yw==} @@ -7220,6 +6863,11 @@ packages: resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} engines: {node: '>=8.6'} + /picomatch@4.0.1: + resolution: {integrity: sha512-xUXwsxNjwTQ8K3GnT4pCJm+xq3RUPQbmkYJTP5aFIfNIvbcc/4MUxgBaaRSZJ6yGJZiGSyYlM6MzwTsRk8SYCg==} + engines: {node: '>=12'} + dev: true + /pify@2.3.0: resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==} engines: {node: '>=0.10.0'} @@ -7248,22 +6896,29 @@ packages: split2: 4.2.0 dev: false - /pino-http@9.0.0: - resolution: {integrity: sha512-Q9QDNEz0vQmbJtMFjOVr2c9yL92vHudjmr3s3m6J1hbw3DBGFZJm3TIj9TWyynZ4GEsEA9SOtni4heRUr6lNOg==} + /pino-abstract-transport@1.2.0: + resolution: {integrity: sha512-Guhh8EZfPCfH+PMXAb6rKOjGQEoy0xlAIn+irODG5kgfYV+BQ0rGYYWTIel3P5mmyXqkYkPmdIkywsn6QKUR1Q==} + dependencies: + readable-stream: 4.5.2 + split2: 4.2.0 + dev: false + + /pino-http@10.3.0: + resolution: {integrity: sha512-kaHQqt1i5S9LXWmyuw6aPPqYW/TjoDPizPs4PnDW4hSpajz2Uo/oisNliLf7We1xzpiLacdntmw8yaZiEkppQQ==} dependencies: get-caller-file: 2.0.5 - pino: 8.18.0 - pino-std-serializers: 6.2.2 - process-warning: 3.0.0 + pino: 9.4.0 + pino-std-serializers: 7.0.0 + process-warning: 4.0.0 dev: false - /pino-pretty@10.3.1: - resolution: {integrity: sha512-az8JbIYeN/1iLj2t0jR9DV48/LQ3RC6hZPpapKPkb84Q+yTidMCpgWxIT3N0flnBDilyBQ1luWNpOeJptjdp/g==} + /pino-pretty@11.2.2: + resolution: {integrity: sha512-2FnyGir8nAJAqD3srROdrF1J5BIcMT4nwj7hHSc60El6Uxlym00UbCCd8pYIterstVBFlMyF1yFV8XdGIPbj4A==} hasBin: true dependencies: colorette: 2.0.20 dateformat: 4.6.3 - fast-copy: 3.0.1 + fast-copy: 3.0.2 fast-safe-stringify: 2.1.1 help-me: 5.0.0 joycon: 3.1.1 @@ -7273,7 +6928,7 @@ packages: pump: 3.0.0 readable-stream: 4.5.2 secure-json-parse: 2.7.0 - sonic-boom: 3.8.0 + sonic-boom: 4.1.0 strip-json-comments: 3.1.1 dev: false @@ -7281,6 +6936,10 @@ packages: resolution: {integrity: sha512-cHjPPsE+vhj/tnhCy/wiMh3M3z3h/j15zHQX+S9GkTBgqJuTuJzYJ4gUyACLhDaJ7kk9ba9iRDmbH2tJU03OiA==} dev: false + /pino-std-serializers@7.0.0: + resolution: {integrity: sha512-e906FRY0+tV27iq4juKzSYPbUj2do2X2JX4EzSca1631EB2QJQUqGbDuERal7LCtOpxl6x3+nvo9NPZcmjkiFA==} + dev: false + /pino@8.18.0: resolution: {integrity: sha512-Mz/gKiRyuXu4HnpHgi1YWdHQCoWMufapzooisvFn78zl4dZciAxS+YeRkUxXl1ee/SzU80YCz1zpECCh4oC6Aw==} hasBin: true @@ -7298,6 +6957,23 @@ packages: thread-stream: 2.4.1 dev: false + /pino@9.4.0: + resolution: {integrity: sha512-nbkQb5+9YPhQRz/BeQmrWpEknAaqjpAqRK8NwJpmrX/JHu7JuZC5G1CeAwJDJfGes4h+YihC6in3Q2nGb+Y09w==} + hasBin: true + dependencies: + atomic-sleep: 1.0.0 + fast-redact: 3.3.0 + on-exit-leak-free: 2.1.2 + pino-abstract-transport: 1.2.0 + pino-std-serializers: 7.0.0 + process-warning: 4.0.0 + quick-format-unescaped: 4.0.4 + real-require: 0.2.0 + safe-stable-stringify: 2.4.3 + sonic-boom: 4.1.0 + thread-stream: 3.1.0 + dev: false + /pirates@4.0.6: resolution: {integrity: sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==} engines: {node: '>= 6'} @@ -7358,8 +7034,8 @@ packages: hasBin: true dev: true - /prettier@3.0.0: - resolution: {integrity: sha512-zBf5eHpwHOGPC47h0zrPyNn+eAEIdEzfywMoYn2XPi0P44Zp0tSq64rq0xAREh4auw2cJZHo9QUob+NqCQky4g==} + /prettier@3.3.3: + resolution: {integrity: sha512-i2tDNA0O5IrMO757lfrdQZCc2jPNDVntV0m/+4whiDfWaTKfMNgR7Qz0NAeGz/nRqF4m5/6CLzbP4/liHt12Ew==} engines: {node: '>=14'} hasBin: true dev: true @@ -7372,32 +7048,34 @@ packages: ansi-styles: 5.2.0 react-is: 18.2.0 - /prisma-nested-middleware@4.0.0(@prisma/client@5.18.0): + /prisma-nested-middleware@4.0.0(@prisma/client@5.20.0): resolution: {integrity: sha512-WSx0nl7KNXEzGaNC87fuDBOdAjj3V6um/JoQUo24PaMzMy8tvOYfb2Mw25OZhnrMXNTBhqgk4rJTUW3CVcDsHQ==} peerDependencies: '@prisma/client': '*' dependencies: '@open-draft/deferred-promise': 2.2.0 - '@prisma/client': 5.18.0(prisma@5.18.0) + '@prisma/client': 5.20.0(prisma@5.20.0) lodash: 4.17.21 dev: false - /prisma-soft-delete-middleware@1.3.1(@prisma/client@5.18.0): + /prisma-soft-delete-middleware@1.3.1(@prisma/client@5.20.0): resolution: {integrity: sha512-oQ2Ba8wb23ho6PqMXkOSTQTXNKouLmZuILYDHrnKk1Ui3cGIXuj9zNWyJkoaTcWHznsiAaoP1Oy8ytDhwQNQqA==} peerDependencies: '@prisma/client': '*' dependencies: - '@prisma/client': 5.18.0(prisma@5.18.0) - prisma-nested-middleware: 4.0.0(@prisma/client@5.18.0) + '@prisma/client': 5.20.0(prisma@5.20.0) + prisma-nested-middleware: 4.0.0(@prisma/client@5.20.0) dev: false - /prisma@5.18.0: - resolution: {integrity: sha512-+TrSIxZsh64OPOmaSgVPH7ALL9dfU0jceYaMJXsNrTkFHO7/3RANi5K2ZiPB1De9+KDxCWn7jvRq8y8pvk+o9g==} + /prisma@5.20.0: + resolution: {integrity: sha512-6obb3ucKgAnsGS9x9gLOe8qa51XxvJ3vLQtmyf52CTey1Qcez3A6W6ROH5HIz5Q5bW+0VpmZb8WBohieMFGpig==} engines: {node: '>=16.13'} hasBin: true requiresBuild: true dependencies: - '@prisma/engines': 5.18.0 + '@prisma/engines': 5.20.0 + optionalDependencies: + fsevents: 2.3.3 /process-nextick-args@1.0.7: resolution: {integrity: sha512-yN0WQmuCX63LP/TMvAg31nvT6m4vDqJEiiv2CAZqWOGNWutc9DfDk1NPYYmKUFmaVM2UwDowH4u5AHWYP/jxKw==} @@ -7410,6 +7088,10 @@ packages: resolution: {integrity: sha512-mqn0kFRl0EoqhnL0GQ0veqFHyIN1yig9RHh/InzORTUiZHFRAur+aMtRkELNwGs9aNwKS6tg/An4NYBPGwvtzQ==} dev: false + /process-warning@4.0.0: + resolution: {integrity: sha512-/MyYDxttz7DfGMMHiysAsFE4qF+pQYAA8ziO/3NcRVrQ5fSk+Mns4QZA/oRPFzvcqNoVJXQNWNAsdwBXLUkQKw==} + dev: false + /process@0.11.10: resolution: {integrity: sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==} engines: {node: '>= 0.6.0'} @@ -7420,23 +7102,6 @@ packages: engines: {node: '>=16'} dev: false - /promise-inflight@1.0.1: - resolution: {integrity: sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==} - peerDependencies: - bluebird: '*' - peerDependenciesMeta: - bluebird: - optional: true - dev: false - - /promise-retry@2.0.1: - resolution: {integrity: sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==} - engines: {node: '>=10'} - dependencies: - err-code: 2.0.3 - retry: 0.12.0 - dev: false - /prompts@2.4.2: resolution: {integrity: sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==} engines: {node: '>= 6'} @@ -7461,6 +7126,7 @@ packages: dependencies: end-of-stream: 1.4.4 once: 1.4.0 + dev: false /pumpify@2.0.1: resolution: {integrity: sha512-m7KOje7jZxrmutanlkS1daj1dS6z6BgslzOXmcSEpIlCxM3VJH7lG5QLeck/6hgF6F4crFf01UtQmNsJfweTAw==} @@ -7635,13 +7301,6 @@ packages: engines: {node: '>= 12.13.0'} dev: false - /rechoir@0.6.2: - resolution: {integrity: sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==} - engines: {node: '>= 0.10'} - dependencies: - resolve: 1.22.8 - dev: true - /redent@3.0.0: resolution: {integrity: sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==} engines: {node: '>=8'} @@ -7650,8 +7309,8 @@ packages: strip-indent: 3.0.0 dev: true - /reflect-metadata@0.1.13: - resolution: {integrity: sha512-Ts1Y/anZELhSsjMcU605fU9RE4Oi3p5ORujwbIKXfWa+0Zxs510Qrmrce5/Jowq3cHSZSJqBjypxmHarc+vEWg==} + /reflect-metadata@0.2.2: + resolution: {integrity: sha512-urBwgfrvVP/eAyXx4hluJivBKzuEbSQs9rKWCrCkbSxNv8mxPcUZKeuoF3Uy4mJl3Lwprp6yy5/39VWigZ4K6Q==} /regex-cache@0.4.4: resolution: {integrity: sha512-nVIZwtCjkC9YgvWkpM55B5rBhBYRZhAaJbgcFYXXsHnbZ9UZI9nnVWYZpBlCqv9ho2eZryPnWrZGsOdPwVWXWQ==} @@ -7742,11 +7401,6 @@ packages: engines: {node: '>=4'} dev: false - /retry@0.12.0: - resolution: {integrity: sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==} - engines: {node: '>= 4'} - dev: false - /reusify@1.0.4: resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} engines: {iojs: '>=1.0.0', node: '>=0.10.0'} @@ -7760,20 +7414,18 @@ packages: hasBin: true dependencies: glob: 7.2.3 - - /rimraf@4.4.1: - resolution: {integrity: sha512-Gk8NlF062+T9CqNGn6h4tls3k6T1+/nXdOcSZVikNVtlRdYpA7wRJJMoXmuvOnLW844rPjdQ7JgXCYM6PPC/og==} - engines: {node: '>=14'} - hasBin: true - dependencies: - glob: 9.3.5 - dev: true + dev: false /run-async@2.4.1: resolution: {integrity: sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==} engines: {node: '>=0.12.0'} dev: true + /run-async@3.0.0: + resolution: {integrity: sha512-540WwVDOMxA6dN6We19EcT9sc3hkXPw5mzRNGM3FkdN/vtE9NFvj5lFAPNwUDmJjXidm3v7TC1cTE7t17Ulm1Q==} + engines: {node: '>=0.12.0'} + dev: true + /run-parallel@1.2.0: resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} dependencies: @@ -7811,6 +7463,7 @@ packages: /safer-buffer@2.1.2: resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} + dev: true /schema-utils@3.3.0: resolution: {integrity: sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==} @@ -7840,6 +7493,11 @@ packages: dependencies: lru-cache: 6.0.0 + /semver@7.6.3: + resolution: {integrity: sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==} + engines: {node: '>=10'} + hasBin: true + /serialize-javascript@6.0.2: resolution: {integrity: sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==} dependencies: @@ -7880,21 +7538,11 @@ packages: resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} engines: {node: '>=8'} - /shelljs@0.8.5: - resolution: {integrity: sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==} - engines: {node: '>=4'} - hasBin: true - dependencies: - glob: 7.2.3 - interpret: 1.4.0 - rechoir: 0.6.2 - dev: true - /side-channel@1.0.5: resolution: {integrity: sha512-QcgiIWV4WV7qWExbN5llt6frQB/lBven9pqliLXfGPB+K9ZYXxDozp0wLkHS24kWCm+6YXH/f0HhnObZnZOBnQ==} engines: {node: '>= 0.4'} dependencies: - call-bind: 1.0.6 + call-bind: 1.0.7 es-errors: 1.3.0 get-intrinsic: 1.2.4 object-inspect: 1.13.1 @@ -7914,32 +7562,14 @@ packages: resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} engines: {node: '>=8'} - /smart-buffer@4.2.0: - resolution: {integrity: sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==} - engines: {node: '>= 6.0.0', npm: '>= 3.0.0'} - dev: false - - /socks-proxy-agent@7.0.0: - resolution: {integrity: sha512-Fgl0YPZ902wEsAyiQ+idGd1A7rSFx/ayC1CQVMw5P+EQx2V0SgpGtf6OKFhVjPflPUl9YMmEOnmfjCdMUsygww==} - engines: {node: '>= 10'} - dependencies: - agent-base: 6.0.2 - debug: 4.3.4 - socks: 2.8.3 - transitivePeerDependencies: - - supports-color - dev: false - - /socks@2.8.3: - resolution: {integrity: sha512-l5x7VUUWbjVFbafGLxPWkYsHIhEvmF85tbIeFZWc8ZPtoMyybuEhL7Jye/ooC4/d48FgOjSJXgsF/AJPYCW8Zw==} - engines: {node: '>= 10.0.0', npm: '>= 3.0.0'} + /sonic-boom@3.8.0: + resolution: {integrity: sha512-ybz6OYOUjoQQCQ/i4LU8kaToD8ACtYP+Cj5qd2AO36bwbdewxWJ3ArmJ2cr6AvxlL2o0PqnCcPGUgkILbfkaCA==} dependencies: - ip-address: 9.0.5 - smart-buffer: 4.2.0 + atomic-sleep: 1.0.0 dev: false - /sonic-boom@3.8.0: - resolution: {integrity: sha512-ybz6OYOUjoQQCQ/i4LU8kaToD8ACtYP+Cj5qd2AO36bwbdewxWJ3ArmJ2cr6AvxlL2o0PqnCcPGUgkILbfkaCA==} + /sonic-boom@4.1.0: + resolution: {integrity: sha512-NGipjjRicyJJ03rPiZCJYjwlsuP2d1/5QUviozRXC7S3WdVWNK5e3Ojieb9CCyfhq2UC+3+SRd9nG3I2lPRvUw==} dependencies: atomic-sleep: 1.0.0 dev: false @@ -8029,17 +7659,6 @@ packages: /sprintf-js@1.0.3: resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} - /sprintf-js@1.1.3: - resolution: {integrity: sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==} - dev: false - - /ssri@9.0.1: - resolution: {integrity: sha512-o57Wcn66jMQvfHG1FlYbWeZWW/dHZhJXjpIcTfXldXEk5nz5lStPo3mK0OJQfGR3RbZUlbISexbljkJzuEj/8Q==} - engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} - dependencies: - minipass: 3.3.6 - dev: false - /stack-utils@2.0.6: resolution: {integrity: sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==} engines: {node: '>=10'} @@ -8112,7 +7731,6 @@ packages: eastasianwidth: 0.2.0 emoji-regex: 9.2.2 strip-ansi: 7.1.0 - dev: false /string_decoder@0.10.31: resolution: {integrity: sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==} @@ -8151,7 +7769,6 @@ packages: engines: {node: '>=12'} dependencies: ansi-regex: 6.0.1 - dev: false /strip-bom-stream@1.0.0: resolution: {integrity: sha512-7jfJB9YpI2Z0aH3wu10ZqitvYJaE0s5IzFuWE+0pbb4Q/armTloEUShymkDO47YSLnjAW52mlXT//hs9wXNNJQ==} @@ -8181,11 +7798,6 @@ packages: resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} engines: {node: '>=6'} - /strip-final-newline@3.0.0: - resolution: {integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==} - engines: {node: '>=12'} - dev: true - /strip-indent@3.0.0: resolution: {integrity: sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==} engines: {node: '>=8'} @@ -8252,8 +7864,8 @@ packages: resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} engines: {node: '>= 0.4'} - /swagger-ui-dist@5.11.2: - resolution: {integrity: sha512-jQG0cRgJNMZ7aCoiFofnoojeSaa/+KgWaDlfgs8QN+BXoGMpxeMVY5OEnjq4OlNvF3yjftO8c9GRAgcHlO+u7A==} + /swagger-ui-dist@5.17.14: + resolution: {integrity: sha512-CVbSfaLpstV65OnSjbXfVd6Sta3q3F7Cj/yYuvHMp1P90LztOLs6PfUnKEVAeiIVQt9u2SaPwv0LiH/OyMjHRw==} dev: false /symbol-observable@4.0.0: @@ -8265,12 +7877,12 @@ packages: resolution: {integrity: sha512-IUW+ek7apEaW5bFhS6WpYoNtVpNTlNoqB/PH7YiMWQTxSPeXCzG4PILVakwXivJt3ZXWeO1fIJnUd/L9A/VeGA==} dev: false - /synckit@0.8.8: - resolution: {integrity: sha512-HwOKAP7Wc5aRGYdKH+dw0PRRpbO841v2DENBtjnR5HFWoiNByAl7vrx3p0G/rCyYXQsrxqtX48TImFtPcIHSpQ==} + /synckit@0.9.2: + resolution: {integrity: sha512-vrozgXDQwYO72vHjUb/HnFbQx1exDjoKzqx23aXEg2a9VIg2TSFZ8FmeZpTjUCFMYw7mpX4BE2SFu8wI7asYsw==} engines: {node: ^14.18.0 || >=16.0.0} dependencies: '@pkgr/core': 0.1.1 - tslib: 2.6.2 + tslib: 2.7.0 dev: true /tapable@2.2.1: @@ -8289,7 +7901,7 @@ packages: mkdirp: 1.0.4 yallist: 4.0.0 - /terser-webpack-plugin@5.3.10(webpack@5.87.0): + /terser-webpack-plugin@5.3.10(webpack@5.94.0): resolution: {integrity: sha512-BKFPWlPDndPs+NGGCr1U59t0XScL5317Y0UReNrHaw9/FwhPENlq6bfgs+4yPfyP51vqC1bQ4rp1EfXW5ZSH9w==} engines: {node: '>= 10.13.0'} peerDependencies: @@ -8310,31 +7922,7 @@ packages: schema-utils: 3.3.0 serialize-javascript: 6.0.2 terser: 5.27.0 - webpack: 5.87.0 - dev: true - - /terser-webpack-plugin@5.3.10(webpack@5.90.1): - resolution: {integrity: sha512-BKFPWlPDndPs+NGGCr1U59t0XScL5317Y0UReNrHaw9/FwhPENlq6bfgs+4yPfyP51vqC1bQ4rp1EfXW5ZSH9w==} - engines: {node: '>= 10.13.0'} - peerDependencies: - '@swc/core': '*' - esbuild: '*' - uglify-js: '*' - webpack: ^5.1.0 - peerDependenciesMeta: - '@swc/core': - optional: true - esbuild: - optional: true - uglify-js: - optional: true - dependencies: - '@jridgewell/trace-mapping': 0.3.22 - jest-worker: 27.5.1 - schema-utils: 3.3.0 - serialize-javascript: 6.0.2 - terser: 5.27.0 - webpack: 5.90.1 + webpack: 5.94.0 dev: true /terser@5.27.0: @@ -8343,7 +7931,7 @@ packages: hasBin: true dependencies: '@jridgewell/source-map': 0.3.5 - acorn: 8.11.3 + acorn: 8.12.1 commander: 2.20.3 source-map-support: 0.5.21 dev: true @@ -8376,6 +7964,12 @@ packages: real-require: 0.2.0 dev: false + /thread-stream@3.1.0: + resolution: {integrity: sha512-OqyPZ9u96VohAyMfJykzmivOrY2wfMSf3C5TtFJVgN+Hm6aj+voFhlK+kZEIv2FBh1X6Xp3DlnCOfEQ3B2J86A==} + dependencies: + real-require: 0.2.0 + dev: false + /through2-filter@2.0.0: resolution: {integrity: sha512-miwWajb1B80NvIVKXFPN/o7+vJc4jYUvnZCwvhicRAoTxdD9wbcjri70j+BenCrN/JXEPKDjhpw4iY7yiNsCGg==} dependencies: @@ -8420,6 +8014,10 @@ packages: os-homedir: 1.0.2 dev: false + /tinyexec@0.3.0: + resolution: {integrity: sha512-tVGE0mVJPGb0chKhqmsoosjsS+qUnJVGJpZgsHYQcGoPlG3B51R3PouqTgEGH2Dc9jjFyOqOpix6ZHNMXp1FZg==} + dev: true + /tmp@0.0.33: resolution: {integrity: sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==} engines: {node: '>=0.6.0'} @@ -8477,13 +8075,13 @@ packages: matchit: 1.1.0 dev: true - /ts-api-utils@1.2.1(typescript@5.1.3): - resolution: {integrity: sha512-RIYA36cJn2WiH9Hy77hdF9r7oEwxAtB/TS9/S4Qd90Ap4z5FSiin5zEiTL44OII1Y3IIlEvxwxFUVgrHSZ/UpA==} + /ts-api-utils@1.3.0(typescript@5.6.3): + resolution: {integrity: sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==} engines: {node: '>=16'} peerDependencies: typescript: '>=4.2.0' dependencies: - typescript: 5.1.3 + typescript: 5.6.3 dev: true /ts-jest@29.1.0(@babel/core@7.23.9)(jest@29.5.0)(typescript@5.0.4): @@ -8510,22 +8108,23 @@ packages: '@babel/core': 7.23.9 bs-logger: 0.2.6 fast-json-stable-stringify: 2.1.0 - jest: 29.5.0(@types/node@20.3.1)(ts-node@10.9.1) + jest: 29.5.0(@types/node@22.7.5)(ts-node@10.9.2) jest-util: 29.7.0 json5: 2.2.3 lodash.memoize: 4.1.2 make-error: 1.3.6 - semver: 7.6.0 + semver: 7.6.3 typescript: 5.0.4 yargs-parser: 21.1.1 dev: false - /ts-jest@29.1.0(@babel/core@7.23.9)(jest@29.5.0)(typescript@5.1.3): - resolution: {integrity: sha512-ZhNr7Z4PcYa+JjMl62ir+zPiNJfXJN6E8hSLnaUKhOgqcn8vb3e537cpkd0FuAfRK3sR1LSqM1MOhliXNgOFPA==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + /ts-jest@29.2.5(@babel/core@7.23.9)(jest@29.7.0)(typescript@5.6.3): + resolution: {integrity: sha512-KD8zB2aAZrcKIdGk4OwpJggeLcH1FgrICqDSROWqlnJXGCXK4Mn6FcdK2B6670Xr73lHMG1kHw8R87A0ecZ+vA==} + engines: {node: ^14.15.0 || ^16.10.0 || ^18.0.0 || >=20.0.0} hasBin: true peerDependencies: '@babel/core': '>=7.0.0-beta.0 <8' + '@jest/transform': ^29.0.0 '@jest/types': ^29.0.0 babel-jest: ^29.0.0 esbuild: '*' @@ -8534,6 +8133,8 @@ packages: peerDependenciesMeta: '@babel/core': optional: true + '@jest/transform': + optional: true '@jest/types': optional: true babel-jest: @@ -8543,19 +8144,20 @@ packages: dependencies: '@babel/core': 7.23.9 bs-logger: 0.2.6 + ejs: 3.1.10 fast-json-stable-stringify: 2.1.0 - jest: 29.5.0(@types/node@20.3.1)(ts-node@10.9.1) + jest: 29.7.0(@types/node@22.7.5)(ts-node@10.9.2) jest-util: 29.7.0 json5: 2.2.3 lodash.memoize: 4.1.2 make-error: 1.3.6 - semver: 7.6.0 - typescript: 5.1.3 + semver: 7.6.3 + typescript: 5.6.3 yargs-parser: 21.1.1 dev: true - /ts-loader@9.4.3(typescript@5.1.3)(webpack@5.90.1): - resolution: {integrity: sha512-n3hBnm6ozJYzwiwt5YRiJZkzktftRpMiBApHaJPoWLA+qetQBAXkHqCLM6nwSdRDimqVtA5ocIkcTRLMTt7yzA==} + /ts-loader@9.5.1(typescript@5.6.3)(webpack@5.94.0): + resolution: {integrity: sha512-rNH3sK9kGZcH9dYzC7CewQm4NtxJTjSEVRJ2DyBZR7f8/wcta+iV44UPCXc5+nzDzivKtlzV6c9P4e+oFhDLYg==} engines: {node: '>=12.0.0'} peerDependencies: typescript: '*' @@ -8565,12 +8167,13 @@ packages: enhanced-resolve: 5.15.0 micromatch: 4.0.5 semver: 7.6.0 - typescript: 5.1.3 - webpack: 5.90.1 + source-map: 0.7.4 + typescript: 5.6.3 + webpack: 5.94.0 dev: true - /ts-node@10.9.1(@types/node@20.3.1)(typescript@5.1.3): - resolution: {integrity: sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==} + /ts-node@10.9.2(@types/node@22.7.5)(typescript@5.6.3): + resolution: {integrity: sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==} hasBin: true peerDependencies: '@swc/core': '>=1.2.50' @@ -8588,14 +8191,14 @@ packages: '@tsconfig/node12': 1.0.11 '@tsconfig/node14': 1.0.3 '@tsconfig/node16': 1.0.4 - '@types/node': 20.3.1 + '@types/node': 22.7.5 acorn: 8.11.3 acorn-walk: 8.3.2 arg: 4.1.3 create-require: 1.1.1 diff: 4.0.2 make-error: 1.3.6 - typescript: 5.1.3 + typescript: 5.6.3 v8-compile-cache-lib: 3.0.1 yn: 3.1.1 @@ -8603,8 +8206,8 @@ packages: resolution: {integrity: sha512-nsZd8ZeNUzukXPlJmTBwUAuABDe/9qtVDelJeT/qW0ow3ZS3BsQJtNkan1802aM9Uf68/Y8ljw86Hu0h5IUW3w==} dev: true - /tsconfig-paths-webpack-plugin@4.0.1: - resolution: {integrity: sha512-m5//KzLoKmqu2MVix+dgLKq70MnFi8YL8sdzQZ6DblmCdfuq/y3OqvJd5vMndg2KEVCOeNz8Es4WVZhYInteLw==} + /tsconfig-paths-webpack-plugin@4.1.0: + resolution: {integrity: sha512-xWFISjviPydmtmgeUAuXp4N1fky+VCtfhOkDUFIv5ea7p4wuTomI4QTrXvFBX2S4jZsmyTSrStQl+E+4w+RzxA==} engines: {node: '>=10.13.0'} dependencies: chalk: 4.1.2 @@ -8629,12 +8232,12 @@ packages: resolution: {integrity: sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==} dev: false - /tslib@2.5.3: - resolution: {integrity: sha512-mSxlJJwl3BMEQCUNnxXBU9jP4JBktcEGhURcPR6VQVlnP0FdDEsIaz0C35dXNGLyRfrATNofF0F5p2KPxQgB+w==} - /tslib@2.6.2: resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==} + /tslib@2.7.0: + resolution: {integrity: sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA==} + /type-check@0.4.0: resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} engines: {node: '>= 0.8.0'} @@ -8651,11 +8254,6 @@ packages: engines: {node: '>=10'} dev: true - /type-fest@0.20.2: - resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} - engines: {node: '>=10'} - dev: true - /type-fest@0.21.3: resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==} engines: {node: '>=10'} @@ -8684,8 +8282,14 @@ packages: hasBin: true dev: false - /typescript@5.1.3: - resolution: {integrity: sha512-XH627E9vkeqhlZFQuL+UsyAXEnibT0kWR2FWONlr4sTjvxyJYnyefgrkyECLzM5NenmKzRAy2rR/OlYLA1HkZw==} + /typescript@5.3.3: + resolution: {integrity: sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw==} + engines: {node: '>=14.17'} + hasBin: true + dev: true + + /typescript@5.6.3: + resolution: {integrity: sha512-hjcS1mhfuyi4WW8IWtjP7brDrG2cuDZukyrYrSauoXGNgx0S7zceP07adYkJycEr56BOUTNPzbInooiN3fn1qw==} engines: {node: '>=14.17'} hasBin: true @@ -8703,25 +8307,14 @@ packages: dependencies: '@lukeed/csprng': 1.1.0 + /undici-types@6.19.8: + resolution: {integrity: sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==} + /unicorn-magic@0.1.0: resolution: {integrity: sha512-lRfVq8fE8gz6QMBuDM6a+LO3IAzTi05H6gCVaUpir2E1Rwpo4ZUog45KpNXKC/Mn3Yb9UDuHumeFTo9iV/D9FQ==} engines: {node: '>=18'} dev: true - /unique-filename@2.0.1: - resolution: {integrity: sha512-ODWHtkkdx3IAR+veKxFV+VBkUMcN+FaqzUUd7IZzt+0zhDZFPFxhlqwPF3YQvMHx1TD0tdgYl+kuPnJ8E6ql7A==} - engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} - dependencies: - unique-slug: 3.0.0 - dev: false - - /unique-slug@3.0.0: - resolution: {integrity: sha512-8EyMynh679x/0gqE9fT9oilG+qEt+ibFyqjuVTsZn1+CMxH+XLlpvr2UZx4nVcCwTpx81nICr2JQFkM+HPLq4w==} - engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} - dependencies: - imurmurhash: 0.1.4 - dev: false - /unique-stream@2.3.1: resolution: {integrity: sha512-2nY4TnBE70yoxHkDli7DMazpWiP7xMdCYqU2nBRO0UB+ZpEkGsSija7MvmvnZFUeC+mrgiUfcHSr3LmRFIg4+A==} dependencies: @@ -8762,31 +8355,9 @@ packages: engines: {node: '>= 0.4.0'} dev: false - /uuid@9.0.0: - resolution: {integrity: sha512-MXcSTerfPa4uqyzStbRoTgt5XIe3x5+42+q1sDuy3R5MDk66URdLMOZe5aPX/SQd+kuYAh0FdP/pO28IkQyTeg==} - hasBin: true - dev: false - /v8-compile-cache-lib@3.0.1: resolution: {integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==} - /v8-sandbox@3.2.10(debug@2.6.9): - resolution: {integrity: sha512-BIIohkY8ULJ63o084YCPMVItEurrH8HIiPufbTtI6AD9HXNnC6QmJTvN97CpvakRkSk0isK4a4diSmwVG2pyFQ==} - requiresBuild: true - dependencies: - async: 3.2.5 - axios: 1.7.5(debug@2.6.9) - bindings: 1.5.0 - lodash: 4.17.21 - nan: 2.19.0 - node-gyp: 9.4.1 - signal-exit: 4.1.0 - transitivePeerDependencies: - - bluebird - - debug - - supports-color - dev: false - /v8-to-istanbul@9.2.0: resolution: {integrity: sha512-/EH/sDgxU2eGxajKdwLCDmQ4FWq+kpi3uCmBGpw1xJtnAxEjlD8j8PEiGWpCIMIs3ciNAgH0d3TTJiUkYzyZjA==} engines: {node: '>=10.12.0'} @@ -8849,8 +8420,8 @@ packages: dependencies: makeerror: 1.0.12 - /watchpack@2.4.0: - resolution: {integrity: sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==} + /watchpack@2.4.2: + resolution: {integrity: sha512-TnbFSbcOCcDgjZ4piURLCbJ3nJhznVh9kw6F6iokjiFPl8ONxe9A6nMDVXDiNbrSfLILs6vB07F7wLBrwPYzJw==} engines: {node: '>=10.13.0'} dependencies: glob-to-regexp: 0.4.1 @@ -8875,48 +8446,8 @@ packages: engines: {node: '>=10.13.0'} dev: true - /webpack@5.87.0: - resolution: {integrity: sha512-GOu1tNbQ7p1bDEoFRs2YPcfyGs8xq52yyPBZ3m2VGnXGtV9MxjrkABHm4V9Ia280OefsSLzvbVoXcfLxjKY/Iw==} - engines: {node: '>=10.13.0'} - hasBin: true - peerDependencies: - webpack-cli: '*' - peerDependenciesMeta: - webpack-cli: - optional: true - dependencies: - '@types/eslint-scope': 3.7.7 - '@types/estree': 1.0.5 - '@webassemblyjs/ast': 1.11.6 - '@webassemblyjs/wasm-edit': 1.11.6 - '@webassemblyjs/wasm-parser': 1.11.6 - acorn: 8.11.3 - acorn-import-assertions: 1.9.0(acorn@8.11.3) - browserslist: 4.22.3 - chrome-trace-event: 1.0.3 - enhanced-resolve: 5.15.0 - es-module-lexer: 1.4.1 - eslint-scope: 5.1.1 - events: 3.3.0 - glob-to-regexp: 0.4.1 - graceful-fs: 4.2.11 - json-parse-even-better-errors: 2.3.1 - loader-runner: 4.3.0 - mime-types: 2.1.35 - neo-async: 2.6.2 - schema-utils: 3.3.0 - tapable: 2.2.1 - terser-webpack-plugin: 5.3.10(webpack@5.87.0) - watchpack: 2.4.0 - webpack-sources: 3.2.3 - transitivePeerDependencies: - - '@swc/core' - - esbuild - - uglify-js - dev: true - - /webpack@5.90.1: - resolution: {integrity: sha512-SstPdlAC5IvgFnhiRok8hqJo/+ArAbNv7rhU4fnWGHNVfN59HSQFaxZDSAL3IFG2YmqxuRs+IU33milSxbPlog==} + /webpack@5.94.0: + resolution: {integrity: sha512-KcsGn50VT+06JH/iunZJedYGUJS5FGjow8wb9c0v5n1Om8O1g4L6LjtfxwlXIATopoQu+vOXXa7gYisWxCoPyg==} engines: {node: '>=10.13.0'} hasBin: true peerDependencies: @@ -8925,16 +8456,15 @@ packages: webpack-cli: optional: true dependencies: - '@types/eslint-scope': 3.7.7 - '@types/estree': 1.0.5 - '@webassemblyjs/ast': 1.11.6 - '@webassemblyjs/wasm-edit': 1.11.6 - '@webassemblyjs/wasm-parser': 1.11.6 + '@types/estree': 1.0.6 + '@webassemblyjs/ast': 1.12.1 + '@webassemblyjs/wasm-edit': 1.12.1 + '@webassemblyjs/wasm-parser': 1.12.1 acorn: 8.11.3 - acorn-import-assertions: 1.9.0(acorn@8.11.3) + acorn-import-attributes: 1.9.5(acorn@8.11.3) browserslist: 4.22.3 chrome-trace-event: 1.0.3 - enhanced-resolve: 5.15.0 + enhanced-resolve: 5.17.1 es-module-lexer: 1.4.1 eslint-scope: 5.1.1 events: 3.3.0 @@ -8946,8 +8476,8 @@ packages: neo-async: 2.6.2 schema-utils: 3.3.0 tapable: 2.2.1 - terser-webpack-plugin: 5.3.10(webpack@5.90.1) - watchpack: 2.4.0 + terser-webpack-plugin: 5.3.10(webpack@5.94.0) + watchpack: 2.4.2 webpack-sources: 3.2.3 transitivePeerDependencies: - '@swc/core' @@ -8987,13 +8517,6 @@ packages: hasBin: true dev: false - /windows-release@4.0.0: - resolution: {integrity: sha512-OxmV4wzDKB1x7AZaZgXMVsdJ1qER1ed83ZrTYd5Bwq2HfJVg3DJS8nqlAG4sMoJ7mu8cuRmLEYyU13BKwctRAg==} - engines: {node: '>=10'} - dependencies: - execa: 4.1.0 - dev: true - /word-wrap@1.2.5: resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} engines: {node: '>=0.10.0'} @@ -9011,6 +8534,15 @@ packages: strip-ansi: 3.0.1 dev: false + /wrap-ansi@6.2.0: + resolution: {integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==} + engines: {node: '>=8'} + dependencies: + ansi-styles: 4.3.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + dev: true + /wrap-ansi@7.0.0: resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} engines: {node: '>=10'} @@ -9026,7 +8558,6 @@ packages: ansi-styles: 6.2.1 string-width: 5.1.2 strip-ansi: 7.1.0 - dev: false /wrappy@1.0.2: resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} @@ -9056,13 +8587,8 @@ packages: /yallist@4.0.0: resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} - /yaml@1.10.2: - resolution: {integrity: sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==} - engines: {node: '>= 6'} - dev: true - - /yaml@2.5.0: - resolution: {integrity: sha512-2wWLbGbYDiSqqIKoPjar3MPgB94ErzCtrNE1FdqGuaO0pi2JGjmE8aW8TDZwzU7vuxcGRdL/4gPQwQ7hD5AMSw==} + /yaml@2.6.0: + resolution: {integrity: sha512-a6ae//JvKDEra2kdi1qzCyrJW/WZCgFi8ydDV+eXExl95t+5R+ijnqHJbz9tmMh8FUjx3iv2fCQ4dclAQlO2UQ==} engines: {node: '>= 14'} hasBin: true dev: false From ee2368cb1afc6a03a6b37eb60dde53fad81152da Mon Sep 17 00:00:00 2001 From: dev-callgent Date: Sun, 13 Oct 2024 22:52:18 +0800 Subject: [PATCH 099/183] chore(deps): update multiple versions Signed-off-by: dev-callgent --- commitlint.config.js | 23 +++++- package.json | 6 ++ pnpm-lock.yaml | 163 +++++++++++++++++++++++++++++++------------ 3 files changed, 146 insertions(+), 46 deletions(-) diff --git a/commitlint.config.js b/commitlint.config.js index 69b18d9..22530cb 100644 --- a/commitlint.config.js +++ b/commitlint.config.js @@ -1 +1,22 @@ -module.exports = { extends: ['@commitlint/config-angular'] }; +module.exports = { + extends: ['@commitlint/config-angular'], + rules: { + 'type-enum': [ + 2, + 'always', + [ + 'build', + 'ci', + 'docs', + 'feat', + 'fix', + 'perf', + 'refactor', + 'revert', + 'style', + 'test', + 'chore', + ], + ], + }, +}; diff --git a/package.json b/package.json index 2a48b03..a6632ae 100644 --- a/package.json +++ b/package.json @@ -56,12 +56,14 @@ "braces": "^3.0.3", "class-transformer": "^0.5.1", "class-validator": "^0.14.1", + "concat-stream": "1.6.2", "dot": "^1.1.3", "fastify": "4.26.2", "fastify-ip": "^1.1.0", "glob": "^10.4.5", "http-status": "^1.7.4", "jsonrepair": "^3.8.1", + "micromatch": ">=4.0.8", "module": "^1.2.5", "ms": "^2.1.3", "nanoid": "3.3.7", @@ -71,6 +73,7 @@ "nestjs-prisma": "^0.23.0", "passport-jwt": "^4.0.1", "passport-local": "^1.0.0", + "phin": "^3.7.1", "pino": "^9.4.0", "pino-http": "^10.3.0", "pino-pretty": "^11.2.2", @@ -102,15 +105,18 @@ "eslint": "^9.12.0", "eslint-config-prettier": "^9.1.0", "eslint-plugin-prettier": "^5.2.1", + "find-my-way": ">=8.2.2", "husky": "^9.1.6", "jest": "^29.7.0", "pactum": "^3.7.1", "pactum-matchers": "^1.1.7", + "path-to-regexp": ">=6.3.0", "prettier": "^3.3.3", "prisma": "^5.20.0", "source-map-support": "^0.5.21", "standard-version": "^9.5.0", "supertest": "^6.3.3", + "tar": "7.4.3", "ts-jest": "^29.2.5", "ts-loader": "^9.5.1", "ts-node": "^10.9.2", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 785de06..4a0527d 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -76,6 +76,9 @@ dependencies: class-validator: specifier: ^0.14.1 version: 0.14.1 + concat-stream: + specifier: 1.6.2 + version: 1.6.2 dot: specifier: ^1.1.3 version: 1.1.3 @@ -94,6 +97,9 @@ dependencies: jsonrepair: specifier: ^3.8.1 version: 3.8.1 + micromatch: + specifier: '>=4.0.8' + version: 4.0.8 module: specifier: ^1.2.5 version: 1.2.5 @@ -121,6 +127,9 @@ dependencies: passport-local: specifier: ^1.0.0 version: 1.0.0 + phin: + specifier: ^3.7.1 + version: 3.7.1(debug@2.6.9) pino: specifier: ^9.4.0 version: 9.4.0 @@ -210,6 +219,9 @@ devDependencies: eslint-plugin-prettier: specifier: ^5.2.1 version: 5.2.1(eslint-config-prettier@9.1.0)(eslint@9.12.0)(prettier@3.3.3) + find-my-way: + specifier: '>=8.2.2' + version: 8.2.2 husky: specifier: ^9.1.6 version: 9.1.6 @@ -218,10 +230,13 @@ devDependencies: version: 29.7.0(@types/node@22.7.5)(ts-node@10.9.2) pactum: specifier: ^3.7.1 - version: 3.7.1 + version: 3.7.1(debug@2.6.9) pactum-matchers: specifier: ^1.1.7 version: 1.1.7 + path-to-regexp: + specifier: '>=6.3.0' + version: 6.3.0 prettier: specifier: ^3.3.3 version: 3.3.3 @@ -237,6 +252,9 @@ devDependencies: supertest: specifier: ^6.3.3 version: 6.3.3 + tar: + specifier: 7.4.3 + version: 7.4.3 ts-jest: specifier: ^29.2.5 version: 29.2.5(@babel/core@7.23.9)(jest@29.7.0)(typescript@5.6.3) @@ -995,7 +1013,7 @@ packages: dependencies: '@fastify/error': 3.4.1 fastify-plugin: 4.5.1 - path-to-regexp: 6.2.1 + path-to-regexp: 6.3.0 reusify: 1.0.4 dev: false @@ -1089,6 +1107,13 @@ packages: wrap-ansi: 8.1.0 wrap-ansi-cjs: /wrap-ansi@7.0.0 + /@isaacs/fs-minipass@4.0.1: + resolution: {integrity: sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==} + engines: {node: '>=18.0.0'} + dependencies: + minipass: 7.1.2 + dev: true + /@istanbuljs/load-nyc-config@1.1.0: resolution: {integrity: sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==} engines: {node: '>=8'} @@ -1147,7 +1172,7 @@ packages: jest-util: 29.7.0 jest-validate: 29.7.0 jest-watcher: 29.7.0 - micromatch: 4.0.5 + micromatch: 4.0.8 pretty-format: 29.7.0 slash: 3.0.0 strip-ansi: 6.0.1 @@ -1285,7 +1310,7 @@ packages: jest-haste-map: 29.7.0 jest-regex-util: 29.6.3 jest-util: 29.7.0 - micromatch: 4.0.5 + micromatch: 4.0.8 pirates: 4.0.6 slash: 3.0.0 write-file-atomic: 4.0.2 @@ -2903,9 +2928,12 @@ packages: engines: {node: '>= 0.8.0'} dev: true - /centra@2.6.0: - resolution: {integrity: sha512-dgh+YleemrT8u85QL11Z6tYhegAs3MMxsaWAq/oXeAmYJ7VxL3SI9TZtnfaEvNDMAPolj25FXIb3S+HCI4wQaQ==} - dev: true + /centra@2.7.0(debug@2.6.9): + resolution: {integrity: sha512-PbFMgMSrmgx6uxCdm57RUos9Tc3fclMvhLSATYN39XsDV29B89zZ3KA89jmY0vwSGazyU+uerqwa6t+KaodPcg==} + dependencies: + follow-redirects: 1.15.6(debug@2.6.9) + transitivePeerDependencies: + - debug /chalk@1.1.3: resolution: {integrity: sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==} @@ -2965,6 +2993,11 @@ packages: resolution: {integrity: sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==} engines: {node: '>=10'} + /chownr@3.0.0: + resolution: {integrity: sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==} + engines: {node: '>=18'} + dev: true + /chrome-trace-event@1.0.3: resolution: {integrity: sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==} engines: {node: '>=6.0'} @@ -3159,6 +3192,16 @@ packages: typedarray: 0.0.7 dev: false + /concat-stream@1.6.2: + resolution: {integrity: sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==} + engines: {'0': node >= 0.8} + dependencies: + buffer-from: 1.1.2 + inherits: 2.0.4 + readable-stream: 2.3.8 + typedarray: 0.0.6 + dev: false + /concat-stream@2.0.0: resolution: {integrity: sha512-MWufYdFw53ccGjCA+Ol7XJYpAlW6/prSMzuPOTRnJGcGzuhLn4Scrz7qf6o8bROZ514ltazcIFJZevcfbo0x7A==} engines: {'0': node >= 6.0} @@ -3532,7 +3575,6 @@ packages: optional: true dependencies: ms: 2.0.0 - dev: false /debug@4.3.4: resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} @@ -4048,7 +4090,6 @@ packages: /fast-decode-uri-component@1.0.1: resolution: {integrity: sha512-WKgKWg5eUxvRZGwW8FvfbaH7AXSh2cL+3j5fMGzUMCxWBJ3dV3a7Wz8y2f/uQ0e3B6WmodD3oS54jTQ9HVTIIg==} - dev: false /fast-deep-equal@3.1.3: resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} @@ -4065,7 +4106,7 @@ packages: '@nodelib/fs.walk': 1.2.8 glob-parent: 5.1.2 merge2: 1.4.1 - micromatch: 4.0.5 + micromatch: 4.0.8 dev: true /fast-json-stable-stringify@2.1.0: @@ -4091,7 +4132,6 @@ packages: resolution: {integrity: sha512-g6KuKWmFXc0fID8WWH0jit4g0AGBoJhCkJMb1RmbsSEUNvQ+ZC8D6CUZ+GtF8nMzSPXnhiePyyqqipzNNEnHjg==} dependencies: fast-decode-uri-component: 1.0.1 - dev: false /fast-redact@3.3.0: resolution: {integrity: sha512-6T5V1QK1u4oF+ATxs1lWUmlEk6P2T9HqJG3e2DnHOdVgZy2rFJBoEnrIedcTXlkAHU/zKC+7KETJ+KGGKwxgMQ==} @@ -4126,7 +4166,7 @@ packages: avvio: 8.3.0 fast-content-type-parse: 1.1.0 fast-json-stringify: 5.12.0 - find-my-way: 8.1.0 + find-my-way: 8.2.2 light-my-request: 5.12.0 pino: 8.18.0 process-warning: 3.0.0 @@ -4191,14 +4231,13 @@ packages: dependencies: to-regex-range: 5.0.1 - /find-my-way@8.1.0: - resolution: {integrity: sha512-41QwjCGcVTODUmLLqTMeoHeiozbMXYMAE1CKFiDyi9zVZ2Vjh0yz3MF0WQZoIb+cmzP/XlbFjlF2NtJmvZHznA==} + /find-my-way@8.2.2: + resolution: {integrity: sha512-Dobi7gcTEq8yszimcfp/R7+owiT4WncAJ7VTTgFH1jYJ5GaG1FbhjwDG820hptN0QDFvzVY3RfCzdInvGPGzjA==} engines: {node: '>=14'} dependencies: fast-deep-equal: 3.1.3 fast-querystring: 1.1.2 - safe-regex2: 2.0.0 - dev: false + safe-regex2: 3.1.0 /find-node-modules@2.1.3: resolution: {integrity: sha512-UC2I2+nx1ZuOBclWVNdcnbDR5dlrOdVb7xNjmT/lHE+LsgztWks3dG7boJ37yTS/venXw84B/mAW9uHVoC5QRg==} @@ -4263,7 +4302,7 @@ packages: dependencies: detect-file: 1.0.0 is-glob: 4.0.3 - micromatch: 4.0.5 + micromatch: 4.0.8 resolve-dir: 1.0.1 dev: true @@ -4294,7 +4333,6 @@ packages: optional: true dependencies: debug: 2.6.9 - dev: false /for-in@1.0.2: resolution: {integrity: sha512-7EwmXrOjyL+ChxMhmG5lnW9MPt1aIeZEwKhQzoBUdTV0N3zuwWDZYVJatDvZ2OyzPUvdIAZDsCetk3coyMfcnQ==} @@ -4584,7 +4622,6 @@ packages: minipass: 7.1.2 package-json-from-dist: 1.0.1 path-scurry: 1.11.1 - dev: false /glob@5.0.15: resolution: {integrity: sha512-c9IPMazfRITpmAAKi22dK1VKxGDX9ehhqfABDriL/lzO92xcUKEJPQHrVA/2YHSNFB4iFlykVmWvwo48nr3OxA==} @@ -5292,7 +5329,7 @@ packages: jest-runner: 29.7.0 jest-util: 29.7.0 jest-validate: 29.7.0 - micromatch: 4.0.5 + micromatch: 4.0.8 parse-json: 5.2.0 pretty-format: 29.7.0 slash: 3.0.0 @@ -5355,7 +5392,7 @@ packages: jest-regex-util: 29.6.3 jest-util: 29.7.0 jest-worker: 29.7.0 - micromatch: 4.0.5 + micromatch: 4.0.8 walker: 1.0.8 optionalDependencies: fsevents: 2.3.3 @@ -5385,7 +5422,7 @@ packages: '@types/stack-utils': 2.0.3 chalk: 4.1.2 graceful-fs: 4.2.11 - micromatch: 4.0.5 + micromatch: 4.0.8 pretty-format: 29.7.0 slash: 3.0.0 stack-utils: 2.0.6 @@ -6171,8 +6208,8 @@ packages: regex-cache: 0.4.4 dev: false - /micromatch@4.0.5: - resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} + /micromatch@4.0.8: + resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} engines: {node: '>=8.6'} dependencies: braces: 3.0.3 @@ -6273,6 +6310,14 @@ packages: minipass: 3.3.6 yallist: 4.0.0 + /minizlib@3.0.1: + resolution: {integrity: sha512-umcy022ILvb5/3Djuu8LWeqUa8D68JaBzlttKeMWen48SjabqS3iY5w/vzeMzMUNhLDifyhbOwKDSznB1vvrwg==} + engines: {node: '>= 18'} + dependencies: + minipass: 7.1.2 + rimraf: 5.0.10 + dev: true + /mkdirp@0.5.6: resolution: {integrity: sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==} hasBin: true @@ -6285,6 +6330,12 @@ packages: engines: {node: '>=10'} hasBin: true + /mkdirp@3.0.1: + resolution: {integrity: sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==} + engines: {node: '>=10'} + hasBin: true + dev: true + /mnemonist@0.39.6: resolution: {integrity: sha512-A/0v5Z59y63US00cRSLiloEIw3t5G+MiKz4BhX21FI+YBJXBOGW0ohFxTxO08dsOYlzxo87T7vGfZKYp2bcAWA==} dependencies: @@ -6313,7 +6364,6 @@ packages: /ms@2.0.0: resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==} - dev: false /ms@2.1.2: resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} @@ -6666,7 +6716,7 @@ packages: resolution: {integrity: sha512-RqwewcUje6vhcYQGbPfdSXkcp/Vtwn4WmmTWLSmqp0CGxBroCEqRg3JMIjkjQTZCd2VmG+tTcQw+n4P/iuqv3Q==} dev: true - /pactum@3.7.1: + /pactum@3.7.1(debug@2.6.9): resolution: {integrity: sha512-r+R1dMy2MfRCQpAHohMyICusiMz14t0E+bhnLDScl2x4lXJKQAvQUGV/WWKUUxN2DS0Jdm0PUj6KjblfcSk1GA==} engines: {node: '>=10'} dependencies: @@ -6679,8 +6729,10 @@ packages: openapi-fuzzer-core: 1.0.6 pactum-matchers: 1.1.7 parse-graphql: 1.0.0 - phin: 3.7.0 + phin: 3.7.1(debug@2.6.9) polka: 0.5.2 + transitivePeerDependencies: + - debug dev: true /parent-module@1.0.1: @@ -6811,9 +6863,8 @@ packages: /path-to-regexp@3.3.0: resolution: {integrity: sha512-qyCH421YQPS2WFDxDjftfc1ZR5WKQzVzqsp4n9M2kQhVOo/ByahFoUNJfl58kOcEGfQ//7weFTDhm+ss8Ecxgw==} - /path-to-regexp@6.2.1: - resolution: {integrity: sha512-JLyh7xT1kizaEvcaXOQwOc2/Yhw6KZOvPf1S8401UyLk86CU79LN3vl7ztXGm/pZ+YjoyAJ4rxmHwbkBXJX+yw==} - dev: false + /path-to-regexp@6.3.0: + resolution: {integrity: sha512-Yhpw4T9C6hPpgPeA28us07OJeqZ5EzQTkbfwuhsUg0c237RomFoETJgmp2sa3F/41gfLE6G5cqcYwznmeEeOlQ==} /path-type@1.1.0: resolution: {integrity: sha512-S4eENJz1pkiQn9Znv33Q+deTOKmbl+jj1Fl+qiP/vYezj+S8x+J3Uo0ISrx/QoEvIlOaDWJhPaRd1flJ9HXZqg==} @@ -6848,13 +6899,13 @@ packages: through2: 2.0.5 dev: false - /phin@3.7.0: - resolution: {integrity: sha512-DqnVNrpYhKGBZppNKprD+UJylMeEKOZxHgPB+ZP6mGzf3uA2uox4Ep9tUm+rUc8WLIdHT3HcAE4X8fhwQA9JKg==} + /phin@3.7.1(debug@2.6.9): + resolution: {integrity: sha512-GEazpTWwTZaEQ9RhL7Nyz0WwqilbqgLahDM3D0hxWwmVDI52nXEybHqiN6/elwpkJBhcuj+WbBu+QfT0uhPGfQ==} engines: {node: '>= 8'} - deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. dependencies: - centra: 2.6.0 - dev: true + centra: 2.7.0(debug@2.6.9) + transitivePeerDependencies: + - debug /picocolors@1.0.0: resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} @@ -7396,10 +7447,9 @@ packages: onetime: 5.1.2 signal-exit: 3.0.7 - /ret@0.2.2: - resolution: {integrity: sha512-M0b3YWQs7R3Z917WRQy1HHA7Ba7D8hvZg6UE5mLykJxQVE2ju0IXbGlaHPPlkY+WN7wFP+wUMXmBFA0aV6vYGQ==} - engines: {node: '>=4'} - dev: false + /ret@0.4.3: + resolution: {integrity: sha512-0f4Memo5QP7WQyUEAYUO3esD/XjOc3Zjjg5CPsAq1p8sIu0XPeMbHJemKA0BO7tV0X7+A0FoEpbmHXWxPyD3wQ==} + engines: {node: '>=10'} /reusify@1.0.4: resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} @@ -7411,11 +7461,19 @@ packages: /rimraf@3.0.2: resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} + deprecated: Rimraf versions prior to v4 are no longer supported hasBin: true dependencies: glob: 7.2.3 dev: false + /rimraf@5.0.10: + resolution: {integrity: sha512-l0OE8wL34P4nJH/H2ffoaniAokM2qSmrtXHmlpvYr5AVVX8msAyW0l8NVJFDxlSK4u3Uh/f41cQheDVdnYijwQ==} + hasBin: true + dependencies: + glob: 10.4.5 + dev: true + /run-async@2.4.1: resolution: {integrity: sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==} engines: {node: '>=0.12.0'} @@ -7450,11 +7508,10 @@ packages: /safe-buffer@5.2.1: resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} - /safe-regex2@2.0.0: - resolution: {integrity: sha512-PaUSFsUaNNuKwkBijoAPHAK6/eM6VirvyPWlZ7BAQy4D+hCvh4B6lIG+nPdhbFfIbP+gTGBcrdsOaUs0F+ZBOQ==} + /safe-regex2@3.1.0: + resolution: {integrity: sha512-RAAZAGbap2kBfbVhvmnTFv73NWLMvDGOITFYTZBAaY8eR+Ir4ef7Up/e7amo+y1+AH+3PtLkrt9mvcTsG9LXug==} dependencies: - ret: 0.2.2 - dev: false + ret: 0.4.3 /safe-stable-stringify@2.4.3: resolution: {integrity: sha512-e2bDA2WJT0wxseVd4lsDP4+3ONX6HpMXQa1ZhFQ7SU+GjvORCmShbCMltrtIDfkYhVHrOcPtj+KhmDBdPdZD1g==} @@ -7901,6 +7958,18 @@ packages: mkdirp: 1.0.4 yallist: 4.0.0 + /tar@7.4.3: + resolution: {integrity: sha512-5S7Va8hKfV7W5U6g3aYxXmlPoZVAwUMy9AOKyF2fVuZa2UD3qZjg578OrLRt8PcNN1PleVaL/5/yYATNL0ICUw==} + engines: {node: '>=18'} + dependencies: + '@isaacs/fs-minipass': 4.0.1 + chownr: 3.0.0 + minipass: 7.1.2 + minizlib: 3.0.1 + mkdirp: 3.0.1 + yallist: 5.0.0 + dev: true + /terser-webpack-plugin@5.3.10(webpack@5.94.0): resolution: {integrity: sha512-BKFPWlPDndPs+NGGCr1U59t0XScL5317Y0UReNrHaw9/FwhPENlq6bfgs+4yPfyP51vqC1bQ4rp1EfXW5ZSH9w==} engines: {node: '>= 10.13.0'} @@ -8165,7 +8234,7 @@ packages: dependencies: chalk: 4.1.2 enhanced-resolve: 5.15.0 - micromatch: 4.0.5 + micromatch: 4.0.8 semver: 7.6.0 source-map: 0.7.4 typescript: 5.6.3 @@ -8270,7 +8339,6 @@ packages: /typedarray@0.0.6: resolution: {integrity: sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==} - dev: true /typedarray@0.0.7: resolution: {integrity: sha512-ueeb9YybpjhivjbHP2LdFDAjbS948fGEPj+ACAMs4xCMmh72OCOMQWBQKlaN4ZNQ04yfLSDLSx1tGRIoWimObQ==} @@ -8587,6 +8655,11 @@ packages: /yallist@4.0.0: resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} + /yallist@5.0.0: + resolution: {integrity: sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==} + engines: {node: '>=18'} + dev: true + /yaml@2.6.0: resolution: {integrity: sha512-a6ae//JvKDEra2kdi1qzCyrJW/WZCgFi8ydDV+eXExl95t+5R+ijnqHJbz9tmMh8FUjx3iv2fCQ4dclAQlO2UQ==} engines: {node: '>= 14'} From f3efbd7afb93acd471d88c8c2f653b946649f23b Mon Sep 17 00:00:00 2001 From: dev-callgent Date: Fri, 18 Oct 2024 09:33:22 +0800 Subject: [PATCH 100/183] feat: agent for invoke/request Signed-off-by: dev-callgent --- .../20241017073426_req_2_args/migration.sql | 24 +++ prisma/schema.prisma | 140 ++++++++------- prisma/seed-test.ts | 60 +++---- prisma/seed.ts | 59 +++++-- src/agents/agents.service.ts | 166 ++++++++++++------ src/agents/llm.service.ts | 42 ++++- src/bootstrap.ts | 2 +- src/emails/templates/relay-sep-invoke.dot | 26 +-- .../adaptors/builtin/email/email.adaptor.ts | 36 +++- .../builtin/restapi/restapi.controller.ts | 39 ++-- .../builtin/web/webpage.controller.ts | 35 ++-- .../adaptors/dto/request-requirement.dto.ts | 31 ++++ src/entries/adaptors/entry-adaptor.base.ts | 10 +- src/entries/entries.service.ts | 6 +- .../event-listeners.service.ts | 10 +- 15 files changed, 429 insertions(+), 257 deletions(-) create mode 100644 prisma/migrations/20241017073426_req_2_args/migration.sql create mode 100644 src/entries/adaptors/dto/request-requirement.dto.ts diff --git a/prisma/migrations/20241017073426_req_2_args/migration.sql b/prisma/migrations/20241017073426_req_2_args/migration.sql new file mode 100644 index 0000000..c020be9 --- /dev/null +++ b/prisma/migrations/20241017073426_req_2_args/migration.sql @@ -0,0 +1,24 @@ +/* + Warnings: + + - You are about to drop the `PersistedAsync` table. If the table is not empty, all the data it contains will be lost. + +*/ +-- DropTable +DROP TABLE "PersistedAsync"; + +-- CreateTable +CREATE TABLE "Req2ArgsRepo" ( + "pk" BIGSERIAL NOT NULL, + "cepId" VARCHAR(36) NOT NULL, + "sepId" VARCHAR(36) NOT NULL, + "req2Args" VARCHAR(8192) NOT NULL, + "createdBy" VARCHAR(36), + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updatedAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + + CONSTRAINT "Req2ArgsRepo_pkey" PRIMARY KEY ("pk") +); + +-- CreateIndex +CREATE UNIQUE INDEX "Req2ArgsRepo_cepId_sepId_key" ON "Req2ArgsRepo"("cepId", "sepId"); diff --git a/prisma/schema.prisma b/prisma/schema.prisma index a885e46..3dc8f75 100644 --- a/prisma/schema.prisma +++ b/prisma/schema.prisma @@ -227,6 +227,65 @@ model CallgentTag { @@index([callgentId]) } +enum EntryType { + CLIENT + SERVER + EVENT +} + +/// @description a callgent may have multiple entries, including client/server/event entries +model Entry { + /// @DtoEntityHidden + pk Int @id @default(autoincrement()) + /// @DtoCreateApiResponse + /// @DtoUpdateApiResponse + /// @DtoPlainApiResponse + id String @unique @db.VarChar(36) + /// @DtoReadOnly + /// @DtoEntityHidden + // add to migration.sql + tenantPk Int @default(dbgenerated("(current_setting('tenancy.tenantPk')::int)")) + + name String @default("") @db.VarChar(2047) + /// @DtoUpdateApiResponse + /// @DtoPlainApiResponse + type EntryType /// @description entry type: CLIENT, SERVER OR EVENT + /// @DtoCreateApiResponse + /// @DtoUpdateApiResponse + /// @DtoPlainApiResponse + adaptorKey String @db.VarChar(127) /// @description entry adaptor key + priority Int @default(0) /// @description priority in the callgent + + /// @DtoCreateOptional + host String @db.VarChar(2047) /// @description host address, client entry host are *generated*, e.g. '/api/rest/invoke/rbhes0-w4rff/{id}', where `{id}` will be replaced with current entry id + initParams Json? @db.Json /// @description initializing parameters + content Json? @db.Json /// @description generated content/code by init method + /// @DtoReadOnly + /// @DtoPlainApiResponse + /// @DtoCastType(RealmSecurityVO, ../../callgent-realms/dto/realm-security.vo) + securities Json[] @db.Json /// @description RealmSecurityVO[], where RealmSecurityVO{ [realmPk]: RealmSecurityItem } + + /// @DtoUpdateApiResponse + /// @DtoPlainApiResponse + /// @CustomValidator(EntityIdExists, 'callgent', 'id', ../../infra/repo/validators/entity-exists.validator) + /// @DtoRelationIncludeId + callgentId String @db.VarChar(36) /// @description callgent owning the entry + callgent Callgent @relation(fields: [callgentId], references: [id]) + + /// @DtoReadOnly + /// @DtoEntityHidden + createdBy String @db.VarChar(36) + createdAt DateTime @default(now()) + updatedAt DateTime @default(now()) @updatedAt + // DONOT FORGET TO ADD the model into `createSoftDeleteMiddleware` + /// @DtoReadOnly + /// @DtoEntityHidden + deletedAt DateTime? /// @description logical deletion. + + @@index([tenantPk]) + @@index([callgentId]) +} + /// @description endpoint in openAPI.json format model Endpoint { /// @DtoEntityHidden @@ -419,65 +478,6 @@ model AuthToken { updatedAt DateTime @default(now()) @updatedAt } -enum EntryType { - CLIENT - SERVER - EVENT -} - -/// @description a callgent may have multiple entries, including client/server/event entries -model Entry { - /// @DtoEntityHidden - pk Int @id @default(autoincrement()) - /// @DtoCreateApiResponse - /// @DtoUpdateApiResponse - /// @DtoPlainApiResponse - id String @unique @db.VarChar(36) - /// @DtoReadOnly - /// @DtoEntityHidden - // add to migration.sql - tenantPk Int @default(dbgenerated("(current_setting('tenancy.tenantPk')::int)")) - - name String @default("") @db.VarChar(2047) - /// @DtoUpdateApiResponse - /// @DtoPlainApiResponse - type EntryType /// @description entry type: CLIENT, SERVER OR EVENT - /// @DtoCreateApiResponse - /// @DtoUpdateApiResponse - /// @DtoPlainApiResponse - adaptorKey String @db.VarChar(127) /// @description entry adaptor key - priority Int @default(0) /// @description priority in the callgent - - /// @DtoCreateOptional - host String @db.VarChar(2047) /// @description host address, client entry host are *generated*, e.g. '/api/rest/invoke/rbhes0-w4rff/{id}', where `{id}` will be replaced with current entry id - initParams Json? @db.Json /// @description initializing parameters - content Json? @db.Json /// @description generated content/code by init method - /// @DtoReadOnly - /// @DtoPlainApiResponse - /// @DtoCastType(RealmSecurityVO, ../../callgent-realms/dto/realm-security.vo) - securities Json[] @db.Json /// @description RealmSecurityVO[], where RealmSecurityVO{ [realmPk]: RealmSecurityItem } - - /// @DtoUpdateApiResponse - /// @DtoPlainApiResponse - /// @CustomValidator(EntityIdExists, 'callgent', 'id', ../../infra/repo/validators/entity-exists.validator) - /// @DtoRelationIncludeId - callgentId String @db.VarChar(36) /// @description callgent owning the entry - callgent Callgent @relation(fields: [callgentId], references: [id]) - - /// @DtoReadOnly - /// @DtoEntityHidden - createdBy String @db.VarChar(36) - createdAt DateTime @default(now()) - updatedAt DateTime @default(now()) @updatedAt - // DONOT FORGET TO ADD the model into `createSoftDeleteMiddleware` - /// @DtoReadOnly - /// @DtoEntityHidden - deletedAt DateTime? /// @description logical deletion. - - @@index([tenantPk]) - @@index([callgentId]) -} - /// @DtoIgnoreModel model LlmTemplate { /// @DtoEntityHidden @@ -506,22 +506,20 @@ model LlmCache { @@unique([prompt, name]) } -model PersistedAsync { - /// @DtoEntityHidden +/// @DtoIgnoreModel +/// @description repo to store req2Args mapping code when invoking(not requesting) sep from cep +model Req2ArgsRepo { pk BigInt @id @default(autoincrement()) - statusCode Int @default(1) /// @description statusCode, 1: pending, 2: sent, 0: done, <0: failed - service String @db.VarChar(127) /// @description callback service name - method String @db.VarChar(127) /// @description callback method name + cepId String @db.VarChar(36) /// @description source client endpoint id receiving the request + sepId String @db.VarChar(36) /// @description target server endpoint id processing the request + req2Args String @db.VarChar(8192) /// @description js function req2Args(req) to convert request to args - parentPk BigInt? @db.BigInt /// @description parent async pk - - createdBy String @db.VarChar(36) - createdAt DateTime @default(now()) - updatedAt DateTime @default(now()) @updatedAt - deletedAt DateTime? /// @description logical deletion. + createdBy String? @db.VarChar(36) + createdAt DateTime @default(now()) + updatedAt DateTime @default(now()) @updatedAt - @@index(parentPk) + @@unique([cepId, sepId]) } enum ServiceType { diff --git a/prisma/seed-test.ts b/prisma/seed-test.ts index 638e74b..3df48d0 100644 --- a/prisma/seed-test.ts +++ b/prisma/seed-test.ts @@ -142,36 +142,36 @@ function initTestData( create: cepDto, }) .then((cep) => console.log({ cep })), - addLlmCache( - prisma, - 'map2Endpoints', - 'given below service endpoints:\nclass new-test-callgent {\n "endpoint name: POST:/boards/list": {"params":[invoker,apiKey], "documents":"This function lists all boards.\n\n@param {Function} invoker - A function that makes the actual API call.\n@param {string} apiKey - Your secret API key.\n\n@returns {Promise} A promise that resolves to an object containing the API result.\n@property {Array} boards - An array of board objects.\n@property {string} boards[].id - A unique identifier for the board.\n@property {string} boards[].created - Time at which the board was created, in ISO 8601 format.\n@property {boolean} boards[].isPrivate - Whether or not the board is set as private in the administrative settings.\n@property {string} boards[].name - The board\'s name.\n@property {number} boards[].postCount - The number of non-deleted posts associated with the board. This number includes posts that are marked as closed or complete.\n@property {boolean} boards[].privateComments - Whether or not comments left on posts can be viewed by other end-users.\n@property {string} boards[].url - The URL to the board\'s page.\n@property {boolean} hasMore - Specifies whether this query returns more boards than the limit."},\n\n}\nand an service `invoker` function.\n\nPlease choose one function to fulfill below request:\n{\n"requesting function": "POST:/boards/list",\n"request from": "restAPI",\n"request_object": {"url":"/boards/list","method":"POST","headers":{"host":"127.0.0.1:3300","connection":"close","content-length":"0"},"query":{}},\n}\nand code for request_object to chosen function args mapping. if any data missing/unclear/ambiguous from request_object to invocation args, please ask question to the caller in below json.question field.\n\noutput a single-line json object:\n{ "epName": "the endpoint name to be invoked", "params":"param names of the chosen function", "mapping": "the js function (invoker, request_object)=>{...;return functionArgsArray;}, full implementation to return the **real** args from request_object to invoke the chosen service function. don\'t use data not exist or ambiguous in request", "question": "question to ask the caller if anything not sure or missing for request to args mapping, *no* guess or assumption of the mapping. null if the mapping is crystal clear." }"}', - '{"endpoint":"POST:/boards/list","args":["invoker","apiKey"],"mapping":"(invoker, request_object)=>{ let apiKey = request_object.params.ids; return [invoker, apiKey]; }","question":"What is the API key for this request? It is not provided in the request_object."}', - ), - addLlmCache( - prisma, - 'map2Endpoints', - 'given below service APIs:\nservice test-callgent {\n "API: GET /positions": {"endpoint": "GET /positions", "summary":"listPositions: List all job positions", "description":"Retrieve a list of all available job positions.", "params":{}, "responses":{"200":{"description":"A list of job positions","content":{"application/json":{"schema":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","description":"Unique identifier for the job position"},"title":{"type":"string","description":"Title of the job position"},"description":{"type":"string","description":"Description of the job position"},"location":{"type":"string","description":"Location of the job position"},"requirements":{"type":"array","items":{"type":"string"},"description":"List of requirements for the job position"},"createdAt":{"type":"string","format":"date-time","description":"Timestamp when the job position was created"},"updatedAt":{"type":"string","format":"date-time","description":"Timestamp when the job position was last updated"}}}}}}},"500":{"description":"Internal Server Error"}} },\n}\n\nPlease choose one API to fulfill below request:\n{\n"requesting endpoint": "GET /positions",\n"request from": "restAPI",\n"request_object": {"url":"/positions","method":"GET","headers":{"accept":"*/*","accept-encoding":"gzip, deflate, br","cache-control":"no-cache","connection":"keep-alive","host":"127.0.0.1:3000","user-agent":"Apifox/1.0.0 (https://apifox.com)"},"query":{}},\n}\nand code for request_object to chosen function args mapping. if any data missing/unclear/ambiguous from request_object to invocation args, please ask question to the caller in below json.question field.\n\noutput a single-line json object:\n{ "endpoint": "the chosen API endpoint to be invoked", "args":"params/body/headers/..., with same structure as the \'params\' JSON object(no more args than it) with additional \'value\' prop, or null if no args needed", "mapping": "if the the request_object is structured (or null if unstructured), generate the js function (request_object)=>{...;return API_signature_args;}, full implementation to return the **real** args from request_object to invoke the API. don\'t use data not exist or ambiguous in request", "question": "question to ask the caller if anything not sure or missing for request to args mapping, *no* guess or assumption of the mapping. null if the mapping is crystal clear." }"}', - '{ "endpoint": "GET /positions", "args": null, "mapping": "(request_object)=>{return null;}", "question": null }', - ), - addLlmCache( - prisma, - 'map2Endpoints', - 'given below service APIs:\nservice test-callgent {\n "API: POST /api/users/send-confirm-email": {"endpoint": "POST /api/users/send-confirm-email", "summary":"UsersController_sendConfirmEmail: Reset password by sending validation email with reset url", "description":" Tags: Users", "params":{"parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"email":{"type":"string","example":"user@example.com","nullable":false},"create":{"type":"boolean","description":"If true, a new user will be created if not exists.","nullable":true},"resetPwd":{"type":"boolean","description":"If set to false, only validating email. Note: new user forces resetPwd.","nullable":true}},"required":["email"]}}}}}, "responses":{"201":{"description":"","content":{"application/json":{"schema":{"allOf":[{"type":"object","properties":{"statusCode":{"type":"number","description":"Status code, empty means success"},"message":{"type":"string"},"data":{"type":"object"},"meta":{"type":"object","description":"Pagination, usage, quotation, profiling, versions, HATEOAS, etc."}},"required":["data"]},{"properties":{"data":{"type":"boolean"}}}]}}}}} },\n}\n\nPlease choose one API to fulfill below request:\n{\n"requesting endpoint": "POST /api/users/send-confirm-email",\n"request from": "restAPI",\n"request_object": {"url":"/api/users/send-confirm-email","method":"POST","headers":{"accept":"*/*","accept-encoding":"gzip, deflate, br","cache-control":"no-cache","connection":"keep-alive","content-length":"53","content-type":"application/json","host":"127.0.0.1:3000","user-agent":"Apifox/1.0.0 (https://apifox.com)"},"params":{},"data":{"email":"dev@callgent.com","resetPwd":true}},\n}\nand code for request_object to chosen function args mapping. if any data missing/unclear/ambiguous from request_object to invocation args, please ask question to the caller in below json.question field.\n\noutput a single-line json object:\n{ "endpoint": "the chosen API endpoint to be invoked", "args":"params/body/headers/..., with same structure as the \'params\' JSON object(no more args than it) with additional \'value\' prop, or null if no args needed", "mapping": "if the the request_object is structured (or null if unstructured), generate the js function (request_object)=>{...;return API_signature_args;}, full implementation to return the **real** args from request_object to invoke the API. don\'t use data not exist or ambiguous in request", "question": "question to ask the caller if anything not sure or missing for request to args mapping, *no* guess or assumption of the mapping. null if the mapping is crystal clear." }"}', - '```json\n{\n "endpoint": "POST /api/users/send-confirm-email",\n "args": {\n "params": null,\n "body": {\n "email": { "value": "dev@callgent.com" },\n "resetPwd": { "value": true }\n },\n "headers": null\n },\n "mapping": "(request_object) => {\n const { data } = request_object;\n return {\n body: {\n email: { value: data.email },\n resetPwd: { value: data.resetPwd }\n }\n };\n }",\n "question": null\n}\n```', - ), - addLlmCache( - prisma, - 'map2Endpoints', - 'given below service APIs:\nservice test-callgent {\n "API: POST /api/users/send-confirm-email": {"endpoint": "POST /api/users/send-confirm-email", "summary":"UsersController_sendConfirmEmail: Reset password by sending validation email with reset url", "description":" Tags: Users", "params":{"parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"email":{"type":"string","example":"user@example.com","nullable":false},"create":{"type":"boolean","description":"If true, a new user will be created if not exists.","nullable":true},"resetPwd":{"type":"boolean","description":"If set to false, only validating email. Note: new user forces resetPwd.","nullable":true}},"required":["email"]}}}}}, "responses":{"201":{"description":"","content":{"application/json":{"schema":{"allOf":[{"type":"object","properties":{"statusCode":{"type":"number","description":"Status code, empty means success"},"message":{"type":"string"},"data":{"type":"object"},"meta":{"type":"object","description":"Pagination, usage, quotation, profiling, versions, HATEOAS, etc."}},"required":["data"]},{"properties":{"data":{"type":"boolean"}}}]}}}}} },\n}\n\nPlease choose one API to fulfill below request:\n{\n"requesting endpoint": "POST /api/users/send-confirm-email",\n"request from": "restAPI",\n"request_object": {"url":"/api/users/send-confirm-email","method":"POST","headers":{"accept":"*/*","accept-encoding":"gzip, deflate, br","connection":"keep-alive","content-length":"53","content-type":"application/json","host":"127.0.0.1:3000","user-agent":"Apifox/1.0.0 (https://apifox.com)"},"params":{},"data":{"email":"dev@callgent.com","resetPwd":true}},\n}\nand code for request_object to chosen function args mapping. if any data missing/unclear/ambiguous from request_object to invocation args, please ask question to the caller in below json.question field.\n\noutput a single-line json object:\n{ "endpoint": "the chosen API endpoint to be invoked", "args":"params/body/headers/..., with same structure as the \'params\' JSON object(no more args than it) with additional \'value\' prop, or null if no args needed", "mapping": "if the the request_object is structured (or null if unstructured), generate the js function (request_object)=>{...;return API_signature_args;}, full implementation to return the **real** args from request_object to invoke the API. don\'t use data not exist or ambiguous in request", "question": "question to ask the caller if anything not sure or missing for request to args mapping, *no* guess or assumption of the mapping. null if the mapping is crystal clear." }"}', - '```json\n{\n "endpoint": "POST /api/users/send-confirm-email",\n "args": {\n "params": null,\n "body": {\n "email": { "value": "dev@callgent.com" },\n "resetPwd": { "value": true }\n },\n "headers": null\n },\n "mapping": "(request_object) => {\n const { data } = request_object;\n return {\n body: {\n email: { value: data.email },\n resetPwd: { value: data.resetPwd }\n }\n };\n }",\n "question": null\n}\n```', - ), - addLlmCache( - prisma, - 'convert2Response', - 'Given the openAPI endpoint:\n{"endpoint": "GET /positions", "summary":"listPositions: List all job positions", "description":"Retrieve a list of all available job positions.", "params":{}, "responses":{"200":{"description":"A list of job positions","content":{"application/json":{"schema":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","description":"Unique identifier for the job position"},"title":{"type":"string","description":"Title of the job position"},"description":{"type":"string","description":"Description of the job position"},"location":{"type":"string","description":"Location of the job position"},"requirements":{"type":"array","items":{"type":"string"},"description":"List of requirements for the job position"},"createdAt":{"type":"string","format":"date-time","description":"Timestamp when the job position was created"},"updatedAt":{"type":"string","format":"date-time","description":"Timestamp when the job position was last updated"}}}}}}},"500":{"description":"Internal Server Error"}} }\n\ninvoked with the following request:\n<--- request begin ---\n[]\n--- request end --->\n\nwe receive below response content:\n<--- response begin ---\nWe are pleased to inform you about the following job positions available at our company:\r\n\r\n1. Software Engineer\r\n   - Description: Develop and maintain software applications.\r\n   - Location: San Francisco, CA\r\n   - Requirements:\r\n     - Bachelor\'s degree in Computer Science or related field\r\n     - 3+ years of experience in software development\r\n     - Proficient in Java or Python\r\n   - Created At: October 1, 2023, 12:00 PM\r\n   - Updated At: October 1, 2023, 12:00 PM\r\n\r\n2. Product Manager\r\n   - Description: Define product strategy and roadmap.\r\n   - Location: New York, NY\r\n   - Requirements:\r\n     - Bachelor\'s degree in Business or related field\r\n     - 5+ years of experience in product management\r\n     - Strong analytical and problem-solving skills\r\n   - Created At: October 2, 2023, 10:00 AM\r\n   - Updated At: October 2, 2023, 10:00 AM\r\n\r\n3. Data Scientist\r\n   - Description: Analyze and interpret complex data to assist in decision-making.\r\n   - Location: Seattle, WA\r\n   - Requirements:\r\n     - Master\'s degree in Data Science or related field\r\n     - 2+ years of experience in data analysis\r\n     - Proficient in Python and SQL\r\n   - Created At: October 3, 2023, 8:00 AM\r\n   - Updated At: October 3, 2023, 8:00 AM\r\n\r\nPlease review the details and let us know if you are interested in any of these positions.\r\n\r\nBest regards\r\n> From: "Callgent Invoker"\r\n> Date: Thu, Sep 5, 2024, 14:44\r\n> Subject: [Callgent] Function calling: \'GET /positions\' from Callgent test-callgent. #xY5WGrPph-jn2HHn4_aLi\r\n> To: "dev"\r\n> [image: https://hgggdgi.r.bh.d.sendibt3.com/tr/op/CYIv2yvoVWHCvjQ__eO-QxCY-FkqVvmIPWtQz6OMpAh55LRbe8vKq9aHSdoB0TikwlnXx5U6VsnDPf9637MS7iqb_BpOIcAej4CvQCx2hCA2upHiNg6mXVisqoSvihA0UM9ymGtL9RJsmgdosYMyVW2iHwS9m9UcLtnagkPE-HXmIE8L4EkAApInhajwSZuVsine_ltWzXmBzfU9jp6e5g]\r\n> Hello dev!\r\n> Somebody is calling: \'GET /positions\' from Callgent test-callgent. Below is the detailed request information:\r\n> Function Calling:\r\n> Name:GET /positions\r\n> Summary:listPositions: List all job positions\r\n> Description:Retrieve a list of all available job positions.\r\n> Possible Responses:\r\n> Response OK:A list of job positions\r\n> [{"id":"Unique identifier for the job position","title":"Title of the job position","description":"Description of the job position","location":"Location of the job position","requirements":["string"],"createdAt":"format: date-time, Timestamp when the job position was created","updatedAt":"format: date-time, Timestamp when the job position was last updated"}]\r\n> Response Internal Server Error:Internal Server Error\r\n> \r\n> \r\n> Thu, 05 Sep 2024 06:44:13 GMT\r\n\n--- response end --->\n\nPlease formalize the response content as a single-lined JSON object:\n{"statusCode": "the exact response code(integer) defined in API", "data": "extracted response value with respect to the corresponding API response schema, or undefined if abnormal response", "error": "message": "error message if abnormal response, otherwise undefined"}', - '{\n "statusCode": 200,\n "data": [\n {\n "id": "1",\n "title": "Software Engineer",\n "description": "Develop and maintain software applications.",\n "location": "San Francisco, CA",\n "requirements": [\n "Bachelor\'s degree in Computer Science or related field",\n "3+ years of experience in software development",\n "Proficient in Java or Python"\n ],\n "createdAt": "2023-10-01T12:00:00Z",\n "updatedAt": "2023-10-01T12:00:00Z"\n },\n {\n "id": "2",\n "title": "Product Manager",\n "description": "Define product strategy and roadmap.",\n "location": "New York, NY",\n "requirements": [\n "Bachelor\'s degree in Business or related field",\n "5+ years of experience in product management",\n "Strong analytical and problem-solving skills"\n ],\n "createdAt": "2023-10-02T10:00:00Z",\n "updatedAt": "2023-10-02T10:00:00Z"\n },\n {\n "id": "3",\n "title": "Data Scientist",\n "description": "Analyze and interpret complex data to assist in decision-making.",\n "location": "Seattle, WA",\n "requirements": [\n "Master\'s degree in Data Science or related field",\n "2+ years of experience in data analysis",\n "Proficient in Python and SQL"\n ],\n "createdAt": "2023-10-03T08:00:00Z",\n "updatedAt": "2023-10-03T08:00:00Z"\n }\n ]\n}', - ), + // addLlmCache( + // prisma, + // 'map2Endpoints', + // 'given below service endpoints:\nclass new-test-callgent {\n "POST:/boards/list": {"params":[invoker,apiKey], "documents":"This function lists all boards.\n\n@param {Function} invoker - A function that makes the actual API call.\n@param {string} apiKey - Your secret API key.\n\n@returns {Promise} A promise that resolves to an object containing the API result.\n@property {Array} boards - An array of board objects.\n@property {string} boards[].id - A unique identifier for the board.\n@property {string} boards[].created - Time at which the board was created, in ISO 8601 format.\n@property {boolean} boards[].isPrivate - Whether or not the board is set as private in the administrative settings.\n@property {string} boards[].name - The board\'s name.\n@property {number} boards[].postCount - The number of non-deleted posts associated with the board. This number includes posts that are marked as closed or complete.\n@property {boolean} boards[].privateComments - Whether or not comments left on posts can be viewed by other end-users.\n@property {string} boards[].url - The URL to the board\'s page.\n@property {boolean} hasMore - Specifies whether this query returns more boards than the limit."},\n\n}\nand an service `invoker` function.\n\nPlease choose relevant endpoints to fulfill below request:\n{\n"requesting function": "POST:/boards/list",\n"request from": "restAPI",\n"request_object": {"url":"/boards/list","method":"POST","headers":{"host":"127.0.0.1:3300","connection":"close","content-length":"0"},"query":{}},\n}\nand code for request_object to chosen function args mapping. if any data missing/unclear/ambiguous from request_object to invocation args, please ask question to the caller in below json.question field.\n\noutput a single-line json object:\n{ "epName": "the endpoint name to be invoked", "params":"param names of the chosen function", "mapping": "the js function (invoker, request_object)=>{...;return functionArgsArray;}, full implementation to return the **real** args from request_object to invoke the chosen service function. don\'t use data not exist or ambiguous in request", "question": "question to ask the caller if anything not sure or missing for request to args mapping, *no* guess or assumption of the mapping. null if the mapping is crystal clear." }"}', + // '{"endpoint":"POST:/boards/list","args":["invoker","apiKey"],"mapping":"(invoker, request_object)=>{ let apiKey = request_object.params.ids; return [invoker, apiKey]; }","question":"What is the API key for this request? It is not provided in the request_object."}', + // ), + // addLlmCache( + // prisma, + // 'map2Endpoints', + // 'given below service endpoints:\nservice test-callgent {\n "GET /positions": {"summary":"listPositions: List all job positions", "description":"Retrieve a list of all available job positions.", "params":{}, "responses":{"200":{"description":"A list of job positions","content":{"application/json":{"schema":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","description":"Unique identifier for the job position"},"title":{"type":"string","description":"Title of the job position"},"description":{"type":"string","description":"Description of the job position"},"location":{"type":"string","description":"Location of the job position"},"requirements":{"type":"array","items":{"type":"string"},"description":"List of requirements for the job position"},"createdAt":{"type":"string","format":"date-time","description":"Timestamp when the job position was created"},"updatedAt":{"type":"string","format":"date-time","description":"Timestamp when the job position was last updated"}}}}}}},"500":{"description":"Internal Server Error"}} },\n}\n\nPlease choose relevant endpoints to fulfill below request:\n{\n"requesting endpoint": "GET /positions",\n"request from": "restAPI",\n"request_object": {"url":"/positions","method":"GET","headers":{"accept":"*/*","accept-encoding":"gzip, deflate, br","cache-control":"no-cache","connection":"keep-alive","host":"127.0.0.1:3000","user-agent":"Apifox/1.0.0 (https://apifox.com)"},"query":{}},\n}\nand code for request_object to chosen function args mapping. if any data missing/unclear/ambiguous from request_object to invocation args, please ask question to the caller in below json.question field.\n\noutput a single-line json object:\n{ "endpoint": "the chosen API endpoint to be invoked", "args":"params/body/headers/..., with same structure as the \'params\' JSON object(no more args than it) with additional \'value\' prop, or null if no args needed", "mapping": "if the the request_object is structured (or null if unstructured), generate the js function (request_object)=>{...;return API_signature_args;}, full implementation to return the **real** args from request_object to invoke the API. don\'t use data not exist or ambiguous in request", "question": "question to ask the caller if anything not sure or missing for request to args mapping, *no* guess or assumption of the mapping. null if the mapping is crystal clear." }"}', + // '{ "endpoint": "GET /positions", "args": null, "mapping": "(request_object)=>{return null;}", "question": null }', + // ), + // addLlmCache( + // prisma, + // 'map2Endpoints', + // 'given below service endpoints:\nservice test-callgent {\n "POST /api/users/send-confirm-email": {"summary":"UsersController_sendConfirmEmail: Reset password by sending validation email with reset url", "description":" Tags: Users", "params":{"parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"email":{"type":"string","example":"user@example.com","nullable":false},"create":{"type":"boolean","description":"If true, a new user will be created if not exists.","nullable":true},"resetPwd":{"type":"boolean","description":"If set to false, only validating email. Note: new user forces resetPwd.","nullable":true}},"required":["email"]}}}}}, "responses":{"201":{"description":"","content":{"application/json":{"schema":{"allOf":[{"type":"object","properties":{"statusCode":{"type":"number","description":"Status code, empty means success"},"message":{"type":"string"},"data":{"type":"object"},"meta":{"type":"object","description":"Pagination, usage, quotation, profiling, versions, HATEOAS, etc."}},"required":["data"]},{"properties":{"data":{"type":"boolean"}}}]}}}}} },\n}\n\nPlease choose relevant endpoints to fulfill below request:\n{\n"requesting endpoint": "POST /api/users/send-confirm-email",\n"request from": "restAPI",\n"request_object": {"url":"/api/users/send-confirm-email","method":"POST","headers":{"accept":"*/*","accept-encoding":"gzip, deflate, br","cache-control":"no-cache","connection":"keep-alive","content-length":"53","content-type":"application/json","host":"127.0.0.1:3000","user-agent":"Apifox/1.0.0 (https://apifox.com)"},"params":{},"data":{"email":"dev@callgent.com","resetPwd":true}},\n}\nand code for request_object to chosen function args mapping. if any data missing/unclear/ambiguous from request_object to invocation args, please ask question to the caller in below json.question field.\n\noutput a single-line json object:\n{ "endpoint": "the chosen API endpoint to be invoked", "args":"params/body/headers/..., with same structure as the \'params\' JSON object(no more args than it) with additional \'value\' prop, or null if no args needed", "mapping": "if the the request_object is structured (or null if unstructured), generate the js function (request_object)=>{...;return API_signature_args;}, full implementation to return the **real** args from request_object to invoke the API. don\'t use data not exist or ambiguous in request", "question": "question to ask the caller if anything not sure or missing for request to args mapping, *no* guess or assumption of the mapping. null if the mapping is crystal clear." }"}', + // '```json\n{\n "endpoint": "POST /api/users/send-confirm-email",\n "args": {\n "params": null,\n "body": {\n "email": { "value": "dev@callgent.com" },\n "resetPwd": { "value": true }\n },\n "headers": null\n },\n "mapping": "(request_object) => {\n const { data } = request_object;\n return {\n body: {\n email: { value: data.email },\n resetPwd: { value: data.resetPwd }\n }\n };\n }",\n "question": null\n}\n```', + // ), + // addLlmCache( + // prisma, + // 'map2Endpoints', + // 'given below service endpoints:\nservice test-callgent {\n "POST /api/users/send-confirm-email": {"summary":"UsersController_sendConfirmEmail: Reset password by sending validation email with reset url", "description":" Tags: Users", "params":{"parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"email":{"type":"string","example":"user@example.com","nullable":false},"create":{"type":"boolean","description":"If true, a new user will be created if not exists.","nullable":true},"resetPwd":{"type":"boolean","description":"If set to false, only validating email. Note: new user forces resetPwd.","nullable":true}},"required":["email"]}}}}}, "responses":{"201":{"description":"","content":{"application/json":{"schema":{"allOf":[{"type":"object","properties":{"statusCode":{"type":"number","description":"Status code, empty means success"},"message":{"type":"string"},"data":{"type":"object"},"meta":{"type":"object","description":"Pagination, usage, quotation, profiling, versions, HATEOAS, etc."}},"required":["data"]},{"properties":{"data":{"type":"boolean"}}}]}}}}} },\n}\n\nPlease choose relevant endpoints to fulfill below request:\n{\n"requesting endpoint": "POST /api/users/send-confirm-email",\n"request from": "restAPI",\n"request_object": {"url":"/api/users/send-confirm-email","method":"POST","headers":{"accept":"*/*","accept-encoding":"gzip, deflate, br","connection":"keep-alive","content-length":"53","content-type":"application/json","host":"127.0.0.1:3000","user-agent":"Apifox/1.0.0 (https://apifox.com)"},"params":{},"data":{"email":"dev@callgent.com","resetPwd":true}},\n}\nand code for request_object to chosen function args mapping. if any data missing/unclear/ambiguous from request_object to invocation args, please ask question to the caller in below json.question field.\n\noutput a single-line json object:\n{ "endpoint": "the chosen API endpoint to be invoked", "args":"params/body/headers/..., with same structure as the \'params\' JSON object(no more args than it) with additional \'value\' prop, or null if no args needed", "mapping": "if the the request_object is structured (or null if unstructured), generate the js function (request_object)=>{...;return API_signature_args;}, full implementation to return the **real** args from request_object to invoke the API. don\'t use data not exist or ambiguous in request", "question": "question to ask the caller if anything not sure or missing for request to args mapping, *no* guess or assumption of the mapping. null if the mapping is crystal clear." }"}', + // '```json\n{\n "endpoint": "POST /api/users/send-confirm-email",\n "args": {\n "params": null,\n "body": {\n "email": { "value": "dev@callgent.com" },\n "resetPwd": { "value": true }\n },\n "headers": null\n },\n "mapping": "(request_object) => {\n const { data } = request_object;\n return {\n body: {\n email: { value: data.email },\n resetPwd: { value: data.resetPwd }\n }\n };\n }",\n "question": null\n}\n```', + // ), + // addLlmCache( + // prisma, + // 'convert2Response', + // 'Given the openAPI endpoint:\n{"endpoint": "GET /positions", "summary":"listPositions: List all job positions", "description":"Retrieve a list of all available job positions.", "params":{}, "responses":{"200":{"description":"A list of job positions","content":{"application/json":{"schema":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","description":"Unique identifier for the job position"},"title":{"type":"string","description":"Title of the job position"},"description":{"type":"string","description":"Description of the job position"},"location":{"type":"string","description":"Location of the job position"},"requirements":{"type":"array","items":{"type":"string"},"description":"List of requirements for the job position"},"createdAt":{"type":"string","format":"date-time","description":"Timestamp when the job position was created"},"updatedAt":{"type":"string","format":"date-time","description":"Timestamp when the job position was last updated"}}}}}}},"500":{"description":"Internal Server Error"}} }\n\ninvoked with the following request:\n<--- request begin ---\n[]\n--- request end --->\n\nwe receive below response content:\n<--- response begin ---\nWe are pleased to inform you about the following job positions available at our company:\r\n\r\n1. Software Engineer\r\n   - Description: Develop and maintain software applications.\r\n   - Location: San Francisco, CA\r\n   - Requirements:\r\n     - Bachelor\'s degree in Computer Science or related field\r\n     - 3+ years of experience in software development\r\n     - Proficient in Java or Python\r\n   - Created At: October 1, 2023, 12:00 PM\r\n   - Updated At: October 1, 2023, 12:00 PM\r\n\r\n2. Product Manager\r\n   - Description: Define product strategy and roadmap.\r\n   - Location: New York, NY\r\n   - Requirements:\r\n     - Bachelor\'s degree in Business or related field\r\n     - 5+ years of experience in product management\r\n     - Strong analytical and problem-solving skills\r\n   - Created At: October 2, 2023, 10:00 AM\r\n   - Updated At: October 2, 2023, 10:00 AM\r\n\r\n3. Data Scientist\r\n   - Description: Analyze and interpret complex data to assist in decision-making.\r\n   - Location: Seattle, WA\r\n   - Requirements:\r\n     - Master\'s degree in Data Science or related field\r\n     - 2+ years of experience in data analysis\r\n     - Proficient in Python and SQL\r\n   - Created At: October 3, 2023, 8:00 AM\r\n   - Updated At: October 3, 2023, 8:00 AM\r\n\r\nPlease review the details and let us know if you are interested in any of these positions.\r\n\r\nBest regards\r\n> From: "Callgent Invoker"\r\n> Date: Thu, Sep 5, 2024, 14:44\r\n> Subject: [Callgent] Function calling: \'GET /positions\' from Callgent test-callgent. #xY5WGrPph-jn2HHn4_aLi\r\n> To: "dev"\r\n> [image: https://hgggdgi.r.bh.d.sendibt3.com/tr/op/CYIv2yvoVWHCvjQ__eO-QxCY-FkqVvmIPWtQz6OMpAh55LRbe8vKq9aHSdoB0TikwlnXx5U6VsnDPf9637MS7iqb_BpOIcAej4CvQCx2hCA2upHiNg6mXVisqoSvihA0UM9ymGtL9RJsmgdosYMyVW2iHwS9m9UcLtnagkPE-HXmIE8L4EkAApInhajwSZuVsine_ltWzXmBzfU9jp6e5g]\r\n> Hello dev!\r\n> Somebody is calling: \'GET /positions\' from Callgent test-callgent. Below is the detailed request information:\r\n> Function Calling:\r\n> Name:GET /positions\r\n> Summary:listPositions: List all job positions\r\n> Description:Retrieve a list of all available job positions.\r\n> Possible Responses:\r\n> Response OK:A list of job positions\r\n> [{"id":"Unique identifier for the job position","title":"Title of the job position","description":"Description of the job position","location":"Location of the job position","requirements":["string"],"createdAt":"format: date-time, Timestamp when the job position was created","updatedAt":"format: date-time, Timestamp when the job position was last updated"}]\r\n> Response Internal Server Error:Internal Server Error\r\n> \r\n> \r\n> Thu, 05 Sep 2024 06:44:13 GMT\r\n\n--- response end --->\n\nPlease formalize the response content as a single-lined JSON object:\n{"statusCode": "the exact response code(integer) defined in API", "data": "extracted response value with respect to the corresponding API response schema, or undefined if abnormal response", "error": "message": "error message if abnormal response, otherwise undefined"}', + // '{\n "statusCode": 200,\n "data": [\n {\n "id": "1",\n "title": "Software Engineer",\n "description": "Develop and maintain software applications.",\n "location": "San Francisco, CA",\n "requirements": [\n "Bachelor\'s degree in Computer Science or related field",\n "3+ years of experience in software development",\n "Proficient in Java or Python"\n ],\n "createdAt": "2023-10-01T12:00:00Z",\n "updatedAt": "2023-10-01T12:00:00Z"\n },\n {\n "id": "2",\n "title": "Product Manager",\n "description": "Define product strategy and roadmap.",\n "location": "New York, NY",\n "requirements": [\n "Bachelor\'s degree in Business or related field",\n "5+ years of experience in product management",\n "Strong analytical and problem-solving skills"\n ],\n "createdAt": "2023-10-02T10:00:00Z",\n "updatedAt": "2023-10-02T10:00:00Z"\n },\n {\n "id": "3",\n "title": "Data Scientist",\n "description": "Analyze and interpret complex data to assist in decision-making.",\n "location": "Seattle, WA",\n "requirements": [\n "Master\'s degree in Data Science or related field",\n "2+ years of experience in data analysis",\n "Proficient in Python and SQL"\n ],\n "createdAt": "2023-10-03T08:00:00Z",\n "updatedAt": "2023-10-03T08:00:00Z"\n }\n ]\n}', + // ), ]; } diff --git a/prisma/seed.ts b/prisma/seed.ts index 0affea8..b138c62 100644 --- a/prisma/seed.ts +++ b/prisma/seed.ts @@ -188,40 +188,65 @@ async function initLlmTemplates( >, ) { const llmTemplates: Prisma.LlmTemplateUncheckedCreateInput[] = [ + // { + // name: 'api2Function', + // prompt: `Please convert below API doc of format {{=it.format}}: + // { "{{=it.apiName}}": {{=it.apiContent}} } + + // into a js function, the function must be as follows: + // // the \`invoker\` function do the real invocation + // async (invoker: {{=it.handle}}, ...apiParams) {...; const json = await invoker(...); ...; return apiResult; } + + // please generate the js function with **full implementation and error handling**! output a single-line json object: + // {"epName":"endpoint name", "params":["invoker", ...apiParams]"documents":"formal js function documentation with description of params and response object with **all properties elaborated** exactly same as the API doc", "fullCode":"(invoker, ...)=>{...; const json = await invoker(...); ...; return apiResult;}"}`, + // }, { - name: 'api2Function', - prompt: `Please convert below API doc of format {{=it.format}}: -{ "{{=it.apiName}}": {{=it.apiContent}} } + name: 'map2Endpoint', + prompt: `given below service endpoint: +service {{=it.callgentName}} {{{~ it.endpoints :ep }} + "{{=ep.name}}": {"summary":"{{=ep.summary}}", {{=ep.description ? '"description":"'+ep.description+'", ':''}}"params":{{=JSON.stringify(ep.params)}}, "responses":{{=JSON.stringify(ep.responses)}} }, +{{~}}} -into a js function, the function must be as follows: -// the \`invoker\` function do the real invocation -async (invoker: {{=it.handle}}, ...apiParams) {...; const json = await invoker(...); ...; return apiResult; } +Please generate js function req2Args(request) to map below request into endpoint args following the openAPI params schema: +const request_object = {{=JSON.stringify(it.req)}}; -please generate the js function with **full implementation and error handling**! output a single-line json object: -{"epName":"endpoint name", "params":["invoker", ...apiParams]"documents":"formal js function documentation with description of params and response object with **all properties elaborated** exactly same as the API doc", "fullCode":"(invoker, ...)=>{...; const json = await invoker(...); ...; return apiResult;}"}`, +output single-line json object below: +{ "req2Args": "Full code of js function req2Args(request_object):ArgsMap, to map request into endpoint args. ArgsMap is a k-v map of vars in endpoint.params(no conflict keys, no more props than it, especially requestBody's key is '$requestBody$'), all values just extracted from request_object, but no direct constant in code from request_object, all calculated from request_object props as variables!" }`, }, { name: 'map2Endpoints', - prompt: `given below service APIs: -service {{=it.callgentName}} {{{~ it.endpoints :fun }} - "API: {{=fun.name}}": {"endpoint": "{{=fun.name}}", "summary":"{{=fun.summary}}", {{=fun.description ? '"description":"'+fun.description+'", ':''}}"params":{{=JSON.stringify(fun.params)}}, "responses":{{=JSON.stringify(fun.responses)}} }, + prompt: `given below service endpoints: +service {{=it.callgentName}} {{{~ it.endpoints :ep }} + "{{=ep.name}}": {"summary":"{{=ep.summary}}", {{=ep.description ? '"description":"'+ep.description+'", ':''}}"params":{{=JSON.stringify(ep.params)}}, "responses":{{=JSON.stringify(ep.responses)}} }, {{~}}} -Please choose one API to fulfill below request: -{ +Please choose relevant endpoints to fulfill below request: +const request = { {{ if (it.epName) { }}"requesting endpoint": "{{=it.epName}}", {{ } }}"request from": "{{=it.cepAdaptor}}", "request_object": {{=JSON.stringify(it.req)}}, +}, +using the js macro function: +\`\`\`typescript +async function macro(macroParams) { + const ctx = {}; // context vars across endpoint invocations to final response + // logic script which uses \`callServerEndpoint(epId, epParams)\` to get final result + // NOTE: macroParams/epParams are k-v map of needed vars, especially requestBody's key is '$requestBody$' + const result = await invokeEndpoints(macroParams, ctx) + // wrap result into response + const resp = wrapResp(ctx, macroParams, result); + return resp; } -and code for request_object to chosen function args mapping. if any data missing/unclear/ambiguous from request_object to invocation args, please ask question to the caller in below json.question field. +// implementation of: invokeEndpoints/wrapResp +\`\`\` -output a single-line json object: -{ "endpoint": "the chosen API endpoint to be invoked", "args":"params/body/headers/..., with same structure as the 'params' JSON object(no more args than it) with additional 'value' prop, or null if no args needed", "mapping": "if the the request_object is structured (or null if unstructured), generate the js function (request_object)=>{...;return API_signature_args;}, full implementation to return the **real** args from request_object to invoke the API. don't use data not exist or ambiguous in request", "question": "question to ask the caller if anything not sure or missing for request to args mapping, *no* guess or assumption of the mapping. null if the mapping is crystal clear." }"}`, +output single-line json object below: +{ "question": "question to ask the caller if anything not sure or missing for request to args mapping, *no* guess or assumption of the mapping. '' if the args mapping is crystal clear. if question not empty, all subsequent props(endpoints, macroParams,..) left empty", "endpoints": ["the chosen API endpoints to be invoked"], "summary":"short summary", "description":"Description help using this macro", "macroParams":"object of formal openAPI format json: {parameters?:[], requestBody?:{"content":{[mediaType]:..}}}, macro incoming params", "macroResponse": "object of formal openAPI format json {[http-code]:any}, final macro response", "args": "k-v map of needed args in \`macro-params\`(no conflict keys, no more props than it, '$requestBody$' is key for requestBody arg), all values just extracted from request.request_object, this is the actual args value to call \`const resp=await macro(args)\`", "invokeEndpoints": "full code of async js function(macroParams:MacroParams, ctx). no direct constant extracted from request.request_object", "wrapResp": "full code of js function(ctx, macroParams, result) to get resp matching \`macroResponse\` schema. No direct constant extracted from request.request_object" }`, }, { name: 'convert2Response', prompt: `Given the openAPI endpoint: -{"endpoint": "{{=it.fun.name}}", "summary":"{{=it.fun.summary}}", {{=it.fun.description ? '"description":"'+it.fun.description+'", ':''}}"params":{{=JSON.stringify(it.fun.params)}}, "responses":{{=JSON.stringify(it.fun.responses)}} } +{"endpoint": "{{=it.ep.name}}", "summary":"{{=it.ep.summary}}", {{=it.ep.description ? '"description":"'+it.ep.description+'", ':''}}"params":{{=JSON.stringify(it.ep.params)}}, "responses":{{=JSON.stringify(it.ep.responses)}} } invoked with the following request: <--- request begin --- diff --git a/src/agents/agents.service.ts b/src/agents/agents.service.ts index 9f6ccbf..7e538ad 100644 --- a/src/agents/agents.service.ts +++ b/src/agents/agents.service.ts @@ -1,15 +1,21 @@ +import { TransactionHost } from '@nestjs-cls/transactional'; +import { TransactionalAdapterPrisma } from '@nestjs-cls/transactional-adapter-prisma'; import { BadRequestException, HttpException, Injectable } from '@nestjs/common'; import { EndpointDto } from '../endpoints/dto/endpoint.dto'; import { ClientRequestEvent } from '../entries/events/client-request.event'; import { EventListenersService } from '../event-listeners/event-listeners.service'; import { ProgressiveRequestEvent } from './events/progressive-request.event'; import { LLMService } from './llm.service'; +import { PrismaClient } from '@prisma/client'; +/** early validation principle[EVP]: validate generated content ASAP. + * TODO: forward to user to validate macro signature (progressively)? program validate generated schema */ @Injectable() export class AgentsService { constructor( private readonly llmService: LLMService, private readonly eventListenersService: EventListenersService, + private readonly txHost: TransactionHost, ) {} // async api2Function( @@ -29,36 +35,92 @@ export class AgentsService { // } /** - * map req to an API function, generate args(with vars/conversations), argsMapping function if applicable + * map req to an API endpoint + * - if epName means invoke: map to exact endpoint, load/gen mapArgs(req), no question + * - if no epName request: generate exec macro function, may question */ async map2Endpoints( reqEvent: ClientRequestEvent, ): Promise { - const { - id, - srcId, - dataType: cepAdaptor, - data: { callgentName, epName, progressive }, - context: { tgtEvents, req }, - } = reqEvent; - const endpoints = reqEvent.context - .endpoints as unknown as EndpointDto[]; + const endpoints = reqEvent.context.endpoints as unknown as EndpointDto[]; if (!endpoints?.length) throw new BadRequestException( - 'No endpoints for mapping, ClientRequestEvent#' + id, + 'No endpoints for mapping, ClientRequestEvent#' + reqEvent.id, ); // FIXME map from all targetId events - // TODO how to use mapping function: for specific req & function + // if epName, try find mapArgs function by [cepAdaptor, epName] + const mapped = await (reqEvent.data.epName + ? this._map2Endpoint(reqEvent) + : this._map2Endpoints(reqEvent)); + if (!mapped) return; + if ('data' in mapped) return mapped; + + reqEvent.context.map2Endpoints = mapped; + } + + /** progressive not supported for invoking */ + protected async _map2Endpoint(reqEvent: ClientRequestEvent) { + const { + id, + srcId, + dataType: cenAdaptor, + data: { callgentName, epName }, + context: { endpoints, tgtEvents, req }, + } = reqEvent; + const endpoint: EndpointDto = endpoints[0]; + + // load existing (srcId, epName) + const prisma = this.txHost.tx as PrismaClient; + const rec = await prisma.req2ArgsRepo.findUnique({ + select: { req2Args: true }, + where: { cepId_sepId: { cepId: srcId, sepId: endpoint.id } }, + }); + if (rec) return rec; + + // generate + if (!endpoint.params || Object.keys(endpoint.params).length == 0) + return { req2Args: '() => ({})', args: {} }; // no params const mapped = await this.llmService.template( - 'map2Endpoints', - { req, epName, callgentName, cepAdaptor, endpoints }, - { endpoint: '', args: {}, mapping: '', question: '' }, + 'map2Endpoint', + { req, epName, callgentName, cepAdaptor: cenAdaptor, endpoints }, + { + returnType: { req2Args: '', args: {} }, + bizKey: id, + validate: (data) => ((data.args = eval(data.req2Args)(req)), true), + }, + ); + return mapped; + } + + protected async _map2Endpoints(reqEvent: ClientRequestEvent) { + const { id, - ); // TODO check `epName` exists in endpoints, validating `mapping` - reqEvent.context.map2Endpoints = mapped; + srcId, + dataType: cenAdaptor, + data: { callgentName, epName, progressive }, + context: { endpoints, tgtEvents, req }, + } = reqEvent; + + const mapped = await this.llmService.template( + 'map2Endpoints', + { req, epName, callgentName, cepAdaptor: cenAdaptor, endpoints }, + { + returnType: { + question: '', + endpoints: [''], + components: [], + args: {}, + macroParams: [], + macroResponse: '', + invokeEndpoints: '', + wrapResp: '', + }, + bizKey: id, + }, + ); if (mapped.question) { if (!progressive) @@ -72,73 +134,77 @@ export class AgentsService { statusCode, message, } = await this.eventListenersService.emit( - new ProgressiveRequestEvent(srcId, id, cepAdaptor, { + new ProgressiveRequestEvent(srcId, id, cenAdaptor, { progressive, // mapped, }), ); if (!statusCode) // direct return, no persistent async - return this.map2FunctionProgressive(prEvent, reqEvent); + return this.map2EndpointsProgressive(prEvent, reqEvent); if (statusCode == 2) // pending - return { data: reqEvent, resumeFunName: 'map2FunctionProgressive' }; + return { data: reqEvent, resumeFunName: 'map2EndpointsProgressive' }; throw new HttpException(message, statusCode); } else { - const endpoints = reqEvent.context.endpoints.filter( - (f) => f.name == mapped.endpoint, + const endpoints = reqEvent.context.endpoints.filter((ep) => + mapped.endpoints.includes(ep.name), ); - if (endpoints?.length != 1) - throw new BadRequestException('Failed to map to function: ' + mapped); + if (!endpoints.length) + throw new BadRequestException( + 'Error: mapped to none endpoint: ' + mapped, + ); reqEvent.context.endpoints = endpoints; - mapped.args = this._args2List30x(mapped.args); + return mapped; } } /** progressive response, to continue mapping */ - async map2FunctionProgressive( + async map2EndpointsProgressive( data: ProgressiveRequestEvent, reqEvent?: ClientRequestEvent, ): Promise { // handle resp } - private _args2List30x(args: object) { - const list = []; - if (!args) return list; - const { parameters, requestBody } = args as any; - parameters?.forEach((p) => { - if (!p.value) - throw new BadRequestException('Missing value for parameter:' + p.name); - list.push(p); - }); - if (requestBody) { - if (!requestBody.value) - throw new BadRequestException('Missing value for requestBody'); - list.push({ - ...requestBody, - name: 'Request Body', - // content: this._formatMediaType(requestBody.content), - }); // TODO format - } - return list; - } + // private _args2List30x(args: object) { + // const list = []; + // if (!args) return list; + // const { parameters, requestBody } = args as any; + // parameters?.forEach((p) => { + // // if (!p.value) + // // throw new BadRequestException('Missing value for parameter:' + p.name); + // list.push(p); + // }); + // if (requestBody) { + // // if (!requestBody.value) + // // throw new BadRequestException('Missing value for requestBody'); + // list.push({ + // ...requestBody, + // name: 'Request Body', + // // content: this._formatMediaType(requestBody.content), + // }); // TODO format + // } + // return list; + // } /** convert resp content into one of fun.responses */ async convert2Response( args: { name: string; value: any }[], resp: string, - fun: EndpointDto, + ep: EndpointDto, eventId: string, ) { args = args?.map((a) => ({ name: a.name, value: a.value })) || []; const mapped = await this.llmService.template( 'convert2Response', - { args, resp, fun }, - { statusCode: 200, data: {} }, - eventId, + { args, resp, ep }, + { + returnType: { statusCode: 200, data: {} }, + bizKey: eventId, + }, ); // TODO check `epName` exists in endpoints, validating `mapping` return { statusCode: mapped.statusCode, data: mapped.data }; diff --git a/src/agents/llm.service.ts b/src/agents/llm.service.ts index 88e5d2d..a116810 100644 --- a/src/agents/llm.service.ts +++ b/src/agents/llm.service.ts @@ -1,6 +1,6 @@ import { Transactional, TransactionHost } from '@nestjs-cls/transactional'; import { TransactionalAdapterPrisma } from '@nestjs-cls/transactional-adapter-prisma'; -import { Injectable } from '@nestjs/common'; +import { Injectable, Logger } from '@nestjs/common'; import { ConfigService } from '@nestjs/config'; import { EventEmitter2 } from '@nestjs/event-emitter'; import { PrismaClient } from '@prisma/client'; @@ -18,18 +18,27 @@ export class LLMService { ) { dot.templateSettings.strip = false; } + private readonly logger = new Logger(LLMService.name); /** * @param template prompt template name * @param args prompt args * @param returnType if not empty, try to parse the response as the specified json + * @param validate if error: retry default times, true/false: stop retry, void: force retry. default retry is 3 */ @Transactional() async template( template: string, args: { [key: string]: any }, - returnType?: T, - bizKey?: string, + { + returnType, + bizKey, + validate, + }: { + returnType?: T; + bizKey?: string; + validate?: (generated: T, retry: number) => boolean | void; + }, ): Promise { const prompt = await this._prompt(template, args); @@ -61,8 +70,24 @@ export class LLMService { // check type this._checkJsonType(returnType, ret, isArray); } - - if (notCached) await this._llmCache(template, prompt, result); + let [maxRetry, valid] = [3, undefined]; + for (let i = 0; i < maxRetry; i++) { + try { + valid = !validate || validate(ret, i); + } catch (e) { + this.logger.warn( + '[retry %d/%d] Fail validating generated content: \n%s\n\t%s', + i + 1, + maxRetry, + prompt.replace(/\n/g, '\\n'), + result.replace(/\n/g, '\\n'), + ); + continue; // default retry + } + if (typeof valid === 'boolean') break; // force stop + maxRetry = i + 2; // force retry + } + if (valid && notCached) await this._llmCache(template, prompt, result); return ret; } @@ -81,7 +106,10 @@ export class LLMService { } protected async _llmCache(name: string, prompt: string, result?: string) { - if (prompt.length > 8190) return; + if (prompt.length > 8190) { + this.logger.warn({ name, prompt, result }); + return; + } const prisma = this.txHost.tx as PrismaClient; if (result) return prisma.llmCache.upsert({ @@ -107,7 +135,7 @@ export class LLMService { if (!tplStr?.prompt) throw new Error(`LLM Template ${template} not found`); - this.template[template] = tpl = dot.template(tplStr.prompt); + this.templates[template] = tpl = dot.template(tplStr.prompt); } try { return tpl(args); diff --git a/src/bootstrap.ts b/src/bootstrap.ts index 929af96..af30261 100644 --- a/src/bootstrap.ts +++ b/src/bootstrap.ts @@ -54,7 +54,7 @@ async function bootstrap(app: NestFastifyApplication, port: string) { app, 1, 'Callgent APIs', - 'The Callgent APIs', + 'The Callgent APIs. Download Callgent-openAPI.json, or Callgent-openAPI.yaml', logger, ); diff --git a/src/emails/templates/relay-sep-invoke.dot b/src/emails/templates/relay-sep-invoke.dot index a0ac53c..07769a2 100644 --- a/src/emails/templates/relay-sep-invoke.dot +++ b/src/emails/templates/relay-sep-invoke.dot @@ -3,43 +3,43 @@ -[Callgent] Function calling: '{{=it.fun.name}}' from Callgent {{=it.sep.callgent.name}}. #{{=it.relayId}} - +[Callgent] Function calling: '{{=it.endpoint.name}}' from Callgent {{=it.sentry.callgent.name}}. #{{=it.relayId}} +

Hello {{=it.to[0].name }}!

-

Somebody is calling: '{{=it.fun.name}}' from Callgent {{=it.sep.callgent.name}}. Below is the detailed request information:

+

Somebody is calling: '{{=it.endpoint.name}}' from Callgent {{=it.sentry.callgent.name}}. Below is the detailed request information:


Calling Function:
Name: - {{=it.fun.name}} + {{=it.endpoint.name}}
- {{ if (it.fun.summary) { }} + {{ if (it.endpoint.summary) { }}
Summary: - {{=it.fun.summary}} + {{=it.endpoint.summary}}
{{ } }} - {{ if (it.fun.description) { }} + {{ if (it.endpoint.description) { }}
Description: - {{=it.fun.description}} + {{=it.endpoint.description}}
{{ } }}
-{{ if (it.args.length) { }} +{{ if (it.params.length) { }}
Function Arguments: - {{~it.args :arg}} + {{~it.params :param}}
- {{=arg.name}}{{=arg.required ? '*' : ''}}: - {{=arg.description}} -
{{=JSON.stringify(arg.value)}}
+ {{=param.name}}{{=param.required ? '*' : ''}}: + {{=param.description}} +
{{=JSON.stringify(param.value)}}
{{~}}
diff --git a/src/entries/adaptors/builtin/email/email.adaptor.ts b/src/entries/adaptors/builtin/email/email.adaptor.ts index 3aaa283..e10486c 100644 --- a/src/entries/adaptors/builtin/email/email.adaptor.ts +++ b/src/entries/adaptors/builtin/email/email.adaptor.ts @@ -89,27 +89,28 @@ export class EmailAdaptor extends EntryAdaptor { * * @param fun - endpoint * @param args - function arguments - * @param sep - server entry + * @param sen - server entry * @param reqEvent - client request event */ async invoke( - fun: EndpointDto, + endpoint: EndpointDto, args: object, - sep: Entry, + sentry: Entry, reqEvent: ClientRequestEvent, ) { const emailFrom = this.emailsService.getRelayAddress( reqEvent.id, EmailRelayKey.request, ); - const { host: emailTo } = sep; + const { host: emailTo } = sentry; - const responses = this._responses30x(fun.responses); + const params = this._params30x(endpoint.params, args); + const responses = this._responses30x(endpoint.responses); return this.emailsService .sendTemplateEmail( emailTo, 'relay-sep-invoke', - { relayId: reqEvent.id, fun, sep, args, responses }, + { relayId: reqEvent.id, endpoint, sentry, params, responses }, { email: emailFrom, name: 'Callgent Invoker' }, ) .then((res) => ({ @@ -122,7 +123,26 @@ export class EmailAdaptor extends EntryAdaptor { })); } - private _responses30x(responses: any) { + /** openAPI 3.0.x */ + protected _params30x(params: any, args: object) { + const ret = []; + const { parameters, requestBody } = params; + parameters?.forEach((p) => { + ret.push({ ...p, value: args[p.name] }); + }); + if (requestBody) { + const item: any = { name: 'requestBody' }; + // item.content = this._formatMediaType(requestBody.content); + item.value = args['$requestBody$']; + if (requestBody.required) item.required = requestBody.required; + if (requestBody.description) item.description = requestBody.description; + ret.push(item); + } + return ret; + } + + /** openAPI 3.0.x */ + protected _responses30x(responses: any) { const list = []; if (!responses) return list; if (responses.default) @@ -140,7 +160,7 @@ export class EmailAdaptor extends EntryAdaptor { return list; } - private _formatMediaType(content: any) { + protected _formatMediaType(content: any) { const list = []; if (!content) return content; diff --git a/src/entries/adaptors/builtin/restapi/restapi.controller.ts b/src/entries/adaptors/builtin/restapi/restapi.controller.ts index 233e9c6..e5241e9 100644 --- a/src/entries/adaptors/builtin/restapi/restapi.controller.ts +++ b/src/entries/adaptors/builtin/restapi/restapi.controller.ts @@ -16,30 +16,17 @@ import { ApiHeader, ApiOperation, ApiParam, - ApiProperty, ApiTags, ApiUnauthorizedResponse, } from '@nestjs/swagger'; import { EntryType } from '@prisma/client'; -import { IsNotEmpty, IsString } from 'class-validator'; import { CallgentsService } from '../../../../callgents/callgents.service'; import { EventListenersService } from '../../../../event-listeners/event-listeners.service'; import { JwtGuard } from '../../../../infra/auth/jwt/jwt.guard'; import { Utils } from '../../../../infra/libs/utils'; import { EntriesService } from '../../../entries.service'; import { ClientRequestEvent } from '../../../events/client-request.event'; - -export class Requirement { - @ApiProperty({ - description: 'Requirement for callgent to fulfill.', - example: - 'I want to apply for the Senior Algorithm Engineer based in Singapore.', - required: true, - }) - @IsNotEmpty() - @IsString() - requirement: string; -} +import { RequestRequirement } from '../../dto/request-requirement.dto'; /** global rest-api entry entry */ @ApiTags('Client Entry: Rest-API') @@ -58,9 +45,17 @@ export class RestApiController { description: 'AI agent will generate code to invoke several functional endpoints to fulfill the requirement.', }) + @ApiHeader({ + name: 'x-callgent-progressive', + required: false, + description: 'progressive request responder', + }) @Post('request/:callgentId/:entryId') @ApiUnauthorizedResponse() - async request(@Body() req: Requirement) { + async request( + @Body() req: RequestRequirement, + @Headers('x-callgent-progressive') progressive?: string, + ) { // TODO } @@ -84,11 +79,11 @@ export class RestApiController { 'rest/invoke/:callgentId/:entryId/`resource-path-here`. the wildcard path, may be empty', }) @ApiHeader({ name: 'x-callgent-taskId', required: false }) - @ApiHeader({ - name: 'x-callgent-progressive', - required: false, - description: 'progressive request responder', - }) + // @ApiHeader({ + // name: 'x-callgent-progressive', + // required: false, + // description: 'progressive request responder', + // }) @ApiHeader({ name: 'x-callgent-callback', required: false }) @ApiHeader({ name: 'x-callgent-timeout', required: false }) @ApiUnauthorizedResponse() @@ -98,7 +93,7 @@ export class RestApiController { @Param('callgentId') callgentId: string, @Param('entryId') entryId?: string, @Headers('x-callgent-taskId') taskId?: string, - @Headers('x-callgent-progressive') progressive?: string, + // @Headers('x-callgent-progressive') progressive?: string, @Headers('x-callgent-callback') callback?: string, @Headers('x-callgent-timeout') timeout?: string, ) { @@ -135,7 +130,7 @@ export class RestApiController { callgentId, callgentName: callgent.name, callerId, - progressive, + // progressive, FIXME progressive not supported for invoking? epName, }, callback, diff --git a/src/entries/adaptors/builtin/web/webpage.controller.ts b/src/entries/adaptors/builtin/web/webpage.controller.ts index a4c965e..7be4791 100644 --- a/src/entries/adaptors/builtin/web/webpage.controller.ts +++ b/src/entries/adaptors/builtin/web/webpage.controller.ts @@ -6,6 +6,7 @@ import { Inject, NotFoundException, Param, + Post, Query, Req, Res, @@ -15,31 +16,18 @@ import { ApiHeader, ApiOperation, ApiParam, - ApiProperty, ApiQuery, ApiTags, ApiUnauthorizedResponse, } from '@nestjs/swagger'; import { EntryType } from '@prisma/client'; -import { IsNotEmpty, IsString } from 'class-validator'; import { CallgentsService } from '../../../../callgents/callgents.service'; import { EventListenersService } from '../../../../event-listeners/event-listeners.service'; import { JwtGuard } from '../../../../infra/auth/jwt/jwt.guard'; import { Utils } from '../../../../infra/libs/utils'; import { EntriesService } from '../../../entries.service'; import { ClientRequestEvent } from '../../../events/client-request.event'; - -export class Requirement { - @ApiProperty({ - description: 'Requirement for callgent to fulfill.', - example: - 'I want to apply for the Senior Algorithm Engineer based in Singapore.', - required: true, - }) - @IsNotEmpty() - @IsString() - requirement: string; -} +import { RequestRequirement } from '../../dto/request-requirement.dto'; /** to generate web pages based on request and callgent endpoints */ @ApiTags('Client Entry: Webpage') @@ -59,19 +47,25 @@ export class WebpageController { description: 'AI agent will instantly generate page to fulfill the requirement.', }) + @ApiHeader({ + name: 'x-callgent-progressive', + required: false, + description: 'progressive request responder', + }) @ApiQuery({ name: 'taskId', required: false, description: 'Conversation Id', }) - @Get('request/:callgentId/:entryId') + @Post('request/:callgentId/:entryId') async request( - @Body() requirement: Requirement, + @Body() requirement: RequestRequirement, @Param('callgentId') callgentId: string, @Req() req, @Res() res, @Param('entryId') entryId?: string, @Query('taskId') taskId?: string, + @Headers('x-callgent-progressive') progressive?: string, ) { const { entry, callgent } = await this._load(callgentId, entryId); @@ -85,7 +79,7 @@ export class WebpageController { callgentId, callgentName: callgent.name, callerId: req.user?.sub, - // progressive, // 是否需要渐进式? + progressive, }, // callback, // 是否需要异步返回结果 ), @@ -95,7 +89,7 @@ export class WebpageController { // [gen view/model/view-model, response] - // remove: | s-auth, invoke-service + // remove: | s-auth for all eps/entries, invoke-service // return generated webpage const code = result.statusCode || 200; @@ -121,11 +115,6 @@ export class WebpageController { 'rest/invoke/:callgentId/:entryId/`resource-path-here`. the wildcard path, may be empty', }) @ApiHeader({ name: 'x-callgent-taskId', required: false }) - @ApiHeader({ - name: 'x-callgent-progressive', - required: false, - description: 'progressive request responder', - }) @ApiHeader({ name: 'x-callgent-callback', required: false }) @ApiHeader({ name: 'x-callgent-timeout', required: false }) @Get('invoke/:callgentId/:entryId/*') diff --git a/src/entries/adaptors/dto/request-requirement.dto.ts b/src/entries/adaptors/dto/request-requirement.dto.ts new file mode 100644 index 0000000..72dd845 --- /dev/null +++ b/src/entries/adaptors/dto/request-requirement.dto.ts @@ -0,0 +1,31 @@ +import { ApiProperty } from '@nestjs/swagger'; +import { IsBoolean, IsNotEmpty, IsString } from 'class-validator'; + +/** request with requirement description */ +export class RequestRequirement { + @ApiProperty({ + description: 'Requirement for callgent to fulfill.', + example: + 'I want to apply for the Senior Algorithm Engineer based in Singapore.', + required: true, + }) + @IsNotEmpty() + @IsString() + requirement: string; + + @ApiProperty({ + description: + 'When extract service invoking args from requirement, whether ignore optional or nullable service params if absent', + default: true, + }) + @IsBoolean() + ignoreOptionalOrNullableParamsIfAbsentInRequirement = true; + + @ApiProperty({ + description: + 'When extract service invoking args from requirement, whether to use default value of service params if absent', + default: true, + }) + @IsBoolean() + useDefaultParamValuesIfAbsentInRequirement = true; +} diff --git a/src/entries/adaptors/entry-adaptor.base.ts b/src/entries/adaptors/entry-adaptor.base.ts index 185f0dc..6d8b814 100644 --- a/src/entries/adaptors/entry-adaptor.base.ts +++ b/src/entries/adaptors/entry-adaptor.base.ts @@ -119,12 +119,8 @@ export abstract class EntryAdaptor { for (const [path, pathApis] of ps) { const entries = Object.entries(pathApis); for (const [method, restApi] of entries) { - const summary = `${ - restApi.operationId ? restApi.operationId + ': ' : '' - }${restApi.summary}`; - let description = restApi.description || ''; - if (restApi.tags?.length) - description += ` Tags: ${restApi.tags.join(', ')}`; + const summary = `${restApi.operationId || ''}${restApi.operationId && restApi.summary ? ': ' : ''}${restApi.summary || ''}`; + const description = `${restApi.description || ''}${restApi.description && restApi.tags?.length ? '; ' : ''}${restApi.tags?.length ? 'Tags: ' + restApi.tags.join(', ') : ''}`; const responses = restApi.responses; const params = { parameters: restApi.parameters, @@ -135,7 +131,7 @@ export abstract class EntryAdaptor { // TODO restApi.callbacks ret.apis.push({ - path: path.toLowerCase(), + path, method: method.toUpperCase(), summary, description, diff --git a/src/entries/entries.service.ts b/src/entries/entries.service.ts index 89b23f4..8c79d3a 100644 --- a/src/entries/entries.service.ts +++ b/src/entries/entries.service.ts @@ -309,7 +309,7 @@ export class EntriesService implements OnModuleInit { throw new Error('Failed to invoke, No mapping function found'); const func = endpoints[0] as EndpointDto; - const sep = await this.findOne(func.entryId, { + const sen = await this.findOne(func.entryId, { id: true, name: true, type: true, @@ -320,12 +320,12 @@ export class EntriesService implements OnModuleInit { callgentId: true, callgent: { select: { id: true, name: true } }, }); - const adapter = sep && this.getAdaptor(sep.adaptorKey, EntryType.SERVER); + const adapter = sen && this.getAdaptor(sen.adaptorKey, EntryType.SERVER); if (!adapter) throw new Error('Failed to invoke, No SEP adaptor found'); // may returns pending result return adapter - .invoke(func, map2Endpoints.args, sep as any, reqEvent) + .invoke(func, map2Endpoints.args, sen as any, reqEvent) .then((res) => { if (res && res.resumeFunName) return res; return this.postInvokeSEP((res && res.data) || reqEvent); diff --git a/src/event-listeners/event-listeners.service.ts b/src/event-listeners/event-listeners.service.ts index 2731d82..9f1855d 100644 --- a/src/event-listeners/event-listeners.service.ts +++ b/src/event-listeners/event-listeners.service.ts @@ -54,7 +54,7 @@ export class EventListenersService { ? Promise.race([ result, Utils.sleep(timeout).then(() => ({ - data, + data: { ...data, context: undefined }, statusCode: 1, message: `Sync invocation timeout(${timeout}ms), will respond via callback`, })), @@ -141,8 +141,8 @@ export class EventListenersService { statusCode = funName ? 2 // pending : event.stopPropagation || idx >= listeners.length - ? 0 // done - : 1; // processing + ? 0 // done + : 1; // processing if (funName || event.stopPropagation) break; } catch (e) { statusCode = e.status || -1; // error @@ -165,8 +165,8 @@ export class EventListenersService { statusCode == 1 ? listeners[idx] // processing: next : statusCode == 0 || (statusCode > 2 && statusCode < 399) - ? null // success: null - : listeners[idx - 1]; // error/pending: current + ? null // success: null + : listeners[idx - 1]; // error/pending: current await this.eventStoresService.upsertEvent( event, funName || null, From 61cdc2e3b192049c3421ae0210e12435947ecb36 Mon Sep 17 00:00:00 2001 From: dev-callgent Date: Sat, 19 Oct 2024 10:22:29 +0800 Subject: [PATCH 101/183] feat: agent for invoke/request Signed-off-by: dev-callgent --- src/emails/templates/relay-sep-invoke.dot | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/emails/templates/relay-sep-invoke.dot b/src/emails/templates/relay-sep-invoke.dot index 07769a2..1075e56 100644 --- a/src/emails/templates/relay-sep-invoke.dot +++ b/src/emails/templates/relay-sep-invoke.dot @@ -3,13 +3,13 @@ -[Callgent] Function calling: '{{=it.endpoint.name}}' from Callgent {{=it.sentry.callgent.name}}. #{{=it.relayId}} +[Callgent] Function calling: '{{=it.endpoint.name}}' of Callgent {{=it.sentry.callgent.name}}. #{{=it.relayId}} -

Hello {{=it.to[0].name }}!

+

Hello {{=it.to[0].name }}, howdy!

-

Somebody is calling: '{{=it.endpoint.name}}' from Callgent {{=it.sentry.callgent.name}}. Below is the detailed request information:

+

Someone is calling: '{{=it.endpoint.name}}' from Callgent {{=it.sentry.callgent.name}}. Below is the detailed request information:


@@ -59,6 +59,8 @@
{{ } }}
+Note: You may reply this request in natural language text, and make sure all required information in the Response Schema is provided! +

{{=new Date().toUTCString() }} From 126aeafee6c5e32fa633d5104e9cc3069134f478 Mon Sep 17 00:00:00 2001 From: dev-callgent Date: Sat, 19 Oct 2024 10:48:44 +0800 Subject: [PATCH 102/183] feat: agent for invoke/request Signed-off-by: dev-callgent --- prisma/seed.ts | 2 +- src/entries/adaptors/builtin/restapi/restapi.controller.ts | 5 ++--- src/entries/adaptors/builtin/web/webpage.controller.ts | 5 +---- src/entries/adaptors/builtin/web/webpage.service.ts | 3 ++- src/entries/events/client-request.event.ts | 4 ++-- 5 files changed, 8 insertions(+), 11 deletions(-) diff --git a/prisma/seed.ts b/prisma/seed.ts index b138c62..fced0d8 100644 --- a/prisma/seed.ts +++ b/prisma/seed.ts @@ -122,7 +122,7 @@ function initEventListeners( dataType: 'Webpage', serviceType: 'SERVICE', serviceName: 'WebpagesService', - funName: 'genWebpage', + funName: 'genWebpages', description: 'Generate webpage[view/model/view-model] from request & endpoints', createdBy: 'GLOBAL', diff --git a/src/entries/adaptors/builtin/restapi/restapi.controller.ts b/src/entries/adaptors/builtin/restapi/restapi.controller.ts index e5241e9..612babd 100644 --- a/src/entries/adaptors/builtin/restapi/restapi.controller.ts +++ b/src/entries/adaptors/builtin/restapi/restapi.controller.ts @@ -78,7 +78,7 @@ export class RestApiController { description: 'rest/invoke/:callgentId/:entryId/`resource-path-here`. the wildcard path, may be empty', }) - @ApiHeader({ name: 'x-callgent-taskId', required: false }) + // @ApiHeader({ name: 'x-callgent-taskId', required: false }) // @ApiHeader({ // name: 'x-callgent-progressive', // required: false, @@ -92,7 +92,7 @@ export class RestApiController { @Res() res, @Param('callgentId') callgentId: string, @Param('entryId') entryId?: string, - @Headers('x-callgent-taskId') taskId?: string, + // @Headers('x-callgent-taskId') taskId?: string, // @Headers('x-callgent-progressive') progressive?: string, @Headers('x-callgent-callback') callback?: string, @Headers('x-callgent-timeout') timeout?: string, @@ -123,7 +123,6 @@ export class RestApiController { const result = await this.eventListenersService.emit( new ClientRequestEvent( cep.id, - taskId, cep.adaptorKey, req, { diff --git a/src/entries/adaptors/builtin/web/webpage.controller.ts b/src/entries/adaptors/builtin/web/webpage.controller.ts index 7be4791..1a282ed 100644 --- a/src/entries/adaptors/builtin/web/webpage.controller.ts +++ b/src/entries/adaptors/builtin/web/webpage.controller.ts @@ -72,13 +72,13 @@ export class WebpageController { const result = await this.eventListenersService.emit( new ClientRequestEvent( entry.id, - taskId, entry.adaptorKey, requirement, { callgentId, callgentName: callgent.name, callerId: req.user?.sub, + taskId, progressive, }, // callback, // 是否需要异步返回结果 @@ -114,7 +114,6 @@ export class WebpageController { description: 'rest/invoke/:callgentId/:entryId/`resource-path-here`. the wildcard path, may be empty', }) - @ApiHeader({ name: 'x-callgent-taskId', required: false }) @ApiHeader({ name: 'x-callgent-callback', required: false }) @ApiHeader({ name: 'x-callgent-timeout', required: false }) @Get('invoke/:callgentId/:entryId/*') @@ -124,7 +123,6 @@ export class WebpageController { @Res() res, @Param('callgentId') callgentId: string, @Param('entryId') entryId?: string, - @Headers('x-callgent-taskId') taskId?: string, @Headers('x-callgent-progressive') progressive?: string, @Headers('x-callgent-callback') callback?: string, @Headers('x-callgent-timeout') timeout?: string, @@ -138,7 +136,6 @@ export class WebpageController { const result = await this.eventListenersService.emit( new ClientRequestEvent( entry.id, - taskId, entry.adaptorKey, req, { diff --git a/src/entries/adaptors/builtin/web/webpage.service.ts b/src/entries/adaptors/builtin/web/webpage.service.ts index d1c6073..b243a73 100644 --- a/src/entries/adaptors/builtin/web/webpage.service.ts +++ b/src/entries/adaptors/builtin/web/webpage.service.ts @@ -17,10 +17,11 @@ export class WebpageService { /** Generate webpage[view/model/view-model], then respond the src code */ @Transactional() - async genWebpage( + async genWebpages( data: ClientRequestEvent, ): Promise { data.stopPropagation = true; // stop event propagation + return { data }; } } diff --git a/src/entries/events/client-request.event.ts b/src/entries/events/client-request.event.ts index 5f56583..334c01f 100644 --- a/src/entries/events/client-request.event.ts +++ b/src/entries/events/client-request.event.ts @@ -12,8 +12,6 @@ export class ClientRequestEvent extends EventObject { constructor( /** client entry id */ entryId: string, - /** empty to create new task */ - taskId: string, dataType: string, req: object, public readonly data: { @@ -23,6 +21,8 @@ export class ClientRequestEvent extends EventObject { callerId?: string; /** requested endpoint name */ epName?: string /** url template for progressive requesting, `callgent:epName[@callgent]` to invoke callgent */; + /** empty to create new task */ + taskId?: string; progressive?: string; }, callback?: string, From 5853c08b4fccfb06e35993b67c10d38375bac4e7 Mon Sep 17 00:00:00 2001 From: dev-callgent Date: Sat, 19 Oct 2024 18:59:52 +0800 Subject: [PATCH 103/183] refactor: event task id Signed-off-by: dev-callgent --- prisma/schema.prisma | 43 +++++++++++-------- prisma/seed.ts | 2 +- src/agents/agents.service.ts | 4 +- .../builtin/restapi/restapi.controller.ts | 1 + .../builtin/web/webpage.controller.ts | 10 +++-- src/entries/events/client-request.event.ts | 2 +- src/event-listeners/event-object.ts | 4 +- src/event-stores/event-stores.service.ts | 27 ++++++------ 8 files changed, 53 insertions(+), 40 deletions(-) diff --git a/prisma/schema.prisma b/prisma/schema.prisma index 3dc8f75..132b25a 100644 --- a/prisma/schema.prisma +++ b/prisma/schema.prisma @@ -165,9 +165,12 @@ model Callgent { // add to migration.sql tenantPk Int @default(dbgenerated("(current_setting('tenancy.tenantPk')::int)")) - name String @db.VarChar(255) - avatar String? @db.VarChar(1023) - summary String? @db.VarChar(4095) + name String @db.VarChar(255) + avatar String? @db.VarChar(1023) + /// @description Summary to quickly understand in what scenarios to use this service. + summary String? @default("") @db.VarChar(4095) + /// @description Instruction to know roughly on how to use this service: concepts/operations etc. + instruction String? @default("") @db.VarChar(4095) /// @DtoCreateApiResponse /// @DtoUpdateApiResponse @@ -246,15 +249,19 @@ model Entry { // add to migration.sql tenantPk Int @default(dbgenerated("(current_setting('tenancy.tenantPk')::int)")) - name String @default("") @db.VarChar(2047) + name String @default("") @db.VarChar(2047) + /// @description Summary to quickly understand in what scenarios to use this service. + summary String? @default("") @db.VarChar(4095) + /// @description Instruction to know roughly on how to use this service: concepts/operations etc. + instruction String? @default("") @db.VarChar(4095) /// @DtoUpdateApiResponse /// @DtoPlainApiResponse - type EntryType /// @description entry type: CLIENT, SERVER OR EVENT + type EntryType /// @description entry type: CLIENT, SERVER OR EVENT /// @DtoCreateApiResponse /// @DtoUpdateApiResponse /// @DtoPlainApiResponse - adaptorKey String @db.VarChar(127) /// @description entry adaptor key - priority Int @default(0) /// @description priority in the callgent + adaptorKey String @db.VarChar(127) /// @description entry adaptor key + priority Int @default(0) /// @description priority in the callgent /// @DtoCreateOptional host String @db.VarChar(2047) /// @description host address, client entry host are *generated*, e.g. '/api/rest/invoke/rbhes0-w4rff/{id}', where `{id}` will be replaced with current entry id @@ -302,16 +309,16 @@ model Endpoint { /// @DtoCreateApiResponse /// @DtoUpdateApiResponse /// @DtoPlainApiResponse - name String @db.VarChar(1023) /// @description `${method} ${path}` - path String @db.VarChar(1000) /// @description openAPI path - method String @db.VarChar(15) /// @description openAPI method - summary String @default("") @db.VarChar(511) - description String @default("") @db.VarChar(1023) + name String @db.VarChar(1023) /// @description `${method} ${path}` + path String @db.VarChar(1000) /// @description openAPI path + method String @db.VarChar(15) /// @description openAPI method + summary String? @default("") @db.VarChar(2047) + description String? @default("") @db.VarChar(4095) /// @DtoCastType(RealmSecurityVO, ../../callgent-realms/dto/realm-security.vo) - securities Json[] @db.Json /// @description RealmSecurityVO[], where RealmSecurityVO{ [realmName]: RealmSecurityItem } - params Json? @db.Json /// @description declaration of API params - responses Json? @db.Json /// @description declaration of API responses - rawJson Json @db.Json + securities Json[] @db.Json /// @description RealmSecurityVO[], where RealmSecurityVO{ [realmName]: RealmSecurityItem } + params Json? @db.Json /// @description declaration of API params + responses Json? @db.Json /// @description declaration of API responses + rawJson Json @db.Json // @DtoReadOnly /// @CustomValidator(EntityIdExists, 'callgent', 'id', ../../infra/repo/validators/entity-exists.validator) @@ -581,7 +588,7 @@ model EventStore { /// @Description src entity id which bind to the listener srcId String @db.VarChar(36) /// @Description target id to relate several events - targetId String? @db.VarChar(36) + taskId String? @db.VarChar(36) eventType String @db.VarChar(36) dataType String @db.VarChar(36) /// @Description callback url or parent event id to invoke @@ -608,5 +615,5 @@ model EventStore { deletedAt DateTime? /// @description logical deletion. @@index([srcId]) - @@index([targetId]) + @@index([taskId]) } diff --git a/prisma/seed.ts b/prisma/seed.ts index fced0d8..9f820b1 100644 --- a/prisma/seed.ts +++ b/prisma/seed.ts @@ -96,7 +96,7 @@ function initEventListeners( serviceName: 'EventStoresService', funName: 'loadTargetEvents', description: - 'Load all events of same targetId into event.context.tgtEvents', + 'Load all events of same taskId into event.context.tgtEvents', createdBy: 'GLOBAL', priority: (priority += 100), }, diff --git a/src/agents/agents.service.ts b/src/agents/agents.service.ts index 7e538ad..bd282ae 100644 --- a/src/agents/agents.service.ts +++ b/src/agents/agents.service.ts @@ -48,7 +48,7 @@ export class AgentsService { 'No endpoints for mapping, ClientRequestEvent#' + reqEvent.id, ); - // FIXME map from all targetId events + // FIXME map from all taskId events // if epName, try find mapArgs function by [cepAdaptor, epName] const mapped = await (reqEvent.data.epName @@ -110,6 +110,8 @@ export class AgentsService { { returnType: { question: '', + summary: '', + description: '', endpoints: [''], components: [], args: {}, diff --git a/src/entries/adaptors/builtin/restapi/restapi.controller.ts b/src/entries/adaptors/builtin/restapi/restapi.controller.ts index 612babd..916a577 100644 --- a/src/entries/adaptors/builtin/restapi/restapi.controller.ts +++ b/src/entries/adaptors/builtin/restapi/restapi.controller.ts @@ -125,6 +125,7 @@ export class RestApiController { cep.id, cep.adaptorKey, req, + null, { callgentId, callgentName: callgent.name, diff --git a/src/entries/adaptors/builtin/web/webpage.controller.ts b/src/entries/adaptors/builtin/web/webpage.controller.ts index 1a282ed..c71936b 100644 --- a/src/entries/adaptors/builtin/web/webpage.controller.ts +++ b/src/entries/adaptors/builtin/web/webpage.controller.ts @@ -74,11 +74,11 @@ export class WebpageController { entry.id, entry.adaptorKey, requirement, + taskId, { callgentId, callgentName: callgent.name, callerId: req.user?.sub, - taskId, progressive, }, // callback, // 是否需要异步返回结果 @@ -128,8 +128,10 @@ export class WebpageController { @Headers('x-callgent-timeout') timeout?: string, ) { const basePath = `invoke/${callgentId}/${entryId}/`; - let epName = req.url.substr(req.url.indexOf(basePath) + basePath.length); - if (epName) epName = Utils.formalApiName(req.method, '/' + epName); + let pageName = req.url.substr(req.url.indexOf(basePath) + basePath.length); + if (pageName) pageName = Utils.formalApiName(req.method, '/' + pageName); + // FIXME: invoke page name, not epName + // preprocess, c-auth, [load code, view route] const { entry, callgent } = await this._load(callgentId, entryId); @@ -138,12 +140,12 @@ export class WebpageController { entry.id, entry.adaptorKey, req, + null, { callgentId, callgentName: callgent.name, callerId: req.user?.sub, progressive, - epName, }, callback, ), diff --git a/src/entries/events/client-request.event.ts b/src/entries/events/client-request.event.ts index 334c01f..79ae5a2 100644 --- a/src/entries/events/client-request.event.ts +++ b/src/entries/events/client-request.event.ts @@ -14,6 +14,7 @@ export class ClientRequestEvent extends EventObject { entryId: string, dataType: string, req: object, + taskId: string, public readonly data: { callgentId: string; callgentName: string; @@ -22,7 +23,6 @@ export class ClientRequestEvent extends EventObject { /** requested endpoint name */ epName?: string /** url template for progressive requesting, `callgent:epName[@callgent]` to invoke callgent */; /** empty to create new task */ - taskId?: string; progressive?: string; }, callback?: string, diff --git a/src/event-listeners/event-object.ts b/src/event-listeners/event-object.ts index 421233a..563ffac 100644 --- a/src/event-listeners/event-object.ts +++ b/src/event-listeners/event-object.ts @@ -7,8 +7,8 @@ export class EventObject { public readonly srcId: string, public readonly eventType: string, public readonly dataType: string, - /** target id to relate several events */ - public targetId: string, + /** task id to relate several events */ + public taskId: string, /** url template for response callback, `callgent:epName[@callgent]` to invoke callgent */ public callback?: string, public readonly callbackType: EventCallbackType = 'EVENT', diff --git a/src/event-stores/event-stores.service.ts b/src/event-stores/event-stores.service.ts index eaaea97..6319bf5 100644 --- a/src/event-stores/event-stores.service.ts +++ b/src/event-stores/event-stores.service.ts @@ -11,20 +11,20 @@ export class EventStoresService { private readonly txHost: TransactionHost, ) {} - /** create random targetId if not set, else load all events of targetId */ + /** load all events of taskId if not empty */ async loadTargetEvents(event: EventObject) { - const { id, targetId } = event; - if (targetId) { - const prisma = this.txHost.tx as PrismaClient; - const es = await prisma.eventStore.findMany({ - select: { id: true, eventType: true, dataType: true, data: true }, // TODO, what to select - where: { AND: [{ NOT: { id } }, { targetId }] }, - orderBy: { id: 'asc' }, - }); - if (!es?.length) - throw new NotFoundException('Invalid event.targetId: ' + targetId); - event.context.tgtEvents = es; - } else event.targetId = Utils.uuid(); // create new targetId + const { id, taskId } = event; + if (!taskId) return; + + const prisma = this.txHost.tx as PrismaClient; + const es = await prisma.eventStore.findMany({ + select: { id: true, eventType: true, dataType: true, data: true }, // TODO, what to select + where: { AND: [{ NOT: { id } }, { taskId }] }, + orderBy: { id: 'asc' }, + }); + if (!es?.length) + throw new NotFoundException('Invalid event.taskId: ' + taskId); + event.context.tgtEvents = es; } findOne(eventId: string) { @@ -46,6 +46,7 @@ export class EventStoresService { funName || (funName = undefined); listenerId || (listenerId = undefined); } + if (!event.taskId) event.taskId = event.id; const prisma = this.txHost.tx as PrismaClient; const data: Prisma.EventStoreCreateInput = { From 1007d0edbf846e105b02ec3e50c955c68d2131b5 Mon Sep 17 00:00:00 2001 From: dev-callgent Date: Sun, 20 Oct 2024 22:37:00 +0800 Subject: [PATCH 104/183] feat: summarizes document summary/instruction Signed-off-by: dev-callgent --- prisma/schema.prisma | 12 +- src/agents/agents.service.ts | 52 ++++++++- src/emails/emails.service.ts | 2 +- src/endpoints/endpoints.service.ts | 105 +++++++++++------- .../events/endpoints-changed.event.ts | 19 ++++ .../listeners/endpoints-changed.listener.ts | 57 ++++++++++ .../adaptors/builtin/web/webpage.service.ts | 7 +- src/entries/entries.module.ts | 4 +- src/entries/events/entries-changed.event.ts | 14 +++ .../listeners/callgent-created.listener.ts | 2 +- .../listeners/entries-changed.listener.ts | 52 +++++++++ src/users/listeners/auth-login.listener.ts | 2 +- src/users/listeners/auth-logined.listener.ts | 2 +- 13 files changed, 274 insertions(+), 56 deletions(-) create mode 100644 src/endpoints/events/endpoints-changed.event.ts create mode 100644 src/endpoints/listeners/endpoints-changed.listener.ts create mode 100644 src/entries/events/entries-changed.event.ts create mode 100644 src/entries/listeners/entries-changed.listener.ts diff --git a/prisma/schema.prisma b/prisma/schema.prisma index 132b25a..07552c7 100644 --- a/prisma/schema.prisma +++ b/prisma/schema.prisma @@ -168,9 +168,9 @@ model Callgent { name String @db.VarChar(255) avatar String? @db.VarChar(1023) /// @description Summary to quickly understand in what scenarios to use this service. - summary String? @default("") @db.VarChar(4095) + summary String? @db.VarChar(4095) /// @description Instruction to know roughly on how to use this service: concepts/operations etc. - instruction String? @default("") @db.VarChar(4095) + instruction String? @db.VarChar(4095) /// @DtoCreateApiResponse /// @DtoUpdateApiResponse @@ -251,9 +251,9 @@ model Entry { name String @default("") @db.VarChar(2047) /// @description Summary to quickly understand in what scenarios to use this service. - summary String? @default("") @db.VarChar(4095) + summary String? @db.VarChar(4095) /// @description Instruction to know roughly on how to use this service: concepts/operations etc. - instruction String? @default("") @db.VarChar(4095) + instruction String? @db.VarChar(4095) /// @DtoUpdateApiResponse /// @DtoPlainApiResponse type EntryType /// @description entry type: CLIENT, SERVER OR EVENT @@ -312,8 +312,8 @@ model Endpoint { name String @db.VarChar(1023) /// @description `${method} ${path}` path String @db.VarChar(1000) /// @description openAPI path method String @db.VarChar(15) /// @description openAPI method - summary String? @default("") @db.VarChar(2047) - description String? @default("") @db.VarChar(4095) + summary String? @db.VarChar(2047) + description String? @db.VarChar(4095) /// @DtoCastType(RealmSecurityVO, ../../callgent-realms/dto/realm-security.vo) securities Json[] @db.Json /// @description RealmSecurityVO[], where RealmSecurityVO{ [realmName]: RealmSecurityItem } params Json? @db.Json /// @description declaration of API params diff --git a/src/agents/agents.service.ts b/src/agents/agents.service.ts index bd282ae..6a362a7 100644 --- a/src/agents/agents.service.ts +++ b/src/agents/agents.service.ts @@ -1,12 +1,14 @@ import { TransactionHost } from '@nestjs-cls/transactional'; import { TransactionalAdapterPrisma } from '@nestjs-cls/transactional-adapter-prisma'; import { BadRequestException, HttpException, Injectable } from '@nestjs/common'; +import { PrismaClient } from '@prisma/client'; import { EndpointDto } from '../endpoints/dto/endpoint.dto'; +import { Endpoint } from '../endpoints/entities/endpoint.entity'; +import { Entry } from '../entries/entities/entry.entity'; import { ClientRequestEvent } from '../entries/events/client-request.event'; import { EventListenersService } from '../event-listeners/event-listeners.service'; import { ProgressiveRequestEvent } from './events/progressive-request.event'; import { LLMService } from './llm.service'; -import { PrismaClient } from '@prisma/client'; /** early validation principle[EVP]: validate generated content ASAP. * TODO: forward to user to validate macro signature (progressively)? program validate generated schema */ @@ -211,4 +213,52 @@ export class AgentsService { return { statusCode: mapped.statusCode, data: mapped.data }; } + + /** + * @param total - whether summarizing from all eps of entry + * @returns + */ + async summarizeEntry({ + entry, + news, + olds, + total, + }: { + entry: { + id: string; + summary?: string; + instruction?: string; + callgentId?: string; + }; + news?: Omit[]; + olds?: Omit[]; + total?: boolean; + }) { + const summary = '', + instruction = ''; + return { summary, instruction, total }; + } + /** + * @param total - whether summarizing from all eps of entry + * @returns + */ + async summarizeCallgent({ + callgent, + news, + olds, + total, + }: { + callgent: { + id: string; + summary?: string; + instruction?: string; + }; + news?: Omit[]; + olds?: Omit[]; + total?: boolean; + }) { + const summary = '', + instruction = ''; + return { summary, instruction, total }; + } } diff --git a/src/emails/emails.service.ts b/src/emails/emails.service.ts index 6754fd5..2c8971c 100644 --- a/src/emails/emails.service.ts +++ b/src/emails/emails.service.ts @@ -150,7 +150,7 @@ export class EmailsService implements OnModuleInit { case 'callgent': // this.logger.debug('relay %j', msg); // FIXME persistent emit, to prevent lost event - this.eventEmitter.emit( + this.eventEmitter.emitAsync( EmailRelayEvent.eventPrefix + relayKey, new EmailRelayEvent(relayKey as EmailRelayKey, relayId, email), ); diff --git a/src/endpoints/endpoints.service.ts b/src/endpoints/endpoints.service.ts index 02d8b7f..87a41c7 100644 --- a/src/endpoints/endpoints.service.ts +++ b/src/endpoints/endpoints.service.ts @@ -6,6 +6,7 @@ import { Injectable, NotFoundException, } from '@nestjs/common'; +import { EventEmitter2 } from '@nestjs/event-emitter'; import { PaginatorTypes, paginator } from '@nodeteam/nestjs-prisma-pagination'; import { EntryType, Prisma, PrismaClient } from '@prisma/client'; import { CallgentRealmsService } from '../callgent-realms/callgent-realms.service'; @@ -18,6 +19,8 @@ import { ClientRequestEvent } from '../entries/events/client-request.event'; import { Utils } from '../infra/libs/utils'; import { selectHelper } from '../infra/repo/select.helper'; import { UpdateEndpointDto } from './dto/update-endpoint.dto'; +import { EndpointsChangedEvent } from './events/endpoints-changed.event'; +import { Endpoint } from './entities/endpoint.entity'; const paginate: PaginatorTypes.PaginateFunction = paginator({ perPage: 10 }); @@ -29,6 +32,7 @@ export class EndpointsService { private readonly endpointsService: EntriesService, @Inject('CallgentRealmsService') private readonly callgentRealmsService: CallgentRealmsService, + private readonly eventEmitter: EventEmitter2, ) {} protected readonly defSelect: Prisma.EndpointSelect = { pk: false, @@ -36,7 +40,7 @@ export class EndpointsService { rawJson: false, params: false, responses: false, - callgentId: false, + // callgentId: false, createdBy: false, deletedAt: false, }; @@ -101,7 +105,20 @@ export class EndpointsService { async create(data: Prisma.EndpointUncheckedCreateInput) { const prisma = this.txHost.tx as PrismaClient; const id = Utils.uuid(); - return prisma.endpoint.create({ data: { ...data, id } }); + const ep = await prisma.endpoint.create({ data: { ...data, id } }); + this._pubEvent({ entry: { id: ep.entryId }, news: [ep] }); + return ep; + } + + protected async _pubEvent(data: { + entry: { id: string; summary?: string; instruction?: string }; + news?: Omit[]; + olds?: Omit[]; + }) { + this.eventEmitter.emitAsync( + EndpointsChangedEvent.eventName, + new EndpointsChangedEvent(data), + ); } @Transactional() @@ -130,49 +147,48 @@ export class EndpointsService { } // validation - const actMap = apis.map( - (f) => { - const ret = { - ...f, - id: Utils.uuid(), - name: Utils.formalApiName(f.method, f.path), - entryId: entry.id, - callgentId: entry.callgentId, - createdBy: createdBy, - }; - if (securities?.length || ret.securities?.length) { - const securitiesMerged = [ - ...(securities || []), - ...(ret.securities || []), - ].map((security) => { - const result: RealmSecurityVO = {}; - Object.entries(security).forEach(([name, scopes]) => { - const realm = realmMap[name]; - if (!Number.isFinite(realm?.pk)) - throw new BadRequestException( - 'Unknown security scheme name: ' + name, - ); - const item = this.callgentRealmsService.constructSecurity( - realm, - entry, - scopes, + const actMap = apis.map((f) => { + const ret = { + ...f, + id: Utils.uuid(), + name: Utils.formalApiName(f.method, f.path), + entryId: entry.id, + callgentId: entry.callgentId, + createdBy: createdBy, + }; + if (securities?.length || ret.securities?.length) { + const securitiesMerged = [ + ...(securities || []), + ...(ret.securities || []), + ].map((security) => { + const result: RealmSecurityVO = {}; + Object.entries(security).forEach(([name, scopes]) => { + const realm = realmMap[name]; + if (!Number.isFinite(realm?.pk)) + throw new BadRequestException( + 'Unknown security scheme name: ' + name, ); + const item = this.callgentRealmsService.constructSecurity( + realm, + entry, + scopes, + ); - result['' + item.realmPk] = item; - }); - return result; + result['' + item.realmPk] = item; }); - ret.securities = securitiesMerged as any; - } - return ret; - }, - ); + return result; + }); + ret.securities = securitiesMerged as any; + } + return ret; + }); // create api endpoints const prisma = this.txHost.tx as PrismaClient; const { count: actionsCount } = await prisma.endpoint.createMany({ data: actMap, }); + this._pubEvent({ entry: entry as any, news: actMap as any[] }); // 根据adaptor,auth type,判定可选的auth servers // FIXME save securitySchemes on entry @@ -193,7 +209,7 @@ export class EndpointsService { ) { if (entry?.type != EntryType.SERVER) throw new BadRequestException( - 'Function entries can only be imported into Server Entry. ', + 'Function endpoints can only be imported into Server Entry. ', ); const apiSpec = await this.endpointsService.parseApis(entry, apiTxt); @@ -239,7 +255,7 @@ export class EndpointsService { findAll({ select, where, - orderBy, + orderBy = { pk: 'asc' }, }: { select?: Prisma.EndpointSelect; where?: Prisma.EndpointWhereInput; @@ -254,25 +270,30 @@ export class EndpointsService { } @Transactional() - delete(id: string) { + async delete(id: string) { const prisma = this.txHost.tx as PrismaClient; - return selectHelper(this.defSelect, (select) => + const ret = await selectHelper(this.defSelect, (select) => prisma.endpoint.delete({ select, where: { id } }), ); + this._pubEvent({ entry: { id: ret.entryId }, olds: [ret] }); + return ret; } @Transactional() - update(dto: UpdateEndpointDto) { + async update(dto: UpdateEndpointDto) { if (!dto.id) return; dto.name = Utils.formalApiName(dto.method, dto.path); const prisma = this.txHost.tx as PrismaClient; - return selectHelper(this.defSelect, (select) => + const old = await this.findOne(dto.id, this.defSelect); + const ret = await selectHelper(this.defSelect, (select) => prisma.endpoint.update({ select, where: { id: dto.id }, data: dto as any, }), ); + this._pubEvent({ entry: { id: ret.entryId }, news: [ret], olds: [old] }); + return ret; } findOne(id: string, select?: Prisma.EndpointSelect) { diff --git a/src/endpoints/events/endpoints-changed.event.ts b/src/endpoints/events/endpoints-changed.event.ts new file mode 100644 index 0000000..7ef2ba6 --- /dev/null +++ b/src/endpoints/events/endpoints-changed.event.ts @@ -0,0 +1,19 @@ +import { Endpoint } from '../entities/endpoint.entity'; + +/** event of endpoints content change, securities excluded */ +export class EndpointsChangedEvent { + public static readonly eventName = 'endpoints.changed' as const; + + constructor( + public readonly data: { + entry: { + id: string; + summary?: string; + instruction?: string; + callgentId?: string; + }; + news?: Omit[]; + olds?: Omit[]; + }, + ) {} +} diff --git a/src/endpoints/listeners/endpoints-changed.listener.ts b/src/endpoints/listeners/endpoints-changed.listener.ts new file mode 100644 index 0000000..0562fbe --- /dev/null +++ b/src/endpoints/listeners/endpoints-changed.listener.ts @@ -0,0 +1,57 @@ +import { Propagation, Transactional } from '@nestjs-cls/transactional'; +import { Inject, Injectable, Logger } from '@nestjs/common'; +import { EventEmitter2, OnEvent } from '@nestjs/event-emitter'; +import { AgentsService } from '../../agents/agents.service'; +import { EntriesService } from '../../entries/entries.service'; +import { EntriesChangedEvent } from '../../entries/events/entries-changed.event'; +import { EndpointsService } from '../endpoints.service'; +import { EndpointsChangedEvent } from '../events/endpoints-changed.event'; + +@Injectable() +export class EndpointsChangedListener { + private readonly logger = new Logger(EndpointsChangedListener.name); + constructor( + @Inject('EndpointsService') + private readonly endpointsService: EndpointsService, + @Inject('EntriesService') + private readonly entriesService: EntriesService, + private readonly eventEmitter: EventEmitter2, + @Inject('AgentsService') + private readonly agentsService: AgentsService, + ) {} + + /** create a callgent with default api client entry, and Email client/server entry */ + @Transactional(Propagation.RequiresNew) + @OnEvent(EndpointsChangedEvent.eventName) + async handleEvent(event: EndpointsChangedEvent) { + this.logger.debug('Handling event: %j', event); + + // re-summarize entry summary/instruction + const { entry, news, olds } = event.data; + if (!entry.callgentId) + event.data.entry = await this.entriesService.findOne(entry.id); + + let result = await this.agentsService.summarizeEntry(event.data); + if (result.total) { + // totally re-summarize + const news = await this.endpointsService.findAll({ + where: { entryId: entry.id }, + }); + result = await this.agentsService.summarizeEntry({ + entry, + news, + total: true, + }); + } + await this.entriesService.update(entry.id, { + summary: result.summary, + instruction: result.instruction, + }); + + // bubble up to the callgent + await this.eventEmitter.emitAsync( + EntriesChangedEvent.eventName, + new EntriesChangedEvent({ callgent: { id: entry.callgentId }, news: [] }), + ); + } +} diff --git a/src/entries/adaptors/builtin/web/webpage.service.ts b/src/entries/adaptors/builtin/web/webpage.service.ts index b243a73..71c5543 100644 --- a/src/entries/adaptors/builtin/web/webpage.service.ts +++ b/src/entries/adaptors/builtin/web/webpage.service.ts @@ -15,13 +15,16 @@ export class WebpageService { private readonly tenancyService: PrismaTenancyService, ) {} - /** Generate webpage[view/model/view-model], then respond the src code */ + /** Generate webpage[view/route/model/view-model], then respond the src code */ @Transactional() async genWebpages( data: ClientRequestEvent, ): Promise { data.stopPropagation = true; // stop event propagation - + + // data.context.req: { requirement } + // data.context.endpoints, target events, + return { data }; } } diff --git a/src/entries/entries.module.ts b/src/entries/entries.module.ts index b992b15..1000447 100644 --- a/src/entries/entries.module.ts +++ b/src/entries/entries.module.ts @@ -9,13 +9,13 @@ import { WebpageService } from './adaptors/builtin/web/webpage.service'; import { EntriesController } from './entries.controller'; import { EntriesService } from './entries.service'; import { CallgentCreatedListener } from './listeners/callgent-created.listener'; +import { EntriesChangedListener } from './listeners/entries-changed.listener'; @Module({ imports: [CallgentsModule], providers: [ { provide: 'EntriesService', useClass: EntriesService }, { provide: 'WebpageService', useClass: WebpageService }, - CallgentCreatedListener, { provide: 'restAPI-EntryAdaptor', useClass: RestAPIAdaptor, @@ -28,6 +28,8 @@ import { CallgentCreatedListener } from './listeners/callgent-created.listener'; provide: 'Email-EntryAdaptor', useClass: EmailAdaptor, }, + CallgentCreatedListener, + EntriesChangedListener, ], controllers: [EntriesController, RestApiController, WebpageController], exports: ['EntriesService'], diff --git a/src/entries/events/entries-changed.event.ts b/src/entries/events/entries-changed.event.ts new file mode 100644 index 0000000..b0f83f1 --- /dev/null +++ b/src/entries/events/entries-changed.event.ts @@ -0,0 +1,14 @@ +import { Entry } from '../entities/entry.entity'; + +/** event of entries content change, securities excluded */ +export class EntriesChangedEvent { + public static readonly eventName = 'entries.changed' as const; + + constructor( + public readonly data: { + callgent: { id: string; summary?: string; instruction?: string }; + news?: Omit[]; + olds?: Omit[]; + }, + ) {} +} diff --git a/src/entries/listeners/callgent-created.listener.ts b/src/entries/listeners/callgent-created.listener.ts index 450aded..3e5f2e7 100644 --- a/src/entries/listeners/callgent-created.listener.ts +++ b/src/entries/listeners/callgent-created.listener.ts @@ -16,7 +16,7 @@ export class CallgentCreatedListener { /** create a callgent with default api client entry, and Email client/server entry */ @Transactional() - @OnEvent(CallgentCreatedEvent.eventName, { async: false }) + @OnEvent(CallgentCreatedEvent.eventName) async handleEvent(event: CallgentCreatedEvent) { this.logger.debug('Handling event: %j', event); diff --git a/src/entries/listeners/entries-changed.listener.ts b/src/entries/listeners/entries-changed.listener.ts new file mode 100644 index 0000000..dec7cb1 --- /dev/null +++ b/src/entries/listeners/entries-changed.listener.ts @@ -0,0 +1,52 @@ +import { Propagation, Transactional } from '@nestjs-cls/transactional'; +import { Inject, Injectable, Logger } from '@nestjs/common'; +import { OnEvent } from '@nestjs/event-emitter'; +import { AgentsService } from '../../agents/agents.service'; +import { CallgentsService } from '../../callgents/callgents.service'; +import { EntriesService } from '../../entries/entries.service'; +import { EntriesChangedEvent } from '../../entries/events/entries-changed.event'; + +@Injectable() +export class EntriesChangedListener { + private readonly logger = new Logger(EntriesChangedListener.name); + constructor( + @Inject('EntriesService') + private readonly entriesService: EntriesService, + private readonly callgentsService: CallgentsService, + @Inject('AgentsService') + private readonly agentsService: AgentsService, + ) {} + + /** create a callgent with default api client entry, and Email client/server entry */ + @Transactional(Propagation.RequiresNew) + @OnEvent(EntriesChangedEvent.eventName) + async handleEvent(event: EntriesChangedEvent) { + this.logger.debug('Handling event: %j', event); + + // re-summarize summary/instruction + const { callgent, news, olds } = event.data; + if (typeof callgent.summary === 'undefined') + event.data.callgent = await this.callgentsService.findOne(callgent.id, { + id: true, + summary: true, + instruction: true, + }); + + let result = await this.agentsService.summarizeCallgent(event.data); + if (result.total) { + // totally re-summarize + const news = await this.entriesService.findAll({ + where: { callgentId: callgent.id }, + }); + result = await this.agentsService.summarizeCallgent({ + callgent, + news, + total: true, + }); + } + await this.entriesService.update(callgent.id, { + summary: result.summary, + instruction: result.instruction, + }); + } +} diff --git a/src/users/listeners/auth-login.listener.ts b/src/users/listeners/auth-login.listener.ts index d40e355..5142f38 100644 --- a/src/users/listeners/auth-login.listener.ts +++ b/src/users/listeners/auth-login.listener.ts @@ -12,7 +12,7 @@ export class AuthLoginListener { private readonly logger = new Logger(AuthLoginListener.name); constructor(private readonly usersService: UsersService) {} - @OnEvent(AuthLoginEvent.eventName, { async: false }) + @OnEvent(AuthLoginEvent.eventName) async handleEvent(event: AuthLoginEvent) { this.logger.debug('Handling event: %j', { ...event, diff --git a/src/users/listeners/auth-logined.listener.ts b/src/users/listeners/auth-logined.listener.ts index 04826da..260c924 100644 --- a/src/users/listeners/auth-logined.listener.ts +++ b/src/users/listeners/auth-logined.listener.ts @@ -10,7 +10,7 @@ export class AuthLoginedListener { private readonly logger = new Logger(AuthLoginedListener.name); - @OnEvent(AuthLoginedEvent.eventName, { async: false }) + @OnEvent(AuthLoginedEvent.eventName) async handleEvent(event: AuthLoginedEvent) { event.user?.tenantPk && this.tenancyService.setTenantId(event.user.tenantPk); From 27074b6331c9c3c85ffa5b2648ab7fa9c4a26396 Mon Sep 17 00:00:00 2001 From: dev-callgent Date: Tue, 22 Oct 2024 08:40:00 +0800 Subject: [PATCH 105/183] feat: summarizes document summary/instruction Signed-off-by: dev-callgent --- .../migration.sql | 30 ++++++++++++ prisma/seed.ts | 48 ++++++++++++++++++- src/agents/agents.service.ts | 38 +++++++-------- src/agents/llm.service.ts | 21 ++++++-- src/endpoints/endpoints.module.ts | 2 + .../listeners/endpoints-changed.listener.ts | 47 ++++++++++++------ src/entries/entries.module.ts | 4 +- src/entries/entries.service.ts | 8 ++-- src/entries/events/entries-changed.event.ts | 11 +++-- .../listeners/entries-changed.listener.ts | 35 +++++++++----- 10 files changed, 183 insertions(+), 61 deletions(-) create mode 100644 prisma/migrations/20241021122842_sum_instruction/migration.sql diff --git a/prisma/migrations/20241021122842_sum_instruction/migration.sql b/prisma/migrations/20241021122842_sum_instruction/migration.sql new file mode 100644 index 0000000..790f00c --- /dev/null +++ b/prisma/migrations/20241021122842_sum_instruction/migration.sql @@ -0,0 +1,30 @@ +/* + Warnings: + + - You are about to drop the column `targetId` on the `EventStore` table. All the data in the column will be lost. + +*/ +-- DropIndex +DROP INDEX "EventStore_targetId_idx"; + +-- AlterTable +ALTER TABLE "Callgent" ADD COLUMN "instruction" VARCHAR(4095); + +-- AlterTable +ALTER TABLE "Endpoint" ALTER COLUMN "summary" DROP NOT NULL, +ALTER COLUMN "summary" DROP DEFAULT, +ALTER COLUMN "summary" SET DATA TYPE VARCHAR(2047), +ALTER COLUMN "description" DROP NOT NULL, +ALTER COLUMN "description" DROP DEFAULT, +ALTER COLUMN "description" SET DATA TYPE VARCHAR(4095); + +-- AlterTable +ALTER TABLE "Entry" ADD COLUMN "instruction" VARCHAR(4095), +ADD COLUMN "summary" VARCHAR(4095); + +-- AlterTable +ALTER TABLE "EventStore" DROP COLUMN "targetId", +ADD COLUMN "taskId" VARCHAR(36); + +-- CreateIndex +CREATE INDEX "EventStore_taskId_idx" ON "EventStore"("taskId"); diff --git a/prisma/seed.ts b/prisma/seed.ts index 9f820b1..7c1a830 100644 --- a/prisma/seed.ts +++ b/prisma/seed.ts @@ -203,7 +203,7 @@ async function initLlmTemplates( { name: 'map2Endpoint', prompt: `given below service endpoint: -service {{=it.callgentName}} {{{~ it.endpoints :ep }} +service {{=it.callgentName}} { {{~ it.endpoints :ep }} "{{=ep.name}}": {"summary":"{{=ep.summary}}", {{=ep.description ? '"description":"'+ep.description+'", ':''}}"params":{{=JSON.stringify(ep.params)}}, "responses":{{=JSON.stringify(ep.responses)}} }, {{~}}} @@ -216,7 +216,7 @@ output single-line json object below: { name: 'map2Endpoints', prompt: `given below service endpoints: -service {{=it.callgentName}} {{{~ it.endpoints :ep }} +service {{=it.callgentName}} { {{~ it.endpoints :ep }} "{{=ep.name}}": {"summary":"{{=ep.summary}}", {{=ep.description ? '"description":"'+ep.description+'", ':''}}"params":{{=JSON.stringify(ep.params)}}, "responses":{{=JSON.stringify(ep.responses)}} }, {{~}}} @@ -261,6 +261,50 @@ we receive below response content: Please formalize the response content as a single-lined JSON object: {"statusCode": "the exact response code(integer) defined in API", "data": "extracted response value with respect to the corresponding API response schema, or undefined if abnormal response", "error": "message": "error message if abnormal response, otherwise undefined"}`, }, + { + name: 'summarizeEntry', + prompt: `Given below API service{{ if (!it.totally) { }} changes: some added/removed endpoints{{ } }}: +Service {{=it.entry.name}} { {{ if (it.totally) { }}{{~ it.news : ep }} + "{{=ep.name}}": {"summary":"{{=ep.summary}}", {{=ep.description ? '"description":"'+ep.description+'", ':''}}"params":{{=JSON.stringify(ep.params)}}, "responses":{{=JSON.stringify(ep.responses)}} },{{~}} +{{ } else { }} + summary: '{{=it.entry.summary}}', + instruction: '{{=it.entry.instruction}}', + endpoints: { {{ if (it.news && it.news.length) { }} + existing: {...}, + added: { {{~ it.news : ep }} + "{{=ep.name}}": {"summary":"{{=ep.summary}}", {{=ep.description ? '"description":"'+ep.description+'", ':''}}"params":{{=JSON.stringify(ep.params)}}, "responses":{{=JSON.stringify(ep.responses)}} },{{~}} + },{{ } }}{{ if (it.olds && it.olds.length) { }} + removed: { {{~ it.olds : ep }} + "{{=ep.name}}": {"summary":"{{=ep.summary}}", {{=ep.description ? '"description":"'+ep.description+'", ':''}}"params":{{=JSON.stringify(ep.params)}}, "responses":{{=JSON.stringify(ep.responses)}} },{{~}} + },{{ } }} + }{{ } }} +}; +Please re-summarize service \`summary\` and \`instruction\`, for user to quickly know when and how to use this service based only on these 2 fields, +output a single-lined JSON object: +{ "totally": "set to true if you need to reload all service endpoints to re-summarize.", "summary": "Concise summary to let users quickly understand in what scenarios to use this service. leave empty if \`totally\` is true.", "instruction": "Concise instruction to let users know roughly on how to use this service: concepts/operations etc. leave empty if \`totally\` is true." }`, + }, + { + name: 'summarizeCallgent', + prompt: `Given below API service{{ if (!it.totally) { }} changes: some added/removed functional entries{{ } }}: +Service {{=it.callgent.name}} { {{ if (it.totally) { }}{{~ it.news : ep }} + "Entry#{{=ep.pk}}": {"summary":"{{=ep.summary}}", "instruction":"{{=ep.instruction}}"},{{~}} +{{ } else { }} + summary: '{{=it.callgent.summary}}', + instruction: '{{=it.callgent.instruction}}', + entries: { {{ if (it.news && it.news.length) { }} + existing: {...}, + added: { {{~ it.news : ep }} + "Entry#{{=ep.pk}}": {"summary":"{{=ep.summary}}", "instruction":"{{=ep.instruction}}"},{{~}} + },{{ } }}{{ if (it.olds && it.olds.length) { }} + removed: { {{~ it.olds : ep }} + "Entry#{{=ep.pk}}": {"summary":"{{=ep.summary}}", "instruction":"{{=ep.instruction}}"},{{~}} + },{{ } }} + }{{ } }} +}; +Please re-summarize service \`summary\` and \`instruction\`, for user to quickly know when and how to use this service based only on these 2 fields, +output a single-lined JSON object: +{ "totally": "set to true if you need to reload all service entries to re-summarize.", "summary": "Concise summary to let users quickly understand in what scenarios to use this service. leave empty if \`totally\` is true. 3k chars most", "instruction": "Concise instruction to let users know roughly on how to use this service: concepts/operations etc. leave empty if \`totally\` is true. 3k chars most" }`, + }, ]; return llmTemplates.map((llmTpl) => diff --git a/src/agents/agents.service.ts b/src/agents/agents.service.ts index 6a362a7..77d126f 100644 --- a/src/agents/agents.service.ts +++ b/src/agents/agents.service.ts @@ -209,7 +209,7 @@ export class AgentsService { returnType: { statusCode: 200, data: {} }, bizKey: eventId, }, - ); // TODO check `epName` exists in endpoints, validating `mapping` + ); // TODO validating `mapping` return { statusCode: mapped.statusCode, data: mapped.data }; } @@ -218,12 +218,7 @@ export class AgentsService { * @param total - whether summarizing from all eps of entry * @returns */ - async summarizeEntry({ - entry, - news, - olds, - total, - }: { + async summarizeEntry(data: { entry: { id: string; summary?: string; @@ -232,22 +227,20 @@ export class AgentsService { }; news?: Omit[]; olds?: Omit[]; - total?: boolean; + totally?: boolean; }) { - const summary = '', - instruction = ''; - return { summary, instruction, total }; + const result = await this.llmService.template('summarizeEntry', data, { + returnType: { summary: '', instruction: '', totally: true }, + bizKey: data.entry.id, + }); + return result; } + /** * @param total - whether summarizing from all eps of entry * @returns */ - async summarizeCallgent({ - callgent, - news, - olds, - total, - }: { + async summarizeCallgent(data: { callgent: { id: string; summary?: string; @@ -255,10 +248,13 @@ export class AgentsService { }; news?: Omit[]; olds?: Omit[]; - total?: boolean; + totally?: boolean; }) { - const summary = '', - instruction = ''; - return { summary, instruction, total }; + const result = await this.llmService.template('summarizeCallgent', data, { + returnType: { summary: '', instruction: '', totally: true }, + bizKey: data.callgent.id, + }); + + return result; } } diff --git a/src/agents/llm.service.ts b/src/agents/llm.service.ts index a116810..c12bed9 100644 --- a/src/agents/llm.service.ts +++ b/src/agents/llm.service.ts @@ -107,21 +107,36 @@ export class LLMService { protected async _llmCache(name: string, prompt: string, result?: string) { if (prompt.length > 8190) { - this.logger.warn({ name, prompt, result }); + this.logger.warn( + '>>> Prompt too long to cache: name: %s, prompt: \n%s\n\n\tresult: %s', + { name, prompt, result }, + ); return; } const prisma = this.txHost.tx as PrismaClient; - if (result) + if (result) { + this.logger.debug( + '>>>> Write LLM result to cache: name: %s, prompt: %s\n\n\tresult: %s', + { + name, + prompt, + result, + }, + ); return prisma.llmCache.upsert({ where: { prompt_name: { prompt, name } }, create: { name, prompt, result }, update: { name, prompt, result }, }); + } - return prisma.llmCache.findUnique({ + const ret = await prisma.llmCache.findUnique({ where: { prompt_name: { prompt, name } }, select: { result: true }, }); + if (ret) + this.logger.debug('>>> Hit LLM result cache: %s, %s', name, ret.result); + return ret; } protected async _prompt(template: string, args: { [key: string]: any }) { diff --git a/src/endpoints/endpoints.module.ts b/src/endpoints/endpoints.module.ts index 9129d75..407b5ab 100644 --- a/src/endpoints/endpoints.module.ts +++ b/src/endpoints/endpoints.module.ts @@ -3,11 +3,13 @@ import { CallgentRealmsModule } from '../callgent-realms/callgent-realms.module' import { EntriesModule } from '../entries/entries.module'; import { EndpointsController } from './endpoints.controller'; import { EndpointsService } from './endpoints.service'; +import { EndpointsChangedSumEntryListener } from './listeners/endpoints-changed.listener'; @Module({ imports: [EntriesModule, CallgentRealmsModule], providers: [ { provide: 'EndpointsService', useClass: EndpointsService }, + EndpointsChangedSumEntryListener, ], controllers: [EndpointsController], exports: ['EndpointsService'], diff --git a/src/endpoints/listeners/endpoints-changed.listener.ts b/src/endpoints/listeners/endpoints-changed.listener.ts index 0562fbe..5da39c4 100644 --- a/src/endpoints/listeners/endpoints-changed.listener.ts +++ b/src/endpoints/listeners/endpoints-changed.listener.ts @@ -7,9 +7,10 @@ import { EntriesChangedEvent } from '../../entries/events/entries-changed.event' import { EndpointsService } from '../endpoints.service'; import { EndpointsChangedEvent } from '../events/endpoints-changed.event'; +/** summarize entry when eps changed */ @Injectable() -export class EndpointsChangedListener { - private readonly logger = new Logger(EndpointsChangedListener.name); +export class EndpointsChangedSumEntryListener { + private readonly logger = new Logger(EndpointsChangedSumEntryListener.name); constructor( @Inject('EndpointsService') private readonly endpointsService: EndpointsService, @@ -27,31 +28,49 @@ export class EndpointsChangedListener { this.logger.debug('Handling event: %j', event); // re-summarize entry summary/instruction - const { entry, news, olds } = event.data; - if (!entry.callgentId) - event.data.entry = await this.entriesService.findOne(entry.id); + let { entry: oldEntry } = event.data; + if (!oldEntry.callgentId) + oldEntry = event.data.entry = await this.entriesService.findOne( + oldEntry.id, + ); let result = await this.agentsService.summarizeEntry(event.data); - if (result.total) { + if (result.totally) { // totally re-summarize const news = await this.endpointsService.findAll({ - where: { entryId: entry.id }, + where: { entryId: oldEntry.id }, }); + if (!news.length) return; + result = await this.agentsService.summarizeEntry({ - entry, + entry: event.data.entry, news, - total: true, + totally: true, }); } - await this.entriesService.update(entry.id, { - summary: result.summary, - instruction: result.instruction, - }); + + if ( + result.summary === oldEntry.summary && + result.instruction === oldEntry.instruction + ) + return; + const newEntry = await this.entriesService.update( + oldEntry.id, + { + summary: result.summary, + instruction: result.instruction, + }, + { pk: null }, + ); // bubble up to the callgent await this.eventEmitter.emitAsync( EntriesChangedEvent.eventName, - new EntriesChangedEvent({ callgent: { id: entry.callgentId }, news: [] }), + new EntriesChangedEvent({ + callgent: { id: oldEntry.callgentId }, + news: [newEntry], + olds: [{ ...oldEntry, pk: newEntry.pk } as any], + }), ); } } diff --git a/src/entries/entries.module.ts b/src/entries/entries.module.ts index 1000447..d367f29 100644 --- a/src/entries/entries.module.ts +++ b/src/entries/entries.module.ts @@ -9,7 +9,7 @@ import { WebpageService } from './adaptors/builtin/web/webpage.service'; import { EntriesController } from './entries.controller'; import { EntriesService } from './entries.service'; import { CallgentCreatedListener } from './listeners/callgent-created.listener'; -import { EntriesChangedListener } from './listeners/entries-changed.listener'; +import { EntriesChangedSumCallgentListener } from './listeners/entries-changed.listener'; @Module({ imports: [CallgentsModule], @@ -29,7 +29,7 @@ import { EntriesChangedListener } from './listeners/entries-changed.listener'; useClass: EmailAdaptor, }, CallgentCreatedListener, - EntriesChangedListener, + EntriesChangedSumCallgentListener, ], controllers: [EntriesController, RestApiController, WebpageController], exports: ['EntriesService'], diff --git a/src/entries/entries.service.ts b/src/entries/entries.service.ts index 8c79d3a..8e7af1c 100644 --- a/src/entries/entries.service.ts +++ b/src/entries/entries.service.ts @@ -196,10 +196,12 @@ export class EntriesService implements OnModuleInit { } @Transactional() - update(id: string, dto: UpdateEntryDto) { + update(id: string, dto: UpdateEntryDto, select?: Prisma.EntrySelect) { const prisma = this.txHost.tx as PrismaClient; - return selectHelper(this.defSelect, (select) => - prisma.entry.update({ select, where: { id }, data: dto }), + return selectHelper( + select, + (select) => prisma.entry.update({ select, where: { id }, data: dto }), + this.defSelect, ); } diff --git a/src/entries/events/entries-changed.event.ts b/src/entries/events/entries-changed.event.ts index b0f83f1..bf8911a 100644 --- a/src/entries/events/entries-changed.event.ts +++ b/src/entries/events/entries-changed.event.ts @@ -6,9 +6,14 @@ export class EntriesChangedEvent { constructor( public readonly data: { - callgent: { id: string; summary?: string; instruction?: string }; - news?: Omit[]; - olds?: Omit[]; + callgent: { + id: string; + name?: string; + summary?: string; + instruction?: string; + }; + news?: (Omit & { pk: number })[]; + olds?: (Omit & { pk: number })[]; }, ) {} } diff --git a/src/entries/listeners/entries-changed.listener.ts b/src/entries/listeners/entries-changed.listener.ts index dec7cb1..9c1036d 100644 --- a/src/entries/listeners/entries-changed.listener.ts +++ b/src/entries/listeners/entries-changed.listener.ts @@ -6,9 +6,10 @@ import { CallgentsService } from '../../callgents/callgents.service'; import { EntriesService } from '../../entries/entries.service'; import { EntriesChangedEvent } from '../../entries/events/entries-changed.event'; +/** summarize callgent when entries changed */ @Injectable() -export class EntriesChangedListener { - private readonly logger = new Logger(EntriesChangedListener.name); +export class EntriesChangedSumCallgentListener { + private readonly logger = new Logger(EntriesChangedSumCallgentListener.name); constructor( @Inject('EntriesService') private readonly entriesService: EntriesService, @@ -24,27 +25,35 @@ export class EntriesChangedListener { this.logger.debug('Handling event: %j', event); // re-summarize summary/instruction - const { callgent, news, olds } = event.data; - if (typeof callgent.summary === 'undefined') - event.data.callgent = await this.callgentsService.findOne(callgent.id, { - id: true, - summary: true, - instruction: true, - }); + let { callgent } = event.data; + if (typeof callgent.name === 'undefined') + callgent = event.data.callgent = await this.callgentsService.findOne( + callgent.id, + { + id: true, + name: true, + summary: true, + instruction: true, + }, + ); let result = await this.agentsService.summarizeCallgent(event.data); - if (result.total) { + if (result.totally) { // totally re-summarize const news = await this.entriesService.findAll({ - where: { callgentId: callgent.id }, + select: { pk: null }, + where: { callgentId: callgent.id, type: 'SERVER' }, }); + if (!news.length) return; + result = await this.agentsService.summarizeCallgent({ callgent, news, - total: true, + totally: true, }); } - await this.entriesService.update(callgent.id, { + await this.callgentsService.update({ + id: callgent.id, summary: result.summary, instruction: result.instruction, }); From b5d8973b0732296e62b96be8c1283e494eb69c34 Mon Sep 17 00:00:00 2001 From: dev-callgent Date: Tue, 22 Oct 2024 09:08:40 +0800 Subject: [PATCH 106/183] feat: summarizes document summary/instruction Signed-off-by: dev-callgent --- src/entries/entries.service.ts | 22 ++++++++++++++++++---- 1 file changed, 18 insertions(+), 4 deletions(-) diff --git a/src/entries/entries.service.ts b/src/entries/entries.service.ts index 8e7af1c..a611b8d 100644 --- a/src/entries/entries.service.ts +++ b/src/entries/entries.service.ts @@ -13,10 +13,11 @@ import { OnModuleInit, } from '@nestjs/common'; import { ModuleRef, ModulesContainer } from '@nestjs/core'; +import { EventEmitter2 } from '@nestjs/event-emitter'; import { EntryType, Prisma, PrismaClient } from '@prisma/client'; import { RealmSecurityVO } from '../callgent-realms/dto/realm-security.vo'; import { EndpointDto } from '../endpoints/dto/endpoint.dto'; -import { Optional, Requires, Utils } from '../infra/libs/utils'; +import { Optional, Utils } from '../infra/libs/utils'; import { selectHelper } from '../infra/repo/select.helper'; import { PrismaTenancyService } from '../infra/repo/tenancy/prisma-tenancy.service'; import { EntryAdaptor } from './adaptors/entry-adaptor.base'; @@ -24,6 +25,7 @@ import { IS_CALLGENT_ENDPOINT_ADAPTOR } from './adaptors/entry-adaptor.decorator import { EntryDto } from './dto/entry.dto'; import { UpdateEntryDto } from './dto/update-entry.dto'; import { ClientRequestEvent } from './events/client-request.event'; +import { EntriesChangedEvent } from './events/entries-changed.event'; @Injectable() export class EntriesService implements OnModuleInit { @@ -33,6 +35,7 @@ export class EntriesService implements OnModuleInit { private readonly modulesContainer: ModulesContainer, private readonly txHost: TransactionHost, private readonly tenancyService: PrismaTenancyService, + private readonly eventEmitter: EventEmitter2, ) {} protected readonly defSelect: Prisma.EntrySelect = { pk: false, @@ -206,11 +209,22 @@ export class EntriesService implements OnModuleInit { } @Transactional() - delete(id: string) { + async delete(id: string) { const prisma = this.txHost.tx as PrismaClient; - return selectHelper(this.defSelect, (select) => - prisma.entry.delete({ select, where: { id } }), + const ret = await selectHelper( + { pk: null }, + (select) => prisma.entry.delete({ select, where: { id } }), + this.defSelect, + ); + + this.eventEmitter.emitAsync( + EntriesChangedEvent.eventName, + new EntriesChangedEvent({ + callgent: { id: ret.callgentId }, + olds: [ret], + }), ); + return ret; } // @Transactional() From 0e6858c4702f8a7d00d4dc5de24a92aaf07aeb98 Mon Sep 17 00:00:00 2001 From: dev-callgent Date: Fri, 25 Oct 2024 12:20:58 +0800 Subject: [PATCH 107/183] feat: generate vue app Signed-off-by: dev-callgent --- prisma/seed.ts | 70 ++++++++++++------- src/agents/agents.service.ts | 17 +++++ src/agents/llm.service.ts | 8 +-- src/bootstrap.ts | 4 ++ src/callgents/callgents.service.ts | 1 + .../listeners/request-relay-event.listener.ts | 2 +- src/endpoints/endpoints.service.ts | 2 +- .../listeners/endpoints-changed.listener.ts | 28 +++++--- .../builtin/web/webpage.controller.ts | 39 ++++++----- .../adaptors/builtin/web/webpage.service.ts | 24 ++++--- .../listeners/entries-changed.listener.ts | 4 +- src/users/listeners/auth-logined.listener.ts | 2 +- 12 files changed, 127 insertions(+), 74 deletions(-) diff --git a/prisma/seed.ts b/prisma/seed.ts index 7c1a830..2176ffa 100644 --- a/prisma/seed.ts +++ b/prisma/seed.ts @@ -73,19 +73,6 @@ function initEventListeners( createdBy: 'GLOBAL', priority: (priority += 100), }, - { - id: 'CR-LOAD-ENDPOINTS', - srcId: 'GLOBAL', - tenantPk: 0, - eventType: 'CLIENT_REQUEST', - dataType: '*', - serviceType: 'SERVICE', - serviceName: 'EndpointsService', - funName: 'loadEndpoints', - description: 'Load all endpoints into event.context.endpoints', - createdBy: 'GLOBAL', - priority: (priority += 100), - }, { id: 'CR-LOAD-TARGET', srcId: 'GLOBAL', @@ -101,16 +88,15 @@ function initEventListeners( priority: (priority += 100), }, { - id: 'CR-MAP-2-ENDPOINTS', + id: 'CR-LOAD-ENDPOINTS', srcId: 'GLOBAL', tenantPk: 0, eventType: 'CLIENT_REQUEST', dataType: '*', serviceType: 'SERVICE', - serviceName: 'AgentsService', - funName: 'map2Endpoints', - description: - 'Map the request to endpoints and corresponding args, put into event.context.map2Endpoints and event.context.endpoints[0]', + serviceName: 'EndpointsService', + funName: 'loadEndpoints', + description: 'Load all endpoints into event.context.endpoints', createdBy: 'GLOBAL', priority: (priority += 100), }, @@ -121,13 +107,27 @@ function initEventListeners( eventType: 'CLIENT_REQUEST', dataType: 'Webpage', serviceType: 'SERVICE', - serviceName: 'WebpagesService', + serviceName: 'WebpageService', funName: 'genWebpages', description: 'Generate webpage[view/model/view-model] from request & endpoints', createdBy: 'GLOBAL', priority: (priority += 100), }, + { + id: 'CR-MAP-2-ENDPOINTS', + srcId: 'GLOBAL', + tenantPk: 0, + eventType: 'CLIENT_REQUEST', + dataType: '*', + serviceType: 'SERVICE', + serviceName: 'AgentsService', + funName: 'map2Endpoints', + description: + 'Map the request to endpoints and corresponding args, put into event.context.map2Endpoints and event.context.endpoints[0]', + createdBy: 'GLOBAL', + priority: (priority += 100), + }, { id: 'CR-SEP-AUTH', srcId: 'GLOBAL', @@ -203,7 +203,7 @@ async function initLlmTemplates( { name: 'map2Endpoint', prompt: `given below service endpoint: -service {{=it.callgentName}} { {{~ it.endpoints :ep }} +service \`{{=it.callgentName}}\` { {{~ it.endpoints :ep }} "{{=ep.name}}": {"summary":"{{=ep.summary}}", {{=ep.description ? '"description":"'+ep.description+'", ':''}}"params":{{=JSON.stringify(ep.params)}}, "responses":{{=JSON.stringify(ep.responses)}} }, {{~}}} @@ -216,7 +216,7 @@ output single-line json object below: { name: 'map2Endpoints', prompt: `given below service endpoints: -service {{=it.callgentName}} { {{~ it.endpoints :ep }} +service \`{{=it.callgentName}}\` { {{~ it.endpoints :ep }} "{{=ep.name}}": {"summary":"{{=ep.summary}}", {{=ep.description ? '"description":"'+ep.description+'", ':''}}"params":{{=JSON.stringify(ep.params)}}, "responses":{{=JSON.stringify(ep.responses)}} }, {{~}}} @@ -264,7 +264,7 @@ Please formalize the response content as a single-lined JSON object: { name: 'summarizeEntry', prompt: `Given below API service{{ if (!it.totally) { }} changes: some added/removed endpoints{{ } }}: -Service {{=it.entry.name}} { {{ if (it.totally) { }}{{~ it.news : ep }} +Service \`{{=it.entry.name}}\` { {{ if (it.totally) { }}{{~ it.news : ep }} "{{=ep.name}}": {"summary":"{{=ep.summary}}", {{=ep.description ? '"description":"'+ep.description+'", ':''}}"params":{{=JSON.stringify(ep.params)}}, "responses":{{=JSON.stringify(ep.responses)}} },{{~}} {{ } else { }} summary: '{{=it.entry.summary}}', @@ -281,12 +281,12 @@ Service {{=it.entry.name}} { {{ if (it.totally) { }}{{~ it.news : ep }} }; Please re-summarize service \`summary\` and \`instruction\`, for user to quickly know when and how to use this service based only on these 2 fields, output a single-lined JSON object: -{ "totally": "set to true if you need to reload all service endpoints to re-summarize.", "summary": "Concise summary to let users quickly understand in what scenarios to use this service. leave empty if \`totally\` is true.", "instruction": "Concise instruction to let users know roughly on how to use this service: concepts/operations etc. leave empty if \`totally\` is true." }`, +{ "totally": "{{ if (it.totally) { }}set to empty{{ }else{ }}set to true if you need to reload all service endpoints to re-summarize.{{ } }}", "summary": "Concise summary to let users quickly understand in what scenarios to use this service. leave empty if \`totally\` is true.", "instruction": "Concise instruction to let users know roughly on how to use this service: concepts/operations etc. leave empty if \`totally\` is true." }`, }, { name: 'summarizeCallgent', prompt: `Given below API service{{ if (!it.totally) { }} changes: some added/removed functional entries{{ } }}: -Service {{=it.callgent.name}} { {{ if (it.totally) { }}{{~ it.news : ep }} +Service \`{{=it.callgent.name}}\` { {{ if (it.totally) { }}{{~ it.news : ep }} "Entry#{{=ep.pk}}": {"summary":"{{=ep.summary}}", "instruction":"{{=ep.instruction}}"},{{~}} {{ } else { }} summary: '{{=it.callgent.summary}}', @@ -303,7 +303,27 @@ Service {{=it.callgent.name}} { {{ if (it.totally) { }}{{~ it.news : ep }} }; Please re-summarize service \`summary\` and \`instruction\`, for user to quickly know when and how to use this service based only on these 2 fields, output a single-lined JSON object: -{ "totally": "set to true if you need to reload all service entries to re-summarize.", "summary": "Concise summary to let users quickly understand in what scenarios to use this service. leave empty if \`totally\` is true. 3k chars most", "instruction": "Concise instruction to let users know roughly on how to use this service: concepts/operations etc. leave empty if \`totally\` is true. 3k chars most" }`, +{ "totally": "{{ if (it.totally) { }}set to empty{{ }else{ }}set to true if you need to reload all service entries to re-summarize.{{ } }}", "summary": "Concise summary to let users quickly understand in what scenarios to use this service(don't mention service name since it may change). leave empty if \`totally\` is true. 3k chars most", "instruction": "Concise instruction to let users know roughly on how to use this service: concepts/operations etc. leave empty if \`totally\` is true. 3k chars most" }`, + }, + { + name: 'genVue1Route', + prompt: `Given requirement: +{ "description": "{{=it.requirement}}" } + +You need to generate a Vue app for user to interact with backend service APIs: +Service \`{{=it.callgent.name}}\` { "summary": "{{=it.callgent.summary}}", "instruction": "{{=it.callgent.instruction}}", "endpoints": {...} }, + +There are 7 steps to generate Vue3+Pinia APP code to fulfil the requirement: +1. generate \`router/index.js\`, only necessary \`views\` for the requirement +2. define necessary Vue \`components\`, associate with each \`view\`: {view: [comps]}; +3. choose needed service endpoints for each component: {comp: [apis]}; +4. generate \`components/*.vue\` code, which may import \`stores/*.js\`; +5. generate \`stores/*.js\` used by components, bind \`actions\` to service endpoints. +6. generate \`views/*.vue\` code, which imports \`components/*.js\`, and \`stores/*.js\` if really needed. +7. generate App.vue, main.js + +Now let's goto #1, please output a single-lined json object: +{ "views": {["route-path"]: {"name": "component name", "file": "views/{file-name}.vue", "summary":"brief summary to guide developer to implement this view", "distance":"integer to indicate distance of the view to root view, 0 means root"}}, "router/index.js": "full implementation code" }`, }, ]; diff --git a/src/agents/agents.service.ts b/src/agents/agents.service.ts index 77d126f..da07a99 100644 --- a/src/agents/agents.service.ts +++ b/src/agents/agents.service.ts @@ -257,4 +257,21 @@ export class AgentsService { return result; } + + async genVue1Route(data: { + requirement: string; + callgent: { name: string; summary: string; instruction: string }; + srcId: string; + }) { + let url: string; + const result = await this.llmService.template('genVue1Route', data, { + returnType: { + views: { [url]: { name: '', file: '', summary: '', distance: 0 } }, + 'router/index.js': '', + }, + bizKey: data.srcId, + }); + + return result; + } } diff --git a/src/agents/llm.service.ts b/src/agents/llm.service.ts index c12bed9..289cb53 100644 --- a/src/agents/llm.service.ts +++ b/src/agents/llm.service.ts @@ -117,11 +117,9 @@ export class LLMService { if (result) { this.logger.debug( '>>>> Write LLM result to cache: name: %s, prompt: %s\n\n\tresult: %s', - { - name, - prompt, - result, - }, + name, + prompt, + result, ); return prisma.llmCache.upsert({ where: { prompt_name: { prompt, name } }, diff --git a/src/bootstrap.ts b/src/bootstrap.ts index af30261..874bf0f 100644 --- a/src/bootstrap.ts +++ b/src/bootstrap.ts @@ -31,6 +31,10 @@ async function bootstrap(app: NestFastifyApplication, port: string) { // pino logger const logger: ConsoleLogger = registerLogger(app); + process.on('unhandledRejection', (reason) => { + logger.error('Unhandled Rejection:', reason); + }); + app.register(helmet); app.register(fastifyIp); app.register(fastifyMultipart); diff --git a/src/callgents/callgents.service.ts b/src/callgents/callgents.service.ts index 7b96f32..f04a1d6 100644 --- a/src/callgents/callgents.service.ts +++ b/src/callgents/callgents.service.ts @@ -53,6 +53,7 @@ export class CallgentsService { }); } + // await all async final results await this.eventEmitter.emitAsync( CallgentCreatedEvent.eventName, new CallgentCreatedEvent({ ...data, ...ret }), diff --git a/src/emails/listeners/request-relay-event.listener.ts b/src/emails/listeners/request-relay-event.listener.ts index 0896c96..8bf5808 100644 --- a/src/emails/listeners/request-relay-event.listener.ts +++ b/src/emails/listeners/request-relay-event.listener.ts @@ -12,7 +12,7 @@ export class RequestRelayListener { constructor(private readonly eventListenersService: EventListenersService) {} @Transactional(Propagation.RequiresNew) - @OnEvent(EmailRelayEvent.eventPrefix + EmailRelayKey.request) + @OnEvent(EmailRelayEvent.eventPrefix + EmailRelayKey.request, { async: true }) // always async async handleEvent(event: EmailRelayEvent) { this.logger.debug('Handling event: %j', event); diff --git a/src/endpoints/endpoints.service.ts b/src/endpoints/endpoints.service.ts index 87a41c7..2595cba 100644 --- a/src/endpoints/endpoints.service.ts +++ b/src/endpoints/endpoints.service.ts @@ -115,7 +115,7 @@ export class EndpointsService { news?: Omit[]; olds?: Omit[]; }) { - this.eventEmitter.emitAsync( + return this.eventEmitter.emitAsync( EndpointsChangedEvent.eventName, new EndpointsChangedEvent(data), ); diff --git a/src/endpoints/listeners/endpoints-changed.listener.ts b/src/endpoints/listeners/endpoints-changed.listener.ts index 5da39c4..f892b07 100644 --- a/src/endpoints/listeners/endpoints-changed.listener.ts +++ b/src/endpoints/listeners/endpoints-changed.listener.ts @@ -23,7 +23,7 @@ export class EndpointsChangedSumEntryListener { /** create a callgent with default api client entry, and Email client/server entry */ @Transactional(Propagation.RequiresNew) - @OnEvent(EndpointsChangedEvent.eventName) + @OnEvent(EndpointsChangedEvent.eventName, { async: true }) async handleEvent(event: EndpointsChangedEvent) { this.logger.debug('Handling event: %j', event); @@ -54,17 +54,21 @@ export class EndpointsChangedSumEntryListener { result.instruction === oldEntry.instruction ) return; - const newEntry = await this.entriesService.update( - oldEntry.id, - { - summary: result.summary, - instruction: result.instruction, - }, - { pk: null }, - ); - + const newEntry = await this.entriesService + .update( + oldEntry.id, + { + summary: result.summary, + instruction: result.instruction, + }, + { pk: null }, + ) + .catch((err) => { + this.logger.error('Failed to update entry: %j', err); + throw err; + }); // bubble up to the callgent - await this.eventEmitter.emitAsync( + this.eventEmitter.emitAsync( EntriesChangedEvent.eventName, new EntriesChangedEvent({ callgent: { id: oldEntry.callgentId }, @@ -72,5 +76,7 @@ export class EndpointsChangedSumEntryListener { olds: [{ ...oldEntry, pk: newEntry.pk } as any], }), ); + + return newEntry; } } diff --git a/src/entries/adaptors/builtin/web/webpage.controller.ts b/src/entries/adaptors/builtin/web/webpage.controller.ts index c71936b..6dca4c8 100644 --- a/src/entries/adaptors/builtin/web/webpage.controller.ts +++ b/src/entries/adaptors/builtin/web/webpage.controller.ts @@ -69,27 +69,27 @@ export class WebpageController { ) { const { entry, callgent } = await this._load(callgentId, entryId); - const result = await this.eventListenersService.emit( - new ClientRequestEvent( - entry.id, - entry.adaptorKey, - requirement, - taskId, - { - callgentId, - callgentName: callgent.name, - callerId: req.user?.sub, - progressive, - }, - // callback, // 是否需要异步返回结果 - ), + const e = new ClientRequestEvent( + entry.id, + entry.adaptorKey, + requirement, + taskId, + { + callgentId, + callgentName: callgent.name, + callerId: req.user?.sub, + progressive, + }, + // callback, // 是否需要异步返回结果 ); + e.context.callgent = callgent; + const result = await this.eventListenersService.emit(e); // event listeners: - // preprocess, c-auth, load eps, load target events, map2Endpoints, + // preprocess, c-auth, load target events, load eps, (choose eps?), - // [gen view/model/view-model, response] + // [gen view/model/view-model from summary, response] - // remove: | s-auth for all eps/entries, invoke-service + // remove: | map2Endpoints,s-auth for all eps/entries, invoke-service // return generated webpage const code = result.statusCode || 200; @@ -168,10 +168,13 @@ export class WebpageController { ); if (!entry) throw new NotFoundException( - 'restAPI entry not found for callgent: ' + callgentId, + 'Entry not found for callgent: ' + callgentId, ); const callgent = await this.callgentsService.findOne(callgentId, { + id: true, name: true, + summary: true, + instruction: true, }); if (!callgent) throw new NotFoundException('callgent not found: ' + callgentId); diff --git a/src/entries/adaptors/builtin/web/webpage.service.ts b/src/entries/adaptors/builtin/web/webpage.service.ts index 71c5543..7a9a8f6 100644 --- a/src/entries/adaptors/builtin/web/webpage.service.ts +++ b/src/entries/adaptors/builtin/web/webpage.service.ts @@ -1,18 +1,13 @@ -import { TransactionHost, Transactional } from '@nestjs-cls/transactional'; -import { TransactionalAdapterPrisma } from '@nestjs-cls/transactional-adapter-prisma'; +import { Transactional } from '@nestjs-cls/transactional'; import { Inject, Injectable } from '@nestjs/common'; -import { ModuleRef, ModulesContainer } from '@nestjs/core'; -import { PrismaTenancyService } from '../../../../infra/repo/tenancy/prisma-tenancy.service'; +import { AgentsService } from '../../../../agents/agents.service'; import { ClientRequestEvent } from '../../../events/client-request.event'; @Injectable() export class WebpageService { constructor( - private readonly moduleRef: ModuleRef, - @Inject(ModulesContainer) - private readonly modulesContainer: ModulesContainer, - private readonly txHost: TransactionHost, - private readonly tenancyService: PrismaTenancyService, + @Inject('AgentsService') + private readonly agentsService: AgentsService, ) {} /** Generate webpage[view/route/model/view-model], then respond the src code */ @@ -22,9 +17,18 @@ export class WebpageService { ): Promise { data.stopPropagation = true; // stop event propagation + // data.context.callgent // data.context.req: { requirement } // data.context.endpoints, target events, - + + // 根据req和callgent概要,规划几个comps,区分showing/ref + + const route = await this.agentsService.genVue1Route({ + srcId: data.srcId, + callgent: data.context.callgent, + requirement: data.context.req.requirement, + }); + return { data }; } } diff --git a/src/entries/listeners/entries-changed.listener.ts b/src/entries/listeners/entries-changed.listener.ts index 9c1036d..b4aa01e 100644 --- a/src/entries/listeners/entries-changed.listener.ts +++ b/src/entries/listeners/entries-changed.listener.ts @@ -20,7 +20,7 @@ export class EntriesChangedSumCallgentListener { /** create a callgent with default api client entry, and Email client/server entry */ @Transactional(Propagation.RequiresNew) - @OnEvent(EntriesChangedEvent.eventName) + @OnEvent(EntriesChangedEvent.eventName, { async: true }) async handleEvent(event: EntriesChangedEvent) { this.logger.debug('Handling event: %j', event); @@ -52,7 +52,7 @@ export class EntriesChangedSumCallgentListener { totally: true, }); } - await this.callgentsService.update({ + return this.callgentsService.update({ id: callgent.id, summary: result.summary, instruction: result.instruction, diff --git a/src/users/listeners/auth-logined.listener.ts b/src/users/listeners/auth-logined.listener.ts index 260c924..4448360 100644 --- a/src/users/listeners/auth-logined.listener.ts +++ b/src/users/listeners/auth-logined.listener.ts @@ -10,7 +10,7 @@ export class AuthLoginedListener { private readonly logger = new Logger(AuthLoginedListener.name); - @OnEvent(AuthLoginedEvent.eventName) + @OnEvent(AuthLoginedEvent.eventName) // , { async: true }): this causes `await this.eventEmitter.emitAsync()` still async async handleEvent(event: AuthLoginedEvent) { event.user?.tenantPk && this.tenancyService.setTenantId(event.user.tenantPk); From c46236d5cd73abe2afb8a626ee4a83a59efefcb9 Mon Sep 17 00:00:00 2001 From: dev-callgent Date: Fri, 25 Oct 2024 18:00:07 +0800 Subject: [PATCH 108/183] refactor: llm cache with model name Signed-off-by: dev-callgent --- .env.dev | 2 +- .env.test | 2 +- .../20241025094742_llm_cache/migration.sql | 15 +++++++++++++ prisma/schema.prisma | 3 ++- src/agents/llm.service.ts | 22 +++++++++++++------ 5 files changed, 34 insertions(+), 10 deletions(-) create mode 100644 prisma/migrations/20241025094742_llm_cache/migration.sql diff --git a/.env.dev b/.env.dev index 3114e5f..0138b65 100644 --- a/.env.dev +++ b/.env.dev @@ -52,7 +52,7 @@ GITHUB_OAUTH_CLIENT_SECRET = 76dc98b5554636b5c924cd4854ad3f62e4f0cc3b GOOGLE_OAUTH_CLIENT_ID = 183236050953-rg2khnknb0tif2a5urepho0k22call16.apps.googleusercontent.com GOOGLE_OAUTH_CLIENT_SECRET = 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 -LLM_MODEL=mistralai/mistral-small +LLM_MODEL=google/gemini-flash-1.5-8b-exp LLM_CACHE_ENABLE=1 OPENROUTER_API_KEY=sk-or-v1-your-api-key CALLGENT_SITE_URL=https://callgent.com diff --git a/.env.test b/.env.test index a5caa66..cde08f2 100644 --- a/.env.test +++ b/.env.test @@ -42,7 +42,7 @@ GITHUB_OAUTH_CLIENT_SECRET = 76dc98b5554636b5c924cd4854ad3f62e4f0cc3b GOOGLE_OAUTH_CLIENT_ID = 183236050953-rg2khnknb0tif2a5urepho0k22call16.apps.googleusercontent.com GOOGLE_OAUTH_CLIENT_SECRET = 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 -LLM_MODEL=mistralai/mistral-small +LLM_MODEL=google/gemini-flash-1.5-8b-exp LLM_CACHE_ENABLE=1 OPENROUTER_API_KEY=sk-or-v1-your-api-key CALLGENT_SITE_URL=https://callgent.com diff --git a/prisma/migrations/20241025094742_llm_cache/migration.sql b/prisma/migrations/20241025094742_llm_cache/migration.sql new file mode 100644 index 0000000..0c84e40 --- /dev/null +++ b/prisma/migrations/20241025094742_llm_cache/migration.sql @@ -0,0 +1,15 @@ +/* + Warnings: + + - A unique constraint covering the columns `[prompt,model,name]` on the table `LlmCache` will be added. If there are existing duplicate values, this will fail. + - Added the required column `model` to the `LlmCache` table without a default value. This is not possible if the table is not empty. + +*/ +-- DropIndex +DROP INDEX "LlmCache_prompt_name_key"; + +-- AlterTable +ALTER TABLE "LlmCache" ADD COLUMN "model" VARCHAR(127) NOT NULL; + +-- CreateIndex +CREATE UNIQUE INDEX "LlmCache_prompt_model_name_key" ON "LlmCache"("prompt", "model", "name"); diff --git a/prisma/schema.prisma b/prisma/schema.prisma index 07552c7..9e219c2 100644 --- a/prisma/schema.prisma +++ b/prisma/schema.prisma @@ -505,12 +505,13 @@ model LlmCache { pk BigInt @id @default(autoincrement()) name String @db.VarChar(32) + model String @db.VarChar(127) prompt String @db.VarChar(8192) result String @db.VarChar(8192) createdAt DateTime @default(now()) - @@unique([prompt, name]) + @@unique([prompt, model, name]) } /// @DtoIgnoreModel diff --git a/src/agents/llm.service.ts b/src/agents/llm.service.ts index 289cb53..0baf023 100644 --- a/src/agents/llm.service.ts +++ b/src/agents/llm.service.ts @@ -41,16 +41,18 @@ export class LLMService { }, ): Promise { const prompt = await this._prompt(template, args); + const llmModel = this.configService.get('LLM_MODEL'); let result: string; let notCached = this.configService.get('LLM_CACHE_ENABLE'); if (notCached) - notCached = !(result = (await this._llmCache(template, prompt))?.result); + notCached = !(result = (await this._llmCache(template, llmModel, prompt)) + ?.result); if (!result) { const resp = await this._completion({ messages: [{ role: 'user', content: prompt }], - model: this.configService.get('LLM_MODEL'), + model: llmModel, temperature: 0.5, }); @@ -87,7 +89,8 @@ export class LLMService { if (typeof valid === 'boolean') break; // force stop maxRetry = i + 2; // force retry } - if (valid && notCached) await this._llmCache(template, prompt, result); + if (valid && notCached) + await this._llmCache(template, llmModel, prompt, result); return ret; } @@ -105,7 +108,12 @@ export class LLMService { } } - protected async _llmCache(name: string, prompt: string, result?: string) { + protected async _llmCache( + name: string, + model: string, + prompt: string, + result?: string, + ) { if (prompt.length > 8190) { this.logger.warn( '>>> Prompt too long to cache: name: %s, prompt: \n%s\n\n\tresult: %s', @@ -122,14 +130,14 @@ export class LLMService { result, ); return prisma.llmCache.upsert({ - where: { prompt_name: { prompt, name } }, - create: { name, prompt, result }, + where: { prompt_model_name: { prompt, model, name } }, + create: { name, model, prompt, result }, update: { name, prompt, result }, }); } const ret = await prisma.llmCache.findUnique({ - where: { prompt_name: { prompt, name } }, + where: { prompt_model_name: { prompt, model, name } }, select: { result: true }, }); if (ret) From 5868ccaddd5c183bab748c52b37e7dd0effda96f Mon Sep 17 00:00:00 2001 From: dev-callgent Date: Sat, 26 Oct 2024 13:24:56 +0800 Subject: [PATCH 109/183] feat: llm models fallback Signed-off-by: dev-callgent --- .env.dev | 2 +- .env.test | 2 +- src/agents/llm.service.ts | 48 ++++++++++++++++++++++++++++++--------- 3 files changed, 39 insertions(+), 13 deletions(-) diff --git a/.env.dev b/.env.dev index 0138b65..4559db2 100644 --- a/.env.dev +++ b/.env.dev @@ -52,7 +52,7 @@ GITHUB_OAUTH_CLIENT_SECRET = 76dc98b5554636b5c924cd4854ad3f62e4f0cc3b GOOGLE_OAUTH_CLIENT_ID = 183236050953-rg2khnknb0tif2a5urepho0k22call16.apps.googleusercontent.com GOOGLE_OAUTH_CLIENT_SECRET = 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 -LLM_MODEL=google/gemini-flash-1.5-8b-exp +LLM_MODELS=["google/gemini-flash-1.5-8b-exp","meta-llama/llama-3.1-70b-instruct:free"] LLM_CACHE_ENABLE=1 OPENROUTER_API_KEY=sk-or-v1-your-api-key CALLGENT_SITE_URL=https://callgent.com diff --git a/.env.test b/.env.test index cde08f2..0e139d2 100644 --- a/.env.test +++ b/.env.test @@ -42,7 +42,7 @@ GITHUB_OAUTH_CLIENT_SECRET = 76dc98b5554636b5c924cd4854ad3f62e4f0cc3b GOOGLE_OAUTH_CLIENT_ID = 183236050953-rg2khnknb0tif2a5urepho0k22call16.apps.googleusercontent.com GOOGLE_OAUTH_CLIENT_SECRET = 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 -LLM_MODEL=google/gemini-flash-1.5-8b-exp +LLM_MODELS=["google/gemini-flash-1.5-8b-exp","meta-llama/llama-3.1-70b-instruct:free"] LLM_CACHE_ENABLE=1 OPENROUTER_API_KEY=sk-or-v1-your-api-key CALLGENT_SITE_URL=https://callgent.com diff --git a/src/agents/llm.service.ts b/src/agents/llm.service.ts index 0baf023..885867a 100644 --- a/src/agents/llm.service.ts +++ b/src/agents/llm.service.ts @@ -17,13 +17,15 @@ export class LLMService { private readonly eventEmitter: EventEmitter2, ) { dot.templateSettings.strip = false; + this.llmModels = JSON.parse(this.configService.get('LLM_MODELS')); } + protected llmModels: string[]; private readonly logger = new Logger(LLMService.name); /** * @param template prompt template name * @param args prompt args - * @param returnType if not empty, try to parse the response as the specified json + * @param returnType if not empty, try to parse the response as the specified json. for index signature, do this: const key=''; returnType = { [key]: any } * @param validate if error: retry default times, true/false: stop retry, void: force retry. default retry is 3 */ @Transactional() @@ -41,24 +43,26 @@ export class LLMService { }, ): Promise { const prompt = await this._prompt(template, args); - const llmModel = this.configService.get('LLM_MODEL'); - let result: string; + let result: string, llmModel: string; let notCached = this.configService.get('LLM_CACHE_ENABLE'); - if (notCached) - notCached = !(result = (await this._llmCache(template, llmModel, prompt)) - ?.result); + if (notCached) { + [result, llmModel] = await this._llmCacheLoad(template, prompt); + notCached = !result; + } if (!result) { const resp = await this._completion({ messages: [{ role: 'user', content: prompt }], - model: llmModel, + models: this.llmModels, + route: 'fallback', temperature: 0.5, }); + llmModel = resp.model; if (!resp?.choices?.length) throw new Error( - `LLM service not available: template=${template} bizKey=${bizKey}`, + `LLM service not available: template=${template} bizKey=${bizKey}, error=${(resp as any)?.error?.message}`, ); const choice = resp.choices[0] as NonStreamingChoice; @@ -96,18 +100,40 @@ export class LLMService { } protected _checkJsonType(returnType: any, val: any, isArray: boolean) { - const keys = Object.keys(isArray ? returnType[0] : returnType); + const entries = Object.entries(isArray ? returnType[0] : returnType); const a = isArray ? val : [val]; for (const v of a) { - if (!keys.every((key) => key in v)) + if ( + !entries.every(([key, type]) => { + // key may be '': means { [key]:.. } + if (key && !(key in v)) return false; + const value = key ? v[key] : Object.values(v)[0]; + if ( + value && + (typeof value !== typeof type || + Array.isArray(type) != Array.isArray(value)) + ) + return false; + return true; + }) + ) throw new Error( - `Return type error, props=${keys.join(',')}, val=${JSON.stringify( + `Return type error, props=${entries.join(',')}, val=${JSON.stringify( val, )}`, ); } } + protected async _llmCacheLoad(name: string, prompt: string) { + let result: string, llmModel: string; + for (llmModel of this.llmModels) { + result = (await this._llmCache(name, llmModel, prompt))?.result; + if (result) break; + } + return [result, llmModel]; + } + protected async _llmCache( name: string, model: string, From 2f5a5a07351d1be39584ebb91ee7b212d362a7ca Mon Sep 17 00:00:00 2001 From: dev-callgent Date: Sat, 26 Oct 2024 13:56:55 +0800 Subject: [PATCH 110/183] feat: llm models fallback Signed-off-by: dev-callgent --- .env.dev | 2 +- .env.test | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.env.dev b/.env.dev index 4559db2..5ef0f68 100644 --- a/.env.dev +++ b/.env.dev @@ -52,7 +52,7 @@ GITHUB_OAUTH_CLIENT_SECRET = 76dc98b5554636b5c924cd4854ad3f62e4f0cc3b GOOGLE_OAUTH_CLIENT_ID = 183236050953-rg2khnknb0tif2a5urepho0k22call16.apps.googleusercontent.com GOOGLE_OAUTH_CLIENT_SECRET = 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 -LLM_MODELS=["google/gemini-flash-1.5-8b-exp","meta-llama/llama-3.1-70b-instruct:free"] +LLM_MODELS=["google/gemini-flash-1.5-8b-exp","nousresearch/hermes-3-llama-3.1-405b:free","meta-llama/llama-3.1-70b-instruct:free"] LLM_CACHE_ENABLE=1 OPENROUTER_API_KEY=sk-or-v1-your-api-key CALLGENT_SITE_URL=https://callgent.com diff --git a/.env.test b/.env.test index 0e139d2..361e257 100644 --- a/.env.test +++ b/.env.test @@ -42,7 +42,7 @@ GITHUB_OAUTH_CLIENT_SECRET = 76dc98b5554636b5c924cd4854ad3f62e4f0cc3b GOOGLE_OAUTH_CLIENT_ID = 183236050953-rg2khnknb0tif2a5urepho0k22call16.apps.googleusercontent.com GOOGLE_OAUTH_CLIENT_SECRET = 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 -LLM_MODELS=["google/gemini-flash-1.5-8b-exp","meta-llama/llama-3.1-70b-instruct:free"] +LLM_MODELS=["google/gemini-flash-1.5-8b-exp","nousresearch/hermes-3-llama-3.1-405b:free","meta-llama/llama-3.1-70b-instruct:free"] LLM_CACHE_ENABLE=1 OPENROUTER_API_KEY=sk-or-v1-your-api-key CALLGENT_SITE_URL=https://callgent.com From f7bf1969b25d96743afa45d4bb52d1797fa2295a Mon Sep 17 00:00:00 2001 From: dev-callgent Date: Sun, 27 Oct 2024 14:42:14 +0800 Subject: [PATCH 111/183] feat: llm models fallback Signed-off-by: dev-callgent --- .env.dev | 2 +- .env.test | 2 +- src/agents/llm.service.ts | 18 ++++++++++-------- 3 files changed, 12 insertions(+), 10 deletions(-) diff --git a/.env.dev b/.env.dev index 5ef0f68..3583ab4 100644 --- a/.env.dev +++ b/.env.dev @@ -52,7 +52,7 @@ GITHUB_OAUTH_CLIENT_SECRET = 76dc98b5554636b5c924cd4854ad3f62e4f0cc3b GOOGLE_OAUTH_CLIENT_ID = 183236050953-rg2khnknb0tif2a5urepho0k22call16.apps.googleusercontent.com GOOGLE_OAUTH_CLIENT_SECRET = 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 -LLM_MODELS=["google/gemini-flash-1.5-8b-exp","nousresearch/hermes-3-llama-3.1-405b:free","meta-llama/llama-3.1-70b-instruct:free"] +LLM_MODELS=["google/gemini-flash-1.5-8b-exp","meta-llama/llama-3.1-70b-instruct:free","nousresearch/hermes-3-llama-3.1-405b:free"] LLM_CACHE_ENABLE=1 OPENROUTER_API_KEY=sk-or-v1-your-api-key CALLGENT_SITE_URL=https://callgent.com diff --git a/.env.test b/.env.test index 361e257..87e1a9d 100644 --- a/.env.test +++ b/.env.test @@ -42,7 +42,7 @@ GITHUB_OAUTH_CLIENT_SECRET = 76dc98b5554636b5c924cd4854ad3f62e4f0cc3b GOOGLE_OAUTH_CLIENT_ID = 183236050953-rg2khnknb0tif2a5urepho0k22call16.apps.googleusercontent.com GOOGLE_OAUTH_CLIENT_SECRET = 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 -LLM_MODELS=["google/gemini-flash-1.5-8b-exp","nousresearch/hermes-3-llama-3.1-405b:free","meta-llama/llama-3.1-70b-instruct:free"] +LLM_MODELS=["google/gemini-flash-1.5-8b-exp","meta-llama/llama-3.1-70b-instruct:free","nousresearch/hermes-3-llama-3.1-405b:free"] LLM_CACHE_ENABLE=1 OPENROUTER_API_KEY=sk-or-v1-your-api-key CALLGENT_SITE_URL=https://callgent.com diff --git a/src/agents/llm.service.ts b/src/agents/llm.service.ts index 885867a..a5e2f95 100644 --- a/src/agents/llm.service.ts +++ b/src/agents/llm.service.ts @@ -93,8 +93,8 @@ export class LLMService { if (typeof valid === 'boolean') break; // force stop maxRetry = i + 2; // force retry } - if (valid && notCached) - await this._llmCache(template, llmModel, prompt, result); + if (!valid) throw new Error('Fail validating generated content'); + if (notCached) await this._llmCache(template, llmModel, prompt, result); return ret; } @@ -127,20 +127,23 @@ export class LLMService { protected async _llmCacheLoad(name: string, prompt: string) { let result: string, llmModel: string; - for (llmModel of this.llmModels) { - result = (await this._llmCache(name, llmModel, prompt))?.result; - if (result) break; + if (prompt.length <= this.CACHE_PROMPT_MAX_LEN) { + for (llmModel of this.llmModels) { + result = (await this._llmCache(name, llmModel, prompt))?.result; + if (result) break; + } } return [result, llmModel]; } + protected readonly CACHE_PROMPT_MAX_LEN = 8190; protected async _llmCache( name: string, model: string, prompt: string, result?: string, ) { - if (prompt.length > 8190) { + if (prompt.length > this.CACHE_PROMPT_MAX_LEN) { this.logger.warn( '>>> Prompt too long to cache: name: %s, prompt: \n%s\n\n\tresult: %s', { name, prompt, result }, @@ -166,8 +169,7 @@ export class LLMService { where: { prompt_model_name: { prompt, model, name } }, select: { result: true }, }); - if (ret) - this.logger.debug('>>> Hit LLM result cache: %s, %s', name, ret.result); + if (ret) this.logger.debug('>>> Hit LLM result cache: %s, %s', name, model); return ret; } From f64518ca543f4a122cb61f4bd90bf1c4f1326ece Mon Sep 17 00:00:00 2001 From: dev-callgent Date: Sun, 27 Oct 2024 14:42:38 +0800 Subject: [PATCH 112/183] feat: generate vue app Signed-off-by: dev-callgent --- prisma/seed.ts | 73 +++++++++-- src/agents/agents.service.ts | 113 +++++++++++++++++- .../adaptors/builtin/web/webpage.service.ts | 102 +++++++++++++++- 3 files changed, 273 insertions(+), 15 deletions(-) diff --git a/prisma/seed.ts b/prisma/seed.ts index 2176ffa..ae4e161 100644 --- a/prisma/seed.ts +++ b/prisma/seed.ts @@ -310,20 +310,75 @@ output a single-lined JSON object: prompt: `Given requirement: { "description": "{{=it.requirement}}" } -You need to generate a Vue app for user to interact with backend service APIs: +You need to generate a Vue3+Pinia app for user to interact with backend service APIs: Service \`{{=it.callgent.name}}\` { "summary": "{{=it.callgent.summary}}", "instruction": "{{=it.callgent.instruction}}", "endpoints": {...} }, -There are 7 steps to generate Vue3+Pinia APP code to fulfil the requirement: -1. generate \`router/index.js\`, only necessary \`views\` for the requirement +There are 7 steps to generate code to fulfil the requirement: +1. generate \`/src/router/index.js\`, only necessary \`views\` for the requirement 2. define necessary Vue \`components\`, associate with each \`view\`: {view: [comps]}; 3. choose needed service endpoints for each component: {comp: [apis]}; -4. generate \`components/*.vue\` code, which may import \`stores/*.js\`; -5. generate \`stores/*.js\` used by components, bind \`actions\` to service endpoints. -6. generate \`views/*.vue\` code, which imports \`components/*.js\`, and \`stores/*.js\` if really needed. -7. generate App.vue, main.js +4. generate \`/src/components/*.vue\` code, which may import \`/src/stores/*.js\`; +5. generate \`/src/stores/*.js\` used by components, bind \`actions\` to service endpoints. +6. generate \`/src/views/*.vue\` code, which imports \`/src/components/*.js\`, and \`/src/stores/*.js\` if really needed. +7. generate /src/App.vue, /src/main.js -Now let's goto #1, please output a single-lined json object: -{ "views": {["route-path"]: {"name": "component name", "file": "views/{file-name}.vue", "summary":"brief summary to guide developer to implement this view", "distance":"integer to indicate distance of the view to root view, 0 means root"}}, "router/index.js": "full implementation code" }`, +Now let's goto #1, design several view pages, please output a single-lined json object: +{ "views": {[FormalViewName: string]: {"url": "route url", "file": "/src/views/{file-name}.vue", "title":"view title", "summary":"brief summary of use cases", "instruction": "Description of interactive prototype(layout, elements, operations, dynamic effects, etc) to guide developer to implement", "distance":"integer to indicate distance of the view to root view, 0 means root"}}, "/src/router/index.js": "full implementation code. escape special chars to be valid json string" }`, + }, + { + name: 'genVue2Components', + prompt: `Given requirement: +{ "description": "{{=it.requirement}}" } + +You need to generate a Vue3+Pinia app for user to interact with backend service APIs: +Service \`{{=it.callgent.name}}\` { "summary": "{{=it.callgent.summary}}", "instruction": "{{=it.callgent.instruction}}", "endpoints": {...} }, + +There are 7 steps to generate code to fulfil the requirement: +1. generate \`/src/router/index.js\`, only necessary \`views\` for the requirement +2. define necessary Vue \`components\`, associate with each \`view\`: {view: [comps]}; +3. choose needed service endpoints for each component: {comp: [apis]}; +4. generate \`/src/components/*.vue\` code, which may import \`/src/stores/*.js\`; +5. generate \`/src/stores/*.js\` used by components, bind \`actions\` to service endpoints. +6. generate \`/src/views/*.vue\` code, which imports \`/src/components/*.js\`, and \`/src/stores/*.js\` if really needed. +7. generate /src/App.vue, /src/main.js + +Base on the views list from #1: +{{=JSON.stringify(it.views)}} + +Now let's goto #2, design several components, please output a single-lined json object: +{"components":{[FormalComponentName: string]: {"file": "/src/components/{file-name}.vue", "summary":"brief summary of use cases", "instruction": "Description of interactive prototype(layout, elements, operations, dynamic effects, etc) to guide developer to implement. ignore auth logic, which is handled outside of the VUE app."}}, "associations": { [FormalViewName: string]: ["component formal names array", "some components may be shared by multiple views", ..] }`, + }, + { + name: 'genVue3Apis', + prompt: `Given proposed UI components of a Vue3+Pinia app: [{{~ it.compsList :comp }} + { "name": "{{=comp.name}}", "summary":"{{=comp.summary}}", "instruction": "{{=comp.instruction}}" },{{~}} +], + +Back-ended with the following service APIs: +Service \`{{=it.callgent.name}}\` { "summary": "{{=it.callgent.summary}}", "instruction": "{{=it.callgent.instruction}}", "endpoints": [{{~ it.endpoints :ep }} + { "id": "{{=ep.name}}", "summary":"{{=ep.summary}}", {{=ep.description ? '"description":"'+ep.description+'", ':''}}"parameters": {{=JSON.stringify(ep.params)}} },{{~}} + ] +}, + +Please choose needed service endpoints for each component, +Note: all API params are totally listed above, yet components must be changed to fit APIs, so you can remove components if APIs don't support it, or adjust component summary/instruction to fit APIs params! +output a single-lined json object(don't list removed components): +{[ComponentName: string]: {"endpoints":["endpoint ids(METHOD /resource/url), which \`may\` be used by the component", ..], "summary":"Adjusted summary", "instruction": "Adjusted instruction"} }`, + }, + { + name: 'genVue4Components', + prompt: `For Vue3+Pinia app with components structure: +{ + "components": {{=JSON.stringify(it.components)}}, + "relatedViews": {{=JSON.stringify(it.relatedViews)}}, + "otherViews": {{=JSON.stringify(it.otherViews)}}, + "stores": {{=JSON.stringify(it.stores)}} +}; + +Please generate \`/src/components/JobListTable.vue\` full code based on it's instruction and endpoint APIs(especially props), and utilize \`element-ui@2.15.14\` as UI library, +the component must import relevant \`stores/*.js\` for Pinia models and actions, needn't generate stores code in current step. +output a single-lined json object: +{ "importedStores": [{"file": "/src/stores/{file-name}.js", "state": {"State JSON object used by current component. don't list props not used by current component"}, "actions": ["Actions used by current component, all APIs goes here. you may extend existing, or create new ones.", "don't list items not used by current component", ..], "getters": ["getters used by current component", "don't list items not used by current component", ..]}, ..], "code": "formatted lines of full implementation code for \`/src/components/JobListTable.vue\`. pay special attentions to interaction states and error handling. Escape special chars to be valid json string" }`, }, ]; diff --git a/src/agents/agents.service.ts b/src/agents/agents.service.ts index da07a99..40b7b40 100644 --- a/src/agents/agents.service.ts +++ b/src/agents/agents.service.ts @@ -263,11 +263,118 @@ export class AgentsService { callgent: { name: string; summary: string; instruction: string }; srcId: string; }) { - let url: string; + let viewName = ''; const result = await this.llmService.template('genVue1Route', data, { returnType: { - views: { [url]: { name: '', file: '', summary: '', distance: 0 } }, - 'router/index.js': '', + views: { + [viewName]: { + url: '', + file: '', + summary: '', + instruction: '', + title: '', + distance: 0, + }, + }, + '/src/router/index.js': '', + }, + bizKey: data.srcId, + }); + + return result; + } + + async genVue2Components(data: { + requirement: string; + callgent: { name: string; summary: string; instruction: string }; + srcId: string; + views: { + [name: string]: { + url: string; + file: string; + summary: string; + distance: number; + }; + }; + }) { + let compName = '', + viewName = ''; + const result = await this.llmService.template('genVue2Components', data, { + returnType: { + components: { [compName]: { file: '', summary: '', instruction: '' } }, + associations: { [viewName]: [''] }, + }, + bizKey: data.srcId, + // validate gen.associations.view exists + validate: (gen) => + Object.keys(gen.associations).every((view) => data.views[view]), + }); + + return result; + } + + async genVue3Apis(data: { + srcId: string; + compsList: { + name: string; + summary: string; + instruction: string; + }[]; + endpoints: { + name: string; + summary: string; + description: string; + string: any[]; + }[]; + callgent: { name: string; summary: string; instruction: string }; + }) { + let compName = ''; + const result = await this.llmService.template('genVue3Apis', data, { + returnType: { + [compName]: { endpoints: [''], summary: '', instruction: '' }, + }, + bizKey: data.srcId, + // validate compName/endpoints exists + validate: (gen) => + Object.entries(gen).every( + ([compName, comp]) => + data.compsList.find((comp) => comp.name === compName) && + comp.endpoints.every((epName) => + data.endpoints.find((ep) => ep.name === epName), + ), + ), + }); + + return result; + } + + async genVue4Components(data: { + components: { + name: string; + file?: string; + summary: string; + instruction?: string; + endpoints?: { name: string; params: object; responses: object }[]; + }[]; + relatedViews: { + name: string; + title: string; + summary: string; + components: string[]; + }[]; + otherViews: { + name: string; + url: string; + summary: string; + }[]; + stores: { file: string; summary: string; instruction: string }[]; + srcId: string; + }) { + let compName = ''; + const result = await this.llmService.template('genVue4Components', data, { + returnType: { + code: '', + importedStores: [{ file: '', state: {}, actions: [''], getters: [''] }], }, bizKey: data.srcId, }); diff --git a/src/entries/adaptors/builtin/web/webpage.service.ts b/src/entries/adaptors/builtin/web/webpage.service.ts index 7a9a8f6..368be53 100644 --- a/src/entries/adaptors/builtin/web/webpage.service.ts +++ b/src/entries/adaptors/builtin/web/webpage.service.ts @@ -10,7 +10,10 @@ export class WebpageService { private readonly agentsService: AgentsService, ) {} - /** Generate webpage[view/route/model/view-model], then respond the src code */ + /** + * Generate webpage[view/route/model/view-model], then respond the src code + * FIXME: progressive generation + */ @Transactional() async genWebpages( data: ClientRequestEvent, @@ -21,14 +24,107 @@ export class WebpageService { // data.context.req: { requirement } // data.context.endpoints, target events, - // 根据req和callgent概要,规划几个comps,区分showing/ref + const files: { [filePath: string]: string } = {}; - const route = await this.agentsService.genVue1Route({ + // generate route + const agentData: any = { srcId: data.srcId, callgent: data.context.callgent, requirement: data.context.req.requirement, + }; + // 1. generate `router/index.js`, only necessary `views` for the requirement + const route = await this.agentsService.genVue1Route(agentData); + files['/src/routes/index.js'] = route['router/index.js']; + // delete route['router/index.js']; + // data.context.webpages.route = route; + + // 2. define necessary Vue `components`, associate with each `view`: {view: [comps]}; + agentData.views = route.views; + const comps = await this.agentsService.genVue2Components(agentData); + const compViews: { [compName: string]: string[] } = {}; + Object.entries(comps.associations).forEach(([viewName, comps]) => + comps?.forEach((compName) => { + const views = compViews[compName] || (compViews[compName] = []); + views.push(viewName); + }), + ); + + // 3. choose needed service endpoints for each component: {comp: [apis]}; + // TODO filter by view distances + const compsList = Object.entries(comps.components).map(([name, comp]) => ({ + ...comp, + name, + })); + const endpoints = data.context.endpoints.map((e) => { + const params = e.params?.parameters?.map((p) => p.name) || []; + e.params.requestBody?.content && + params.push( + (Object.values(e.params.requestBody.content)[0] as any).schema, + ); + return { ...e, params }; + }); + const compApis = await this.agentsService.genVue3Apis({ + endpoints, + compsList, + srcId: data.srcId, + callgent: data.context.callgent, }); + // 4. generate `components/*.vue` code, which may import `stores/*.js`; + const entries = Object.entries(compApis), + stores: { file: string; summary: string; instruction: string }[] = []; + for (const [compName, comp] of entries) { + // endpoints for the component + const endpoints = comp.endpoints.map((epName) => { + const ep = data.context.endpoints.find((ep) => ep.name === epName); + return { name: ep.name, params: ep.params, responses: ep.responses }; + }); + // list related views + const relatedViews = compViews[compName].map((view) => ({ + name: view, + url: route.views[view].url, + title: route.views[view].title, + summary: route.views[view].summary, + instruction: route.views[view].instruction, + components: comps.associations[view].filter((c) => c in compApis), + })); + const otherViews = Object.entries(route.views) + .filter(([name, v]) => !relatedViews.find((v0) => v0.name === name)) + .map(([name, v]) => ({ name, url: v.url, summary: v.summary })); + + // and comps related to the views + const components: { + name: string; + file?: string; + summary: string; + instruction?: string; + endpoints?: { name: string; params: object; responses: object }[]; + }[] = relatedViews + .map((v) => comps.associations[v.name]) + .flat() + .filter((c) => c !== compName && c in compApis) + .map((c) => ({ name: c, summary: compApis[c].summary })); + components.unshift({ + name: compName, + file: comps.components[compName].file, + ...comp, + endpoints, + }); + + const component = await this.agentsService.genVue4Components({ + components, + relatedViews, + otherViews, + stores, + srcId: data.srcId, + }); + break; + } + + // 5. generate `stores/*.js` used by components, bind `actions` to service endpoints. + // 6. generate `views/*.vue` code, which imports `components/*.js`, and `stores/*.js` if really needed. + // 7. generate App.vue, main.js + return { data }; } } From b6b5710662470d27e9f32b44b9d8f19cb36f0084 Mon Sep 17 00:00:00 2001 From: dev-callgent Date: Sun, 27 Oct 2024 21:58:42 +0800 Subject: [PATCH 113/183] feat: generate vue app Signed-off-by: dev-callgent --- prisma/seed.ts | 4 +-- src/agents/agents.service.ts | 8 +++++- .../adaptors/builtin/web/webpage.service.ts | 26 ++++++++++++++++--- 3 files changed, 32 insertions(+), 6 deletions(-) diff --git a/prisma/seed.ts b/prisma/seed.ts index ae4e161..c0677eb 100644 --- a/prisma/seed.ts +++ b/prisma/seed.ts @@ -375,10 +375,10 @@ output a single-lined json object(don't list removed components): "stores": {{=JSON.stringify(it.stores)}} }; -Please generate \`/src/components/JobListTable.vue\` full code based on it's instruction and endpoint APIs(especially props), and utilize \`element-ui@2.15.14\` as UI library, +Please generate \`{{=it.components[0].file}}\` full code based on it's instruction and endpoint APIs(especially props), and utilize \`element-ui@2.15.14\` as UI library, \`vee-validate@4.14.6\`/\`yup@1.4.0\` for validations. the component must import relevant \`stores/*.js\` for Pinia models and actions, needn't generate stores code in current step. output a single-lined json object: -{ "importedStores": [{"file": "/src/stores/{file-name}.js", "state": {"State JSON object used by current component. don't list props not used by current component"}, "actions": ["Actions used by current component, all APIs goes here. you may extend existing, or create new ones.", "don't list items not used by current component", ..], "getters": ["getters used by current component", "don't list items not used by current component", ..]}, ..], "code": "formatted lines of full implementation code for \`/src/components/JobListTable.vue\`. pay special attentions to interaction states and error handling. Escape special chars to be valid json string" }`, +{ "packages":["packages need to install"], "importedStores": [{"file": "/src/stores/{file-name}.js", "state": {"State JSON object used by current component. don't list props not used by current component. add new if needed"}, "actions": ["Actions used by current component, especially wrap APIs into actions. add new if needed.", "don't list actions not used by current component", ..], "getters": ["getters used by current component. add new if needed", "don't list getters not used by current component", ..]}, ..], "code": "formatted lines of full implementation code for \`/src/components/JobListTable.vue\`. pay special attentions to interaction states/error handling/validations; Only access endpoint APIs through store actions. Escape special chars to be valid json string" }`, }, ]; diff --git a/src/agents/agents.service.ts b/src/agents/agents.service.ts index 40b7b40..d377c91 100644 --- a/src/agents/agents.service.ts +++ b/src/agents/agents.service.ts @@ -367,13 +367,19 @@ export class AgentsService { url: string; summary: string; }[]; - stores: { file: string; summary: string; instruction: string }[]; + stores: { + file: string; + state: object; + actions: string[]; + getters: string[]; + }[]; srcId: string; }) { let compName = ''; const result = await this.llmService.template('genVue4Components', data, { returnType: { code: '', + packages: [''], importedStores: [{ file: '', state: {}, actions: [''], getters: [''] }], }, bizKey: data.srcId, diff --git a/src/entries/adaptors/builtin/web/webpage.service.ts b/src/entries/adaptors/builtin/web/webpage.service.ts index 368be53..90ab4e1 100644 --- a/src/entries/adaptors/builtin/web/webpage.service.ts +++ b/src/entries/adaptors/builtin/web/webpage.service.ts @@ -71,8 +71,14 @@ export class WebpageService { }); // 4. generate `components/*.vue` code, which may import `stores/*.js`; - const entries = Object.entries(compApis), - stores: { file: string; summary: string; instruction: string }[] = []; + const stores: { + file: string; + state: object; + actions: string[]; + getters: string[]; + }[] = []; + const packages: string[] = []; + const entries = Object.entries(compApis); for (const [compName, comp] of entries) { // endpoints for the component const endpoints = comp.endpoints.map((epName) => { @@ -118,7 +124,21 @@ export class WebpageService { stores, srcId: data.srcId, }); - break; + files[components[0].file] = component.code; + + // merge packages + component.packages?.length && packages.push(...component.packages); + // merge stores + component.importedStores?.forEach((store) => { + const s = stores.find((s) => s.file === store.file); + if (s) { + store.state && (s.state = { ...s.state, ...store.state }); // TODO deep merge? + store.actions?.length && + (s.actions = [...s.actions, ...store.actions]); + store.getters?.length && + (s.getters = [...s.getters, ...store.getters]); + } else stores.push(store); + }); } // 5. generate `stores/*.js` used by components, bind `actions` to service endpoints. From 504a1f09c1a8dde404240692a74d63be85a60753 Mon Sep 17 00:00:00 2001 From: dev-callgent Date: Mon, 28 Oct 2024 15:13:57 +0800 Subject: [PATCH 114/183] feat: generate vue app Signed-off-by: dev-callgent --- prisma/seed-test.ts | 2 +- prisma/seed.ts | 25 +++-- src/agents/agents.service.ts | 30 ++++- src/agents/llm.service.ts | 3 +- .../adaptors/builtin/web/webpage.service.ts | 106 ++++++++++++++++-- 5 files changed, 149 insertions(+), 17 deletions(-) diff --git a/prisma/seed-test.ts b/prisma/seed-test.ts index 3df48d0..8eeda4a 100644 --- a/prisma/seed-test.ts +++ b/prisma/seed-test.ts @@ -83,7 +83,7 @@ function initTestData( callgentId: 'TEST_CALLGENT_ID', type: 'CLIENT', adaptorKey: 'restAPI', - host: '', + host: '/api/rest/invoke/TEST_CALLGENT_ID/TEST_CEP_ID', tenantPk: 1, createdBy: userId, }; diff --git a/prisma/seed.ts b/prisma/seed.ts index c0677eb..c037135 100644 --- a/prisma/seed.ts +++ b/prisma/seed.ts @@ -322,8 +322,8 @@ There are 7 steps to generate code to fulfil the requirement: 6. generate \`/src/views/*.vue\` code, which imports \`/src/components/*.js\`, and \`/src/stores/*.js\` if really needed. 7. generate /src/App.vue, /src/main.js -Now let's goto #1, design several view pages, please output a single-lined json object: -{ "views": {[FormalViewName: string]: {"url": "route url", "file": "/src/views/{file-name}.vue", "title":"view title", "summary":"brief summary of use cases", "instruction": "Description of interactive prototype(layout, elements, operations, dynamic effects, etc) to guide developer to implement", "distance":"integer to indicate distance of the view to root view, 0 means root"}}, "/src/router/index.js": "full implementation code. escape special chars to be valid json string" }`, +Now let's goto #1, as our chief frontend expert, please design several view pages, output a single-lined json object: +{ "views": {[FormalViewName: string]: {"url": "route url", "file": "/src/views/{file-name}.vue", "title":"view title", "summary":"brief summary of use cases", "instruction": "Description of interactive prototype(layout, elements, operations, dynamic effects, etc) to guide developer to implement", "distance":"integer to indicate distance of the view to root view, 0 means root"}}, "/src/router/index.js": "full implementation code" }`, }, { name: 'genVue2Components', @@ -345,7 +345,7 @@ There are 7 steps to generate code to fulfil the requirement: Base on the views list from #1: {{=JSON.stringify(it.views)}} -Now let's goto #2, design several components, please output a single-lined json object: +Now let's goto #2, as our chief frontend expert, please design several simple/reusable components, output a single-lined json object: {"components":{[FormalComponentName: string]: {"file": "/src/components/{file-name}.vue", "summary":"brief summary of use cases", "instruction": "Description of interactive prototype(layout, elements, operations, dynamic effects, etc) to guide developer to implement. ignore auth logic, which is handled outside of the VUE app."}}, "associations": { [FormalViewName: string]: ["component formal names array", "some components may be shared by multiple views", ..] }`, }, { @@ -360,7 +360,7 @@ Service \`{{=it.callgent.name}}\` { "summary": "{{=it.callgent.summary}}", "inst ] }, -Please choose needed service endpoints for each component, +As our chief frontend expert, please choose needed service endpoints for each component, Note: all API params are totally listed above, yet components must be changed to fit APIs, so you can remove components if APIs don't support it, or adjust component summary/instruction to fit APIs params! output a single-lined json object(don't list removed components): {[ComponentName: string]: {"endpoints":["endpoint ids(METHOD /resource/url), which \`may\` be used by the component", ..], "summary":"Adjusted summary", "instruction": "Adjusted instruction"} }`, @@ -372,13 +372,24 @@ output a single-lined json object(don't list removed components): "components": {{=JSON.stringify(it.components)}}, "relatedViews": {{=JSON.stringify(it.relatedViews)}}, "otherViews": {{=JSON.stringify(it.otherViews)}}, - "stores": {{=JSON.stringify(it.stores)}} + "stores": {{=JSON.stringify(it.stores)}}, + "packages": {{=JSON.stringify(it.packages)}} }; -Please generate \`{{=it.components[0].file}}\` full code based on it's instruction and endpoint APIs(especially props), and utilize \`element-ui@2.15.14\` as UI library, \`vee-validate@4.14.6\`/\`yup@1.4.0\` for validations. +As our chief frontend expert, please write \`{{=it.components[0].file}}\` full code based on it's instruction and endpoint APIs(especially props). the component must import relevant \`stores/*.js\` for Pinia models and actions, needn't generate stores code in current step. output a single-lined json object: -{ "packages":["packages need to install"], "importedStores": [{"file": "/src/stores/{file-name}.js", "state": {"State JSON object used by current component. don't list props not used by current component. add new if needed"}, "actions": ["Actions used by current component, especially wrap APIs into actions. add new if needed.", "don't list actions not used by current component", ..], "getters": ["getters used by current component. add new if needed", "don't list getters not used by current component", ..]}, ..], "code": "formatted lines of full implementation code for \`/src/components/JobListTable.vue\`. pay special attentions to interaction states/error handling/validations; Only access endpoint APIs through store actions. Escape special chars to be valid json string" }`, +{ "packages":["additional real packages(format: package@version) imported by current file, don't list existing/different versioned/unused ones!","make sure packages exists!"], "importedStores": [{"file": "/src/stores/{file-name}.js", "state": {"State JSON object used by current component, list detailed props used by component for each entity(give example object each arrays). don't list props not used by current component. better use existing, add new if needed"}, "actions": ["Actions(full params/resp signature) used by current component, especially wrap APIs into actions. better use existing, add new if needed.", "don't list actions not used by current component", ..], "getters": ["getters used by current component. add new if needed", "don't list getters not used by current component", ..]}, ..], "code": "formatted lines of full(don't ignore any code, since we put the code directly into project without modification) implementation code for \`/src/components/JobListTable.vue\`. pay special attentions to interaction states/error handling/validations; Only access endpoint APIs through store actions" }`, + }, + { + name: 'genVue5Stores', + prompt: `For Vue3+Pinia app, please generate \`{{=it.store.file}}\` following the specification: +{{=JSON.stringify(it.store)}}; + +existing packages: {{=JSON.stringify(it.packages)}}; +NOTE: call all API with const apiBaseUrl= '{{=it.apiBaseUrl}}'; +As our chief frontend expert, please write the code, output a single-lined json object: +{ "packages":["additional packages(format: package@version) imported by current file, don't list existing/different versioned/unused ones!","make sure packages exists!"], "code": "formatted lines of full(don't ignore any code, since we put the code directly into project without modification) implementation js code" }`, }, ]; diff --git a/src/agents/agents.service.ts b/src/agents/agents.service.ts index d377c91..8945796 100644 --- a/src/agents/agents.service.ts +++ b/src/agents/agents.service.ts @@ -373,9 +373,9 @@ export class AgentsService { actions: string[]; getters: string[]; }[]; + packages: string[]; srcId: string; }) { - let compName = ''; const result = await this.llmService.template('genVue4Components', data, { returnType: { code: '', @@ -383,6 +383,34 @@ export class AgentsService { importedStores: [{ file: '', state: {}, actions: [''], getters: [''] }], }, bizKey: data.srcId, + validate: (gen) => gen.packages?.every((p) => p.lastIndexOf('@') > 0), + }); + + return result; + } + + async genVue5Stores(data: { + store: { + file: string; + state: object; + actions: string[]; + getters: string[]; + endpoints: { + name: any; + summary: any; + description: any; + params: any; + responses: any; + }[]; + }; + packages: string[]; + apiBaseUrl: string; + srcId: string; + }) { + const result = await this.llmService.template('genVue5Stores', data, { + returnType: { code: '', packages: [''] }, + bizKey: data.srcId, + validate: (gen) => gen.packages?.every((p) => p.lastIndexOf('@') > 0), }); return result; diff --git a/src/agents/llm.service.ts b/src/agents/llm.service.ts index a5e2f95..b6c990c 100644 --- a/src/agents/llm.service.ts +++ b/src/agents/llm.service.ts @@ -81,6 +81,7 @@ export class LLMService { try { valid = !validate || validate(ret, i); } catch (e) { + // TODO: add error to conversation to optimize result this.logger.warn( '[retry %d/%d] Fail validating generated content: \n%s\n\t%s', i + 1, @@ -93,7 +94,7 @@ export class LLMService { if (typeof valid === 'boolean') break; // force stop maxRetry = i + 2; // force retry } - if (!valid) throw new Error('Fail validating generated content'); + if (!valid) throw new Error('Fail validating generated content, ' + template); if (notCached) await this._llmCache(template, llmModel, prompt, result); return ret; diff --git a/src/entries/adaptors/builtin/web/webpage.service.ts b/src/entries/adaptors/builtin/web/webpage.service.ts index 90ab4e1..258fe2c 100644 --- a/src/entries/adaptors/builtin/web/webpage.service.ts +++ b/src/entries/adaptors/builtin/web/webpage.service.ts @@ -1,6 +1,9 @@ import { Transactional } from '@nestjs-cls/transactional'; import { Inject, Injectable } from '@nestjs/common'; +import { ConfigService } from '@nestjs/config'; +import { EntryType } from '@prisma/client'; import { AgentsService } from '../../../../agents/agents.service'; +import { EntriesService } from '../../../entries.service'; import { ClientRequestEvent } from '../../../events/client-request.event'; @Injectable() @@ -8,6 +11,9 @@ export class WebpageService { constructor( @Inject('AgentsService') private readonly agentsService: AgentsService, + @Inject('EntriesService') + private readonly entriesService: EntriesService, + private readonly configService: ConfigService, ) {} /** @@ -24,6 +30,19 @@ export class WebpageService { // data.context.req: { requirement } // data.context.endpoints, target events, + // callgent default rest c-entry as base url + const cen = await this.entriesService.findFirstByType( + EntryType.CLIENT, + data.context.callgent.id, + 'restAPI', + ); + if (!cen?.host) + throw new Error( + 'There must be a restAPI client entry as backend API for callgent#' + + data.context.callgent.id, + ); + const apiBaseUrl = `${this.configService.get('SITE_ROOT_URL')}${cen.host}`; + const files: { [filePath: string]: string } = {}; // generate route @@ -34,7 +53,7 @@ export class WebpageService { }; // 1. generate `router/index.js`, only necessary `views` for the requirement const route = await this.agentsService.genVue1Route(agentData); - files['/src/routes/index.js'] = route['router/index.js']; + files['/src/routes/index.js'] = route['/src/router/index.js']; // delete route['router/index.js']; // data.context.webpages.route = route; @@ -76,8 +95,15 @@ export class WebpageService { state: object; actions: string[]; getters: string[]; + endpoints: string[]; }[] = []; - const packages: string[] = []; + let packages: string[] = [ + 'vue@3.5.12', + 'vue-router@4.4.5', + 'element-plus@2.8.6', + 'vee-validate@4.14.6', + 'yup@1.4.0', + ]; const entries = Object.entries(compApis); for (const [compName, comp] of entries) { // endpoints for the component @@ -122,29 +148,95 @@ export class WebpageService { relatedViews, otherViews, stores, + packages, srcId: data.srcId, }); files[components[0].file] = component.code; // merge packages - component.packages?.length && packages.push(...component.packages); + component.packages?.length && + (packages = [...new Set([...packages, ...component.packages])]); // merge stores component.importedStores?.forEach((store) => { const s = stores.find((s) => s.file === store.file); if (s) { - store.state && (s.state = { ...s.state, ...store.state }); // TODO deep merge? store.actions?.length && - (s.actions = [...s.actions, ...store.actions]); + (s.actions = [...new Set([...s.actions, ...store.actions])]); store.getters?.length && - (s.getters = [...s.getters, ...store.getters]); - } else stores.push(store); + (s.getters = [...new Set([...s.getters, ...store.getters])]); + comp.endpoints?.length && + (s.endpoints = [...new Set([...s.endpoints, ...comp.endpoints])]); + + // deep merge state + if (store.state) this._deepMerge(s.state, store.state); + } else { + (store as any).endpoints = comp.endpoints || []; + store.state || (store.state = {}); + store.actions || (store.actions = []); + store.getters || (store.getters = []); + stores.push(store as any); + } }); } // 5. generate `stores/*.js` used by components, bind `actions` to service endpoints. + packages.push('pinia@2.2.4', 'axios@1.7.7'); + for (const store of stores) { + const endpoints = store.endpoints.map((epName) => { + const ep = data.context.endpoints.find((ep) => ep.name === epName); + return { + name: ep.name, + summary: ep.summary, + description: ep.description, + params: ep.params, + responses: ep.responses, + }; + }); + + const storeResult = await this.agentsService.genVue5Stores({ + packages, + store: { ...store, endpoints }, + apiBaseUrl, + srcId: data.srcId, + }); + // merge packages + storeResult.packages?.length && + (packages = [...new Set([...packages, ...storeResult.packages])]); + files[store.file] = storeResult.code; + } + // 6. generate `views/*.vue` code, which imports `components/*.js`, and `stores/*.js` if really needed. + // change view descriptions + // 7. generate App.vue, main.js return { data }; } + + private _deepMerge(target: object, source: object) { + if (typeof source !== 'object') return; + + Object.entries(source).forEach(([key, val]) => { + if (!val) return; + if (target[key]) { + if (typeof val === 'object') { + if (Array.isArray(val)) { + if (val.length) { + if (target[key]?.length) { + if (typeof target[key][0] !== 'object') + target[key][0] = val[0]; // type conflict + else if (typeof val[0] !== 'object') + throw new Error( + `type conflict, cannot merge, src: ${JSON.stringify(val[0])}, target: ${JSON.stringify(target[key][0])}`, + ); + else this._deepMerge(target[key][0], val[0]); + } else target[key] = val; + } + } else if (typeof target[key] !== 'object') + target[key] = val; // type conflict + else this._deepMerge(target[key], val); + } else target[key] = val; + } else target[key] = val; + }); + } } From 52c7c60836d7c76d5872a452b4e7fccb5444ef2e Mon Sep 17 00:00:00 2001 From: dev-callgent Date: Wed, 30 Oct 2024 10:26:39 +0800 Subject: [PATCH 115/183] feat: generate vue app Signed-off-by: dev-callgent --- .env.dev | 3 + .env.test | 3 + .../migration.sql | 8 + prisma/schema.prisma | 3 +- prisma/seed.ts | 99 +++++----- src/agents/agents.service.ts | 127 ++++++++++--- src/agents/llm.service.ts | 47 ++--- .../adaptors/builtin/web/webpage.service.ts | 170 ++++++++++++------ 8 files changed, 324 insertions(+), 136 deletions(-) create mode 100644 prisma/migrations/20241029132827_llm_cache_idx/migration.sql diff --git a/.env.dev b/.env.dev index 3583ab4..c530c93 100644 --- a/.env.dev +++ b/.env.dev @@ -70,3 +70,6 @@ EMAIL_SPARKPOST_RELAY_EXPIRES_IN=86400 # slow sql threshold, default 10000 SLOW_SQL_THRESHOLD=10000 + +WEBPAGE_PACKAGES_COMPONENT=["vue@3.5.12","vue-router@4.4.5","element-plus@2.8.6","vee-validate@4.14.6","yup@1.4.0"] +WEBPAGE_PACKAGES_STORE=["pinia@2.2.4","axios@1.7.7"] diff --git a/.env.test b/.env.test index 87e1a9d..bc90536 100644 --- a/.env.test +++ b/.env.test @@ -60,3 +60,6 @@ EMAIL_SPARKPOST_RELAY_EXPIRES_IN=86400 # slow sql threshold, default 10000 SLOW_SQL_THRESHOLD=10000 + +WEBPAGE_PACKAGES_COMPONENT=["vue@3.5.12","vue-router@4.4.5","element-plus@2.8.6","vee-validate@4.14.6","yup@1.4.0"] +WEBPAGE_PACKAGES_STORE=["pinia@2.2.4","axios@1.7.7"] diff --git a/prisma/migrations/20241029132827_llm_cache_idx/migration.sql b/prisma/migrations/20241029132827_llm_cache_idx/migration.sql new file mode 100644 index 0000000..ba94293 --- /dev/null +++ b/prisma/migrations/20241029132827_llm_cache_idx/migration.sql @@ -0,0 +1,8 @@ +-- DropIndex +DROP INDEX "LlmCache_prompt_model_name_key"; + +-- CreateIndex +CREATE INDEX "LlmCache_prompt_idx" ON "LlmCache" USING HASH ("prompt"); + +-- CreateIndex +CREATE INDEX "LlmCache_model_name_idx" ON "LlmCache"("model", "name"); diff --git a/prisma/schema.prisma b/prisma/schema.prisma index 9e219c2..d947c9a 100644 --- a/prisma/schema.prisma +++ b/prisma/schema.prisma @@ -511,7 +511,8 @@ model LlmCache { createdAt DateTime @default(now()) - @@unique([prompt, model, name]) + @@index([prompt], type: Hash) + @@index([model, name]) } /// @DtoIgnoreModel diff --git a/prisma/seed.ts b/prisma/seed.ts index c037135..2d19b25 100644 --- a/prisma/seed.ts +++ b/prisma/seed.ts @@ -281,7 +281,7 @@ Service \`{{=it.entry.name}}\` { {{ if (it.totally) { }}{{~ it.news : ep }} }; Please re-summarize service \`summary\` and \`instruction\`, for user to quickly know when and how to use this service based only on these 2 fields, output a single-lined JSON object: -{ "totally": "{{ if (it.totally) { }}set to empty{{ }else{ }}set to true if you need to reload all service endpoints to re-summarize.{{ } }}", "summary": "Concise summary to let users quickly understand in what scenarios to use this service. leave empty if \`totally\` is true.", "instruction": "Concise instruction to let users know roughly on how to use this service: concepts/operations etc. leave empty if \`totally\` is true." }`, +{ "totally": "{{ if (it.totally) { }}set to empty{{ }else{ }}set to true if you need to reload all service endpoints to re-summarize, else left empty.{{ } }}", "summary": "Concise summary to let users quickly understand in what scenarios to use this service. leave empty if \`totally\` is true.", "instruction": "Concise instruction to let users know roughly on how to use this service: concepts/operations etc. leave empty if \`totally\` is true." }`, }, { name: 'summarizeCallgent', @@ -303,7 +303,7 @@ Service \`{{=it.callgent.name}}\` { {{ if (it.totally) { }}{{~ it.news : ep }} }; Please re-summarize service \`summary\` and \`instruction\`, for user to quickly know when and how to use this service based only on these 2 fields, output a single-lined JSON object: -{ "totally": "{{ if (it.totally) { }}set to empty{{ }else{ }}set to true if you need to reload all service entries to re-summarize.{{ } }}", "summary": "Concise summary to let users quickly understand in what scenarios to use this service(don't mention service name since it may change). leave empty if \`totally\` is true. 3k chars most", "instruction": "Concise instruction to let users know roughly on how to use this service: concepts/operations etc. leave empty if \`totally\` is true. 3k chars most" }`, +{ "totally": "{{ if (it.totally) { }}set to empty{{ }else{ }}set to true if you need to reload all service entries to re-summarize, else left empty.{{ } }}", "summary": "Concise summary to let users quickly understand in what scenarios to use this service(don't mention service name since it may change). leave empty if \`totally\` is true. 3k chars most", "instruction": "Concise instruction to let users know roughly on how to use this service: concepts/operations etc. leave empty if \`totally\` is true. 3k chars most" }`, }, { name: 'genVue1Route', @@ -313,45 +313,49 @@ output a single-lined JSON object: You need to generate a Vue3+Pinia app for user to interact with backend service APIs: Service \`{{=it.callgent.name}}\` { "summary": "{{=it.callgent.summary}}", "instruction": "{{=it.callgent.instruction}}", "endpoints": {...} }, -There are 7 steps to generate code to fulfil the requirement: +There are 6 steps to generate code to fulfil the requirement: 1. generate \`/src/router/index.js\`, only necessary \`views\` for the requirement -2. define necessary Vue \`components\`, associate with each \`view\`: {view: [comps]}; -3. choose needed service endpoints for each component: {comp: [apis]}; -4. generate \`/src/components/*.vue\` code, which may import \`/src/stores/*.js\`; -5. generate \`/src/stores/*.js\` used by components, bind \`actions\` to service endpoints. -6. generate \`/src/views/*.vue\` code, which imports \`/src/components/*.js\`, and \`/src/stores/*.js\` if really needed. -7. generate /src/App.vue, /src/main.js +2. define necessary Vue \`components\` for each view, associate service endpoints; +3. generate \`/src/components/*.vue\` code, which may import \`/src/stores/*.js\`; +4. generate \`/src/stores/*.js\` used by components, bind \`actions\` to service endpoints. +5. generate \`/src/views/*.vue\` code, which combines several \`/src/components/*.js\`, no any import of \`/src/stores/*.js\`. +6. generate /src/App.vue, /src/main.js -Now let's goto #1, as our chief frontend expert, please design several view pages, output a single-lined json object: -{ "views": {[FormalViewName: string]: {"url": "route url", "file": "/src/views/{file-name}.vue", "title":"view title", "summary":"brief summary of use cases", "instruction": "Description of interactive prototype(layout, elements, operations, dynamic effects, etc) to guide developer to implement", "distance":"integer to indicate distance of the view to root view, 0 means root"}}, "/src/router/index.js": "full implementation code" }`, +Now let's goto #1, as world-class frontend expert, please design necessary simple view pages, output a single-lined json object: +{ "views": {[FormalViewName: string]: {"url": "route url", "file": "/src/views/{file-name}.vue", "title":"view title", "summary":"brief summary of use cases", "instruction": "Description of interactive prototype(layout, elements, operations, dynamic effects, etc) to guide developer to implement", "distance":"integer to indicate distance of the view to root view, 0 means root"}}, "/src/router/index.js": "full implementation code, no process.env.*!" }`, }, + // TODO component tree { name: 'genVue2Components', - prompt: `Given requirement: -{ "description": "{{=it.requirement}}" } - -You need to generate a Vue3+Pinia app for user to interact with backend service APIs: -Service \`{{=it.callgent.name}}\` { "summary": "{{=it.callgent.summary}}", "instruction": "{{=it.callgent.instruction}}", "endpoints": {...} }, - -There are 7 steps to generate code to fulfil the requirement: -1. generate \`/src/router/index.js\`, only necessary \`views\` for the requirement -2. define necessary Vue \`components\`, associate with each \`view\`: {view: [comps]}; -3. choose needed service endpoints for each component: {comp: [apis]}; -4. generate \`/src/components/*.vue\` code, which may import \`/src/stores/*.js\`; -5. generate \`/src/stores/*.js\` used by components, bind \`actions\` to service endpoints. -6. generate \`/src/views/*.vue\` code, which imports \`/src/components/*.js\`, and \`/src/stores/*.js\` if really needed. -7. generate /src/App.vue, /src/main.js + prompt: `For Vue3+Pinia app with views: +[ + {"name":"{{=it.view.name}}","url":"{{=it.view.url}}","file":"{{=it.view.file}}","title":"{{=it.view.title}}","summary":"{{=it.view.summary}}","instruction":"{{=it.view.instruction}}},{{~it.otherViews:ov}} + {"name":"{{=ov.name}}","url":"{{=ov.url}}","title":"{{=ov.title}}","summary":"{{=ov.summary}}"},{{~}} +], +and existing UI components: +{{=JSON.stringify(it.components)}}, -Base on the views list from #1: -{{=JSON.stringify(it.views)}} +Depending on the packages stack: [{{=it.packages}}], use these components for best practice, +As world-class frontend architect, please design simple components(not embedded into each other, each with single responsibility and minimal props) for entire view \`{{=it.view.name}}\`, which are back-ended by service endpoints: [{{~ it.endpoints :ep }} + { "id": "{{=ep.name}}", "summary":"{{=ep.summary}}", {{=ep.description ? '"description":"'+ep.description+'", ':''}}"params": {{=JSON.stringify(ep.params)}} },{{~}} +], +Note: all API params are already documented here! Components access them only via store states/actions. -Now let's goto #2, as our chief frontend expert, please design several simple/reusable components, output a single-lined json object: -{"components":{[FormalComponentName: string]: {"file": "/src/components/{file-name}.vue", "summary":"brief summary of use cases", "instruction": "Description of interactive prototype(layout, elements, operations, dynamic effects, etc) to guide developer to implement. ignore auth logic, which is handled outside of the VUE app."}}, "associations": { [FormalViewName: string]: ["component formal names array", "some components may be shared by multiple views", ..] }`, +Please refine existing or add new components for view \`{{=it.view.name}}\`, output a single-lined json object: +{ [FormalComponentName: string]: {"file": "/src/components/{file-name}.vue", "endpoints":["endpoint ids(METHOD /resource/url), which **may** be used by the component", "may empty array" ..], "summary":"precise summary to let developers correctly use the component without reading the code!", "instruction": "Description of interactive prototype(layout, elements, operations, dynamic effects, etc) to guide developer to implement. ignore auth logic, which is handled outside of the VUE app" }} +After design before output, please redesign to meet rules: +- Assigning single responsibilities to each component +- Not missing any components or service endpoints for the \`{{=it.view.name}}\` view functionalities, yet make the view as simple as possible +- Not including functionalities from other views, we'll design them later +- component props are prohibited, all state goes into pinia stores +- It's OK to cut functionalities to make components only uses API params listed above! +- if \`endpoints\` empty, please describe brief store actions logic in \`instruction\` +- describe interactive dynamics between components in \`instruction\``, }, { name: 'genVue3Apis', prompt: `Given proposed UI components of a Vue3+Pinia app: [{{~ it.compsList :comp }} - { "name": "{{=comp.name}}", "summary":"{{=comp.summary}}", "instruction": "{{=comp.instruction}}" },{{~}} + { "name": "{{=comp.name}}", "props": {{=JSON.stringify(comp.props)}}, "summary":"{{=comp.summary}}", "instruction": "{{=comp.instruction}}" },{{~}} ], Back-ended with the following service APIs: @@ -360,13 +364,13 @@ Service \`{{=it.callgent.name}}\` { "summary": "{{=it.callgent.summary}}", "inst ] }, -As our chief frontend expert, please choose needed service endpoints for each component, -Note: all API params are totally listed above, yet components must be changed to fit APIs, so you can remove components if APIs don't support it, or adjust component summary/instruction to fit APIs params! -output a single-lined json object(don't list removed components): -{[ComponentName: string]: {"endpoints":["endpoint ids(METHOD /resource/url), which \`may\` be used by the component", ..], "summary":"Adjusted summary", "instruction": "Adjusted instruction"} }`, +As world-class frontend expert, please adjust/remove components to fit APIs params, even if it means reducing the required functionality! +Note: all API params are totally listed above! +output a single-lined json object: +{[ComponentName: string]: {"endpoints":["endpoint ids(METHOD /resource/url), which \`may\` be used by the component", ..], "removed": "mark current component as removed if APIs can't fulfill the functionality, then set component's other attributes to empty.", "props": ["similar to function params. please use store state as possible", "must remove unsupported props, may empty", ..], "summary":"Adjusted summary", "instruction": "Adjusted instruction"} }`, }, { - name: 'genVue4Components', + name: 'genVue4Component', prompt: `For Vue3+Pinia app with components structure: { "components": {{=JSON.stringify(it.components)}}, @@ -376,20 +380,35 @@ output a single-lined json object(don't list removed components): "packages": {{=JSON.stringify(it.packages)}} }; -As our chief frontend expert, please write \`{{=it.components[0].file}}\` full code based on it's instruction and endpoint APIs(especially props). +As world-class frontend expert, please write \`{{=it.components[0].file}}\` full code based on it's instruction and endpoint APIs(especially props). the component must import relevant \`stores/*.js\` for Pinia models and actions, needn't generate stores code in current step. output a single-lined json object: -{ "packages":["additional real packages(format: package@version) imported by current file, don't list existing/different versioned/unused ones!","make sure packages exists!"], "importedStores": [{"file": "/src/stores/{file-name}.js", "state": {"State JSON object used by current component, list detailed props used by component for each entity(give example object each arrays). don't list props not used by current component. better use existing, add new if needed"}, "actions": ["Actions(full params/resp signature) used by current component, especially wrap APIs into actions. better use existing, add new if needed.", "don't list actions not used by current component", ..], "getters": ["getters used by current component. add new if needed", "don't list getters not used by current component", ..]}, ..], "code": "formatted lines of full(don't ignore any code, since we put the code directly into project without modification) implementation code for \`/src/components/JobListTable.vue\`. pay special attentions to interaction states/error handling/validations; Only access endpoint APIs through store actions" }`, +{ "packages":["additional real packages(format: package@version) imported by current file, don't list existing/different versioned/unused ones!","make sure packages exists!","may empty array"], "importedStores": [{"file": "/src/stores/{file-name}.js", "state": {"State JSON object used by current component, list detailed props used by component for each entity(give example object each arrays). don't list props not used by current component. better use existing, add new if needed"}, "actions": ["Actions(full params/resp signature) used by current component, especially wrap APIs into actions. better use existing, add new if needed.", "don't list actions not used by current component", ..], "getters": ["getters used by current component. add new if needed", "don't list getters not used by current component", ..]}, ..], "code": "formatted lines of full(don't ignore any code, since we put the code directly into project without modification) implementation code for \`/src/components/JobListTable.vue\`. pay special attentions to interaction states/error handling/validations; Only access endpoint APIs through store actions. Be very careful don't introduce bugs, it causes money loss for us!", "spec": {"props":["prop name","may empty array, no empty string"],"slots":[{"name":"","summary":""}],"events":[{"name":"","summary":"","payload":{[example of payload]}}],"components":["dependent ComponentNames defined by this project","don't list 3rd-party components","may empty array, no empty string"]} }`, }, { - name: 'genVue5Stores', + name: 'genVue5Store', prompt: `For Vue3+Pinia app, please generate \`{{=it.store.file}}\` following the specification: {{=JSON.stringify(it.store)}}; existing packages: {{=JSON.stringify(it.packages)}}; NOTE: call all API with const apiBaseUrl= '{{=it.apiBaseUrl}}'; -As our chief frontend expert, please write the code, output a single-lined json object: -{ "packages":["additional packages(format: package@version) imported by current file, don't list existing/different versioned/unused ones!","make sure packages exists!"], "code": "formatted lines of full(don't ignore any code, since we put the code directly into project without modification) implementation js code" }`, +As world-class frontend expert, please write the code, output a single-lined json object: +{ "packages":["additional packages(format: package@version) imported by current file, don't list existing/different versioned/unused ones!","make sure packages exists!","may empty array"], "code": "formatted lines of full(don't ignore any code, since we put the code directly into project without modification) implementation js(not ts) code. Be very careful don't introduce bugs, it causes money loss for us!" }. +NOTE: strictly prohibit import any stores in view, so stores are only accessed among components!`, + }, + { + name: 'genVue6View', + prompt: `For Vue3+Pinia app, please generate \`{{=it.view.file}}\` following the specification: +{ + "view": {{=JSON.stringify(it.view)}}, + "otherViews": {{=JSON.stringify(it.otherViews)}} +}, +Dependent components by current view page, choose the best ones for current view: {{=JSON.stringify(it.components)}}; +existing packages: {{=JSON.stringify(it.packages)}}; + +As world-class frontend expert, please write the code, output a single-lined json object: +{ "packages":["additional packages(format: package@version) imported by current file, don't list existing/different versioned/unused ones!","make sure packages exists!","may empty array"], "code": "formatted lines of full(don't ignore any code, since we put the code directly into project without modification) implementation js code. Be very careful don't introduce bugs, it causes money loss for us!" }. +NOTE: strictly prohibit importing any stores in this view!`, }, ]; diff --git a/src/agents/agents.service.ts b/src/agents/agents.service.ts index 8945796..a952984 100644 --- a/src/agents/agents.service.ts +++ b/src/agents/agents.service.ts @@ -285,29 +285,57 @@ export class AgentsService { } async genVue2Components(data: { - requirement: string; - callgent: { name: string; summary: string; instruction: string }; - srcId: string; - views: { - [name: string]: { - url: string; + view: { + name: string; + url: string; + file: string; + title: string; + summary: string; + instruction: string; + }; + otherViews: { + name: string; + url: string; + title: string; + summary: string; + }[]; + components: { + [comName: string]: { file: string; + // props: string[]; summary: string; - distance: number; + instruction: string; + inViews: string[]; }; }; + endpoints: { + id: string; + summary: string; + description: string; + params: []; + }[]; + packages: string[]; + srcId: string; }) { - let compName = '', - viewName = ''; + let compName = ''; const result = await this.llmService.template('genVue2Components', data, { returnType: { - components: { [compName]: { file: '', summary: '', instruction: '' } }, - associations: { [viewName]: [''] }, + [compName]: { + file: '', + endpoints: [''], + // props: [''], + summary: '', + instruction: '', + }, }, bizKey: data.srcId, - // validate gen.associations.view exists + // validate endpoints exists validate: (gen) => - Object.keys(gen.associations).every((view) => data.views[view]), + Object.values(gen).every((comp) => + comp.endpoints.every((epName) => + data.endpoints.find((ep) => (ep as any).name === epName), + ), + ), }); return result; @@ -317,6 +345,7 @@ export class AgentsService { srcId: string; compsList: { name: string; + // props: string[]; summary: string; instruction: string; }[]; @@ -331,26 +360,38 @@ export class AgentsService { let compName = ''; const result = await this.llmService.template('genVue3Apis', data, { returnType: { - [compName]: { endpoints: [''], summary: '', instruction: '' }, + [compName]: { + endpoints: [''], + // props: [''], + summary: '', + instruction: '', + }, }, bizKey: data.srcId, // validate compName/endpoints exists validate: (gen) => - Object.entries(gen).every( - ([compName, comp]) => + Object.entries(gen).every(([compName, comp]) => { + if (comp['removed']) { + delete gen[compName]; + return true; + } + delete comp['removed']; + return ( data.compsList.find((comp) => comp.name === compName) && comp.endpoints.every((epName) => data.endpoints.find((ep) => ep.name === epName), - ), - ), + ) + ); + }), }); return result; } - async genVue4Components(data: { + async genVue4Component(data: { components: { name: string; + // props: string[]; file?: string; summary: string; instruction?: string; @@ -376,20 +417,28 @@ export class AgentsService { packages: string[]; srcId: string; }) { - const result = await this.llmService.template('genVue4Components', data, { + const result = await this.llmService.template('genVue4Component', data, { returnType: { code: '', packages: [''], importedStores: [{ file: '', state: {}, actions: [''], getters: [''] }], + spec: { + props: [''], + slots: [{ name: '', summary: '' }], + events: [{ name: '', summary: '', payload: {} }], + components: ['ComponentName', 'may empty array'], + }, }, bizKey: data.srcId, - validate: (gen) => gen.packages?.every((p) => p.lastIndexOf('@') > 0), + validate: (gen) => + gen.packages?.every((p) => p.lastIndexOf('@') > 0) && + gen.spec?.components?.every((c) => data.components.find((comp) => comp.name === c)), }); return result; } - async genVue5Stores(data: { + async genVue5Store(data: { store: { file: string; state: object; @@ -407,12 +456,44 @@ export class AgentsService { apiBaseUrl: string; srcId: string; }) { - const result = await this.llmService.template('genVue5Stores', data, { + const result = await this.llmService.template('genVue5Store', data, { returnType: { code: '', packages: [''] }, bizKey: data.srcId, validate: (gen) => gen.packages?.every((p) => p.lastIndexOf('@') > 0), }); + return result; + } + async genVue6View(data: { + view: { + name: string; + title: string; + url: string; + summary: string; + instruction: string; + file: string; + }; + otherViews: { + name: string; + title: string; + url: string; + }[]; + components: { + name: string; + // props: string[]; + summary: string; + instruction: string; + file: string; + spec: object; + }[]; + packages: string[]; + srcId: string; + }) { + const result = await this.llmService.template('genVue6View', data, { + returnType: { code: '', packages: [''] }, + bizKey: data.srcId, + validate: (gen) => gen.packages?.every((p) => p.lastIndexOf('@') > 0), + }); return result; } } diff --git a/src/agents/llm.service.ts b/src/agents/llm.service.ts index b6c990c..d81917e 100644 --- a/src/agents/llm.service.ts +++ b/src/agents/llm.service.ts @@ -94,7 +94,10 @@ export class LLMService { if (typeof valid === 'boolean') break; // force stop maxRetry = i + 2; // force retry } - if (!valid) throw new Error('Fail validating generated content, ' + template); + if (!valid) { + this.logger.warn('Fail validating generated content, %s, %j', template, ret); + throw new Error('Fail validating generated content, ' + template); + } if (notCached) await this._llmCache(template, llmModel, prompt, result); return ret; @@ -147,31 +150,35 @@ export class LLMService { if (prompt.length > this.CACHE_PROMPT_MAX_LEN) { this.logger.warn( '>>> Prompt too long to cache: name: %s, prompt: \n%s\n\n\tresult: %s', - { name, prompt, result }, - ); - return; - } - const prisma = this.txHost.tx as PrismaClient; - if (result) { - this.logger.debug( - '>>>> Write LLM result to cache: name: %s, prompt: %s\n\n\tresult: %s', name, prompt, result, ); - return prisma.llmCache.upsert({ - where: { prompt_model_name: { prompt, model, name } }, - create: { name, model, prompt, result }, - update: { name, prompt, result }, - }); + return; } - - const ret = await prisma.llmCache.findUnique({ - where: { prompt_model_name: { prompt, model, name } }, - select: { result: true }, + const prisma = this.txHost.tx as PrismaClient; + const ret = await prisma.llmCache.findFirst({ + where: { prompt, model, name }, + select: { pk: true, result: true }, }); - if (ret) this.logger.debug('>>> Hit LLM result cache: %s, %s', name, model); - return ret; + + if (!result) { + ret && this.logger.debug('>>> Hit LLM result cache: %s, %s', name, model); + return ret; + } + + this.logger.debug( + '>>>> Write LLM result to cache: name: %s, prompt: %s\n\n\tresult: %s', + name, + prompt, + result, + ); + return ret + ? prisma.llmCache.update({ + where: { pk: ret.pk }, + data: { result }, + }) + : prisma.llmCache.create({ data: { name, model, prompt, result } }); } protected async _prompt(template: string, args: { [key: string]: any }) { diff --git a/src/entries/adaptors/builtin/web/webpage.service.ts b/src/entries/adaptors/builtin/web/webpage.service.ts index 258fe2c..ac766c1 100644 --- a/src/entries/adaptors/builtin/web/webpage.service.ts +++ b/src/entries/adaptors/builtin/web/webpage.service.ts @@ -14,7 +14,16 @@ export class WebpageService { @Inject('EntriesService') private readonly entriesService: EntriesService, private readonly configService: ConfigService, - ) {} + ) { + this.initPackagesComponent = JSON.parse( + this.configService.get('WEBPAGE_PACKAGES_COMPONENT'), + ); + this.initPackagesStore = JSON.parse( + this.configService.get('WEBPAGE_PACKAGES_STORE'), + ); + } + protected initPackagesComponent = []; + protected initPackagesStore = []; /** * Generate webpage[view/route/model/view-model], then respond the src code @@ -46,34 +55,30 @@ export class WebpageService { const files: { [filePath: string]: string } = {}; // generate route - const agentData: any = { + // 1. generate `router/index.js`, only necessary `views` for the requirement + const route = await this.agentsService.genVue1Route({ srcId: data.srcId, callgent: data.context.callgent, requirement: data.context.req.requirement, - }; - // 1. generate `router/index.js`, only necessary `views` for the requirement - const route = await this.agentsService.genVue1Route(agentData); + }); files['/src/routes/index.js'] = route['/src/router/index.js']; - // delete route['router/index.js']; - // data.context.webpages.route = route; - - // 2. define necessary Vue `components`, associate with each `view`: {view: [comps]}; - agentData.views = route.views; - const comps = await this.agentsService.genVue2Components(agentData); - const compViews: { [compName: string]: string[] } = {}; - Object.entries(comps.associations).forEach(([viewName, comps]) => - comps?.forEach((compName) => { - const views = compViews[compName] || (compViews[compName] = []); - views.push(viewName); - }), - ); - - // 3. choose needed service endpoints for each component: {comp: [apis]}; - // TODO filter by view distances - const compsList = Object.entries(comps.components).map(([name, comp]) => ({ - ...comp, + delete route['router/index.js']; + const viewList = Object.entries(route.views).map(([name, view]) => ({ name, + ...view, })); + + // 2. define necessary Vue `components`, associate with each `view`: {view: [comps]}; + const components: { + [comName: string]: { + file: string; + // props: string[]; + summary: string; + instruction: string; + endpoints: string[]; + inViews: string[]; + }; + } = {}; const endpoints = data.context.endpoints.map((e) => { const params = e.params?.parameters?.map((p) => p.name) || []; e.params.requestBody?.content && @@ -82,13 +87,48 @@ export class WebpageService { ); return { ...e, params }; }); - const compApis = await this.agentsService.genVue3Apis({ - endpoints, - compsList, - srcId: data.srcId, - callgent: data.context.callgent, + let keys = Object.keys(route.views); + for (const viewName of keys) { + const view = viewList.find((v) => v.name === viewName); + const otherViews = viewList.filter((v) => v.name !== viewName); + const cps = await this.agentsService.genVue2Components({ + view, + otherViews, + components, + endpoints, + packages: this.initPackagesComponent, + srcId: data.srcId, + }); + Object.entries(cps).forEach(([name, comp]) => { + const cp = components[name]; + if (cp) { + cp.inViews.push(viewName); + Object.assign(cp, comp); + } else components[name] = { ...comp, inViews: [viewName] }; + }); + } + keys = undefined; + const viewComps: { [view: string]: string[] } = {}; + const compsList = Object.entries(components).map(([name, comp]) => { + comp.inViews.forEach((view) => { + const comps = viewComps[view] || (viewComps[view] = []); + comps.push(name); + }); + return { + name, + ...comp, + }; }); + // 3. choose needed service endpoints for each component: {comp: [apis]}; + // TODO filter by view distances + // const compApis = await this.agentsService.genVue3Apis({ + // endpoints, + // compsList, + // srcId: data.srcId, + // callgent: data.context.callgent, + // }); + // 4. generate `components/*.vue` code, which may import `stores/*.js`; const stores: { file: string; @@ -97,14 +137,8 @@ export class WebpageService { getters: string[]; endpoints: string[]; }[] = []; - let packages: string[] = [ - 'vue@3.5.12', - 'vue-router@4.4.5', - 'element-plus@2.8.6', - 'vee-validate@4.14.6', - 'yup@1.4.0', - ]; - const entries = Object.entries(compApis); + let packages: string[] = this.initPackagesComponent; + let entries = Object.entries(components); for (const [compName, comp] of entries) { // endpoints for the component const endpoints = comp.endpoints.map((epName) => { @@ -112,47 +146,53 @@ export class WebpageService { return { name: ep.name, params: ep.params, responses: ep.responses }; }); // list related views - const relatedViews = compViews[compName].map((view) => ({ + const relatedViews = components[compName].inViews.map((view) => ({ name: view, url: route.views[view].url, title: route.views[view].title, summary: route.views[view].summary, instruction: route.views[view].instruction, - components: comps.associations[view].filter((c) => c in compApis), + components: viewComps[view], })); const otherViews = Object.entries(route.views) - .filter(([name, v]) => !relatedViews.find((v0) => v0.name === name)) + .filter(([name]) => !relatedViews.find((v0) => v0.name === name)) .map(([name, v]) => ({ name, url: v.url, summary: v.summary })); // and comps related to the views - const components: { + const relatedComps: { name: string; + // props: string[]; file?: string; summary: string; instruction?: string; endpoints?: { name: string; params: object; responses: object }[]; - }[] = relatedViews - .map((v) => comps.associations[v.name]) - .flat() - .filter((c) => c !== compName && c in compApis) - .map((c) => ({ name: c, summary: compApis[c].summary })); - components.unshift({ + }[] = [...new Set(relatedViews.map((v) => viewComps[v.name]).flat())] + .filter((c) => c !== compName) + .map((c) => ({ + name: c, + // props: components[c].props, + summary: components[c].summary, + instruction: components[c].instruction, + })); + relatedComps.unshift({ name: compName, - file: comps.components[compName].file, + file: components[compName].file, ...comp, endpoints, }); - const component = await this.agentsService.genVue4Components({ - components, + const component = await this.agentsService.genVue4Component({ + components: relatedComps, relatedViews, otherViews, stores, packages, srcId: data.srcId, }); - files[components[0].file] = component.code; + files[components[compName].file] = component.code; + // add spec + (comp as any).spec = component.spec; // merge packages component.packages?.length && (packages = [...new Set([...packages, ...component.packages])]); @@ -178,9 +218,10 @@ export class WebpageService { } }); } + entries = undefined; // 5. generate `stores/*.js` used by components, bind `actions` to service endpoints. - packages.push('pinia@2.2.4', 'axios@1.7.7'); + packages.push(...this.initPackagesStore); for (const store of stores) { const endpoints = store.endpoints.map((epName) => { const ep = data.context.endpoints.find((ep) => ep.name === epName); @@ -193,7 +234,7 @@ export class WebpageService { }; }); - const storeResult = await this.agentsService.genVue5Stores({ + const storeResult = await this.agentsService.genVue5Store({ packages, store: { ...store, endpoints }, apiBaseUrl, @@ -207,6 +248,31 @@ export class WebpageService { // 6. generate `views/*.vue` code, which imports `components/*.js`, and `stores/*.js` if really needed. // change view descriptions + let entries1 = Object.entries(viewComps); + for (const [name, compNames] of entries1) { + const view = { name, ...route.views[name], distance: undefined }; + const otherViews = Object.entries(route.views) + .filter(([n, v]) => n !== name && v) + .map(([name, v]) => ({ name, title: v.title, url: v.url })); + const comps = compNames.map((compName) => ({ + name: compName, + spec: null, + ...components[compName], + endpoints: undefined, + inViews: undefined, + })); + const result = await this.agentsService.genVue6View({ + view, + otherViews, + components: comps, + packages, + srcId: data.srcId, + }); + result.packages?.length && + (packages = [...new Set([...packages, ...result.packages])]); + files[view.file] = result.code; + } + entries1 = undefined; // 7. generate App.vue, main.js From a668b678daca6ba38913c15adef2fd4a0bf20e92 Mon Sep 17 00:00:00 2001 From: dev-callgent Date: Wed, 30 Oct 2024 10:33:59 +0800 Subject: [PATCH 116/183] feat: generate vue app Signed-off-by: dev-callgent --- src/entries/adaptors/builtin/web/webpage.service.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/entries/adaptors/builtin/web/webpage.service.ts b/src/entries/adaptors/builtin/web/webpage.service.ts index ac766c1..9c86baf 100644 --- a/src/entries/adaptors/builtin/web/webpage.service.ts +++ b/src/entries/adaptors/builtin/web/webpage.service.ts @@ -1,5 +1,5 @@ import { Transactional } from '@nestjs-cls/transactional'; -import { Inject, Injectable } from '@nestjs/common'; +import { Inject, Injectable, Logger } from '@nestjs/common'; import { ConfigService } from '@nestjs/config'; import { EntryType } from '@prisma/client'; import { AgentsService } from '../../../../agents/agents.service'; @@ -22,6 +22,7 @@ export class WebpageService { this.configService.get('WEBPAGE_PACKAGES_STORE'), ); } + private readonly logger = new Logger(WebpageService.name); protected initPackagesComponent = []; protected initPackagesStore = []; @@ -276,6 +277,7 @@ export class WebpageService { // 7. generate App.vue, main.js + this.logger.warn(JSON.stringify([packages, files])); return { data }; } From 94ea960075d9e72779a1612fc7925c5d2d097e75 Mon Sep 17 00:00:00 2001 From: dev-callgent Date: Thu, 7 Nov 2024 14:28:52 +0800 Subject: [PATCH 117/183] fix: dotenv for seed test Signed-off-by: dev-callgent --- .husky/commit-msg | 2 + .husky/prepare-commit-msg | 8 +- package.json | 2 + pnpm-lock.yaml | 10947 ++++++++++++++++++++--------------- prisma/seed-test.ts | 71 +- src/users/users.service.ts | 1 + 6 files changed, 6342 insertions(+), 4689 deletions(-) diff --git a/.husky/commit-msg b/.husky/commit-msg index 36158d9..0492f2e 100644 --- a/.husky/commit-msg +++ b/.husky/commit-msg @@ -1 +1,3 @@ +#!/bin/sh + npx --no-install commitlint --edit "$1" \ No newline at end of file diff --git a/.husky/prepare-commit-msg b/.husky/prepare-commit-msg index 982a62e..c2f69a4 100755 --- a/.husky/prepare-commit-msg +++ b/.husky/prepare-commit-msg @@ -1,6 +1,8 @@ +#!/bin/sh + # check 'Signed-off-by' in commit message -git_commit_message=$(cat $1) -if [[ "$git_commit_message" != *"Signed-off-by: "* ]]; then +git_commit_message=$(cat "$1") +if [ -z "$(echo "$git_commit_message" | grep 'Signed-off-by: ')" ]; then echo echo "\033[31mError\033[0m:" echo "Commit message is missing the Signed-off-by line." @@ -10,4 +12,4 @@ if [[ "$git_commit_message" != *"Signed-off-by: "* ]]; then exit 1 fi -exit 0 \ No newline at end of file +exit 0 diff --git a/package.json b/package.json index a6632ae..66e447e 100644 --- a/package.json +++ b/package.json @@ -102,6 +102,8 @@ "@typescript-eslint/parser": "^8.8.1", "commitizen": "^4.3.1", "cz-conventional-changelog": "^3.3.0", + "dotenv": "^16.4.5", + "dotenv-expand": "^11.0.6", "eslint": "^9.12.0", "eslint-config-prettier": "^9.1.0", "eslint-plugin-prettier": "^5.2.1", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 4a0527d..fdc7e54 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1,298 +1,5006 @@ -lockfileVersion: '6.0' - -dependencies: - '@apidevtools/json-schema-ref-parser': - specifier: ^11.7.2 - version: 11.7.2 - '@fastify/compress': - specifier: ^7.0.3 - version: 7.0.3 - '@fastify/cookie': - specifier: ^9.4.0 - version: 9.4.0 - '@fastify/cors': - specifier: ^9.0.1 - version: 9.0.1 - '@fastify/helmet': - specifier: ^11.1.1 - version: 11.1.1 - '@fastify/multipart': - specifier: 8.3.0 - version: 8.3.0 - '@fastify/static': - specifier: ^7.0.4 - version: 7.0.4 - '@nestjs-cls/transactional': - specifier: ^2.4.2 - version: 2.4.2(@nestjs/common@10.4.4)(@nestjs/core@10.4.4)(nestjs-cls@4.4.1)(reflect-metadata@0.2.2)(rxjs@7.8.1) - '@nestjs-cls/transactional-adapter-prisma': - specifier: ^1.2.4 - version: 1.2.4(@nestjs-cls/transactional@2.4.2)(@prisma/client@5.20.0)(nestjs-cls@4.4.1)(prisma@5.20.0) - '@nestjs/cache-manager': - specifier: ^2.2.2 - version: 2.2.2(@nestjs/common@10.4.4)(@nestjs/core@10.4.4)(cache-manager@5.4.0)(rxjs@7.8.1) - '@nestjs/common': - specifier: ^10.4.4 - version: 10.4.4(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.2)(rxjs@7.8.1) - '@nestjs/config': - specifier: ^3.2.3 - version: 3.2.3(@nestjs/common@10.4.4)(rxjs@7.8.1) - '@nestjs/core': - specifier: ^10.4.4 - version: 10.4.4(@nestjs/common@10.4.4)(reflect-metadata@0.2.2)(rxjs@7.8.1) - '@nestjs/event-emitter': - specifier: ^2.0.4 - version: 2.0.4(@nestjs/common@10.4.4)(@nestjs/core@10.4.4) - '@nestjs/jwt': - specifier: ^10.2.0 - version: 10.2.0(@nestjs/common@10.4.4) - '@nestjs/passport': - specifier: ^10.0.3 - version: 10.0.3(@nestjs/common@10.4.4)(passport@0.7.0) - '@nestjs/platform-fastify': - specifier: ^10.3.4 - version: 10.3.4(@fastify/static@7.0.4)(@nestjs/common@10.4.4)(@nestjs/core@10.4.4) - '@nestjs/swagger': - specifier: ^7.4.2 - version: 7.4.2(@fastify/static@7.0.4)(@nestjs/common@10.4.4)(@nestjs/core@10.4.4)(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.2) - '@nodeteam/nestjs-prisma-pagination': - specifier: ^1.0.6 - version: 1.0.6(@babel/core@7.23.9)(@nestjs/core@10.4.4)(@types/node@22.7.5)(cache-manager@5.4.0)(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.2)(rxjs@7.8.1)(ts-node@10.9.2) - '@prisma/client': - specifier: 5.20.0 - version: 5.20.0(prisma@5.20.0) - axios: - specifier: ^1.7.7 - version: 1.7.7(debug@2.6.9) - bcrypt: - specifier: ^5.1.1 - version: 5.1.1 - braces: - specifier: ^3.0.3 - version: 3.0.3 - class-transformer: - specifier: ^0.5.1 - version: 0.5.1 - class-validator: - specifier: ^0.14.1 - version: 0.14.1 - concat-stream: - specifier: 1.6.2 - version: 1.6.2 - dot: - specifier: ^1.1.3 - version: 1.1.3 - fastify: - specifier: 4.26.2 - version: 4.26.2 - fastify-ip: - specifier: ^1.1.0 - version: 1.1.0 - glob: - specifier: ^10.4.5 - version: 10.4.5 - http-status: - specifier: ^1.7.4 - version: 1.7.4 - jsonrepair: - specifier: ^3.8.1 - version: 3.8.1 - micromatch: - specifier: '>=4.0.8' - version: 4.0.8 - module: - specifier: ^1.2.5 - version: 1.2.5 - ms: - specifier: ^2.1.3 - version: 2.1.3 - nanoid: - specifier: 3.3.7 - version: 3.3.7 - nestjs-cls: - specifier: ^4.4.1 - version: 4.4.1(@nestjs/common@10.4.4)(@nestjs/core@10.4.4)(reflect-metadata@0.2.2)(rxjs@7.8.1) - nestjs-oauth2: - specifier: ^0.0.7 - version: 0.0.7(@nestjs/common@10.4.4)(rxjs@7.8.1) - nestjs-pino: - specifier: ^4.1.0 - version: 4.1.0(@nestjs/common@10.4.4)(pino-http@10.3.0) - nestjs-prisma: - specifier: ^0.23.0 - version: 0.23.0(@nestjs/common@10.4.4)(@prisma/client@5.20.0)(prisma@5.20.0) - passport-jwt: - specifier: ^4.0.1 - version: 4.0.1 - passport-local: - specifier: ^1.0.0 - version: 1.0.0 - phin: - specifier: ^3.7.1 - version: 3.7.1(debug@2.6.9) - pino: - specifier: ^9.4.0 - version: 9.4.0 - pino-http: - specifier: ^10.3.0 - version: 10.3.0 - pino-pretty: - specifier: ^11.2.2 - version: 11.2.2 - prisma-soft-delete-middleware: - specifier: ^1.3.1 - version: 1.3.1(@prisma/client@5.20.0) - reflect-metadata: - specifier: ^0.2.2 - version: 0.2.2 - rxjs: - specifier: ^7.8.1 - version: 7.8.1 - yaml: - specifier: ^2.6.0 - version: 2.6.0 - -devDependencies: - '@chax-at/transactional-prisma-testing': - specifier: ^1.2.0 - version: 1.2.0(@prisma/client@5.20.0) - '@commitlint/cli': - specifier: ^19.5.0 - version: 19.5.0(@types/node@22.7.5)(typescript@5.6.3) - '@commitlint/config-angular': - specifier: ^19.5.0 - version: 19.5.0 - '@nestjs/cli': - specifier: ^10.4.5 - version: 10.4.5 - '@nestjs/schematics': - specifier: ^10.1.4 - version: 10.1.4(chokidar@3.6.0)(typescript@5.3.3) - '@nestjs/testing': - specifier: ^10.4.4 - version: 10.4.4(@nestjs/common@10.4.4)(@nestjs/core@10.4.4) - '@pond918/prisma-generator-nestjs-dto': - specifier: ^1.17.513 - version: 1.17.513 - '@types/bcrypt': - specifier: ^5.0.2 - version: 5.0.2 - '@types/dot': - specifier: ^1.1.7 - version: 1.1.7 - '@types/jest': - specifier: ^29.5.13 - version: 29.5.13 - '@types/ms': - specifier: ^0.7.34 - version: 0.7.34 - '@types/node': - specifier: ^22.7.5 - version: 22.7.5 - '@types/passport-jwt': - specifier: ^4.0.1 - version: 4.0.1 - '@types/passport-local': - specifier: ^1.0.38 - version: 1.0.38 - '@types/supertest': - specifier: ^6.0.2 - version: 6.0.2 - '@typescript-eslint/eslint-plugin': - specifier: ^8.8.1 - version: 8.8.1(@typescript-eslint/parser@8.8.1)(eslint@9.12.0)(typescript@5.6.3) - '@typescript-eslint/parser': - specifier: ^8.8.1 - version: 8.8.1(eslint@9.12.0)(typescript@5.6.3) - commitizen: - specifier: ^4.3.1 - version: 4.3.1(@types/node@22.7.5)(typescript@5.6.3) - cz-conventional-changelog: - specifier: ^3.3.0 - version: 3.3.0(@types/node@22.7.5)(typescript@5.6.3) - eslint: - specifier: ^9.12.0 - version: 9.12.0 - eslint-config-prettier: - specifier: ^9.1.0 - version: 9.1.0(eslint@9.12.0) - eslint-plugin-prettier: - specifier: ^5.2.1 - version: 5.2.1(eslint-config-prettier@9.1.0)(eslint@9.12.0)(prettier@3.3.3) - find-my-way: - specifier: '>=8.2.2' - version: 8.2.2 - husky: - specifier: ^9.1.6 - version: 9.1.6 - jest: - specifier: ^29.7.0 - version: 29.7.0(@types/node@22.7.5)(ts-node@10.9.2) - pactum: - specifier: ^3.7.1 - version: 3.7.1(debug@2.6.9) - pactum-matchers: - specifier: ^1.1.7 - version: 1.1.7 - path-to-regexp: - specifier: '>=6.3.0' - version: 6.3.0 - prettier: - specifier: ^3.3.3 - version: 3.3.3 - prisma: - specifier: ^5.20.0 - version: 5.20.0 - source-map-support: - specifier: ^0.5.21 - version: 0.5.21 - standard-version: - specifier: ^9.5.0 - version: 9.5.0 - supertest: - specifier: ^6.3.3 - version: 6.3.3 - tar: - specifier: 7.4.3 - version: 7.4.3 - ts-jest: - specifier: ^29.2.5 - version: 29.2.5(@babel/core@7.23.9)(jest@29.7.0)(typescript@5.6.3) - ts-loader: - specifier: ^9.5.1 - version: 9.5.1(typescript@5.6.3)(webpack@5.94.0) - ts-node: - specifier: ^10.9.2 - version: 10.9.2(@types/node@22.7.5)(typescript@5.6.3) - tsconfig-paths: - specifier: ^4.2.0 - version: 4.2.0 - typescript: - specifier: ^5.6.3 - version: 5.6.3 +lockfileVersion: '9.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +importers: + + .: + dependencies: + '@apidevtools/json-schema-ref-parser': + specifier: ^11.7.2 + version: 11.7.2 + '@fastify/compress': + specifier: ^7.0.3 + version: 7.0.3 + '@fastify/cookie': + specifier: ^9.4.0 + version: 9.4.0 + '@fastify/cors': + specifier: ^9.0.1 + version: 9.0.1 + '@fastify/helmet': + specifier: ^11.1.1 + version: 11.1.1 + '@fastify/multipart': + specifier: 8.3.0 + version: 8.3.0 + '@fastify/static': + specifier: ^7.0.4 + version: 7.0.4 + '@nestjs-cls/transactional': + specifier: ^2.4.2 + version: 2.4.2(@nestjs/common@10.4.4(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/core@10.4.4(@nestjs/common@10.4.4(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.2)(rxjs@7.8.1))(reflect-metadata@0.2.2)(rxjs@7.8.1))(nestjs-cls@4.4.1(@nestjs/common@10.4.4(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/core@10.4.4(@nestjs/common@10.4.4(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.2)(rxjs@7.8.1))(reflect-metadata@0.2.2)(rxjs@7.8.1))(reflect-metadata@0.2.2)(rxjs@7.8.1))(reflect-metadata@0.2.2)(rxjs@7.8.1) + '@nestjs-cls/transactional-adapter-prisma': + specifier: ^1.2.4 + version: 1.2.4(rob4yv5uoscbdactcoj62w3k2m) + '@nestjs/cache-manager': + specifier: ^2.2.2 + version: 2.2.2(@nestjs/common@10.4.4(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/core@10.4.4(@nestjs/common@10.4.4(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.2)(rxjs@7.8.1))(reflect-metadata@0.2.2)(rxjs@7.8.1))(cache-manager@5.4.0)(rxjs@7.8.1) + '@nestjs/common': + specifier: ^10.4.4 + version: 10.4.4(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.2)(rxjs@7.8.1) + '@nestjs/config': + specifier: ^3.2.3 + version: 3.2.3(@nestjs/common@10.4.4(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.2)(rxjs@7.8.1))(rxjs@7.8.1) + '@nestjs/core': + specifier: ^10.4.4 + version: 10.4.4(@nestjs/common@10.4.4(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.2)(rxjs@7.8.1))(reflect-metadata@0.2.2)(rxjs@7.8.1) + '@nestjs/event-emitter': + specifier: ^2.0.4 + version: 2.0.4(@nestjs/common@10.4.4(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/core@10.4.4(@nestjs/common@10.4.4(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.2)(rxjs@7.8.1))(reflect-metadata@0.2.2)(rxjs@7.8.1)) + '@nestjs/jwt': + specifier: ^10.2.0 + version: 10.2.0(@nestjs/common@10.4.4(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.2)(rxjs@7.8.1)) + '@nestjs/passport': + specifier: ^10.0.3 + version: 10.0.3(@nestjs/common@10.4.4(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.2)(rxjs@7.8.1))(passport@0.7.0) + '@nestjs/platform-fastify': + specifier: ^10.3.4 + version: 10.3.4(@fastify/static@7.0.4)(@nestjs/common@10.4.4(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/core@10.4.4(@nestjs/common@10.4.4(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.2)(rxjs@7.8.1))(reflect-metadata@0.2.2)(rxjs@7.8.1)) + '@nestjs/swagger': + specifier: ^7.4.2 + version: 7.4.2(@fastify/static@7.0.4)(@nestjs/common@10.4.4(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/core@10.4.4(@nestjs/common@10.4.4(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.2)(rxjs@7.8.1))(reflect-metadata@0.2.2)(rxjs@7.8.1))(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.2) + '@nodeteam/nestjs-prisma-pagination': + specifier: ^1.0.6 + version: 1.0.6(@babel/core@7.23.9)(@jest/types@29.6.3)(@nestjs/core@10.4.4(@nestjs/common@10.4.4(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.2)(rxjs@7.8.1))(reflect-metadata@0.2.2)(rxjs@7.8.1))(@types/node@22.7.5)(babel-jest@29.7.0(@babel/core@7.23.9))(cache-manager@5.4.0)(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.2)(rxjs@7.8.1)(ts-node@10.9.2(@types/node@22.7.5)(typescript@5.6.3)) + '@prisma/client': + specifier: 5.20.0 + version: 5.20.0(prisma@5.20.0) + axios: + specifier: ^1.7.7 + version: 1.7.7(debug@2.6.9) + bcrypt: + specifier: ^5.1.1 + version: 5.1.1 + braces: + specifier: ^3.0.3 + version: 3.0.3 + class-transformer: + specifier: ^0.5.1 + version: 0.5.1 + class-validator: + specifier: ^0.14.1 + version: 0.14.1 + concat-stream: + specifier: 1.6.2 + version: 1.6.2 + dot: + specifier: ^1.1.3 + version: 1.1.3 + fastify: + specifier: 4.26.2 + version: 4.26.2 + fastify-ip: + specifier: ^1.1.0 + version: 1.1.0 + glob: + specifier: ^10.4.5 + version: 10.4.5 + http-status: + specifier: ^1.7.4 + version: 1.7.4 + jsonrepair: + specifier: ^3.8.1 + version: 3.8.1 + micromatch: + specifier: '>=4.0.8' + version: 4.0.8 + module: + specifier: ^1.2.5 + version: 1.2.5 + ms: + specifier: ^2.1.3 + version: 2.1.3 + nanoid: + specifier: 3.3.7 + version: 3.3.7 + nestjs-cls: + specifier: ^4.4.1 + version: 4.4.1(@nestjs/common@10.4.4(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/core@10.4.4(@nestjs/common@10.4.4(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.2)(rxjs@7.8.1))(reflect-metadata@0.2.2)(rxjs@7.8.1))(reflect-metadata@0.2.2)(rxjs@7.8.1) + nestjs-oauth2: + specifier: ^0.0.7 + version: 0.0.7(@nestjs/common@10.4.4(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.2)(rxjs@7.8.1))(rxjs@7.8.1) + nestjs-pino: + specifier: ^4.1.0 + version: 4.1.0(@nestjs/common@10.4.4(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.2)(rxjs@7.8.1))(pino-http@10.3.0) + nestjs-prisma: + specifier: ^0.23.0 + version: 0.23.0(@nestjs/common@10.4.4(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.2)(rxjs@7.8.1))(@prisma/client@5.20.0(prisma@5.20.0))(chokidar@3.6.0)(prisma@5.20.0) + passport-jwt: + specifier: ^4.0.1 + version: 4.0.1 + passport-local: + specifier: ^1.0.0 + version: 1.0.0 + phin: + specifier: ^3.7.1 + version: 3.7.1(debug@2.6.9) + pino: + specifier: ^9.4.0 + version: 9.4.0 + pino-http: + specifier: ^10.3.0 + version: 10.3.0 + pino-pretty: + specifier: ^11.2.2 + version: 11.2.2 + prisma-soft-delete-middleware: + specifier: ^1.3.1 + version: 1.3.1(@prisma/client@5.20.0(prisma@5.20.0)) + reflect-metadata: + specifier: ^0.2.2 + version: 0.2.2 + rxjs: + specifier: ^7.8.1 + version: 7.8.1 + yaml: + specifier: ^2.6.0 + version: 2.6.0 + devDependencies: + '@chax-at/transactional-prisma-testing': + specifier: ^1.2.0 + version: 1.2.0(@prisma/client@5.20.0(prisma@5.20.0)) + '@commitlint/cli': + specifier: ^19.5.0 + version: 19.5.0(@types/node@22.7.5)(typescript@5.6.3) + '@commitlint/config-angular': + specifier: ^19.5.0 + version: 19.5.0 + '@nestjs/cli': + specifier: ^10.4.5 + version: 10.4.5 + '@nestjs/schematics': + specifier: ^10.1.4 + version: 10.1.4(chokidar@3.6.0)(typescript@5.6.3) + '@nestjs/testing': + specifier: ^10.4.4 + version: 10.4.4(@nestjs/common@10.4.4(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/core@10.4.4(@nestjs/common@10.4.4(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.2)(rxjs@7.8.1))(reflect-metadata@0.2.2)(rxjs@7.8.1)) + '@pond918/prisma-generator-nestjs-dto': + specifier: ^1.17.513 + version: 1.17.513 + '@types/bcrypt': + specifier: ^5.0.2 + version: 5.0.2 + '@types/dot': + specifier: ^1.1.7 + version: 1.1.7 + '@types/jest': + specifier: ^29.5.13 + version: 29.5.13 + '@types/ms': + specifier: ^0.7.34 + version: 0.7.34 + '@types/node': + specifier: ^22.7.5 + version: 22.7.5 + '@types/passport-jwt': + specifier: ^4.0.1 + version: 4.0.1 + '@types/passport-local': + specifier: ^1.0.38 + version: 1.0.38 + '@types/supertest': + specifier: ^6.0.2 + version: 6.0.2 + '@typescript-eslint/eslint-plugin': + specifier: ^8.8.1 + version: 8.8.1(@typescript-eslint/parser@8.8.1(eslint@9.12.0(jiti@1.21.0))(typescript@5.6.3))(eslint@9.12.0(jiti@1.21.0))(typescript@5.6.3) + '@typescript-eslint/parser': + specifier: ^8.8.1 + version: 8.8.1(eslint@9.12.0(jiti@1.21.0))(typescript@5.6.3) + commitizen: + specifier: ^4.3.1 + version: 4.3.1(@types/node@22.7.5)(typescript@5.6.3) + cz-conventional-changelog: + specifier: ^3.3.0 + version: 3.3.0(@types/node@22.7.5)(typescript@5.6.3) + dotenv: + specifier: ^16.4.5 + version: 16.4.5 + dotenv-expand: + specifier: ^11.0.6 + version: 11.0.6 + eslint: + specifier: ^9.12.0 + version: 9.12.0(jiti@1.21.0) + eslint-config-prettier: + specifier: ^9.1.0 + version: 9.1.0(eslint@9.12.0(jiti@1.21.0)) + eslint-plugin-prettier: + specifier: ^5.2.1 + version: 5.2.1(eslint-config-prettier@9.1.0(eslint@9.12.0(jiti@1.21.0)))(eslint@9.12.0(jiti@1.21.0))(prettier@3.3.3) + find-my-way: + specifier: '>=8.2.2' + version: 8.2.2 + husky: + specifier: ^9.1.6 + version: 9.1.6 + jest: + specifier: ^29.7.0 + version: 29.7.0(@types/node@22.7.5)(ts-node@10.9.2(@types/node@22.7.5)(typescript@5.6.3)) + pactum: + specifier: ^3.7.1 + version: 3.7.1(debug@2.6.9) + pactum-matchers: + specifier: ^1.1.7 + version: 1.1.7 + path-to-regexp: + specifier: '>=6.3.0' + version: 6.3.0 + prettier: + specifier: ^3.3.3 + version: 3.3.3 + prisma: + specifier: ^5.20.0 + version: 5.20.0 + source-map-support: + specifier: ^0.5.21 + version: 0.5.21 + standard-version: + specifier: ^9.5.0 + version: 9.5.0 + supertest: + specifier: ^6.3.3 + version: 6.3.3 + tar: + specifier: 7.4.3 + version: 7.4.3 + ts-jest: + specifier: ^29.2.5 + version: 29.2.5(@babel/core@7.23.9)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.23.9))(jest@29.7.0(@types/node@22.7.5)(ts-node@10.9.2(@types/node@22.7.5)(typescript@5.6.3)))(typescript@5.6.3) + ts-loader: + specifier: ^9.5.1 + version: 9.5.1(typescript@5.6.3)(webpack@5.94.0) + ts-node: + specifier: ^10.9.2 + version: 10.9.2(@types/node@22.7.5)(typescript@5.6.3) + tsconfig-paths: + specifier: ^4.2.0 + version: 4.2.0 + typescript: + specifier: ^5.6.3 + version: 5.6.3 + +packages: + + '@aashutoshrathi/word-wrap@1.2.6': + resolution: {integrity: sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==} + engines: {node: '>=0.10.0'} + + '@ampproject/remapping@2.2.1': + resolution: {integrity: sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==} + engines: {node: '>=6.0.0'} + + '@angular-devkit/core@13.3.11': + resolution: {integrity: sha512-rfqoLMRYhlz0wzKlHx7FfyIyQq8dKTsmbCoIVU1cEIH0gyTMVY7PbVzwRRcO6xp5waY+0hA+0Brriujpuhkm4w==} + engines: {node: ^12.20.0 || ^14.15.0 || >=16.10.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: '>= 1.13.0'} + peerDependencies: + chokidar: ^3.5.2 + peerDependenciesMeta: + chokidar: + optional: true + + '@angular-devkit/core@17.3.8': + resolution: {integrity: sha512-Q8q0voCGudbdCgJ7lXdnyaxKHbNQBARH68zPQV72WT8NWy+Gw/tys870i6L58NWbBaCJEUcIj/kb6KoakSRu+Q==} + engines: {node: ^18.13.0 || >=20.9.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: '>= 1.13.0'} + peerDependencies: + chokidar: ^3.5.2 + peerDependenciesMeta: + chokidar: + optional: true + + '@angular-devkit/schematics-cli@17.3.8': + resolution: {integrity: sha512-TjmiwWJarX7oqvNiRAroQ5/LeKUatxBOCNEuKXO/PV8e7pn/Hr/BqfFm+UcYrQoFdZplmtNAfqmbqgVziKvCpA==} + engines: {node: ^18.13.0 || >=20.9.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: '>= 1.13.0'} + hasBin: true + + '@angular-devkit/schematics@13.3.11': + resolution: {integrity: sha512-ben+EGXpCrClnIVAAnEQmhQdKmnnqFhMp5BqMxgOslSYBAmCutLA6rBu5vsc8kZcGian1wt+lueF7G1Uk5cGBg==} + engines: {node: ^12.20.0 || ^14.15.0 || >=16.10.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: '>= 1.13.0'} + + '@angular-devkit/schematics@17.3.8': + resolution: {integrity: sha512-QRVEYpIfgkprNHc916JlPuNbLzOgrm9DZalHasnLUz4P6g7pR21olb8YCyM2OTJjombNhya9ZpckcADU5Qyvlg==} + engines: {node: ^18.13.0 || >=20.9.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: '>= 1.13.0'} + + '@apidevtools/json-schema-ref-parser@11.7.2': + resolution: {integrity: sha512-4gY54eEGEstClvEkGnwVkTkrx0sqwemEFG5OSRRn3tD91XH0+Q8XIkYIfo7IwEWPpJZwILb9GUXeShtplRc/eA==} + engines: {node: '>= 16'} + + '@arr/every@1.0.1': + resolution: {integrity: sha512-UQFQ6SgyJ6LX42W8rHCs8KVc0JS0tzVL9ct4XYedJukskYVWTo49tNiMEK9C2HTyarbNiT/RVIRSY82vH+6sTg==} + engines: {node: '>=4'} + + '@babel/code-frame@7.23.5': + resolution: {integrity: sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA==} + engines: {node: '>=6.9.0'} + + '@babel/compat-data@7.23.5': + resolution: {integrity: sha512-uU27kfDRlhfKl+w1U6vp16IuvSLtjAxdArVXPa9BvLkrr7CYIsxH5adpHObeAGY/41+syctUWOZ140a2Rvkgjw==} + engines: {node: '>=6.9.0'} + + '@babel/core@7.23.9': + resolution: {integrity: sha512-5q0175NOjddqpvvzU+kDiSOAk4PfdO6FvwCWoQ6RO7rTzEe8vlo+4HVfcnAREhD4npMs0e9uZypjTwzZPCf/cw==} + engines: {node: '>=6.9.0'} + + '@babel/generator@7.23.6': + resolution: {integrity: sha512-qrSfCYxYQB5owCmGLbl8XRpX1ytXlpueOb0N0UmQwA073KZxejgQTzAmJezxvpwQD9uGtK2shHdi55QT+MbjIw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-compilation-targets@7.23.6': + resolution: {integrity: sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ==} + engines: {node: '>=6.9.0'} + + '@babel/helper-environment-visitor@7.22.20': + resolution: {integrity: sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==} + engines: {node: '>=6.9.0'} + + '@babel/helper-function-name@7.23.0': + resolution: {integrity: sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-hoist-variables@7.22.5': + resolution: {integrity: sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-module-imports@7.22.15': + resolution: {integrity: sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==} + engines: {node: '>=6.9.0'} + + '@babel/helper-module-transforms@7.23.3': + resolution: {integrity: sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/helper-plugin-utils@7.22.5': + resolution: {integrity: sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==} + engines: {node: '>=6.9.0'} + + '@babel/helper-simple-access@7.22.5': + resolution: {integrity: sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==} + engines: {node: '>=6.9.0'} + + '@babel/helper-split-export-declaration@7.22.6': + resolution: {integrity: sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==} + engines: {node: '>=6.9.0'} + + '@babel/helper-string-parser@7.23.4': + resolution: {integrity: sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ==} + engines: {node: '>=6.9.0'} + + '@babel/helper-validator-identifier@7.22.20': + resolution: {integrity: sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==} + engines: {node: '>=6.9.0'} + + '@babel/helper-validator-option@7.23.5': + resolution: {integrity: sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw==} + engines: {node: '>=6.9.0'} + + '@babel/helpers@7.23.9': + resolution: {integrity: sha512-87ICKgU5t5SzOT7sBMfCOZQ2rHjRU+Pcb9BoILMYz600W6DkVRLFBPwQ18gwUVvggqXivaUakpnxWQGbpywbBQ==} + engines: {node: '>=6.9.0'} + + '@babel/highlight@7.23.4': + resolution: {integrity: sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A==} + engines: {node: '>=6.9.0'} + + '@babel/parser@7.23.9': + resolution: {integrity: sha512-9tcKgqKbs3xGJ+NtKF2ndOBBLVwPjl1SHxPQkd36r3Dlirw3xWUeGaTbqr7uGZcTaxkVNwc+03SVP7aCdWrTlA==} + engines: {node: '>=6.0.0'} + hasBin: true + + '@babel/plugin-syntax-async-generators@7.8.4': + resolution: {integrity: sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-bigint@7.8.3': + resolution: {integrity: sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-class-properties@7.12.13': + resolution: {integrity: sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-import-meta@7.10.4': + resolution: {integrity: sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-json-strings@7.8.3': + resolution: {integrity: sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-jsx@7.23.3': + resolution: {integrity: sha512-EB2MELswq55OHUoRZLGg/zC7QWUKfNLpE57m/S2yr1uEneIgsTgrSzXP3NXEsMkVn76OlaVVnzN+ugObuYGwhg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-logical-assignment-operators@7.10.4': + resolution: {integrity: sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-nullish-coalescing-operator@7.8.3': + resolution: {integrity: sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-numeric-separator@7.10.4': + resolution: {integrity: sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-object-rest-spread@7.8.3': + resolution: {integrity: sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-optional-catch-binding@7.8.3': + resolution: {integrity: sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-optional-chaining@7.8.3': + resolution: {integrity: sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-top-level-await@7.14.5': + resolution: {integrity: sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-typescript@7.23.3': + resolution: {integrity: sha512-9EiNjVJOMwCO+43TqoTrgQ8jMwcAd0sWyXi9RPfIsLTj4R2MADDDQXELhffaUx/uJv2AYcxBgPwH6j4TIA4ytQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/template@7.23.9': + resolution: {integrity: sha512-+xrD2BWLpvHKNmX2QbpdpsBaWnRxahMwJjO+KZk2JOElj5nSmKezyS1B4u+QbHMTX69t4ukm6hh9lsYQ7GHCKA==} + engines: {node: '>=6.9.0'} + + '@babel/traverse@7.23.9': + resolution: {integrity: sha512-I/4UJ9vs90OkBtY6iiiTORVMyIhJ4kAVmsKo9KFc8UOxMeUfi2hvtIBsET5u9GizXE6/GFSuKCTNfgCswuEjRg==} + engines: {node: '>=6.9.0'} + + '@babel/types@7.23.9': + resolution: {integrity: sha512-dQjSq/7HaSjRM43FFGnv5keM2HsxpmyV1PfaSVm0nzzjwwTmjOe6J4bC8e3+pTEIgHaHj+1ZlLThRJ2auc/w1Q==} + engines: {node: '>=6.9.0'} + + '@bcoe/v8-coverage@0.2.3': + resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==} + + '@chax-at/transactional-prisma-testing@1.2.0': + resolution: {integrity: sha512-4GIEeHUlqcpggfz4t+t3tQb44uc67YWIzXnkB0m0Cy3jPOex/5fRhezebtqIxJzS2k4XIGxeJDij/Ajp0Mwy/Q==} + engines: {node: '>= 14'} + peerDependencies: + '@prisma/client': ^4.7.0 || 5 + + '@colors/colors@1.5.0': + resolution: {integrity: sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==} + engines: {node: '>=0.1.90'} + + '@commitlint/cli@19.5.0': + resolution: {integrity: sha512-gaGqSliGwB86MDmAAKAtV9SV1SHdmN8pnGq4EJU4+hLisQ7IFfx4jvU4s+pk6tl0+9bv6yT+CaZkufOinkSJIQ==} + engines: {node: '>=v18'} + hasBin: true + + '@commitlint/config-angular-type-enum@19.5.0': + resolution: {integrity: sha512-4/6xrkElCSBb7+6oZXlBJ/zytkxXgmTg5gk1Voj3GAWShTivtWrPtDYvHmF858WhA695YKgxMHEPNN74UFkK8w==} + engines: {node: '>=v18'} + + '@commitlint/config-angular@19.5.0': + resolution: {integrity: sha512-EPQBuSK4uVNUj2HhWSJjmfHqgPpST//h07oIzcPK2FauFGGGX0Vt+kzNxnQRDEEUvSAHDRNTDWNaFv66Hlle6A==} + engines: {node: '>=v18'} + + '@commitlint/config-validator@19.5.0': + resolution: {integrity: sha512-CHtj92H5rdhKt17RmgALhfQt95VayrUo2tSqY9g2w+laAXyk7K/Ef6uPm9tn5qSIwSmrLjKaXK9eiNuxmQrDBw==} + engines: {node: '>=v18'} + + '@commitlint/ensure@19.5.0': + resolution: {integrity: sha512-Kv0pYZeMrdg48bHFEU5KKcccRfKmISSm9MvgIgkpI6m+ohFTB55qZlBW6eYqh/XDfRuIO0x4zSmvBjmOwWTwkg==} + engines: {node: '>=v18'} + + '@commitlint/execute-rule@19.5.0': + resolution: {integrity: sha512-aqyGgytXhl2ejlk+/rfgtwpPexYyri4t8/n4ku6rRJoRhGZpLFMqrZ+YaubeGysCP6oz4mMA34YSTaSOKEeNrg==} + engines: {node: '>=v18'} + + '@commitlint/format@19.5.0': + resolution: {integrity: sha512-yNy088miE52stCI3dhG/vvxFo9e4jFkU1Mj3xECfzp/bIS/JUay4491huAlVcffOoMK1cd296q0W92NlER6r3A==} + engines: {node: '>=v18'} + + '@commitlint/is-ignored@19.5.0': + resolution: {integrity: sha512-0XQ7Llsf9iL/ANtwyZ6G0NGp5Y3EQ8eDQSxv/SRcfJ0awlBY4tHFAvwWbw66FVUaWICH7iE5en+FD9TQsokZ5w==} + engines: {node: '>=v18'} + + '@commitlint/lint@19.5.0': + resolution: {integrity: sha512-cAAQwJcRtiBxQWO0eprrAbOurtJz8U6MgYqLz+p9kLElirzSCc0vGMcyCaA1O7AqBuxo11l1XsY3FhOFowLAAg==} + engines: {node: '>=v18'} + + '@commitlint/load@19.5.0': + resolution: {integrity: sha512-INOUhkL/qaKqwcTUvCE8iIUf5XHsEPCLY9looJ/ipzi7jtGhgmtH7OOFiNvwYgH7mA8osUWOUDV8t4E2HAi4xA==} + engines: {node: '>=v18'} + + '@commitlint/message@19.5.0': + resolution: {integrity: sha512-R7AM4YnbxN1Joj1tMfCyBryOC5aNJBdxadTZkuqtWi3Xj0kMdutq16XQwuoGbIzL2Pk62TALV1fZDCv36+JhTQ==} + engines: {node: '>=v18'} + + '@commitlint/parse@19.5.0': + resolution: {integrity: sha512-cZ/IxfAlfWYhAQV0TwcbdR1Oc0/r0Ik1GEessDJ3Lbuma/MRO8FRQX76eurcXtmhJC//rj52ZSZuXUg0oIX0Fw==} + engines: {node: '>=v18'} + + '@commitlint/read@19.5.0': + resolution: {integrity: sha512-TjS3HLPsLsxFPQj6jou8/CZFAmOP2y+6V4PGYt3ihbQKTY1Jnv0QG28WRKl/d1ha6zLODPZqsxLEov52dhR9BQ==} + engines: {node: '>=v18'} + + '@commitlint/resolve-extends@19.5.0': + resolution: {integrity: sha512-CU/GscZhCUsJwcKTJS9Ndh3AKGZTNFIOoQB2n8CmFnizE0VnEuJoum+COW+C1lNABEeqk6ssfc1Kkalm4bDklA==} + engines: {node: '>=v18'} + + '@commitlint/rules@19.5.0': + resolution: {integrity: sha512-hDW5TPyf/h1/EufSHEKSp6Hs+YVsDMHazfJ2azIk9tHPXS6UqSz1dIRs1gpqS3eMXgtkT7JH6TW4IShdqOwhAw==} + engines: {node: '>=v18'} + + '@commitlint/to-lines@19.5.0': + resolution: {integrity: sha512-R772oj3NHPkodOSRZ9bBVNq224DOxQtNef5Pl8l2M8ZnkkzQfeSTr4uxawV2Sd3ui05dUVzvLNnzenDBO1KBeQ==} + engines: {node: '>=v18'} + + '@commitlint/top-level@19.5.0': + resolution: {integrity: sha512-IP1YLmGAk0yWrImPRRc578I3dDUI5A2UBJx9FbSOjxe9sTlzFiwVJ+zeMLgAtHMtGZsC8LUnzmW1qRemkFU4ng==} + engines: {node: '>=v18'} + + '@commitlint/types@19.5.0': + resolution: {integrity: sha512-DSHae2obMSMkAtTBSOulg5X7/z+rGLxcXQIkg3OmWvY6wifojge5uVMydfhUvs7yQj+V7jNmRZ2Xzl8GJyqRgg==} + engines: {node: '>=v18'} + + '@cspotcode/source-map-support@0.8.1': + resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==} + engines: {node: '>=12'} + + '@eslint-community/eslint-utils@4.4.0': + resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 + + '@eslint-community/regexpp@4.10.0': + resolution: {integrity: sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==} + engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} + + '@eslint-community/regexpp@4.11.1': + resolution: {integrity: sha512-m4DVN9ZqskZoLU5GlWZadwDnYo3vAEydiUayB9widCl9ffWx2IvPnp6n3on5rJmziJSw9Bv+Z3ChDVdMwXCY8Q==} + engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} + + '@eslint/config-array@0.18.0': + resolution: {integrity: sha512-fTxvnS1sRMu3+JjXwJG0j/i4RT9u4qJ+lqS/yCGap4lH4zZGzQ7tu+xZqQmcMZq5OBZDL4QRxQzRjkWcGt8IVw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/core@0.6.0': + resolution: {integrity: sha512-8I2Q8ykA4J0x0o7cg67FPVnehcqWTBehu/lmY+bolPFHGjh49YzGBMXTvpqVgEbBdvNCSxj6iFgiIyHzf03lzg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/eslintrc@3.1.0': + resolution: {integrity: sha512-4Bfj15dVJdoy3RfZmmo86RK1Fwzn6SstsvK9JS+BaVKqC6QQQQyXekNaC+g+LKNgkQ+2VhGAzm6hO40AhMR3zQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/js@9.12.0': + resolution: {integrity: sha512-eohesHH8WFRUprDNyEREgqP6beG6htMeUYeCpkEgBCieCMme5r9zFWjzAJp//9S+Kub4rqE+jXe9Cp1a7IYIIA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/object-schema@2.1.4': + resolution: {integrity: sha512-BsWiH1yFGjXXS2yvrf5LyuoSIIbPrGUWob917o+BTKuZ7qJdxX8aJLRxs1fS9n6r7vESrq1OUqb68dANcFXuQQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/plugin-kit@0.2.0': + resolution: {integrity: sha512-vH9PiIMMwvhCx31Af3HiGzsVNULDbyVkHXwlemn/B0TFj/00ho3y55efXrUZTfQipxoHC5u4xq6zblww1zm1Ig==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@exodus/schemasafe@1.3.0': + resolution: {integrity: sha512-5Aap/GaRupgNx/feGBwLLTVv8OQFfv3pq2lPRzPg9R+IOBnDgghTGW7l7EuVXOvg5cc/xSAlRW8rBrjIC3Nvqw==} + + '@fastify/accept-negotiator@1.1.0': + resolution: {integrity: sha512-OIHZrb2ImZ7XG85HXOONLcJWGosv7sIvM2ifAPQVhg9Lv7qdmMBNVaai4QTdyuaqbKM5eO6sLSQOYI7wEQeCJQ==} + engines: {node: '>=14'} + + '@fastify/ajv-compiler@3.5.0': + resolution: {integrity: sha512-ebbEtlI7dxXF5ziNdr05mOY8NnDiPB1XvAlLHctRt/Rc+C3LCOVW5imUVX+mhvUhnNzmPBHewUkOFgGlCxgdAA==} + + '@fastify/busboy@2.1.1': + resolution: {integrity: sha512-vBZP4NlzfOlerQTnba4aqZoMhE/a9HY7HRqoOPaETQcSQuWEIyZMHGfVu6w9wGtGK5fED5qRs2DteVCjOH60sA==} + engines: {node: '>=14'} + + '@fastify/compress@7.0.3': + resolution: {integrity: sha512-xa9fo5/DgK1s0bkS6xrYgNn8HmofO5tJvbCDk8QuXshSgLd2cFZANv1ox/Qv7zswS7JroHwTlCVv/XGTVO98tg==} + + '@fastify/cookie@9.4.0': + resolution: {integrity: sha512-Th+pt3kEkh4MQD/Q2q1bMuJIB5NX/D5SwSpOKu3G/tjoGbwfpurIMJsWSPS0SJJ4eyjtmQ8OipDQspf8RbUOlg==} + + '@fastify/cors@9.0.1': + resolution: {integrity: sha512-YY9Ho3ovI+QHIL2hW+9X4XqQjXLjJqsU+sMV/xFsxZkE8p3GNnYVFpoOxF7SsP5ZL76gwvbo3V9L+FIekBGU4Q==} + + '@fastify/deepmerge@1.3.0': + resolution: {integrity: sha512-J8TOSBq3SoZbDhM9+R/u77hP93gz/rajSA+K2kGyijPpORPWUXHUpTaleoj+92As0S9uPRP7Oi8IqMf0u+ro6A==} + + '@fastify/error@3.4.1': + resolution: {integrity: sha512-wWSvph+29GR783IhmvdwWnN4bUxTD01Vm5Xad4i7i1VuAOItLvbPAb69sb0IQ2N57yprvhNIwAP5B6xfKTmjmQ==} + + '@fastify/fast-json-stringify-compiler@4.3.0': + resolution: {integrity: sha512-aZAXGYo6m22Fk1zZzEUKBvut/CIIQe/BapEORnxiD5Qr0kPHqqI69NtEMCme74h+at72sPhbkb4ZrLd1W3KRLA==} + + '@fastify/formbody@7.4.0': + resolution: {integrity: sha512-H3C6h1GN56/SMrZS8N2vCT2cZr7mIHzBHzOBa5OPpjfB/D6FzP9mMpE02ZzrFX0ANeh0BAJdoXKOF2e7IbV+Og==} + + '@fastify/helmet@11.1.1': + resolution: {integrity: sha512-pjJxjk6SLEimITWadtYIXt6wBMfFC1I6OQyH/jYVCqSAn36sgAIFjeNiibHtifjCd+e25442pObis3Rjtame6A==} + + '@fastify/merge-json-schemas@0.1.1': + resolution: {integrity: sha512-fERDVz7topgNjtXsJTTW1JKLy0rhuLRcquYqNR9rF7OcVpCa2OVW49ZPDIhaRRCaUuvVxI+N416xUoF76HNSXA==} + + '@fastify/middie@8.3.0': + resolution: {integrity: sha512-h+zBxCzMlkEkh4fM7pZaSGzqS7P9M0Z6rXnWPdUEPfe7x1BCj++wEk/pQ5jpyYY4pF8AknFqb77n7uwh8HdxEA==} + + '@fastify/multipart@8.3.0': + resolution: {integrity: sha512-A8h80TTyqUzaMVH0Cr9Qcm6RxSkVqmhK/MVBYHYeRRSUbUYv08WecjWKSlG2aSnD4aGI841pVxAjC+G1GafUeQ==} + + '@fastify/send@2.1.0': + resolution: {integrity: sha512-yNYiY6sDkexoJR0D8IDy3aRP3+L4wdqCpvx5WP+VtEU58sn7USmKynBzDQex5X42Zzvw2gNzzYgP90UfWShLFA==} + + '@fastify/static@7.0.4': + resolution: {integrity: sha512-p2uKtaf8BMOZWLs6wu+Ihg7bWNBdjNgCwDza4MJtTqg+5ovKmcbgbR9Xs5/smZ1YISfzKOCNYmZV8LaCj+eJ1Q==} + + '@golevelup/nestjs-modules@0.6.1': + resolution: {integrity: sha512-E0STg8In8fhIivnGDJAA70+XLPHzK5bMTkCnif9FbZ8waTYDQ3T/QQL0h73k+CUFeznn1hmuEW14sNaE+8cd7w==} + peerDependencies: + '@nestjs/common': ^9.x + rxjs: ^7.x + + '@gulp-sourcemaps/map-sources@1.0.0': + resolution: {integrity: sha512-o/EatdaGt8+x2qpb0vFLC/2Gug/xYPRXb6a+ET1wGYKozKN3krDWC/zZFZAtrzxJHuDL12mwdfEFKcKMNvc55A==} + engines: {node: '>= 0.10'} + + '@humanfs/core@0.19.0': + resolution: {integrity: sha512-2cbWIHbZVEweE853g8jymffCA+NCMiuqeECeBBLm8dg2oFdjuGJhgN4UAbI+6v0CKbbhvtXA4qV8YR5Ji86nmw==} + engines: {node: '>=18.18.0'} + + '@humanfs/node@0.16.5': + resolution: {integrity: sha512-KSPA4umqSG4LHYRodq31VDwKAvaTF4xmVlzM8Aeh4PlU1JQ3IG0wiA8C25d3RQ9nJyM3mBHyI53K06VVL/oFFg==} + engines: {node: '>=18.18.0'} + + '@humanwhocodes/module-importer@1.0.1': + resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} + engines: {node: '>=12.22'} + + '@humanwhocodes/retry@0.3.1': + resolution: {integrity: sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==} + engines: {node: '>=18.18'} + + '@hutson/parse-repository-url@3.0.2': + resolution: {integrity: sha512-H9XAx3hc0BQHY6l+IFSWHDySypcXsvsuLhgYLUGywmJ5pswRVQJUHpOsobnLYp2ZUaUlKiKDrgWWhosOwAEM8Q==} + engines: {node: '>=6.9.0'} + + '@isaacs/cliui@8.0.2': + resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} + engines: {node: '>=12'} + + '@isaacs/fs-minipass@4.0.1': + resolution: {integrity: sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==} + engines: {node: '>=18.0.0'} + + '@istanbuljs/load-nyc-config@1.1.0': + resolution: {integrity: sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==} + engines: {node: '>=8'} + + '@istanbuljs/schema@0.1.3': + resolution: {integrity: sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==} + engines: {node: '>=8'} + + '@jest/console@29.7.0': + resolution: {integrity: sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + '@jest/core@29.7.0': + resolution: {integrity: sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + + '@jest/environment@29.7.0': + resolution: {integrity: sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + '@jest/expect-utils@29.7.0': + resolution: {integrity: sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + '@jest/expect@29.7.0': + resolution: {integrity: sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + '@jest/fake-timers@29.7.0': + resolution: {integrity: sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + '@jest/globals@29.7.0': + resolution: {integrity: sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + '@jest/reporters@29.7.0': + resolution: {integrity: sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + + '@jest/schemas@29.6.3': + resolution: {integrity: sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + '@jest/source-map@29.6.3': + resolution: {integrity: sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + '@jest/test-result@29.7.0': + resolution: {integrity: sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + '@jest/test-sequencer@29.7.0': + resolution: {integrity: sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + '@jest/transform@29.7.0': + resolution: {integrity: sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + '@jest/types@29.6.3': + resolution: {integrity: sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + '@jridgewell/gen-mapping@0.3.3': + resolution: {integrity: sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==} + engines: {node: '>=6.0.0'} + + '@jridgewell/resolve-uri@3.1.1': + resolution: {integrity: sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==} + engines: {node: '>=6.0.0'} + + '@jridgewell/set-array@1.1.2': + resolution: {integrity: sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==} + engines: {node: '>=6.0.0'} + + '@jridgewell/source-map@0.3.5': + resolution: {integrity: sha512-UTYAUj/wviwdsMfzoSJspJxbkH5o1snzwX0//0ENX1u/55kkZZkcTZP6u9bwKGkv+dkk9at4m1Cpt0uY80kcpQ==} + + '@jridgewell/sourcemap-codec@1.4.15': + resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} + + '@jridgewell/trace-mapping@0.3.22': + resolution: {integrity: sha512-Wf963MzWtA2sjrNt+g18IAln9lKnlRp+K2eH4jjIoF1wYeq3aMREpG09xhlhdzS0EjwU7qmUJYangWa+151vZw==} + + '@jridgewell/trace-mapping@0.3.9': + resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==} + + '@jsdevtools/ono@7.1.3': + resolution: {integrity: sha512-4JQNk+3mVzK3xh2rqd6RB4J46qUR19azEHBneZyTZM+c456qOrbbM/5xcR8huNCCcbVt7+UmizG6GuUvPvKUYg==} + + '@ljharb/through@2.3.13': + resolution: {integrity: sha512-/gKJun8NNiWGZJkGzI/Ragc53cOdcLNdzjLaIa+GEjguQs0ulsurx8WN0jijdK9yPqDvziX995sMRLyLt1uZMQ==} + engines: {node: '>= 0.4'} + + '@lukeed/csprng@1.1.0': + resolution: {integrity: sha512-Z7C/xXCiGWsg0KuKsHTKJxbWhpI3Vs5GwLfOean7MGyVFGqdRgBbAjOCh6u4bbjPc/8MJ2pZmK/0DLdCbivLDA==} + engines: {node: '>=8'} + + '@lukeed/ms@2.0.2': + resolution: {integrity: sha512-9I2Zn6+NJLfaGoz9jN3lpwDgAYvfGeNYdbAIjJOqzs4Tpc+VU3Jqq4IofSUBKajiDS8k9fZIg18/z13mpk1bsA==} + engines: {node: '>=8'} + + '@mapbox/node-pre-gyp@1.0.11': + resolution: {integrity: sha512-Yhlar6v9WQgUp/He7BdgzOz8lqMQ8sU+jkCq7Wx8Myc5YFJLbEe7lgui/V7G1qB1DJykHSGwreceSaD60Y0PUQ==} + hasBin: true + + '@microsoft/tsdoc@0.15.0': + resolution: {integrity: sha512-HZpPoABogPvjeJOdzCOSJsXeL/SMCBgBZMVC3X3d7YYp2gf31MfxhUoYUNwf1ERPJOnQc0wkFn9trqI6ZEdZuA==} + + '@nestjs-cls/transactional-adapter-prisma@1.2.4': + resolution: {integrity: sha512-W/Ej+T3QG81//d4YuXsuHnV9WFvWTQBQk1BSiowyq7d812lyr3zk8ZMwmAhB7JAY80cJMeBY6i3TBlP0QVIczQ==} + engines: {node: '>=18'} + peerDependencies: + '@nestjs-cls/transactional': ^2.4.2 + '@prisma/client': '> 4 < 6' + nestjs-cls: ^4.4.1 + prisma: '> 4 < 6' + + '@nestjs-cls/transactional@2.4.2': + resolution: {integrity: sha512-bQZ4Xo5BOPnmKcBk/Qsh/VX8kHr+fKTfJ6Fcxu/RGmxzSwjRVgShNu0E57V8CZkZJ6YuIKJoDQHAoIbeRIffbQ==} + engines: {node: '>=16'} + peerDependencies: + '@nestjs/common': '> 7.0.0 < 11' + '@nestjs/core': '> 7.0.0 < 11' + nestjs-cls: ^4.4.1 + reflect-metadata: '*' + rxjs: '>= 7' + + '@nestjs/cache-manager@2.2.2': + resolution: {integrity: sha512-+n7rpU1QABeW2WV17Dl1vZCG3vWjJU1MaamWgZvbGxYE9EeCM0lVLfw3z7acgDTNwOy+K68xuQPoIMxD0bhjlA==} + peerDependencies: + '@nestjs/common': ^9.0.0 || ^10.0.0 + '@nestjs/core': ^9.0.0 || ^10.0.0 + cache-manager: <=5 + rxjs: ^7.0.0 + + '@nestjs/cli@10.4.5': + resolution: {integrity: sha512-FP7Rh13u8aJbHe+zZ7hM0CC4785g9Pw4lz4r2TTgRtf0zTxSWMkJaPEwyjX8SK9oWK2GsYxl+fKpwVZNbmnj9A==} + engines: {node: '>= 16.14'} + hasBin: true + peerDependencies: + '@swc/cli': ^0.1.62 || ^0.3.0 || ^0.4.0 + '@swc/core': ^1.3.62 + peerDependenciesMeta: + '@swc/cli': + optional: true + '@swc/core': + optional: true + + '@nestjs/common@10.4.4': + resolution: {integrity: sha512-0j2/zqRw9nvHV1GKTktER8B/hIC/Z8CYFjN/ZqUuvwayCH+jZZBhCR2oRyuvLTXdnlSmtCAg2xvQ0ULqQvzqhA==} + peerDependencies: + class-transformer: '*' + class-validator: '*' + reflect-metadata: ^0.1.12 || ^0.2.0 + rxjs: ^7.1.0 + peerDependenciesMeta: + class-transformer: + optional: true + class-validator: + optional: true + + '@nestjs/common@9.4.0': + resolution: {integrity: sha512-RUcVAQsEF4WPrmzFXEOUfZnPwrLTe1UVlzXTlSyfqfqbdWDPKDGlIPVelBLfc5/+RRUQ0I5iE4+CQvpCmkqldw==} + peerDependencies: + cache-manager: <=5 + class-transformer: '*' + class-validator: '*' + reflect-metadata: ^0.1.12 + rxjs: ^7.1.0 + peerDependenciesMeta: + cache-manager: + optional: true + class-transformer: + optional: true + class-validator: + optional: true + + '@nestjs/config@3.2.3': + resolution: {integrity: sha512-p6yv/CvoBewJ72mBq4NXgOAi2rSQNWx3a+IMJLVKS2uiwFCOQQuiIatGwq6MRjXV3Jr+B41iUO8FIf4xBrZ4/w==} + peerDependencies: + '@nestjs/common': ^8.0.0 || ^9.0.0 || ^10.0.0 + rxjs: ^7.1.0 + + '@nestjs/core@10.4.4': + resolution: {integrity: sha512-y9tjmAzU6LTh1cC/lWrRsCcOd80khSR0qAHAqwY2svbW+AhsR/XCzgpZrAAKJrm/dDfjLCZKyxJSayeirGcW5Q==} + peerDependencies: + '@nestjs/common': ^10.0.0 + '@nestjs/microservices': ^10.0.0 + '@nestjs/platform-express': ^10.0.0 + '@nestjs/websockets': ^10.0.0 + reflect-metadata: ^0.1.12 || ^0.2.0 + rxjs: ^7.1.0 + peerDependenciesMeta: + '@nestjs/microservices': + optional: true + '@nestjs/platform-express': + optional: true + '@nestjs/websockets': + optional: true + + '@nestjs/event-emitter@2.0.4': + resolution: {integrity: sha512-quMiw8yOwoSul0pp3mOonGz8EyXWHSBTqBy8B0TbYYgpnG1Ix2wGUnuTksLWaaBiiOTDhciaZ41Y5fJZsSJE1Q==} + peerDependencies: + '@nestjs/common': ^8.0.0 || ^9.0.0 || ^10.0.0 + '@nestjs/core': ^8.0.0 || ^9.0.0 || ^10.0.0 + + '@nestjs/jwt@10.2.0': + resolution: {integrity: sha512-x8cG90SURkEiLOehNaN2aRlotxT0KZESUliOPKKnjWiyJOcWurkF3w345WOX0P4MgFzUjGoZ1Sy0aZnxeihT0g==} + peerDependencies: + '@nestjs/common': ^8.0.0 || ^9.0.0 || ^10.0.0 + + '@nestjs/mapped-types@2.0.5': + resolution: {integrity: sha512-bSJv4pd6EY99NX9CjBIyn4TVDoSit82DUZlL4I3bqNfy5Gt+gXTa86i3I/i0iIV9P4hntcGM5GyO+FhZAhxtyg==} + peerDependencies: + '@nestjs/common': ^8.0.0 || ^9.0.0 || ^10.0.0 + class-transformer: ^0.4.0 || ^0.5.0 + class-validator: ^0.13.0 || ^0.14.0 + reflect-metadata: ^0.1.12 || ^0.2.0 + peerDependenciesMeta: + class-transformer: + optional: true + class-validator: + optional: true + + '@nestjs/passport@10.0.3': + resolution: {integrity: sha512-znJ9Y4S8ZDVY+j4doWAJ8EuuVO7SkQN3yOBmzxbGaXbvcSwFDAdGJ+OMCg52NdzIO4tQoN4pYKx8W6M0ArfFRQ==} + peerDependencies: + '@nestjs/common': ^8.0.0 || ^9.0.0 || ^10.0.0 + passport: ^0.4.0 || ^0.5.0 || ^0.6.0 || ^0.7.0 + + '@nestjs/platform-fastify@10.3.4': + resolution: {integrity: sha512-rYoAdJ1ybBXPwO+KutWJ4siaqGDdMzwXS4ggJ5soQgD4maN2p1rvKE31MzERd1MqYXWprFIESFHuxkiHMZV6kg==} + peerDependencies: + '@fastify/static': ^6.0.0 || ^7.0.0 + '@fastify/view': ^7.0.0 || ^8.0.0 + '@nestjs/common': ^10.0.0 + '@nestjs/core': ^10.0.0 + peerDependenciesMeta: + '@fastify/static': + optional: true + '@fastify/view': + optional: true + + '@nestjs/schematics@10.1.4': + resolution: {integrity: sha512-QpY8ez9cTvXXPr3/KBrtSgXQHMSV6BkOUYy2c2TTe6cBqriEdGnCYqGl8cnfrQl3632q3lveQPaZ/c127dHsEw==} + peerDependencies: + typescript: '>=4.8.2' + + '@nestjs/swagger@7.4.2': + resolution: {integrity: sha512-Mu6TEn1M/owIvAx2B4DUQObQXqo2028R2s9rSZ/hJEgBK95+doTwS0DjmVA2wTeZTyVtXOoN7CsoM5pONBzvKQ==} + 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 + class-transformer: '*' + class-validator: '*' + reflect-metadata: ^0.1.12 || ^0.2.0 + peerDependenciesMeta: + '@fastify/static': + optional: true + class-transformer: + optional: true + class-validator: + optional: true + + '@nestjs/testing@10.4.4': + resolution: {integrity: sha512-qRGFj51A5RM7JqA8pcyEwSLA3Y0dle/PAZ8oxP0suimoCusRY3Tk7wYqutZdCNj1ATb678SDaUZDHk2pwSv9/g==} + peerDependencies: + '@nestjs/common': ^10.0.0 + '@nestjs/core': ^10.0.0 + '@nestjs/microservices': ^10.0.0 + '@nestjs/platform-express': ^10.0.0 + peerDependenciesMeta: + '@nestjs/microservices': + optional: true + '@nestjs/platform-express': + optional: true + + '@nestjs/testing@9.4.0': + resolution: {integrity: sha512-xZWp363P4otcebg++gSjUcdCfTK0RorORzyFq3aLaSAQOlq8kxfFDRIKzEATR4aOUfqTMMsAA8lhnMJWf35N6A==} + peerDependencies: + '@nestjs/common': ^9.0.0 + '@nestjs/core': ^9.0.0 + '@nestjs/microservices': ^9.0.0 + '@nestjs/platform-express': ^9.0.0 + peerDependenciesMeta: + '@nestjs/microservices': + optional: true + '@nestjs/platform-express': + optional: true + + '@nodelib/fs.scandir@2.1.5': + resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} + engines: {node: '>= 8'} + + '@nodelib/fs.stat@2.0.5': + resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} + engines: {node: '>= 8'} + + '@nodelib/fs.walk@1.2.8': + resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} + engines: {node: '>= 8'} + + '@nodeteam/nestjs-prisma-pagination@1.0.6': + resolution: {integrity: sha512-ZTTXIlbnphmtBt4xFlFfV7an5e2EvmC/P4nj7s0nbSgq8bYovjMAbGxlmBh/shxfVaQeYCl78SoSnYWOjIQMCA==} + + '@nuxtjs/opencollective@0.3.2': + resolution: {integrity: sha512-um0xL3fO7Mf4fDxcqx9KryrB7zgRM5JSlvGN5AGkP6JLM5XEKyjeAiPbNxdXVXQ16isuAhYpvP88NgL2BGd6aA==} + engines: {node: '>=8.0.0', npm: '>=5.0.0'} + hasBin: true + + '@open-draft/deferred-promise@2.2.0': + resolution: {integrity: sha512-CecwLWx3rhxVQF6V4bAgPS5t+So2sTbPgAzafKkVizyi7tlwpcFpdFqq+wqF2OwNBmqFuu6tOyouTuxgpMfzmA==} + + '@pkgjs/parseargs@0.11.0': + resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} + engines: {node: '>=14'} + + '@pkgr/core@0.1.1': + resolution: {integrity: sha512-cq8o4cWH0ibXh9VGi5P20Tu9XF/0fFXl9EUinr9QfTM7a7p0oTA4iJRCQWppXR1Pg8dSM0UCItCkPwsk9qWWYA==} + engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} + + '@polka/url@0.5.0': + resolution: {integrity: sha512-oZLYFEAzUKyi3SKnXvj32ZCEGH6RDnao7COuCVhDydMS9NrCSVXhM79VaKyP5+Zc33m0QXEd2DN3UkU7OsHcfw==} + + '@pond918/prisma-generator-nestjs-dto@1.17.513': + resolution: {integrity: sha512-wq/GSVeVuD8kSm1Q6mC2T1MjNkyhn4wtD+N62Zp4XwV4hbxVNXUgLQsBn1lex8Yhd9DqHlVAawyTwKhLt6xBqg==} + engines: {node: '>=14'} + hasBin: true + + '@prisma/client@5.20.0': + resolution: {integrity: sha512-CLv55ZuMuUawMsxoqxGtLT3bEZoa2W8L3Qnp6rDIFWy+ZBrUcOFKdoeGPSnbBqxc3SkdxJrF+D1veN/WNynZYA==} + engines: {node: '>=16.13'} + peerDependencies: + prisma: '*' + peerDependenciesMeta: + prisma: + optional: true + + '@prisma/debug@4.16.2': + resolution: {integrity: sha512-7L7WbG0qNNZYgLpsVB8rCHCXEyHFyIycRlRDNwkVfjQmACC2OW6AWCYCbfdjQhkF/t7+S3njj8wAWAocSs+Brw==} + + '@prisma/debug@5.20.0': + resolution: {integrity: sha512-oCx79MJ4HSujokA8S1g0xgZUGybD4SyIOydoHMngFYiwEwYDQ5tBQkK5XoEHuwOYDKUOKRn/J0MEymckc4IgsQ==} + + '@prisma/engines-version@5.20.0-12.06fc58a368dc7be9fbbbe894adf8d445d208c284': + resolution: {integrity: sha512-Lg8AS5lpi0auZe2Mn4gjuCg081UZf88k3cn0RCwHgR+6cyHHpttPZBElJTHf83ZGsRNAmVCZCfUGA57WB4u4JA==} + + '@prisma/engines@5.20.0': + resolution: {integrity: sha512-DtqkP+hcZvPEbj8t8dK5df2b7d3B8GNauKqaddRRqQBBlgkbdhJkxhoJTrOowlS3vaRt2iMCkU0+CSNn0KhqAQ==} + + '@prisma/fetch-engine@5.20.0': + resolution: {integrity: sha512-JVcaPXC940wOGpCOwuqQRTz6I9SaBK0c1BAyC1pcz9xBi+dzFgUu3G/p9GV1FhFs9OKpfSpIhQfUJE9y00zhqw==} + + '@prisma/generator-helper@4.16.2': + resolution: {integrity: sha512-bMOH7y73Ui7gpQrioFeavMQA+Tf8ksaVf8Nhs9rQNzuSg8SSV6E9baczob0L5KGZTSgYoqnrRxuo03kVJYrnIg==} + + '@prisma/get-platform@5.20.0': + resolution: {integrity: sha512-8/+CehTZZNzJlvuryRgc77hZCWrUDYd/PmlZ7p2yNXtmf2Una4BWnTbak3us6WVdqoz5wmptk6IhsXdG2v5fmA==} + + '@schematics/angular@13.3.11': + resolution: {integrity: sha512-imKBnKYEse0SBVELZO/753nkpt3eEgpjrYkB+AFWF9YfO/4RGnYXDHoH8CFkzxPH9QQCgNrmsVFNiYGS+P/S1A==} + engines: {node: ^12.20.0 || ^14.15.0 || >=16.10.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: '>= 1.13.0'} + + '@sinclair/typebox@0.27.8': + resolution: {integrity: sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==} + + '@sinonjs/commons@3.0.1': + resolution: {integrity: sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==} + + '@sinonjs/fake-timers@10.3.0': + resolution: {integrity: sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==} + + '@tsconfig/node10@1.0.9': + resolution: {integrity: sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==} + + '@tsconfig/node12@1.0.11': + resolution: {integrity: sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==} + + '@tsconfig/node14@1.0.3': + resolution: {integrity: sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==} + + '@tsconfig/node16@1.0.4': + resolution: {integrity: sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==} + + '@types/babel__core@7.20.5': + resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==} + + '@types/babel__generator@7.6.8': + resolution: {integrity: sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==} + + '@types/babel__template@7.4.4': + resolution: {integrity: sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==} + + '@types/babel__traverse@7.20.5': + resolution: {integrity: sha512-WXCyOcRtH37HAUkpXhUduaxdm82b4GSlyTqajXviN4EfiuPgNYR109xMCKvpl6zPIpua0DGlMEDCq+g8EdoheQ==} + + '@types/bcrypt@5.0.2': + resolution: {integrity: sha512-6atioO8Y75fNcbmj0G7UjI9lXN2pQ/IGJ2FWT4a/btd0Lk9lQalHLKhkgKVZ3r+spnmWUKfbMi1GEe9wyHQfNQ==} + + '@types/body-parser@1.19.5': + resolution: {integrity: sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==} + + '@types/connect@3.4.38': + resolution: {integrity: sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==} + + '@types/conventional-commits-parser@5.0.0': + resolution: {integrity: sha512-loB369iXNmAZglwWATL+WRe+CRMmmBPtpolYzIebFaX4YA3x+BEfLqhUAV9WanycKI3TG1IMr5bMJDajDKLlUQ==} + + '@types/cookiejar@2.1.5': + resolution: {integrity: sha512-he+DHOWReW0nghN24E1WUqM0efK4kI9oTqDm6XmK8ZPe2djZ90BSNdGnIyCLzCPw7/pogPlGbzI2wHGGmi4O/Q==} + + '@types/cross-spawn@6.0.2': + resolution: {integrity: sha512-KuwNhp3eza+Rhu8IFI5HUXRP0LIhqH5cAjubUvGXXthh4YYBuP2ntwEX+Cz8GJoZUHlKo247wPWOfA9LYEq4cw==} + + '@types/debug@4.1.8': + resolution: {integrity: sha512-/vPO1EPOs306Cvhwv7KfVfYvOJqA/S/AXjaHQiJboCZzcNDb+TIJFN9/2C9DZ//ijSKWioNyUxD792QmDJ+HKQ==} + + '@types/dot@1.1.7': + resolution: {integrity: sha512-RhMcnI18Y+401Nceh2pW5gTGgsdfZdvg9g0P/5HIBJ0jmZEv5KlkYvfQiHhw4/Vnb8NdePi/4UCs92ITExLxuQ==} + + '@types/estree@1.0.6': + resolution: {integrity: sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==} + + '@types/express-serve-static-core@4.17.43': + resolution: {integrity: sha512-oaYtiBirUOPQGSWNGPWnzyAFJ0BP3cwvN4oWZQY+zUBwpVIGsKUkpBpSztp74drYcjavs7SKFZ4DX1V2QeN8rg==} + + '@types/express@4.17.17': + resolution: {integrity: sha512-Q4FmmuLGBG58btUnfS1c1r/NQdlp3DMfGDGig8WhfpA2YRUtEkxAjkZb0yvplJGYdF1fsQ81iMDcH24sSCNC/Q==} + + '@types/graceful-fs@4.1.9': + resolution: {integrity: sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==} + + '@types/http-errors@2.0.4': + resolution: {integrity: sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA==} + + '@types/istanbul-lib-coverage@2.0.6': + resolution: {integrity: sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==} + + '@types/istanbul-lib-report@3.0.3': + resolution: {integrity: sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==} + + '@types/istanbul-reports@3.0.4': + resolution: {integrity: sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==} + + '@types/jest@29.5.13': + resolution: {integrity: sha512-wd+MVEZCHt23V0/L642O5APvspWply/rGY5BcW4SUETo2UzPU3Z26qr8jC2qxpimI2jjx9h7+2cj2FwIr01bXg==} + + '@types/json-schema@7.0.15': + resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} + + '@types/jsonwebtoken@9.0.5': + resolution: {integrity: sha512-VRLSGzik+Unrup6BsouBeHsf4d1hOEgYWTm/7Nmw1sXoN1+tRly/Gy/po3yeahnP4jfnQWWAhQAqcNfH7ngOkA==} + + '@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/mime@3.0.4': + resolution: {integrity: sha512-iJt33IQnVRkqeqC7PzBHPTC6fDlRNRW8vjrgqtScAhrmMwe8c4Eo7+fUGTa+XdWrpEgpyKWMYmi2dIwMAYRzPw==} + + '@types/minimist@1.2.5': + resolution: {integrity: sha512-hov8bUuiLiyFPGyFPE1lwWhmzYbirOXQNNo40+y3zow8aFVTeyn3VWL0VFFfdNddA8S4Vf0Tc062rzyNr7Paag==} + + '@types/ms@0.7.34': + resolution: {integrity: sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g==} + + '@types/node@22.7.5': + resolution: {integrity: sha512-jML7s2NAzMWc//QSJ1a3prpk78cOPchGvXJsC3C6R6PSMoooztvRVQEz89gmBTBY1SPMaqo5teB4uNHPdetShQ==} + + '@types/normalize-package-data@2.4.4': + resolution: {integrity: sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==} + + '@types/passport-jwt@4.0.1': + resolution: {integrity: sha512-Y0Ykz6nWP4jpxgEUYq8NoVZeCQPo1ZndJLfapI249g1jHChvRfZRO/LS3tqu26YgAS/laI1qx98sYGz0IalRXQ==} + + '@types/passport-local@1.0.38': + resolution: {integrity: sha512-nsrW4A963lYE7lNTv9cr5WmiUD1ibYJvWrpE13oxApFsRt77b0RdtZvKbCdNIY4v/QZ6TRQWaDDEwV1kCTmcXg==} + + '@types/passport-strategy@0.2.38': + resolution: {integrity: sha512-GC6eMqqojOooq993Tmnmp7AUTbbQSgilyvpCYQjT+H6JfG/g6RGc7nXEniZlp0zyKJ0WUdOiZWLBZft9Yug1uA==} + + '@types/passport@1.0.16': + resolution: {integrity: sha512-FD0qD5hbPWQzaM0wHUnJ/T0BBCJBxCeemtnCwc/ThhTg3x9jfrAcRUmj5Dopza+MfFS9acTe3wk7rcVnRIp/0A==} + + '@types/qs@6.9.11': + resolution: {integrity: sha512-oGk0gmhnEJK4Yyk+oI7EfXsLayXatCWPHary1MtcmbAifkobT9cM9yutG/hZKIseOU0MqbIwQ/u2nn/Gb+ltuQ==} + + '@types/range-parser@1.2.7': + resolution: {integrity: sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==} + + '@types/send@0.17.4': + resolution: {integrity: sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==} + + '@types/serve-static@1.15.5': + resolution: {integrity: sha512-PDRk21MnK70hja/YF8AHfC7yIsiQHn1rcXx7ijCFBX/k+XQJhQT/gw3xekXKJvx+5SXaMMS8oqQy09Mzvz2TuQ==} + + '@types/stack-utils@2.0.3': + resolution: {integrity: sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==} + + '@types/superagent@8.1.3': + resolution: {integrity: sha512-R/CfN6w2XsixLb1Ii8INfn+BT9sGPvw74OavfkW4SwY+jeUcAwLZv2+bXLJkndnimxjEBm0RPHgcjW9pLCa8cw==} + + '@types/supertest@6.0.2': + resolution: {integrity: sha512-137ypx2lk/wTQbW6An6safu9hXmajAifU/s7szAHLN/FeIm5w7yR0Wkl9fdJMRSHwOn4HLAI0DaB2TOORuhPDg==} + + '@types/validator@13.11.9': + resolution: {integrity: sha512-FCTsikRozryfayPuiI46QzH3fnrOoctTjvOYZkho9BTFLCOZ2rgZJHMOVgCOfttjPJcgOx52EpkY0CMfy87MIw==} + + '@types/yargs-parser@21.0.3': + resolution: {integrity: sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==} + + '@types/yargs@17.0.32': + resolution: {integrity: sha512-xQ67Yc/laOG5uMfX/093MRlGGCIBzZMarVa+gfNKJxWAIgykYpVGkBdbqEzGDDfCrVUj6Hiff4mTZ5BA6TmAog==} + + '@typescript-eslint/eslint-plugin@8.8.1': + resolution: {integrity: sha512-xfvdgA8AP/vxHgtgU310+WBnLB4uJQ9XdyP17RebG26rLtDrQJV3ZYrcopX91GrHmMoH8bdSwMRh2a//TiJ1jQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + '@typescript-eslint/parser': ^8.0.0 || ^8.0.0-alpha.0 + eslint: ^8.57.0 || ^9.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@typescript-eslint/parser@8.8.1': + resolution: {integrity: sha512-hQUVn2Lij2NAxVFEdvIGxT9gP1tq2yM83m+by3whWFsWC+1y8pxxxHUFE1UqDu2VsGi2i6RLcv4QvouM84U+ow==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@typescript-eslint/scope-manager@8.8.1': + resolution: {integrity: sha512-X4JdU+66Mazev/J0gfXlcC/dV6JI37h+93W9BRYXrSn0hrE64IoWgVkO9MSJgEzoWkxONgaQpICWg8vAN74wlA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@typescript-eslint/type-utils@8.8.1': + resolution: {integrity: sha512-qSVnpcbLP8CALORf0za+vjLYj1Wp8HSoiI8zYU5tHxRVj30702Z1Yw4cLwfNKhTPWp5+P+k1pjmD5Zd1nhxiZA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@typescript-eslint/types@8.8.1': + resolution: {integrity: sha512-WCcTP4SDXzMd23N27u66zTKMuEevH4uzU8C9jf0RO4E04yVHgQgW+r+TeVTNnO1KIfrL8ebgVVYYMMO3+jC55Q==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@typescript-eslint/typescript-estree@8.8.1': + resolution: {integrity: sha512-A5d1R9p+X+1js4JogdNilDuuq+EHZdsH9MjTVxXOdVFfTJXunKJR/v+fNNyO4TnoOn5HqobzfRlc70NC6HTcdg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@typescript-eslint/utils@8.8.1': + resolution: {integrity: sha512-/QkNJDbV0bdL7H7d0/y0qBbV2HTtf0TIyjSDTvvmQEzeVx8jEImEbLuOA4EsvE8gIgqMitns0ifb5uQhMj8d9w==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + + '@typescript-eslint/visitor-keys@8.8.1': + resolution: {integrity: sha512-0/TdC3aeRAsW7MDvYRwEc1Uwm0TIBfzjPFgg60UU2Haj5qsCs9cc3zNgY71edqE3LbWfF/WoZQd3lJoDXFQpag==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@webassemblyjs/ast@1.12.1': + resolution: {integrity: sha512-EKfMUOPRRUTy5UII4qJDGPpqfwjOmZ5jeGFwid9mnoqIFK+e0vqoi1qH56JpmZSzEL53jKnNzScdmftJyG5xWg==} + + '@webassemblyjs/floating-point-hex-parser@1.11.6': + resolution: {integrity: sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==} + + '@webassemblyjs/helper-api-error@1.11.6': + resolution: {integrity: sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==} + + '@webassemblyjs/helper-buffer@1.12.1': + resolution: {integrity: sha512-nzJwQw99DNDKr9BVCOZcLuJJUlqkJh+kVzVl6Fmq/tI5ZtEyWT1KZMyOXltXLZJmDtvLCDgwsyrkohEtopTXCw==} + + '@webassemblyjs/helper-numbers@1.11.6': + resolution: {integrity: sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==} + + '@webassemblyjs/helper-wasm-bytecode@1.11.6': + resolution: {integrity: sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==} + + '@webassemblyjs/helper-wasm-section@1.12.1': + resolution: {integrity: sha512-Jif4vfB6FJlUlSbgEMHUyk1j234GTNG9dBJ4XJdOySoj518Xj0oGsNi59cUQF4RRMS9ouBUxDDdyBVfPTypa5g==} + + '@webassemblyjs/ieee754@1.11.6': + resolution: {integrity: sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==} + + '@webassemblyjs/leb128@1.11.6': + resolution: {integrity: sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==} + + '@webassemblyjs/utf8@1.11.6': + resolution: {integrity: sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==} + + '@webassemblyjs/wasm-edit@1.12.1': + resolution: {integrity: sha512-1DuwbVvADvS5mGnXbE+c9NfA8QRcZ6iKquqjjmR10k6o+zzsRVesil54DKexiowcFCPdr/Q0qaMgB01+SQ1u6g==} + + '@webassemblyjs/wasm-gen@1.12.1': + resolution: {integrity: sha512-TDq4Ojh9fcohAw6OIMXqiIcTq5KUXTGRkVxbSo1hQnSy6lAM5GSdfwWeSxpAo0YzgsgF182E/U0mDNhuA0tW7w==} + + '@webassemblyjs/wasm-opt@1.12.1': + resolution: {integrity: sha512-Jg99j/2gG2iaz3hijw857AVYekZe2SAskcqlWIZXjji5WStnOpVoat3gQfT/Q5tb2djnCjBtMocY/Su1GfxPBg==} + + '@webassemblyjs/wasm-parser@1.12.1': + resolution: {integrity: sha512-xikIi7c2FHXysxXe3COrVUPSheuBtpcfhbpFj4gmu7KRLYOzANztwUU0IbsqvMqzuNK2+glRGWCEqZo1WCLyAQ==} + + '@webassemblyjs/wast-printer@1.12.1': + resolution: {integrity: sha512-+X4WAlOisVWQMikjbcvY2e0rwPsKQ9F688lksZhBcPycBBuii3O7m8FACbDMWDojpAqvjIncrG8J0XHKyQfVeA==} + + '@xtuc/ieee754@1.2.0': + resolution: {integrity: sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==} + + '@xtuc/long@4.2.2': + resolution: {integrity: sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==} + + JSONStream@1.3.5: + resolution: {integrity: sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==} + hasBin: true + + abbrev@1.1.1: + resolution: {integrity: sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==} + + abort-controller@3.0.0: + resolution: {integrity: sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==} + engines: {node: '>=6.5'} + + abstract-logging@2.0.1: + resolution: {integrity: sha512-2BjRTZxTPvheOvGbBslFSYOUkr+SjPtOnrLP33f+VIWLzezQpZcqVg7ja3L4dBXmzzgwT+a029jRx5PCi3JuiA==} + + acorn-import-attributes@1.9.5: + resolution: {integrity: sha512-n02Vykv5uA3eHGM/Z2dQrcD56kL8TyDb2p1+0P83PClMnC/nc+anbQRhIOWnSq4Ke/KvDPrY3C9hDtC/A3eHnQ==} + peerDependencies: + acorn: ^8 + + acorn-jsx@5.3.2: + resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} + peerDependencies: + acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + + acorn-walk@8.3.2: + resolution: {integrity: sha512-cjkyv4OtNCIeqhHrfS81QWXoCBPExR/J62oyEqepVw8WaQeSqpW2uhuLPh1m9eWhDuOo/jUXVTlifvesOWp/4A==} + engines: {node: '>=0.4.0'} + + acorn@4.0.13: + resolution: {integrity: sha512-fu2ygVGuMmlzG8ZeRJ0bvR41nsAkxxhbyk8bZ1SS521Z7vmgJFTQQlfz/Mp/nJexGBz+v8sC9bM6+lNgskt4Ug==} + engines: {node: '>=0.4.0'} + hasBin: true + + acorn@8.11.3: + resolution: {integrity: sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==} + engines: {node: '>=0.4.0'} + hasBin: true + + acorn@8.12.1: + resolution: {integrity: sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==} + engines: {node: '>=0.4.0'} + hasBin: true + + add-stream@1.0.0: + resolution: {integrity: sha512-qQLMr+8o0WC4FZGQTcJiKBVC59JylcPSrTtk6usvmIDFUOCKegapy1VHQwRbFMOFyb/inzUVqHs+eMYKDM1YeQ==} + + agent-base@6.0.2: + resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==} + engines: {node: '>= 6.0.0'} + + ajv-formats@2.1.1: + resolution: {integrity: sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==} + peerDependencies: + ajv: ^8.0.0 + peerDependenciesMeta: + ajv: + optional: true + + ajv-keywords@3.5.2: + resolution: {integrity: sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==} + peerDependencies: + ajv: ^6.9.1 + + ajv@6.12.6: + resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} + + ajv@8.12.0: + resolution: {integrity: sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==} + + ajv@8.9.0: + resolution: {integrity: sha512-qOKJyNj/h+OWx7s5DePL6Zu1KeM9jPZhwBqs+7DzP6bGOvqzVCSf0xueYmVuaC/oQ/VtS2zLMLHdQFbkka+XDQ==} + + ansi-colors@4.1.3: + resolution: {integrity: sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==} + engines: {node: '>=6'} + + ansi-escapes@4.3.2: + resolution: {integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==} + engines: {node: '>=8'} + + ansi-regex@2.1.1: + resolution: {integrity: sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==} + engines: {node: '>=0.10.0'} + + ansi-regex@5.0.1: + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} + engines: {node: '>=8'} + + ansi-regex@6.0.1: + resolution: {integrity: sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==} + engines: {node: '>=12'} + + ansi-styles@2.2.1: + resolution: {integrity: sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==} + engines: {node: '>=0.10.0'} + + ansi-styles@3.2.1: + resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} + engines: {node: '>=4'} + + ansi-styles@4.3.0: + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + engines: {node: '>=8'} + + ansi-styles@5.2.0: + resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==} + engines: {node: '>=10'} + + ansi-styles@6.2.1: + resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} + engines: {node: '>=12'} + + anymatch@3.1.3: + resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} + engines: {node: '>= 8'} + + aproba@2.0.0: + resolution: {integrity: sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==} + + archy@1.0.0: + resolution: {integrity: sha512-Xg+9RwCg/0p32teKdGMPTPnVXKD0w3DfHnFTficozsAgsvq2XenPJq/MYpzzQ/v8zrOyJn6Ds39VA4JIDwFfqw==} + + are-we-there-yet@2.0.0: + resolution: {integrity: sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==} + engines: {node: '>=10'} + + arg@4.1.3: + resolution: {integrity: sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==} + + argparse@1.0.10: + resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} + + argparse@2.0.1: + resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + + arr-diff@2.0.0: + resolution: {integrity: sha512-dtXTVMkh6VkEEA7OhXnN1Ecb8aAGFdZ1LFxtOCoqj4qkyOJMt7+qs6Ahdy6p/NQCPYsRSXXivhSB/J5E9jmYKA==} + engines: {node: '>=0.10.0'} + + arr-flatten@1.1.0: + resolution: {integrity: sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==} + engines: {node: '>=0.10.0'} + + array-ify@1.0.0: + resolution: {integrity: sha512-c5AMf34bKdvPhQ7tBGhqkgKNUzMr4WUs+WDtC2ZUGOUncbxKMTvqxYctiseW3+L4bA8ec+GcZ6/A/FW4m8ukng==} + + array-timsort@1.0.3: + resolution: {integrity: sha512-/+3GRL7dDAGEfM6TseQk/U+mi18TU2Ms9I3UlLdUMhz2hbvGNTKdj9xniwXfUqgYhHxRx0+8UnKkvlNwVU+cWQ==} + + array-unique@0.2.1: + resolution: {integrity: sha512-G2n5bG5fSUCpnsXz4+8FUkYsGPkNfLn9YvS66U5qbTIXI2Ynnlo4Bi42bWv+omKUCqz+ejzfClwne0alJWJPhg==} + engines: {node: '>=0.10.0'} + + arrify@1.0.1: + resolution: {integrity: sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==} + engines: {node: '>=0.10.0'} + + asap@2.0.6: + resolution: {integrity: sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==} + + async@3.2.5: + resolution: {integrity: sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg==} + + asynckit@0.4.0: + resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} + + at-least-node@1.0.0: + resolution: {integrity: sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==} + engines: {node: '>= 4.0.0'} + + atob@2.1.2: + resolution: {integrity: sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==} + engines: {node: '>= 4.5.0'} + hasBin: true + + atomic-sleep@1.0.0: + resolution: {integrity: sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ==} + engines: {node: '>=8.0.0'} + + avvio@8.3.0: + resolution: {integrity: sha512-VBVH0jubFr9LdFASy/vNtm5giTrnbVquWBhT0fyizuNK2rQ7e7ONU2plZQWUNqtE1EmxFEb+kbSkFRkstiaS9Q==} + + axios@1.7.7: + resolution: {integrity: sha512-S4kL7XrjgBmvdGut0sN3yJxqYzrDOnivkBiN0OFs6hLiUam3UPvswUo0kqGyhqUZGEOytHyumEdXsAkgCOUf3Q==} + + babel-jest@29.7.0: + resolution: {integrity: sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + peerDependencies: + '@babel/core': ^7.8.0 + + babel-plugin-istanbul@6.1.1: + resolution: {integrity: sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==} + engines: {node: '>=8'} + + babel-plugin-jest-hoist@29.6.3: + resolution: {integrity: sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + babel-preset-current-node-syntax@1.0.1: + resolution: {integrity: sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==} + peerDependencies: + '@babel/core': ^7.0.0 + + babel-preset-jest@29.6.3: + resolution: {integrity: sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + peerDependencies: + '@babel/core': ^7.0.0 + + balanced-match@1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + + base64-js@1.5.1: + resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} + + bcrypt@5.1.1: + resolution: {integrity: sha512-AGBHOG5hPYZ5Xl9KXzU5iKq9516yEmvCKDg3ecP5kX2aB6UqTeXZxk2ELnDgDm6BQSMlLt9rDB4LoSMx0rYwww==} + engines: {node: '>= 10.0.0'} + + binary-extensions@2.2.0: + resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==} + engines: {node: '>=8'} + + bl@4.1.0: + resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==} + + brace-expansion@1.1.11: + resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} + + brace-expansion@2.0.1: + resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} + + braces@1.8.5: + resolution: {integrity: sha512-xU7bpz2ytJl1bH9cgIurjpg/n8Gohy9GTw81heDYLJQ4RU60dlyJsa+atVF2pI0yMMvKxI9HkKwjePCj5XI1hw==} + engines: {node: '>=0.10.0'} + + braces@3.0.3: + resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} + engines: {node: '>=8'} + + browserslist@4.22.3: + resolution: {integrity: sha512-UAp55yfwNv0klWNapjs/ktHoguxuQNGnOzxYmfnXIS+8AsRDZkSDxg7R1AX3GKzn078SBI5dzwzj/Yx0Or0e3A==} + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} + hasBin: true + + bs-logger@0.2.6: + resolution: {integrity: sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==} + engines: {node: '>= 6'} + + bser@2.1.1: + resolution: {integrity: sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==} + + buffer-equal-constant-time@1.0.1: + resolution: {integrity: sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==} + + buffer-from@1.1.2: + resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} + + buffer@5.7.1: + resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} + + buffer@6.0.3: + resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==} + + cache-manager@5.4.0: + resolution: {integrity: sha512-FS7o8vqJosnLpu9rh2gQTo8EOzCRJLF1BJ4XDEUDMqcfvs7SJZs5iuoFTXLauzQ3S5v8sBAST1pCwMaurpyi1A==} + + cachedir@2.3.0: + resolution: {integrity: sha512-A+Fezp4zxnit6FanDmv9EqXNAi3vt9DWp51/71UEhXukb7QUuvtv9344h91dyAxuTLoSYJFU299qzR3tzwPAhw==} + engines: {node: '>=6'} + + call-bind@1.0.7: + resolution: {integrity: sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==} + engines: {node: '>= 0.4'} + + callsites@3.1.0: + resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} + engines: {node: '>=6'} + + camelcase-keys@6.2.2: + resolution: {integrity: sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==} + engines: {node: '>=8'} + + camelcase@2.1.1: + resolution: {integrity: sha512-DLIsRzJVBQu72meAKPkWQOLcujdXT32hwdfnkI1frSiSRMK1MofjKHf+MEx0SB6fjEFXL8fBDv1dKymBlOp4Qw==} + engines: {node: '>=0.10.0'} + + camelcase@3.0.0: + resolution: {integrity: sha512-4nhGqUkc4BqbBBB4Q6zLuD7lzzrHYrjKGeYaEji/3tFR5VdJu9v+LilhGIVe8wxEJPPOeWo7eg8dwY13TZ1BNg==} + engines: {node: '>=0.10.0'} + + camelcase@5.3.1: + resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==} + engines: {node: '>=6'} + + camelcase@6.3.0: + resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} + engines: {node: '>=10'} + + caniuse-lite@1.0.30001584: + resolution: {integrity: sha512-LOz7CCQ9M1G7OjJOF9/mzmqmj3jE/7VOmrfw6Mgs0E8cjOsbRXQJHsPBfmBOXDskXKrHLyyW3n7kpDW/4BsfpQ==} + + case@1.6.3: + resolution: {integrity: sha512-mzDSXIPaFwVDvZAHqZ9VlbyF4yyXRuX6IvB06WvPYkqJVO24kX1PPhv9bfpKNFZyxYFmmgo03HUiD8iklmJYRQ==} + engines: {node: '>= 0.8.0'} + + centra@2.7.0: + resolution: {integrity: sha512-PbFMgMSrmgx6uxCdm57RUos9Tc3fclMvhLSATYN39XsDV29B89zZ3KA89jmY0vwSGazyU+uerqwa6t+KaodPcg==} + + chalk@1.1.3: + resolution: {integrity: sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==} + engines: {node: '>=0.10.0'} + + chalk@2.4.2: + resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} + engines: {node: '>=4'} + + chalk@4.1.2: + resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} + engines: {node: '>=10'} + + chalk@5.3.0: + resolution: {integrity: sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==} + engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} + + char-regex@1.0.2: + resolution: {integrity: sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==} + engines: {node: '>=10'} + + chardet@0.7.0: + resolution: {integrity: sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==} + + chokidar@3.6.0: + resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} + engines: {node: '>= 8.10.0'} + + chownr@2.0.0: + resolution: {integrity: sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==} + engines: {node: '>=10'} + + chownr@3.0.0: + resolution: {integrity: sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==} + engines: {node: '>=18'} + + chrome-trace-event@1.0.3: + resolution: {integrity: sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==} + engines: {node: '>=6.0'} + + ci-info@3.9.0: + resolution: {integrity: sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==} + engines: {node: '>=8'} + + cjs-module-lexer@1.2.3: + resolution: {integrity: sha512-0TNiGstbQmCFwt4akjjBg5pLRTSyj/PkWQ1ZoO2zntmg9yLqSRxwEa4iCfQLGjqhiqBfOJa7W/E8wfGrTDmlZQ==} + + class-transformer@0.5.1: + resolution: {integrity: sha512-SQa1Ws6hUbfC98vKGxZH3KFY0Y1lm5Zm0SY8XX9zbK7FJCyVEac3ATW0RIpwzW+oOfmHE5PMPufDG9hCfoEOMw==} + + class-validator@0.14.1: + resolution: {integrity: sha512-2VEG9JICxIqTpoK1eMzZqaV+u/EiwEJkMGzTrZf6sU/fwsnOITVgYJ8yojSy6CaXtO9V0Cc6ZQZ8h8m4UBuLwQ==} + + cli-cursor@3.1.0: + resolution: {integrity: sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==} + engines: {node: '>=8'} + + cli-spinners@2.9.2: + resolution: {integrity: sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==} + engines: {node: '>=6'} + + 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@3.2.0: + resolution: {integrity: sha512-0yayqDxWQbqk3ojkYqUKqaAQ6AfNKeKWRNA8kR0WXzAsdHpP4BIaOmMAG87JGuO6qcobyW4GjxHd9PmhEd+T9w==} + + cliui@7.0.4: + resolution: {integrity: sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==} + + cliui@8.0.1: + resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} + engines: {node: '>=12'} + + clone-stats@0.0.1: + resolution: {integrity: sha512-dhUqc57gSMCo6TX85FLfe51eC/s+Im2MLkAgJwfaRRexR2tA4dd3eLEW4L6efzHc2iNorrRRXITifnDLlRrhaA==} + + clone@1.0.4: + resolution: {integrity: sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==} + engines: {node: '>=0.8'} + + co@4.6.0: + resolution: {integrity: sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==} + engines: {iojs: '>= 1.0.0', node: '>= 0.12.0'} + + code-point-at@1.1.0: + resolution: {integrity: sha512-RpAVKQA5T63xEj6/giIbUEtZwJ4UFIc3ZtvEkiaUERylqe8xb5IvqcgOurZLahv93CLKfxcw5YI+DZcUBRyLXA==} + engines: {node: '>=0.10.0'} + + collect-v8-coverage@1.0.2: + resolution: {integrity: sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q==} + + color-convert@1.9.3: + resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} + + color-convert@2.0.1: + resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} + engines: {node: '>=7.0.0'} + + color-name@1.1.3: + resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} + + color-name@1.1.4: + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + + color-support@1.1.3: + resolution: {integrity: sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==} + hasBin: true + + 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'} + + commander@2.20.3: + resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} + + commander@4.1.1: + resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==} + engines: {node: '>= 6'} + + comment-json@4.2.3: + resolution: {integrity: sha512-SsxdiOf064DWoZLH799Ata6u7iV658A11PlWtZATDlXPpKGJnbJZ5Z24ybixAi+LUUqJ/GKowAejtC5GFUG7Tw==} + engines: {node: '>= 6'} + + commitizen@4.3.1: + resolution: {integrity: sha512-gwAPAVTy/j5YcOOebcCRIijn+mSjWJC+IYKivTu6aG8Ei/scoXgfsMRnuAk6b0GRste2J4NGxVdMN3ZpfNaVaw==} + engines: {node: '>= 12'} + hasBin: true + + compare-func@2.0.0: + resolution: {integrity: sha512-zHig5N+tPWARooBnb0Zx1MFcdfpyJrfTJ3Y5L+IFvUm8rM74hHz66z0gw0x4tijh5CorKkKUCnW82R2vmpeCRA==} + + component-emitter@1.3.1: + resolution: {integrity: sha512-T0+barUSQRTUQASh8bx02dl+DhF54GtIDY13Y3m9oWTklKbb3Wv974meRpeZ3lp1JpLVECWWNHC4vaG2XHXouQ==} + + concat-map@0.0.1: + resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + + concat-stream@1.5.1: + resolution: {integrity: sha512-eYF1Q4RxUUwq8ApyPD9ebWsYjVrJmTMLGzbGXv4qTZ5iP7FLm+oWN4x2XIzLEZ745xiwRM9DmIB0Ix1Nz8Epmg==} + engines: {'0': node >= 0.8} + + 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==} + + console-control-strings@1.1.0: + resolution: {integrity: sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==} + + content-disposition@0.5.4: + resolution: {integrity: sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==} + engines: {node: '>= 0.6'} + + conventional-changelog-angular@5.0.13: + resolution: {integrity: sha512-i/gipMxs7s8L/QeuavPF2hLnJgH6pEZAttySB6aiQLWcX3puWDL3ACVmvBhJGxnAy52Qc15ua26BufY6KpmrVA==} + engines: {node: '>=10'} + + conventional-changelog-angular@7.0.0: + resolution: {integrity: sha512-ROjNchA9LgfNMTTFSIWPzebCwOGFdgkEq45EnvvrmSLvCtAw0HSmrCs7/ty+wAeYUZyNay0YMUNYFTRL72PkBQ==} + engines: {node: '>=16'} + + conventional-changelog-atom@2.0.8: + resolution: {integrity: sha512-xo6v46icsFTK3bb7dY/8m2qvc8sZemRgdqLb/bjpBsH2UyOS8rKNTgcb5025Hri6IpANPApbXMg15QLb1LJpBw==} + engines: {node: '>=10'} + + conventional-changelog-codemirror@2.0.8: + resolution: {integrity: sha512-z5DAsn3uj1Vfp7po3gpt2Boc+Bdwmw2++ZHa5Ak9k0UKsYAO5mH1UBTN0qSCuJZREIhX6WU4E1p3IW2oRCNzQw==} + engines: {node: '>=10'} + + conventional-changelog-config-spec@2.1.0: + resolution: {integrity: sha512-IpVePh16EbbB02V+UA+HQnnPIohgXvJRxHcS5+Uwk4AT5LjzCZJm5sp/yqs5C6KZJ1jMsV4paEV13BN1pvDuxQ==} + + conventional-changelog-conventionalcommits@4.6.3: + resolution: {integrity: sha512-LTTQV4fwOM4oLPad317V/QNQ1FY4Hju5qeBIM1uTHbrnCE+Eg4CdRZ3gO2pUeR+tzWdp80M2j3qFFEDWVqOV4g==} + engines: {node: '>=10'} + + conventional-changelog-core@4.2.4: + resolution: {integrity: sha512-gDVS+zVJHE2v4SLc6B0sLsPiloR0ygU7HaDW14aNJE1v4SlqJPILPl/aJC7YdtRE4CybBf8gDwObBvKha8Xlyg==} + engines: {node: '>=10'} + + conventional-changelog-ember@2.0.9: + resolution: {integrity: sha512-ulzIReoZEvZCBDhcNYfDIsLTHzYHc7awh+eI44ZtV5cx6LVxLlVtEmcO+2/kGIHGtw+qVabJYjdI5cJOQgXh1A==} + engines: {node: '>=10'} + + conventional-changelog-eslint@3.0.9: + resolution: {integrity: sha512-6NpUCMgU8qmWmyAMSZO5NrRd7rTgErjrm4VASam2u5jrZS0n38V7Y9CzTtLT2qwz5xEChDR4BduoWIr8TfwvXA==} + engines: {node: '>=10'} + + conventional-changelog-express@2.0.6: + resolution: {integrity: sha512-SDez2f3iVJw6V563O3pRtNwXtQaSmEfTCaTBPCqn0oG0mfkq0rX4hHBq5P7De2MncoRixrALj3u3oQsNK+Q0pQ==} + engines: {node: '>=10'} + + conventional-changelog-jquery@3.0.11: + resolution: {integrity: sha512-x8AWz5/Td55F7+o/9LQ6cQIPwrCjfJQ5Zmfqi8thwUEKHstEn4kTIofXub7plf1xvFA2TqhZlq7fy5OmV6BOMw==} + engines: {node: '>=10'} + + conventional-changelog-jshint@2.0.9: + resolution: {integrity: sha512-wMLdaIzq6TNnMHMy31hql02OEQ8nCQfExw1SE0hYL5KvU+JCTuPaDO+7JiogGT2gJAxiUGATdtYYfh+nT+6riA==} + engines: {node: '>=10'} + + conventional-changelog-preset-loader@2.3.4: + resolution: {integrity: sha512-GEKRWkrSAZeTq5+YjUZOYxdHq+ci4dNwHvpaBC3+ENalzFWuCWa9EZXSuZBpkr72sMdKB+1fyDV4takK1Lf58g==} + engines: {node: '>=10'} + + conventional-changelog-writer@5.0.1: + resolution: {integrity: sha512-5WsuKUfxW7suLblAbFnxAcrvf6r+0b7GvNaWUwUIk0bXMnENP/PEieGKVUQrjPqwPT4o3EPAASBXiY6iHooLOQ==} + engines: {node: '>=10'} + hasBin: true + + conventional-changelog@3.1.25: + resolution: {integrity: sha512-ryhi3fd1mKf3fSjbLXOfK2D06YwKNic1nC9mWqybBHdObPd8KJ2vjaXZfYj1U23t+V8T8n0d7gwnc9XbIdFbyQ==} + engines: {node: '>=10'} + + conventional-commit-types@3.0.0: + resolution: {integrity: sha512-SmmCYnOniSsAa9GqWOeLqc179lfr5TRu5b4QFDkbsrJ5TZjPJx85wtOr3zn+1dbeNiXDKGPbZ72IKbPhLXh/Lg==} + + conventional-commits-filter@2.0.7: + resolution: {integrity: sha512-ASS9SamOP4TbCClsRHxIHXRfcGCnIoQqkvAzCSbZzTFLfcTqJVugB0agRgsEELsqaeWgsXv513eS116wnlSSPA==} + engines: {node: '>=10'} + + conventional-commits-parser@3.2.4: + resolution: {integrity: sha512-nK7sAtfi+QXbxHCYfhpZsfRtaitZLIA6889kFIouLvz6repszQDgxBu7wf2WbU+Dco7sAnNCJYERCwt54WPC2Q==} + engines: {node: '>=10'} + hasBin: true + + conventional-commits-parser@5.0.0: + resolution: {integrity: sha512-ZPMl0ZJbw74iS9LuX9YIAiW8pfM5p3yh2o/NbXHbkFuZzY5jvdi5jFycEOkmBW5H5I7nA+D6f3UcsCLP2vvSEA==} + engines: {node: '>=16'} + hasBin: true + + conventional-recommended-bump@6.1.0: + resolution: {integrity: sha512-uiApbSiNGM/kkdL9GTOLAqC4hbptObFo4wW2QRyHsKciGAfQuLU1ShZ1BIVI/+K2BE/W1AWYQMCXAsv4dyKPaw==} + engines: {node: '>=10'} + hasBin: true + + convert-source-map@1.9.0: + resolution: {integrity: sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==} + + convert-source-map@2.0.0: + resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} + + cookie-signature@1.2.1: + resolution: {integrity: sha512-78KWk9T26NhzXtuL26cIJ8/qNHANyJ/ZYrmEXFzUmhZdjpBv+DlWlOANRTGBt48YcyslsLrj0bMLFTmXvLRCOw==} + engines: {node: '>=6.6.0'} + + cookie@0.6.0: + resolution: {integrity: sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==} + 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==} + + cosmiconfig-typescript-loader@5.0.0: + resolution: {integrity: sha512-+8cK7jRAReYkMwMiG+bxhcNKiHJDM6bR9FD/nGBXOWdMLuYawjF5cGrtLilJ+LGd3ZjCXnJjR5DkfWPoIVlqJA==} + engines: {node: '>=v16'} + peerDependencies: + '@types/node': '*' + cosmiconfig: '>=8.2' + typescript: '>=4' + + 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 + + cosmiconfig@9.0.0: + resolution: {integrity: sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==} + engines: {node: '>=14'} + peerDependencies: + typescript: '>=4.9.5' + peerDependenciesMeta: + typescript: + optional: true + + create-jest@29.7.0: + resolution: {integrity: sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + hasBin: true + + create-require@1.1.1: + resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==} + + cross-spawn@7.0.3: + resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} + engines: {node: '>= 8'} + + css@2.2.4: + resolution: {integrity: sha512-oUnjmWpy0niI3x/mPL8dVEI1l7MnG3+HHyRPHf+YFSbK+svOhXpmSOcDURUh2aOCgl2grzrOPt1nHLuCVFULLw==} + + cz-conventional-changelog@3.3.0: + resolution: {integrity: sha512-U466fIzU5U22eES5lTNiNbZ+d8dfcHcssH4o7QsdWaCcRs/feIPCxKYSWkYBNs5mny7MvEfwpTLWjvbm94hecw==} + engines: {node: '>= 10'} + + dargs@7.0.0: + resolution: {integrity: sha512-2iy1EkLdlBzQGvbweYRFxmFath8+K7+AKB0TlhHWkNuH+TmovaMH/Wp7V7R4u7f4SnX3OgLsU9t1NI9ioDnUpg==} + engines: {node: '>=8'} + + dargs@8.1.0: + resolution: {integrity: sha512-wAV9QHOsNbwnWdNW2FYvE1P56wtgSbM+3SZcdGiWQILwVjACCXDCI3Ai8QlCjMDB8YK5zySiXZYBiwGmNY3lnw==} + engines: {node: '>=12'} + + dateformat@3.0.3: + resolution: {integrity: sha512-jyCETtSl3VMZMWeRo7iY1FL19ges1t55hMo5yaam4Jrsm5EPL89UQkoQRyiI+Yf4k8r2ZpdngkV8hr1lIdjb3Q==} + + dateformat@4.6.3: + resolution: {integrity: sha512-2P0p0pFGzHS5EMnhdxQi7aJN+iMheud0UhG4dlE1DLAlvL8JHjJJTX/CSm4JXwV0Ka5nGk3zC5mcb5bUQUxxMA==} + + debug-fabulous@0.0.4: + resolution: {integrity: sha512-mmVKpY/O4UIl6ZDn5Owf8jEauO6uQiuF4Jz9iTuflSmvqNm6/64xARk/qCq5ZJxu141Ic2lCmL1TSMHIYoyiTw==} + + debug@2.6.9: + resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + debug@4.3.4: + resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + decamelize-keys@1.1.1: + resolution: {integrity: sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg==} + engines: {node: '>=0.10.0'} + + decamelize@1.2.0: + resolution: {integrity: sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==} + engines: {node: '>=0.10.0'} + + decode-uri-component@0.2.2: + resolution: {integrity: sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==} + engines: {node: '>=0.10'} + + dedent@0.7.0: + resolution: {integrity: sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==} + + dedent@1.5.1: + resolution: {integrity: sha512-+LxW+KLWxu3HW3M2w2ympwtqPrqYRzU8fqi6Fhd18fBALe15blJPI/I4+UHveMVG6lJqB4JNd4UG0S5cnVHwIg==} + peerDependencies: + babel-plugin-macros: ^3.1.0 + peerDependenciesMeta: + babel-plugin-macros: + optional: true + + deep-is@0.1.4: + resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} + + deep-override@1.0.2: + resolution: {integrity: sha512-+bAuLuYqaVVUWPaq8rmU8NLTX85p4I5k5/cVdhBioEfH7k+5NlGdv4NoJVQcJRByqzzTWWzTpih+pU1wBTmMow==} + + deepmerge@4.3.1: + resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} + engines: {node: '>=0.10.0'} + + defaults@1.0.4: + resolution: {integrity: sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==} + + define-data-property@1.1.2: + resolution: {integrity: sha512-SRtsSqsDbgpJBbW3pABMCOt6rQyeM8s8RiyeSN8jYG8sYmt/kGJejbydttUsnDs1tadr19tvhT4ShwMyoqAm4g==} + engines: {node: '>= 0.4'} + + delayed-stream@1.0.0: + resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} + engines: {node: '>=0.4.0'} + + delegates@1.0.0: + resolution: {integrity: sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==} + + depd@2.0.0: + resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} + engines: {node: '>= 0.8'} + + detect-file@1.0.0: + resolution: {integrity: sha512-DtCOLG98P007x7wiiOmfI0fi3eIKyWiLTGJ2MDnVi/E04lWGbf+JzrRHMm0rgIIZJGtHpKpbVgLWHrv8xXpc3Q==} + engines: {node: '>=0.10.0'} + + detect-indent@6.1.0: + resolution: {integrity: sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==} + engines: {node: '>=8'} + + detect-libc@2.0.2: + resolution: {integrity: sha512-UX6sGumvvqSaXgdKGUsgZWqcUyIXZ/vZTrlRT/iobiKhGL0zL4d3osHj3uqllWJK+i+sixDS/3COVEOFbupFyw==} + engines: {node: '>=8'} + + detect-newline@2.1.0: + resolution: {integrity: sha512-CwffZFvlJffUg9zZA0uqrjQayUTC8ob94pnr5sFwaVv3IOmkfUHcWH+jXaQK3askE51Cqe8/9Ql/0uXNwqZ8Zg==} + engines: {node: '>=0.10.0'} + + detect-newline@3.1.0: + resolution: {integrity: sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==} + engines: {node: '>=8'} + + dezalgo@1.0.4: + resolution: {integrity: sha512-rXSP0bf+5n0Qonsb+SVVfNfIsimO4HEtmnIpPHY8Q1UCzKlQrDMfdobr8nJOOsRgWCyMRqeSBQzmWUMq7zvVig==} + + diff-sequences@29.6.3: + resolution: {integrity: sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + diff@4.0.2: + resolution: {integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==} + engines: {node: '>=0.3.1'} + + dot-prop@5.3.0: + resolution: {integrity: sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==} + engines: {node: '>=8'} + + dot@1.1.3: + resolution: {integrity: sha512-/nt74Rm+PcfnirXGEdhZleTwGC2LMnuKTeeTIlI82xb5loBBoXNYzr2ezCroPSMtilK8EZIfcNZwOcHN+ib1Lg==} + engines: {'0': node >=0.2.6} + hasBin: true + + dotenv-expand@10.0.0: + resolution: {integrity: sha512-GopVGCpVS1UKH75VKHGuQFqS1Gusej0z4FyQkPdwjil2gNIv+LNsqBlboOzpJFZKVT95GkCyWJbBSdFEFUWI2A==} + engines: {node: '>=12'} + + dotenv-expand@11.0.6: + resolution: {integrity: sha512-8NHi73otpWsZGBSZwwknTXS5pqMOrk9+Ssrna8xCaxkzEpU9OTf9R5ArQGVw03//Zmk9MOwLPng9WwndvpAJ5g==} + engines: {node: '>=12'} + + dotenv@16.4.5: + resolution: {integrity: sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg==} + engines: {node: '>=12'} + + dotgitignore@2.1.0: + resolution: {integrity: sha512-sCm11ak2oY6DglEPpCB8TixLjWAxd3kJTs6UIcSasNYxXdFPV+YKlye92c8H4kKFqV5qYMIh7d+cYecEg0dIkA==} + engines: {node: '>=6'} + + duplexify@3.7.1: + resolution: {integrity: sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==} + + duplexify@4.1.2: + resolution: {integrity: sha512-fz3OjcNCHmRP12MJoZMPglx8m4rrFP8rovnk4vT8Fs+aonZoCwGg10dSsQsfP/E62eZcPTMSMP6686fu9Qlqtw==} + + eastasianwidth@0.2.0: + resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} + + ecdsa-sig-formatter@1.0.11: + resolution: {integrity: sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==} + + ejs@3.1.10: + resolution: {integrity: sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==} + engines: {node: '>=0.10.0'} + hasBin: true + + electron-to-chromium@1.4.659: + resolution: {integrity: sha512-sRJ3nV3HowrYpBtPF9bASQV7OW49IgZC01Xiq43WfSE3RTCkK0/JidoCmR73Hyc1mN+l/H4Yqx0eNiomvExFZg==} + + emittery@0.13.1: + resolution: {integrity: sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==} + engines: {node: '>=12'} + + emoji-regex@8.0.0: + resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + + emoji-regex@9.2.2: + resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} + + end-of-stream@1.4.4: + resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} + + enhanced-resolve@5.15.0: + resolution: {integrity: sha512-LXYT42KJ7lpIKECr2mAXIaMldcNCh/7E0KBKOu4KSfkHmP+mZmSs+8V5gBAqisWBy0OO4W5Oyys0GO1Y8KtdKg==} + engines: {node: '>=10.13.0'} + + enhanced-resolve@5.17.1: + resolution: {integrity: sha512-LMHl3dXhTcfv8gM4kEzIUeTQ+7fpdA0l2tUf34BddXPkz2A5xJ5L/Pchd5BL6rdccM9QGvu0sWZzK1Z1t4wwyg==} + engines: {node: '>=10.13.0'} + + env-paths@2.2.1: + resolution: {integrity: sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==} + engines: {node: '>=6'} + + error-ex@1.3.2: + resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} + + es-define-property@1.0.0: + resolution: {integrity: sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==} + engines: {node: '>= 0.4'} + + es-errors@1.3.0: + resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} + engines: {node: '>= 0.4'} + + es-module-lexer@1.4.1: + resolution: {integrity: sha512-cXLGjP0c4T3flZJKQSuziYoq7MlT+rnvfZjfp7h+I7K9BNX54kP9nyWvdbwjQ4u1iWbOL4u96fgeZLToQlZC7w==} + + escalade@3.1.2: + resolution: {integrity: sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==} + engines: {node: '>=6'} + + 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'} + + escape-string-regexp@4.0.0: + resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} + engines: {node: '>=10'} + + eslint-config-prettier@9.1.0: + resolution: {integrity: sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw==} + hasBin: true + peerDependencies: + eslint: '>=7.0.0' + + eslint-plugin-prettier@5.2.1: + resolution: {integrity: sha512-gH3iR3g4JfF+yYPaJYkN7jEl9QbweL/YfkoRlNnuIEHEz1vHVlCmWOS+eGGiRuzHQXdJFCOTxRgvju9b8VUmrw==} + engines: {node: ^14.18.0 || >=16.0.0} + peerDependencies: + '@types/eslint': '>=8.0.0' + eslint: '>=8.0.0' + eslint-config-prettier: '*' + prettier: '>=3.0.0' + peerDependenciesMeta: + '@types/eslint': + optional: true + eslint-config-prettier: + optional: true + + eslint-scope@5.1.1: + resolution: {integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==} + engines: {node: '>=8.0.0'} + + eslint-scope@8.1.0: + resolution: {integrity: sha512-14dSvlhaVhKKsa9Fx1l8A17s7ah7Ef7wCakJ10LYk6+GYmP9yDti2oq2SEwcyndt6knfcZyhyxwY3i9yL78EQw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + eslint-visitor-keys@3.4.3: + resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + eslint-visitor-keys@4.1.0: + resolution: {integrity: sha512-Q7lok0mqMUSf5a/AdAZkA5a/gHcO6snwQClVNNvFKCAVlxXucdU8pKydU5ZVZjBx5xr37vGbFFWtLQYreLzrZg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + eslint@9.12.0: + resolution: {integrity: sha512-UVIOlTEWxwIopRL1wgSQYdnVDcEvs2wyaO6DGo5mXqe3r16IoCNWkR29iHhyaP4cICWjbgbmFUGAhh0GJRuGZw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + hasBin: true + peerDependencies: + jiti: '*' + peerDependenciesMeta: + jiti: + optional: true + + espree@10.2.0: + resolution: {integrity: sha512-upbkBJbckcCNBDBDXEbuhjbP68n+scUd3k/U2EkyM9nw+I/jPiL4cLF/Al06CF96wRltFda16sxDFrxsI1v0/g==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + esprima@4.0.1: + resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} + engines: {node: '>=4'} + hasBin: true + + esquery@1.5.0: + resolution: {integrity: sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==} + engines: {node: '>=0.10'} + + esrecurse@4.3.0: + resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} + engines: {node: '>=4.0'} + + estraverse@4.3.0: + resolution: {integrity: sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==} + engines: {node: '>=4.0'} + + estraverse@5.3.0: + resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} + engines: {node: '>=4.0'} + + esutils@2.0.3: + resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} + engines: {node: '>=0.10.0'} + + event-target-shim@5.0.1: + resolution: {integrity: sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==} + engines: {node: '>=6'} + + eventemitter2@6.4.9: + resolution: {integrity: sha512-JEPTiaOt9f04oa6NOkc4aH+nVp5I3wEjpHbIPqfgCdD5v5bUzy7xQqwcVO2aDQgOWhI28da57HksMrzK9HlRxg==} + + events@3.3.0: + resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==} + engines: {node: '>=0.8.x'} + + execa@5.1.1: + resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} + engines: {node: '>=10'} + + exit@0.1.2: + resolution: {integrity: sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==} + engines: {node: '>= 0.8.0'} + + expand-brackets@0.1.5: + resolution: {integrity: sha512-hxx03P2dJxss6ceIeri9cmYOT4SRs3Zk3afZwWpOsRqLqprhTR8u++SlC+sFGsQr7WGFPdMF7Gjc1njDLDK6UA==} + engines: {node: '>=0.10.0'} + + expand-range@1.8.2: + resolution: {integrity: sha512-AFASGfIlnIbkKPQwX1yHaDjFvh/1gyKJODme52V6IORh69uEYgZp0o9C+qsIGNVEiuuhQU0CSSl++Rlegg1qvA==} + engines: {node: '>=0.10.0'} + + expand-tilde@2.0.2: + resolution: {integrity: sha512-A5EmesHW6rfnZ9ysHQjPdJRni0SRar0tjtG5MNtm9n5TUvsYU8oozprtRD4AqHxcZWWlVuAmQo2nWKfN9oyjTw==} + engines: {node: '>=0.10.0'} + + expect@29.7.0: + resolution: {integrity: sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + extend-shallow@2.0.1: + resolution: {integrity: sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==} + engines: {node: '>=0.10.0'} + + extend@3.0.2: + resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} + + external-editor@3.1.0: + resolution: {integrity: sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==} + engines: {node: '>=4'} + + extglob@0.3.2: + resolution: {integrity: sha512-1FOj1LOwn42TMrruOHGt18HemVnbwAmAak7krWk+wa93KXxGbK+2jpezm+ytJYDaBX0/SPLZFHKM7m+tKobWGg==} + engines: {node: '>=0.10.0'} + + fast-content-type-parse@1.1.0: + resolution: {integrity: sha512-fBHHqSTFLVnR61C+gltJuE5GkVQMV0S2nqUO8TJ+5Z3qAKG8vAx4FKai1s5jq/inV1+sREynIWSuQ6HgoSXpDQ==} + + fast-copy@3.0.2: + resolution: {integrity: sha512-dl0O9Vhju8IrcLndv2eU4ldt1ftXMqqfgN4H1cpmGV7P6jeB9FwpN9a2c8DPGE1Ys88rNUJVYDHq73CGAGOPfQ==} + + fast-decode-uri-component@1.0.1: + resolution: {integrity: sha512-WKgKWg5eUxvRZGwW8FvfbaH7AXSh2cL+3j5fMGzUMCxWBJ3dV3a7Wz8y2f/uQ0e3B6WmodD3oS54jTQ9HVTIIg==} + + fast-deep-equal@3.1.3: + resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + + fast-diff@1.3.0: + resolution: {integrity: sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==} + + fast-glob@3.3.2: + resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==} + engines: {node: '>=8.6.0'} + + fast-json-stable-stringify@2.1.0: + resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} + + fast-json-stringify@5.12.0: + resolution: {integrity: sha512-7Nnm9UPa7SfHRbHVA1kJQrGXCRzB7LMlAAqHXQFkEQqueJm1V8owm0FsE/2Do55/4CcdhwiLQERaKomOnKQkyA==} + + fast-levenshtein@2.0.6: + resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} + + fast-querystring@1.1.2: + resolution: {integrity: sha512-g6KuKWmFXc0fID8WWH0jit4g0AGBoJhCkJMb1RmbsSEUNvQ+ZC8D6CUZ+GtF8nMzSPXnhiePyyqqipzNNEnHjg==} + + fast-redact@3.3.0: + resolution: {integrity: sha512-6T5V1QK1u4oF+ATxs1lWUmlEk6P2T9HqJG3e2DnHOdVgZy2rFJBoEnrIedcTXlkAHU/zKC+7KETJ+KGGKwxgMQ==} + engines: {node: '>=6'} + + fast-safe-stringify@2.1.1: + resolution: {integrity: sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==} + + fast-uri@2.3.0: + resolution: {integrity: sha512-eel5UKGn369gGEWOqBShmFJWfq/xSJvsgDzgLYC845GneayWvXBf0lJCBn5qTABfewy1ZDPoaR5OZCP+kssfuw==} + + fastify-ip@1.1.0: + resolution: {integrity: sha512-23M1Jbw5ftu1uMeVYsyqUfKs85SsfvopJZufdSinzbrYYQtD4V7TWn1Mc6IliQXHk0mdiLeKxYH4F3OZlxG5Ow==} + engines: {node: '>=18.x'} + + fastify-plugin@4.5.1: + resolution: {integrity: sha512-stRHYGeuqpEZTL1Ef0Ovr2ltazUT9g844X5z/zEBFLG8RYlpDiOCIG+ATvYEp+/zmc7sN29mcIMp8gvYplYPIQ==} + + fastify@4.26.2: + resolution: {integrity: sha512-90pjTuPGrfVKtdpLeLzND5nyC4woXZN5VadiNQCicj/iJU4viNHKhsAnb7jmv1vu2IzkLXyBiCzdWuzeXgQ5Ug==} + + fastq@1.17.1: + resolution: {integrity: sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==} + + fb-watchman@2.0.2: + resolution: {integrity: sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==} + + figures@3.2.0: + resolution: {integrity: sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==} + engines: {node: '>=8'} + + file-entry-cache@8.0.0: + resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==} + engines: {node: '>=16.0.0'} + + filelist@1.0.4: + resolution: {integrity: sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==} + + filename-regex@2.0.1: + resolution: {integrity: sha512-BTCqyBaWBTsauvnHiE8i562+EdJj+oUpkqWp2R1iCoR8f6oo8STRu3of7WJJ0TqWtxN50a5YFpzYK4Jj9esYfQ==} + engines: {node: '>=0.10.0'} + + fill-range@2.2.4: + resolution: {integrity: sha512-cnrcCbj01+j2gTG921VZPnHbjmdAf8oQV/iGeV2kZxGSyfYjjTyY79ErsK1WJWMpw6DaApEX72binqJE+/d+5Q==} + engines: {node: '>=0.10.0'} + + fill-range@7.1.1: + resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} + engines: {node: '>=8'} + + find-my-way@8.2.2: + resolution: {integrity: sha512-Dobi7gcTEq8yszimcfp/R7+owiT4WncAJ7VTTgFH1jYJ5GaG1FbhjwDG820hptN0QDFvzVY3RfCzdInvGPGzjA==} + engines: {node: '>=14'} + + find-node-modules@2.1.3: + resolution: {integrity: sha512-UC2I2+nx1ZuOBclWVNdcnbDR5dlrOdVb7xNjmT/lHE+LsgztWks3dG7boJ37yTS/venXw84B/mAW9uHVoC5QRg==} + + find-root@1.1.0: + resolution: {integrity: sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==} + + find-up@1.1.2: + resolution: {integrity: sha512-jvElSjyuo4EMQGoTwo1uJU5pQMwTW5lS1x05zzfJuTIyLR3zwO27LYrxNg+dlvKpGOuGy/MzBdXh80g0ve5+HA==} + engines: {node: '>=0.10.0'} + + find-up@2.1.0: + resolution: {integrity: sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ==} + engines: {node: '>=4'} + + find-up@3.0.0: + resolution: {integrity: sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==} + engines: {node: '>=6'} + + find-up@4.1.0: + resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} + engines: {node: '>=8'} + + find-up@5.0.0: + resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} + engines: {node: '>=10'} + + find-up@7.0.0: + resolution: {integrity: sha512-YyZM99iHrqLKjmt4LJDj58KI+fYyufRLBSYcqycxf//KpBk9FoewoGX0450m9nB44qrZnovzC2oeP5hUibxc/g==} + engines: {node: '>=18'} + + findup-sync@4.0.0: + resolution: {integrity: sha512-6jvvn/12IC4quLBL1KNokxC7wWTvYncaVUYSoxWw7YykPLuRrnv4qdHcSOywOI5RpkOVGeQRtWM8/q+G6W6qfQ==} + engines: {node: '>= 8'} + + first-chunk-stream@1.0.0: + resolution: {integrity: sha512-ArRi5axuv66gEsyl3UuK80CzW7t56hem73YGNYxNWTGNKFJUadSb9Gu9SHijYEUi8ulQMf1bJomYNwSCPHhtTQ==} + engines: {node: '>=0.10.0'} + + flat-cache@4.0.1: + resolution: {integrity: sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==} + engines: {node: '>=16'} + + flatted@3.2.9: + resolution: {integrity: sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==} + + follow-redirects@1.15.6: + resolution: {integrity: sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==} + engines: {node: '>=4.0'} + peerDependencies: + debug: '*' + peerDependenciesMeta: + debug: + optional: true + + for-in@1.0.2: + resolution: {integrity: sha512-7EwmXrOjyL+ChxMhmG5lnW9MPt1aIeZEwKhQzoBUdTV0N3zuwWDZYVJatDvZ2OyzPUvdIAZDsCetk3coyMfcnQ==} + engines: {node: '>=0.10.0'} + + for-own@0.1.5: + resolution: {integrity: sha512-SKmowqGTJoPzLO1T0BBJpkfp3EMacCMOuH40hOUbrbzElVktk4DioXVM99QkLCyKoiuOmyjgcWMpVz2xjE7LZw==} + engines: {node: '>=0.10.0'} + + foreground-child@3.1.1: + resolution: {integrity: sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==} + engines: {node: '>=14'} + + fork-ts-checker-webpack-plugin@9.0.2: + resolution: {integrity: sha512-Uochze2R8peoN1XqlSi/rGUkDQpRogtLFocP9+PGu68zk1BDAKXfdeCdyVZpgTk8V8WFVQXdEz426VKjXLO1Gg==} + engines: {node: '>=12.13.0', yarn: '>=1.0.0'} + peerDependencies: + typescript: '>3.6.0' + webpack: ^5.11.0 + + form-data-lite@1.0.3: + resolution: {integrity: sha512-P7xPqAiOPKzC9Q9aywAZJCQq4QOE5WokPb3HrcWRh7C57RKytueJzoORZAVgHBNvK/lL7E+FxjQjd4X/zbecEQ==} + + form-data@4.0.0: + resolution: {integrity: sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==} + engines: {node: '>= 6'} + + formidable@2.1.2: + resolution: {integrity: sha512-CM3GuJ57US06mlpQ47YcunuUZ9jpm8Vx+P2CGt2j7HpgkKZO/DJYQ0Bobim8G6PFQmK5lOqOOdUXboU+h73A4g==} + + forwarded@0.2.0: + resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==} + engines: {node: '>= 0.6'} + + fs-extra@10.1.0: + resolution: {integrity: sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==} + engines: {node: '>=12'} + + fs-extra@9.1.0: + resolution: {integrity: sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==} + engines: {node: '>=10'} + + fs-minipass@2.1.0: + resolution: {integrity: sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==} + engines: {node: '>= 8'} + + fs-monkey@1.0.5: + resolution: {integrity: sha512-8uMbBjrhzW76TYgEV27Y5E//W2f/lTFmx78P2w19FZSxarhI/798APGQyuGCwmkNxgwGRhrLfvWyLBvNtuOmew==} + + fs.realpath@1.0.0: + resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} + + fsevents@2.3.3: + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + + function-bind@1.1.2: + resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} + + gauge@3.0.2: + resolution: {integrity: sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==} + engines: {node: '>=10'} + + gensync@1.0.0-beta.2: + resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} + engines: {node: '>=6.9.0'} + + get-caller-file@2.0.5: + resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} + engines: {node: 6.* || 8.* || >= 10.*} + + get-intrinsic@1.2.4: + resolution: {integrity: sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==} + engines: {node: '>= 0.4'} + + get-package-type@0.1.0: + resolution: {integrity: sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==} + engines: {node: '>=8.0.0'} + + get-pkg-repo@4.2.1: + resolution: {integrity: sha512-2+QbHjFRfGB74v/pYWjd5OhU3TDIC2Gv/YKUTk/tCvAz0pkn/Mz6P3uByuBimLOcPvN2jYdScl3xGFSrx0jEcA==} + engines: {node: '>=6.9.0'} + hasBin: true + + get-stream@6.0.1: + resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} + engines: {node: '>=10'} + + git-raw-commits@2.0.11: + resolution: {integrity: sha512-VnctFhw+xfj8Va1xtfEqCUD2XDrbAPSJx+hSrE5K7fGdjZruW7XV+QOrN7LF/RJyvspRiD2I0asWsxFp0ya26A==} + engines: {node: '>=10'} + hasBin: true + + git-raw-commits@4.0.0: + resolution: {integrity: sha512-ICsMM1Wk8xSGMowkOmPrzo2Fgmfo4bMHLNX6ytHjajRJUqvHOw/TFapQ+QG75c3X/tTDDhOSRPGC52dDbNM8FQ==} + engines: {node: '>=16'} + hasBin: true + + git-remote-origin-url@2.0.0: + resolution: {integrity: sha512-eU+GGrZgccNJcsDH5LkXR3PB9M958hxc7sbA8DFJjrv9j4L2P/eZfKhM+QD6wyzpiv+b1BpK0XrYCxkovtjSLw==} + engines: {node: '>=4'} + + git-semver-tags@4.1.1: + resolution: {integrity: sha512-OWyMt5zBe7xFs8vglMmhM9lRQzCWL3WjHtxNNfJTMngGym7pC1kh8sP6jevfydJ6LP3ZvGxfb6ABYgPUM0mtsA==} + engines: {node: '>=10'} + hasBin: true + + gitconfiglocal@1.0.0: + resolution: {integrity: sha512-spLUXeTAVHxDtKsJc8FkFVgFtMdEN9qPGpL23VfSHx4fP4+Ds097IXLvymbnDH8FnmxX5Nr9bPw3A+AQ6mWEaQ==} + + glob-base@0.3.0: + resolution: {integrity: sha512-ab1S1g1EbO7YzauaJLkgLp7DZVAqj9M/dvKlTt8DkXA2tiOIcSMrlVI2J1RZyB5iJVccEscjGn+kpOG9788MHA==} + engines: {node: '>=0.10.0'} + + glob-parent@2.0.0: + resolution: {integrity: sha512-JDYOvfxio/t42HKdxkAYaCiBN7oYiuxykOxKxdaUW5Qn0zaYN3gRQWolrwdnf0shM9/EP0ebuuTmyoXNr1cC5w==} + + glob-parent@3.1.0: + resolution: {integrity: sha512-E8Ak/2+dZY6fnzlR7+ueWvhsH1SjHr4jjss4YS/h4py44jY9MhK/VFdaZJAWDz6BbL21KeteKxFSFpq8OS5gVA==} + + 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'} + + glob-stream@5.3.5: + resolution: {integrity: sha512-piN8XVAO2sNxwVLokL4PswgJvK/uQ6+awwXUVRTGF+rRfgCZpn4hOqxiRuTEbU/k3qgKl0DACYQ/0Sge54UMQg==} + engines: {node: '>= 0.10'} + + glob-to-regexp@0.4.1: + resolution: {integrity: sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==} + + glob@10.4.2: + resolution: {integrity: sha512-GwMlUF6PkPo3Gk21UxkCohOv0PLcIXVtKyLlpEI28R/cO/4eNOdmLk3CMW1wROV/WR/EsZOWAfBbBOqYvs88/w==} + engines: {node: '>=16 || 14 >=14.18'} + hasBin: true + + glob@10.4.5: + resolution: {integrity: sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==} + hasBin: true + + glob@5.0.15: + resolution: {integrity: sha512-c9IPMazfRITpmAAKi22dK1VKxGDX9ehhqfABDriL/lzO92xcUKEJPQHrVA/2YHSNFB4iFlykVmWvwo48nr3OxA==} + deprecated: Glob versions prior to v9 are no longer supported + + glob@7.2.3: + resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} + deprecated: Glob versions prior to v9 are no longer supported + + global-directory@4.0.1: + resolution: {integrity: sha512-wHTUcDUoZ1H5/0iVqEudYW4/kAlN5cZ3j/bXn0Dpbizl9iaUVeWSHqiOjsgk6OW2bkLclbBjzewBz6weQ1zA2Q==} + engines: {node: '>=18'} + + global-modules@1.0.0: + resolution: {integrity: sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==} + engines: {node: '>=0.10.0'} + + global-prefix@1.0.2: + resolution: {integrity: sha512-5lsx1NUDHtSjfg0eHlmYvZKv8/nVqX4ckFbM+FrGcQ+04KWcWFo9P5MxPZYSzUvyzmdTbI7Eix8Q4IbELDqzKg==} + engines: {node: '>=0.10.0'} + + globals@11.12.0: + resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} + engines: {node: '>=4'} + + globals@14.0.0: + resolution: {integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==} + engines: {node: '>=18'} + + gopd@1.0.1: + resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==} + + graceful-fs@4.2.11: + resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + + graphemer@1.4.0: + resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} + + gulp-sourcemaps@1.12.1: + resolution: {integrity: sha512-2NYnMpB67LJhc36sEv+hNY05UOy1lD9DPtLi+en4hbGH+085G9Zzh3cet2VEqrDlQrLk9Eho0MM9dZ3Z+dL0XA==} + engines: {node: '>=0.10.0'} + + handlebars@4.7.8: + resolution: {integrity: sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==} + engines: {node: '>=0.4.7'} + hasBin: true + + hard-rejection@2.1.0: + resolution: {integrity: sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==} + engines: {node: '>=6'} + + has-ansi@2.0.0: + resolution: {integrity: sha512-C8vBJ8DwUCx19vhm7urhTuUsr4/IyP6l4VzNQDv+ryHQObW3TTTp9yB68WpYgRe2bbaGuZ/se74IqFeVnMnLZg==} + engines: {node: '>=0.10.0'} + + has-flag@3.0.0: + resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} + engines: {node: '>=4'} + + has-flag@4.0.0: + resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} + engines: {node: '>=8'} + + has-own-prop@2.0.0: + resolution: {integrity: sha512-Pq0h+hvsVm6dDEa8x82GnLSYHOzNDt7f0ddFa3FqcQlgzEiptPqL+XrOJNavjOzSYiYWIrgeVYYgGlLmnxwilQ==} + engines: {node: '>=8'} + + has-property-descriptors@1.0.1: + resolution: {integrity: sha512-VsX8eaIewvas0xnvinAe9bw4WfIeODpGYikiWYLH+dma0Jw6KHYqWiWfhQlgOVK8D6PvjubK5Uc4P0iIhIcNVg==} + + has-proto@1.0.1: + resolution: {integrity: sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==} + engines: {node: '>= 0.4'} + + has-symbols@1.0.3: + resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==} + engines: {node: '>= 0.4'} + + has-unicode@2.0.1: + resolution: {integrity: sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==} + + hasown@2.0.0: + resolution: {integrity: sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==} + engines: {node: '>= 0.4'} + + helmet@7.1.0: + resolution: {integrity: sha512-g+HZqgfbpXdCkme/Cd/mZkV0aV3BZZZSugecH03kl38m/Kmdx8jKjBikpDj2cr+Iynv4KpYEviojNdTJActJAg==} + engines: {node: '>=16.0.0'} + + help-me@5.0.0: + resolution: {integrity: sha512-7xgomUX6ADmcYzFik0HzAxh/73YlKR9bmFzf51CZwR+b6YtzU2m0u49hQCqV6SvlqIqsaxovfwdvbnsw3b/zpg==} + + hexoid@1.0.0: + resolution: {integrity: sha512-QFLV0taWQOZtvIRIAdBChesmogZrtuXvVWsFHZTk2SU+anspqZ2vMnoLg7IE1+Uk16N19APic1BuF8bC8c2m5g==} + engines: {node: '>=8'} + + homedir-polyfill@1.0.3: + resolution: {integrity: sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==} + engines: {node: '>=0.10.0'} + + hosted-git-info@2.8.9: + resolution: {integrity: sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==} + + hosted-git-info@4.1.0: + resolution: {integrity: sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==} + engines: {node: '>=10'} + + html-escaper@2.0.2: + resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==} + + http-errors@2.0.0: + resolution: {integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==} + engines: {node: '>= 0.8'} + + http-status@1.7.4: + resolution: {integrity: sha512-c2qSwNtTlHVYAhMj9JpGdyo0No/+DiKXCJ9pHtZ2Yf3QmPnBIytKSRT7BuyIiQ7icXLynavGmxUqkOjSrAuMuA==} + engines: {node: '>= 0.4.0'} + + https-proxy-agent@5.0.1: + resolution: {integrity: sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==} + engines: {node: '>= 6'} + + human-signals@2.1.0: + resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} + engines: {node: '>=10.17.0'} + + husky@9.1.6: + resolution: {integrity: sha512-sqbjZKK7kf44hfdE94EoX8MZNk0n7HeW37O4YrVGCF4wzgQjp+akPAkfUK5LZ6KuR/6sqeAVuXHji+RzQgOn5A==} + engines: {node: '>=18'} + hasBin: true + + iconv-lite@0.4.24: + resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} + engines: {node: '>=0.10.0'} + + ieee754@1.2.1: + resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} + + ignore@5.3.1: + resolution: {integrity: sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==} + engines: {node: '>= 4'} + + import-fresh@3.3.0: + resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} + engines: {node: '>=6'} + + import-local@3.1.0: + resolution: {integrity: sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==} + engines: {node: '>=8'} + hasBin: true + + import-meta-resolve@4.0.0: + resolution: {integrity: sha512-okYUR7ZQPH+efeuMJGlq4f8ubUgO50kByRPyt/Cy1Io4PSRsPjxME+YlVaCOx+NIToW7hCsZNFJyTPFFKepRSA==} + + imurmurhash@0.1.4: + resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} + engines: {node: '>=0.8.19'} + + indent-string@4.0.0: + resolution: {integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==} + engines: {node: '>=8'} + + inflight@1.0.6: + resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} + deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful. + + inherits@2.0.4: + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + + ini@1.3.8: + resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} + + ini@4.1.1: + resolution: {integrity: sha512-QQnnxNyfvmHFIsj7gkPcYymR8Jdw/o7mp5ZFihxn6h8Ci6fh3Dx4E1gPjpQEpIuPo9XVNY/ZUwh4BPMjGyL01g==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + inquirer@8.2.5: + resolution: {integrity: sha512-QAgPDQMEgrDssk1XiwwHoOGYF9BAbUcc1+j+FhEvaOt8/cKRqyLn0U5qA6F74fGhTMGxf92pOvPBeh29jQJDTQ==} + engines: {node: '>=12.0.0'} + + inquirer@8.2.6: + resolution: {integrity: sha512-M1WuAmb7pn9zdFRtQYk26ZBoY043Sse0wVDdk4Bppr+JOXyQYybdtvK+l9wUibhtjdjvtoiNy8tk+EgsYIUqKg==} + engines: {node: '>=12.0.0'} + + inquirer@9.2.15: + resolution: {integrity: sha512-vI2w4zl/mDluHt9YEQ/543VTCwPKWiHzKtm9dM2V0NdFcqEexDAjUHzO1oA60HRNaVifGXXM1tRRNluLVHa0Kg==} + engines: {node: '>=18'} + + invert-kv@1.0.0: + resolution: {integrity: sha512-xgs2NH9AE66ucSq4cNG1nhSFghr5l6tdL15Pk+jl46bmmBapgoaY/AacXyaDznAqmGL99TiLSQgO/XazFSKYeQ==} + engines: {node: '>=0.10.0'} + + ipaddr.js@1.9.1: + resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==} + engines: {node: '>= 0.10'} + + is-arrayish@0.2.1: + resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} + + is-binary-path@2.1.0: + resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} + engines: {node: '>=8'} + + is-buffer@1.1.6: + resolution: {integrity: sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==} + + is-core-module@2.13.1: + resolution: {integrity: sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==} + + is-dotfile@1.0.3: + resolution: {integrity: sha512-9YclgOGtN/f8zx0Pr4FQYMdibBiTaH3sn52vjYip4ZSf6C4/6RfTEZ+MR4GvKhCxdPh21Bg42/WL55f6KSnKpg==} + engines: {node: '>=0.10.0'} + + is-equal-shallow@0.1.3: + resolution: {integrity: sha512-0EygVC5qPvIyb+gSz7zdD5/AAoS6Qrx1e//6N4yv4oNm30kqvdmG66oZFWVlQHUWe5OjP08FuTw2IdT0EOTcYA==} + engines: {node: '>=0.10.0'} + + is-extendable@0.1.1: + resolution: {integrity: sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==} + engines: {node: '>=0.10.0'} + + is-extglob@1.0.0: + resolution: {integrity: sha512-7Q+VbVafe6x2T+Tu6NcOf6sRklazEPmBoB3IWk3WdGZM2iGUwU/Oe3Wtq5lSEkDTTlpp8yx+5t4pzO/i9Ty1ww==} + engines: {node: '>=0.10.0'} + + is-extglob@2.1.1: + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} + + is-fullwidth-code-point@1.0.0: + resolution: {integrity: sha512-1pqUqRjkhPJ9miNq9SwMfdvi6lBJcd6eFxvfaivQhaH3SgisfiuudvFntdKOmxuee/77l+FPjKrQjWvmPjWrRw==} + engines: {node: '>=0.10.0'} + + is-fullwidth-code-point@3.0.0: + resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} + engines: {node: '>=8'} + + is-generator-fn@2.1.0: + resolution: {integrity: sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==} + engines: {node: '>=6'} + + is-glob@2.0.1: + resolution: {integrity: sha512-a1dBeB19NXsf/E0+FHqkagizel/LQw2DjSQpvQrj3zT+jYPpaUCryPnrQajXKFLCMuf4I6FhRpaGtw4lPrG6Eg==} + engines: {node: '>=0.10.0'} + + is-glob@3.1.0: + resolution: {integrity: sha512-UFpDDrPgM6qpnFNI+rh/p3bUaq9hKLZN8bMUWzxmcnZVS3omf4IPK+BrewlnWjO1WmUsMYuSjKh4UJuV4+Lqmw==} + engines: {node: '>=0.10.0'} + + is-glob@4.0.3: + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} + + is-interactive@1.0.0: + resolution: {integrity: sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==} + engines: {node: '>=8'} + + is-number@2.1.0: + resolution: {integrity: sha512-QUzH43Gfb9+5yckcrSA0VBDwEtDUchrk4F6tfJZQuNzDJbEDB9cZNzSfXGQ1jqmdDY/kl41lUOWM9syA8z8jlg==} + engines: {node: '>=0.10.0'} + + is-number@4.0.0: + resolution: {integrity: sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==} + engines: {node: '>=0.10.0'} + + is-number@7.0.0: + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + engines: {node: '>=0.12.0'} + + is-obj@2.0.0: + resolution: {integrity: sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==} + engines: {node: '>=8'} + + is-plain-obj@1.1.0: + resolution: {integrity: sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==} + engines: {node: '>=0.10.0'} + + is-posix-bracket@0.1.1: + resolution: {integrity: sha512-Yu68oeXJ7LeWNmZ3Zov/xg/oDBnBK2RNxwYY1ilNJX+tKKZqgPK+qOn/Gs9jEu66KDY9Netf5XLKNGzas/vPfQ==} + engines: {node: '>=0.10.0'} + + is-primitive@2.0.0: + resolution: {integrity: sha512-N3w1tFaRfk3UrPfqeRyD+GYDASU3W5VinKhlORy8EWVf/sIdDL9GAcew85XmktCfH+ngG7SRXEVDoO18WMdB/Q==} + engines: {node: '>=0.10.0'} + + is-stream@1.1.0: + resolution: {integrity: sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==} + engines: {node: '>=0.10.0'} + + is-stream@2.0.1: + resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} + engines: {node: '>=8'} + + is-text-path@1.0.1: + resolution: {integrity: sha512-xFuJpne9oFz5qDaodwmmG08e3CawH/2ZV8Qqza1Ko7Sk8POWbkRdwIoAWVhqvq0XeUzANEhKo2n0IXUGBm7A/w==} + engines: {node: '>=0.10.0'} + + is-text-path@2.0.0: + resolution: {integrity: sha512-+oDTluR6WEjdXEJMnC2z6A4FRwFoYuvShVVEGsS7ewc0UTi2QtAKMDJuL4BDEVt+5T7MjFo12RP8ghOM75oKJw==} + engines: {node: '>=8'} + + is-unicode-supported@0.1.0: + resolution: {integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==} + engines: {node: '>=10'} + + is-utf8@0.2.1: + resolution: {integrity: sha512-rMYPYvCzsXywIsldgLaSoPlw5PfoB/ssr7hY4pLfcodrA5M/eArza1a9VmTiNIBNMjOGr1Ow9mTyU2o69U6U9Q==} + + is-valid-glob@0.3.0: + resolution: {integrity: sha512-CvG8EtJZ8FyzVOGPzrDorzyN65W1Ld8BVnqshRCah6pFIsprGx3dKgFtjLn/Vw9kGqR4OlR84U7yhT9ZVTyWIQ==} + engines: {node: '>=0.10.0'} + + is-windows@1.0.2: + resolution: {integrity: sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==} + engines: {node: '>=0.10.0'} + + isarray@0.0.1: + resolution: {integrity: sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==} + + isarray@1.0.0: + resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} + + isexe@2.0.0: + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + + isobject@2.1.0: + resolution: {integrity: sha512-+OUdGJlgjOBZDfxnDjYYG6zp487z0JGNQq3cYQYg5f5hKR+syHMsaztzGeml/4kGG55CSpKSpWTY+jYGgsHLgA==} + engines: {node: '>=0.10.0'} + + istanbul-lib-coverage@3.2.2: + resolution: {integrity: sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==} + engines: {node: '>=8'} + + istanbul-lib-instrument@5.2.1: + resolution: {integrity: sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==} + engines: {node: '>=8'} + + istanbul-lib-instrument@6.0.1: + resolution: {integrity: sha512-EAMEJBsYuyyztxMxW3g7ugGPkrZsV57v0Hmv3mm1uQsmB+QnZuepg731CRaIgeUVSdmsTngOkSnauNF8p7FIhA==} + engines: {node: '>=10'} + + istanbul-lib-report@3.0.1: + resolution: {integrity: sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==} + engines: {node: '>=10'} + + istanbul-lib-source-maps@4.0.1: + resolution: {integrity: sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==} + engines: {node: '>=10'} + + istanbul-reports@3.1.6: + resolution: {integrity: sha512-TLgnMkKg3iTDsQ9PbPTdpfAK2DzjF9mqUG7RMgcQl8oFjad8ob4laGxv5XV5U9MAfx8D6tSJiUyuAwzLicaxlg==} + engines: {node: '>=8'} + + iterare@1.2.1: + resolution: {integrity: sha512-RKYVTCjAnRthyJes037NX/IiqeidgN1xc3j1RjFfECFp28A1GVwK9nA+i0rJPaHqSZwygLzRnFlzUuHFoWWy+Q==} + engines: {node: '>=6'} + + jackspeak@3.4.3: + resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==} + + jake@10.9.2: + resolution: {integrity: sha512-2P4SQ0HrLQ+fw6llpLnOaGAvN2Zu6778SJMrCUwns4fOoG9ayrTiZk3VV8sCPkVZF8ab0zksVpS8FDY5pRCNBA==} + engines: {node: '>=10'} + hasBin: true + + jest-changed-files@29.7.0: + resolution: {integrity: sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-circus@29.7.0: + resolution: {integrity: sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-cli@29.7.0: + resolution: {integrity: sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + hasBin: true + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + + jest-config@29.7.0: + resolution: {integrity: sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + peerDependencies: + '@types/node': '*' + ts-node: '>=9.0.0' + peerDependenciesMeta: + '@types/node': + optional: true + ts-node: + optional: true + + jest-diff@29.7.0: + resolution: {integrity: sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-docblock@29.7.0: + resolution: {integrity: sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-each@29.7.0: + resolution: {integrity: sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-environment-node@29.7.0: + resolution: {integrity: sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-get-type@29.6.3: + resolution: {integrity: sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-haste-map@29.7.0: + resolution: {integrity: sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-leak-detector@29.7.0: + resolution: {integrity: sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-matcher-utils@29.7.0: + resolution: {integrity: sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-message-util@29.7.0: + resolution: {integrity: sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-mock@29.7.0: + resolution: {integrity: sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-pnp-resolver@1.2.3: + resolution: {integrity: sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==} + engines: {node: '>=6'} + peerDependencies: + jest-resolve: '*' + peerDependenciesMeta: + jest-resolve: + optional: true + + jest-regex-util@29.6.3: + resolution: {integrity: sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-resolve-dependencies@29.7.0: + resolution: {integrity: sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-resolve@29.7.0: + resolution: {integrity: sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-runner@29.7.0: + resolution: {integrity: sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-runtime@29.7.0: + resolution: {integrity: sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-snapshot@29.7.0: + resolution: {integrity: sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-util@29.7.0: + resolution: {integrity: sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-validate@29.7.0: + resolution: {integrity: sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-watcher@29.7.0: + resolution: {integrity: sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-worker@27.5.1: + resolution: {integrity: sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==} + engines: {node: '>= 10.13.0'} + + jest-worker@29.7.0: + resolution: {integrity: sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest@29.5.0: + resolution: {integrity: sha512-juMg3he2uru1QoXX078zTa7pO85QyB9xajZc6bU+d9yEGwrKX6+vGmJQ3UdVZsvTEUARIdObzH68QItim6OSSQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + hasBin: true + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + + jest@29.7.0: + resolution: {integrity: sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + hasBin: true + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + + jiti@1.21.0: + resolution: {integrity: sha512-gFqAIbuKyyso/3G2qhiO2OM6shY6EPP/R0+mkDbyspxKazh8BXDC5FiFsUjlczgdNz/vfra0da2y+aHrusLG/Q==} + hasBin: true + + joycon@3.1.1: + resolution: {integrity: sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw==} + engines: {node: '>=10'} + + js-tokens@4.0.0: + resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + + js-yaml@3.14.1: + resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==} + hasBin: true + + js-yaml@4.1.0: + resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} + hasBin: true + + jsesc@2.5.2: + resolution: {integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==} + engines: {node: '>=4'} + hasBin: true + + json-buffer@3.0.1: + resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} + + json-parse-better-errors@1.0.2: + resolution: {integrity: sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==} + + json-parse-even-better-errors@2.3.1: + resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} + + json-query@2.2.2: + resolution: {integrity: sha512-y+IcVZSdqNmS4fO8t1uZF6RMMs0xh3SrTjJr9bp1X3+v0Q13+7Cyv12dSmKwDswp/H427BVtpkLWhGxYu3ZWRA==} + + json-schema-ref-resolver@1.0.1: + resolution: {integrity: sha512-EJAj1pgHc1hxF6vo2Z3s69fMjO1INq6eGHXZ8Z6wCQeldCuwxGK9Sxf4/cScGn3FZubCVUehfWtcDM/PLteCQw==} + + json-schema-traverse@0.4.1: + resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} + + json-schema-traverse@1.0.0: + resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} + + json-stable-stringify-without-jsonify@1.0.1: + resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} + + json-stringify-safe@5.0.1: + resolution: {integrity: sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==} + + json5@2.2.3: + resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} + engines: {node: '>=6'} + hasBin: true + + jsonc-parser@3.0.0: + resolution: {integrity: sha512-fQzRfAbIBnR0IQvftw9FJveWiHp72Fg20giDrHz6TdfB12UH/uue0D3hm57UB5KgAVuniLMCaS8P1IMj9NR7cA==} + + jsonc-parser@3.2.1: + resolution: {integrity: sha512-AilxAyFOAcK5wA1+LeaySVBrHsGQvUFCDWXKpZjzaL0PqW+xfBOttn8GNtWKFWqneyMZj41MWF9Kl6iPWLwgOA==} + + jsonc-parser@3.3.1: + resolution: {integrity: sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ==} + + jsonfile@6.1.0: + resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==} + + jsonparse@1.3.1: + resolution: {integrity: sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==} + engines: {'0': node >= 0.2.0} + + jsonrepair@3.8.1: + resolution: {integrity: sha512-5wnjaO53EJOhfLFY92nvBz2B9gqF9ql/D4HKUb1WOSBaqtVcAifFfmurblnhCJn/ySqKFA8U3n7nhGMAu/hEjQ==} + hasBin: true + + jsonwebtoken@9.0.2: + resolution: {integrity: sha512-PRp66vJ865SSqOlgqS8hujT5U4AOgMfhrwYIuIhfKaoSCZcirrmASQr8CX7cUg+RMih+hgznrjp99o+W4pJLHQ==} + engines: {node: '>=12', npm: '>=6'} + + jwa@1.4.1: + resolution: {integrity: sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==} + + jws@3.2.2: + resolution: {integrity: sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==} + + keyv@4.5.4: + resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} + + kind-of@3.2.2: + resolution: {integrity: sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==} + engines: {node: '>=0.10.0'} + + kind-of@6.0.3: + resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==} + engines: {node: '>=0.10.0'} + + kleur@3.0.3: + resolution: {integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==} + engines: {node: '>=6'} + + kleur@4.1.5: + resolution: {integrity: sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==} + engines: {node: '>=6'} + + klona@2.0.6: + resolution: {integrity: sha512-dhG34DXATL5hSxJbIexCft8FChFXtmskoZYnoPWjXQuebWYCNkVeV3KkGegCK9CP1oswI/vQibS2GY7Em/sJJA==} + engines: {node: '>= 8'} + + lazy-debug-legacy@0.0.1: + resolution: {integrity: sha512-GFWaIBcBjxWWKI5OghwYEsPOR8JFh2xEcc3ZFV0ONYL0oHz0PHINJCfxJyztUq2XzcHncyO7fsRR550Gtfnk6g==} + peerDependencies: + debug: '*' + + lazystream@1.0.1: + resolution: {integrity: sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw==} + engines: {node: '>= 0.6.3'} + + lcid@1.0.0: + resolution: {integrity: sha512-YiGkH6EnGrDGqLMITnGjXtGmNtjoXw9SVUzcaos8RBi7Ps0VBylkq+vOcY9QE5poLasPCR849ucFUkl0UzUyOw==} + engines: {node: '>=0.10.0'} + + leven@3.1.0: + resolution: {integrity: sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==} + engines: {node: '>=6'} + + levn@0.4.1: + resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} + engines: {node: '>= 0.8.0'} + + libphonenumber-js@1.10.58: + resolution: {integrity: sha512-53A0IpJFL9LdHbpeatwizf8KSwPICrqn9H0g3Y7WQ+Jgeu9cQ4Ew3WrRtrLBu/CX2lXd5+rgT01/tGlkbkzOjw==} + + light-my-request@5.12.0: + resolution: {integrity: sha512-P526OX6E7aeCIfw/9UyJNsAISfcFETghysaWHQAlQYayynShT08MOj4c6fBCvTWBrHXSvqBAKDp3amUPSCQI4w==} + + lightcookie@1.0.25: + resolution: {integrity: sha512-SrY/+eBPaKAMnsn7mCsoOMZzoQyCyHHHZlFCu2fjo28XxSyCLjlooKiTxyrXTg8NPaHp1YzWi0lcGG1gDi6KHw==} + deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. + + lines-and-columns@1.2.4: + resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} + + load-json-file@1.1.0: + resolution: {integrity: sha512-cy7ZdNRXdablkXYNI049pthVeXFurRyb9+hA/dZzerZ0pGTx42z+y+ssxBaVV2l70t1muq5IdKhn4UtcoGUY9A==} + engines: {node: '>=0.10.0'} + + load-json-file@4.0.0: + resolution: {integrity: sha512-Kx8hMakjX03tiGTLAIdJ+lL0htKnXjEZN6hk/tozf/WOuYGdZBJrZ+rCJRbVCugsjB3jMLn9746NsQIf5VjBMw==} + engines: {node: '>=4'} + + loader-runner@4.3.0: + resolution: {integrity: sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==} + engines: {node: '>=6.11.5'} + + locate-path@2.0.0: + resolution: {integrity: sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA==} + engines: {node: '>=4'} + + locate-path@3.0.0: + resolution: {integrity: sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==} + engines: {node: '>=6'} + + locate-path@5.0.0: + resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} + engines: {node: '>=8'} + + locate-path@6.0.0: + resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} + engines: {node: '>=10'} + + locate-path@7.2.0: + resolution: {integrity: sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + lodash._reinterpolate@3.0.0: + resolution: {integrity: sha512-xYHt68QRoYGjeeM/XOE1uJtvXQAgvszfBhjV4yvsQH0u2i9I6cI6c6/eG4Hh3UAOVn0y/xAXwmTzEay49Q//HA==} + + lodash.assign@4.2.0: + resolution: {integrity: sha512-hFuH8TY+Yji7Eja3mGiuAxBqLagejScbG8GbG0j6o9vzn0YL14My+ktnqtZgFTosKymC9/44wP6s7xyuLfnClw==} + + lodash.assigninwith@4.2.0: + resolution: {integrity: sha512-oYOjtZzQnecm7PJcxrDbL20OHv3tTtOQdRBSnlor6s0MO6VOFTOC+JyBIJUNUEzsBi1I0oslWtFAAG6QQbFIWQ==} + + lodash.camelcase@4.3.0: + resolution: {integrity: sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==} + + lodash.clonedeep@4.5.0: + resolution: {integrity: sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ==} + + lodash.includes@4.3.0: + resolution: {integrity: sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w==} + + lodash.isboolean@3.0.3: + resolution: {integrity: sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg==} + + lodash.isequal@4.5.0: + resolution: {integrity: sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==} + + lodash.isinteger@4.0.4: + resolution: {integrity: sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA==} + + lodash.ismatch@4.4.0: + resolution: {integrity: sha512-fPMfXjGQEV9Xsq/8MTSgUf255gawYRbjwMyDbcvDhXgV7enSZA0hynz6vMPnpAb5iONEzBHBPsT+0zes5Z301g==} + + lodash.isnumber@3.0.3: + resolution: {integrity: sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw==} + + lodash.isplainobject@4.0.6: + resolution: {integrity: sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==} + + lodash.isstring@4.0.1: + resolution: {integrity: sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==} + + lodash.kebabcase@4.1.1: + resolution: {integrity: sha512-N8XRTIMMqqDgSy4VLKPnJ/+hpGZN+PHQiJnSenYqPaVV/NCqEogTnAdZLQiGKhxX+JCs8waWq2t1XHWKOmlY8g==} + + lodash.keys@4.2.0: + resolution: {integrity: sha512-J79MkJcp7Df5mizHiVNpjoHXLi4HLjh9VLS/M7lQSGoQ+0oQ+lWEigREkqKyizPB1IawvQLLKY8mzEcm1tkyxQ==} + + lodash.map@4.6.0: + resolution: {integrity: sha512-worNHGKLDetmcEYDvh2stPCrrQRkP20E4l0iIS7F8EvzMqBBi7ltvFN5m1HvTf1P7Jk1txKhvFcmYsCr8O2F1Q==} + + lodash.memoize@4.1.2: + resolution: {integrity: sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==} + + lodash.merge@4.6.2: + resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} + + lodash.mergewith@4.6.2: + resolution: {integrity: sha512-GK3g5RPZWTRSeLSpgP8Xhra+pnjBC56q9FZYe1d5RN3TJ35dbkGy3YqBSMbyCrlbi+CM9Z3Jk5yTL7RCsqboyQ==} + + lodash.once@4.1.1: + resolution: {integrity: sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==} + + lodash.rest@4.0.5: + resolution: {integrity: sha512-hsypEpebNAt0hj1aX9isQqi2CIZoNS1lP6PSWhB3hcMnBivobYzPZRPYq4cr38+RtvrlxQTgaW+sIuHAhBoHrA==} + + lodash.snakecase@4.1.1: + resolution: {integrity: sha512-QZ1d4xoBHYUeuouhEq3lk3Uq7ldgyFXGBhg04+oRLnIz8o9T65Eh+8YdroUwn846zchkA9yDsDl5CVVaV2nqYw==} + + lodash.startcase@4.4.0: + resolution: {integrity: sha512-+WKqsK294HMSc2jEbNgpHpd0JfIBhp7rEV4aqXWqFr6AlXov+SlcgB1Fv01y2kGe3Gc8nMW7VA0SrGuSkRfIEg==} + + lodash.template@4.2.4: + resolution: {integrity: sha512-PmEQ9TtYbeYg6lNwJpSjkp4J4KttYLuKF1C6jeFBidyzbOFu0KvVnLicZBf0sGfScARwgOBqxnV/rWuaqRwang==} + + lodash.templatesettings@4.2.0: + resolution: {integrity: sha512-stgLz+i3Aa9mZgnjr/O+v9ruKZsPsndy7qPZOchbqk2cnTU1ZaldKK+v7m54WoKIyxiuMZTKT2H81F8BeAc3ZQ==} + + lodash.tostring@4.1.4: + resolution: {integrity: sha512-xWHJ0LY7cSz/C/4ghNNiYA1Ong0VLdzAzrjDHvOzN+eJHzDEHme2+k+w/9Pk8dtdwcASMUbxN1/mtj6mFI25Ng==} + + lodash.uniq@4.5.0: + resolution: {integrity: sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==} + + lodash.upperfirst@4.3.1: + resolution: {integrity: sha512-sReKOYJIJf74dhJONhU4e0/shzi1trVbSWDOhKYE5XV2O+H7Sb2Dihwuc7xWxVl+DgFPyTqIN3zMfT9cq5iWDg==} + + lodash@4.17.21: + resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} + + log-symbols@4.1.0: + resolution: {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==} + engines: {node: '>=10'} + + longest@2.0.1: + resolution: {integrity: sha512-Ajzxb8CM6WAnFjgiloPsI3bF+WCxcvhdIG3KNA2KN962+tdBsHcuQ4k4qX/EcS/2CRkcc0iAkR956Nib6aXU/Q==} + engines: {node: '>=0.10.0'} + + lru-cache@10.2.0: + resolution: {integrity: sha512-2bIM8x+VAf6JT4bKAljS1qUWgMsqZRPGJS6FSahIMPVvctcNhyVp7AJu7quxOW9jwkryBReKZY5tY5JYv2n/7Q==} + engines: {node: 14 || >=16.14} + + lru-cache@5.1.1: + resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} + + lru-cache@6.0.0: + resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} + engines: {node: '>=10'} + + magic-string@0.25.7: + resolution: {integrity: sha512-4CrMT5DOHTDk4HYDlzmwu4FVCcIYI8gauveasrdCu2IKIFOJ3f0v/8MDGJCDL9oD2ppz/Av1b0Nj345H9M+XIA==} + + magic-string@0.30.8: + resolution: {integrity: sha512-ISQTe55T2ao7XtlAStud6qwYPZjE4GK1S/BeVPus4jrq6JuOnQ00YKQC581RWhR122W7msZV263KzVeLoqidyQ==} + engines: {node: '>=12'} + + make-dir@3.1.0: + resolution: {integrity: sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==} + engines: {node: '>=8'} + + make-dir@4.0.0: + resolution: {integrity: sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==} + engines: {node: '>=10'} + + make-error@1.3.6: + resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} + + makeerror@1.0.12: + resolution: {integrity: sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==} + + map-obj@1.0.1: + resolution: {integrity: sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==} + engines: {node: '>=0.10.0'} + + map-obj@4.3.0: + resolution: {integrity: sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==} + engines: {node: '>=8'} + + map-stream@0.0.6: + resolution: {integrity: sha512-RG9wAgznUY0foT30MMfnXh4jS0ObmOuxoGKe/ppYvM55RfquNdIvEEf6e+euczNVVzJIVbkgxg7GJBpYDhQ/Zg==} + + matchit@1.1.0: + resolution: {integrity: sha512-+nGYoOlfHmxe5BW5tE0EMJppXEwdSf8uBA1GTZC7Q77kbT35+VKLYJMzVNWCHSsga1ps1tPYFtFyvxvKzWVmMA==} + engines: {node: '>=6'} + + math-random@1.0.4: + resolution: {integrity: sha512-rUxjysqif/BZQH2yhd5Aaq7vXMSx9NdEsQcyA07uEzIvxgI7zIr33gGsh+RU0/XjmQpCW7RsVof1vlkvQVCK5A==} + + memfs@3.5.3: + resolution: {integrity: sha512-UERzLsxzllchadvbPs5aolHh65ISpKpM+ccLbOJ8/vvpBKmAWf+la7dXFy7Mr0ySHbdHrFv5kGFCUHHe6GFEmw==} + engines: {node: '>= 4.0.0'} + + meow@12.1.1: + resolution: {integrity: sha512-BhXM0Au22RwUneMPwSCnyhTOizdWoIEPU9sp0Aqa1PnDMR5Wv2FGXYDjuzJEIX+Eo2Rb8xuYe5jrnm5QowQFkw==} + engines: {node: '>=16.10'} + + meow@8.1.2: + resolution: {integrity: sha512-r85E3NdZ+mpYk1C6RjPFEMSE+s1iZMuHtsHAqY0DT3jZczl0diWUZ8g6oU7h0M9cD2EL+PzaYghhCLzR0ZNn5Q==} + engines: {node: '>=10'} + + merge-stream@1.0.1: + resolution: {integrity: sha512-e6RM36aegd4f+r8BZCcYXlO2P3H6xbUM6ktL2Xmf45GAOit9bI4z6/3VU7JwllVO1L7u0UDSg/EhzQ5lmMLolA==} + + 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'} + + merge@2.1.1: + resolution: {integrity: sha512-jz+Cfrg9GWOZbQAnDQ4hlVnQky+341Yk5ru8bZSe6sIDTCIg8n9i/u7hSQGSVOF3C7lH6mGtqjkiT9G4wFLL0w==} + + methods@1.1.2: + resolution: {integrity: sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==} + engines: {node: '>= 0.6'} + + micromatch@2.3.11: + resolution: {integrity: sha512-LnU2XFEk9xxSJ6rfgAry/ty5qwUTyHYOBU0g4R6tIw5ljwgGIBmiKhRWLw5NpMOnrgUNcDJ4WMp8rl3sYVHLNA==} + engines: {node: '>=0.10.0'} + + micromatch@4.0.8: + resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} + engines: {node: '>=8.6'} + + mime-db@1.52.0: + resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} + engines: {node: '>= 0.6'} + + mime-lite@1.0.3: + resolution: {integrity: sha512-V85l97zJSTG8FEvmdTlmNYb0UMrVBwvRjw7bWTf/aT6KjFwtz3iTz8D2tuFIp7lwiaO2C5ecnrEmSkkMRCrqVw==} + + mime-types@2.1.35: + resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} + engines: {node: '>= 0.6'} + + mime@2.6.0: + resolution: {integrity: sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==} + engines: {node: '>=4.0.0'} + hasBin: true + + mime@3.0.0: + resolution: {integrity: sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==} + engines: {node: '>=10.0.0'} + hasBin: true + + mimic-fn@2.1.0: + resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} + engines: {node: '>=6'} + + min-indent@1.0.1: + resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==} + engines: {node: '>=4'} + + minimatch@3.1.2: + resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + + minimatch@5.1.6: + resolution: {integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==} + engines: {node: '>=10'} + + minimatch@9.0.5: + resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} + engines: {node: '>=16 || 14 >=14.17'} + + minimist-options@4.1.0: + resolution: {integrity: sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==} + engines: {node: '>= 6'} + + minimist@1.2.7: + resolution: {integrity: sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g==} + + minimist@1.2.8: + resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} + + minipass@3.3.6: + resolution: {integrity: sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==} + engines: {node: '>=8'} + + minipass@5.0.0: + resolution: {integrity: sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==} + engines: {node: '>=8'} + + minipass@7.0.4: + resolution: {integrity: sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==} + engines: {node: '>=16 || 14 >=14.17'} + + minipass@7.1.2: + resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} + engines: {node: '>=16 || 14 >=14.17'} + + minizlib@2.1.2: + resolution: {integrity: sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==} + engines: {node: '>= 8'} + + minizlib@3.0.1: + resolution: {integrity: sha512-umcy022ILvb5/3Djuu8LWeqUa8D68JaBzlttKeMWen48SjabqS3iY5w/vzeMzMUNhLDifyhbOwKDSznB1vvrwg==} + engines: {node: '>= 18'} + + mkdirp@0.5.6: + resolution: {integrity: sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==} + hasBin: true + + mkdirp@1.0.4: + resolution: {integrity: sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==} + engines: {node: '>=10'} + hasBin: true + + mkdirp@3.0.1: + resolution: {integrity: sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==} + engines: {node: '>=10'} + hasBin: true + + mnemonist@0.39.6: + resolution: {integrity: sha512-A/0v5Z59y63US00cRSLiloEIw3t5G+MiKz4BhX21FI+YBJXBOGW0ohFxTxO08dsOYlzxo87T7vGfZKYp2bcAWA==} + + modify-values@1.0.1: + resolution: {integrity: sha512-xV2bxeN6F7oYjZWTe/YPAy6MN2M+sL4u/Rlm2AHCIVGfo2p1yGmBHQ6vHehl4bRTZBdHu3TSkWdYgkwpYzAGSw==} + engines: {node: '>=0.10.0'} + + module@1.2.5: + resolution: {integrity: sha512-Y+j9HcHf8V6YtNBkLbPmREAUi5xGbAdb9ycXpo2roABDPrJEzd79kmoH5Ib9lpxcNVsHWa1LhRZJcflUq2+N3w==} + hasBin: true + + ms@2.0.0: + resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==} + + ms@2.1.2: + resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} + + ms@2.1.3: + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + + mute-stream@0.0.8: + resolution: {integrity: sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==} + + mute-stream@1.0.0: + resolution: {integrity: sha512-avsJQhyd+680gKXyG/sQc0nXaC6rBkPOfyHYcFb9+hdkqQkR9bdnkJ0AMZhke0oesPqIO+mFFJ+IdBc7mst4IA==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + nanoid@3.3.7: + resolution: {integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + + natural-compare@1.4.0: + resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} + + neo-async@2.6.2: + resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} + + nestjs-cls@4.4.1: + resolution: {integrity: sha512-4yhldwm/cJ02lQ8ZAdM8KQ7gMfjAc1z3fo5QAQgXNyN4N6X5So9BCwv+BTLRugDCkELUo3qtzQHnKhGYL/ftPg==} + engines: {node: '>=16'} + peerDependencies: + '@nestjs/common': '> 7.0.0 < 11' + '@nestjs/core': '> 7.0.0 < 11' + reflect-metadata: '*' + rxjs: '>= 7' + + nestjs-oauth2@0.0.7: + resolution: {integrity: sha512-P4HfJziGsMl4+aTclr9vkqfbI84odja1kOjKZw095A+b4ksVczOC4J/AH4BydsIAPVsj/5RJj4aGFoWV90Bu1w==} + peerDependencies: + '@nestjs/common': ^9.0.0 + rxjs: ^7.x + + nestjs-pino@4.1.0: + resolution: {integrity: sha512-I6zcddauD2TNMRbsraEIxNUvHcz0El5QRUYH5eY1+pBzj7R17U+Yoyypoc+akVdSLWJ1r0kDYAZPy2mlhXv6vw==} + engines: {node: '>= 14'} + peerDependencies: + '@nestjs/common': ^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 + + nestjs-prisma@0.23.0: + resolution: {integrity: sha512-0pIMDasayP+vMFSztcs85zu4WSPTKM85F8vIrqn7GsUBboEcKhI8eCeVghhNyKDGzEBaNAYNJlo2MAWdNuN7Tw==} + peerDependencies: + '@nestjs/common': ^7.0.0 || ^8.0.0 || ^9.0.0 || ^10.0.0 + '@prisma/client': ^2.0.0 || ^3.0.0 || ^4.0.0 || ^5.0.0 + prisma: ^2.0.0 || ^3.0.0 || ^4.0.0 || ^5.0.0 + + node-abort-controller@3.1.1: + resolution: {integrity: sha512-AGK2yQKIjRuqnc6VkX2Xj5d+QW8xZ87pa1UK6yA6ouUyuxfHuMP6umE5QK7UmTeOAymo+Zx1Fxiuw9rVx8taHQ==} + + node-addon-api@5.1.0: + resolution: {integrity: sha512-eh0GgfEkpnoWDq+VY8OyvYhFEzBk6jIYbRKdIlyTiAXIVJ8PyBaKb0rp7oDtoddbdoHWhq8wwr+XZ81F1rpNdA==} + + 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==} + + node-releases@2.0.14: + resolution: {integrity: sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==} + + nopt@5.0.0: + resolution: {integrity: sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==} + engines: {node: '>=6'} + hasBin: true + + normalize-package-data@2.5.0: + resolution: {integrity: sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==} + + normalize-package-data@3.0.3: + resolution: {integrity: sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==} + engines: {node: '>=10'} + + normalize-path@2.1.1: + resolution: {integrity: sha512-3pKJwH184Xo/lnH6oyP1q2pMd7HcypqqmRs91/6/i2CGtWwIKGCkOOMTm/zXbgTEWHw1uNpNi/igc3ePOYHb6w==} + engines: {node: '>=0.10.0'} + + normalize-path@3.0.0: + resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} + engines: {node: '>=0.10.0'} + + npm-run-path@4.0.1: + resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} + engines: {node: '>=8'} + + npmlog@5.0.1: + resolution: {integrity: sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==} + + number-is-nan@1.0.1: + resolution: {integrity: sha512-4jbtZXNAsfZbAHiiqjLPBiCl16dES1zI4Hpzzxw61Tk+loF+sBDBKx1ICKKKwIqQ7M0mFn1TmkN7euSncWgHiQ==} + engines: {node: '>=0.10.0'} + + oauth@0.10.0: + resolution: {integrity: sha512-1orQ9MT1vHFGQxhuy7E/0gECD3fd2fCC+PIX+/jgmU/gI3EpRocXtmtvxCO5x3WZ443FLTLFWNDjl5MPJf9u+Q==} + + object-assign@4.1.0: + resolution: {integrity: sha512-Lbc7GfN7XFaK30bzUN3cDYLOkT0dH05S0ax1QikylHUD9+Z9PRF3G1iYwX3kcz+6AlzTFGkUgMxz6l3aUwbwTA==} + engines: {node: '>=0.10.0'} + + object-assign@4.1.1: + resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} + engines: {node: '>=0.10.0'} + + object-inspect@1.13.1: + resolution: {integrity: sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==} + + object.omit@2.0.1: + resolution: {integrity: sha512-UiAM5mhmIuKLsOvrL+B0U2d1hXHF3bFYWIuH1LMpuV2EJEHG1Ntz06PgLEHjm6VFd87NpH8rastvPoyv6UW2fA==} + engines: {node: '>=0.10.0'} + + obliterator@2.0.4: + resolution: {integrity: sha512-lgHwxlxV1qIg1Eap7LgIeoBWIMFibOjbrYPIPJZcI1mmGAI2m3lNYpK12Y+GBdPQ0U1hRwSord7GIaawz962qQ==} + + on-exit-leak-free@2.1.2: + resolution: {integrity: sha512-0eJJY6hXLGf1udHwfNftBqH+g73EU4B504nZeKpz1sYRKafAghwxEJunB2O7rDZkL4PGfsMVnTXZ2EjibbqcsA==} + engines: {node: '>=14.0.0'} + + once@1.4.0: + resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + + onetime@5.1.2: + resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} + engines: {node: '>=6'} + + openapi-fuzzer-core@1.0.6: + resolution: {integrity: sha512-FJNJIfgUFuv4NmVGq9MYdoKra2GrkDy2uhIjE2YGlw30UA1glf4SXLMhI4UwdcJ8jisKdIxi7lXrfej8GvNW5w==} + + optionator@0.9.3: + resolution: {integrity: sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==} + engines: {node: '>= 0.8.0'} + + ora@5.4.1: + resolution: {integrity: sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==} + engines: {node: '>=10'} + + ordered-read-streams@0.3.0: + resolution: {integrity: sha512-xQvd8qvx9U1iYY9aVqPpoF5V9uaWJKV6ZGljkh/jkiNX0DiQsjbWvRumbh10QTMDE8DheaOEU8xi0szbrgjzcw==} + + os-homedir@1.0.2: + resolution: {integrity: sha512-B5JU3cabzk8c67mRRd3ECmROafjYMXbuzlwtqdM8IbS8ktlTix8aFGb2bAGKrSRIlnfKwovGUUr72JUPyOb6kQ==} + engines: {node: '>=0.10.0'} + + os-locale@1.4.0: + resolution: {integrity: sha512-PRT7ZORmwu2MEFt4/fv3Q+mEfN4zetKxufQrkShY2oGvUms9r8otu5HfdyIFHkYXjO7laNsoVGmM2MANfuTA8g==} + engines: {node: '>=0.10.0'} + + os-tmpdir@1.0.2: + resolution: {integrity: sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==} + engines: {node: '>=0.10.0'} + + p-limit@1.3.0: + resolution: {integrity: sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==} + engines: {node: '>=4'} + + p-limit@2.3.0: + resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} + engines: {node: '>=6'} + + p-limit@3.1.0: + resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} + engines: {node: '>=10'} + + p-limit@4.0.0: + resolution: {integrity: sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + p-locate@2.0.0: + resolution: {integrity: sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg==} + engines: {node: '>=4'} + + p-locate@3.0.0: + resolution: {integrity: sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==} + engines: {node: '>=6'} + + p-locate@4.1.0: + resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} + engines: {node: '>=8'} + + p-locate@5.0.0: + resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} + engines: {node: '>=10'} + + p-locate@6.0.0: + resolution: {integrity: sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + p-try@1.0.0: + resolution: {integrity: sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww==} + engines: {node: '>=4'} + + p-try@2.2.0: + resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} + engines: {node: '>=6'} + + package-json-from-dist@1.0.1: + resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==} + + pactum-matchers@1.1.7: + resolution: {integrity: sha512-RqwewcUje6vhcYQGbPfdSXkcp/Vtwn4WmmTWLSmqp0CGxBroCEqRg3JMIjkjQTZCd2VmG+tTcQw+n4P/iuqv3Q==} + + pactum@3.7.1: + resolution: {integrity: sha512-r+R1dMy2MfRCQpAHohMyICusiMz14t0E+bhnLDScl2x4lXJKQAvQUGV/WWKUUxN2DS0Jdm0PUj6KjblfcSk1GA==} + engines: {node: '>=10'} + + parent-module@1.0.1: + resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} + engines: {node: '>=6'} + + parse-glob@3.0.4: + resolution: {integrity: sha512-FC5TeK0AwXzq3tUBFtH74naWkPQCEWs4K+xMxWZBlKDWu0bVHXGZa+KKqxKidd7xwhdZ19ZNuF2uO1M/r196HA==} + engines: {node: '>=0.10.0'} + + parse-graphql@1.0.0: + resolution: {integrity: sha512-NjvQHHaiPCxPZrhm/kKnorxOv7r/eA+tE0VW5E8iJMH9wTqFA1V0YK/7nbpxVu3JdXUxyWTKMez9lsHUtAwa0w==} + + parse-json@2.2.0: + resolution: {integrity: sha512-QR/GGaKCkhwk1ePQNYDRKYZ3mwU9ypsKhB0XyFnLQdomyEqk3e8wpW3V5Jp88zbxK4n5ST1nqo+g9juTpownhQ==} + engines: {node: '>=0.10.0'} + + parse-json@4.0.0: + resolution: {integrity: sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==} + engines: {node: '>=4'} + + parse-json@5.2.0: + resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} + engines: {node: '>=8'} + + parse-passwd@1.0.0: + resolution: {integrity: sha512-1Y1A//QUXEZK7YKz+rD9WydcE1+EuPr6ZBgKecAB8tmoW6UFv0NREVJe1p+jRxtThkcbbKkfwIbWJe/IeE6m2Q==} + engines: {node: '>=0.10.0'} + + passport-jwt@4.0.1: + resolution: {integrity: sha512-UCKMDYhNuGOBE9/9Ycuoyh7vP6jpeTp/+sfMJl7nLff/t6dps+iaeE0hhNkKN8/HZHcJ7lCdOyDxHdDoxoSvdQ==} + + passport-local@1.0.0: + resolution: {integrity: sha512-9wCE6qKznvf9mQYYbgJ3sVOHmCWoUNMVFoZzNoznmISbhnNNPhN9xfY3sLmScHMetEJeoY7CXwfhCe7argfQow==} + engines: {node: '>= 0.4.0'} + + passport-strategy@1.0.0: + resolution: {integrity: sha512-CB97UUvDKJde2V0KDWWB3lyf6PC3FaZP7YxZ2G8OAtn9p4HI9j9JLP9qjOGZFvyl8uwNT8qM+hGnz/n16NI7oA==} + engines: {node: '>= 0.4.0'} + + passport@0.7.0: + resolution: {integrity: sha512-cPLl+qZpSc+ireUvt+IzqbED1cHHkDoVYMo30jbJIdOOjQ1MQYZBPiNvmi8UM6lJuOpTPXJGZQk0DtC4y61MYQ==} + engines: {node: '>= 0.4.0'} + + path-dirname@1.0.2: + resolution: {integrity: sha512-ALzNPpyNq9AqXMBjeymIjFDAkAFH06mHJH/cSBHAgU0s4vfpBn6b2nf8tiRLvagKD8RbTpq2FKTBg7cl9l3c7Q==} + + path-exists@2.1.0: + resolution: {integrity: sha512-yTltuKuhtNeFJKa1PiRzfLAU5182q1y4Eb4XCJ3PBqyzEDkAZRzBrKKBct682ls9reBVHf9udYLN5Nd+K1B9BQ==} + engines: {node: '>=0.10.0'} + + path-exists@3.0.0: + resolution: {integrity: sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==} + engines: {node: '>=4'} + + path-exists@4.0.0: + resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} + engines: {node: '>=8'} + + path-exists@5.0.0: + resolution: {integrity: sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + path-is-absolute@1.0.1: + resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} + engines: {node: '>=0.10.0'} + + path-key@3.1.1: + resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} + engines: {node: '>=8'} + + path-parse@1.0.7: + resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + + path-scurry@1.11.1: + resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==} + engines: {node: '>=16 || 14 >=14.18'} + + 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@6.3.0: + resolution: {integrity: sha512-Yhpw4T9C6hPpgPeA28us07OJeqZ5EzQTkbfwuhsUg0c237RomFoETJgmp2sa3F/41gfLE6G5cqcYwznmeEeOlQ==} + + path-type@1.1.0: + resolution: {integrity: sha512-S4eENJz1pkiQn9Znv33Q+deTOKmbl+jj1Fl+qiP/vYezj+S8x+J3Uo0ISrx/QoEvIlOaDWJhPaRd1flJ9HXZqg==} + engines: {node: '>=0.10.0'} + + path-type@3.0.0: + resolution: {integrity: sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==} + engines: {node: '>=4'} + + path-type@4.0.0: + resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} + engines: {node: '>=8'} + + pause@0.0.1: + resolution: {integrity: sha512-KG8UEiEVkR3wGEb4m5yZkVCzigAD+cVEJck2CzYZO37ZGJfctvVptVO192MwrtPhzONn6go8ylnOdMhKqi4nfg==} + + peek-stream@1.1.3: + resolution: {integrity: sha512-FhJ+YbOSBb9/rIl2ZeE/QHEsWn7PqNYt8ARAY3kIgNGOk13g9FGyIY6JIl/xB/3TFRVoTv5as0l11weORrTekA==} + + phin@3.7.1: + resolution: {integrity: sha512-GEazpTWwTZaEQ9RhL7Nyz0WwqilbqgLahDM3D0hxWwmVDI52nXEybHqiN6/elwpkJBhcuj+WbBu+QfT0uhPGfQ==} + engines: {node: '>= 8'} + + picocolors@1.0.0: + resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} + + picomatch@2.3.1: + resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} + engines: {node: '>=8.6'} + + picomatch@4.0.1: + resolution: {integrity: sha512-xUXwsxNjwTQ8K3GnT4pCJm+xq3RUPQbmkYJTP5aFIfNIvbcc/4MUxgBaaRSZJ6yGJZiGSyYlM6MzwTsRk8SYCg==} + engines: {node: '>=12'} + + pify@2.3.0: + resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==} + engines: {node: '>=0.10.0'} + + pify@3.0.0: + resolution: {integrity: sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==} + engines: {node: '>=4'} + + pinkie-promise@2.0.1: + resolution: {integrity: sha512-0Gni6D4UcLTbv9c57DfxDGdr41XfgUjqWZu492f0cIGr16zDU06BWP/RAEvOuo7CQ0CNjHaLlM59YJJFm3NWlw==} + engines: {node: '>=0.10.0'} + + pinkie@2.0.4: + resolution: {integrity: sha512-MnUuEycAemtSaeFSjXKW/aroV7akBbY+Sv+RkyqFjgAe73F+MR0TBWKBRDkmfWq/HiFmdavfZ1G7h4SPZXaCSg==} + engines: {node: '>=0.10.0'} + + pino-abstract-transport@1.1.0: + resolution: {integrity: sha512-lsleG3/2a/JIWUtf9Q5gUNErBqwIu1tUKTT3dUzaf5DySw9ra1wcqKjJjLX1VTY64Wk1eEOYsVGSaGfCK85ekA==} + + pino-abstract-transport@1.2.0: + resolution: {integrity: sha512-Guhh8EZfPCfH+PMXAb6rKOjGQEoy0xlAIn+irODG5kgfYV+BQ0rGYYWTIel3P5mmyXqkYkPmdIkywsn6QKUR1Q==} + + pino-http@10.3.0: + resolution: {integrity: sha512-kaHQqt1i5S9LXWmyuw6aPPqYW/TjoDPizPs4PnDW4hSpajz2Uo/oisNliLf7We1xzpiLacdntmw8yaZiEkppQQ==} + + pino-pretty@11.2.2: + resolution: {integrity: sha512-2FnyGir8nAJAqD3srROdrF1J5BIcMT4nwj7hHSc60El6Uxlym00UbCCd8pYIterstVBFlMyF1yFV8XdGIPbj4A==} + hasBin: true + + pino-std-serializers@6.2.2: + resolution: {integrity: sha512-cHjPPsE+vhj/tnhCy/wiMh3M3z3h/j15zHQX+S9GkTBgqJuTuJzYJ4gUyACLhDaJ7kk9ba9iRDmbH2tJU03OiA==} + + pino-std-serializers@7.0.0: + resolution: {integrity: sha512-e906FRY0+tV27iq4juKzSYPbUj2do2X2JX4EzSca1631EB2QJQUqGbDuERal7LCtOpxl6x3+nvo9NPZcmjkiFA==} + + pino@8.18.0: + resolution: {integrity: sha512-Mz/gKiRyuXu4HnpHgi1YWdHQCoWMufapzooisvFn78zl4dZciAxS+YeRkUxXl1ee/SzU80YCz1zpECCh4oC6Aw==} + hasBin: true + + pino@9.4.0: + resolution: {integrity: sha512-nbkQb5+9YPhQRz/BeQmrWpEknAaqjpAqRK8NwJpmrX/JHu7JuZC5G1CeAwJDJfGes4h+YihC6in3Q2nGb+Y09w==} + hasBin: true + + pirates@4.0.6: + resolution: {integrity: sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==} + engines: {node: '>= 6'} + + pkg-conf@1.1.3: + resolution: {integrity: sha512-9hHgE5+Xai/ChrnahNP8Ke0VNF/s41IZIB/d24eMHEaRamdPg+wwlRm2lTb5wMvE8eTIKrYZsrxfuOwt3dpsIQ==} + engines: {node: '>=0.10.0'} + + pkg-dir@4.2.0: + resolution: {integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==} + engines: {node: '>=8'} + + pluralize-esm@9.0.5: + resolution: {integrity: sha512-Kb2dcpMsIutFw2hYrN0EhsAXOUJTd6FVMIxvNAkZCMQLVt9NGZqQczvGpYDxNWCZeCWLHUPxQIBudWzt1h7VVA==} + engines: {node: '>=14.0.0'} + + pluralize@8.0.0: + resolution: {integrity: sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==} + engines: {node: '>=4'} + + polka@0.5.2: + resolution: {integrity: sha512-FVg3vDmCqP80tOrs+OeNlgXYmFppTXdjD5E7I4ET1NjvtNmQrb1/mJibybKkb/d4NA7YWAr1ojxuhpL3FHqdlw==} + + prelude-ls@1.2.1: + resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} + engines: {node: '>= 0.8.0'} + + preserve@0.2.0: + resolution: {integrity: sha512-s/46sYeylUfHNjI+sA/78FAHlmIuKqI9wNnzEOGehAlUUYeObv5C2mOinXBjyUyWmJ2SfcS2/ydApH4hTF4WXQ==} + engines: {node: '>=0.10.0'} + + prettier-linter-helpers@1.0.0: + resolution: {integrity: sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==} + engines: {node: '>=6.0.0'} + + prettier@2.8.8: + resolution: {integrity: sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==} + engines: {node: '>=10.13.0'} + hasBin: true + + prettier@3.3.3: + resolution: {integrity: sha512-i2tDNA0O5IrMO757lfrdQZCc2jPNDVntV0m/+4whiDfWaTKfMNgR7Qz0NAeGz/nRqF4m5/6CLzbP4/liHt12Ew==} + engines: {node: '>=14'} + hasBin: true + + pretty-format@29.7.0: + resolution: {integrity: sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + prisma-nested-middleware@4.0.0: + resolution: {integrity: sha512-WSx0nl7KNXEzGaNC87fuDBOdAjj3V6um/JoQUo24PaMzMy8tvOYfb2Mw25OZhnrMXNTBhqgk4rJTUW3CVcDsHQ==} + peerDependencies: + '@prisma/client': '*' + + prisma-soft-delete-middleware@1.3.1: + resolution: {integrity: sha512-oQ2Ba8wb23ho6PqMXkOSTQTXNKouLmZuILYDHrnKk1Ui3cGIXuj9zNWyJkoaTcWHznsiAaoP1Oy8ytDhwQNQqA==} + peerDependencies: + '@prisma/client': '*' + + prisma@5.20.0: + resolution: {integrity: sha512-6obb3ucKgAnsGS9x9gLOe8qa51XxvJ3vLQtmyf52CTey1Qcez3A6W6ROH5HIz5Q5bW+0VpmZb8WBohieMFGpig==} + engines: {node: '>=16.13'} + hasBin: true + + process-nextick-args@1.0.7: + resolution: {integrity: sha512-yN0WQmuCX63LP/TMvAg31nvT6m4vDqJEiiv2CAZqWOGNWutc9DfDk1NPYYmKUFmaVM2UwDowH4u5AHWYP/jxKw==} + + process-nextick-args@2.0.1: + resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} + + process-warning@3.0.0: + resolution: {integrity: sha512-mqn0kFRl0EoqhnL0GQ0veqFHyIN1yig9RHh/InzORTUiZHFRAur+aMtRkELNwGs9aNwKS6tg/An4NYBPGwvtzQ==} + + process-warning@4.0.0: + resolution: {integrity: sha512-/MyYDxttz7DfGMMHiysAsFE4qF+pQYAA8ziO/3NcRVrQ5fSk+Mns4QZA/oRPFzvcqNoVJXQNWNAsdwBXLUkQKw==} + + process@0.11.10: + resolution: {integrity: sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==} + engines: {node: '>= 0.6.0'} + + promise-coalesce@1.1.2: + resolution: {integrity: sha512-zLaJ9b8hnC564fnJH6NFSOGZYYdzrAJn2JUUIwzoQb32fG2QAakpDNM+CZo1km6keXkRXRM+hml1BFAPVnPkxg==} + engines: {node: '>=16'} + + prompts@2.4.2: + resolution: {integrity: sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==} + engines: {node: '>= 6'} + + proxy-addr@2.0.7: + resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==} + engines: {node: '>= 0.10'} + + proxy-from-env@1.1.0: + resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} + + pump@3.0.0: + resolution: {integrity: sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==} + + pumpify@2.0.1: + resolution: {integrity: sha512-m7KOje7jZxrmutanlkS1daj1dS6z6BgslzOXmcSEpIlCxM3VJH7lG5QLeck/6hgF6F4crFf01UtQmNsJfweTAw==} + + punycode@2.3.1: + resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} + engines: {node: '>=6'} + + pure-rand@6.0.4: + resolution: {integrity: sha512-LA0Y9kxMYv47GIPJy6MI84fqTd2HmYZI83W/kM/SkKfDlajnZYfmXFTxkbY+xSBPkLJxltMa9hIkmdc29eguMA==} + + q@1.5.1: + resolution: {integrity: sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==} + engines: {node: '>=0.6.0', teleport: '>=0.2.0'} + + qs@6.11.2: + resolution: {integrity: sha512-tDNIz22aBzCDxLtVH++VnTfzxlfeK5CbqohpSqpJgj1Wg/cQbStNAz3NuqCs5vV+pjBsK4x4pN9HlVh7rcYRiA==} + engines: {node: '>=0.6'} + + queue-microtask@1.2.3: + resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + + quick-format-unescaped@4.0.4: + resolution: {integrity: sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg==} + + quick-lru@4.0.1: + resolution: {integrity: sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==} + engines: {node: '>=8'} + + randomatic@3.1.1: + resolution: {integrity: sha512-TuDE5KxZ0J461RVjrJZCJc+J+zCkTb1MbH9AQUq68sMhOMcy9jLcb3BrZKgp9q9Ncltdg4QVqWrH02W2EFFVYw==} + engines: {node: '>= 0.10.0'} + + randombytes@2.1.0: + resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} + + react-is@18.2.0: + resolution: {integrity: sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==} + + read-pkg-up@1.0.1: + resolution: {integrity: sha512-WD9MTlNtI55IwYUS27iHh9tK3YoIVhxis8yKhLpTqWtml739uXc9NWTpxoHkfZf3+DkCCsXox94/VWZniuZm6A==} + engines: {node: '>=0.10.0'} + + read-pkg-up@3.0.0: + resolution: {integrity: sha512-YFzFrVvpC6frF1sz8psoHDBGF7fLPc+llq/8NB43oagqWkx8ar5zYtsTORtOjw9W2RHLpWP+zTWwBvf1bCmcSw==} + engines: {node: '>=4'} + + read-pkg-up@7.0.1: + resolution: {integrity: sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==} + engines: {node: '>=8'} + + read-pkg@1.1.0: + resolution: {integrity: sha512-7BGwRHqt4s/uVbuyoeejRn4YmFnYZiFl4AuaeXHlgZf3sONF0SOGlxs2Pw8g6hCKupo08RafIO5YXFNOKTfwsQ==} + engines: {node: '>=0.10.0'} + + read-pkg@3.0.0: + resolution: {integrity: sha512-BLq/cCO9two+lBgiTYNqD6GdtK8s4NpaWrl6/rCO9w0TUS8oJl7cmToOZfRYllKTISY6nt1U7jQ53brmKqY6BA==} + engines: {node: '>=4'} + + read-pkg@5.2.0: + resolution: {integrity: sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==} + engines: {node: '>=8'} + + readable-stream@1.0.34: + resolution: {integrity: sha512-ok1qVCJuRkNmvebYikljxJA/UEsKwLl2nI1OmaqAu4/UE+h0wKCHok4XkL/gvi39OacXvw59RJUOFUkDib2rHg==} + + readable-stream@2.0.6: + resolution: {integrity: sha512-TXcFfb63BQe1+ySzsHZI/5v1aJPCShfqvWJ64ayNImXMsN1Cd0YGk/wm8KB7/OeessgPc9QvS9Zou8QTkFzsLw==} + + 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'} + + readable-stream@4.5.2: + resolution: {integrity: sha512-yjavECdqeZ3GLXNgRXgeQEdz9fvDDkNKyHnbHRFtOr7/LcfgBcmct7t/ET+HaCTqfh06OzoAxrkN/IfjJBVe+g==} + 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'} + + real-require@0.2.0: + resolution: {integrity: sha512-57frrGM/OCTLqLOAh0mhVA9VBMHd+9U7Zb2THMGdBUoZVOtGbJzjxsYGDJ3A9AYYCP4hn6y1TVbaOfzWtm5GFg==} + engines: {node: '>= 12.13.0'} + + redent@3.0.0: + resolution: {integrity: sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==} + engines: {node: '>=8'} + + reflect-metadata@0.2.2: + resolution: {integrity: sha512-urBwgfrvVP/eAyXx4hluJivBKzuEbSQs9rKWCrCkbSxNv8mxPcUZKeuoF3Uy4mJl3Lwprp6yy5/39VWigZ4K6Q==} + + regex-cache@0.4.4: + resolution: {integrity: sha512-nVIZwtCjkC9YgvWkpM55B5rBhBYRZhAaJbgcFYXXsHnbZ9UZI9nnVWYZpBlCqv9ho2eZryPnWrZGsOdPwVWXWQ==} + engines: {node: '>=0.10.0'} + + remove-trailing-separator@1.1.0: + resolution: {integrity: sha512-/hS+Y0u3aOfIETiaiirUFwDBDzmXPvO+jAfKTitUngIPzdKc6Z0LoFjM/CK5PL4C+eKwHohlHAb6H0VFfmmUsw==} + + repeat-element@1.1.4: + resolution: {integrity: sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ==} + engines: {node: '>=0.10.0'} + + repeat-string@1.6.1: + resolution: {integrity: sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==} + engines: {node: '>=0.10'} + + replace-ext@0.0.1: + resolution: {integrity: sha512-AFBWBy9EVRTa/LhEcG8QDP3FvpwZqmvN2QFDuJswFeaVhWnZMp8q3E6Zd90SR04PlIwfGdyVjNyLPyen/ek5CQ==} + engines: {node: '>= 0.4'} + + require-directory@2.1.1: + resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} + engines: {node: '>=0.10.0'} + + require-from-string@2.0.2: + resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} + engines: {node: '>=0.10.0'} + + require-main-filename@1.0.1: + resolution: {integrity: sha512-IqSUtOVP4ksd1C/ej5zeEh/BIP2ajqpn8c5x+q99gvcIG/Qf0cud5raVnE/Dwd0ua9TXYDoDc0RE5hBSdz22Ug==} + + resolve-cwd@3.0.0: + resolution: {integrity: sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==} + engines: {node: '>=8'} + + resolve-dir@1.0.1: + resolution: {integrity: sha512-R7uiTjECzvOsWSfdM0QKFNBVFcK27aHOUwdvK53BcW8zqnGdYp0Fbj82cy54+2A4P2tFM22J5kRfe1R+lM/1yg==} + engines: {node: '>=0.10.0'} + + resolve-from@4.0.0: + resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} + engines: {node: '>=4'} + + resolve-from@5.0.0: + resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} + engines: {node: '>=8'} + + resolve-url@0.2.1: + resolution: {integrity: sha512-ZuF55hVUQaaczgOIwqWzkEcEidmlD/xl44x1UZnhOXcYuFN2S6+rcxpG+C1N3So0wvNI3DmJICUFfu2SxhBmvg==} + deprecated: https://github.com/lydell/resolve-url#deprecated + + resolve.exports@2.0.2: + resolution: {integrity: sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg==} + engines: {node: '>=10'} + + resolve@1.22.8: + resolution: {integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==} + hasBin: true + + restore-cursor@3.1.0: + resolution: {integrity: sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==} + engines: {node: '>=8'} + + ret@0.4.3: + resolution: {integrity: sha512-0f4Memo5QP7WQyUEAYUO3esD/XjOc3Zjjg5CPsAq1p8sIu0XPeMbHJemKA0BO7tV0X7+A0FoEpbmHXWxPyD3wQ==} + engines: {node: '>=10'} + + reusify@1.0.4: + resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} + engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + + rfdc@1.3.1: + resolution: {integrity: sha512-r5a3l5HzYlIC68TpmYKlxWjmOP6wiPJ1vWv2HeLhNsRZMrCkxeqxiHlQ21oXmQ4F3SiryXBHhAD7JZqvOJjFmg==} + + rimraf@3.0.2: + resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} + deprecated: Rimraf versions prior to v4 are no longer supported + hasBin: true + + rimraf@5.0.10: + resolution: {integrity: sha512-l0OE8wL34P4nJH/H2ffoaniAokM2qSmrtXHmlpvYr5AVVX8msAyW0l8NVJFDxlSK4u3Uh/f41cQheDVdnYijwQ==} + hasBin: true + + run-async@2.4.1: + resolution: {integrity: sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==} + engines: {node: '>=0.12.0'} + + run-async@3.0.0: + resolution: {integrity: sha512-540WwVDOMxA6dN6We19EcT9sc3hkXPw5mzRNGM3FkdN/vtE9NFvj5lFAPNwUDmJjXidm3v7TC1cTE7t17Ulm1Q==} + engines: {node: '>=0.12.0'} + + run-parallel@1.2.0: + resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + + rxjs@6.6.7: + resolution: {integrity: sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==} + engines: {npm: '>=2.0.0'} + + rxjs@7.8.1: + resolution: {integrity: sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==} + + safe-buffer@5.1.2: + resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} + + safe-buffer@5.2.1: + resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + + safe-regex2@3.1.0: + resolution: {integrity: sha512-RAAZAGbap2kBfbVhvmnTFv73NWLMvDGOITFYTZBAaY8eR+Ir4ef7Up/e7amo+y1+AH+3PtLkrt9mvcTsG9LXug==} + + safe-stable-stringify@2.4.3: + resolution: {integrity: sha512-e2bDA2WJT0wxseVd4lsDP4+3ONX6HpMXQa1ZhFQ7SU+GjvORCmShbCMltrtIDfkYhVHrOcPtj+KhmDBdPdZD1g==} + engines: {node: '>=10'} + + safer-buffer@2.1.2: + resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} + + schema-utils@3.3.0: + resolution: {integrity: sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==} + engines: {node: '>= 10.13.0'} + + secure-json-parse@2.7.0: + resolution: {integrity: sha512-6aU+Rwsezw7VR8/nyvKTx8QpWH9FrcYiXXlqC4z5d5XQBDRqtbfsRjnwGyqbi3gddNtWHuEk9OANUotL26qKUw==} + + semver@5.7.2: + resolution: {integrity: sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==} + hasBin: true + + semver@6.3.1: + resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} + hasBin: true + + semver@7.6.0: + resolution: {integrity: sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==} + engines: {node: '>=10'} + hasBin: true + + semver@7.6.3: + resolution: {integrity: sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==} + engines: {node: '>=10'} + hasBin: true + + serialize-javascript@6.0.2: + resolution: {integrity: sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==} + + set-blocking@2.0.0: + resolution: {integrity: sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==} + + set-cookie-parser@2.6.0: + resolution: {integrity: sha512-RVnVQxTXuerk653XfuliOxBP81Sf0+qfQE73LIYKcyMYHG94AuH0kgrQpRDuTZnSmjpysHmzxJXKNfa6PjFhyQ==} + + set-function-length@1.2.1: + resolution: {integrity: sha512-j4t6ccc+VsKwYHso+kElc5neZpjtq9EnRICFZtWyBsLojhmeF/ZBd/elqm22WJh/BziDe/SBiOeAt0m2mfLD0g==} + engines: {node: '>= 0.4'} + + setprototypeof@1.2.0: + resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} + + shebang-command@2.0.0: + resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} + engines: {node: '>=8'} + + shebang-regex@3.0.0: + resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} + engines: {node: '>=8'} + + side-channel@1.0.5: + resolution: {integrity: sha512-QcgiIWV4WV7qWExbN5llt6frQB/lBven9pqliLXfGPB+K9ZYXxDozp0wLkHS24kWCm+6YXH/f0HhnObZnZOBnQ==} + engines: {node: '>= 0.4'} + + signal-exit@3.0.7: + resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} + + signal-exit@4.1.0: + resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} + engines: {node: '>=14'} + + sisteransi@1.0.5: + resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} + + slash@3.0.0: + resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} + engines: {node: '>=8'} + + sonic-boom@3.8.0: + resolution: {integrity: sha512-ybz6OYOUjoQQCQ/i4LU8kaToD8ACtYP+Cj5qd2AO36bwbdewxWJ3ArmJ2cr6AvxlL2o0PqnCcPGUgkILbfkaCA==} + + sonic-boom@4.1.0: + resolution: {integrity: sha512-NGipjjRicyJJ03rPiZCJYjwlsuP2d1/5QUviozRXC7S3WdVWNK5e3Ojieb9CCyfhq2UC+3+SRd9nG3I2lPRvUw==} + + source-map-resolve@0.5.3: + resolution: {integrity: sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==} + deprecated: See https://github.com/lydell/source-map-resolve#deprecated + + source-map-support@0.5.13: + resolution: {integrity: sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==} + + source-map-support@0.5.21: + resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} + + source-map-url@0.4.1: + resolution: {integrity: sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw==} + deprecated: See https://github.com/lydell/source-map-url#deprecated + + source-map@0.6.1: + resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} + engines: {node: '>=0.10.0'} + + source-map@0.7.3: + resolution: {integrity: sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==} + engines: {node: '>= 8'} + + source-map@0.7.4: + resolution: {integrity: sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==} + engines: {node: '>= 8'} + + sourcemap-codec@1.4.8: + resolution: {integrity: sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==} + deprecated: Please use @jridgewell/sourcemap-codec instead + + spdx-correct@3.2.0: + resolution: {integrity: sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==} + + spdx-exceptions@2.4.0: + resolution: {integrity: sha512-hcjppoJ68fhxA/cjbN4T8N6uCUejN8yFw69ttpqtBeCbF3u13n7mb31NB9jKwGTTWWnt9IbRA/mf1FprYS8wfw==} + + spdx-expression-parse@3.0.1: + resolution: {integrity: sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==} + + spdx-license-ids@3.0.17: + resolution: {integrity: sha512-sh8PWc/ftMqAAdFiBu6Fy6JUOYjqDJBJvIhpfDMyHrr0Rbp5liZqd4TjtQ/RgfLjKFZb+LMx5hpml5qOWy0qvg==} + + split2@3.2.2: + resolution: {integrity: sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg==} + + split2@4.2.0: + resolution: {integrity: sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==} + engines: {node: '>= 10.x'} + + split@1.0.1: + resolution: {integrity: sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg==} + + sprintf-js@1.0.3: + resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} + + stack-utils@2.0.6: + resolution: {integrity: sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==} + engines: {node: '>=10'} + + standard-version@9.5.0: + resolution: {integrity: sha512-3zWJ/mmZQsOaO+fOlsa0+QK90pwhNd042qEcw6hKFNoLFs7peGyvPffpEBbK/DSGPbyOvli0mUIFv5A4qTjh2Q==} + engines: {node: '>=10'} + hasBin: true + + statuses@2.0.1: + resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==} + engines: {node: '>= 0.8'} + + stream-shift@1.0.3: + resolution: {integrity: sha512-76ORR0DO1o1hlKwTbi/DM3EXWGf3ZJYO8cXX5RJwnul2DEg2oyoZyjLNoQM8WsvZiFKCRfC1O0J7iCvie3RZmQ==} + + stream-wormhole@1.1.0: + resolution: {integrity: sha512-gHFfL3px0Kctd6Po0M8TzEvt3De/xu6cnRrjlfYNhwbhLPLwigI2t1nc6jrzNuaYg5C4YF78PPFuQPzRiqn9ew==} + engines: {node: '>=4.0.0'} + + string-length@4.0.2: + resolution: {integrity: sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==} + engines: {node: '>=10'} + + string-width@1.0.2: + resolution: {integrity: sha512-0XsVpQLnVCXHJfyEs8tC0zpTVIr5PKKsQtkT29IwupnPTjtPmQ3xT/4yCREF9hYkV/3M3kzcUTSAZT6a6h81tw==} + engines: {node: '>=0.10.0'} + + string-width@4.2.3: + resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} + engines: {node: '>=8'} + + string-width@5.1.2: + resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} + engines: {node: '>=12'} + + string_decoder@0.10.31: + resolution: {integrity: sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==} + + 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==} + + stringify-package@1.0.1: + resolution: {integrity: sha512-sa4DUQsYciMP1xhKWGuFM04fB0LG/9DlluZoSVywUMRNvzid6XucHK0/90xGxRoHrAaROrcHK1aPKaijCtSrhg==} + deprecated: This module is not used anymore, and has been replaced by @npmcli/package-json + + strip-ansi@3.0.1: + resolution: {integrity: sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==} + engines: {node: '>=0.10.0'} + + strip-ansi@6.0.1: + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} + engines: {node: '>=8'} + + strip-ansi@7.1.0: + resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} + engines: {node: '>=12'} + + strip-bom-stream@1.0.0: + resolution: {integrity: sha512-7jfJB9YpI2Z0aH3wu10ZqitvYJaE0s5IzFuWE+0pbb4Q/armTloEUShymkDO47YSLnjAW52mlXT//hs9wXNNJQ==} + engines: {node: '>=0.10.0'} + + strip-bom@2.0.0: + resolution: {integrity: sha512-kwrX1y7czp1E69n2ajbG65mIo9dqvJ+8aBQXOGVxqwvNbsXdFM6Lq37dLAY3mknUwru8CfcCbfOLL/gMo+fi3g==} + engines: {node: '>=0.10.0'} + + strip-bom@3.0.0: + resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} + engines: {node: '>=4'} + + strip-bom@4.0.0: + resolution: {integrity: sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==} + engines: {node: '>=8'} + + strip-final-newline@2.0.0: + resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} + engines: {node: '>=6'} + + strip-indent@3.0.0: + resolution: {integrity: sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==} + engines: {node: '>=8'} + + strip-json-comments@3.1.1: + resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} + engines: {node: '>=8'} + + superagent@8.1.2: + resolution: {integrity: sha512-6WTxW1EB6yCxV5VFOIPQruWGHqc3yI7hEmZK6h+pyk69Lk/Ut7rLUY6W/ONF2MjBuGjvmMiIpsrVJ2vjrHlslA==} + engines: {node: '>=6.4.0 <13 || >=14'} + + supertest@6.3.3: + resolution: {integrity: sha512-EMCG6G8gDu5qEqRQ3JjjPs6+FYT1a7Hv5ApHvtSghmOFJYtsU5S+pSb6Y2EUeCEY3CmEL3mmQ8YWlPOzQomabA==} + engines: {node: '>=6.4.0'} + + supports-color@2.0.0: + resolution: {integrity: sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==} + engines: {node: '>=0.8.0'} + + supports-color@5.5.0: + resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} + engines: {node: '>=4'} + + supports-color@7.2.0: + resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} + engines: {node: '>=8'} + + supports-color@8.1.1: + resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} + engines: {node: '>=10'} + + supports-preserve-symlinks-flag@1.0.0: + resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} + engines: {node: '>= 0.4'} + + swagger-ui-dist@5.17.14: + resolution: {integrity: sha512-CVbSfaLpstV65OnSjbXfVd6Sta3q3F7Cj/yYuvHMp1P90LztOLs6PfUnKEVAeiIVQt9u2SaPwv0LiH/OyMjHRw==} + + symbol-observable@4.0.0: + resolution: {integrity: sha512-b19dMThMV4HVFynSAM1++gBHAbk2Tc/osgLIBZMKsyqh34jb2e8Os7T6ZW/Bt3pJFdBTd2JwAnAAEQV7rSNvcQ==} + engines: {node: '>=0.10'} + + symbol@0.2.3: + resolution: {integrity: sha512-IUW+ek7apEaW5bFhS6WpYoNtVpNTlNoqB/PH7YiMWQTxSPeXCzG4PILVakwXivJt3ZXWeO1fIJnUd/L9A/VeGA==} + + synckit@0.9.2: + resolution: {integrity: sha512-vrozgXDQwYO72vHjUb/HnFbQx1exDjoKzqx23aXEg2a9VIg2TSFZ8FmeZpTjUCFMYw7mpX4BE2SFu8wI7asYsw==} + engines: {node: ^14.18.0 || >=16.0.0} + + tapable@2.2.1: + resolution: {integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==} + engines: {node: '>=6'} + + tar@6.2.0: + resolution: {integrity: sha512-/Wo7DcT0u5HUV486xg675HtjNd3BXZ6xDbzsCUZPt5iw8bTQ63bP0Raut3mvro9u+CUyq7YQd8Cx55fsZXxqLQ==} + engines: {node: '>=10'} + + tar@7.4.3: + resolution: {integrity: sha512-5S7Va8hKfV7W5U6g3aYxXmlPoZVAwUMy9AOKyF2fVuZa2UD3qZjg578OrLRt8PcNN1PleVaL/5/yYATNL0ICUw==} + engines: {node: '>=18'} + + terser-webpack-plugin@5.3.10: + resolution: {integrity: sha512-BKFPWlPDndPs+NGGCr1U59t0XScL5317Y0UReNrHaw9/FwhPENlq6bfgs+4yPfyP51vqC1bQ4rp1EfXW5ZSH9w==} + engines: {node: '>= 10.13.0'} + peerDependencies: + '@swc/core': '*' + esbuild: '*' + uglify-js: '*' + webpack: ^5.1.0 + peerDependenciesMeta: + '@swc/core': + optional: true + esbuild: + optional: true + uglify-js: + optional: true + + terser@5.27.0: + resolution: {integrity: sha512-bi1HRwVRskAjheeYl291n3JC4GgO/Ty4z1nVs5AAsmonJulGxpSektecnNedrwK9C7vpvVtcX3cw00VSLt7U2A==} + engines: {node: '>=10'} + hasBin: true + + test-exclude@6.0.0: + resolution: {integrity: sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==} + engines: {node: '>=8'} + + text-extensions@1.9.0: + resolution: {integrity: sha512-wiBrwC1EhBelW12Zy26JeOUkQ5mRu+5o8rpsJk5+2t+Y5vE7e842qtZDQ2g1NpX/29HdyFeJ4nSIhI47ENSxlQ==} + engines: {node: '>=0.10'} + + text-extensions@2.4.0: + resolution: {integrity: sha512-te/NtwBwfiNRLf9Ijqx3T0nlqZiQ2XrrtBvu+cLL8ZRrGkO0NHTug8MYFKyoSrv/sHTaSKfilUkizV6XhxMJ3g==} + engines: {node: '>=8'} + + text-table@0.2.0: + resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} + + thread-stream@2.4.1: + resolution: {integrity: sha512-d/Ex2iWd1whipbT681JmTINKw0ZwOUBZm7+Gjs64DHuX34mmw8vJL2bFAaNacaW72zYiTJxSHi5abUuOi5nsfg==} + + thread-stream@3.1.0: + resolution: {integrity: sha512-OqyPZ9u96VohAyMfJykzmivOrY2wfMSf3C5TtFJVgN+Hm6aj+voFhlK+kZEIv2FBh1X6Xp3DlnCOfEQ3B2J86A==} + + through2-filter@2.0.0: + resolution: {integrity: sha512-miwWajb1B80NvIVKXFPN/o7+vJc4jYUvnZCwvhicRAoTxdD9wbcjri70j+BenCrN/JXEPKDjhpw4iY7yiNsCGg==} + + through2-filter@3.0.0: + resolution: {integrity: sha512-jaRjI2WxN3W1V8/FMZ9HKIBXixtiqs3SQSX4/YGIiP3gL6djW48VoZq9tDqeCWs3MT8YY5wb/zli8VW8snY1CA==} + + through2@0.6.5: + resolution: {integrity: sha512-RkK/CCESdTKQZHdmKICijdKKsCRVHs5KsLZ6pACAmF/1GPUQhonHSXWNERctxEp7RmvjdNbZTL5z9V7nSCXKcg==} + + through2@2.0.5: + resolution: {integrity: sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==} + + through2@4.0.2: + resolution: {integrity: sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==} + + through@2.3.8: + resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==} + + tildify@1.2.0: + resolution: {integrity: sha512-Y9q1GaV/BO65Z9Yf4NOGMuwt3SGdptkZBnaaKfTQakrDyCLiuO1Kc5wxW4xLdsjzunRtqtOdhekiUFmZbklwYQ==} + engines: {node: '>=0.10.0'} + + tinyexec@0.3.0: + resolution: {integrity: sha512-tVGE0mVJPGb0chKhqmsoosjsS+qUnJVGJpZgsHYQcGoPlG3B51R3PouqTgEGH2Dc9jjFyOqOpix6ZHNMXp1FZg==} + + tmp@0.0.33: + resolution: {integrity: sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==} + engines: {node: '>=0.6.0'} + + tmpl@1.0.5: + resolution: {integrity: sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==} + + to-absolute-glob@0.1.1: + resolution: {integrity: sha512-Vvl5x6zNf9iVG1QTWeknmWrKzZxaeKfIDRibrZCR3b2V/2NlFJuD2HV7P7AVjaKLZNqLPHqyr0jGrW0fTcxCPQ==} + engines: {node: '>=0.10.0'} + + to-fast-properties@2.0.0: + resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==} + engines: {node: '>=4'} + + to-regex-range@5.0.1: + resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} + engines: {node: '>=8.0'} + + toad-cache@3.7.0: + resolution: {integrity: sha512-/m8M+2BJUpoJdgAHoG+baCwBT+tf2VraSfkBgl0Y00qIWt41DJ8R5B8nsEw0I58YwF5IZH6z24/2TobDKnqSWw==} + engines: {node: '>=12'} + + toidentifier@1.0.1: + resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} + engines: {node: '>=0.6'} + + tr46@0.0.3: + resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} + + tree-kill@1.2.2: + resolution: {integrity: sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==} + hasBin: true + + trim-newlines@3.0.1: + resolution: {integrity: sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==} + engines: {node: '>=8'} + + trouter@2.0.1: + resolution: {integrity: sha512-kr8SKKw94OI+xTGOkfsvwZQ8mWoikZDd2n8XZHjJVZUARZT+4/VV6cacRS6CLsH9bNm+HFIPU1Zx4CnNnb4qlQ==} + engines: {node: '>=6'} + + ts-api-utils@1.3.0: + resolution: {integrity: sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==} + engines: {node: '>=16'} + peerDependencies: + typescript: '>=4.2.0' + + ts-jest@29.1.0: + resolution: {integrity: sha512-ZhNr7Z4PcYa+JjMl62ir+zPiNJfXJN6E8hSLnaUKhOgqcn8vb3e537cpkd0FuAfRK3sR1LSqM1MOhliXNgOFPA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + hasBin: true + peerDependencies: + '@babel/core': '>=7.0.0-beta.0 <8' + '@jest/types': ^29.0.0 + babel-jest: ^29.0.0 + esbuild: '*' + jest: ^29.0.0 + typescript: '>=4.3 <6' + peerDependenciesMeta: + '@babel/core': + optional: true + '@jest/types': + optional: true + babel-jest: + optional: true + esbuild: + optional: true + + ts-jest@29.2.5: + resolution: {integrity: sha512-KD8zB2aAZrcKIdGk4OwpJggeLcH1FgrICqDSROWqlnJXGCXK4Mn6FcdK2B6670Xr73lHMG1kHw8R87A0ecZ+vA==} + engines: {node: ^14.15.0 || ^16.10.0 || ^18.0.0 || >=20.0.0} + hasBin: true + peerDependencies: + '@babel/core': '>=7.0.0-beta.0 <8' + '@jest/transform': ^29.0.0 + '@jest/types': ^29.0.0 + babel-jest: ^29.0.0 + esbuild: '*' + jest: ^29.0.0 + typescript: '>=4.3 <6' + peerDependenciesMeta: + '@babel/core': + optional: true + '@jest/transform': + optional: true + '@jest/types': + optional: true + babel-jest: + optional: true + esbuild: + optional: true + + ts-loader@9.5.1: + resolution: {integrity: sha512-rNH3sK9kGZcH9dYzC7CewQm4NtxJTjSEVRJ2DyBZR7f8/wcta+iV44UPCXc5+nzDzivKtlzV6c9P4e+oFhDLYg==} + engines: {node: '>=12.0.0'} + peerDependencies: + typescript: '*' + webpack: ^5.0.0 + + ts-node@10.9.2: + resolution: {integrity: sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==} + hasBin: true + peerDependencies: + '@swc/core': '>=1.2.50' + '@swc/wasm': '>=1.2.50' + '@types/node': '*' + typescript: '>=2.7' + peerDependenciesMeta: + '@swc/core': + optional: true + '@swc/wasm': + optional: true + + ts-toolbelt@9.6.0: + resolution: {integrity: sha512-nsZd8ZeNUzukXPlJmTBwUAuABDe/9qtVDelJeT/qW0ow3ZS3BsQJtNkan1802aM9Uf68/Y8ljw86Hu0h5IUW3w==} + + tsconfig-paths-webpack-plugin@4.1.0: + resolution: {integrity: sha512-xWFISjviPydmtmgeUAuXp4N1fky+VCtfhOkDUFIv5ea7p4wuTomI4QTrXvFBX2S4jZsmyTSrStQl+E+4w+RzxA==} + engines: {node: '>=10.13.0'} + + tsconfig-paths@4.2.0: + resolution: {integrity: sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg==} + engines: {node: '>=6'} + + tslib@1.14.1: + resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==} + + tslib@2.5.0: + resolution: {integrity: sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==} + + tslib@2.6.2: + resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==} + + tslib@2.7.0: + resolution: {integrity: sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA==} + + type-check@0.4.0: + resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} + engines: {node: '>= 0.8.0'} + + type-detect@4.0.8: + resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==} + engines: {node: '>=4'} + + type-fest@0.18.1: + resolution: {integrity: sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==} + engines: {node: '>=10'} + + type-fest@0.21.3: + resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==} + engines: {node: '>=10'} + + type-fest@0.6.0: + resolution: {integrity: sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==} + engines: {node: '>=8'} + + type-fest@0.8.1: + resolution: {integrity: sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==} + engines: {node: '>=8'} + + typedarray@0.0.6: + resolution: {integrity: sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==} + + typedarray@0.0.7: + resolution: {integrity: sha512-ueeb9YybpjhivjbHP2LdFDAjbS948fGEPj+ACAMs4xCMmh72OCOMQWBQKlaN4ZNQ04yfLSDLSx1tGRIoWimObQ==} + + typescript@5.0.4: + resolution: {integrity: sha512-cW9T5W9xY37cc+jfEnaUvX91foxtHkza3Nw3wkoF4sSlKn0MONdkdEndig/qPBWXNkmplh3NzayQzCiHM4/hqw==} + engines: {node: '>=12.20'} + hasBin: true + + typescript@5.3.3: + resolution: {integrity: sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw==} + engines: {node: '>=14.17'} + hasBin: true + + typescript@5.6.3: + resolution: {integrity: sha512-hjcS1mhfuyi4WW8IWtjP7brDrG2cuDZukyrYrSauoXGNgx0S7zceP07adYkJycEr56BOUTNPzbInooiN3fn1qw==} + engines: {node: '>=14.17'} + hasBin: true + + uglify-js@3.17.4: + resolution: {integrity: sha512-T9q82TJI9e/C1TAxYvfb16xO120tMVFZrGA3f9/P4424DNu6ypK103y0GPFVa17yotwSyZW5iYXgjYHkGrJW/g==} + engines: {node: '>=0.8.0'} + hasBin: true + + uid@2.0.2: + resolution: {integrity: sha512-u3xV3X7uzvi5b1MncmZo3i2Aw222Zk1keqLA1YkHldREkAhAqi65wuPfe7lHx8H/Wzy+8CE7S7uS3jekIM5s8g==} + engines: {node: '>=8'} + + undici-types@6.19.8: + resolution: {integrity: sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==} + + unicorn-magic@0.1.0: + resolution: {integrity: sha512-lRfVq8fE8gz6QMBuDM6a+LO3IAzTi05H6gCVaUpir2E1Rwpo4ZUog45KpNXKC/Mn3Yb9UDuHumeFTo9iV/D9FQ==} + engines: {node: '>=18'} + + unique-stream@2.3.1: + resolution: {integrity: sha512-2nY4TnBE70yoxHkDli7DMazpWiP7xMdCYqU2nBRO0UB+ZpEkGsSija7MvmvnZFUeC+mrgiUfcHSr3LmRFIg4+A==} + + universalify@2.0.1: + resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==} + engines: {node: '>= 10.0.0'} + + update-browserslist-db@1.0.13: + resolution: {integrity: sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==} + hasBin: true + peerDependencies: + browserslist: '>= 4.21.0' + + uri-js@4.4.1: + resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} + + urix@0.1.0: + resolution: {integrity: sha512-Am1ousAhSLBeB9cG/7k7r2R0zj50uDRlZHPGbazid5s9rlF1F/QKYObEKSIunSjIOkJZqwRRLpvewjEkM7pSqg==} + deprecated: Please see https://github.com/lydell/urix#deprecated + + util-deprecate@1.0.2: + resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + + utils-merge@1.0.1: + resolution: {integrity: sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==} + engines: {node: '>= 0.4.0'} + + v8-compile-cache-lib@3.0.1: + resolution: {integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==} + + v8-to-istanbul@9.2.0: + resolution: {integrity: sha512-/EH/sDgxU2eGxajKdwLCDmQ4FWq+kpi3uCmBGpw1xJtnAxEjlD8j8PEiGWpCIMIs3ciNAgH0d3TTJiUkYzyZjA==} + engines: {node: '>=10.12.0'} + + vali-date@1.0.0: + resolution: {integrity: sha512-sgECfZthyaCKW10N0fm27cg8HYTFK5qMWgypqkXMQ4Wbl/zZKx7xZICgcoxIIE+WFAP/MBL2EFwC/YvLxw3Zeg==} + engines: {node: '>=0.10.0'} + + validate-npm-package-license@3.0.4: + resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==} + + validator@13.11.0: + resolution: {integrity: sha512-Ii+sehpSfZy+At5nPdnyMhx78fEoPDkR2XW/zimHEL3MyGJQOCQ7WeP20jPYRz7ZCpcKLB21NxuXHF3bxjStBQ==} + engines: {node: '>= 0.10'} + + vinyl-fs@2.4.3: + resolution: {integrity: sha512-XxYoy5HpHrVd76tpnI5Vv/+b/xlEVusOmn4LjQ01s2JyiDMNaUm3Rb7Y3xTkRw+YoRBVoUrCs7EAIFNXyIlI8Q==} + engines: {node: '>=0.10'} + + vinyl@1.2.0: + resolution: {integrity: sha512-Ci3wnR2uuSAWFMSglZuB8Z2apBdtOyz8CV7dC6/U1XbltXBC+IuutUkXQISz01P+US2ouBuesSbV6zILZ6BuzQ==} + engines: {node: '>= 0.9'} + + walker@1.0.8: + resolution: {integrity: sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==} + + watchpack@2.4.2: + resolution: {integrity: sha512-TnbFSbcOCcDgjZ4piURLCbJ3nJhznVh9kw6F6iokjiFPl8ONxe9A6nMDVXDiNbrSfLILs6vB07F7wLBrwPYzJw==} + engines: {node: '>=10.13.0'} + + wcwidth@1.0.1: + resolution: {integrity: sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==} + + 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'} + + webpack-sources@3.2.3: + resolution: {integrity: sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==} + engines: {node: '>=10.13.0'} + + webpack@5.94.0: + resolution: {integrity: sha512-KcsGn50VT+06JH/iunZJedYGUJS5FGjow8wb9c0v5n1Om8O1g4L6LjtfxwlXIATopoQu+vOXXa7gYisWxCoPyg==} + engines: {node: '>=10.13.0'} + hasBin: true + peerDependencies: + webpack-cli: '*' + peerDependenciesMeta: + webpack-cli: + optional: true + + whatwg-url@5.0.0: + resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} -packages: + which@1.3.1: + resolution: {integrity: sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==} + hasBin: true - /@aashutoshrathi/word-wrap@1.2.6: - resolution: {integrity: sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==} + which@2.0.2: + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} + hasBin: true + + wide-align@1.1.5: + resolution: {integrity: sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==} + + window-size@0.2.0: + resolution: {integrity: sha512-UD7d8HFA2+PZsbKyaOCEy8gMh1oDtHgJh1LfgjQ4zVXmYjAT/kvz3PueITKuqDiIXQe7yzpPnxX3lNc+AhQMyw==} + engines: {node: '>= 0.10.0'} + hasBin: true + + word-wrap@1.2.5: + resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} engines: {node: '>=0.10.0'} - dev: true - /@ampproject/remapping@2.2.1: - resolution: {integrity: sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==} - engines: {node: '>=6.0.0'} + wordwrap@1.0.0: + resolution: {integrity: sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==} + + wrap-ansi@2.1.0: + resolution: {integrity: sha512-vAaEaDM946gbNpH5pLVNR+vX2ht6n0Bt3GXwVB1AuAqZosOvHNF3P7wDnh8KLkSqgUh0uh77le7Owgoz+Z9XBw==} + engines: {node: '>=0.10.0'} + + 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'} + + wrap-ansi@8.1.0: + resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} + engines: {node: '>=12'} + + wrappy@1.0.2: + resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + + write-file-atomic@4.0.2: + resolution: {integrity: sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==} + engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + + xtend@4.0.2: + resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==} + engines: {node: '>=0.4'} + + y18n@3.2.2: + resolution: {integrity: sha512-uGZHXkHnhF0XeeAPgnKfPv1bgKAYyVvmNL1xlKsPYZPaIHxGti2hHqvOCQv71XMsLxu1QjergkqogUnms5D3YQ==} + + y18n@5.0.8: + resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} + engines: {node: '>=10'} + + yallist@3.1.1: + resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} + + yallist@4.0.0: + resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} + + yallist@5.0.0: + resolution: {integrity: sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==} + engines: {node: '>=18'} + + yaml@2.6.0: + resolution: {integrity: sha512-a6ae//JvKDEra2kdi1qzCyrJW/WZCgFi8ydDV+eXExl95t+5R+ijnqHJbz9tmMh8FUjx3iv2fCQ4dclAQlO2UQ==} + engines: {node: '>= 14'} + hasBin: true + + yargs-parser@2.4.1: + resolution: {integrity: sha512-9pIKIJhnI5tonzG6OnCFlz/yln8xHYcGl+pn3xR0Vzff0vzN1PbNRaelgfgRUwZ3s4i3jvxT9WhmUGL4whnasA==} + + yargs-parser@20.2.9: + resolution: {integrity: sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==} + engines: {node: '>=10'} + + yargs-parser@21.1.1: + resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} + engines: {node: '>=12'} + + yargs@16.2.0: + resolution: {integrity: sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==} + engines: {node: '>=10'} + + yargs@17.7.2: + resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} + engines: {node: '>=12'} + + yargs@4.6.0: + resolution: {integrity: sha512-KmjJbWBkYiSRUChcOSa4rtBxDXf0j4ISz+tpeNa4LKIBllgKnkemJ3x4yo4Yydp3wPU4/xJTaKTLLZ8V7zhI7A==} + + yn@3.1.1: + resolution: {integrity: sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==} + engines: {node: '>=6'} + + yocto-queue@0.1.0: + resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} + engines: {node: '>=10'} + + yocto-queue@1.0.0: + resolution: {integrity: sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==} + engines: {node: '>=12.20'} + +snapshots: + + '@aashutoshrathi/word-wrap@1.2.6': {} + + '@ampproject/remapping@2.2.1': dependencies: '@jridgewell/gen-mapping': 0.3.3 '@jridgewell/trace-mapping': 0.3.22 - /@angular-devkit/core@13.3.11: - resolution: {integrity: sha512-rfqoLMRYhlz0wzKlHx7FfyIyQq8dKTsmbCoIVU1cEIH0gyTMVY7PbVzwRRcO6xp5waY+0hA+0Brriujpuhkm4w==} - engines: {node: ^12.20.0 || ^14.15.0 || >=16.10.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: '>= 1.13.0'} - peerDependencies: - chokidar: ^3.5.2 - peerDependenciesMeta: - chokidar: - optional: true + '@angular-devkit/core@13.3.11(chokidar@3.6.0)': dependencies: ajv: 8.9.0 ajv-formats: 2.1.1(ajv@8.9.0) @@ -300,30 +5008,21 @@ packages: magic-string: 0.25.7 rxjs: 6.6.7 source-map: 0.7.3 - dev: false + optionalDependencies: + chokidar: 3.6.0 - /@angular-devkit/core@17.3.8(chokidar@3.6.0): - resolution: {integrity: sha512-Q8q0voCGudbdCgJ7lXdnyaxKHbNQBARH68zPQV72WT8NWy+Gw/tys870i6L58NWbBaCJEUcIj/kb6KoakSRu+Q==} - engines: {node: ^18.13.0 || >=20.9.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: '>= 1.13.0'} - peerDependencies: - chokidar: ^3.5.2 - peerDependenciesMeta: - chokidar: - optional: true + '@angular-devkit/core@17.3.8(chokidar@3.6.0)': dependencies: ajv: 8.12.0 ajv-formats: 2.1.1(ajv@8.12.0) - chokidar: 3.6.0 jsonc-parser: 3.2.1 picomatch: 4.0.1 rxjs: 7.8.1 source-map: 0.7.4 - dev: true + optionalDependencies: + chokidar: 3.6.0 - /@angular-devkit/schematics-cli@17.3.8(chokidar@3.6.0): - resolution: {integrity: sha512-TjmiwWJarX7oqvNiRAroQ5/LeKUatxBOCNEuKXO/PV8e7pn/Hr/BqfFm+UcYrQoFdZplmtNAfqmbqgVziKvCpA==} - engines: {node: ^18.13.0 || >=20.9.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: '>= 1.13.0'} - hasBin: true + '@angular-devkit/schematics-cli@17.3.8(chokidar@3.6.0)': dependencies: '@angular-devkit/core': 17.3.8(chokidar@3.6.0) '@angular-devkit/schematics': 17.3.8(chokidar@3.6.0) @@ -333,24 +5032,18 @@ packages: yargs-parser: 21.1.1 transitivePeerDependencies: - chokidar - dev: true - /@angular-devkit/schematics@13.3.11: - resolution: {integrity: sha512-ben+EGXpCrClnIVAAnEQmhQdKmnnqFhMp5BqMxgOslSYBAmCutLA6rBu5vsc8kZcGian1wt+lueF7G1Uk5cGBg==} - engines: {node: ^12.20.0 || ^14.15.0 || >=16.10.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: '>= 1.13.0'} + '@angular-devkit/schematics@13.3.11(chokidar@3.6.0)': dependencies: - '@angular-devkit/core': 13.3.11 + '@angular-devkit/core': 13.3.11(chokidar@3.6.0) jsonc-parser: 3.0.0 magic-string: 0.25.7 ora: 5.4.1 rxjs: 6.6.7 transitivePeerDependencies: - chokidar - dev: false - /@angular-devkit/schematics@17.3.8(chokidar@3.6.0): - resolution: {integrity: sha512-QRVEYpIfgkprNHc916JlPuNbLzOgrm9DZalHasnLUz4P6g7pR21olb8YCyM2OTJjombNhya9ZpckcADU5Qyvlg==} - engines: {node: ^18.13.0 || >=20.9.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: '>= 1.13.0'} + '@angular-devkit/schematics@17.3.8(chokidar@3.6.0)': dependencies: '@angular-devkit/core': 17.3.8(chokidar@3.6.0) jsonc-parser: 3.2.1 @@ -359,36 +5052,23 @@ packages: rxjs: 7.8.1 transitivePeerDependencies: - chokidar - dev: true - /@apidevtools/json-schema-ref-parser@11.7.2: - resolution: {integrity: sha512-4gY54eEGEstClvEkGnwVkTkrx0sqwemEFG5OSRRn3tD91XH0+Q8XIkYIfo7IwEWPpJZwILb9GUXeShtplRc/eA==} - engines: {node: '>= 16'} + '@apidevtools/json-schema-ref-parser@11.7.2': dependencies: '@jsdevtools/ono': 7.1.3 '@types/json-schema': 7.0.15 js-yaml: 4.1.0 - dev: false - /@arr/every@1.0.1: - resolution: {integrity: sha512-UQFQ6SgyJ6LX42W8rHCs8KVc0JS0tzVL9ct4XYedJukskYVWTo49tNiMEK9C2HTyarbNiT/RVIRSY82vH+6sTg==} - engines: {node: '>=4'} - dev: true + '@arr/every@1.0.1': {} - /@babel/code-frame@7.23.5: - resolution: {integrity: sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA==} - engines: {node: '>=6.9.0'} + '@babel/code-frame@7.23.5': dependencies: '@babel/highlight': 7.23.4 chalk: 2.4.2 - /@babel/compat-data@7.23.5: - resolution: {integrity: sha512-uU27kfDRlhfKl+w1U6vp16IuvSLtjAxdArVXPa9BvLkrr7CYIsxH5adpHObeAGY/41+syctUWOZ140a2Rvkgjw==} - engines: {node: '>=6.9.0'} + '@babel/compat-data@7.23.5': {} - /@babel/core@7.23.9: - resolution: {integrity: sha512-5q0175NOjddqpvvzU+kDiSOAk4PfdO6FvwCWoQ6RO7rTzEe8vlo+4HVfcnAREhD4npMs0e9uZypjTwzZPCf/cw==} - engines: {node: '>=6.9.0'} + '@babel/core@7.23.9': dependencies: '@ampproject/remapping': 2.2.1 '@babel/code-frame': 7.23.5 @@ -408,18 +5088,14 @@ packages: transitivePeerDependencies: - supports-color - /@babel/generator@7.23.6: - resolution: {integrity: sha512-qrSfCYxYQB5owCmGLbl8XRpX1ytXlpueOb0N0UmQwA073KZxejgQTzAmJezxvpwQD9uGtK2shHdi55QT+MbjIw==} - engines: {node: '>=6.9.0'} + '@babel/generator@7.23.6': dependencies: '@babel/types': 7.23.9 '@jridgewell/gen-mapping': 0.3.3 '@jridgewell/trace-mapping': 0.3.22 jsesc: 2.5.2 - /@babel/helper-compilation-targets@7.23.6: - resolution: {integrity: sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ==} - engines: {node: '>=6.9.0'} + '@babel/helper-compilation-targets@7.23.6': dependencies: '@babel/compat-data': 7.23.5 '@babel/helper-validator-option': 7.23.5 @@ -427,34 +5103,22 @@ packages: lru-cache: 5.1.1 semver: 6.3.1 - /@babel/helper-environment-visitor@7.22.20: - resolution: {integrity: sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==} - engines: {node: '>=6.9.0'} + '@babel/helper-environment-visitor@7.22.20': {} - /@babel/helper-function-name@7.23.0: - resolution: {integrity: sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==} - engines: {node: '>=6.9.0'} + '@babel/helper-function-name@7.23.0': dependencies: '@babel/template': 7.23.9 '@babel/types': 7.23.9 - /@babel/helper-hoist-variables@7.22.5: - resolution: {integrity: sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==} - engines: {node: '>=6.9.0'} + '@babel/helper-hoist-variables@7.22.5': dependencies: '@babel/types': 7.23.9 - /@babel/helper-module-imports@7.22.15: - resolution: {integrity: sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==} - engines: {node: '>=6.9.0'} + '@babel/helper-module-imports@7.22.15': dependencies: '@babel/types': 7.23.9 - /@babel/helper-module-transforms@7.23.3(@babel/core@7.23.9): - resolution: {integrity: sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 + '@babel/helper-module-transforms@7.23.3(@babel/core@7.23.9)': dependencies: '@babel/core': 7.23.9 '@babel/helper-environment-visitor': 7.22.20 @@ -463,37 +5127,23 @@ packages: '@babel/helper-split-export-declaration': 7.22.6 '@babel/helper-validator-identifier': 7.22.20 - /@babel/helper-plugin-utils@7.22.5: - resolution: {integrity: sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==} - engines: {node: '>=6.9.0'} + '@babel/helper-plugin-utils@7.22.5': {} - /@babel/helper-simple-access@7.22.5: - resolution: {integrity: sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==} - engines: {node: '>=6.9.0'} + '@babel/helper-simple-access@7.22.5': dependencies: '@babel/types': 7.23.9 - /@babel/helper-split-export-declaration@7.22.6: - resolution: {integrity: sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==} - engines: {node: '>=6.9.0'} + '@babel/helper-split-export-declaration@7.22.6': dependencies: '@babel/types': 7.23.9 - /@babel/helper-string-parser@7.23.4: - resolution: {integrity: sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ==} - engines: {node: '>=6.9.0'} + '@babel/helper-string-parser@7.23.4': {} - /@babel/helper-validator-identifier@7.22.20: - resolution: {integrity: sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==} - engines: {node: '>=6.9.0'} + '@babel/helper-validator-identifier@7.22.20': {} - /@babel/helper-validator-option@7.23.5: - resolution: {integrity: sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw==} - engines: {node: '>=6.9.0'} + '@babel/helper-validator-option@7.23.5': {} - /@babel/helpers@7.23.9: - resolution: {integrity: sha512-87ICKgU5t5SzOT7sBMfCOZQ2rHjRU+Pcb9BoILMYz600W6DkVRLFBPwQ18gwUVvggqXivaUakpnxWQGbpywbBQ==} - engines: {node: '>=6.9.0'} + '@babel/helpers@7.23.9': dependencies: '@babel/template': 7.23.9 '@babel/traverse': 7.23.9 @@ -501,147 +5151,93 @@ packages: transitivePeerDependencies: - supports-color - /@babel/highlight@7.23.4: - resolution: {integrity: sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A==} - engines: {node: '>=6.9.0'} + '@babel/highlight@7.23.4': dependencies: '@babel/helper-validator-identifier': 7.22.20 chalk: 2.4.2 js-tokens: 4.0.0 - /@babel/parser@7.23.9: - resolution: {integrity: sha512-9tcKgqKbs3xGJ+NtKF2ndOBBLVwPjl1SHxPQkd36r3Dlirw3xWUeGaTbqr7uGZcTaxkVNwc+03SVP7aCdWrTlA==} - engines: {node: '>=6.0.0'} - hasBin: true + '@babel/parser@7.23.9': dependencies: '@babel/types': 7.23.9 - /@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.23.9): - resolution: {integrity: sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.23.9)': dependencies: '@babel/core': 7.23.9 '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-syntax-bigint@7.8.3(@babel/core@7.23.9): - resolution: {integrity: sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-syntax-bigint@7.8.3(@babel/core@7.23.9)': dependencies: '@babel/core': 7.23.9 '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.23.9): - resolution: {integrity: sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.23.9)': dependencies: '@babel/core': 7.23.9 '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.23.9): - resolution: {integrity: sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.23.9)': dependencies: '@babel/core': 7.23.9 '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.23.9): - resolution: {integrity: sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.23.9)': dependencies: '@babel/core': 7.23.9 '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-syntax-jsx@7.23.3(@babel/core@7.23.9): - resolution: {integrity: sha512-EB2MELswq55OHUoRZLGg/zC7QWUKfNLpE57m/S2yr1uEneIgsTgrSzXP3NXEsMkVn76OlaVVnzN+ugObuYGwhg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-syntax-jsx@7.23.3(@babel/core@7.23.9)': dependencies: '@babel/core': 7.23.9 '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.23.9): - resolution: {integrity: sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.23.9)': dependencies: '@babel/core': 7.23.9 '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.23.9): - resolution: {integrity: sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.23.9)': dependencies: '@babel/core': 7.23.9 '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.23.9): - resolution: {integrity: sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.23.9)': dependencies: '@babel/core': 7.23.9 '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.23.9): - resolution: {integrity: sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.23.9)': dependencies: '@babel/core': 7.23.9 '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.23.9): - resolution: {integrity: sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.23.9)': dependencies: '@babel/core': 7.23.9 '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.23.9): - resolution: {integrity: sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.23.9)': dependencies: '@babel/core': 7.23.9 '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.23.9): - resolution: {integrity: sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.23.9)': dependencies: '@babel/core': 7.23.9 '@babel/helper-plugin-utils': 7.22.5 - /@babel/plugin-syntax-typescript@7.23.3(@babel/core@7.23.9): - resolution: {integrity: sha512-9EiNjVJOMwCO+43TqoTrgQ8jMwcAd0sWyXi9RPfIsLTj4R2MADDDQXELhffaUx/uJv2AYcxBgPwH6j4TIA4ytQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/plugin-syntax-typescript@7.23.3(@babel/core@7.23.9)': dependencies: '@babel/core': 7.23.9 '@babel/helper-plugin-utils': 7.22.5 - /@babel/template@7.23.9: - resolution: {integrity: sha512-+xrD2BWLpvHKNmX2QbpdpsBaWnRxahMwJjO+KZk2JOElj5nSmKezyS1B4u+QbHMTX69t4ukm6hh9lsYQ7GHCKA==} - engines: {node: '>=6.9.0'} + '@babel/template@7.23.9': dependencies: '@babel/code-frame': 7.23.5 '@babel/parser': 7.23.9 '@babel/types': 7.23.9 - /@babel/traverse@7.23.9: - resolution: {integrity: sha512-I/4UJ9vs90OkBtY6iiiTORVMyIhJ4kAVmsKo9KFc8UOxMeUfi2hvtIBsET5u9GizXE6/GFSuKCTNfgCswuEjRg==} - engines: {node: '>=6.9.0'} + '@babel/traverse@7.23.9': dependencies: '@babel/code-frame': 7.23.5 '@babel/generator': 7.23.6 @@ -656,37 +5252,22 @@ packages: transitivePeerDependencies: - supports-color - /@babel/types@7.23.9: - resolution: {integrity: sha512-dQjSq/7HaSjRM43FFGnv5keM2HsxpmyV1PfaSVm0nzzjwwTmjOe6J4bC8e3+pTEIgHaHj+1ZlLThRJ2auc/w1Q==} - engines: {node: '>=6.9.0'} + '@babel/types@7.23.9': dependencies: '@babel/helper-string-parser': 7.23.4 '@babel/helper-validator-identifier': 7.22.20 to-fast-properties: 2.0.0 - /@bcoe/v8-coverage@0.2.3: - resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==} + '@bcoe/v8-coverage@0.2.3': {} - /@chax-at/transactional-prisma-testing@1.2.0(@prisma/client@5.20.0): - resolution: {integrity: sha512-4GIEeHUlqcpggfz4t+t3tQb44uc67YWIzXnkB0m0Cy3jPOex/5fRhezebtqIxJzS2k4XIGxeJDij/Ajp0Mwy/Q==} - engines: {node: '>= 14'} - peerDependencies: - '@prisma/client': ^4.7.0 || 5 + '@chax-at/transactional-prisma-testing@1.2.0(@prisma/client@5.20.0(prisma@5.20.0))': dependencies: '@prisma/client': 5.20.0(prisma@5.20.0) - dev: true - /@colors/colors@1.5.0: - resolution: {integrity: sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==} - engines: {node: '>=0.1.90'} - requiresBuild: true - dev: true + '@colors/colors@1.5.0': optional: true - /@commitlint/cli@19.5.0(@types/node@22.7.5)(typescript@5.6.3): - resolution: {integrity: sha512-gaGqSliGwB86MDmAAKAtV9SV1SHdmN8pnGq4EJU4+hLisQ7IFfx4jvU4s+pk6tl0+9bv6yT+CaZkufOinkSJIQ==} - engines: {node: '>=v18'} - hasBin: true + '@commitlint/cli@19.5.0(@types/node@22.7.5)(typescript@5.6.3)': dependencies: '@commitlint/format': 19.5.0 '@commitlint/lint': 19.5.0 @@ -698,31 +5279,19 @@ packages: transitivePeerDependencies: - '@types/node' - typescript - dev: true - /@commitlint/config-angular-type-enum@19.5.0: - resolution: {integrity: sha512-4/6xrkElCSBb7+6oZXlBJ/zytkxXgmTg5gk1Voj3GAWShTivtWrPtDYvHmF858WhA695YKgxMHEPNN74UFkK8w==} - engines: {node: '>=v18'} - dev: true + '@commitlint/config-angular-type-enum@19.5.0': {} - /@commitlint/config-angular@19.5.0: - resolution: {integrity: sha512-EPQBuSK4uVNUj2HhWSJjmfHqgPpST//h07oIzcPK2FauFGGGX0Vt+kzNxnQRDEEUvSAHDRNTDWNaFv66Hlle6A==} - engines: {node: '>=v18'} + '@commitlint/config-angular@19.5.0': dependencies: '@commitlint/config-angular-type-enum': 19.5.0 - dev: true - /@commitlint/config-validator@19.5.0: - resolution: {integrity: sha512-CHtj92H5rdhKt17RmgALhfQt95VayrUo2tSqY9g2w+laAXyk7K/Ef6uPm9tn5qSIwSmrLjKaXK9eiNuxmQrDBw==} - engines: {node: '>=v18'} + '@commitlint/config-validator@19.5.0': dependencies: '@commitlint/types': 19.5.0 ajv: 8.12.0 - dev: true - /@commitlint/ensure@19.5.0: - resolution: {integrity: sha512-Kv0pYZeMrdg48bHFEU5KKcccRfKmISSm9MvgIgkpI6m+ohFTB55qZlBW6eYqh/XDfRuIO0x4zSmvBjmOwWTwkg==} - engines: {node: '>=v18'} + '@commitlint/ensure@19.5.0': dependencies: '@commitlint/types': 19.5.0 lodash.camelcase: 4.3.0 @@ -730,42 +5299,27 @@ packages: lodash.snakecase: 4.1.1 lodash.startcase: 4.4.0 lodash.upperfirst: 4.3.1 - dev: true - /@commitlint/execute-rule@19.5.0: - resolution: {integrity: sha512-aqyGgytXhl2ejlk+/rfgtwpPexYyri4t8/n4ku6rRJoRhGZpLFMqrZ+YaubeGysCP6oz4mMA34YSTaSOKEeNrg==} - engines: {node: '>=v18'} - dev: true + '@commitlint/execute-rule@19.5.0': {} - /@commitlint/format@19.5.0: - resolution: {integrity: sha512-yNy088miE52stCI3dhG/vvxFo9e4jFkU1Mj3xECfzp/bIS/JUay4491huAlVcffOoMK1cd296q0W92NlER6r3A==} - engines: {node: '>=v18'} + '@commitlint/format@19.5.0': dependencies: '@commitlint/types': 19.5.0 chalk: 5.3.0 - dev: true - /@commitlint/is-ignored@19.5.0: - resolution: {integrity: sha512-0XQ7Llsf9iL/ANtwyZ6G0NGp5Y3EQ8eDQSxv/SRcfJ0awlBY4tHFAvwWbw66FVUaWICH7iE5en+FD9TQsokZ5w==} - engines: {node: '>=v18'} + '@commitlint/is-ignored@19.5.0': dependencies: '@commitlint/types': 19.5.0 semver: 7.6.3 - dev: true - /@commitlint/lint@19.5.0: - resolution: {integrity: sha512-cAAQwJcRtiBxQWO0eprrAbOurtJz8U6MgYqLz+p9kLElirzSCc0vGMcyCaA1O7AqBuxo11l1XsY3FhOFowLAAg==} - engines: {node: '>=v18'} + '@commitlint/lint@19.5.0': dependencies: '@commitlint/is-ignored': 19.5.0 '@commitlint/parse': 19.5.0 '@commitlint/rules': 19.5.0 '@commitlint/types': 19.5.0 - dev: true - /@commitlint/load@19.5.0(@types/node@22.7.5)(typescript@5.6.3): - resolution: {integrity: sha512-INOUhkL/qaKqwcTUvCE8iIUf5XHsEPCLY9looJ/ipzi7jtGhgmtH7OOFiNvwYgH7mA8osUWOUDV8t4E2HAi4xA==} - engines: {node: '>=v18'} + '@commitlint/load@19.5.0(@types/node@22.7.5)(typescript@5.6.3)': dependencies: '@commitlint/config-validator': 19.5.0 '@commitlint/execute-rule': 19.5.0 @@ -773,43 +5327,31 @@ packages: '@commitlint/types': 19.5.0 chalk: 5.3.0 cosmiconfig: 9.0.0(typescript@5.6.3) - cosmiconfig-typescript-loader: 5.0.0(@types/node@22.7.5)(cosmiconfig@9.0.0)(typescript@5.6.3) + cosmiconfig-typescript-loader: 5.0.0(@types/node@22.7.5)(cosmiconfig@9.0.0(typescript@5.6.3))(typescript@5.6.3) lodash.isplainobject: 4.0.6 lodash.merge: 4.6.2 lodash.uniq: 4.5.0 transitivePeerDependencies: - '@types/node' - typescript - dev: true - /@commitlint/message@19.5.0: - resolution: {integrity: sha512-R7AM4YnbxN1Joj1tMfCyBryOC5aNJBdxadTZkuqtWi3Xj0kMdutq16XQwuoGbIzL2Pk62TALV1fZDCv36+JhTQ==} - engines: {node: '>=v18'} - dev: true + '@commitlint/message@19.5.0': {} - /@commitlint/parse@19.5.0: - resolution: {integrity: sha512-cZ/IxfAlfWYhAQV0TwcbdR1Oc0/r0Ik1GEessDJ3Lbuma/MRO8FRQX76eurcXtmhJC//rj52ZSZuXUg0oIX0Fw==} - engines: {node: '>=v18'} + '@commitlint/parse@19.5.0': dependencies: '@commitlint/types': 19.5.0 conventional-changelog-angular: 7.0.0 conventional-commits-parser: 5.0.0 - dev: true - /@commitlint/read@19.5.0: - resolution: {integrity: sha512-TjS3HLPsLsxFPQj6jou8/CZFAmOP2y+6V4PGYt3ihbQKTY1Jnv0QG28WRKl/d1ha6zLODPZqsxLEov52dhR9BQ==} - engines: {node: '>=v18'} + '@commitlint/read@19.5.0': dependencies: '@commitlint/top-level': 19.5.0 '@commitlint/types': 19.5.0 git-raw-commits: 4.0.0 minimist: 1.2.8 tinyexec: 0.3.0 - dev: true - /@commitlint/resolve-extends@19.5.0: - resolution: {integrity: sha512-CU/GscZhCUsJwcKTJS9Ndh3AKGZTNFIOoQB2n8CmFnizE0VnEuJoum+COW+C1lNABEeqk6ssfc1Kkalm4bDklA==} - engines: {node: '>=v18'} + '@commitlint/resolve-extends@19.5.0': dependencies: '@commitlint/config-validator': 19.5.0 '@commitlint/types': 19.5.0 @@ -817,83 +5359,49 @@ packages: import-meta-resolve: 4.0.0 lodash.mergewith: 4.6.2 resolve-from: 5.0.0 - dev: true - /@commitlint/rules@19.5.0: - resolution: {integrity: sha512-hDW5TPyf/h1/EufSHEKSp6Hs+YVsDMHazfJ2azIk9tHPXS6UqSz1dIRs1gpqS3eMXgtkT7JH6TW4IShdqOwhAw==} - engines: {node: '>=v18'} + '@commitlint/rules@19.5.0': dependencies: '@commitlint/ensure': 19.5.0 '@commitlint/message': 19.5.0 '@commitlint/to-lines': 19.5.0 '@commitlint/types': 19.5.0 - dev: true - /@commitlint/to-lines@19.5.0: - resolution: {integrity: sha512-R772oj3NHPkodOSRZ9bBVNq224DOxQtNef5Pl8l2M8ZnkkzQfeSTr4uxawV2Sd3ui05dUVzvLNnzenDBO1KBeQ==} - engines: {node: '>=v18'} - dev: true + '@commitlint/to-lines@19.5.0': {} - /@commitlint/top-level@19.5.0: - resolution: {integrity: sha512-IP1YLmGAk0yWrImPRRc578I3dDUI5A2UBJx9FbSOjxe9sTlzFiwVJ+zeMLgAtHMtGZsC8LUnzmW1qRemkFU4ng==} - engines: {node: '>=v18'} + '@commitlint/top-level@19.5.0': dependencies: find-up: 7.0.0 - dev: true - /@commitlint/types@19.5.0: - resolution: {integrity: sha512-DSHae2obMSMkAtTBSOulg5X7/z+rGLxcXQIkg3OmWvY6wifojge5uVMydfhUvs7yQj+V7jNmRZ2Xzl8GJyqRgg==} - engines: {node: '>=v18'} + '@commitlint/types@19.5.0': dependencies: '@types/conventional-commits-parser': 5.0.0 chalk: 5.3.0 - dev: true - /@cspotcode/source-map-support@0.8.1: - resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==} - engines: {node: '>=12'} + '@cspotcode/source-map-support@0.8.1': dependencies: - '@jridgewell/trace-mapping': 0.3.9 - - /@eslint-community/eslint-utils@4.4.0(eslint@9.12.0): - resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 + '@jridgewell/trace-mapping': 0.3.9 + + '@eslint-community/eslint-utils@4.4.0(eslint@9.12.0(jiti@1.21.0))': dependencies: - eslint: 9.12.0 + eslint: 9.12.0(jiti@1.21.0) eslint-visitor-keys: 3.4.3 - dev: true - /@eslint-community/regexpp@4.10.0: - resolution: {integrity: sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==} - engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} - dev: true + '@eslint-community/regexpp@4.10.0': {} - /@eslint-community/regexpp@4.11.1: - resolution: {integrity: sha512-m4DVN9ZqskZoLU5GlWZadwDnYo3vAEydiUayB9widCl9ffWx2IvPnp6n3on5rJmziJSw9Bv+Z3ChDVdMwXCY8Q==} - engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} - dev: true + '@eslint-community/regexpp@4.11.1': {} - /@eslint/config-array@0.18.0: - resolution: {integrity: sha512-fTxvnS1sRMu3+JjXwJG0j/i4RT9u4qJ+lqS/yCGap4lH4zZGzQ7tu+xZqQmcMZq5OBZDL4QRxQzRjkWcGt8IVw==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@eslint/config-array@0.18.0': dependencies: '@eslint/object-schema': 2.1.4 debug: 4.3.4 minimatch: 3.1.2 transitivePeerDependencies: - supports-color - dev: true - /@eslint/core@0.6.0: - resolution: {integrity: sha512-8I2Q8ykA4J0x0o7cg67FPVnehcqWTBehu/lmY+bolPFHGjh49YzGBMXTvpqVgEbBdvNCSxj6iFgiIyHzf03lzg==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - dev: true + '@eslint/core@0.6.0': {} - /@eslint/eslintrc@3.1.0: - resolution: {integrity: sha512-4Bfj15dVJdoy3RfZmmo86RK1Fwzn6SstsvK9JS+BaVKqC6QQQQyXekNaC+g+LKNgkQ+2VhGAzm6hO40AhMR3zQ==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@eslint/eslintrc@3.1.0': dependencies: ajv: 6.12.6 debug: 4.3.4 @@ -906,49 +5414,28 @@ packages: strip-json-comments: 3.1.1 transitivePeerDependencies: - supports-color - dev: true - /@eslint/js@9.12.0: - resolution: {integrity: sha512-eohesHH8WFRUprDNyEREgqP6beG6htMeUYeCpkEgBCieCMme5r9zFWjzAJp//9S+Kub4rqE+jXe9Cp1a7IYIIA==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - dev: true + '@eslint/js@9.12.0': {} - /@eslint/object-schema@2.1.4: - resolution: {integrity: sha512-BsWiH1yFGjXXS2yvrf5LyuoSIIbPrGUWob917o+BTKuZ7qJdxX8aJLRxs1fS9n6r7vESrq1OUqb68dANcFXuQQ==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - dev: true + '@eslint/object-schema@2.1.4': {} - /@eslint/plugin-kit@0.2.0: - resolution: {integrity: sha512-vH9PiIMMwvhCx31Af3HiGzsVNULDbyVkHXwlemn/B0TFj/00ho3y55efXrUZTfQipxoHC5u4xq6zblww1zm1Ig==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@eslint/plugin-kit@0.2.0': dependencies: levn: 0.4.1 - dev: true - /@exodus/schemasafe@1.3.0: - resolution: {integrity: sha512-5Aap/GaRupgNx/feGBwLLTVv8OQFfv3pq2lPRzPg9R+IOBnDgghTGW7l7EuVXOvg5cc/xSAlRW8rBrjIC3Nvqw==} - dev: true + '@exodus/schemasafe@1.3.0': {} - /@fastify/accept-negotiator@1.1.0: - resolution: {integrity: sha512-OIHZrb2ImZ7XG85HXOONLcJWGosv7sIvM2ifAPQVhg9Lv7qdmMBNVaai4QTdyuaqbKM5eO6sLSQOYI7wEQeCJQ==} - engines: {node: '>=14'} - dev: false + '@fastify/accept-negotiator@1.1.0': {} - /@fastify/ajv-compiler@3.5.0: - resolution: {integrity: sha512-ebbEtlI7dxXF5ziNdr05mOY8NnDiPB1XvAlLHctRt/Rc+C3LCOVW5imUVX+mhvUhnNzmPBHewUkOFgGlCxgdAA==} + '@fastify/ajv-compiler@3.5.0': dependencies: ajv: 8.12.0 ajv-formats: 2.1.1(ajv@8.12.0) fast-uri: 2.3.0 - dev: false - /@fastify/busboy@2.1.1: - resolution: {integrity: sha512-vBZP4NlzfOlerQTnba4aqZoMhE/a9HY7HRqoOPaETQcSQuWEIyZMHGfVu6w9wGtGK5fED5qRs2DteVCjOH60sA==} - engines: {node: '>=14'} - dev: false + '@fastify/busboy@2.1.1': {} - /@fastify/compress@7.0.3: - resolution: {integrity: sha512-xa9fo5/DgK1s0bkS6xrYgNn8HmofO5tJvbCDk8QuXshSgLd2cFZANv1ox/Qv7zswS7JroHwTlCVv/XGTVO98tg==} + '@fastify/compress@7.0.3': dependencies: '@fastify/accept-negotiator': 1.1.0 fastify-plugin: 4.5.1 @@ -958,67 +5445,47 @@ packages: pump: 3.0.0 pumpify: 2.0.1 readable-stream: 4.5.2 - dev: false - /@fastify/cookie@9.4.0: - resolution: {integrity: sha512-Th+pt3kEkh4MQD/Q2q1bMuJIB5NX/D5SwSpOKu3G/tjoGbwfpurIMJsWSPS0SJJ4eyjtmQ8OipDQspf8RbUOlg==} + '@fastify/cookie@9.4.0': dependencies: cookie-signature: 1.2.1 fastify-plugin: 4.5.1 - dev: false - /@fastify/cors@9.0.1: - resolution: {integrity: sha512-YY9Ho3ovI+QHIL2hW+9X4XqQjXLjJqsU+sMV/xFsxZkE8p3GNnYVFpoOxF7SsP5ZL76gwvbo3V9L+FIekBGU4Q==} + '@fastify/cors@9.0.1': dependencies: fastify-plugin: 4.5.1 mnemonist: 0.39.6 - dev: false - /@fastify/deepmerge@1.3.0: - resolution: {integrity: sha512-J8TOSBq3SoZbDhM9+R/u77hP93gz/rajSA+K2kGyijPpORPWUXHUpTaleoj+92As0S9uPRP7Oi8IqMf0u+ro6A==} - dev: false + '@fastify/deepmerge@1.3.0': {} - /@fastify/error@3.4.1: - resolution: {integrity: sha512-wWSvph+29GR783IhmvdwWnN4bUxTD01Vm5Xad4i7i1VuAOItLvbPAb69sb0IQ2N57yprvhNIwAP5B6xfKTmjmQ==} - dev: false + '@fastify/error@3.4.1': {} - /@fastify/fast-json-stringify-compiler@4.3.0: - resolution: {integrity: sha512-aZAXGYo6m22Fk1zZzEUKBvut/CIIQe/BapEORnxiD5Qr0kPHqqI69NtEMCme74h+at72sPhbkb4ZrLd1W3KRLA==} + '@fastify/fast-json-stringify-compiler@4.3.0': dependencies: fast-json-stringify: 5.12.0 - dev: false - /@fastify/formbody@7.4.0: - resolution: {integrity: sha512-H3C6h1GN56/SMrZS8N2vCT2cZr7mIHzBHzOBa5OPpjfB/D6FzP9mMpE02ZzrFX0ANeh0BAJdoXKOF2e7IbV+Og==} + '@fastify/formbody@7.4.0': dependencies: fast-querystring: 1.1.2 fastify-plugin: 4.5.1 - dev: false - /@fastify/helmet@11.1.1: - resolution: {integrity: sha512-pjJxjk6SLEimITWadtYIXt6wBMfFC1I6OQyH/jYVCqSAn36sgAIFjeNiibHtifjCd+e25442pObis3Rjtame6A==} + '@fastify/helmet@11.1.1': dependencies: fastify-plugin: 4.5.1 helmet: 7.1.0 - dev: false - /@fastify/merge-json-schemas@0.1.1: - resolution: {integrity: sha512-fERDVz7topgNjtXsJTTW1JKLy0rhuLRcquYqNR9rF7OcVpCa2OVW49ZPDIhaRRCaUuvVxI+N416xUoF76HNSXA==} + '@fastify/merge-json-schemas@0.1.1': dependencies: fast-deep-equal: 3.1.3 - dev: false - /@fastify/middie@8.3.0: - resolution: {integrity: sha512-h+zBxCzMlkEkh4fM7pZaSGzqS7P9M0Z6rXnWPdUEPfe7x1BCj++wEk/pQ5jpyYY4pF8AknFqb77n7uwh8HdxEA==} + '@fastify/middie@8.3.0': dependencies: '@fastify/error': 3.4.1 fastify-plugin: 4.5.1 path-to-regexp: 6.3.0 reusify: 1.0.4 - dev: false - /@fastify/multipart@8.3.0: - resolution: {integrity: sha512-A8h80TTyqUzaMVH0Cr9Qcm6RxSkVqmhK/MVBYHYeRRSUbUYv08WecjWKSlG2aSnD4aGI841pVxAjC+G1GafUeQ==} + '@fastify/multipart@8.3.0': dependencies: '@fastify/busboy': 2.1.1 '@fastify/deepmerge': 1.3.0 @@ -1026,20 +5493,16 @@ packages: fastify-plugin: 4.5.1 secure-json-parse: 2.7.0 stream-wormhole: 1.1.0 - dev: false - /@fastify/send@2.1.0: - resolution: {integrity: sha512-yNYiY6sDkexoJR0D8IDy3aRP3+L4wdqCpvx5WP+VtEU58sn7USmKynBzDQex5X42Zzvw2gNzzYgP90UfWShLFA==} + '@fastify/send@2.1.0': dependencies: '@lukeed/ms': 2.0.2 escape-html: 1.0.3 fast-decode-uri-component: 1.0.1 http-errors: 2.0.0 mime: 3.0.0 - dev: false - /@fastify/static@7.0.4: - resolution: {integrity: sha512-p2uKtaf8BMOZWLs6wu+Ihg7bWNBdjNgCwDza4MJtTqg+5ovKmcbgbR9Xs5/smZ1YISfzKOCNYmZV8LaCj+eJ1Q==} + '@fastify/static@7.0.4': dependencies: '@fastify/accept-negotiator': 1.1.0 '@fastify/send': 2.1.0 @@ -1047,76 +5510,45 @@ packages: fastify-plugin: 4.5.1 fastq: 1.17.1 glob: 10.4.5 - dev: false - /@golevelup/nestjs-modules@0.6.1(@nestjs/common@10.4.4)(rxjs@7.8.1): - resolution: {integrity: sha512-E0STg8In8fhIivnGDJAA70+XLPHzK5bMTkCnif9FbZ8waTYDQ3T/QQL0h73k+CUFeznn1hmuEW14sNaE+8cd7w==} - peerDependencies: - '@nestjs/common': ^9.x - rxjs: ^7.x + '@golevelup/nestjs-modules@0.6.1(@nestjs/common@10.4.4(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.2)(rxjs@7.8.1))(rxjs@7.8.1)': dependencies: '@nestjs/common': 10.4.4(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.2)(rxjs@7.8.1) lodash: 4.17.21 rxjs: 7.8.1 - dev: false - /@gulp-sourcemaps/map-sources@1.0.0: - resolution: {integrity: sha512-o/EatdaGt8+x2qpb0vFLC/2Gug/xYPRXb6a+ET1wGYKozKN3krDWC/zZFZAtrzxJHuDL12mwdfEFKcKMNvc55A==} - engines: {node: '>= 0.10'} + '@gulp-sourcemaps/map-sources@1.0.0': dependencies: normalize-path: 2.1.1 through2: 2.0.5 - dev: false - /@humanfs/core@0.19.0: - resolution: {integrity: sha512-2cbWIHbZVEweE853g8jymffCA+NCMiuqeECeBBLm8dg2oFdjuGJhgN4UAbI+6v0CKbbhvtXA4qV8YR5Ji86nmw==} - engines: {node: '>=18.18.0'} - dev: true + '@humanfs/core@0.19.0': {} - /@humanfs/node@0.16.5: - resolution: {integrity: sha512-KSPA4umqSG4LHYRodq31VDwKAvaTF4xmVlzM8Aeh4PlU1JQ3IG0wiA8C25d3RQ9nJyM3mBHyI53K06VVL/oFFg==} - engines: {node: '>=18.18.0'} + '@humanfs/node@0.16.5': dependencies: '@humanfs/core': 0.19.0 '@humanwhocodes/retry': 0.3.1 - dev: true - /@humanwhocodes/module-importer@1.0.1: - resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} - engines: {node: '>=12.22'} - dev: true + '@humanwhocodes/module-importer@1.0.1': {} - /@humanwhocodes/retry@0.3.1: - resolution: {integrity: sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==} - engines: {node: '>=18.18'} - dev: true + '@humanwhocodes/retry@0.3.1': {} - /@hutson/parse-repository-url@3.0.2: - resolution: {integrity: sha512-H9XAx3hc0BQHY6l+IFSWHDySypcXsvsuLhgYLUGywmJ5pswRVQJUHpOsobnLYp2ZUaUlKiKDrgWWhosOwAEM8Q==} - engines: {node: '>=6.9.0'} - dev: true + '@hutson/parse-repository-url@3.0.2': {} - /@isaacs/cliui@8.0.2: - resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} - engines: {node: '>=12'} + '@isaacs/cliui@8.0.2': dependencies: string-width: 5.1.2 - string-width-cjs: /string-width@4.2.3 + string-width-cjs: string-width@4.2.3 strip-ansi: 7.1.0 - strip-ansi-cjs: /strip-ansi@6.0.1 + strip-ansi-cjs: strip-ansi@6.0.1 wrap-ansi: 8.1.0 - wrap-ansi-cjs: /wrap-ansi@7.0.0 + wrap-ansi-cjs: wrap-ansi@7.0.0 - /@isaacs/fs-minipass@4.0.1: - resolution: {integrity: sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==} - engines: {node: '>=18.0.0'} + '@isaacs/fs-minipass@4.0.1': dependencies: minipass: 7.1.2 - dev: true - /@istanbuljs/load-nyc-config@1.1.0: - resolution: {integrity: sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==} - engines: {node: '>=8'} + '@istanbuljs/load-nyc-config@1.1.0': dependencies: camelcase: 5.3.1 find-up: 4.1.0 @@ -1124,13 +5556,9 @@ packages: js-yaml: 3.14.1 resolve-from: 5.0.0 - /@istanbuljs/schema@0.1.3: - resolution: {integrity: sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==} - engines: {node: '>=8'} + '@istanbuljs/schema@0.1.3': {} - /@jest/console@29.7.0: - resolution: {integrity: sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + '@jest/console@29.7.0': dependencies: '@jest/types': 29.6.3 '@types/node': 22.7.5 @@ -1139,14 +5567,7 @@ packages: jest-util: 29.7.0 slash: 3.0.0 - /@jest/core@29.7.0(ts-node@10.9.2): - resolution: {integrity: sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - peerDependencies: - node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 - peerDependenciesMeta: - node-notifier: - optional: true + '@jest/core@29.7.0(ts-node@10.9.2(@types/node@22.7.5)(typescript@5.6.3))': dependencies: '@jest/console': 29.7.0 '@jest/reporters': 29.7.0 @@ -1160,7 +5581,7 @@ packages: exit: 0.1.2 graceful-fs: 4.2.11 jest-changed-files: 29.7.0 - jest-config: 29.7.0(@types/node@22.7.5)(ts-node@10.9.2) + jest-config: 29.7.0(@types/node@22.7.5)(ts-node@10.9.2(@types/node@22.7.5)(typescript@5.6.3)) jest-haste-map: 29.7.0 jest-message-util: 29.7.0 jest-regex-util: 29.6.3 @@ -1181,33 +5602,25 @@ packages: - supports-color - ts-node - /@jest/environment@29.7.0: - resolution: {integrity: sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + '@jest/environment@29.7.0': dependencies: '@jest/fake-timers': 29.7.0 '@jest/types': 29.6.3 '@types/node': 22.7.5 jest-mock: 29.7.0 - /@jest/expect-utils@29.7.0: - resolution: {integrity: sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + '@jest/expect-utils@29.7.0': dependencies: jest-get-type: 29.6.3 - /@jest/expect@29.7.0: - resolution: {integrity: sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + '@jest/expect@29.7.0': dependencies: expect: 29.7.0 jest-snapshot: 29.7.0 transitivePeerDependencies: - supports-color - /@jest/fake-timers@29.7.0: - resolution: {integrity: sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + '@jest/fake-timers@29.7.0': dependencies: '@jest/types': 29.6.3 '@sinonjs/fake-timers': 10.3.0 @@ -1216,9 +5629,7 @@ packages: jest-mock: 29.7.0 jest-util: 29.7.0 - /@jest/globals@29.7.0: - resolution: {integrity: sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + '@jest/globals@29.7.0': dependencies: '@jest/environment': 29.7.0 '@jest/expect': 29.7.0 @@ -1227,14 +5638,7 @@ packages: transitivePeerDependencies: - supports-color - /@jest/reporters@29.7.0: - resolution: {integrity: sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - peerDependencies: - node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 - peerDependenciesMeta: - node-notifier: - optional: true + '@jest/reporters@29.7.0': dependencies: '@bcoe/v8-coverage': 0.2.3 '@jest/console': 29.7.0 @@ -1263,41 +5667,31 @@ packages: transitivePeerDependencies: - supports-color - /@jest/schemas@29.6.3: - resolution: {integrity: sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + '@jest/schemas@29.6.3': dependencies: '@sinclair/typebox': 0.27.8 - /@jest/source-map@29.6.3: - resolution: {integrity: sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + '@jest/source-map@29.6.3': dependencies: '@jridgewell/trace-mapping': 0.3.22 callsites: 3.1.0 graceful-fs: 4.2.11 - /@jest/test-result@29.7.0: - resolution: {integrity: sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + '@jest/test-result@29.7.0': dependencies: '@jest/console': 29.7.0 '@jest/types': 29.6.3 '@types/istanbul-lib-coverage': 2.0.6 collect-v8-coverage: 1.0.2 - /@jest/test-sequencer@29.7.0: - resolution: {integrity: sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + '@jest/test-sequencer@29.7.0': dependencies: '@jest/test-result': 29.7.0 graceful-fs: 4.2.11 jest-haste-map: 29.7.0 slash: 3.0.0 - /@jest/transform@29.7.0: - resolution: {integrity: sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + '@jest/transform@29.7.0': dependencies: '@babel/core': 7.23.9 '@jest/types': 29.6.3 @@ -1317,9 +5711,7 @@ packages: transitivePeerDependencies: - supports-color - /@jest/types@29.6.3: - resolution: {integrity: sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + '@jest/types@29.6.3': dependencies: '@jest/schemas': 29.6.3 '@types/istanbul-lib-coverage': 2.0.6 @@ -1328,67 +5720,44 @@ packages: '@types/yargs': 17.0.32 chalk: 4.1.2 - /@jridgewell/gen-mapping@0.3.3: - resolution: {integrity: sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==} - engines: {node: '>=6.0.0'} + '@jridgewell/gen-mapping@0.3.3': dependencies: '@jridgewell/set-array': 1.1.2 '@jridgewell/sourcemap-codec': 1.4.15 '@jridgewell/trace-mapping': 0.3.22 - /@jridgewell/resolve-uri@3.1.1: - resolution: {integrity: sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==} - engines: {node: '>=6.0.0'} + '@jridgewell/resolve-uri@3.1.1': {} - /@jridgewell/set-array@1.1.2: - resolution: {integrity: sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==} - engines: {node: '>=6.0.0'} + '@jridgewell/set-array@1.1.2': {} - /@jridgewell/source-map@0.3.5: - resolution: {integrity: sha512-UTYAUj/wviwdsMfzoSJspJxbkH5o1snzwX0//0ENX1u/55kkZZkcTZP6u9bwKGkv+dkk9at4m1Cpt0uY80kcpQ==} + '@jridgewell/source-map@0.3.5': dependencies: '@jridgewell/gen-mapping': 0.3.3 '@jridgewell/trace-mapping': 0.3.22 - dev: true - /@jridgewell/sourcemap-codec@1.4.15: - resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} + '@jridgewell/sourcemap-codec@1.4.15': {} - /@jridgewell/trace-mapping@0.3.22: - resolution: {integrity: sha512-Wf963MzWtA2sjrNt+g18IAln9lKnlRp+K2eH4jjIoF1wYeq3aMREpG09xhlhdzS0EjwU7qmUJYangWa+151vZw==} + '@jridgewell/trace-mapping@0.3.22': dependencies: '@jridgewell/resolve-uri': 3.1.1 '@jridgewell/sourcemap-codec': 1.4.15 - /@jridgewell/trace-mapping@0.3.9: - resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==} + '@jridgewell/trace-mapping@0.3.9': dependencies: '@jridgewell/resolve-uri': 3.1.1 '@jridgewell/sourcemap-codec': 1.4.15 - /@jsdevtools/ono@7.1.3: - resolution: {integrity: sha512-4JQNk+3mVzK3xh2rqd6RB4J46qUR19azEHBneZyTZM+c456qOrbbM/5xcR8huNCCcbVt7+UmizG6GuUvPvKUYg==} - dev: false + '@jsdevtools/ono@7.1.3': {} - /@ljharb/through@2.3.13: - resolution: {integrity: sha512-/gKJun8NNiWGZJkGzI/Ragc53cOdcLNdzjLaIa+GEjguQs0ulsurx8WN0jijdK9yPqDvziX995sMRLyLt1uZMQ==} - engines: {node: '>= 0.4'} + '@ljharb/through@2.3.13': dependencies: call-bind: 1.0.7 - dev: true - /@lukeed/csprng@1.1.0: - resolution: {integrity: sha512-Z7C/xXCiGWsg0KuKsHTKJxbWhpI3Vs5GwLfOean7MGyVFGqdRgBbAjOCh6u4bbjPc/8MJ2pZmK/0DLdCbivLDA==} - engines: {node: '>=8'} + '@lukeed/csprng@1.1.0': {} - /@lukeed/ms@2.0.2: - resolution: {integrity: sha512-9I2Zn6+NJLfaGoz9jN3lpwDgAYvfGeNYdbAIjJOqzs4Tpc+VU3Jqq4IofSUBKajiDS8k9fZIg18/z13mpk1bsA==} - engines: {node: '>=8'} - dev: false + '@lukeed/ms@2.0.2': {} - /@mapbox/node-pre-gyp@1.0.11: - resolution: {integrity: sha512-Yhlar6v9WQgUp/He7BdgzOz8lqMQ8sU+jkCq7Wx8Myc5YFJLbEe7lgui/V7G1qB1DJykHSGwreceSaD60Y0PUQ==} - hasBin: true + '@mapbox/node-pre-gyp@1.0.11': dependencies: detect-libc: 2.0.2 https-proxy-agent: 5.0.1 @@ -1402,70 +5771,32 @@ packages: transitivePeerDependencies: - encoding - supports-color - dev: false - /@microsoft/tsdoc@0.15.0: - resolution: {integrity: sha512-HZpPoABogPvjeJOdzCOSJsXeL/SMCBgBZMVC3X3d7YYp2gf31MfxhUoYUNwf1ERPJOnQc0wkFn9trqI6ZEdZuA==} - dev: false + '@microsoft/tsdoc@0.15.0': {} - /@nestjs-cls/transactional-adapter-prisma@1.2.4(@nestjs-cls/transactional@2.4.2)(@prisma/client@5.20.0)(nestjs-cls@4.4.1)(prisma@5.20.0): - resolution: {integrity: sha512-W/Ej+T3QG81//d4YuXsuHnV9WFvWTQBQk1BSiowyq7d812lyr3zk8ZMwmAhB7JAY80cJMeBY6i3TBlP0QVIczQ==} - engines: {node: '>=18'} - peerDependencies: - '@nestjs-cls/transactional': ^2.4.2 - '@prisma/client': '> 4 < 6' - nestjs-cls: ^4.4.1 - prisma: '> 4 < 6' + '@nestjs-cls/transactional-adapter-prisma@1.2.4(rob4yv5uoscbdactcoj62w3k2m)': dependencies: - '@nestjs-cls/transactional': 2.4.2(@nestjs/common@10.4.4)(@nestjs/core@10.4.4)(nestjs-cls@4.4.1)(reflect-metadata@0.2.2)(rxjs@7.8.1) + '@nestjs-cls/transactional': 2.4.2(@nestjs/common@10.4.4(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/core@10.4.4(@nestjs/common@10.4.4(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.2)(rxjs@7.8.1))(reflect-metadata@0.2.2)(rxjs@7.8.1))(nestjs-cls@4.4.1(@nestjs/common@10.4.4(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/core@10.4.4(@nestjs/common@10.4.4(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.2)(rxjs@7.8.1))(reflect-metadata@0.2.2)(rxjs@7.8.1))(reflect-metadata@0.2.2)(rxjs@7.8.1))(reflect-metadata@0.2.2)(rxjs@7.8.1) '@prisma/client': 5.20.0(prisma@5.20.0) - nestjs-cls: 4.4.1(@nestjs/common@10.4.4)(@nestjs/core@10.4.4)(reflect-metadata@0.2.2)(rxjs@7.8.1) + nestjs-cls: 4.4.1(@nestjs/common@10.4.4(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/core@10.4.4(@nestjs/common@10.4.4(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.2)(rxjs@7.8.1))(reflect-metadata@0.2.2)(rxjs@7.8.1))(reflect-metadata@0.2.2)(rxjs@7.8.1) prisma: 5.20.0 - dev: false - /@nestjs-cls/transactional@2.4.2(@nestjs/common@10.4.4)(@nestjs/core@10.4.4)(nestjs-cls@4.4.1)(reflect-metadata@0.2.2)(rxjs@7.8.1): - resolution: {integrity: sha512-bQZ4Xo5BOPnmKcBk/Qsh/VX8kHr+fKTfJ6Fcxu/RGmxzSwjRVgShNu0E57V8CZkZJ6YuIKJoDQHAoIbeRIffbQ==} - engines: {node: '>=16'} - peerDependencies: - '@nestjs/common': '> 7.0.0 < 11' - '@nestjs/core': '> 7.0.0 < 11' - nestjs-cls: ^4.4.1 - reflect-metadata: '*' - rxjs: '>= 7' + '@nestjs-cls/transactional@2.4.2(@nestjs/common@10.4.4(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/core@10.4.4(@nestjs/common@10.4.4(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.2)(rxjs@7.8.1))(reflect-metadata@0.2.2)(rxjs@7.8.1))(nestjs-cls@4.4.1(@nestjs/common@10.4.4(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/core@10.4.4(@nestjs/common@10.4.4(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.2)(rxjs@7.8.1))(reflect-metadata@0.2.2)(rxjs@7.8.1))(reflect-metadata@0.2.2)(rxjs@7.8.1))(reflect-metadata@0.2.2)(rxjs@7.8.1)': dependencies: '@nestjs/common': 10.4.4(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.2)(rxjs@7.8.1) - '@nestjs/core': 10.4.4(@nestjs/common@10.4.4)(reflect-metadata@0.2.2)(rxjs@7.8.1) - nestjs-cls: 4.4.1(@nestjs/common@10.4.4)(@nestjs/core@10.4.4)(reflect-metadata@0.2.2)(rxjs@7.8.1) + '@nestjs/core': 10.4.4(@nestjs/common@10.4.4(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.2)(rxjs@7.8.1))(reflect-metadata@0.2.2)(rxjs@7.8.1) + nestjs-cls: 4.4.1(@nestjs/common@10.4.4(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/core@10.4.4(@nestjs/common@10.4.4(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.2)(rxjs@7.8.1))(reflect-metadata@0.2.2)(rxjs@7.8.1))(reflect-metadata@0.2.2)(rxjs@7.8.1) reflect-metadata: 0.2.2 rxjs: 7.8.1 - dev: false - /@nestjs/cache-manager@2.2.2(@nestjs/common@10.4.4)(@nestjs/core@10.4.4)(cache-manager@5.4.0)(rxjs@7.8.1): - resolution: {integrity: sha512-+n7rpU1QABeW2WV17Dl1vZCG3vWjJU1MaamWgZvbGxYE9EeCM0lVLfw3z7acgDTNwOy+K68xuQPoIMxD0bhjlA==} - peerDependencies: - '@nestjs/common': ^9.0.0 || ^10.0.0 - '@nestjs/core': ^9.0.0 || ^10.0.0 - cache-manager: <=5 - rxjs: ^7.0.0 + '@nestjs/cache-manager@2.2.2(@nestjs/common@10.4.4(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/core@10.4.4(@nestjs/common@10.4.4(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.2)(rxjs@7.8.1))(reflect-metadata@0.2.2)(rxjs@7.8.1))(cache-manager@5.4.0)(rxjs@7.8.1)': dependencies: '@nestjs/common': 10.4.4(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.2)(rxjs@7.8.1) - '@nestjs/core': 10.4.4(@nestjs/common@10.4.4)(reflect-metadata@0.2.2)(rxjs@7.8.1) + '@nestjs/core': 10.4.4(@nestjs/common@10.4.4(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.2)(rxjs@7.8.1))(reflect-metadata@0.2.2)(rxjs@7.8.1) cache-manager: 5.4.0 rxjs: 7.8.1 - dev: false - /@nestjs/cli@10.4.5: - resolution: {integrity: sha512-FP7Rh13u8aJbHe+zZ7hM0CC4785g9Pw4lz4r2TTgRtf0zTxSWMkJaPEwyjX8SK9oWK2GsYxl+fKpwVZNbmnj9A==} - engines: {node: '>= 16.14'} - hasBin: true - peerDependencies: - '@swc/cli': ^0.1.62 || ^0.3.0 || ^0.4.0 - '@swc/core': ^1.3.62 - peerDependenciesMeta: - '@swc/cli': - optional: true - '@swc/core': - optional: true + '@nestjs/cli@10.4.5': dependencies: '@angular-devkit/core': 17.3.8(chokidar@3.6.0) '@angular-devkit/schematics': 17.3.8(chokidar@3.6.0) @@ -1490,85 +5821,39 @@ packages: - esbuild - uglify-js - webpack-cli - dev: true - /@nestjs/common@10.4.4(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.2)(rxjs@7.8.1): - resolution: {integrity: sha512-0j2/zqRw9nvHV1GKTktER8B/hIC/Z8CYFjN/ZqUuvwayCH+jZZBhCR2oRyuvLTXdnlSmtCAg2xvQ0ULqQvzqhA==} - peerDependencies: - class-transformer: '*' - class-validator: '*' - reflect-metadata: ^0.1.12 || ^0.2.0 - rxjs: ^7.1.0 - peerDependenciesMeta: - class-transformer: - optional: true - class-validator: - optional: true + '@nestjs/common@10.4.4(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.2)(rxjs@7.8.1)': dependencies: - class-transformer: 0.5.1 - class-validator: 0.14.1 iterare: 1.2.1 reflect-metadata: 0.2.2 rxjs: 7.8.1 tslib: 2.7.0 uid: 2.0.2 - - /@nestjs/common@9.4.0(cache-manager@5.4.0)(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.2)(rxjs@7.8.1): - resolution: {integrity: sha512-RUcVAQsEF4WPrmzFXEOUfZnPwrLTe1UVlzXTlSyfqfqbdWDPKDGlIPVelBLfc5/+RRUQ0I5iE4+CQvpCmkqldw==} - peerDependencies: - cache-manager: <=5 - class-transformer: '*' - class-validator: '*' - reflect-metadata: ^0.1.12 - rxjs: ^7.1.0 - peerDependenciesMeta: - cache-manager: - optional: true - class-transformer: - optional: true - class-validator: - optional: true - dependencies: - cache-manager: 5.4.0 + optionalDependencies: class-transformer: 0.5.1 class-validator: 0.14.1 + + '@nestjs/common@9.4.0(cache-manager@5.4.0)(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.2)(rxjs@7.8.1)': + dependencies: iterare: 1.2.1 reflect-metadata: 0.2.2 rxjs: 7.8.1 tslib: 2.5.0 uid: 2.0.2 - dev: false + optionalDependencies: + cache-manager: 5.4.0 + class-transformer: 0.5.1 + class-validator: 0.14.1 - /@nestjs/config@3.2.3(@nestjs/common@10.4.4)(rxjs@7.8.1): - resolution: {integrity: sha512-p6yv/CvoBewJ72mBq4NXgOAi2rSQNWx3a+IMJLVKS2uiwFCOQQuiIatGwq6MRjXV3Jr+B41iUO8FIf4xBrZ4/w==} - peerDependencies: - '@nestjs/common': ^8.0.0 || ^9.0.0 || ^10.0.0 - rxjs: ^7.1.0 + '@nestjs/config@3.2.3(@nestjs/common@10.4.4(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.2)(rxjs@7.8.1))(rxjs@7.8.1)': dependencies: '@nestjs/common': 10.4.4(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.2)(rxjs@7.8.1) dotenv: 16.4.5 dotenv-expand: 10.0.0 lodash: 4.17.21 rxjs: 7.8.1 - dev: false - /@nestjs/core@10.4.4(@nestjs/common@10.4.4)(reflect-metadata@0.2.2)(rxjs@7.8.1): - resolution: {integrity: sha512-y9tjmAzU6LTh1cC/lWrRsCcOd80khSR0qAHAqwY2svbW+AhsR/XCzgpZrAAKJrm/dDfjLCZKyxJSayeirGcW5Q==} - requiresBuild: true - peerDependencies: - '@nestjs/common': ^10.0.0 - '@nestjs/microservices': ^10.0.0 - '@nestjs/platform-express': ^10.0.0 - '@nestjs/websockets': ^10.0.0 - reflect-metadata: ^0.1.12 || ^0.2.0 - rxjs: ^7.1.0 - peerDependenciesMeta: - '@nestjs/microservices': - optional: true - '@nestjs/platform-express': - optional: true - '@nestjs/websockets': - optional: true + '@nestjs/core@10.4.4(@nestjs/common@10.4.4(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.2)(rxjs@7.8.1))(reflect-metadata@0.2.2)(rxjs@7.8.1)': dependencies: '@nestjs/common': 10.4.4(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.2)(rxjs@7.8.1) '@nuxtjs/opencollective': 0.3.2 @@ -1582,193 +5867,115 @@ packages: transitivePeerDependencies: - encoding - /@nestjs/event-emitter@2.0.4(@nestjs/common@10.4.4)(@nestjs/core@10.4.4): - resolution: {integrity: sha512-quMiw8yOwoSul0pp3mOonGz8EyXWHSBTqBy8B0TbYYgpnG1Ix2wGUnuTksLWaaBiiOTDhciaZ41Y5fJZsSJE1Q==} - peerDependencies: - '@nestjs/common': ^8.0.0 || ^9.0.0 || ^10.0.0 - '@nestjs/core': ^8.0.0 || ^9.0.0 || ^10.0.0 + '@nestjs/event-emitter@2.0.4(@nestjs/common@10.4.4(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/core@10.4.4(@nestjs/common@10.4.4(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.2)(rxjs@7.8.1))(reflect-metadata@0.2.2)(rxjs@7.8.1))': dependencies: '@nestjs/common': 10.4.4(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.2)(rxjs@7.8.1) - '@nestjs/core': 10.4.4(@nestjs/common@10.4.4)(reflect-metadata@0.2.2)(rxjs@7.8.1) + '@nestjs/core': 10.4.4(@nestjs/common@10.4.4(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.2)(rxjs@7.8.1))(reflect-metadata@0.2.2)(rxjs@7.8.1) eventemitter2: 6.4.9 - dev: false - /@nestjs/jwt@10.2.0(@nestjs/common@10.4.4): - resolution: {integrity: sha512-x8cG90SURkEiLOehNaN2aRlotxT0KZESUliOPKKnjWiyJOcWurkF3w345WOX0P4MgFzUjGoZ1Sy0aZnxeihT0g==} - peerDependencies: - '@nestjs/common': ^8.0.0 || ^9.0.0 || ^10.0.0 + '@nestjs/jwt@10.2.0(@nestjs/common@10.4.4(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.2)(rxjs@7.8.1))': dependencies: '@nestjs/common': 10.4.4(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.2)(rxjs@7.8.1) '@types/jsonwebtoken': 9.0.5 jsonwebtoken: 9.0.2 - dev: false - /@nestjs/mapped-types@2.0.5(@nestjs/common@10.4.4)(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.2): - resolution: {integrity: sha512-bSJv4pd6EY99NX9CjBIyn4TVDoSit82DUZlL4I3bqNfy5Gt+gXTa86i3I/i0iIV9P4hntcGM5GyO+FhZAhxtyg==} - peerDependencies: - '@nestjs/common': ^8.0.0 || ^9.0.0 || ^10.0.0 - class-transformer: ^0.4.0 || ^0.5.0 - class-validator: ^0.13.0 || ^0.14.0 - reflect-metadata: ^0.1.12 || ^0.2.0 - peerDependenciesMeta: - class-transformer: - optional: true - class-validator: - optional: true + '@nestjs/mapped-types@2.0.5(@nestjs/common@10.4.4(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.2)(rxjs@7.8.1))(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.2)': dependencies: '@nestjs/common': 10.4.4(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.2)(rxjs@7.8.1) + reflect-metadata: 0.2.2 + optionalDependencies: class-transformer: 0.5.1 class-validator: 0.14.1 - reflect-metadata: 0.2.2 - dev: false - /@nestjs/passport@10.0.3(@nestjs/common@10.4.4)(passport@0.7.0): - resolution: {integrity: sha512-znJ9Y4S8ZDVY+j4doWAJ8EuuVO7SkQN3yOBmzxbGaXbvcSwFDAdGJ+OMCg52NdzIO4tQoN4pYKx8W6M0ArfFRQ==} - peerDependencies: - '@nestjs/common': ^8.0.0 || ^9.0.0 || ^10.0.0 - passport: ^0.4.0 || ^0.5.0 || ^0.6.0 || ^0.7.0 + '@nestjs/passport@10.0.3(@nestjs/common@10.4.4(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.2)(rxjs@7.8.1))(passport@0.7.0)': dependencies: '@nestjs/common': 10.4.4(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.2)(rxjs@7.8.1) passport: 0.7.0 - dev: false - /@nestjs/platform-fastify@10.3.4(@fastify/static@7.0.4)(@nestjs/common@10.4.4)(@nestjs/core@10.4.4): - resolution: {integrity: sha512-rYoAdJ1ybBXPwO+KutWJ4siaqGDdMzwXS4ggJ5soQgD4maN2p1rvKE31MzERd1MqYXWprFIESFHuxkiHMZV6kg==} - peerDependencies: - '@fastify/static': ^6.0.0 || ^7.0.0 - '@fastify/view': ^7.0.0 || ^8.0.0 - '@nestjs/common': ^10.0.0 - '@nestjs/core': ^10.0.0 - peerDependenciesMeta: - '@fastify/static': - optional: true - '@fastify/view': - optional: true + '@nestjs/platform-fastify@10.3.4(@fastify/static@7.0.4)(@nestjs/common@10.4.4(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/core@10.4.4(@nestjs/common@10.4.4(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.2)(rxjs@7.8.1))(reflect-metadata@0.2.2)(rxjs@7.8.1))': dependencies: '@fastify/cors': 9.0.1 '@fastify/formbody': 7.4.0 '@fastify/middie': 8.3.0 - '@fastify/static': 7.0.4 '@nestjs/common': 10.4.4(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.2)(rxjs@7.8.1) - '@nestjs/core': 10.4.4(@nestjs/common@10.4.4)(reflect-metadata@0.2.2)(rxjs@7.8.1) + '@nestjs/core': 10.4.4(@nestjs/common@10.4.4(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.2)(rxjs@7.8.1))(reflect-metadata@0.2.2)(rxjs@7.8.1) fastify: 4.26.2 light-my-request: 5.12.0 path-to-regexp: 3.2.0 tslib: 2.6.2 + optionalDependencies: + '@fastify/static': 7.0.4 transitivePeerDependencies: - supports-color - dev: false - /@nestjs/schematics@10.1.4(chokidar@3.6.0)(typescript@5.3.3): - resolution: {integrity: sha512-QpY8ez9cTvXXPr3/KBrtSgXQHMSV6BkOUYy2c2TTe6cBqriEdGnCYqGl8cnfrQl3632q3lveQPaZ/c127dHsEw==} - peerDependencies: - typescript: '>=4.8.2' + '@nestjs/schematics@10.1.4(chokidar@3.6.0)(typescript@5.3.3)': + dependencies: + '@angular-devkit/core': 17.3.8(chokidar@3.6.0) + '@angular-devkit/schematics': 17.3.8(chokidar@3.6.0) + comment-json: 4.2.3 + jsonc-parser: 3.3.1 + pluralize: 8.0.0 + typescript: 5.3.3 + transitivePeerDependencies: + - chokidar + + '@nestjs/schematics@10.1.4(chokidar@3.6.0)(typescript@5.6.3)': dependencies: '@angular-devkit/core': 17.3.8(chokidar@3.6.0) '@angular-devkit/schematics': 17.3.8(chokidar@3.6.0) comment-json: 4.2.3 jsonc-parser: 3.3.1 pluralize: 8.0.0 - typescript: 5.3.3 + typescript: 5.6.3 transitivePeerDependencies: - chokidar - dev: true - /@nestjs/swagger@7.4.2(@fastify/static@7.0.4)(@nestjs/common@10.4.4)(@nestjs/core@10.4.4)(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.2): - resolution: {integrity: sha512-Mu6TEn1M/owIvAx2B4DUQObQXqo2028R2s9rSZ/hJEgBK95+doTwS0DjmVA2wTeZTyVtXOoN7CsoM5pONBzvKQ==} - 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 - class-transformer: '*' - class-validator: '*' - reflect-metadata: ^0.1.12 || ^0.2.0 - peerDependenciesMeta: - '@fastify/static': - optional: true - class-transformer: - optional: true - class-validator: - optional: true + '@nestjs/swagger@7.4.2(@fastify/static@7.0.4)(@nestjs/common@10.4.4(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/core@10.4.4(@nestjs/common@10.4.4(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.2)(rxjs@7.8.1))(reflect-metadata@0.2.2)(rxjs@7.8.1))(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.2)': dependencies: - '@fastify/static': 7.0.4 '@microsoft/tsdoc': 0.15.0 '@nestjs/common': 10.4.4(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.2)(rxjs@7.8.1) - '@nestjs/core': 10.4.4(@nestjs/common@10.4.4)(reflect-metadata@0.2.2)(rxjs@7.8.1) - '@nestjs/mapped-types': 2.0.5(@nestjs/common@10.4.4)(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.2) - class-transformer: 0.5.1 - class-validator: 0.14.1 + '@nestjs/core': 10.4.4(@nestjs/common@10.4.4(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.2)(rxjs@7.8.1))(reflect-metadata@0.2.2)(rxjs@7.8.1) + '@nestjs/mapped-types': 2.0.5(@nestjs/common@10.4.4(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.2)(rxjs@7.8.1))(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.2) js-yaml: 4.1.0 lodash: 4.17.21 path-to-regexp: 3.3.0 reflect-metadata: 0.2.2 swagger-ui-dist: 5.17.14 - dev: false + optionalDependencies: + '@fastify/static': 7.0.4 + class-transformer: 0.5.1 + class-validator: 0.14.1 - /@nestjs/testing@10.4.4(@nestjs/common@10.4.4)(@nestjs/core@10.4.4): - resolution: {integrity: sha512-qRGFj51A5RM7JqA8pcyEwSLA3Y0dle/PAZ8oxP0suimoCusRY3Tk7wYqutZdCNj1ATb678SDaUZDHk2pwSv9/g==} - peerDependencies: - '@nestjs/common': ^10.0.0 - '@nestjs/core': ^10.0.0 - '@nestjs/microservices': ^10.0.0 - '@nestjs/platform-express': ^10.0.0 - peerDependenciesMeta: - '@nestjs/microservices': - optional: true - '@nestjs/platform-express': - optional: true + '@nestjs/testing@10.4.4(@nestjs/common@10.4.4(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/core@10.4.4(@nestjs/common@10.4.4(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.2)(rxjs@7.8.1))(reflect-metadata@0.2.2)(rxjs@7.8.1))': dependencies: '@nestjs/common': 10.4.4(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.2)(rxjs@7.8.1) - '@nestjs/core': 10.4.4(@nestjs/common@10.4.4)(reflect-metadata@0.2.2)(rxjs@7.8.1) + '@nestjs/core': 10.4.4(@nestjs/common@10.4.4(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.2)(rxjs@7.8.1))(reflect-metadata@0.2.2)(rxjs@7.8.1) tslib: 2.7.0 - dev: true - /@nestjs/testing@9.4.0(@nestjs/common@9.4.0)(@nestjs/core@10.4.4): - resolution: {integrity: sha512-xZWp363P4otcebg++gSjUcdCfTK0RorORzyFq3aLaSAQOlq8kxfFDRIKzEATR4aOUfqTMMsAA8lhnMJWf35N6A==} - peerDependencies: - '@nestjs/common': ^9.0.0 - '@nestjs/core': ^9.0.0 - '@nestjs/microservices': ^9.0.0 - '@nestjs/platform-express': ^9.0.0 - peerDependenciesMeta: - '@nestjs/microservices': - optional: true - '@nestjs/platform-express': - optional: true + '@nestjs/testing@9.4.0(@nestjs/common@9.4.0(cache-manager@5.4.0)(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/core@10.4.4(@nestjs/common@10.4.4(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.2)(rxjs@7.8.1))(reflect-metadata@0.2.2)(rxjs@7.8.1))': dependencies: '@nestjs/common': 9.4.0(cache-manager@5.4.0)(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.2)(rxjs@7.8.1) - '@nestjs/core': 10.4.4(@nestjs/common@10.4.4)(reflect-metadata@0.2.2)(rxjs@7.8.1) + '@nestjs/core': 10.4.4(@nestjs/common@10.4.4(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.2)(rxjs@7.8.1))(reflect-metadata@0.2.2)(rxjs@7.8.1) tslib: 2.5.0 - dev: false - /@nodelib/fs.scandir@2.1.5: - resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} - engines: {node: '>= 8'} + '@nodelib/fs.scandir@2.1.5': dependencies: '@nodelib/fs.stat': 2.0.5 run-parallel: 1.2.0 - dev: true - /@nodelib/fs.stat@2.0.5: - resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} - engines: {node: '>= 8'} - dev: true + '@nodelib/fs.stat@2.0.5': {} - /@nodelib/fs.walk@1.2.8: - resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} - engines: {node: '>= 8'} + '@nodelib/fs.walk@1.2.8': dependencies: '@nodelib/fs.scandir': 2.1.5 fastq: 1.17.1 - dev: true - /@nodeteam/nestjs-prisma-pagination@1.0.6(@babel/core@7.23.9)(@nestjs/core@10.4.4)(@types/node@22.7.5)(cache-manager@5.4.0)(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.2)(rxjs@7.8.1)(ts-node@10.9.2): - resolution: {integrity: sha512-ZTTXIlbnphmtBt4xFlFfV7an5e2EvmC/P4nj7s0nbSgq8bYovjMAbGxlmBh/shxfVaQeYCl78SoSnYWOjIQMCA==} + '@nodeteam/nestjs-prisma-pagination@1.0.6(@babel/core@7.23.9)(@jest/types@29.6.3)(@nestjs/core@10.4.4(@nestjs/common@10.4.4(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.2)(rxjs@7.8.1))(reflect-metadata@0.2.2)(rxjs@7.8.1))(@types/node@22.7.5)(babel-jest@29.7.0(@babel/core@7.23.9))(cache-manager@5.4.0)(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.2)(rxjs@7.8.1)(ts-node@10.9.2(@types/node@22.7.5)(typescript@5.6.3))': dependencies: '@nestjs/common': 9.4.0(cache-manager@5.4.0)(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.2)(rxjs@7.8.1) - '@nestjs/testing': 9.4.0(@nestjs/common@9.4.0)(@nestjs/core@10.4.4) - jest: 29.5.0(@types/node@22.7.5)(ts-node@10.9.2) - ts-jest: 29.1.0(@babel/core@7.23.9)(jest@29.5.0)(typescript@5.0.4) + '@nestjs/testing': 9.4.0(@nestjs/common@9.4.0(cache-manager@5.4.0)(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/core@10.4.4(@nestjs/common@10.4.4(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.2)(rxjs@7.8.1))(reflect-metadata@0.2.2)(rxjs@7.8.1)) + jest: 29.5.0(@types/node@22.7.5)(ts-node@10.9.2(@types/node@22.7.5)(typescript@5.6.3)) + ts-jest: 29.1.0(@babel/core@7.23.9)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.23.9))(jest@29.5.0(@types/node@22.7.5)(ts-node@10.9.2(@types/node@22.7.5)(typescript@5.6.3)))(typescript@5.0.4) typescript: 5.0.4 transitivePeerDependencies: - '@babel/core' @@ -1788,12 +5995,8 @@ packages: - rxjs - supports-color - ts-node - dev: false - /@nuxtjs/opencollective@0.3.2: - resolution: {integrity: sha512-um0xL3fO7Mf4fDxcqx9KryrB7zgRM5JSlvGN5AGkP6JLM5XEKyjeAiPbNxdXVXQ16isuAhYpvP88NgL2BGd6aA==} - engines: {node: '>=8.0.0', npm: '>=5.0.0'} - hasBin: true + '@nuxtjs/opencollective@0.3.2': dependencies: chalk: 4.1.2 consola: 2.15.3 @@ -1801,29 +6004,16 @@ packages: transitivePeerDependencies: - encoding - /@open-draft/deferred-promise@2.2.0: - resolution: {integrity: sha512-CecwLWx3rhxVQF6V4bAgPS5t+So2sTbPgAzafKkVizyi7tlwpcFpdFqq+wqF2OwNBmqFuu6tOyouTuxgpMfzmA==} - dev: false + '@open-draft/deferred-promise@2.2.0': {} - /@pkgjs/parseargs@0.11.0: - resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} - engines: {node: '>=14'} - requiresBuild: true + '@pkgjs/parseargs@0.11.0': optional: true - /@pkgr/core@0.1.1: - resolution: {integrity: sha512-cq8o4cWH0ibXh9VGi5P20Tu9XF/0fFXl9EUinr9QfTM7a7p0oTA4iJRCQWppXR1Pg8dSM0UCItCkPwsk9qWWYA==} - engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} - dev: true + '@pkgr/core@0.1.1': {} - /@polka/url@0.5.0: - resolution: {integrity: sha512-oZLYFEAzUKyi3SKnXvj32ZCEGH6RDnao7COuCVhDydMS9NrCSVXhM79VaKyP5+Zc33m0QXEd2DN3UkU7OsHcfw==} - dev: true + '@polka/url@0.5.0': {} - /@pond918/prisma-generator-nestjs-dto@1.17.513: - resolution: {integrity: sha512-wq/GSVeVuD8kSm1Q6mC2T1MjNkyhn4wtD+N62Zp4XwV4hbxVNXUgLQsBn1lex8Yhd9DqHlVAawyTwKhLt6xBqg==} - engines: {node: '>=14'} - hasBin: true + '@pond918/prisma-generator-nestjs-dto@1.17.513': dependencies: '@prisma/generator-helper': 4.16.2 case: 1.6.3 @@ -1836,54 +6026,37 @@ packages: ts-toolbelt: 9.6.0 transitivePeerDependencies: - supports-color - dev: true - /@prisma/client@5.20.0(prisma@5.20.0): - resolution: {integrity: sha512-CLv55ZuMuUawMsxoqxGtLT3bEZoa2W8L3Qnp6rDIFWy+ZBrUcOFKdoeGPSnbBqxc3SkdxJrF+D1veN/WNynZYA==} - engines: {node: '>=16.13'} - requiresBuild: true - peerDependencies: - prisma: '*' - peerDependenciesMeta: - prisma: - optional: true - dependencies: + '@prisma/client@5.20.0(prisma@5.20.0)': + optionalDependencies: prisma: 5.20.0 - /@prisma/debug@4.16.2: - resolution: {integrity: sha512-7L7WbG0qNNZYgLpsVB8rCHCXEyHFyIycRlRDNwkVfjQmACC2OW6AWCYCbfdjQhkF/t7+S3njj8wAWAocSs+Brw==} + '@prisma/debug@4.16.2': dependencies: '@types/debug': 4.1.8 debug: 4.3.4 strip-ansi: 6.0.1 transitivePeerDependencies: - supports-color - dev: true - /@prisma/debug@5.20.0: - resolution: {integrity: sha512-oCx79MJ4HSujokA8S1g0xgZUGybD4SyIOydoHMngFYiwEwYDQ5tBQkK5XoEHuwOYDKUOKRn/J0MEymckc4IgsQ==} + '@prisma/debug@5.20.0': {} - /@prisma/engines-version@5.20.0-12.06fc58a368dc7be9fbbbe894adf8d445d208c284: - resolution: {integrity: sha512-Lg8AS5lpi0auZe2Mn4gjuCg081UZf88k3cn0RCwHgR+6cyHHpttPZBElJTHf83ZGsRNAmVCZCfUGA57WB4u4JA==} + '@prisma/engines-version@5.20.0-12.06fc58a368dc7be9fbbbe894adf8d445d208c284': {} - /@prisma/engines@5.20.0: - resolution: {integrity: sha512-DtqkP+hcZvPEbj8t8dK5df2b7d3B8GNauKqaddRRqQBBlgkbdhJkxhoJTrOowlS3vaRt2iMCkU0+CSNn0KhqAQ==} - requiresBuild: true + '@prisma/engines@5.20.0': dependencies: '@prisma/debug': 5.20.0 '@prisma/engines-version': 5.20.0-12.06fc58a368dc7be9fbbbe894adf8d445d208c284 '@prisma/fetch-engine': 5.20.0 '@prisma/get-platform': 5.20.0 - /@prisma/fetch-engine@5.20.0: - resolution: {integrity: sha512-JVcaPXC940wOGpCOwuqQRTz6I9SaBK0c1BAyC1pcz9xBi+dzFgUu3G/p9GV1FhFs9OKpfSpIhQfUJE9y00zhqw==} + '@prisma/fetch-engine@5.20.0': dependencies: '@prisma/debug': 5.20.0 '@prisma/engines-version': 5.20.0-12.06fc58a368dc7be9fbbbe894adf8d445d208c284 '@prisma/get-platform': 5.20.0 - /@prisma/generator-helper@4.16.2: - resolution: {integrity: sha512-bMOH7y73Ui7gpQrioFeavMQA+Tf8ksaVf8Nhs9rQNzuSg8SSV6E9baczob0L5KGZTSgYoqnrRxuo03kVJYrnIg==} + '@prisma/generator-helper@4.16.2': dependencies: '@prisma/debug': 4.16.2 '@types/cross-spawn': 6.0.2 @@ -1891,51 +6064,38 @@ packages: kleur: 4.1.5 transitivePeerDependencies: - supports-color - dev: true - /@prisma/get-platform@5.20.0: - resolution: {integrity: sha512-8/+CehTZZNzJlvuryRgc77hZCWrUDYd/PmlZ7p2yNXtmf2Una4BWnTbak3us6WVdqoz5wmptk6IhsXdG2v5fmA==} + '@prisma/get-platform@5.20.0': dependencies: '@prisma/debug': 5.20.0 - /@schematics/angular@13.3.11: - resolution: {integrity: sha512-imKBnKYEse0SBVELZO/753nkpt3eEgpjrYkB+AFWF9YfO/4RGnYXDHoH8CFkzxPH9QQCgNrmsVFNiYGS+P/S1A==} - engines: {node: ^12.20.0 || ^14.15.0 || >=16.10.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: '>= 1.13.0'} + '@schematics/angular@13.3.11(chokidar@3.6.0)': dependencies: - '@angular-devkit/core': 13.3.11 - '@angular-devkit/schematics': 13.3.11 + '@angular-devkit/core': 13.3.11(chokidar@3.6.0) + '@angular-devkit/schematics': 13.3.11(chokidar@3.6.0) jsonc-parser: 3.0.0 transitivePeerDependencies: - chokidar - dev: false - /@sinclair/typebox@0.27.8: - resolution: {integrity: sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==} + '@sinclair/typebox@0.27.8': {} - /@sinonjs/commons@3.0.1: - resolution: {integrity: sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==} + '@sinonjs/commons@3.0.1': dependencies: type-detect: 4.0.8 - /@sinonjs/fake-timers@10.3.0: - resolution: {integrity: sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==} + '@sinonjs/fake-timers@10.3.0': dependencies: '@sinonjs/commons': 3.0.1 - /@tsconfig/node10@1.0.9: - resolution: {integrity: sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==} + '@tsconfig/node10@1.0.9': {} - /@tsconfig/node12@1.0.11: - resolution: {integrity: sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==} + '@tsconfig/node12@1.0.11': {} - /@tsconfig/node14@1.0.3: - resolution: {integrity: sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==} + '@tsconfig/node14@1.0.3': {} - /@tsconfig/node16@1.0.4: - resolution: {integrity: sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==} + '@tsconfig/node16@1.0.4': {} - /@types/babel__core@7.20.5: - resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==} + '@types/babel__core@7.20.5': dependencies: '@babel/parser': 7.23.9 '@babel/types': 7.23.9 @@ -1943,323 +6103,214 @@ packages: '@types/babel__template': 7.4.4 '@types/babel__traverse': 7.20.5 - /@types/babel__generator@7.6.8: - resolution: {integrity: sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==} + '@types/babel__generator@7.6.8': dependencies: '@babel/types': 7.23.9 - /@types/babel__template@7.4.4: - resolution: {integrity: sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==} + '@types/babel__template@7.4.4': dependencies: '@babel/parser': 7.23.9 '@babel/types': 7.23.9 - /@types/babel__traverse@7.20.5: - resolution: {integrity: sha512-WXCyOcRtH37HAUkpXhUduaxdm82b4GSlyTqajXviN4EfiuPgNYR109xMCKvpl6zPIpua0DGlMEDCq+g8EdoheQ==} + '@types/babel__traverse@7.20.5': dependencies: '@babel/types': 7.23.9 - /@types/bcrypt@5.0.2: - resolution: {integrity: sha512-6atioO8Y75fNcbmj0G7UjI9lXN2pQ/IGJ2FWT4a/btd0Lk9lQalHLKhkgKVZ3r+spnmWUKfbMi1GEe9wyHQfNQ==} + '@types/bcrypt@5.0.2': dependencies: '@types/node': 22.7.5 - dev: true - /@types/body-parser@1.19.5: - resolution: {integrity: sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==} + '@types/body-parser@1.19.5': dependencies: '@types/connect': 3.4.38 '@types/node': 22.7.5 - dev: true - /@types/connect@3.4.38: - resolution: {integrity: sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==} + '@types/connect@3.4.38': dependencies: '@types/node': 22.7.5 - dev: true - /@types/conventional-commits-parser@5.0.0: - resolution: {integrity: sha512-loB369iXNmAZglwWATL+WRe+CRMmmBPtpolYzIebFaX4YA3x+BEfLqhUAV9WanycKI3TG1IMr5bMJDajDKLlUQ==} + '@types/conventional-commits-parser@5.0.0': dependencies: '@types/node': 22.7.5 - dev: true - /@types/cookiejar@2.1.5: - resolution: {integrity: sha512-he+DHOWReW0nghN24E1WUqM0efK4kI9oTqDm6XmK8ZPe2djZ90BSNdGnIyCLzCPw7/pogPlGbzI2wHGGmi4O/Q==} - dev: true + '@types/cookiejar@2.1.5': {} - /@types/cross-spawn@6.0.2: - resolution: {integrity: sha512-KuwNhp3eza+Rhu8IFI5HUXRP0LIhqH5cAjubUvGXXthh4YYBuP2ntwEX+Cz8GJoZUHlKo247wPWOfA9LYEq4cw==} + '@types/cross-spawn@6.0.2': dependencies: '@types/node': 22.7.5 - dev: true - /@types/debug@4.1.8: - resolution: {integrity: sha512-/vPO1EPOs306Cvhwv7KfVfYvOJqA/S/AXjaHQiJboCZzcNDb+TIJFN9/2C9DZ//ijSKWioNyUxD792QmDJ+HKQ==} + '@types/debug@4.1.8': dependencies: '@types/ms': 0.7.34 - dev: true - /@types/dot@1.1.7: - resolution: {integrity: sha512-RhMcnI18Y+401Nceh2pW5gTGgsdfZdvg9g0P/5HIBJ0jmZEv5KlkYvfQiHhw4/Vnb8NdePi/4UCs92ITExLxuQ==} - dev: true + '@types/dot@1.1.7': {} - /@types/estree@1.0.6: - resolution: {integrity: sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==} - dev: true + '@types/estree@1.0.6': {} - /@types/express-serve-static-core@4.17.43: - resolution: {integrity: sha512-oaYtiBirUOPQGSWNGPWnzyAFJ0BP3cwvN4oWZQY+zUBwpVIGsKUkpBpSztp74drYcjavs7SKFZ4DX1V2QeN8rg==} + '@types/express-serve-static-core@4.17.43': dependencies: '@types/node': 22.7.5 '@types/qs': 6.9.11 '@types/range-parser': 1.2.7 '@types/send': 0.17.4 - dev: true - /@types/express@4.17.17: - resolution: {integrity: sha512-Q4FmmuLGBG58btUnfS1c1r/NQdlp3DMfGDGig8WhfpA2YRUtEkxAjkZb0yvplJGYdF1fsQ81iMDcH24sSCNC/Q==} + '@types/express@4.17.17': dependencies: '@types/body-parser': 1.19.5 '@types/express-serve-static-core': 4.17.43 '@types/qs': 6.9.11 '@types/serve-static': 1.15.5 - dev: true - /@types/graceful-fs@4.1.9: - resolution: {integrity: sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==} + '@types/graceful-fs@4.1.9': dependencies: '@types/node': 22.7.5 - /@types/http-errors@2.0.4: - resolution: {integrity: sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA==} - dev: true + '@types/http-errors@2.0.4': {} - /@types/istanbul-lib-coverage@2.0.6: - resolution: {integrity: sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==} + '@types/istanbul-lib-coverage@2.0.6': {} - /@types/istanbul-lib-report@3.0.3: - resolution: {integrity: sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==} + '@types/istanbul-lib-report@3.0.3': dependencies: '@types/istanbul-lib-coverage': 2.0.6 - /@types/istanbul-reports@3.0.4: - resolution: {integrity: sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==} + '@types/istanbul-reports@3.0.4': dependencies: '@types/istanbul-lib-report': 3.0.3 - /@types/jest@29.5.13: - resolution: {integrity: sha512-wd+MVEZCHt23V0/L642O5APvspWply/rGY5BcW4SUETo2UzPU3Z26qr8jC2qxpimI2jjx9h7+2cj2FwIr01bXg==} + '@types/jest@29.5.13': dependencies: expect: 29.7.0 pretty-format: 29.7.0 - dev: true - /@types/json-schema@7.0.15: - resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} + '@types/json-schema@7.0.15': {} - /@types/jsonwebtoken@9.0.5: - resolution: {integrity: sha512-VRLSGzik+Unrup6BsouBeHsf4d1hOEgYWTm/7Nmw1sXoN1+tRly/Gy/po3yeahnP4jfnQWWAhQAqcNfH7ngOkA==} + '@types/jsonwebtoken@9.0.5': dependencies: '@types/node': 22.7.5 - /@types/methods@1.1.4: - resolution: {integrity: sha512-ymXWVrDiCxTBE3+RIrrP533E70eA+9qu7zdWoHuOmGujkYtzf4HQF96b8nwHLqhuf4ykX61IGRIB38CC6/sImQ==} - dev: true + '@types/methods@1.1.4': {} - /@types/mime@1.3.5: - resolution: {integrity: sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==} - dev: true + '@types/mime@1.3.5': {} - /@types/mime@3.0.4: - resolution: {integrity: sha512-iJt33IQnVRkqeqC7PzBHPTC6fDlRNRW8vjrgqtScAhrmMwe8c4Eo7+fUGTa+XdWrpEgpyKWMYmi2dIwMAYRzPw==} - dev: true + '@types/mime@3.0.4': {} - /@types/minimist@1.2.5: - resolution: {integrity: sha512-hov8bUuiLiyFPGyFPE1lwWhmzYbirOXQNNo40+y3zow8aFVTeyn3VWL0VFFfdNddA8S4Vf0Tc062rzyNr7Paag==} - dev: true + '@types/minimist@1.2.5': {} - /@types/ms@0.7.34: - resolution: {integrity: sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g==} - dev: true + '@types/ms@0.7.34': {} - /@types/node@22.7.5: - resolution: {integrity: sha512-jML7s2NAzMWc//QSJ1a3prpk78cOPchGvXJsC3C6R6PSMoooztvRVQEz89gmBTBY1SPMaqo5teB4uNHPdetShQ==} + '@types/node@22.7.5': dependencies: undici-types: 6.19.8 - /@types/normalize-package-data@2.4.4: - resolution: {integrity: sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==} - dev: true + '@types/normalize-package-data@2.4.4': {} - /@types/passport-jwt@4.0.1: - resolution: {integrity: sha512-Y0Ykz6nWP4jpxgEUYq8NoVZeCQPo1ZndJLfapI249g1jHChvRfZRO/LS3tqu26YgAS/laI1qx98sYGz0IalRXQ==} + '@types/passport-jwt@4.0.1': dependencies: '@types/jsonwebtoken': 9.0.5 '@types/passport-strategy': 0.2.38 - dev: true - /@types/passport-local@1.0.38: - resolution: {integrity: sha512-nsrW4A963lYE7lNTv9cr5WmiUD1ibYJvWrpE13oxApFsRt77b0RdtZvKbCdNIY4v/QZ6TRQWaDDEwV1kCTmcXg==} + '@types/passport-local@1.0.38': dependencies: '@types/express': 4.17.17 '@types/passport': 1.0.16 '@types/passport-strategy': 0.2.38 - dev: true - /@types/passport-strategy@0.2.38: - resolution: {integrity: sha512-GC6eMqqojOooq993Tmnmp7AUTbbQSgilyvpCYQjT+H6JfG/g6RGc7nXEniZlp0zyKJ0WUdOiZWLBZft9Yug1uA==} + '@types/passport-strategy@0.2.38': dependencies: '@types/express': 4.17.17 '@types/passport': 1.0.16 - dev: true - /@types/passport@1.0.16: - resolution: {integrity: sha512-FD0qD5hbPWQzaM0wHUnJ/T0BBCJBxCeemtnCwc/ThhTg3x9jfrAcRUmj5Dopza+MfFS9acTe3wk7rcVnRIp/0A==} + '@types/passport@1.0.16': dependencies: '@types/express': 4.17.17 - dev: true - /@types/qs@6.9.11: - resolution: {integrity: sha512-oGk0gmhnEJK4Yyk+oI7EfXsLayXatCWPHary1MtcmbAifkobT9cM9yutG/hZKIseOU0MqbIwQ/u2nn/Gb+ltuQ==} - dev: true + '@types/qs@6.9.11': {} - /@types/range-parser@1.2.7: - resolution: {integrity: sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==} - dev: true + '@types/range-parser@1.2.7': {} - /@types/send@0.17.4: - resolution: {integrity: sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==} + '@types/send@0.17.4': dependencies: '@types/mime': 1.3.5 '@types/node': 22.7.5 - dev: true - /@types/serve-static@1.15.5: - resolution: {integrity: sha512-PDRk21MnK70hja/YF8AHfC7yIsiQHn1rcXx7ijCFBX/k+XQJhQT/gw3xekXKJvx+5SXaMMS8oqQy09Mzvz2TuQ==} + '@types/serve-static@1.15.5': dependencies: '@types/http-errors': 2.0.4 '@types/mime': 3.0.4 '@types/node': 22.7.5 - dev: true - /@types/stack-utils@2.0.3: - resolution: {integrity: sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==} + '@types/stack-utils@2.0.3': {} - /@types/superagent@8.1.3: - resolution: {integrity: sha512-R/CfN6w2XsixLb1Ii8INfn+BT9sGPvw74OavfkW4SwY+jeUcAwLZv2+bXLJkndnimxjEBm0RPHgcjW9pLCa8cw==} + '@types/superagent@8.1.3': dependencies: '@types/cookiejar': 2.1.5 '@types/methods': 1.1.4 '@types/node': 22.7.5 - dev: true - /@types/supertest@6.0.2: - resolution: {integrity: sha512-137ypx2lk/wTQbW6An6safu9hXmajAifU/s7szAHLN/FeIm5w7yR0Wkl9fdJMRSHwOn4HLAI0DaB2TOORuhPDg==} + '@types/supertest@6.0.2': dependencies: '@types/methods': 1.1.4 '@types/superagent': 8.1.3 - dev: true - /@types/validator@13.11.9: - resolution: {integrity: sha512-FCTsikRozryfayPuiI46QzH3fnrOoctTjvOYZkho9BTFLCOZ2rgZJHMOVgCOfttjPJcgOx52EpkY0CMfy87MIw==} + '@types/validator@13.11.9': {} - /@types/yargs-parser@21.0.3: - resolution: {integrity: sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==} + '@types/yargs-parser@21.0.3': {} - /@types/yargs@17.0.32: - resolution: {integrity: sha512-xQ67Yc/laOG5uMfX/093MRlGGCIBzZMarVa+gfNKJxWAIgykYpVGkBdbqEzGDDfCrVUj6Hiff4mTZ5BA6TmAog==} + '@types/yargs@17.0.32': dependencies: '@types/yargs-parser': 21.0.3 - /@typescript-eslint/eslint-plugin@8.8.1(@typescript-eslint/parser@8.8.1)(eslint@9.12.0)(typescript@5.6.3): - resolution: {integrity: sha512-xfvdgA8AP/vxHgtgU310+WBnLB4uJQ9XdyP17RebG26rLtDrQJV3ZYrcopX91GrHmMoH8bdSwMRh2a//TiJ1jQ==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - '@typescript-eslint/parser': ^8.0.0 || ^8.0.0-alpha.0 - eslint: ^8.57.0 || ^9.0.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true + '@typescript-eslint/eslint-plugin@8.8.1(@typescript-eslint/parser@8.8.1(eslint@9.12.0(jiti@1.21.0))(typescript@5.6.3))(eslint@9.12.0(jiti@1.21.0))(typescript@5.6.3)': dependencies: '@eslint-community/regexpp': 4.10.0 - '@typescript-eslint/parser': 8.8.1(eslint@9.12.0)(typescript@5.6.3) + '@typescript-eslint/parser': 8.8.1(eslint@9.12.0(jiti@1.21.0))(typescript@5.6.3) '@typescript-eslint/scope-manager': 8.8.1 - '@typescript-eslint/type-utils': 8.8.1(eslint@9.12.0)(typescript@5.6.3) - '@typescript-eslint/utils': 8.8.1(eslint@9.12.0)(typescript@5.6.3) + '@typescript-eslint/type-utils': 8.8.1(eslint@9.12.0(jiti@1.21.0))(typescript@5.6.3) + '@typescript-eslint/utils': 8.8.1(eslint@9.12.0(jiti@1.21.0))(typescript@5.6.3) '@typescript-eslint/visitor-keys': 8.8.1 - eslint: 9.12.0 + eslint: 9.12.0(jiti@1.21.0) graphemer: 1.4.0 ignore: 5.3.1 natural-compare: 1.4.0 ts-api-utils: 1.3.0(typescript@5.6.3) + optionalDependencies: typescript: 5.6.3 transitivePeerDependencies: - supports-color - dev: true - /@typescript-eslint/parser@8.8.1(eslint@9.12.0)(typescript@5.6.3): - resolution: {integrity: sha512-hQUVn2Lij2NAxVFEdvIGxT9gP1tq2yM83m+by3whWFsWC+1y8pxxxHUFE1UqDu2VsGi2i6RLcv4QvouM84U+ow==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - eslint: ^8.57.0 || ^9.0.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true + '@typescript-eslint/parser@8.8.1(eslint@9.12.0(jiti@1.21.0))(typescript@5.6.3)': dependencies: '@typescript-eslint/scope-manager': 8.8.1 '@typescript-eslint/types': 8.8.1 '@typescript-eslint/typescript-estree': 8.8.1(typescript@5.6.3) '@typescript-eslint/visitor-keys': 8.8.1 debug: 4.3.4 - eslint: 9.12.0 + eslint: 9.12.0(jiti@1.21.0) + optionalDependencies: typescript: 5.6.3 transitivePeerDependencies: - supports-color - dev: true - /@typescript-eslint/scope-manager@8.8.1: - resolution: {integrity: sha512-X4JdU+66Mazev/J0gfXlcC/dV6JI37h+93W9BRYXrSn0hrE64IoWgVkO9MSJgEzoWkxONgaQpICWg8vAN74wlA==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@typescript-eslint/scope-manager@8.8.1': dependencies: '@typescript-eslint/types': 8.8.1 '@typescript-eslint/visitor-keys': 8.8.1 - dev: true - /@typescript-eslint/type-utils@8.8.1(eslint@9.12.0)(typescript@5.6.3): - resolution: {integrity: sha512-qSVnpcbLP8CALORf0za+vjLYj1Wp8HSoiI8zYU5tHxRVj30702Z1Yw4cLwfNKhTPWp5+P+k1pjmD5Zd1nhxiZA==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true + '@typescript-eslint/type-utils@8.8.1(eslint@9.12.0(jiti@1.21.0))(typescript@5.6.3)': dependencies: '@typescript-eslint/typescript-estree': 8.8.1(typescript@5.6.3) - '@typescript-eslint/utils': 8.8.1(eslint@9.12.0)(typescript@5.6.3) + '@typescript-eslint/utils': 8.8.1(eslint@9.12.0(jiti@1.21.0))(typescript@5.6.3) debug: 4.3.4 ts-api-utils: 1.3.0(typescript@5.6.3) + optionalDependencies: typescript: 5.6.3 transitivePeerDependencies: - eslint - supports-color - dev: true - /@typescript-eslint/types@8.8.1: - resolution: {integrity: sha512-WCcTP4SDXzMd23N27u66zTKMuEevH4uzU8C9jf0RO4E04yVHgQgW+r+TeVTNnO1KIfrL8ebgVVYYMMO3+jC55Q==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - dev: true + '@typescript-eslint/types@8.8.1': {} - /@typescript-eslint/typescript-estree@8.8.1(typescript@5.6.3): - resolution: {integrity: sha512-A5d1R9p+X+1js4JogdNilDuuq+EHZdsH9MjTVxXOdVFfTJXunKJR/v+fNNyO4TnoOn5HqobzfRlc70NC6HTcdg==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true + '@typescript-eslint/typescript-estree@8.8.1(typescript@5.6.3)': dependencies: '@typescript-eslint/types': 8.8.1 '@typescript-eslint/visitor-keys': 8.8.1 @@ -2269,93 +6320,64 @@ packages: minimatch: 9.0.5 semver: 7.6.3 ts-api-utils: 1.3.0(typescript@5.6.3) + optionalDependencies: typescript: 5.6.3 transitivePeerDependencies: - supports-color - dev: true - /@typescript-eslint/utils@8.8.1(eslint@9.12.0)(typescript@5.6.3): - resolution: {integrity: sha512-/QkNJDbV0bdL7H7d0/y0qBbV2HTtf0TIyjSDTvvmQEzeVx8jEImEbLuOA4EsvE8gIgqMitns0ifb5uQhMj8d9w==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - eslint: ^8.57.0 || ^9.0.0 + '@typescript-eslint/utils@8.8.1(eslint@9.12.0(jiti@1.21.0))(typescript@5.6.3)': dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@9.12.0) + '@eslint-community/eslint-utils': 4.4.0(eslint@9.12.0(jiti@1.21.0)) '@typescript-eslint/scope-manager': 8.8.1 '@typescript-eslint/types': 8.8.1 '@typescript-eslint/typescript-estree': 8.8.1(typescript@5.6.3) - eslint: 9.12.0 + eslint: 9.12.0(jiti@1.21.0) transitivePeerDependencies: - supports-color - typescript - dev: true - /@typescript-eslint/visitor-keys@8.8.1: - resolution: {integrity: sha512-0/TdC3aeRAsW7MDvYRwEc1Uwm0TIBfzjPFgg60UU2Haj5qsCs9cc3zNgY71edqE3LbWfF/WoZQd3lJoDXFQpag==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@typescript-eslint/visitor-keys@8.8.1': dependencies: '@typescript-eslint/types': 8.8.1 eslint-visitor-keys: 3.4.3 - dev: true - /@webassemblyjs/ast@1.12.1: - resolution: {integrity: sha512-EKfMUOPRRUTy5UII4qJDGPpqfwjOmZ5jeGFwid9mnoqIFK+e0vqoi1qH56JpmZSzEL53jKnNzScdmftJyG5xWg==} + '@webassemblyjs/ast@1.12.1': dependencies: '@webassemblyjs/helper-numbers': 1.11.6 '@webassemblyjs/helper-wasm-bytecode': 1.11.6 - dev: true - /@webassemblyjs/floating-point-hex-parser@1.11.6: - resolution: {integrity: sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==} - dev: true + '@webassemblyjs/floating-point-hex-parser@1.11.6': {} - /@webassemblyjs/helper-api-error@1.11.6: - resolution: {integrity: sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==} - dev: true + '@webassemblyjs/helper-api-error@1.11.6': {} - /@webassemblyjs/helper-buffer@1.12.1: - resolution: {integrity: sha512-nzJwQw99DNDKr9BVCOZcLuJJUlqkJh+kVzVl6Fmq/tI5ZtEyWT1KZMyOXltXLZJmDtvLCDgwsyrkohEtopTXCw==} - dev: true + '@webassemblyjs/helper-buffer@1.12.1': {} - /@webassemblyjs/helper-numbers@1.11.6: - resolution: {integrity: sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==} + '@webassemblyjs/helper-numbers@1.11.6': dependencies: '@webassemblyjs/floating-point-hex-parser': 1.11.6 '@webassemblyjs/helper-api-error': 1.11.6 '@xtuc/long': 4.2.2 - dev: true - /@webassemblyjs/helper-wasm-bytecode@1.11.6: - resolution: {integrity: sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==} - dev: true + '@webassemblyjs/helper-wasm-bytecode@1.11.6': {} - /@webassemblyjs/helper-wasm-section@1.12.1: - resolution: {integrity: sha512-Jif4vfB6FJlUlSbgEMHUyk1j234GTNG9dBJ4XJdOySoj518Xj0oGsNi59cUQF4RRMS9ouBUxDDdyBVfPTypa5g==} + '@webassemblyjs/helper-wasm-section@1.12.1': dependencies: '@webassemblyjs/ast': 1.12.1 '@webassemblyjs/helper-buffer': 1.12.1 '@webassemblyjs/helper-wasm-bytecode': 1.11.6 '@webassemblyjs/wasm-gen': 1.12.1 - dev: true - /@webassemblyjs/ieee754@1.11.6: - resolution: {integrity: sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==} + '@webassemblyjs/ieee754@1.11.6': dependencies: '@xtuc/ieee754': 1.2.0 - dev: true - /@webassemblyjs/leb128@1.11.6: - resolution: {integrity: sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==} + '@webassemblyjs/leb128@1.11.6': dependencies: '@xtuc/long': 4.2.2 - dev: true - /@webassemblyjs/utf8@1.11.6: - resolution: {integrity: sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==} - dev: true + '@webassemblyjs/utf8@1.11.6': {} - /@webassemblyjs/wasm-edit@1.12.1: - resolution: {integrity: sha512-1DuwbVvADvS5mGnXbE+c9NfA8QRcZ6iKquqjjmR10k6o+zzsRVesil54DKexiowcFCPdr/Q0qaMgB01+SQ1u6g==} + '@webassemblyjs/wasm-edit@1.12.1': dependencies: '@webassemblyjs/ast': 1.12.1 '@webassemblyjs/helper-buffer': 1.12.1 @@ -2365,29 +6387,23 @@ packages: '@webassemblyjs/wasm-opt': 1.12.1 '@webassemblyjs/wasm-parser': 1.12.1 '@webassemblyjs/wast-printer': 1.12.1 - dev: true - /@webassemblyjs/wasm-gen@1.12.1: - resolution: {integrity: sha512-TDq4Ojh9fcohAw6OIMXqiIcTq5KUXTGRkVxbSo1hQnSy6lAM5GSdfwWeSxpAo0YzgsgF182E/U0mDNhuA0tW7w==} + '@webassemblyjs/wasm-gen@1.12.1': dependencies: '@webassemblyjs/ast': 1.12.1 '@webassemblyjs/helper-wasm-bytecode': 1.11.6 '@webassemblyjs/ieee754': 1.11.6 '@webassemblyjs/leb128': 1.11.6 '@webassemblyjs/utf8': 1.11.6 - dev: true - /@webassemblyjs/wasm-opt@1.12.1: - resolution: {integrity: sha512-Jg99j/2gG2iaz3hijw857AVYekZe2SAskcqlWIZXjji5WStnOpVoat3gQfT/Q5tb2djnCjBtMocY/Su1GfxPBg==} + '@webassemblyjs/wasm-opt@1.12.1': dependencies: '@webassemblyjs/ast': 1.12.1 '@webassemblyjs/helper-buffer': 1.12.1 '@webassemblyjs/wasm-gen': 1.12.1 '@webassemblyjs/wasm-parser': 1.12.1 - dev: true - /@webassemblyjs/wasm-parser@1.12.1: - resolution: {integrity: sha512-xikIi7c2FHXysxXe3COrVUPSheuBtpcfhbpFj4gmu7KRLYOzANztwUU0IbsqvMqzuNK2+glRGWCEqZo1WCLyAQ==} + '@webassemblyjs/wasm-parser@1.12.1': dependencies: '@webassemblyjs/ast': 1.12.1 '@webassemblyjs/helper-api-error': 1.11.6 @@ -2395,293 +6411,161 @@ packages: '@webassemblyjs/ieee754': 1.11.6 '@webassemblyjs/leb128': 1.11.6 '@webassemblyjs/utf8': 1.11.6 - dev: true - /@webassemblyjs/wast-printer@1.12.1: - resolution: {integrity: sha512-+X4WAlOisVWQMikjbcvY2e0rwPsKQ9F688lksZhBcPycBBuii3O7m8FACbDMWDojpAqvjIncrG8J0XHKyQfVeA==} + '@webassemblyjs/wast-printer@1.12.1': dependencies: '@webassemblyjs/ast': 1.12.1 '@xtuc/long': 4.2.2 - dev: true - /@xtuc/ieee754@1.2.0: - resolution: {integrity: sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==} - dev: true + '@xtuc/ieee754@1.2.0': {} - /@xtuc/long@4.2.2: - resolution: {integrity: sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==} - dev: true + '@xtuc/long@4.2.2': {} - /JSONStream@1.3.5: - resolution: {integrity: sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==} - hasBin: true + JSONStream@1.3.5: dependencies: jsonparse: 1.3.1 through: 2.3.8 - dev: true - /abbrev@1.1.1: - resolution: {integrity: sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==} - dev: false + abbrev@1.1.1: {} - /abort-controller@3.0.0: - resolution: {integrity: sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==} - engines: {node: '>=6.5'} + abort-controller@3.0.0: dependencies: event-target-shim: 5.0.1 - dev: false - /abstract-logging@2.0.1: - resolution: {integrity: sha512-2BjRTZxTPvheOvGbBslFSYOUkr+SjPtOnrLP33f+VIWLzezQpZcqVg7ja3L4dBXmzzgwT+a029jRx5PCi3JuiA==} - dev: false + abstract-logging@2.0.1: {} - /acorn-import-attributes@1.9.5(acorn@8.11.3): - resolution: {integrity: sha512-n02Vykv5uA3eHGM/Z2dQrcD56kL8TyDb2p1+0P83PClMnC/nc+anbQRhIOWnSq4Ke/KvDPrY3C9hDtC/A3eHnQ==} - peerDependencies: - acorn: ^8 + acorn-import-attributes@1.9.5(acorn@8.11.3): dependencies: acorn: 8.11.3 - dev: true - /acorn-jsx@5.3.2(acorn@8.12.1): - resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} - peerDependencies: - acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + acorn-jsx@5.3.2(acorn@8.12.1): dependencies: acorn: 8.12.1 - dev: true - /acorn-walk@8.3.2: - resolution: {integrity: sha512-cjkyv4OtNCIeqhHrfS81QWXoCBPExR/J62oyEqepVw8WaQeSqpW2uhuLPh1m9eWhDuOo/jUXVTlifvesOWp/4A==} - engines: {node: '>=0.4.0'} + acorn-walk@8.3.2: {} - /acorn@4.0.13: - resolution: {integrity: sha512-fu2ygVGuMmlzG8ZeRJ0bvR41nsAkxxhbyk8bZ1SS521Z7vmgJFTQQlfz/Mp/nJexGBz+v8sC9bM6+lNgskt4Ug==} - engines: {node: '>=0.4.0'} - hasBin: true - dev: false + acorn@4.0.13: {} - /acorn@8.11.3: - resolution: {integrity: sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==} - engines: {node: '>=0.4.0'} - hasBin: true + acorn@8.11.3: {} - /acorn@8.12.1: - resolution: {integrity: sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==} - engines: {node: '>=0.4.0'} - hasBin: true - dev: true + acorn@8.12.1: {} - /add-stream@1.0.0: - resolution: {integrity: sha512-qQLMr+8o0WC4FZGQTcJiKBVC59JylcPSrTtk6usvmIDFUOCKegapy1VHQwRbFMOFyb/inzUVqHs+eMYKDM1YeQ==} - dev: true + add-stream@1.0.0: {} - /agent-base@6.0.2: - resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==} - engines: {node: '>= 6.0.0'} + agent-base@6.0.2: dependencies: debug: 4.3.4 transitivePeerDependencies: - supports-color - dev: false - /ajv-formats@2.1.1(ajv@8.12.0): - resolution: {integrity: sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==} - peerDependencies: - ajv: ^8.0.0 - peerDependenciesMeta: - ajv: - optional: true - dependencies: + ajv-formats@2.1.1(ajv@8.12.0): + optionalDependencies: ajv: 8.12.0 - /ajv-formats@2.1.1(ajv@8.9.0): - resolution: {integrity: sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==} - peerDependencies: - ajv: ^8.0.0 - peerDependenciesMeta: - ajv: - optional: true - dependencies: + ajv-formats@2.1.1(ajv@8.9.0): + optionalDependencies: ajv: 8.9.0 - dev: false - /ajv-keywords@3.5.2(ajv@6.12.6): - resolution: {integrity: sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==} - peerDependencies: - ajv: ^6.9.1 + ajv-keywords@3.5.2(ajv@6.12.6): dependencies: ajv: 6.12.6 - dev: true - /ajv@6.12.6: - resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} + ajv@6.12.6: dependencies: fast-deep-equal: 3.1.3 fast-json-stable-stringify: 2.1.0 json-schema-traverse: 0.4.1 uri-js: 4.4.1 - dev: true - /ajv@8.12.0: - resolution: {integrity: sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==} + ajv@8.12.0: dependencies: fast-deep-equal: 3.1.3 json-schema-traverse: 1.0.0 require-from-string: 2.0.2 uri-js: 4.4.1 - /ajv@8.9.0: - resolution: {integrity: sha512-qOKJyNj/h+OWx7s5DePL6Zu1KeM9jPZhwBqs+7DzP6bGOvqzVCSf0xueYmVuaC/oQ/VtS2zLMLHdQFbkka+XDQ==} + ajv@8.9.0: dependencies: fast-deep-equal: 3.1.3 json-schema-traverse: 1.0.0 require-from-string: 2.0.2 uri-js: 4.4.1 - dev: false - /ansi-colors@4.1.3: - resolution: {integrity: sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==} - engines: {node: '>=6'} - dev: true + ansi-colors@4.1.3: {} - /ansi-escapes@4.3.2: - resolution: {integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==} - engines: {node: '>=8'} + ansi-escapes@4.3.2: dependencies: type-fest: 0.21.3 - /ansi-regex@2.1.1: - resolution: {integrity: sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==} - engines: {node: '>=0.10.0'} - dev: false - - /ansi-regex@5.0.1: - resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} - engines: {node: '>=8'} + ansi-regex@2.1.1: {} - /ansi-regex@6.0.1: - resolution: {integrity: sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==} - engines: {node: '>=12'} + ansi-regex@5.0.1: {} - /ansi-styles@2.2.1: - resolution: {integrity: sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==} - engines: {node: '>=0.10.0'} - dev: false + ansi-regex@6.0.1: {} - /ansi-styles@3.2.1: - resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} - engines: {node: '>=4'} + ansi-styles@2.2.1: {} + + ansi-styles@3.2.1: dependencies: color-convert: 1.9.3 - /ansi-styles@4.3.0: - resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} - engines: {node: '>=8'} + ansi-styles@4.3.0: dependencies: color-convert: 2.0.1 - /ansi-styles@5.2.0: - resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==} - engines: {node: '>=10'} + ansi-styles@5.2.0: {} - /ansi-styles@6.2.1: - resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} - engines: {node: '>=12'} + ansi-styles@6.2.1: {} - /anymatch@3.1.3: - resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} - engines: {node: '>= 8'} + anymatch@3.1.3: dependencies: normalize-path: 3.0.0 picomatch: 2.3.1 - /aproba@2.0.0: - resolution: {integrity: sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==} - dev: false + aproba@2.0.0: {} - /archy@1.0.0: - resolution: {integrity: sha512-Xg+9RwCg/0p32teKdGMPTPnVXKD0w3DfHnFTficozsAgsvq2XenPJq/MYpzzQ/v8zrOyJn6Ds39VA4JIDwFfqw==} - dev: false + archy@1.0.0: {} - /are-we-there-yet@2.0.0: - resolution: {integrity: sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==} - engines: {node: '>=10'} + are-we-there-yet@2.0.0: dependencies: delegates: 1.0.0 readable-stream: 3.6.2 - dev: false - /arg@4.1.3: - resolution: {integrity: sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==} + arg@4.1.3: {} - /argparse@1.0.10: - resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} + argparse@1.0.10: dependencies: sprintf-js: 1.0.3 - /argparse@2.0.1: - resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + argparse@2.0.1: {} - /arr-diff@2.0.0: - resolution: {integrity: sha512-dtXTVMkh6VkEEA7OhXnN1Ecb8aAGFdZ1LFxtOCoqj4qkyOJMt7+qs6Ahdy6p/NQCPYsRSXXivhSB/J5E9jmYKA==} - engines: {node: '>=0.10.0'} + arr-diff@2.0.0: dependencies: arr-flatten: 1.1.0 - dev: false - /arr-flatten@1.1.0: - resolution: {integrity: sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==} - engines: {node: '>=0.10.0'} - dev: false + arr-flatten@1.1.0: {} - /array-ify@1.0.0: - resolution: {integrity: sha512-c5AMf34bKdvPhQ7tBGhqkgKNUzMr4WUs+WDtC2ZUGOUncbxKMTvqxYctiseW3+L4bA8ec+GcZ6/A/FW4m8ukng==} - dev: true + array-ify@1.0.0: {} - /array-timsort@1.0.3: - resolution: {integrity: sha512-/+3GRL7dDAGEfM6TseQk/U+mi18TU2Ms9I3UlLdUMhz2hbvGNTKdj9xniwXfUqgYhHxRx0+8UnKkvlNwVU+cWQ==} - dev: true + array-timsort@1.0.3: {} - /array-unique@0.2.1: - resolution: {integrity: sha512-G2n5bG5fSUCpnsXz4+8FUkYsGPkNfLn9YvS66U5qbTIXI2Ynnlo4Bi42bWv+omKUCqz+ejzfClwne0alJWJPhg==} - engines: {node: '>=0.10.0'} - dev: false + array-unique@0.2.1: {} - /arrify@1.0.1: - resolution: {integrity: sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==} - engines: {node: '>=0.10.0'} - dev: true + arrify@1.0.1: {} - /asap@2.0.6: - resolution: {integrity: sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==} - dev: true + asap@2.0.6: {} - /async@3.2.5: - resolution: {integrity: sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg==} - dev: true + async@3.2.5: {} - /asynckit@0.4.0: - resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} + asynckit@0.4.0: {} - /at-least-node@1.0.0: - resolution: {integrity: sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==} - engines: {node: '>= 4.0.0'} - dev: true + at-least-node@1.0.0: {} - /atob@2.1.2: - resolution: {integrity: sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==} - engines: {node: '>= 4.5.0'} - hasBin: true - dev: false + atob@2.1.2: {} - /atomic-sleep@1.0.0: - resolution: {integrity: sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ==} - engines: {node: '>=8.0.0'} - dev: false + atomic-sleep@1.0.0: {} - /avvio@8.3.0: - resolution: {integrity: sha512-VBVH0jubFr9LdFASy/vNtm5giTrnbVquWBhT0fyizuNK2rQ7e7ONU2plZQWUNqtE1EmxFEb+kbSkFRkstiaS9Q==} + avvio@8.3.0: dependencies: '@fastify/error': 3.4.1 archy: 1.0.0 @@ -2689,23 +6573,16 @@ packages: fastq: 1.17.1 transitivePeerDependencies: - supports-color - dev: false - /axios@1.7.7(debug@2.6.9): - resolution: {integrity: sha512-S4kL7XrjgBmvdGut0sN3yJxqYzrDOnivkBiN0OFs6hLiUam3UPvswUo0kqGyhqUZGEOytHyumEdXsAkgCOUf3Q==} + axios@1.7.7(debug@2.6.9): dependencies: follow-redirects: 1.15.6(debug@2.6.9) form-data: 4.0.0 proxy-from-env: 1.1.0 transitivePeerDependencies: - debug - dev: false - /babel-jest@29.7.0(@babel/core@7.23.9): - resolution: {integrity: sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - peerDependencies: - '@babel/core': ^7.8.0 + babel-jest@29.7.0(@babel/core@7.23.9): dependencies: '@babel/core': 7.23.9 '@jest/transform': 29.7.0 @@ -2718,9 +6595,7 @@ packages: transitivePeerDependencies: - supports-color - /babel-plugin-istanbul@6.1.1: - resolution: {integrity: sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==} - engines: {node: '>=8'} + babel-plugin-istanbul@6.1.1: dependencies: '@babel/helper-plugin-utils': 7.22.5 '@istanbuljs/load-nyc-config': 1.1.0 @@ -2730,19 +6605,14 @@ packages: transitivePeerDependencies: - supports-color - /babel-plugin-jest-hoist@29.6.3: - resolution: {integrity: sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + babel-plugin-jest-hoist@29.6.3: dependencies: '@babel/template': 7.23.9 '@babel/types': 7.23.9 '@types/babel__core': 7.20.5 '@types/babel__traverse': 7.20.5 - /babel-preset-current-node-syntax@1.0.1(@babel/core@7.23.9): - resolution: {integrity: sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==} - peerDependencies: - '@babel/core': ^7.0.0 + babel-preset-current-node-syntax@1.0.1(@babel/core@7.23.9): dependencies: '@babel/core': 7.23.9 '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.23.9) @@ -2758,225 +6628,148 @@ packages: '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.23.9) '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.23.9) - /babel-preset-jest@29.6.3(@babel/core@7.23.9): - resolution: {integrity: sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - peerDependencies: - '@babel/core': ^7.0.0 + babel-preset-jest@29.6.3(@babel/core@7.23.9): dependencies: '@babel/core': 7.23.9 babel-plugin-jest-hoist: 29.6.3 babel-preset-current-node-syntax: 1.0.1(@babel/core@7.23.9) - /balanced-match@1.0.2: - resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + balanced-match@1.0.2: {} - /base64-js@1.5.1: - resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} + base64-js@1.5.1: {} - /bcrypt@5.1.1: - resolution: {integrity: sha512-AGBHOG5hPYZ5Xl9KXzU5iKq9516yEmvCKDg3ecP5kX2aB6UqTeXZxk2ELnDgDm6BQSMlLt9rDB4LoSMx0rYwww==} - engines: {node: '>= 10.0.0'} - requiresBuild: true + bcrypt@5.1.1: dependencies: '@mapbox/node-pre-gyp': 1.0.11 node-addon-api: 5.1.0 transitivePeerDependencies: - encoding - supports-color - dev: false - /binary-extensions@2.2.0: - resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==} - engines: {node: '>=8'} - dev: true + binary-extensions@2.2.0: {} - /bl@4.1.0: - resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==} + bl@4.1.0: dependencies: buffer: 5.7.1 inherits: 2.0.4 readable-stream: 3.6.2 - /brace-expansion@1.1.11: - resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} + brace-expansion@1.1.11: dependencies: balanced-match: 1.0.2 concat-map: 0.0.1 - /brace-expansion@2.0.1: - resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} + brace-expansion@2.0.1: dependencies: balanced-match: 1.0.2 - /braces@1.8.5: - resolution: {integrity: sha512-xU7bpz2ytJl1bH9cgIurjpg/n8Gohy9GTw81heDYLJQ4RU60dlyJsa+atVF2pI0yMMvKxI9HkKwjePCj5XI1hw==} - engines: {node: '>=0.10.0'} + braces@1.8.5: dependencies: expand-range: 1.8.2 preserve: 0.2.0 repeat-element: 1.1.4 - dev: false - /braces@3.0.3: - resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} - engines: {node: '>=8'} + braces@3.0.3: dependencies: fill-range: 7.1.1 - /browserslist@4.22.3: - resolution: {integrity: sha512-UAp55yfwNv0klWNapjs/ktHoguxuQNGnOzxYmfnXIS+8AsRDZkSDxg7R1AX3GKzn078SBI5dzwzj/Yx0Or0e3A==} - engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} - hasBin: true + browserslist@4.22.3: dependencies: caniuse-lite: 1.0.30001584 electron-to-chromium: 1.4.659 node-releases: 2.0.14 update-browserslist-db: 1.0.13(browserslist@4.22.3) - /bs-logger@0.2.6: - resolution: {integrity: sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==} - engines: {node: '>= 6'} + bs-logger@0.2.6: dependencies: fast-json-stable-stringify: 2.1.0 - /bser@2.1.1: - resolution: {integrity: sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==} + bser@2.1.1: dependencies: node-int64: 0.4.0 - /buffer-equal-constant-time@1.0.1: - resolution: {integrity: sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==} - dev: false + buffer-equal-constant-time@1.0.1: {} - /buffer-from@1.1.2: - resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} + buffer-from@1.1.2: {} - /buffer@5.7.1: - resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} + buffer@5.7.1: dependencies: base64-js: 1.5.1 ieee754: 1.2.1 - /buffer@6.0.3: - resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==} + buffer@6.0.3: dependencies: base64-js: 1.5.1 ieee754: 1.2.1 - dev: false - /cache-manager@5.4.0: - resolution: {integrity: sha512-FS7o8vqJosnLpu9rh2gQTo8EOzCRJLF1BJ4XDEUDMqcfvs7SJZs5iuoFTXLauzQ3S5v8sBAST1pCwMaurpyi1A==} + cache-manager@5.4.0: dependencies: lodash.clonedeep: 4.5.0 lru-cache: 10.2.0 promise-coalesce: 1.1.2 - dev: false - /cachedir@2.3.0: - resolution: {integrity: sha512-A+Fezp4zxnit6FanDmv9EqXNAi3vt9DWp51/71UEhXukb7QUuvtv9344h91dyAxuTLoSYJFU299qzR3tzwPAhw==} - engines: {node: '>=6'} - dev: true + cachedir@2.3.0: {} - /call-bind@1.0.7: - resolution: {integrity: sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==} - engines: {node: '>= 0.4'} + call-bind@1.0.7: dependencies: es-define-property: 1.0.0 es-errors: 1.3.0 function-bind: 1.1.2 get-intrinsic: 1.2.4 set-function-length: 1.2.1 - dev: true - /callsites@3.1.0: - resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} - engines: {node: '>=6'} + callsites@3.1.0: {} - /camelcase-keys@6.2.2: - resolution: {integrity: sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==} - engines: {node: '>=8'} + camelcase-keys@6.2.2: dependencies: camelcase: 5.3.1 map-obj: 4.3.0 quick-lru: 4.0.1 - dev: true - /camelcase@2.1.1: - resolution: {integrity: sha512-DLIsRzJVBQu72meAKPkWQOLcujdXT32hwdfnkI1frSiSRMK1MofjKHf+MEx0SB6fjEFXL8fBDv1dKymBlOp4Qw==} - engines: {node: '>=0.10.0'} - dev: false + camelcase@2.1.1: {} - /camelcase@3.0.0: - resolution: {integrity: sha512-4nhGqUkc4BqbBBB4Q6zLuD7lzzrHYrjKGeYaEji/3tFR5VdJu9v+LilhGIVe8wxEJPPOeWo7eg8dwY13TZ1BNg==} - engines: {node: '>=0.10.0'} - dev: false + camelcase@3.0.0: {} - /camelcase@5.3.1: - resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==} - engines: {node: '>=6'} + camelcase@5.3.1: {} - /camelcase@6.3.0: - resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} - engines: {node: '>=10'} + camelcase@6.3.0: {} - /caniuse-lite@1.0.30001584: - resolution: {integrity: sha512-LOz7CCQ9M1G7OjJOF9/mzmqmj3jE/7VOmrfw6Mgs0E8cjOsbRXQJHsPBfmBOXDskXKrHLyyW3n7kpDW/4BsfpQ==} + caniuse-lite@1.0.30001584: {} - /case@1.6.3: - resolution: {integrity: sha512-mzDSXIPaFwVDvZAHqZ9VlbyF4yyXRuX6IvB06WvPYkqJVO24kX1PPhv9bfpKNFZyxYFmmgo03HUiD8iklmJYRQ==} - engines: {node: '>= 0.8.0'} - dev: true + case@1.6.3: {} - /centra@2.7.0(debug@2.6.9): - resolution: {integrity: sha512-PbFMgMSrmgx6uxCdm57RUos9Tc3fclMvhLSATYN39XsDV29B89zZ3KA89jmY0vwSGazyU+uerqwa6t+KaodPcg==} + centra@2.7.0(debug@2.6.9): dependencies: follow-redirects: 1.15.6(debug@2.6.9) transitivePeerDependencies: - debug - /chalk@1.1.3: - resolution: {integrity: sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==} - engines: {node: '>=0.10.0'} + chalk@1.1.3: dependencies: ansi-styles: 2.2.1 escape-string-regexp: 1.0.5 has-ansi: 2.0.0 strip-ansi: 3.0.1 supports-color: 2.0.0 - dev: false - /chalk@2.4.2: - resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} - engines: {node: '>=4'} + chalk@2.4.2: dependencies: ansi-styles: 3.2.1 escape-string-regexp: 1.0.5 supports-color: 5.5.0 - /chalk@4.1.2: - resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} - engines: {node: '>=10'} + chalk@4.1.2: dependencies: ansi-styles: 4.3.0 supports-color: 7.2.0 - /chalk@5.3.0: - resolution: {integrity: sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==} - engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} - dev: true + chalk@5.3.0: {} - /char-regex@1.0.2: - resolution: {integrity: sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==} - engines: {node: '>=10'} + char-regex@1.0.2: {} - /chardet@0.7.0: - resolution: {integrity: sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==} - dev: true + chardet@0.7.0: {} - /chokidar@3.6.0: - resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} - engines: {node: '>= 8.10.0'} + chokidar@3.6.0: dependencies: anymatch: 3.1.3 braces: 3.0.3 @@ -2987,168 +6780,102 @@ packages: readdirp: 3.6.0 optionalDependencies: fsevents: 2.3.3 - dev: true - /chownr@2.0.0: - resolution: {integrity: sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==} - engines: {node: '>=10'} + chownr@2.0.0: {} - /chownr@3.0.0: - resolution: {integrity: sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==} - engines: {node: '>=18'} - dev: true + chownr@3.0.0: {} - /chrome-trace-event@1.0.3: - resolution: {integrity: sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==} - engines: {node: '>=6.0'} - dev: true + chrome-trace-event@1.0.3: {} - /ci-info@3.9.0: - resolution: {integrity: sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==} - engines: {node: '>=8'} + ci-info@3.9.0: {} - /cjs-module-lexer@1.2.3: - resolution: {integrity: sha512-0TNiGstbQmCFwt4akjjBg5pLRTSyj/PkWQ1ZoO2zntmg9yLqSRxwEa4iCfQLGjqhiqBfOJa7W/E8wfGrTDmlZQ==} + cjs-module-lexer@1.2.3: {} - /class-transformer@0.5.1: - resolution: {integrity: sha512-SQa1Ws6hUbfC98vKGxZH3KFY0Y1lm5Zm0SY8XX9zbK7FJCyVEac3ATW0RIpwzW+oOfmHE5PMPufDG9hCfoEOMw==} + class-transformer@0.5.1: {} - /class-validator@0.14.1: - resolution: {integrity: sha512-2VEG9JICxIqTpoK1eMzZqaV+u/EiwEJkMGzTrZf6sU/fwsnOITVgYJ8yojSy6CaXtO9V0Cc6ZQZ8h8m4UBuLwQ==} + class-validator@0.14.1: dependencies: '@types/validator': 13.11.9 libphonenumber-js: 1.10.58 validator: 13.11.0 - /cli-cursor@3.1.0: - resolution: {integrity: sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==} - engines: {node: '>=8'} + cli-cursor@3.1.0: dependencies: restore-cursor: 3.1.0 - /cli-spinners@2.9.2: - resolution: {integrity: sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==} - engines: {node: '>=6'} + cli-spinners@2.9.2: {} - /cli-table3@0.6.5: - resolution: {integrity: sha512-+W/5efTR7y5HRD7gACw9yQjqMVvEMLBHmboM/kPWam+H+Hmyrgjh6YncVKK122YZkXrLudzTuAukUw9FnMf7IQ==} - engines: {node: 10.* || >= 12.*} + cli-table3@0.6.5: dependencies: string-width: 4.2.3 optionalDependencies: '@colors/colors': 1.5.0 - dev: true - /cli-width@3.0.0: - resolution: {integrity: sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==} - engines: {node: '>= 10'} - dev: true + cli-width@3.0.0: {} - /cli-width@4.1.0: - resolution: {integrity: sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==} - engines: {node: '>= 12'} - dev: true + cli-width@4.1.0: {} - /cliui@3.2.0: - resolution: {integrity: sha512-0yayqDxWQbqk3ojkYqUKqaAQ6AfNKeKWRNA8kR0WXzAsdHpP4BIaOmMAG87JGuO6qcobyW4GjxHd9PmhEd+T9w==} + cliui@3.2.0: dependencies: string-width: 1.0.2 strip-ansi: 3.0.1 wrap-ansi: 2.1.0 - dev: false - /cliui@7.0.4: - resolution: {integrity: sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==} + cliui@7.0.4: dependencies: string-width: 4.2.3 strip-ansi: 6.0.1 wrap-ansi: 7.0.0 - dev: true - /cliui@8.0.1: - resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} - engines: {node: '>=12'} + cliui@8.0.1: dependencies: string-width: 4.2.3 strip-ansi: 6.0.1 wrap-ansi: 7.0.0 - /clone-stats@0.0.1: - resolution: {integrity: sha512-dhUqc57gSMCo6TX85FLfe51eC/s+Im2MLkAgJwfaRRexR2tA4dd3eLEW4L6efzHc2iNorrRRXITifnDLlRrhaA==} - dev: false + clone-stats@0.0.1: {} - /clone@1.0.4: - resolution: {integrity: sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==} - engines: {node: '>=0.8'} + clone@1.0.4: {} - /co@4.6.0: - resolution: {integrity: sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==} - engines: {iojs: '>= 1.0.0', node: '>= 0.12.0'} + co@4.6.0: {} - /code-point-at@1.1.0: - resolution: {integrity: sha512-RpAVKQA5T63xEj6/giIbUEtZwJ4UFIc3ZtvEkiaUERylqe8xb5IvqcgOurZLahv93CLKfxcw5YI+DZcUBRyLXA==} - engines: {node: '>=0.10.0'} - dev: false + code-point-at@1.1.0: {} - /collect-v8-coverage@1.0.2: - resolution: {integrity: sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q==} + collect-v8-coverage@1.0.2: {} - /color-convert@1.9.3: - resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} + color-convert@1.9.3: dependencies: color-name: 1.1.3 - /color-convert@2.0.1: - resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} - engines: {node: '>=7.0.0'} + color-convert@2.0.1: dependencies: color-name: 1.1.4 - /color-name@1.1.3: - resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} + color-name@1.1.3: {} - /color-name@1.1.4: - resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + color-name@1.1.4: {} - /color-support@1.1.3: - resolution: {integrity: sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==} - hasBin: true - dev: false + color-support@1.1.3: {} - /colorette@2.0.20: - resolution: {integrity: sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==} - dev: false + colorette@2.0.20: {} - /combined-stream@1.0.8: - resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} - engines: {node: '>= 0.8'} + combined-stream@1.0.8: dependencies: delayed-stream: 1.0.0 - /commander@2.20.3: - resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} - dev: true + commander@2.20.3: {} - /commander@4.1.1: - resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==} - engines: {node: '>= 6'} - dev: true + commander@4.1.1: {} - /comment-json@4.2.3: - resolution: {integrity: sha512-SsxdiOf064DWoZLH799Ata6u7iV658A11PlWtZATDlXPpKGJnbJZ5Z24ybixAi+LUUqJ/GKowAejtC5GFUG7Tw==} - engines: {node: '>= 6'} + comment-json@4.2.3: dependencies: array-timsort: 1.0.3 core-util-is: 1.0.3 esprima: 4.0.1 has-own-prop: 2.0.0 repeat-string: 1.6.1 - dev: true - /commitizen@4.3.1(@types/node@22.7.5)(typescript@5.6.3): - resolution: {integrity: sha512-gwAPAVTy/j5YcOOebcCRIijn+mSjWJC+IYKivTu6aG8Ei/scoXgfsMRnuAk6b0GRste2J4NGxVdMN3ZpfNaVaw==} - engines: {node: '>= 12'} - hasBin: true + commitizen@4.3.1(@types/node@22.7.5)(typescript@5.6.3): dependencies: cachedir: 2.3.0 cz-conventional-changelog: 3.3.0(@types/node@22.7.5)(typescript@5.6.3) @@ -3167,110 +6894,70 @@ packages: transitivePeerDependencies: - '@types/node' - typescript - dev: true - /compare-func@2.0.0: - resolution: {integrity: sha512-zHig5N+tPWARooBnb0Zx1MFcdfpyJrfTJ3Y5L+IFvUm8rM74hHz66z0gw0x4tijh5CorKkKUCnW82R2vmpeCRA==} + compare-func@2.0.0: dependencies: array-ify: 1.0.0 dot-prop: 5.3.0 - dev: true - /component-emitter@1.3.1: - resolution: {integrity: sha512-T0+barUSQRTUQASh8bx02dl+DhF54GtIDY13Y3m9oWTklKbb3Wv974meRpeZ3lp1JpLVECWWNHC4vaG2XHXouQ==} - dev: true + component-emitter@1.3.1: {} - /concat-map@0.0.1: - resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + concat-map@0.0.1: {} - /concat-stream@1.5.1: - resolution: {integrity: sha512-eYF1Q4RxUUwq8ApyPD9ebWsYjVrJmTMLGzbGXv4qTZ5iP7FLm+oWN4x2XIzLEZ745xiwRM9DmIB0Ix1Nz8Epmg==} - engines: {'0': node >= 0.8} + concat-stream@1.5.1: dependencies: inherits: 2.0.4 readable-stream: 2.0.6 typedarray: 0.0.7 - dev: false - /concat-stream@1.6.2: - resolution: {integrity: sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==} - engines: {'0': node >= 0.8} + concat-stream@1.6.2: dependencies: buffer-from: 1.1.2 inherits: 2.0.4 readable-stream: 2.3.8 typedarray: 0.0.6 - dev: false - /concat-stream@2.0.0: - resolution: {integrity: sha512-MWufYdFw53ccGjCA+Ol7XJYpAlW6/prSMzuPOTRnJGcGzuhLn4Scrz7qf6o8bROZ514ltazcIFJZevcfbo0x7A==} - engines: {'0': node >= 6.0} + concat-stream@2.0.0: dependencies: buffer-from: 1.1.2 inherits: 2.0.4 readable-stream: 3.6.2 typedarray: 0.0.6 - dev: true - /consola@2.15.3: - resolution: {integrity: sha512-9vAdYbHj6x2fLKC4+oPH0kFzY/orMZyG2Aj+kNylHxKGJ/Ed4dpNyAQYwJOdqO4zdM7XpVHmyejQDcQHrnuXbw==} + consola@2.15.3: {} - /console-control-strings@1.1.0: - resolution: {integrity: sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==} - dev: false + console-control-strings@1.1.0: {} - /content-disposition@0.5.4: - resolution: {integrity: sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==} - engines: {node: '>= 0.6'} + content-disposition@0.5.4: dependencies: safe-buffer: 5.2.1 - dev: false - /conventional-changelog-angular@5.0.13: - resolution: {integrity: sha512-i/gipMxs7s8L/QeuavPF2hLnJgH6pEZAttySB6aiQLWcX3puWDL3ACVmvBhJGxnAy52Qc15ua26BufY6KpmrVA==} - engines: {node: '>=10'} + conventional-changelog-angular@5.0.13: dependencies: compare-func: 2.0.0 q: 1.5.1 - dev: true - /conventional-changelog-angular@7.0.0: - resolution: {integrity: sha512-ROjNchA9LgfNMTTFSIWPzebCwOGFdgkEq45EnvvrmSLvCtAw0HSmrCs7/ty+wAeYUZyNay0YMUNYFTRL72PkBQ==} - engines: {node: '>=16'} + conventional-changelog-angular@7.0.0: dependencies: compare-func: 2.0.0 - dev: true - /conventional-changelog-atom@2.0.8: - resolution: {integrity: sha512-xo6v46icsFTK3bb7dY/8m2qvc8sZemRgdqLb/bjpBsH2UyOS8rKNTgcb5025Hri6IpANPApbXMg15QLb1LJpBw==} - engines: {node: '>=10'} + conventional-changelog-atom@2.0.8: dependencies: q: 1.5.1 - dev: true - /conventional-changelog-codemirror@2.0.8: - resolution: {integrity: sha512-z5DAsn3uj1Vfp7po3gpt2Boc+Bdwmw2++ZHa5Ak9k0UKsYAO5mH1UBTN0qSCuJZREIhX6WU4E1p3IW2oRCNzQw==} - engines: {node: '>=10'} + conventional-changelog-codemirror@2.0.8: dependencies: q: 1.5.1 - dev: true - /conventional-changelog-config-spec@2.1.0: - resolution: {integrity: sha512-IpVePh16EbbB02V+UA+HQnnPIohgXvJRxHcS5+Uwk4AT5LjzCZJm5sp/yqs5C6KZJ1jMsV4paEV13BN1pvDuxQ==} - dev: true + conventional-changelog-config-spec@2.1.0: {} - /conventional-changelog-conventionalcommits@4.6.3: - resolution: {integrity: sha512-LTTQV4fwOM4oLPad317V/QNQ1FY4Hju5qeBIM1uTHbrnCE+Eg4CdRZ3gO2pUeR+tzWdp80M2j3qFFEDWVqOV4g==} - engines: {node: '>=10'} + conventional-changelog-conventionalcommits@4.6.3: dependencies: compare-func: 2.0.0 lodash: 4.17.21 q: 1.5.1 - dev: true - /conventional-changelog-core@4.2.4: - resolution: {integrity: sha512-gDVS+zVJHE2v4SLc6B0sLsPiloR0ygU7HaDW14aNJE1v4SlqJPILPl/aJC7YdtRE4CybBf8gDwObBvKha8Xlyg==} - engines: {node: '>=10'} + conventional-changelog-core@4.2.4: dependencies: add-stream: 1.0.0 conventional-changelog-writer: 5.0.1 @@ -3286,53 +6973,31 @@ packages: read-pkg: 3.0.0 read-pkg-up: 3.0.0 through2: 4.0.2 - dev: true - /conventional-changelog-ember@2.0.9: - resolution: {integrity: sha512-ulzIReoZEvZCBDhcNYfDIsLTHzYHc7awh+eI44ZtV5cx6LVxLlVtEmcO+2/kGIHGtw+qVabJYjdI5cJOQgXh1A==} - engines: {node: '>=10'} + conventional-changelog-ember@2.0.9: dependencies: q: 1.5.1 - dev: true - /conventional-changelog-eslint@3.0.9: - resolution: {integrity: sha512-6NpUCMgU8qmWmyAMSZO5NrRd7rTgErjrm4VASam2u5jrZS0n38V7Y9CzTtLT2qwz5xEChDR4BduoWIr8TfwvXA==} - engines: {node: '>=10'} + conventional-changelog-eslint@3.0.9: dependencies: q: 1.5.1 - dev: true - /conventional-changelog-express@2.0.6: - resolution: {integrity: sha512-SDez2f3iVJw6V563O3pRtNwXtQaSmEfTCaTBPCqn0oG0mfkq0rX4hHBq5P7De2MncoRixrALj3u3oQsNK+Q0pQ==} - engines: {node: '>=10'} + conventional-changelog-express@2.0.6: dependencies: q: 1.5.1 - dev: true - /conventional-changelog-jquery@3.0.11: - resolution: {integrity: sha512-x8AWz5/Td55F7+o/9LQ6cQIPwrCjfJQ5Zmfqi8thwUEKHstEn4kTIofXub7plf1xvFA2TqhZlq7fy5OmV6BOMw==} - engines: {node: '>=10'} + conventional-changelog-jquery@3.0.11: dependencies: q: 1.5.1 - dev: true - /conventional-changelog-jshint@2.0.9: - resolution: {integrity: sha512-wMLdaIzq6TNnMHMy31hql02OEQ8nCQfExw1SE0hYL5KvU+JCTuPaDO+7JiogGT2gJAxiUGATdtYYfh+nT+6riA==} - engines: {node: '>=10'} + conventional-changelog-jshint@2.0.9: dependencies: compare-func: 2.0.0 q: 1.5.1 - dev: true - /conventional-changelog-preset-loader@2.3.4: - resolution: {integrity: sha512-GEKRWkrSAZeTq5+YjUZOYxdHq+ci4dNwHvpaBC3+ENalzFWuCWa9EZXSuZBpkr72sMdKB+1fyDV4takK1Lf58g==} - engines: {node: '>=10'} - dev: true + conventional-changelog-preset-loader@2.3.4: {} - /conventional-changelog-writer@5.0.1: - resolution: {integrity: sha512-5WsuKUfxW7suLblAbFnxAcrvf6r+0b7GvNaWUwUIk0bXMnENP/PEieGKVUQrjPqwPT4o3EPAASBXiY6iHooLOQ==} - engines: {node: '>=10'} - hasBin: true + conventional-changelog-writer@5.0.1: dependencies: conventional-commits-filter: 2.0.7 dateformat: 3.0.3 @@ -3343,11 +7008,8 @@ packages: semver: 6.3.1 split: 1.0.1 through2: 4.0.2 - dev: true - /conventional-changelog@3.1.25: - resolution: {integrity: sha512-ryhi3fd1mKf3fSjbLXOfK2D06YwKNic1nC9mWqybBHdObPd8KJ2vjaXZfYj1U23t+V8T8n0d7gwnc9XbIdFbyQ==} - engines: {node: '>=10'} + conventional-changelog@3.1.25: dependencies: conventional-changelog-angular: 5.0.13 conventional-changelog-atom: 2.0.8 @@ -3360,24 +7022,15 @@ packages: conventional-changelog-jquery: 3.0.11 conventional-changelog-jshint: 2.0.9 conventional-changelog-preset-loader: 2.3.4 - dev: true - /conventional-commit-types@3.0.0: - resolution: {integrity: sha512-SmmCYnOniSsAa9GqWOeLqc179lfr5TRu5b4QFDkbsrJ5TZjPJx85wtOr3zn+1dbeNiXDKGPbZ72IKbPhLXh/Lg==} - dev: true + conventional-commit-types@3.0.0: {} - /conventional-commits-filter@2.0.7: - resolution: {integrity: sha512-ASS9SamOP4TbCClsRHxIHXRfcGCnIoQqkvAzCSbZzTFLfcTqJVugB0agRgsEELsqaeWgsXv513eS116wnlSSPA==} - engines: {node: '>=10'} + conventional-commits-filter@2.0.7: dependencies: lodash.ismatch: 4.4.0 modify-values: 1.0.1 - dev: true - /conventional-commits-parser@3.2.4: - resolution: {integrity: sha512-nK7sAtfi+QXbxHCYfhpZsfRtaitZLIA6889kFIouLvz6repszQDgxBu7wf2WbU+Dco7sAnNCJYERCwt54WPC2Q==} - engines: {node: '>=10'} - hasBin: true + conventional-commits-parser@3.2.4: dependencies: JSONStream: 1.3.5 is-text-path: 1.0.1 @@ -3385,23 +7038,15 @@ packages: meow: 8.1.2 split2: 3.2.2 through2: 4.0.2 - dev: true - /conventional-commits-parser@5.0.0: - resolution: {integrity: sha512-ZPMl0ZJbw74iS9LuX9YIAiW8pfM5p3yh2o/NbXHbkFuZzY5jvdi5jFycEOkmBW5H5I7nA+D6f3UcsCLP2vvSEA==} - engines: {node: '>=16'} - hasBin: true + conventional-commits-parser@5.0.0: dependencies: JSONStream: 1.3.5 is-text-path: 2.0.0 meow: 12.1.1 split2: 4.2.0 - dev: true - /conventional-recommended-bump@6.1.0: - resolution: {integrity: sha512-uiApbSiNGM/kkdL9GTOLAqC4hbptObFo4wW2QRyHsKciGAfQuLU1ShZ1BIVI/+K2BE/W1AWYQMCXAsv4dyKPaw==} - engines: {node: '>=10'} - hasBin: true + conventional-recommended-bump@6.1.0: dependencies: concat-stream: 2.0.0 conventional-changelog-preset-loader: 2.3.4 @@ -3411,88 +7056,51 @@ packages: git-semver-tags: 4.1.1 meow: 8.1.2 q: 1.5.1 - dev: true - /convert-source-map@1.9.0: - resolution: {integrity: sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==} - dev: false + convert-source-map@1.9.0: {} - /convert-source-map@2.0.0: - resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} + convert-source-map@2.0.0: {} - /cookie-signature@1.2.1: - resolution: {integrity: sha512-78KWk9T26NhzXtuL26cIJ8/qNHANyJ/ZYrmEXFzUmhZdjpBv+DlWlOANRTGBt48YcyslsLrj0bMLFTmXvLRCOw==} - engines: {node: '>=6.6.0'} - dev: false + cookie-signature@1.2.1: {} - /cookie@0.6.0: - resolution: {integrity: sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==} - engines: {node: '>= 0.6'} - dev: false + cookie@0.6.0: {} - /cookiejar@2.1.4: - resolution: {integrity: sha512-LDx6oHrK+PhzLKJU9j5S7/Y3jM/mUHvD/DeI1WQmJn652iPC5Y4TBzC9l+5OMOXlyTTA+SmVUPm0HQUwpD5Jqw==} - dev: true + cookiejar@2.1.4: {} - /core-util-is@1.0.3: - resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} + core-util-is@1.0.3: {} - /cosmiconfig-typescript-loader@5.0.0(@types/node@22.7.5)(cosmiconfig@9.0.0)(typescript@5.6.3): - resolution: {integrity: sha512-+8cK7jRAReYkMwMiG+bxhcNKiHJDM6bR9FD/nGBXOWdMLuYawjF5cGrtLilJ+LGd3ZjCXnJjR5DkfWPoIVlqJA==} - engines: {node: '>=v16'} - peerDependencies: - '@types/node': '*' - cosmiconfig: '>=8.2' - typescript: '>=4' + cosmiconfig-typescript-loader@5.0.0(@types/node@22.7.5)(cosmiconfig@9.0.0(typescript@5.6.3))(typescript@5.6.3): dependencies: '@types/node': 22.7.5 cosmiconfig: 9.0.0(typescript@5.6.3) jiti: 1.21.0 typescript: 5.6.3 - dev: true - /cosmiconfig@8.3.6(typescript@5.3.3): - resolution: {integrity: sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==} - engines: {node: '>=14'} - peerDependencies: - typescript: '>=4.9.5' - peerDependenciesMeta: - typescript: - optional: true + cosmiconfig@8.3.6(typescript@5.3.3): dependencies: import-fresh: 3.3.0 js-yaml: 4.1.0 parse-json: 5.2.0 path-type: 4.0.0 + optionalDependencies: typescript: 5.3.3 - dev: true - /cosmiconfig@9.0.0(typescript@5.6.3): - resolution: {integrity: sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==} - engines: {node: '>=14'} - peerDependencies: - typescript: '>=4.9.5' - peerDependenciesMeta: - typescript: - optional: true + cosmiconfig@9.0.0(typescript@5.6.3): dependencies: env-paths: 2.2.1 import-fresh: 3.3.0 js-yaml: 4.1.0 parse-json: 5.2.0 + optionalDependencies: typescript: 5.6.3 - dev: true - /create-jest@29.7.0(@types/node@22.7.5)(ts-node@10.9.2): - resolution: {integrity: sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - hasBin: true + create-jest@29.7.0(@types/node@22.7.5)(ts-node@10.9.2(@types/node@22.7.5)(typescript@5.6.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@22.7.5)(ts-node@10.9.2) + jest-config: 29.7.0(@types/node@22.7.5)(ts-node@10.9.2(@types/node@22.7.5)(typescript@5.6.3)) jest-util: 29.7.0 prompts: 2.4.2 transitivePeerDependencies: @@ -3501,29 +7109,22 @@ packages: - supports-color - ts-node - /create-require@1.1.1: - resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==} + create-require@1.1.1: {} - /cross-spawn@7.0.3: - resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} - engines: {node: '>= 8'} + cross-spawn@7.0.3: dependencies: path-key: 3.1.1 shebang-command: 2.0.0 which: 2.0.2 - /css@2.2.4: - resolution: {integrity: sha512-oUnjmWpy0niI3x/mPL8dVEI1l7MnG3+HHyRPHf+YFSbK+svOhXpmSOcDURUh2aOCgl2grzrOPt1nHLuCVFULLw==} + css@2.2.4: dependencies: inherits: 2.0.4 source-map: 0.6.1 source-map-resolve: 0.5.3 urix: 0.1.0 - dev: false - /cz-conventional-changelog@3.3.0(@types/node@22.7.5)(typescript@5.6.3): - resolution: {integrity: sha512-U466fIzU5U22eES5lTNiNbZ+d8dfcHcssH4o7QsdWaCcRs/feIPCxKYSWkYBNs5mny7MvEfwpTLWjvbm94hecw==} - engines: {node: '>= 10'} + cz-conventional-changelog@3.3.0(@types/node@22.7.5)(typescript@5.6.3): dependencies: chalk: 2.4.2 commitizen: 4.3.1(@types/node@22.7.5)(typescript@5.6.3) @@ -3536,380 +7137,205 @@ packages: transitivePeerDependencies: - '@types/node' - typescript - dev: true - /dargs@7.0.0: - resolution: {integrity: sha512-2iy1EkLdlBzQGvbweYRFxmFath8+K7+AKB0TlhHWkNuH+TmovaMH/Wp7V7R4u7f4SnX3OgLsU9t1NI9ioDnUpg==} - engines: {node: '>=8'} - dev: true + dargs@7.0.0: {} - /dargs@8.1.0: - resolution: {integrity: sha512-wAV9QHOsNbwnWdNW2FYvE1P56wtgSbM+3SZcdGiWQILwVjACCXDCI3Ai8QlCjMDB8YK5zySiXZYBiwGmNY3lnw==} - engines: {node: '>=12'} - dev: true + dargs@8.1.0: {} - /dateformat@3.0.3: - resolution: {integrity: sha512-jyCETtSl3VMZMWeRo7iY1FL19ges1t55hMo5yaam4Jrsm5EPL89UQkoQRyiI+Yf4k8r2ZpdngkV8hr1lIdjb3Q==} - dev: true + dateformat@3.0.3: {} - /dateformat@4.6.3: - resolution: {integrity: sha512-2P0p0pFGzHS5EMnhdxQi7aJN+iMheud0UhG4dlE1DLAlvL8JHjJJTX/CSm4JXwV0Ka5nGk3zC5mcb5bUQUxxMA==} - dev: false + dateformat@4.6.3: {} - /debug-fabulous@0.0.4: - resolution: {integrity: sha512-mmVKpY/O4UIl6ZDn5Owf8jEauO6uQiuF4Jz9iTuflSmvqNm6/64xARk/qCq5ZJxu141Ic2lCmL1TSMHIYoyiTw==} + debug-fabulous@0.0.4: dependencies: debug: 2.6.9 lazy-debug-legacy: 0.0.1(debug@2.6.9) object-assign: 4.1.0 transitivePeerDependencies: - supports-color - dev: false - /debug@2.6.9: - resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true + debug@2.6.9: dependencies: ms: 2.0.0 - /debug@4.3.4: - resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} - engines: {node: '>=6.0'} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true + debug@4.3.4: dependencies: ms: 2.1.2 - /decamelize-keys@1.1.1: - resolution: {integrity: sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg==} - engines: {node: '>=0.10.0'} + decamelize-keys@1.1.1: dependencies: decamelize: 1.2.0 map-obj: 1.0.1 - dev: true - /decamelize@1.2.0: - resolution: {integrity: sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==} - engines: {node: '>=0.10.0'} + decamelize@1.2.0: {} - /decode-uri-component@0.2.2: - resolution: {integrity: sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==} - engines: {node: '>=0.10'} - dev: false + decode-uri-component@0.2.2: {} - /dedent@0.7.0: - resolution: {integrity: sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==} - dev: true + dedent@0.7.0: {} - /dedent@1.5.1: - resolution: {integrity: sha512-+LxW+KLWxu3HW3M2w2ympwtqPrqYRzU8fqi6Fhd18fBALe15blJPI/I4+UHveMVG6lJqB4JNd4UG0S5cnVHwIg==} - peerDependencies: - babel-plugin-macros: ^3.1.0 - peerDependenciesMeta: - babel-plugin-macros: - optional: true + dedent@1.5.1: {} - /deep-is@0.1.4: - resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} - dev: true + deep-is@0.1.4: {} - /deep-override@1.0.2: - resolution: {integrity: sha512-+bAuLuYqaVVUWPaq8rmU8NLTX85p4I5k5/cVdhBioEfH7k+5NlGdv4NoJVQcJRByqzzTWWzTpih+pU1wBTmMow==} - dev: true + deep-override@1.0.2: {} - /deepmerge@4.3.1: - resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} - engines: {node: '>=0.10.0'} + deepmerge@4.3.1: {} - /defaults@1.0.4: - resolution: {integrity: sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==} + defaults@1.0.4: dependencies: clone: 1.0.4 - /define-data-property@1.1.2: - resolution: {integrity: sha512-SRtsSqsDbgpJBbW3pABMCOt6rQyeM8s8RiyeSN8jYG8sYmt/kGJejbydttUsnDs1tadr19tvhT4ShwMyoqAm4g==} - engines: {node: '>= 0.4'} + define-data-property@1.1.2: dependencies: es-errors: 1.3.0 get-intrinsic: 1.2.4 gopd: 1.0.1 has-property-descriptors: 1.0.1 - dev: true - /delayed-stream@1.0.0: - resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} - engines: {node: '>=0.4.0'} + delayed-stream@1.0.0: {} - /delegates@1.0.0: - resolution: {integrity: sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==} - dev: false + delegates@1.0.0: {} - /depd@2.0.0: - resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} - engines: {node: '>= 0.8'} - dev: false + depd@2.0.0: {} - /detect-file@1.0.0: - resolution: {integrity: sha512-DtCOLG98P007x7wiiOmfI0fi3eIKyWiLTGJ2MDnVi/E04lWGbf+JzrRHMm0rgIIZJGtHpKpbVgLWHrv8xXpc3Q==} - engines: {node: '>=0.10.0'} - dev: true + detect-file@1.0.0: {} - /detect-indent@6.1.0: - resolution: {integrity: sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==} - engines: {node: '>=8'} - dev: true + detect-indent@6.1.0: {} - /detect-libc@2.0.2: - resolution: {integrity: sha512-UX6sGumvvqSaXgdKGUsgZWqcUyIXZ/vZTrlRT/iobiKhGL0zL4d3osHj3uqllWJK+i+sixDS/3COVEOFbupFyw==} - engines: {node: '>=8'} - dev: false + detect-libc@2.0.2: {} - /detect-newline@2.1.0: - resolution: {integrity: sha512-CwffZFvlJffUg9zZA0uqrjQayUTC8ob94pnr5sFwaVv3IOmkfUHcWH+jXaQK3askE51Cqe8/9Ql/0uXNwqZ8Zg==} - engines: {node: '>=0.10.0'} - dev: false + detect-newline@2.1.0: {} - /detect-newline@3.1.0: - resolution: {integrity: sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==} - engines: {node: '>=8'} + detect-newline@3.1.0: {} - /dezalgo@1.0.4: - resolution: {integrity: sha512-rXSP0bf+5n0Qonsb+SVVfNfIsimO4HEtmnIpPHY8Q1UCzKlQrDMfdobr8nJOOsRgWCyMRqeSBQzmWUMq7zvVig==} + dezalgo@1.0.4: dependencies: asap: 2.0.6 wrappy: 1.0.2 - dev: true - /diff-sequences@29.6.3: - resolution: {integrity: sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + diff-sequences@29.6.3: {} - /diff@4.0.2: - resolution: {integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==} - engines: {node: '>=0.3.1'} + diff@4.0.2: {} - /dot-prop@5.3.0: - resolution: {integrity: sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==} - engines: {node: '>=8'} + dot-prop@5.3.0: dependencies: is-obj: 2.0.0 - dev: true - /dot@1.1.3: - resolution: {integrity: sha512-/nt74Rm+PcfnirXGEdhZleTwGC2LMnuKTeeTIlI82xb5loBBoXNYzr2ezCroPSMtilK8EZIfcNZwOcHN+ib1Lg==} - engines: {'0': node >=0.2.6} - hasBin: true - dev: false + dot@1.1.3: {} - /dotenv-expand@10.0.0: - resolution: {integrity: sha512-GopVGCpVS1UKH75VKHGuQFqS1Gusej0z4FyQkPdwjil2gNIv+LNsqBlboOzpJFZKVT95GkCyWJbBSdFEFUWI2A==} - engines: {node: '>=12'} - dev: false + dotenv-expand@10.0.0: {} - /dotenv@16.4.5: - resolution: {integrity: sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg==} - engines: {node: '>=12'} - dev: false + dotenv-expand@11.0.6: + dependencies: + dotenv: 16.4.5 - /dotgitignore@2.1.0: - resolution: {integrity: sha512-sCm11ak2oY6DglEPpCB8TixLjWAxd3kJTs6UIcSasNYxXdFPV+YKlye92c8H4kKFqV5qYMIh7d+cYecEg0dIkA==} - engines: {node: '>=6'} + dotenv@16.4.5: {} + + dotgitignore@2.1.0: dependencies: find-up: 3.0.0 minimatch: 3.1.2 - dev: true - /duplexify@3.7.1: - resolution: {integrity: sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==} + duplexify@3.7.1: dependencies: end-of-stream: 1.4.4 inherits: 2.0.4 readable-stream: 2.3.8 stream-shift: 1.0.3 - dev: false - /duplexify@4.1.2: - resolution: {integrity: sha512-fz3OjcNCHmRP12MJoZMPglx8m4rrFP8rovnk4vT8Fs+aonZoCwGg10dSsQsfP/E62eZcPTMSMP6686fu9Qlqtw==} + duplexify@4.1.2: dependencies: end-of-stream: 1.4.4 inherits: 2.0.4 readable-stream: 3.6.2 stream-shift: 1.0.3 - dev: false - /eastasianwidth@0.2.0: - resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} + eastasianwidth@0.2.0: {} - /ecdsa-sig-formatter@1.0.11: - resolution: {integrity: sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==} + ecdsa-sig-formatter@1.0.11: dependencies: safe-buffer: 5.2.1 - dev: false - /ejs@3.1.10: - resolution: {integrity: sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==} - engines: {node: '>=0.10.0'} - hasBin: true + ejs@3.1.10: dependencies: jake: 10.9.2 - dev: true - /electron-to-chromium@1.4.659: - resolution: {integrity: sha512-sRJ3nV3HowrYpBtPF9bASQV7OW49IgZC01Xiq43WfSE3RTCkK0/JidoCmR73Hyc1mN+l/H4Yqx0eNiomvExFZg==} + electron-to-chromium@1.4.659: {} - /emittery@0.13.1: - resolution: {integrity: sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==} - engines: {node: '>=12'} + emittery@0.13.1: {} - /emoji-regex@8.0.0: - resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + emoji-regex@8.0.0: {} - /emoji-regex@9.2.2: - resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} + emoji-regex@9.2.2: {} - /end-of-stream@1.4.4: - resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} + end-of-stream@1.4.4: dependencies: once: 1.4.0 - dev: false - /enhanced-resolve@5.15.0: - resolution: {integrity: sha512-LXYT42KJ7lpIKECr2mAXIaMldcNCh/7E0KBKOu4KSfkHmP+mZmSs+8V5gBAqisWBy0OO4W5Oyys0GO1Y8KtdKg==} - engines: {node: '>=10.13.0'} + enhanced-resolve@5.15.0: dependencies: graceful-fs: 4.2.11 tapable: 2.2.1 - dev: true - /enhanced-resolve@5.17.1: - resolution: {integrity: sha512-LMHl3dXhTcfv8gM4kEzIUeTQ+7fpdA0l2tUf34BddXPkz2A5xJ5L/Pchd5BL6rdccM9QGvu0sWZzK1Z1t4wwyg==} - engines: {node: '>=10.13.0'} + enhanced-resolve@5.17.1: dependencies: graceful-fs: 4.2.11 tapable: 2.2.1 - dev: true - /env-paths@2.2.1: - resolution: {integrity: sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==} - engines: {node: '>=6'} - dev: true + env-paths@2.2.1: {} - /error-ex@1.3.2: - resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} + error-ex@1.3.2: dependencies: is-arrayish: 0.2.1 - /es-define-property@1.0.0: - resolution: {integrity: sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==} - engines: {node: '>= 0.4'} + es-define-property@1.0.0: dependencies: get-intrinsic: 1.2.4 - dev: true - /es-errors@1.3.0: - resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} - engines: {node: '>= 0.4'} - dev: true + es-errors@1.3.0: {} - /es-module-lexer@1.4.1: - resolution: {integrity: sha512-cXLGjP0c4T3flZJKQSuziYoq7MlT+rnvfZjfp7h+I7K9BNX54kP9nyWvdbwjQ4u1iWbOL4u96fgeZLToQlZC7w==} - dev: true + es-module-lexer@1.4.1: {} - /escalade@3.1.2: - resolution: {integrity: sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==} - engines: {node: '>=6'} + escalade@3.1.2: {} - /escape-html@1.0.3: - resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==} - dev: false + escape-html@1.0.3: {} - /escape-string-regexp@1.0.5: - resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} - engines: {node: '>=0.8.0'} + escape-string-regexp@1.0.5: {} - /escape-string-regexp@2.0.0: - resolution: {integrity: sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==} - engines: {node: '>=8'} + escape-string-regexp@2.0.0: {} - /escape-string-regexp@4.0.0: - resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} - engines: {node: '>=10'} - dev: true + escape-string-regexp@4.0.0: {} - /eslint-config-prettier@9.1.0(eslint@9.12.0): - resolution: {integrity: sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw==} - hasBin: true - peerDependencies: - eslint: '>=7.0.0' + eslint-config-prettier@9.1.0(eslint@9.12.0(jiti@1.21.0)): dependencies: - eslint: 9.12.0 - dev: true + eslint: 9.12.0(jiti@1.21.0) - /eslint-plugin-prettier@5.2.1(eslint-config-prettier@9.1.0)(eslint@9.12.0)(prettier@3.3.3): - resolution: {integrity: sha512-gH3iR3g4JfF+yYPaJYkN7jEl9QbweL/YfkoRlNnuIEHEz1vHVlCmWOS+eGGiRuzHQXdJFCOTxRgvju9b8VUmrw==} - engines: {node: ^14.18.0 || >=16.0.0} - peerDependencies: - '@types/eslint': '>=8.0.0' - eslint: '>=8.0.0' - eslint-config-prettier: '*' - prettier: '>=3.0.0' - peerDependenciesMeta: - '@types/eslint': - optional: true - eslint-config-prettier: - optional: true + eslint-plugin-prettier@5.2.1(eslint-config-prettier@9.1.0(eslint@9.12.0(jiti@1.21.0)))(eslint@9.12.0(jiti@1.21.0))(prettier@3.3.3): dependencies: - eslint: 9.12.0 - eslint-config-prettier: 9.1.0(eslint@9.12.0) + eslint: 9.12.0(jiti@1.21.0) prettier: 3.3.3 prettier-linter-helpers: 1.0.0 synckit: 0.9.2 - dev: true + optionalDependencies: + eslint-config-prettier: 9.1.0(eslint@9.12.0(jiti@1.21.0)) - /eslint-scope@5.1.1: - resolution: {integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==} - engines: {node: '>=8.0.0'} + eslint-scope@5.1.1: dependencies: esrecurse: 4.3.0 estraverse: 4.3.0 - dev: true - /eslint-scope@8.1.0: - resolution: {integrity: sha512-14dSvlhaVhKKsa9Fx1l8A17s7ah7Ef7wCakJ10LYk6+GYmP9yDti2oq2SEwcyndt6knfcZyhyxwY3i9yL78EQw==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + eslint-scope@8.1.0: dependencies: esrecurse: 4.3.0 estraverse: 5.3.0 - dev: true - /eslint-visitor-keys@3.4.3: - resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - dev: true + eslint-visitor-keys@3.4.3: {} - /eslint-visitor-keys@4.1.0: - resolution: {integrity: sha512-Q7lok0mqMUSf5a/AdAZkA5a/gHcO6snwQClVNNvFKCAVlxXucdU8pKydU5ZVZjBx5xr37vGbFFWtLQYreLzrZg==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - dev: true + eslint-visitor-keys@4.1.0: {} - /eslint@9.12.0: - resolution: {integrity: sha512-UVIOlTEWxwIopRL1wgSQYdnVDcEvs2wyaO6DGo5mXqe3r16IoCNWkR29iHhyaP4cICWjbgbmFUGAhh0GJRuGZw==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - hasBin: true - peerDependencies: - jiti: '*' - peerDependenciesMeta: - jiti: - optional: true + eslint@9.12.0(jiti@1.21.0): dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@9.12.0) + '@eslint-community/eslint-utils': 4.4.0(eslint@9.12.0(jiti@1.21.0)) '@eslint-community/regexpp': 4.11.1 '@eslint/config-array': 0.18.0 '@eslint/core': 0.6.0 @@ -3944,69 +7370,40 @@ packages: natural-compare: 1.4.0 optionator: 0.9.3 text-table: 0.2.0 + optionalDependencies: + jiti: 1.21.0 transitivePeerDependencies: - supports-color - dev: true - /espree@10.2.0: - resolution: {integrity: sha512-upbkBJbckcCNBDBDXEbuhjbP68n+scUd3k/U2EkyM9nw+I/jPiL4cLF/Al06CF96wRltFda16sxDFrxsI1v0/g==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + espree@10.2.0: dependencies: acorn: 8.12.1 acorn-jsx: 5.3.2(acorn@8.12.1) eslint-visitor-keys: 4.1.0 - dev: true - /esprima@4.0.1: - resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} - engines: {node: '>=4'} - hasBin: true + esprima@4.0.1: {} - /esquery@1.5.0: - resolution: {integrity: sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==} - engines: {node: '>=0.10'} + esquery@1.5.0: dependencies: estraverse: 5.3.0 - dev: true - /esrecurse@4.3.0: - resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} - engines: {node: '>=4.0'} + esrecurse@4.3.0: dependencies: estraverse: 5.3.0 - dev: true - /estraverse@4.3.0: - resolution: {integrity: sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==} - engines: {node: '>=4.0'} - dev: true + estraverse@4.3.0: {} - /estraverse@5.3.0: - resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} - engines: {node: '>=4.0'} - dev: true + estraverse@5.3.0: {} - /esutils@2.0.3: - resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} - engines: {node: '>=0.10.0'} - dev: true + esutils@2.0.3: {} - /event-target-shim@5.0.1: - resolution: {integrity: sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==} - engines: {node: '>=6'} - dev: false + event-target-shim@5.0.1: {} - /eventemitter2@6.4.9: - resolution: {integrity: sha512-JEPTiaOt9f04oa6NOkc4aH+nVp5I3wEjpHbIPqfgCdD5v5bUzy7xQqwcVO2aDQgOWhI28da57HksMrzK9HlRxg==} - dev: false + eventemitter2@6.4.9: {} - /events@3.3.0: - resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==} - engines: {node: '>=0.8.x'} + events@3.3.0: {} - /execa@5.1.1: - resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} - engines: {node: '>=10'} + execa@5.1.1: dependencies: cross-spawn: 7.0.3 get-stream: 6.0.1 @@ -4018,34 +7415,21 @@ packages: signal-exit: 3.0.7 strip-final-newline: 2.0.0 - /exit@0.1.2: - resolution: {integrity: sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==} - engines: {node: '>= 0.8.0'} + exit@0.1.2: {} - /expand-brackets@0.1.5: - resolution: {integrity: sha512-hxx03P2dJxss6ceIeri9cmYOT4SRs3Zk3afZwWpOsRqLqprhTR8u++SlC+sFGsQr7WGFPdMF7Gjc1njDLDK6UA==} - engines: {node: '>=0.10.0'} + expand-brackets@0.1.5: dependencies: is-posix-bracket: 0.1.1 - dev: false - /expand-range@1.8.2: - resolution: {integrity: sha512-AFASGfIlnIbkKPQwX1yHaDjFvh/1gyKJODme52V6IORh69uEYgZp0o9C+qsIGNVEiuuhQU0CSSl++Rlegg1qvA==} - engines: {node: '>=0.10.0'} + expand-range@1.8.2: dependencies: fill-range: 2.2.4 - dev: false - /expand-tilde@2.0.2: - resolution: {integrity: sha512-A5EmesHW6rfnZ9ysHQjPdJRni0SRar0tjtG5MNtm9n5TUvsYU8oozprtRD4AqHxcZWWlVuAmQo2nWKfN9oyjTw==} - engines: {node: '>=0.10.0'} + expand-tilde@2.0.2: dependencies: homedir-polyfill: 1.0.3 - dev: true - /expect@29.7.0: - resolution: {integrity: sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + expect@29.7.0: dependencies: '@jest/expect-utils': 29.7.0 jest-get-type: 29.6.3 @@ -4053,67 +7437,43 @@ packages: jest-message-util: 29.7.0 jest-util: 29.7.0 - /extend-shallow@2.0.1: - resolution: {integrity: sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==} - engines: {node: '>=0.10.0'} + extend-shallow@2.0.1: dependencies: is-extendable: 0.1.1 - dev: false - /extend@3.0.2: - resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} - dev: false + extend@3.0.2: {} - /external-editor@3.1.0: - resolution: {integrity: sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==} - engines: {node: '>=4'} + external-editor@3.1.0: dependencies: chardet: 0.7.0 iconv-lite: 0.4.24 tmp: 0.0.33 - dev: true - /extglob@0.3.2: - resolution: {integrity: sha512-1FOj1LOwn42TMrruOHGt18HemVnbwAmAak7krWk+wa93KXxGbK+2jpezm+ytJYDaBX0/SPLZFHKM7m+tKobWGg==} - engines: {node: '>=0.10.0'} + extglob@0.3.2: dependencies: is-extglob: 1.0.0 - dev: false - /fast-content-type-parse@1.1.0: - resolution: {integrity: sha512-fBHHqSTFLVnR61C+gltJuE5GkVQMV0S2nqUO8TJ+5Z3qAKG8vAx4FKai1s5jq/inV1+sREynIWSuQ6HgoSXpDQ==} - dev: false + fast-content-type-parse@1.1.0: {} - /fast-copy@3.0.2: - resolution: {integrity: sha512-dl0O9Vhju8IrcLndv2eU4ldt1ftXMqqfgN4H1cpmGV7P6jeB9FwpN9a2c8DPGE1Ys88rNUJVYDHq73CGAGOPfQ==} - dev: false + fast-copy@3.0.2: {} - /fast-decode-uri-component@1.0.1: - resolution: {integrity: sha512-WKgKWg5eUxvRZGwW8FvfbaH7AXSh2cL+3j5fMGzUMCxWBJ3dV3a7Wz8y2f/uQ0e3B6WmodD3oS54jTQ9HVTIIg==} + fast-decode-uri-component@1.0.1: {} - /fast-deep-equal@3.1.3: - resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + fast-deep-equal@3.1.3: {} - /fast-diff@1.3.0: - resolution: {integrity: sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==} - dev: true + fast-diff@1.3.0: {} - /fast-glob@3.3.2: - resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==} - engines: {node: '>=8.6.0'} + fast-glob@3.3.2: 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 - dev: true - /fast-json-stable-stringify@2.1.0: - resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} + fast-json-stable-stringify@2.1.0: {} - /fast-json-stringify@5.12.0: - resolution: {integrity: sha512-7Nnm9UPa7SfHRbHVA1kJQrGXCRzB7LMlAAqHXQFkEQqueJm1V8owm0FsE/2Do55/4CcdhwiLQERaKomOnKQkyA==} + fast-json-stringify@5.12.0: dependencies: '@fastify/merge-json-schemas': 0.1.1 ajv: 8.12.0 @@ -4122,42 +7482,26 @@ packages: fast-uri: 2.3.0 json-schema-ref-resolver: 1.0.1 rfdc: 1.3.1 - dev: false - /fast-levenshtein@2.0.6: - resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} - dev: true + fast-levenshtein@2.0.6: {} - /fast-querystring@1.1.2: - resolution: {integrity: sha512-g6KuKWmFXc0fID8WWH0jit4g0AGBoJhCkJMb1RmbsSEUNvQ+ZC8D6CUZ+GtF8nMzSPXnhiePyyqqipzNNEnHjg==} + fast-querystring@1.1.2: dependencies: fast-decode-uri-component: 1.0.1 - /fast-redact@3.3.0: - resolution: {integrity: sha512-6T5V1QK1u4oF+ATxs1lWUmlEk6P2T9HqJG3e2DnHOdVgZy2rFJBoEnrIedcTXlkAHU/zKC+7KETJ+KGGKwxgMQ==} - engines: {node: '>=6'} - dev: false + fast-redact@3.3.0: {} - /fast-safe-stringify@2.1.1: - resolution: {integrity: sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==} + fast-safe-stringify@2.1.1: {} - /fast-uri@2.3.0: - resolution: {integrity: sha512-eel5UKGn369gGEWOqBShmFJWfq/xSJvsgDzgLYC845GneayWvXBf0lJCBn5qTABfewy1ZDPoaR5OZCP+kssfuw==} - dev: false + fast-uri@2.3.0: {} - /fastify-ip@1.1.0: - resolution: {integrity: sha512-23M1Jbw5ftu1uMeVYsyqUfKs85SsfvopJZufdSinzbrYYQtD4V7TWn1Mc6IliQXHk0mdiLeKxYH4F3OZlxG5Ow==} - engines: {node: '>=18.x'} + fastify-ip@1.1.0: dependencies: fastify-plugin: 4.5.1 - dev: false - /fastify-plugin@4.5.1: - resolution: {integrity: sha512-stRHYGeuqpEZTL1Ef0Ovr2ltazUT9g844X5z/zEBFLG8RYlpDiOCIG+ATvYEp+/zmc7sN29mcIMp8gvYplYPIQ==} - dev: false + fastify-plugin@4.5.1: {} - /fastify@4.26.2: - resolution: {integrity: sha512-90pjTuPGrfVKtdpLeLzND5nyC4woXZN5VadiNQCicj/iJU4viNHKhsAnb7jmv1vu2IzkLXyBiCzdWuzeXgQ5Ug==} + fastify@4.26.2: dependencies: '@fastify/ajv-compiler': 3.5.0 '@fastify/error': 3.4.1 @@ -4177,188 +7521,115 @@ packages: toad-cache: 3.7.0 transitivePeerDependencies: - supports-color - dev: false - /fastq@1.17.1: - resolution: {integrity: sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==} + fastq@1.17.1: dependencies: reusify: 1.0.4 - /fb-watchman@2.0.2: - resolution: {integrity: sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==} + fb-watchman@2.0.2: dependencies: bser: 2.1.1 - /figures@3.2.0: - resolution: {integrity: sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==} - engines: {node: '>=8'} + figures@3.2.0: dependencies: escape-string-regexp: 1.0.5 - dev: true - /file-entry-cache@8.0.0: - resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==} - engines: {node: '>=16.0.0'} + file-entry-cache@8.0.0: dependencies: flat-cache: 4.0.1 - dev: true - /filelist@1.0.4: - resolution: {integrity: sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==} + filelist@1.0.4: dependencies: minimatch: 5.1.6 - dev: true - /filename-regex@2.0.1: - resolution: {integrity: sha512-BTCqyBaWBTsauvnHiE8i562+EdJj+oUpkqWp2R1iCoR8f6oo8STRu3of7WJJ0TqWtxN50a5YFpzYK4Jj9esYfQ==} - engines: {node: '>=0.10.0'} - dev: false + filename-regex@2.0.1: {} - /fill-range@2.2.4: - resolution: {integrity: sha512-cnrcCbj01+j2gTG921VZPnHbjmdAf8oQV/iGeV2kZxGSyfYjjTyY79ErsK1WJWMpw6DaApEX72binqJE+/d+5Q==} - engines: {node: '>=0.10.0'} + fill-range@2.2.4: dependencies: is-number: 2.1.0 isobject: 2.1.0 randomatic: 3.1.1 repeat-element: 1.1.4 repeat-string: 1.6.1 - dev: false - /fill-range@7.1.1: - resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} - engines: {node: '>=8'} + fill-range@7.1.1: dependencies: to-regex-range: 5.0.1 - /find-my-way@8.2.2: - resolution: {integrity: sha512-Dobi7gcTEq8yszimcfp/R7+owiT4WncAJ7VTTgFH1jYJ5GaG1FbhjwDG820hptN0QDFvzVY3RfCzdInvGPGzjA==} - engines: {node: '>=14'} + find-my-way@8.2.2: dependencies: fast-deep-equal: 3.1.3 fast-querystring: 1.1.2 safe-regex2: 3.1.0 - /find-node-modules@2.1.3: - resolution: {integrity: sha512-UC2I2+nx1ZuOBclWVNdcnbDR5dlrOdVb7xNjmT/lHE+LsgztWks3dG7boJ37yTS/venXw84B/mAW9uHVoC5QRg==} + find-node-modules@2.1.3: dependencies: findup-sync: 4.0.0 merge: 2.1.1 - dev: true - /find-root@1.1.0: - resolution: {integrity: sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==} - dev: true + find-root@1.1.0: {} - /find-up@1.1.2: - resolution: {integrity: sha512-jvElSjyuo4EMQGoTwo1uJU5pQMwTW5lS1x05zzfJuTIyLR3zwO27LYrxNg+dlvKpGOuGy/MzBdXh80g0ve5+HA==} - engines: {node: '>=0.10.0'} + find-up@1.1.2: dependencies: path-exists: 2.1.0 pinkie-promise: 2.0.1 - dev: false - /find-up@2.1.0: - resolution: {integrity: sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ==} - engines: {node: '>=4'} + find-up@2.1.0: dependencies: locate-path: 2.0.0 - dev: true - /find-up@3.0.0: - resolution: {integrity: sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==} - engines: {node: '>=6'} + find-up@3.0.0: dependencies: locate-path: 3.0.0 - dev: true - /find-up@4.1.0: - resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} - engines: {node: '>=8'} + find-up@4.1.0: dependencies: locate-path: 5.0.0 path-exists: 4.0.0 - /find-up@5.0.0: - resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} - engines: {node: '>=10'} + find-up@5.0.0: dependencies: locate-path: 6.0.0 path-exists: 4.0.0 - dev: true - /find-up@7.0.0: - resolution: {integrity: sha512-YyZM99iHrqLKjmt4LJDj58KI+fYyufRLBSYcqycxf//KpBk9FoewoGX0450m9nB44qrZnovzC2oeP5hUibxc/g==} - engines: {node: '>=18'} + find-up@7.0.0: dependencies: locate-path: 7.2.0 path-exists: 5.0.0 unicorn-magic: 0.1.0 - dev: true - /findup-sync@4.0.0: - resolution: {integrity: sha512-6jvvn/12IC4quLBL1KNokxC7wWTvYncaVUYSoxWw7YykPLuRrnv4qdHcSOywOI5RpkOVGeQRtWM8/q+G6W6qfQ==} - engines: {node: '>= 8'} + findup-sync@4.0.0: dependencies: detect-file: 1.0.0 is-glob: 4.0.3 micromatch: 4.0.8 resolve-dir: 1.0.1 - dev: true - - /first-chunk-stream@1.0.0: - resolution: {integrity: sha512-ArRi5axuv66gEsyl3UuK80CzW7t56hem73YGNYxNWTGNKFJUadSb9Gu9SHijYEUi8ulQMf1bJomYNwSCPHhtTQ==} - engines: {node: '>=0.10.0'} - dev: false - - /flat-cache@4.0.1: - resolution: {integrity: sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==} - engines: {node: '>=16'} - dependencies: - flatted: 3.2.9 - keyv: 4.5.4 - dev: true - - /flatted@3.2.9: - resolution: {integrity: sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==} - dev: true - - /follow-redirects@1.15.6(debug@2.6.9): - resolution: {integrity: sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==} - engines: {node: '>=4.0'} - peerDependencies: - debug: '*' - peerDependenciesMeta: - debug: - optional: true + + first-chunk-stream@1.0.0: {} + + flat-cache@4.0.1: dependencies: + flatted: 3.2.9 + keyv: 4.5.4 + + flatted@3.2.9: {} + + follow-redirects@1.15.6(debug@2.6.9): + optionalDependencies: debug: 2.6.9 - /for-in@1.0.2: - resolution: {integrity: sha512-7EwmXrOjyL+ChxMhmG5lnW9MPt1aIeZEwKhQzoBUdTV0N3zuwWDZYVJatDvZ2OyzPUvdIAZDsCetk3coyMfcnQ==} - engines: {node: '>=0.10.0'} - dev: false + for-in@1.0.2: {} - /for-own@0.1.5: - resolution: {integrity: sha512-SKmowqGTJoPzLO1T0BBJpkfp3EMacCMOuH40hOUbrbzElVktk4DioXVM99QkLCyKoiuOmyjgcWMpVz2xjE7LZw==} - engines: {node: '>=0.10.0'} + for-own@0.1.5: dependencies: for-in: 1.0.2 - dev: false - /foreground-child@3.1.1: - resolution: {integrity: sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==} - engines: {node: '>=14'} + foreground-child@3.1.1: dependencies: cross-spawn: 7.0.3 signal-exit: 4.1.0 - /fork-ts-checker-webpack-plugin@9.0.2(typescript@5.3.3)(webpack@5.94.0): - resolution: {integrity: sha512-Uochze2R8peoN1XqlSi/rGUkDQpRogtLFocP9+PGu68zk1BDAKXfdeCdyVZpgTk8V8WFVQXdEz426VKjXLO1Gg==} - engines: {node: '>=12.13.0', yarn: '>=1.0.0'} - peerDependencies: - typescript: '>3.6.0' - webpack: ^5.11.0 + fork-ts-checker-webpack-plugin@9.0.2(typescript@5.3.3)(webpack@5.94.0): dependencies: '@babel/code-frame': 7.23.5 chalk: 4.1.2 @@ -4374,83 +7645,55 @@ packages: tapable: 2.2.1 typescript: 5.3.3 webpack: 5.94.0 - dev: true - /form-data-lite@1.0.3: - resolution: {integrity: sha512-P7xPqAiOPKzC9Q9aywAZJCQq4QOE5WokPb3HrcWRh7C57RKytueJzoORZAVgHBNvK/lL7E+FxjQjd4X/zbecEQ==} + form-data-lite@1.0.3: dependencies: asynckit: 0.4.0 combined-stream: 1.0.8 mime-lite: 1.0.3 - dev: true - /form-data@4.0.0: - resolution: {integrity: sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==} - engines: {node: '>= 6'} + form-data@4.0.0: dependencies: asynckit: 0.4.0 combined-stream: 1.0.8 mime-types: 2.1.35 - /formidable@2.1.2: - resolution: {integrity: sha512-CM3GuJ57US06mlpQ47YcunuUZ9jpm8Vx+P2CGt2j7HpgkKZO/DJYQ0Bobim8G6PFQmK5lOqOOdUXboU+h73A4g==} + formidable@2.1.2: dependencies: dezalgo: 1.0.4 hexoid: 1.0.0 once: 1.4.0 qs: 6.11.2 - dev: true - /forwarded@0.2.0: - resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==} - engines: {node: '>= 0.6'} - dev: false + forwarded@0.2.0: {} - /fs-extra@10.1.0: - resolution: {integrity: sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==} - engines: {node: '>=12'} + fs-extra@10.1.0: dependencies: graceful-fs: 4.2.11 jsonfile: 6.1.0 universalify: 2.0.1 - dev: true - /fs-extra@9.1.0: - resolution: {integrity: sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==} - engines: {node: '>=10'} + fs-extra@9.1.0: dependencies: at-least-node: 1.0.0 graceful-fs: 4.2.11 jsonfile: 6.1.0 universalify: 2.0.1 - dev: true - /fs-minipass@2.1.0: - resolution: {integrity: sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==} - engines: {node: '>= 8'} + fs-minipass@2.1.0: dependencies: minipass: 3.3.6 - /fs-monkey@1.0.5: - resolution: {integrity: sha512-8uMbBjrhzW76TYgEV27Y5E//W2f/lTFmx78P2w19FZSxarhI/798APGQyuGCwmkNxgwGRhrLfvWyLBvNtuOmew==} - dev: true + fs-monkey@1.0.5: {} - /fs.realpath@1.0.0: - resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} + fs.realpath@1.0.0: {} - /fsevents@2.3.3: - resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} - engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} - os: [darwin] - requiresBuild: true + fsevents@2.3.3: optional: true - /function-bind@1.1.2: - resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} + function-bind@1.1.2: {} - /gauge@3.0.2: - resolution: {integrity: sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==} - engines: {node: '>=10'} + gauge@3.0.2: dependencies: aproba: 2.0.0 color-support: 1.1.3 @@ -4461,129 +7704,81 @@ packages: string-width: 4.2.3 strip-ansi: 6.0.1 wide-align: 1.1.5 - dev: false - /gensync@1.0.0-beta.2: - resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} - engines: {node: '>=6.9.0'} + gensync@1.0.0-beta.2: {} - /get-caller-file@2.0.5: - resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} - engines: {node: 6.* || 8.* || >= 10.*} + get-caller-file@2.0.5: {} - /get-intrinsic@1.2.4: - resolution: {integrity: sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==} - engines: {node: '>= 0.4'} + get-intrinsic@1.2.4: dependencies: es-errors: 1.3.0 function-bind: 1.1.2 has-proto: 1.0.1 has-symbols: 1.0.3 hasown: 2.0.0 - dev: true - /get-package-type@0.1.0: - resolution: {integrity: sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==} - engines: {node: '>=8.0.0'} + get-package-type@0.1.0: {} - /get-pkg-repo@4.2.1: - resolution: {integrity: sha512-2+QbHjFRfGB74v/pYWjd5OhU3TDIC2Gv/YKUTk/tCvAz0pkn/Mz6P3uByuBimLOcPvN2jYdScl3xGFSrx0jEcA==} - engines: {node: '>=6.9.0'} - hasBin: true + get-pkg-repo@4.2.1: dependencies: '@hutson/parse-repository-url': 3.0.2 hosted-git-info: 4.1.0 through2: 2.0.5 yargs: 16.2.0 - dev: true - /get-stream@6.0.1: - resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} - engines: {node: '>=10'} + get-stream@6.0.1: {} - /git-raw-commits@2.0.11: - resolution: {integrity: sha512-VnctFhw+xfj8Va1xtfEqCUD2XDrbAPSJx+hSrE5K7fGdjZruW7XV+QOrN7LF/RJyvspRiD2I0asWsxFp0ya26A==} - engines: {node: '>=10'} - hasBin: true + git-raw-commits@2.0.11: dependencies: dargs: 7.0.0 lodash: 4.17.21 meow: 8.1.2 split2: 3.2.2 through2: 4.0.2 - dev: true - /git-raw-commits@4.0.0: - resolution: {integrity: sha512-ICsMM1Wk8xSGMowkOmPrzo2Fgmfo4bMHLNX6ytHjajRJUqvHOw/TFapQ+QG75c3X/tTDDhOSRPGC52dDbNM8FQ==} - engines: {node: '>=16'} - hasBin: true + git-raw-commits@4.0.0: dependencies: dargs: 8.1.0 meow: 12.1.1 split2: 4.2.0 - dev: true - /git-remote-origin-url@2.0.0: - resolution: {integrity: sha512-eU+GGrZgccNJcsDH5LkXR3PB9M958hxc7sbA8DFJjrv9j4L2P/eZfKhM+QD6wyzpiv+b1BpK0XrYCxkovtjSLw==} - engines: {node: '>=4'} + git-remote-origin-url@2.0.0: dependencies: gitconfiglocal: 1.0.0 pify: 2.3.0 - dev: true - /git-semver-tags@4.1.1: - resolution: {integrity: sha512-OWyMt5zBe7xFs8vglMmhM9lRQzCWL3WjHtxNNfJTMngGym7pC1kh8sP6jevfydJ6LP3ZvGxfb6ABYgPUM0mtsA==} - engines: {node: '>=10'} - hasBin: true + git-semver-tags@4.1.1: dependencies: meow: 8.1.2 semver: 6.3.1 - dev: true - /gitconfiglocal@1.0.0: - resolution: {integrity: sha512-spLUXeTAVHxDtKsJc8FkFVgFtMdEN9qPGpL23VfSHx4fP4+Ds097IXLvymbnDH8FnmxX5Nr9bPw3A+AQ6mWEaQ==} + gitconfiglocal@1.0.0: dependencies: ini: 1.3.8 - dev: true - /glob-base@0.3.0: - resolution: {integrity: sha512-ab1S1g1EbO7YzauaJLkgLp7DZVAqj9M/dvKlTt8DkXA2tiOIcSMrlVI2J1RZyB5iJVccEscjGn+kpOG9788MHA==} - engines: {node: '>=0.10.0'} + glob-base@0.3.0: dependencies: glob-parent: 2.0.0 is-glob: 2.0.1 - dev: false - /glob-parent@2.0.0: - resolution: {integrity: sha512-JDYOvfxio/t42HKdxkAYaCiBN7oYiuxykOxKxdaUW5Qn0zaYN3gRQWolrwdnf0shM9/EP0ebuuTmyoXNr1cC5w==} + glob-parent@2.0.0: dependencies: is-glob: 2.0.1 - dev: false - /glob-parent@3.1.0: - resolution: {integrity: sha512-E8Ak/2+dZY6fnzlR7+ueWvhsH1SjHr4jjss4YS/h4py44jY9MhK/VFdaZJAWDz6BbL21KeteKxFSFpq8OS5gVA==} + glob-parent@3.1.0: dependencies: is-glob: 3.1.0 path-dirname: 1.0.2 - dev: false - /glob-parent@5.1.2: - resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} - engines: {node: '>= 6'} + glob-parent@5.1.2: dependencies: is-glob: 4.0.3 - dev: true - /glob-parent@6.0.2: - resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} - engines: {node: '>=10.13.0'} + glob-parent@6.0.2: dependencies: is-glob: 4.0.3 - dev: true - /glob-stream@5.3.5: - resolution: {integrity: sha512-piN8XVAO2sNxwVLokL4PswgJvK/uQ6+awwXUVRTGF+rRfgCZpn4hOqxiRuTEbU/k3qgKl0DACYQ/0Sge54UMQg==} - engines: {node: '>= 0.10'} + glob-stream@5.3.5: dependencies: extend: 3.0.2 glob: 5.0.15 @@ -4593,16 +7788,10 @@ packages: through2: 0.6.5 to-absolute-glob: 0.1.1 unique-stream: 2.3.1 - dev: false - /glob-to-regexp@0.4.1: - resolution: {integrity: sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==} - dev: true + glob-to-regexp@0.4.1: {} - /glob@10.4.2: - resolution: {integrity: sha512-GwMlUF6PkPo3Gk21UxkCohOv0PLcIXVtKyLlpEI28R/cO/4eNOdmLk3CMW1wROV/WR/EsZOWAfBbBOqYvs88/w==} - engines: {node: '>=16 || 14 >=14.18'} - hasBin: true + glob@10.4.2: dependencies: foreground-child: 3.1.1 jackspeak: 3.4.3 @@ -4610,11 +7799,8 @@ packages: minipass: 7.1.2 package-json-from-dist: 1.0.1 path-scurry: 1.11.1 - dev: true - /glob@10.4.5: - resolution: {integrity: sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==} - hasBin: true + glob@10.4.5: dependencies: foreground-child: 3.1.1 jackspeak: 3.4.3 @@ -4623,20 +7809,15 @@ packages: package-json-from-dist: 1.0.1 path-scurry: 1.11.1 - /glob@5.0.15: - resolution: {integrity: sha512-c9IPMazfRITpmAAKi22dK1VKxGDX9ehhqfABDriL/lzO92xcUKEJPQHrVA/2YHSNFB4iFlykVmWvwo48nr3OxA==} - deprecated: Glob versions prior to v9 are no longer supported + glob@5.0.15: dependencies: inflight: 1.0.6 inherits: 2.0.4 minimatch: 3.1.2 once: 1.4.0 path-is-absolute: 1.0.1 - dev: false - /glob@7.2.3: - resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} - deprecated: Glob versions prior to v9 are no longer supported + glob@7.2.3: dependencies: fs.realpath: 1.0.0 inflight: 1.0.6 @@ -4645,58 +7826,37 @@ packages: once: 1.4.0 path-is-absolute: 1.0.1 - /global-directory@4.0.1: - resolution: {integrity: sha512-wHTUcDUoZ1H5/0iVqEudYW4/kAlN5cZ3j/bXn0Dpbizl9iaUVeWSHqiOjsgk6OW2bkLclbBjzewBz6weQ1zA2Q==} - engines: {node: '>=18'} + global-directory@4.0.1: dependencies: ini: 4.1.1 - dev: true - /global-modules@1.0.0: - resolution: {integrity: sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==} - engines: {node: '>=0.10.0'} + global-modules@1.0.0: dependencies: global-prefix: 1.0.2 is-windows: 1.0.2 resolve-dir: 1.0.1 - dev: true - /global-prefix@1.0.2: - resolution: {integrity: sha512-5lsx1NUDHtSjfg0eHlmYvZKv8/nVqX4ckFbM+FrGcQ+04KWcWFo9P5MxPZYSzUvyzmdTbI7Eix8Q4IbELDqzKg==} - engines: {node: '>=0.10.0'} + global-prefix@1.0.2: dependencies: expand-tilde: 2.0.2 homedir-polyfill: 1.0.3 ini: 1.3.8 is-windows: 1.0.2 which: 1.3.1 - dev: true - /globals@11.12.0: - resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} - engines: {node: '>=4'} + globals@11.12.0: {} - /globals@14.0.0: - resolution: {integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==} - engines: {node: '>=18'} - dev: true + globals@14.0.0: {} - /gopd@1.0.1: - resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==} + gopd@1.0.1: dependencies: get-intrinsic: 1.2.4 - dev: true - /graceful-fs@4.2.11: - resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + graceful-fs@4.2.11: {} - /graphemer@1.4.0: - resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} - dev: true + graphemer@1.4.0: {} - /gulp-sourcemaps@1.12.1: - resolution: {integrity: sha512-2NYnMpB67LJhc36sEv+hNY05UOy1lD9DPtLi+en4hbGH+085G9Zzh3cet2VEqrDlQrLk9Eho0MM9dZ3Z+dL0XA==} - engines: {node: '>=0.10.0'} + gulp-sourcemaps@1.12.1: dependencies: '@gulp-sourcemaps/map-sources': 1.0.0 acorn: 4.0.13 @@ -4711,12 +7871,8 @@ packages: vinyl: 1.2.0 transitivePeerDependencies: - supports-color - dev: false - /handlebars@4.7.8: - resolution: {integrity: sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==} - engines: {node: '>=0.4.7'} - hasBin: true + handlebars@4.7.8: dependencies: minimist: 1.2.8 neo-async: 2.6.2 @@ -4724,195 +7880,108 @@ packages: wordwrap: 1.0.0 optionalDependencies: uglify-js: 3.17.4 - dev: true - /hard-rejection@2.1.0: - resolution: {integrity: sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==} - engines: {node: '>=6'} - dev: true + hard-rejection@2.1.0: {} - /has-ansi@2.0.0: - resolution: {integrity: sha512-C8vBJ8DwUCx19vhm7urhTuUsr4/IyP6l4VzNQDv+ryHQObW3TTTp9yB68WpYgRe2bbaGuZ/se74IqFeVnMnLZg==} - engines: {node: '>=0.10.0'} + has-ansi@2.0.0: dependencies: ansi-regex: 2.1.1 - dev: false - /has-flag@3.0.0: - resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} - engines: {node: '>=4'} + has-flag@3.0.0: {} - /has-flag@4.0.0: - resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} - engines: {node: '>=8'} + has-flag@4.0.0: {} - /has-own-prop@2.0.0: - resolution: {integrity: sha512-Pq0h+hvsVm6dDEa8x82GnLSYHOzNDt7f0ddFa3FqcQlgzEiptPqL+XrOJNavjOzSYiYWIrgeVYYgGlLmnxwilQ==} - engines: {node: '>=8'} - dev: true + has-own-prop@2.0.0: {} - /has-property-descriptors@1.0.1: - resolution: {integrity: sha512-VsX8eaIewvas0xnvinAe9bw4WfIeODpGYikiWYLH+dma0Jw6KHYqWiWfhQlgOVK8D6PvjubK5Uc4P0iIhIcNVg==} + has-property-descriptors@1.0.1: dependencies: get-intrinsic: 1.2.4 - dev: true - /has-proto@1.0.1: - resolution: {integrity: sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==} - engines: {node: '>= 0.4'} - dev: true + has-proto@1.0.1: {} - /has-symbols@1.0.3: - resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==} - engines: {node: '>= 0.4'} - dev: true + has-symbols@1.0.3: {} - /has-unicode@2.0.1: - resolution: {integrity: sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==} - dev: false + has-unicode@2.0.1: {} - /hasown@2.0.0: - resolution: {integrity: sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==} - engines: {node: '>= 0.4'} + hasown@2.0.0: dependencies: function-bind: 1.1.2 - /helmet@7.1.0: - resolution: {integrity: sha512-g+HZqgfbpXdCkme/Cd/mZkV0aV3BZZZSugecH03kl38m/Kmdx8jKjBikpDj2cr+Iynv4KpYEviojNdTJActJAg==} - engines: {node: '>=16.0.0'} - dev: false + helmet@7.1.0: {} - /help-me@5.0.0: - resolution: {integrity: sha512-7xgomUX6ADmcYzFik0HzAxh/73YlKR9bmFzf51CZwR+b6YtzU2m0u49hQCqV6SvlqIqsaxovfwdvbnsw3b/zpg==} - dev: false + help-me@5.0.0: {} - /hexoid@1.0.0: - resolution: {integrity: sha512-QFLV0taWQOZtvIRIAdBChesmogZrtuXvVWsFHZTk2SU+anspqZ2vMnoLg7IE1+Uk16N19APic1BuF8bC8c2m5g==} - engines: {node: '>=8'} - dev: true + hexoid@1.0.0: {} - /homedir-polyfill@1.0.3: - resolution: {integrity: sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==} - engines: {node: '>=0.10.0'} + homedir-polyfill@1.0.3: dependencies: parse-passwd: 1.0.0 - dev: true - /hosted-git-info@2.8.9: - resolution: {integrity: sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==} + hosted-git-info@2.8.9: {} - /hosted-git-info@4.1.0: - resolution: {integrity: sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==} - engines: {node: '>=10'} + hosted-git-info@4.1.0: dependencies: lru-cache: 6.0.0 - dev: true - /html-escaper@2.0.2: - resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==} + html-escaper@2.0.2: {} - /http-errors@2.0.0: - resolution: {integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==} - engines: {node: '>= 0.8'} + http-errors@2.0.0: dependencies: depd: 2.0.0 inherits: 2.0.4 setprototypeof: 1.2.0 statuses: 2.0.1 toidentifier: 1.0.1 - dev: false - /http-status@1.7.4: - resolution: {integrity: sha512-c2qSwNtTlHVYAhMj9JpGdyo0No/+DiKXCJ9pHtZ2Yf3QmPnBIytKSRT7BuyIiQ7icXLynavGmxUqkOjSrAuMuA==} - engines: {node: '>= 0.4.0'} - dev: false + http-status@1.7.4: {} - /https-proxy-agent@5.0.1: - resolution: {integrity: sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==} - engines: {node: '>= 6'} + https-proxy-agent@5.0.1: dependencies: agent-base: 6.0.2 debug: 4.3.4 transitivePeerDependencies: - supports-color - dev: false - /human-signals@2.1.0: - resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} - engines: {node: '>=10.17.0'} + human-signals@2.1.0: {} - /husky@9.1.6: - resolution: {integrity: sha512-sqbjZKK7kf44hfdE94EoX8MZNk0n7HeW37O4YrVGCF4wzgQjp+akPAkfUK5LZ6KuR/6sqeAVuXHji+RzQgOn5A==} - engines: {node: '>=18'} - hasBin: true - dev: true + husky@9.1.6: {} - /iconv-lite@0.4.24: - resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} - engines: {node: '>=0.10.0'} + iconv-lite@0.4.24: dependencies: safer-buffer: 2.1.2 - dev: true - /ieee754@1.2.1: - resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} + ieee754@1.2.1: {} - /ignore@5.3.1: - resolution: {integrity: sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==} - engines: {node: '>= 4'} - dev: true + ignore@5.3.1: {} - /import-fresh@3.3.0: - resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} - engines: {node: '>=6'} + import-fresh@3.3.0: dependencies: parent-module: 1.0.1 resolve-from: 4.0.0 - dev: true - /import-local@3.1.0: - resolution: {integrity: sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==} - engines: {node: '>=8'} - hasBin: true + import-local@3.1.0: dependencies: pkg-dir: 4.2.0 resolve-cwd: 3.0.0 - /import-meta-resolve@4.0.0: - resolution: {integrity: sha512-okYUR7ZQPH+efeuMJGlq4f8ubUgO50kByRPyt/Cy1Io4PSRsPjxME+YlVaCOx+NIToW7hCsZNFJyTPFFKepRSA==} - dev: true + import-meta-resolve@4.0.0: {} - /imurmurhash@0.1.4: - resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} - engines: {node: '>=0.8.19'} + imurmurhash@0.1.4: {} - /indent-string@4.0.0: - resolution: {integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==} - engines: {node: '>=8'} - dev: true + indent-string@4.0.0: {} - /inflight@1.0.6: - resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} - deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful. + inflight@1.0.6: dependencies: once: 1.4.0 wrappy: 1.0.2 - /inherits@2.0.4: - resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + inherits@2.0.4: {} - /ini@1.3.8: - resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} - dev: true + ini@1.3.8: {} - /ini@4.1.1: - resolution: {integrity: sha512-QQnnxNyfvmHFIsj7gkPcYymR8Jdw/o7mp5ZFihxn6h8Ci6fh3Dx4E1gPjpQEpIuPo9XVNY/ZUwh4BPMjGyL01g==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - dev: true + ini@4.1.1: {} - /inquirer@8.2.5: - resolution: {integrity: sha512-QAgPDQMEgrDssk1XiwwHoOGYF9BAbUcc1+j+FhEvaOt8/cKRqyLn0U5qA6F74fGhTMGxf92pOvPBeh29jQJDTQ==} - engines: {node: '>=12.0.0'} + inquirer@8.2.5: dependencies: ansi-escapes: 4.3.2 chalk: 4.1.2 @@ -4929,11 +7998,8 @@ packages: strip-ansi: 6.0.1 through: 2.3.8 wrap-ansi: 7.0.0 - dev: true - /inquirer@8.2.6: - resolution: {integrity: sha512-M1WuAmb7pn9zdFRtQYk26ZBoY043Sse0wVDdk4Bppr+JOXyQYybdtvK+l9wUibhtjdjvtoiNy8tk+EgsYIUqKg==} - engines: {node: '>=12.0.0'} + inquirer@8.2.6: dependencies: ansi-escapes: 4.3.2 chalk: 4.1.2 @@ -4950,11 +8016,8 @@ packages: strip-ansi: 6.0.1 through: 2.3.8 wrap-ansi: 6.2.0 - dev: true - /inquirer@9.2.15: - resolution: {integrity: sha512-vI2w4zl/mDluHt9YEQ/543VTCwPKWiHzKtm9dM2V0NdFcqEexDAjUHzO1oA60HRNaVifGXXM1tRRNluLVHa0Kg==} - engines: {node: '>=18'} + inquirer@9.2.15: dependencies: '@ljharb/through': 2.3.13 ansi-escapes: 4.3.2 @@ -4971,203 +8034,106 @@ packages: string-width: 4.2.3 strip-ansi: 6.0.1 wrap-ansi: 6.2.0 - dev: true - /invert-kv@1.0.0: - resolution: {integrity: sha512-xgs2NH9AE66ucSq4cNG1nhSFghr5l6tdL15Pk+jl46bmmBapgoaY/AacXyaDznAqmGL99TiLSQgO/XazFSKYeQ==} - engines: {node: '>=0.10.0'} - dev: false + invert-kv@1.0.0: {} - /ipaddr.js@1.9.1: - resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==} - engines: {node: '>= 0.10'} - dev: false + ipaddr.js@1.9.1: {} - /is-arrayish@0.2.1: - resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} + is-arrayish@0.2.1: {} - /is-binary-path@2.1.0: - resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} - engines: {node: '>=8'} + is-binary-path@2.1.0: dependencies: binary-extensions: 2.2.0 - dev: true - /is-buffer@1.1.6: - resolution: {integrity: sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==} - dev: false + is-buffer@1.1.6: {} - /is-core-module@2.13.1: - resolution: {integrity: sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==} + is-core-module@2.13.1: dependencies: hasown: 2.0.0 - /is-dotfile@1.0.3: - resolution: {integrity: sha512-9YclgOGtN/f8zx0Pr4FQYMdibBiTaH3sn52vjYip4ZSf6C4/6RfTEZ+MR4GvKhCxdPh21Bg42/WL55f6KSnKpg==} - engines: {node: '>=0.10.0'} - dev: false + is-dotfile@1.0.3: {} - /is-equal-shallow@0.1.3: - resolution: {integrity: sha512-0EygVC5qPvIyb+gSz7zdD5/AAoS6Qrx1e//6N4yv4oNm30kqvdmG66oZFWVlQHUWe5OjP08FuTw2IdT0EOTcYA==} - engines: {node: '>=0.10.0'} + is-equal-shallow@0.1.3: dependencies: is-primitive: 2.0.0 - dev: false - /is-extendable@0.1.1: - resolution: {integrity: sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==} - engines: {node: '>=0.10.0'} - dev: false + is-extendable@0.1.1: {} - /is-extglob@1.0.0: - resolution: {integrity: sha512-7Q+VbVafe6x2T+Tu6NcOf6sRklazEPmBoB3IWk3WdGZM2iGUwU/Oe3Wtq5lSEkDTTlpp8yx+5t4pzO/i9Ty1ww==} - engines: {node: '>=0.10.0'} - dev: false + is-extglob@1.0.0: {} - /is-extglob@2.1.1: - resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} - engines: {node: '>=0.10.0'} + is-extglob@2.1.1: {} - /is-fullwidth-code-point@1.0.0: - resolution: {integrity: sha512-1pqUqRjkhPJ9miNq9SwMfdvi6lBJcd6eFxvfaivQhaH3SgisfiuudvFntdKOmxuee/77l+FPjKrQjWvmPjWrRw==} - engines: {node: '>=0.10.0'} + is-fullwidth-code-point@1.0.0: dependencies: number-is-nan: 1.0.1 - dev: false - /is-fullwidth-code-point@3.0.0: - resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} - engines: {node: '>=8'} + is-fullwidth-code-point@3.0.0: {} - /is-generator-fn@2.1.0: - resolution: {integrity: sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==} - engines: {node: '>=6'} + is-generator-fn@2.1.0: {} - /is-glob@2.0.1: - resolution: {integrity: sha512-a1dBeB19NXsf/E0+FHqkagizel/LQw2DjSQpvQrj3zT+jYPpaUCryPnrQajXKFLCMuf4I6FhRpaGtw4lPrG6Eg==} - engines: {node: '>=0.10.0'} + is-glob@2.0.1: dependencies: is-extglob: 1.0.0 - dev: false - /is-glob@3.1.0: - resolution: {integrity: sha512-UFpDDrPgM6qpnFNI+rh/p3bUaq9hKLZN8bMUWzxmcnZVS3omf4IPK+BrewlnWjO1WmUsMYuSjKh4UJuV4+Lqmw==} - engines: {node: '>=0.10.0'} + is-glob@3.1.0: dependencies: is-extglob: 2.1.1 - dev: false - /is-glob@4.0.3: - resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} - engines: {node: '>=0.10.0'} + is-glob@4.0.3: dependencies: is-extglob: 2.1.1 - dev: true - /is-interactive@1.0.0: - resolution: {integrity: sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==} - engines: {node: '>=8'} + is-interactive@1.0.0: {} - /is-number@2.1.0: - resolution: {integrity: sha512-QUzH43Gfb9+5yckcrSA0VBDwEtDUchrk4F6tfJZQuNzDJbEDB9cZNzSfXGQ1jqmdDY/kl41lUOWM9syA8z8jlg==} - engines: {node: '>=0.10.0'} + is-number@2.1.0: dependencies: kind-of: 3.2.2 - dev: false - /is-number@4.0.0: - resolution: {integrity: sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==} - engines: {node: '>=0.10.0'} - dev: false + is-number@4.0.0: {} - /is-number@7.0.0: - resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} - engines: {node: '>=0.12.0'} + is-number@7.0.0: {} - /is-obj@2.0.0: - resolution: {integrity: sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==} - engines: {node: '>=8'} - dev: true + is-obj@2.0.0: {} - /is-plain-obj@1.1.0: - resolution: {integrity: sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==} - engines: {node: '>=0.10.0'} - dev: true + is-plain-obj@1.1.0: {} - /is-posix-bracket@0.1.1: - resolution: {integrity: sha512-Yu68oeXJ7LeWNmZ3Zov/xg/oDBnBK2RNxwYY1ilNJX+tKKZqgPK+qOn/Gs9jEu66KDY9Netf5XLKNGzas/vPfQ==} - engines: {node: '>=0.10.0'} - dev: false + is-posix-bracket@0.1.1: {} - /is-primitive@2.0.0: - resolution: {integrity: sha512-N3w1tFaRfk3UrPfqeRyD+GYDASU3W5VinKhlORy8EWVf/sIdDL9GAcew85XmktCfH+ngG7SRXEVDoO18WMdB/Q==} - engines: {node: '>=0.10.0'} - dev: false + is-primitive@2.0.0: {} - /is-stream@1.1.0: - resolution: {integrity: sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==} - engines: {node: '>=0.10.0'} - dev: false + is-stream@1.1.0: {} - /is-stream@2.0.1: - resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} - engines: {node: '>=8'} + is-stream@2.0.1: {} - /is-text-path@1.0.1: - resolution: {integrity: sha512-xFuJpne9oFz5qDaodwmmG08e3CawH/2ZV8Qqza1Ko7Sk8POWbkRdwIoAWVhqvq0XeUzANEhKo2n0IXUGBm7A/w==} - engines: {node: '>=0.10.0'} + is-text-path@1.0.1: dependencies: text-extensions: 1.9.0 - dev: true - /is-text-path@2.0.0: - resolution: {integrity: sha512-+oDTluR6WEjdXEJMnC2z6A4FRwFoYuvShVVEGsS7ewc0UTi2QtAKMDJuL4BDEVt+5T7MjFo12RP8ghOM75oKJw==} - engines: {node: '>=8'} + is-text-path@2.0.0: dependencies: text-extensions: 2.4.0 - dev: true - /is-unicode-supported@0.1.0: - resolution: {integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==} - engines: {node: '>=10'} + is-unicode-supported@0.1.0: {} - /is-utf8@0.2.1: - resolution: {integrity: sha512-rMYPYvCzsXywIsldgLaSoPlw5PfoB/ssr7hY4pLfcodrA5M/eArza1a9VmTiNIBNMjOGr1Ow9mTyU2o69U6U9Q==} + is-utf8@0.2.1: {} - /is-valid-glob@0.3.0: - resolution: {integrity: sha512-CvG8EtJZ8FyzVOGPzrDorzyN65W1Ld8BVnqshRCah6pFIsprGx3dKgFtjLn/Vw9kGqR4OlR84U7yhT9ZVTyWIQ==} - engines: {node: '>=0.10.0'} - dev: false + is-valid-glob@0.3.0: {} - /is-windows@1.0.2: - resolution: {integrity: sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==} - engines: {node: '>=0.10.0'} - dev: true + is-windows@1.0.2: {} - /isarray@0.0.1: - resolution: {integrity: sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==} - dev: false + isarray@0.0.1: {} - /isarray@1.0.0: - resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} + isarray@1.0.0: {} - /isexe@2.0.0: - resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + isexe@2.0.0: {} - /isobject@2.1.0: - resolution: {integrity: sha512-+OUdGJlgjOBZDfxnDjYYG6zp487z0JGNQq3cYQYg5f5hKR+syHMsaztzGeml/4kGG55CSpKSpWTY+jYGgsHLgA==} - engines: {node: '>=0.10.0'} + isobject@2.1.0: dependencies: isarray: 1.0.0 - dev: false - /istanbul-lib-coverage@3.2.2: - resolution: {integrity: sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==} - engines: {node: '>=8'} + istanbul-lib-coverage@3.2.2: {} - /istanbul-lib-instrument@5.2.1: - resolution: {integrity: sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==} - engines: {node: '>=8'} + istanbul-lib-instrument@5.2.1: dependencies: '@babel/core': 7.23.9 '@babel/parser': 7.23.9 @@ -5177,9 +8143,7 @@ packages: transitivePeerDependencies: - supports-color - /istanbul-lib-instrument@6.0.1: - resolution: {integrity: sha512-EAMEJBsYuyyztxMxW3g7ugGPkrZsV57v0Hmv3mm1uQsmB+QnZuepg731CRaIgeUVSdmsTngOkSnauNF8p7FIhA==} - engines: {node: '>=10'} + istanbul-lib-instrument@6.0.1: dependencies: '@babel/core': 7.23.9 '@babel/parser': 7.23.9 @@ -5189,17 +8153,13 @@ packages: transitivePeerDependencies: - supports-color - /istanbul-lib-report@3.0.1: - resolution: {integrity: sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==} - engines: {node: '>=10'} + istanbul-lib-report@3.0.1: dependencies: istanbul-lib-coverage: 3.2.2 make-dir: 4.0.0 supports-color: 7.2.0 - /istanbul-lib-source-maps@4.0.1: - resolution: {integrity: sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==} - engines: {node: '>=10'} + istanbul-lib-source-maps@4.0.1: dependencies: debug: 4.3.4 istanbul-lib-coverage: 3.2.2 @@ -5207,46 +8167,33 @@ packages: transitivePeerDependencies: - supports-color - /istanbul-reports@3.1.6: - resolution: {integrity: sha512-TLgnMkKg3iTDsQ9PbPTdpfAK2DzjF9mqUG7RMgcQl8oFjad8ob4laGxv5XV5U9MAfx8D6tSJiUyuAwzLicaxlg==} - engines: {node: '>=8'} + istanbul-reports@3.1.6: dependencies: html-escaper: 2.0.2 istanbul-lib-report: 3.0.1 - /iterare@1.2.1: - resolution: {integrity: sha512-RKYVTCjAnRthyJes037NX/IiqeidgN1xc3j1RjFfECFp28A1GVwK9nA+i0rJPaHqSZwygLzRnFlzUuHFoWWy+Q==} - engines: {node: '>=6'} + iterare@1.2.1: {} - /jackspeak@3.4.3: - resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==} + jackspeak@3.4.3: dependencies: '@isaacs/cliui': 8.0.2 optionalDependencies: '@pkgjs/parseargs': 0.11.0 - /jake@10.9.2: - resolution: {integrity: sha512-2P4SQ0HrLQ+fw6llpLnOaGAvN2Zu6778SJMrCUwns4fOoG9ayrTiZk3VV8sCPkVZF8ab0zksVpS8FDY5pRCNBA==} - engines: {node: '>=10'} - hasBin: true + jake@10.9.2: dependencies: async: 3.2.5 chalk: 4.1.2 filelist: 1.0.4 minimatch: 3.1.2 - dev: true - - /jest-changed-files@29.7.0: - resolution: {integrity: sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-changed-files@29.7.0: dependencies: execa: 5.1.1 jest-util: 29.7.0 p-limit: 3.1.0 - /jest-circus@29.7.0: - resolution: {integrity: sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + jest-circus@29.7.0: dependencies: '@jest/environment': 29.7.0 '@jest/expect': 29.7.0 @@ -5272,24 +8219,16 @@ packages: - babel-plugin-macros - supports-color - /jest-cli@29.7.0(@types/node@22.7.5)(ts-node@10.9.2): - resolution: {integrity: sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - hasBin: true - peerDependencies: - node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 - peerDependenciesMeta: - node-notifier: - optional: true + jest-cli@29.7.0(@types/node@22.7.5)(ts-node@10.9.2(@types/node@22.7.5)(typescript@5.6.3)): dependencies: - '@jest/core': 29.7.0(ts-node@10.9.2) + '@jest/core': 29.7.0(ts-node@10.9.2(@types/node@22.7.5)(typescript@5.6.3)) '@jest/test-result': 29.7.0 '@jest/types': 29.6.3 chalk: 4.1.2 - create-jest: 29.7.0(@types/node@22.7.5)(ts-node@10.9.2) + create-jest: 29.7.0(@types/node@22.7.5)(ts-node@10.9.2(@types/node@22.7.5)(typescript@5.6.3)) exit: 0.1.2 import-local: 3.1.0 - jest-config: 29.7.0(@types/node@22.7.5)(ts-node@10.9.2) + jest-config: 29.7.0(@types/node@22.7.5)(ts-node@10.9.2(@types/node@22.7.5)(typescript@5.6.3)) jest-util: 29.7.0 jest-validate: 29.7.0 yargs: 17.7.2 @@ -5299,22 +8238,11 @@ packages: - supports-color - ts-node - /jest-config@29.7.0(@types/node@22.7.5)(ts-node@10.9.2): - resolution: {integrity: sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - peerDependencies: - '@types/node': '*' - ts-node: '>=9.0.0' - peerDependenciesMeta: - '@types/node': - optional: true - ts-node: - optional: true + jest-config@29.7.0(@types/node@22.7.5)(ts-node@10.9.2(@types/node@22.7.5)(typescript@5.6.3)): dependencies: '@babel/core': 7.23.9 '@jest/test-sequencer': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 22.7.5 babel-jest: 29.7.0(@babel/core@7.23.9) chalk: 4.1.2 ci-info: 3.9.0 @@ -5334,29 +8262,25 @@ packages: pretty-format: 29.7.0 slash: 3.0.0 strip-json-comments: 3.1.1 + optionalDependencies: + '@types/node': 22.7.5 ts-node: 10.9.2(@types/node@22.7.5)(typescript@5.6.3) transitivePeerDependencies: - babel-plugin-macros - supports-color - /jest-diff@29.7.0: - resolution: {integrity: sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + jest-diff@29.7.0: dependencies: chalk: 4.1.2 diff-sequences: 29.6.3 jest-get-type: 29.6.3 pretty-format: 29.7.0 - /jest-docblock@29.7.0: - resolution: {integrity: sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + jest-docblock@29.7.0: dependencies: detect-newline: 3.1.0 - /jest-each@29.7.0: - resolution: {integrity: sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + jest-each@29.7.0: dependencies: '@jest/types': 29.6.3 chalk: 4.1.2 @@ -5364,9 +8288,7 @@ packages: jest-util: 29.7.0 pretty-format: 29.7.0 - /jest-environment-node@29.7.0: - resolution: {integrity: sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + jest-environment-node@29.7.0: dependencies: '@jest/environment': 29.7.0 '@jest/fake-timers': 29.7.0 @@ -5375,13 +8297,9 @@ packages: jest-mock: 29.7.0 jest-util: 29.7.0 - /jest-get-type@29.6.3: - resolution: {integrity: sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + jest-get-type@29.6.3: {} - /jest-haste-map@29.7.0: - resolution: {integrity: sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + jest-haste-map@29.7.0: dependencies: '@jest/types': 29.6.3 '@types/graceful-fs': 4.1.9 @@ -5397,25 +8315,19 @@ packages: optionalDependencies: fsevents: 2.3.3 - /jest-leak-detector@29.7.0: - resolution: {integrity: sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + jest-leak-detector@29.7.0: dependencies: jest-get-type: 29.6.3 pretty-format: 29.7.0 - /jest-matcher-utils@29.7.0: - resolution: {integrity: sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + jest-matcher-utils@29.7.0: dependencies: chalk: 4.1.2 jest-diff: 29.7.0 jest-get-type: 29.6.3 pretty-format: 29.7.0 - /jest-message-util@29.7.0: - resolution: {integrity: sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + jest-message-util@29.7.0: dependencies: '@babel/code-frame': 7.23.5 '@jest/types': 29.6.3 @@ -5427,41 +8339,26 @@ packages: slash: 3.0.0 stack-utils: 2.0.6 - /jest-mock@29.7.0: - resolution: {integrity: sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + jest-mock@29.7.0: dependencies: '@jest/types': 29.6.3 '@types/node': 22.7.5 jest-util: 29.7.0 - /jest-pnp-resolver@1.2.3(jest-resolve@29.7.0): - resolution: {integrity: sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==} - engines: {node: '>=6'} - peerDependencies: - jest-resolve: '*' - peerDependenciesMeta: - jest-resolve: - optional: true - dependencies: + jest-pnp-resolver@1.2.3(jest-resolve@29.7.0): + optionalDependencies: jest-resolve: 29.7.0 - /jest-regex-util@29.6.3: - resolution: {integrity: sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + jest-regex-util@29.6.3: {} - /jest-resolve-dependencies@29.7.0: - resolution: {integrity: sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + jest-resolve-dependencies@29.7.0: dependencies: jest-regex-util: 29.6.3 jest-snapshot: 29.7.0 transitivePeerDependencies: - supports-color - /jest-resolve@29.7.0: - resolution: {integrity: sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + jest-resolve@29.7.0: dependencies: chalk: 4.1.2 graceful-fs: 4.2.11 @@ -5473,9 +8370,7 @@ packages: resolve.exports: 2.0.2 slash: 3.0.0 - /jest-runner@29.7.0: - resolution: {integrity: sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + jest-runner@29.7.0: dependencies: '@jest/console': 29.7.0 '@jest/environment': 29.7.0 @@ -5501,9 +8396,7 @@ packages: transitivePeerDependencies: - supports-color - /jest-runtime@29.7.0: - resolution: {integrity: sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + jest-runtime@29.7.0: dependencies: '@jest/environment': 29.7.0 '@jest/fake-timers': 29.7.0 @@ -5530,9 +8423,7 @@ packages: transitivePeerDependencies: - supports-color - /jest-snapshot@29.7.0: - resolution: {integrity: sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + jest-snapshot@29.7.0: dependencies: '@babel/core': 7.23.9 '@babel/generator': 7.23.6 @@ -5557,9 +8448,7 @@ packages: transitivePeerDependencies: - supports-color - /jest-util@29.7.0: - resolution: {integrity: sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + jest-util@29.7.0: dependencies: '@jest/types': 29.6.3 '@types/node': 22.7.5 @@ -5568,9 +8457,7 @@ packages: graceful-fs: 4.2.11 picomatch: 2.3.1 - /jest-validate@29.7.0: - resolution: {integrity: sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + jest-validate@29.7.0: dependencies: '@jest/types': 29.6.3 camelcase: 6.3.0 @@ -5579,9 +8466,7 @@ packages: leven: 3.1.0 pretty-format: 29.7.0 - /jest-watcher@29.7.0: - resolution: {integrity: sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + jest-watcher@29.7.0: dependencies: '@jest/test-result': 29.7.0 '@jest/types': 29.6.3 @@ -5592,170 +8477,99 @@ packages: jest-util: 29.7.0 string-length: 4.0.2 - /jest-worker@27.5.1: - resolution: {integrity: sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==} - engines: {node: '>= 10.13.0'} + jest-worker@27.5.1: dependencies: '@types/node': 22.7.5 merge-stream: 2.0.0 supports-color: 8.1.1 - dev: true - /jest-worker@29.7.0: - resolution: {integrity: sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + jest-worker@29.7.0: dependencies: '@types/node': 22.7.5 jest-util: 29.7.0 merge-stream: 2.0.0 supports-color: 8.1.1 - /jest@29.5.0(@types/node@22.7.5)(ts-node@10.9.2): - resolution: {integrity: sha512-juMg3he2uru1QoXX078zTa7pO85QyB9xajZc6bU+d9yEGwrKX6+vGmJQ3UdVZsvTEUARIdObzH68QItim6OSSQ==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - hasBin: true - peerDependencies: - node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 - peerDependenciesMeta: - node-notifier: - optional: true + jest@29.5.0(@types/node@22.7.5)(ts-node@10.9.2(@types/node@22.7.5)(typescript@5.6.3)): dependencies: - '@jest/core': 29.7.0(ts-node@10.9.2) + '@jest/core': 29.7.0(ts-node@10.9.2(@types/node@22.7.5)(typescript@5.6.3)) '@jest/types': 29.6.3 import-local: 3.1.0 - jest-cli: 29.7.0(@types/node@22.7.5)(ts-node@10.9.2) + jest-cli: 29.7.0(@types/node@22.7.5)(ts-node@10.9.2(@types/node@22.7.5)(typescript@5.6.3)) transitivePeerDependencies: - '@types/node' - babel-plugin-macros - supports-color - ts-node - dev: false - /jest@29.7.0(@types/node@22.7.5)(ts-node@10.9.2): - resolution: {integrity: sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - hasBin: true - peerDependencies: - node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 - peerDependenciesMeta: - node-notifier: - optional: true + jest@29.7.0(@types/node@22.7.5)(ts-node@10.9.2(@types/node@22.7.5)(typescript@5.6.3)): dependencies: - '@jest/core': 29.7.0(ts-node@10.9.2) + '@jest/core': 29.7.0(ts-node@10.9.2(@types/node@22.7.5)(typescript@5.6.3)) '@jest/types': 29.6.3 import-local: 3.1.0 - jest-cli: 29.7.0(@types/node@22.7.5)(ts-node@10.9.2) + jest-cli: 29.7.0(@types/node@22.7.5)(ts-node@10.9.2(@types/node@22.7.5)(typescript@5.6.3)) transitivePeerDependencies: - '@types/node' - babel-plugin-macros - supports-color - ts-node - dev: true - /jiti@1.21.0: - resolution: {integrity: sha512-gFqAIbuKyyso/3G2qhiO2OM6shY6EPP/R0+mkDbyspxKazh8BXDC5FiFsUjlczgdNz/vfra0da2y+aHrusLG/Q==} - hasBin: true - dev: true + jiti@1.21.0: {} - /joycon@3.1.1: - resolution: {integrity: sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw==} - engines: {node: '>=10'} - dev: false + joycon@3.1.1: {} - /js-tokens@4.0.0: - resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + js-tokens@4.0.0: {} - /js-yaml@3.14.1: - resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==} - hasBin: true + js-yaml@3.14.1: dependencies: argparse: 1.0.10 esprima: 4.0.1 - /js-yaml@4.1.0: - resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} - hasBin: true + js-yaml@4.1.0: dependencies: argparse: 2.0.1 - /jsesc@2.5.2: - resolution: {integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==} - engines: {node: '>=4'} - hasBin: true + jsesc@2.5.2: {} - /json-buffer@3.0.1: - resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} - dev: true + json-buffer@3.0.1: {} - /json-parse-better-errors@1.0.2: - resolution: {integrity: sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==} - dev: true + json-parse-better-errors@1.0.2: {} - /json-parse-even-better-errors@2.3.1: - resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} + json-parse-even-better-errors@2.3.1: {} - /json-query@2.2.2: - resolution: {integrity: sha512-y+IcVZSdqNmS4fO8t1uZF6RMMs0xh3SrTjJr9bp1X3+v0Q13+7Cyv12dSmKwDswp/H427BVtpkLWhGxYu3ZWRA==} - dev: true + json-query@2.2.2: {} - /json-schema-ref-resolver@1.0.1: - resolution: {integrity: sha512-EJAj1pgHc1hxF6vo2Z3s69fMjO1INq6eGHXZ8Z6wCQeldCuwxGK9Sxf4/cScGn3FZubCVUehfWtcDM/PLteCQw==} + json-schema-ref-resolver@1.0.1: dependencies: fast-deep-equal: 3.1.3 - dev: false - /json-schema-traverse@0.4.1: - resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} - dev: true + json-schema-traverse@0.4.1: {} - /json-schema-traverse@1.0.0: - resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} + json-schema-traverse@1.0.0: {} - /json-stable-stringify-without-jsonify@1.0.1: - resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} + json-stable-stringify-without-jsonify@1.0.1: {} - /json-stringify-safe@5.0.1: - resolution: {integrity: sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==} - dev: true + json-stringify-safe@5.0.1: {} - /json5@2.2.3: - resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} - engines: {node: '>=6'} - hasBin: true + json5@2.2.3: {} - /jsonc-parser@3.0.0: - resolution: {integrity: sha512-fQzRfAbIBnR0IQvftw9FJveWiHp72Fg20giDrHz6TdfB12UH/uue0D3hm57UB5KgAVuniLMCaS8P1IMj9NR7cA==} - dev: false + jsonc-parser@3.0.0: {} - /jsonc-parser@3.2.1: - resolution: {integrity: sha512-AilxAyFOAcK5wA1+LeaySVBrHsGQvUFCDWXKpZjzaL0PqW+xfBOttn8GNtWKFWqneyMZj41MWF9Kl6iPWLwgOA==} - dev: true + jsonc-parser@3.2.1: {} - /jsonc-parser@3.3.1: - resolution: {integrity: sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ==} - dev: true + jsonc-parser@3.3.1: {} - /jsonfile@6.1.0: - resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==} + jsonfile@6.1.0: dependencies: universalify: 2.0.1 optionalDependencies: graceful-fs: 4.2.11 - dev: true - /jsonparse@1.3.1: - resolution: {integrity: sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==} - engines: {'0': node >= 0.2.0} - dev: true + jsonparse@1.3.1: {} - /jsonrepair@3.8.1: - resolution: {integrity: sha512-5wnjaO53EJOhfLFY92nvBz2B9gqF9ql/D4HKUb1WOSBaqtVcAifFfmurblnhCJn/ySqKFA8U3n7nhGMAu/hEjQ==} - hasBin: true - dev: false + jsonrepair@3.8.1: {} - /jsonwebtoken@9.0.2: - resolution: {integrity: sha512-PRp66vJ865SSqOlgqS8hujT5U4AOgMfhrwYIuIhfKaoSCZcirrmASQr8CX7cUg+RMih+hgznrjp99o+W4pJLHQ==} - engines: {node: '>=12', npm: '>=6'} + jsonwebtoken@9.0.2: dependencies: jws: 3.2.2 lodash.includes: 4.3.0 @@ -5767,261 +8581,151 @@ packages: lodash.once: 4.1.1 ms: 2.1.3 semver: 7.6.0 - dev: false - /jwa@1.4.1: - resolution: {integrity: sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==} + jwa@1.4.1: dependencies: buffer-equal-constant-time: 1.0.1 ecdsa-sig-formatter: 1.0.11 safe-buffer: 5.2.1 - dev: false - /jws@3.2.2: - resolution: {integrity: sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==} + jws@3.2.2: dependencies: jwa: 1.4.1 safe-buffer: 5.2.1 - dev: false - /keyv@4.5.4: - resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} + keyv@4.5.4: dependencies: json-buffer: 3.0.1 - dev: true - /kind-of@3.2.2: - resolution: {integrity: sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==} - engines: {node: '>=0.10.0'} + kind-of@3.2.2: dependencies: is-buffer: 1.1.6 - dev: false - /kind-of@6.0.3: - resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==} - engines: {node: '>=0.10.0'} + kind-of@6.0.3: {} - /kleur@3.0.3: - resolution: {integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==} - engines: {node: '>=6'} + kleur@3.0.3: {} - /kleur@4.1.5: - resolution: {integrity: sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==} - engines: {node: '>=6'} - dev: true + kleur@4.1.5: {} - /klona@2.0.6: - resolution: {integrity: sha512-dhG34DXATL5hSxJbIexCft8FChFXtmskoZYnoPWjXQuebWYCNkVeV3KkGegCK9CP1oswI/vQibS2GY7Em/sJJA==} - engines: {node: '>= 8'} - dev: true + klona@2.0.6: {} - /lazy-debug-legacy@0.0.1(debug@2.6.9): - resolution: {integrity: sha512-GFWaIBcBjxWWKI5OghwYEsPOR8JFh2xEcc3ZFV0ONYL0oHz0PHINJCfxJyztUq2XzcHncyO7fsRR550Gtfnk6g==} - peerDependencies: - debug: '*' + lazy-debug-legacy@0.0.1(debug@2.6.9): dependencies: debug: 2.6.9 - dev: false - /lazystream@1.0.1: - resolution: {integrity: sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw==} - engines: {node: '>= 0.6.3'} + lazystream@1.0.1: dependencies: readable-stream: 2.3.8 - dev: false - /lcid@1.0.0: - resolution: {integrity: sha512-YiGkH6EnGrDGqLMITnGjXtGmNtjoXw9SVUzcaos8RBi7Ps0VBylkq+vOcY9QE5poLasPCR849ucFUkl0UzUyOw==} - engines: {node: '>=0.10.0'} + lcid@1.0.0: dependencies: invert-kv: 1.0.0 - dev: false - /leven@3.1.0: - resolution: {integrity: sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==} - engines: {node: '>=6'} + leven@3.1.0: {} - /levn@0.4.1: - resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} - engines: {node: '>= 0.8.0'} + levn@0.4.1: dependencies: prelude-ls: 1.2.1 type-check: 0.4.0 - dev: true - /libphonenumber-js@1.10.58: - resolution: {integrity: sha512-53A0IpJFL9LdHbpeatwizf8KSwPICrqn9H0g3Y7WQ+Jgeu9cQ4Ew3WrRtrLBu/CX2lXd5+rgT01/tGlkbkzOjw==} + libphonenumber-js@1.10.58: {} - /light-my-request@5.12.0: - resolution: {integrity: sha512-P526OX6E7aeCIfw/9UyJNsAISfcFETghysaWHQAlQYayynShT08MOj4c6fBCvTWBrHXSvqBAKDp3amUPSCQI4w==} + light-my-request@5.12.0: dependencies: cookie: 0.6.0 process-warning: 3.0.0 set-cookie-parser: 2.6.0 - dev: false - /lightcookie@1.0.25: - resolution: {integrity: sha512-SrY/+eBPaKAMnsn7mCsoOMZzoQyCyHHHZlFCu2fjo28XxSyCLjlooKiTxyrXTg8NPaHp1YzWi0lcGG1gDi6KHw==} - deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. - dev: true + lightcookie@1.0.25: {} - /lines-and-columns@1.2.4: - resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} + lines-and-columns@1.2.4: {} - /load-json-file@1.1.0: - resolution: {integrity: sha512-cy7ZdNRXdablkXYNI049pthVeXFurRyb9+hA/dZzerZ0pGTx42z+y+ssxBaVV2l70t1muq5IdKhn4UtcoGUY9A==} - engines: {node: '>=0.10.0'} + load-json-file@1.1.0: dependencies: graceful-fs: 4.2.11 parse-json: 2.2.0 pify: 2.3.0 pinkie-promise: 2.0.1 strip-bom: 2.0.0 - dev: false - /load-json-file@4.0.0: - resolution: {integrity: sha512-Kx8hMakjX03tiGTLAIdJ+lL0htKnXjEZN6hk/tozf/WOuYGdZBJrZ+rCJRbVCugsjB3jMLn9746NsQIf5VjBMw==} - engines: {node: '>=4'} + load-json-file@4.0.0: dependencies: graceful-fs: 4.2.11 parse-json: 4.0.0 pify: 3.0.0 strip-bom: 3.0.0 - dev: true - /loader-runner@4.3.0: - resolution: {integrity: sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==} - engines: {node: '>=6.11.5'} - dev: true + loader-runner@4.3.0: {} - /locate-path@2.0.0: - resolution: {integrity: sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA==} - engines: {node: '>=4'} + locate-path@2.0.0: dependencies: p-locate: 2.0.0 path-exists: 3.0.0 - dev: true - /locate-path@3.0.0: - resolution: {integrity: sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==} - engines: {node: '>=6'} + locate-path@3.0.0: dependencies: p-locate: 3.0.0 path-exists: 3.0.0 - dev: true - /locate-path@5.0.0: - resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} - engines: {node: '>=8'} + locate-path@5.0.0: dependencies: p-locate: 4.1.0 - /locate-path@6.0.0: - resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} - engines: {node: '>=10'} + locate-path@6.0.0: dependencies: p-locate: 5.0.0 - dev: true - /locate-path@7.2.0: - resolution: {integrity: sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + locate-path@7.2.0: dependencies: p-locate: 6.0.0 - dev: true - /lodash._reinterpolate@3.0.0: - resolution: {integrity: sha512-xYHt68QRoYGjeeM/XOE1uJtvXQAgvszfBhjV4yvsQH0u2i9I6cI6c6/eG4Hh3UAOVn0y/xAXwmTzEay49Q//HA==} - dev: false + lodash._reinterpolate@3.0.0: {} - /lodash.assign@4.2.0: - resolution: {integrity: sha512-hFuH8TY+Yji7Eja3mGiuAxBqLagejScbG8GbG0j6o9vzn0YL14My+ktnqtZgFTosKymC9/44wP6s7xyuLfnClw==} - dev: false + lodash.assign@4.2.0: {} - /lodash.assigninwith@4.2.0: - resolution: {integrity: sha512-oYOjtZzQnecm7PJcxrDbL20OHv3tTtOQdRBSnlor6s0MO6VOFTOC+JyBIJUNUEzsBi1I0oslWtFAAG6QQbFIWQ==} - dev: false + lodash.assigninwith@4.2.0: {} - /lodash.camelcase@4.3.0: - resolution: {integrity: sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==} - dev: true + lodash.camelcase@4.3.0: {} - /lodash.clonedeep@4.5.0: - resolution: {integrity: sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ==} - dev: false + lodash.clonedeep@4.5.0: {} - /lodash.includes@4.3.0: - resolution: {integrity: sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w==} - dev: false + lodash.includes@4.3.0: {} - /lodash.isboolean@3.0.3: - resolution: {integrity: sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg==} - dev: false + lodash.isboolean@3.0.3: {} - /lodash.isequal@4.5.0: - resolution: {integrity: sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==} - dev: false + lodash.isequal@4.5.0: {} - /lodash.isinteger@4.0.4: - resolution: {integrity: sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA==} - dev: false + lodash.isinteger@4.0.4: {} - /lodash.ismatch@4.4.0: - resolution: {integrity: sha512-fPMfXjGQEV9Xsq/8MTSgUf255gawYRbjwMyDbcvDhXgV7enSZA0hynz6vMPnpAb5iONEzBHBPsT+0zes5Z301g==} - dev: true + lodash.ismatch@4.4.0: {} - /lodash.isnumber@3.0.3: - resolution: {integrity: sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw==} - dev: false + lodash.isnumber@3.0.3: {} - /lodash.isplainobject@4.0.6: - resolution: {integrity: sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==} + lodash.isplainobject@4.0.6: {} - /lodash.isstring@4.0.1: - resolution: {integrity: sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==} - dev: false + lodash.isstring@4.0.1: {} - /lodash.kebabcase@4.1.1: - resolution: {integrity: sha512-N8XRTIMMqqDgSy4VLKPnJ/+hpGZN+PHQiJnSenYqPaVV/NCqEogTnAdZLQiGKhxX+JCs8waWq2t1XHWKOmlY8g==} - dev: true + lodash.kebabcase@4.1.1: {} - /lodash.keys@4.2.0: - resolution: {integrity: sha512-J79MkJcp7Df5mizHiVNpjoHXLi4HLjh9VLS/M7lQSGoQ+0oQ+lWEigREkqKyizPB1IawvQLLKY8mzEcm1tkyxQ==} - dev: false + lodash.keys@4.2.0: {} - /lodash.map@4.6.0: - resolution: {integrity: sha512-worNHGKLDetmcEYDvh2stPCrrQRkP20E4l0iIS7F8EvzMqBBi7ltvFN5m1HvTf1P7Jk1txKhvFcmYsCr8O2F1Q==} - dev: true + lodash.map@4.6.0: {} - /lodash.memoize@4.1.2: - resolution: {integrity: sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==} + lodash.memoize@4.1.2: {} - /lodash.merge@4.6.2: - resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} - dev: true + lodash.merge@4.6.2: {} - /lodash.mergewith@4.6.2: - resolution: {integrity: sha512-GK3g5RPZWTRSeLSpgP8Xhra+pnjBC56q9FZYe1d5RN3TJ35dbkGy3YqBSMbyCrlbi+CM9Z3Jk5yTL7RCsqboyQ==} - dev: true + lodash.mergewith@4.6.2: {} - /lodash.once@4.1.1: - resolution: {integrity: sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==} - dev: false + lodash.once@4.1.1: {} - /lodash.rest@4.0.5: - resolution: {integrity: sha512-hsypEpebNAt0hj1aX9isQqi2CIZoNS1lP6PSWhB3hcMnBivobYzPZRPYq4cr38+RtvrlxQTgaW+sIuHAhBoHrA==} - dev: false + lodash.rest@4.0.5: {} - /lodash.snakecase@4.1.1: - resolution: {integrity: sha512-QZ1d4xoBHYUeuouhEq3lk3Uq7ldgyFXGBhg04+oRLnIz8o9T65Eh+8YdroUwn846zchkA9yDsDl5CVVaV2nqYw==} - dev: true + lodash.snakecase@4.1.1: {} - /lodash.startcase@4.4.0: - resolution: {integrity: sha512-+WKqsK294HMSc2jEbNgpHpd0JfIBhp7rEV4aqXWqFr6AlXov+SlcgB1Fv01y2kGe3Gc8nMW7VA0SrGuSkRfIEg==} - dev: true + lodash.startcase@4.4.0: {} - /lodash.template@4.2.4: - resolution: {integrity: sha512-PmEQ9TtYbeYg6lNwJpSjkp4J4KttYLuKF1C6jeFBidyzbOFu0KvVnLicZBf0sGfScARwgOBqxnV/rWuaqRwang==} + lodash.template@4.2.4: dependencies: lodash._reinterpolate: 3.0.0 lodash.assigninwith: 4.2.0 @@ -6029,129 +8733,77 @@ packages: lodash.rest: 4.0.5 lodash.templatesettings: 4.2.0 lodash.tostring: 4.1.4 - dev: false - /lodash.templatesettings@4.2.0: - resolution: {integrity: sha512-stgLz+i3Aa9mZgnjr/O+v9ruKZsPsndy7qPZOchbqk2cnTU1ZaldKK+v7m54WoKIyxiuMZTKT2H81F8BeAc3ZQ==} + lodash.templatesettings@4.2.0: dependencies: lodash._reinterpolate: 3.0.0 - dev: false - /lodash.tostring@4.1.4: - resolution: {integrity: sha512-xWHJ0LY7cSz/C/4ghNNiYA1Ong0VLdzAzrjDHvOzN+eJHzDEHme2+k+w/9Pk8dtdwcASMUbxN1/mtj6mFI25Ng==} - dev: false + lodash.tostring@4.1.4: {} - /lodash.uniq@4.5.0: - resolution: {integrity: sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==} - dev: true + lodash.uniq@4.5.0: {} - /lodash.upperfirst@4.3.1: - resolution: {integrity: sha512-sReKOYJIJf74dhJONhU4e0/shzi1trVbSWDOhKYE5XV2O+H7Sb2Dihwuc7xWxVl+DgFPyTqIN3zMfT9cq5iWDg==} - dev: true + lodash.upperfirst@4.3.1: {} - /lodash@4.17.21: - resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} + lodash@4.17.21: {} - /log-symbols@4.1.0: - resolution: {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==} - engines: {node: '>=10'} + log-symbols@4.1.0: dependencies: chalk: 4.1.2 is-unicode-supported: 0.1.0 - /longest@2.0.1: - resolution: {integrity: sha512-Ajzxb8CM6WAnFjgiloPsI3bF+WCxcvhdIG3KNA2KN962+tdBsHcuQ4k4qX/EcS/2CRkcc0iAkR956Nib6aXU/Q==} - engines: {node: '>=0.10.0'} - dev: true + longest@2.0.1: {} - /lru-cache@10.2.0: - resolution: {integrity: sha512-2bIM8x+VAf6JT4bKAljS1qUWgMsqZRPGJS6FSahIMPVvctcNhyVp7AJu7quxOW9jwkryBReKZY5tY5JYv2n/7Q==} - engines: {node: 14 || >=16.14} + lru-cache@10.2.0: {} - /lru-cache@5.1.1: - resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} + lru-cache@5.1.1: dependencies: yallist: 3.1.1 - /lru-cache@6.0.0: - resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} - engines: {node: '>=10'} + lru-cache@6.0.0: dependencies: yallist: 4.0.0 - /magic-string@0.25.7: - resolution: {integrity: sha512-4CrMT5DOHTDk4HYDlzmwu4FVCcIYI8gauveasrdCu2IKIFOJ3f0v/8MDGJCDL9oD2ppz/Av1b0Nj345H9M+XIA==} + magic-string@0.25.7: dependencies: sourcemap-codec: 1.4.8 - dev: false - /magic-string@0.30.8: - resolution: {integrity: sha512-ISQTe55T2ao7XtlAStud6qwYPZjE4GK1S/BeVPus4jrq6JuOnQ00YKQC581RWhR122W7msZV263KzVeLoqidyQ==} - engines: {node: '>=12'} + magic-string@0.30.8: dependencies: '@jridgewell/sourcemap-codec': 1.4.15 - dev: true - /make-dir@3.1.0: - resolution: {integrity: sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==} - engines: {node: '>=8'} + make-dir@3.1.0: dependencies: semver: 6.3.1 - /make-dir@4.0.0: - resolution: {integrity: sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==} - engines: {node: '>=10'} + make-dir@4.0.0: dependencies: semver: 7.6.3 - /make-error@1.3.6: - resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} + make-error@1.3.6: {} - /makeerror@1.0.12: - resolution: {integrity: sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==} + makeerror@1.0.12: dependencies: tmpl: 1.0.5 - /map-obj@1.0.1: - resolution: {integrity: sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==} - engines: {node: '>=0.10.0'} - dev: true + map-obj@1.0.1: {} - /map-obj@4.3.0: - resolution: {integrity: sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==} - engines: {node: '>=8'} - dev: true + map-obj@4.3.0: {} - /map-stream@0.0.6: - resolution: {integrity: sha512-RG9wAgznUY0foT30MMfnXh4jS0ObmOuxoGKe/ppYvM55RfquNdIvEEf6e+euczNVVzJIVbkgxg7GJBpYDhQ/Zg==} - dev: false + map-stream@0.0.6: {} - /matchit@1.1.0: - resolution: {integrity: sha512-+nGYoOlfHmxe5BW5tE0EMJppXEwdSf8uBA1GTZC7Q77kbT35+VKLYJMzVNWCHSsga1ps1tPYFtFyvxvKzWVmMA==} - engines: {node: '>=6'} + matchit@1.1.0: dependencies: '@arr/every': 1.0.1 - dev: true - /math-random@1.0.4: - resolution: {integrity: sha512-rUxjysqif/BZQH2yhd5Aaq7vXMSx9NdEsQcyA07uEzIvxgI7zIr33gGsh+RU0/XjmQpCW7RsVof1vlkvQVCK5A==} - dev: false + math-random@1.0.4: {} - /memfs@3.5.3: - resolution: {integrity: sha512-UERzLsxzllchadvbPs5aolHh65ISpKpM+ccLbOJ8/vvpBKmAWf+la7dXFy7Mr0ySHbdHrFv5kGFCUHHe6GFEmw==} - engines: {node: '>= 4.0.0'} + memfs@3.5.3: dependencies: fs-monkey: 1.0.5 - dev: true - /meow@12.1.1: - resolution: {integrity: sha512-BhXM0Au22RwUneMPwSCnyhTOizdWoIEPU9sp0Aqa1PnDMR5Wv2FGXYDjuzJEIX+Eo2Rb8xuYe5jrnm5QowQFkw==} - engines: {node: '>=16.10'} - dev: true + meow@12.1.1: {} - /meow@8.1.2: - resolution: {integrity: sha512-r85E3NdZ+mpYk1C6RjPFEMSE+s1iZMuHtsHAqY0DT3jZczl0diWUZ8g6oU7h0M9cD2EL+PzaYghhCLzR0ZNn5Q==} - engines: {node: '>=10'} + meow@8.1.2: dependencies: '@types/minimist': 1.2.5 camelcase-keys: 6.2.2 @@ -6164,34 +8816,20 @@ packages: trim-newlines: 3.0.1 type-fest: 0.18.1 yargs-parser: 20.2.9 - dev: true - /merge-stream@1.0.1: - resolution: {integrity: sha512-e6RM36aegd4f+r8BZCcYXlO2P3H6xbUM6ktL2Xmf45GAOit9bI4z6/3VU7JwllVO1L7u0UDSg/EhzQ5lmMLolA==} + merge-stream@1.0.1: dependencies: readable-stream: 2.3.8 - dev: false - /merge-stream@2.0.0: - resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} + merge-stream@2.0.0: {} - /merge2@1.4.1: - resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} - engines: {node: '>= 8'} - dev: true + merge2@1.4.1: {} - /merge@2.1.1: - resolution: {integrity: sha512-jz+Cfrg9GWOZbQAnDQ4hlVnQky+341Yk5ru8bZSe6sIDTCIg8n9i/u7hSQGSVOF3C7lH6mGtqjkiT9G4wFLL0w==} - dev: true + merge@2.1.1: {} - /methods@1.1.2: - resolution: {integrity: sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==} - engines: {node: '>= 0.6'} - dev: true + methods@1.1.2: {} - /micromatch@2.3.11: - resolution: {integrity: sha512-LnU2XFEk9xxSJ6rfgAry/ty5qwUTyHYOBU0g4R6tIw5ljwgGIBmiKhRWLw5NpMOnrgUNcDJ4WMp8rl3sYVHLNA==} - engines: {node: '>=0.10.0'} + micromatch@2.3.11: dependencies: arr-diff: 2.0.0 array-unique: 0.2.1 @@ -6206,150 +8844,85 @@ packages: object.omit: 2.0.1 parse-glob: 3.0.4 regex-cache: 0.4.4 - dev: false - /micromatch@4.0.8: - resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} - engines: {node: '>=8.6'} + micromatch@4.0.8: dependencies: braces: 3.0.3 picomatch: 2.3.1 - /mime-db@1.52.0: - resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} - engines: {node: '>= 0.6'} + mime-db@1.52.0: {} - /mime-lite@1.0.3: - resolution: {integrity: sha512-V85l97zJSTG8FEvmdTlmNYb0UMrVBwvRjw7bWTf/aT6KjFwtz3iTz8D2tuFIp7lwiaO2C5ecnrEmSkkMRCrqVw==} - dev: true + mime-lite@1.0.3: {} - /mime-types@2.1.35: - resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} - engines: {node: '>= 0.6'} + mime-types@2.1.35: dependencies: mime-db: 1.52.0 - /mime@2.6.0: - resolution: {integrity: sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==} - engines: {node: '>=4.0.0'} - hasBin: true - dev: true - - /mime@3.0.0: - resolution: {integrity: sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==} - engines: {node: '>=10.0.0'} - hasBin: true - dev: false + mime@2.6.0: {} - /mimic-fn@2.1.0: - resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} - engines: {node: '>=6'} + mime@3.0.0: {} - /min-indent@1.0.1: - resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==} - engines: {node: '>=4'} - dev: true + mimic-fn@2.1.0: {} - /minimatch@3.1.2: - resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + min-indent@1.0.1: {} + + minimatch@3.1.2: dependencies: brace-expansion: 1.1.11 - /minimatch@5.1.6: - resolution: {integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==} - engines: {node: '>=10'} + minimatch@5.1.6: dependencies: brace-expansion: 2.0.1 - dev: true - /minimatch@9.0.5: - resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} - engines: {node: '>=16 || 14 >=14.17'} + minimatch@9.0.5: dependencies: brace-expansion: 2.0.1 - /minimist-options@4.1.0: - resolution: {integrity: sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==} - engines: {node: '>= 6'} + minimist-options@4.1.0: dependencies: arrify: 1.0.1 is-plain-obj: 1.1.0 kind-of: 6.0.3 - dev: true - /minimist@1.2.7: - resolution: {integrity: sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g==} - dev: true + minimist@1.2.7: {} - /minimist@1.2.8: - resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} + minimist@1.2.8: {} - /minipass@3.3.6: - resolution: {integrity: sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==} - engines: {node: '>=8'} + minipass@3.3.6: dependencies: yallist: 4.0.0 - /minipass@5.0.0: - resolution: {integrity: sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==} - engines: {node: '>=8'} + minipass@5.0.0: {} - /minipass@7.0.4: - resolution: {integrity: sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==} - engines: {node: '>=16 || 14 >=14.17'} - dev: false + minipass@7.0.4: {} - /minipass@7.1.2: - resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} - engines: {node: '>=16 || 14 >=14.17'} + minipass@7.1.2: {} - /minizlib@2.1.2: - resolution: {integrity: sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==} - engines: {node: '>= 8'} + minizlib@2.1.2: dependencies: minipass: 3.3.6 yallist: 4.0.0 - /minizlib@3.0.1: - resolution: {integrity: sha512-umcy022ILvb5/3Djuu8LWeqUa8D68JaBzlttKeMWen48SjabqS3iY5w/vzeMzMUNhLDifyhbOwKDSznB1vvrwg==} - engines: {node: '>= 18'} + minizlib@3.0.1: dependencies: minipass: 7.1.2 rimraf: 5.0.10 - dev: true - /mkdirp@0.5.6: - resolution: {integrity: sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==} - hasBin: true + mkdirp@0.5.6: dependencies: minimist: 1.2.8 - dev: false - /mkdirp@1.0.4: - resolution: {integrity: sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==} - engines: {node: '>=10'} - hasBin: true + mkdirp@1.0.4: {} - /mkdirp@3.0.1: - resolution: {integrity: sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==} - engines: {node: '>=10'} - hasBin: true - dev: true + mkdirp@3.0.1: {} - /mnemonist@0.39.6: - resolution: {integrity: sha512-A/0v5Z59y63US00cRSLiloEIw3t5G+MiKz4BhX21FI+YBJXBOGW0ohFxTxO08dsOYlzxo87T7vGfZKYp2bcAWA==} + mnemonist@0.39.6: dependencies: obliterator: 2.0.4 - dev: false - /modify-values@1.0.1: - resolution: {integrity: sha512-xV2bxeN6F7oYjZWTe/YPAy6MN2M+sL4u/Rlm2AHCIVGfo2p1yGmBHQ6vHehl4bRTZBdHu3TSkWdYgkwpYzAGSw==} - engines: {node: '>=0.10.0'} - dev: true + modify-values@1.0.1: {} - /module@1.2.5: - resolution: {integrity: sha512-Y+j9HcHf8V6YtNBkLbPmREAUi5xGbAdb9ycXpo2roABDPrJEzd79kmoH5Ib9lpxcNVsHWa1LhRZJcflUq2+N3w==} - hasBin: true + module@1.2.5: dependencies: chalk: 1.1.3 concat-stream: 1.5.1 @@ -6360,239 +8933,136 @@ packages: yargs: 4.6.0 transitivePeerDependencies: - supports-color - dev: false - /ms@2.0.0: - resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==} + ms@2.0.0: {} - /ms@2.1.2: - resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} + ms@2.1.2: {} - /ms@2.1.3: - resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} - dev: false + ms@2.1.3: {} - /mute-stream@0.0.8: - resolution: {integrity: sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==} - dev: true + mute-stream@0.0.8: {} - /mute-stream@1.0.0: - resolution: {integrity: sha512-avsJQhyd+680gKXyG/sQc0nXaC6rBkPOfyHYcFb9+hdkqQkR9bdnkJ0AMZhke0oesPqIO+mFFJ+IdBc7mst4IA==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - dev: true + mute-stream@1.0.0: {} - /nanoid@3.3.7: - resolution: {integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==} - engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} - hasBin: true - dev: false + nanoid@3.3.7: {} - /natural-compare@1.4.0: - resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} + natural-compare@1.4.0: {} - /neo-async@2.6.2: - resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} - dev: true + neo-async@2.6.2: {} - /nestjs-cls@4.4.1(@nestjs/common@10.4.4)(@nestjs/core@10.4.4)(reflect-metadata@0.2.2)(rxjs@7.8.1): - resolution: {integrity: sha512-4yhldwm/cJ02lQ8ZAdM8KQ7gMfjAc1z3fo5QAQgXNyN4N6X5So9BCwv+BTLRugDCkELUo3qtzQHnKhGYL/ftPg==} - engines: {node: '>=16'} - peerDependencies: - '@nestjs/common': '> 7.0.0 < 11' - '@nestjs/core': '> 7.0.0 < 11' - reflect-metadata: '*' - rxjs: '>= 7' + nestjs-cls@4.4.1(@nestjs/common@10.4.4(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/core@10.4.4(@nestjs/common@10.4.4(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.2)(rxjs@7.8.1))(reflect-metadata@0.2.2)(rxjs@7.8.1))(reflect-metadata@0.2.2)(rxjs@7.8.1): dependencies: '@nestjs/common': 10.4.4(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.2)(rxjs@7.8.1) - '@nestjs/core': 10.4.4(@nestjs/common@10.4.4)(reflect-metadata@0.2.2)(rxjs@7.8.1) + '@nestjs/core': 10.4.4(@nestjs/common@10.4.4(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.2)(rxjs@7.8.1))(reflect-metadata@0.2.2)(rxjs@7.8.1) reflect-metadata: 0.2.2 rxjs: 7.8.1 - dev: false - /nestjs-oauth2@0.0.7(@nestjs/common@10.4.4)(rxjs@7.8.1): - resolution: {integrity: sha512-P4HfJziGsMl4+aTclr9vkqfbI84odja1kOjKZw095A+b4ksVczOC4J/AH4BydsIAPVsj/5RJj4aGFoWV90Bu1w==} - peerDependencies: - '@nestjs/common': ^9.0.0 - rxjs: ^7.x + nestjs-oauth2@0.0.7(@nestjs/common@10.4.4(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.2)(rxjs@7.8.1))(rxjs@7.8.1): dependencies: - '@golevelup/nestjs-modules': 0.6.1(@nestjs/common@10.4.4)(rxjs@7.8.1) + '@golevelup/nestjs-modules': 0.6.1(@nestjs/common@10.4.4(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.2)(rxjs@7.8.1))(rxjs@7.8.1) '@nestjs/common': 10.4.4(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.2)(rxjs@7.8.1) oauth: 0.10.0 rxjs: 7.8.1 - dev: false - /nestjs-pino@4.1.0(@nestjs/common@10.4.4)(pino-http@10.3.0): - resolution: {integrity: sha512-I6zcddauD2TNMRbsraEIxNUvHcz0El5QRUYH5eY1+pBzj7R17U+Yoyypoc+akVdSLWJ1r0kDYAZPy2mlhXv6vw==} - engines: {node: '>= 14'} - requiresBuild: true - peerDependencies: - '@nestjs/common': ^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 + nestjs-pino@4.1.0(@nestjs/common@10.4.4(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.2)(rxjs@7.8.1))(pino-http@10.3.0): dependencies: '@nestjs/common': 10.4.4(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.2)(rxjs@7.8.1) pino-http: 10.3.0 - dev: false - /nestjs-prisma@0.23.0(@nestjs/common@10.4.4)(@prisma/client@5.20.0)(prisma@5.20.0): - resolution: {integrity: sha512-0pIMDasayP+vMFSztcs85zu4WSPTKM85F8vIrqn7GsUBboEcKhI8eCeVghhNyKDGzEBaNAYNJlo2MAWdNuN7Tw==} - peerDependencies: - '@nestjs/common': ^7.0.0 || ^8.0.0 || ^9.0.0 || ^10.0.0 - '@prisma/client': ^2.0.0 || ^3.0.0 || ^4.0.0 || ^5.0.0 - prisma: ^2.0.0 || ^3.0.0 || ^4.0.0 || ^5.0.0 + nestjs-prisma@0.23.0(@nestjs/common@10.4.4(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.2)(rxjs@7.8.1))(@prisma/client@5.20.0(prisma@5.20.0))(chokidar@3.6.0)(prisma@5.20.0): dependencies: - '@angular-devkit/core': 13.3.11 - '@angular-devkit/schematics': 13.3.11 + '@angular-devkit/core': 13.3.11(chokidar@3.6.0) + '@angular-devkit/schematics': 13.3.11(chokidar@3.6.0) '@nestjs/common': 10.4.4(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.2.2)(rxjs@7.8.1) '@prisma/client': 5.20.0(prisma@5.20.0) - '@schematics/angular': 13.3.11 + '@schematics/angular': 13.3.11(chokidar@3.6.0) prisma: 5.20.0 transitivePeerDependencies: - chokidar - dev: false - /node-abort-controller@3.1.1: - resolution: {integrity: sha512-AGK2yQKIjRuqnc6VkX2Xj5d+QW8xZ87pa1UK6yA6ouUyuxfHuMP6umE5QK7UmTeOAymo+Zx1Fxiuw9rVx8taHQ==} - dev: true + node-abort-controller@3.1.1: {} - /node-addon-api@5.1.0: - resolution: {integrity: sha512-eh0GgfEkpnoWDq+VY8OyvYhFEzBk6jIYbRKdIlyTiAXIVJ8PyBaKb0rp7oDtoddbdoHWhq8wwr+XZ81F1rpNdA==} - dev: false + node-addon-api@5.1.0: {} - /node-emoji@1.11.0: - resolution: {integrity: sha512-wo2DpQkQp7Sjm2A0cq+sN7EHKO6Sl0ctXeBdFZrL9T9+UywORbufTcTZxom8YqpLQt/FqNMUkOpkZrJVYSKD3A==} + node-emoji@1.11.0: dependencies: lodash: 4.17.21 - dev: true - /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-fetch@2.7.0: dependencies: whatwg-url: 5.0.0 - /node-int64@0.4.0: - resolution: {integrity: sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==} + node-int64@0.4.0: {} - /node-releases@2.0.14: - resolution: {integrity: sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==} + node-releases@2.0.14: {} - /nopt@5.0.0: - resolution: {integrity: sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==} - engines: {node: '>=6'} - hasBin: true + nopt@5.0.0: dependencies: abbrev: 1.1.1 - dev: false - /normalize-package-data@2.5.0: - resolution: {integrity: sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==} + normalize-package-data@2.5.0: dependencies: hosted-git-info: 2.8.9 resolve: 1.22.8 semver: 5.7.2 validate-npm-package-license: 3.0.4 - /normalize-package-data@3.0.3: - resolution: {integrity: sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==} - engines: {node: '>=10'} + normalize-package-data@3.0.3: dependencies: hosted-git-info: 4.1.0 is-core-module: 2.13.1 semver: 7.6.3 validate-npm-package-license: 3.0.4 - dev: true - /normalize-path@2.1.1: - resolution: {integrity: sha512-3pKJwH184Xo/lnH6oyP1q2pMd7HcypqqmRs91/6/i2CGtWwIKGCkOOMTm/zXbgTEWHw1uNpNi/igc3ePOYHb6w==} - engines: {node: '>=0.10.0'} + normalize-path@2.1.1: dependencies: remove-trailing-separator: 1.1.0 - dev: false - /normalize-path@3.0.0: - resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} - engines: {node: '>=0.10.0'} + normalize-path@3.0.0: {} - /npm-run-path@4.0.1: - resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} - engines: {node: '>=8'} + npm-run-path@4.0.1: dependencies: path-key: 3.1.1 - /npmlog@5.0.1: - resolution: {integrity: sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==} + npmlog@5.0.1: dependencies: are-we-there-yet: 2.0.0 console-control-strings: 1.1.0 gauge: 3.0.2 set-blocking: 2.0.0 - dev: false - /number-is-nan@1.0.1: - resolution: {integrity: sha512-4jbtZXNAsfZbAHiiqjLPBiCl16dES1zI4Hpzzxw61Tk+loF+sBDBKx1ICKKKwIqQ7M0mFn1TmkN7euSncWgHiQ==} - engines: {node: '>=0.10.0'} - dev: false + number-is-nan@1.0.1: {} - /oauth@0.10.0: - resolution: {integrity: sha512-1orQ9MT1vHFGQxhuy7E/0gECD3fd2fCC+PIX+/jgmU/gI3EpRocXtmtvxCO5x3WZ443FLTLFWNDjl5MPJf9u+Q==} - dev: false + oauth@0.10.0: {} - /object-assign@4.1.0: - resolution: {integrity: sha512-Lbc7GfN7XFaK30bzUN3cDYLOkT0dH05S0ax1QikylHUD9+Z9PRF3G1iYwX3kcz+6AlzTFGkUgMxz6l3aUwbwTA==} - engines: {node: '>=0.10.0'} - dev: false + object-assign@4.1.0: {} - /object-assign@4.1.1: - resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} - engines: {node: '>=0.10.0'} - dev: false + object-assign@4.1.1: {} - /object-inspect@1.13.1: - resolution: {integrity: sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==} - dev: true + object-inspect@1.13.1: {} - /object.omit@2.0.1: - resolution: {integrity: sha512-UiAM5mhmIuKLsOvrL+B0U2d1hXHF3bFYWIuH1LMpuV2EJEHG1Ntz06PgLEHjm6VFd87NpH8rastvPoyv6UW2fA==} - engines: {node: '>=0.10.0'} + object.omit@2.0.1: dependencies: for-own: 0.1.5 is-extendable: 0.1.1 - dev: false - /obliterator@2.0.4: - resolution: {integrity: sha512-lgHwxlxV1qIg1Eap7LgIeoBWIMFibOjbrYPIPJZcI1mmGAI2m3lNYpK12Y+GBdPQ0U1hRwSord7GIaawz962qQ==} - dev: false + obliterator@2.0.4: {} - /on-exit-leak-free@2.1.2: - resolution: {integrity: sha512-0eJJY6hXLGf1udHwfNftBqH+g73EU4B504nZeKpz1sYRKafAghwxEJunB2O7rDZkL4PGfsMVnTXZ2EjibbqcsA==} - engines: {node: '>=14.0.0'} - dev: false + on-exit-leak-free@2.1.2: {} - /once@1.4.0: - resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + once@1.4.0: dependencies: wrappy: 1.0.2 - /onetime@5.1.2: - resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} - engines: {node: '>=6'} + onetime@5.1.2: dependencies: mimic-fn: 2.1.0 - /openapi-fuzzer-core@1.0.6: - resolution: {integrity: sha512-FJNJIfgUFuv4NmVGq9MYdoKra2GrkDy2uhIjE2YGlw30UA1glf4SXLMhI4UwdcJ8jisKdIxi7lXrfej8GvNW5w==} + openapi-fuzzer-core@1.0.6: dependencies: klona: 2.0.6 - dev: true - /optionator@0.9.3: - resolution: {integrity: sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==} - engines: {node: '>= 0.8.0'} + optionator@0.9.3: dependencies: '@aashutoshrathi/word-wrap': 1.2.6 deep-is: 0.1.4 @@ -6600,11 +9070,8 @@ packages: levn: 0.4.1 prelude-ls: 1.2.1 type-check: 0.4.0 - dev: true - /ora@5.4.1: - resolution: {integrity: sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==} - engines: {node: '>=10'} + ora@5.4.1: dependencies: bl: 4.1.0 chalk: 4.1.2 @@ -6616,109 +9083,64 @@ packages: strip-ansi: 6.0.1 wcwidth: 1.0.1 - /ordered-read-streams@0.3.0: - resolution: {integrity: sha512-xQvd8qvx9U1iYY9aVqPpoF5V9uaWJKV6ZGljkh/jkiNX0DiQsjbWvRumbh10QTMDE8DheaOEU8xi0szbrgjzcw==} + ordered-read-streams@0.3.0: dependencies: is-stream: 1.1.0 readable-stream: 2.3.8 - dev: false - /os-homedir@1.0.2: - resolution: {integrity: sha512-B5JU3cabzk8c67mRRd3ECmROafjYMXbuzlwtqdM8IbS8ktlTix8aFGb2bAGKrSRIlnfKwovGUUr72JUPyOb6kQ==} - engines: {node: '>=0.10.0'} - dev: false + os-homedir@1.0.2: {} - /os-locale@1.4.0: - resolution: {integrity: sha512-PRT7ZORmwu2MEFt4/fv3Q+mEfN4zetKxufQrkShY2oGvUms9r8otu5HfdyIFHkYXjO7laNsoVGmM2MANfuTA8g==} - engines: {node: '>=0.10.0'} + os-locale@1.4.0: dependencies: lcid: 1.0.0 - dev: false - /os-tmpdir@1.0.2: - resolution: {integrity: sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==} - engines: {node: '>=0.10.0'} - dev: true + os-tmpdir@1.0.2: {} - /p-limit@1.3.0: - resolution: {integrity: sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==} - engines: {node: '>=4'} + p-limit@1.3.0: dependencies: p-try: 1.0.0 - dev: true - /p-limit@2.3.0: - resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} - engines: {node: '>=6'} + p-limit@2.3.0: dependencies: p-try: 2.2.0 - /p-limit@3.1.0: - resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} - engines: {node: '>=10'} + p-limit@3.1.0: dependencies: yocto-queue: 0.1.0 - /p-limit@4.0.0: - resolution: {integrity: sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + p-limit@4.0.0: dependencies: yocto-queue: 1.0.0 - dev: true - /p-locate@2.0.0: - resolution: {integrity: sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg==} - engines: {node: '>=4'} + p-locate@2.0.0: dependencies: p-limit: 1.3.0 - dev: true - /p-locate@3.0.0: - resolution: {integrity: sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==} - engines: {node: '>=6'} + p-locate@3.0.0: dependencies: p-limit: 2.3.0 - dev: true - /p-locate@4.1.0: - resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} - engines: {node: '>=8'} + p-locate@4.1.0: dependencies: p-limit: 2.3.0 - /p-locate@5.0.0: - resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} - engines: {node: '>=10'} + p-locate@5.0.0: dependencies: p-limit: 3.1.0 - dev: true - /p-locate@6.0.0: - resolution: {integrity: sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + p-locate@6.0.0: dependencies: p-limit: 4.0.0 - dev: true - /p-try@1.0.0: - resolution: {integrity: sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww==} - engines: {node: '>=4'} - dev: true + p-try@1.0.0: {} - /p-try@2.2.0: - resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} - engines: {node: '>=6'} + p-try@2.2.0: {} - /package-json-from-dist@1.0.1: - resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==} + package-json-from-dist@1.0.1: {} - /pactum-matchers@1.1.7: - resolution: {integrity: sha512-RqwewcUje6vhcYQGbPfdSXkcp/Vtwn4WmmTWLSmqp0CGxBroCEqRg3JMIjkjQTZCd2VmG+tTcQw+n4P/iuqv3Q==} - dev: true + pactum-matchers@1.1.7: {} - /pactum@3.7.1(debug@2.6.9): - resolution: {integrity: sha512-r+R1dMy2MfRCQpAHohMyICusiMz14t0E+bhnLDScl2x4lXJKQAvQUGV/WWKUUxN2DS0Jdm0PUj6KjblfcSk1GA==} - engines: {node: '>=10'} + pactum@3.7.1(debug@2.6.9): dependencies: '@exodus/schemasafe': 1.3.0 deep-override: 1.0.2 @@ -6733,239 +9155,144 @@ packages: polka: 0.5.2 transitivePeerDependencies: - debug - dev: true - /parent-module@1.0.1: - resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} - engines: {node: '>=6'} + parent-module@1.0.1: dependencies: callsites: 3.1.0 - dev: true - /parse-glob@3.0.4: - resolution: {integrity: sha512-FC5TeK0AwXzq3tUBFtH74naWkPQCEWs4K+xMxWZBlKDWu0bVHXGZa+KKqxKidd7xwhdZ19ZNuF2uO1M/r196HA==} - engines: {node: '>=0.10.0'} + parse-glob@3.0.4: dependencies: glob-base: 0.3.0 is-dotfile: 1.0.3 is-extglob: 1.0.0 is-glob: 2.0.1 - dev: false - /parse-graphql@1.0.0: - resolution: {integrity: sha512-NjvQHHaiPCxPZrhm/kKnorxOv7r/eA+tE0VW5E8iJMH9wTqFA1V0YK/7nbpxVu3JdXUxyWTKMez9lsHUtAwa0w==} - dev: true + parse-graphql@1.0.0: {} - /parse-json@2.2.0: - resolution: {integrity: sha512-QR/GGaKCkhwk1ePQNYDRKYZ3mwU9ypsKhB0XyFnLQdomyEqk3e8wpW3V5Jp88zbxK4n5ST1nqo+g9juTpownhQ==} - engines: {node: '>=0.10.0'} + parse-json@2.2.0: dependencies: error-ex: 1.3.2 - dev: false - /parse-json@4.0.0: - resolution: {integrity: sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==} - engines: {node: '>=4'} + parse-json@4.0.0: dependencies: error-ex: 1.3.2 json-parse-better-errors: 1.0.2 - dev: true - /parse-json@5.2.0: - resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} - engines: {node: '>=8'} + parse-json@5.2.0: dependencies: '@babel/code-frame': 7.23.5 error-ex: 1.3.2 json-parse-even-better-errors: 2.3.1 lines-and-columns: 1.2.4 - /parse-passwd@1.0.0: - resolution: {integrity: sha512-1Y1A//QUXEZK7YKz+rD9WydcE1+EuPr6ZBgKecAB8tmoW6UFv0NREVJe1p+jRxtThkcbbKkfwIbWJe/IeE6m2Q==} - engines: {node: '>=0.10.0'} - dev: true + parse-passwd@1.0.0: {} - /passport-jwt@4.0.1: - resolution: {integrity: sha512-UCKMDYhNuGOBE9/9Ycuoyh7vP6jpeTp/+sfMJl7nLff/t6dps+iaeE0hhNkKN8/HZHcJ7lCdOyDxHdDoxoSvdQ==} + passport-jwt@4.0.1: dependencies: jsonwebtoken: 9.0.2 passport-strategy: 1.0.0 - dev: false - /passport-local@1.0.0: - resolution: {integrity: sha512-9wCE6qKznvf9mQYYbgJ3sVOHmCWoUNMVFoZzNoznmISbhnNNPhN9xfY3sLmScHMetEJeoY7CXwfhCe7argfQow==} - engines: {node: '>= 0.4.0'} + passport-local@1.0.0: dependencies: passport-strategy: 1.0.0 - dev: false - /passport-strategy@1.0.0: - resolution: {integrity: sha512-CB97UUvDKJde2V0KDWWB3lyf6PC3FaZP7YxZ2G8OAtn9p4HI9j9JLP9qjOGZFvyl8uwNT8qM+hGnz/n16NI7oA==} - engines: {node: '>= 0.4.0'} - dev: false + passport-strategy@1.0.0: {} - /passport@0.7.0: - resolution: {integrity: sha512-cPLl+qZpSc+ireUvt+IzqbED1cHHkDoVYMo30jbJIdOOjQ1MQYZBPiNvmi8UM6lJuOpTPXJGZQk0DtC4y61MYQ==} - engines: {node: '>= 0.4.0'} + passport@0.7.0: dependencies: passport-strategy: 1.0.0 pause: 0.0.1 utils-merge: 1.0.1 - dev: false - /path-dirname@1.0.2: - resolution: {integrity: sha512-ALzNPpyNq9AqXMBjeymIjFDAkAFH06mHJH/cSBHAgU0s4vfpBn6b2nf8tiRLvagKD8RbTpq2FKTBg7cl9l3c7Q==} - dev: false + path-dirname@1.0.2: {} - /path-exists@2.1.0: - resolution: {integrity: sha512-yTltuKuhtNeFJKa1PiRzfLAU5182q1y4Eb4XCJ3PBqyzEDkAZRzBrKKBct682ls9reBVHf9udYLN5Nd+K1B9BQ==} - engines: {node: '>=0.10.0'} + path-exists@2.1.0: dependencies: pinkie-promise: 2.0.1 - dev: false - /path-exists@3.0.0: - resolution: {integrity: sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==} - engines: {node: '>=4'} - dev: true + path-exists@3.0.0: {} - /path-exists@4.0.0: - resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} - engines: {node: '>=8'} + path-exists@4.0.0: {} - /path-exists@5.0.0: - resolution: {integrity: sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - dev: true + path-exists@5.0.0: {} - /path-is-absolute@1.0.1: - resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} - engines: {node: '>=0.10.0'} + path-is-absolute@1.0.1: {} - /path-key@3.1.1: - resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} - engines: {node: '>=8'} + path-key@3.1.1: {} - /path-parse@1.0.7: - resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + path-parse@1.0.7: {} - /path-scurry@1.11.1: - resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==} - engines: {node: '>=16 || 14 >=14.18'} + path-scurry@1.11.1: dependencies: lru-cache: 10.2.0 minipass: 7.1.2 - /path-to-regexp@3.2.0: - resolution: {integrity: sha512-jczvQbCUS7XmS7o+y1aEO9OBVFeZBQ1MDSEqmO7xSoPgOPoowY/SxLpZ6Vh97/8qHZOteiCKb7gkG9gA2ZUxJA==} - dev: false + path-to-regexp@3.2.0: {} - /path-to-regexp@3.3.0: - resolution: {integrity: sha512-qyCH421YQPS2WFDxDjftfc1ZR5WKQzVzqsp4n9M2kQhVOo/ByahFoUNJfl58kOcEGfQ//7weFTDhm+ss8Ecxgw==} + path-to-regexp@3.3.0: {} - /path-to-regexp@6.3.0: - resolution: {integrity: sha512-Yhpw4T9C6hPpgPeA28us07OJeqZ5EzQTkbfwuhsUg0c237RomFoETJgmp2sa3F/41gfLE6G5cqcYwznmeEeOlQ==} + path-to-regexp@6.3.0: {} - /path-type@1.1.0: - resolution: {integrity: sha512-S4eENJz1pkiQn9Znv33Q+deTOKmbl+jj1Fl+qiP/vYezj+S8x+J3Uo0ISrx/QoEvIlOaDWJhPaRd1flJ9HXZqg==} - engines: {node: '>=0.10.0'} + path-type@1.1.0: dependencies: graceful-fs: 4.2.11 pify: 2.3.0 pinkie-promise: 2.0.1 - dev: false - /path-type@3.0.0: - resolution: {integrity: sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==} - engines: {node: '>=4'} + path-type@3.0.0: dependencies: pify: 3.0.0 - dev: true - /path-type@4.0.0: - resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} - engines: {node: '>=8'} - dev: true + path-type@4.0.0: {} - /pause@0.0.1: - resolution: {integrity: sha512-KG8UEiEVkR3wGEb4m5yZkVCzigAD+cVEJck2CzYZO37ZGJfctvVptVO192MwrtPhzONn6go8ylnOdMhKqi4nfg==} - dev: false + pause@0.0.1: {} - /peek-stream@1.1.3: - resolution: {integrity: sha512-FhJ+YbOSBb9/rIl2ZeE/QHEsWn7PqNYt8ARAY3kIgNGOk13g9FGyIY6JIl/xB/3TFRVoTv5as0l11weORrTekA==} + peek-stream@1.1.3: dependencies: buffer-from: 1.1.2 duplexify: 3.7.1 through2: 2.0.5 - dev: false - /phin@3.7.1(debug@2.6.9): - resolution: {integrity: sha512-GEazpTWwTZaEQ9RhL7Nyz0WwqilbqgLahDM3D0hxWwmVDI52nXEybHqiN6/elwpkJBhcuj+WbBu+QfT0uhPGfQ==} - engines: {node: '>= 8'} + phin@3.7.1(debug@2.6.9): dependencies: centra: 2.7.0(debug@2.6.9) transitivePeerDependencies: - debug - /picocolors@1.0.0: - resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} + picocolors@1.0.0: {} - /picomatch@2.3.1: - resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} - engines: {node: '>=8.6'} + picomatch@2.3.1: {} - /picomatch@4.0.1: - resolution: {integrity: sha512-xUXwsxNjwTQ8K3GnT4pCJm+xq3RUPQbmkYJTP5aFIfNIvbcc/4MUxgBaaRSZJ6yGJZiGSyYlM6MzwTsRk8SYCg==} - engines: {node: '>=12'} - dev: true + picomatch@4.0.1: {} - /pify@2.3.0: - resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==} - engines: {node: '>=0.10.0'} + pify@2.3.0: {} - /pify@3.0.0: - resolution: {integrity: sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==} - engines: {node: '>=4'} - dev: true + pify@3.0.0: {} - /pinkie-promise@2.0.1: - resolution: {integrity: sha512-0Gni6D4UcLTbv9c57DfxDGdr41XfgUjqWZu492f0cIGr16zDU06BWP/RAEvOuo7CQ0CNjHaLlM59YJJFm3NWlw==} - engines: {node: '>=0.10.0'} + pinkie-promise@2.0.1: dependencies: pinkie: 2.0.4 - dev: false - /pinkie@2.0.4: - resolution: {integrity: sha512-MnUuEycAemtSaeFSjXKW/aroV7akBbY+Sv+RkyqFjgAe73F+MR0TBWKBRDkmfWq/HiFmdavfZ1G7h4SPZXaCSg==} - engines: {node: '>=0.10.0'} - dev: false + pinkie@2.0.4: {} - /pino-abstract-transport@1.1.0: - resolution: {integrity: sha512-lsleG3/2a/JIWUtf9Q5gUNErBqwIu1tUKTT3dUzaf5DySw9ra1wcqKjJjLX1VTY64Wk1eEOYsVGSaGfCK85ekA==} + pino-abstract-transport@1.1.0: dependencies: readable-stream: 4.5.2 split2: 4.2.0 - dev: false - /pino-abstract-transport@1.2.0: - resolution: {integrity: sha512-Guhh8EZfPCfH+PMXAb6rKOjGQEoy0xlAIn+irODG5kgfYV+BQ0rGYYWTIel3P5mmyXqkYkPmdIkywsn6QKUR1Q==} + pino-abstract-transport@1.2.0: dependencies: readable-stream: 4.5.2 split2: 4.2.0 - dev: false - /pino-http@10.3.0: - resolution: {integrity: sha512-kaHQqt1i5S9LXWmyuw6aPPqYW/TjoDPizPs4PnDW4hSpajz2Uo/oisNliLf7We1xzpiLacdntmw8yaZiEkppQQ==} + pino-http@10.3.0: dependencies: get-caller-file: 2.0.5 pino: 9.4.0 pino-std-serializers: 7.0.0 process-warning: 4.0.0 - dev: false - /pino-pretty@11.2.2: - resolution: {integrity: sha512-2FnyGir8nAJAqD3srROdrF1J5BIcMT4nwj7hHSc60El6Uxlym00UbCCd8pYIterstVBFlMyF1yFV8XdGIPbj4A==} - hasBin: true + pino-pretty@11.2.2: dependencies: colorette: 2.0.20 dateformat: 4.6.3 @@ -6981,19 +9308,12 @@ packages: secure-json-parse: 2.7.0 sonic-boom: 4.1.0 strip-json-comments: 3.1.1 - dev: false - /pino-std-serializers@6.2.2: - resolution: {integrity: sha512-cHjPPsE+vhj/tnhCy/wiMh3M3z3h/j15zHQX+S9GkTBgqJuTuJzYJ4gUyACLhDaJ7kk9ba9iRDmbH2tJU03OiA==} - dev: false + pino-std-serializers@6.2.2: {} - /pino-std-serializers@7.0.0: - resolution: {integrity: sha512-e906FRY0+tV27iq4juKzSYPbUj2do2X2JX4EzSca1631EB2QJQUqGbDuERal7LCtOpxl6x3+nvo9NPZcmjkiFA==} - dev: false + pino-std-serializers@7.0.0: {} - /pino@8.18.0: - resolution: {integrity: sha512-Mz/gKiRyuXu4HnpHgi1YWdHQCoWMufapzooisvFn78zl4dZciAxS+YeRkUxXl1ee/SzU80YCz1zpECCh4oC6Aw==} - hasBin: true + pino@8.18.0: dependencies: atomic-sleep: 1.0.0 fast-redact: 3.3.0 @@ -7006,11 +9326,8 @@ packages: safe-stable-stringify: 2.4.3 sonic-boom: 3.8.0 thread-stream: 2.4.1 - dev: false - /pino@9.4.0: - resolution: {integrity: sha512-nbkQb5+9YPhQRz/BeQmrWpEknAaqjpAqRK8NwJpmrX/JHu7JuZC5G1CeAwJDJfGes4h+YihC6in3Q2nGb+Y09w==} - hasBin: true + pino@9.4.0: dependencies: atomic-sleep: 1.0.0 fast-redact: 3.3.0 @@ -7023,284 +9340,170 @@ packages: safe-stable-stringify: 2.4.3 sonic-boom: 4.1.0 thread-stream: 3.1.0 - dev: false - /pirates@4.0.6: - resolution: {integrity: sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==} - engines: {node: '>= 6'} + pirates@4.0.6: {} - /pkg-conf@1.1.3: - resolution: {integrity: sha512-9hHgE5+Xai/ChrnahNP8Ke0VNF/s41IZIB/d24eMHEaRamdPg+wwlRm2lTb5wMvE8eTIKrYZsrxfuOwt3dpsIQ==} - engines: {node: '>=0.10.0'} + pkg-conf@1.1.3: dependencies: find-up: 1.1.2 load-json-file: 1.1.0 object-assign: 4.1.1 symbol: 0.2.3 - dev: false - /pkg-dir@4.2.0: - resolution: {integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==} - engines: {node: '>=8'} + pkg-dir@4.2.0: dependencies: find-up: 4.1.0 - /pluralize-esm@9.0.5: - resolution: {integrity: sha512-Kb2dcpMsIutFw2hYrN0EhsAXOUJTd6FVMIxvNAkZCMQLVt9NGZqQczvGpYDxNWCZeCWLHUPxQIBudWzt1h7VVA==} - engines: {node: '>=14.0.0'} - dev: true + pluralize-esm@9.0.5: {} - /pluralize@8.0.0: - resolution: {integrity: sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==} - engines: {node: '>=4'} - dev: true + pluralize@8.0.0: {} - /polka@0.5.2: - resolution: {integrity: sha512-FVg3vDmCqP80tOrs+OeNlgXYmFppTXdjD5E7I4ET1NjvtNmQrb1/mJibybKkb/d4NA7YWAr1ojxuhpL3FHqdlw==} + polka@0.5.2: dependencies: '@polka/url': 0.5.0 trouter: 2.0.1 - dev: true - /prelude-ls@1.2.1: - resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} - engines: {node: '>= 0.8.0'} - dev: true + prelude-ls@1.2.1: {} - /preserve@0.2.0: - resolution: {integrity: sha512-s/46sYeylUfHNjI+sA/78FAHlmIuKqI9wNnzEOGehAlUUYeObv5C2mOinXBjyUyWmJ2SfcS2/ydApH4hTF4WXQ==} - engines: {node: '>=0.10.0'} - dev: false + preserve@0.2.0: {} - /prettier-linter-helpers@1.0.0: - resolution: {integrity: sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==} - engines: {node: '>=6.0.0'} + prettier-linter-helpers@1.0.0: dependencies: fast-diff: 1.3.0 - dev: true - /prettier@2.8.8: - resolution: {integrity: sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==} - engines: {node: '>=10.13.0'} - hasBin: true - dev: true + prettier@2.8.8: {} - /prettier@3.3.3: - resolution: {integrity: sha512-i2tDNA0O5IrMO757lfrdQZCc2jPNDVntV0m/+4whiDfWaTKfMNgR7Qz0NAeGz/nRqF4m5/6CLzbP4/liHt12Ew==} - engines: {node: '>=14'} - hasBin: true - dev: true + prettier@3.3.3: {} - /pretty-format@29.7.0: - resolution: {integrity: sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + pretty-format@29.7.0: dependencies: '@jest/schemas': 29.6.3 ansi-styles: 5.2.0 react-is: 18.2.0 - /prisma-nested-middleware@4.0.0(@prisma/client@5.20.0): - resolution: {integrity: sha512-WSx0nl7KNXEzGaNC87fuDBOdAjj3V6um/JoQUo24PaMzMy8tvOYfb2Mw25OZhnrMXNTBhqgk4rJTUW3CVcDsHQ==} - peerDependencies: - '@prisma/client': '*' + prisma-nested-middleware@4.0.0(@prisma/client@5.20.0(prisma@5.20.0)): dependencies: '@open-draft/deferred-promise': 2.2.0 '@prisma/client': 5.20.0(prisma@5.20.0) lodash: 4.17.21 - dev: false - /prisma-soft-delete-middleware@1.3.1(@prisma/client@5.20.0): - resolution: {integrity: sha512-oQ2Ba8wb23ho6PqMXkOSTQTXNKouLmZuILYDHrnKk1Ui3cGIXuj9zNWyJkoaTcWHznsiAaoP1Oy8ytDhwQNQqA==} - peerDependencies: - '@prisma/client': '*' + prisma-soft-delete-middleware@1.3.1(@prisma/client@5.20.0(prisma@5.20.0)): dependencies: '@prisma/client': 5.20.0(prisma@5.20.0) - prisma-nested-middleware: 4.0.0(@prisma/client@5.20.0) - dev: false + prisma-nested-middleware: 4.0.0(@prisma/client@5.20.0(prisma@5.20.0)) - /prisma@5.20.0: - resolution: {integrity: sha512-6obb3ucKgAnsGS9x9gLOe8qa51XxvJ3vLQtmyf52CTey1Qcez3A6W6ROH5HIz5Q5bW+0VpmZb8WBohieMFGpig==} - engines: {node: '>=16.13'} - hasBin: true - requiresBuild: true + prisma@5.20.0: dependencies: '@prisma/engines': 5.20.0 optionalDependencies: fsevents: 2.3.3 - /process-nextick-args@1.0.7: - resolution: {integrity: sha512-yN0WQmuCX63LP/TMvAg31nvT6m4vDqJEiiv2CAZqWOGNWutc9DfDk1NPYYmKUFmaVM2UwDowH4u5AHWYP/jxKw==} - dev: false + process-nextick-args@1.0.7: {} - /process-nextick-args@2.0.1: - resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} + process-nextick-args@2.0.1: {} - /process-warning@3.0.0: - resolution: {integrity: sha512-mqn0kFRl0EoqhnL0GQ0veqFHyIN1yig9RHh/InzORTUiZHFRAur+aMtRkELNwGs9aNwKS6tg/An4NYBPGwvtzQ==} - dev: false + process-warning@3.0.0: {} - /process-warning@4.0.0: - resolution: {integrity: sha512-/MyYDxttz7DfGMMHiysAsFE4qF+pQYAA8ziO/3NcRVrQ5fSk+Mns4QZA/oRPFzvcqNoVJXQNWNAsdwBXLUkQKw==} - dev: false + process-warning@4.0.0: {} - /process@0.11.10: - resolution: {integrity: sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==} - engines: {node: '>= 0.6.0'} - dev: false + process@0.11.10: {} - /promise-coalesce@1.1.2: - resolution: {integrity: sha512-zLaJ9b8hnC564fnJH6NFSOGZYYdzrAJn2JUUIwzoQb32fG2QAakpDNM+CZo1km6keXkRXRM+hml1BFAPVnPkxg==} - engines: {node: '>=16'} - dev: false + promise-coalesce@1.1.2: {} - /prompts@2.4.2: - resolution: {integrity: sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==} - engines: {node: '>= 6'} + prompts@2.4.2: dependencies: kleur: 3.0.3 sisteransi: 1.0.5 - /proxy-addr@2.0.7: - resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==} - engines: {node: '>= 0.10'} + proxy-addr@2.0.7: dependencies: forwarded: 0.2.0 ipaddr.js: 1.9.1 - dev: false - /proxy-from-env@1.1.0: - resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} - dev: false + proxy-from-env@1.1.0: {} - /pump@3.0.0: - resolution: {integrity: sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==} + pump@3.0.0: dependencies: end-of-stream: 1.4.4 once: 1.4.0 - dev: false - /pumpify@2.0.1: - resolution: {integrity: sha512-m7KOje7jZxrmutanlkS1daj1dS6z6BgslzOXmcSEpIlCxM3VJH7lG5QLeck/6hgF6F4crFf01UtQmNsJfweTAw==} + pumpify@2.0.1: dependencies: duplexify: 4.1.2 inherits: 2.0.4 pump: 3.0.0 - dev: false - /punycode@2.3.1: - resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} - engines: {node: '>=6'} + punycode@2.3.1: {} - /pure-rand@6.0.4: - resolution: {integrity: sha512-LA0Y9kxMYv47GIPJy6MI84fqTd2HmYZI83W/kM/SkKfDlajnZYfmXFTxkbY+xSBPkLJxltMa9hIkmdc29eguMA==} + pure-rand@6.0.4: {} - /q@1.5.1: - resolution: {integrity: sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==} - engines: {node: '>=0.6.0', teleport: '>=0.2.0'} - dev: true + q@1.5.1: {} - /qs@6.11.2: - resolution: {integrity: sha512-tDNIz22aBzCDxLtVH++VnTfzxlfeK5CbqohpSqpJgj1Wg/cQbStNAz3NuqCs5vV+pjBsK4x4pN9HlVh7rcYRiA==} - engines: {node: '>=0.6'} + qs@6.11.2: dependencies: side-channel: 1.0.5 - dev: true - /queue-microtask@1.2.3: - resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} - dev: true + queue-microtask@1.2.3: {} - /quick-format-unescaped@4.0.4: - resolution: {integrity: sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg==} - dev: false + quick-format-unescaped@4.0.4: {} - /quick-lru@4.0.1: - resolution: {integrity: sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==} - engines: {node: '>=8'} - dev: true + quick-lru@4.0.1: {} - /randomatic@3.1.1: - resolution: {integrity: sha512-TuDE5KxZ0J461RVjrJZCJc+J+zCkTb1MbH9AQUq68sMhOMcy9jLcb3BrZKgp9q9Ncltdg4QVqWrH02W2EFFVYw==} - engines: {node: '>= 0.10.0'} + randomatic@3.1.1: dependencies: is-number: 4.0.0 kind-of: 6.0.3 math-random: 1.0.4 - dev: false - /randombytes@2.1.0: - resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} + randombytes@2.1.0: dependencies: safe-buffer: 5.2.1 - dev: true - /react-is@18.2.0: - resolution: {integrity: sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==} + react-is@18.2.0: {} - /read-pkg-up@1.0.1: - resolution: {integrity: sha512-WD9MTlNtI55IwYUS27iHh9tK3YoIVhxis8yKhLpTqWtml739uXc9NWTpxoHkfZf3+DkCCsXox94/VWZniuZm6A==} - engines: {node: '>=0.10.0'} + read-pkg-up@1.0.1: dependencies: find-up: 1.1.2 read-pkg: 1.1.0 - dev: false - /read-pkg-up@3.0.0: - resolution: {integrity: sha512-YFzFrVvpC6frF1sz8psoHDBGF7fLPc+llq/8NB43oagqWkx8ar5zYtsTORtOjw9W2RHLpWP+zTWwBvf1bCmcSw==} - engines: {node: '>=4'} + read-pkg-up@3.0.0: dependencies: find-up: 2.1.0 read-pkg: 3.0.0 - dev: true - /read-pkg-up@7.0.1: - resolution: {integrity: sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==} - engines: {node: '>=8'} + read-pkg-up@7.0.1: dependencies: find-up: 4.1.0 read-pkg: 5.2.0 type-fest: 0.8.1 - dev: true - /read-pkg@1.1.0: - resolution: {integrity: sha512-7BGwRHqt4s/uVbuyoeejRn4YmFnYZiFl4AuaeXHlgZf3sONF0SOGlxs2Pw8g6hCKupo08RafIO5YXFNOKTfwsQ==} - engines: {node: '>=0.10.0'} + read-pkg@1.1.0: dependencies: load-json-file: 1.1.0 normalize-package-data: 2.5.0 path-type: 1.1.0 - dev: false - /read-pkg@3.0.0: - resolution: {integrity: sha512-BLq/cCO9two+lBgiTYNqD6GdtK8s4NpaWrl6/rCO9w0TUS8oJl7cmToOZfRYllKTISY6nt1U7jQ53brmKqY6BA==} - engines: {node: '>=4'} + read-pkg@3.0.0: dependencies: load-json-file: 4.0.0 normalize-package-data: 2.5.0 path-type: 3.0.0 - dev: true - /read-pkg@5.2.0: - resolution: {integrity: sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==} - engines: {node: '>=8'} + read-pkg@5.2.0: dependencies: '@types/normalize-package-data': 2.4.4 normalize-package-data: 2.5.0 parse-json: 5.2.0 type-fest: 0.6.0 - dev: true - /readable-stream@1.0.34: - resolution: {integrity: sha512-ok1qVCJuRkNmvebYikljxJA/UEsKwLl2nI1OmaqAu4/UE+h0wKCHok4XkL/gvi39OacXvw59RJUOFUkDib2rHg==} + readable-stream@1.0.34: dependencies: core-util-is: 1.0.3 inherits: 2.0.4 isarray: 0.0.1 string_decoder: 0.10.31 - dev: false - /readable-stream@2.0.6: - resolution: {integrity: sha512-TXcFfb63BQe1+ySzsHZI/5v1aJPCShfqvWJ64ayNImXMsN1Cd0YGk/wm8KB7/OeessgPc9QvS9Zou8QTkFzsLw==} + readable-stream@2.0.6: dependencies: core-util-is: 1.0.3 inherits: 2.0.4 @@ -7308,10 +9511,8 @@ packages: process-nextick-args: 1.0.7 string_decoder: 0.10.31 util-deprecate: 1.0.2 - dev: false - /readable-stream@2.3.8: - resolution: {integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==} + readable-stream@2.3.8: dependencies: core-util-is: 1.0.3 inherits: 2.0.4 @@ -7321,257 +9522,148 @@ packages: string_decoder: 1.1.1 util-deprecate: 1.0.2 - /readable-stream@3.6.2: - resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} - engines: {node: '>= 6'} + readable-stream@3.6.2: dependencies: inherits: 2.0.4 string_decoder: 1.3.0 util-deprecate: 1.0.2 - /readable-stream@4.5.2: - resolution: {integrity: sha512-yjavECdqeZ3GLXNgRXgeQEdz9fvDDkNKyHnbHRFtOr7/LcfgBcmct7t/ET+HaCTqfh06OzoAxrkN/IfjJBVe+g==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + readable-stream@4.5.2: dependencies: abort-controller: 3.0.0 buffer: 6.0.3 events: 3.3.0 process: 0.11.10 string_decoder: 1.3.0 - dev: false - /readdirp@3.6.0: - resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} - engines: {node: '>=8.10.0'} + readdirp@3.6.0: dependencies: picomatch: 2.3.1 - dev: true - /real-require@0.2.0: - resolution: {integrity: sha512-57frrGM/OCTLqLOAh0mhVA9VBMHd+9U7Zb2THMGdBUoZVOtGbJzjxsYGDJ3A9AYYCP4hn6y1TVbaOfzWtm5GFg==} - engines: {node: '>= 12.13.0'} - dev: false + real-require@0.2.0: {} - /redent@3.0.0: - resolution: {integrity: sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==} - engines: {node: '>=8'} + redent@3.0.0: dependencies: indent-string: 4.0.0 strip-indent: 3.0.0 - dev: true - /reflect-metadata@0.2.2: - resolution: {integrity: sha512-urBwgfrvVP/eAyXx4hluJivBKzuEbSQs9rKWCrCkbSxNv8mxPcUZKeuoF3Uy4mJl3Lwprp6yy5/39VWigZ4K6Q==} + reflect-metadata@0.2.2: {} - /regex-cache@0.4.4: - resolution: {integrity: sha512-nVIZwtCjkC9YgvWkpM55B5rBhBYRZhAaJbgcFYXXsHnbZ9UZI9nnVWYZpBlCqv9ho2eZryPnWrZGsOdPwVWXWQ==} - engines: {node: '>=0.10.0'} + regex-cache@0.4.4: dependencies: is-equal-shallow: 0.1.3 - dev: false - /remove-trailing-separator@1.1.0: - resolution: {integrity: sha512-/hS+Y0u3aOfIETiaiirUFwDBDzmXPvO+jAfKTitUngIPzdKc6Z0LoFjM/CK5PL4C+eKwHohlHAb6H0VFfmmUsw==} - dev: false + remove-trailing-separator@1.1.0: {} - /repeat-element@1.1.4: - resolution: {integrity: sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ==} - engines: {node: '>=0.10.0'} - dev: false + repeat-element@1.1.4: {} - /repeat-string@1.6.1: - resolution: {integrity: sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==} - engines: {node: '>=0.10'} + repeat-string@1.6.1: {} - /replace-ext@0.0.1: - resolution: {integrity: sha512-AFBWBy9EVRTa/LhEcG8QDP3FvpwZqmvN2QFDuJswFeaVhWnZMp8q3E6Zd90SR04PlIwfGdyVjNyLPyen/ek5CQ==} - engines: {node: '>= 0.4'} - dev: false + replace-ext@0.0.1: {} - /require-directory@2.1.1: - resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} - engines: {node: '>=0.10.0'} + require-directory@2.1.1: {} - /require-from-string@2.0.2: - resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} - engines: {node: '>=0.10.0'} + require-from-string@2.0.2: {} - /require-main-filename@1.0.1: - resolution: {integrity: sha512-IqSUtOVP4ksd1C/ej5zeEh/BIP2ajqpn8c5x+q99gvcIG/Qf0cud5raVnE/Dwd0ua9TXYDoDc0RE5hBSdz22Ug==} - dev: false + require-main-filename@1.0.1: {} - /resolve-cwd@3.0.0: - resolution: {integrity: sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==} - engines: {node: '>=8'} + resolve-cwd@3.0.0: dependencies: resolve-from: 5.0.0 - /resolve-dir@1.0.1: - resolution: {integrity: sha512-R7uiTjECzvOsWSfdM0QKFNBVFcK27aHOUwdvK53BcW8zqnGdYp0Fbj82cy54+2A4P2tFM22J5kRfe1R+lM/1yg==} - engines: {node: '>=0.10.0'} + resolve-dir@1.0.1: dependencies: expand-tilde: 2.0.2 global-modules: 1.0.0 - dev: true - /resolve-from@4.0.0: - resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} - engines: {node: '>=4'} - dev: true + resolve-from@4.0.0: {} - /resolve-from@5.0.0: - resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} - engines: {node: '>=8'} + resolve-from@5.0.0: {} - /resolve-url@0.2.1: - resolution: {integrity: sha512-ZuF55hVUQaaczgOIwqWzkEcEidmlD/xl44x1UZnhOXcYuFN2S6+rcxpG+C1N3So0wvNI3DmJICUFfu2SxhBmvg==} - deprecated: https://github.com/lydell/resolve-url#deprecated - dev: false + resolve-url@0.2.1: {} - /resolve.exports@2.0.2: - resolution: {integrity: sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg==} - engines: {node: '>=10'} + resolve.exports@2.0.2: {} - /resolve@1.22.8: - resolution: {integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==} - hasBin: true + resolve@1.22.8: dependencies: is-core-module: 2.13.1 path-parse: 1.0.7 supports-preserve-symlinks-flag: 1.0.0 - /restore-cursor@3.1.0: - resolution: {integrity: sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==} - engines: {node: '>=8'} + restore-cursor@3.1.0: dependencies: onetime: 5.1.2 signal-exit: 3.0.7 - /ret@0.4.3: - resolution: {integrity: sha512-0f4Memo5QP7WQyUEAYUO3esD/XjOc3Zjjg5CPsAq1p8sIu0XPeMbHJemKA0BO7tV0X7+A0FoEpbmHXWxPyD3wQ==} - engines: {node: '>=10'} + ret@0.4.3: {} - /reusify@1.0.4: - resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} - engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + reusify@1.0.4: {} - /rfdc@1.3.1: - resolution: {integrity: sha512-r5a3l5HzYlIC68TpmYKlxWjmOP6wiPJ1vWv2HeLhNsRZMrCkxeqxiHlQ21oXmQ4F3SiryXBHhAD7JZqvOJjFmg==} - dev: false + rfdc@1.3.1: {} - /rimraf@3.0.2: - resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} - deprecated: Rimraf versions prior to v4 are no longer supported - hasBin: true + rimraf@3.0.2: dependencies: glob: 7.2.3 - dev: false - /rimraf@5.0.10: - resolution: {integrity: sha512-l0OE8wL34P4nJH/H2ffoaniAokM2qSmrtXHmlpvYr5AVVX8msAyW0l8NVJFDxlSK4u3Uh/f41cQheDVdnYijwQ==} - hasBin: true + rimraf@5.0.10: dependencies: glob: 10.4.5 - dev: true - /run-async@2.4.1: - resolution: {integrity: sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==} - engines: {node: '>=0.12.0'} - dev: true + run-async@2.4.1: {} - /run-async@3.0.0: - resolution: {integrity: sha512-540WwVDOMxA6dN6We19EcT9sc3hkXPw5mzRNGM3FkdN/vtE9NFvj5lFAPNwUDmJjXidm3v7TC1cTE7t17Ulm1Q==} - engines: {node: '>=0.12.0'} - dev: true + run-async@3.0.0: {} - /run-parallel@1.2.0: - resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + run-parallel@1.2.0: dependencies: queue-microtask: 1.2.3 - dev: true - /rxjs@6.6.7: - resolution: {integrity: sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==} - engines: {npm: '>=2.0.0'} + rxjs@6.6.7: dependencies: tslib: 1.14.1 - dev: false - /rxjs@7.8.1: - resolution: {integrity: sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==} + rxjs@7.8.1: dependencies: tslib: 2.6.2 - /safe-buffer@5.1.2: - resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} + safe-buffer@5.1.2: {} - /safe-buffer@5.2.1: - resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + safe-buffer@5.2.1: {} - /safe-regex2@3.1.0: - resolution: {integrity: sha512-RAAZAGbap2kBfbVhvmnTFv73NWLMvDGOITFYTZBAaY8eR+Ir4ef7Up/e7amo+y1+AH+3PtLkrt9mvcTsG9LXug==} + safe-regex2@3.1.0: dependencies: ret: 0.4.3 - /safe-stable-stringify@2.4.3: - resolution: {integrity: sha512-e2bDA2WJT0wxseVd4lsDP4+3ONX6HpMXQa1ZhFQ7SU+GjvORCmShbCMltrtIDfkYhVHrOcPtj+KhmDBdPdZD1g==} - engines: {node: '>=10'} - dev: false + safe-stable-stringify@2.4.3: {} - /safer-buffer@2.1.2: - resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} - dev: true + safer-buffer@2.1.2: {} - /schema-utils@3.3.0: - resolution: {integrity: sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==} - engines: {node: '>= 10.13.0'} + schema-utils@3.3.0: dependencies: '@types/json-schema': 7.0.15 ajv: 6.12.6 ajv-keywords: 3.5.2(ajv@6.12.6) - dev: true - /secure-json-parse@2.7.0: - resolution: {integrity: sha512-6aU+Rwsezw7VR8/nyvKTx8QpWH9FrcYiXXlqC4z5d5XQBDRqtbfsRjnwGyqbi3gddNtWHuEk9OANUotL26qKUw==} - dev: false + secure-json-parse@2.7.0: {} - /semver@5.7.2: - resolution: {integrity: sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==} - hasBin: true + semver@5.7.2: {} - /semver@6.3.1: - resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} - hasBin: true + semver@6.3.1: {} - /semver@7.6.0: - resolution: {integrity: sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==} - engines: {node: '>=10'} - hasBin: true + semver@7.6.0: dependencies: lru-cache: 6.0.0 - /semver@7.6.3: - resolution: {integrity: sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==} - engines: {node: '>=10'} - hasBin: true + semver@7.6.3: {} - /serialize-javascript@6.0.2: - resolution: {integrity: sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==} + serialize-javascript@6.0.2: dependencies: randombytes: 2.1.0 - dev: true - /set-blocking@2.0.0: - resolution: {integrity: sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==} - dev: false + set-blocking@2.0.0: {} - /set-cookie-parser@2.6.0: - resolution: {integrity: sha512-RVnVQxTXuerk653XfuliOxBP81Sf0+qfQE73LIYKcyMYHG94AuH0kgrQpRDuTZnSmjpysHmzxJXKNfa6PjFhyQ==} - dev: false + set-cookie-parser@2.6.0: {} - /set-function-length@1.2.1: - resolution: {integrity: sha512-j4t6ccc+VsKwYHso+kElc5neZpjtq9EnRICFZtWyBsLojhmeF/ZBd/elqm22WJh/BziDe/SBiOeAt0m2mfLD0g==} - engines: {node: '>= 0.4'} + set-function-length@1.2.1: dependencies: define-data-property: 1.1.2 es-errors: 1.3.0 @@ -7579,153 +9671,97 @@ packages: get-intrinsic: 1.2.4 gopd: 1.0.1 has-property-descriptors: 1.0.1 - dev: true - /setprototypeof@1.2.0: - resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} - dev: false + setprototypeof@1.2.0: {} - /shebang-command@2.0.0: - resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} - engines: {node: '>=8'} + shebang-command@2.0.0: dependencies: shebang-regex: 3.0.0 - /shebang-regex@3.0.0: - resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} - engines: {node: '>=8'} + shebang-regex@3.0.0: {} - /side-channel@1.0.5: - resolution: {integrity: sha512-QcgiIWV4WV7qWExbN5llt6frQB/lBven9pqliLXfGPB+K9ZYXxDozp0wLkHS24kWCm+6YXH/f0HhnObZnZOBnQ==} - engines: {node: '>= 0.4'} + side-channel@1.0.5: dependencies: call-bind: 1.0.7 es-errors: 1.3.0 get-intrinsic: 1.2.4 object-inspect: 1.13.1 - dev: true - /signal-exit@3.0.7: - resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} + signal-exit@3.0.7: {} - /signal-exit@4.1.0: - resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} - engines: {node: '>=14'} + signal-exit@4.1.0: {} - /sisteransi@1.0.5: - resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} + sisteransi@1.0.5: {} - /slash@3.0.0: - resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} - engines: {node: '>=8'} + slash@3.0.0: {} - /sonic-boom@3.8.0: - resolution: {integrity: sha512-ybz6OYOUjoQQCQ/i4LU8kaToD8ACtYP+Cj5qd2AO36bwbdewxWJ3ArmJ2cr6AvxlL2o0PqnCcPGUgkILbfkaCA==} + sonic-boom@3.8.0: dependencies: atomic-sleep: 1.0.0 - dev: false - /sonic-boom@4.1.0: - resolution: {integrity: sha512-NGipjjRicyJJ03rPiZCJYjwlsuP2d1/5QUviozRXC7S3WdVWNK5e3Ojieb9CCyfhq2UC+3+SRd9nG3I2lPRvUw==} + sonic-boom@4.1.0: dependencies: atomic-sleep: 1.0.0 - dev: false - /source-map-resolve@0.5.3: - resolution: {integrity: sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==} - deprecated: See https://github.com/lydell/source-map-resolve#deprecated + source-map-resolve@0.5.3: dependencies: atob: 2.1.2 decode-uri-component: 0.2.2 resolve-url: 0.2.1 source-map-url: 0.4.1 urix: 0.1.0 - dev: false - /source-map-support@0.5.13: - resolution: {integrity: sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==} + source-map-support@0.5.13: dependencies: buffer-from: 1.1.2 source-map: 0.6.1 - /source-map-support@0.5.21: - resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} + source-map-support@0.5.21: dependencies: buffer-from: 1.1.2 source-map: 0.6.1 - dev: true - /source-map-url@0.4.1: - resolution: {integrity: sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw==} - deprecated: See https://github.com/lydell/source-map-url#deprecated - dev: false + source-map-url@0.4.1: {} - /source-map@0.6.1: - resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} - engines: {node: '>=0.10.0'} + source-map@0.6.1: {} - /source-map@0.7.3: - resolution: {integrity: sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==} - engines: {node: '>= 8'} - dev: false + source-map@0.7.3: {} - /source-map@0.7.4: - resolution: {integrity: sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==} - engines: {node: '>= 8'} - dev: true + source-map@0.7.4: {} - /sourcemap-codec@1.4.8: - resolution: {integrity: sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==} - deprecated: Please use @jridgewell/sourcemap-codec instead - dev: false + sourcemap-codec@1.4.8: {} - /spdx-correct@3.2.0: - resolution: {integrity: sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==} + spdx-correct@3.2.0: dependencies: spdx-expression-parse: 3.0.1 spdx-license-ids: 3.0.17 - /spdx-exceptions@2.4.0: - resolution: {integrity: sha512-hcjppoJ68fhxA/cjbN4T8N6uCUejN8yFw69ttpqtBeCbF3u13n7mb31NB9jKwGTTWWnt9IbRA/mf1FprYS8wfw==} + spdx-exceptions@2.4.0: {} - /spdx-expression-parse@3.0.1: - resolution: {integrity: sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==} + spdx-expression-parse@3.0.1: dependencies: spdx-exceptions: 2.4.0 spdx-license-ids: 3.0.17 - /spdx-license-ids@3.0.17: - resolution: {integrity: sha512-sh8PWc/ftMqAAdFiBu6Fy6JUOYjqDJBJvIhpfDMyHrr0Rbp5liZqd4TjtQ/RgfLjKFZb+LMx5hpml5qOWy0qvg==} + spdx-license-ids@3.0.17: {} - /split2@3.2.2: - resolution: {integrity: sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg==} + split2@3.2.2: dependencies: readable-stream: 3.6.2 - dev: true - /split2@4.2.0: - resolution: {integrity: sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==} - engines: {node: '>= 10.x'} + split2@4.2.0: {} - /split@1.0.1: - resolution: {integrity: sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg==} + split@1.0.1: dependencies: through: 2.3.8 - dev: true - /sprintf-js@1.0.3: - resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} + sprintf-js@1.0.3: {} - /stack-utils@2.0.6: - resolution: {integrity: sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==} - engines: {node: '>=10'} + stack-utils@2.0.6: dependencies: escape-string-regexp: 2.0.0 - /standard-version@9.5.0: - resolution: {integrity: sha512-3zWJ/mmZQsOaO+fOlsa0+QK90pwhNd042qEcw6hKFNoLFs7peGyvPffpEBbK/DSGPbyOvli0mUIFv5A4qTjh2Q==} - engines: {node: '>=10'} - hasBin: true + standard-version@9.5.0: dependencies: chalk: 2.4.2 conventional-changelog: 3.1.25 @@ -7741,134 +9777,82 @@ packages: semver: 7.6.0 stringify-package: 1.0.1 yargs: 16.2.0 - dev: true - /statuses@2.0.1: - resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==} - engines: {node: '>= 0.8'} - dev: false + statuses@2.0.1: {} - /stream-shift@1.0.3: - resolution: {integrity: sha512-76ORR0DO1o1hlKwTbi/DM3EXWGf3ZJYO8cXX5RJwnul2DEg2oyoZyjLNoQM8WsvZiFKCRfC1O0J7iCvie3RZmQ==} - dev: false + stream-shift@1.0.3: {} - /stream-wormhole@1.1.0: - resolution: {integrity: sha512-gHFfL3px0Kctd6Po0M8TzEvt3De/xu6cnRrjlfYNhwbhLPLwigI2t1nc6jrzNuaYg5C4YF78PPFuQPzRiqn9ew==} - engines: {node: '>=4.0.0'} - dev: false + stream-wormhole@1.1.0: {} - /string-length@4.0.2: - resolution: {integrity: sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==} - engines: {node: '>=10'} + string-length@4.0.2: dependencies: char-regex: 1.0.2 strip-ansi: 6.0.1 - /string-width@1.0.2: - resolution: {integrity: sha512-0XsVpQLnVCXHJfyEs8tC0zpTVIr5PKKsQtkT29IwupnPTjtPmQ3xT/4yCREF9hYkV/3M3kzcUTSAZT6a6h81tw==} - engines: {node: '>=0.10.0'} + string-width@1.0.2: dependencies: code-point-at: 1.1.0 is-fullwidth-code-point: 1.0.0 strip-ansi: 3.0.1 - dev: false - /string-width@4.2.3: - resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} - engines: {node: '>=8'} + string-width@4.2.3: dependencies: emoji-regex: 8.0.0 is-fullwidth-code-point: 3.0.0 strip-ansi: 6.0.1 - /string-width@5.1.2: - resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} - engines: {node: '>=12'} + string-width@5.1.2: dependencies: eastasianwidth: 0.2.0 emoji-regex: 9.2.2 strip-ansi: 7.1.0 - /string_decoder@0.10.31: - resolution: {integrity: sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==} - dev: false + string_decoder@0.10.31: {} - /string_decoder@1.1.1: - resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==} + string_decoder@1.1.1: dependencies: safe-buffer: 5.1.2 - /string_decoder@1.3.0: - resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} + string_decoder@1.3.0: dependencies: safe-buffer: 5.2.1 - /stringify-package@1.0.1: - resolution: {integrity: sha512-sa4DUQsYciMP1xhKWGuFM04fB0LG/9DlluZoSVywUMRNvzid6XucHK0/90xGxRoHrAaROrcHK1aPKaijCtSrhg==} - deprecated: This module is not used anymore, and has been replaced by @npmcli/package-json - dev: true + stringify-package@1.0.1: {} - /strip-ansi@3.0.1: - resolution: {integrity: sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==} - engines: {node: '>=0.10.0'} + strip-ansi@3.0.1: dependencies: ansi-regex: 2.1.1 - dev: false - /strip-ansi@6.0.1: - resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} - engines: {node: '>=8'} + strip-ansi@6.0.1: dependencies: ansi-regex: 5.0.1 - /strip-ansi@7.1.0: - resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} - engines: {node: '>=12'} + strip-ansi@7.1.0: dependencies: ansi-regex: 6.0.1 - /strip-bom-stream@1.0.0: - resolution: {integrity: sha512-7jfJB9YpI2Z0aH3wu10ZqitvYJaE0s5IzFuWE+0pbb4Q/armTloEUShymkDO47YSLnjAW52mlXT//hs9wXNNJQ==} - engines: {node: '>=0.10.0'} + strip-bom-stream@1.0.0: dependencies: first-chunk-stream: 1.0.0 strip-bom: 2.0.0 - dev: false - /strip-bom@2.0.0: - resolution: {integrity: sha512-kwrX1y7czp1E69n2ajbG65mIo9dqvJ+8aBQXOGVxqwvNbsXdFM6Lq37dLAY3mknUwru8CfcCbfOLL/gMo+fi3g==} - engines: {node: '>=0.10.0'} + strip-bom@2.0.0: dependencies: is-utf8: 0.2.1 - dev: false - /strip-bom@3.0.0: - resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} - engines: {node: '>=4'} - dev: true + strip-bom@3.0.0: {} - /strip-bom@4.0.0: - resolution: {integrity: sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==} - engines: {node: '>=8'} + strip-bom@4.0.0: {} - /strip-final-newline@2.0.0: - resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} - engines: {node: '>=6'} + strip-final-newline@2.0.0: {} - /strip-indent@3.0.0: - resolution: {integrity: sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==} - engines: {node: '>=8'} + strip-indent@3.0.0: dependencies: min-indent: 1.0.1 - dev: true - /strip-json-comments@3.1.1: - resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} - engines: {node: '>=8'} + strip-json-comments@3.1.1: {} - /superagent@8.1.2: - resolution: {integrity: sha512-6WTxW1EB6yCxV5VFOIPQruWGHqc3yI7hEmZK6h+pyk69Lk/Ut7rLUY6W/ONF2MjBuGjvmMiIpsrVJ2vjrHlslA==} - engines: {node: '>=6.4.0 <13 || >=14'} + superagent@8.1.2: dependencies: component-emitter: 1.3.1 cookiejar: 2.1.4 @@ -7882,74 +9866,44 @@ packages: semver: 7.6.0 transitivePeerDependencies: - supports-color - dev: true - /supertest@6.3.3: - resolution: {integrity: sha512-EMCG6G8gDu5qEqRQ3JjjPs6+FYT1a7Hv5ApHvtSghmOFJYtsU5S+pSb6Y2EUeCEY3CmEL3mmQ8YWlPOzQomabA==} - engines: {node: '>=6.4.0'} + supertest@6.3.3: dependencies: methods: 1.1.2 superagent: 8.1.2 transitivePeerDependencies: - supports-color - dev: true - /supports-color@2.0.0: - resolution: {integrity: sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==} - engines: {node: '>=0.8.0'} - dev: false + supports-color@2.0.0: {} - /supports-color@5.5.0: - resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} - engines: {node: '>=4'} + supports-color@5.5.0: dependencies: has-flag: 3.0.0 - /supports-color@7.2.0: - resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} - engines: {node: '>=8'} + supports-color@7.2.0: dependencies: has-flag: 4.0.0 - /supports-color@8.1.1: - resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} - engines: {node: '>=10'} + supports-color@8.1.1: dependencies: has-flag: 4.0.0 - /supports-preserve-symlinks-flag@1.0.0: - resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} - engines: {node: '>= 0.4'} + supports-preserve-symlinks-flag@1.0.0: {} - /swagger-ui-dist@5.17.14: - resolution: {integrity: sha512-CVbSfaLpstV65OnSjbXfVd6Sta3q3F7Cj/yYuvHMp1P90LztOLs6PfUnKEVAeiIVQt9u2SaPwv0LiH/OyMjHRw==} - dev: false + swagger-ui-dist@5.17.14: {} - /symbol-observable@4.0.0: - resolution: {integrity: sha512-b19dMThMV4HVFynSAM1++gBHAbk2Tc/osgLIBZMKsyqh34jb2e8Os7T6ZW/Bt3pJFdBTd2JwAnAAEQV7rSNvcQ==} - engines: {node: '>=0.10'} - dev: true + symbol-observable@4.0.0: {} - /symbol@0.2.3: - resolution: {integrity: sha512-IUW+ek7apEaW5bFhS6WpYoNtVpNTlNoqB/PH7YiMWQTxSPeXCzG4PILVakwXivJt3ZXWeO1fIJnUd/L9A/VeGA==} - dev: false + symbol@0.2.3: {} - /synckit@0.9.2: - resolution: {integrity: sha512-vrozgXDQwYO72vHjUb/HnFbQx1exDjoKzqx23aXEg2a9VIg2TSFZ8FmeZpTjUCFMYw7mpX4BE2SFu8wI7asYsw==} - engines: {node: ^14.18.0 || >=16.0.0} + synckit@0.9.2: dependencies: '@pkgr/core': 0.1.1 tslib: 2.7.0 - dev: true - /tapable@2.2.1: - resolution: {integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==} - engines: {node: '>=6'} - dev: true + tapable@2.2.1: {} - /tar@6.2.0: - resolution: {integrity: sha512-/Wo7DcT0u5HUV486xg675HtjNd3BXZ6xDbzsCUZPt5iw8bTQ63bP0Raut3mvro9u+CUyq7YQd8Cx55fsZXxqLQ==} - engines: {node: '>=10'} + tar@6.2.0: dependencies: chownr: 2.0.0 fs-minipass: 2.1.0 @@ -7958,33 +9912,16 @@ packages: mkdirp: 1.0.4 yallist: 4.0.0 - /tar@7.4.3: - resolution: {integrity: sha512-5S7Va8hKfV7W5U6g3aYxXmlPoZVAwUMy9AOKyF2fVuZa2UD3qZjg578OrLRt8PcNN1PleVaL/5/yYATNL0ICUw==} - engines: {node: '>=18'} - dependencies: - '@isaacs/fs-minipass': 4.0.1 - chownr: 3.0.0 - minipass: 7.1.2 - minizlib: 3.0.1 - mkdirp: 3.0.1 - yallist: 5.0.0 - dev: true - - /terser-webpack-plugin@5.3.10(webpack@5.94.0): - resolution: {integrity: sha512-BKFPWlPDndPs+NGGCr1U59t0XScL5317Y0UReNrHaw9/FwhPENlq6bfgs+4yPfyP51vqC1bQ4rp1EfXW5ZSH9w==} - engines: {node: '>= 10.13.0'} - peerDependencies: - '@swc/core': '*' - esbuild: '*' - uglify-js: '*' - webpack: ^5.1.0 - peerDependenciesMeta: - '@swc/core': - optional: true - esbuild: - optional: true - uglify-js: - optional: true + tar@7.4.3: + dependencies: + '@isaacs/fs-minipass': 4.0.1 + chownr: 3.0.0 + minipass: 7.1.2 + minizlib: 3.0.1 + mkdirp: 3.0.1 + yallist: 5.0.0 + + terser-webpack-plugin@5.3.10(webpack@5.94.0): dependencies: '@jridgewell/trace-mapping': 0.3.22 jest-worker: 27.5.1 @@ -7992,192 +9929,105 @@ packages: serialize-javascript: 6.0.2 terser: 5.27.0 webpack: 5.94.0 - dev: true - /terser@5.27.0: - resolution: {integrity: sha512-bi1HRwVRskAjheeYl291n3JC4GgO/Ty4z1nVs5AAsmonJulGxpSektecnNedrwK9C7vpvVtcX3cw00VSLt7U2A==} - engines: {node: '>=10'} - hasBin: true + terser@5.27.0: dependencies: '@jridgewell/source-map': 0.3.5 acorn: 8.12.1 commander: 2.20.3 source-map-support: 0.5.21 - dev: true - /test-exclude@6.0.0: - resolution: {integrity: sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==} - engines: {node: '>=8'} + test-exclude@6.0.0: dependencies: '@istanbuljs/schema': 0.1.3 glob: 7.2.3 minimatch: 3.1.2 - /text-extensions@1.9.0: - resolution: {integrity: sha512-wiBrwC1EhBelW12Zy26JeOUkQ5mRu+5o8rpsJk5+2t+Y5vE7e842qtZDQ2g1NpX/29HdyFeJ4nSIhI47ENSxlQ==} - engines: {node: '>=0.10'} - dev: true + text-extensions@1.9.0: {} - /text-extensions@2.4.0: - resolution: {integrity: sha512-te/NtwBwfiNRLf9Ijqx3T0nlqZiQ2XrrtBvu+cLL8ZRrGkO0NHTug8MYFKyoSrv/sHTaSKfilUkizV6XhxMJ3g==} - engines: {node: '>=8'} - dev: true + text-extensions@2.4.0: {} - /text-table@0.2.0: - resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} - dev: true + text-table@0.2.0: {} - /thread-stream@2.4.1: - resolution: {integrity: sha512-d/Ex2iWd1whipbT681JmTINKw0ZwOUBZm7+Gjs64DHuX34mmw8vJL2bFAaNacaW72zYiTJxSHi5abUuOi5nsfg==} + thread-stream@2.4.1: dependencies: real-require: 0.2.0 - dev: false - /thread-stream@3.1.0: - resolution: {integrity: sha512-OqyPZ9u96VohAyMfJykzmivOrY2wfMSf3C5TtFJVgN+Hm6aj+voFhlK+kZEIv2FBh1X6Xp3DlnCOfEQ3B2J86A==} + thread-stream@3.1.0: dependencies: real-require: 0.2.0 - dev: false - /through2-filter@2.0.0: - resolution: {integrity: sha512-miwWajb1B80NvIVKXFPN/o7+vJc4jYUvnZCwvhicRAoTxdD9wbcjri70j+BenCrN/JXEPKDjhpw4iY7yiNsCGg==} + through2-filter@2.0.0: dependencies: through2: 2.0.5 xtend: 4.0.2 - dev: false - /through2-filter@3.0.0: - resolution: {integrity: sha512-jaRjI2WxN3W1V8/FMZ9HKIBXixtiqs3SQSX4/YGIiP3gL6djW48VoZq9tDqeCWs3MT8YY5wb/zli8VW8snY1CA==} + through2-filter@3.0.0: dependencies: through2: 2.0.5 xtend: 4.0.2 - dev: false - /through2@0.6.5: - resolution: {integrity: sha512-RkK/CCESdTKQZHdmKICijdKKsCRVHs5KsLZ6pACAmF/1GPUQhonHSXWNERctxEp7RmvjdNbZTL5z9V7nSCXKcg==} + through2@0.6.5: dependencies: readable-stream: 1.0.34 xtend: 4.0.2 - dev: false - /through2@2.0.5: - resolution: {integrity: sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==} + through2@2.0.5: dependencies: readable-stream: 2.3.8 xtend: 4.0.2 - /through2@4.0.2: - resolution: {integrity: sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==} + through2@4.0.2: dependencies: readable-stream: 3.6.2 - dev: true - /through@2.3.8: - resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==} - dev: true + through@2.3.8: {} - /tildify@1.2.0: - resolution: {integrity: sha512-Y9q1GaV/BO65Z9Yf4NOGMuwt3SGdptkZBnaaKfTQakrDyCLiuO1Kc5wxW4xLdsjzunRtqtOdhekiUFmZbklwYQ==} - engines: {node: '>=0.10.0'} + tildify@1.2.0: dependencies: os-homedir: 1.0.2 - dev: false - /tinyexec@0.3.0: - resolution: {integrity: sha512-tVGE0mVJPGb0chKhqmsoosjsS+qUnJVGJpZgsHYQcGoPlG3B51R3PouqTgEGH2Dc9jjFyOqOpix6ZHNMXp1FZg==} - dev: true + tinyexec@0.3.0: {} - /tmp@0.0.33: - resolution: {integrity: sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==} - engines: {node: '>=0.6.0'} + tmp@0.0.33: dependencies: os-tmpdir: 1.0.2 - dev: true - /tmpl@1.0.5: - resolution: {integrity: sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==} + tmpl@1.0.5: {} - /to-absolute-glob@0.1.1: - resolution: {integrity: sha512-Vvl5x6zNf9iVG1QTWeknmWrKzZxaeKfIDRibrZCR3b2V/2NlFJuD2HV7P7AVjaKLZNqLPHqyr0jGrW0fTcxCPQ==} - engines: {node: '>=0.10.0'} + to-absolute-glob@0.1.1: dependencies: extend-shallow: 2.0.1 - dev: false - /to-fast-properties@2.0.0: - resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==} - engines: {node: '>=4'} + to-fast-properties@2.0.0: {} - /to-regex-range@5.0.1: - resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} - engines: {node: '>=8.0'} + to-regex-range@5.0.1: dependencies: is-number: 7.0.0 - /toad-cache@3.7.0: - resolution: {integrity: sha512-/m8M+2BJUpoJdgAHoG+baCwBT+tf2VraSfkBgl0Y00qIWt41DJ8R5B8nsEw0I58YwF5IZH6z24/2TobDKnqSWw==} - engines: {node: '>=12'} - dev: false + toad-cache@3.7.0: {} - /toidentifier@1.0.1: - resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} - engines: {node: '>=0.6'} - dev: false + toidentifier@1.0.1: {} - /tr46@0.0.3: - resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} + tr46@0.0.3: {} - /tree-kill@1.2.2: - resolution: {integrity: sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==} - hasBin: true - dev: true + tree-kill@1.2.2: {} - /trim-newlines@3.0.1: - resolution: {integrity: sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==} - engines: {node: '>=8'} - dev: true + trim-newlines@3.0.1: {} - /trouter@2.0.1: - resolution: {integrity: sha512-kr8SKKw94OI+xTGOkfsvwZQ8mWoikZDd2n8XZHjJVZUARZT+4/VV6cacRS6CLsH9bNm+HFIPU1Zx4CnNnb4qlQ==} - engines: {node: '>=6'} + trouter@2.0.1: dependencies: matchit: 1.1.0 - dev: true - /ts-api-utils@1.3.0(typescript@5.6.3): - resolution: {integrity: sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==} - engines: {node: '>=16'} - peerDependencies: - typescript: '>=4.2.0' + ts-api-utils@1.3.0(typescript@5.6.3): dependencies: typescript: 5.6.3 - dev: true - /ts-jest@29.1.0(@babel/core@7.23.9)(jest@29.5.0)(typescript@5.0.4): - resolution: {integrity: sha512-ZhNr7Z4PcYa+JjMl62ir+zPiNJfXJN6E8hSLnaUKhOgqcn8vb3e537cpkd0FuAfRK3sR1LSqM1MOhliXNgOFPA==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - hasBin: true - peerDependencies: - '@babel/core': '>=7.0.0-beta.0 <8' - '@jest/types': ^29.0.0 - babel-jest: ^29.0.0 - esbuild: '*' - jest: ^29.0.0 - typescript: '>=4.3 <6' - peerDependenciesMeta: - '@babel/core': - optional: true - '@jest/types': - optional: true - babel-jest: - optional: true - esbuild: - optional: true + ts-jest@29.1.0(@babel/core@7.23.9)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.23.9))(jest@29.5.0(@types/node@22.7.5)(ts-node@10.9.2(@types/node@22.7.5)(typescript@5.6.3)))(typescript@5.0.4): dependencies: - '@babel/core': 7.23.9 bs-logger: 0.2.6 fast-json-stable-stringify: 2.1.0 - jest: 29.5.0(@types/node@22.7.5)(ts-node@10.9.2) + jest: 29.5.0(@types/node@22.7.5)(ts-node@10.9.2(@types/node@22.7.5)(typescript@5.6.3)) jest-util: 29.7.0 json5: 2.2.3 lodash.memoize: 4.1.2 @@ -8185,37 +10035,17 @@ packages: semver: 7.6.3 typescript: 5.0.4 yargs-parser: 21.1.1 - dev: false + optionalDependencies: + '@babel/core': 7.23.9 + '@jest/types': 29.6.3 + babel-jest: 29.7.0(@babel/core@7.23.9) - /ts-jest@29.2.5(@babel/core@7.23.9)(jest@29.7.0)(typescript@5.6.3): - resolution: {integrity: sha512-KD8zB2aAZrcKIdGk4OwpJggeLcH1FgrICqDSROWqlnJXGCXK4Mn6FcdK2B6670Xr73lHMG1kHw8R87A0ecZ+vA==} - engines: {node: ^14.15.0 || ^16.10.0 || ^18.0.0 || >=20.0.0} - hasBin: true - peerDependencies: - '@babel/core': '>=7.0.0-beta.0 <8' - '@jest/transform': ^29.0.0 - '@jest/types': ^29.0.0 - babel-jest: ^29.0.0 - esbuild: '*' - jest: ^29.0.0 - typescript: '>=4.3 <6' - peerDependenciesMeta: - '@babel/core': - optional: true - '@jest/transform': - optional: true - '@jest/types': - optional: true - babel-jest: - optional: true - esbuild: - optional: true + ts-jest@29.2.5(@babel/core@7.23.9)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.23.9))(jest@29.7.0(@types/node@22.7.5)(ts-node@10.9.2(@types/node@22.7.5)(typescript@5.6.3)))(typescript@5.6.3): dependencies: - '@babel/core': 7.23.9 bs-logger: 0.2.6 ejs: 3.1.10 fast-json-stable-stringify: 2.1.0 - jest: 29.7.0(@types/node@22.7.5)(ts-node@10.9.2) + jest: 29.7.0(@types/node@22.7.5)(ts-node@10.9.2(@types/node@22.7.5)(typescript@5.6.3)) jest-util: 29.7.0 json5: 2.2.3 lodash.memoize: 4.1.2 @@ -8223,14 +10053,13 @@ packages: semver: 7.6.3 typescript: 5.6.3 yargs-parser: 21.1.1 - dev: true + optionalDependencies: + '@babel/core': 7.23.9 + '@jest/transform': 29.7.0 + '@jest/types': 29.6.3 + babel-jest: 29.7.0(@babel/core@7.23.9) - /ts-loader@9.5.1(typescript@5.6.3)(webpack@5.94.0): - resolution: {integrity: sha512-rNH3sK9kGZcH9dYzC7CewQm4NtxJTjSEVRJ2DyBZR7f8/wcta+iV44UPCXc5+nzDzivKtlzV6c9P4e+oFhDLYg==} - engines: {node: '>=12.0.0'} - peerDependencies: - typescript: '*' - webpack: ^5.0.0 + ts-loader@9.5.1(typescript@5.6.3)(webpack@5.94.0): dependencies: chalk: 4.1.2 enhanced-resolve: 5.15.0 @@ -8239,21 +10068,8 @@ packages: source-map: 0.7.4 typescript: 5.6.3 webpack: 5.94.0 - dev: true - /ts-node@10.9.2(@types/node@22.7.5)(typescript@5.6.3): - resolution: {integrity: sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==} - hasBin: true - peerDependencies: - '@swc/core': '>=1.2.50' - '@swc/wasm': '>=1.2.50' - '@types/node': '*' - typescript: '>=2.7' - peerDependenciesMeta: - '@swc/core': - optional: true - '@swc/wasm': - optional: true + ts-node@10.9.2(@types/node@22.7.5)(typescript@5.6.3): dependencies: '@cspotcode/source-map-support': 0.8.1 '@tsconfig/node10': 1.0.9 @@ -8271,187 +10087,104 @@ packages: v8-compile-cache-lib: 3.0.1 yn: 3.1.1 - /ts-toolbelt@9.6.0: - resolution: {integrity: sha512-nsZd8ZeNUzukXPlJmTBwUAuABDe/9qtVDelJeT/qW0ow3ZS3BsQJtNkan1802aM9Uf68/Y8ljw86Hu0h5IUW3w==} - dev: true + ts-toolbelt@9.6.0: {} - /tsconfig-paths-webpack-plugin@4.1.0: - resolution: {integrity: sha512-xWFISjviPydmtmgeUAuXp4N1fky+VCtfhOkDUFIv5ea7p4wuTomI4QTrXvFBX2S4jZsmyTSrStQl+E+4w+RzxA==} - engines: {node: '>=10.13.0'} + tsconfig-paths-webpack-plugin@4.1.0: dependencies: chalk: 4.1.2 enhanced-resolve: 5.15.0 tsconfig-paths: 4.2.0 - dev: true - /tsconfig-paths@4.2.0: - resolution: {integrity: sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg==} - engines: {node: '>=6'} + tsconfig-paths@4.2.0: dependencies: json5: 2.2.3 minimist: 1.2.8 strip-bom: 3.0.0 - dev: true - /tslib@1.14.1: - resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==} - dev: false + tslib@1.14.1: {} - /tslib@2.5.0: - resolution: {integrity: sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==} - dev: false + tslib@2.5.0: {} - /tslib@2.6.2: - resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==} + tslib@2.6.2: {} - /tslib@2.7.0: - resolution: {integrity: sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA==} + tslib@2.7.0: {} - /type-check@0.4.0: - resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} - engines: {node: '>= 0.8.0'} + type-check@0.4.0: dependencies: prelude-ls: 1.2.1 - dev: true - /type-detect@4.0.8: - resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==} - engines: {node: '>=4'} + type-detect@4.0.8: {} - /type-fest@0.18.1: - resolution: {integrity: sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==} - engines: {node: '>=10'} - dev: true + type-fest@0.18.1: {} - /type-fest@0.21.3: - resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==} - engines: {node: '>=10'} + type-fest@0.21.3: {} - /type-fest@0.6.0: - resolution: {integrity: sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==} - engines: {node: '>=8'} - dev: true + type-fest@0.6.0: {} - /type-fest@0.8.1: - resolution: {integrity: sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==} - engines: {node: '>=8'} - dev: true + type-fest@0.8.1: {} - /typedarray@0.0.6: - resolution: {integrity: sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==} + typedarray@0.0.6: {} - /typedarray@0.0.7: - resolution: {integrity: sha512-ueeb9YybpjhivjbHP2LdFDAjbS948fGEPj+ACAMs4xCMmh72OCOMQWBQKlaN4ZNQ04yfLSDLSx1tGRIoWimObQ==} - dev: false + typedarray@0.0.7: {} - /typescript@5.0.4: - resolution: {integrity: sha512-cW9T5W9xY37cc+jfEnaUvX91foxtHkza3Nw3wkoF4sSlKn0MONdkdEndig/qPBWXNkmplh3NzayQzCiHM4/hqw==} - engines: {node: '>=12.20'} - hasBin: true - dev: false + typescript@5.0.4: {} - /typescript@5.3.3: - resolution: {integrity: sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw==} - engines: {node: '>=14.17'} - hasBin: true - dev: true + typescript@5.3.3: {} - /typescript@5.6.3: - resolution: {integrity: sha512-hjcS1mhfuyi4WW8IWtjP7brDrG2cuDZukyrYrSauoXGNgx0S7zceP07adYkJycEr56BOUTNPzbInooiN3fn1qw==} - engines: {node: '>=14.17'} - hasBin: true + typescript@5.6.3: {} - /uglify-js@3.17.4: - resolution: {integrity: sha512-T9q82TJI9e/C1TAxYvfb16xO120tMVFZrGA3f9/P4424DNu6ypK103y0GPFVa17yotwSyZW5iYXgjYHkGrJW/g==} - engines: {node: '>=0.8.0'} - hasBin: true - requiresBuild: true - dev: true + uglify-js@3.17.4: optional: true - /uid@2.0.2: - resolution: {integrity: sha512-u3xV3X7uzvi5b1MncmZo3i2Aw222Zk1keqLA1YkHldREkAhAqi65wuPfe7lHx8H/Wzy+8CE7S7uS3jekIM5s8g==} - engines: {node: '>=8'} + uid@2.0.2: dependencies: '@lukeed/csprng': 1.1.0 - /undici-types@6.19.8: - resolution: {integrity: sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==} + undici-types@6.19.8: {} - /unicorn-magic@0.1.0: - resolution: {integrity: sha512-lRfVq8fE8gz6QMBuDM6a+LO3IAzTi05H6gCVaUpir2E1Rwpo4ZUog45KpNXKC/Mn3Yb9UDuHumeFTo9iV/D9FQ==} - engines: {node: '>=18'} - dev: true + unicorn-magic@0.1.0: {} - /unique-stream@2.3.1: - resolution: {integrity: sha512-2nY4TnBE70yoxHkDli7DMazpWiP7xMdCYqU2nBRO0UB+ZpEkGsSija7MvmvnZFUeC+mrgiUfcHSr3LmRFIg4+A==} + unique-stream@2.3.1: dependencies: json-stable-stringify-without-jsonify: 1.0.1 through2-filter: 3.0.0 - dev: false - /universalify@2.0.1: - resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==} - engines: {node: '>= 10.0.0'} - dev: true + universalify@2.0.1: {} - /update-browserslist-db@1.0.13(browserslist@4.22.3): - resolution: {integrity: sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==} - hasBin: true - peerDependencies: - browserslist: '>= 4.21.0' + update-browserslist-db@1.0.13(browserslist@4.22.3): dependencies: browserslist: 4.22.3 escalade: 3.1.2 picocolors: 1.0.0 - /uri-js@4.4.1: - resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} + uri-js@4.4.1: dependencies: punycode: 2.3.1 - /urix@0.1.0: - resolution: {integrity: sha512-Am1ousAhSLBeB9cG/7k7r2R0zj50uDRlZHPGbazid5s9rlF1F/QKYObEKSIunSjIOkJZqwRRLpvewjEkM7pSqg==} - deprecated: Please see https://github.com/lydell/urix#deprecated - dev: false + urix@0.1.0: {} - /util-deprecate@1.0.2: - resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + util-deprecate@1.0.2: {} - /utils-merge@1.0.1: - resolution: {integrity: sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==} - engines: {node: '>= 0.4.0'} - dev: false + utils-merge@1.0.1: {} - /v8-compile-cache-lib@3.0.1: - resolution: {integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==} + v8-compile-cache-lib@3.0.1: {} - /v8-to-istanbul@9.2.0: - resolution: {integrity: sha512-/EH/sDgxU2eGxajKdwLCDmQ4FWq+kpi3uCmBGpw1xJtnAxEjlD8j8PEiGWpCIMIs3ciNAgH0d3TTJiUkYzyZjA==} - engines: {node: '>=10.12.0'} + v8-to-istanbul@9.2.0: dependencies: '@jridgewell/trace-mapping': 0.3.22 '@types/istanbul-lib-coverage': 2.0.6 convert-source-map: 2.0.0 - /vali-date@1.0.0: - resolution: {integrity: sha512-sgECfZthyaCKW10N0fm27cg8HYTFK5qMWgypqkXMQ4Wbl/zZKx7xZICgcoxIIE+WFAP/MBL2EFwC/YvLxw3Zeg==} - engines: {node: '>=0.10.0'} - dev: false + vali-date@1.0.0: {} - /validate-npm-package-license@3.0.4: - resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==} + validate-npm-package-license@3.0.4: dependencies: spdx-correct: 3.2.0 spdx-expression-parse: 3.0.1 - /validator@13.11.0: - resolution: {integrity: sha512-Ii+sehpSfZy+At5nPdnyMhx78fEoPDkR2XW/zimHEL3MyGJQOCQ7WeP20jPYRz7ZCpcKLB21NxuXHF3bxjStBQ==} - engines: {node: '>= 0.10'} + validator@13.11.0: {} - /vinyl-fs@2.4.3: - resolution: {integrity: sha512-XxYoy5HpHrVd76tpnI5Vv/+b/xlEVusOmn4LjQ01s2JyiDMNaUm3Rb7Y3xTkRw+YoRBVoUrCs7EAIFNXyIlI8Q==} - engines: {node: '>=0.10'} + vinyl-fs@2.4.3: dependencies: duplexify: 3.7.1 glob-stream: 5.3.5 @@ -8472,57 +10205,33 @@ packages: vinyl: 1.2.0 transitivePeerDependencies: - supports-color - dev: false - /vinyl@1.2.0: - resolution: {integrity: sha512-Ci3wnR2uuSAWFMSglZuB8Z2apBdtOyz8CV7dC6/U1XbltXBC+IuutUkXQISz01P+US2ouBuesSbV6zILZ6BuzQ==} - engines: {node: '>= 0.9'} + vinyl@1.2.0: dependencies: clone: 1.0.4 clone-stats: 0.0.1 replace-ext: 0.0.1 - dev: false - /walker@1.0.8: - resolution: {integrity: sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==} + walker@1.0.8: dependencies: makeerror: 1.0.12 - /watchpack@2.4.2: - resolution: {integrity: sha512-TnbFSbcOCcDgjZ4piURLCbJ3nJhznVh9kw6F6iokjiFPl8ONxe9A6nMDVXDiNbrSfLILs6vB07F7wLBrwPYzJw==} - engines: {node: '>=10.13.0'} + watchpack@2.4.2: dependencies: glob-to-regexp: 0.4.1 graceful-fs: 4.2.11 - dev: true - /wcwidth@1.0.1: - resolution: {integrity: sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==} + wcwidth@1.0.1: dependencies: defaults: 1.0.4 - /webidl-conversions@3.0.1: - resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} + webidl-conversions@3.0.1: {} - /webpack-node-externals@3.0.0: - resolution: {integrity: sha512-LnL6Z3GGDPht/AigwRh2dvL9PQPFQ8skEpVrWZXLWBYmqcaojHNN0onvHzie6rq7EWKrrBfPYqNEzTJgiwEQDQ==} - engines: {node: '>=6'} - dev: true + webpack-node-externals@3.0.0: {} - /webpack-sources@3.2.3: - resolution: {integrity: sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==} - engines: {node: '>=10.13.0'} - dev: true + webpack-sources@3.2.3: {} - /webpack@5.94.0: - resolution: {integrity: sha512-KcsGn50VT+06JH/iunZJedYGUJS5FGjow8wb9c0v5n1Om8O1g4L6LjtfxwlXIATopoQu+vOXXa7gYisWxCoPyg==} - engines: {node: '>=10.13.0'} - hasBin: true - peerDependencies: - webpack-cli: '*' - peerDependenciesMeta: - webpack-cli: - optional: true + webpack@5.94.0: dependencies: '@types/estree': 1.0.6 '@webassemblyjs/ast': 1.12.1 @@ -8551,140 +10260,84 @@ packages: - '@swc/core' - esbuild - uglify-js - dev: true - /whatwg-url@5.0.0: - resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} + whatwg-url@5.0.0: dependencies: tr46: 0.0.3 webidl-conversions: 3.0.1 - /which@1.3.1: - resolution: {integrity: sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==} - hasBin: true + which@1.3.1: dependencies: isexe: 2.0.0 - dev: true - /which@2.0.2: - resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} - engines: {node: '>= 8'} - hasBin: true + which@2.0.2: dependencies: isexe: 2.0.0 - /wide-align@1.1.5: - resolution: {integrity: sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==} + wide-align@1.1.5: dependencies: string-width: 4.2.3 - dev: false - /window-size@0.2.0: - resolution: {integrity: sha512-UD7d8HFA2+PZsbKyaOCEy8gMh1oDtHgJh1LfgjQ4zVXmYjAT/kvz3PueITKuqDiIXQe7yzpPnxX3lNc+AhQMyw==} - engines: {node: '>= 0.10.0'} - hasBin: true - dev: false + window-size@0.2.0: {} - /word-wrap@1.2.5: - resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} - engines: {node: '>=0.10.0'} - dev: true + word-wrap@1.2.5: {} - /wordwrap@1.0.0: - resolution: {integrity: sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==} - dev: true + wordwrap@1.0.0: {} - /wrap-ansi@2.1.0: - resolution: {integrity: sha512-vAaEaDM946gbNpH5pLVNR+vX2ht6n0Bt3GXwVB1AuAqZosOvHNF3P7wDnh8KLkSqgUh0uh77le7Owgoz+Z9XBw==} - engines: {node: '>=0.10.0'} + wrap-ansi@2.1.0: dependencies: string-width: 1.0.2 strip-ansi: 3.0.1 - dev: false - /wrap-ansi@6.2.0: - resolution: {integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==} - engines: {node: '>=8'} + wrap-ansi@6.2.0: dependencies: ansi-styles: 4.3.0 string-width: 4.2.3 strip-ansi: 6.0.1 - dev: true - /wrap-ansi@7.0.0: - resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} - engines: {node: '>=10'} + wrap-ansi@7.0.0: dependencies: ansi-styles: 4.3.0 string-width: 4.2.3 strip-ansi: 6.0.1 - /wrap-ansi@8.1.0: - resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} - engines: {node: '>=12'} + wrap-ansi@8.1.0: dependencies: ansi-styles: 6.2.1 string-width: 5.1.2 strip-ansi: 7.1.0 - /wrappy@1.0.2: - resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + wrappy@1.0.2: {} - /write-file-atomic@4.0.2: - resolution: {integrity: sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==} - engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + write-file-atomic@4.0.2: dependencies: imurmurhash: 0.1.4 signal-exit: 3.0.7 - /xtend@4.0.2: - resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==} - engines: {node: '>=0.4'} + xtend@4.0.2: {} - /y18n@3.2.2: - resolution: {integrity: sha512-uGZHXkHnhF0XeeAPgnKfPv1bgKAYyVvmNL1xlKsPYZPaIHxGti2hHqvOCQv71XMsLxu1QjergkqogUnms5D3YQ==} - dev: false + y18n@3.2.2: {} - /y18n@5.0.8: - resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} - engines: {node: '>=10'} + y18n@5.0.8: {} - /yallist@3.1.1: - resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} + yallist@3.1.1: {} - /yallist@4.0.0: - resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} + yallist@4.0.0: {} - /yallist@5.0.0: - resolution: {integrity: sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==} - engines: {node: '>=18'} - dev: true + yallist@5.0.0: {} - /yaml@2.6.0: - resolution: {integrity: sha512-a6ae//JvKDEra2kdi1qzCyrJW/WZCgFi8ydDV+eXExl95t+5R+ijnqHJbz9tmMh8FUjx3iv2fCQ4dclAQlO2UQ==} - engines: {node: '>= 14'} - hasBin: true - dev: false + yaml@2.6.0: {} - /yargs-parser@2.4.1: - resolution: {integrity: sha512-9pIKIJhnI5tonzG6OnCFlz/yln8xHYcGl+pn3xR0Vzff0vzN1PbNRaelgfgRUwZ3s4i3jvxT9WhmUGL4whnasA==} + yargs-parser@2.4.1: dependencies: camelcase: 3.0.0 lodash.assign: 4.2.0 - dev: false - /yargs-parser@20.2.9: - resolution: {integrity: sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==} - engines: {node: '>=10'} - dev: true + yargs-parser@20.2.9: {} - /yargs-parser@21.1.1: - resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} - engines: {node: '>=12'} + yargs-parser@21.1.1: {} - /yargs@16.2.0: - resolution: {integrity: sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==} - engines: {node: '>=10'} + yargs@16.2.0: dependencies: cliui: 7.0.4 escalade: 3.1.2 @@ -8693,11 +10346,8 @@ packages: string-width: 4.2.3 y18n: 5.0.8 yargs-parser: 20.2.9 - dev: true - /yargs@17.7.2: - resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} - engines: {node: '>=12'} + yargs@17.7.2: dependencies: cliui: 8.0.1 escalade: 3.1.2 @@ -8707,8 +10357,7 @@ packages: y18n: 5.0.8 yargs-parser: 21.1.1 - /yargs@4.6.0: - resolution: {integrity: sha512-KmjJbWBkYiSRUChcOSa4rtBxDXf0j4ISz+tpeNa4LKIBllgKnkemJ3x4yo4Yydp3wPU4/xJTaKTLLZ8V7zhI7A==} + yargs@4.6.0: dependencies: camelcase: 2.1.1 cliui: 3.2.0 @@ -8722,17 +10371,9 @@ packages: window-size: 0.2.0 y18n: 3.2.2 yargs-parser: 2.4.1 - dev: false - /yn@3.1.1: - resolution: {integrity: sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==} - engines: {node: '>=6'} + yn@3.1.1: {} - /yocto-queue@0.1.0: - resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} - engines: {node: '>=10'} + yocto-queue@0.1.0: {} - /yocto-queue@1.0.0: - resolution: {integrity: sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==} - engines: {node: '>=12.20'} - dev: true + yocto-queue@1.0.0: {} diff --git a/prisma/seed-test.ts b/prisma/seed-test.ts index 8eeda4a..3da165e 100644 --- a/prisma/seed-test.ts +++ b/prisma/seed-test.ts @@ -1,5 +1,10 @@ import { Prisma, PrismaClient } from '@prisma/client'; import { DefaultArgs } from '@prisma/client/runtime/library'; +import dotenv from 'dotenv'; +import dotenvExpand from 'dotenv-expand'; + +const myEnv = dotenv.config(); +dotenvExpand.expand(myEnv); async function main() { const prisma = new PrismaClient({ @@ -46,8 +51,8 @@ function initTestData( tenantPk: 1, provider: 'local', uid: 'test@callgent.com', - // password123 - credentials: '$2b$10$JmQ5gwQevEGI6t.HLrCw3ugQNf9.8KaqC1OaaC5mCMClii.zKveYm', + // Password123 + credentials: '$2b$10$JyBm6mzLb10z4SOH8Y6ZtOUwgNT6QSOGku/fILq8.uolQTvrRI4n.', name: 'test-user', email: 'test@callgent.com', email_verified: true, @@ -83,7 +88,7 @@ function initTestData( callgentId: 'TEST_CALLGENT_ID', type: 'CLIENT', adaptorKey: 'restAPI', - host: '/api/rest/invoke/TEST_CALLGENT_ID/TEST_CEP_ID', + host: '', tenantPk: 1, createdBy: userId, }; @@ -142,36 +147,36 @@ function initTestData( create: cepDto, }) .then((cep) => console.log({ cep })), - // addLlmCache( - // prisma, - // 'map2Endpoints', - // 'given below service endpoints:\nclass new-test-callgent {\n "POST:/boards/list": {"params":[invoker,apiKey], "documents":"This function lists all boards.\n\n@param {Function} invoker - A function that makes the actual API call.\n@param {string} apiKey - Your secret API key.\n\n@returns {Promise} A promise that resolves to an object containing the API result.\n@property {Array} boards - An array of board objects.\n@property {string} boards[].id - A unique identifier for the board.\n@property {string} boards[].created - Time at which the board was created, in ISO 8601 format.\n@property {boolean} boards[].isPrivate - Whether or not the board is set as private in the administrative settings.\n@property {string} boards[].name - The board\'s name.\n@property {number} boards[].postCount - The number of non-deleted posts associated with the board. This number includes posts that are marked as closed or complete.\n@property {boolean} boards[].privateComments - Whether or not comments left on posts can be viewed by other end-users.\n@property {string} boards[].url - The URL to the board\'s page.\n@property {boolean} hasMore - Specifies whether this query returns more boards than the limit."},\n\n}\nand an service `invoker` function.\n\nPlease choose relevant endpoints to fulfill below request:\n{\n"requesting function": "POST:/boards/list",\n"request from": "restAPI",\n"request_object": {"url":"/boards/list","method":"POST","headers":{"host":"127.0.0.1:3300","connection":"close","content-length":"0"},"query":{}},\n}\nand code for request_object to chosen function args mapping. if any data missing/unclear/ambiguous from request_object to invocation args, please ask question to the caller in below json.question field.\n\noutput a single-line json object:\n{ "epName": "the endpoint name to be invoked", "params":"param names of the chosen function", "mapping": "the js function (invoker, request_object)=>{...;return functionArgsArray;}, full implementation to return the **real** args from request_object to invoke the chosen service function. don\'t use data not exist or ambiguous in request", "question": "question to ask the caller if anything not sure or missing for request to args mapping, *no* guess or assumption of the mapping. null if the mapping is crystal clear." }"}', - // '{"endpoint":"POST:/boards/list","args":["invoker","apiKey"],"mapping":"(invoker, request_object)=>{ let apiKey = request_object.params.ids; return [invoker, apiKey]; }","question":"What is the API key for this request? It is not provided in the request_object."}', - // ), - // addLlmCache( - // prisma, - // 'map2Endpoints', - // 'given below service endpoints:\nservice test-callgent {\n "GET /positions": {"summary":"listPositions: List all job positions", "description":"Retrieve a list of all available job positions.", "params":{}, "responses":{"200":{"description":"A list of job positions","content":{"application/json":{"schema":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","description":"Unique identifier for the job position"},"title":{"type":"string","description":"Title of the job position"},"description":{"type":"string","description":"Description of the job position"},"location":{"type":"string","description":"Location of the job position"},"requirements":{"type":"array","items":{"type":"string"},"description":"List of requirements for the job position"},"createdAt":{"type":"string","format":"date-time","description":"Timestamp when the job position was created"},"updatedAt":{"type":"string","format":"date-time","description":"Timestamp when the job position was last updated"}}}}}}},"500":{"description":"Internal Server Error"}} },\n}\n\nPlease choose relevant endpoints to fulfill below request:\n{\n"requesting endpoint": "GET /positions",\n"request from": "restAPI",\n"request_object": {"url":"/positions","method":"GET","headers":{"accept":"*/*","accept-encoding":"gzip, deflate, br","cache-control":"no-cache","connection":"keep-alive","host":"127.0.0.1:3000","user-agent":"Apifox/1.0.0 (https://apifox.com)"},"query":{}},\n}\nand code for request_object to chosen function args mapping. if any data missing/unclear/ambiguous from request_object to invocation args, please ask question to the caller in below json.question field.\n\noutput a single-line json object:\n{ "endpoint": "the chosen API endpoint to be invoked", "args":"params/body/headers/..., with same structure as the \'params\' JSON object(no more args than it) with additional \'value\' prop, or null if no args needed", "mapping": "if the the request_object is structured (or null if unstructured), generate the js function (request_object)=>{...;return API_signature_args;}, full implementation to return the **real** args from request_object to invoke the API. don\'t use data not exist or ambiguous in request", "question": "question to ask the caller if anything not sure or missing for request to args mapping, *no* guess or assumption of the mapping. null if the mapping is crystal clear." }"}', - // '{ "endpoint": "GET /positions", "args": null, "mapping": "(request_object)=>{return null;}", "question": null }', - // ), - // addLlmCache( - // prisma, - // 'map2Endpoints', - // 'given below service endpoints:\nservice test-callgent {\n "POST /api/users/send-confirm-email": {"summary":"UsersController_sendConfirmEmail: Reset password by sending validation email with reset url", "description":" Tags: Users", "params":{"parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"email":{"type":"string","example":"user@example.com","nullable":false},"create":{"type":"boolean","description":"If true, a new user will be created if not exists.","nullable":true},"resetPwd":{"type":"boolean","description":"If set to false, only validating email. Note: new user forces resetPwd.","nullable":true}},"required":["email"]}}}}}, "responses":{"201":{"description":"","content":{"application/json":{"schema":{"allOf":[{"type":"object","properties":{"statusCode":{"type":"number","description":"Status code, empty means success"},"message":{"type":"string"},"data":{"type":"object"},"meta":{"type":"object","description":"Pagination, usage, quotation, profiling, versions, HATEOAS, etc."}},"required":["data"]},{"properties":{"data":{"type":"boolean"}}}]}}}}} },\n}\n\nPlease choose relevant endpoints to fulfill below request:\n{\n"requesting endpoint": "POST /api/users/send-confirm-email",\n"request from": "restAPI",\n"request_object": {"url":"/api/users/send-confirm-email","method":"POST","headers":{"accept":"*/*","accept-encoding":"gzip, deflate, br","cache-control":"no-cache","connection":"keep-alive","content-length":"53","content-type":"application/json","host":"127.0.0.1:3000","user-agent":"Apifox/1.0.0 (https://apifox.com)"},"params":{},"data":{"email":"dev@callgent.com","resetPwd":true}},\n}\nand code for request_object to chosen function args mapping. if any data missing/unclear/ambiguous from request_object to invocation args, please ask question to the caller in below json.question field.\n\noutput a single-line json object:\n{ "endpoint": "the chosen API endpoint to be invoked", "args":"params/body/headers/..., with same structure as the \'params\' JSON object(no more args than it) with additional \'value\' prop, or null if no args needed", "mapping": "if the the request_object is structured (or null if unstructured), generate the js function (request_object)=>{...;return API_signature_args;}, full implementation to return the **real** args from request_object to invoke the API. don\'t use data not exist or ambiguous in request", "question": "question to ask the caller if anything not sure or missing for request to args mapping, *no* guess or assumption of the mapping. null if the mapping is crystal clear." }"}', - // '```json\n{\n "endpoint": "POST /api/users/send-confirm-email",\n "args": {\n "params": null,\n "body": {\n "email": { "value": "dev@callgent.com" },\n "resetPwd": { "value": true }\n },\n "headers": null\n },\n "mapping": "(request_object) => {\n const { data } = request_object;\n return {\n body: {\n email: { value: data.email },\n resetPwd: { value: data.resetPwd }\n }\n };\n }",\n "question": null\n}\n```', - // ), - // addLlmCache( - // prisma, - // 'map2Endpoints', - // 'given below service endpoints:\nservice test-callgent {\n "POST /api/users/send-confirm-email": {"summary":"UsersController_sendConfirmEmail: Reset password by sending validation email with reset url", "description":" Tags: Users", "params":{"parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"email":{"type":"string","example":"user@example.com","nullable":false},"create":{"type":"boolean","description":"If true, a new user will be created if not exists.","nullable":true},"resetPwd":{"type":"boolean","description":"If set to false, only validating email. Note: new user forces resetPwd.","nullable":true}},"required":["email"]}}}}}, "responses":{"201":{"description":"","content":{"application/json":{"schema":{"allOf":[{"type":"object","properties":{"statusCode":{"type":"number","description":"Status code, empty means success"},"message":{"type":"string"},"data":{"type":"object"},"meta":{"type":"object","description":"Pagination, usage, quotation, profiling, versions, HATEOAS, etc."}},"required":["data"]},{"properties":{"data":{"type":"boolean"}}}]}}}}} },\n}\n\nPlease choose relevant endpoints to fulfill below request:\n{\n"requesting endpoint": "POST /api/users/send-confirm-email",\n"request from": "restAPI",\n"request_object": {"url":"/api/users/send-confirm-email","method":"POST","headers":{"accept":"*/*","accept-encoding":"gzip, deflate, br","connection":"keep-alive","content-length":"53","content-type":"application/json","host":"127.0.0.1:3000","user-agent":"Apifox/1.0.0 (https://apifox.com)"},"params":{},"data":{"email":"dev@callgent.com","resetPwd":true}},\n}\nand code for request_object to chosen function args mapping. if any data missing/unclear/ambiguous from request_object to invocation args, please ask question to the caller in below json.question field.\n\noutput a single-line json object:\n{ "endpoint": "the chosen API endpoint to be invoked", "args":"params/body/headers/..., with same structure as the \'params\' JSON object(no more args than it) with additional \'value\' prop, or null if no args needed", "mapping": "if the the request_object is structured (or null if unstructured), generate the js function (request_object)=>{...;return API_signature_args;}, full implementation to return the **real** args from request_object to invoke the API. don\'t use data not exist or ambiguous in request", "question": "question to ask the caller if anything not sure or missing for request to args mapping, *no* guess or assumption of the mapping. null if the mapping is crystal clear." }"}', - // '```json\n{\n "endpoint": "POST /api/users/send-confirm-email",\n "args": {\n "params": null,\n "body": {\n "email": { "value": "dev@callgent.com" },\n "resetPwd": { "value": true }\n },\n "headers": null\n },\n "mapping": "(request_object) => {\n const { data } = request_object;\n return {\n body: {\n email: { value: data.email },\n resetPwd: { value: data.resetPwd }\n }\n };\n }",\n "question": null\n}\n```', - // ), - // addLlmCache( - // prisma, - // 'convert2Response', - // 'Given the openAPI endpoint:\n{"endpoint": "GET /positions", "summary":"listPositions: List all job positions", "description":"Retrieve a list of all available job positions.", "params":{}, "responses":{"200":{"description":"A list of job positions","content":{"application/json":{"schema":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","description":"Unique identifier for the job position"},"title":{"type":"string","description":"Title of the job position"},"description":{"type":"string","description":"Description of the job position"},"location":{"type":"string","description":"Location of the job position"},"requirements":{"type":"array","items":{"type":"string"},"description":"List of requirements for the job position"},"createdAt":{"type":"string","format":"date-time","description":"Timestamp when the job position was created"},"updatedAt":{"type":"string","format":"date-time","description":"Timestamp when the job position was last updated"}}}}}}},"500":{"description":"Internal Server Error"}} }\n\ninvoked with the following request:\n<--- request begin ---\n[]\n--- request end --->\n\nwe receive below response content:\n<--- response begin ---\nWe are pleased to inform you about the following job positions available at our company:\r\n\r\n1. Software Engineer\r\n   - Description: Develop and maintain software applications.\r\n   - Location: San Francisco, CA\r\n   - Requirements:\r\n     - Bachelor\'s degree in Computer Science or related field\r\n     - 3+ years of experience in software development\r\n     - Proficient in Java or Python\r\n   - Created At: October 1, 2023, 12:00 PM\r\n   - Updated At: October 1, 2023, 12:00 PM\r\n\r\n2. Product Manager\r\n   - Description: Define product strategy and roadmap.\r\n   - Location: New York, NY\r\n   - Requirements:\r\n     - Bachelor\'s degree in Business or related field\r\n     - 5+ years of experience in product management\r\n     - Strong analytical and problem-solving skills\r\n   - Created At: October 2, 2023, 10:00 AM\r\n   - Updated At: October 2, 2023, 10:00 AM\r\n\r\n3. Data Scientist\r\n   - Description: Analyze and interpret complex data to assist in decision-making.\r\n   - Location: Seattle, WA\r\n   - Requirements:\r\n     - Master\'s degree in Data Science or related field\r\n     - 2+ years of experience in data analysis\r\n     - Proficient in Python and SQL\r\n   - Created At: October 3, 2023, 8:00 AM\r\n   - Updated At: October 3, 2023, 8:00 AM\r\n\r\nPlease review the details and let us know if you are interested in any of these positions.\r\n\r\nBest regards\r\n> From: "Callgent Invoker"\r\n> Date: Thu, Sep 5, 2024, 14:44\r\n> Subject: [Callgent] Function calling: \'GET /positions\' from Callgent test-callgent. #xY5WGrPph-jn2HHn4_aLi\r\n> To: "dev"\r\n> [image: https://hgggdgi.r.bh.d.sendibt3.com/tr/op/CYIv2yvoVWHCvjQ__eO-QxCY-FkqVvmIPWtQz6OMpAh55LRbe8vKq9aHSdoB0TikwlnXx5U6VsnDPf9637MS7iqb_BpOIcAej4CvQCx2hCA2upHiNg6mXVisqoSvihA0UM9ymGtL9RJsmgdosYMyVW2iHwS9m9UcLtnagkPE-HXmIE8L4EkAApInhajwSZuVsine_ltWzXmBzfU9jp6e5g]\r\n> Hello dev!\r\n> Somebody is calling: \'GET /positions\' from Callgent test-callgent. Below is the detailed request information:\r\n> Function Calling:\r\n> Name:GET /positions\r\n> Summary:listPositions: List all job positions\r\n> Description:Retrieve a list of all available job positions.\r\n> Possible Responses:\r\n> Response OK:A list of job positions\r\n> [{"id":"Unique identifier for the job position","title":"Title of the job position","description":"Description of the job position","location":"Location of the job position","requirements":["string"],"createdAt":"format: date-time, Timestamp when the job position was created","updatedAt":"format: date-time, Timestamp when the job position was last updated"}]\r\n> Response Internal Server Error:Internal Server Error\r\n> \r\n> \r\n> Thu, 05 Sep 2024 06:44:13 GMT\r\n\n--- response end --->\n\nPlease formalize the response content as a single-lined JSON object:\n{"statusCode": "the exact response code(integer) defined in API", "data": "extracted response value with respect to the corresponding API response schema, or undefined if abnormal response", "error": "message": "error message if abnormal response, otherwise undefined"}', - // '{\n "statusCode": 200,\n "data": [\n {\n "id": "1",\n "title": "Software Engineer",\n "description": "Develop and maintain software applications.",\n "location": "San Francisco, CA",\n "requirements": [\n "Bachelor\'s degree in Computer Science or related field",\n "3+ years of experience in software development",\n "Proficient in Java or Python"\n ],\n "createdAt": "2023-10-01T12:00:00Z",\n "updatedAt": "2023-10-01T12:00:00Z"\n },\n {\n "id": "2",\n "title": "Product Manager",\n "description": "Define product strategy and roadmap.",\n "location": "New York, NY",\n "requirements": [\n "Bachelor\'s degree in Business or related field",\n "5+ years of experience in product management",\n "Strong analytical and problem-solving skills"\n ],\n "createdAt": "2023-10-02T10:00:00Z",\n "updatedAt": "2023-10-02T10:00:00Z"\n },\n {\n "id": "3",\n "title": "Data Scientist",\n "description": "Analyze and interpret complex data to assist in decision-making.",\n "location": "Seattle, WA",\n "requirements": [\n "Master\'s degree in Data Science or related field",\n "2+ years of experience in data analysis",\n "Proficient in Python and SQL"\n ],\n "createdAt": "2023-10-03T08:00:00Z",\n "updatedAt": "2023-10-03T08:00:00Z"\n }\n ]\n}', - // ), + addLlmCache( + prisma, + 'map2Endpoints', + 'given below service endpoints:\nclass new-test-callgent {\n "endpoint name: POST:/boards/list": {"params":[invoker,apiKey], "documents":"This function lists all boards.\n\n@param {Function} invoker - A function that makes the actual API call.\n@param {string} apiKey - Your secret API key.\n\n@returns {Promise} A promise that resolves to an object containing the API result.\n@property {Array} boards - An array of board objects.\n@property {string} boards[].id - A unique identifier for the board.\n@property {string} boards[].created - Time at which the board was created, in ISO 8601 format.\n@property {boolean} boards[].isPrivate - Whether or not the board is set as private in the administrative settings.\n@property {string} boards[].name - The board\'s name.\n@property {number} boards[].postCount - The number of non-deleted posts associated with the board. This number includes posts that are marked as closed or complete.\n@property {boolean} boards[].privateComments - Whether or not comments left on posts can be viewed by other end-users.\n@property {string} boards[].url - The URL to the board\'s page.\n@property {boolean} hasMore - Specifies whether this query returns more boards than the limit."},\n\n}\nand an service `invoker` function.\n\nPlease choose one function to fulfill below request:\n{\n"requesting function": "POST:/boards/list",\n"request from": "restAPI",\n"request_object": {"url":"/boards/list","method":"POST","headers":{"host":"127.0.0.1:3300","connection":"close","content-length":"0"},"query":{}},\n}\nand code for request_object to chosen function args mapping. if any data missing/unclear/ambiguous from request_object to invocation args, please ask question to the caller in below json.question field.\n\noutput a single-line json object:\n{ "epName": "the endpoint name to be invoked", "params":"param names of the chosen function", "mapping": "the js function (invoker, request_object)=>{...;return functionArgsArray;}, full implementation to return the **real** args from request_object to invoke the chosen service function. don\'t use data not exist or ambiguous in request", "question": "question to ask the caller if anything not sure or missing for request to args mapping, *no* guess or assumption of the mapping. null if the mapping is crystal clear." }"}', + '{"endpoint":"POST:/boards/list","args":["invoker","apiKey"],"mapping":"(invoker, request_object)=>{ let apiKey = request_object.params.ids; return [invoker, apiKey]; }","question":"What is the API key for this request? It is not provided in the request_object."}', + ), + addLlmCache( + prisma, + 'map2Endpoints', + 'given below service APIs:\nservice test-callgent {\n "API: GET /positions": {"endpoint": "GET /positions", "summary":"listPositions: List all job positions", "description":"Retrieve a list of all available job positions.", "params":{}, "responses":{"200":{"description":"A list of job positions","content":{"application/json":{"schema":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","description":"Unique identifier for the job position"},"title":{"type":"string","description":"Title of the job position"},"description":{"type":"string","description":"Description of the job position"},"location":{"type":"string","description":"Location of the job position"},"requirements":{"type":"array","items":{"type":"string"},"description":"List of requirements for the job position"},"createdAt":{"type":"string","format":"date-time","description":"Timestamp when the job position was created"},"updatedAt":{"type":"string","format":"date-time","description":"Timestamp when the job position was last updated"}}}}}}},"500":{"description":"Internal Server Error"}} },\n}\n\nPlease choose one API to fulfill below request:\n{\n"requesting endpoint": "GET /positions",\n"request from": "restAPI",\n"request_object": {"url":"/positions","method":"GET","headers":{"accept":"*/*","accept-encoding":"gzip, deflate, br","cache-control":"no-cache","connection":"keep-alive","host":"127.0.0.1:3000","user-agent":"Apifox/1.0.0 (https://apifox.com)"},"query":{}},\n}\nand code for request_object to chosen function args mapping. if any data missing/unclear/ambiguous from request_object to invocation args, please ask question to the caller in below json.question field.\n\noutput a single-line json object:\n{ "endpoint": "the chosen API endpoint to be invoked", "args":"params/body/headers/..., with same structure as the \'params\' JSON object(no more args than it) with additional \'value\' prop, or null if no args needed", "mapping": "if the the request_object is structured (or null if unstructured), generate the js function (request_object)=>{...;return API_signature_args;}, full implementation to return the **real** args from request_object to invoke the API. don\'t use data not exist or ambiguous in request", "question": "question to ask the caller if anything not sure or missing for request to args mapping, *no* guess or assumption of the mapping. null if the mapping is crystal clear." }"}', + '{ "endpoint": "GET /positions", "args": null, "mapping": "(request_object)=>{return null;}", "question": null }', + ), + addLlmCache( + prisma, + 'map2Endpoints', + 'given below service APIs:\nservice test-callgent {\n "API: POST /api/users/send-confirm-email": {"endpoint": "POST /api/users/send-confirm-email", "summary":"UsersController_sendConfirmEmail: Reset password by sending validation email with reset url", "description":" Tags: Users", "params":{"parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"email":{"type":"string","example":"user@example.com","nullable":false},"create":{"type":"boolean","description":"If true, a new user will be created if not exists.","nullable":true},"resetPwd":{"type":"boolean","description":"If set to false, only validating email. Note: new user forces resetPwd.","nullable":true}},"required":["email"]}}}}}, "responses":{"201":{"description":"","content":{"application/json":{"schema":{"allOf":[{"type":"object","properties":{"statusCode":{"type":"number","description":"Status code, empty means success"},"message":{"type":"string"},"data":{"type":"object"},"meta":{"type":"object","description":"Pagination, usage, quotation, profiling, versions, HATEOAS, etc."}},"required":["data"]},{"properties":{"data":{"type":"boolean"}}}]}}}}} },\n}\n\nPlease choose one API to fulfill below request:\n{\n"requesting endpoint": "POST /api/users/send-confirm-email",\n"request from": "restAPI",\n"request_object": {"url":"/api/users/send-confirm-email","method":"POST","headers":{"accept":"*/*","accept-encoding":"gzip, deflate, br","cache-control":"no-cache","connection":"keep-alive","content-length":"53","content-type":"application/json","host":"127.0.0.1:3000","user-agent":"Apifox/1.0.0 (https://apifox.com)"},"params":{},"data":{"email":"dev@callgent.com","resetPwd":true}},\n}\nand code for request_object to chosen function args mapping. if any data missing/unclear/ambiguous from request_object to invocation args, please ask question to the caller in below json.question field.\n\noutput a single-line json object:\n{ "endpoint": "the chosen API endpoint to be invoked", "args":"params/body/headers/..., with same structure as the \'params\' JSON object(no more args than it) with additional \'value\' prop, or null if no args needed", "mapping": "if the the request_object is structured (or null if unstructured), generate the js function (request_object)=>{...;return API_signature_args;}, full implementation to return the **real** args from request_object to invoke the API. don\'t use data not exist or ambiguous in request", "question": "question to ask the caller if anything not sure or missing for request to args mapping, *no* guess or assumption of the mapping. null if the mapping is crystal clear." }"}', + '```json\n{\n "endpoint": "POST /api/users/send-confirm-email",\n "args": {\n "params": null,\n "body": {\n "email": { "value": "dev@callgent.com" },\n "resetPwd": { "value": true }\n },\n "headers": null\n },\n "mapping": "(request_object) => {\n const { data } = request_object;\n return {\n body: {\n email: { value: data.email },\n resetPwd: { value: data.resetPwd }\n }\n };\n }",\n "question": null\n}\n```', + ), + addLlmCache( + prisma, + 'map2Endpoints', + 'given below service APIs:\nservice test-callgent {\n "API: POST /api/users/send-confirm-email": {"endpoint": "POST /api/users/send-confirm-email", "summary":"UsersController_sendConfirmEmail: Reset password by sending validation email with reset url", "description":" Tags: Users", "params":{"parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"email":{"type":"string","example":"user@example.com","nullable":false},"create":{"type":"boolean","description":"If true, a new user will be created if not exists.","nullable":true},"resetPwd":{"type":"boolean","description":"If set to false, only validating email. Note: new user forces resetPwd.","nullable":true}},"required":["email"]}}}}}, "responses":{"201":{"description":"","content":{"application/json":{"schema":{"allOf":[{"type":"object","properties":{"statusCode":{"type":"number","description":"Status code, empty means success"},"message":{"type":"string"},"data":{"type":"object"},"meta":{"type":"object","description":"Pagination, usage, quotation, profiling, versions, HATEOAS, etc."}},"required":["data"]},{"properties":{"data":{"type":"boolean"}}}]}}}}} },\n}\n\nPlease choose one API to fulfill below request:\n{\n"requesting endpoint": "POST /api/users/send-confirm-email",\n"request from": "restAPI",\n"request_object": {"url":"/api/users/send-confirm-email","method":"POST","headers":{"accept":"*/*","accept-encoding":"gzip, deflate, br","connection":"keep-alive","content-length":"53","content-type":"application/json","host":"127.0.0.1:3000","user-agent":"Apifox/1.0.0 (https://apifox.com)"},"params":{},"data":{"email":"dev@callgent.com","resetPwd":true}},\n}\nand code for request_object to chosen function args mapping. if any data missing/unclear/ambiguous from request_object to invocation args, please ask question to the caller in below json.question field.\n\noutput a single-line json object:\n{ "endpoint": "the chosen API endpoint to be invoked", "args":"params/body/headers/..., with same structure as the \'params\' JSON object(no more args than it) with additional \'value\' prop, or null if no args needed", "mapping": "if the the request_object is structured (or null if unstructured), generate the js function (request_object)=>{...;return API_signature_args;}, full implementation to return the **real** args from request_object to invoke the API. don\'t use data not exist or ambiguous in request", "question": "question to ask the caller if anything not sure or missing for request to args mapping, *no* guess or assumption of the mapping. null if the mapping is crystal clear." }"}', + '```json\n{\n "endpoint": "POST /api/users/send-confirm-email",\n "args": {\n "params": null,\n "body": {\n "email": { "value": "dev@callgent.com" },\n "resetPwd": { "value": true }\n },\n "headers": null\n },\n "mapping": "(request_object) => {\n const { data } = request_object;\n return {\n body: {\n email: { value: data.email },\n resetPwd: { value: data.resetPwd }\n }\n };\n }",\n "question": null\n}\n```', + ), + addLlmCache( + prisma, + 'convert2Response', + 'Given the openAPI endpoint:\n{"endpoint": "GET /positions", "summary":"listPositions: List all job positions", "description":"Retrieve a list of all available job positions.", "params":{}, "responses":{"200":{"description":"A list of job positions","content":{"application/json":{"schema":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","description":"Unique identifier for the job position"},"title":{"type":"string","description":"Title of the job position"},"description":{"type":"string","description":"Description of the job position"},"location":{"type":"string","description":"Location of the job position"},"requirements":{"type":"array","items":{"type":"string"},"description":"List of requirements for the job position"},"createdAt":{"type":"string","format":"date-time","description":"Timestamp when the job position was created"},"updatedAt":{"type":"string","format":"date-time","description":"Timestamp when the job position was last updated"}}}}}}},"500":{"description":"Internal Server Error"}} }\n\ninvoked with the following request:\n<--- request begin ---\n[]\n--- request end --->\n\nwe receive below response content:\n<--- response begin ---\nWe are pleased to inform you about the following job positions available at our company:\r\n\r\n1. Software Engineer\r\n   - Description: Develop and maintain software applications.\r\n   - Location: San Francisco, CA\r\n   - Requirements:\r\n     - Bachelor\'s degree in Computer Science or related field\r\n     - 3+ years of experience in software development\r\n     - Proficient in Java or Python\r\n   - Created At: October 1, 2023, 12:00 PM\r\n   - Updated At: October 1, 2023, 12:00 PM\r\n\r\n2. Product Manager\r\n   - Description: Define product strategy and roadmap.\r\n   - Location: New York, NY\r\n   - Requirements:\r\n     - Bachelor\'s degree in Business or related field\r\n     - 5+ years of experience in product management\r\n     - Strong analytical and problem-solving skills\r\n   - Created At: October 2, 2023, 10:00 AM\r\n   - Updated At: October 2, 2023, 10:00 AM\r\n\r\n3. Data Scientist\r\n   - Description: Analyze and interpret complex data to assist in decision-making.\r\n   - Location: Seattle, WA\r\n   - Requirements:\r\n     - Master\'s degree in Data Science or related field\r\n     - 2+ years of experience in data analysis\r\n     - Proficient in Python and SQL\r\n   - Created At: October 3, 2023, 8:00 AM\r\n   - Updated At: October 3, 2023, 8:00 AM\r\n\r\nPlease review the details and let us know if you are interested in any of these positions.\r\n\r\nBest regards\r\n> From: "Callgent Invoker"\r\n> Date: Thu, Sep 5, 2024, 14:44\r\n> Subject: [Callgent] Function calling: \'GET /positions\' from Callgent test-callgent. #xY5WGrPph-jn2HHn4_aLi\r\n> To: "dev"\r\n> [image: https://hgggdgi.r.bh.d.sendibt3.com/tr/op/CYIv2yvoVWHCvjQ__eO-QxCY-FkqVvmIPWtQz6OMpAh55LRbe8vKq9aHSdoB0TikwlnXx5U6VsnDPf9637MS7iqb_BpOIcAej4CvQCx2hCA2upHiNg6mXVisqoSvihA0UM9ymGtL9RJsmgdosYMyVW2iHwS9m9UcLtnagkPE-HXmIE8L4EkAApInhajwSZuVsine_ltWzXmBzfU9jp6e5g]\r\n> Hello dev!\r\n> Somebody is calling: \'GET /positions\' from Callgent test-callgent. Below is the detailed request information:\r\n> Function Calling:\r\n> Name:GET /positions\r\n> Summary:listPositions: List all job positions\r\n> Description:Retrieve a list of all available job positions.\r\n> Possible Responses:\r\n> Response OK:A list of job positions\r\n> [{"id":"Unique identifier for the job position","title":"Title of the job position","description":"Description of the job position","location":"Location of the job position","requirements":["string"],"createdAt":"format: date-time, Timestamp when the job position was created","updatedAt":"format: date-time, Timestamp when the job position was last updated"}]\r\n> Response Internal Server Error:Internal Server Error\r\n> \r\n> \r\n> Thu, 05 Sep 2024 06:44:13 GMT\r\n\n--- response end --->\n\nPlease formalize the response content as a single-lined JSON object:\n{"statusCode": "the exact response code(integer) defined in API", "data": "extracted response value with respect to the corresponding API response schema, or undefined if abnormal response", "error": "message": "error message if abnormal response, otherwise undefined"}', + '{\n "statusCode": 200,\n "data": [\n {\n "id": "1",\n "title": "Software Engineer",\n "description": "Develop and maintain software applications.",\n "location": "San Francisco, CA",\n "requirements": [\n "Bachelor\'s degree in Computer Science or related field",\n "3+ years of experience in software development",\n "Proficient in Java or Python"\n ],\n "createdAt": "2023-10-01T12:00:00Z",\n "updatedAt": "2023-10-01T12:00:00Z"\n },\n {\n "id": "2",\n "title": "Product Manager",\n "description": "Define product strategy and roadmap.",\n "location": "New York, NY",\n "requirements": [\n "Bachelor\'s degree in Business or related field",\n "5+ years of experience in product management",\n "Strong analytical and problem-solving skills"\n ],\n "createdAt": "2023-10-02T10:00:00Z",\n "updatedAt": "2023-10-02T10:00:00Z"\n },\n {\n "id": "3",\n "title": "Data Scientist",\n "description": "Analyze and interpret complex data to assist in decision-making.",\n "location": "Seattle, WA",\n "requirements": [\n "Master\'s degree in Data Science or related field",\n "2+ years of experience in data analysis",\n "Proficient in Python and SQL"\n ],\n "createdAt": "2023-10-03T08:00:00Z",\n "updatedAt": "2023-10-03T08:00:00Z"\n }\n ]\n}', + ), ]; } diff --git a/src/users/users.service.ts b/src/users/users.service.ts index 4ba41a1..e3fa930 100644 --- a/src/users/users.service.ts +++ b/src/users/users.service.ts @@ -50,6 +50,7 @@ export class UsersService { let valid = !!ui?.credentials; valid = valid && (await Utils.hashCompare(password, ui.credentials)); + // Utils.hashSalted(password).then((s)=>console.log(s)); if (valid) return ui.user; throw new UnauthorizedException(); From 4e025b114aa562c1ced9dc01b2e7d8a9fd0e69a0 Mon Sep 17 00:00:00 2001 From: dev-callgent Date: Thu, 31 Oct 2024 21:20:00 +0800 Subject: [PATCH 118/183] refactor: event object structure Signed-off-by: dev-callgent --- prisma/schema.prisma | 2 +- src/agents/agents.service.ts | 15 ++++++------- src/agents/llm.service.ts | 7 ++++++- .../callgent-realms.service.ts | 4 ++-- .../processors/api-key-auth.processor.ts | 2 +- .../processors/http-auth.processor.ts | 2 +- .../listeners/request-relay-event.listener.ts | 4 +--- src/endpoints/endpoints.service.ts | 2 +- .../builtin/restapi/restapi.adaptor.ts | 2 +- .../builtin/restapi/restapi.controller.ts | 13 +++++++++--- src/entries/events/client-request.event.ts | 13 +++++++++++- .../event-listeners.service.ts | 6 +++--- src/event-listeners/event-object.ts | 21 ++++++++++++++++--- src/event-stores/event-stores.service.ts | 5 ++++- .../repo/tenancy/prisma-tenancy.service.ts | 6 +++--- src/task-actions/task-actions.service.ts | 4 ++-- 16 files changed, 74 insertions(+), 34 deletions(-) diff --git a/prisma/schema.prisma b/prisma/schema.prisma index d947c9a..71302a8 100644 --- a/prisma/schema.prisma +++ b/prisma/schema.prisma @@ -598,7 +598,7 @@ model EventStore { /// @Description callback type, 'URL' or 'EVENT' callbackType EventCallbackType @default(EVENT) - data Json? @db.Json + // data Json? @db.Json context Json? @db.Json /// @description statusCode, 1: processing, 0: done, 2: pending: waiting for external event trigger to to resume calling current-listener.funName, <0: error diff --git a/src/agents/agents.service.ts b/src/agents/agents.service.ts index a952984..4acfe2c 100644 --- a/src/agents/agents.service.ts +++ b/src/agents/agents.service.ts @@ -53,7 +53,7 @@ export class AgentsService { // FIXME map from all taskId events // if epName, try find mapArgs function by [cepAdaptor, epName] - const mapped = await (reqEvent.data.epName + const mapped = await (reqEvent.context.epName ? this._map2Endpoint(reqEvent) : this._map2Endpoints(reqEvent)); if (!mapped) return; @@ -68,8 +68,7 @@ export class AgentsService { id, srcId, dataType: cenAdaptor, - data: { callgentName, epName }, - context: { endpoints, tgtEvents, req }, + context: { callgentName, epName, endpoints, req, tgtEvents }, } = reqEvent; const endpoint: EndpointDto = endpoints[0]; @@ -89,9 +88,12 @@ export class AgentsService { 'map2Endpoint', { req, epName, callgentName, cepAdaptor: cenAdaptor, endpoints }, { - returnType: { req2Args: '', args: {} }, + returnType: { req2Args: '' }, bizKey: id, - validate: (data) => ((data.args = eval(data.req2Args)(req)), true), + validate: (data) => ( + ((data as any).args = new Function('return ' + data.req2Args)()(req)), + true + ), }, ); return mapped; @@ -102,8 +104,7 @@ export class AgentsService { id, srcId, dataType: cenAdaptor, - data: { callgentName, epName, progressive }, - context: { endpoints, tgtEvents, req }, + context: { callgentName, epName, progressive, endpoints, req, tgtEvents }, } = reqEvent; const mapped = await this.llmService.template( diff --git a/src/agents/llm.service.ts b/src/agents/llm.service.ts index d81917e..9d10bc9 100644 --- a/src/agents/llm.service.ts +++ b/src/agents/llm.service.ts @@ -95,7 +95,12 @@ export class LLMService { maxRetry = i + 2; // force retry } if (!valid) { - this.logger.warn('Fail validating generated content, %s, %j', template, ret); + this.logger.warn( + 'Fail validating generated content, %s,\n%s\n%j', + template, + prompt, + ret, + ); throw new Error('Fail validating generated content, ' + template); } if (notCached) await this._llmCache(template, llmModel, prompt, result); diff --git a/src/callgent-realms/callgent-realms.service.ts b/src/callgent-realms/callgent-realms.service.ts index 539cba1..43cc458 100644 --- a/src/callgent-realms/callgent-realms.service.ts +++ b/src/callgent-realms/callgent-realms.service.ts @@ -162,7 +162,7 @@ export class CallgentRealmsService implements OnModuleInit { //// auth check start, auth config end //// /** same as sep auth, except token cannot be attached to request event */ - async checkCepAuth( + async checkCenAuth( reqEvent: ClientRequestEvent, ): Promise { const cep = await this.entriesService.findOne(reqEvent.srcId); @@ -246,7 +246,7 @@ export class CallgentRealmsService implements OnModuleInit { if (!realm?.enabled) return false; // read existing from token store - const userToken = await this.findUserToken(realm, reqEvent.data.callerId); + const userToken = await this.findUserToken(realm, reqEvent.context.callerId); if (userToken) { // invoke validation url. TODO security as arg const result = await processor.validateToken( diff --git a/src/callgent-realms/processors/api-key-auth.processor.ts b/src/callgent-realms/processors/api-key-auth.processor.ts index fa97051..db97dd9 100644 --- a/src/callgent-realms/processors/api-key-auth.processor.ts +++ b/src/callgent-realms/processors/api-key-auth.processor.ts @@ -110,7 +110,7 @@ export class ApiKeyAuthProcessor extends AuthProcessor { ): Promise { // {"type":"apiKey","in":"header","name":"x-callgent-authorization","provider":"api.callgent.com"} const scheme: APIKeySecurityScheme = realm.scheme as any; - const req = reqEvent.context.req as any; + const req = reqEvent.context.req; const [name, value] = [scheme.name, realm.secret as string]; let in0 = scheme.in; diff --git a/src/callgent-realms/processors/http-auth.processor.ts b/src/callgent-realms/processors/http-auth.processor.ts index 1ef780f..30dcb0a 100644 --- a/src/callgent-realms/processors/http-auth.processor.ts +++ b/src/callgent-realms/processors/http-auth.processor.ts @@ -102,7 +102,7 @@ export class HttpAuthProcessor extends AuthProcessor { ): Promise { // {"type":"apiKey","in":"header","name":"x-callgent-authorization","provider":"api.callgent.com"} const scheme: APIKeySecurityScheme = realm.scheme as any; - const req = reqEvent.context.req as any; + const req = reqEvent.context.req; const [name, value] = [scheme.name, realm.secret as string]; let in0 = scheme.in; diff --git a/src/emails/listeners/request-relay-event.listener.ts b/src/emails/listeners/request-relay-event.listener.ts index 8bf5808..da1172a 100644 --- a/src/emails/listeners/request-relay-event.listener.ts +++ b/src/emails/listeners/request-relay-event.listener.ts @@ -26,9 +26,7 @@ export class RequestRelayListener { reqEventId, ); - reqEvent.data - ? ((reqEvent.data as JsonObject).resp = resp) - : (reqEvent.data = { resp }); + (reqEvent.context as JsonObject).resp = resp; // resuming event chain await this.eventListenersService.resume(reqEvent); diff --git a/src/endpoints/endpoints.service.ts b/src/endpoints/endpoints.service.ts index 2595cba..cc90f98 100644 --- a/src/endpoints/endpoints.service.ts +++ b/src/endpoints/endpoints.service.ts @@ -48,7 +48,7 @@ export class EndpointsService { async loadEndpoints( reqEvent: ClientRequestEvent, ): Promise { - const { epName, callgentId } = reqEvent.data; + const { epName, callgentId } = reqEvent.context; // TODO if too many endpoints, use summary first const { data: eps } = await this.findMany({ diff --git a/src/entries/adaptors/builtin/restapi/restapi.adaptor.ts b/src/entries/adaptors/builtin/restapi/restapi.adaptor.ts index 1ead992..5c825b0 100644 --- a/src/entries/adaptors/builtin/restapi/restapi.adaptor.ts +++ b/src/entries/adaptors/builtin/restapi/restapi.adaptor.ts @@ -135,7 +135,7 @@ export class RestAPIAdaptor extends EntryAdaptor { ); const { callback, - data: { progressive }, + context: { progressive }, } = reqEvent; // read callback from cep config diff --git a/src/entries/adaptors/builtin/restapi/restapi.controller.ts b/src/entries/adaptors/builtin/restapi/restapi.controller.ts index 916a577..042da8d 100644 --- a/src/entries/adaptors/builtin/restapi/restapi.controller.ts +++ b/src/entries/adaptors/builtin/restapi/restapi.controller.ts @@ -120,7 +120,11 @@ export class RestApiController { if (!callgent) throw new NotFoundException('callgent not found: ' + callgentId); - const result = await this.eventListenersService.emit( + const { + statusCode: code, + data, + message, + } = await this.eventListenersService.emit( new ClientRequestEvent( cep.id, cep.adaptorKey, @@ -137,10 +141,13 @@ export class RestApiController { ), parseInt(timeout) || 0, // sync timeout ); + const ctx = data?.context; // FIXME data - const code = result.statusCode || 200; + const statusCode = code || 200; // code cannot < 0 - res.status(code < 0 ? 418 : code < 200 ? 200 : code).send(result); + res + .status(statusCode < 0 ? 418 : statusCode < 200 ? 200 : statusCode) + .send({ data: { ...data, response: ctx.resp }, statusCode, message }); } @ApiOperation({ diff --git a/src/entries/events/client-request.event.ts b/src/entries/events/client-request.event.ts index 79ae5a2..b2ab3e4 100644 --- a/src/entries/events/client-request.event.ts +++ b/src/entries/events/client-request.event.ts @@ -15,7 +15,7 @@ export class ClientRequestEvent extends EventObject { dataType: string, req: object, taskId: string, - public readonly data: { + context: { callgentId: string; callgentName: string; /** empty means anonymous */ @@ -28,6 +28,17 @@ export class ClientRequestEvent extends EventObject { callback?: string, ) { super(entryId, 'CLIENT_REQUEST', dataType, taskId, callback, 'URL'); + Object.assign(this.context, context); this.context.req = req; } + public declare readonly context: { + req: any; + resp?: any; + callgentId: string; + callgentName: string; + callerId?: string; + epName?: string; + progressive?: string; + [key: string]: any; + }; } diff --git a/src/event-listeners/event-listeners.service.ts b/src/event-listeners/event-listeners.service.ts index 9f1855d..c0b8c96 100644 --- a/src/event-listeners/event-listeners.service.ts +++ b/src/event-listeners/event-listeners.service.ts @@ -54,7 +54,7 @@ export class EventListenersService { ? Promise.race([ result, Utils.sleep(timeout).then(() => ({ - data: { ...data, context: undefined }, + data, statusCode: 1, message: `Sync invocation timeout(${timeout}ms), will respond via callback`, })), @@ -150,14 +150,14 @@ export class EventListenersService { e.response?.data?.message || `[${e.name}] ${e.message}`; e.status < 500 || this.logger.error(e); return { - data: { ...event, context: undefined }, + data: event, statusCode, message, }; } } return { - data: { ...event, context: undefined }, + data: event, statusCode, }; } finally { diff --git a/src/event-listeners/event-object.ts b/src/event-listeners/event-object.ts index 563ffac..1b6d5fe 100644 --- a/src/event-listeners/event-object.ts +++ b/src/event-listeners/event-object.ts @@ -14,9 +14,24 @@ export class EventObject { public readonly callbackType: EventCallbackType = 'EVENT', ) { this.id = Utils.uuid(); + + Object.defineProperty(this, 'context', { + value: {}, + enumerable: false, + }); + Object.defineProperty(this, 'stopPropagation', { + value: false, + writable: true, + enumerable: false, + }); + Object.defineProperty(this, 'preventDefault', { + value: false, + writable: true, + enumerable: false, + }); } public readonly id: string; - public readonly context: { [key: string]: any } = {}; - public stopPropagation = false; - public preventDefault = false; + public declare readonly context: { [key: string]: any }; + public declare stopPropagation: boolean; + public declare preventDefault: boolean; } diff --git a/src/event-stores/event-stores.service.ts b/src/event-stores/event-stores.service.ts index 6319bf5..d4e320e 100644 --- a/src/event-stores/event-stores.service.ts +++ b/src/event-stores/event-stores.service.ts @@ -18,7 +18,7 @@ export class EventStoresService { const prisma = this.txHost.tx as PrismaClient; const es = await prisma.eventStore.findMany({ - select: { id: true, eventType: true, dataType: true, data: true }, // TODO, what to select + select: { id: true, eventType: true, dataType: true }, // TODO, what to select where: { AND: [{ NOT: { id } }, { taskId }] }, orderBy: { id: 'asc' }, }); @@ -51,6 +51,9 @@ export class EventStoresService { const prisma = this.txHost.tx as PrismaClient; const data: Prisma.EventStoreCreateInput = { ...event, + context: event.context, + stopPropagation: event.stopPropagation, + preventDefault: event.preventDefault, funName, listenerId, }; diff --git a/src/infra/repo/tenancy/prisma-tenancy.service.ts b/src/infra/repo/tenancy/prisma-tenancy.service.ts index ccc6179..f39fafb 100644 --- a/src/infra/repo/tenancy/prisma-tenancy.service.ts +++ b/src/infra/repo/tenancy/prisma-tenancy.service.ts @@ -18,9 +18,9 @@ export class PrismaTenancyService { } /** - * @param on `bypass` if true, this is default behavior + * @param bypass default true */ - async bypassTenancy(tx: PrismaClient, on = true) { - return tx.$executeRaw`SELECT set_config('tenancy.bypass_rls', 'on', ${on})`; + async bypassTenancy(tx: PrismaClient, bypass = true) { + return tx.$executeRaw`SELECT set_config('tenancy.bypass_rls', 'on', ${bypass})`; } } diff --git a/src/task-actions/task-actions.service.ts b/src/task-actions/task-actions.service.ts index 217116e..d041b34 100644 --- a/src/task-actions/task-actions.service.ts +++ b/src/task-actions/task-actions.service.ts @@ -21,7 +21,7 @@ export class TaskActionsService { /** create task action for client request. */ // @Transactional() // async createTaskAction(reqEvent: ClientRequestEvent) { - // const { taskId, caller, progressive, callback, funName } = reqEvent.data; + // const { taskId, caller, progressive, callback, funName } = reqEvent.context; // const req = (reqEvent.processed.req || reqEvent.context.req) as any; // // new task @@ -45,7 +45,7 @@ export class TaskActionsService { // // TODO: some action needn't persist, e.g. (action && !taskId) // const prisma = this.txHost.tx as PrismaClient; // await prisma.taskAction.create({ data }); - // reqEvent.data.taskId = task.id; + // reqEvent.taskId = task.id; // reqEvent.processed.taskActionId = data.id; // } From 0b354dc67700d5bf79910a652aa4102ecb8e37cd Mon Sep 17 00:00:00 2001 From: dev-callgent Date: Thu, 31 Oct 2024 21:21:09 +0800 Subject: [PATCH 119/183] feat: generate vue app Signed-off-by: dev-callgent --- .env.dev | 5 +- prisma/seed.ts | 88 ++++++++++++------- src/agents/agents.service.ts | 24 ++--- .../adaptors/builtin/web/webpage.service.ts | 39 ++++---- 4 files changed, 91 insertions(+), 65 deletions(-) diff --git a/.env.dev b/.env.dev index c530c93..57aa703 100644 --- a/.env.dev +++ b/.env.dev @@ -52,6 +52,7 @@ GITHUB_OAUTH_CLIENT_SECRET = 76dc98b5554636b5c924cd4854ad3f62e4f0cc3b GOOGLE_OAUTH_CLIENT_ID = 183236050953-rg2khnknb0tif2a5urepho0k22call16.apps.googleusercontent.com GOOGLE_OAUTH_CLIENT_SECRET = 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 +# LLM_MODELS=["anthropic/claude-3.5-sonnet"] # "openai/gpt-4o-2024-08-06"] # "openai/gpt-4o-mini"] LLM_MODELS=["google/gemini-flash-1.5-8b-exp","meta-llama/llama-3.1-70b-instruct:free","nousresearch/hermes-3-llama-3.1-405b:free"] LLM_CACHE_ENABLE=1 OPENROUTER_API_KEY=sk-or-v1-your-api-key @@ -71,5 +72,5 @@ EMAIL_SPARKPOST_RELAY_EXPIRES_IN=86400 # slow sql threshold, default 10000 SLOW_SQL_THRESHOLD=10000 -WEBPAGE_PACKAGES_COMPONENT=["vue@3.5.12","vue-router@4.4.5","element-plus@2.8.6","vee-validate@4.14.6","yup@1.4.0"] -WEBPAGE_PACKAGES_STORE=["pinia@2.2.4","axios@1.7.7"] +WEBPAGE_PACKAGES_COMPONENT=["vue@3.5.12","vue-router@4.4.5","element-plus@2.8.6","vee-validate@4.14.6","yup@1.4.0","pinia@2.2.4","axios@1.7.7"] +WEBPAGE_PACKAGES_STORE=[] diff --git a/prisma/seed.ts b/prisma/seed.ts index 2d19b25..24f73e4 100644 --- a/prisma/seed.ts +++ b/prisma/seed.ts @@ -67,7 +67,7 @@ function initEventListeners( dataType: '*', serviceType: 'SERVICE', serviceName: 'CallgentRealmsService', - funName: 'checkCepAuth', + funName: 'checkCenAuth', description: 'Auth-check before cep invocation. current security: reqEvent.context.security: RealmSecurityVO[]', createdBy: 'GLOBAL', @@ -211,7 +211,8 @@ Please generate js function req2Args(request) to map below request into endpoint const request_object = {{=JSON.stringify(it.req)}}; output single-line json object below: -{ "req2Args": "Full code of js function req2Args(request_object):ArgsMap, to map request into endpoint args. ArgsMap is a k-v map of vars in endpoint.params(no conflict keys, no more props than it, especially requestBody's key is '$requestBody$'), all values just extracted from request_object, but no direct constant in code from request_object, all calculated from request_object props as variables!" }`, +{ "req2Args": "Full code of js function req2Args(request_object):ArgsMap, to map request into endpoint args. ArgsMap is a k-v map of vars in endpoint.params(no conflict keys, no more props than it, especially requestBody's key is '$requestBody$'), all values just extracted from request_object, but no direct constant in code from request_object, all calculated from request_object props as variables!" }, +output just json no explanation`, }, { name: 'map2Endpoints', @@ -322,7 +323,9 @@ There are 6 steps to generate code to fulfil the requirement: 6. generate /src/App.vue, /src/main.js Now let's goto #1, as world-class frontend expert, please design necessary simple view pages, output a single-lined json object: -{ "views": {[FormalViewName: string]: {"url": "route url", "file": "/src/views/{file-name}.vue", "title":"view title", "summary":"brief summary of use cases", "instruction": "Description of interactive prototype(layout, elements, operations, dynamic effects, etc) to guide developer to implement", "distance":"integer to indicate distance of the view to root view, 0 means root"}}, "/src/router/index.js": "full implementation code, no process.env.*!" }`, +{ "views": {[FormalViewName: string]: {"url": "route url", "file": "/src/views/{file-name}.vue", "title":"view title", "summary":"brief summary of use cases", "instruction": "Description of interactive prototype(layout, elements, operations, dynamic effects, etc) to guide developer to implement", "distance":"integer to indicate distance of the view to root view, 0 means root"}}, "/src/router/index.js": "full implementation code, route name must same with component name; no process.env.*!" } +after generation before output, double-check to meet all rule: +- FormalViewName must suffix with 'View'`, }, // TODO component tree { @@ -335,8 +338,8 @@ Now let's goto #1, as world-class frontend expert, please design necessary simpl and existing UI components: {{=JSON.stringify(it.components)}}, -Depending on the packages stack: [{{=it.packages}}], use these components for best practice, -As world-class frontend architect, please design simple components(not embedded into each other, each with single responsibility and minimal props) for entire view \`{{=it.view.name}}\`, which are back-ended by service endpoints: [{{~ it.endpoints :ep }} +Depending on the installed packages: [{{=it.packages}}], use these components libraries for best practice, +As world-class frontend architect, please design simple components(not embedded into each other; and minimal props) for entire view \`{{=it.view.name}}\`, which are back-ended by service endpoints: [{{~ it.endpoints :ep }} { "id": "{{=ep.name}}", "summary":"{{=ep.summary}}", {{=ep.description ? '"description":"'+ep.description+'", ':''}}"params": {{=JSON.stringify(ep.params)}} },{{~}} ], Note: all API params are already documented here! Components access them only via store states/actions. @@ -344,7 +347,9 @@ Note: all API params are already documented here! Components access them only vi Please refine existing or add new components for view \`{{=it.view.name}}\`, output a single-lined json object: { [FormalComponentName: string]: {"file": "/src/components/{file-name}.vue", "endpoints":["endpoint ids(METHOD /resource/url), which **may** be used by the component", "may empty array" ..], "summary":"precise summary to let developers correctly use the component without reading the code!", "instruction": "Description of interactive prototype(layout, elements, operations, dynamic effects, etc) to guide developer to implement. ignore auth logic, which is handled outside of the VUE app" }} After design before output, please redesign to meet rules: -- Assigning single responsibilities to each component +- FormalComponentName must suffix with 'Component' +- to strictly prohibit importing any stores into this view, the designed components in view only interact with each other via shared pinia stores! +- using ui components in installed packages is strongly encouraged over creating our own - Not missing any components or service endpoints for the \`{{=it.view.name}}\` view functionalities, yet make the view as simple as possible - Not including functionalities from other views, we'll design them later - component props are prohibited, all state goes into pinia stores @@ -352,63 +357,78 @@ After design before output, please redesign to meet rules: - if \`endpoints\` empty, please describe brief store actions logic in \`instruction\` - describe interactive dynamics between components in \`instruction\``, }, - { - name: 'genVue3Apis', - prompt: `Given proposed UI components of a Vue3+Pinia app: [{{~ it.compsList :comp }} - { "name": "{{=comp.name}}", "props": {{=JSON.stringify(comp.props)}}, "summary":"{{=comp.summary}}", "instruction": "{{=comp.instruction}}" },{{~}} -], +// { +// name: 'genVue3Apis', +// prompt: `Given proposed UI components of a Vue3+Pinia app: [{{~ it.compsList :comp }} +// { "name": "{{=comp.name}}", "props": {{=JSON.stringify(comp.props)}}, "summary":"{{=comp.summary}}", "instruction": "{{=comp.instruction}}" },{{~}} +// ], -Back-ended with the following service APIs: -Service \`{{=it.callgent.name}}\` { "summary": "{{=it.callgent.summary}}", "instruction": "{{=it.callgent.instruction}}", "endpoints": [{{~ it.endpoints :ep }} - { "id": "{{=ep.name}}", "summary":"{{=ep.summary}}", {{=ep.description ? '"description":"'+ep.description+'", ':''}}"parameters": {{=JSON.stringify(ep.params)}} },{{~}} - ] -}, +// Back-ended with the following service APIs: +// Service \`{{=it.callgent.name}}\` { "summary": "{{=it.callgent.summary}}", "instruction": "{{=it.callgent.instruction}}", "endpoints": [{{~ it.endpoints :ep }} +// { "id": "{{=ep.name}}", "summary":"{{=ep.summary}}", {{=ep.description ? '"description":"'+ep.description+'", ':''}}"parameters": {{=JSON.stringify(ep.params)}} },{{~}} +// ] +// }, -As world-class frontend expert, please adjust/remove components to fit APIs params, even if it means reducing the required functionality! -Note: all API params are totally listed above! -output a single-lined json object: -{[ComponentName: string]: {"endpoints":["endpoint ids(METHOD /resource/url), which \`may\` be used by the component", ..], "removed": "mark current component as removed if APIs can't fulfill the functionality, then set component's other attributes to empty.", "props": ["similar to function params. please use store state as possible", "must remove unsupported props, may empty", ..], "summary":"Adjusted summary", "instruction": "Adjusted instruction"} }`, - }, +// As world-class frontend expert, please adjust/remove components to fit APIs params, even if it means reducing the required functionality! +// Note: all API params are totally listed above! +// output a single-lined json object: +// {[ComponentName: string]: {"endpoints":["endpoint ids(METHOD /resource/url), which \`may\` be used by the component", ..], "removed": "mark current component as removed if APIs can't fulfill the functionality, then set component's other attributes to empty.", "props": ["similar to function params. please use store state as possible", "must remove unsupported props, may empty", ..], "summary":"Adjusted summary", "instruction": "Adjusted instruction"} }`, +// }, { - name: 'genVue4Component', + name: 'genVue3Component', prompt: `For Vue3+Pinia app with components structure: { - "components": {{=JSON.stringify(it.components)}}, + "relatedComponents": {{=JSON.stringify(it.components)}}, "relatedViews": {{=JSON.stringify(it.relatedViews)}}, "otherViews": {{=JSON.stringify(it.otherViews)}}, - "stores": {{=JSON.stringify(it.stores)}}, - "packages": {{=JSON.stringify(it.packages)}} + "existingStores": {{=JSON.stringify(it.stores)}}, + "installedPackages": {{=JSON.stringify(it.packages)}} }; -As world-class frontend expert, please write \`{{=it.components[0].file}}\` full code based on it's instruction and endpoint APIs(especially props). +As world-class frontend expert, please write \`{{=it.components[0].file}}\` full code based on it's instruction and endpoint APIs(especially params). the component must import relevant \`stores/*.js\` for Pinia models and actions, needn't generate stores code in current step. output a single-lined json object: -{ "packages":["additional real packages(format: package@version) imported by current file, don't list existing/different versioned/unused ones!","make sure packages exists!","may empty array"], "importedStores": [{"file": "/src/stores/{file-name}.js", "state": {"State JSON object used by current component, list detailed props used by component for each entity(give example object each arrays). don't list props not used by current component. better use existing, add new if needed"}, "actions": ["Actions(full params/resp signature) used by current component, especially wrap APIs into actions. better use existing, add new if needed.", "don't list actions not used by current component", ..], "getters": ["getters used by current component. add new if needed", "don't list getters not used by current component", ..]}, ..], "code": "formatted lines of full(don't ignore any code, since we put the code directly into project without modification) implementation code for \`/src/components/JobListTable.vue\`. pay special attentions to interaction states/error handling/validations; Only access endpoint APIs through store actions. Be very careful don't introduce bugs, it causes money loss for us!", "spec": {"props":["prop name","may empty array, no empty string"],"slots":[{"name":"","summary":""}],"events":[{"name":"","summary":"","payload":{[example of payload]}}],"components":["dependent ComponentNames defined by this project","don't list 3rd-party components","may empty array, no empty string"]} }`, +{ "packages":["additional real packages(format: package@version) imported by current file","make sure packages exists!"], "importedStores": [{"file": "/src/stores/{file-name}.js", "name":"the exported store name, must prefix with 'use'", "state": {"State JSON object used by current component, list detailed props used by component for each entity(give example object in each arrays, if prop is complex type(like File),express as string of js). don't list props unused by current component. better use existing, add new if really need"}, "actions": ["Actions(full params/return in ts function signature format) used by current component, especially wrap APIs into actions. better use existing, add new if really need", "don't list actions not used by current component", ..], "getters": [{"name": "name of derived state used by current component", "code": "(state) => { /*full js code to return derived value*/ }"}], ..]}, ..], "code": "formatted lines of full(don't ignore any code, since we put the code directly into project without modification) implementation code for \`/src/components/JobListTable.vue\`. pay special attentions to interaction states/error handling/validations; Only access endpoint APIs through store actions", "spec": {"props":["prop name"],"slots":[{"name":"","summary":""}],"events":[{"name":"","summary":"","payload":{[example of payload]}}],"components":["dependent ComponentName"]} } +after generate before output, please double-check the result json meets all rules: +- all arrays may be \`[]\`, array items must not empty values! +- don't add \`installedPackages\` into $.packages, only new ones; prohibit version conflicts! +- $.spec.components **must** only component names listed in \`relatedComponents\` array, no ref any views nor 3rd-party components! +- $.state are all simple example instances +- $.actions is array of strings +- add only derived(need calculation, prohibit just aliases) state into \`getters\`; don't list getters unused by current component; better use existing, add new if really need +- $.code must not any typescript; using components from installed packages are strongly encouraged +- use vue3 best practices such as '