diff --git a/.TODO b/.TODO new file mode 100644 index 0000000..b558c1b --- /dev/null +++ b/.TODO @@ -0,0 +1,7 @@ +[ ] possibilitar importar usando @ para ter atalhos +[ ] variável de ambiente para usar mocks em vez de prisma +[ ] reestruturar os comandos do package.json +[ ] melhorar ordem de execução de testes em hook de pre-commit +[ ] adicionar mais exemplos para o schemathesis usar +[ ] adicionar mais testes unitários e de integração da infra +[x] adicionar banco de dados sqlite \ No newline at end of file diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000..e854e64 --- /dev/null +++ b/.dockerignore @@ -0,0 +1,6 @@ +node_modules +yarn.lock +coverage + +#.env* +!.env.vault \ No newline at end of file diff --git a/.env.example b/.env.example new file mode 100644 index 0000000..f494f38 --- /dev/null +++ b/.env.example @@ -0,0 +1,50 @@ +# GENERAL CONFIGURATION +NODE_ENV='local' +DOMAIN_ADDRESS='http://localhost' +API_PATH='/api/v1' +API_NAME='petropolis-circularidade' +WILL_DISABLE_AUTHENTICATION=true +API_VERSION='0.1.0' +TCP_PORT=3000 + +TCP_PORT1=000 + +# DATABASE CONFIGURATION +DATABASE_URL="postgresql://user:password@127.0.0.1:5433/db_name?schema=public" + +# LOGGING CONFIGURATION +LOG_LEVEL='debug' # @see https://github.com/winstonjs/winston?tab=readme-ov-file#logging-levels + +# CORS CONFIGURATION +CORS_METHODS='GET','PUT','POST','DELETE','HEAD','OPTIONS' +CORS_ORIGINS='*' +CORS_MAX_AGE=600 # @see https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Access-Control-Max-Age + +# CONTENT SECURITY POLICY +CONTENT_SECURITY_SCRIPT_SRC="'self'" + +# SESSION CONFIGURATION +SESSION_NAME='PETROPOLIS-CIRCULARIDADE' +SESSION_SECRET='g9uA81SCuWbqqg5TfGIbwffRrcXhfgfwlDn3I1plNxAg5bcfgV' +SESSION_MAX_AGE_MS=3600000 + +# OPENAPI SWAGGER CONFIGURATION +SWAGGER_PATH='/docs/v1' +SWAGGER_RAW_PATH='/openapi/v1/' +SWAGGER_TITLE='API da Petrópolis de Circularidade do Vidro' +SWAGGER_DESCRIPTION='API para o app responsivo de circularidade do Vidro' +SWAGGER_VERSION='3.0.0' + +# OIDC +OIDC_JWKS_URL=https://keycloak.example.com/realms/your-realm/protocol/openid-connect/certs +OIDC_ISSUER=https://keycloak.example.com/realms/your-realm +OIDC_AUDIENCE=client-petro +OIDC_DISABLE=True + +# KEYCLOAK +KEYCLOAK_CLIENT_ID=client-petro +KEYCLOAK_CLIENT_SECRET=6CLRjcRbuDoUiw7bUOneERsyB4x3YzVT +KEYCLOAK_GRANT_TYPE=password +KEYCLOAK_ADMIN_USERNAME=admin +KEYCLOAK_ADMIN_PASSWORD=1 +KEYCLOAK_DOMAIN=http://localhost:8080 diff --git a/.github/workflows/schemathesis.yml b/.github/workflows/schemathesis.yml new file mode 100644 index 0000000..c6e07da --- /dev/null +++ b/.github/workflows/schemathesis.yml @@ -0,0 +1,20 @@ +name: Schemathesis Test + +on: [pull_request] + +jobs: + test: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + + - name: Start containers + run: docker compose up -d --build + + - uses: schemathesis/action@v1 + with: + schema: "http://127.0.0.1:5123/openapi.json" + + - name: Stop containers + if: always() + run: docker-compose down diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..73701fa --- /dev/null +++ b/.gitignore @@ -0,0 +1,228 @@ +# Created by https://www.toptal.com/developers/gitignore/api/node,visualstudiocode,macos,windows +# Edit at https://www.toptal.com/developers/gitignore?templates=node,visualstudiocode,macos,windows + +### macOS ### +# General +.DS_Store +.AppleDouble +.LSOverride + +# Icon must end with two \r +Icon + + +# Thumbnails +._* + +# Files that might appear in the root of a volume +.DocumentRevisions-V100 +.fseventsd +.Spotlight-V100 +.TemporaryItems +.Trashes +.VolumeIcon.icns +.com.apple.timemachine.donotpresent + +# Directories potentially created on remote AFP share +.AppleDB +.AppleDesktop +Network Trash Folder +Temporary Items +.apdisk + +### macOS Patch ### +# iCloud generated files +*.icloud + +### Node ### +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +lerna-debug.log* +.pnpm-debug.log* + +# Diagnostic reports (https://nodejs.org/api/report.html) +report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json + +# Runtime data +pids +*.pid +*.seed +*.pid.lock + +# Directory for instrumented libs generated by jscoverage/JSCover +lib-cov + +# Coverage directory used by tools like istanbul +coverage +*.lcov + +# nyc test coverage +.nyc_output + +# Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) +.grunt + +# Bower dependency directory (https://bower.io/) +bower_components + +# node-waf configuration +.lock-wscript + +# Compiled binary addons (https://nodejs.org/api/addons.html) +build/Release + +# Dependency directories +node_modules/ +jspm_packages/ + +# Snowpack dependency directory (https://snowpack.dev/) +web_modules/ + +# TypeScript cache +*.tsbuildinfo + +# Optional npm cache directory +.npm + +# Optional eslint cache +.eslintcache + +# Optional stylelint cache +.stylelintcache + +# Microbundle cache +.rpt2_cache/ +.rts2_cache_cjs/ +.rts2_cache_es/ +.rts2_cache_umd/ + +# Optional REPL history +.node_repl_history + +# Output of 'npm pack' +*.tgz + +# Yarn Integrity file +.yarn-integrity + +# dotenv environment variable files +.env +.env.test +.env.development.local +.env.test.local +.env.production.local +.env.local + +# parcel-bundler cache (https://parceljs.org/) +.cache +.parcel-cache + +# Next.js build output +.next +out + +# Nuxt.js build / generate output +.nuxt +dist + +# Gatsby files +.cache/ +# Comment in the public line in if your project uses Gatsby and not Next.js +# https://nextjs.org/blog/next-9-1#public-directory-support +# public + +# vuepress build output +.vuepress/dist + +# vuepress v2.x temp and cache directory +.temp + +# Docusaurus cache and generated files +.docusaurus + +# Serverless directories +.serverless/ + +# FuseBox cache +.fusebox/ + +# DynamoDB Local files +.dynamodb/ + +# TernJS port file +.tern-port + +# Stores VSCode versions used for testing VSCode extensions +.vscode-test + +# yarn v2 +.yarn/cache +.yarn/unplugged +.yarn/build-state.yml +.yarn/install-state.gz +.pnp.* + +### Node Patch ### +# Serverless Webpack directories +.webpack/ + +# Optional stylelint cache + +# SvelteKit build / generate output +.svelte-kit + +### VisualStudioCode ### +.vscode/* +!.vscode/settings.json +!.vscode/tasks.json +!.vscode/launch.json +!.vscode/extensions.json +!.vscode/*.code-snippets + +# Local History for Visual Studio Code +.history/ + +# Built Visual Studio Code Extensions +*.vsix + +### VisualStudioCode Patch ### +# Ignore all local history of files +.history +.ionide + +### Windows ### +# Windows thumbnail cache files +Thumbs.db +Thumbs.db:encryptable +ehthumbs.db +ehthumbs_vista.db + +# Dump file +*.stackdump + +# Folder config file +[Dd]esktop.ini + +# Recycle Bin used on file shares +$RECYCLE.BIN/ + +# Windows Installer files +*.cab +*.msi +*.msix +*.msm +*.msp + +# Windows shortcuts +*.lnk + +# End of https://www.toptal.com/developers/gitignore/api/node,visualstudiocode,macos,windows + +.hypothesis +database.db +database.db-journal +db.sqlite diff --git a/.husky/commit-msg b/.husky/commit-msg new file mode 100644 index 0000000..2785bc1 --- /dev/null +++ b/.husky/commit-msg @@ -0,0 +1 @@ +yarn commitlint --edit $1 diff --git a/.husky/pre-commit b/.husky/pre-commit new file mode 100644 index 0000000..2ec2de3 --- /dev/null +++ b/.husky/pre-commit @@ -0,0 +1,33 @@ +# Análise do Código +yarn lint +yarn style +yarn typecheck +yarn compliance + +# Teste smoke +yarn test:smoke + +# Testes unitários +yarn test:unit + +# Migração do banco de dados +yarn migrate:local +yarn migrate:local:reset --force + +# Testes fim a fim +yarn test:e2e + +# Limpar banco para teste de API +yarn migrate:local:reset --force + +# Testes de API +#!/bin/bash + +if [[ "$OSTYPE" == "msys" ]] || [[ "$OSTYPE" == "cygwin" ]] || [[ "$OSTYPE" == "win32" ]] || [[ "$MSYSTEM" == MINGW* ]]; then + yarn e2e:run:win +else + yarn e2e:run +fi + +# Limpar banco no final de tudo +yarn migrate:local:reset --force diff --git a/.license-compliancerc.mjs b/.license-compliancerc.mjs new file mode 100644 index 0000000..46e1ab2 --- /dev/null +++ b/.license-compliancerc.mjs @@ -0,0 +1,17 @@ +export default { + allow: [ + 'MIT', + 'ISC', + 'BSD-3-Clause', + 'BSD-2-Clause', + 'Apache-2.0', + 'BlueOak-1.0.0', + 'CC0-1.0', + 'CC-BY-4.0', + '0BSD', + 'MIT-0', + ], + format: 'text', + production: true, + report: 'summary', +}; diff --git a/.vscode/extensions.json b/.vscode/extensions.json new file mode 100644 index 0000000..ad29303 --- /dev/null +++ b/.vscode/extensions.json @@ -0,0 +1,25 @@ +{ + "recommendations": [ + "bruno-api-client.bruno", + "formulahendry.code-runner", + "robertz.code-snapshot", + "vivaxy.vscode-conventional-commits", + "mikestead.dotenv", + "editorconfig.editorconfig", + "dbaeumer.vscode-eslint", + "mhutchie.git-graph", + "github.vscode-pull-request-github", + "eamodio.gitlens", + "lokalise.i18n-ally", + "bierner.jsdoc-markdown-highlighting", + "ritwickdey.liveserver", + "ms-vsliveshare.vsliveshare", + "pkief.material-icon-theme", + "cweijan.vscode-postgresql-client2", + "esbenp.prettier-vscode", + "prisma.prisma", + "foxundermoon.shell-format", + "vitest.explorer", + "kingwl.vscode-vitest-runner" + ] +} \ No newline at end of file diff --git a/.waitonrc.cjs b/.waitonrc.cjs new file mode 100644 index 0000000..13b5134 --- /dev/null +++ b/.waitonrc.cjs @@ -0,0 +1,4 @@ +const { TCP_PORT } = process.env; +module.exports = { + resources: [`tcp:${TCP_PORT}`], +}; diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000..e69de29 diff --git a/Dockerfile b/Dockerfile index ca0fe0b..9f94556 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,10 +1,12 @@ -FROM python:3.11-slim -WORKDIR /code -ENV FLASK_APP=app.py -ENV FLASK_RUN_HOST=0.0.0.0 -ENV FLASK_RUN_PORT=5123 -COPY requirements.txt requirements.txt -RUN pip install -r requirements.txt -EXPOSE 5123 +FROM node:20 + +WORKDIR /app + COPY . . -CMD ["flask", "run"] \ No newline at end of file + +RUN yarn install + + +EXPOSE 3000 + +ENTRYPOINT ["sh","start.sh"] \ No newline at end of file diff --git a/Dockerfile.test b/Dockerfile.test new file mode 100644 index 0000000..94b83e0 --- /dev/null +++ b/Dockerfile.test @@ -0,0 +1,9 @@ +FROM node:20 + +WORKDIR /app + +COPY . . + +RUN yarn install + +RUN bash test.sh \ No newline at end of file diff --git a/README.md b/README.md index 1534623..ee375e4 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,139 @@ -# Schemathesis GitHub Tutorial +# Guia Rápido -This repository is designed to demonstrate the capabilities and features of Schemathesis. You are invited to follow along [here](https://docs.schemathesis.io/tutorials/github). +### Ações Comuns e Comandos + +- **Instalar dependências e preparar o ambiente:** + ```bash + yarn install + yarn migrate:local + yarn seed:local + ``` + Instala todas as dependências, aplica a primeira migração e popula o banco de dados localmente. + +- **Executar o projeto localmente:** + ```bash + yarn local + ``` + Inicia o projeto usando o arquivo de ambiente `.env.local`. + +- **Executar todos os testes:** + ```bash + yarn test:run + ``` + Executa todos os testes automatizados. + +- **Executar testes de ponta a ponta (E2E):** + ```bash + yarn e2e:run + ``` + Executa testes completos simulando o uso real do sistema. + +- **Aplicar migrações e popular o banco de dados local:** + ```bash + yarn migrate:local + yarn seed:local + ``` + Aplica alterações no banco de dados e insere dados iniciais. + +- **Resetar o banco de dados local:** + ```bash + yarn migrate:local:reset + yarn seed:local + ``` + Remove e recria o banco de dados localmente. + +- **Verificar qualidade do código:** + ```bash + yarn typecheck + yarn lint + yarn style + ``` + Realiza checagem de tipos, formatação e linting do código. + +# FAQ + +**Q: Como rodar o projeto localmente?** +- Use `yarn local` para iniciar o projeto usando as variáveis de ambiente locais. + +**Q: Como executar testes?** +- Para todos os testes: `yarn test:run` +- Para testes de fumaça (Smoke Tests): `yarn test:smoke` + - Testes de fumaça verificam se o sistema básico está funcional após mudanças, focando em falhas críticas. +- Para testes unitários: `yarn test:unit` + - Testes unitários validam partes isoladas do código. +- Para testes de ponta a ponta: `yarn e2e:run` + +**Q: Como aplicar migrações no banco de dados?** +- Localmente: `yarn migrate:local` +- Ambiente de teste: `yarn migrate:test` +- Produção: `yarn migrate` + +**Q: Como resetar o banco de dados local?** +- Execute `yarn migrate:local:reset` e depois `yarn seed:local`. + +**Q: Como verificar problemas de segurança e conformidade?** +- Vazamentos de dados: `yarn leaks` +- Conformidade de licenças: `yarn compliance` + +# Explicação dos Comandos + +### Gerenciamento do Projeto +- **local:** Executa o projeto localmente com `.env.local`. +- **test:** Executa o projeto no modo de teste com `.env.test`. +- **deploy:** Realiza o deploy em produção usando `.env`. + +### Testes +- **test:smoke:** Executa testes de fumaça com `vitest`. +- **test:unit:** Executa testes unitários com `vitest`. +- **test:e2e:** Executa testes de ponta a ponta com `vitest`. +- **test:run:** Executa todos os testes automatizados. +- **test:ui:** Abre a interface gráfica do `vitest`. +- **test:watch:** Executa testes em modo de observação. +- **test:coverage:** Executa testes e gera relatório de cobertura de código. + +### Testes de Ponta a Ponta (E2E) +- **e2e:wait:** Aguarda recursos antes de executar os testes. +- **e2e:bru:** Executa testes e2e com `bru`. +- **e2e:run:** Executa testes e2e em paralelo usando `concurrently`. + +### Gerenciamento de Banco de Dados +- **migrate:local:** Aplica migrações locais. +- **migrate:test:** Reseta e aplica migrações no banco de testes. +- **migrate:** Aplica migrações em produção. +- **migrate:local:reset:** Reseta o banco de dados local. +- **seed:local:** Popula o banco de dados local com dados iniciais. +- **seed:test:** Popula o banco de testes com dados iniciais. + +### Qualidade de Código +- **typecheck:** Verifica os tipos com TypeScript. +- **style:** Formata o código com `biome`. +- **lint:** Verifica o código com `biome`. + +### Segurança e Conformidade +- **leaks:** Verifica vazamentos de segurança com `dotenvx`. +- **compliance:** Verifica conformidade de licenças. + +### Gerenciamento de Commits +- **commit:** Inicia o processo de commit com `commitizen`. +- **commit:dry:** Executa uma verificação de commit. + +### Testes de Carga +- **load:run:** Executa testes de carga com `artillery`. + +### Hooks de Instalação +- **preinstall:** Restringe o uso de gerenciadores de pacotes para Yarn. +- **postinstall:** Executa a verificação de conformidade. +- **prepare:** Prepara os hooks do `husky` para o Git. + +## Ferramentas + +Abaixo é explicado algumas das ferramentas usadas nos comandos: + +* **Artillery**: Ferramenta de testes de carga (stress testing) que simula tráfego de usuários para avaliar o desempenho de sistemas e identificar gargalos. O comando load:run executa testes de carga no sistema. +* **Commitizen**: Ferramenta que ajuda a manter convenções de mensagens de commit consistentes. Facilita a criação de mensagens de commit que seguem padrões como o Conventional Commits, o que facilita o versionamento e a automação de releases. +* **Dotenvx**: Variante do dotenv que carrega variáveis de ambiente a partir de arquivos .env. Ele é usado para garantir que o projeto utilize configurações adequadas para diferentes ambientes (local, teste, produção). +* **Biome**: Ferramenta para formatação e linting de código. Ela pode ser configurada para aplicar regras de estilo e verificar a qualidade do código de acordo com as normas definidas no projeto. +* **Husky**: Ferramenta que permite configurar hooks do Git, como pré-commit e pré-push, para automatizar processos como linting, testes ou verificação de qualidade antes de permitir que o código seja commitado ou enviado para o repositório. +* **Concurrently**: Utilizado para rodar múltiplos comandos simultaneamente no terminal. No caso de testes de ponta a ponta, ele permite executar testes em paralelo, otimizando o tempo de execução. +* **Vitest**: Framework de testes para JavaScript e TypeScript que é rápido e de fácil integração, usado para testar unidades, integração e ponta a ponta (E2E) dentro do fluxo de trabalho do projeto. +* **Waiton**: Utilizado para esperar que um recurso esteja disponível antes de executar um comando subsequente. No caso de testes E2E, ele pode ser usado para garantir que todos os serviços ou recursos necessários estejam prontos antes de rodar os testes. \ No newline at end of file diff --git a/biome.json b/biome.json new file mode 100644 index 0000000..dceeafb --- /dev/null +++ b/biome.json @@ -0,0 +1,39 @@ +{ + "$schema": "https://biomejs.dev/schemas/1.9.4/schema.json", + "vcs": { + "enabled": false, + "clientKind": "git", + "useIgnoreFile": false + }, + "files": { + "ignoreUnknown": false, + "ignore": [ + "node_modules", + "commitlint.config.mjs", + "yarn.lock", + "dist" + ] + }, + "formatter": { + "enabled": true, + "indentStyle": "tab" + }, + "organizeImports": { + "enabled": true + }, + "linter": { + "enabled": true, + "rules": { + "recommended": true + } + }, + "javascript": { + "formatter": { + "quoteStyle": "single", + "jsxQuoteStyle": "single", + "trailingCommas": "all", + "arrowParentheses": "asNeeded", + "lineWidth": 120 + } + } +} \ No newline at end of file diff --git a/commitlint.config.mjs b/commitlint.config.mjs new file mode 100644 index 0000000..20efe77 --- /dev/null +++ b/commitlint.config.mjs @@ -0,0 +1,38 @@ +import { readFileSync } from "fs"; + +const packageFile = readFileSync("./package.json"); +const packageJson = JSON.parse(packageFile); +// Check if the user has configured the package to use conventional commits. + +let isConventional = false; +if (packageJson.config) isConventional = packageJson.config["commitizenEmoji"]?.conventional; + +// Regex for default and conventional commits. +const RE_DEFAULT_COMMIT = + /^(:[a-zA-Z0-9_]+:|(?:\u00a9|\u00ae|[\u2000-\u3300]|\ud83c[\ud000-\udfff]|\ud83d[\ud000-\udfff]|\ud83e[\ud000-\udfff]))\s(?\w*?)(\((?[a-z].*?)\))?:\s[a-z].*$/gm; +const RE_CONVENTIONAL_COMMIT = + /^^(?\w+)(?:\((?\w+)\))?\s(?:.*:|(?:\u00a9|\u00ae|[\u2000-\u3300]|\ud83c[\ud000-\udfff]|\ud83d[\ud000-\udfff]|\ud83e[\ud000-\udfff]))\s.*$/gm; + +export default { + rules: { + commitizenEmoji: [2, "always"], + }, + plugins: [ + { + rules: { + commitizenEmoji: ({ raw }) => { + if (isConventional) { + const isValid = RE_CONVENTIONAL_COMMIT.test(raw); + const message = "Your commit message should follow conventional commit format."; + return [isValid, message]; + } else { + const isValid = RE_DEFAULT_COMMIT.test(raw); + const message = `Your commit message should be: ()?: , where +subject is lowercase`; + return [isValid, message]; + } + }, + }, + }, + ], +}; diff --git a/docker-compose-ci.yml b/docker-compose-ci.yml new file mode 100644 index 0000000..ba2ef48 --- /dev/null +++ b/docker-compose-ci.yml @@ -0,0 +1,52 @@ +--- +services: + # db: + # image: postgres:16 + # container_name: ${CONTAINER_NAME}-db + # restart: unless-stopped + # environment: + # - POSTGRES_DB=${DB_NAME} + # - POSTGRES_USER=${DB_USERNAME} + # - POSTGRES_PASSWORD=${DB_PASSWORD} + # volumes: + # - pg_data:/var/lib/postgresql/data + # expose: + # - 5432 + # networks: + # - petropolis + + petropolis-app: + container_name: ${CONTAINER_NAME} + image: ${DOCKER_IMAGE} + healthcheck: + test: ["CMD", "curl", "-f", "http://localhost:3000/api/v1"] + interval: 30s + timeout: 10s + retries: 5 + start_period: 10s + # depends_on: + # - petropolis-db + networks: + - petropolis + ports: + - "${EC2_PORT}:3000" + volumes: + - "sqlite:/app/prisma/database" + +volumes: + sqlite: + driver: local + driver_opts: + type: nfs + o: addr=fs-07f91d6b8c3e461f5.efs.us-east-1.amazonaws.com,rw,nfsvers=4.1,rsize=1048576,wsize=1048576,hard,timeo=600,retrans=2,noresvport + device: ":/petropolis/${BRANCH_NAME}/sqlite/" + # pg_data: + # # driver: local + # # driver_opts: + # # type: nfs + # # o: addr=fs-07f91d6b8c3e461f5.efs.us-east-1.amazonaws.com,rw,nfsvers=4.1,rsize=1048576,wsize=1048576,hard,timeo=600,retrans=2,noresvport + # # device: ":/petropolis/${BRANCH_NAME}/postgres/" + +networks: + petropolis: + name: petropolis-network diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..b76e8cb --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,27 @@ +--- +services: + app: + container_name: petropolis-be + image: petropolis-be + build: + context: . + dockerfile: Dockerfile + healthcheck: + test: ["CMD", "curl", "-f", "http://localhost:3000/api/v1"] + interval: 30s + timeout: 10s + retries: 5 + start_period: 10s + ports: + - "3000:3000" + networks: + - petropolis + volumes: + - 'sqlite:/app/prisma/database' + +volumes: + sqlite: + +networks: + petropolis: + name: petropolis-network \ No newline at end of file diff --git a/lintstagedrc.json b/lintstagedrc.json new file mode 100644 index 0000000..6de728f --- /dev/null +++ b/lintstagedrc.json @@ -0,0 +1,8 @@ +{ + "src/**/*.ts": [ + "yarn style", + "yarn typecheck", + "yarn lint" + ], + "**/*.md": "yarn style" +} \ No newline at end of file diff --git a/openapi.json b/openapi.json index 02890ce..fa3c1c8 100644 --- a/openapi.json +++ b/openapi.json @@ -1,497 +1,5605 @@ { - "openapi": "3.0.2", - "info": { - "title": "Schemathesis.io Demo Project", - "description": "This service demonstrates the range of issues Schemathesis.io can identify in your API automatically", - "version": "0.1", - "contact": { - "name": "Schemathesis.io Support Team", - "email": "support@schemathesis.io" + "servers": [ + { + "url": "http://localhost:3000/api/v1" + } + ], + "openapi": "3.0.0", + "info": { + "title": "API da Petrópolis de Circularidade do Vidro", + "version": "0.1.0", + "description": "API para o app responsivo de circularidade do Vidro" + }, + "components": { + "schemas": { + "RouteId": { + "type": "string", + "format": "uuid", + "example": "f7f16595-8537-486b-9027-ee419435980c" + }, + "CollectionId": { + "type": "string", + "format": "uuid", + "description": "UUID da coleta", + "example": "5a17c4b6-845b-419b-8f96-be1f01fa89ab" + }, + "CollectionPointId": { + "type": "string", + "format": "uuid", + "description": "UUID4 do ponto de coleta", + "example": "361754a6-845b-419b-8f96-be1f01fa899e" + }, + "Responsible": { + "type": "object", + "properties": { + "name": { + "type": "string", + "description": "Nome do responsável" + }, + "phone": { + "type": "string", + "description": "Telefone do responsável" + } + }, + "description": "Informações de contato do responsável" + }, + "CollectionPointType": { + "type": "string", + "enum": [ + "RESTAURANT", + "APARTMENT" + ], + "description": "O tipo de um ponto de coleta de coleta" + }, + "Coordinates": { + "type": "object", + "properties": { + "latitude": { + "type": "number", + "description": "latitude da coordenada" + }, + "longitude": { + "type": "number", + "description": "longitude da coordenada" + } + }, + "required": [ + "latitude", + "longitude" + ], + "description": "coordenadas cartesianas" + }, + "Address": { + "type": "object", + "properties": { + "street": { + "type": "string", + "description": "Rua do endereço" + }, + "complement": { + "type": "string", + "description": "Complemento do endereço (opcional)" + }, + "zipcode": { + "type": "string", + "description": "CEP do endereço" + }, + "number": { + "type": "string", + "description": "Número do endereço" + }, + "district": { + "type": "string", + "description": "Bairro do endereço" + }, + "city": { + "type": "string", + "description": "Cidade do endereço" + }, + "state": { + "type": "string", + "description": "Estado do endereço" + }, + "coordinate": { + "$ref": "#/components/schemas/Coordinates" + } + }, + "required": [ + "street", + "zipcode", + "number", + "district", + "city", + "state" + ], + "description": "Representa um endereço completo com informações geográficas" + }, + "CollectionPointStatus": { + "type": "string", + "enum": [ + "ACTIVE", + "INACTIVE" + ], + "description": "O estado de um ponto de coleta de coleta de resíduo de vidro dentro de uma rota" + }, + "ContactRole": { + "type": "string", + "enum": [ + "ADMIN", + "MANAGER" + ], + "description": "O cargo do contato" + }, + "Weekday": { + "type": "string", + "enum": [ + "MONDAY", + "TUESDAY", + "WEDNESDAY", + "THURSDAY", + "FRIDAY" + ], + "description": "Um dia da semana válido" + }, + "ExtendedWeekday": { + "type": "string", + "enum": [ + "MONDAY", + "TUESDAY", + "WEDNESDAY", + "THURSDAY", + "FRIDAY", + "WEEKEND", + "NOANSWER" + ], + "description": "Um dia da semana incluindo o fim de semana, ou sem informação" + }, + "Shift": { + "type": "string", + "enum": [ + "MORNING", + "AFTERNOON" + ], + "description": "O turno de uma rota" + }, + "CollectionPoint": { + "type": "object", + "properties": { + "id": { + "$ref": "#/components/schemas/CollectionPointId" + }, + "name": { + "type": "string", + "description": "Nome do ponto de coleta" + }, + "responsible": { + "$ref": "#/components/schemas/Responsible" + }, + "type": { + "$ref": "#/components/schemas/CollectionPointType" + }, + "address": { + "$ref": "#/components/schemas/Address" + }, + "status": { + "$ref": "#/components/schemas/CollectionPointStatus" + }, + "contact": { + "type": "object", + "properties": { + "name": { + "type": "string", + "description": "Nome do contato" + }, + "role": { + "$ref": "#/components/schemas/ContactRole" + }, + "phone": { + "type": "string", + "description": "Telefone do contato" + }, + "email": { + "type": "string", + "description": "E-mail do contato" + } + }, + "required": [ + "name", + "phone", + "email" + ], + "description": "Informações de contato do ponto de coleta" + }, + "weeklyGlassVolume": { + "type": "number", + "description": "Volume de vidro semanal (em garrafas)" + }, + "bestCollectionDay": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Weekday" + }, + "description": "Melhor dia da semana para a coleta" + }, + "selectiveCollectionDay": { + "type": "array", + "items": { + "$ref": "#/components/schemas/ExtendedWeekday" + }, + "description": "Dia da coleta seletiva (prefeitura/empresa)" + }, + "shifts": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Shift" + }, + "description": "Melhor período para a coleta" + }, + "operatorId": { + "type": "string", + "format": "uuid", + "description": "UUID4 do operador a que esse ponto de coleta pertence" + }, + "relevantInfos": { + "type": "string", + "description": "Informações relevantes para o ponto de coleta" + } + }, + "required": [ + "id", + "name", + "type", + "address", + "status", + "contact", + "operatorId" + ], + "description": "Ponto de coleta associado" + }, + "CollectionStatus": { + "type": "string", + "enum": [ + "PENDING", + "IN_PROGRESS", + "FINISHED" + ], + "description": "O estado de uma coleta dentro de uma rota" + }, + "Collection": { + "type": "object", + "properties": { + "id": { + "$ref": "#/components/schemas/CollectionId" + }, + "collectionPoint": { + "$ref": "#/components/schemas/CollectionPoint" + }, + "routeId": { + "allOf": [ + { + "$ref": "#/components/schemas/RouteId" + }, + { + "description": "UUID da rota associada" + } + ] + }, + "status": { + "$ref": "#/components/schemas/CollectionStatus" + }, + "notes": { + "type": "string", + "description": "Observações adicionais (opcional)" + }, + "volumeCollected": { + "type": "number", + "default": 0, + "description": "Volume coletado em litros" + }, + "date": { + "type": "string", + "format": "date-time", + "description": "data e hora que a coleta foi iniciada" + }, + "startTime": { + "type": "string", + "format": "date-time", + "description": "data e hora que a coleta foi iniciada" + }, + "endTime": { + "type": "string", + "format": "date-time", + "description": "data e hora que a coleta foi finalizada" + } + }, + "required": [ + "id", + "collectionPoint", + "routeId", + "status", + "date" + ], + "description": "Uma coleta realizada em um ponto de coleta" + }, + "RouteStatus": { + "type": "string", + "enum": [ + "PENDING", + "IN_PROGRESS", + "FINISHED" + ], + "description": "O estado de uma rota de coleta de resíduo de vidro" + }, + "User": { + "type": "object", + "properties": { + "id": { + "type": "string", + "format": "uuid", + "description": "uuid4 do usuário" + }, + "fullName": { + "type": "string", + "description": "nome do usuário" + }, + "initials": { + "type": "string", + "minLength": 2, + "maxLength": 2, + "description": "iniciais do usuário" + } + }, + "required": [ + "id", + "fullName", + "initials" + ], + "description": "um usuário do sistema" + }, + "Comment": { + "type": "string", + "maxLength": 250, + "description": "comentário" + }, + "Reason": { + "type": "string", + "enum": [ + "FINISHED" + ], + "description": "Motivo associado ao fim da rota" + }, + "Route": { + "type": "object", + "properties": { + "id": { + "$ref": "#/components/schemas/RouteId" + }, + "name": { + "type": "string", + "description": "nome da rota" + }, + "date": { + "type": "string", + "format": "date-time", + "description": "data que a rota deve ser executada" + }, + "collections": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Collection" + }, + "description": "Coletas da rota" + }, + "totalDistanceKm": { + "type": "number", + "minimum": 0, + "description": "distância total da rota em km" + }, + "totalTimeMs": { + "type": "integer", + "minimum": 0, + "description": "tempo total estimado da rota em ms" + }, + "status": { + "$ref": "#/components/schemas/RouteStatus" + }, + "executor": { + "$ref": "#/components/schemas/User" + }, + "startedAt": { + "type": "string", + "format": "date-time", + "description": "data e hora que a rota foi iniciada" + }, + "finishedAt": { + "type": "string", + "format": "date-time", + "description": "data e hora que a rota foi finalizada" + }, + "comment": { + "$ref": "#/components/schemas/Comment" + }, + "reason": { + "$ref": "#/components/schemas/Reason" + } + }, + "required": [ + "id", + "name", + "date", + "collections", + "totalDistanceKm", + "totalTimeMs", + "status" + ], + "description": "Uma rota de coleta de resíduo de vidro" + }, + "Vehicle": { + "type": "object", + "properties": { + "id": { + "type": "string", + "format": "uuid", + "description": "uuid4 do veículo" + }, + "name": { + "type": "string", + "description": "nome do veículo" + } + }, + "required": [ + "id", + "name" + ], + "description": "Um veículo de coleta de vidro" + } + }, + "parameters": {} + }, + "paths": { + "/": { + "get": { + "tags": [ + "Boas Vindas" + ], + "summary": "Boas Vindas", + "description": "Mensagem de boas vindas da raiz da API", + "responses": { + "200": { + "description": "Uma resposta de boas vindas", + "content": { + "text/html": { + "schema": { + "type": "string" + } + } + } + }, + "400": { + "description": "Erro do tipo Invalid Parameters: The request contained invalid, or malformed parameters (path, header or query). Veja http://localhost:3000/api/v1docs/#/problems?id=invalid-parameters", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "type": { + "type": "string" + }, + "title": { + "type": "string" + }, + "detail": { + "type": "string" + }, + "status": { + "type": "number" + }, + "code": { + "type": "string" + }, + "errors": { + "type": "array", + "items": { + "type": "object", + "properties": { + "detail": { + "type": "string" + }, + "pointer": { + "type": "string" + }, + "parameter": { + "type": "string" + } + }, + "required": [ + "detail" + ] + } + } + }, + "required": [ + "type", + "title", + "detail", + "status", + "code" + ] + } + } + } + }, + "401": { + "description": "Erro do tipo Unauthorized: Access token not set or invalid, and the request resource could not be returned. Veja http://localhost:3000/api/v1docs/#/problems?id=unauthorized", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "type": { + "type": "string" + }, + "title": { + "type": "string" + }, + "detail": { + "type": "string" + }, + "status": { + "type": "number" + }, + "code": { + "type": "string" + }, + "errors": { + "type": "array", + "items": { + "type": "object", + "properties": { + "detail": { + "type": "string" + }, + "pointer": { + "type": "string" + }, + "parameter": { + "type": "string" + } + }, + "required": [ + "detail" + ] + } + } + }, + "required": [ + "type", + "title", + "detail", + "status", + "code" + ] + } + } + } + }, + "403": { + "description": "Erro do tipo Forbidden: The resource could not be returned as the requestor is not authorized. Veja http://localhost:3000/api/v1docs/#/problems?id=forbidden", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "type": { + "type": "string" + }, + "title": { + "type": "string" + }, + "detail": { + "type": "string" + }, + "status": { + "type": "number" + }, + "code": { + "type": "string" + }, + "errors": { + "type": "array", + "items": { + "type": "object", + "properties": { + "detail": { + "type": "string" + }, + "pointer": { + "type": "string" + }, + "parameter": { + "type": "string" + } + }, + "required": [ + "detail" + ] + } + } + }, + "required": [ + "type", + "title", + "detail", + "status", + "code" + ] + } + } + } + }, + "404": { + "description": "Erro do tipo Not Found: The requested resource was not found. Veja http://localhost:3000/api/v1docs/#/problems?id=not-found", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "type": { + "type": "string" + }, + "title": { + "type": "string" + }, + "detail": { + "type": "string" + }, + "status": { + "type": "number" + }, + "code": { + "type": "string" + }, + "errors": { + "type": "array", + "items": { + "type": "object", + "properties": { + "detail": { + "type": "string" + }, + "pointer": { + "type": "string" + }, + "parameter": { + "type": "string" + } + }, + "required": [ + "detail" + ] + } + } + }, + "required": [ + "type", + "title", + "detail", + "status", + "code" + ] + } + } + } + }, + "422": { + "description": "Erro do tipo Business Rule Violation: The request is invalid and not meeting business rules. Veja http://localhost:3000/api/v1docs/#/problems?id=business-rule-violation", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "type": { + "type": "string" + }, + "title": { + "type": "string" + }, + "detail": { + "type": "string" + }, + "status": { + "type": "number" + }, + "code": { + "type": "string" + }, + "errors": { + "type": "array", + "items": { + "type": "object", + "properties": { + "detail": { + "type": "string" + }, + "pointer": { + "type": "string" + }, + "parameter": { + "type": "string" + } + }, + "required": [ + "detail" + ] + } + } + }, + "required": [ + "type", + "title", + "detail", + "status", + "code" + ] + } + } + } + }, + "500": { + "description": "Erro do tipo Server Error: The server encountered an unexpected error. Veja http://localhost:3000/api/v1docs/#/problems?id=server-error", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "type": { + "type": "string" + }, + "title": { + "type": "string" + }, + "detail": { + "type": "string" + }, + "status": { + "type": "number" + }, + "code": { + "type": "string" + }, + "errors": { + "type": "array", + "items": { + "type": "object", + "properties": { + "detail": { + "type": "string" + }, + "pointer": { + "type": "string" + }, + "parameter": { + "type": "string" + } + }, + "required": [ + "detail" + ] + } + } + }, + "required": [ + "type", + "title", + "detail", + "status", + "code" + ] + } + } + } + } + } + } + }, + "/routes/{routeId}": { + "get": { + "tags": [ + "Rotas" + ], + "summary": "Obter rota pelo seu id", + "description": "Retorna a rota com o id especificado", + "parameters": [ + { + "schema": { + "$ref": "#/components/schemas/RouteId" + }, + "required": true, + "name": "routeId", + "in": "path" + } + ], + "responses": { + "200": { + "description": "Uma rota de coleta de vidro", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Route" + } + } + } + }, + "400": { + "description": "Erro do tipo Invalid Parameters: The request contained invalid, or malformed parameters (path, header or query). Veja http://localhost:3000/api/v1docs/#/problems?id=invalid-parameters", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "type": { + "type": "string" + }, + "title": { + "type": "string" + }, + "detail": { + "type": "string" + }, + "status": { + "type": "number" + }, + "code": { + "type": "string" + }, + "errors": { + "type": "array", + "items": { + "type": "object", + "properties": { + "detail": { + "type": "string" + }, + "pointer": { + "type": "string" + }, + "parameter": { + "type": "string" + } + }, + "required": [ + "detail" + ] + } + } + }, + "required": [ + "type", + "title", + "detail", + "status", + "code" + ] + } + } + } + }, + "401": { + "description": "Erro do tipo Unauthorized: Access token not set or invalid, and the request resource could not be returned. Veja http://localhost:3000/api/v1docs/#/problems?id=unauthorized", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "type": { + "type": "string" + }, + "title": { + "type": "string" + }, + "detail": { + "type": "string" + }, + "status": { + "type": "number" + }, + "code": { + "type": "string" + }, + "errors": { + "type": "array", + "items": { + "type": "object", + "properties": { + "detail": { + "type": "string" + }, + "pointer": { + "type": "string" + }, + "parameter": { + "type": "string" + } + }, + "required": [ + "detail" + ] + } + } + }, + "required": [ + "type", + "title", + "detail", + "status", + "code" + ] + } + } + } + }, + "403": { + "description": "Erro do tipo Forbidden: The resource could not be returned as the requestor is not authorized. Veja http://localhost:3000/api/v1docs/#/problems?id=forbidden", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "type": { + "type": "string" + }, + "title": { + "type": "string" + }, + "detail": { + "type": "string" + }, + "status": { + "type": "number" + }, + "code": { + "type": "string" + }, + "errors": { + "type": "array", + "items": { + "type": "object", + "properties": { + "detail": { + "type": "string" + }, + "pointer": { + "type": "string" + }, + "parameter": { + "type": "string" + } + }, + "required": [ + "detail" + ] + } + } + }, + "required": [ + "type", + "title", + "detail", + "status", + "code" + ] + } + } + } + }, + "404": { + "description": "Erro do tipo Not Found: The requested resource was not found. Veja http://localhost:3000/api/v1docs/#/problems?id=not-found", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "type": { + "type": "string" + }, + "title": { + "type": "string" + }, + "detail": { + "type": "string" + }, + "status": { + "type": "number" + }, + "code": { + "type": "string" + }, + "errors": { + "type": "array", + "items": { + "type": "object", + "properties": { + "detail": { + "type": "string" + }, + "pointer": { + "type": "string" + }, + "parameter": { + "type": "string" + } + }, + "required": [ + "detail" + ] + } + } + }, + "required": [ + "type", + "title", + "detail", + "status", + "code" + ] + } + } + } + }, + "422": { + "description": "Erro do tipo Validation Error: The request is not valid. Veja http://localhost:3000/api/v1docs/#/problems?id=validation-error", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "type": { + "type": "string" + }, + "title": { + "type": "string" + }, + "detail": { + "type": "string" + }, + "status": { + "type": "number" + }, + "code": { + "type": "string" + }, + "errors": { + "type": "array", + "items": { + "type": "object", + "properties": { + "detail": { + "type": "string" + }, + "pointer": { + "type": "string" + }, + "parameter": { + "type": "string" + } + }, + "required": [ + "detail" + ] + } + } + }, + "required": [ + "type", + "title", + "detail", + "status", + "code" + ] + } + } + } + }, + "500": { + "description": "Erro do tipo Server Error: The server encountered an unexpected error. Veja http://localhost:3000/api/v1docs/#/problems?id=server-error", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "type": { + "type": "string" + }, + "title": { + "type": "string" + }, + "detail": { + "type": "string" + }, + "status": { + "type": "number" + }, + "code": { + "type": "string" + }, + "errors": { + "type": "array", + "items": { + "type": "object", + "properties": { + "detail": { + "type": "string" + }, + "pointer": { + "type": "string" + }, + "parameter": { + "type": "string" + } + }, + "required": [ + "detail" + ] + } + } + }, + "required": [ + "type", + "title", + "detail", + "status", + "code" + ] + } + } + } + } + } + } + }, + "/routes": { + "get": { + "tags": [ + "Rotas" + ], + "summary": "Listar rotas pendentes", + "description": "Retorna uma lista de rotas para o motorista do TRIVIM", + "responses": { + "200": { + "description": "Uma lista de rotas", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Route" + } + } + } + } + }, + "400": { + "description": "Erro do tipo Invalid Parameters: The request contained invalid, or malformed parameters (path, header or query). Veja http://localhost:3000/api/v1docs/#/problems?id=invalid-parameters", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "type": { + "type": "string" + }, + "title": { + "type": "string" + }, + "detail": { + "type": "string" + }, + "status": { + "type": "number" + }, + "code": { + "type": "string" + }, + "errors": { + "type": "array", + "items": { + "type": "object", + "properties": { + "detail": { + "type": "string" + }, + "pointer": { + "type": "string" + }, + "parameter": { + "type": "string" + } + }, + "required": [ + "detail" + ] + } + } + }, + "required": [ + "type", + "title", + "detail", + "status", + "code" + ] + } + } + } + }, + "401": { + "description": "Erro do tipo Unauthorized: Access token not set or invalid, and the request resource could not be returned. Veja http://localhost:3000/api/v1docs/#/problems?id=unauthorized", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "type": { + "type": "string" + }, + "title": { + "type": "string" + }, + "detail": { + "type": "string" + }, + "status": { + "type": "number" + }, + "code": { + "type": "string" + }, + "errors": { + "type": "array", + "items": { + "type": "object", + "properties": { + "detail": { + "type": "string" + }, + "pointer": { + "type": "string" + }, + "parameter": { + "type": "string" + } + }, + "required": [ + "detail" + ] + } + } + }, + "required": [ + "type", + "title", + "detail", + "status", + "code" + ] + } + } + } + }, + "403": { + "description": "Erro do tipo Forbidden: The resource could not be returned as the requestor is not authorized. Veja http://localhost:3000/api/v1docs/#/problems?id=forbidden", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "type": { + "type": "string" + }, + "title": { + "type": "string" + }, + "detail": { + "type": "string" + }, + "status": { + "type": "number" + }, + "code": { + "type": "string" + }, + "errors": { + "type": "array", + "items": { + "type": "object", + "properties": { + "detail": { + "type": "string" + }, + "pointer": { + "type": "string" + }, + "parameter": { + "type": "string" + } + }, + "required": [ + "detail" + ] + } + } + }, + "required": [ + "type", + "title", + "detail", + "status", + "code" + ] + } + } + } + }, + "404": { + "description": "Erro do tipo Not Found: The requested resource was not found. Veja http://localhost:3000/api/v1docs/#/problems?id=not-found", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "type": { + "type": "string" + }, + "title": { + "type": "string" + }, + "detail": { + "type": "string" + }, + "status": { + "type": "number" + }, + "code": { + "type": "string" + }, + "errors": { + "type": "array", + "items": { + "type": "object", + "properties": { + "detail": { + "type": "string" + }, + "pointer": { + "type": "string" + }, + "parameter": { + "type": "string" + } + }, + "required": [ + "detail" + ] + } + } + }, + "required": [ + "type", + "title", + "detail", + "status", + "code" + ] + } + } + } + }, + "422": { + "description": "Erro do tipo Validation Error: The request is not valid. Veja http://localhost:3000/api/v1docs/#/problems?id=validation-error", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "type": { + "type": "string" + }, + "title": { + "type": "string" + }, + "detail": { + "type": "string" + }, + "status": { + "type": "number" + }, + "code": { + "type": "string" + }, + "errors": { + "type": "array", + "items": { + "type": "object", + "properties": { + "detail": { + "type": "string" + }, + "pointer": { + "type": "string" + }, + "parameter": { + "type": "string" + } + }, + "required": [ + "detail" + ] + } + } + }, + "required": [ + "type", + "title", + "detail", + "status", + "code" + ] + } + } + } + }, + "500": { + "description": "Erro do tipo Server Error: The server encountered an unexpected error. Veja http://localhost:3000/api/v1docs/#/problems?id=server-error", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "type": { + "type": "string" + }, + "title": { + "type": "string" + }, + "detail": { + "type": "string" + }, + "status": { + "type": "number" + }, + "code": { + "type": "string" + }, + "errors": { + "type": "array", + "items": { + "type": "object", + "properties": { + "detail": { + "type": "string" + }, + "pointer": { + "type": "string" + }, + "parameter": { + "type": "string" + } + }, + "required": [ + "detail" + ] + } + } + }, + "required": [ + "type", + "title", + "detail", + "status", + "code" + ] + } + } + } + } + } + } + }, + "/routes/{routeId}/start": { + "post": { + "tags": [ + "Rotas" + ], + "summary": "Inicia uma rota pelo usuário atualmente logado", + "description": "Retorna a rota depois de iniciada", + "parameters": [ + { + "schema": { + "$ref": "#/components/schemas/RouteId" + }, + "required": true, + "name": "routeId", + "in": "path" + } + ], + "responses": { + "200": { + "description": "A rota que foi iniciada", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Route" + } + } + } + }, + "400": { + "description": "Erro do tipo Invalid Parameters: The request contained invalid, or malformed parameters (path, header or query). Veja http://localhost:3000/api/v1docs/#/problems?id=invalid-parameters", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "type": { + "type": "string" + }, + "title": { + "type": "string" + }, + "detail": { + "type": "string" + }, + "status": { + "type": "number" + }, + "code": { + "type": "string" + }, + "errors": { + "type": "array", + "items": { + "type": "object", + "properties": { + "detail": { + "type": "string" + }, + "pointer": { + "type": "string" + }, + "parameter": { + "type": "string" + } + }, + "required": [ + "detail" + ] + } + } + }, + "required": [ + "type", + "title", + "detail", + "status", + "code" + ] + } + } + } + }, + "401": { + "description": "Erro do tipo Unauthorized: Access token not set or invalid, and the request resource could not be returned. Veja http://localhost:3000/api/v1docs/#/problems?id=unauthorized", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "type": { + "type": "string" + }, + "title": { + "type": "string" + }, + "detail": { + "type": "string" + }, + "status": { + "type": "number" + }, + "code": { + "type": "string" + }, + "errors": { + "type": "array", + "items": { + "type": "object", + "properties": { + "detail": { + "type": "string" + }, + "pointer": { + "type": "string" + }, + "parameter": { + "type": "string" + } + }, + "required": [ + "detail" + ] + } + } + }, + "required": [ + "type", + "title", + "detail", + "status", + "code" + ] + } + } + } + }, + "403": { + "description": "Erro do tipo Forbidden: The resource could not be returned as the requestor is not authorized. Veja http://localhost:3000/api/v1docs/#/problems?id=forbidden", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "type": { + "type": "string" + }, + "title": { + "type": "string" + }, + "detail": { + "type": "string" + }, + "status": { + "type": "number" + }, + "code": { + "type": "string" + }, + "errors": { + "type": "array", + "items": { + "type": "object", + "properties": { + "detail": { + "type": "string" + }, + "pointer": { + "type": "string" + }, + "parameter": { + "type": "string" + } + }, + "required": [ + "detail" + ] + } + } + }, + "required": [ + "type", + "title", + "detail", + "status", + "code" + ] + } + } + } + }, + "404": { + "description": "Erro do tipo Not Found: The requested resource was not found. Veja http://localhost:3000/api/v1docs/#/problems?id=not-found", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "type": { + "type": "string" + }, + "title": { + "type": "string" + }, + "detail": { + "type": "string" + }, + "status": { + "type": "number" + }, + "code": { + "type": "string" + }, + "errors": { + "type": "array", + "items": { + "type": "object", + "properties": { + "detail": { + "type": "string" + }, + "pointer": { + "type": "string" + }, + "parameter": { + "type": "string" + } + }, + "required": [ + "detail" + ] + } + } + }, + "required": [ + "type", + "title", + "detail", + "status", + "code" + ] + } + } + } + }, + "422": { + "description": "Erro do tipo Validation Error: The request is not valid. Veja http://localhost:3000/api/v1docs/#/problems?id=validation-error", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "type": { + "type": "string" + }, + "title": { + "type": "string" + }, + "detail": { + "type": "string" + }, + "status": { + "type": "number" + }, + "code": { + "type": "string" + }, + "errors": { + "type": "array", + "items": { + "type": "object", + "properties": { + "detail": { + "type": "string" + }, + "pointer": { + "type": "string" + }, + "parameter": { + "type": "string" + } + }, + "required": [ + "detail" + ] + } + } + }, + "required": [ + "type", + "title", + "detail", + "status", + "code" + ] + } + } + } + }, + "500": { + "description": "Erro do tipo Server Error: The server encountered an unexpected error. Veja http://localhost:3000/api/v1docs/#/problems?id=server-error", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "type": { + "type": "string" + }, + "title": { + "type": "string" + }, + "detail": { + "type": "string" + }, + "status": { + "type": "number" + }, + "code": { + "type": "string" + }, + "errors": { + "type": "array", + "items": { + "type": "object", + "properties": { + "detail": { + "type": "string" + }, + "pointer": { + "type": "string" + }, + "parameter": { + "type": "string" + } + }, + "required": [ + "detail" + ] + } + } + }, + "required": [ + "type", + "title", + "detail", + "status", + "code" + ] + } + } + } + } + } + } + }, + "/routes/{routeId}/finish": { + "post": { + "tags": [ + "Rotas" + ], + "summary": "Finaliza uma rota pelo usuário atualmente logado", + "description": "Retorna a rota depois de finalizada", + "parameters": [ + { + "schema": { + "$ref": "#/components/schemas/RouteId" + }, + "required": true, + "name": "routeId", + "in": "path" + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "reason": { + "$ref": "#/components/schemas/Reason" + }, + "comment": { + "$ref": "#/components/schemas/Comment" + } + } + } + } + } + }, + "responses": { + "200": { + "description": "A rota que foi finalizada", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Route" + } + } + } + }, + "400": { + "description": "Erro do tipo Invalid Parameters: The request contained invalid, or malformed parameters (path, header or query). Veja http://localhost:3000/api/v1docs/#/problems?id=invalid-parameters", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "type": { + "type": "string" + }, + "title": { + "type": "string" + }, + "detail": { + "type": "string" + }, + "status": { + "type": "number" + }, + "code": { + "type": "string" + }, + "errors": { + "type": "array", + "items": { + "type": "object", + "properties": { + "detail": { + "type": "string" + }, + "pointer": { + "type": "string" + }, + "parameter": { + "type": "string" + } + }, + "required": [ + "detail" + ] + } + } + }, + "required": [ + "type", + "title", + "detail", + "status", + "code" + ] + } + } + } + }, + "401": { + "description": "Erro do tipo Unauthorized: Access token not set or invalid, and the request resource could not be returned. Veja http://localhost:3000/api/v1docs/#/problems?id=unauthorized", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "type": { + "type": "string" + }, + "title": { + "type": "string" + }, + "detail": { + "type": "string" + }, + "status": { + "type": "number" + }, + "code": { + "type": "string" + }, + "errors": { + "type": "array", + "items": { + "type": "object", + "properties": { + "detail": { + "type": "string" + }, + "pointer": { + "type": "string" + }, + "parameter": { + "type": "string" + } + }, + "required": [ + "detail" + ] + } + } + }, + "required": [ + "type", + "title", + "detail", + "status", + "code" + ] + } + } + } + }, + "403": { + "description": "Erro do tipo Forbidden: The resource could not be returned as the requestor is not authorized. Veja http://localhost:3000/api/v1docs/#/problems?id=forbidden", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "type": { + "type": "string" + }, + "title": { + "type": "string" + }, + "detail": { + "type": "string" + }, + "status": { + "type": "number" + }, + "code": { + "type": "string" + }, + "errors": { + "type": "array", + "items": { + "type": "object", + "properties": { + "detail": { + "type": "string" + }, + "pointer": { + "type": "string" + }, + "parameter": { + "type": "string" + } + }, + "required": [ + "detail" + ] + } + } + }, + "required": [ + "type", + "title", + "detail", + "status", + "code" + ] + } + } + } + }, + "404": { + "description": "Erro do tipo Not Found: The requested resource was not found. Veja http://localhost:3000/api/v1docs/#/problems?id=not-found", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "type": { + "type": "string" + }, + "title": { + "type": "string" + }, + "detail": { + "type": "string" + }, + "status": { + "type": "number" + }, + "code": { + "type": "string" + }, + "errors": { + "type": "array", + "items": { + "type": "object", + "properties": { + "detail": { + "type": "string" + }, + "pointer": { + "type": "string" + }, + "parameter": { + "type": "string" + } + }, + "required": [ + "detail" + ] + } + } + }, + "required": [ + "type", + "title", + "detail", + "status", + "code" + ] + } + } + } + }, + "422": { + "description": "Erro do tipo Validation Error: The request is not valid. Veja http://localhost:3000/api/v1docs/#/problems?id=validation-error", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "type": { + "type": "string" + }, + "title": { + "type": "string" + }, + "detail": { + "type": "string" + }, + "status": { + "type": "number" + }, + "code": { + "type": "string" + }, + "errors": { + "type": "array", + "items": { + "type": "object", + "properties": { + "detail": { + "type": "string" + }, + "pointer": { + "type": "string" + }, + "parameter": { + "type": "string" + } + }, + "required": [ + "detail" + ] + } + } + }, + "required": [ + "type", + "title", + "detail", + "status", + "code" + ] + } + } + } + }, + "500": { + "description": "Erro do tipo Server Error: The server encountered an unexpected error. Veja http://localhost:3000/api/v1docs/#/problems?id=server-error", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "type": { + "type": "string" + }, + "title": { + "type": "string" + }, + "detail": { + "type": "string" + }, + "status": { + "type": "number" + }, + "code": { + "type": "string" + }, + "errors": { + "type": "array", + "items": { + "type": "object", + "properties": { + "detail": { + "type": "string" + }, + "pointer": { + "type": "string" + }, + "parameter": { + "type": "string" + } + }, + "required": [ + "detail" + ] + } + } + }, + "required": [ + "type", + "title", + "detail", + "status", + "code" + ] + } + } + } + } + } + } + }, + "/routes/{routeId}/collection-points": { + "get": { + "tags": [ + "Rotas" + ], + "summary": "Listar pontos de coleta de uma rota", + "description": "Retorna a lista de pontos de coleta de uma rota", + "parameters": [ + { + "schema": { + "$ref": "#/components/schemas/RouteId" + }, + "required": true, + "name": "routeId", + "in": "path" + } + ], + "responses": { + "200": { + "description": "A lista de pontos de coleta da rota", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "allOf": [ + { + "$ref": "#/components/schemas/CollectionPoint" + }, + { + "description": "Um ponto de coleta de resíduo de vidro" + } + ] + } + } + } + } + }, + "400": { + "description": "Erro do tipo Invalid Parameters: The request contained invalid, or malformed parameters (path, header or query). Veja http://localhost:3000/api/v1docs/#/problems?id=invalid-parameters", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "type": { + "type": "string" + }, + "title": { + "type": "string" + }, + "detail": { + "type": "string" + }, + "status": { + "type": "number" + }, + "code": { + "type": "string" + }, + "errors": { + "type": "array", + "items": { + "type": "object", + "properties": { + "detail": { + "type": "string" + }, + "pointer": { + "type": "string" + }, + "parameter": { + "type": "string" + } + }, + "required": [ + "detail" + ] + } + } + }, + "required": [ + "type", + "title", + "detail", + "status", + "code" + ] + } + } + } + }, + "401": { + "description": "Erro do tipo Unauthorized: Access token not set or invalid, and the request resource could not be returned. Veja http://localhost:3000/api/v1docs/#/problems?id=unauthorized", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "type": { + "type": "string" + }, + "title": { + "type": "string" + }, + "detail": { + "type": "string" + }, + "status": { + "type": "number" + }, + "code": { + "type": "string" + }, + "errors": { + "type": "array", + "items": { + "type": "object", + "properties": { + "detail": { + "type": "string" + }, + "pointer": { + "type": "string" + }, + "parameter": { + "type": "string" + } + }, + "required": [ + "detail" + ] + } + } + }, + "required": [ + "type", + "title", + "detail", + "status", + "code" + ] + } + } + } + }, + "403": { + "description": "Erro do tipo Forbidden: The resource could not be returned as the requestor is not authorized. Veja http://localhost:3000/api/v1docs/#/problems?id=forbidden", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "type": { + "type": "string" + }, + "title": { + "type": "string" + }, + "detail": { + "type": "string" + }, + "status": { + "type": "number" + }, + "code": { + "type": "string" + }, + "errors": { + "type": "array", + "items": { + "type": "object", + "properties": { + "detail": { + "type": "string" + }, + "pointer": { + "type": "string" + }, + "parameter": { + "type": "string" + } + }, + "required": [ + "detail" + ] + } + } + }, + "required": [ + "type", + "title", + "detail", + "status", + "code" + ] + } + } + } + }, + "404": { + "description": "Erro do tipo Not Found: The requested resource was not found. Veja http://localhost:3000/api/v1docs/#/problems?id=not-found", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "type": { + "type": "string" + }, + "title": { + "type": "string" + }, + "detail": { + "type": "string" + }, + "status": { + "type": "number" + }, + "code": { + "type": "string" + }, + "errors": { + "type": "array", + "items": { + "type": "object", + "properties": { + "detail": { + "type": "string" + }, + "pointer": { + "type": "string" + }, + "parameter": { + "type": "string" + } + }, + "required": [ + "detail" + ] + } + } + }, + "required": [ + "type", + "title", + "detail", + "status", + "code" + ] + } + } + } + }, + "422": { + "description": "Erro do tipo Validation Error: The request is not valid. Veja http://localhost:3000/api/v1docs/#/problems?id=validation-error", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "type": { + "type": "string" + }, + "title": { + "type": "string" + }, + "detail": { + "type": "string" + }, + "status": { + "type": "number" + }, + "code": { + "type": "string" + }, + "errors": { + "type": "array", + "items": { + "type": "object", + "properties": { + "detail": { + "type": "string" + }, + "pointer": { + "type": "string" + }, + "parameter": { + "type": "string" + } + }, + "required": [ + "detail" + ] + } + } + }, + "required": [ + "type", + "title", + "detail", + "status", + "code" + ] + } + } + } + }, + "500": { + "description": "Erro do tipo Server Error: The server encountered an unexpected error. Veja http://localhost:3000/api/v1docs/#/problems?id=server-error", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "type": { + "type": "string" + }, + "title": { + "type": "string" + }, + "detail": { + "type": "string" + }, + "status": { + "type": "number" + }, + "code": { + "type": "string" + }, + "errors": { + "type": "array", + "items": { + "type": "object", + "properties": { + "detail": { + "type": "string" + }, + "pointer": { + "type": "string" + }, + "parameter": { + "type": "string" + } + }, + "required": [ + "detail" + ] + } + } + }, + "required": [ + "type", + "title", + "detail", + "status", + "code" + ] + } + } + } + } + } + } + }, + "/collection-points": { + "get": { + "tags": [ + "Pontos de Coleta" + ], + "summary": "Listar pontos de coleta", + "description": "Retorna a lista de pontos de coleta", + "parameters": [ + { + "schema": { + "type": "integer", + "nullable": true, + "minimum": 0, + "default": 12 + }, + "required": false, + "name": "limit", + "in": "query" + }, + { + "schema": { + "type": "integer", + "nullable": true, + "minimum": 0, + "default": 0 + }, + "required": false, + "name": "offset", + "in": "query" + } + ], + "responses": { + "200": { + "description": "A lista de pontos de coleta", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "data": { + "type": "array", + "items": { + "allOf": [ + { + "$ref": "#/components/schemas/CollectionPoint" + }, + { + "description": "Um ponto de coleta de resíduo de vidro" + } + ] + } + }, + "pagination": { + "type": "object", + "properties": { + "total": { + "type": "integer" + }, + "limit": { + "type": "integer" + }, + "pages": { + "type": "integer" + } + }, + "required": [ + "total", + "limit", + "pages" + ] + } + }, + "required": [ + "data", + "pagination" + ] + } + } + } + }, + "400": { + "description": "Erro do tipo Invalid Parameters: The request contained invalid, or malformed parameters (path, header or query). Veja http://localhost:3000/api/v1docs/#/problems?id=invalid-parameters", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "type": { + "type": "string" + }, + "title": { + "type": "string" + }, + "detail": { + "type": "string" + }, + "status": { + "type": "number" + }, + "code": { + "type": "string" + }, + "errors": { + "type": "array", + "items": { + "type": "object", + "properties": { + "detail": { + "type": "string" + }, + "pointer": { + "type": "string" + }, + "parameter": { + "type": "string" + } + }, + "required": [ + "detail" + ] + } + } + }, + "required": [ + "type", + "title", + "detail", + "status", + "code" + ] + } + } + } + }, + "401": { + "description": "Erro do tipo Unauthorized: Access token not set or invalid, and the request resource could not be returned. Veja http://localhost:3000/api/v1docs/#/problems?id=unauthorized", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "type": { + "type": "string" + }, + "title": { + "type": "string" + }, + "detail": { + "type": "string" + }, + "status": { + "type": "number" + }, + "code": { + "type": "string" + }, + "errors": { + "type": "array", + "items": { + "type": "object", + "properties": { + "detail": { + "type": "string" + }, + "pointer": { + "type": "string" + }, + "parameter": { + "type": "string" + } + }, + "required": [ + "detail" + ] + } + } + }, + "required": [ + "type", + "title", + "detail", + "status", + "code" + ] + } + } + } + }, + "403": { + "description": "Erro do tipo Forbidden: The resource could not be returned as the requestor is not authorized. Veja http://localhost:3000/api/v1docs/#/problems?id=forbidden", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "type": { + "type": "string" + }, + "title": { + "type": "string" + }, + "detail": { + "type": "string" + }, + "status": { + "type": "number" + }, + "code": { + "type": "string" + }, + "errors": { + "type": "array", + "items": { + "type": "object", + "properties": { + "detail": { + "type": "string" + }, + "pointer": { + "type": "string" + }, + "parameter": { + "type": "string" + } + }, + "required": [ + "detail" + ] + } + } + }, + "required": [ + "type", + "title", + "detail", + "status", + "code" + ] + } + } + } + }, + "404": { + "description": "Erro do tipo Not Found: The requested resource was not found. Veja http://localhost:3000/api/v1docs/#/problems?id=not-found", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "type": { + "type": "string" + }, + "title": { + "type": "string" + }, + "detail": { + "type": "string" + }, + "status": { + "type": "number" + }, + "code": { + "type": "string" + }, + "errors": { + "type": "array", + "items": { + "type": "object", + "properties": { + "detail": { + "type": "string" + }, + "pointer": { + "type": "string" + }, + "parameter": { + "type": "string" + } + }, + "required": [ + "detail" + ] + } + } + }, + "required": [ + "type", + "title", + "detail", + "status", + "code" + ] + } + } + } + }, + "422": { + "description": "Erro do tipo Validation Error: The request is not valid. Veja http://localhost:3000/api/v1docs/#/problems?id=validation-error", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "type": { + "type": "string" + }, + "title": { + "type": "string" + }, + "detail": { + "type": "string" + }, + "status": { + "type": "number" + }, + "code": { + "type": "string" + }, + "errors": { + "type": "array", + "items": { + "type": "object", + "properties": { + "detail": { + "type": "string" + }, + "pointer": { + "type": "string" + }, + "parameter": { + "type": "string" + } + }, + "required": [ + "detail" + ] + } + } + }, + "required": [ + "type", + "title", + "detail", + "status", + "code" + ] + } + } + } + }, + "500": { + "description": "Erro do tipo Server Error: The server encountered an unexpected error. Veja http://localhost:3000/api/v1docs/#/problems?id=server-error", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "type": { + "type": "string" + }, + "title": { + "type": "string" + }, + "detail": { + "type": "string" + }, + "status": { + "type": "number" + }, + "code": { + "type": "string" + }, + "errors": { + "type": "array", + "items": { + "type": "object", + "properties": { + "detail": { + "type": "string" + }, + "pointer": { + "type": "string" + }, + "parameter": { + "type": "string" + } + }, + "required": [ + "detail" + ] + } + } + }, + "required": [ + "type", + "title", + "detail", + "status", + "code" + ] + } + } + } + } + } + } + }, + "/collection-points/{collectionPointId}": { + "get": { + "tags": [ + "Pontos de Coleta" + ], + "summary": "Obter ponto de coleta por id", + "description": "Retorna o ponto de coleta com o id especificado", + "parameters": [ + { + "schema": { + "$ref": "#/components/schemas/CollectionPointId" + }, + "required": true, + "name": "collectionPointId", + "in": "path" + } + ], + "responses": { + "200": { + "description": "Um ponto de coleta no contexto de uma rota", + "content": { + "application/json": { + "schema": { + "allOf": [ + { + "$ref": "#/components/schemas/CollectionPoint" + }, + { + "description": "Um ponto de coleta de resíduo de vidro" + } + ] + } + } + } + }, + "400": { + "description": "Erro do tipo Invalid Parameters: The request contained invalid, or malformed parameters (path, header or query). Veja http://localhost:3000/api/v1docs/#/problems?id=invalid-parameters", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "type": { + "type": "string" + }, + "title": { + "type": "string" + }, + "detail": { + "type": "string" + }, + "status": { + "type": "number" + }, + "code": { + "type": "string" + }, + "errors": { + "type": "array", + "items": { + "type": "object", + "properties": { + "detail": { + "type": "string" + }, + "pointer": { + "type": "string" + }, + "parameter": { + "type": "string" + } + }, + "required": [ + "detail" + ] + } + } + }, + "required": [ + "type", + "title", + "detail", + "status", + "code" + ] + } + } + } + }, + "401": { + "description": "Erro do tipo Unauthorized: Access token not set or invalid, and the request resource could not be returned. Veja http://localhost:3000/api/v1docs/#/problems?id=unauthorized", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "type": { + "type": "string" + }, + "title": { + "type": "string" + }, + "detail": { + "type": "string" + }, + "status": { + "type": "number" + }, + "code": { + "type": "string" + }, + "errors": { + "type": "array", + "items": { + "type": "object", + "properties": { + "detail": { + "type": "string" + }, + "pointer": { + "type": "string" + }, + "parameter": { + "type": "string" + } + }, + "required": [ + "detail" + ] + } + } + }, + "required": [ + "type", + "title", + "detail", + "status", + "code" + ] + } + } + } + }, + "403": { + "description": "Erro do tipo Forbidden: The resource could not be returned as the requestor is not authorized. Veja http://localhost:3000/api/v1docs/#/problems?id=forbidden", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "type": { + "type": "string" + }, + "title": { + "type": "string" + }, + "detail": { + "type": "string" + }, + "status": { + "type": "number" + }, + "code": { + "type": "string" + }, + "errors": { + "type": "array", + "items": { + "type": "object", + "properties": { + "detail": { + "type": "string" + }, + "pointer": { + "type": "string" + }, + "parameter": { + "type": "string" + } + }, + "required": [ + "detail" + ] + } + } + }, + "required": [ + "type", + "title", + "detail", + "status", + "code" + ] + } + } + } + }, + "404": { + "description": "Erro do tipo Not Found: The requested resource was not found. Veja http://localhost:3000/api/v1docs/#/problems?id=not-found", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "type": { + "type": "string" + }, + "title": { + "type": "string" + }, + "detail": { + "type": "string" + }, + "status": { + "type": "number" + }, + "code": { + "type": "string" + }, + "errors": { + "type": "array", + "items": { + "type": "object", + "properties": { + "detail": { + "type": "string" + }, + "pointer": { + "type": "string" + }, + "parameter": { + "type": "string" + } + }, + "required": [ + "detail" + ] + } + } + }, + "required": [ + "type", + "title", + "detail", + "status", + "code" + ] + } + } + } + }, + "422": { + "description": "Erro do tipo Validation Error: The request is not valid. Veja http://localhost:3000/api/v1docs/#/problems?id=validation-error", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "type": { + "type": "string" + }, + "title": { + "type": "string" + }, + "detail": { + "type": "string" + }, + "status": { + "type": "number" + }, + "code": { + "type": "string" + }, + "errors": { + "type": "array", + "items": { + "type": "object", + "properties": { + "detail": { + "type": "string" + }, + "pointer": { + "type": "string" + }, + "parameter": { + "type": "string" + } + }, + "required": [ + "detail" + ] + } + } + }, + "required": [ + "type", + "title", + "detail", + "status", + "code" + ] + } + } + } + }, + "500": { + "description": "Erro do tipo Server Error: The server encountered an unexpected error. Veja http://localhost:3000/api/v1docs/#/problems?id=server-error", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "type": { + "type": "string" + }, + "title": { + "type": "string" + }, + "detail": { + "type": "string" + }, + "status": { + "type": "number" + }, + "code": { + "type": "string" + }, + "errors": { + "type": "array", + "items": { + "type": "object", + "properties": { + "detail": { + "type": "string" + }, + "pointer": { + "type": "string" + }, + "parameter": { + "type": "string" + } + }, + "required": [ + "detail" + ] + } + } + }, + "required": [ + "type", + "title", + "detail", + "status", + "code" + ] + } + } + } + } + } + } + }, + "/collection-points/": { + "post": { + "tags": [ + "Pontos de Coleta" + ], + "summary": "Cria um ponto de coleta", + "description": "Retorna o ponto de coleta criado", + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "name": { + "type": "string", + "description": "Nome do ponto de coleta" + }, + "responsible": { + "$ref": "#/components/schemas/Responsible" + }, + "type": { + "$ref": "#/components/schemas/CollectionPointType" + }, + "address": { + "$ref": "#/components/schemas/Address" + }, + "status": { + "$ref": "#/components/schemas/CollectionPointStatus" + }, + "contact": { + "type": "object", + "properties": { + "name": { + "type": "string", + "description": "Nome do contato" + }, + "role": { + "$ref": "#/components/schemas/ContactRole" + }, + "phone": { + "type": "string", + "description": "Telefone do contato" + }, + "email": { + "type": "string", + "description": "E-mail do contato" + } + }, + "required": [ + "name", + "phone", + "email" + ], + "description": "Informações de contato do ponto de coleta" + }, + "weeklyGlassVolume": { + "type": "number", + "description": "Volume de vidro semanal (em garrafas)" + }, + "bestCollectionDay": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Weekday" + }, + "description": "Melhor dia da semana para a coleta" + }, + "selectiveCollectionDay": { + "type": "array", + "items": { + "$ref": "#/components/schemas/ExtendedWeekday" + }, + "description": "Dia da coleta seletiva (prefeitura/empresa)" + }, + "shifts": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Shift" + }, + "description": "Melhor período para a coleta" + }, + "operatorId": { + "type": "string", + "format": "uuid", + "description": "UUID4 do operador a que esse ponto de coleta pertence" + }, + "relevantInfos": { + "type": "string", + "description": "Informações relevantes para o ponto de coleta" + } + }, + "required": [ + "name", + "type", + "address", + "status", + "contact", + "operatorId" + ] + } + } + } + }, + "responses": { + "200": { + "description": "O ponto de coleta criado", + "content": { + "application/json": { + "schema": { + "allOf": [ + { + "$ref": "#/components/schemas/CollectionPoint" + }, + { + "description": "Um ponto de coleta de resíduo de vidro" + } + ] + } + } + } + }, + "400": { + "description": "Erro do tipo Invalid Parameters: The request contained invalid, or malformed parameters (path, header or query). Veja http://localhost:3000/api/v1docs/#/problems?id=invalid-parameters", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "type": { + "type": "string" + }, + "title": { + "type": "string" + }, + "detail": { + "type": "string" + }, + "status": { + "type": "number" + }, + "code": { + "type": "string" + }, + "errors": { + "type": "array", + "items": { + "type": "object", + "properties": { + "detail": { + "type": "string" + }, + "pointer": { + "type": "string" + }, + "parameter": { + "type": "string" + } + }, + "required": [ + "detail" + ] + } + } + }, + "required": [ + "type", + "title", + "detail", + "status", + "code" + ] + } + } + } + }, + "401": { + "description": "Erro do tipo Unauthorized: Access token not set or invalid, and the request resource could not be returned. Veja http://localhost:3000/api/v1docs/#/problems?id=unauthorized", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "type": { + "type": "string" + }, + "title": { + "type": "string" + }, + "detail": { + "type": "string" + }, + "status": { + "type": "number" + }, + "code": { + "type": "string" + }, + "errors": { + "type": "array", + "items": { + "type": "object", + "properties": { + "detail": { + "type": "string" + }, + "pointer": { + "type": "string" + }, + "parameter": { + "type": "string" + } + }, + "required": [ + "detail" + ] + } + } + }, + "required": [ + "type", + "title", + "detail", + "status", + "code" + ] + } + } + } + }, + "403": { + "description": "Erro do tipo Forbidden: The resource could not be returned as the requestor is not authorized. Veja http://localhost:3000/api/v1docs/#/problems?id=forbidden", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "type": { + "type": "string" + }, + "title": { + "type": "string" + }, + "detail": { + "type": "string" + }, + "status": { + "type": "number" + }, + "code": { + "type": "string" + }, + "errors": { + "type": "array", + "items": { + "type": "object", + "properties": { + "detail": { + "type": "string" + }, + "pointer": { + "type": "string" + }, + "parameter": { + "type": "string" + } + }, + "required": [ + "detail" + ] + } + } + }, + "required": [ + "type", + "title", + "detail", + "status", + "code" + ] + } + } + } + }, + "404": { + "description": "Erro do tipo Not Found: The requested resource was not found. Veja http://localhost:3000/api/v1docs/#/problems?id=not-found", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "type": { + "type": "string" + }, + "title": { + "type": "string" + }, + "detail": { + "type": "string" + }, + "status": { + "type": "number" + }, + "code": { + "type": "string" + }, + "errors": { + "type": "array", + "items": { + "type": "object", + "properties": { + "detail": { + "type": "string" + }, + "pointer": { + "type": "string" + }, + "parameter": { + "type": "string" + } + }, + "required": [ + "detail" + ] + } + } + }, + "required": [ + "type", + "title", + "detail", + "status", + "code" + ] + } + } + } + }, + "422": { + "description": "Erro do tipo Validation Error: The request is not valid. Veja http://localhost:3000/api/v1docs/#/problems?id=validation-error", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "type": { + "type": "string" + }, + "title": { + "type": "string" + }, + "detail": { + "type": "string" + }, + "status": { + "type": "number" + }, + "code": { + "type": "string" + }, + "errors": { + "type": "array", + "items": { + "type": "object", + "properties": { + "detail": { + "type": "string" + }, + "pointer": { + "type": "string" + }, + "parameter": { + "type": "string" + } + }, + "required": [ + "detail" + ] + } + } + }, + "required": [ + "type", + "title", + "detail", + "status", + "code" + ] + } + } + } + }, + "500": { + "description": "Erro do tipo Server Error: The server encountered an unexpected error. Veja http://localhost:3000/api/v1docs/#/problems?id=server-error", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "type": { + "type": "string" + }, + "title": { + "type": "string" + }, + "detail": { + "type": "string" + }, + "status": { + "type": "number" + }, + "code": { + "type": "string" + }, + "errors": { + "type": "array", + "items": { + "type": "object", + "properties": { + "detail": { + "type": "string" + }, + "pointer": { + "type": "string" + }, + "parameter": { + "type": "string" + } + }, + "required": [ + "detail" + ] + } + } + }, + "required": [ + "type", + "title", + "detail", + "status", + "code" + ] + } + } + } + } } + } }, - "paths": { - "/response-conformance/incorrect-content-type": { - "get": { - "summary": "Returning a response with a content type that differs from what is specified in the API schema, leading to potential client-side issues as the clients might be expecting a different data format.", - "description": "In this scenario, when the `item_id` parameter is set to \"error\", the server returns a plain text response, violating the API schema and potentially causing bugs and failures in client applications.", - "responses": { - "200": { - "description": "Successful response", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "name": { - "type": "string" - } - } - } - } - } + "/routes/{routeId}/collections/{collectionId}/start": { + "post": { + "tags": [ + "Rotas" + ], + "summary": "Inicia coleta pelo usuário atualmente logado", + "description": "Retorna a coleta depois de iniciada", + "parameters": [ + { + "schema": { + "$ref": "#/components/schemas/CollectionId" + }, + "required": true, + "name": "collectionId", + "in": "path" + }, + { + "schema": { + "allOf": [ + { + "$ref": "#/components/schemas/RouteId" + }, + { + "description": "UUID da rota associada" + } + ] + }, + "required": true, + "name": "routeId", + "in": "path" + } + ], + "responses": { + "200": { + "description": "A coleta que foi iniciada", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Collection" + } + } + } + }, + "400": { + "description": "Erro do tipo Invalid Parameters: The request contained invalid, or malformed parameters (path, header or query). Veja http://localhost:3000/api/v1docs/#/problems?id=invalid-parameters", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "type": { + "type": "string" + }, + "title": { + "type": "string" + }, + "detail": { + "type": "string" + }, + "status": { + "type": "number" + }, + "code": { + "type": "string" + }, + "errors": { + "type": "array", + "items": { + "type": "object", + "properties": { + "detail": { + "type": "string" + }, + "pointer": { + "type": "string" + }, + "parameter": { + "type": "string" + } + }, + "required": [ + "detail" + ] + } } + }, + "required": [ + "type", + "title", + "detail", + "status", + "code" + ] } + } } - }, - "/response-conformance/missing-field": { - "get": { - "summary": "Returning a response that misses some fields specified in the API schema. This discrepancy can lead to integration issues, as clients expecting the missing field might encounter errors or incorrect behavior.", - "description": "In this instance, the \"age\" field, as defined in the API schema, is absent from the response, which might result in errors or unexpected behavior in client applications.", - "responses": { - "200": { - "description": "Successful response", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "id": { - "type": "string" - }, - "name": { - "type": "string" - }, - "age": { - "type": "integer" - } - }, - "required": [ - "id", - "name", - "age" - ] - } - } - } + }, + "401": { + "description": "Erro do tipo Unauthorized: Access token not set or invalid, and the request resource could not be returned. Veja http://localhost:3000/api/v1docs/#/problems?id=unauthorized", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "type": { + "type": "string" + }, + "title": { + "type": "string" + }, + "detail": { + "type": "string" + }, + "status": { + "type": "number" + }, + "code": { + "type": "string" + }, + "errors": { + "type": "array", + "items": { + "type": "object", + "properties": { + "detail": { + "type": "string" + }, + "pointer": { + "type": "string" + }, + "parameter": { + "type": "string" + } + }, + "required": [ + "detail" + ] + } } + }, + "required": [ + "type", + "title", + "detail", + "status", + "code" + ] } + } } - }, - "/response-conformance/undocumented-status-code": { - "get": { - "summary": "An issue where the server responds with a status code that is not documented in the OpenAPI schema.", - "description": "In this scenario, the API endpoint can potentially return a 404 status code when the requested ID does not exist in the database,\nleading to unexpected behaviors in client applications.", - "parameters": [ - { - "name": "id", - "in": "query", - "description": "The ID of the item to fetch", - "required": true, - "schema": { - "type": "integer" - } + }, + "403": { + "description": "Erro do tipo Forbidden: The resource could not be returned as the requestor is not authorized. Veja http://localhost:3000/api/v1docs/#/problems?id=forbidden", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "type": { + "type": "string" + }, + "title": { + "type": "string" + }, + "detail": { + "type": "string" + }, + "status": { + "type": "number" + }, + "code": { + "type": "string" + }, + "errors": { + "type": "array", + "items": { + "type": "object", + "properties": { + "detail": { + "type": "string" + }, + "pointer": { + "type": "string" + }, + "parameter": { + "type": "string" + } + }, + "required": [ + "detail" + ] + } } - ], - "responses": { - "200": { - "description": "Success", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "message": { - "type": "string" - } - }, - "required": [ - "message" - ] - } - } - } + }, + "required": [ + "type", + "title", + "detail", + "status", + "code" + ] + } + } + } + }, + "404": { + "description": "Erro do tipo Not Found: The requested resource was not found. Veja http://localhost:3000/api/v1docs/#/problems?id=not-found", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "type": { + "type": "string" }, - "400": { - "description": "Invalid input.", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "error": { - "type": "string", - "description": "A descriptive error message indicating the input validation failure." - } - } - } - } - } + "title": { + "type": "string" + }, + "detail": { + "type": "string" + }, + "status": { + "type": "number" + }, + "code": { + "type": "string" + }, + "errors": { + "type": "array", + "items": { + "type": "object", + "properties": { + "detail": { + "type": "string" + }, + "pointer": { + "type": "string" + }, + "parameter": { + "type": "string" + } + }, + "required": [ + "detail" + ] + } } + }, + "required": [ + "type", + "title", + "detail", + "status", + "code" + ] } + } } - }, - "/response-conformance/malformed-json": { - "get": { - "summary": "An issue where the server responds with unstructured error messages instead of the expected structured JSON format, leading to potential confusion and improper handling of the response.", - "description": "In this scenario, the server returns a malformed JSON string due to a typo while bypassing regular JSON serialization for perceived simplicity.\nThis could lead to errors in clients using standard JSON parsers to interpret the response.", - "responses": { - "default": { - "description": "Default response.", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "success": { - "type": "boolean", - "description": "Indicates whether response is successful." - } - }, - "required": [ - "success" - ] - } - } - } + }, + "422": { + "description": "Erro do tipo Validation Error: The request is not valid. Veja http://localhost:3000/api/v1docs/#/problems?id=validation-error", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "type": { + "type": "string" + }, + "title": { + "type": "string" + }, + "detail": { + "type": "string" + }, + "status": { + "type": "number" + }, + "code": { + "type": "string" + }, + "errors": { + "type": "array", + "items": { + "type": "object", + "properties": { + "detail": { + "type": "string" + }, + "pointer": { + "type": "string" + }, + "parameter": { + "type": "string" + } + }, + "required": [ + "detail" + ] + } } + }, + "required": [ + "type", + "title", + "detail", + "status", + "code" + ] } + } } - }, - "/internal-server-errors/improper-unicode-encoding": { - "post": { - "summary": "The section highlights issues stemming from the improper handling of Unicode inputs, including emojis and other non-standard text elements.", - "description": "Here, the improper handling of a text input containing Unicode characters during an attempt to encode it to ASCII format triggers a `UnicodeDecodeError`.", - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "text": { - "type": "string", - "description": "The input text to be encoded to ASCII." - } - }, - "required": [ - "text" - ] - } - } + }, + "500": { + "description": "Erro do tipo Server Error: The server encountered an unexpected error. Veja http://localhost:3000/api/v1docs/#/problems?id=server-error", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "type": { + "type": "string" + }, + "title": { + "type": "string" + }, + "detail": { + "type": "string" + }, + "status": { + "type": "number" + }, + "code": { + "type": "string" + }, + "errors": { + "type": "array", + "items": { + "type": "object", + "properties": { + "detail": { + "type": "string" + }, + "pointer": { + "type": "string" + }, + "parameter": { + "type": "string" + } + }, + "required": [ + "detail" + ] + } } + }, + "required": [ + "type", + "title", + "detail", + "status", + "code" + ] + } + } + } + } + } + } + }, + "/routes/{routeId}/collections/{collectionId}/finish": { + "post": { + "tags": [ + "Rotas" + ], + "summary": "Finaliza uma coleta pelo usuário atualmente logado", + "description": "Retorna uma coleta depois de finalizada", + "parameters": [ + { + "schema": { + "$ref": "#/components/schemas/CollectionId" + }, + "required": true, + "name": "collectionId", + "in": "path" + }, + { + "schema": { + "allOf": [ + { + "$ref": "#/components/schemas/RouteId" }, - "responses": { - "200": { - "description": "Successfully encoded the text to ASCII.", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "success": { - "type": "boolean", - "description": "Indicates whether the text encoding was successful.", - "example": true - } - } - } - } - } + { + "description": "UUID da rota associada" + } + ] + }, + "required": true, + "name": "routeId", + "in": "path" + } + ], + "responses": { + "200": { + "description": "A coleta finalizada", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Collection" + } + } + } + }, + "400": { + "description": "Erro do tipo Invalid Parameters: The request contained invalid, or malformed parameters (path, header or query). Veja http://localhost:3000/api/v1docs/#/problems?id=invalid-parameters", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "type": { + "type": "string" }, - "400": { - "description": "Bad Request, missing 'text' field in the request body.", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "success": { - "type": "boolean", - "description": "Always false for this response.", - "example": false - }, - "error": { - "type": "string", - "description": "Error message indicating the missing 'text' field.", - "example": "Missing text field" - } - } - } - } - } + "title": { + "type": "string" }, - "500": { - "description": "Internal Server Error due to Unicode handling error.", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "success": { - "type": "boolean", - "description": "Always false for this response.", - "example": false - }, - "error": { - "type": "string", - "description": "Error message indicating Unicode handling error.", - "example": "Unicode handling error" - } - } - } - } - } + "detail": { + "type": "string" + }, + "status": { + "type": "number" + }, + "code": { + "type": "string" + }, + "errors": { + "type": "array", + "items": { + "type": "object", + "properties": { + "detail": { + "type": "string" + }, + "pointer": { + "type": "string" + }, + "parameter": { + "type": "string" + } + }, + "required": [ + "detail" + ] + } } + }, + "required": [ + "type", + "title", + "detail", + "status", + "code" + ] } + } } - }, - "/internal-server-errors/improper-input-type-handling": { - "post": { - "summary": "An issue originating from improper input validation, allowing non-numeric inputs to cause a server error during the card number validation process.", - "description": "In this example, the server errors when it attempts to convert non-numeric characters to integers, which is not properly handled in the card number validation process.", - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "number": { - "type": "string", - "description": "The credit card number to validate.", - "example": "1234567812345670" - } - }, - "required": [ - "number" - ] - } - } + }, + "401": { + "description": "Erro do tipo Unauthorized: Access token not set or invalid, and the request resource could not be returned. Veja http://localhost:3000/api/v1docs/#/problems?id=unauthorized", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "type": { + "type": "string" + }, + "title": { + "type": "string" + }, + "detail": { + "type": "string" + }, + "status": { + "type": "number" + }, + "code": { + "type": "string" + }, + "errors": { + "type": "array", + "items": { + "type": "object", + "properties": { + "detail": { + "type": "string" + }, + "pointer": { + "type": "string" + }, + "parameter": { + "type": "string" + } + }, + "required": [ + "detail" + ] + } } - }, - "responses": { - "default": { - "description": "Card number validation result", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "success": { - "type": "boolean", - "description": "Indicates whether the card number is valid." - }, - "error": { - "type": "string", - "description": "Error text if any." - } - }, - "required": [ - "success" - ] - } - } - } + }, + "required": [ + "type", + "title", + "detail", + "status", + "code" + ] + } + } + } + }, + "403": { + "description": "Erro do tipo Forbidden: The resource could not be returned as the requestor is not authorized. Veja http://localhost:3000/api/v1docs/#/problems?id=forbidden", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "type": { + "type": "string" + }, + "title": { + "type": "string" + }, + "detail": { + "type": "string" + }, + "status": { + "type": "number" + }, + "code": { + "type": "string" + }, + "errors": { + "type": "array", + "items": { + "type": "object", + "properties": { + "detail": { + "type": "string" + }, + "pointer": { + "type": "string" + }, + "parameter": { + "type": "string" + } + }, + "required": [ + "detail" + ] + } } + }, + "required": [ + "type", + "title", + "detail", + "status", + "code" + ] } + } } - }, - "/internal-server-errors/exceeding-column-size": { - "post": { - "summary": "A server error can occur when attempting to store an input exceeding the database column's restricted size, resulting in a database error.", - "description": "In this scenario, an attempt to store input text that exceeds the 255 character limit of the database column results in a database error and server failure.", - "requestBody": { - "required": true, - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "text": { - "type": "string", - "description": "The input text to be stored in the database." - } - }, - "required": [ - "text" - ], - "additionalProperties": false - } - } + }, + "404": { + "description": "Erro do tipo Not Found: The requested resource was not found. Veja http://localhost:3000/api/v1docs/#/problems?id=not-found", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "type": { + "type": "string" + }, + "title": { + "type": "string" + }, + "detail": { + "type": "string" + }, + "status": { + "type": "number" + }, + "code": { + "type": "string" + }, + "errors": { + "type": "array", + "items": { + "type": "object", + "properties": { + "detail": { + "type": "string" + }, + "pointer": { + "type": "string" + }, + "parameter": { + "type": "string" + } + }, + "required": [ + "detail" + ] + } } - }, - "responses": { - "200": { - "description": "Successfully stored the input text in the database.", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "success": { - "type": "boolean", - "description": "Indicates whether the text was successfully stored in the database.", - "example": true - } - } - } - } - } + }, + "required": [ + "type", + "title", + "detail", + "status", + "code" + ] + } + } + } + }, + "422": { + "description": "Erro do tipo Validation Error: The request is not valid. Veja http://localhost:3000/api/v1docs/#/problems?id=validation-error", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "type": { + "type": "string" }, - "400": { - "description": "Bad Request, missing 'text' field in the request body.", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "success": { - "type": "boolean", - "description": "Always false for this response.", - "example": false - } - } - } - } - } + "title": { + "type": "string" }, - "500": { - "description": "Internal Server Error due to a database error.", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "success": { - "type": "boolean", - "description": "Always false for this response.", - "example": false - }, - "error": { - "type": "string", - "description": "Error message indicating a database error.", - "example": "Database error" - } - } - } - } - } + "detail": { + "type": "string" + }, + "status": { + "type": "number" + }, + "code": { + "type": "string" + }, + "errors": { + "type": "array", + "items": { + "type": "object", + "properties": { + "detail": { + "type": "string" + }, + "pointer": { + "type": "string" + }, + "parameter": { + "type": "string" + } + }, + "required": [ + "detail" + ] + } } + }, + "required": [ + "type", + "title", + "detail", + "status", + "code" + ] } + } } - }, - "/performance/inefficient-algorithm": { - "get": { - "summary": "Inefficient algorithms can significantly slow down API responses, especially when handling large input, leading to poor performance and potential timeouts.", - "description": "In this scenario, generating a large Fibonacci sequence using an inefficient algorithm results in slow response times. The impact is particularly noticeable when searching for a term within the sequence, as the delay compounds, potentially leading to timeouts and degraded user experience. Setting reasonable limits on input sizes and optimizing algorithms are essential to mitigate such performance issues.", - "parameters": [ - { - "name": "n", - "in": "query", - "description": "The length of the Fibonacci sequence to be generated.", - "required": true, - "schema": { - "type": "integer", - "minimum": 1, - "maximum": 100000 - } + }, + "500": { + "description": "Erro do tipo Server Error: The server encountered an unexpected error. Veja http://localhost:3000/api/v1docs/#/problems?id=server-error", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "type": { + "type": "string" }, - { - "name": "searchTerm", - "in": "query", - "description": "The term to search for within the generated Fibonacci sequence.", - "required": true, - "schema": { - "type": "integer", - "minimum": 0 - } + "title": { + "type": "string" + }, + "detail": { + "type": "string" + }, + "status": { + "type": "number" + }, + "code": { + "type": "string" + }, + "errors": { + "type": "array", + "items": { + "type": "object", + "properties": { + "detail": { + "type": "string" + }, + "pointer": { + "type": "string" + }, + "parameter": { + "type": "string" + } + }, + "required": [ + "detail" + ] + } } - ], - "responses": { - "200": { - "description": "Successfully found the search term in the Fibonacci sequence.", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "foundAt": { - "type": "array", - "items": { - "type": "integer" - }, - "description": "The indices at which the search term was found in the Fibonacci sequence." - } - } - } - } - } + }, + "required": [ + "type", + "title", + "detail", + "status", + "code" + ] + } + } + } + } + } + } + }, + "/collections/{collectionId}": { + "get": { + "tags": [ + "Coletas" + ], + "summary": "Obter coleta por id", + "description": "Retorna a coleta com o id especificado", + "parameters": [ + { + "schema": { + "$ref": "#/components/schemas/CollectionId" + }, + "required": true, + "name": "collectionId", + "in": "path" + } + ], + "responses": { + "200": { + "description": "Coleta retornada com sucesso", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Collection" + } + } + } + }, + "400": { + "description": "Erro do tipo Invalid Parameters: The request contained invalid, or malformed parameters (path, header or query). Veja http://localhost:3000/api/v1docs/#/problems?id=invalid-parameters", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "type": { + "type": "string" }, - "400": { - "description": "Invalid input. The 'n' should be less than or equal to 30 and 'searchTerm' must be a non-negative integer.", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "error": { - "type": "string", - "description": "A descriptive error message indicating the input validation failure." - } - } - } - } - } + "title": { + "type": "string" + }, + "detail": { + "type": "string" + }, + "status": { + "type": "number" + }, + "code": { + "type": "string" + }, + "errors": { + "type": "array", + "items": { + "type": "object", + "properties": { + "detail": { + "type": "string" + }, + "pointer": { + "type": "string" + }, + "parameter": { + "type": "string" + } + }, + "required": [ + "detail" + ] + } } + }, + "required": [ + "type", + "title", + "detail", + "status", + "code" + ] } + } } - }, - "/performance/unbounded-result-set": { - "get": { - "summary": "Endpoints returning extensive, unbounded result sets can significantly strain server resources, leading to performance degradation and potentially rendering the service unresponsive.", - "description": "This case illustrates an endpoint that allows clients to request a large number of items without proper limitations. Implementing pagination or enforcing limitations on result set sizes is essential to prevent server strain, maintain optimal performance, and keep the service responsive.", - "parameters": [ - { - "name": "limit", - "in": "query", - "description": "The number of items to fetch. Must be greater than 0 and not exceed the maximum limit.", - "required": true, - "schema": { - "type": "integer", - "default": 120, - "maximum": 120, - "minimum": 1 - } + }, + "401": { + "description": "Erro do tipo Unauthorized: Access token not set or invalid, and the request resource could not be returned. Veja http://localhost:3000/api/v1docs/#/problems?id=unauthorized", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "type": { + "type": "string" + }, + "title": { + "type": "string" + }, + "detail": { + "type": "string" + }, + "status": { + "type": "number" + }, + "code": { + "type": "string" + }, + "errors": { + "type": "array", + "items": { + "type": "object", + "properties": { + "detail": { + "type": "string" + }, + "pointer": { + "type": "string" + }, + "parameter": { + "type": "string" + } + }, + "required": [ + "detail" + ] + } } - ], - "responses": { - "200": { - "description": "Successfully fetched items.", - "content": { - "application/json": { - "schema": { - "type": "object", - "additionalProperties": { - "type": "integer", - "description": "The data for each item." - } - } - } - } + }, + "required": [ + "type", + "title", + "detail", + "status", + "code" + ] + } + } + } + }, + "403": { + "description": "Erro do tipo Forbidden: The resource could not be returned as the requestor is not authorized. Veja http://localhost:3000/api/v1docs/#/problems?id=forbidden", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "type": { + "type": "string" }, - "400": { - "description": "Bad Request. Limit must be greater than 0.", - "content": { - "application/json": { - "schema": { - "type": "object", - "properties": { - "error": { - "type": "string", - "example": "Limit must be greater than 0" - } - } - } - } - } + "title": { + "type": "string" + }, + "detail": { + "type": "string" + }, + "status": { + "type": "number" + }, + "code": { + "type": "string" + }, + "errors": { + "type": "array", + "items": { + "type": "object", + "properties": { + "detail": { + "type": "string" + }, + "pointer": { + "type": "string" + }, + "parameter": { + "type": "string" + } + }, + "required": [ + "detail" + ] + } + } + }, + "required": [ + "type", + "title", + "detail", + "status", + "code" + ] + } + } + } + }, + "404": { + "description": "Erro do tipo Not Found: The requested resource was not found. Veja http://localhost:3000/api/v1docs/#/problems?id=not-found", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "type": { + "type": "string" + }, + "title": { + "type": "string" + }, + "detail": { + "type": "string" + }, + "status": { + "type": "number" + }, + "code": { + "type": "string" + }, + "errors": { + "type": "array", + "items": { + "type": "object", + "properties": { + "detail": { + "type": "string" + }, + "pointer": { + "type": "string" + }, + "parameter": { + "type": "string" + } + }, + "required": [ + "detail" + ] + } + } + }, + "required": [ + "type", + "title", + "detail", + "status", + "code" + ] + } + } + } + }, + "422": { + "description": "Erro do tipo Validation Error: The request is not valid. Veja http://localhost:3000/api/v1docs/#/problems?id=validation-error", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "type": { + "type": "string" + }, + "title": { + "type": "string" + }, + "detail": { + "type": "string" + }, + "status": { + "type": "number" + }, + "code": { + "type": "string" + }, + "errors": { + "type": "array", + "items": { + "type": "object", + "properties": { + "detail": { + "type": "string" + }, + "pointer": { + "type": "string" + }, + "parameter": { + "type": "string" + } + }, + "required": [ + "detail" + ] + } + } + }, + "required": [ + "type", + "title", + "detail", + "status", + "code" + ] + } + } + } + }, + "500": { + "description": "Erro do tipo Server Error: The server encountered an unexpected error. Veja http://localhost:3000/api/v1docs/#/problems?id=server-error", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "type": { + "type": "string" + }, + "title": { + "type": "string" + }, + "detail": { + "type": "string" + }, + "status": { + "type": "number" + }, + "code": { + "type": "string" + }, + "errors": { + "type": "array", + "items": { + "type": "object", + "properties": { + "detail": { + "type": "string" + }, + "pointer": { + "type": "string" + }, + "parameter": { + "type": "string" + } + }, + "required": [ + "detail" + ] + } + } + }, + "required": [ + "type", + "title", + "detail", + "status", + "code" + ] + } + } + } + } + } + } + }, + "/vehicles": { + "get": { + "tags": [ + "Veículos" + ], + "summary": "Listar veículos disponíveis", + "description": "Retorna uma lista de veículos disponíveis para o motorista do TRIVIM", + "responses": { + "200": { + "description": "Uma lista de veículos disponíveis", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Vehicle" + } + } + } + } + }, + "400": { + "description": "Erro do tipo Invalid Parameters: The request contained invalid, or malformed parameters (path, header or query). Veja http://localhost:3000/api/v1docs/#/problems?id=invalid-parameters", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "type": { + "type": "string" + }, + "title": { + "type": "string" + }, + "detail": { + "type": "string" + }, + "status": { + "type": "number" + }, + "code": { + "type": "string" + }, + "errors": { + "type": "array", + "items": { + "type": "object", + "properties": { + "detail": { + "type": "string" + }, + "pointer": { + "type": "string" + }, + "parameter": { + "type": "string" + } + }, + "required": [ + "detail" + ] + } + } + }, + "required": [ + "type", + "title", + "detail", + "status", + "code" + ] + } + } + } + }, + "401": { + "description": "Erro do tipo Unauthorized: Access token not set or invalid, and the request resource could not be returned. Veja http://localhost:3000/api/v1docs/#/problems?id=unauthorized", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "type": { + "type": "string" + }, + "title": { + "type": "string" + }, + "detail": { + "type": "string" + }, + "status": { + "type": "number" + }, + "code": { + "type": "string" + }, + "errors": { + "type": "array", + "items": { + "type": "object", + "properties": { + "detail": { + "type": "string" + }, + "pointer": { + "type": "string" + }, + "parameter": { + "type": "string" + } + }, + "required": [ + "detail" + ] + } + } + }, + "required": [ + "type", + "title", + "detail", + "status", + "code" + ] + } + } + } + }, + "403": { + "description": "Erro do tipo Forbidden: The resource could not be returned as the requestor is not authorized. Veja http://localhost:3000/api/v1docs/#/problems?id=forbidden", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "type": { + "type": "string" + }, + "title": { + "type": "string" + }, + "detail": { + "type": "string" + }, + "status": { + "type": "number" + }, + "code": { + "type": "string" + }, + "errors": { + "type": "array", + "items": { + "type": "object", + "properties": { + "detail": { + "type": "string" + }, + "pointer": { + "type": "string" + }, + "parameter": { + "type": "string" + } + }, + "required": [ + "detail" + ] + } + } + }, + "required": [ + "type", + "title", + "detail", + "status", + "code" + ] + } + } + } + }, + "404": { + "description": "Erro do tipo Not Found: The requested resource was not found. Veja http://localhost:3000/api/v1docs/#/problems?id=not-found", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "type": { + "type": "string" + }, + "title": { + "type": "string" + }, + "detail": { + "type": "string" + }, + "status": { + "type": "number" + }, + "code": { + "type": "string" + }, + "errors": { + "type": "array", + "items": { + "type": "object", + "properties": { + "detail": { + "type": "string" + }, + "pointer": { + "type": "string" + }, + "parameter": { + "type": "string" + } + }, + "required": [ + "detail" + ] + } + } + }, + "required": [ + "type", + "title", + "detail", + "status", + "code" + ] + } + } + } + }, + "422": { + "description": "Erro do tipo Validation Error: The request is not valid. Veja http://localhost:3000/api/v1docs/#/problems?id=validation-error", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "type": { + "type": "string" + }, + "title": { + "type": "string" + }, + "detail": { + "type": "string" + }, + "status": { + "type": "number" + }, + "code": { + "type": "string" + }, + "errors": { + "type": "array", + "items": { + "type": "object", + "properties": { + "detail": { + "type": "string" + }, + "pointer": { + "type": "string" + }, + "parameter": { + "type": "string" + } + }, + "required": [ + "detail" + ] + } + } + }, + "required": [ + "type", + "title", + "detail", + "status", + "code" + ] + } + } + } + }, + "500": { + "description": "Erro do tipo Server Error: The server encountered an unexpected error. Veja http://localhost:3000/api/v1docs/#/problems?id=server-error", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "type": { + "type": "string" + }, + "title": { + "type": "string" + }, + "detail": { + "type": "string" + }, + "status": { + "type": "number" + }, + "code": { + "type": "string" + }, + "errors": { + "type": "array", + "items": { + "type": "object", + "properties": { + "detail": { + "type": "string" + }, + "pointer": { + "type": "string" + }, + "parameter": { + "type": "string" + } + }, + "required": [ + "detail" + ] + } } + }, + "required": [ + "type", + "title", + "detail", + "status", + "code" + ] } + } } + } } + } }, - "servers": [ - { - "url": "https://example.schemathesis.io/" + "/me": { + "get": { + "tags": [ + "Auntenticação" + ], + "summary": "Informações do usuário", + "description": "Retorna informações do usuário atualmente logado", + "responses": { + "200": { + "description": "Uma lista de rotas pendentes", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/User" + } + } + } + }, + "400": { + "description": "Erro do tipo Invalid Parameters: The request contained invalid, or malformed parameters (path, header or query). Veja http://localhost:3000/api/v1docs/#/problems?id=invalid-parameters", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "type": { + "type": "string" + }, + "title": { + "type": "string" + }, + "detail": { + "type": "string" + }, + "status": { + "type": "number" + }, + "code": { + "type": "string" + }, + "errors": { + "type": "array", + "items": { + "type": "object", + "properties": { + "detail": { + "type": "string" + }, + "pointer": { + "type": "string" + }, + "parameter": { + "type": "string" + } + }, + "required": [ + "detail" + ] + } + } + }, + "required": [ + "type", + "title", + "detail", + "status", + "code" + ] + } + } + } + }, + "401": { + "description": "Erro do tipo Unauthorized: Access token not set or invalid, and the request resource could not be returned. Veja http://localhost:3000/api/v1docs/#/problems?id=unauthorized", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "type": { + "type": "string" + }, + "title": { + "type": "string" + }, + "detail": { + "type": "string" + }, + "status": { + "type": "number" + }, + "code": { + "type": "string" + }, + "errors": { + "type": "array", + "items": { + "type": "object", + "properties": { + "detail": { + "type": "string" + }, + "pointer": { + "type": "string" + }, + "parameter": { + "type": "string" + } + }, + "required": [ + "detail" + ] + } + } + }, + "required": [ + "type", + "title", + "detail", + "status", + "code" + ] + } + } + } + }, + "403": { + "description": "Erro do tipo Forbidden: The resource could not be returned as the requestor is not authorized. Veja http://localhost:3000/api/v1docs/#/problems?id=forbidden", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "type": { + "type": "string" + }, + "title": { + "type": "string" + }, + "detail": { + "type": "string" + }, + "status": { + "type": "number" + }, + "code": { + "type": "string" + }, + "errors": { + "type": "array", + "items": { + "type": "object", + "properties": { + "detail": { + "type": "string" + }, + "pointer": { + "type": "string" + }, + "parameter": { + "type": "string" + } + }, + "required": [ + "detail" + ] + } + } + }, + "required": [ + "type", + "title", + "detail", + "status", + "code" + ] + } + } + } + }, + "404": { + "description": "Erro do tipo Not Found: The requested resource was not found. Veja http://localhost:3000/api/v1docs/#/problems?id=not-found", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "type": { + "type": "string" + }, + "title": { + "type": "string" + }, + "detail": { + "type": "string" + }, + "status": { + "type": "number" + }, + "code": { + "type": "string" + }, + "errors": { + "type": "array", + "items": { + "type": "object", + "properties": { + "detail": { + "type": "string" + }, + "pointer": { + "type": "string" + }, + "parameter": { + "type": "string" + } + }, + "required": [ + "detail" + ] + } + } + }, + "required": [ + "type", + "title", + "detail", + "status", + "code" + ] + } + } + } + }, + "422": { + "description": "Erro do tipo Validation Error: The request is not valid. Veja http://localhost:3000/api/v1docs/#/problems?id=validation-error", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "type": { + "type": "string" + }, + "title": { + "type": "string" + }, + "detail": { + "type": "string" + }, + "status": { + "type": "number" + }, + "code": { + "type": "string" + }, + "errors": { + "type": "array", + "items": { + "type": "object", + "properties": { + "detail": { + "type": "string" + }, + "pointer": { + "type": "string" + }, + "parameter": { + "type": "string" + } + }, + "required": [ + "detail" + ] + } + } + }, + "required": [ + "type", + "title", + "detail", + "status", + "code" + ] + } + } + } + }, + "500": { + "description": "Erro do tipo Server Error: The server encountered an unexpected error. Veja http://localhost:3000/api/v1docs/#/problems?id=server-error", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "type": { + "type": "string" + }, + "title": { + "type": "string" + }, + "detail": { + "type": "string" + }, + "status": { + "type": "number" + }, + "code": { + "type": "string" + }, + "errors": { + "type": "array", + "items": { + "type": "object", + "properties": { + "detail": { + "type": "string" + }, + "pointer": { + "type": "string" + }, + "parameter": { + "type": "string" + } + }, + "required": [ + "detail" + ] + } + } + }, + "required": [ + "type", + "title", + "detail", + "status", + "code" + ] + } + } + } + } } - ] + } + } + } } \ No newline at end of file diff --git a/package.json b/package.json new file mode 100644 index 0000000..8dcb4e4 --- /dev/null +++ b/package.json @@ -0,0 +1,118 @@ +{ + "name": "petropolis-api", + "version": "0.1.0", + "description": "API do app do projeto Petrópolis", + "main": "index.js", + "repository": "https://github.com/isi-tics/petropolis-api.git", + "author": "Marvson Allan ", + "license": "UNLICENSED", + "private": true, + "type": "module", + "scripts": { + "local": "dotenvx run -f .env.local -- tsx watch ./src/main.ts", + "test": "dotenvx run -f .env.test -- tsx watch ./src/main.ts", + "deploy": "dotenvx run -f .env -- tsx ./src/main.ts", + "test:smoke": "dotenvx run -f .env.test -- vitest smoke run --run", + "test:unit": "dotenvx run -f .env.test -- vitest unit run --run", + "test:e2e": "dotenvx run -f .env.test -- vitest e2e run --run", + "test:run": "dotenvx run -f .env.test -- vitest run", + "test:ui": "dotenvx run -f .env.test -- vitest --ui", + "test:watch": "dotenvx run -f .env.test -- vitest watch", + "test:coverage": "dotenvx run -f .env.test -- vitest run --coverage", + "e2e:wait": "dotenvx run -f .env.test -- wait-on -c .waitonrc.cjs", + "e2e:bru": "cd ./tests/api && bru run --env local", + "e2e:run": "concurrently -k -s first 'yarn test' 'yarn e2e:wait && yarn e2e:bru'", + "e2e:run:win": "concurrently -k -s first \"yarn test\" \"yarn e2e:wait && yarn e2e:bru\"", + "migrate:local": "dotenvx run -f .env.local -- prisma migrate dev", + "migrate:test": "dotenvx run -f .env.test -- prisma migrate reset -f", + "migrate": "dotenvx run -f .env -- prisma migrate deploy", + "seed:local": "dotenvx run -f .env.local -- prisma db seed", + "seed:test": "dotenvx run -f .env.test -- prisma db seed", + "seed": "dotenvx run -f .env -- prisma db seed", + "migrate:local:reset": "dotenvx run -f .env.local -- prisma migrate reset", + "migrate:test:reset": "dotenvx run -f .env.test -- prisma migrate reset -f", + "migrate:reset": "dotenvx run -f .env -- prisma migrate reset -f", + "migrate:local:generate": "dotenvx run -f .env.local -- prisma generate", + "migrate:test:generate": "dotenvx run -f .env.test -- prisma generate", + "migrate:generate": "dotenvx run -f .env -- prisma generate", + "load:run": "concurrently -k -s first 'yarn dev' 'artillery run ./tests/load/example.yml -o output.json'", + "load:run:win": "concurrently -k -s first \"yarn dev\" \"artillery run ./tests/load/example.yml -o output.json\"", + "commit": "cz", + "commit:dry": "git hook run pre-commit", + "leaks": "dotenvx ext scan", + "typecheck": "tsc --noEmit", + "compliance": "yarn license-compliance", + "style": "biome format --write ./src", + "lint": "biome lint --write ./src", + "preinstall": "npx only-allow@1.0.0 yarn", + "postinstall": "yarn compliance", + "prepare": "husky" + }, + "prisma": { + "seed": "tsx ./prisma/seed.ts" + }, + "config": { + "commitizenEmoji": { + "conventionalFormat": true, + "issuesPrefix": "https://jira-isi.pe.senai.br/browse/PET-" + }, + "commitizen": { + "path": "./node_modules/commitizen-emoji" + } + }, + "devDependencies": { + "@biomejs/biome": "1.9.4", + "@commitlint/cli": "^19.6.1", + "@types/cors": "^2.8.17", + "@types/express": "^5.0.0", + "@types/express-session": "^1.18.1", + "@types/luxon": "^3.4.2", + "@types/morgan": "^1.9.9", + "@types/multer": "^1.4.12", + "@types/node": "^22.10.2", + "@types/node-geocoder": "^4.2.6", + "@types/nodemailer": "^6.4.17", + "@types/supertest": "^6.0.2", + "@types/swagger-ui-express": "^4.1.7", + "@usebruno/cli": "^1.36.3", + "@vitest/coverage-istanbul": "^2.1.8", + "@vitest/ui": "^2.1.8", + "artillery": "2.0.21", + "commitizen": "^4.3.1", + "commitizen-emoji": "^1.0.5", + "concurrently": "^9.1.0", + "globals": "^15.14.0", + "husky": "^9.1.7", + "inquirer": "^12.2.0", + "license-compliance": "^3.0.1", + "lint-staged": "^15.2.11", + "prisma": "^6.1.0", + "typescript": "^5.7.2", + "vitest": "^2.1.8", + "wait-on": "^8.0.1" + }, + "dependencies": { + "@asteasolutions/zod-to-openapi": "^7.3.0", + "@aws-sdk/client-s3": "^3.744.0", + "@dotenvx/dotenvx": "^1.31.0", + "@prisma/client": "^6.1.0", + "cookie-parser": "^1.4.7", + "cors": "^2.8.5", + "env-var": "^7.5.0", + "express": "5", + "express-session": "^1.18.1", + "helmet": "^8.0.0", + "jose": "^5.9.6", + "luxon": "^3.5.0", + "morgan": "^1.10.0", + "multer": "^1.4.5-lts.1", + "node-geocoder": "^4.4.1", + "nodemailer": "^6.9.16", + "openapi3-ts": "^4.4.0", + "supertest": "^7.0.0", + "swagger-ui-express": "^5.0.1", + "tsx": "^4.19.2", + "winston": "^3.17.0", + "zod": "^3.24.1" + } +} diff --git a/prisma/migrations/20250211183913_initial_migration/migration.sql b/prisma/migrations/20250211183913_initial_migration/migration.sql new file mode 100644 index 0000000..8d2a26d --- /dev/null +++ b/prisma/migrations/20250211183913_initial_migration/migration.sql @@ -0,0 +1,103 @@ +-- CreateTable +CREATE TABLE "Vehicles" ( + "id" TEXT NOT NULL PRIMARY KEY, + "name" TEXT NOT NULL, + "createdAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updatedAt" DATETIME NOT NULL +); + +-- CreateTable +CREATE TABLE "Users" ( + "id" TEXT NOT NULL PRIMARY KEY, + "fullName" TEXT NOT NULL, + "initials" TEXT NOT NULL, + "createdAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updatedAt" DATETIME NOT NULL +); + +-- CreateTable +CREATE TABLE "CollectionPoints" ( + "id" TEXT NOT NULL PRIMARY KEY, + "name" TEXT NOT NULL, + "responsible" TEXT NOT NULL, + "email" TEXT NOT NULL, + "address" TEXT NOT NULL, + "status" TEXT NOT NULL, + "bestCollectionDay" TEXT NOT NULL, + "bestTime" TEXT NOT NULL, + "contact" TEXT NOT NULL, + "monitoringResponsible" TEXT NOT NULL, + "selectiveCollectionDay" TEXT NOT NULL, + "weeklyGlassVolume" REAL NOT NULL, + "createdAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updatedAt" DATETIME NOT NULL, + "operatorId" TEXT NOT NULL, + CONSTRAINT "CollectionPoints_operatorId_fkey" FOREIGN KEY ("operatorId") REFERENCES "Operator" ("id") ON DELETE RESTRICT ON UPDATE CASCADE +); + +-- CreateTable +CREATE TABLE "Collection" ( + "id" TEXT NOT NULL PRIMARY KEY, + "collectionPointId" TEXT NOT NULL, + "routeId" TEXT NOT NULL, + "date" DATETIME NOT NULL, + "startTime" DATETIME, + "endTime" DATETIME, + "volumeCollected" REAL NOT NULL, + "status" TEXT NOT NULL, + "notes" TEXT, + "createdAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updatedAt" DATETIME NOT NULL, + CONSTRAINT "Collection_collectionPointId_fkey" FOREIGN KEY ("collectionPointId") REFERENCES "CollectionPoints" ("id") ON DELETE RESTRICT ON UPDATE CASCADE, + CONSTRAINT "Collection_routeId_fkey" FOREIGN KEY ("routeId") REFERENCES "Routes" ("id") ON DELETE RESTRICT ON UPDATE CASCADE +); + +-- CreateTable +CREATE TABLE "Routes" ( + "id" TEXT NOT NULL PRIMARY KEY, + "name" TEXT NOT NULL, + "date" DATETIME NOT NULL, + "totalDistanceKm" REAL NOT NULL, + "totalTimeMs" INTEGER NOT NULL, + "status" TEXT NOT NULL, + "executorId" TEXT, + "startedAt" DATETIME, + "finishedAt" DATETIME, + "reasonFinished" TEXT, + "comment" TEXT, + "createdAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updatedAt" DATETIME NOT NULL, + CONSTRAINT "Routes_executorId_fkey" FOREIGN KEY ("executorId") REFERENCES "Users" ("id") ON DELETE SET NULL ON UPDATE CASCADE +); + +-- CreateTable +CREATE TABLE "RoutesCollectionPoints" ( + "routeId" TEXT NOT NULL, + "collectionPointId" TEXT NOT NULL, + "assignedAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, + + PRIMARY KEY ("routeId", "collectionPointId"), + CONSTRAINT "RoutesCollectionPoints_routeId_fkey" FOREIGN KEY ("routeId") REFERENCES "Routes" ("id") ON DELETE RESTRICT ON UPDATE CASCADE, + CONSTRAINT "RoutesCollectionPoints_collectionPointId_fkey" FOREIGN KEY ("collectionPointId") REFERENCES "CollectionPoints" ("id") ON DELETE RESTRICT ON UPDATE CASCADE +); + +-- CreateTable +CREATE TABLE "Operator" ( + "id" TEXT NOT NULL PRIMARY KEY, + "name" TEXT NOT NULL, + "cep" TEXT NOT NULL, + "cnpj" TEXT NOT NULL, + "contact" TEXT NOT NULL, + "phone" TEXT NOT NULL, + "email" TEXT NOT NULL, + "cnpjFile" TEXT, + "municipalRegistrationFile" TEXT, + "environmentalLicenseFile" TEXT, + "operationLicenseFile" TEXT, + "status" TEXT NOT NULL, + "createdAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updatedAt" DATETIME NOT NULL +); + +-- CreateIndex +CREATE UNIQUE INDEX "Operator_cnpj_key" ON "Operator"("cnpj"); diff --git a/prisma/migrations/20250212121108_update_collection_points_columns/migration.sql b/prisma/migrations/20250212121108_update_collection_points_columns/migration.sql new file mode 100644 index 0000000..d13dbd7 --- /dev/null +++ b/prisma/migrations/20250212121108_update_collection_points_columns/migration.sql @@ -0,0 +1,37 @@ +/* + Warnings: + + - You are about to drop the column `bestTime` on the `CollectionPoints` table. All the data in the column will be lost. + - You are about to drop the column `email` on the `CollectionPoints` table. All the data in the column will be lost. + - You are about to drop the column `monitoringResponsible` on the `CollectionPoints` table. All the data in the column will be lost. + - You are about to drop the column `responsible` on the `CollectionPoints` table. All the data in the column will be lost. + - Added the required column `type` to the `CollectionPoints` table without a default value. This is not possible if the table is not empty. + +*/ +-- RedefineTables +PRAGMA defer_foreign_keys=ON; +PRAGMA foreign_keys=OFF; +CREATE TABLE "new_CollectionPoints" ( + "id" TEXT NOT NULL PRIMARY KEY, + "name" TEXT NOT NULL, + "address" TEXT NOT NULL, + "status" TEXT NOT NULL, + "shifts" TEXT, + "contact" TEXT NOT NULL, + "type" TEXT NOT NULL, + "bestCollectionDay" TEXT NOT NULL, + "responsibleName" TEXT, + "responsiblePhone" TEXT, + "selectiveCollectionDay" TEXT NOT NULL, + "weeklyGlassVolume" REAL, + "relevantInfos" TEXT, + "createdAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updatedAt" DATETIME NOT NULL, + "operatorId" TEXT NOT NULL, + CONSTRAINT "CollectionPoints_operatorId_fkey" FOREIGN KEY ("operatorId") REFERENCES "Operator" ("id") ON DELETE RESTRICT ON UPDATE CASCADE +); +INSERT INTO "new_CollectionPoints" ("address", "bestCollectionDay", "contact", "createdAt", "id", "name", "operatorId", "selectiveCollectionDay", "status", "updatedAt", "weeklyGlassVolume") SELECT "address", "bestCollectionDay", "contact", "createdAt", "id", "name", "operatorId", "selectiveCollectionDay", "status", "updatedAt", "weeklyGlassVolume" FROM "CollectionPoints"; +DROP TABLE "CollectionPoints"; +ALTER TABLE "new_CollectionPoints" RENAME TO "CollectionPoints"; +PRAGMA foreign_keys=ON; +PRAGMA defer_foreign_keys=OFF; diff --git a/prisma/migrations/20250213204905_combine_responsible_fields_into_responsible/migration.sql b/prisma/migrations/20250213204905_combine_responsible_fields_into_responsible/migration.sql new file mode 100644 index 0000000..e8fdcfe --- /dev/null +++ b/prisma/migrations/20250213204905_combine_responsible_fields_into_responsible/migration.sql @@ -0,0 +1,33 @@ +/* + Warnings: + + - You are about to drop the column `responsibleName` on the `CollectionPoints` table. All the data in the column will be lost. + - You are about to drop the column `responsiblePhone` on the `CollectionPoints` table. All the data in the column will be lost. + +*/ +-- RedefineTables +PRAGMA defer_foreign_keys=ON; +PRAGMA foreign_keys=OFF; +CREATE TABLE "new_CollectionPoints" ( + "id" TEXT NOT NULL PRIMARY KEY, + "name" TEXT NOT NULL, + "address" TEXT NOT NULL, + "status" TEXT NOT NULL, + "shifts" TEXT, + "contact" TEXT NOT NULL, + "type" TEXT NOT NULL, + "bestCollectionDay" TEXT NOT NULL, + "responsible" TEXT, + "selectiveCollectionDay" TEXT NOT NULL, + "weeklyGlassVolume" REAL, + "relevantInfos" TEXT, + "createdAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updatedAt" DATETIME NOT NULL, + "operatorId" TEXT NOT NULL, + CONSTRAINT "CollectionPoints_operatorId_fkey" FOREIGN KEY ("operatorId") REFERENCES "Operator" ("id") ON DELETE RESTRICT ON UPDATE CASCADE +); +INSERT INTO "new_CollectionPoints" ("address", "bestCollectionDay", "contact", "createdAt", "id", "name", "operatorId", "relevantInfos", "selectiveCollectionDay", "shifts", "status", "type", "updatedAt", "weeklyGlassVolume") SELECT "address", "bestCollectionDay", "contact", "createdAt", "id", "name", "operatorId", "relevantInfos", "selectiveCollectionDay", "shifts", "status", "type", "updatedAt", "weeklyGlassVolume" FROM "CollectionPoints"; +DROP TABLE "CollectionPoints"; +ALTER TABLE "new_CollectionPoints" RENAME TO "CollectionPoints"; +PRAGMA foreign_keys=ON; +PRAGMA defer_foreign_keys=OFF; diff --git a/prisma/migrations/20250213234813_best_collection_day_selective_collection_day_as_optional/migration.sql b/prisma/migrations/20250213234813_best_collection_day_selective_collection_day_as_optional/migration.sql new file mode 100644 index 0000000..76cdd10 --- /dev/null +++ b/prisma/migrations/20250213234813_best_collection_day_selective_collection_day_as_optional/migration.sql @@ -0,0 +1,26 @@ +-- RedefineTables +PRAGMA defer_foreign_keys=ON; +PRAGMA foreign_keys=OFF; +CREATE TABLE "new_CollectionPoints" ( + "id" TEXT NOT NULL PRIMARY KEY, + "name" TEXT NOT NULL, + "address" TEXT NOT NULL, + "status" TEXT NOT NULL, + "shifts" TEXT, + "contact" TEXT NOT NULL, + "type" TEXT NOT NULL, + "bestCollectionDay" TEXT, + "responsible" TEXT, + "selectiveCollectionDay" TEXT, + "weeklyGlassVolume" REAL, + "relevantInfos" TEXT, + "createdAt" DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updatedAt" DATETIME NOT NULL, + "operatorId" TEXT NOT NULL, + CONSTRAINT "CollectionPoints_operatorId_fkey" FOREIGN KEY ("operatorId") REFERENCES "Operator" ("id") ON DELETE RESTRICT ON UPDATE CASCADE +); +INSERT INTO "new_CollectionPoints" ("address", "bestCollectionDay", "contact", "createdAt", "id", "name", "operatorId", "relevantInfos", "responsible", "selectiveCollectionDay", "shifts", "status", "type", "updatedAt", "weeklyGlassVolume") SELECT "address", "bestCollectionDay", "contact", "createdAt", "id", "name", "operatorId", "relevantInfos", "responsible", "selectiveCollectionDay", "shifts", "status", "type", "updatedAt", "weeklyGlassVolume" FROM "CollectionPoints"; +DROP TABLE "CollectionPoints"; +ALTER TABLE "new_CollectionPoints" RENAME TO "CollectionPoints"; +PRAGMA foreign_keys=ON; +PRAGMA defer_foreign_keys=OFF; diff --git a/prisma/migrations/migration_lock.toml b/prisma/migrations/migration_lock.toml new file mode 100644 index 0000000..e1640d1 --- /dev/null +++ b/prisma/migrations/migration_lock.toml @@ -0,0 +1,3 @@ +# Please do not edit this file manually +# It should be added in your version-control system (e.g., Git) +provider = "sqlite" \ No newline at end of file diff --git a/prisma/schema.prisma b/prisma/schema.prisma new file mode 100644 index 0000000..ecf2489 --- /dev/null +++ b/prisma/schema.prisma @@ -0,0 +1,118 @@ +// This is your Prisma schema file, +// learn more about it in the docs: https://pris.ly/d/prisma-schema + +// Looking for ways to speed up your queries, or scale easily with your serverless or edge functions? +// Try Prisma Accelerate: https://pris.ly/cli/accelerate-init + +generator client { + provider = "prisma-client-js" +} + +datasource db { + provider = "sqlite" + url = env("DATABASE_URL") +} + +model Vehicles { + id String @id @default(uuid()) + name String + createdAt DateTime @default(now()) + updatedAt DateTime @updatedAt +} + +model Users { + id String @id @default(uuid()) + fullName String + initials String + routes Routes[] + createdAt DateTime @default(now()) + updatedAt DateTime @updatedAt +} + +model CollectionPoints { + id String @id @default(uuid()) + name String + address String + status String + shifts String? + contact String + type String + bestCollectionDay String? + responsible String? + selectiveCollectionDay String? + weeklyGlassVolume Float? + relevantInfos String? + createdAt DateTime @default(now()) + updatedAt DateTime @updatedAt + + collections Collection[] + routes RoutesCollectionPoints[] + operator Operator @relation(fields: [operatorId], references: [id]) // Relação com o operador + operatorId String +} + +model Collection { + id String @id @default(uuid()) + collectionPointId String + collectionPoint CollectionPoints @relation(fields: [collectionPointId], references: [id]) + routeId String + route Routes @relation(fields: [routeId], references: [id]) + date DateTime + startTime DateTime? + endTime DateTime? + volumeCollected Float + status String + notes String? + createdAt DateTime @default(now()) + updatedAt DateTime @updatedAt +} + +model Routes { + id String @id @default(uuid()) + name String + date DateTime + totalDistanceKm Float + totalTimeMs Int + status String + executor Users? @relation(fields: [executorId], references: [id]) + executorId String? + startedAt DateTime? + finishedAt DateTime? + reasonFinished String? + comment String? + createdAt DateTime @default(now()) + updatedAt DateTime @updatedAt + + collectionPoints RoutesCollectionPoints[] + collections Collection[] +} + +model RoutesCollectionPoints { + routeId String + collectionPointId String + assignedAt DateTime @default(now()) + + route Routes @relation(fields: [routeId], references: [id]) + collectionPoint CollectionPoints @relation(fields: [collectionPointId], references: [id]) + + @@id([routeId, collectionPointId]) +} + +model Operator { + id String @id @default(uuid()) + name String + cep String + cnpj String @unique + contact String + phone String + email String + cnpjFile String? + municipalRegistrationFile String? + environmentalLicenseFile String? + operationLicenseFile String? + status String + createdAt DateTime @default(now()) + updatedAt DateTime @updatedAt + + collectionPoints CollectionPoints[] +} diff --git a/prisma/seed.ts b/prisma/seed.ts new file mode 100644 index 0000000..00c2dbc --- /dev/null +++ b/prisma/seed.ts @@ -0,0 +1,478 @@ +import { PrismaClient } from '@prisma/client'; +import { CollectionPointStatus } from '../src/domain/value-objects/collection-point-status'; +import winston from 'winston'; +import env from 'env-var'; +import { CollectionStatus } from '../src/domain/value-objects/collection-status'; + +// LOGGING CONFIGURATION +const LOG_LEVEL = env.get('LOG_LEVEL').required().asEnum(['error', 'warn', 'info', 'http', 'verbose', 'debug']); +const API_NAME = env.get('API_NAME').required().asString(); +const API_VERSION = env.get('API_VERSION').required().asString(); +const DATABASE_URL = env.get('DATABASE_URL').required().asString(); + +const prisma = new PrismaClient(); +const logger = winston.createLogger({ + level: LOG_LEVEL, + format: winston.format.json(), + defaultMeta: { service: API_NAME, version: API_VERSION }, + transports: [ + new winston.transports.Console({ + format: winston.format.simple(), + }), + ], +}); + +async function main() { + logger.info('executing database seeding...'); + + logger.info('adding vehicle to database', { id: 'ed3f0cc6-8836-4483-a2a3-b510f5fc6e8e' }); + await prisma.vehicles.upsert({ + where: { id: 'ed3f0cc6-8836-4483-a2a3-b510f5fc6e8e' }, + create: { id: 'ed3f0cc6-8836-4483-a2a3-b510f5fc6e8e', name: 'TRIVIM 1' }, + update: {}, + }); + + logger.info('adding user to database', { id: '1f1309e9-498b-4892-9f8f-5c87d0dd83b9' }); + await prisma.users.upsert({ + where: { id: '1f1309e9-498b-4892-9f8f-5c87d0dd83b9' }, + create: { id: '1f1309e9-498b-4892-9f8f-5c87d0dd83b9', fullName: 'Motorista', initials: 'MO' }, + update: {}, + }); + + const operator = await prisma.operator.upsert({ + where: { id: '738515b5-6cc1-4db7-b6fd-b24a8929a0d8' }, + create: { + id: '738515b5-6cc1-4db7-b6fd-b24a8929a0d8', + status: 'ACTIVE', + cep: '53401200', + cnpj: '05662582000195', + contact: 'andre', + email: 'andre@example.com.br', + name: 'operador 1', + phone: '5555555555', + }, + update: {}, + }); + + logger.info('adding route to database', { id: 'f7f16595-8537-486b-9027-ee419435980c' }); + const route = await prisma.routes.upsert({ + where: { + id: 'f7f16595-8537-486b-9027-ee419435980c', + }, + create: { + id: 'f7f16595-8537-486b-9027-ee419435980c', + name: 'Rota 1', + status: 'PENDING', + totalDistanceKm: 40, + totalTimeMs: 14400000, + date: '2024-12-16T12:00:00.000Z', + collections: { + create: [ + { + id: '0f551194-1691-4e52-9094-d9e13a67cbf8', + status: CollectionStatus.enum.PENDING, + date: '2024-12-16T12:00:00.000Z', + volumeCollected: 0, + collectionPoint: { + create: { + id: '361754a6-845b-419b-8f96-be1f01fa899e', + type: 'APARTMENT', + name: 'Edifício Residencial Lausanne', + status: CollectionPointStatus.enum.ACTIVE, + address: JSON.stringify({ + state: 'SP', + city: 'Sao Paulo', + zipcode: '04026-000', + number: '123', + district: 'Vila Mariana', + street: 'Rua Lorem Ipsum', + complement: 'Entrada Sul', + coordinate: { latitude: -8.038912, longitude: -34.870932 }, + }), + bestCollectionDay: JSON.stringify(['FRIDAY']), + selectiveCollectionDay: JSON.stringify(['FRIDAY']), + contact: JSON.stringify({ + name: 'Matias Castro', + position: 'Responsável pela coleta', + phone: '1234567890', + email: 'H9k5y@example.com', + }), + weeklyGlassVolume: 1000, + operatorId: operator.id, + }, + }, + }, + + { + id: 'a323eadb-1ffc-4227-b4c4-0b9ee48d38a2', + status: CollectionStatus.enum.PENDING, + date: '2024-12-16T12:00:00.000Z', + volumeCollected: 0, + collectionPoint: { + create: { + id: '97f2ab4c-ef96-42a5-9da8-395f236c875e', + name: 'Edifício Itamarati', + type: 'APARTMENT', + status: CollectionPointStatus.enum.ACTIVE, + address: JSON.stringify({ + state: 'SP', + city: 'Sao Paulo', + zipcode: '04026-000', + number: '123', + district: 'Vila Mariana', + street: 'Rua Dolor Sit', + complement: 'Entrada Norte', + coordinate: { latitude: -8.059377, longitude: -34.886952 }, + }), + bestCollectionDay: JSON.stringify(['FRIDAY']), + selectiveCollectionDay: JSON.stringify(['FRIDAY']), + contact: JSON.stringify({ + name: 'Matias Castro', + position: 'Responsável pela coleta', + phone: '1234567890', + email: 'H9k5y@example.com', + }), + weeklyGlassVolume: 1000, + operatorId: operator.id, + }, + }, + }, + ], + }, + }, + update: {}, + }); + + await prisma.routesCollectionPoints.upsert({ + where: { + routeId_collectionPointId: { + routeId: route.id, + collectionPointId: '361754a6-845b-419b-8f96-be1f01fa899e', + }, + }, + create: { + routeId: route.id, + collectionPointId: '361754a6-845b-419b-8f96-be1f01fa899e', + }, + update: {}, + }); + + await prisma.routesCollectionPoints.upsert({ + where: { + routeId_collectionPointId: { + routeId: route.id, + collectionPointId: '97f2ab4c-ef96-42a5-9da8-395f236c875e', + }, + }, + create: { + routeId: route.id, + collectionPointId: '97f2ab4c-ef96-42a5-9da8-395f236c875e', + }, + update: {}, + }); + + const route2 = await prisma.routes.upsert({ + where: { + id: 'aa34ef2d-728b-47b2-9097-3fecf4427777', + }, + create: { + id: 'aa34ef2d-728b-47b2-9097-3fecf4427777', + name: 'Rota 2', + status: 'PENDING', + totalDistanceKm: 40, + totalTimeMs: 14400000, + date: '2024-12-16T12:00:00.000Z', + collections: { + create: [ + { + status: CollectionStatus.enum.PENDING, + date: '2024-12-16T12:00:00.000Z', + volumeCollected: 0, + collectionPoint: { + create: { + id: 'c942468c-7432-47e9-8c80-2d0d8dab742c', + name: 'Edifício Residencial Rio do Fogo', + type: 'APARTMENT', + status: CollectionPointStatus.enum.ACTIVE, + address: JSON.stringify({ + state: 'SP', + city: 'Sao Paulo', + zipcode: '04026-000', + number: '123', + district: 'Vila Mariana', + street: 'Rua Lorem Ipsum', + complement: 'Entrada Sul', + coordinate: { latitude: -8.048626, longitude: -34.882787 }, + }), + bestCollectionDay: JSON.stringify(['FRIDAY']), + selectiveCollectionDay: JSON.stringify(['FRIDAY']), + contact: JSON.stringify({ + name: 'Matias Castro', + position: 'Responsável pela coleta', + phone: '1234567890', + email: 'H9k5y@example.com', + }), + weeklyGlassVolume: 1000, + operatorId: operator.id, + }, + }, + }, + { + status: CollectionStatus.enum.PENDING, + date: '2024-12-16T12:00:00.000Z', + volumeCollected: 0, + collectionPoint: { + create: { + id: '71bb73d3-6a0c-4a08-b168-a872cf33ee45', + name: 'Edifício Residencial Ponta de Pedras', + type: 'APARTMENT', + status: CollectionPointStatus.enum.ACTIVE, + address: JSON.stringify({ + state: 'SP', + city: 'Sao Paulo', + zipcode: '04026-000', + number: '123', + district: 'Vila Mariana', + street: 'Rua Lorem Ipsum', + complement: 'Entrada Sul', + coordinate: { latitude: -8.047054, longitude: -34.878486 }, + }), + bestCollectionDay: JSON.stringify(['FRIDAY']), + selectiveCollectionDay: JSON.stringify(['FRIDAY']), + contact: JSON.stringify({ + name: 'Matias Castro', + position: 'Responsável pela coleta', + phone: '1234567890', + email: 'H9k5y@example.com', + }), + weeklyGlassVolume: 1000, + operatorId: operator.id, + }, + }, + }, + ], + }, + }, + update: {}, + }); + + await prisma.routesCollectionPoints.upsert({ + where: { + routeId_collectionPointId: { + routeId: route2.id, + collectionPointId: 'c942468c-7432-47e9-8c80-2d0d8dab742c', + }, + }, + create: { + routeId: route2.id, + collectionPointId: 'c942468c-7432-47e9-8c80-2d0d8dab742c', + }, + update: {}, + }); + + await prisma.routesCollectionPoints.upsert({ + where: { + routeId_collectionPointId: { + routeId: route2.id, + collectionPointId: '71bb73d3-6a0c-4a08-b168-a872cf33ee45', + }, + }, + create: { + routeId: route2.id, + collectionPointId: '71bb73d3-6a0c-4a08-b168-a872cf33ee45', + }, + update: {}, + }); + + const route3 = await prisma.routes.upsert({ + where: { + id: 'f0a1c16c-fae4-497d-8a2f-a64e03de2870', + }, + create: { + id: 'f0a1c16c-fae4-497d-8a2f-a64e03de2870', + name: 'Rota 3', + status: 'PENDING', + totalDistanceKm: 40, + totalTimeMs: 14400000, + date: '2024-12-16T12:00:00.000Z', + collections: { + create: [ + { + status: CollectionStatus.enum.PENDING, + date: '2024-12-16T12:00:00.000Z', + volumeCollected: 0, + collectionPoint: { + create: { + id: 'dc9d96d9-21d3-4dcb-bb5b-d8afa3868aae', + name: 'Edifício Residencial Praia do Meio', + type: 'APARTMENT', + status: CollectionPointStatus.enum.ACTIVE, + address: JSON.stringify({ + state: 'SP', + city: 'Sao Paulo', + zipcode: '04026-000', + number: '123', + district: 'Vila Mariana', + street: 'Rua Lorem Ipsum', + complement: 'Entrada Sul', + coordinate: { latitude: -8.050177, longitude: -34.880589 }, + }), + bestCollectionDay: JSON.stringify(['FRIDAY']), + selectiveCollectionDay: JSON.stringify(['FRIDAY']), + contact: JSON.stringify({ + name: 'Matias Castro', + position: 'Responsável pela coleta', + phone: '1234567890', + email: 'H9k5y@example.com', + }), + weeklyGlassVolume: 1000, + operatorId: operator.id, + }, + }, + }, + { + status: CollectionStatus.enum.PENDING, + date: '2024-12-16T12:00:00.000Z', + volumeCollected: 0, + collectionPoint: { + create: { + id: '7e1b4c8f-3a59-4f2d-8c6e-b1f9c7d3a2b4', + name: 'Edifício Residencial Praia do Meio', + type: 'APARTMENT', + status: CollectionPointStatus.enum.ACTIVE, + address: JSON.stringify({ + state: 'SP', + city: 'Sao Paulo', + zipcode: '04026-000', + number: '123', + district: 'Vila Mariana', + street: 'Rua Lorem Ipsum', + complement: 'Entrada Sul', + coordinate: { latitude: -8.050878, longitude: -34.879666 }, + }), + bestCollectionDay: JSON.stringify(['FRIDAY']), + selectiveCollectionDay: JSON.stringify(['FRIDAY']), + contact: JSON.stringify({ + name: 'Matias Castro', + position: 'Responsável pela coleta', + phone: '1234567890', + email: 'H9k5y@example.com', + }), + weeklyGlassVolume: 1000, + operatorId: operator.id, + }, + }, + }, + + { + status: CollectionStatus.enum.PENDING, + date: '2024-12-16T12:00:00.000Z', + volumeCollected: 0, + collectionPoint: { + create: { + id: '262aba14-1c09-4aa9-9758-e558863363bc', + name: 'Edifício Residencial Nimbus', + type: 'APARTMENT', + status: CollectionPointStatus.enum.ACTIVE, + address: JSON.stringify({ + state: 'SP', + city: 'Sao Paulo', + zipcode: '04026-000', + number: '123', + district: 'Vila Mariana', + street: 'Rua Lorem Ipsum', + complement: 'Entrada Sul', + coordinate: { latitude: -8.052834, longitude: -34.882599 }, + }), + bestCollectionDay: JSON.stringify(['FRIDAY']), + selectiveCollectionDay: JSON.stringify(['FRIDAY']), + contact: JSON.stringify({ + name: 'Matias Castro', + position: 'Responsável pela coleta', + phone: '1234567890', + email: 'H9k5y@example.com', + }), + weeklyGlassVolume: 1000, + operatorId: operator.id, + }, + }, + }, + ], + }, + }, + update: {}, + }); + + await prisma.routesCollectionPoints.upsert({ + where: { + routeId_collectionPointId: { + routeId: route3.id, + collectionPointId: 'dc9d96d9-21d3-4dcb-bb5b-d8afa3868aae', + }, + }, + create: { + routeId: route3.id, + collectionPointId: 'dc9d96d9-21d3-4dcb-bb5b-d8afa3868aae', + }, + update: {}, + }); + + await prisma.routesCollectionPoints.upsert({ + where: { + routeId_collectionPointId: { + routeId: route3.id, + collectionPointId: '7e1b4c8f-3a59-4f2d-8c6e-b1f9c7d3a2b4', + }, + }, + create: { + routeId: route3.id, + collectionPointId: '7e1b4c8f-3a59-4f2d-8c6e-b1f9c7d3a2b4', + }, + update: {}, + }); + + await prisma.routesCollectionPoints.upsert({ + where: { + routeId_collectionPointId: { + routeId: route3.id, + collectionPointId: '262aba14-1c09-4aa9-9758-e558863363bc', + }, + }, + create: { + routeId: route3.id, + collectionPointId: '262aba14-1c09-4aa9-9758-e558863363bc', + }, + update: {}, + }); + + logger.info('adding collection point to database', { + id: '97f2ab4c-ef96-42a5-9da8-395f236c875e', + routeId: 'f7f16595-8537-486b-9027-ee419435980c', + }); + + logger.info('checking database contents'); + + const vehicles = await prisma.vehicles.findMany(); + logger.info('checking vehicles', { vehicles }); + + const users = await prisma.users.findMany(); + logger.info('checking users', { users }); + + const routes = await prisma.routes.findMany(); + logger.info('checking routes', { routes }); + + const collectionPoints = await prisma.collectionPoints.findMany(); + logger.info('checking collection points', { collectionPoints }); + + logger.info(`the daatabase is ok in ${DATABASE_URL} `); +} + +main() + .then(async () => { + await prisma.$disconnect(); + }) + .catch(async e => { + console.error(e); + await prisma.$disconnect(); + process.exit(1); + }); diff --git a/src/app.ts b/src/app.ts new file mode 100644 index 0000000..beb1743 --- /dev/null +++ b/src/app.ts @@ -0,0 +1,171 @@ +import express from 'express'; +import cors from 'cors'; +import env from 'env-var'; +import helmet from 'helmet'; +import winston from 'winston'; +import session from 'express-session'; +import swaggerUi from 'swagger-ui-express'; +import { OpenApiGeneratorV3 } from '@asteasolutions/zod-to-openapi'; +import { createRootRouter } from './presentation/http-rest/routers/root-router'; +import { notFoundController } from './presentation/http-rest/handlers/not-found'; +import { requestTimeMiddleware } from './presentation/http-rest/middlewares/request-time'; +import { serveRawSwaggerDocument } from './presentation/http-rest/handlers/swagger-raw-file'; +import { registry } from './presentation/http-rest/openapi/registry'; +import { errorHandler } from './presentation/http-rest/handlers/error'; +import { withContext } from './presentation/http-rest/middlewares/with-context'; +import { withRepositories } from './presentation/http-rest/middlewares/with-repositories'; +import { PrismaClient } from '@prisma/client'; +import { withAuthentication } from './presentation/http-rest/middlewares/oidc-authentication'; +import { KeycloakHttp } from './infra/providers/keycloak'; +import { OpenAPIFileStorageAdapter } from './infra/providers/open-api-file/open-api-file-storage-adaptar'; +import { LocalFileStorage } from './infra/providers/file-storage'; +import { KeyCloakFake } from './infra/providers/keycloak/keycloak-fake'; +import { MulterFileUploadProvider } from './infra/providers/file-upload'; + +const API_NAME = env.get('API_NAME').required().asString(); +const API_VERSION = env.get('API_VERSION').required().asString(); +const API_BASE_URL = env.get('API_BASE_URL').required().asUrlString(); +const DOMAIN_ADDRESS = env.get('DOMAIN_ADDRESS').required().asString(); +const API_PATH = env.get('API_PATH').required().asString(); +const TCP_PORT = env.get('TCP_PORT').required().asPortNumber(); +const PUBLIC_FOLDER = env.get('PUBLIC_FOLDER').default('./public').asString(); +const WILL_DISABLE_AUTHENTICATION = env.get('WILL_DISABLE_AUTHENTICATION').default('false').asBool(); + +// CONTENT SECURITY POLICY +const CONTENT_SECURITY_SCRIPT_SRC = env.get('CONTENT_SECURITY_SCRIPT_SRC').required().asArray(); + +// LOGGING CONFIGURATION +const LOG_LEVEL = env.get('LOG_LEVEL').required().asEnum(['error', 'warn', 'info', 'http', 'verbose', 'debug']); + +// SESSION CONFIGURATION PARAMETERS +const SESSION_NAME = env.get('SESSION_NAME').required().asString(); +const SESSION_SECRET = env.get('SESSION_SECRET').required().asString(); +const SESSION_MAX_AGE_MS = env.get('SESSION_MAX_AGE_MS').required().asInt(); + +// CORS CONFIGURATION PARAMETERS +const CORS_METHODS = env.get('CORS_METHODS').required().asArray(','); +//const CORS_ORIGINS = env.get('CORS_ORIGINS').required().asArray(','); +const CORS_MAX_AGE = env.get('CORS_MAX_AGE').required().asIntPositive(); + +// OPENAPI SWAGGER CONFIGURATION +const SWAGGER_PATH = env.get('SWAGGER_PATH').required().asString(); +const SWAGGER_RAW_PATH = env.get('SWAGGER_RAW_PATH').required().asString(); +const SWAGGER_TITLE = env.get('SWAGGER_TITLE').required().asString(); +const SWAGGER_VERSION = env.get('SWAGGER_VERSION').required().asEnum(['3.0.0', '3.0.1', '3.0.2', '3.0.3', '3.1.0']); +const SWAGGER_DESCRIPTION = env.get('SWAGGER_DESCRIPTION').required().asString(); + +// OIDC CONFIGURATION +const OIDC_JWKS_URL = env.get('OIDC_JWKS_URL').required().asUrlObject(); +const OIDC_ISSUER = env.get('OIDC_ISSUER').required().asString(); +const OIDC_AUDIENCE = env.get('OIDC_AUDIENCE').required().asString(); + +// KEYCLOAK CONFIGURATION +const KEYCLOAK_CLIENT_ID = env.get('KEYCLOAK_CLIENT_ID').required().asString(); +const KEYCLOAK_CLIENT_SECRET = env.get('KEYCLOAK_CLIENT_SECRET').required().asString(); +const KEYCLOAK_GRANT_TYPE = env.get('KEYCLOAK_GRANT_TYPE').required().asString(); +const KEYCLOAK_ADMIN_USERNAME = env.get('KEYCLOAK_ADMIN_USERNAME').required().asString(); +const KEYCLOAK_ADMIN_PASSWORD = env.get('KEYCLOAK_ADMIN_PASSWORD').required().asString(); +const KEYCLOAK_DOMAIN = env.get('KEYCLOAK_DOMAIN').required().asString(); + +const API_URL = new URL(API_PATH, API_BASE_URL); +API_URL.port = TCP_PORT.toString(); + +const corsPolicy = cors({ + // origin: CORS_ORIGINS, + methods: CORS_METHODS, + maxAge: CORS_MAX_AGE, + credentials: true, +}); + +// @see https://developer.mozilla.org/en-US/docs/Web/HTTP/CSP +const headersPolicy = helmet({ + crossOriginEmbedderPolicy: { policy: 'require-corp' }, // @see https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Cross-Origin-Embedder-Policy + contentSecurityPolicy: { directives: { scriptSrc: CONTENT_SECURITY_SCRIPT_SRC } }, + xPoweredBy: false, +}); + +// @see https://expressjs.com/en/advanced/best-practice-security.html +const appSession = session({ + name: SESSION_NAME, + secret: SESSION_SECRET, + saveUninitialized: true, + resave: false, + cookie: { + httpOnly: true, + secure: true, + domain: DOMAIN_ADDRESS, + path: API_PATH, + maxAge: SESSION_MAX_AGE_MS, + }, +}); + +const logger = winston.createLogger({ + level: LOG_LEVEL, + format: winston.format.json(), + defaultMeta: { service: API_NAME, version: API_VERSION }, + transports: [ + new winston.transports.Console({ + format: winston.format.simple(), + }), + ], +}); + +const swaggerGenerator = new OpenApiGeneratorV3(registry.definitions); +const swaggerDocument = swaggerGenerator.generateDocument({ + servers: [{ url: API_URL.toString() }], + openapi: SWAGGER_VERSION, + info: { + title: SWAGGER_TITLE, + version: API_VERSION, + description: SWAGGER_DESCRIPTION, + }, +}); + +const openAPIStorage = new OpenAPIFileStorageAdapter('openapi.json', new LocalFileStorage()); +await openAPIStorage.save(swaggerDocument); + +export const prisma = new PrismaClient(); + +const keycloak = WILL_DISABLE_AUTHENTICATION + ? new KeyCloakFake() + : await KeycloakHttp.createAuthenticated({ + client_id: KEYCLOAK_CLIENT_ID, + client_secret: KEYCLOAK_CLIENT_SECRET, + grant_type: KEYCLOAK_GRANT_TYPE, + username: KEYCLOAK_ADMIN_USERNAME, + password: KEYCLOAK_ADMIN_PASSWORD, + domain: KEYCLOAK_DOMAIN, + }); + +const fileUploadProvider = new MulterFileUploadProvider(); + +const app = express(); + +app.set('trust proxy', 1); +app.disable('x-powered-by'); // @see https://helmetjs.github.io/#x-powered-by +app.use(appSession); +app.use(corsPolicy); // @see https://github.com/expressjs/cors +app.use(headersPolicy); // @see https://helmetjs.github.io +app.use(express.json()); +app.use(express.urlencoded({ extended: true })); + +app.use(express.static(PUBLIC_FOLDER)); + +app.use(SWAGGER_RAW_PATH, serveRawSwaggerDocument(swaggerDocument)); +app.use(SWAGGER_PATH, swaggerUi.serve, swaggerUi.setup(swaggerDocument)); + +app.use(withContext({ logger, fileUploadProvider })); + +app.use( + withAuthentication( + { jwksURL: OIDC_JWKS_URL, issuer: OIDC_ISSUER, audience: OIDC_AUDIENCE }, + WILL_DISABLE_AUTHENTICATION, + ), +); +app.use(withRepositories({ prisma, keycloak })); +app.use(requestTimeMiddleware); +app.use(API_PATH, createRootRouter(fileUploadProvider)); +app.use(errorHandler); +app.use(notFoundController); + +export default app; diff --git a/src/application/collection-point.ts b/src/application/collection-point.ts new file mode 100644 index 0000000..78202e1 --- /dev/null +++ b/src/application/collection-point.ts @@ -0,0 +1,52 @@ +import { CollectionPoint, type CollectionPointType } from '../domain/entities/collection-point'; +import type { CollectionPointsRepository } from '../domain/repositories/collection-points-repository'; +import type { RoutesRepository } from '../domain/repositories/routes-repository'; +import type { KeycloakRepository } from '../domain/repositories/keycloak-repository'; +import type { OperatorRepository } from '../domain/repositories/operator-repository'; +import { ResourceNotFoundProblem } from '../infra/errors/resource-not-found'; +import type { CollectionPointFiltersType } from '../domain/value-objects/filters'; +import { OffsetPaginationPrisma } from '../infra/providers/pagination/offset-pagination-prisma'; +import type { Pagination } from '../infra/providers/pagination/pagination'; + +export class CollectionPointService { + constructor( + private collectionPointsRepository: CollectionPointsRepository, + private routesRepository: RoutesRepository, + private keycloakRepository: KeycloakRepository, + private operatorRepository: OperatorRepository, + ) {} + + async getById(collectionPointId: string) { + const collectionPoint = await this.collectionPointsRepository.getById(collectionPointId); + if (!collectionPoint) return null; + return collectionPoint.serialize(); + } + + async listByRouteId(routeId: string) { + const route = await this.routesRepository.getById(routeId); + if (!route) return null; + return route.collections.map(collection => collection.serialize()); + } + + async list(filters: CollectionPointFiltersType): Promise<{ data: CollectionPointType[]; pagination: Pagination }> { + const collectionPoints = await this.collectionPointsRepository.list(filters); + + const pagination = await OffsetPaginationPrisma.from(filters, this.collectionPointsRepository, 'count'); + + return { + data: collectionPoints.map(collectionPoint => collectionPoint.serialize()), + pagination: pagination, + }; + } + + async save(collectionPoint: Optional, accessToken: string) { + const operator = await this.operatorRepository.getById(collectionPoint.operatorId); + if (!operator) throw ResourceNotFoundProblem.error('Operador nao encontrado', 'operatorId'); + + const newCollectionPoint = CollectionPoint.create({ + ...collectionPoint, + }); + await this.keycloakRepository.save(newCollectionPoint, accessToken); + return newCollectionPoint.serialize(); + } +} diff --git a/src/application/collection.ts b/src/application/collection.ts new file mode 100644 index 0000000..df21fd5 --- /dev/null +++ b/src/application/collection.ts @@ -0,0 +1,12 @@ +import type { CollectionsRepository } from '../domain/repositories/collections.repository'; +import { ResourceNotFoundProblem } from '../infra/errors/resource-not-found'; + +export class CollectionService { + constructor(private collectionsRepository: CollectionsRepository) {} + + async getById(id: string) { + const collection = await this.collectionsRepository.findById(id); + if (!collection) throw ResourceNotFoundProblem.error('Coleta nao encontrada', 'id'); + return collection.serialize(); + } +} diff --git a/src/application/route.ts b/src/application/route.ts new file mode 100644 index 0000000..a1cac0b --- /dev/null +++ b/src/application/route.ts @@ -0,0 +1,69 @@ +import type { RoutesRepository } from '../domain/repositories/routes-repository'; +import type { UsersRepository } from '../domain/repositories/users-repository'; +import { Comment } from '../domain/value-objects/comment'; +import { Reason } from '../domain/value-objects/reason'; +import { UserRoutesRules } from '../domain/services/user-service'; +import { ResourceNotFoundProblem } from '../infra/errors/resource-not-found'; + +export class RouteService { + constructor( + private routesRepository: RoutesRepository, + private usersRepository: UsersRepository, + ) {} + + async list() { + const routes = await this.routesRepository.list(); + return routes.map(route => route.serialize()); + } + + async getById(routeId: string) { + const route = await this.routesRepository.getById(routeId); + if (!route) return null; + return route.serialize(); + } + + async start(routeId: string) { + const me = await this.usersRepository.me(); + const route = await this.routesRepository.getById(routeId); + if (!route) return null; + await new UserRoutesRules(this.routesRepository).ensureHasSingleRouteInProgress(me.id); + route.start(me); + await this.routesRepository.save(route); + return route.serialize(); + } + + async finish(routeId: string, reason?: string, comment?: string) { + const route = await this.routesRepository.getById(routeId); + if (!route) return null; + + const fromUnknownReason = Reason.fromUnknown(reason); + const fromUnknownComment = Comment.fromUnknown(comment); + + route.finish(fromUnknownReason, fromUnknownComment); + + await this.routesRepository.save(route); + return route.serialize(); + } + + async startCollection(collectionId: string, routeId: string) { + const route = await this.routesRepository.getById(routeId); + if (!route) throw ResourceNotFoundProblem.error('Rota nao encontrada', 'routeId'); + + const collection = route.startCollection(collectionId); + + await this.routesRepository.save(route); + + return collection.serialize(); + } + + async finishCollection(collectionPointId: string, routeId: string) { + const route = await this.routesRepository.getById(routeId); + if (!route) throw ResourceNotFoundProblem.error('Rota nao encontrada', 'routeId'); + + const collection = route.finishCollection(collectionPointId); + + await this.routesRepository.save(route); + + return collection.serialize(); + } +} diff --git a/src/application/user.ts b/src/application/user.ts new file mode 100644 index 0000000..345d5bf --- /dev/null +++ b/src/application/user.ts @@ -0,0 +1,10 @@ +import type { UsersRepository } from '../domain/repositories/users-repository'; + +export class UserService { + constructor(private repository: UsersRepository) {} + + async me() { + const me = await this.repository.me(); + return me.serialize(); + } +} diff --git a/src/application/vehicle.ts b/src/application/vehicle.ts new file mode 100644 index 0000000..11bda5b --- /dev/null +++ b/src/application/vehicle.ts @@ -0,0 +1,10 @@ +import type { VehiclesRepository } from '../domain/repositories/vehicles-repository'; + +export class VehicleService { + constructor(private repository: VehiclesRepository) {} + + async list() { + const vehicles = await this.repository.list(); + return vehicles.map(vehicle => vehicle.serialize()); + } +} diff --git a/src/domain/entities/collection-point.ts b/src/domain/entities/collection-point.ts new file mode 100644 index 0000000..5d6e741 --- /dev/null +++ b/src/domain/entities/collection-point.ts @@ -0,0 +1,120 @@ +import { extendZodWithOpenApi } from '@asteasolutions/zod-to-openapi'; +import { z } from 'zod'; +import { CollectionPointStatus } from '../value-objects/collection-point-status'; +import { Address } from '../value-objects/address'; +import { Contact } from '../value-objects/contact'; +import { Responsible } from '../value-objects/responsible'; +import { PaginationSchema } from '../../infra/providers/pagination/pagination'; +import { CollectionPointType as CollectionPointTypeVO } from '../value-objects/collection-point-type'; +import { Shift } from '../value-objects/shift'; +import { Weekday } from '../value-objects/week-day'; + +extendZodWithOpenApi(z); + +export type CollectionPointType = z.infer; + +export class CollectionPoint { + readonly id: string; + readonly name: string; + readonly responsible?: Responsible; + readonly type: CollectionPointTypeVO; + readonly address: Address; + #status: CollectionPointStatus; + readonly contact: Contact; + readonly weeklyGlassVolume?: number; + readonly bestCollectionDay?: Weekday[]; + readonly shifts?: Shift[]; + readonly selectiveCollectionDay?: Weekday[]; + readonly operatorId: string; + readonly relevantInfos?: string; + + get status() { + return this.#status; + } + + // Schema para validação e documentação + static readonly schema = z + .object({ + id: z.string().uuid().openapi('CollectionPointId', { + description: 'UUID4 do ponto de coleta', + example: '361754a6-845b-419b-8f96-be1f01fa899e', + }), + name: z.string().describe('Nome do ponto de coleta'), + responsible: Responsible.schema.optional().describe('Responsável do ponto de coleta'), + type: CollectionPointTypeVO.schema.describe('Tipo do ponto de coleta'), + address: Address.schema.describe('Endereço do ponto de coleta'), + status: CollectionPointStatus.schema.describe('Estado do ponto de coleta'), + contact: Contact.schema.describe('Informações de contato do ponto de coleta'), + weeklyGlassVolume: z.number().optional().describe('Volume de vidro semanal (em garrafas)'), + bestCollectionDay: Weekday.schema.array().optional().describe('Melhor dia da semana para a coleta'), + selectiveCollectionDay: Weekday.extendedSchema + .array() + .optional() + .describe('Dia da coleta seletiva (prefeitura/empresa)'), + shifts: Shift.schema.array().optional().describe('Melhor período para a coleta'), + operatorId: z.string().uuid().describe('UUID4 do operador a que esse ponto de coleta pertence'), + relevantInfos: z.string().optional().describe('Informações relevantes para o ponto de coleta'), + }) + .openapi('CollectionPoint', { description: 'Um ponto de coleta de resíduo de vidro' }); + + static readonly paginatedSchema = z.object({ + data: CollectionPoint.schema.array(), + pagination: PaginationSchema, + }); + + private constructor(collectionPoint: CollectionPointType) { + this.id = collectionPoint.id; + this.name = collectionPoint.name; + this.responsible = Responsible.maybeCreate(collectionPoint.responsible); + this.type = CollectionPointTypeVO.create(collectionPoint.type); + this.address = Address.create(collectionPoint.address); + this.#status = CollectionPointStatus.create(collectionPoint.status); + this.shifts = collectionPoint.shifts?.map(shift => Shift.create(shift)); + this.contact = Contact.create(collectionPoint.contact); + this.weeklyGlassVolume = collectionPoint.weeklyGlassVolume; + this.bestCollectionDay = Weekday.maybeCreate(collectionPoint.bestCollectionDay); + this.selectiveCollectionDay = Weekday.maybeCreateExtended(collectionPoint.selectiveCollectionDay); + this.operatorId = collectionPoint.operatorId; + this.relevantInfos = collectionPoint.relevantInfos; + } + + static create(collectionPoint: Optional) { + return new CollectionPoint({ + id: collectionPoint.id ?? crypto.randomUUID(), + name: collectionPoint.name, + responsible: collectionPoint.responsible, + type: collectionPoint.type, + relevantInfos: collectionPoint.relevantInfos, + shifts: collectionPoint.shifts, + address: collectionPoint.address, + status: collectionPoint.status, + contact: collectionPoint.contact, + weeklyGlassVolume: collectionPoint.weeklyGlassVolume, + bestCollectionDay: collectionPoint.bestCollectionDay, + selectiveCollectionDay: collectionPoint.selectiveCollectionDay, + operatorId: collectionPoint.operatorId, + }); + } + + static fromUnknown(unknown: unknown): CollectionPoint { + const data = CollectionPoint.schema.parse(unknown); + return new CollectionPoint(data); + } + + serialize() { + return { + id: this.id, + name: this.name, + address: this.address.serialize(), + status: this.#status.serialize(), + contact: this.contact.serialize(), + type: this.type.serialize(), + shifts: this.shifts?.map(shift => shift.serialize()), + bestCollectionDay: this.bestCollectionDay?.map(day => day.serialize()), + selectiveCollectionDay: this.selectiveCollectionDay?.map(day => day.serialize()), + weeklyGlassVolume: this.weeklyGlassVolume, + responsible: this.responsible?.serialize(), + operatorId: this.operatorId, + }; + } +} diff --git a/src/domain/entities/collection.ts b/src/domain/entities/collection.ts new file mode 100644 index 0000000..f7f476c --- /dev/null +++ b/src/domain/entities/collection.ts @@ -0,0 +1,122 @@ +import { extendZodWithOpenApi } from '@asteasolutions/zod-to-openapi'; +import { z } from 'zod'; +import { DateTime } from 'luxon'; +import { CollectionStatus } from '../value-objects/collection-status'; +import { CollectionPoint } from './collection-point'; + +extendZodWithOpenApi(z); +export type CollectionType = z.infer; +export class Collection { + readonly id: string; + readonly collectionPoint: CollectionPoint; + readonly routeId: string; + #status: CollectionStatus; + readonly notes?: string; + readonly volumeCollected: number; + readonly date: DateTime; + startTime: DateTime | undefined; + endTime: DateTime | undefined; + + get status() { + return this.#status; + } + + static readonly schema = z + .object({ + id: z.string().uuid().openapi('CollectionId', { + description: 'UUID da coleta', + example: '5a17c4b6-845b-419b-8f96-be1f01fa89ab', + }), + collectionPoint: CollectionPoint.schema.openapi('CollectionPoint', { + description: 'Ponto de coleta associado', + }), + routeId: z.string().uuid().openapi('RouteId', { + description: 'UUID da rota associada', + example: 'f7f16595-8537-486b-9027-ee419435980c', + }), + status: CollectionStatus.schema.describe('Status da coleta'), + notes: z.string().optional().describe('Observações adicionais (opcional)'), + volumeCollected: z.number().default(0).describe('Volume coletado em litros'), + date: z + .string() + .datetime() + .transform(string => DateTime.fromISO(string)) + .describe('data e hora que a coleta foi iniciada'), + startTime: z + .string() + .datetime() + .transform(string => DateTime.fromISO(string)) + .optional() + .describe('data e hora que a coleta foi iniciada'), + endTime: z + .string() + .datetime() + .transform(string => DateTime.fromISO(string)) + .optional() + .describe('data e hora que a coleta foi finalizada'), + }) + .openapi('Collection', { description: 'Uma coleta realizada em um ponto de coleta' }); + + private constructor(collection: CollectionType) { + this.id = collection.id; + this.collectionPoint = CollectionPoint.create(collection.collectionPoint); + this.routeId = collection.routeId; + this.#status = CollectionStatus.create(collection.status); + this.notes = collection.notes; + this.volumeCollected = collection.volumeCollected; + this.date = collection.date; + this.startTime = collection.startTime; + this.endTime = collection.endTime; + } + + static create(collection: Optional): Collection { + return new Collection({ + id: collection.id ?? crypto.randomUUID(), + collectionPoint: collection.collectionPoint, + routeId: collection.routeId, + status: collection.status ?? 'PENDING', + notes: collection.notes, + volumeCollected: collection.volumeCollected ?? 0, + date: collection.date, + startTime: collection.startTime ?? undefined, + endTime: collection.endTime ?? undefined, + }); + } + + static fromUnknown(unknown: unknown): Collection { + const data = Collection.schema.parse(unknown); + return new Collection(data); + } + + start() { + this.startTime = DateTime.now(); + this.#status = CollectionStatus.inProgress(); + } + + finish() { + this.endTime = DateTime.now(); + this.#status = CollectionStatus.finished(); + } + + isInProgress() { + return this.status.value === 'IN_PROGRESS'; + } + + isFinished(): boolean { + return this.status.value === 'FINISHED'; + } + + serialize(): CollectionType { + return { + id: this.id, + routeId: this.routeId, + status: this.#status.serialize(), + date: this.date, + startTime: this.startTime, + endTime: this.endTime, + volumeCollected: this.volumeCollected, + notes: this.notes, + collectionPoint: this.collectionPoint.serialize(), + }; + } +} diff --git a/src/domain/entities/operator.ts b/src/domain/entities/operator.ts new file mode 100644 index 0000000..9d60fc8 --- /dev/null +++ b/src/domain/entities/operator.ts @@ -0,0 +1,62 @@ +import { z } from 'zod'; + +export type OperatorType = z.infer; +export class Operator { + id: string; + name: string; + cep: string; + cnpj: string; + contact: string; + phone: string; + email: string; + documents: { + cnpjFile?: string; + municipalRegistrationFile?: string; + environmentalLicenseFile?: string; + operationLicenseFile?: string; + }; + status: 'ACTIVE' | 'INACTIVE'; + + static schema = z.object({ + id: z.string().uuid(), + name: z.string().min(1, 'O nome do operador é obrigatório.'), + cep: z.string().regex(/^\d{5}-\d{3}$/, 'CEP inválido.'), + cnpj: z.string().regex(/^\d{2}\.\d{3}\.\d{3}\/\d{4}-\d{2}$/, 'CNPJ inválido.'), + contact: z.string().min(1, 'O contato é obrigatório.'), + phone: z.string().regex(/^\(\d{2}\) \d{4,5}-\d{4}$/, 'Telefone inválido.'), + email: z.string().email('E-mail inválido.'), + documents: z.object({ + cnpjFile: z.string().url().optional(), + municipalRegistrationFile: z.string().url().optional(), + environmentalLicenseFile: z.string().url().optional(), + operationLicenseFile: z.string().url().optional(), + }), + status: z.enum(['ACTIVE', 'INACTIVE']).optional().default('INACTIVE'), + }); + + constructor(operator: OperatorType) { + this.id = operator.id; + this.name = operator.name; + this.cep = operator.cep; + this.cnpj = operator.cnpj; + this.contact = operator.contact; + this.phone = operator.phone; + this.email = operator.email; + this.documents = operator.documents; + this.status = operator.status; + } + + static create(operator: Optional): Operator { + return new Operator({ + id: operator.id ?? crypto.randomUUID(), + name: operator.name, + cep: operator.cep, + cnpj: operator.cnpj, + contact: operator.contact, + phone: operator.phone, + email: operator.email, + documents: operator.documents, + status: operator.status ?? 'INACTIVE', + }); + } +} diff --git a/src/domain/entities/route.ts b/src/domain/entities/route.ts new file mode 100644 index 0000000..4fae33e --- /dev/null +++ b/src/domain/entities/route.ts @@ -0,0 +1,239 @@ +import { extendZodWithOpenApi } from '@asteasolutions/zod-to-openapi'; +import { DateTime } from 'luxon'; +import { z } from 'zod'; +import { RouteStatus } from '../value-objects/route-status'; +import { Collection } from './collection'; // Importando a entidade de coleta +import { User } from './user'; +import { Reason } from '../value-objects/reason'; +import { Comment } from '../value-objects/comment'; +import { ResourceNotFoundProblem } from '../../infra/errors/resource-not-found'; +import { BusinessRuleViolationProblem } from '../../infra/errors/business-rule-violation'; +extendZodWithOpenApi(z); + +export type RouteType = z.infer; +export type CreateRouteType = Omit, 'collectionsCount'>; + +export class Route { + readonly id: string; + readonly name: string; + readonly date: DateTime; + readonly collections: Collection[]; + readonly totalDistanceKm: number; + readonly totalTimeMs: number; + #status: RouteStatus; + #executor?: User; + #startedAt?: DateTime | undefined; + #finishedAt?: DateTime | undefined; + #reason: Reason | undefined; + #comment: Comment | undefined; + + // Getters para acessar propriedades privadas + get status() { + return this.#status; + } + get executor() { + return this.#executor; + } + get startedAt() { + return this.#startedAt; + } + get finishedAt() { + return this.#finishedAt; + } + get reason() { + return this.#reason; + } + get comment() { + return this.#comment; + } + + static readonly schema = z + .object({ + id: z.string().uuid().openapi('RouteId', { example: 'f7f16595-8537-486b-9027-ee419435980c' }), + name: z.string().describe('nome da rota'), + date: z + .string() + .datetime() + .transform(string => DateTime.fromISO(string)) + .describe('data que a rota deve ser executada'), + collections: Collection.schema.array().describe('Coletas da rota'), + totalDistanceKm: z.number().min(0).describe('distância total da rota em km'), + totalTimeMs: z.number().int().min(0).describe('tempo total estimado da rota em ms'), + status: RouteStatus.schema.describe('estado atual da rota de coleta'), + executor: User.schema.optional().describe('quem iniciou e executou a rota'), + startedAt: z + .string() + .datetime() + .transform(string => DateTime.fromISO(string)) + .optional() + .describe('data e hora que a rota foi iniciada'), + finishedAt: z + .string() + .datetime() + .transform(string => DateTime.fromISO(string)) + .optional() + .describe('data e hora que a rota foi finalizada'), + comment: Comment.schema.describe('comentário da rota'), + reason: Reason.schema.describe('motivo de finalizar a rota'), + }) + .openapi('Route', { description: 'Uma rota de coleta de resíduo de vidro' }); + + private constructor(route: CreateRouteType) { + this.id = route.id; + this.name = route.name; + this.date = route.date; + this.totalDistanceKm = route.totalDistanceKm; + this.totalTimeMs = route.totalTimeMs; + this.collections = route.collections.map(Collection.create); + this.#status = RouteStatus.create(route.status); + } + + static create(route: Optional) { + return new Route({ + id: route.id ?? crypto.randomUUID(), + name: route.name, + date: route.date, + totalDistanceKm: route.totalDistanceKm, + totalTimeMs: route.totalTimeMs, + collections: route.collections ?? [], + status: route.status ?? RouteStatus.enum.PENDING, + reason: route.reason, + comment: route.comment, + }); + } + + /** + * Inicia a rota para ser executada por um usuário que é motorista. + * @param executor Quem está iniciando e executará a rota. + */ + start(executor: User) { + if (this.isFinished()) { + throw BusinessRuleViolationProblem.error('A rota já foi finalizada.', 'status'); + } + + this.#status = RouteStatus.inProgress(); + this.#startedAt = DateTime.now(); + this.#executor = executor; + } + + /** + * Finaliza a rota. + */ + finish(reason?: Reason, comment?: Comment) { + if (this.isFinished()) throw BusinessRuleViolationProblem.error('A rota já foi finalizada.', 'status'); + if (!this.isInProgress()) + throw BusinessRuleViolationProblem.error('A rota precisa estar em andamento para ser finalizada.', 'status'); + const allCollectionsFinished = this.collections.every(collection => collection.isFinished()); + if (!allCollectionsFinished) + throw BusinessRuleViolationProblem.error( + 'Todas as coletas precisam ser finalizadas para concluir a rota.', + 'status', + ); + this.#status = RouteStatus.finished(); + this.#finishedAt = DateTime.now(); + this.#reason = reason; + this.#comment = comment; + } + + isInProgress() { + return this.status.value === 'IN_PROGRESS'; + } + + isFinished() { + return this.status.value === 'FINISHED'; + } + + /** + * Inicia uma coleta específica na rota. + * @param collectionId ID da coleta a ser iniciada. + */ + startCollection(collectionId: string): Collection { + // Verifica se a rota está em andamento + if (!this.isInProgress()) { + throw BusinessRuleViolationProblem.error('A rota precisa estar em andamento para iniciar uma coleta.', 'status'); + } + + // Encontra a coleta associada à rota + const collection = this.collections.find(collection => collection.id === collectionId); + if (!collection) { + throw ResourceNotFoundProblem.error('Coleta não pertence a esta rota.', 'collectionId'); + } + + const hasCollectionInProgress = this.collections.some(collection => collection.isInProgress()); + if (hasCollectionInProgress) { + throw BusinessRuleViolationProblem.error( + 'Já existe uma coleta em andamento para este ponto de coleta.', + 'status', + ); + } + + collection.start(); + return collection; + } + + /** + * Finaliza uma coleta específica na rota. + * @param collectionId ID da coleta a ser finalizada. + */ + /** + * Finaliza uma coleta específica na rota. + * @param collectionId ID da coleta a ser finalizada. + */ + finishCollection(collectionId: string): Collection { + if (!this.isInProgress()) { + throw BusinessRuleViolationProblem.error( + 'A rota precisa estar em andamento para finalizar esta coleta.', + 'status', + ); + } + + const collection = this.collections.find(collection => collection.id === collectionId); + if (!collection) { + throw ResourceNotFoundProblem.error('Coleta não pertence a esta rota.', 'collectionId'); + } + + if (collection.isFinished()) { + throw BusinessRuleViolationProblem.error('A coleta já foi finalizada.', 'status'); + } + + if (!collection.isInProgress()) { + throw BusinessRuleViolationProblem.error('A coleta precisa estar em andamento para ser finalizada.', 'status'); + } + + collection.finish(); + + return collection; + } + + /** + * Retorna uma coleta específica da rota. + * @param collectionId ID da coleta. + */ + getCollection(collectionId: string): Collection { + const collection = this.collections.find(col => col.id === collectionId); + if (!collection) throw ResourceNotFoundProblem.error('Coleta não pertence a esta rota.', 'collectionId'); + return collection; + } + + static fromUnknown(unknown: unknown): Route { + const data = Route.schema.parse(unknown); + return new Route(data); + } + + serialize() { + return { + id: this.id, + name: this.name, + date: this.date.toJSDate().toISOString(), + totalDistanceKm: this.totalDistanceKm, + totalTimeMs: this.totalTimeMs, + status: this.status.serialize(), + collections: this.collections.map(collection => collection.serialize()), + executor: this.#executor?.serialize(), + startedAt: this.startedAt?.toJSDate().toISOString(), + finishedAt: this.finishedAt?.toJSDate().toISOString(), + comment: this.comment?.serialize(), + reason: this.reason?.serialize(), + }; + } +} diff --git a/src/domain/entities/user.ts b/src/domain/entities/user.ts new file mode 100644 index 0000000..546f0a4 --- /dev/null +++ b/src/domain/entities/user.ts @@ -0,0 +1,44 @@ +import { extendZodWithOpenApi } from '@asteasolutions/zod-to-openapi'; +import { z } from 'zod'; +extendZodWithOpenApi(z); + +export type UserType = z.infer; +export class User { + readonly id: string; + readonly fullName: string; + readonly initials: string; + static readonly schema = z + .object({ + id: z.string().uuid().describe('uuid4 do usuário'), + fullName: z.string().describe('nome do usuário'), + initials: z.string().min(2).max(2).describe('iniciais do usuário'), + }) + .openapi('User', { description: 'um usuário do sistema' }); + + private constructor(user: UserType) { + this.id = user.id; + this.fullName = user.fullName; + this.initials = user.initials; + } + + static create(user: Optional) { + return new User({ + id: user.id ?? crypto.randomUUID(), + fullName: user.fullName, + initials: user.initials, + }); + } + + static fromUnknown(unknown: unknown): User { + const data = User.schema.parse(unknown); + return new User(data); + } + + serialize() { + return { + id: this.id, + fullName: this.fullName, + initials: this.initials, + }; + } +} diff --git a/src/domain/entities/vehicle.ts b/src/domain/entities/vehicle.ts new file mode 100644 index 0000000..8f19a48 --- /dev/null +++ b/src/domain/entities/vehicle.ts @@ -0,0 +1,40 @@ +import { extendZodWithOpenApi } from '@asteasolutions/zod-to-openapi'; +import { z } from 'zod'; +extendZodWithOpenApi(z); + +export type VehicleType = z.infer; +export class Vehicle { + readonly id: string; + readonly name: string; + + static readonly schema = z + .object({ + id: z.string().uuid().describe('uuid4 do veículo'), + name: z.string().describe('nome do veículo'), + }) + .openapi('Vehicle', { description: 'Um veículo de coleta de vidro' }); + + private constructor(vehicle: VehicleType) { + this.id = vehicle.id; + this.name = vehicle.name; + } + + static create(vehicle: Optional) { + return new Vehicle({ + id: vehicle.id ?? crypto.randomUUID(), + name: vehicle.name, + }); + } + + static fromUnknown(unknown: unknown): Vehicle { + const data = Vehicle.schema.parse(unknown); + return new Vehicle(data); + } + + serialize() { + return { + id: this.id, + name: this.name, + }; + } +} diff --git a/src/domain/repositories/collection-points-repository.ts b/src/domain/repositories/collection-points-repository.ts new file mode 100644 index 0000000..8a9b51d --- /dev/null +++ b/src/domain/repositories/collection-points-repository.ts @@ -0,0 +1,9 @@ +import type { CollectionPoint } from '../entities/collection-point'; +import type { CollectionPointFiltersType } from '../value-objects/filters'; + +export interface CollectionPointsRepository { + getById(collectionPointId: string): Promise; + save(collectionPoint: CollectionPoint): Promise; + list(filters: CollectionPointFiltersType): Promise; + count(filters: CollectionPointFiltersType): Promise; +} diff --git a/src/domain/repositories/collections.repository.ts b/src/domain/repositories/collections.repository.ts new file mode 100644 index 0000000..1904411 --- /dev/null +++ b/src/domain/repositories/collections.repository.ts @@ -0,0 +1,5 @@ +import type { Collection } from '../entities/collection'; + +export type CollectionsRepository = { + findById(id: string): Promise; +}; diff --git a/src/domain/repositories/keycloak-repository.ts b/src/domain/repositories/keycloak-repository.ts new file mode 100644 index 0000000..748d6e9 --- /dev/null +++ b/src/domain/repositories/keycloak-repository.ts @@ -0,0 +1,8 @@ +import type { KeycloakUser } from '../../infra/providers/keycloak'; +import type { CollectionPoint } from '../entities/collection-point'; + +export interface KeycloakRepository { + save(collectionPoint: CollectionPoint, accessToken: string): Promise; + delete(userId: string, accessToken: string): Promise; + me(userAccessToken: string): Promise; +} diff --git a/src/domain/repositories/operator-repository.ts b/src/domain/repositories/operator-repository.ts new file mode 100644 index 0000000..863dcd5 --- /dev/null +++ b/src/domain/repositories/operator-repository.ts @@ -0,0 +1,5 @@ +import type { Operator } from '../entities/operator'; + +export interface OperatorRepository { + getById(id: string): Promise; +} diff --git a/src/domain/repositories/routes-repository.ts b/src/domain/repositories/routes-repository.ts new file mode 100644 index 0000000..f9f3499 --- /dev/null +++ b/src/domain/repositories/routes-repository.ts @@ -0,0 +1,8 @@ +import type { Route } from '../entities/route'; + +export interface RoutesRepository { + getById(id: string): Promise; + list(): Promise; + hasRoutesInProgressByUser(userId: string): Promise; + save(route: Route): Promise; +} diff --git a/src/domain/repositories/users-repository.ts b/src/domain/repositories/users-repository.ts new file mode 100644 index 0000000..ede4601 --- /dev/null +++ b/src/domain/repositories/users-repository.ts @@ -0,0 +1,5 @@ +import type { User } from '../entities/user'; + +export interface UsersRepository { + me(): Promise; +} diff --git a/src/domain/repositories/vehicles-repository.ts b/src/domain/repositories/vehicles-repository.ts new file mode 100644 index 0000000..4cd792a --- /dev/null +++ b/src/domain/repositories/vehicles-repository.ts @@ -0,0 +1,5 @@ +import type { Vehicle } from '../entities/vehicle'; + +export interface VehiclesRepository { + list(): Promise; +} diff --git a/src/domain/services/user-service.ts b/src/domain/services/user-service.ts new file mode 100644 index 0000000..e011b2a --- /dev/null +++ b/src/domain/services/user-service.ts @@ -0,0 +1,14 @@ +import { BusinessRuleViolationProblem } from './../../infra/errors/business-rule-violation'; +import type { RoutesRepository } from '../repositories/routes-repository'; + +export class UserRoutesRules { + constructor(private routesRepository: RoutesRepository) {} + + async ensureHasSingleRouteInProgress(userId: string) { + const hasRoutesInProgress = await this.routesRepository.hasRoutesInProgressByUser(userId); + + if (hasRoutesInProgress) { + throw BusinessRuleViolationProblem.error('Só pode haver uma rota em andamento por usuário', 'userId'); + } + } +} diff --git a/src/domain/value-objects/address.ts b/src/domain/value-objects/address.ts new file mode 100644 index 0000000..417f5d5 --- /dev/null +++ b/src/domain/value-objects/address.ts @@ -0,0 +1,70 @@ +import { extendZodWithOpenApi } from '@asteasolutions/zod-to-openapi'; +import { z } from 'zod'; +import { Coordinates } from './coordinates'; +extendZodWithOpenApi(z); + +export type AddressType = z.infer; +export class Address { + readonly street: string; + readonly complement?: string; + readonly zipcode: string; + readonly number: string; + readonly district: string; + readonly city: string; + readonly state: string; + readonly coordinate?: Coordinates; + + static readonly schema = z + .object({ + street: z.string().describe('Rua do endereço'), + complement: z.string().optional().describe('Complemento do endereço (opcional)'), + zipcode: z.string().describe('CEP do endereço'), + number: z.string().describe('Número do endereço'), + district: z.string().describe('Bairro do endereço'), + city: z.string().describe('Cidade do endereço'), + state: z.string().describe('Estado do endereço'), + coordinate: Coordinates.schema.optional().describe('Coordenadas geográficas do endereço'), + }) + .openapi('Address', { + description: 'Representa um endereço completo com informações geográficas', + }); + + private constructor(address: AddressType) { + this.street = address.street; + this.complement = address.complement; + this.coordinate = Coordinates.maybeCreate(address.coordinate); + this.city = address.city; + this.district = address.district; + this.zipcode = address.zipcode; + this.state = address.state; + this.number = address.number; + } + + static create(address: AddressType) { + return new Address(address); + } + + static fromUnknown(unknown: unknown): Address { + const data = Address.schema.parse(unknown); + return new Address(data); + } + + static fromJSON(json: string): Address { + const unknown = JSON.parse(json); + const data = Address.schema.parse(unknown); + return new Address(data); + } + + serialize() { + return { + city: this.city, + district: this.district, + zipcode: this.zipcode, + state: this.state, + number: this.number, + street: this.street, + complement: this.complement, + coordinate: this.coordinate?.serialize(), + }; + } +} diff --git a/src/domain/value-objects/collection-point-role.ts b/src/domain/value-objects/collection-point-role.ts new file mode 100644 index 0000000..5a76018 --- /dev/null +++ b/src/domain/value-objects/collection-point-role.ts @@ -0,0 +1,34 @@ +import { extendZodWithOpenApi } from '@asteasolutions/zod-to-openapi'; +import { z } from 'zod'; +extendZodWithOpenApi(z); + +export type ContactRoleEnum = z.infer; +export class ContactRole { + readonly value: ContactRoleEnum; + + static readonly enum = Object.freeze({ ADMIN: 'ADMIN', MANAGER: 'MANAGER' }); + static readonly schema = z.nativeEnum(ContactRole.enum).openapi('ContactRole', { + description: 'O cargo do contato', + }); + + private constructor(type: ContactRoleEnum) { + this.value = type; + } + + static create(type: ContactRoleEnum) { + return new ContactRole(type); + } + + static maybeCreate(type: ContactRoleEnum | undefined): ContactRole | undefined { + return type ? ContactRole.create(type) : undefined; + } + + static fromUnknown(unknown: unknown): ContactRole { + const data = ContactRole.schema.parse(unknown); + return new ContactRole(data); + } + + serialize() { + return this.value; + } +} diff --git a/src/domain/value-objects/collection-point-status.ts b/src/domain/value-objects/collection-point-status.ts new file mode 100644 index 0000000..aa64d06 --- /dev/null +++ b/src/domain/value-objects/collection-point-status.ts @@ -0,0 +1,39 @@ +import { extendZodWithOpenApi } from '@asteasolutions/zod-to-openapi'; +import { z } from 'zod'; +extendZodWithOpenApi(z); + +export type CollectionPointStatusEnum = z.infer; +export class CollectionPointStatus { + readonly value: CollectionPointStatusEnum; + + static readonly enum = Object.freeze({ ACTIVE: 'ACTIVE', INACTIVE: 'INACTIVE' }); + static readonly list = Object.values(CollectionPointStatus.enum); + static readonly schema = z.nativeEnum(CollectionPointStatus.enum).openapi('CollectionPointStatus', { + description: 'O estado de um ponto de coleta de coleta de resíduo de vidro dentro de uma rota', + }); + + private constructor(status: CollectionPointStatusEnum) { + this.value = status; + } + + static create(status: CollectionPointStatusEnum) { + return new CollectionPointStatus(status); + } + + static fromUnknown(unknown: unknown): CollectionPointStatus { + const data = CollectionPointStatus.schema.parse(unknown); + return new CollectionPointStatus(data); + } + + static active() { + return new CollectionPointStatus(CollectionPointStatus.enum.ACTIVE); + } + + static inactive() { + return new CollectionPointStatus(CollectionPointStatus.enum.INACTIVE); + } + + serialize() { + return this.value; + } +} diff --git a/src/domain/value-objects/collection-point-type.ts b/src/domain/value-objects/collection-point-type.ts new file mode 100644 index 0000000..fc18ce5 --- /dev/null +++ b/src/domain/value-objects/collection-point-type.ts @@ -0,0 +1,36 @@ +import { extendZodWithOpenApi } from '@asteasolutions/zod-to-openapi'; +import { z } from 'zod'; +extendZodWithOpenApi(z); + +export type CollectionPointTypeEnum = z.infer; +export class CollectionPointType { + readonly value: CollectionPointTypeEnum; + + static readonly enum = Object.freeze({ RESTAURANT: 'RESTAURANT', APARTMENT: 'APARTMENT' }); + static readonly schema = z.nativeEnum(CollectionPointType.enum).openapi('CollectionPointType', { + description: 'O tipo de um ponto de coleta de coleta', + }); + + private constructor(type: CollectionPointTypeEnum) { + this.value = type; + } + + static create(type: CollectionPointTypeEnum) { + return new CollectionPointType(type); + } + + static fromUnknown(unknown: unknown): CollectionPointType { + const data = CollectionPointType.schema.parse(unknown); + return new CollectionPointType(data); + } + + static fromJSON(json: string): CollectionPointType { + const unknown = JSON.parse(json); + const data = CollectionPointType.schema.parse(unknown); + return new CollectionPointType(data); + } + + serialize() { + return this.value; + } +} diff --git a/src/domain/value-objects/collection-status.ts b/src/domain/value-objects/collection-status.ts new file mode 100644 index 0000000..9e3cb87 --- /dev/null +++ b/src/domain/value-objects/collection-status.ts @@ -0,0 +1,39 @@ +import { extendZodWithOpenApi } from '@asteasolutions/zod-to-openapi'; +import { z } from 'zod'; +extendZodWithOpenApi(z); + +export type CollectionStatusEnum = z.infer; +export class CollectionStatus { + readonly value: CollectionStatusEnum; + + static readonly enum = Object.freeze({ PENDING: 'PENDING', IN_PROGRESS: 'IN_PROGRESS', FINISHED: 'FINISHED' }); + static readonly list = Object.values(CollectionStatus.enum); + static readonly schema = z.nativeEnum(CollectionStatus.enum).openapi('CollectionStatus', { + description: 'O estado de uma coleta dentro de uma rota', + }); + + private constructor(status: CollectionStatusEnum) { + this.value = status; + } + + static create(status: CollectionStatusEnum) { + return new CollectionStatus(status); + } + + static fromUnknown(unknown: unknown): CollectionStatus { + const data = CollectionStatus.schema.parse(unknown); + return new CollectionStatus(data); + } + + static inProgress() { + return new CollectionStatus(CollectionStatus.enum.IN_PROGRESS); + } + + static finished() { + return new CollectionStatus(CollectionStatus.enum.FINISHED); + } + + serialize() { + return this.value; + } +} diff --git a/src/domain/value-objects/comment.ts b/src/domain/value-objects/comment.ts new file mode 100644 index 0000000..a7695f4 --- /dev/null +++ b/src/domain/value-objects/comment.ts @@ -0,0 +1,32 @@ +import { extendZodWithOpenApi } from '@asteasolutions/zod-to-openapi'; +import { z } from 'zod'; +extendZodWithOpenApi(z); + +export type CommentType = z.infer; +export class Comment { + readonly value: string | undefined; + + static readonly schema = z + .string() + .max(250, 'Limite de caracteres excedido: comentários de tarefas tem um limite de 250 caracteres') + .trim() + .optional() + .openapi('Comment', { description: 'comentário' }); + + private constructor(comment: string | undefined) { + this.value = comment; + } + + static create(comment: string | undefined) { + return new Comment(comment); + } + + static fromUnknown(unknown: unknown): Comment { + const data = Comment.schema.parse(unknown); + return new Comment(data); + } + + serialize() { + return this.value; + } +} diff --git a/src/domain/value-objects/contact.ts b/src/domain/value-objects/contact.ts new file mode 100644 index 0000000..10454de --- /dev/null +++ b/src/domain/value-objects/contact.ts @@ -0,0 +1,52 @@ +import { z } from 'zod'; +import { ContactRole } from './collection-point-role'; + +export type ContactType = z.infer; +export class Contact { + readonly name: string; + readonly role?: ContactRole; + readonly phone: string; + readonly email: string; + + static schema = z.object({ + name: z.string().describe('Nome do contato'), + role: ContactRole.schema.optional().describe('Cargo do contato'), + phone: z.string().describe('Telefone do contato'), + email: z.string().describe('E-mail do contato'), + }); + + private constructor(contact: ContactType) { + this.name = contact.name; + this.role = ContactRole.maybeCreate(contact.role); + this.phone = contact.phone; + this.email = contact.email; + } + + static create(contact: ContactType): Contact { + return new Contact(contact); + } + + static fromUnknown(unknown: unknown): Contact { + const data = Contact.schema.parse(unknown); + return new Contact(data); + } + + static fromJSON(json: string): Contact { + const unknown = JSON.parse(json); + const data = Contact.schema.parse(unknown); + return new Contact(data); + } + + static toJSON(contact: Contact): string { + return JSON.stringify(contact.serialize()); + } + + serialize() { + return { + name: this.name, + role: this.role?.serialize(), + phone: this.phone, + email: this.email, + }; + } +} diff --git a/src/domain/value-objects/coordinates.ts b/src/domain/value-objects/coordinates.ts new file mode 100644 index 0000000..76cf481 --- /dev/null +++ b/src/domain/value-objects/coordinates.ts @@ -0,0 +1,41 @@ +import { extendZodWithOpenApi } from '@asteasolutions/zod-to-openapi'; +import { z } from 'zod'; +extendZodWithOpenApi(z); + +export type CoordinatesType = z.infer; +export class Coordinates { + readonly latitude: number; + readonly longitude: number; + + static readonly schema = z + .object({ + latitude: z.number().describe('latitude da coordenada'), + longitude: z.number().describe('longitude da coordenada'), + }) + .openapi('Coordinates', { description: 'coordenadas cartesianas' }); + + private constructor(coordinates: CoordinatesType) { + this.latitude = coordinates.latitude; + this.longitude = coordinates.longitude; + } + + static create(coordinates: CoordinatesType) { + return new Coordinates(coordinates); + } + + static maybeCreate(coordinate?: CoordinatesType): Coordinates | undefined { + return coordinate ? Coordinates.create(coordinate) : undefined; + } + + static fromUnknown(unknown: unknown): Coordinates { + const data = Coordinates.schema.parse(unknown); + return new Coordinates(data); + } + + serialize() { + return { + latitude: this.latitude, + longitude: this.longitude, + }; + } +} diff --git a/src/domain/value-objects/filters.ts b/src/domain/value-objects/filters.ts new file mode 100644 index 0000000..93b5d08 --- /dev/null +++ b/src/domain/value-objects/filters.ts @@ -0,0 +1,6 @@ +import type { z } from 'zod'; +import { GenericFiltersSchema } from './generic-filters'; + +export const CollectionPointFiltersSchema = GenericFiltersSchema.extend({}); + +export type CollectionPointFiltersType = z.infer; diff --git a/src/domain/value-objects/generic-filters.ts b/src/domain/value-objects/generic-filters.ts new file mode 100644 index 0000000..fd8f9a7 --- /dev/null +++ b/src/domain/value-objects/generic-filters.ts @@ -0,0 +1,7 @@ +import { z } from 'zod'; + +export type GenericFiltersType = z.infer; +export const GenericFiltersSchema = z.object({ + limit: z.coerce.number().int().nonnegative().default(12).optional(), + offset: z.coerce.number().int().nonnegative().default(0).optional(), +}); diff --git a/src/domain/value-objects/reason.ts b/src/domain/value-objects/reason.ts new file mode 100644 index 0000000..65e6e8e --- /dev/null +++ b/src/domain/value-objects/reason.ts @@ -0,0 +1,34 @@ +import { extendZodWithOpenApi } from '@asteasolutions/zod-to-openapi'; +import { z } from 'zod'; +extendZodWithOpenApi(z); + +export type ReasonEnum = z.infer; + +export class Reason { + readonly value: ReasonEnum; + + static readonly enum = Object.freeze({ FINISHED: 'FINISHED' }); + static readonly list = Object.values(Reason.enum); + + static readonly schema = z + .nativeEnum(Reason.enum) + .optional() + .openapi('Reason', { description: 'Motivo associado ao fim da rota' }); + + private constructor(reason: ReasonEnum) { + this.value = reason; + } + + static create(reason: ReasonEnum) { + return new Reason(reason); + } + + static fromUnknown(unknown: unknown): Reason { + const data = Reason.schema.parse(unknown); + return new Reason(data); + } + + serialize() { + return this.value; + } +} diff --git a/src/domain/value-objects/responsible.ts b/src/domain/value-objects/responsible.ts new file mode 100644 index 0000000..1ea42b7 --- /dev/null +++ b/src/domain/value-objects/responsible.ts @@ -0,0 +1,52 @@ +import { extendZodWithOpenApi } from '@asteasolutions/zod-to-openapi'; +import { z } from 'zod'; +extendZodWithOpenApi(z); + +export type ResponsibleType = z.infer; +export class Responsible { + readonly name?: string; + readonly phone?: string; + + static readonly schema = z + .object({ + name: z.string().optional().describe('Nome do responsável'), + phone: z.string().optional().describe('Telefone do responsável'), + }) + .openapi('Responsible', { description: 'Informações de contato do responsável' }); + + private constructor(responsible: ResponsibleType) { + this.name = responsible.name; + this.phone = responsible.phone; + } + + static create(responsible: ResponsibleType): Responsible { + return new Responsible(responsible); + } + + static maybeCreate(responsible?: ResponsibleType): Responsible | undefined { + return responsible ? Responsible.create(responsible) : undefined; + } + + static fromUnknown(unknown: unknown): Responsible { + const data = Responsible.schema.parse(unknown); + return new Responsible(data); + } + + static fromJSON(json: string | null): Responsible | undefined { + if (!json) return undefined; + const unknown = JSON.parse(json); + const data = Responsible.schema.parse(unknown); + return new Responsible(data); + } + + static toJSON(responsible: Responsible): string { + return JSON.stringify(responsible.serialize()); + } + + serialize() { + return { + name: this.name, + phone: this.phone, + }; + } +} diff --git a/src/domain/value-objects/route-status.ts b/src/domain/value-objects/route-status.ts new file mode 100644 index 0000000..bac88ba --- /dev/null +++ b/src/domain/value-objects/route-status.ts @@ -0,0 +1,50 @@ +import { extendZodWithOpenApi } from '@asteasolutions/zod-to-openapi'; +import { z } from 'zod'; +extendZodWithOpenApi(z); + +export type RouteStatusEnum = z.infer; +export class RouteStatus { + readonly value: RouteStatusEnum; + + static readonly enum = Object.freeze({ PENDING: 'PENDING', IN_PROGRESS: 'IN_PROGRESS', FINISHED: 'FINISHED' }); + static readonly list = Object.values(RouteStatus.enum); + static readonly schema = z + .nativeEnum(RouteStatus.enum) + .openapi('RouteStatus', { description: 'O estado de uma rota de coleta de resíduo de vidro' }); + + // Constructors + private constructor(status: RouteStatusEnum) { + this.value = status; + } + + static create(status: RouteStatusEnum) { + return new RouteStatus(status); + } + + static pending() { + return new RouteStatus(RouteStatus.enum.PENDING); + } + + static inProgress() { + return new RouteStatus(RouteStatus.enum.IN_PROGRESS); + } + + static finished() { + return new RouteStatus(RouteStatus.enum.FINISHED); + } + + static fromUnknown(unknown: unknown): RouteStatus { + const data = RouteStatus.schema.parse(unknown); + return new RouteStatus(data); + } + + // Status check shorthands + isPending() { + return this.value === RouteStatus.enum.PENDING; + } + + // Serialization + serialize() { + return this.value; + } +} diff --git a/src/domain/value-objects/shift.ts b/src/domain/value-objects/shift.ts new file mode 100644 index 0000000..2028d2f --- /dev/null +++ b/src/domain/value-objects/shift.ts @@ -0,0 +1,55 @@ +import { extendZodWithOpenApi } from '@asteasolutions/zod-to-openapi'; +import { z } from 'zod'; +extendZodWithOpenApi(z); + +export type ShiftEnum = z.infer; +export class Shift { + readonly value: ShiftEnum; + + static readonly enum = Object.freeze({ + MORNING: 'MORNING', + AFTERNOON: 'AFTERNOON', + }); + static readonly schema = z.nativeEnum(Shift.enum).openapi('Shift', { + description: 'O turno de uma rota', + }); + + private constructor(shift: ShiftEnum) { + this.value = shift; + } + + static create(shift: ShiftEnum): Shift { + return new Shift(shift); + } + + static fromUnknown(unknown: unknown): Shift { + const data = Shift.schema.parse(unknown); + return new Shift(data); + } + + static fromJSON(json: string | null): ShiftEnum[]; + static fromJSON(json: string | null): ShiftEnum; + static fromJSON(json: string | null): ShiftEnum | ShiftEnum[] | undefined { + if (!json) return undefined; + const unknown = JSON.parse(json); + + if (Array.isArray(unknown)) { + const data = z.array(Shift.schema).parse(unknown); + return data; + } + + const data = Shift.schema.parse(unknown); + return data; + } + + static toJSON(shift?: Shift | Shift[]): string { + if (Array.isArray(shift)) { + return JSON.stringify(shift.map(shift => shift.serialize())); + } + return JSON.stringify(shift?.serialize()); + } + + serialize() { + return this.value; + } +} diff --git a/src/domain/value-objects/week-day.ts b/src/domain/value-objects/week-day.ts new file mode 100644 index 0000000..539091b --- /dev/null +++ b/src/domain/value-objects/week-day.ts @@ -0,0 +1,95 @@ +import { extendZodWithOpenApi } from '@asteasolutions/zod-to-openapi'; +import { z } from 'zod'; +extendZodWithOpenApi(z); + +export type WeekdayEnum = z.infer; +export type ExtendedWeekdayEnum = z.infer; +export class Weekday { + readonly value: WeekdayEnum; + + static readonly enum = Object.freeze({ + MONDAY: 'MONDAY', + TUESDAY: 'TUESDAY', + WEDNESDAY: 'WEDNESDAY', + THURSDAY: 'THURSDAY', + FRIDAY: 'FRIDAY', + }); + + static readonly extendedEnum = Object.freeze({ + ...Weekday.enum, + WEEKEND: 'WEEKEND', + NOANSWER: 'NOANSWER', + }); + + static readonly schema = z.nativeEnum(Weekday.enum).openapi('Weekday', { + description: 'Um dia da semana válido', + }); + + static readonly extendedSchema = z.nativeEnum(Weekday.extendedEnum).openapi('ExtendedWeekday', { + description: 'Um dia da semana incluindo o fim de semana, ou sem informação', + }); + + private constructor(weekday: WeekdayEnum) { + this.value = weekday; + } + + static create(weekday: WeekdayEnum): Weekday { + return new Weekday(weekday); + } + static maybeCreate(weekday: WeekdayEnum[] | undefined): Weekday[] | undefined { + if (!weekday) return undefined; + return weekday.map(day => (day ? Weekday.create(day as WeekdayEnum) : undefined)).filter(day => day !== undefined); + } + + static createExtended(weekday: ExtendedWeekdayEnum): Weekday { + if (weekday === 'NOANSWER' || weekday === 'WEEKEND') { + throw new Error(`Cannot create a Weekday instance with "${weekday}". Use ExtendedWeekday instead.`); + } + return new Weekday(weekday); + } + static maybeCreateExtended(weekday: ExtendedWeekdayEnum[] | undefined): Weekday[] | undefined { + if (!weekday) return undefined; + return weekday.map(day => (day ? Weekday.createExtended(day) : undefined)).filter(day => day !== undefined); + } + + static fromJSON(json: string | null): WeekdayEnum[]; + static fromJSON(json: string | null): WeekdayEnum; + static fromJSON(json: string | null): WeekdayEnum | WeekdayEnum[] | undefined { + if (!json) return undefined; + const unknown = JSON.parse(json); + + if (Array.isArray(unknown)) { + const data = z.array(Weekday.schema).parse(unknown); + return data; + } + + const data = Weekday.schema.parse(unknown); + return data; + } + + static fromJSONWithUnknown(json: string | null): ExtendedWeekdayEnum[]; + static fromJSONWithUnknown(json: string | null): ExtendedWeekdayEnum; + static fromJSONWithUnknown(json: string | null): ExtendedWeekdayEnum | ExtendedWeekdayEnum[] | undefined { + if (!json) return undefined; + const unknown = JSON.parse(json); + + if (Array.isArray(unknown)) { + const data = z.array(Weekday.extendedSchema).parse(unknown); + return data; + } + + const data = Weekday.extendedSchema.parse(unknown); + return data; + } + + static toJSON(weekDay?: Weekday | Weekday[]): string { + if (Array.isArray(weekDay)) { + return JSON.stringify(weekDay.map(day => day.serialize())); + } + return JSON.stringify(weekDay?.serialize()); + } + + serialize() { + return this.value; + } +} diff --git a/src/global.d.ts b/src/global.d.ts new file mode 100644 index 0000000..a40af1b --- /dev/null +++ b/src/global.d.ts @@ -0,0 +1,75 @@ +import type winston from 'winston'; +import type { RoutesRepository } from './domain/repositories/routes-repository'; +import type { VehiclesRepository } from './domain/repositories/vehicles-repository'; +import type { UsersRepository } from './domain/repositories/users-repository'; +import type { CollectionPointsRepository } from './domain/repositories/collection-points-repository'; +import type { KeycloakRepository } from './domain/repositories/keycloak-repository'; +import type { CollectionsRepository } from './domain/repositories/collections.repository'; +import type { FileUploadProvider } from './infra/providers/file-upload'; + +declare global { + type Optional = Pick, K> & Omit; + + type NonFunctionProperties = Pick>; + type NonFunctionPropertyNames = { + // biome-ignore lint/complexity/noBannedTypes: + [K in keyof T]: T[K] extends Function ? never : K; + }[keyof T]; + + namespace Express { + export interface Session { + /** + * Unique identifier of the user (UUID4) + */ + userId: string; + /** + * Scope claims of the user, what the user can have access to, + * for example read:service-order or write:task + */ + scopes: string[]; + /** + * Role claims of the user, which roles the user has withing the + * resource that is being requested. + */ + roles: string[]; + } + + export interface Repositories { + routesRepository: RoutesRepository; + vehiclesRepository: VehiclesRepository; + usersRepository: UsersRepository; + collectionPointsRepository: CollectionPointsRepository; + keyCloakRepository: KeycloakRepository; + operatorRepository: OperatorRepository; + collectionRepository: CollectionsRepository; + } + + export interface RequestContext { + /** + * Use this logger instead of console.log or console.error to log + * into the console or other sinks. + */ + logger: winston.Logger; + /** + * The current session + */ + session?: Session; + /** + * List of the repositories to obtain data + */ + repositories?: Repositories; + /** + * The access token of the user, if any + * */ + accessToken?: string; + /** + * Provides a way to upload a file + */ + fileUploadProvider: FileUploadProvider; + } + + interface Request { + context: RequestContext; + } + } +} diff --git a/src/infra/database/prisma-error-extract.ts b/src/infra/database/prisma-error-extract.ts new file mode 100644 index 0000000..1c66485 --- /dev/null +++ b/src/infra/database/prisma-error-extract.ts @@ -0,0 +1,14 @@ +function uncapitalize(string: string | undefined) { + if (!string?.[0]) return ''; + return string[0].toLowerCase() + string.slice(1); +} + +/** + * @param message Message of an error of code 2025 + * @returns The name of the model that triggered the error + */ +export function extractModelFromMessageP2025(message: string) { + const words = message.split(' '); + const modelName = words[1]; + return uncapitalize(modelName); +} diff --git a/src/infra/errors/already-exists.ts b/src/infra/errors/already-exists.ts new file mode 100644 index 0000000..3e8d51e --- /dev/null +++ b/src/infra/errors/already-exists.ts @@ -0,0 +1,14 @@ +import { Problem } from './generic-problem'; + +export class AlreadyExistsProblem extends Problem { + constructor() { + super({ + type: 'docs/#/problems?id=already-exists', + title: 'Already Exists', + detail: 'The resource being created already exists', + errors: undefined, + status: 409, + code: '409-1', + }); + } +} diff --git a/src/infra/errors/business-rule-violation.ts b/src/infra/errors/business-rule-violation.ts new file mode 100644 index 0000000..edb979c --- /dev/null +++ b/src/infra/errors/business-rule-violation.ts @@ -0,0 +1,42 @@ +import type { DetailedError } from './problem-details'; +import { Problem } from './generic-problem'; + +export class BusinessRuleError extends Error implements DetailedError { + readonly detail: string; + readonly pointer: string; + + constructor(detail: string, pointer: string) { + super(detail); + this.name = 'BusinessRuleError'; + this.pointer = pointer; + this.detail = detail; + } + + getDetails() { + return { detail: this.detail, pointer: this.pointer }; + } +} + +/** + * Use for any business rule violation. + * @example + * const problem = BusinessRuleViolationProblem.error('Scheduling conflict for user', '#/operatorId'); + * throw problem; + */ +export class BusinessRuleViolationProblem extends Problem { + constructor(errors: BusinessRuleError[]) { + super({ + type: 'docs/#/problems?id=business-rule-violation', + title: 'Business Rule Violation', + detail: 'The request is invalid and not meeting business rules', + status: 422, + code: '422-1', + errors: errors, + }); + } + + static error(detail: string, pointer: string) { + const errors = [new BusinessRuleError(detail, pointer)]; + return new BusinessRuleViolationProblem(errors); + } +} diff --git a/src/infra/errors/generic-problem.ts b/src/infra/errors/generic-problem.ts new file mode 100644 index 0000000..6c1763d --- /dev/null +++ b/src/infra/errors/generic-problem.ts @@ -0,0 +1,124 @@ +import type { DetailedError, ProblemDetails } from './problem-details'; +import env from 'env-var'; + +const API_BASE_URL = env.get('API_BASE_URL').required().asString(); +export class Problem implements ProblemDetails { + readonly type: string; + readonly title: string; + readonly detail: string; + readonly status: number; + readonly code: string; + readonly errors: DetailedError[] | undefined; + + protected constructor(problem: ProblemDetails) { + this.type = `${API_BASE_URL}${problem.type}`; + this.title = problem.title; + this.detail = problem.detail; + this.status = problem.status; + this.code = problem.code; + this.errors = problem.errors; + } + + toString(): string { + const object = { + type: this.type, + title: this.title, + detail: this.detail, + status: this.status, + code: this.code, + errors: this.errors?.map(error => error.getDetails()), + }; + return JSON.stringify(object, undefined, 2); + } +} + +export class NotFoundProblem extends Problem { + constructor() { + super({ + type: 'docs/#/problems?id=not-found', + title: 'Not Found', + detail: 'The requested resource was not found', + errors: undefined, + status: 404, + code: '404-1', + }); + } +} + +export class UnauthorizedProblem extends Problem { + constructor() { + super({ + type: 'docs/#/problems?id=unauthorized', + title: 'Unauthorized', + detail: 'Access token not set or invalid, and the request resource could not be returned', + errors: undefined, + status: 401, + code: '401-1', + }); + } +} + +export class ForbiddenProblem extends Problem { + constructor() { + super({ + type: 'docs/#/problems?id=forbidden', + title: 'Forbidden', + detail: 'The resource could not be returned as the requestor is not authorized', + errors: undefined, + status: 403, + code: '403-1', + }); + } +} + +export class BadRequestProblem extends Problem { + constructor() { + super({ + type: 'docs/#/problems?id=bad-request', + title: 'Bad Request', + detail: 'The request is invalid or malformed', + errors: undefined, + status: 400, + code: '400-1', + }); + } +} + +export class InvalidParametersProblem extends Problem { + constructor() { + super({ + type: 'docs/#/problems?id=invalid-parameters', + title: 'Invalid Parameters', + detail: 'The request contained invalid, or malformed parameters (path, header or query)', + errors: undefined, + status: 400, + code: '400-2', + }); + } +} + +export class ServiceUnavailableProblem extends Problem { + constructor() { + super({ + type: 'docs/#/problems?id=service-unavailable', + title: 'Service Unavailable', + detail: 'The service is currently unavailable', + errors: undefined, + status: 503, + code: '503-1', + }); + } +} + +export class ServerErrorProblem extends Problem { + constructor() { + super({ + type: 'docs/#/problems?id=server-error', + title: 'Server Error', + detail: 'The server encountered an unexpected error', + errors: undefined, + status: 500, + code: '500-1', + }); + } +} diff --git a/src/infra/errors/orphan-user.ts b/src/infra/errors/orphan-user.ts new file mode 100644 index 0000000..2336478 --- /dev/null +++ b/src/infra/errors/orphan-user.ts @@ -0,0 +1,14 @@ +import { Problem } from './generic-problem'; + +export class OrphanUserProblem extends Problem { + constructor() { + super({ + type: 'docs/#/problems?id=orphan-user', + title: 'Orphan User', + detail: "The user doesn't belong to any organization", + errors: undefined, + status: 403, + code: '403-2', + }); + } +} diff --git a/src/infra/errors/problem-details.ts b/src/infra/errors/problem-details.ts new file mode 100644 index 0000000..3623238 --- /dev/null +++ b/src/infra/errors/problem-details.ts @@ -0,0 +1,44 @@ +export interface DetailedErrorDetails { + detail: string; + pointer?: string; + parameter?: string; +} + +export interface DetailedError extends Error { + /** + * Returns the details of the error, it + */ + getDetails(): DetailedErrorDetails; +} + +export interface ProblemDetails { + /** + * A link to the problem type page + */ + readonly type: string; + /** + * The title of the problem, unique for each type + */ + readonly title: string; + /** + * The detail of the problem, unique for each type + */ + readonly detail: string; + /** + * The http status code for the problem + */ + readonly status: number; + /** + * The error code of the problem, unique for each type + */ + readonly code: string; + /** + * A list of errors, they must be serializable (toJson) + */ + readonly errors: DetailedError[] | undefined; + + /** + * Stringifies the problem in a readable way + */ + toString(): string; +} diff --git a/src/infra/errors/resource-not-found.ts b/src/infra/errors/resource-not-found.ts new file mode 100644 index 0000000..5d26c62 --- /dev/null +++ b/src/infra/errors/resource-not-found.ts @@ -0,0 +1,42 @@ +import { Problem } from './generic-problem'; +import type { DetailedError } from './problem-details'; + +export class ResourceNotFoundError extends Error implements DetailedError { + readonly detail: string; + readonly pointer: string; + + constructor(detail: string, pointer: string) { + super(detail); + this.name = 'ResourceNotFoundError'; + this.pointer = pointer; + this.detail = detail; + } + + getDetails() { + return { detail: this.detail, pointer: this.pointer }; + } +} + +/** + * Use for anytime a resource is not found in the request + * @example + * const problem = ResourceNotFound.error('User does not exisst', '#/userId'); + * throw problem; + */ +export class ResourceNotFoundProblem extends Problem { + constructor(errors: ResourceNotFoundError[]) { + super({ + type: 'docs/#/problems?id=resource-not-found', + title: 'Resource Not Found', + detail: 'The resource does not exist', + errors: errors, + status: 404, + code: '404-2', + }); + } + + static error(detail: string, pointer: string) { + const errors = [new ResourceNotFoundError(detail, pointer)]; + return new ResourceNotFoundProblem(errors); + } +} diff --git a/src/infra/errors/validation-error.ts b/src/infra/errors/validation-error.ts new file mode 100644 index 0000000..5f190ea --- /dev/null +++ b/src/infra/errors/validation-error.ts @@ -0,0 +1,36 @@ +import type { DetailedError } from './problem-details'; +import { Problem } from './generic-problem'; + +export class ValidationError extends Error implements DetailedError { + readonly detail: string; + readonly pointer: string; + + constructor(detail: string, pointer: string) { + super(detail); + this.name = 'ValidationError'; + this.pointer = pointer; + this.detail = detail; + } + + getDetails() { + return { detail: this.detail, pointer: this.pointer }; + } +} + +export class ValidationErrorProblem extends Problem { + constructor(errors: ValidationError[]) { + super({ + type: 'docs/#/problems?id=validation-error', + title: 'Validation Error', + detail: 'The request is not valid', + status: 422, + code: '422-2', + errors: errors, + }); + } + + static error(detail: string, pointer: string) { + const errors = [new ValidationError(detail, pointer)]; + return new ValidationErrorProblem(errors); + } +} diff --git a/src/infra/providers/file-storage/errors.ts b/src/infra/providers/file-storage/errors.ts new file mode 100644 index 0000000..684d0fd --- /dev/null +++ b/src/infra/providers/file-storage/errors.ts @@ -0,0 +1,9 @@ +export class FileNotFoundError extends Error { + path: string; + + constructor(message: string, path: string) { + super(message); + this.name = 'FileNotFoundError'; + this.path = path; + } +} diff --git a/src/infra/providers/file-storage/fake-file-storage.ts b/src/infra/providers/file-storage/fake-file-storage.ts new file mode 100644 index 0000000..3c67716 --- /dev/null +++ b/src/infra/providers/file-storage/fake-file-storage.ts @@ -0,0 +1,28 @@ +import type { AsyncFileStorage, FileStorage } from './file-storage'; + +export class FakeStorage implements AsyncFileStorage, FileStorage { + constructor(public file: string | Buffer) {} + + load(): string { + return this.file.toString(); + } + + save(path: string, content: string | Buffer, append?: boolean | undefined): string { + if (append) this.file += content.toString(); + else this.file = content; + return path; + } + + loadAsync(): Promise { + return Promise.resolve(this.load()); + } + + deleteAsync(path: string): Promise { + this.file = ''; + return Promise.resolve(path); + } + + saveAsync(path: string, content: string | Buffer, append?: boolean | undefined): Promise { + return Promise.resolve(this.save(path, content, append)); + } +} diff --git a/src/infra/providers/file-storage/file-storage.ts b/src/infra/providers/file-storage/file-storage.ts new file mode 100644 index 0000000..7ac71f7 --- /dev/null +++ b/src/infra/providers/file-storage/file-storage.ts @@ -0,0 +1,47 @@ +export interface FileStorage { + /** + * Loads the content of a file synchronously + * @param path Path to the file, it can be a local path or a remote path. + * @throws FileNotFoundError if the file does not exist + */ + load(path: string): string | Buffer; + + /** + * Saves the content of a file synchronously + * @param path Path to write the file, it can be a local path or a remote + * path + * @param content Content to write to the file + * @param append If true, and the file exists, appends to the file. If false + * and the file exists, overwrites the file. The default behavior is overriding. + */ + save(path: string, content: string, append?: boolean): string | Buffer; +} + +export interface AsyncFileStorage { + /** + * Loads the content of a file asynchronously + * @param path Path to the file, it can be a local path or a remote path. + * @rejects with FileNotFoundError if the file does not exist + */ + loadAsync(path: string): Promise; + + /** + * Saves the content of a file asynchronously + * @param path Path to write the file, it can be a local path or a remote + * path + * @param content Content to write to the file + * @param append If true, and the file exists, appends to the file. If false + * and the file exists, overwrites the file. + */ + saveAsync(path: string, content: string | Buffer, append?: boolean): Promise; + + /** + * Saves the content of a file asynchronously + * @param path Path to write the file, it can be a local path or a remote + * path + * @param content Content to write to the file + * @param append If true, and the file exists, appends to the file. If false + * and the file exists, overwrites the file. + */ + deleteAsync(path: string): Promise; +} diff --git a/src/infra/providers/file-storage/index.ts b/src/infra/providers/file-storage/index.ts new file mode 100644 index 0000000..3fffd88 --- /dev/null +++ b/src/infra/providers/file-storage/index.ts @@ -0,0 +1,3 @@ +export type { FileStorage, AsyncFileStorage } from './file-storage'; +export { LocalFileStorage } from './local-file-storage'; +export { S3FileStorage } from './s3-file-storage'; diff --git a/src/infra/providers/file-storage/local-file-storage.ts b/src/infra/providers/file-storage/local-file-storage.ts new file mode 100644 index 0000000..d79b6be --- /dev/null +++ b/src/infra/providers/file-storage/local-file-storage.ts @@ -0,0 +1,54 @@ +import type { AsyncFileStorage, FileStorage } from './file-storage'; +import { readFileSync, writeFileSync } from 'node:fs'; +import { writeFile, readFile, unlink } from 'node:fs/promises'; +import { FileNotFoundError } from './errors'; +import { resolve } from 'node:path'; + +export class LocalFileStorage implements FileStorage, AsyncFileStorage { + /** + * Creates a new local file storage + * @param prefix Prefix to the file path + */ + constructor(private prefix = '') {} + + async loadAsync(path: string): Promise { + try { + const resolvedPath = resolve(this.prefix, path); + const buffer = await readFile(resolvedPath); + return buffer.toString(); + } catch (error: unknown) { + if (error instanceof Error) throw new FileNotFoundError(error.message, path); + throw new FileNotFoundError('file not found', path); + } + } + + async saveAsync(path: string, content: string | Buffer, append?: boolean | undefined): Promise { + const resolvedPath = resolve(this.prefix, path); + const flag = append ? 'a' : 'w'; + await writeFile(resolvedPath, content, { flag }); + return resolvedPath; + } + + async deleteAsync(path: string): Promise { + const resolvedPath = resolve(this.prefix, path); + await unlink(resolvedPath); + return resolvedPath; + } + + load(path: string): string | Buffer { + try { + const resolvedPath = resolve(this.prefix, path); + return readFileSync(resolvedPath).toString(); + } catch (error: unknown) { + if (error instanceof Error) throw new FileNotFoundError(error.message, path); + throw new FileNotFoundError('file not found', path); + } + } + + save(path: string, content: string | Buffer, append?: boolean | undefined): string | Buffer { + const resolvedPath = resolve(this.prefix, path); + const flag = append ? 'a' : 'w'; + writeFileSync(resolvedPath, content, { flag }); + return resolvedPath; + } +} diff --git a/src/infra/providers/file-storage/s3-file-storage.ts b/src/infra/providers/file-storage/s3-file-storage.ts new file mode 100644 index 0000000..f86be51 --- /dev/null +++ b/src/infra/providers/file-storage/s3-file-storage.ts @@ -0,0 +1,66 @@ +import type { S3 } from '@aws-sdk/client-s3'; +import type { Logger } from 'winston'; +import type { AsyncFileStorage } from './file-storage'; +import { FileNotFoundError } from './errors'; + +type AmazonS3 = Pick; + +export class S3FileStorage implements AsyncFileStorage { + private bucket: string; + private amazonS3: AmazonS3; + private fallback?: AsyncFileStorage; + private logger: Logger; + + constructor(amazonS3: AmazonS3, bucket: string, logger: Logger, fallback?: AsyncFileStorage) { + this.bucket = bucket; + this.logger = logger; + this.amazonS3 = amazonS3; + this.fallback = fallback; + } + + async loadAsync(key: string): Promise { + try { + const result = await this.amazonS3.getObject({ + Bucket: this.bucket, + Key: key, + }); + + if (!result.Body) throw new FileNotFoundError('File not found on s3', key); + const byteArray = await result.Body.transformToByteArray(); + return Buffer.from(byteArray); + } catch (error: unknown) { + this.logger.warn('failure to retrieve file', { error, key }); + throw error; + } + } + + async deleteAsync(key: string): Promise { + try { + await this.amazonS3.deleteObject({ + Bucket: this.bucket, + Key: key, + }); + } catch (error: unknown) { + this.logger.warn('failure on deleting file', { error, key }); + throw error; + } + + return key; + } + + async saveAsync(key: string, content: string | Buffer): Promise { + try { + await this.amazonS3.putObject({ + Bucket: this.bucket, + Key: key, + Body: content, + }); + } catch (error: unknown) { + this.logger.warn('file upload to s3 failed, saving to fallback', { error, key }); + await this.fallback?.saveAsync(key, content); + throw error; + } + + return key; + } +} diff --git a/src/infra/providers/file-upload/fake-file-upload.ts b/src/infra/providers/file-upload/fake-file-upload.ts new file mode 100644 index 0000000..6cfc3d4 --- /dev/null +++ b/src/infra/providers/file-upload/fake-file-upload.ts @@ -0,0 +1,22 @@ +import type { RequestHandler } from 'express'; +import type { FileUploadProvider, UploadedFile } from './file-upload'; +import { noopMiddleware } from '../../../presentation/http-rest/middlewares/noop'; + +export class FakeFileUploadProvider implements FileUploadProvider { + createMiddleware(): RequestHandler { + return noopMiddleware; + } + + getFilesFromRequest(): UploadedFile[] { + return [ + { + fieldname: 'avatar', + originalName: 'avatar.png', + mimeType: 'image/png', + size: 2048, + buffer: Buffer.from('This is some fake image data', 'utf8'), + path: '/uploads/avatar.png', + }, + ]; + } +} diff --git a/src/infra/providers/file-upload/file-upload.ts b/src/infra/providers/file-upload/file-upload.ts new file mode 100644 index 0000000..fa6b852 --- /dev/null +++ b/src/infra/providers/file-upload/file-upload.ts @@ -0,0 +1,37 @@ +import type { Request, RequestHandler } from 'express'; + +/** + * Represents a file uploaded via the middleware. + */ +export interface UploadedFile { + /** Name of the field in the form data */ + fieldname: string; + /** Original file name as provided by the client */ + originalName: string; + /** MIME type of the file */ + mimeType: string; + /** Size of the file in bytes */ + size: number; + /** File buffer if stored in memory */ + buffer?: Buffer; + /** File path if stored on disk */ + path?: string; +} + +/** + * Interface for file upload providers. + */ +export interface FileUploadProvider { + /** + * Creates an Express middleware for handling file uploads. + * @returns An Express middleware function for file uploads. + */ + createMiddleware(): RequestHandler; + + /** + * Extracts the uploaded file(s) from the request. + * @param req The Express request object. + * @returns An array of uploaded files, or an empty array if no files were uploaded. + */ + getFilesFromRequest(req: Request): UploadedFile[]; +} diff --git a/src/infra/providers/file-upload/index.ts b/src/infra/providers/file-upload/index.ts new file mode 100644 index 0000000..2b53e3d --- /dev/null +++ b/src/infra/providers/file-upload/index.ts @@ -0,0 +1,3 @@ +export type { FileUploadProvider, UploadedFile } from './file-upload'; +export { FakeFileUploadProvider } from './fake-file-upload'; +export { MulterFileUploadProvider } from './multer-file-upload'; diff --git a/src/infra/providers/file-upload/multer-file-upload.ts b/src/infra/providers/file-upload/multer-file-upload.ts new file mode 100644 index 0000000..dc21beb --- /dev/null +++ b/src/infra/providers/file-upload/multer-file-upload.ts @@ -0,0 +1,68 @@ +import type { RequestHandler, Request } from 'express'; +import type { FileUploadProvider, UploadedFile } from './file-upload'; +import multer, { type Multer, type StorageEngine } from 'multer'; + +function isS3FileWithLocation(file: Express.Multer.File): file is Express.Multer.File & { location: string } { + return 'location' in file && typeof file.location === 'string'; +} + +/** + * Implementation of FileUploadProvider using Multer. + */ +export class MulterFileUploadProvider implements FileUploadProvider { + private multerInstance: Multer; + private fieldName: string; + private multipleFiles: boolean; + + /** + * Constructs a Multer-based file upload provider. + * @param fieldName The name of the form field for file uploads. + * @param multipleFiles Whether multipleFiles files should be allowed. + * @param storage Optional custom Multer storage engine. + */ + constructor(fieldName = 'file', multipleFiles = false, storage?: StorageEngine) { + this.fieldName = fieldName; + this.multipleFiles = multipleFiles; + this.multerInstance = multer({ + storage: storage ?? multer.memoryStorage(), + }); + } + + /** + * Creates an Express middleware for handling file uploads. + * @returns An Express middleware function for file uploads. + */ + createMiddleware(): RequestHandler { + if (this.multipleFiles) return this.multerInstance.array(this.fieldName); + return this.multerInstance.single(this.fieldName); + } + + /** + * Extracts the uploaded file(s) from the Express request. + * @param request The Express request object. + * @returns An array of UploadedFile objects, or an empty array if no files were uploaded. + */ + getFilesFromRequest(request: Request): UploadedFile[] { + let multerFiles: Express.Multer.File[] = []; + + if (request.file) { + multerFiles = [request.file]; + } else if (Array.isArray(request.files)) { + multerFiles = request.files; + } else if (request.files && typeof request.files === 'object') { + multerFiles = Object.values(request.files).flat(); + } + + return multerFiles.map((file: Express.Multer.File): UploadedFile => { + const filePath = isS3FileWithLocation(file) ? file.location : file.path; + return { + fieldname: file.fieldname, + originalName: file.originalname, + mimeType: file.mimetype, + size: file.size, + buffer: file.buffer as Buffer, + path: filePath, + }; + }); + } +} diff --git a/src/infra/providers/geocoding/geocoding.ts b/src/infra/providers/geocoding/geocoding.ts new file mode 100644 index 0000000..68440d3 --- /dev/null +++ b/src/infra/providers/geocoding/geocoding.ts @@ -0,0 +1,88 @@ +/** + * Represents a geographical location with latitude and longitude. + */ +export interface GeoLocation { + lat: number; + lon: number; +} + +export interface GeocodeAddress { + /** + * The address formatted as a single string + */ + readonly formattedAddress?: string | undefined; + /** + * The Street of the address, can also be an avenue, etc (rua) + */ + readonly street?: string | undefined; + /** + * The city of the address (cidade) + */ + readonly city?: string | undefined; + /** + * The district of the address (bairro) + */ + readonly district?: string | undefined; + /** + * The postal code of the address (CEP) + */ + readonly postCode?: string | undefined; + /** + * The county of the address + */ + readonly county?: string | undefined; + /** + * The state of the address (estado) + */ + readonly state?: string | undefined; + /** + * The country of the address (país) + */ + readonly country?: string | undefined; + /** + * The code of the country as two letters + */ + readonly countryCode?: string | undefined; + /** + * The number of the address (numero da casa, prédio, etc) + */ + readonly number?: string | undefined; + /** + * Geographical coordinates of the address + */ + readonly coordinate?: GeoLocation | undefined; +} + +/** + * Represents a single geocoding result, used for both geocode and reverse geocode + * responses. + */ +export interface GeocodeResponse { + address: GeocodeAddress; + location: GeoLocation; +} + +// Geocoding Provider Interface + +/** + * Interface for Geocoding services to implement. + * Supports forward geocoding and reverse geocoding with the same response structure. + */ +export interface GeocodingProvider { + /** + * Converts an address into geographic coordinates. + * @param query The quey of the address to geocode. + * @returns The geocoding response containing results with the address and + * geographic location for each. + */ + geocode(query: string): Promise; + + /** + * Converts geographic coordinates into an address. + * @param location The geographical location (latitude, longitude) to reverse + * geocode. + * @returns The geocoding response containing results with the address and + * geographic location for each. + */ + reverseGeocode(location: GeoLocation): Promise; +} diff --git a/src/infra/providers/geocoding/index.ts b/src/infra/providers/geocoding/index.ts new file mode 100644 index 0000000..55a48d0 --- /dev/null +++ b/src/infra/providers/geocoding/index.ts @@ -0,0 +1,2 @@ +export type { GeoLocation, GeocodeAddress, GeocodeResponse, GeocodingProvider } from './geocoding'; +export { NodeGeocoderAdapter } from './node-geocoder-adapter'; diff --git a/src/infra/providers/geocoding/mock-geocoding.ts b/src/infra/providers/geocoding/mock-geocoding.ts new file mode 100644 index 0000000..e804122 --- /dev/null +++ b/src/infra/providers/geocoding/mock-geocoding.ts @@ -0,0 +1,33 @@ +import type { GeocodeResponse, GeocodingProvider, GeoLocation } from './geocoding'; + +export class MockGeocodingProvider implements GeocodingProvider { + async geocode(_query: string): Promise { + return [ + { + location: { lat: -8.056321329417743, lon: -34.88263146088477 }, + address: { + street: 'Avenida Cruz Cabugá', + city: 'Recife', + postCode: '50040-000', + state: 'Pernambuco', + country: 'Brasil', + }, + }, + ]; + } + + async reverseGeocode(_location: GeoLocation): Promise { + return [ + { + location: { lat: -8.056321329417743, lon: -34.88263146088477 }, + address: { + street: 'Avenida Cruz Cabugá', + city: 'Recife', + postCode: '50040-000', + state: 'Pernambuco', + country: 'Brasil', + }, + }, + ]; + } +} diff --git a/src/infra/providers/geocoding/node-geocoder-adapter.ts b/src/infra/providers/geocoding/node-geocoder-adapter.ts new file mode 100644 index 0000000..ecee9b6 --- /dev/null +++ b/src/infra/providers/geocoding/node-geocoder-adapter.ts @@ -0,0 +1,58 @@ +import type { Entry, Geocoder } from 'node-geocoder'; +import type { GeocodeResponse, GeocodingProvider, GeoLocation } from './geocoding'; + +export class NodeGeocoderAdapter implements GeocodingProvider { + constructor(private geocoder: Geocoder) {} + + private mapEntriesToResponses(entries: Entry[]): GeocodeResponse[] { + const responses: GeocodeResponse[] = []; + for (const entry of entries) { + if (!entry.latitude || !entry.longitude) continue; + responses.push({ + location: { lat: entry.latitude, lon: entry.longitude }, + address: { + formattedAddress: entry.formattedAddress, + country: entry.country, + countryCode: entry.countryCode, + city: entry.administrativeLevels?.level2long, + state: entry.administrativeLevels?.level1long, + district: getNeighborhood(entry), + county: entry.county, + number: entry.streetNumber, + postCode: entry.zipcode, + street: entry.streetName, + }, + }); + } + return responses; + } + + async geocode(address: string): Promise { + try { + return await this.geocoder.geocode({ address, countryCode: 'BR', limit: 10 }).then(this.mapEntriesToResponses); + } catch { + return []; + } + } + + async reverseGeocode(location: GeoLocation): Promise { + try { + return await this.geocoder.reverse(location).then(this.mapEntriesToResponses); + } catch { + return []; + } + } +} + +function hasNeighborhood(extra: Record | undefined): extra is { neighborhood: string } { + return typeof extra === 'object' && extra !== null && 'neighborhood' in extra; +} + +function getNeighborhood(entry: Entry): string | undefined { + const { extra, administrativeLevels } = entry; + const city = administrativeLevels?.level2long; + if (hasNeighborhood(extra) && extra.neighborhood !== city) { + return extra.neighborhood; + } + return undefined; +} diff --git a/src/infra/providers/keycloak/index.ts b/src/infra/providers/keycloak/index.ts new file mode 100644 index 0000000..c11ba0f --- /dev/null +++ b/src/infra/providers/keycloak/index.ts @@ -0,0 +1,3 @@ +export type { KeyCloak } from './keycloak'; +export { KeycloakHttp, type KeycloakUser } from './keycloak-http'; +export { type Credentials, fetchTokenResponseSchema } from './schemas'; diff --git a/src/infra/providers/keycloak/keycloak-fake.ts b/src/infra/providers/keycloak/keycloak-fake.ts new file mode 100644 index 0000000..7aa599e --- /dev/null +++ b/src/infra/providers/keycloak/keycloak-fake.ts @@ -0,0 +1,28 @@ +import type { CollectionPoint } from '../../../domain/entities/collection-point'; +import type { CollectionPointsRepository } from '../../../domain/repositories/collection-points-repository'; +import type { KeyCloak } from './keycloak'; +import type { KeycloakUser } from './keycloak-http'; + +export class KeyCloakFake implements KeyCloak { + async createCollectionPoint( + _collectionPoint: CollectionPoint, + _accessToken: string, + _collectionPointsRepository: CollectionPointsRepository, + ): Promise { + return; + } + + async delete(_userId: string, _accessToken: string): Promise { + return; + } + + async me(_accessToken: string): Promise { + return { + id: '821e302b-41da-4e96-842f-d33087510e75', + username: 'MOTORISTA', + email: 'johndoe@gmail.com', + enabled: true, + attributes: {}, + }; + } +} diff --git a/src/infra/providers/keycloak/keycloak-http.ts b/src/infra/providers/keycloak/keycloak-http.ts new file mode 100644 index 0000000..85cc629 --- /dev/null +++ b/src/infra/providers/keycloak/keycloak-http.ts @@ -0,0 +1,232 @@ +import type { CollectionPoint } from '../../../domain/entities/collection-point'; +import type { CollectionPointsRepository } from '../../../domain/repositories/collection-points-repository'; +import { BusinessRuleViolationProblem } from '../../errors/business-rule-violation'; +import { BadRequestProblem, ForbiddenProblem } from '../../errors/generic-problem'; +import { ResourceNotFoundProblem } from '../../errors/resource-not-found'; +import type { KeyCloak } from './keycloak'; +import { type Credentials, fetchTokenResponseSchema } from './schemas'; +import env from 'env-var'; + +interface KeycloakLoginOptions { + domain: string; + client_id: string; + client_secret: string; + grant_type: string; + username: string; + password: string; +} + +export interface KeycloakUser { + id: string; + username: string; + email: string; + enabled: boolean; + attributes?: Record; +} + +interface KeycloakRole { + id: string; + name: string; + description: string; + composite: boolean; + clientRole: boolean; + containerId: string; +} + +const KEYCLOAK_CLIENT_ID = env.get('KEYCLOAK_CLIENT_ID').required().asString(); + +export class KeycloakHttp implements KeyCloak { + private constructor( + private readonly credentials: Credentials, + private readonly domain: string, + ) {} + + static async createAuthenticated(options: KeycloakLoginOptions): Promise { + const tokenEndpoint = new URL('/realms/petropolis/protocol/openid-connect/token', options.domain); + const credentials = `${options.client_id}:${options.client_secret}`; + const encodedCredentials = Buffer.from(credentials).toString('base64'); + + const response = await fetch(tokenEndpoint, { + method: 'POST', + headers: { + 'Content-Type': 'application/x-www-form-urlencoded', + Authorization: `Basic ${encodedCredentials}`, + }, + body: new URLSearchParams({ + grant_type: options.grant_type, + username: options.username, + password: options.password, + client_id: options.client_id, + client_secret: options.client_secret, + }).toString(), + }); + + const json = await response.json(); + return new KeycloakHttp(fetchTokenResponseSchema.parse(json), options.domain); + } + + async createCollectionPoint( + collectionPoint: CollectionPoint, + userAccessToken: string, + collectionPointsRepository: CollectionPointsRepository, + ): Promise { + let userId: string | null = null; + const headers = this.createHeaders(userAccessToken); + try { + const createUserResponse = await fetch(`${this.domain}/admin/realms/petropolis/users`, { + method: 'POST', + headers, + body: JSON.stringify(this.mapCollectionPointToKeycloakUser(collectionPoint.contact.email)), + }); + + if (!createUserResponse.ok) { + if (createUserResponse.status === 403) { + throw new ForbiddenProblem(); + } + const errorBody = await createUserResponse.json(); + console.error('Erro ao criar usuário:', errorBody); + throw BusinessRuleViolationProblem.error(errorBody.errorMessage, 'email'); + } + + const user = await this.findUserByEmail(collectionPoint.contact.email, headers); + if (!user) throw ResourceNotFoundProblem.error('Usuário não encontrado após criação.', 'email'); + userId = user.id; + await this.assignRoleToUser(user.id, 'collection-point', headers); + await collectionPointsRepository.save(collectionPoint); + } catch (error) { + if (userId) { + await this.deleteUser(userId, headers); + } + throw error; + } + } + + private mapCollectionPointToKeycloakUser(email: string): Record { + return { + username: email, + email: email, + enabled: true, + }; + } + + private async findUserByEmail(email: string, headers: Headers): Promise { + const response = await fetch( + `${this.domain}/admin/realms/petropolis/users?email=${encodeURIComponent(email)}&exact=true`, + { + method: 'GET', + headers, + }, + ); + + if (!response.ok) throw ResourceNotFoundProblem.error(`Erro ao buscar usuário: ${response.statusText}`, 'email'); + + const users: KeycloakUser[] = await response.json(); + return users.length > 0 && users[0] ? users[0] : null; + } + + private async assignRoleToUser(userId: string, roleName: string, headers: Headers): Promise { + const clientId = await this.getClientIdByName(headers, KEYCLOAK_CLIENT_ID); + const role = await this.getRoleByName(headers, clientId, roleName); + + if (!role) { + throw ResourceNotFoundProblem.error(`Role '${roleName}' não encontrada para o cliente.`, 'role'); + } + + const roleMappingUrl = `${this.domain}/admin/realms/petropolis/users/${userId}/role-mappings/clients/${clientId}`; + const response = await fetch(roleMappingUrl, { + method: 'POST', + headers, + body: JSON.stringify([role]), + }); + + if (!response.ok) { + new BadRequestProblem(); + } + } + + private async getClientIdByName(headers: Headers, clientName: string): Promise { + const clientsResponse = await fetch(`${this.domain}/admin/realms/petropolis/clients`, { + method: 'GET', + headers, + }); + if (!clientsResponse.ok) { + throw ResourceNotFoundProblem.error(`Erro ao buscar clientes: ${clientsResponse.statusText}`, 'clients'); + } + + const clients: { id: string; clientId: string }[] = await clientsResponse.json(); + const client = clients.find(c => c.clientId === clientName); + + if (!client) { + throw ResourceNotFoundProblem.error(`Cliente '${clientName}' não encontrado.`, 'client'); + } + + return client.id; + } + + private async getRoleByName(headers: Headers, clientId: string, roleName: string): Promise { + const rolesResponse = await fetch(`${this.domain}/admin/realms/petropolis/clients/${clientId}/roles`, { + method: 'GET', + headers, + }); + + if (!rolesResponse.ok) { + throw ResourceNotFoundProblem.error(`Erro ao buscar roles: ${rolesResponse.statusText}`, 'roles'); + } + + const roles: KeycloakRole[] = await rolesResponse.json(); + return roles.find(role => role.name === roleName) ?? null; + } + + private async deleteUser(userId: string, headers: Headers): Promise { + const response = await fetch(`${this.domain}/admin/realms/petropolis/users/${userId}`, { + method: 'DELETE', + headers, + }); + + if (!response.ok) { + console.error(`Falha ao excluir usuário com ID ${userId}:`, response.statusText); + throw new Error(`Falha ao excluir usuário com ID ${userId}`); + } + } + + async delete(userId: string, accessToken: string): Promise { + const headers = this.createHeaders(accessToken); + await this.deleteUser(userId, headers); + } + + async me(accessToken: string): Promise { + const headers = new Headers({ + Authorization: `Bearer ${accessToken}`, + 'Content-Type': 'application/json', + }); + + const userinfoEndpoint = `${this.domain}/realms/petropolis/protocol/openid-connect/userinfo`; + const response = await fetch(userinfoEndpoint, { + method: 'GET', + headers, + }); + + if (!response.ok) { + const errorBody = await response.json(); + console.error('Erro ao buscar informações do usuário:', errorBody); + throw new Error(`Erro ao buscar informações do usuário: ${response.statusText}`); + } + + const userinfo = await response.json(); + + return { + id: userinfo.sub, + username: userinfo.preferred_username ?? userinfo.name, + email: userinfo.email, + enabled: true, + attributes: userinfo.attributes ?? {}, + }; + } + + private createHeaders(accessToken: string): Headers { + return new Headers({ + Authorization: `Bearer ${accessToken ?? this.credentials.access_token}`, + 'Content-Type': 'application/json', + }); + } +} diff --git a/src/infra/providers/keycloak/keycloak.ts b/src/infra/providers/keycloak/keycloak.ts new file mode 100644 index 0000000..0441aaa --- /dev/null +++ b/src/infra/providers/keycloak/keycloak.ts @@ -0,0 +1,24 @@ +import type { CollectionPoint } from '../../../domain/entities/collection-point'; +import type { CollectionPointsRepository } from '../../../domain/repositories/collection-points-repository'; +import type { KeycloakUser } from './keycloak-http'; + +export interface KeyCloak { + /** + * Create a new user. + */ + createCollectionPoint( + collectionPoint: CollectionPoint, + accessToken: string, + collectionPointsRepository: CollectionPointsRepository, + ): Promise; + + /** + * Delete a user. + */ + delete(userId: string, accessToken: string): Promise; + + /** + * Get the current user. + */ + me(accessToken: string): Promise; +} diff --git a/src/infra/providers/keycloak/schemas.ts b/src/infra/providers/keycloak/schemas.ts new file mode 100644 index 0000000..879e157 --- /dev/null +++ b/src/infra/providers/keycloak/schemas.ts @@ -0,0 +1,8 @@ +import { z } from 'zod'; +export type Credentials = z.infer; +export const fetchTokenResponseSchema = z.object({ + access_token: z.string(), + expires_in: z.number(), + token_type: z.string(), + scope: z.string(), +}); diff --git a/src/infra/providers/open-api-file/open-api-file-storage-adaptar.ts b/src/infra/providers/open-api-file/open-api-file-storage-adaptar.ts new file mode 100644 index 0000000..a8b4821 --- /dev/null +++ b/src/infra/providers/open-api-file/open-api-file-storage-adaptar.ts @@ -0,0 +1,16 @@ +import type { AsyncFileStorage } from '../file-storage'; +import type { OpenAPIFile } from './open-api-file'; +import type { OpenAPIObject as OpenAPIObject30 } from 'openapi3-ts/oas30'; +import type { OpenAPIObject as OpenAPIObject31 } from 'openapi3-ts/oas31'; + +export class OpenAPIFileStorageAdapter implements OpenAPIFile { + constructor( + private fileName: string, + private storage: AsyncFileStorage, + ) {} + + async save(file: OpenAPIObject30 | OpenAPIObject31): Promise { + const serialized = JSON.stringify(file, undefined, 2); + await this.storage.saveAsync(this.fileName, serialized); + } +} diff --git a/src/infra/providers/open-api-file/open-api-file.ts b/src/infra/providers/open-api-file/open-api-file.ts new file mode 100644 index 0000000..49d544e --- /dev/null +++ b/src/infra/providers/open-api-file/open-api-file.ts @@ -0,0 +1,10 @@ +import type { OpenAPIObject as OpenAPIObject30 } from 'openapi3-ts/oas30'; +import type { OpenAPIObject as OpenAPIObject31 } from 'openapi3-ts/oas31'; + +export interface OpenAPIFile { + /** + * Saves the openAPI file, so that it will go in the build process + * @param file OpenAPI file generated using openapi3-ts + */ + save(file: OpenAPIObject31 | OpenAPIObject30): Promise; +} diff --git a/src/infra/providers/pagination/offset-pagination-prisma.ts b/src/infra/providers/pagination/offset-pagination-prisma.ts new file mode 100644 index 0000000..781bcd9 --- /dev/null +++ b/src/infra/providers/pagination/offset-pagination-prisma.ts @@ -0,0 +1,28 @@ +import { type Pagination, type CountableRepository, type FilterWithMaybeLimit, PaginationSchema } from './pagination'; + +export class OffsetPaginationPrisma implements Pagination { + readonly total: number; + readonly limit: number; + readonly pages: number; + + private constructor(total: number, limit: number, pages: number) { + this.total = total; + this.limit = limit; + this.pages = pages; + } + + static async from( + filter: Filter, + repository: CountableRepository, + countFunction: CountFunctionName = 'count' as CountFunctionName, + ): Promise { + const total = await repository[countFunction](filter); + const limit = filter.limit ?? 12; + const pages = Math.ceil(total / limit); + + const paginationData = { total, limit, pages }; + PaginationSchema.parse(paginationData); + + return new OffsetPaginationPrisma(total, limit, pages); + } +} diff --git a/src/infra/providers/pagination/pagination.ts b/src/infra/providers/pagination/pagination.ts new file mode 100644 index 0000000..5c43a41 --- /dev/null +++ b/src/infra/providers/pagination/pagination.ts @@ -0,0 +1,19 @@ +import { z } from 'zod'; + +export const PaginationSchema = z.object({ + total: z.number().int(), + limit: z.number().int(), + pages: z.number().int(), +}); + +export type Pagination = z.infer; + +export type CountableFunction = (filter: Filter) => Promise; + +export type CountableRepository = { + [K in CountFunctionName]: CountableFunction; +}; + +export interface FilterWithMaybeLimit { + limit?: number; +} diff --git a/src/infra/repositories/collection-points-mock-repository.ts b/src/infra/repositories/collection-points-mock-repository.ts new file mode 100644 index 0000000..f0968ab --- /dev/null +++ b/src/infra/repositories/collection-points-mock-repository.ts @@ -0,0 +1,131 @@ +import type { CollectionPointsRepository } from '../../domain/repositories/collection-points-repository'; +import { CollectionPointStatus } from '../../domain/value-objects/collection-point-status'; +import { CollectionPoint } from '../../domain/entities/collection-point'; +import type { CollectionPointFiltersType } from '../../domain/value-objects/filters'; + +export class CollectionPointsMockRepository implements CollectionPointsRepository { + #collectionPoints: CollectionPoint[] = [ + CollectionPoint.create({ + id: '361754a6-845b-419b-8f96-be1f01fa899e', + name: 'Edifício Residencial Lausanne', + status: CollectionPointStatus.enum.ACTIVE, + address: { + city: 'Sao Paulo', + district: 'Vila Mariana', + number: '123', + state: 'SP', + zipcode: '04026-000', + street: 'Rua Lorem Ipsum', + complement: 'Entrada Sul', + coordinate: { latitude: -2, longitude: 30 }, + }, + bestCollectionDay: ['FRIDAY'], + selectiveCollectionDay: ['FRIDAY'], + contact: { + name: 'Matias Castro', + role: 'ADMIN', + phone: '1234567890', + email: 'H9k5y@example.com', + }, + type: 'APARTMENT', + weeklyGlassVolume: 1000, + operatorId: '738515b5-6cc1-4db7-b6fd-b24a8929a0d8', + }), + CollectionPoint.create({ + id: '97f2ab4c-ef96-42a5-9da8-395f236c875e', + name: 'Edifício Itamarati', + status: CollectionPointStatus.enum.ACTIVE, + address: { + city: 'Sao Paulo', + district: 'Vila Mariana', + number: '123', + state: 'SP', + zipcode: '04026-000', + street: 'Rua Dolor Sit', + complement: 'Entrada Norte', + coordinate: { latitude: -1, longitude: 30 }, + }, + bestCollectionDay: ['FRIDAY'], + selectiveCollectionDay: ['FRIDAY'], + contact: { + name: 'Matias Castro', + role: 'ADMIN', + phone: '1234567890', + email: 'H9k5y@example.com', + }, + type: 'APARTMENT', + weeklyGlassVolume: 1000, + operatorId: '738515b5-6cc1-4db7-b6fd-b24a8929a0d8', + }), + ]; + async count(_filters: CollectionPointFiltersType): Promise { + return this.#collectionPoints.length; + } + async save(_collectionPoint: CollectionPoint): Promise { + return; + } + async getById(collectionPointId: string): Promise { + switch (collectionPointId) { + case '361754a6-845b-419b-8f96-be1f01fa899e': + return CollectionPoint.create({ + id: '361754a6-845b-419b-8f96-be1f01fa899e', + name: 'Edifício Residencial Lausanne', + status: CollectionPointStatus.enum.ACTIVE, + address: { + city: 'Sao Paulo', + district: 'Vila Mariana', + number: '123', + state: 'SP', + zipcode: '04026-000', + street: 'Rua Lorem Ipsum', + complement: 'Entrada Sul', + coordinate: { latitude: -2, longitude: 30 }, + }, + bestCollectionDay: ['FRIDAY'], + selectiveCollectionDay: ['FRIDAY'], + contact: { + name: 'Matias Castro', + role: 'ADMIN', + phone: '1234567890', + email: 'H9k5y@example.com', + }, + type: 'APARTMENT', + weeklyGlassVolume: 1000, + operatorId: '738515b5-6cc1-4db7-b6fd-b24a8929a0d8', + }); + case '97f2ab4c-ef96-42a5-9da8-395f236c875e': + return CollectionPoint.create({ + id: '97f2ab4c-ef96-42a5-9da8-395f236c875e', + name: 'Edifício Itamarati', + status: CollectionPointStatus.enum.ACTIVE, + address: { + city: 'Sao Paulo', + district: 'Vila Mariana', + number: '123', + state: 'SP', + zipcode: '04026-000', + street: 'Rua Dolor Sit', + complement: 'Entrada Norte', + coordinate: { latitude: -1, longitude: 30 }, + }, + bestCollectionDay: ['FRIDAY'], + selectiveCollectionDay: ['FRIDAY'], + contact: { + name: 'Matias Castro', + role: 'ADMIN', + phone: '1234567890', + email: 'H9k5y@example.com', + }, + type: 'APARTMENT', + weeklyGlassVolume: 1000, + operatorId: '738515b5-6cc1-4db7-b6fd-b24a8929a0d8', + }); + default: + return Promise.reject(null); + } + } + + async list(_filters: CollectionPointFiltersType): Promise { + return this.#collectionPoints; + } +} diff --git a/src/infra/repositories/collection-points-prisma-repository.ts b/src/infra/repositories/collection-points-prisma-repository.ts new file mode 100644 index 0000000..a18e000 --- /dev/null +++ b/src/infra/repositories/collection-points-prisma-repository.ts @@ -0,0 +1,115 @@ +import type { PrismaClient, CollectionPoints as PrismaCollectionPoint } from '@prisma/client'; +import type { CollectionPointsRepository } from '../../domain/repositories/collection-points-repository'; +import { CollectionPoint } from '../../domain/entities/collection-point'; +import { Address } from '../../domain/value-objects/address'; +import { CollectionPointStatus } from '../../domain/value-objects/collection-point-status'; +import { Contact } from '../../domain/value-objects/contact'; +import type { CollectionPointFiltersType } from '../../domain/value-objects/filters'; +import { CollectionPointType } from '../../domain/value-objects/collection-point-type'; +import { Responsible } from '../../domain/value-objects/responsible'; +import { Shift } from '../../domain/value-objects/shift'; +import { Weekday } from '../../domain/value-objects/week-day'; + +export const CollectionPointsPrismaMapper = { + /** + * Maps the domain entity into the prisma model + * @param entity A domain entity + * @returns A prisma create or update model + */ + fromEntity(entity: CollectionPoint): Omit { + return { + id: entity.id, + name: entity.name, + address: JSON.stringify(entity.address), + status: entity.status.serialize(), + bestCollectionDay: Weekday.toJSON(entity.bestCollectionDay), + contact: Contact.toJSON(entity.contact), + selectiveCollectionDay: Weekday.toJSON(entity.selectiveCollectionDay), + weeklyGlassVolume: entity.weeklyGlassVolume ?? null, + relevantInfos: entity.relevantInfos ?? null, + responsible: entity.responsible ? Responsible.toJSON(entity.responsible) : null, + shifts: Shift.toJSON(entity.shifts), + type: entity.type.serialize(), + operatorId: entity.operatorId, + }; + }, + /** + * Maps the domain entities into the prisma models + * @param entities A list of domain entities + * @returns A list of prisma create or update models + */ + fromManyEntities(entities: CollectionPoint[]): Omit[] { + return entities.map(entity => this.fromEntity(entity)); + }, + /** + * Maps the prisma model into the domain entity + * @param model A model returned from prisma. It must be fully hydrated + * with all sub models. + * @returns The corresponding entity + */ + toEntity(model: PrismaCollectionPoint): CollectionPoint { + const contact = Contact.fromJSON(model.contact).serialize(); + const shifts = Shift.fromJSON(model.shifts); + const bestCollectionDay = Weekday.fromJSON(model.bestCollectionDay); + const selectiveCollectionDay = Weekday.fromJSONWithUnknown(model.selectiveCollectionDay); + return CollectionPoint.create({ + id: model.id, + name: model.name, + address: Address.fromJSON(model.address), + status: CollectionPointStatus.schema.parse(model.status), + bestCollectionDay, + contact, + selectiveCollectionDay, + weeklyGlassVolume: model.weeklyGlassVolume ?? undefined, + relevantInfos: model.relevantInfos ?? undefined, + responsible: Responsible.fromJSON(model.responsible), + shifts, + type: CollectionPointType.schema.parse(model.type), + operatorId: model.operatorId, + }); + }, + /** + * Maps the prisma models into the domain entities + * @param models A list of models returned from prisma. It must be + * fully hydrated with all sub models. + * @returns The converted list of entities + */ + toManyEntities(models: PrismaCollectionPoint[]): CollectionPoint[] { + return models.map(model => this.toEntity(model)); + }, +}; + +export class CollectionPointsPrismaRepository implements CollectionPointsRepository { + constructor(private readonly prisma: PrismaClient) {} + async list(filters: CollectionPointFiltersType): Promise { + const { limit = 12, offset = 0 } = filters; + + const collectionPoints = await this.prisma.collectionPoints.findMany({ + where: {}, + skip: offset, + take: limit, + }); + + return CollectionPointsPrismaMapper.toManyEntities(collectionPoints); + } + async count(_filters: CollectionPointFiltersType): Promise { + return this.prisma.collectionPoints.count({ + where: {}, + }); + } + + async getById(id: string): Promise { + const collectionPoint = await this.prisma.collectionPoints.findUniqueOrThrow({ where: { id } }); + return CollectionPointsPrismaMapper.toEntity(collectionPoint); + } + + async save(collectionPoint: CollectionPoint): Promise { + const prismaCollectionPoint = CollectionPointsPrismaMapper.fromEntity(collectionPoint); + await this.prisma.collectionPoints.upsert({ + where: { id: prismaCollectionPoint.id }, + update: prismaCollectionPoint, + create: prismaCollectionPoint, + }); + return; + } +} diff --git a/src/infra/repositories/collections-mock-repositpory.ts b/src/infra/repositories/collections-mock-repositpory.ts new file mode 100644 index 0000000..ced83bf --- /dev/null +++ b/src/infra/repositories/collections-mock-repositpory.ts @@ -0,0 +1,51 @@ +import { DateTime } from 'luxon'; +import { Collection } from '../../domain/entities/collection'; +import type { CollectionsRepository } from '../../domain/repositories/collections.repository'; +import { CollectionPoint } from '../../domain/entities/collection-point'; + +export class CollectionsMockRepository implements CollectionsRepository { + findById(id: string): Promise { + const collectionPoint = CollectionPoint.create({ + id: '5dc09bc6-f041-4275-9c7b-9b1f68666f1f', + name: 'Edifício Itamarati', + operatorId: '738515b5-6cc1-4db7-b6fd-b24a8929a0d8', + status: 'ACTIVE', + type: 'APARTMENT', + address: { + city: 'Sao Paulo', + district: 'Vila Mariana', + number: '123', + state: 'SP', + zipcode: '04026-000', + street: 'Rua Dolor Sit', + complement: 'Entrada Norte', + coordinate: { + latitude: -1, + longitude: 30, + }, + }, + bestCollectionDay: ['FRIDAY'], + selectiveCollectionDay: ['FRIDAY'], + contact: { + name: 'Matias Castro', + role: 'ADMIN', + phone: '1234567890', + email: 'H9k5y@example.com', + }, + weeklyGlassVolume: 1000, + }); + return Promise.resolve( + Collection.create({ + id: id, + collectionPoint: collectionPoint.serialize(), + routeId: 'f7f16595-8537-486b-9027-ee419435980c', + status: 'PENDING', + volumeCollected: 0, + date: DateTime.now(), + startTime: undefined, + endTime: undefined, + notes: undefined, + }), + ); + } +} diff --git a/src/infra/repositories/collections-prisma-repository.ts b/src/infra/repositories/collections-prisma-repository.ts new file mode 100644 index 0000000..a2ab5c2 --- /dev/null +++ b/src/infra/repositories/collections-prisma-repository.ts @@ -0,0 +1,88 @@ +import { Collection } from '../../domain/entities/collection'; +import type { CollectionsRepository } from '../../domain/repositories/collections.repository'; +import type { PrismaClient, Collection as PrismaCollection, CollectionPoints } from '@prisma/client'; +import { DateTime } from 'luxon'; +import type { CollectionStatusEnum } from '../../domain/value-objects/collection-status'; +import { CollectionPointsPrismaMapper } from './collection-points-prisma-repository'; + +export type CollectionWithRelation = PrismaCollection & { collectionPoint: CollectionPoints }; + +export const CollectionsPrismaMapper = { + /** + * Maps the domain entity into the prisma model + * @param entity A domain entity + * @returns A prisma create or update model + */ + fromEntity(entity: Collection): Omit { + return { + id: entity.id, + collectionPointId: entity.collectionPoint.id, + routeId: entity.routeId, + status: entity.status.serialize(), + date: entity.date.toJSDate(), + startTime: entity.startTime?.toJSDate() ?? null, + endTime: entity.endTime?.toJSDate() ?? null, + volumeCollected: entity.volumeCollected, + notes: entity.notes ?? null, + }; + }, + + /** + * Maps the prisma model into the domain entity + * @param model A model returned from prisma. It must be fully hydrated. + * @returns The corresponding entity + */ + toEntity(model: CollectionWithRelation): Collection { + const collectionPoint = CollectionPointsPrismaMapper.toEntity(model.collectionPoint); + return Collection.create({ + id: model.id, + collectionPoint: { + ...collectionPoint, + status: collectionPoint.status.serialize(), + type: collectionPoint.type.serialize(), + contact: collectionPoint.contact.serialize(), + shifts: collectionPoint.shifts?.map(shift => shift.serialize()), + bestCollectionDay: collectionPoint.bestCollectionDay?.map(day => day.serialize()), + selectiveCollectionDay: collectionPoint.selectiveCollectionDay?.map(day => day.serialize()), + }, + routeId: model.routeId, + status: model.status as CollectionStatusEnum, + volumeCollected: model.volumeCollected, + date: DateTime.fromJSDate(model.date), + startTime: model.startTime ? DateTime.fromJSDate(model.startTime) : undefined, + endTime: model.endTime ? DateTime.fromJSDate(model.endTime) : undefined, + notes: model.notes ?? undefined, + }); + }, + + /** + * Maps the prisma models into the domain entities + * @param models A list of models returned from prisma. It must be fully hydrated. + * @returns The converted list of entities + */ + fromManyEntities(entities: Collection[]): Omit[] { + return entities.map(entity => this.fromEntity(entity)); + }, + + /** + * Maps the prisma models into the domain entities + * @param models A list of models returned from prisma. It must be fully hydrated. + * @returns The converted list of entities + */ + toManyEntities(models: CollectionWithRelation[]): Collection[] { + return models.map(model => this.toEntity(model)); + }, +}; +export class CollectionsPrismaRepository implements CollectionsRepository { + constructor(private readonly prisma: PrismaClient) {} + async findById(id: string): Promise { + const collection = await this.prisma.collection.findUnique({ + where: { id }, + include: { + collectionPoint: true, + }, + }); + if (!collection) return null; + return CollectionsPrismaMapper.toEntity(collection); + } +} diff --git a/src/infra/repositories/keycloak-mock-repository.ts b/src/infra/repositories/keycloak-mock-repository.ts new file mode 100644 index 0000000..9bbaebb --- /dev/null +++ b/src/infra/repositories/keycloak-mock-repository.ts @@ -0,0 +1,21 @@ +import type { CollectionPoint } from '../../domain/entities/collection-point'; +import type { KeycloakRepository } from '../../domain/repositories/keycloak-repository'; +import type { KeycloakUser } from '../providers/keycloak'; + +export class KeyCloakMockRepository implements KeycloakRepository { + async delete(_userId: string, _accessToken: string): Promise { + return; + } + async save(_collectionPoint: CollectionPoint, _accessToken: string): Promise { + return; + } + async me(_userAccessToken: string): Promise { + return { + id: 'mock-user-id', + username: 'mock-username', + email: 'mock.user@example.com', + enabled: true, + attributes: {}, + }; + } +} diff --git a/src/infra/repositories/keycloak-repository.ts b/src/infra/repositories/keycloak-repository.ts new file mode 100644 index 0000000..b01e9ac --- /dev/null +++ b/src/infra/repositories/keycloak-repository.ts @@ -0,0 +1,20 @@ +import type { CollectionPoint } from '../../domain/entities/collection-point'; +import type { CollectionPointsRepository } from '../../domain/repositories/collection-points-repository'; +import type { KeycloakRepository } from '../../domain/repositories/keycloak-repository'; +import type { KeyCloak, KeycloakUser } from '../providers/keycloak'; + +export class KeyCloakRepository implements KeycloakRepository { + constructor( + private readonly keycloak: KeyCloak, + private readonly collectionPointsRepository: CollectionPointsRepository, + ) {} + async save(collectionPoint: CollectionPoint, accessToken: string): Promise { + await this.keycloak.createCollectionPoint(collectionPoint, accessToken, this.collectionPointsRepository); + } + async me(userAccessToken: string): Promise { + return await this.keycloak.me(userAccessToken); + } + async delete(userId: string, accessToken: string): Promise { + await this.keycloak.delete(userId, accessToken); + } +} diff --git a/src/infra/repositories/operator-mock-repository.ts b/src/infra/repositories/operator-mock-repository.ts new file mode 100644 index 0000000..25bb827 --- /dev/null +++ b/src/infra/repositories/operator-mock-repository.ts @@ -0,0 +1,23 @@ +import { Operator } from '../../domain/entities/operator'; +import type { OperatorRepository } from '../../domain/repositories/operator-repository'; + +export class OperatorMockRepository implements OperatorRepository { + async getById(id: string): Promise { + return Operator.create({ + name: 'Operador 1', + cep: '12345-678', + cnpj: '12.345.678/0001-00', + contact: 'Contato 1', + phone: '(11) 11111-1111', + email: 'w5kYK@example.com', + documents: { + cnpjFile: 'https://example.com/cnpj.pdf', + municipalRegistrationFile: 'https://example.com/municipal-registration.pdf', + environmentalLicenseFile: 'https://example.com/environmental-license.pdf', + operationLicenseFile: 'https://example.com/operation-license.pdf', + }, + status: 'ACTIVE', + id, + }); + } +} diff --git a/src/infra/repositories/operator-prisma-repository.ts b/src/infra/repositories/operator-prisma-repository.ts new file mode 100644 index 0000000..ad6dae5 --- /dev/null +++ b/src/infra/repositories/operator-prisma-repository.ts @@ -0,0 +1,70 @@ +import type { PrismaClient, Operator as PrismaOperator } from '@prisma/client'; +import { Operator } from '../../domain/entities/operator'; +import type { OperatorRepository } from '../../domain/repositories/operator-repository'; + +export const OperatorPrismaMapper = { + /** + * Maps the domain entity into the prisma model + * @param entity A domain entity + * @returns A prisma create or update model + */ + fromEntity(entity: Operator): Omit { + return { + id: entity.id, + name: entity.name, + cep: entity.cep, + cnpj: entity.cnpj, + contact: entity.contact, + phone: entity.phone, + email: entity.email, + status: entity.status, // Enum: 'ACTIVE' | 'INACTIVE' + cnpjFile: entity.documents.cnpjFile ?? null, + municipalRegistrationFile: entity.documents.municipalRegistrationFile ?? null, + environmentalLicenseFile: entity.documents.environmentalLicenseFile ?? null, + operationLicenseFile: entity.documents.operationLicenseFile ?? null, + }; + }, + + /** + * Maps the prisma model into the domain entity + * @param model A model returned from prisma. It must be fully hydrated + * with all sub models. + * @returns The corresponding entity + */ + toEntity(model: PrismaOperator): Operator { + return Operator.create({ + id: model.id, + name: model.name, + cep: model.cep, + cnpj: model.cnpj, + contact: model.contact, + phone: model.phone, + email: model.email, + documents: { + cnpjFile: model.cnpjFile ?? undefined, + municipalRegistrationFile: model.municipalRegistrationFile ?? undefined, + environmentalLicenseFile: model.environmentalLicenseFile ?? undefined, + operationLicenseFile: model.operationLicenseFile ?? undefined, + }, + status: model.status as 'ACTIVE' | 'INACTIVE', + }); + }, + + /** + * Maps the prisma models into the domain entities + * @param models A list of models returned from prisma. It must be + * fully hydrated with all sub models. + * @returns The converted list of entities + */ + toManyEntities(models: PrismaOperator[]): Operator[] { + return models.map(model => this.toEntity(model)); + }, +}; +export class OperatorPrismaRepository implements OperatorRepository { + constructor(private readonly prisma: PrismaClient) {} + async getById(id: string): Promise { + const operator = await this.prisma.operator.findUnique({ where: { id } }); + if (!operator) return null; + return OperatorPrismaMapper.toEntity(operator); + } +} diff --git a/src/infra/repositories/routes-mock-repository.ts b/src/infra/repositories/routes-mock-repository.ts new file mode 100644 index 0000000..2fcaffc --- /dev/null +++ b/src/infra/repositories/routes-mock-repository.ts @@ -0,0 +1,178 @@ +import { DateTime } from 'luxon'; +import { Route } from '../../domain/entities/route'; +import type { RoutesRepository } from '../../domain/repositories/routes-repository'; +import { RouteStatus } from '../../domain/value-objects/route-status'; + +export class RoutesMockRepository implements RoutesRepository { + constructor(private hasRoutes?: boolean) {} + async getById(id: string): Promise { + if (id !== 'f7f16595-8537-486b-9027-ee419435980c') return null; + return Route.create({ + id: 'f7f16595-8537-486b-9027-ee419435980c', + name: 'Rota 1', + date: DateTime.fromISO('2024-12-16T12:00:00.000Z'), + collections: [ + { + id: 'a323eadb-1ffc-4227-b4c4-0b9ee48d38a2', + status: 'PENDING', + date: DateTime.now(), + volumeCollected: 0, + routeId: 'f7f16595-8537-486b-9027-ee419435980c', + collectionPoint: { + id: '97f2ab4c-ef96-42a5-9da8-395f236c875e', + name: 'Edifício Itamarati', + status: 'ACTIVE', + type: 'APARTMENT', + address: { + city: 'Sao Paulo', + district: 'Vila Mariana', + number: '123', + state: 'SP', + zipcode: '04026-000', + street: 'Rua Dolor Sit', + complement: 'Entrada Norte', + coordinate: { latitude: -8.059377, longitude: -34.886952 }, + }, + bestCollectionDay: ['FRIDAY'], + selectiveCollectionDay: ['FRIDAY'], + contact: { + name: 'Matias Castro', + role: 'ADMIN', + phone: '1234567890', + email: 'H9k5y@example.com', + }, + weeklyGlassVolume: 1000, + operatorId: '738515b5-6cc1-4db7-b6fd-b24a8929a0d8', + }, + }, + + { + id: '0f551194-1691-4e52-9094-d9e13a67cbf8', + status: 'PENDING', + date: DateTime.now(), + routeId: 'f7f16595-8537-486b-9027-ee419435980c', + volumeCollected: 0, + collectionPoint: { + id: '361754a6-845b-419b-8f96-be1f01fa899e', + name: 'Edifício Residencial Lausanne', + type: 'APARTMENT', + status: 'ACTIVE', + address: { + city: 'Sao Paulo', + district: 'Vila Mariana', + number: '123', + state: 'SP', + zipcode: '04026-000', + street: 'Rua Lorem Ipsum', + complement: 'Entrada Sul', + coordinate: { latitude: -8.038912, longitude: -34.870932 }, + }, + bestCollectionDay: ['FRIDAY'], + selectiveCollectionDay: ['FRIDAY'], + contact: { + name: 'Matias Castro', + role: 'ADMIN', + phone: '1234567890', + email: 'H9k5y@example.com', + }, + weeklyGlassVolume: 1000, + operatorId: '738515b5-6cc1-4db7-b6fd-b24a8929a0d8', + }, + }, + ], + totalDistanceKm: 40, + totalTimeMs: 1000 * 60 * 60 * 4, + status: RouteStatus.enum.PENDING, + }); + } + + list(): Promise { + return Promise.resolve([ + Route.create({ + id: 'f7f16595-8537-486b-9027-ee419435980c', + name: 'Rota 1', + date: DateTime.fromISO('2024-12-16T12:00:00.000Z'), + collections: [ + { + id: 'a323eadb-1ffc-4227-b4c4-0b9ee48d38a2', + status: 'PENDING', + date: DateTime.now(), + volumeCollected: 0, + routeId: 'f7f16595-8537-486b-9027-ee419435980c', + collectionPoint: { + id: '97f2ab4c-ef96-42a5-9da8-395f236c875e', + name: 'Edifício Itamarati', + status: 'ACTIVE', + address: { + city: 'Sao Paulo', + district: 'Vila Mariana', + number: '123', + state: 'SP', + zipcode: '04026-000', + street: 'Rua Dolor Sit', + complement: 'Entrada Norte', + coordinate: { latitude: -8.059377, longitude: -34.886952 }, + }, + type: 'APARTMENT', + bestCollectionDay: ['FRIDAY'], + selectiveCollectionDay: ['FRIDAY'], + contact: { + name: 'Matias Castro', + role: 'ADMIN', + phone: '1234567890', + email: 'H9k5y@example.com', + }, + weeklyGlassVolume: 1000, + operatorId: '738515b5-6cc1-4db7-b6fd-b24a8929a0d8', + }, + }, + + { + id: '0f551194-1691-4e52-9094-d9e13a67cbf8', + status: 'PENDING', + date: DateTime.now(), + routeId: 'f7f16595-8537-486b-9027-ee419435980c', + volumeCollected: 0, + collectionPoint: { + id: '361754a6-845b-419b-8f96-be1f01fa899e', + name: 'Edifício Residencial Lausanne', + status: 'ACTIVE', + address: { + city: 'Sao Paulo', + district: 'Vila Mariana', + number: '123', + state: 'SP', + zipcode: '04026-000', + street: 'Rua Lorem Ipsum', + complement: 'Entrada Sul', + coordinate: { latitude: -8.038912, longitude: -34.870932 }, + }, + type: 'APARTMENT', + bestCollectionDay: ['FRIDAY'], + selectiveCollectionDay: ['FRIDAY'], + contact: { + name: 'Matias Castro', + role: 'ADMIN', + phone: '1234567890', + email: 'H9k5y@example.com', + }, + weeklyGlassVolume: 1000, + operatorId: '738515b5-6cc1-4db7-b6fd-b24a8929a0d8', + }, + }, + ], + totalDistanceKm: 40, + totalTimeMs: 1000 * 60 * 60 * 4, + status: RouteStatus.enum.PENDING, + }), + ]); + } + + async save(_route: Route): Promise { + return; + } + + async hasRoutesInProgressByUser(_userId: string): Promise { + return this.hasRoutes ?? true; + } +} diff --git a/src/infra/repositories/routes-prisma-repository.ts b/src/infra/repositories/routes-prisma-repository.ts new file mode 100644 index 0000000..46c9628 --- /dev/null +++ b/src/infra/repositories/routes-prisma-repository.ts @@ -0,0 +1,133 @@ +import { Route } from '../../domain/entities/route'; +import { DateTime } from 'luxon'; +import type { RouteStatusEnum } from '../../domain/value-objects/route-status'; +import type { PrismaClient, Routes as PrismaRoutes } from '@prisma/client'; +import type { RoutesRepository } from '../../domain/repositories/routes-repository'; +import type { ReasonEnum } from '../../domain/value-objects/reason'; +import type { CommentType } from '../../domain/value-objects/comment'; +import { CollectionsPrismaMapper, type CollectionWithRelation } from './collections-prisma-repository'; + +type RouteWithRelations = PrismaRoutes & { + collections: CollectionWithRelation[]; +}; + +export const RoutesPrismaMapper = { + /** + * Maps the domain entity into the prisma model + * @param entity A domain entity + * @returns A prisma create or update model + */ + fromEntity(entity: Route): Omit { + return { + id: entity.id, + name: entity.name, + date: entity.date.toJSDate(), + status: entity.status.serialize(), + executorId: entity.executor?.id ?? null, + startedAt: entity.startedAt?.toJSDate() ?? null, + finishedAt: entity.finishedAt?.toJSDate() ?? null, + comment: entity.comment?.serialize() ?? null, + reasonFinished: entity.reason?.serialize() ?? null, + totalDistanceKm: entity.totalDistanceKm, + totalTimeMs: entity.totalTimeMs, + }; + }, + /** + * Maps the prisma model into the domain entity + * @param model A model returned from prisma. It must be fully hydrated + * with all sub models. + * @returns The corresponding entity + */ + toEntity(model: RouteWithRelations): Route { + const collections = CollectionsPrismaMapper.toManyEntities(model.collections); + + return Route.create({ + id: model.id, + name: model.name, + status: model.status as RouteStatusEnum, + date: DateTime.fromJSDate(model.date), + collections: collections.map(collection => ({ + ...collection, + status: collection.status.serialize(), + collectionPoint: collection.collectionPoint.serialize(), + })), + totalDistanceKm: model.totalDistanceKm, + totalTimeMs: model.totalTimeMs, + reason: model.reasonFinished as ReasonEnum, + comment: model.comment as CommentType, + }); + }, + /** + * Maps the prisma models into the domain entities + * @param models A list of models returned from prisma. It must be + * fully hydrated with all sub models. + * @returns The converted list of entities + */ + toManyEntities(models: RouteWithRelations[]): Route[] { + return models.map(model => this.toEntity(model)); + }, +}; + +export class RoutesPrismaRepository implements RoutesRepository { + constructor(private readonly prisma: PrismaClient) {} + + async list(): Promise { + const routes = await this.prisma.routes.findMany({ + include: { + collections: { + include: { + collectionPoint: true, + }, + }, + }, + }); + return RoutesPrismaMapper.toManyEntities(routes); + } + + async getById(id: string): Promise { + const route = await this.prisma.routes.findUnique({ + where: { id }, + include: { + collections: { + include: { + collectionPoint: true, + }, + }, + }, + }); + if (!route) return null; + return RoutesPrismaMapper.toEntity(route); + } + + async save(route: Route): Promise { + const prismaRouteData = RoutesPrismaMapper.fromEntity(route); + const collections = CollectionsPrismaMapper.fromManyEntities(route.collections); + + await this.prisma.$transaction([ + this.prisma.routes.upsert({ + where: { id: prismaRouteData.id }, + update: prismaRouteData, + create: prismaRouteData, + }), + ...collections.map(collection => + this.prisma.collection.upsert({ + where: { id: collection.id }, + update: collection, + create: collection, + }), + ), + ]); + return; + } + + async hasRoutesInProgressByUser(userId: string): Promise { + const hasRoutesInProgress = await this.prisma.routes.count({ + where: { + status: 'IN_PROGRESS', + executorId: userId, + }, + }); + + return hasRoutesInProgress > 0; + } +} diff --git a/src/infra/repositories/users-mock-repository.ts b/src/infra/repositories/users-mock-repository.ts new file mode 100644 index 0000000..cd34fba --- /dev/null +++ b/src/infra/repositories/users-mock-repository.ts @@ -0,0 +1,12 @@ +import { User } from '../../domain/entities/user'; +import type { UsersRepository } from '../../domain/repositories/users-repository'; + +export class UsersMockRepository implements UsersRepository { + async me(): Promise { + return User.create({ + id: '1f1309e9-498b-4892-9f8f-5c87d0dd83b9', + fullName: 'Motorista', + initials: 'MO', + }); + } +} diff --git a/src/infra/repositories/users-prisma-repository.ts b/src/infra/repositories/users-prisma-repository.ts new file mode 100644 index 0000000..b8a369b --- /dev/null +++ b/src/infra/repositories/users-prisma-repository.ts @@ -0,0 +1,49 @@ +import type { PrismaClient, Users as PrismaUser } from '@prisma/client'; +import type { UsersRepository } from '../../domain/repositories/users-repository'; +import { User } from '../../domain/entities/user'; + +export const UsersPrismaMapper = { + /** + * Maps the domain entity into the prisma model + * @param entity A domain entity + * @returns A prisma create or update model + */ + fromEntity(entity: User): Omit { + return { + id: entity.id, + fullName: entity.fullName, + initials: entity.initials, + }; + }, + /** + * Maps the prisma model into the domain entity + * @param model A model returned from prisma. It must be fully hydrated + * with all sub models. + * @returns The corresponding entity + */ + toEntity(model: PrismaUser): User { + return User.create({ + id: model.id, + fullName: model.fullName, + initials: model.initials, + }); + }, + /** + * Maps the prisma models into the domain entities + * @param models A list of models returned from prisma. It must be + * fully hydrated with all sub models. + * @returns The converted list of entities + */ + toManyEntities(models: PrismaUser[]): User[] { + return models.map(model => this.toEntity(model)); + }, +}; + +export class UsersPrismaRepository implements UsersRepository { + constructor(private readonly prisma: PrismaClient) {} + + async me(): Promise { + const me = await this.prisma.users.findFirstOrThrow(); + return UsersPrismaMapper.toEntity(me); + } +} diff --git a/src/infra/repositories/vehicles-mock-repository.ts b/src/infra/repositories/vehicles-mock-repository.ts new file mode 100644 index 0000000..6aff2a7 --- /dev/null +++ b/src/infra/repositories/vehicles-mock-repository.ts @@ -0,0 +1,13 @@ +import type { VehiclesRepository } from '../../domain/repositories/vehicles-repository'; +import { Vehicle } from '../../domain/entities/vehicle'; + +export class VehiclesMockRepository implements VehiclesRepository { + async list(): Promise { + return [ + Vehicle.create({ + id: 'ed3f0cc6-8836-4483-a2a3-b510f5fc6e8e', + name: 'TRIVIM 1', + }), + ]; + } +} diff --git a/src/infra/repositories/vehicles-prisma-repository.ts b/src/infra/repositories/vehicles-prisma-repository.ts new file mode 100644 index 0000000..0064240 --- /dev/null +++ b/src/infra/repositories/vehicles-prisma-repository.ts @@ -0,0 +1,47 @@ +import type { VehiclesRepository } from '../../domain/repositories/vehicles-repository'; +import { Vehicle } from '../../domain/entities/vehicle'; +import type { PrismaClient, Vehicles as PrismaVehicle } from '@prisma/client'; + +export const VehiclesPrismaMapper = { + /** + * Maps the domain entity into the prisma model + * @param entity A domain entity + * @returns A prisma create or update model + */ + fromEntity(entity: Vehicle): Omit { + return { + id: entity.id, + name: entity.name, + }; + }, + /** + * Maps the prisma model into the domain entity + * @param model A model returned from prisma. It must be fully hydrated + * with all sub models. + * @returns The corresponding entity + */ + toEntity(model: PrismaVehicle): Vehicle { + return Vehicle.create({ + id: model.id, + name: model.name, + }); + }, + /** + * Maps the prisma models into the domain entities + * @param models A list of models returned from prisma. It must be + * fully hydrated with all sub models. + * @returns The converted list of entities + */ + toManyEntities(models: PrismaVehicle[]): Vehicle[] { + return models.map(model => this.toEntity(model)); + }, +}; + +export class VehiclesPrismaRepository implements VehiclesRepository { + constructor(private readonly prisma: PrismaClient) {} + + async list(): Promise { + const vehicles = await this.prisma.vehicles.findMany(); + return VehiclesPrismaMapper.toManyEntities(vehicles); + } +} diff --git a/src/main.ts b/src/main.ts new file mode 100644 index 0000000..68a535c --- /dev/null +++ b/src/main.ts @@ -0,0 +1,7 @@ +import env from 'env-var'; +import app from './app'; + +const TCP_PORT = env.get('TCP_PORT').required().asPortNumber(); +app.listen(TCP_PORT, () => { + console.log(`APP running at http://localhost:${TCP_PORT}`); +}); diff --git a/src/presentation/http-rest/controllers/collection-finish-controller.ts b/src/presentation/http-rest/controllers/collection-finish-controller.ts new file mode 100644 index 0000000..032f06f --- /dev/null +++ b/src/presentation/http-rest/controllers/collection-finish-controller.ts @@ -0,0 +1,33 @@ +import type { RouteConfig } from '@asteasolutions/zod-to-openapi'; +import type { Request, Response } from 'express'; +import { GENERIC_OPENAPI_RESPONSES, makeOpenAPIResponse } from '../openapi/responses'; +import { z } from 'zod'; +import { SECTION_TAGS } from '../openapi/section-tags'; +import { RouteService } from '../../../application/route'; +import { Collection } from '../../../domain/entities/collection'; + +const params = z.object({ + collectionId: Collection.schema.shape.id, + routeId: Collection.schema.shape.routeId, +}); +export const collectionFinishRouteConfig: RouteConfig = { + method: 'post', + tags: [SECTION_TAGS.ROUTES], + path: '/routes/{routeId}/collections/{collectionId}/finish', + summary: 'Finaliza uma coleta pelo usuário atualmente logado', + description: 'Retorna uma coleta depois de finalizada', + request: { params }, + responses: { + ...makeOpenAPIResponse(200, 'A coleta finalizada', Collection.schema), + ...GENERIC_OPENAPI_RESPONSES, + }, +}; + +export async function collectionFinishController(request: Request, response: Response) { + if (!request.context.repositories) throw new Error('Nenhum repositório'); + const { routesRepository, usersRepository } = request.context.repositories; + const { collectionId, routeId } = params.parse(request.params); + const service = new RouteService(routesRepository, usersRepository); + const result = await service.finishCollection(collectionId, routeId); + response.status(200).json(result); +} diff --git a/src/presentation/http-rest/controllers/collection-get-controller.ts b/src/presentation/http-rest/controllers/collection-get-controller.ts new file mode 100644 index 0000000..5169956 --- /dev/null +++ b/src/presentation/http-rest/controllers/collection-get-controller.ts @@ -0,0 +1,30 @@ +import type { RouteConfig } from '@asteasolutions/zod-to-openapi'; +import type { Request, Response } from 'express'; +import { GENERIC_OPENAPI_RESPONSES, makeOpenAPIResponse } from '../openapi/responses'; +import { z } from 'zod'; +import { SECTION_TAGS } from '../openapi/section-tags'; +import { CollectionService } from '../../../application/collection'; +import { Collection } from '../../../domain/entities/collection'; + +const params = z.object({ collectionId: Collection.schema.shape.id }); +export const collectionGetByIdRouteConfig: RouteConfig = { + method: 'get', + tags: [SECTION_TAGS.COLLECTIONS], + path: '/collections/{collectionId}', + summary: 'Obter coleta por id', + description: 'Retorna a coleta com o id especificado', + request: { params }, + responses: { + ...makeOpenAPIResponse(200, 'Coleta retornada com sucesso', Collection.schema), + ...GENERIC_OPENAPI_RESPONSES, + }, +}; + +export async function collectionGetByIdController(request: Request, response: Response) { + if (!request.context.repositories) throw new Error('Nenhum repositório'); + const { collectionRepository } = request.context.repositories; + const { collectionId } = params.parse(request.params); + const service = new CollectionService(collectionRepository); + const result = await service.getById(collectionId); + response.status(200).json(result); +} diff --git a/src/presentation/http-rest/controllers/collection-point-get-controller.ts b/src/presentation/http-rest/controllers/collection-point-get-controller.ts new file mode 100644 index 0000000..a1c4b0a --- /dev/null +++ b/src/presentation/http-rest/controllers/collection-point-get-controller.ts @@ -0,0 +1,37 @@ +import type { RouteConfig } from '@asteasolutions/zod-to-openapi'; +import type { Request, Response } from 'express'; +import { GENERIC_OPENAPI_RESPONSES, makeOpenAPIResponse } from '../openapi/responses'; +import { CollectionPoint } from '../../../domain/entities/collection-point'; +import { CollectionPointService } from '../../../application/collection-point'; +import { z } from 'zod'; +import { SECTION_TAGS } from '../openapi/section-tags'; + +const params = z.object({ collectionPointId: CollectionPoint.schema.shape.id }); +export const collectionPointGetByIdRouteConfig: RouteConfig = { + method: 'get', + tags: [SECTION_TAGS.COLLECTION_POINTS], + path: '/collection-points/{collectionPointId}', + summary: 'Obter ponto de coleta por id', + description: 'Retorna o ponto de coleta com o id especificado', + request: { params }, + responses: { + ...makeOpenAPIResponse(200, 'Um ponto de coleta no contexto de uma rota', CollectionPoint.schema), + ...GENERIC_OPENAPI_RESPONSES, + }, +}; + +export async function collectionPointGetByIdController(request: Request, response: Response) { + if (!request.context.repositories) throw new Error('Nenhum repositório'); + const { collectionPointsRepository, routesRepository, keyCloakRepository, operatorRepository } = + request.context.repositories; + const { collectionPointId } = params.parse(request.params); + + const service = new CollectionPointService( + collectionPointsRepository, + routesRepository, + keyCloakRepository, + operatorRepository, + ); + const result = await service.getById(collectionPointId); + response.status(200).json(result); +} diff --git a/src/presentation/http-rest/controllers/collection-point-list-by-route-controller.ts b/src/presentation/http-rest/controllers/collection-point-list-by-route-controller.ts new file mode 100644 index 0000000..e9f95cb --- /dev/null +++ b/src/presentation/http-rest/controllers/collection-point-list-by-route-controller.ts @@ -0,0 +1,38 @@ +import type { RouteConfig } from '@asteasolutions/zod-to-openapi'; +import type { Request, Response } from 'express'; +import { GENERIC_OPENAPI_RESPONSES, makeOpenAPIResponse } from '../openapi/responses'; +import { CollectionPoint } from '../../../domain/entities/collection-point'; +import { CollectionPointService } from '../../../application/collection-point'; +import { z } from 'zod'; +import { Route } from '../../../domain/entities/route'; +import { SECTION_TAGS } from '../openapi/section-tags'; + +const params = z.object({ routeId: Route.schema.shape.id }); +export const collectionPointListByRouteRouteConfig: RouteConfig = { + method: 'get', + tags: [SECTION_TAGS.ROUTES], + path: '/routes/{routeId}/collection-points', + summary: 'Listar pontos de coleta de uma rota', + description: 'Retorna a lista de pontos de coleta de uma rota', + request: { params }, + responses: { + ...makeOpenAPIResponse(200, 'A lista de pontos de coleta da rota', CollectionPoint.schema.array()), + ...GENERIC_OPENAPI_RESPONSES, + }, +}; + +export async function collectionPointListByRouteController(request: Request, response: Response) { + if (!request.context.repositories) throw new Error('Nenhum repositório'); + const { collectionPointsRepository, routesRepository, keyCloakRepository, operatorRepository } = + request.context.repositories; + const { routeId } = params.parse(request.params); + + const service = new CollectionPointService( + collectionPointsRepository, + routesRepository, + keyCloakRepository, + operatorRepository, + ); + const result = await service.listByRouteId(routeId); + response.status(200).json(result); +} diff --git a/src/presentation/http-rest/controllers/collection-point-list-controller.ts b/src/presentation/http-rest/controllers/collection-point-list-controller.ts new file mode 100644 index 0000000..7fb4e6b --- /dev/null +++ b/src/presentation/http-rest/controllers/collection-point-list-controller.ts @@ -0,0 +1,36 @@ +import type { RouteConfig } from '@asteasolutions/zod-to-openapi'; +import type { Request, Response } from 'express'; +import { GENERIC_OPENAPI_RESPONSES, makeOpenAPIResponse } from '../openapi/responses'; +import { CollectionPoint } from '../../../domain/entities/collection-point'; +import { CollectionPointService } from '../../../application/collection-point'; +import { SECTION_TAGS } from '../openapi/section-tags'; +import { CollectionPointFiltersSchema } from '../../../domain/value-objects/filters'; + +export const collectionPointListRouteConfig: RouteConfig = { + method: 'get', + tags: [SECTION_TAGS.COLLECTION_POINTS], + path: '/collection-points', + summary: 'Listar pontos de coleta', + description: 'Retorna a lista de pontos de coleta', + request: { query: CollectionPointFiltersSchema }, + responses: { + ...makeOpenAPIResponse(200, 'A lista de pontos de coleta', CollectionPoint.paginatedSchema), + ...GENERIC_OPENAPI_RESPONSES, + }, +}; + +export async function collectionPointListController(request: Request, response: Response) { + if (!request.context.repositories) throw new Error('Nenhum repositório'); + const { collectionPointsRepository, routesRepository, keyCloakRepository, operatorRepository } = + request.context.repositories; + const filters = CollectionPointFiltersSchema.parse(request.query); + + const service = new CollectionPointService( + collectionPointsRepository, + routesRepository, + keyCloakRepository, + operatorRepository, + ); + const result = await service.list(filters); + response.status(200).json(result); +} diff --git a/src/presentation/http-rest/controllers/collection-point-save-controller.ts b/src/presentation/http-rest/controllers/collection-point-save-controller.ts new file mode 100644 index 0000000..a5c2358 --- /dev/null +++ b/src/presentation/http-rest/controllers/collection-point-save-controller.ts @@ -0,0 +1,46 @@ +import type { RouteConfig } from '@asteasolutions/zod-to-openapi'; +import type { Request, Response } from 'express'; +import { GENERIC_OPENAPI_RESPONSES, makeOpenAPIResponse } from '../openapi/responses'; +import { CollectionPoint } from '../../../domain/entities/collection-point'; +import { SECTION_TAGS } from '../openapi/section-tags'; +import { CollectionPointService } from '../../../application/collection-point'; + +const body = CollectionPoint.schema.omit({ id: true }); + +export const collectionPointSaveRouteConfig: RouteConfig = { + method: 'post', + tags: [SECTION_TAGS.COLLECTION_POINTS], + path: '/collection-points/', + summary: 'Cria um ponto de coleta', + description: 'Retorna o ponto de coleta criado', + request: { + body: { + content: { + 'application/json': { + schema: body, + }, + }, + }, + }, + responses: { + ...makeOpenAPIResponse(200, 'O ponto de coleta criado', CollectionPoint.schema), + ...GENERIC_OPENAPI_RESPONSES, + }, +}; + +export async function collectionPointCreateController(request: Request, response: Response) { + if (!request.context.repositories) throw new Error('Nenhum repositório'); + const { collectionPointsRepository, routesRepository, keyCloakRepository, operatorRepository } = + request.context.repositories; + const collectionPoint = body.parse(request.body); + const accessToken = request.context.accessToken; + if (!accessToken) throw new Error('Nenhum token'); + const service = new CollectionPointService( + collectionPointsRepository, + routesRepository, + keyCloakRepository, + operatorRepository, + ); + const result = await service.save(collectionPoint, accessToken); + response.status(200).json(result); +} diff --git a/src/presentation/http-rest/controllers/collection-start-controller.ts b/src/presentation/http-rest/controllers/collection-start-controller.ts new file mode 100644 index 0000000..a44658f --- /dev/null +++ b/src/presentation/http-rest/controllers/collection-start-controller.ts @@ -0,0 +1,35 @@ +import type { RouteConfig } from '@asteasolutions/zod-to-openapi'; +import type { Request, Response } from 'express'; +import { GENERIC_OPENAPI_RESPONSES, makeAPIResponseFromProblem, makeOpenAPIResponse } from '../openapi/responses'; +import { z } from 'zod'; +import { SECTION_TAGS } from '../openapi/section-tags'; +import { BusinessRuleViolationProblem } from '../../../infra/errors/business-rule-violation'; +import { RouteService } from '../../../application/route'; +import { Collection } from '../../../domain/entities/collection'; + +const params = z.object({ + collectionId: Collection.schema.shape.id, + routeId: Collection.schema.shape.routeId, +}); +export const collectionStartRouteConfig: RouteConfig = { + method: 'post', + tags: [SECTION_TAGS.ROUTES], + path: '/routes/{routeId}/collections/{collectionId}/start', + summary: 'Inicia coleta pelo usuário atualmente logado', + description: 'Retorna a coleta depois de iniciada', + request: { params }, + responses: { + ...makeOpenAPIResponse(200, 'A coleta que foi iniciada', Collection.schema), + ...makeAPIResponseFromProblem(new BusinessRuleViolationProblem([])), + ...GENERIC_OPENAPI_RESPONSES, + }, +}; + +export async function collectionStartController(request: Request, response: Response) { + if (!request.context.repositories) throw new Error('Nenhum repositório'); + const { routesRepository, usersRepository } = request.context.repositories; + const { collectionId, routeId } = params.parse(request.params); + const service = new RouteService(routesRepository, usersRepository); + const result = await service.startCollection(collectionId, routeId); + response.status(200).json(result); +} diff --git a/src/presentation/http-rest/controllers/root-controller.ts b/src/presentation/http-rest/controllers/root-controller.ts new file mode 100644 index 0000000..929317c --- /dev/null +++ b/src/presentation/http-rest/controllers/root-controller.ts @@ -0,0 +1,27 @@ +import type { RouteConfig } from '@asteasolutions/zod-to-openapi'; +import type { Request, Response } from 'express'; +import { GENERIC_OPENAPI_RESPONSES, makeAPIResponseFromProblem } from '../openapi/responses'; +import { BusinessRuleError, BusinessRuleViolationProblem } from '../../../infra/errors/business-rule-violation'; +import { z } from 'zod'; +import { SECTION_TAGS } from '../openapi/section-tags'; + +export const rootRouteConfig: RouteConfig = { + method: 'get', + tags: [SECTION_TAGS.WELCOME], + path: '/', + summary: 'Boas Vindas', + description: 'Mensagem de boas vindas da raiz da API', + responses: { + '200': { description: 'Uma resposta de boas vindas', content: { 'text/html': { schema: z.string() } } }, + ...GENERIC_OPENAPI_RESPONSES, + ...makeAPIResponseFromProblem( + new BusinessRuleViolationProblem([ + new BusinessRuleError('Não é possível finalizar uma rota com pontos em aberto', '#/route_id'), + ]), + ), + }, +}; + +export function rootController(_request: Request, response: Response) { + response.status(200).send('Bem vindos à API Petrópolis'); +} diff --git a/src/presentation/http-rest/controllers/route-finish-controller.ts b/src/presentation/http-rest/controllers/route-finish-controller.ts new file mode 100644 index 0000000..cf3e716 --- /dev/null +++ b/src/presentation/http-rest/controllers/route-finish-controller.ts @@ -0,0 +1,51 @@ +import type { RouteConfig } from '@asteasolutions/zod-to-openapi'; +import type { Request, Response } from 'express'; +import { GENERIC_OPENAPI_RESPONSES, makeOpenAPIResponse } from '../openapi/responses'; +import { Route } from '../../../domain/entities/route'; +import { RouteService } from '../../../application/route'; +import { z } from 'zod'; +import { NotFoundProblem } from '../../../infra/errors/generic-problem'; +import { SECTION_TAGS } from '../openapi/section-tags'; +import { Comment } from '../../../domain/value-objects/comment'; +import { Reason } from '../../../domain/value-objects/reason'; + +const params = z.object({ routeId: Route.schema.shape.id }); +const body = z.object({ + reason: Reason.schema, + comment: Comment.schema, +}); + +export const routeFinishRouteConfig: RouteConfig = { + method: 'post', + tags: [SECTION_TAGS.ROUTES], + path: '/routes/{routeId}/finish', + summary: 'Finaliza uma rota pelo usuário atualmente logado', + description: 'Retorna a rota depois de finalizada', + request: { + params, + body: { + content: { + 'application/json': { + schema: body, + }, + }, + }, + }, + responses: { + ...makeOpenAPIResponse(200, 'A rota que foi finalizada', Route.schema), + ...GENERIC_OPENAPI_RESPONSES, + }, +}; + +export async function routeFinishtController(request: Request, response: Response) { + if (!request.context.repositories) throw new Error('Nenhum repositório'); + const { routesRepository, usersRepository } = request.context.repositories; + const { routeId } = params.parse(request.params); + const service = new RouteService(routesRepository, usersRepository); + const { reason, comment } = body.parse(request.body); + + const result = await service.finish(routeId, reason, comment); + + if (result === null) throw new NotFoundProblem(); + response.status(200).json(result); +} diff --git a/src/presentation/http-rest/controllers/route-get-controller.ts b/src/presentation/http-rest/controllers/route-get-controller.ts new file mode 100644 index 0000000..55e7679 --- /dev/null +++ b/src/presentation/http-rest/controllers/route-get-controller.ts @@ -0,0 +1,33 @@ +import type { RouteConfig } from '@asteasolutions/zod-to-openapi'; +import type { Request, Response } from 'express'; +import { GENERIC_OPENAPI_RESPONSES, makeOpenAPIResponse } from '../openapi/responses'; +import { Route } from '../../../domain/entities/route'; +import { RouteService } from '../../../application/route'; +import { z } from 'zod'; +import { NotFoundProblem } from '../../../infra/errors/generic-problem'; +import { SECTION_TAGS } from '../openapi/section-tags'; + +const params = z.object({ routeId: Route.schema.shape.id }); +export const routeGetByIdRouteConfig: RouteConfig = { + method: 'get', + tags: [SECTION_TAGS.ROUTES], + path: '/routes/{routeId}', + summary: 'Obter rota pelo seu id', + description: 'Retorna a rota com o id especificado', + request: { params }, + responses: { + ...makeOpenAPIResponse(200, 'Uma rota de coleta de vidro', Route.schema), + ...GENERIC_OPENAPI_RESPONSES, + }, +}; + +export async function routeGetByIdController(request: Request, response: Response) { + if (!request.context.repositories) throw new Error('Nenhum repositório'); + const { routesRepository, usersRepository } = request.context.repositories; + const { routeId } = params.parse(request.params); + + const service = new RouteService(routesRepository, usersRepository); + const result = await service.getById(routeId); + if (result === null) throw new NotFoundProblem(); + response.status(200).json(result); +} diff --git a/src/presentation/http-rest/controllers/route-list-controller.ts b/src/presentation/http-rest/controllers/route-list-controller.ts new file mode 100644 index 0000000..65be50a --- /dev/null +++ b/src/presentation/http-rest/controllers/route-list-controller.ts @@ -0,0 +1,26 @@ +import type { RouteConfig } from '@asteasolutions/zod-to-openapi'; +import type { Request, Response } from 'express'; +import { GENERIC_OPENAPI_RESPONSES, makeOpenAPIResponse } from '../openapi/responses'; +import { Route } from '../../../domain/entities/route'; +import { RouteService } from '../../../application/route'; +import { SECTION_TAGS } from '../openapi/section-tags'; + +export const routeListRouteConfig: RouteConfig = { + method: 'get', + tags: [SECTION_TAGS.ROUTES], + path: '/routes', + summary: 'Listar rotas pendentes', + description: 'Retorna uma lista de rotas para o motorista do TRIVIM', + responses: { + ...makeOpenAPIResponse(200, 'Uma lista de rotas', Route.schema.array()), + ...GENERIC_OPENAPI_RESPONSES, + }, +}; + +export async function routeListController(request: Request, response: Response) { + if (!request.context.repositories) throw new Error('Nenhum repositório'); + const { routesRepository, usersRepository } = request.context.repositories; + const service = new RouteService(routesRepository, usersRepository); + const result = await service.list(); + response.status(200).json(result); +} diff --git a/src/presentation/http-rest/controllers/route-start-controller.ts b/src/presentation/http-rest/controllers/route-start-controller.ts new file mode 100644 index 0000000..87f1b67 --- /dev/null +++ b/src/presentation/http-rest/controllers/route-start-controller.ts @@ -0,0 +1,32 @@ +import type { RouteConfig } from '@asteasolutions/zod-to-openapi'; +import type { Request, Response } from 'express'; +import { GENERIC_OPENAPI_RESPONSES, makeAPIResponseFromProblem, makeOpenAPIResponse } from '../openapi/responses'; +import { Route } from '../../../domain/entities/route'; +import { RouteService } from '../../../application/route'; +import { z } from 'zod'; +import { SECTION_TAGS } from '../openapi/section-tags'; +import { BusinessRuleViolationProblem } from '../../../infra/errors/business-rule-violation'; + +const params = z.object({ routeId: Route.schema.shape.id }); +export const routeStartRouteConfig: RouteConfig = { + method: 'post', + tags: [SECTION_TAGS.ROUTES], + path: '/routes/{routeId}/start', + summary: 'Inicia uma rota pelo usuário atualmente logado', + description: 'Retorna a rota depois de iniciada', + request: { params }, + responses: { + ...makeOpenAPIResponse(200, 'A rota que foi iniciada', Route.schema), + ...makeAPIResponseFromProblem(new BusinessRuleViolationProblem([])), + ...GENERIC_OPENAPI_RESPONSES, + }, +}; + +export async function routeStartController(request: Request, response: Response) { + if (!request.context.repositories) throw new Error('Nenhum repositório'); + const { routesRepository, usersRepository } = request.context.repositories; + const { routeId } = params.parse(request.params); + const service = new RouteService(routesRepository, usersRepository); + const result = await service.start(routeId); + response.status(200).json(result); +} diff --git a/src/presentation/http-rest/controllers/user-me-controller.ts b/src/presentation/http-rest/controllers/user-me-controller.ts new file mode 100644 index 0000000..c81b1f1 --- /dev/null +++ b/src/presentation/http-rest/controllers/user-me-controller.ts @@ -0,0 +1,26 @@ +import type { RouteConfig } from '@asteasolutions/zod-to-openapi'; +import type { Request, Response } from 'express'; +import { GENERIC_OPENAPI_RESPONSES, makeOpenAPIResponse } from '../openapi/responses'; +import { User } from '../../../domain/entities/user'; +import { UserService } from '../../../application/user'; +import { SECTION_TAGS } from '../openapi/section-tags'; + +export const userMeRouteConfig: RouteConfig = { + method: 'get', + tags: [SECTION_TAGS.AUTH], + path: '/me', + summary: 'Informações do usuário', + description: 'Retorna informações do usuário atualmente logado', + responses: { + ...makeOpenAPIResponse(200, 'Uma lista de rotas pendentes', User.schema), + ...GENERIC_OPENAPI_RESPONSES, + }, +}; + +export async function userMeController(request: Request, response: Response) { + if (!request.context.repositories) throw new Error('Nenhum repositório'); + const { usersRepository } = request.context.repositories; + const service = new UserService(usersRepository); + const result = await service.me(); + response.status(200).json(result); +} diff --git a/src/presentation/http-rest/controllers/vehicle-list-controller.ts b/src/presentation/http-rest/controllers/vehicle-list-controller.ts new file mode 100644 index 0000000..f268e10 --- /dev/null +++ b/src/presentation/http-rest/controllers/vehicle-list-controller.ts @@ -0,0 +1,26 @@ +import type { RouteConfig } from '@asteasolutions/zod-to-openapi'; +import type { Request, Response } from 'express'; +import { GENERIC_OPENAPI_RESPONSES, makeOpenAPIResponse } from '../openapi/responses'; +import { Vehicle } from '../../../domain/entities/vehicle'; +import { VehicleService } from '../../../application/vehicle'; +import { SECTION_TAGS } from '../openapi/section-tags'; + +export const vehicleListRouteConfig: RouteConfig = { + method: 'get', + tags: [SECTION_TAGS.VEHICLES], + path: '/vehicles', + summary: 'Listar veículos disponíveis', + description: 'Retorna uma lista de veículos disponíveis para o motorista do TRIVIM', + responses: { + ...makeOpenAPIResponse(200, 'Uma lista de veículos disponíveis', Vehicle.schema.array()), + ...GENERIC_OPENAPI_RESPONSES, + }, +}; + +export async function vehicleListController(request: Request, response: Response) { + if (!request.context.repositories) throw new Error('Nenhum repositório'); + const { vehiclesRepository } = request.context.repositories; + const service = new VehicleService(vehiclesRepository); + const result = await service.list(); + response.status(200).json(result); +} diff --git a/src/presentation/http-rest/handlers/error.ts b/src/presentation/http-rest/handlers/error.ts new file mode 100644 index 0000000..2318ceb --- /dev/null +++ b/src/presentation/http-rest/handlers/error.ts @@ -0,0 +1,48 @@ +import type { NextFunction, Request, Response } from 'express'; +import { ZodError } from 'zod'; +import type { ProblemDetails } from '../../../infra/errors/problem-details'; +import { ValidationError, ValidationErrorProblem } from '../../../infra/errors/validation-error'; +import { Problem, ServerErrorProblem } from '../../../infra/errors/generic-problem'; +import { PrismaClientKnownRequestError } from '@prisma/client/runtime/library'; +import { ResourceNotFoundProblem } from '../../../infra/errors/resource-not-found'; +import { extractModelFromMessageP2025 } from '../../../infra/database/prisma-error-extract'; + +function errorToJSON(error: unknown): Record { + return error instanceof Error ? { message: error.message, stack: error.stack } : { message: String(error) }; +} + +function handleZodErrors(error: ZodError): ProblemDetails { + return new ValidationErrorProblem( + error.issues.map(issue => { + const pointer = `#/${issue.path.join('/')}`; + return new ValidationError(issue.message, pointer); + }), + ); +} + +function handlePrismaErrors(error: PrismaClientKnownRequestError): ProblemDetails { + if (error.code === 'P2025') { + const model = extractModelFromMessageP2025(error.message); + return ResourceNotFoundProblem.error(`The ${model} was not found`, `${model}Id`); + } + + return new ServerErrorProblem(); +} + +export function errorHandler(error: unknown, request: Request, response: Response, _next: NextFunction) { + const logger = request.context.logger; + let problem: ProblemDetails; + + if (error instanceof ZodError) problem = handleZodErrors(error); + else if (error instanceof PrismaClientKnownRequestError) problem = handlePrismaErrors(error); + else if (error instanceof Problem) problem = error; + else problem = new ServerErrorProblem(); + + logger.error(problem.detail, { + error: errorToJSON(error), + path: request.path, + params: request.params, + body: request.body, + }); + response.status(problem.status).json(problem); +} diff --git a/src/presentation/http-rest/handlers/not-found.ts b/src/presentation/http-rest/handlers/not-found.ts new file mode 100644 index 0000000..c2480c9 --- /dev/null +++ b/src/presentation/http-rest/handlers/not-found.ts @@ -0,0 +1,8 @@ +import type { Request, Response } from 'express'; +import { NotFoundProblem } from '../../../infra/errors/generic-problem'; + +export function notFoundController(request: Request, response: Response) { + request.context.logger.error('resource not found', { url: request.url }); + const problem = new NotFoundProblem(); + response.status(problem.status).send(problem); +} diff --git a/src/presentation/http-rest/handlers/swagger-raw-file.ts b/src/presentation/http-rest/handlers/swagger-raw-file.ts new file mode 100644 index 0000000..dfb11c0 --- /dev/null +++ b/src/presentation/http-rest/handlers/swagger-raw-file.ts @@ -0,0 +1,13 @@ +import type { Request, Response } from 'express'; +import type { OpenAPIObject } from 'openapi3-ts/oas30'; + +/** + * Serves an openapi document raw, to be used in introspection engines + * @param document A generated OpenAPI registry + * @returns A controller that just serves it as if it was a static file + */ +export function serveRawSwaggerDocument(document: OpenAPIObject) { + return function swaggerRawFileController(_request: Request, response: Response) { + response.send(document); + }; +} diff --git a/src/presentation/http-rest/middlewares/noop.ts b/src/presentation/http-rest/middlewares/noop.ts new file mode 100644 index 0000000..497c111 --- /dev/null +++ b/src/presentation/http-rest/middlewares/noop.ts @@ -0,0 +1,9 @@ +import type { NextFunction, Request, Response } from 'express'; + +/** + * This middleware does nothing. Why it exists? Because then we can "disable" a + * middleware by returning a noop. + */ +export function noopMiddleware(_request: Request, _response: Response, next: NextFunction) { + next(); +} diff --git a/src/presentation/http-rest/middlewares/oidc-authentication.ts b/src/presentation/http-rest/middlewares/oidc-authentication.ts new file mode 100644 index 0000000..4b62afc --- /dev/null +++ b/src/presentation/http-rest/middlewares/oidc-authentication.ts @@ -0,0 +1,59 @@ +import type { NextFunction, Request, Response } from 'express'; +import { createRemoteJWKSet, jwtVerify } from 'jose'; +import { z } from 'zod'; +import { UnauthorizedProblem } from '../../../infra/errors/generic-problem'; +import { noopMiddleware } from './noop'; + +export const TokenPayloadSchema = z.object({ + sub: z.string(), + scope: z.string(), + resource_access: z.record(z.string(), z.object({ roles: z.string().array() })), +}); + +export interface OIDCAuthenticationOptions { + /** + * URL to access the authorization service + */ + jwksURL: URL; + /** + * Entity that issues the tokens + */ + issuer: string; + /** + * Which resource the user wants to access, in this case, it should be + * this API + */ + audience: string; +} + +/** + * Returns a middleware to authenticate users + * @param options OIDC authentication options + * @param disable If true, it disables authentication + */ +export function withAuthentication(options: OIDCAuthenticationOptions, disable = false) { + if (disable) return noopMiddleware; + const jwks = createRemoteJWKSet(options.jwksURL); + return async function authMiddleware(request: Request, _response: Response, next: NextFunction) { + if (!request.headers.authorization) return next(new UnauthorizedProblem()); + if (!request.headers.authorization.startsWith('Bearer')) return next(new UnauthorizedProblem()); + try { + const token = request.headers.authorization.slice(7); + const { payload } = await jwtVerify(token, jwks, { + issuer: options.issuer, + audience: options.audience, + }); + + const { scope, sub: userId, resource_access } = TokenPayloadSchema.parse(payload); + const roles = Object.values(resource_access).flatMap(resource => resource.roles); + const scopes = scope.split(' '); + request.context.session = { userId, scopes, roles }; + request.context.accessToken = token; + + return next(); + } catch (err) { + request.context.logger.debug('User not authorized', err); + return next(new UnauthorizedProblem()); + } + }; +} diff --git a/src/presentation/http-rest/middlewares/request-time.ts b/src/presentation/http-rest/middlewares/request-time.ts new file mode 100644 index 0000000..48a9432 --- /dev/null +++ b/src/presentation/http-rest/middlewares/request-time.ts @@ -0,0 +1,13 @@ +import type { Request, Response, NextFunction } from 'express'; + +/** + * Logs the ip and time taken for each request, so that we can profile it later. + */ +export function requestTimeMiddleware(request: Request, response: Response, next: NextFunction) { + const userIp = request.headers['x-forwarded-for'] ?? request.socket.remoteAddress; + const logger = request.context.logger; + + const profiler = logger.startTimer(); + response.once('finish', () => profiler.done({ message: request.originalUrl, ip: userIp })); + next(); +} diff --git a/src/presentation/http-rest/middlewares/require-roles.ts b/src/presentation/http-rest/middlewares/require-roles.ts new file mode 100644 index 0000000..1836337 --- /dev/null +++ b/src/presentation/http-rest/middlewares/require-roles.ts @@ -0,0 +1,35 @@ +import type { NextFunction, Request, Response } from 'express'; +import { ForbiddenProblem } from '../../../infra/errors/generic-problem'; +import { noopMiddleware } from './noop'; +import env from 'env-var'; + +const WILL_DISABLE_AUTHENTICATION = env.get('WILL_DISABLE_AUTHENTICATION').default('false').asBool(); + +/** + * @param roles A list of roles to test for + * @example + * router.get('/my-resource', requireRoles(['dev']), myResourceController); + * @returns A middleware with the provided roles + */ +export function requireRoles(roles: string[]) { + if (WILL_DISABLE_AUTHENTICATION) return noopMiddleware; + return function authorizationScopesMiddleware(request: Request, _response: Response, next: NextFunction) { + const { session, logger } = request.context; + + if (!session) { + logger.debug('no logged user found'); + return next(new ForbiddenProblem()); + } + + for (const role of roles) { + if (!session.roles.includes(role)) { + logger.debug('attempt to do operation without roles', { + expectedRoles: roles, + actualRoles: session.roles, + }); + return next(new ForbiddenProblem()); + } + } + next(); + }; +} diff --git a/src/presentation/http-rest/middlewares/require-scopes.ts b/src/presentation/http-rest/middlewares/require-scopes.ts new file mode 100644 index 0000000..ccf9f35 --- /dev/null +++ b/src/presentation/http-rest/middlewares/require-scopes.ts @@ -0,0 +1,35 @@ +import type { NextFunction, Request, Response } from 'express'; +import { ForbiddenProblem } from '../../../infra/errors/generic-problem'; +import env from 'env-var'; +import { noopMiddleware } from './noop'; + +const WILL_DISABLE_AUTHENTICATION = env.get('WILL_DISABLE_AUTHENTICATION').default('false').asBool(); + +/** + * @param scopes A list of scopes to test for + * @example + * router.get('/my-resource', requireScopes(['read:my-resource']), myResourceController); + * @returns A middleware with the provided scopes + */ +export function requireScopes(scopes: string[]) { + if (WILL_DISABLE_AUTHENTICATION) return noopMiddleware; + return function authorizationScopesMiddleware(request: Request, _response: Response, next: NextFunction) { + const { session, logger } = request.context; + + if (!session) { + logger.debug('no logged user found'); + return next(new ForbiddenProblem()); + } + + for (const scope of scopes) { + if (!session.scopes.includes(scope)) { + logger.debug('attempt to do operation without scopes', { + expectedScopes: scopes, + actualScopes: session.scopes, + }); + return next(new ForbiddenProblem()); + } + } + next(); + }; +} diff --git a/src/presentation/http-rest/middlewares/with-context.ts b/src/presentation/http-rest/middlewares/with-context.ts new file mode 100644 index 0000000..91da7c7 --- /dev/null +++ b/src/presentation/http-rest/middlewares/with-context.ts @@ -0,0 +1,25 @@ +import type { NextFunction, Request, Response } from 'express'; +import type winston from 'winston'; +import type { FileUploadProvider } from '../../../infra/providers/file-upload'; + +export interface BaseContextConfig { + /** + * A winston logger + */ + logger: winston.Logger; + /** + * Provides upload capabilities + */ + fileUploadProvider: FileUploadProvider; +} + +/** + * Creates the base context for the application + * @param config The base config for the application context + */ +export function withContext(config: BaseContextConfig) { + return function middlware(request: Request, _response: Response, next: NextFunction) { + request.context = { logger: config.logger, fileUploadProvider: config.fileUploadProvider }; + next(); + }; +} diff --git a/src/presentation/http-rest/middlewares/with-mock-repositories.ts b/src/presentation/http-rest/middlewares/with-mock-repositories.ts new file mode 100644 index 0000000..cd52f8f --- /dev/null +++ b/src/presentation/http-rest/middlewares/with-mock-repositories.ts @@ -0,0 +1,31 @@ +import type { NextFunction, Request, Response } from 'express'; +import { UsersMockRepository } from '../../../infra/repositories/users-mock-repository'; +import { VehiclesMockRepository } from '../../../infra/repositories/vehicles-mock-repository'; +import { RoutesMockRepository } from '../../../infra/repositories/routes-mock-repository'; +import { CollectionPointsMockRepository } from '../../../infra/repositories/collection-points-mock-repository'; +import { KeyCloakMockRepository } from '../../../infra/repositories/keycloak-mock-repository'; +import { OperatorMockRepository } from '../../../infra/repositories/operator-mock-repository'; +import { CollectionsMockRepository } from '../../../infra/repositories/collections-mock-repositpory'; + +// biome-ignore lint/complexity/noBannedTypes: +export type RepositoriesContextConfig = {}; + +/** + * Creates a context middleware with the provided objects. + * @param config The configuration to setup the repositories + * @returns A middleware with the context. + */ +export function withRepositories(_config: RepositoriesContextConfig) { + return function contextMiddleware(request: Request, _response: Response, next: NextFunction) { + request.context.repositories = { + routesRepository: new RoutesMockRepository(), + usersRepository: new UsersMockRepository(), + vehiclesRepository: new VehiclesMockRepository(), + collectionPointsRepository: new CollectionPointsMockRepository(), + keyCloakRepository: new KeyCloakMockRepository(), + operatorRepository: new OperatorMockRepository(), + collectionRepository: new CollectionsMockRepository(), + }; + next(); + }; +} diff --git a/src/presentation/http-rest/middlewares/with-repositories.ts b/src/presentation/http-rest/middlewares/with-repositories.ts new file mode 100644 index 0000000..4cf9e38 --- /dev/null +++ b/src/presentation/http-rest/middlewares/with-repositories.ts @@ -0,0 +1,42 @@ +import type { PrismaClient } from '@prisma/client'; +import type { NextFunction, Request, Response } from 'express'; +import { VehiclesPrismaRepository } from '../../../infra/repositories/vehicles-prisma-repository'; +import { CollectionPointsPrismaRepository } from '../../../infra/repositories/collection-points-prisma-repository'; +import { RoutesPrismaRepository } from '../../../infra/repositories/routes-prisma-repository'; +import { KeyCloakRepository } from '../../../infra/repositories/keycloak-repository'; +import type { KeyCloak } from '../../../infra/providers/keycloak'; +import { UsersPrismaRepository } from '../../../infra/repositories/users-prisma-repository'; +import { OperatorPrismaRepository } from '../../../infra/repositories/operator-prisma-repository'; +import { CollectionsPrismaRepository } from '../../../infra/repositories/collections-prisma-repository'; + +export type RepositoriesContextConfig = { + /** + * A prisma client instance + */ + prisma: PrismaClient; + /** + * A keycloak instance + */ + keycloak: KeyCloak; +}; + +/** + * Creates a context middleware with the provided objects. + * @param config The configuration to setup the repositories + * @returns A middleware with the context. + */ +export function withRepositories({ keycloak, prisma }: RepositoriesContextConfig) { + return function contextMiddleware(request: Request, _response: Response, next: NextFunction) { + const collectionPointsRepository = new CollectionPointsPrismaRepository(prisma); + request.context.repositories = { + routesRepository: new RoutesPrismaRepository(prisma), + usersRepository: new UsersPrismaRepository(prisma), + collectionPointsRepository, + vehiclesRepository: new VehiclesPrismaRepository(prisma), + keyCloakRepository: new KeyCloakRepository(keycloak, collectionPointsRepository), + operatorRepository: new OperatorPrismaRepository(prisma), + collectionRepository: new CollectionsPrismaRepository(prisma), + }; + next(); + }; +} diff --git a/src/presentation/http-rest/openapi/registry.ts b/src/presentation/http-rest/openapi/registry.ts new file mode 100644 index 0000000..16175d6 --- /dev/null +++ b/src/presentation/http-rest/openapi/registry.ts @@ -0,0 +1,37 @@ +import { OpenAPIRegistry } from '@asteasolutions/zod-to-openapi'; +import { rootRouteConfig } from '../controllers/root-controller'; +import { routeListRouteConfig } from '../controllers/route-list-controller'; +import { vehicleListRouteConfig } from '../controllers/vehicle-list-controller'; +import { userMeRouteConfig } from '../controllers/user-me-controller'; +import { collectionPointListByRouteRouteConfig } from '../controllers/collection-point-list-by-route-controller'; +import { routeStartRouteConfig } from '../controllers/route-start-controller'; +import { routeFinishRouteConfig } from '../controllers/route-finish-controller'; +import { routeGetByIdRouteConfig } from '../controllers/route-get-controller'; +import { collectionPointGetByIdRouteConfig } from '../controllers/collection-point-get-controller'; +import { collectionStartRouteConfig } from '../controllers/collection-start-controller'; +import { collectionFinishRouteConfig } from '../controllers/collection-finish-controller'; +import { collectionPointSaveRouteConfig } from '../controllers/collection-point-save-controller'; +import { collectionPointListRouteConfig } from '../controllers/collection-point-list-controller'; +import { collectionGetByIdRouteConfig } from '../controllers/collection-get-controller'; + +export const registry = new OpenAPIRegistry(); +// > Root +registry.registerPath(rootRouteConfig); +// > Routes +registry.registerPath(routeGetByIdRouteConfig); +registry.registerPath(routeListRouteConfig); +registry.registerPath(routeStartRouteConfig); +registry.registerPath(routeFinishRouteConfig); +// > CollectionPoints +registry.registerPath(collectionPointListByRouteRouteConfig); +registry.registerPath(collectionPointListRouteConfig); +registry.registerPath(collectionPointGetByIdRouteConfig); +registry.registerPath(collectionPointSaveRouteConfig); +// > Collections +registry.registerPath(collectionStartRouteConfig); +registry.registerPath(collectionFinishRouteConfig); +registry.registerPath(collectionGetByIdRouteConfig); +// > Vehicles +registry.registerPath(vehicleListRouteConfig); +// > Users +registry.registerPath(userMeRouteConfig); diff --git a/src/presentation/http-rest/openapi/responses.ts b/src/presentation/http-rest/openapi/responses.ts new file mode 100644 index 0000000..8c755e1 --- /dev/null +++ b/src/presentation/http-rest/openapi/responses.ts @@ -0,0 +1,61 @@ +import type { ResponseConfig } from '@asteasolutions/zod-to-openapi'; +import { z } from 'zod'; +import type { ProblemDetails } from '../../../infra/errors/problem-details'; +import { + BadRequestProblem, + ForbiddenProblem, + InvalidParametersProblem, + NotFoundProblem, + ServerErrorProblem, + UnauthorizedProblem, +} from '../../../infra/errors/generic-problem'; +import { ValidationErrorProblem } from '../../../infra/errors/validation-error'; + +type OpenAPIResponse = { [key in number]: ResponseConfig }; + +const PROBLEM_DETAILS_RESPONSE_SCHEMA = Object.freeze( + z.object({ + type: z.string(), + title: z.string(), + detail: z.string(), + status: z.number(), + code: z.string(), + errors: z + .object({ + detail: z.string(), + pointer: z.string().optional(), + parameter: z.string().optional(), + }) + .array() + .optional(), + }), +); + +export const GENERIC_OPENAPI_RESPONSES = Object.freeze({ + ...makeAPIResponseFromProblem(new NotFoundProblem()), + ...makeAPIResponseFromProblem(new UnauthorizedProblem()), + ...makeAPIResponseFromProblem(new ForbiddenProblem()), + ...makeAPIResponseFromProblem(new BadRequestProblem()), + ...makeAPIResponseFromProblem(new InvalidParametersProblem()), + ...makeAPIResponseFromProblem(new ServerErrorProblem()), + ...makeAPIResponseFromProblem(new ValidationErrorProblem([])), +}); + +export function makeOpenAPIResponse(status: number, description: string, schema?: z.ZodType): OpenAPIResponse { + if (schema) return { [status]: { content: { 'application/json': { schema } }, description } }; + return { [status]: { description } }; +} + +/** + * Converts a ProblemDetails object in an http response for the lib zod-to-openapi + * @param problem An object that implements ProblemDetails + * @returns The http code and the schema for the response + */ +export function makeAPIResponseFromProblem(problem: ProblemDetails): OpenAPIResponse { + return { + [problem.status]: { + content: { 'application/json': { schema: PROBLEM_DETAILS_RESPONSE_SCHEMA } }, + description: `Erro do tipo ${problem.title}: ${problem.detail}. Veja ${problem.type}`, + }, + }; +} diff --git a/src/presentation/http-rest/openapi/section-tags.ts b/src/presentation/http-rest/openapi/section-tags.ts new file mode 100644 index 0000000..fc71108 --- /dev/null +++ b/src/presentation/http-rest/openapi/section-tags.ts @@ -0,0 +1,8 @@ +export const SECTION_TAGS = Object.freeze({ + WELCOME: 'Boas Vindas', + AUTH: 'Auntenticação', + COLLECTION_POINTS: 'Pontos de Coleta', + COLLECTIONS: 'Coletas', + VEHICLES: 'Veículos', + ROUTES: 'Rotas', +}); diff --git a/src/presentation/http-rest/routers/collection-points-router.ts b/src/presentation/http-rest/routers/collection-points-router.ts new file mode 100644 index 0000000..420d5c2 --- /dev/null +++ b/src/presentation/http-rest/routers/collection-points-router.ts @@ -0,0 +1,10 @@ +import express from 'express'; +import { collectionPointGetByIdController } from '../controllers/collection-point-get-controller'; +import { collectionPointCreateController } from '../controllers/collection-point-save-controller'; +import { requireScopes } from '../middlewares/require-scopes'; +import { collectionPointListController } from '../controllers/collection-point-list-controller'; + +export const collectionPointsRouter = express.Router(); +collectionPointsRouter.get('/:collectionPointId', collectionPointGetByIdController); +collectionPointsRouter.get('/', collectionPointListController); +collectionPointsRouter.post('/', requireScopes(['write:collection-points']), collectionPointCreateController); diff --git a/src/presentation/http-rest/routers/collections.ts b/src/presentation/http-rest/routers/collections.ts new file mode 100644 index 0000000..c590e72 --- /dev/null +++ b/src/presentation/http-rest/routers/collections.ts @@ -0,0 +1,5 @@ +import express from 'express'; +import { collectionGetByIdController } from '../controllers/collection-get-controller'; + +export const collectionRouter = express.Router(); +collectionRouter.get('/:collectionId', collectionGetByIdController); diff --git a/src/presentation/http-rest/routers/root-router.ts b/src/presentation/http-rest/routers/root-router.ts new file mode 100644 index 0000000..1b10386 --- /dev/null +++ b/src/presentation/http-rest/routers/root-router.ts @@ -0,0 +1,19 @@ +import express from 'express'; +import { rootController } from '../controllers/root-controller'; +import { routesRouter } from './routes-router'; +import { vehiclesRouter } from './vehicles-router'; +import { userMeController } from '../controllers/user-me-controller'; +import { collectionPointsRouter } from './collection-points-router'; +import { collectionRouter } from './collections'; +import type { FileUploadProvider } from '../../../infra/providers/file-upload'; + +export function createRootRouter(_fileUpload: FileUploadProvider) { + const rootRouter = express.Router(); + rootRouter.get('/', rootController); + rootRouter.get('/me', userMeController); + rootRouter.use('/routes', routesRouter); + rootRouter.use('/collection-points', collectionPointsRouter); + rootRouter.use('/collections', collectionRouter); + rootRouter.use('/vehicles', vehiclesRouter); + return rootRouter; +} diff --git a/src/presentation/http-rest/routers/routes-router.ts b/src/presentation/http-rest/routers/routes-router.ts new file mode 100644 index 0000000..f96830b --- /dev/null +++ b/src/presentation/http-rest/routers/routes-router.ts @@ -0,0 +1,17 @@ +import express from 'express'; +import { routeListController } from '../controllers/route-list-controller'; +import { routeStartController } from '../controllers/route-start-controller'; +import { routeFinishtController } from '../controllers/route-finish-controller'; +import { routeGetByIdController } from '../controllers/route-get-controller'; +import { collectionStartController } from '../controllers/collection-start-controller'; +import { collectionFinishController } from '../controllers/collection-finish-controller'; +import { collectionPointListByRouteController } from '../controllers/collection-point-list-by-route-controller'; + +export const routesRouter = express.Router(); +routesRouter.get('/', routeListController); +routesRouter.post('/:routeId/start', routeStartController); +routesRouter.post('/:routeId/finish', routeFinishtController); +routesRouter.get('/:routeId', routeGetByIdController); +routesRouter.get('/:routeId/collection-points', collectionPointListByRouteController); +routesRouter.post('/:routeId/collections/:collectionId/start', collectionStartController); +routesRouter.post('/:routeId/collections/:collectionId/finish', collectionFinishController); diff --git a/src/presentation/http-rest/routers/vehicles-router.ts b/src/presentation/http-rest/routers/vehicles-router.ts new file mode 100644 index 0000000..5376da4 --- /dev/null +++ b/src/presentation/http-rest/routers/vehicles-router.ts @@ -0,0 +1,5 @@ +import express from 'express'; +import { vehicleListController } from '../controllers/vehicle-list-controller'; + +export const vehiclesRouter = express.Router(); +vehiclesRouter.get('/', vehicleListController); diff --git a/start.sh b/start.sh new file mode 100644 index 0000000..ef2b72d --- /dev/null +++ b/start.sh @@ -0,0 +1,9 @@ +#!/bin/bash + +# Migração do banco de dados +yarn migrate +yarn migrate:generate +yarn migrate:reset --force + +# Deploy +yarn deploy \ No newline at end of file diff --git a/test.sh b/test.sh new file mode 100644 index 0000000..8c5849a --- /dev/null +++ b/test.sh @@ -0,0 +1,28 @@ +#!/bin/bash +sleep 30 +set -e +# Análise do Código +yarn lint +yarn style +yarn typecheck +yarn compliance + +# Teste smoke +yarn test:smoke + +# Testes unitários +yarn test:unit + +# Migração do banco de dados +yarn migrate:test +yarn migrate:test:generate +yarn migrate:test:reset --force + +# Testes fim a fim +yarn test:e2e + +# Limpar banco para teste de API +yarn migrate:test:reset + +# Testes de API +yarn e2e:run \ No newline at end of file diff --git a/tests/api/List Collection Points.bru b/tests/api/List Collection Points.bru new file mode 100644 index 0000000..ed2f683 --- /dev/null +++ b/tests/api/List Collection Points.bru @@ -0,0 +1,15 @@ +meta { + name: List Collection Points + type: http + seq: 2 +} + +get { + url: {{baseUrl}}/collection-points + body: none + auth: bearer +} + +assert { + res.status: eq 200 +} diff --git a/tests/api/List Collections points by route.bru b/tests/api/List Collections points by route.bru new file mode 100644 index 0000000..e0ce869 --- /dev/null +++ b/tests/api/List Collections points by route.bru @@ -0,0 +1,15 @@ +meta { + name: List Collections points by route + type: http + seq: 3 +} + +get { + url: {{baseUrl}}/routes/f7f16595-8537-486b-9027-ee419435980c/collection-points + body: none + auth: none +} + +assert { + res.status: eq 200 +} diff --git a/tests/api/Welcome.bru b/tests/api/Welcome.bru new file mode 100644 index 0000000..175dfd1 --- /dev/null +++ b/tests/api/Welcome.bru @@ -0,0 +1,15 @@ +meta { + name: Welcome + type: http + seq: 2 +} + +get { + url: {{baseUrl}}/ + body: none + auth: none +} + +assert { + res.status: eq 200 +} diff --git a/tests/api/bruno.json b/tests/api/bruno.json new file mode 100644 index 0000000..199ed3a --- /dev/null +++ b/tests/api/bruno.json @@ -0,0 +1,9 @@ +{ + "version": "1", + "name": "Petropolis", + "type": "collection", + "ignore": [ + "node_modules", + ".git" + ] +} \ No newline at end of file diff --git a/tests/api/collection-by-trimvim/Finish Collection 2.bru b/tests/api/collection-by-trimvim/Finish Collection 2.bru new file mode 100644 index 0000000..233ca42 --- /dev/null +++ b/tests/api/collection-by-trimvim/Finish Collection 2.bru @@ -0,0 +1,16 @@ +meta { + name: Finish Collection 2 + type: http + seq: 8 +} + +post { + url: {{baseUrl}}/routes/f7f16595-8537-486b-9027-ee419435980c/collections/{{collectionId2}}/finish + body: none + auth: none +} + +assert { + res.status: eq 200 + res.body.status: eq "FINISHED" +} diff --git a/tests/api/collection-by-trimvim/Finish Collection.bru b/tests/api/collection-by-trimvim/Finish Collection.bru new file mode 100644 index 0000000..33b8340 --- /dev/null +++ b/tests/api/collection-by-trimvim/Finish Collection.bru @@ -0,0 +1,16 @@ +meta { + name: Finish Collection + type: http + seq: 6 +} + +post { + url: {{baseUrl}}/routes/f7f16595-8537-486b-9027-ee419435980c/collections/{{collectionId}}/finish + body: none + auth: none +} + +assert { + res.status: eq 200 + res.body.status: eq "FINISHED" +} \ No newline at end of file diff --git a/tests/api/collection-by-trimvim/Finish Route.bru b/tests/api/collection-by-trimvim/Finish Route.bru new file mode 100644 index 0000000..6b1ce7f --- /dev/null +++ b/tests/api/collection-by-trimvim/Finish Route.bru @@ -0,0 +1,16 @@ +meta { + name: Finish Route + type: http + seq: 9 +} + +post { + url: {{baseUrl}}/routes/f7f16595-8537-486b-9027-ee419435980c/finish + body: none + auth: none +} + +assert { + res.status: eq 200 + res.body.status: eq "FINISHED" +} diff --git a/tests/api/collection-by-trimvim/Get Collection By ID.bru b/tests/api/collection-by-trimvim/Get Collection By ID.bru new file mode 100644 index 0000000..aedbbb2 --- /dev/null +++ b/tests/api/collection-by-trimvim/Get Collection By ID.bru @@ -0,0 +1,16 @@ +meta { + name: Get Collection By ID + type: http + seq: 14 +} + +get { + url: {{baseUrl}}/collections/a323eadb-1ffc-4227-b4c4-0b9ee48d38a2 + body: none + auth: none +} + + +assert { + res.status: eq 200 +} diff --git a/tests/api/collection-by-trimvim/Get Collection Point by id.bru b/tests/api/collection-by-trimvim/Get Collection Point by id.bru new file mode 100644 index 0000000..c141de6 --- /dev/null +++ b/tests/api/collection-by-trimvim/Get Collection Point by id.bru @@ -0,0 +1,16 @@ +meta { + name: Get Collection Point by id + type: http + seq: 12 +} + +get { + url: {{baseUrl}}/collection-points/361754a6-845b-419b-8f96-be1f01fa899e + body: none + auth: none +} + +assert { + res.status: eq 200 + res.body.name.startsWith('Edifício'): isTruthy Edifício +} diff --git a/tests/api/collection-by-trimvim/Get Route by ID.bru b/tests/api/collection-by-trimvim/Get Route by ID.bru new file mode 100644 index 0000000..a6a4c3c --- /dev/null +++ b/tests/api/collection-by-trimvim/Get Route by ID.bru @@ -0,0 +1,16 @@ +meta { + name: Get Route by ID + type: http + seq: 3 +} + +get { + url: {{baseUrl}}/routes/f7f16595-8537-486b-9027-ee419435980c + body: none + auth: none +} + +assert { + res.status: eq 200 + res.body.name: eq Rota 1 +} diff --git a/tests/api/collection-by-trimvim/List Routes.bru b/tests/api/collection-by-trimvim/List Routes.bru new file mode 100644 index 0000000..136fe8c --- /dev/null +++ b/tests/api/collection-by-trimvim/List Routes.bru @@ -0,0 +1,15 @@ +meta { + name: List Routes + type: http + seq: 13 +} + +get { + url: {{baseUrl}}/routes + body: none + auth: none +} + +assert { + res.status: eq 200 +} diff --git a/tests/api/collection-by-trimvim/List Vehicles.bru b/tests/api/collection-by-trimvim/List Vehicles.bru new file mode 100644 index 0000000..0d5fcd2 --- /dev/null +++ b/tests/api/collection-by-trimvim/List Vehicles.bru @@ -0,0 +1,16 @@ +meta { + name: List Vehicles + type: http + seq: 2 +} + +get { + url: {{baseUrl}}/vehicles + body: none + auth: none +} + +assert { + res.status: eq 200 + res.body[0].name: eq TRIVIM 1 +} diff --git a/tests/api/collection-by-trimvim/Me.bru b/tests/api/collection-by-trimvim/Me.bru new file mode 100644 index 0000000..74038fb --- /dev/null +++ b/tests/api/collection-by-trimvim/Me.bru @@ -0,0 +1,16 @@ +meta { + name: Me + type: http + seq: 1 +} + +get { + url: {{baseUrl}}/me + body: none + auth: none +} + +assert { + res.status: eq 200 + res.body.fullName: eq Motorista +} diff --git a/tests/api/collection-by-trimvim/Start Collection 2.bru b/tests/api/collection-by-trimvim/Start Collection 2.bru new file mode 100644 index 0000000..0b4d845 --- /dev/null +++ b/tests/api/collection-by-trimvim/Start Collection 2.bru @@ -0,0 +1,16 @@ +meta { + name: Start Collection 2 + type: http + seq: 7 +} + +post { + url: {{baseUrl}}/routes/f7f16595-8537-486b-9027-ee419435980c/collections/{{collectionId2}}/start + body: none + auth: none +} + +assert { + res.status: eq 200 + res.body.status: eq "IN_PROGRESS" +} diff --git a/tests/api/collection-by-trimvim/Start Collection.bru b/tests/api/collection-by-trimvim/Start Collection.bru new file mode 100644 index 0000000..79cddcb --- /dev/null +++ b/tests/api/collection-by-trimvim/Start Collection.bru @@ -0,0 +1,16 @@ +meta { + name: Start Collection + type: http + seq: 5 +} + +post { + url: {{baseUrl}}/routes/f7f16595-8537-486b-9027-ee419435980c/collections/{{collectionId}}/start + body: none + auth: none +} + +assert { + res.status: eq 200 + res.body.status: eq "IN_PROGRESS" +} \ No newline at end of file diff --git a/tests/api/collection-by-trimvim/Start Route.bru b/tests/api/collection-by-trimvim/Start Route.bru new file mode 100644 index 0000000..335101a --- /dev/null +++ b/tests/api/collection-by-trimvim/Start Route.bru @@ -0,0 +1,21 @@ +meta { + name: Start Route + type: http + seq: 4 +} + +post { + url: {{baseUrl}}/routes/f7f16595-8537-486b-9027-ee419435980c/start + body: none + auth: none +} + +vars:post-response { + collectionId: res.body.collections[0].id + collectionId2: res.body.collections[1].id +} + +assert { + res.status: eq 200 + res.body.status: eq "IN_PROGRESS" +} diff --git a/tests/api/collection-by-trimvim/Welcome.bru b/tests/api/collection-by-trimvim/Welcome.bru new file mode 100644 index 0000000..13568a4 --- /dev/null +++ b/tests/api/collection-by-trimvim/Welcome.bru @@ -0,0 +1,15 @@ +meta { + name: Welcome + type: http + seq: 10 +} + +get { + url: {{baseUrl}}/ + body: none + auth: none +} + +assert { + res.status: eq 200 +} diff --git a/tests/api/environments/dev.bru b/tests/api/environments/dev.bru new file mode 100644 index 0000000..9cd2dfe --- /dev/null +++ b/tests/api/environments/dev.bru @@ -0,0 +1,3 @@ +vars { + baseUrl: https://api-dev-petropolis.isitics.com/api/v1 +} diff --git a/tests/api/environments/local.bru b/tests/api/environments/local.bru new file mode 100644 index 0000000..07e5e64 --- /dev/null +++ b/tests/api/environments/local.bru @@ -0,0 +1,3 @@ +vars { + baseUrl: http://localhost:3000/api/v1 +} diff --git a/tests/e2e/collection-by-trimvim.test.ts b/tests/e2e/collection-by-trimvim.test.ts new file mode 100644 index 0000000..763ea6e --- /dev/null +++ b/tests/e2e/collection-by-trimvim.test.ts @@ -0,0 +1,238 @@ +import app from '../../src/app'; +import request from 'supertest'; +import { CollectionPointStatus } from '../../src/domain/value-objects/collection-point-status'; +import { RouteStatus } from '../../src/domain/value-objects/route-status'; +import { CollectionStatus } from '../../src/domain/value-objects/collection-status'; + +interface SerializedCollection { + id: string; + collectionPointId: string; + routeId: string; + status: 'PENDING' | 'IN_PROGRESS' | 'FINISHED'; + notes?: string; + volumeCollected: number; + date: string; + startTime?: string; + endTime?: string; +} + +describe.sequential('[PET-146] Driver collects using a TRIVIM', () => { + it('should receive the logged in user', async () => { + expect.assertions(2); + const response = await request(app) + .get('/api/v1/me') + .set('Accept', 'application/json') + .expect('Content-Type', /json/); + expect(response.status).toBe(200); + expect(response.body).toEqual({ + id: '1f1309e9-498b-4892-9f8f-5c87d0dd83b9', + fullName: 'Motorista', + initials: 'MO', + }); + }); + + it('should receive a list with a single vehicle', async () => { + expect.assertions(2); + const response = await request(app) + .get('/api/v1/vehicles') + .set('Accept', 'application/json') + .expect('Content-Type', /json/); + expect(response.status).toBe(200); + expect(response.body).toEqual([ + { + id: 'ed3f0cc6-8836-4483-a2a3-b510f5fc6e8e', + name: 'TRIVIM 1', + }, + ]); + }); + it('should get the specified route', async () => { + expect.assertions(2); + const response = await request(app) + .get('/api/v1/routes/f7f16595-8537-486b-9027-ee419435980c') + .set('Accept', 'application/json') + .expect('Content-Type', /json/); + + expect(response.status).toBe(200); + expect(response.body).toEqual({ + id: 'f7f16595-8537-486b-9027-ee419435980c', + name: 'Rota 1', + date: '2024-12-16T12:00:00.000Z', + collections: [ + { + id: 'a323eadb-1ffc-4227-b4c4-0b9ee48d38a2', + status: CollectionStatus.enum.PENDING, + date: '2024-12-16T12:00:00.000+00:00', + volumeCollected: 0, + routeId: 'f7f16595-8537-486b-9027-ee419435980c', + collectionPoint: { + type: 'APARTMENT', + id: '97f2ab4c-ef96-42a5-9da8-395f236c875e', + name: 'Edifício Itamarati', + status: CollectionPointStatus.enum.ACTIVE, + address: { + state: 'SP', + city: 'Sao Paulo', + zipcode: '04026-000', + number: '123', + district: 'Vila Mariana', + street: 'Rua Dolor Sit', + complement: 'Entrada Norte', + coordinate: { latitude: -8.059377, longitude: -34.886952 }, + }, + bestCollectionDay: ['FRIDAY'], + selectiveCollectionDay: ['FRIDAY'], + contact: { + name: 'Matias Castro', + phone: '1234567890', + email: 'H9k5y@example.com', + }, + weeklyGlassVolume: 1000, + operatorId: '738515b5-6cc1-4db7-b6fd-b24a8929a0d8', + }, + }, + + { + id: '0f551194-1691-4e52-9094-d9e13a67cbf8', + status: CollectionStatus.enum.PENDING, + date: '2024-12-16T12:00:00.000+00:00', + routeId: 'f7f16595-8537-486b-9027-ee419435980c', + volumeCollected: 0, + collectionPoint: { + id: '361754a6-845b-419b-8f96-be1f01fa899e', + name: 'Edifício Residencial Lausanne', + status: CollectionPointStatus.enum.ACTIVE, + address: { + city: 'Sao Paulo', + street: 'Rua Lorem Ipsum', + complement: 'Entrada Sul', + district: 'Vila Mariana', + number: '123', + state: 'SP', + zipcode: '04026-000', + coordinate: { latitude: -8.038912, longitude: -34.870932 }, + }, + bestCollectionDay: ['FRIDAY'], + selectiveCollectionDay: ['FRIDAY'], + contact: { + name: 'Matias Castro', + phone: '1234567890', + email: 'H9k5y@example.com', + }, + type: 'APARTMENT', + weeklyGlassVolume: 1000, + operatorId: '738515b5-6cc1-4db7-b6fd-b24a8929a0d8', + }, + }, + ], + totalDistanceKm: 40, + totalTimeMs: 1000 * 60 * 60 * 4, + status: RouteStatus.enum.PENDING, + }); + }); + + let collectionId = ''; + let collectionId2 = ''; + it('should start the route', async () => { + expect.assertions(4); + const response = await request(app) + .post('/api/v1/routes/f7f16595-8537-486b-9027-ee419435980c/start') + .set('Accept', 'application/json') + .expect('Content-Type', /json/); + + collectionId = response.body.collections[0].id; + collectionId2 = response.body.collections[1].id; + expect(response.status).toBe(200); + expect(response.body.status).toBe(RouteStatus.enum.IN_PROGRESS); + expect(Array.isArray(response.body.collections)).toBe(true); + if (response.body.collections.length > 0) { + expect( + response.body.collections.every((collection: SerializedCollection) => collection.status === 'PENDING'), + ).toBe(true); + } + }); + + it('should receive the collection point of specified id', async () => { + expect.assertions(2); + const response = await request(app) + .get('/api/v1/collection-points/361754a6-845b-419b-8f96-be1f01fa899e') + .set('Accept', 'application/json') + .expect('Content-Type', /json/); + expect(response.status).toBe(200); + expect(response.body).toEqual({ + id: '361754a6-845b-419b-8f96-be1f01fa899e', + name: 'Edifício Residencial Lausanne', + status: CollectionPointStatus.enum.ACTIVE, + operatorId: '738515b5-6cc1-4db7-b6fd-b24a8929a0d8', + address: { + city: 'Sao Paulo', + street: 'Rua Lorem Ipsum', + district: 'Vila Mariana', + number: '123', + state: 'SP', + zipcode: '04026-000', + complement: 'Entrada Sul', + + coordinate: { latitude: -8.038912, longitude: -34.870932 }, + }, + bestCollectionDay: ['FRIDAY'], + selectiveCollectionDay: ['FRIDAY'], + contact: { + name: 'Matias Castro', + phone: '1234567890', + email: 'H9k5y@example.com', + }, + type: 'APARTMENT', + weeklyGlassVolume: 1000, + }); + }); + it('should start the first collection', async () => { + expect.assertions(2); + const response = await request(app) + .post(`/api/v1/routes/f7f16595-8537-486b-9027-ee419435980c/collections/${collectionId}/start`) + .set('Accept', 'application/json') + .expect('Content-Type', /json/); + + expect(response.status).toBe(200); + expect(response.body.status).toEqual(CollectionStatus.enum.IN_PROGRESS); + }); + it('should finish the first collection point', async () => { + expect.assertions(2); + const response = await request(app) + .post(`/api/v1/routes/f7f16595-8537-486b-9027-ee419435980c/collections/${collectionId}/finish`) + .send({ reason: 'FINISHED', comment: 'Rota finalizada' }) + .set('Accept', 'application/json') + .expect('Content-Type', /json/); + expect(response.status).toBe(200); + expect(response.body.status).toEqual(CollectionStatus.enum.FINISHED); + }); + it('should start the second collection point', async () => { + expect.assertions(2); + const response = await request(app) + .post(`/api/v1/routes/f7f16595-8537-486b-9027-ee419435980c/collections/${collectionId2}/start`) + .set('Accept', 'application/json') + .expect('Content-Type', /json/); + expect(response.status).toBe(200); + expect(response.body.status).toEqual(CollectionStatus.enum.IN_PROGRESS); + }); + it('should finish the second collection point', async () => { + expect.assertions(2); + const response = await request(app) + .post(`/api/v1/routes/f7f16595-8537-486b-9027-ee419435980c/collections/${collectionId2}/finish`) + .send({ reason: 'FINISHED', comment: 'Rota finalizada' }) + .set('Accept', 'application/json') + .expect('Content-Type', /json/); + + expect(response.status).toBe(200); + expect(response.body.status).toEqual(CollectionStatus.enum.FINISHED); + }); + it('should finish the route', async () => { + expect.assertions(2); + const response = await request(app) + .post('/api/v1/routes/f7f16595-8537-486b-9027-ee419435980c/finish') + .send({ reason: 'FINISHED', comment: 'Rota finalizada' }) + .set('Accept', 'application/json') + .expect('Content-Type', /json/); + expect(response.status).toBe(200); + expect(response.body.status).toEqual(RouteStatus.enum.FINISHED); + }); +}); diff --git a/tests/e2e/collection-points.test.ts b/tests/e2e/collection-points.test.ts new file mode 100644 index 0000000..c06addf --- /dev/null +++ b/tests/e2e/collection-points.test.ts @@ -0,0 +1,13 @@ +/* eslint-disable sonarjs/no-duplicate-string */ +import request from 'supertest'; +import app from '../../src/app'; +describe('Testing endpoints for collection points', { sequential: true }, () => { + it('should list the collection points', async () => { + expect.assertions(1); + const response = await request(app) + .get('/api/v1/collection-points') + .set('Accept', 'application/json') + .expect('Content-Type', /json/); + expect(response.status).toBe(200); + }); +}); diff --git a/tests/e2e/collection.test.ts b/tests/e2e/collection.test.ts new file mode 100644 index 0000000..77d8764 --- /dev/null +++ b/tests/e2e/collection.test.ts @@ -0,0 +1,14 @@ +/* eslint-disable sonarjs/no-duplicate-string */ +import request from 'supertest'; +import app from '../../src/app'; + +describe('Testing endpoints for collections', { sequential: true }, () => { + it('should get a single collection', async () => { + expect.assertions(1); + const response = await request(app) + .get('/api/v1/collections/a323eadb-1ffc-4227-b4c4-0b9ee48d38a2') + .set('Accept', 'application/json') + .expect('Content-Type', /json/); + expect(response.status).toBe(200); + }); +}); diff --git a/tests/e2e/hello.test.ts b/tests/e2e/hello.test.ts new file mode 100644 index 0000000..787e372 --- /dev/null +++ b/tests/e2e/hello.test.ts @@ -0,0 +1,11 @@ +/* eslint-disable sonarjs/no-duplicate-string */ +import request from 'supertest'; +import app from '../../src/app'; + +describe('Simplest test possible', { sequential: true }, () => { + it('should work', async () => { + expect.hasAssertions(); + const response = await request(app).get('/api/v1').set('Accept', 'application/json').expect('Content-Type', /text/); + expect(response.status).toBe(200); + }); +}); diff --git a/tests/e2e/users.test.ts b/tests/e2e/users.test.ts new file mode 100644 index 0000000..cb34bba --- /dev/null +++ b/tests/e2e/users.test.ts @@ -0,0 +1,19 @@ +/* eslint-disable sonarjs/no-duplicate-string */ +import request from 'supertest'; +import app from '../../src/app'; + +describe('Testing endpoints for users', { sequential: true }, () => { + it('should receive the logged in user', async () => { + expect.assertions(2); + const response = await request(app) + .get('/api/v1/me') + .set('Accept', 'application/json') + .expect('Content-Type', /json/); + expect(response.status).toBe(200); + expect(response.body).toEqual({ + id: '1f1309e9-498b-4892-9f8f-5c87d0dd83b9', + fullName: 'Motorista', + initials: 'MO', + }); + }); +}); diff --git a/tests/e2e/vehicles.test.ts b/tests/e2e/vehicles.test.ts new file mode 100644 index 0000000..da799e2 --- /dev/null +++ b/tests/e2e/vehicles.test.ts @@ -0,0 +1,20 @@ +/* eslint-disable sonarjs/no-duplicate-string */ +import request from 'supertest'; +import app from '../../src/app'; + +describe('Testing endpoints for vehicles', { sequential: true }, () => { + it('should receive a list with a single vehicle', async () => { + expect.assertions(2); + const response = await request(app) + .get('/api/v1/vehicles') + .set('Accept', 'application/json') + .expect('Content-Type', /json/); + expect(response.status).toBe(200); + expect(response.body).toEqual([ + { + id: 'ed3f0cc6-8836-4483-a2a3-b510f5fc6e8e', + name: 'TRIVIM 1', + }, + ]); + }); +}); diff --git a/tests/mocks/collection-points-mock.ts b/tests/mocks/collection-points-mock.ts new file mode 100644 index 0000000..1fa0dbe --- /dev/null +++ b/tests/mocks/collection-points-mock.ts @@ -0,0 +1,119 @@ +import { CollectionPoint } from '../../src/domain/entities/collection-point'; + +export const collectionPointMock1 = CollectionPoint.create({ + id: '97f2ab4c-ef96-42a5-9da8-395f236c875e', + name: 'Edifício Itamarati', + operatorId: '738515b5-6cc1-4db7-b6fd-b24a8929a0d8', + status: 'ACTIVE', + address: { + city: 'Sao Paulo', + district: 'Vila Mariana', + number: '123', + state: 'SP', + zipcode: '04026-000', + street: 'Rua Dolor Sit', + complement: 'Entrada Norte', + coordinate: { latitude: -8.059377, longitude: -34.886952 }, + }, + bestCollectionDay: ['FRIDAY'], + selectiveCollectionDay: ['FRIDAY'], + contact: { + name: 'Matias Castro', + role: 'ADMIN', + phone: '1234567890', + email: 'H9k5y@example.com', + }, + weeklyGlassVolume: 1000, + type: 'APARTMENT', +}); + +export const collectionPointMock2 = CollectionPoint.create({ + id: '361754a6-845b-419b-8f96-be1f01fa899e', + name: 'Edifício Residencial Lausanne', + operatorId: '738515b5-6cc1-4db7-b6fd-b24a8929a0d8', + status: 'ACTIVE', + address: { + city: 'Sao Paulo', + district: 'Vila Mariana', + number: '123', + state: 'SP', + zipcode: '04026-000', + street: 'Rua Lorem Ipsum', + complement: 'Entrada Sul', + coordinate: { latitude: -8.038912, longitude: -34.870932 }, + }, + bestCollectionDay: ['FRIDAY'], + selectiveCollectionDay: ['FRIDAY'], + contact: { + name: 'Matias Castro', + role: 'ADMIN', + phone: '1234567890', + email: 'H9k5y@example.com', + }, + weeklyGlassVolume: 1000, + type: 'APARTMENT', +}); + +export const collectionPointPrismaMock1 = { + id: '97f2ab4c-ef96-42a5-9da8-395f236c875e', + name: 'Edifício Itamarati', + operatorId: '738515b5-6cc1-4db7-b6fd-b24a8929a0d8', + type: 'APARTMENT', + status: 'ACTIVE', + address: JSON.stringify({ + state: 'SP', + city: 'Sao Paulo', + zipcode: '04026-000', + number: '123', + district: 'Vila Mariana', + street: 'Rua Dolor Sit', + complement: 'Entrada Norte', + coordinate: { latitude: -8.059377, longitude: -34.886952 }, + }), + bestCollectionDay: JSON.stringify(['FRIDAY']), + selectiveCollectionDay: JSON.stringify(['FRIDAY']), + contact: JSON.stringify({ + name: 'Matias Castro', + role: 'ADMIN', + phone: '1234567890', + email: 'H9k5y@example.com', + }), + createdAt: new Date(), + updatedAt: new Date(), + relevantInfos: null, + weeklyGlassVolume: 1000, + responsible: null, + shifts: null, +}; + +export const collectionPointPrismaMock2 = { + id: '361754a6-845b-419b-8f96-be1f01fa899e', + name: 'Edifício Residencial Lausanne', + operatorId: '738515b5-6cc1-4db7-b6fd-b24a8929a0d8', + type: 'APARTMENT', + status: 'ACTIVE', + address: JSON.stringify({ + state: 'SP', + city: 'Sao Paulo', + zipcode: '04026-000', + number: '123', + district: 'Vila Mariana', + street: 'Rua Lorem Ipsum', + complement: 'Entrada Sul', + coordinate: { latitude: -8.038912, longitude: -34.870932 }, + }), + bestCollectionDay: JSON.stringify(['FRIDAY']), + selectiveCollectionDay: JSON.stringify(['FRIDAY']), + contact: JSON.stringify({ + name: 'Matias Castro', + role: 'ADMIN', + phone: '1234567890', + email: 'H9k5y@example.com', + }), + createdAt: new Date(), + updatedAt: new Date(), + relevantInfos: null, + weeklyGlassVolume: 1000, + responsible: null, + shifts: null, +}; diff --git a/tests/smoke/address.test.ts b/tests/smoke/address.test.ts new file mode 100644 index 0000000..7a84e01 --- /dev/null +++ b/tests/smoke/address.test.ts @@ -0,0 +1,33 @@ +import { Address } from '../../src/domain/value-objects/address'; + +describe('[smoke] basic address operations', () => { + it('should create an address and serialize', () => { + expect.hasAssertions(); + const address = Address.create({ + state: 'SP', + city: 'Sao Paulo', + zipcode: '04026-000', + number: '123', + district: 'Vila Mariana', + street: 'Rua Lorem Ipsum', + complement: 'Entrada Sul', + coordinate: { latitude: -2, longitude: 30 }, + }); + const serialized = address.serialize(); + expect(serialized).toMatchInlineSnapshot(` + { + "city": "Sao Paulo", + "complement": "Entrada Sul", + "coordinate": { + "latitude": -2, + "longitude": 30, + }, + "district": "Vila Mariana", + "number": "123", + "state": "SP", + "street": "Rua Lorem Ipsum", + "zipcode": "04026-000", + } + `); + }); +}); diff --git a/tests/smoke/collection-point-status.test.ts b/tests/smoke/collection-point-status.test.ts new file mode 100644 index 0000000..74d8a59 --- /dev/null +++ b/tests/smoke/collection-point-status.test.ts @@ -0,0 +1,10 @@ +import { CollectionPointStatus } from '../../src/domain/value-objects/collection-point-status'; + +describe('[smoke] basic collection point status operations', () => { + it('should create a collection point status and serialize', () => { + expect.hasAssertions(); + const status = CollectionPointStatus.create(CollectionPointStatus.enum.ACTIVE); + const serialized = status.serialize(); + expect(serialized).toMatchInlineSnapshot(`"ACTIVE"`); + }); +}); diff --git a/tests/smoke/collection-point.test.ts b/tests/smoke/collection-point.test.ts new file mode 100644 index 0000000..f8cd338 --- /dev/null +++ b/tests/smoke/collection-point.test.ts @@ -0,0 +1,44 @@ +import { collectionPointMock2 } from '../mocks/collection-points-mock'; + +describe('[smoke] basic collection point operations', () => { + it('should create a collection point and serialize', () => { + expect.hasAssertions(); + const serialized = collectionPointMock2.serialize(); + expect(serialized).toMatchInlineSnapshot(`{ + "address": { + "city": "Sao Paulo", + "complement": "Entrada Sul", + "coordinate": { + "latitude": -8.038912, + "longitude": -34.870932, + }, + "district": "Vila Mariana", + "number": "123", + "state": "SP", + "street": "Rua Lorem Ipsum", + "zipcode": "04026-000", + }, + "bestCollectionDay": [ + "FRIDAY", + ], + "contact": { + "email": "H9k5y@example.com", + "name": "Matias Castro", + "phone": "1234567890", + "role": "ADMIN", + }, + "id": "361754a6-845b-419b-8f96-be1f01fa899e", + "name": "Edifício Residencial Lausanne", + "operatorId": "738515b5-6cc1-4db7-b6fd-b24a8929a0d8", + "responsible": undefined, + "selectiveCollectionDay": [ + "FRIDAY", + ], + "shifts": undefined, + "status": "ACTIVE", + "type": "APARTMENT", + "weeklyGlassVolume": 1000, +} + `); + }); +}); diff --git a/tests/smoke/collection-status.test.ts b/tests/smoke/collection-status.test.ts new file mode 100644 index 0000000..24f09a9 --- /dev/null +++ b/tests/smoke/collection-status.test.ts @@ -0,0 +1,10 @@ +import { CollectionStatus } from '../../src/domain/value-objects/collection-status'; + +describe('[smoke] basic collection status operations', () => { + it('should create a collection status and serialize', () => { + expect.hasAssertions(); + const status = CollectionStatus.create(CollectionStatus.enum.PENDING); + const serialized = status.serialize(); + expect(serialized).toMatchInlineSnapshot(`"PENDING"`); + }); +}); diff --git a/tests/smoke/collection.test.ts b/tests/smoke/collection.test.ts new file mode 100644 index 0000000..faba3ed --- /dev/null +++ b/tests/smoke/collection.test.ts @@ -0,0 +1,67 @@ +import { Collection } from '../../src/domain/entities/collection'; +import { CollectionStatus } from '../../src/domain/value-objects/collection-status'; +import { DateTime } from 'luxon'; +import { collectionPointMock1 } from '../mocks/collection-points-mock'; + +describe('[smoke] basic collection operations', () => { + it('should create a collection and serialize', () => { + expect.hasAssertions(); + const fixedDate = DateTime.fromISO('2025-02-06T22:17:03.196+00:00'); + const collection = Collection.create({ + id: '361754a6-845b-419b-8f96-be1f01fa899e', + collectionPoint: collectionPointMock1.serialize(), + routeId: 'f7f16595-8537-486b-9027-ee419435980c', + status: CollectionStatus.enum.PENDING, + date: fixedDate, + volumeCollected: 0, + }); + const serialized = collection.serialize(); + expect(serialized).toMatchInlineSnapshot(` + { + "collectionPoint": { + "address": { + "city": "Sao Paulo", + "complement": "Entrada Norte", + "coordinate": { + "latitude": -8.059377, + "longitude": -34.886952, + }, + "district": "Vila Mariana", + "number": "123", + "state": "SP", + "street": "Rua Dolor Sit", + "zipcode": "04026-000", + }, + "bestCollectionDay": [ + "FRIDAY", + ], + "contact": { + "email": "H9k5y@example.com", + "name": "Matias Castro", + "phone": "1234567890", + "role": "ADMIN", + }, + "id": "97f2ab4c-ef96-42a5-9da8-395f236c875e", + "name": "Edifício Itamarati", + "operatorId": "738515b5-6cc1-4db7-b6fd-b24a8929a0d8", + "responsible": undefined, + "selectiveCollectionDay": [ + "FRIDAY", + ], + "shifts": undefined, + "status": "ACTIVE", + "type": "APARTMENT", + "weeklyGlassVolume": 1000, + }, + "date": "2025-02-06T22:17:03.196+00:00", + "endTime": undefined, + "id": "361754a6-845b-419b-8f96-be1f01fa899e", + "notes": undefined, + "routeId": "f7f16595-8537-486b-9027-ee419435980c", + "startTime": undefined, + "status": "PENDING", + "volumeCollected": 0, + } + `); + }); +}); diff --git a/tests/smoke/comment..test.ts b/tests/smoke/comment..test.ts new file mode 100644 index 0000000..758fad5 --- /dev/null +++ b/tests/smoke/comment..test.ts @@ -0,0 +1,17 @@ +import { Comment } from '../../src/domain/value-objects/comment'; + +describe('[smoke] basic comment operations', () => { + it('should create a comment and serialize', () => { + expect.hasAssertions(); + const comment = Comment.create('Comentário de exemplo para a tarefa.'); + const serialized = comment.serialize(); + expect(serialized).toMatchInlineSnapshot('"Comentário de exemplo para a tarefa."'); + }); + + it('should create an empty comment and serialize', () => { + expect.hasAssertions(); + const comment = Comment.create(undefined); + const serialized = comment.serialize(); + expect(serialized).toMatchInlineSnapshot('undefined'); + }); +}); diff --git a/tests/smoke/coordinates.test.ts b/tests/smoke/coordinates.test.ts new file mode 100644 index 0000000..9db6a6a --- /dev/null +++ b/tests/smoke/coordinates.test.ts @@ -0,0 +1,18 @@ +import { Coordinates } from '../../src/domain/value-objects/coordinates'; + +describe('[smoke] basic coordinate pair operations', () => { + it('should create coordinate pair and serialize', () => { + expect.hasAssertions(); + const coordinate = Coordinates.create({ + latitude: -2, + longitude: 30, + }); + const serialized = coordinate.serialize(); + expect(serialized).toMatchInlineSnapshot(` + { + "latitude": -2, + "longitude": 30, + } + `); + }); +}); diff --git a/tests/smoke/reason.test.ts b/tests/smoke/reason.test.ts new file mode 100644 index 0000000..3543eee --- /dev/null +++ b/tests/smoke/reason.test.ts @@ -0,0 +1,17 @@ +import { Reason } from '../../src/domain/value-objects/reason'; + +describe('[smoke] basic reason operations', () => { + it('should create a reason and serialize', () => { + expect.hasAssertions(); + const reason = Reason.create('FINISHED'); + const serialized = reason.serialize(); + expect(serialized).toMatchInlineSnapshot('"FINISHED"'); + }); + + it('should handle empty reason and serialize', () => { + expect.hasAssertions(); + const reason = Reason.create(undefined); + const serialized = reason.serialize(); + expect(serialized).toMatchInlineSnapshot('undefined'); + }); +}); diff --git a/tests/smoke/route-status.test.ts b/tests/smoke/route-status.test.ts new file mode 100644 index 0000000..b885db7 --- /dev/null +++ b/tests/smoke/route-status.test.ts @@ -0,0 +1,17 @@ +import { RouteStatus } from '../../src/domain/value-objects/route-status'; + +describe('[smoke] basic route status operations', () => { + it('should create a route status and serialize', () => { + expect.hasAssertions(); + const status = RouteStatus.create(RouteStatus.enum.PENDING); + const serialized = status.serialize(); + expect(serialized).toMatchInlineSnapshot(`"PENDING"`); + }); + + it('should be able to have routes in progress', () => { + expect.hasAssertions(); + const status = RouteStatus.create(RouteStatus.enum.IN_PROGRESS); + const serialized = status.serialize(); + expect(serialized).toMatchInlineSnapshot(`"IN_PROGRESS"`); + }); +}); diff --git a/tests/smoke/route.test.ts b/tests/smoke/route.test.ts new file mode 100644 index 0000000..0b1d382 --- /dev/null +++ b/tests/smoke/route.test.ts @@ -0,0 +1,90 @@ +import { DateTime } from 'luxon'; +import { Route } from '../../src/domain/entities/route'; +import { RouteStatus } from '../../src/domain/value-objects/route-status'; +import { collectionPointMock1 } from '../mocks/collection-points-mock'; + +describe('[smoke] basic routes operations', () => { + it('should create a route and serialize', () => { + expect.hasAssertions(); + const fixedDate = DateTime.fromISO('2025-02-06T22:17:03.196+00:00'); + const route = Route.create({ + id: 'f7f16595-8537-486b-9027-ee419435980c', + name: 'Rota 1', + date: DateTime.fromISO('2024-12-16T12:00:00.000'), + totalDistanceKm: 40, + totalTimeMs: 1000 * 60 * 60 * 4, + status: RouteStatus.enum.PENDING, + collections: [ + { + id: '361754a6-845b-419b-8f96-be1f01fa899e', + collectionPoint: collectionPointMock1.serialize(), + routeId: 'f7f16595-8537-486b-9027-ee419435980c', + status: 'PENDING', + date: fixedDate, + volumeCollected: 0, + }, + ], + }); + const serialized = route.serialize(); + expect(serialized).toMatchInlineSnapshot(`{ + "collections": [ + { + "collectionPoint": { + "address": { + "city": "Sao Paulo", + "complement": "Entrada Norte", + "coordinate": { + "latitude": -8.059377, + "longitude": -34.886952, + }, + "district": "Vila Mariana", + "number": "123", + "state": "SP", + "street": "Rua Dolor Sit", + "zipcode": "04026-000", + }, + "bestCollectionDay": [ + "FRIDAY", + ], + "contact": { + "email": "H9k5y@example.com", + "name": "Matias Castro", + "phone": "1234567890", + "role": "ADMIN", + }, + "id": "97f2ab4c-ef96-42a5-9da8-395f236c875e", + "name": "Edifício Itamarati", + "operatorId": "738515b5-6cc1-4db7-b6fd-b24a8929a0d8", + "responsible": undefined, + "selectiveCollectionDay": [ + "FRIDAY", + ], + "shifts": undefined, + "status": "ACTIVE", + "type": "APARTMENT", + "weeklyGlassVolume": 1000, + }, + "date": "2025-02-06T22:17:03.196+00:00", + "endTime": undefined, + "id": "361754a6-845b-419b-8f96-be1f01fa899e", + "notes": undefined, + "routeId": "f7f16595-8537-486b-9027-ee419435980c", + "startTime": undefined, + "status": "PENDING", + "volumeCollected": 0, + }, + ], + "comment": undefined, + "date": "2024-12-16T12:00:00.000Z", + "executor": undefined, + "finishedAt": undefined, + "id": "f7f16595-8537-486b-9027-ee419435980c", + "name": "Rota 1", + "reason": undefined, + "startedAt": undefined, + "status": "PENDING", + "totalDistanceKm": 40, + "totalTimeMs": 14400000, +}`); + }); +}); diff --git a/tests/smoke/user.test.ts b/tests/smoke/user.test.ts new file mode 100644 index 0000000..324019b --- /dev/null +++ b/tests/smoke/user.test.ts @@ -0,0 +1,20 @@ +import { User } from '../../src/domain/entities/user'; + +describe('[smoke] basic users operations', () => { + it('should create a user and serialize', () => { + expect.hasAssertions(); + const user = User.create({ + id: '1f1309e9-498b-4892-9f8f-5c87d0dd83b9', + fullName: 'Motorista', + initials: 'MO', + }); + const serialized = user.serialize(); + expect(serialized).toMatchInlineSnapshot(` + { + "fullName": "Motorista", + "id": "1f1309e9-498b-4892-9f8f-5c87d0dd83b9", + "initials": "MO", + } + `); + }); +}); diff --git a/tests/smoke/vehicle.test.ts b/tests/smoke/vehicle.test.ts new file mode 100644 index 0000000..da9a9b8 --- /dev/null +++ b/tests/smoke/vehicle.test.ts @@ -0,0 +1,18 @@ +import { Vehicle } from '../../src/domain/entities/vehicle'; + +describe('[smoke] basic vehicles operations', () => { + it('should create a vehicle and serialize', () => { + expect.hasAssertions(); + const vehicle = Vehicle.create({ + id: 'ed3f0cc6-8836-4483-a2a3-b510f5fc6e8e', + name: 'TRIVIM 1', + }); + const serialized = vehicle.serialize(); + expect(serialized).toMatchInlineSnapshot(` + { + "id": "ed3f0cc6-8836-4483-a2a3-b510f5fc6e8e", + "name": "TRIVIM 1", + } + `); + }); +}); diff --git a/tests/unit/collection-points-prisma-mapper.test.ts b/tests/unit/collection-points-prisma-mapper.test.ts new file mode 100644 index 0000000..eb4998a --- /dev/null +++ b/tests/unit/collection-points-prisma-mapper.test.ts @@ -0,0 +1,11 @@ +import { CollectionPointsPrismaMapper } from '../../src/infra/repositories/collection-points-prisma-repository'; +import { collectionPointMock1 } from '../mocks/collection-points-mock'; + +type ToEntityInputType = Parameters[0]; +describe('Invert collection point prisma mapper', () => { + it('should be invertible', () => { + const inverse = CollectionPointsPrismaMapper.fromEntity(collectionPointMock1) as ToEntityInputType; + const reverse = CollectionPointsPrismaMapper.toEntity(inverse); + expect(reverse.serialize()).toEqual(collectionPointMock1.serialize()); + }); +}); diff --git a/tests/unit/collection-prisma-mapper.test.ts b/tests/unit/collection-prisma-mapper.test.ts new file mode 100644 index 0000000..b082290 --- /dev/null +++ b/tests/unit/collection-prisma-mapper.test.ts @@ -0,0 +1,27 @@ +import { DateTime } from 'luxon'; +import { Collection } from '../../src/domain/entities/collection'; +import { CollectionsPrismaMapper } from '../../src/infra/repositories/collections-prisma-repository'; +import { collectionPointPrismaMock1, collectionPointMock1 } from '../mocks/collection-points-mock'; + +type ToEntityInputType = Parameters[0]; +describe('Invert collection prisma mapper', () => { + it('should be invertible', () => { + const collection = Collection.create({ + collectionPoint: collectionPointMock1.serialize(), + date: DateTime.now(), + routeId: '97f2ab4c-ef96-42a5-9da8-395f236c875e', + status: 'PENDING', + volumeCollected: 1000, + notes: 'Test notes', + }); + + const inverse = CollectionsPrismaMapper.fromEntity(collection) as ToEntityInputType; + + const reverse = CollectionsPrismaMapper.toEntity({ + ...inverse, + collectionPoint: collectionPointPrismaMock1, + }); + + expect(reverse.serialize()).toEqual(collection.serialize()); + }); +}); diff --git a/tests/unit/route-actions.test.ts b/tests/unit/route-actions.test.ts new file mode 100644 index 0000000..4426d85 --- /dev/null +++ b/tests/unit/route-actions.test.ts @@ -0,0 +1,84 @@ +import { DateTime } from 'luxon'; +import { Route } from '../../src/domain/entities/route'; +import { User } from '../../src/domain/entities/user'; +import { RouteStatus } from '../../src/domain/value-objects/route-status'; +import { collectionPointMock1, collectionPointMock2 } from '../mocks/collection-points-mock'; + +describe('[unit] Route actions', () => { + const now = new Date('2024-12-20T10:20:30.000Z'); + + beforeEach(() => { + vi.useFakeTimers({ now }); + }); + + afterEach(() => { + vi.useRealTimers(); + }); + + // PET-167 + it('should start a route', () => { + expect.hasAssertions(); + const user = User.create({ fullName: 'John Doe', initials: 'JD' }); + const route = Route.create({ + name: 'Rota 1', + date: DateTime.fromISO('2024-12-16T12:00:00.000'), + totalDistanceKm: 40, + totalTimeMs: 14400000, + collections: [ + { + id: 'a323eadb-1ffc-4227-b4c4-0b9ee48d38a2', + status: 'PENDING', + date: DateTime.now(), + volumeCollected: 0, + routeId: 'f7f16595-8537-486b-9027-ee419435980c', + collectionPoint: collectionPointMock1.serialize(), + }, + { + id: '0f551194-1691-4e52-9094-d9e13a67cbf8', + status: 'PENDING', + date: DateTime.now(), + routeId: 'f7f16595-8537-486b-9027-ee419435980c', + volumeCollected: 0, + collectionPoint: collectionPointMock2.serialize(), + }, + ], + }); + + route.start(user); + expect(route.executor).toBe(user); + expect(route.startedAt?.toJSDate()).toEqual(now); + }); + + // PET-172 + it('should finish a route', () => { + expect.hasAssertions(); + const route = Route.create({ + name: 'Rota 1', + date: DateTime.fromISO('2024-12-16T12:00:00.000'), + totalDistanceKm: 40, + totalTimeMs: 14400000, + status: RouteStatus.enum.IN_PROGRESS, + collections: [ + { + id: 'a323eadb-1ffc-4227-b4c4-0b9ee48d38a2', + status: 'FINISHED', + date: DateTime.now(), + volumeCollected: 0, + routeId: 'f7f16595-8537-486b-9027-ee419435980c', + collectionPoint: collectionPointMock1.serialize(), + }, + + { + id: '0f551194-1691-4e52-9094-d9e13a67cbf8', + status: 'FINISHED', + date: DateTime.now(), + routeId: 'f7f16595-8537-486b-9027-ee419435980c', + volumeCollected: 0, + collectionPoint: collectionPointMock2.serialize(), + }, + ], + }); + route.finish(); + expect(route.finishedAt?.toJSDate()).toEqual(now); + }); +}); diff --git a/tests/unit/route-prisma-mapper-invert.test.ts b/tests/unit/route-prisma-mapper-invert.test.ts new file mode 100644 index 0000000..baee9e9 --- /dev/null +++ b/tests/unit/route-prisma-mapper-invert.test.ts @@ -0,0 +1,190 @@ +import { DateTime } from 'luxon'; +import { Route } from '../../src/domain/entities/route'; +import { RoutesPrismaMapper } from '../../src/infra/repositories/routes-prisma-repository'; + +type ToEntityInputType = Parameters[0]; +describe('Invert route prisma mapper', () => { + beforeEach(() => { + vi.useFakeTimers({ now: new Date('2025-01-06T10:20:30.000Z') }); + }); + + afterEach(() => { + vi.useRealTimers(); + }); + + it('should be invertible', () => { + const route = Route.create({ + name: 'Rota 1', + date: DateTime.now(), + totalDistanceKm: 10, + totalTimeMs: 10000, + collections: [ + { + id: 'a323eadb-1ffc-4227-b4c4-0b9ee48d38a2', + status: 'PENDING', + date: DateTime.now(), + volumeCollected: 0, + routeId: 'f7f16595-8537-486b-9027-ee419435980c', + collectionPoint: { + id: '97f2ab4c-ef96-42a5-9da8-395f236c875e', + name: 'Edifício Itamarati', + type: 'APARTMENT', + status: 'ACTIVE', + address: { + state: 'SP', + city: 'Sao Paulo', + zipcode: '04026-000', + number: '123', + district: 'Vila Mariana', + street: 'Rua Dolor Sit', + complement: 'Entrada Norte', + coordinate: { latitude: -8.059377, longitude: -34.886952 }, + }, + bestCollectionDay: ['FRIDAY'], + selectiveCollectionDay: ['FRIDAY'], + contact: { + name: 'Matias Castro', + role: 'ADMIN', + phone: '1234567890', + email: 'H9k5y@example.com', + }, + weeklyGlassVolume: 1000, + operatorId: '738515b5-6cc1-4db7-b6fd-b24a8929a0d8', + }, + }, + + { + id: '0f551194-1691-4e52-9094-d9e13a67cbf8', + status: 'PENDING', + date: DateTime.now(), + routeId: 'f7f16595-8537-486b-9027-ee419435980c', + volumeCollected: 0, + collectionPoint: { + id: '361754a6-845b-419b-8f96-be1f01fa899e', + name: 'Edifício Residencial Lausanne', + status: 'ACTIVE', + address: { + state: 'SP', + city: 'Sao Paulo', + zipcode: '04026-000', + number: '123', + district: 'Vila Mariana', + street: 'Rua Lorem Ipsum', + complement: 'Entrada Sul', + coordinate: { latitude: -8.038912, longitude: -34.870932 }, + }, + bestCollectionDay: ['FRIDAY'], + selectiveCollectionDay: ['FRIDAY'], + contact: { + name: 'Matias Castro', + role: 'ADMIN', + phone: '1234567890', + email: 'H9k5y@example.com', + }, + type: 'APARTMENT', + weeklyGlassVolume: 1000, + operatorId: '738515b5-6cc1-4db7-b6fd-b24a8929a0d8', + }, + }, + ], + }); + + const inverse = RoutesPrismaMapper.fromEntity(route) as ToEntityInputType; + + const reverse = RoutesPrismaMapper.toEntity({ + ...inverse, + collections: [ + { + id: 'a323eadb-1ffc-4227-b4c4-0b9ee48d38a2', + status: 'PENDING', + date: DateTime.now().toJSDate(), + volumeCollected: 0, + routeId: 'f7f16595-8537-486b-9027-ee419435980c', + collectionPointId: '97f2ab4c-ef96-42a5-9da8-395f236c875e', + startTime: null, + endTime: null, + notes: null, + createdAt: DateTime.now().toJSDate(), + updatedAt: DateTime.now().toJSDate(), + collectionPoint: { + id: '97f2ab4c-ef96-42a5-9da8-395f236c875e', + name: 'Edifício Itamarati', + type: 'APARTMENT', + status: 'ACTIVE', + address: JSON.stringify({ + state: 'SP', + city: 'Sao Paulo', + zipcode: '04026-000', + number: '123', + district: 'Vila Mariana', + street: 'Rua Dolor Sit', + complement: 'Entrada Norte', + coordinate: { latitude: -8.059377, longitude: -34.886952 }, + }), + bestCollectionDay: JSON.stringify(['FRIDAY']), + selectiveCollectionDay: JSON.stringify(['FRIDAY']), + contact: JSON.stringify({ + name: 'Matias Castro', + role: 'ADMIN', + phone: '1234567890', + email: 'H9k5y@example.com', + }), + relevantInfos: null, + responsible: null, + shifts: null, + weeklyGlassVolume: 1000, + operatorId: '738515b5-6cc1-4db7-b6fd-b24a8929a0d8', + createdAt: DateTime.now().toJSDate(), + updatedAt: DateTime.now().toJSDate(), + }, + }, + + { + id: '0f551194-1691-4e52-9094-d9e13a67cbf8', + status: 'PENDING', + date: DateTime.now().toJSDate(), + routeId: 'f7f16595-8537-486b-9027-ee419435980c', + volumeCollected: 0, + collectionPointId: '361754a6-845b-419b-8f96-be1f01fa899e', + startTime: null, + endTime: null, + notes: null, + createdAt: DateTime.now().toJSDate(), + updatedAt: DateTime.now().toJSDate(), + collectionPoint: { + id: '361754a6-845b-419b-8f96-be1f01fa899e', + name: 'Edifício Residencial Lausanne', + type: 'APARTMENT', + status: 'ACTIVE', + address: JSON.stringify({ + state: 'SP', + city: 'Sao Paulo', + zipcode: '04026-000', + number: '123', + district: 'Vila Mariana', + street: 'Rua Lorem Ipsum', + complement: 'Entrada Sul', + coordinate: { latitude: -8.038912, longitude: -34.870932 }, + }), + bestCollectionDay: JSON.stringify(['FRIDAY']), + selectiveCollectionDay: JSON.stringify(['FRIDAY']), + contact: JSON.stringify({ + name: 'Matias Castro', + role: 'ADMIN', + phone: '1234567890', + email: 'H9k5y@example.com', + }), + relevantInfos: null, + responsible: null, + shifts: null, + weeklyGlassVolume: 1000, + operatorId: '738515b5-6cc1-4db7-b6fd-b24a8929a0d8', + createdAt: DateTime.now().toJSDate(), + updatedAt: DateTime.now().toJSDate(), + }, + }, + ], + }); + expect(reverse.serialize()).toEqual(route.serialize()); + }); +}); diff --git a/tests/unit/user-prisma-mapper-invert.test.ts b/tests/unit/user-prisma-mapper-invert.test.ts new file mode 100644 index 0000000..b99a2b0 --- /dev/null +++ b/tests/unit/user-prisma-mapper-invert.test.ts @@ -0,0 +1,20 @@ +import { UsersPrismaMapper } from '../../src/infra/repositories/users-prisma-repository'; +import { User } from '../../src/domain/entities/user'; + +type ToEntityInputType = Parameters[0]; +describe('Invert user prisma mapper', () => { + beforeEach(() => { + vi.useFakeTimers({ now: new Date('2025-01-06T10:20:30.000Z') }); + }); + + afterEach(() => { + vi.useRealTimers(); + }); + + it('should be invertible', () => { + const user = User.create({ id: '1f1309e9-498b-4892-9f8f-5c87d0dd83b9', fullName: 'Motorista', initials: 'MO' }); + const inverse = UsersPrismaMapper.fromEntity(user) as ToEntityInputType; + const reverse = UsersPrismaMapper.toEntity(inverse); + expect(reverse.serialize()).toEqual(user.serialize()); + }); +}); diff --git a/tests/unit/user-routes-rules.test.ts b/tests/unit/user-routes-rules.test.ts new file mode 100644 index 0000000..9768480 --- /dev/null +++ b/tests/unit/user-routes-rules.test.ts @@ -0,0 +1,27 @@ +import { RoutesMockRepository } from '../../src/infra/repositories/routes-mock-repository'; +import { UserRoutesRules } from '../../src/domain/services/user-service'; +import { BusinessRuleViolationProblem } from '../../src/infra/errors/business-rule-violation'; + +describe('[unit] User route rules', () => { + // PET-205 + it('should ensure has single route in progress', () => { + expect.hasAssertions(); + const routesRepository = new RoutesMockRepository(false); + + const result = new UserRoutesRules(routesRepository).ensureHasSingleRouteInProgress( + 'f7f16595-8537-486b-9027-ee419435980c', + ); + + expect(result).resolves.toBeUndefined(); + }); + it('should not ensure has single route in progress', () => { + expect.hasAssertions(); + const routesRepository = new RoutesMockRepository(true); + + const result = new UserRoutesRules(routesRepository).ensureHasSingleRouteInProgress( + 'f7f16595-8537-486b-9027-ee419435980c', + ); + + expect(result).rejects.toThrowError(BusinessRuleViolationProblem); + }); +}); diff --git a/tests/unit/vehicle-prisma-mapper-invert.test.ts b/tests/unit/vehicle-prisma-mapper-invert.test.ts new file mode 100644 index 0000000..9af343a --- /dev/null +++ b/tests/unit/vehicle-prisma-mapper-invert.test.ts @@ -0,0 +1,20 @@ +import { VehiclesPrismaMapper } from '../../src/infra/repositories/vehicles-prisma-repository'; +import { Vehicle } from '../../src/domain/entities/vehicle'; + +type ToEntityInputType = Parameters[0]; +describe('Invert vehicle prisma mapper', () => { + beforeEach(() => { + vi.useFakeTimers({ now: new Date('2025-01-06T10:20:30.000Z') }); + }); + + afterEach(() => { + vi.useRealTimers(); + }); + + it('should be invertible', () => { + const vehicle = Vehicle.create({ id: 'ed3f0cc6-8836-4483-a2a3-b510f5fc6e8e', name: 'TRIVIM 1' }); + const inverse = VehiclesPrismaMapper.fromEntity(vehicle) as ToEntityInputType; + const reverse = VehiclesPrismaMapper.toEntity(inverse); + expect(reverse.serialize()).toEqual(vehicle.serialize()); + }); +}); diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000..79e998d --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,115 @@ +{ + "compilerOptions": { + /* Visit https://aka.ms/tsconfig to read more about this file */ + /* Projects */ + // "incremental": true, /* Save .tsbuildinfo files to allow for incremental compilation of projects. */ + // "composite": true, /* Enable constraints that allow a TypeScript project to be used with project references. */ + // "tsBuildInfoFile": "./.tsbuildinfo", /* Specify the path to .tsbuildinfo incremental compilation file. */ + // "disableSourceOfProjectReferenceRedirect": true, /* Disable preferring source files instead of declaration files when referencing composite projects. */ + // "disableSolutionSearching": true, /* Opt a project out of multi-project reference checking when editing. */ + // "disableReferencedProjectLoad": true, /* Reduce the number of projects loaded automatically by TypeScript. */ + /* Language and Environment */ + "target": "ESNext" /* Set the JavaScript language version for emitted JavaScript and include compatible library declarations. */, + // "lib": [], /* Specify a set of bundled library declaration files that describe the target runtime environment. */ + // "jsx": "preserve", /* Specify what JSX code is generated. */ + // "experimentalDecorators": true, /* Enable experimental support for legacy experimental decorators. */ + // "emitDecoratorMetadata": true, /* Emit design-type metadata for decorated declarations in source files. */ + // "jsxFactory": "", /* Specify the JSX factory function used when targeting React JSX emit, e.g. 'React.createElement' or 'h'. */ + // "jsxFragmentFactory": "", /* Specify the JSX Fragment reference used for fragments when targeting React JSX emit e.g. 'React.Fragment' or 'Fragment'. */ + // "jsxImportSource": "", /* Specify module specifier used to import the JSX factory functions when using 'jsx: react-jsx*'. */ + // "reactNamespace": "", /* Specify the object invoked for 'createElement'. This only applies when targeting 'react' JSX emit. */ + // "noLib": true, /* Disable including any library files, including the default lib.d.ts. */ + // "useDefineForClassFields": true, /* Emit ECMAScript-standard-compliant class fields. */ + // "moduleDetection": "auto", /* Control what method is used to detect module-format JS files. */ + /* Modules */ + "module": "ESNext" /* Specify what module code is generated. */, + //"rootDir": "./src" /* Specify the root folder within your source files. */, + "moduleResolution": "Node" /* Specify how TypeScript looks up a file from a given module specifier. */, + // "baseUrl": "./", /* Specify the base directory to resolve non-relative module names. */ + // "paths": {}, /* Specify a set of entries that re-map imports to additional lookup locations. */ + // "rootDirs": [], /* Allow multiple folders to be treated as one when resolving modules. */ + // "typeRoots": [], /* Specify multiple folders that act like './node_modules/@types'. */ + "types": [ + "vitest/globals" + ] /* Specify type package names to be included without being referenced in a source file. */, + // "allowUmdGlobalAccess": true, /* Allow accessing UMD globals from modules. */ + // "moduleSuffixes": [], /* List of file name suffixes to search when resolving a module. */ + // "allowImportingTsExtensions": true, /* Allow imports to include TypeScript file extensions. Requires '--moduleResolution bundler' and either '--noEmit' or '--emitDeclarationOnly' to be set. */ + // "resolvePackageJsonExports": true, /* Use the package.json 'exports' field when resolving package imports. */ + // "resolvePackageJsonImports": true, /* Use the package.json 'imports' field when resolving imports. */ + // "customConditions": [], /* Conditions to set in addition to the resolver-specific defaults when resolving imports. */ + // "resolveJsonModule": true /* Enable importing .json files. */, + "allowArbitraryExtensions": true /* Enable importing files with any extension, provided a declaration file is present. */, + // "noResolve": true, /* Disallow 'import's, 'require's or ''s from expanding the number of files TypeScript should add to a project. */ + /* JavaScript Support */ + // "allowJs": true /* Allow JavaScript files to be a part of your program. Use the 'checkJS' option to get errors from these files. */, + "checkJs": true /* Enable error reporting in type-checked JavaScript files. */, + // "maxNodeModuleJsDepth": 1, /* Specify the maximum folder depth used for checking JavaScript files from 'node_modules'. Only applicable with 'allowJs'. */ + /* Emit */ + // "declaration": true, /* Generate .d.ts files from TypeScript and JavaScript files in your project. */ + // "declarationMap": true, /* Create sourcemaps for d.ts files. */ + // "emitDeclarationOnly": true, /* Only output d.ts files and not JavaScript files. */ + "sourceMap": true /* Create source map files for emitted JavaScript files. */, + // "inlineSourceMap": true, /* Include sourcemap files inside the emitted JavaScript. */ + // "outFile": "./", /* Specify a file that bundles all outputs into one JavaScript file. If 'declaration' is true, also designates a file that bundles all .d.ts output. */ + "outDir": "./dist" /* Specify an output folder for all emitted files. */, + "removeComments": true /* Disable emitting comments. */, + // "noEmit": true, /* Disable emitting files from a compilation. */ + // "importHelpers": true, /* Allow importing helper functions from tslib once per project, instead of including them per-file. */ + // "importsNotUsedAsValues": "remove", /* Specify emit/checking behavior for imports that are only used for types. */ + // "downlevelIteration": true, /* Emit more compliant, but verbose and less performant JavaScript for iteration. */ + // "sourceRoot": "", /* Specify the root path for debuggers to find the reference source code. */ + // "mapRoot": "", /* Specify the location where debugger should locate map files instead of generated locations. */ + // "inlineSources": true, /* Include source code in the sourcemaps inside the emitted JavaScript. */ + // "emitBOM": true, /* Emit a UTF-8 Byte Order Mark (BOM) in the beginning of output files. */ + // "newLine": "crlf", /* Set the newline character for emitting files. */ + // "stripInternal": true, /* Disable emitting declarations that have '@internal' in their JSDoc comments. */ + // "noEmitHelpers": true, /* Disable generating custom helper functions like '__extends' in compiled output. */ + // "noEmitOnError": true, /* Disable emitting files if any type checking errors are reported. */ + // "preserveConstEnums": true, /* Disable erasing 'const enum' declarations in generated code. */ + // "declarationDir": "./", /* Specify the output directory for generated declaration files. */ + // "preserveValueImports": true, /* Preserve unused imported values in the JavaScript output that would otherwise be removed. */ + /* Interop Constraints */ + // "isolatedModules": true, /* Ensure that each file can be safely transpiled without relying on other imports. */ + // "verbatimModuleSyntax": true, /* Do not transform or elide any imports or exports not marked as type-only, ensuring they are written in the output file's format based on the 'module' setting. */ + "allowSyntheticDefaultImports": true /* Allow 'import x from y' when a module doesn't have a default export. */, + "esModuleInterop": true /* Emit additional JavaScript to ease support for importing CommonJS modules. This enables 'allowSyntheticDefaultImports' for type compatibility. */, + // "preserveSymlinks": true, /* Disable resolving symlinks to their realpath. This correlates to the same flag in node. */ + "forceConsistentCasingInFileNames": true /* Ensure that casing is correct in imports. */, + /* Type Checking */ + "strict": true /* Enable all strict type-checking options. */, + "noImplicitAny": true /* Enable error reporting for expressions and declarations with an implied 'any' type. */, + "strictNullChecks": true /* When type checking, take into account 'null' and 'undefined'. */, + "strictFunctionTypes": true /* When assigning functions, check to ensure parameters and the return values are subtype-compatible. */, + "strictBindCallApply": true /* Check that the arguments for 'bind', 'call', and 'apply' methods match the original function. */, + "strictPropertyInitialization": true /* Check for class properties that are declared but not set in the constructor. */, + "noImplicitThis": true /* Enable error reporting when 'this' is given the type 'any'. */, + "useUnknownInCatchVariables": true /* Default catch clause variables as 'unknown' instead of 'any'. */, + "alwaysStrict": true /* Ensure 'use strict' is always emitted. */, + "noUnusedLocals": true /* Enable error reporting when local variables aren't read. */, + "noUnusedParameters": true /* Raise an error when a function parameter isn't read. */, + "exactOptionalPropertyTypes": false /* Interpret optional property types as written, rather than adding 'undefined'. */, + "noImplicitReturns": true /* Enable error reporting for codepaths that do not explicitly return in a function. */, + "noFallthroughCasesInSwitch": true /* Enable error reporting for fallthrough cases in switch statements. */, + "noUncheckedIndexedAccess": true /* Add 'undefined' to a type when accessed using an index. */, + "noImplicitOverride": true /* Ensure overriding members in derived classes are marked with an override modifier. */, + "noPropertyAccessFromIndexSignature": true /* Enforces using indexed accessors for keys declared using an indexed type. */, + // "allowUnusedLabels": true, /* Disable error reporting for unused labels. */ + // "allowUnreachableCode": true, /* Disable error reporting for unreachable code. */ + /* Completeness */ + // "skipDefaultLibCheck": true, /* Skip type checking .d.ts files that are included with TypeScript. */ + "skipLibCheck": true /* Skip type checking all .d.ts files. */ + }, + "include": [ + "src", + "tests", + "vitest.config.ts", + ".waitonrc.cjs", + "prisma/seed.ts", + ".license-compliancerc.mjs", + ], + "exclude": [ + "node_modules", + "dist" + ] +} \ No newline at end of file diff --git a/vitest.config.ts b/vitest.config.ts new file mode 100644 index 0000000..2a8bbae --- /dev/null +++ b/vitest.config.ts @@ -0,0 +1,12 @@ +import { defineConfig } from "vitest/config"; + +export default defineConfig({ + test: { + globals: true, + reporters: ["verbose"], + coverage: { + provider: "istanbul", + reporter: ["text", "json", "html"], + }, + }, +}); diff --git a/yarn.lock b/yarn.lock new file mode 100644 index 0000000..82618f9 --- /dev/null +++ b/yarn.lock @@ -0,0 +1,12526 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +"@alcalzone/ansi-tokenize@^0.1.3": + version "0.1.3" + resolved "https://registry.npmjs.org/@alcalzone/ansi-tokenize/-/ansi-tokenize-0.1.3.tgz" + integrity sha512-3yWxPTq3UQ/FY9p1ErPxIyfT64elWaMvM9lIHnaqpyft63tkxodF5aUElYHrdisWve5cETkh1+KBw1yJuW0aRw== + dependencies: + ansi-styles "^6.2.1" + is-fullwidth-code-point "^4.0.0" + +"@ampproject/remapping@^2.2.0": + version "2.3.0" + resolved "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz" + integrity sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw== + dependencies: + "@jridgewell/gen-mapping" "^0.3.5" + "@jridgewell/trace-mapping" "^0.3.24" + +"@artilleryio/int-commons@2.12.0": + version "2.12.0" + resolved "https://registry.npmjs.org/@artilleryio/int-commons/-/int-commons-2.12.0.tgz" + integrity sha512-2DVvB0txMlu7iCiipbHapif81K/8HKzGFR+ezkICzwWGotyzp9QcZXMmyfJgmgsWkVUWGOWX48ZTLmSINH+bQw== + dependencies: + async "^2.6.4" + cheerio "^1.0.0-rc.10" + debug "^4.3.1" + deep-for-each "^3.0.0" + espree "^9.4.1" + jsonpath-plus "^10.0.0" + lodash "^4.17.19" + ms "^2.1.3" + +"@artilleryio/int-core@2.16.0": + version "2.16.0" + resolved "https://registry.npmjs.org/@artilleryio/int-core/-/int-core-2.16.0.tgz" + integrity sha512-dWtwjg33TpP7DIVuRHstRCZm4o3iNFg+qSxL1FrJ70DreK1cDFn4fNv9t3iOsoQ/dEnQtoybuTF5m2Cbq+9ssA== + dependencies: + "@artilleryio/int-commons" "2.12.0" + "@artilleryio/sketches-js" "^2.1.1" + agentkeepalive "^4.1.0" + arrivals "^2.1.2" + async "^2.6.4" + chalk "^2.4.2" + cheerio "^1.0.0-rc.10" + cookie-parser "^1.4.3" + csv-parse "^4.16.3" + debug "^4.3.1" + decompress-response "^6.0.0" + deep-for-each "^3.0.0" + driftless "^2.0.3" + esprima "^4.0.0" + eventemitter3 "^4.0.4" + fast-deep-equal "^3.1.3" + filtrex "^0.5.4" + form-data "^3.0.0" + got "^11.8.5" + hpagent "^0.1.1" + https-proxy-agent "^5.0.0" + lodash "^4.17.19" + ms "^2.1.3" + protobufjs "^7.2.4" + socket.io-client "^4.5.1" + socketio-wildcard "^2.0.0" + tough-cookie "^5.0.0-rc.2" + uuid "^8.0.0" + ws "^7.5.7" + +"@artilleryio/sketches-js@^2.1.1": + version "2.1.1" + resolved "https://registry.npmjs.org/@artilleryio/sketches-js/-/sketches-js-2.1.1.tgz" + integrity sha512-H3D50vDb37E3NGYXY0eUFAm5++moElaqoAu0MWYZhgzaA3IT2E67bRCL8U4LKHuVf/MgDZk14uawIjc4WVjOUQ== + +"@asteasolutions/zod-to-openapi@^7.3.0": + version "7.3.0" + resolved "https://registry.npmjs.org/@asteasolutions/zod-to-openapi/-/zod-to-openapi-7.3.0.tgz" + integrity sha512-7tE/r1gXwMIvGnXVUdIqUhCU1RevEFC4Jk6Bussa0fk1ecbnnINkZzj1EOAJyE/M3AI25DnHT/zKQL1/FPFi8Q== + dependencies: + openapi3-ts "^4.1.2" + +"@aws-crypto/crc32@5.2.0": + version "5.2.0" + resolved "https://registry.yarnpkg.com/@aws-crypto/crc32/-/crc32-5.2.0.tgz#cfcc22570949c98c6689cfcbd2d693d36cdae2e1" + integrity sha512-nLbCWqQNgUiwwtFsen1AdzAtvuLRsQS8rYgMuxCrdKf9kOssamGLuPwyTY9wyYblNr9+1XM8v6zoDTPPSIeANg== + dependencies: + "@aws-crypto/util" "^5.2.0" + "@aws-sdk/types" "^3.222.0" + tslib "^2.6.2" + +"@aws-crypto/crc32c@5.2.0": + version "5.2.0" + resolved "https://registry.yarnpkg.com/@aws-crypto/crc32c/-/crc32c-5.2.0.tgz#4e34aab7f419307821509a98b9b08e84e0c1917e" + integrity sha512-+iWb8qaHLYKrNvGRbiYRHSdKRWhto5XlZUEBwDjYNf+ly5SVYG6zEoYIdxvf5R3zyeP16w4PLBn3rH1xc74Rag== + dependencies: + "@aws-crypto/util" "^5.2.0" + "@aws-sdk/types" "^3.222.0" + tslib "^2.6.2" + +"@aws-crypto/sha1-browser@5.2.0": + version "5.2.0" + resolved "https://registry.yarnpkg.com/@aws-crypto/sha1-browser/-/sha1-browser-5.2.0.tgz#b0ee2d2821d3861f017e965ef3b4cb38e3b6a0f4" + integrity sha512-OH6lveCFfcDjX4dbAvCFSYUjJZjDr/3XJ3xHtjn3Oj5b9RjojQo8npoLeA/bNwkOkrSQ0wgrHzXk4tDRxGKJeg== + dependencies: + "@aws-crypto/supports-web-crypto" "^5.2.0" + "@aws-crypto/util" "^5.2.0" + "@aws-sdk/types" "^3.222.0" + "@aws-sdk/util-locate-window" "^3.0.0" + "@smithy/util-utf8" "^2.0.0" + tslib "^2.6.2" + +"@aws-crypto/sha256-browser@5.2.0": + version "5.2.0" + resolved "https://registry.npmjs.org/@aws-crypto/sha256-browser/-/sha256-browser-5.2.0.tgz" + integrity sha512-AXfN/lGotSQwu6HNcEsIASo7kWXZ5HYWvfOmSNKDsEqC4OashTp8alTmaz+F7TC2L083SFv5RdB+qU3Vs1kZqw== + dependencies: + "@aws-crypto/sha256-js" "^5.2.0" + "@aws-crypto/supports-web-crypto" "^5.2.0" + "@aws-crypto/util" "^5.2.0" + "@aws-sdk/types" "^3.222.0" + "@aws-sdk/util-locate-window" "^3.0.0" + "@smithy/util-utf8" "^2.0.0" + tslib "^2.6.2" + +"@aws-crypto/sha256-js@5.2.0", "@aws-crypto/sha256-js@^5.2.0": + version "5.2.0" + resolved "https://registry.npmjs.org/@aws-crypto/sha256-js/-/sha256-js-5.2.0.tgz" + integrity sha512-FFQQyu7edu4ufvIZ+OadFpHHOt+eSTBaYaki44c+akjg7qZg9oOQeLlk77F6tSYqjDAFClrHJk9tMf0HdVyOvA== + dependencies: + "@aws-crypto/util" "^5.2.0" + "@aws-sdk/types" "^3.222.0" + tslib "^2.6.2" + +"@aws-crypto/supports-web-crypto@^5.2.0": + version "5.2.0" + resolved "https://registry.npmjs.org/@aws-crypto/supports-web-crypto/-/supports-web-crypto-5.2.0.tgz" + integrity sha512-iAvUotm021kM33eCdNfwIN//F77/IADDSs58i+MDaOqFrVjZo9bAal0NK7HurRuWLLpF1iLX7gbWrjHjeo+YFg== + dependencies: + tslib "^2.6.2" + +"@aws-crypto/util@5.2.0", "@aws-crypto/util@^5.2.0": + version "5.2.0" + resolved "https://registry.npmjs.org/@aws-crypto/util/-/util-5.2.0.tgz" + integrity sha512-4RkU9EsI6ZpBve5fseQlGNUWKMa1RLPQ1dnjnQoe07ldfIzcsGb5hC5W0Dm7u423KWzawlrpbjXBrXCEv9zazQ== + dependencies: + "@aws-sdk/types" "^3.222.0" + "@smithy/util-utf8" "^2.0.0" + tslib "^2.6.2" + +"@aws-sdk/client-cloudwatch@^3.370.0": + version "3.714.0" + resolved "https://registry.npmjs.org/@aws-sdk/client-cloudwatch/-/client-cloudwatch-3.714.0.tgz" + integrity sha512-eNZYqb/gjA0WkRZtiVKwef01ovWDWglQox2lioWF3T5LkwEwHi0wV9Lc4k8s/6NW2wxXUPPUik1Kh4yG4JBEfA== + dependencies: + "@aws-crypto/sha256-browser" "5.2.0" + "@aws-crypto/sha256-js" "5.2.0" + "@aws-sdk/client-sso-oidc" "3.714.0" + "@aws-sdk/client-sts" "3.714.0" + "@aws-sdk/core" "3.714.0" + "@aws-sdk/credential-provider-node" "3.714.0" + "@aws-sdk/middleware-host-header" "3.714.0" + "@aws-sdk/middleware-logger" "3.714.0" + "@aws-sdk/middleware-recursion-detection" "3.714.0" + "@aws-sdk/middleware-user-agent" "3.714.0" + "@aws-sdk/region-config-resolver" "3.714.0" + "@aws-sdk/types" "3.714.0" + "@aws-sdk/util-endpoints" "3.714.0" + "@aws-sdk/util-user-agent-browser" "3.714.0" + "@aws-sdk/util-user-agent-node" "3.714.0" + "@smithy/config-resolver" "^3.0.13" + "@smithy/core" "^2.5.5" + "@smithy/fetch-http-handler" "^4.1.2" + "@smithy/hash-node" "^3.0.11" + "@smithy/invalid-dependency" "^3.0.11" + "@smithy/middleware-compression" "^3.1.5" + "@smithy/middleware-content-length" "^3.0.13" + "@smithy/middleware-endpoint" "^3.2.5" + "@smithy/middleware-retry" "^3.0.30" + "@smithy/middleware-serde" "^3.0.11" + "@smithy/middleware-stack" "^3.0.11" + "@smithy/node-config-provider" "^3.1.12" + "@smithy/node-http-handler" "^3.3.2" + "@smithy/protocol-http" "^4.1.8" + "@smithy/smithy-client" "^3.5.0" + "@smithy/types" "^3.7.2" + "@smithy/url-parser" "^3.0.11" + "@smithy/util-base64" "^3.0.0" + "@smithy/util-body-length-browser" "^3.0.0" + "@smithy/util-body-length-node" "^3.0.0" + "@smithy/util-defaults-mode-browser" "^3.0.30" + "@smithy/util-defaults-mode-node" "^3.0.30" + "@smithy/util-endpoints" "^2.1.7" + "@smithy/util-middleware" "^3.0.11" + "@smithy/util-retry" "^3.0.11" + "@smithy/util-utf8" "^3.0.0" + "@smithy/util-waiter" "^3.2.0" + tslib "^2.6.2" + +"@aws-sdk/client-cognito-identity@3.658.1": + version "3.658.1" + resolved "https://registry.npmjs.org/@aws-sdk/client-cognito-identity/-/client-cognito-identity-3.658.1.tgz" + integrity sha512-MCYLKmNy0FlNT9TvXfOxj0jh+ZQq+G9qEy/VZqu3JsQSgiFvFRdzgzcbQ9gQx7fZrDC/TPdABOTh483zI4cu9g== + dependencies: + "@aws-crypto/sha256-browser" "5.2.0" + "@aws-crypto/sha256-js" "5.2.0" + "@aws-sdk/client-sso-oidc" "3.658.1" + "@aws-sdk/client-sts" "3.658.1" + "@aws-sdk/core" "3.658.1" + "@aws-sdk/credential-provider-node" "3.658.1" + "@aws-sdk/middleware-host-header" "3.654.0" + "@aws-sdk/middleware-logger" "3.654.0" + "@aws-sdk/middleware-recursion-detection" "3.654.0" + "@aws-sdk/middleware-user-agent" "3.654.0" + "@aws-sdk/region-config-resolver" "3.654.0" + "@aws-sdk/types" "3.654.0" + "@aws-sdk/util-endpoints" "3.654.0" + "@aws-sdk/util-user-agent-browser" "3.654.0" + "@aws-sdk/util-user-agent-node" "3.654.0" + "@smithy/config-resolver" "^3.0.8" + "@smithy/core" "^2.4.6" + "@smithy/fetch-http-handler" "^3.2.8" + "@smithy/hash-node" "^3.0.6" + "@smithy/invalid-dependency" "^3.0.6" + "@smithy/middleware-content-length" "^3.0.8" + "@smithy/middleware-endpoint" "^3.1.3" + "@smithy/middleware-retry" "^3.0.21" + "@smithy/middleware-serde" "^3.0.6" + "@smithy/middleware-stack" "^3.0.6" + "@smithy/node-config-provider" "^3.1.7" + "@smithy/node-http-handler" "^3.2.3" + "@smithy/protocol-http" "^4.1.3" + "@smithy/smithy-client" "^3.3.5" + "@smithy/types" "^3.4.2" + "@smithy/url-parser" "^3.0.6" + "@smithy/util-base64" "^3.0.0" + "@smithy/util-body-length-browser" "^3.0.0" + "@smithy/util-body-length-node" "^3.0.0" + "@smithy/util-defaults-mode-browser" "^3.0.21" + "@smithy/util-defaults-mode-node" "^3.0.21" + "@smithy/util-endpoints" "^2.1.2" + "@smithy/util-middleware" "^3.0.6" + "@smithy/util-retry" "^3.0.6" + "@smithy/util-utf8" "^3.0.0" + tslib "^2.6.2" + +"@aws-sdk/client-cognito-identity@3.714.0": + version "3.714.0" + resolved "https://registry.npmjs.org/@aws-sdk/client-cognito-identity/-/client-cognito-identity-3.714.0.tgz" + integrity sha512-gNaOcOD8DvFL234wvsXm/F6w3Gr8OHQWIKyRhyulXtohvluEnUCD0yb7+O07zngO+EUpA/KC0s1JeLw9VNTSkA== + dependencies: + "@aws-crypto/sha256-browser" "5.2.0" + "@aws-crypto/sha256-js" "5.2.0" + "@aws-sdk/client-sso-oidc" "3.714.0" + "@aws-sdk/client-sts" "3.714.0" + "@aws-sdk/core" "3.714.0" + "@aws-sdk/credential-provider-node" "3.714.0" + "@aws-sdk/middleware-host-header" "3.714.0" + "@aws-sdk/middleware-logger" "3.714.0" + "@aws-sdk/middleware-recursion-detection" "3.714.0" + "@aws-sdk/middleware-user-agent" "3.714.0" + "@aws-sdk/region-config-resolver" "3.714.0" + "@aws-sdk/types" "3.714.0" + "@aws-sdk/util-endpoints" "3.714.0" + "@aws-sdk/util-user-agent-browser" "3.714.0" + "@aws-sdk/util-user-agent-node" "3.714.0" + "@smithy/config-resolver" "^3.0.13" + "@smithy/core" "^2.5.5" + "@smithy/fetch-http-handler" "^4.1.2" + "@smithy/hash-node" "^3.0.11" + "@smithy/invalid-dependency" "^3.0.11" + "@smithy/middleware-content-length" "^3.0.13" + "@smithy/middleware-endpoint" "^3.2.5" + "@smithy/middleware-retry" "^3.0.30" + "@smithy/middleware-serde" "^3.0.11" + "@smithy/middleware-stack" "^3.0.11" + "@smithy/node-config-provider" "^3.1.12" + "@smithy/node-http-handler" "^3.3.2" + "@smithy/protocol-http" "^4.1.8" + "@smithy/smithy-client" "^3.5.0" + "@smithy/types" "^3.7.2" + "@smithy/url-parser" "^3.0.11" + "@smithy/util-base64" "^3.0.0" + "@smithy/util-body-length-browser" "^3.0.0" + "@smithy/util-body-length-node" "^3.0.0" + "@smithy/util-defaults-mode-browser" "^3.0.30" + "@smithy/util-defaults-mode-node" "^3.0.30" + "@smithy/util-endpoints" "^2.1.7" + "@smithy/util-middleware" "^3.0.11" + "@smithy/util-retry" "^3.0.11" + "@smithy/util-utf8" "^3.0.0" + tslib "^2.6.2" + +"@aws-sdk/client-s3@^3.744.0": + version "3.744.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/client-s3/-/client-s3-3.744.0.tgz#af500490c8bbe5c2ee2a8138b464d62dc71f134e" + integrity sha512-UuiqxVI5FKlnNcWoDP8bsyJcMJa7XjGcCbVCfKSpSboNeBM4tQS3ZIViSYuz+BeO8/MuwCy7hKn7+Zjivit1nA== + dependencies: + "@aws-crypto/sha1-browser" "5.2.0" + "@aws-crypto/sha256-browser" "5.2.0" + "@aws-crypto/sha256-js" "5.2.0" + "@aws-sdk/core" "3.744.0" + "@aws-sdk/credential-provider-node" "3.744.0" + "@aws-sdk/middleware-bucket-endpoint" "3.734.0" + "@aws-sdk/middleware-expect-continue" "3.734.0" + "@aws-sdk/middleware-flexible-checksums" "3.744.0" + "@aws-sdk/middleware-host-header" "3.734.0" + "@aws-sdk/middleware-location-constraint" "3.734.0" + "@aws-sdk/middleware-logger" "3.734.0" + "@aws-sdk/middleware-recursion-detection" "3.734.0" + "@aws-sdk/middleware-sdk-s3" "3.744.0" + "@aws-sdk/middleware-ssec" "3.734.0" + "@aws-sdk/middleware-user-agent" "3.744.0" + "@aws-sdk/region-config-resolver" "3.734.0" + "@aws-sdk/signature-v4-multi-region" "3.744.0" + "@aws-sdk/types" "3.734.0" + "@aws-sdk/util-endpoints" "3.743.0" + "@aws-sdk/util-user-agent-browser" "3.734.0" + "@aws-sdk/util-user-agent-node" "3.744.0" + "@aws-sdk/xml-builder" "3.734.0" + "@smithy/config-resolver" "^4.0.1" + "@smithy/core" "^3.1.2" + "@smithy/eventstream-serde-browser" "^4.0.1" + "@smithy/eventstream-serde-config-resolver" "^4.0.1" + "@smithy/eventstream-serde-node" "^4.0.1" + "@smithy/fetch-http-handler" "^5.0.1" + "@smithy/hash-blob-browser" "^4.0.1" + "@smithy/hash-node" "^4.0.1" + "@smithy/hash-stream-node" "^4.0.1" + "@smithy/invalid-dependency" "^4.0.1" + "@smithy/md5-js" "^4.0.1" + "@smithy/middleware-content-length" "^4.0.1" + "@smithy/middleware-endpoint" "^4.0.3" + "@smithy/middleware-retry" "^4.0.4" + "@smithy/middleware-serde" "^4.0.2" + "@smithy/middleware-stack" "^4.0.1" + "@smithy/node-config-provider" "^4.0.1" + "@smithy/node-http-handler" "^4.0.2" + "@smithy/protocol-http" "^5.0.1" + "@smithy/smithy-client" "^4.1.3" + "@smithy/types" "^4.1.0" + "@smithy/url-parser" "^4.0.1" + "@smithy/util-base64" "^4.0.0" + "@smithy/util-body-length-browser" "^4.0.0" + "@smithy/util-body-length-node" "^4.0.0" + "@smithy/util-defaults-mode-browser" "^4.0.4" + "@smithy/util-defaults-mode-node" "^4.0.4" + "@smithy/util-endpoints" "^3.0.1" + "@smithy/util-middleware" "^4.0.1" + "@smithy/util-retry" "^4.0.1" + "@smithy/util-stream" "^4.0.2" + "@smithy/util-utf8" "^4.0.0" + "@smithy/util-waiter" "^4.0.2" + tslib "^2.6.2" + +"@aws-sdk/client-sso-oidc@3.658.1": + version "3.658.1" + resolved "https://registry.npmjs.org/@aws-sdk/client-sso-oidc/-/client-sso-oidc-3.658.1.tgz" + integrity sha512-RGcZAI3qEA05JszPKwa0cAyp8rnS1nUvs0Sqw4hqLNQ1kD7b7V6CPjRXe7EFQqCOMvM4kGqx0+cEEVTOmBsFLw== + dependencies: + "@aws-crypto/sha256-browser" "5.2.0" + "@aws-crypto/sha256-js" "5.2.0" + "@aws-sdk/core" "3.658.1" + "@aws-sdk/credential-provider-node" "3.658.1" + "@aws-sdk/middleware-host-header" "3.654.0" + "@aws-sdk/middleware-logger" "3.654.0" + "@aws-sdk/middleware-recursion-detection" "3.654.0" + "@aws-sdk/middleware-user-agent" "3.654.0" + "@aws-sdk/region-config-resolver" "3.654.0" + "@aws-sdk/types" "3.654.0" + "@aws-sdk/util-endpoints" "3.654.0" + "@aws-sdk/util-user-agent-browser" "3.654.0" + "@aws-sdk/util-user-agent-node" "3.654.0" + "@smithy/config-resolver" "^3.0.8" + "@smithy/core" "^2.4.6" + "@smithy/fetch-http-handler" "^3.2.8" + "@smithy/hash-node" "^3.0.6" + "@smithy/invalid-dependency" "^3.0.6" + "@smithy/middleware-content-length" "^3.0.8" + "@smithy/middleware-endpoint" "^3.1.3" + "@smithy/middleware-retry" "^3.0.21" + "@smithy/middleware-serde" "^3.0.6" + "@smithy/middleware-stack" "^3.0.6" + "@smithy/node-config-provider" "^3.1.7" + "@smithy/node-http-handler" "^3.2.3" + "@smithy/protocol-http" "^4.1.3" + "@smithy/smithy-client" "^3.3.5" + "@smithy/types" "^3.4.2" + "@smithy/url-parser" "^3.0.6" + "@smithy/util-base64" "^3.0.0" + "@smithy/util-body-length-browser" "^3.0.0" + "@smithy/util-body-length-node" "^3.0.0" + "@smithy/util-defaults-mode-browser" "^3.0.21" + "@smithy/util-defaults-mode-node" "^3.0.21" + "@smithy/util-endpoints" "^2.1.2" + "@smithy/util-middleware" "^3.0.6" + "@smithy/util-retry" "^3.0.6" + "@smithy/util-utf8" "^3.0.0" + tslib "^2.6.2" + +"@aws-sdk/client-sso-oidc@3.714.0": + version "3.714.0" + resolved "https://registry.npmjs.org/@aws-sdk/client-sso-oidc/-/client-sso-oidc-3.714.0.tgz" + integrity sha512-dMvpPUaL3v01psPY1ZyCzQ/w2tOgQTH1if0zBF5r2q7Vc0oOPzbBZgNAhG1bDWlRCBW0iXmoqRFoWUwQ5rtx+A== + dependencies: + "@aws-crypto/sha256-browser" "5.2.0" + "@aws-crypto/sha256-js" "5.2.0" + "@aws-sdk/core" "3.714.0" + "@aws-sdk/credential-provider-node" "3.714.0" + "@aws-sdk/middleware-host-header" "3.714.0" + "@aws-sdk/middleware-logger" "3.714.0" + "@aws-sdk/middleware-recursion-detection" "3.714.0" + "@aws-sdk/middleware-user-agent" "3.714.0" + "@aws-sdk/region-config-resolver" "3.714.0" + "@aws-sdk/types" "3.714.0" + "@aws-sdk/util-endpoints" "3.714.0" + "@aws-sdk/util-user-agent-browser" "3.714.0" + "@aws-sdk/util-user-agent-node" "3.714.0" + "@smithy/config-resolver" "^3.0.13" + "@smithy/core" "^2.5.5" + "@smithy/fetch-http-handler" "^4.1.2" + "@smithy/hash-node" "^3.0.11" + "@smithy/invalid-dependency" "^3.0.11" + "@smithy/middleware-content-length" "^3.0.13" + "@smithy/middleware-endpoint" "^3.2.5" + "@smithy/middleware-retry" "^3.0.30" + "@smithy/middleware-serde" "^3.0.11" + "@smithy/middleware-stack" "^3.0.11" + "@smithy/node-config-provider" "^3.1.12" + "@smithy/node-http-handler" "^3.3.2" + "@smithy/protocol-http" "^4.1.8" + "@smithy/smithy-client" "^3.5.0" + "@smithy/types" "^3.7.2" + "@smithy/url-parser" "^3.0.11" + "@smithy/util-base64" "^3.0.0" + "@smithy/util-body-length-browser" "^3.0.0" + "@smithy/util-body-length-node" "^3.0.0" + "@smithy/util-defaults-mode-browser" "^3.0.30" + "@smithy/util-defaults-mode-node" "^3.0.30" + "@smithy/util-endpoints" "^2.1.7" + "@smithy/util-middleware" "^3.0.11" + "@smithy/util-retry" "^3.0.11" + "@smithy/util-utf8" "^3.0.0" + tslib "^2.6.2" + +"@aws-sdk/client-sso@3.658.1": + version "3.658.1" + resolved "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.658.1.tgz" + integrity sha512-lOuaBtqPTYGn6xpXlQF4LsNDsQ8Ij2kOdnk+i69Kp6yS76TYvtUuukyLL5kx8zE1c8WbYtxj9y8VNw9/6uKl7Q== + dependencies: + "@aws-crypto/sha256-browser" "5.2.0" + "@aws-crypto/sha256-js" "5.2.0" + "@aws-sdk/core" "3.658.1" + "@aws-sdk/middleware-host-header" "3.654.0" + "@aws-sdk/middleware-logger" "3.654.0" + "@aws-sdk/middleware-recursion-detection" "3.654.0" + "@aws-sdk/middleware-user-agent" "3.654.0" + "@aws-sdk/region-config-resolver" "3.654.0" + "@aws-sdk/types" "3.654.0" + "@aws-sdk/util-endpoints" "3.654.0" + "@aws-sdk/util-user-agent-browser" "3.654.0" + "@aws-sdk/util-user-agent-node" "3.654.0" + "@smithy/config-resolver" "^3.0.8" + "@smithy/core" "^2.4.6" + "@smithy/fetch-http-handler" "^3.2.8" + "@smithy/hash-node" "^3.0.6" + "@smithy/invalid-dependency" "^3.0.6" + "@smithy/middleware-content-length" "^3.0.8" + "@smithy/middleware-endpoint" "^3.1.3" + "@smithy/middleware-retry" "^3.0.21" + "@smithy/middleware-serde" "^3.0.6" + "@smithy/middleware-stack" "^3.0.6" + "@smithy/node-config-provider" "^3.1.7" + "@smithy/node-http-handler" "^3.2.3" + "@smithy/protocol-http" "^4.1.3" + "@smithy/smithy-client" "^3.3.5" + "@smithy/types" "^3.4.2" + "@smithy/url-parser" "^3.0.6" + "@smithy/util-base64" "^3.0.0" + "@smithy/util-body-length-browser" "^3.0.0" + "@smithy/util-body-length-node" "^3.0.0" + "@smithy/util-defaults-mode-browser" "^3.0.21" + "@smithy/util-defaults-mode-node" "^3.0.21" + "@smithy/util-endpoints" "^2.1.2" + "@smithy/util-middleware" "^3.0.6" + "@smithy/util-retry" "^3.0.6" + "@smithy/util-utf8" "^3.0.0" + tslib "^2.6.2" + +"@aws-sdk/client-sso@3.714.0": + version "3.714.0" + resolved "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.714.0.tgz" + integrity sha512-pFtjY5Ga91qrryo0UfbjetdT2p9rOgtHofogAeEuGjxx7/rupBpdlW0WDOtD/7jhmbhM8WZEr6aH7GLzzkKfCA== + dependencies: + "@aws-crypto/sha256-browser" "5.2.0" + "@aws-crypto/sha256-js" "5.2.0" + "@aws-sdk/core" "3.714.0" + "@aws-sdk/middleware-host-header" "3.714.0" + "@aws-sdk/middleware-logger" "3.714.0" + "@aws-sdk/middleware-recursion-detection" "3.714.0" + "@aws-sdk/middleware-user-agent" "3.714.0" + "@aws-sdk/region-config-resolver" "3.714.0" + "@aws-sdk/types" "3.714.0" + "@aws-sdk/util-endpoints" "3.714.0" + "@aws-sdk/util-user-agent-browser" "3.714.0" + "@aws-sdk/util-user-agent-node" "3.714.0" + "@smithy/config-resolver" "^3.0.13" + "@smithy/core" "^2.5.5" + "@smithy/fetch-http-handler" "^4.1.2" + "@smithy/hash-node" "^3.0.11" + "@smithy/invalid-dependency" "^3.0.11" + "@smithy/middleware-content-length" "^3.0.13" + "@smithy/middleware-endpoint" "^3.2.5" + "@smithy/middleware-retry" "^3.0.30" + "@smithy/middleware-serde" "^3.0.11" + "@smithy/middleware-stack" "^3.0.11" + "@smithy/node-config-provider" "^3.1.12" + "@smithy/node-http-handler" "^3.3.2" + "@smithy/protocol-http" "^4.1.8" + "@smithy/smithy-client" "^3.5.0" + "@smithy/types" "^3.7.2" + "@smithy/url-parser" "^3.0.11" + "@smithy/util-base64" "^3.0.0" + "@smithy/util-body-length-browser" "^3.0.0" + "@smithy/util-body-length-node" "^3.0.0" + "@smithy/util-defaults-mode-browser" "^3.0.30" + "@smithy/util-defaults-mode-node" "^3.0.30" + "@smithy/util-endpoints" "^2.1.7" + "@smithy/util-middleware" "^3.0.11" + "@smithy/util-retry" "^3.0.11" + "@smithy/util-utf8" "^3.0.0" + tslib "^2.6.2" + +"@aws-sdk/client-sso@3.744.0": + version "3.744.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/client-sso/-/client-sso-3.744.0.tgz#8de02749e9323c2800315ef3b08b32e74b9a8c66" + integrity sha512-mzJxPQ9mcnNY50pi7+pxB34/Dt7PUn0OgkashHdJPTnavoriLWvPcaQCG1NEVAtyzxNdowhpi4KjC+aN1EwAeA== + dependencies: + "@aws-crypto/sha256-browser" "5.2.0" + "@aws-crypto/sha256-js" "5.2.0" + "@aws-sdk/core" "3.744.0" + "@aws-sdk/middleware-host-header" "3.734.0" + "@aws-sdk/middleware-logger" "3.734.0" + "@aws-sdk/middleware-recursion-detection" "3.734.0" + "@aws-sdk/middleware-user-agent" "3.744.0" + "@aws-sdk/region-config-resolver" "3.734.0" + "@aws-sdk/types" "3.734.0" + "@aws-sdk/util-endpoints" "3.743.0" + "@aws-sdk/util-user-agent-browser" "3.734.0" + "@aws-sdk/util-user-agent-node" "3.744.0" + "@smithy/config-resolver" "^4.0.1" + "@smithy/core" "^3.1.2" + "@smithy/fetch-http-handler" "^5.0.1" + "@smithy/hash-node" "^4.0.1" + "@smithy/invalid-dependency" "^4.0.1" + "@smithy/middleware-content-length" "^4.0.1" + "@smithy/middleware-endpoint" "^4.0.3" + "@smithy/middleware-retry" "^4.0.4" + "@smithy/middleware-serde" "^4.0.2" + "@smithy/middleware-stack" "^4.0.1" + "@smithy/node-config-provider" "^4.0.1" + "@smithy/node-http-handler" "^4.0.2" + "@smithy/protocol-http" "^5.0.1" + "@smithy/smithy-client" "^4.1.3" + "@smithy/types" "^4.1.0" + "@smithy/url-parser" "^4.0.1" + "@smithy/util-base64" "^4.0.0" + "@smithy/util-body-length-browser" "^4.0.0" + "@smithy/util-body-length-node" "^4.0.0" + "@smithy/util-defaults-mode-browser" "^4.0.4" + "@smithy/util-defaults-mode-node" "^4.0.4" + "@smithy/util-endpoints" "^3.0.1" + "@smithy/util-middleware" "^4.0.1" + "@smithy/util-retry" "^4.0.1" + "@smithy/util-utf8" "^4.0.0" + tslib "^2.6.2" + +"@aws-sdk/client-sts@3.658.1": + version "3.658.1" + resolved "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.658.1.tgz" + integrity sha512-yw9hc5blTnbT1V6mR7Cx9HGc9KQpcLQ1QXj8rntiJi6tIYu3aFNVEyy81JHL7NsuBSeQulJTvHO3y6r3O0sfRg== + dependencies: + "@aws-crypto/sha256-browser" "5.2.0" + "@aws-crypto/sha256-js" "5.2.0" + "@aws-sdk/client-sso-oidc" "3.658.1" + "@aws-sdk/core" "3.658.1" + "@aws-sdk/credential-provider-node" "3.658.1" + "@aws-sdk/middleware-host-header" "3.654.0" + "@aws-sdk/middleware-logger" "3.654.0" + "@aws-sdk/middleware-recursion-detection" "3.654.0" + "@aws-sdk/middleware-user-agent" "3.654.0" + "@aws-sdk/region-config-resolver" "3.654.0" + "@aws-sdk/types" "3.654.0" + "@aws-sdk/util-endpoints" "3.654.0" + "@aws-sdk/util-user-agent-browser" "3.654.0" + "@aws-sdk/util-user-agent-node" "3.654.0" + "@smithy/config-resolver" "^3.0.8" + "@smithy/core" "^2.4.6" + "@smithy/fetch-http-handler" "^3.2.8" + "@smithy/hash-node" "^3.0.6" + "@smithy/invalid-dependency" "^3.0.6" + "@smithy/middleware-content-length" "^3.0.8" + "@smithy/middleware-endpoint" "^3.1.3" + "@smithy/middleware-retry" "^3.0.21" + "@smithy/middleware-serde" "^3.0.6" + "@smithy/middleware-stack" "^3.0.6" + "@smithy/node-config-provider" "^3.1.7" + "@smithy/node-http-handler" "^3.2.3" + "@smithy/protocol-http" "^4.1.3" + "@smithy/smithy-client" "^3.3.5" + "@smithy/types" "^3.4.2" + "@smithy/url-parser" "^3.0.6" + "@smithy/util-base64" "^3.0.0" + "@smithy/util-body-length-browser" "^3.0.0" + "@smithy/util-body-length-node" "^3.0.0" + "@smithy/util-defaults-mode-browser" "^3.0.21" + "@smithy/util-defaults-mode-node" "^3.0.21" + "@smithy/util-endpoints" "^2.1.2" + "@smithy/util-middleware" "^3.0.6" + "@smithy/util-retry" "^3.0.6" + "@smithy/util-utf8" "^3.0.0" + tslib "^2.6.2" + +"@aws-sdk/client-sts@3.714.0", "@aws-sdk/client-sts@^3.4.1": + version "3.714.0" + resolved "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.714.0.tgz" + integrity sha512-ThcXgolapPsOzeavJF4Am312umFyoFBBeiTYD8PQGIiYkbJi4hXcjoWacmtkq6moMmMZSP9iK/ellls7vwY2JQ== + dependencies: + "@aws-crypto/sha256-browser" "5.2.0" + "@aws-crypto/sha256-js" "5.2.0" + "@aws-sdk/client-sso-oidc" "3.714.0" + "@aws-sdk/core" "3.714.0" + "@aws-sdk/credential-provider-node" "3.714.0" + "@aws-sdk/middleware-host-header" "3.714.0" + "@aws-sdk/middleware-logger" "3.714.0" + "@aws-sdk/middleware-recursion-detection" "3.714.0" + "@aws-sdk/middleware-user-agent" "3.714.0" + "@aws-sdk/region-config-resolver" "3.714.0" + "@aws-sdk/types" "3.714.0" + "@aws-sdk/util-endpoints" "3.714.0" + "@aws-sdk/util-user-agent-browser" "3.714.0" + "@aws-sdk/util-user-agent-node" "3.714.0" + "@smithy/config-resolver" "^3.0.13" + "@smithy/core" "^2.5.5" + "@smithy/fetch-http-handler" "^4.1.2" + "@smithy/hash-node" "^3.0.11" + "@smithy/invalid-dependency" "^3.0.11" + "@smithy/middleware-content-length" "^3.0.13" + "@smithy/middleware-endpoint" "^3.2.5" + "@smithy/middleware-retry" "^3.0.30" + "@smithy/middleware-serde" "^3.0.11" + "@smithy/middleware-stack" "^3.0.11" + "@smithy/node-config-provider" "^3.1.12" + "@smithy/node-http-handler" "^3.3.2" + "@smithy/protocol-http" "^4.1.8" + "@smithy/smithy-client" "^3.5.0" + "@smithy/types" "^3.7.2" + "@smithy/url-parser" "^3.0.11" + "@smithy/util-base64" "^3.0.0" + "@smithy/util-body-length-browser" "^3.0.0" + "@smithy/util-body-length-node" "^3.0.0" + "@smithy/util-defaults-mode-browser" "^3.0.30" + "@smithy/util-defaults-mode-node" "^3.0.30" + "@smithy/util-endpoints" "^2.1.7" + "@smithy/util-middleware" "^3.0.11" + "@smithy/util-retry" "^3.0.11" + "@smithy/util-utf8" "^3.0.0" + tslib "^2.6.2" + +"@aws-sdk/core@3.658.1": + version "3.658.1" + resolved "https://registry.npmjs.org/@aws-sdk/core/-/core-3.658.1.tgz" + integrity sha512-vJVMoMcSKXK2gBRSu9Ywwv6wQ7tXH8VL1fqB1uVxgCqBZ3IHfqNn4zvpMPWrwgO2/3wv7XFyikGQ5ypPTCw4jA== + dependencies: + "@smithy/core" "^2.4.6" + "@smithy/node-config-provider" "^3.1.7" + "@smithy/property-provider" "^3.1.6" + "@smithy/protocol-http" "^4.1.3" + "@smithy/signature-v4" "^4.1.4" + "@smithy/smithy-client" "^3.3.5" + "@smithy/types" "^3.4.2" + "@smithy/util-middleware" "^3.0.6" + fast-xml-parser "4.4.1" + tslib "^2.6.2" + +"@aws-sdk/core@3.714.0": + version "3.714.0" + resolved "https://registry.npmjs.org/@aws-sdk/core/-/core-3.714.0.tgz" + integrity sha512-TlZ50d8MEPVp9O03SvisOmcmxjxhMDKHJJcrBgYjgDej6QmNfiFwtCRkReXDdkEeXP29ehMs7uPXtmVvPqziYw== + dependencies: + "@aws-sdk/types" "3.714.0" + "@smithy/core" "^2.5.5" + "@smithy/node-config-provider" "^3.1.12" + "@smithy/property-provider" "^3.1.11" + "@smithy/protocol-http" "^4.1.8" + "@smithy/signature-v4" "^4.2.4" + "@smithy/smithy-client" "^3.5.0" + "@smithy/types" "^3.7.2" + "@smithy/util-middleware" "^3.0.11" + fast-xml-parser "4.4.1" + tslib "^2.6.2" + +"@aws-sdk/core@3.744.0": + version "3.744.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/core/-/core-3.744.0.tgz#0b357ca6b14c34c4bb5a626bcaa0b0392781b5d4" + integrity sha512-R0XLfDDq7MAXYyDf7tPb+m0R7gmzTRRDtPNQ5jvuq8dbkefph5gFMkxZ2zSx7dfTsfYHhBPuTBsQ0c5Xjal3Vg== + dependencies: + "@aws-sdk/types" "3.734.0" + "@smithy/core" "^3.1.2" + "@smithy/node-config-provider" "^4.0.1" + "@smithy/property-provider" "^4.0.1" + "@smithy/protocol-http" "^5.0.1" + "@smithy/signature-v4" "^5.0.1" + "@smithy/smithy-client" "^4.1.3" + "@smithy/types" "^4.1.0" + "@smithy/util-middleware" "^4.0.1" + fast-xml-parser "4.4.1" + tslib "^2.6.2" + +"@aws-sdk/credential-provider-cognito-identity@3.658.1": + version "3.658.1" + resolved "https://registry.npmjs.org/@aws-sdk/credential-provider-cognito-identity/-/credential-provider-cognito-identity-3.658.1.tgz" + integrity sha512-JY4rZ4e2emL7PNHCU7F/BQV8PpQGEBZLkEoPD55RO4CitaIhlVZRpUCGLih+0Hw4MOnTUqJdfQBM+qZk6G+Now== + dependencies: + "@aws-sdk/client-cognito-identity" "3.658.1" + "@aws-sdk/types" "3.654.0" + "@smithy/property-provider" "^3.1.6" + "@smithy/types" "^3.4.2" + tslib "^2.6.2" + +"@aws-sdk/credential-provider-cognito-identity@3.714.0": + version "3.714.0" + resolved "https://registry.npmjs.org/@aws-sdk/credential-provider-cognito-identity/-/credential-provider-cognito-identity-3.714.0.tgz" + integrity sha512-JnnbCF7nK4ycwgLQEBTcu/tyfhIPQPHk1A74jwNxjixkan+0klCQYYwWJLkb2jxmmLvLrDlYfWDlzb98f//UzA== + dependencies: + "@aws-sdk/client-cognito-identity" "3.714.0" + "@aws-sdk/types" "3.714.0" + "@smithy/property-provider" "^3.1.11" + "@smithy/types" "^3.7.2" + tslib "^2.6.2" + +"@aws-sdk/credential-provider-env@3.654.0": + version "3.654.0" + resolved "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.654.0.tgz" + integrity sha512-kogsx3Ql81JouHS7DkheCDU9MYAvK0AokxjcshDveGmf7BbgbWCA8Fnb9wjQyNDaOXNvkZu8Z8rgkX91z324/w== + dependencies: + "@aws-sdk/types" "3.654.0" + "@smithy/property-provider" "^3.1.6" + "@smithy/types" "^3.4.2" + tslib "^2.6.2" + +"@aws-sdk/credential-provider-env@3.714.0": + version "3.714.0" + resolved "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.714.0.tgz" + integrity sha512-0S4nKE1a+EHXAInXUeuWkyzVnXzmwIbwLStVidAIoyl6sJF8xGdw+r3AaoTr7p0YXzdoDUsn3wBTCA6ZwgXVbA== + dependencies: + "@aws-sdk/core" "3.714.0" + "@aws-sdk/types" "3.714.0" + "@smithy/property-provider" "^3.1.11" + "@smithy/types" "^3.7.2" + tslib "^2.6.2" + +"@aws-sdk/credential-provider-env@3.744.0": + version "3.744.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-env/-/credential-provider-env-3.744.0.tgz#bfcfa86a7b7d0dc94fb7e97ef35d2b7830f69f42" + integrity sha512-hyjC7xqzAeERorYYjhQG1ivcr1XlxgfBpa+r4pG29toFG60mACyVzaR7+og3kgzjRFAB7D1imMxPQyEvQ1QokA== + dependencies: + "@aws-sdk/core" "3.744.0" + "@aws-sdk/types" "3.734.0" + "@smithy/property-provider" "^4.0.1" + "@smithy/types" "^4.1.0" + tslib "^2.6.2" + +"@aws-sdk/credential-provider-http@3.658.1": + version "3.658.1" + resolved "https://registry.npmjs.org/@aws-sdk/credential-provider-http/-/credential-provider-http-3.658.1.tgz" + integrity sha512-4ubkJjEVCZflxkZnV1JDQv8P2pburxk1LrEp55telfJRzXrnowzBKwuV2ED0QMNC448g2B3VCaffS+Ct7c4IWQ== + dependencies: + "@aws-sdk/types" "3.654.0" + "@smithy/fetch-http-handler" "^3.2.8" + "@smithy/node-http-handler" "^3.2.3" + "@smithy/property-provider" "^3.1.6" + "@smithy/protocol-http" "^4.1.3" + "@smithy/smithy-client" "^3.3.5" + "@smithy/types" "^3.4.2" + "@smithy/util-stream" "^3.1.8" + tslib "^2.6.2" + +"@aws-sdk/credential-provider-http@3.714.0": + version "3.714.0" + resolved "https://registry.npmjs.org/@aws-sdk/credential-provider-http/-/credential-provider-http-3.714.0.tgz" + integrity sha512-1AXEfUSQUQg+x/DpH1XJhjf2yEgTHHatM3cvYu7FZMhRXF28Q5OJDbEFPfdqrK+vmCiYRWhszDb+zuUIvz46bw== + dependencies: + "@aws-sdk/core" "3.714.0" + "@aws-sdk/types" "3.714.0" + "@smithy/fetch-http-handler" "^4.1.2" + "@smithy/node-http-handler" "^3.3.2" + "@smithy/property-provider" "^3.1.11" + "@smithy/protocol-http" "^4.1.8" + "@smithy/smithy-client" "^3.5.0" + "@smithy/types" "^3.7.2" + "@smithy/util-stream" "^3.3.2" + tslib "^2.6.2" + +"@aws-sdk/credential-provider-http@3.744.0": + version "3.744.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-http/-/credential-provider-http-3.744.0.tgz#696c71f0fdea856a69752947624255383c2fca1f" + integrity sha512-k+P1Tl5ewBvVByR6hB726qFIzANgQVf2cY87hZ/e09pQYlH4bfBcyY16VJhkqYnKmv6HMdWxKHX7D8nwlc8Obg== + dependencies: + "@aws-sdk/core" "3.744.0" + "@aws-sdk/types" "3.734.0" + "@smithy/fetch-http-handler" "^5.0.1" + "@smithy/node-http-handler" "^4.0.2" + "@smithy/property-provider" "^4.0.1" + "@smithy/protocol-http" "^5.0.1" + "@smithy/smithy-client" "^4.1.3" + "@smithy/types" "^4.1.0" + "@smithy/util-stream" "^4.0.2" + tslib "^2.6.2" + +"@aws-sdk/credential-provider-ini@3.658.1": + version "3.658.1" + resolved "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.658.1.tgz" + integrity sha512-2uwOamQg5ppwfegwen1ddPu5HM3/IBSnaGlaKLFhltkdtZ0jiqTZWUtX2V+4Q+buLnT0hQvLS/frQ+7QUam+0Q== + dependencies: + "@aws-sdk/credential-provider-env" "3.654.0" + "@aws-sdk/credential-provider-http" "3.658.1" + "@aws-sdk/credential-provider-process" "3.654.0" + "@aws-sdk/credential-provider-sso" "3.658.1" + "@aws-sdk/credential-provider-web-identity" "3.654.0" + "@aws-sdk/types" "3.654.0" + "@smithy/credential-provider-imds" "^3.2.3" + "@smithy/property-provider" "^3.1.6" + "@smithy/shared-ini-file-loader" "^3.1.7" + "@smithy/types" "^3.4.2" + tslib "^2.6.2" + +"@aws-sdk/credential-provider-ini@3.714.0": + version "3.714.0" + resolved "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.714.0.tgz" + integrity sha512-w5wOcgBngfcvVev5wnYWXoc/W2ewVmGJkfRdGquhFt8pkUxktyd8eXehqkP7u31SONVlgy96EFTdSCzWpTrqOw== + dependencies: + "@aws-sdk/core" "3.714.0" + "@aws-sdk/credential-provider-env" "3.714.0" + "@aws-sdk/credential-provider-http" "3.714.0" + "@aws-sdk/credential-provider-process" "3.714.0" + "@aws-sdk/credential-provider-sso" "3.714.0" + "@aws-sdk/credential-provider-web-identity" "3.714.0" + "@aws-sdk/types" "3.714.0" + "@smithy/credential-provider-imds" "^3.2.8" + "@smithy/property-provider" "^3.1.11" + "@smithy/shared-ini-file-loader" "^3.1.12" + "@smithy/types" "^3.7.2" + tslib "^2.6.2" + +"@aws-sdk/credential-provider-ini@3.744.0": + version "3.744.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.744.0.tgz#7d048788efdce53391211ce3b4624a6a146a16e0" + integrity sha512-hjEWgkF86tkvg8PIsDiB3KkTj7z8ZFGR0v0OLQYD47o17q1qfoMzZmg9wae3wXp9KzU+lZETo+8oMqX9a+7aVQ== + dependencies: + "@aws-sdk/core" "3.744.0" + "@aws-sdk/credential-provider-env" "3.744.0" + "@aws-sdk/credential-provider-http" "3.744.0" + "@aws-sdk/credential-provider-process" "3.744.0" + "@aws-sdk/credential-provider-sso" "3.744.0" + "@aws-sdk/credential-provider-web-identity" "3.744.0" + "@aws-sdk/nested-clients" "3.744.0" + "@aws-sdk/types" "3.734.0" + "@smithy/credential-provider-imds" "^4.0.1" + "@smithy/property-provider" "^4.0.1" + "@smithy/shared-ini-file-loader" "^4.0.1" + "@smithy/types" "^4.1.0" + tslib "^2.6.2" + +"@aws-sdk/credential-provider-node@3.658.1": + version "3.658.1" + resolved "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.658.1.tgz" + integrity sha512-XwxW6N+uPXPYAuyq+GfOEdfL/MZGAlCSfB5gEWtLBFmFbikhmEuqfWtI6CD60OwudCUOh6argd21BsJf8o1SJA== + dependencies: + "@aws-sdk/credential-provider-env" "3.654.0" + "@aws-sdk/credential-provider-http" "3.658.1" + "@aws-sdk/credential-provider-ini" "3.658.1" + "@aws-sdk/credential-provider-process" "3.654.0" + "@aws-sdk/credential-provider-sso" "3.658.1" + "@aws-sdk/credential-provider-web-identity" "3.654.0" + "@aws-sdk/types" "3.654.0" + "@smithy/credential-provider-imds" "^3.2.3" + "@smithy/property-provider" "^3.1.6" + "@smithy/shared-ini-file-loader" "^3.1.7" + "@smithy/types" "^3.4.2" + tslib "^2.6.2" + +"@aws-sdk/credential-provider-node@3.714.0": + version "3.714.0" + resolved "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.714.0.tgz" + integrity sha512-ebho1HYNKzaw0ZfbI9kEicSW8J7tsOoV6EJajsjfFnuP+GY9J5Oi4759GEq1Qqj7GxIhrySOZFzif/hxAXPWtQ== + dependencies: + "@aws-sdk/credential-provider-env" "3.714.0" + "@aws-sdk/credential-provider-http" "3.714.0" + "@aws-sdk/credential-provider-ini" "3.714.0" + "@aws-sdk/credential-provider-process" "3.714.0" + "@aws-sdk/credential-provider-sso" "3.714.0" + "@aws-sdk/credential-provider-web-identity" "3.714.0" + "@aws-sdk/types" "3.714.0" + "@smithy/credential-provider-imds" "^3.2.8" + "@smithy/property-provider" "^3.1.11" + "@smithy/shared-ini-file-loader" "^3.1.12" + "@smithy/types" "^3.7.2" + tslib "^2.6.2" + +"@aws-sdk/credential-provider-node@3.744.0": + version "3.744.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-node/-/credential-provider-node-3.744.0.tgz#302a136b40c5bc6b3b137d03615ec97eb111bfe8" + integrity sha512-4oUfRd6pe/VGmKoav17pPoOO0WP0L6YXmHqtJHSDmFUOAa+Vh0ZRljTj/yBdleRgdO6rOfdWqoGLFSFiAZDrsQ== + dependencies: + "@aws-sdk/credential-provider-env" "3.744.0" + "@aws-sdk/credential-provider-http" "3.744.0" + "@aws-sdk/credential-provider-ini" "3.744.0" + "@aws-sdk/credential-provider-process" "3.744.0" + "@aws-sdk/credential-provider-sso" "3.744.0" + "@aws-sdk/credential-provider-web-identity" "3.744.0" + "@aws-sdk/types" "3.734.0" + "@smithy/credential-provider-imds" "^4.0.1" + "@smithy/property-provider" "^4.0.1" + "@smithy/shared-ini-file-loader" "^4.0.1" + "@smithy/types" "^4.1.0" + tslib "^2.6.2" + +"@aws-sdk/credential-provider-process@3.654.0": + version "3.654.0" + resolved "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.654.0.tgz" + integrity sha512-PmQoo8sZ9Q2Ow8OMzK++Z9lI7MsRUG7sNq3E72DVA215dhtTICTDQwGlXH2AAmIp7n+G9LLRds+4wo2ehG4mkg== + dependencies: + "@aws-sdk/types" "3.654.0" + "@smithy/property-provider" "^3.1.6" + "@smithy/shared-ini-file-loader" "^3.1.7" + "@smithy/types" "^3.4.2" + tslib "^2.6.2" + +"@aws-sdk/credential-provider-process@3.714.0": + version "3.714.0" + resolved "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.714.0.tgz" + integrity sha512-mHM+zYJDUiXggBx4YvQgMOhbkV07KUib8/jWPnAZbUJcRncN/yevAp/WNocjUN4VaBWkooJUgoTET/okRK+TCQ== + dependencies: + "@aws-sdk/core" "3.714.0" + "@aws-sdk/types" "3.714.0" + "@smithy/property-provider" "^3.1.11" + "@smithy/shared-ini-file-loader" "^3.1.12" + "@smithy/types" "^3.7.2" + tslib "^2.6.2" + +"@aws-sdk/credential-provider-process@3.744.0": + version "3.744.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-process/-/credential-provider-process-3.744.0.tgz#4a0850276a4175094aba7d6164dd29a5fd855a95" + integrity sha512-m0d/pDBIaiEAAxWXt/c79RHsKkUkyPOvF2SAMRddVhhOt1GFZI4ml+3f4drmAZfXldIyJmvJTJJqWluVPwTIqQ== + dependencies: + "@aws-sdk/core" "3.744.0" + "@aws-sdk/types" "3.734.0" + "@smithy/property-provider" "^4.0.1" + "@smithy/shared-ini-file-loader" "^4.0.1" + "@smithy/types" "^4.1.0" + tslib "^2.6.2" + +"@aws-sdk/credential-provider-sso@3.658.1": + version "3.658.1" + resolved "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.658.1.tgz" + integrity sha512-YOagVEsZEk9DmgJEBg+4MBXrPcw/tYas0VQ5OVBqC5XHNbi2OBGJqgmjVPesuu393E7W0VQxtJFDS00O1ewQgA== + dependencies: + "@aws-sdk/client-sso" "3.658.1" + "@aws-sdk/token-providers" "3.654.0" + "@aws-sdk/types" "3.654.0" + "@smithy/property-provider" "^3.1.6" + "@smithy/shared-ini-file-loader" "^3.1.7" + "@smithy/types" "^3.4.2" + tslib "^2.6.2" + +"@aws-sdk/credential-provider-sso@3.714.0": + version "3.714.0" + resolved "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.714.0.tgz" + integrity sha512-LQyHUQd+/A0PO96m6/A3KeekRplRpG9AmwLn8VPknlmACAhhbWHehzerCTd42V8dClf5pigr25/aVqh/2p/sRw== + dependencies: + "@aws-sdk/client-sso" "3.714.0" + "@aws-sdk/core" "3.714.0" + "@aws-sdk/token-providers" "3.714.0" + "@aws-sdk/types" "3.714.0" + "@smithy/property-provider" "^3.1.11" + "@smithy/shared-ini-file-loader" "^3.1.12" + "@smithy/types" "^3.7.2" + tslib "^2.6.2" + +"@aws-sdk/credential-provider-sso@3.744.0": + version "3.744.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.744.0.tgz#8e25af2c7b12887f2db4ce33c88efa4e136173d7" + integrity sha512-xdMufTZOvpbDoDPI2XLu0/Rg3qJ/txpS8IJR63NsCGotHJZ/ucLNKwTcGS40hllZB8qSHTlvmlOzElDahTtx/A== + dependencies: + "@aws-sdk/client-sso" "3.744.0" + "@aws-sdk/core" "3.744.0" + "@aws-sdk/token-providers" "3.744.0" + "@aws-sdk/types" "3.734.0" + "@smithy/property-provider" "^4.0.1" + "@smithy/shared-ini-file-loader" "^4.0.1" + "@smithy/types" "^4.1.0" + tslib "^2.6.2" + +"@aws-sdk/credential-provider-web-identity@3.654.0": + version "3.654.0" + resolved "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.654.0.tgz" + integrity sha512-6a2g9gMtZToqSu+CusjNK5zvbLJahQ9di7buO3iXgbizXpLXU1rnawCpWxwslMpT5fLgMSKDnKDrr6wdEk7jSw== + dependencies: + "@aws-sdk/types" "3.654.0" + "@smithy/property-provider" "^3.1.6" + "@smithy/types" "^3.4.2" + tslib "^2.6.2" + +"@aws-sdk/credential-provider-web-identity@3.714.0": + version "3.714.0" + resolved "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.714.0.tgz" + integrity sha512-piKfEJvLrGZ0bH4NPO19d1dtfCZi2p6YJUK/9vRCD1rvJidOuHNeUwIcxTnkIMovQHX12rZVvU9ub0C3CwegUQ== + dependencies: + "@aws-sdk/core" "3.714.0" + "@aws-sdk/types" "3.714.0" + "@smithy/property-provider" "^3.1.11" + "@smithy/types" "^3.7.2" + tslib "^2.6.2" + +"@aws-sdk/credential-provider-web-identity@3.744.0": + version "3.744.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.744.0.tgz#fab672a92bf4924e0fee5e4ca307f25cd9dc2f7a" + integrity sha512-cNk93GZxORzqEojWfXdrPBF6a7Nu3LpPCWG5mV+lH2tbuGsmw6XhKkwpt7o+OiIP4tKCpHlvqOD8f1nmhe1KDA== + dependencies: + "@aws-sdk/core" "3.744.0" + "@aws-sdk/nested-clients" "3.744.0" + "@aws-sdk/types" "3.734.0" + "@smithy/property-provider" "^4.0.1" + "@smithy/types" "^4.1.0" + tslib "^2.6.2" + +"@aws-sdk/credential-providers@3.658.1": + version "3.658.1" + resolved "https://registry.npmjs.org/@aws-sdk/credential-providers/-/credential-providers-3.658.1.tgz" + integrity sha512-lfXA6kZS6GHyi/67EbfrKdLoqHR6j7G35eFwaqxyNkfMhNBpAF0eZK3SYiwnzdR9+Wb/enTFawYiFbG5R+dQzA== + dependencies: + "@aws-sdk/client-cognito-identity" "3.658.1" + "@aws-sdk/client-sso" "3.658.1" + "@aws-sdk/client-sts" "3.658.1" + "@aws-sdk/credential-provider-cognito-identity" "3.658.1" + "@aws-sdk/credential-provider-env" "3.654.0" + "@aws-sdk/credential-provider-http" "3.658.1" + "@aws-sdk/credential-provider-ini" "3.658.1" + "@aws-sdk/credential-provider-node" "3.658.1" + "@aws-sdk/credential-provider-process" "3.654.0" + "@aws-sdk/credential-provider-sso" "3.658.1" + "@aws-sdk/credential-provider-web-identity" "3.654.0" + "@aws-sdk/types" "3.654.0" + "@smithy/credential-provider-imds" "^3.2.3" + "@smithy/property-provider" "^3.1.6" + "@smithy/types" "^3.4.2" + tslib "^2.6.2" + +"@aws-sdk/credential-providers@^3.127.0": + version "3.715.0" + resolved "https://registry.npmjs.org/@aws-sdk/credential-providers/-/credential-providers-3.715.0.tgz" + integrity sha512-TV8YWYyjL8cTdKUaNskFZlaj86AgKUluhL3ebgAsmzn79FoJOP27MwpsLoScoEMDfiX5aUe2G0yFnVguRIl2XQ== + dependencies: + "@aws-sdk/client-cognito-identity" "3.714.0" + "@aws-sdk/client-sso" "3.714.0" + "@aws-sdk/client-sts" "3.714.0" + "@aws-sdk/core" "3.714.0" + "@aws-sdk/credential-provider-cognito-identity" "3.714.0" + "@aws-sdk/credential-provider-env" "3.714.0" + "@aws-sdk/credential-provider-http" "3.714.0" + "@aws-sdk/credential-provider-ini" "3.714.0" + "@aws-sdk/credential-provider-node" "3.714.0" + "@aws-sdk/credential-provider-process" "3.714.0" + "@aws-sdk/credential-provider-sso" "3.714.0" + "@aws-sdk/credential-provider-web-identity" "3.714.0" + "@aws-sdk/types" "3.714.0" + "@smithy/credential-provider-imds" "^3.2.8" + "@smithy/property-provider" "^3.1.11" + "@smithy/types" "^3.7.2" + tslib "^2.6.2" + +"@aws-sdk/middleware-bucket-endpoint@3.734.0": + version "3.734.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-bucket-endpoint/-/middleware-bucket-endpoint-3.734.0.tgz#af63fcaa865d3a47fd0ca3933eef04761f232677" + integrity sha512-etC7G18aF7KdZguW27GE/wpbrNmYLVT755EsFc8kXpZj8D6AFKxc7OuveinJmiy0bYXAMspJUWsF6CrGpOw6CQ== + dependencies: + "@aws-sdk/types" "3.734.0" + "@aws-sdk/util-arn-parser" "3.723.0" + "@smithy/node-config-provider" "^4.0.1" + "@smithy/protocol-http" "^5.0.1" + "@smithy/types" "^4.1.0" + "@smithy/util-config-provider" "^4.0.0" + tslib "^2.6.2" + +"@aws-sdk/middleware-expect-continue@3.734.0": + version "3.734.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-expect-continue/-/middleware-expect-continue-3.734.0.tgz#8159d81c3a8d9a9d60183fdeb7e8d6674f01c1cd" + integrity sha512-P38/v1l6HjuB2aFUewt7ueAW5IvKkFcv5dalPtbMGRhLeyivBOHwbCyuRKgVs7z7ClTpu9EaViEGki2jEQqEsQ== + dependencies: + "@aws-sdk/types" "3.734.0" + "@smithy/protocol-http" "^5.0.1" + "@smithy/types" "^4.1.0" + tslib "^2.6.2" + +"@aws-sdk/middleware-flexible-checksums@3.744.0": + version "3.744.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-flexible-checksums/-/middleware-flexible-checksums-3.744.0.tgz#9487b6713226157d1adc45c220cace0a51898660" + integrity sha512-4AuBdvkwfwagZQt3kt1b0x2dtC54cOrN5gt96V2b4wIjHBRxB/IfAyynahOgx3fd7Zjf74xwmxasjs7iJ8yglg== + dependencies: + "@aws-crypto/crc32" "5.2.0" + "@aws-crypto/crc32c" "5.2.0" + "@aws-crypto/util" "5.2.0" + "@aws-sdk/core" "3.744.0" + "@aws-sdk/types" "3.734.0" + "@smithy/is-array-buffer" "^4.0.0" + "@smithy/node-config-provider" "^4.0.1" + "@smithy/protocol-http" "^5.0.1" + "@smithy/types" "^4.1.0" + "@smithy/util-middleware" "^4.0.1" + "@smithy/util-stream" "^4.0.2" + "@smithy/util-utf8" "^4.0.0" + tslib "^2.6.2" + +"@aws-sdk/middleware-host-header@3.654.0": + version "3.654.0" + resolved "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.654.0.tgz" + integrity sha512-rxGgVHWKp8U2ubMv+t+vlIk7QYUaRCHaVpmUlJv0Wv6Q0KeO9a42T9FxHphjOTlCGQOLcjCreL9CF8Qhtb4mdQ== + dependencies: + "@aws-sdk/types" "3.654.0" + "@smithy/protocol-http" "^4.1.3" + "@smithy/types" "^3.4.2" + tslib "^2.6.2" + +"@aws-sdk/middleware-host-header@3.714.0": + version "3.714.0" + resolved "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.714.0.tgz" + integrity sha512-6l68kjNrh5QC8FGX3I3geBDavWN5Tg1RLHJ2HLA8ByGBtJyCwnz3hEkKfaxn0bBx0hF9DzbfjEOUF6cDqy2Kjg== + dependencies: + "@aws-sdk/types" "3.714.0" + "@smithy/protocol-http" "^4.1.8" + "@smithy/types" "^3.7.2" + tslib "^2.6.2" + +"@aws-sdk/middleware-host-header@3.734.0": + version "3.734.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-host-header/-/middleware-host-header-3.734.0.tgz#a9a02c055352f5c435cc925a4e1e79b7ba41b1b5" + integrity sha512-LW7RRgSOHHBzWZnigNsDIzu3AiwtjeI2X66v+Wn1P1u+eXssy1+up4ZY/h+t2sU4LU36UvEf+jrZti9c6vRnFw== + dependencies: + "@aws-sdk/types" "3.734.0" + "@smithy/protocol-http" "^5.0.1" + "@smithy/types" "^4.1.0" + tslib "^2.6.2" + +"@aws-sdk/middleware-location-constraint@3.734.0": + version "3.734.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-location-constraint/-/middleware-location-constraint-3.734.0.tgz#fd1dc0e080ed85dd1feb7db3736c80689db4be07" + integrity sha512-EJEIXwCQhto/cBfHdm3ZOeLxd2NlJD+X2F+ZTOxzokuhBtY0IONfC/91hOo5tWQweerojwshSMHRCKzRv1tlwg== + dependencies: + "@aws-sdk/types" "3.734.0" + "@smithy/types" "^4.1.0" + tslib "^2.6.2" + +"@aws-sdk/middleware-logger@3.654.0": + version "3.654.0" + resolved "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.654.0.tgz" + integrity sha512-OQYb+nWlmASyXfRb989pwkJ9EVUMP1CrKn2eyTk3usl20JZmKo2Vjis6I0tLUkMSxMhnBJJlQKyWkRpD/u1FVg== + dependencies: + "@aws-sdk/types" "3.654.0" + "@smithy/types" "^3.4.2" + tslib "^2.6.2" + +"@aws-sdk/middleware-logger@3.714.0": + version "3.714.0" + resolved "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.714.0.tgz" + integrity sha512-RkqHlMvQWUaRklU1bMfUuBvdWwxgUtEqpADaHXlGVj3vtEY2UgBjy+57CveC4MByqKIunNvVHBBbjrGVtwY7Lg== + dependencies: + "@aws-sdk/types" "3.714.0" + "@smithy/types" "^3.7.2" + tslib "^2.6.2" + +"@aws-sdk/middleware-logger@3.734.0": + version "3.734.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-logger/-/middleware-logger-3.734.0.tgz#d31e141ae7a78667e372953a3b86905bc6124664" + integrity sha512-mUMFITpJUW3LcKvFok176eI5zXAUomVtahb9IQBwLzkqFYOrMJvWAvoV4yuxrJ8TlQBG8gyEnkb9SnhZvjg67w== + dependencies: + "@aws-sdk/types" "3.734.0" + "@smithy/types" "^4.1.0" + tslib "^2.6.2" + +"@aws-sdk/middleware-recursion-detection@3.654.0": + version "3.654.0" + resolved "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.654.0.tgz" + integrity sha512-gKSomgltKVmsT8sC6W7CrADZ4GHwX9epk3GcH6QhebVO3LA9LRbkL3TwOPUXakxxOLLUTYdOZLIOtFf7iH00lg== + dependencies: + "@aws-sdk/types" "3.654.0" + "@smithy/protocol-http" "^4.1.3" + "@smithy/types" "^3.4.2" + tslib "^2.6.2" + +"@aws-sdk/middleware-recursion-detection@3.714.0": + version "3.714.0" + resolved "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.714.0.tgz" + integrity sha512-AVU5ixnh93nqtsfgNc284oXsXaadyHGPHpql/jwgaaqQfEXjS/1/j3j9E/vpacfTTz2Vzo7hAOjnvrOXSEVDaA== + dependencies: + "@aws-sdk/types" "3.714.0" + "@smithy/protocol-http" "^4.1.8" + "@smithy/types" "^3.7.2" + tslib "^2.6.2" + +"@aws-sdk/middleware-recursion-detection@3.734.0": + version "3.734.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.734.0.tgz#4fa1deb9887455afbb39130f7d9bc89ccee17168" + integrity sha512-CUat2d9ITsFc2XsmeiRQO96iWpxSKYFjxvj27Hc7vo87YUHRnfMfnc8jw1EpxEwMcvBD7LsRa6vDNky6AjcrFA== + dependencies: + "@aws-sdk/types" "3.734.0" + "@smithy/protocol-http" "^5.0.1" + "@smithy/types" "^4.1.0" + tslib "^2.6.2" + +"@aws-sdk/middleware-sdk-s3@3.744.0": + version "3.744.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-sdk-s3/-/middleware-sdk-s3-3.744.0.tgz#4dcd4ebeb160cfd365a8e261ea10a12874a034b2" + integrity sha512-zE0kNjMV7B8pC2ClhrV2gCj/gWLiinRkfPeiUevfjl+Hdke9zcAWVNHLeGV54FJjXQEdwIAjeE7WJdHo7hio7g== + dependencies: + "@aws-sdk/core" "3.744.0" + "@aws-sdk/types" "3.734.0" + "@aws-sdk/util-arn-parser" "3.723.0" + "@smithy/core" "^3.1.2" + "@smithy/node-config-provider" "^4.0.1" + "@smithy/protocol-http" "^5.0.1" + "@smithy/signature-v4" "^5.0.1" + "@smithy/smithy-client" "^4.1.3" + "@smithy/types" "^4.1.0" + "@smithy/util-config-provider" "^4.0.0" + "@smithy/util-middleware" "^4.0.1" + "@smithy/util-stream" "^4.0.2" + "@smithy/util-utf8" "^4.0.0" + tslib "^2.6.2" + +"@aws-sdk/middleware-ssec@3.734.0": + version "3.734.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-ssec/-/middleware-ssec-3.734.0.tgz#a5863b9c5a5006dbf2f856f14030d30063a28dfa" + integrity sha512-d4yd1RrPW/sspEXizq2NSOUivnheac6LPeLSLnaeTbBG9g1KqIqvCzP1TfXEqv2CrWfHEsWtJpX7oyjySSPvDQ== + dependencies: + "@aws-sdk/types" "3.734.0" + "@smithy/types" "^4.1.0" + tslib "^2.6.2" + +"@aws-sdk/middleware-user-agent@3.654.0": + version "3.654.0" + resolved "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.654.0.tgz" + integrity sha512-liCcqPAyRsr53cy2tYu4qeH4MMN0eh9g6k56XzI5xd4SghXH5YWh4qOYAlQ8T66ZV4nPMtD8GLtLXGzsH8moFg== + dependencies: + "@aws-sdk/types" "3.654.0" + "@aws-sdk/util-endpoints" "3.654.0" + "@smithy/protocol-http" "^4.1.3" + "@smithy/types" "^3.4.2" + tslib "^2.6.2" + +"@aws-sdk/middleware-user-agent@3.714.0": + version "3.714.0" + resolved "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.714.0.tgz" + integrity sha512-OgLjJf7WxUqA2OgiqGCfIc68gsbXlIG8LjObBiF0qlMStAd0L23AGuK5VmYinJlsle9qUpwQvWgKFKaDgdQXgA== + dependencies: + "@aws-sdk/core" "3.714.0" + "@aws-sdk/types" "3.714.0" + "@aws-sdk/util-endpoints" "3.714.0" + "@smithy/core" "^2.5.5" + "@smithy/protocol-http" "^4.1.8" + "@smithy/types" "^3.7.2" + tslib "^2.6.2" + +"@aws-sdk/middleware-user-agent@3.744.0": + version "3.744.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.744.0.tgz#b87405dc60943afbcbc858e0dcdb69eaea46033c" + integrity sha512-ROUbDQHfVWiBHXd4m9E9mKj1Azby8XCs8RC8OCf9GVH339GSE6aMrPJSzMlsV1LmzPdPIypgp5qqh5NfSrKztg== + dependencies: + "@aws-sdk/core" "3.744.0" + "@aws-sdk/types" "3.734.0" + "@aws-sdk/util-endpoints" "3.743.0" + "@smithy/core" "^3.1.2" + "@smithy/protocol-http" "^5.0.1" + "@smithy/types" "^4.1.0" + tslib "^2.6.2" + +"@aws-sdk/nested-clients@3.744.0": + version "3.744.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/nested-clients/-/nested-clients-3.744.0.tgz#6af18949cf2a2180c2c4fbcf71fab6fd965e1874" + integrity sha512-Mnrlh4lRY1gZQnKvN2Lh/5WXcGkzC41NM93mtn2uaqOh+DZLCXCttNCfbUesUvYJLOo3lYaOpiDsjTkPVB1yjw== + dependencies: + "@aws-crypto/sha256-browser" "5.2.0" + "@aws-crypto/sha256-js" "5.2.0" + "@aws-sdk/core" "3.744.0" + "@aws-sdk/middleware-host-header" "3.734.0" + "@aws-sdk/middleware-logger" "3.734.0" + "@aws-sdk/middleware-recursion-detection" "3.734.0" + "@aws-sdk/middleware-user-agent" "3.744.0" + "@aws-sdk/region-config-resolver" "3.734.0" + "@aws-sdk/types" "3.734.0" + "@aws-sdk/util-endpoints" "3.743.0" + "@aws-sdk/util-user-agent-browser" "3.734.0" + "@aws-sdk/util-user-agent-node" "3.744.0" + "@smithy/config-resolver" "^4.0.1" + "@smithy/core" "^3.1.2" + "@smithy/fetch-http-handler" "^5.0.1" + "@smithy/hash-node" "^4.0.1" + "@smithy/invalid-dependency" "^4.0.1" + "@smithy/middleware-content-length" "^4.0.1" + "@smithy/middleware-endpoint" "^4.0.3" + "@smithy/middleware-retry" "^4.0.4" + "@smithy/middleware-serde" "^4.0.2" + "@smithy/middleware-stack" "^4.0.1" + "@smithy/node-config-provider" "^4.0.1" + "@smithy/node-http-handler" "^4.0.2" + "@smithy/protocol-http" "^5.0.1" + "@smithy/smithy-client" "^4.1.3" + "@smithy/types" "^4.1.0" + "@smithy/url-parser" "^4.0.1" + "@smithy/util-base64" "^4.0.0" + "@smithy/util-body-length-browser" "^4.0.0" + "@smithy/util-body-length-node" "^4.0.0" + "@smithy/util-defaults-mode-browser" "^4.0.4" + "@smithy/util-defaults-mode-node" "^4.0.4" + "@smithy/util-endpoints" "^3.0.1" + "@smithy/util-middleware" "^4.0.1" + "@smithy/util-retry" "^4.0.1" + "@smithy/util-utf8" "^4.0.0" + tslib "^2.6.2" + +"@aws-sdk/region-config-resolver@3.654.0": + version "3.654.0" + resolved "https://registry.npmjs.org/@aws-sdk/region-config-resolver/-/region-config-resolver-3.654.0.tgz" + integrity sha512-ydGOrXJxj3x0sJhsXyTmvJVLAE0xxuTWFJihTl67RtaO7VRNtd82I3P3bwoMMaDn5WpmV5mPo8fEUDRlBm3fPg== + dependencies: + "@aws-sdk/types" "3.654.0" + "@smithy/node-config-provider" "^3.1.7" + "@smithy/types" "^3.4.2" + "@smithy/util-config-provider" "^3.0.0" + "@smithy/util-middleware" "^3.0.6" + tslib "^2.6.2" + +"@aws-sdk/region-config-resolver@3.714.0": + version "3.714.0" + resolved "https://registry.npmjs.org/@aws-sdk/region-config-resolver/-/region-config-resolver-3.714.0.tgz" + integrity sha512-HJzsQxgMOAzZrbf/YIqEx30or4tZK1oNAk6Wm6xecUQx+23JXIaePRu1YFUOLBBERQ4QBPpISFurZWBMZ5ibAw== + dependencies: + "@aws-sdk/types" "3.714.0" + "@smithy/node-config-provider" "^3.1.12" + "@smithy/types" "^3.7.2" + "@smithy/util-config-provider" "^3.0.0" + "@smithy/util-middleware" "^3.0.11" + tslib "^2.6.2" + +"@aws-sdk/region-config-resolver@3.734.0": + version "3.734.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/region-config-resolver/-/region-config-resolver-3.734.0.tgz#45ffbc56a3e94cc5c9e0cd596b0fda60f100f70b" + integrity sha512-Lvj1kPRC5IuJBr9DyJ9T9/plkh+EfKLy+12s/mykOy1JaKHDpvj+XGy2YO6YgYVOb8JFtaqloid+5COtje4JTQ== + dependencies: + "@aws-sdk/types" "3.734.0" + "@smithy/node-config-provider" "^4.0.1" + "@smithy/types" "^4.1.0" + "@smithy/util-config-provider" "^4.0.0" + "@smithy/util-middleware" "^4.0.1" + tslib "^2.6.2" + +"@aws-sdk/signature-v4-multi-region@3.744.0": + version "3.744.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/signature-v4-multi-region/-/signature-v4-multi-region-3.744.0.tgz#b2fedc48b7cc9fbff0f9c558d3212dca967ceae3" + integrity sha512-QyrAevGGwceM+knGfV5r2NvSAjI94PETu6u+Fxalf8F/ybpK7qn1va0w3cGDU68oRqC0JHfo53JXjm9yQokj9Q== + dependencies: + "@aws-sdk/middleware-sdk-s3" "3.744.0" + "@aws-sdk/types" "3.734.0" + "@smithy/protocol-http" "^5.0.1" + "@smithy/signature-v4" "^5.0.1" + "@smithy/types" "^4.1.0" + tslib "^2.6.2" + +"@aws-sdk/token-providers@3.654.0": + version "3.654.0" + resolved "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.654.0.tgz" + integrity sha512-D8GeJYmvbfWkQDtTB4owmIobSMexZel0fOoetwvgCQ/7L8VPph3Q2bn1TRRIXvH7wdt6DcDxA3tKMHPBkT3GlA== + dependencies: + "@aws-sdk/types" "3.654.0" + "@smithy/property-provider" "^3.1.6" + "@smithy/shared-ini-file-loader" "^3.1.7" + "@smithy/types" "^3.4.2" + tslib "^2.6.2" + +"@aws-sdk/token-providers@3.714.0": + version "3.714.0" + resolved "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.714.0.tgz" + integrity sha512-vKN064aLE3kl+Zl16Ony3jltHnMddMBT7JRkP1L+lLywhA0PcAKxpdvComul/sTBWnbnwLnaS5NsDUhcWySH8A== + dependencies: + "@aws-sdk/types" "3.714.0" + "@smithy/property-provider" "^3.1.11" + "@smithy/shared-ini-file-loader" "^3.1.12" + "@smithy/types" "^3.7.2" + tslib "^2.6.2" + +"@aws-sdk/token-providers@3.744.0": + version "3.744.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/token-providers/-/token-providers-3.744.0.tgz#bedfda532cea4b28c323c5e0d23c7d974ce2ccc8" + integrity sha512-v/1+lWkDCd60Ei6oyhJqli6mTsPEVepLoSMB50vHUVlJP0fzXu/3FMje90/RzeUoh/VugZQJCEv/NNpuC6wztg== + dependencies: + "@aws-sdk/nested-clients" "3.744.0" + "@aws-sdk/types" "3.734.0" + "@smithy/property-provider" "^4.0.1" + "@smithy/shared-ini-file-loader" "^4.0.1" + "@smithy/types" "^4.1.0" + tslib "^2.6.2" + +"@aws-sdk/types@3.654.0": + version "3.654.0" + resolved "https://registry.npmjs.org/@aws-sdk/types/-/types-3.654.0.tgz" + integrity sha512-VWvbED3SV+10QJIcmU/PKjsKilsTV16d1I7/on4bvD/jo1qGeMXqLDBSen3ks/tuvXZF/mFc7ZW/W2DiLVtO7A== + dependencies: + "@smithy/types" "^3.4.2" + tslib "^2.6.2" + +"@aws-sdk/types@3.714.0", "@aws-sdk/types@^3.222.0": + version "3.714.0" + resolved "https://registry.npmjs.org/@aws-sdk/types/-/types-3.714.0.tgz" + integrity sha512-ZjpP2gYbSFlxxaUDa1Il5AVvfggvUPbjzzB/l3q0gIE5Thd6xKW+yzEpt2mLZ5s5UaYSABZbF94g8NUOF4CVGA== + dependencies: + "@smithy/types" "^3.7.2" + tslib "^2.6.2" + +"@aws-sdk/types@3.734.0": + version "3.734.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/types/-/types-3.734.0.tgz#af5e620b0e761918282aa1c8e53cac6091d169a2" + integrity sha512-o11tSPTT70nAkGV1fN9wm/hAIiLPyWX6SuGf+9JyTp7S/rC2cFWhR26MvA69nplcjNaXVzB0f+QFrLXXjOqCrg== + dependencies: + "@smithy/types" "^4.1.0" + tslib "^2.6.2" + +"@aws-sdk/util-arn-parser@3.723.0": + version "3.723.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/util-arn-parser/-/util-arn-parser-3.723.0.tgz#e9bff2b13918a92d60e0012101dad60ed7db292c" + integrity sha512-ZhEfvUwNliOQROcAk34WJWVYTlTa4694kSVhDSjW6lE1bMataPnIN8A0ycukEzBXmd8ZSoBcQLn6lKGl7XIJ5w== + dependencies: + tslib "^2.6.2" + +"@aws-sdk/util-endpoints@3.654.0": + version "3.654.0" + resolved "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.654.0.tgz" + integrity sha512-i902fcBknHs0Irgdpi62+QMvzxE+bczvILXigYrlHL4+PiEnlMVpni5L5W1qCkNZXf8AaMrSBuR1NZAGp6UOUw== + dependencies: + "@aws-sdk/types" "3.654.0" + "@smithy/types" "^3.4.2" + "@smithy/util-endpoints" "^2.1.2" + tslib "^2.6.2" + +"@aws-sdk/util-endpoints@3.714.0": + version "3.714.0" + resolved "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.714.0.tgz" + integrity sha512-Xv+Z2lhe7w7ZZRsgBwBMZgGTVmS+dkkj2S13uNHAx9lhB5ovM8PhK5G/j28xYf6vIibeuHkRAbb7/ozdZIGR+A== + dependencies: + "@aws-sdk/types" "3.714.0" + "@smithy/types" "^3.7.2" + "@smithy/util-endpoints" "^2.1.7" + tslib "^2.6.2" + +"@aws-sdk/util-endpoints@3.743.0": + version "3.743.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/util-endpoints/-/util-endpoints-3.743.0.tgz#fba654e0c5f1c8ba2b3e175dfee8e3ba4df2394a" + integrity sha512-sN1l559zrixeh5x+pttrnd0A3+r34r0tmPkJ/eaaMaAzXqsmKU/xYre9K3FNnsSS1J1k4PEfk/nHDTVUgFYjnw== + dependencies: + "@aws-sdk/types" "3.734.0" + "@smithy/types" "^4.1.0" + "@smithy/util-endpoints" "^3.0.1" + tslib "^2.6.2" + +"@aws-sdk/util-locate-window@^3.0.0": + version "3.693.0" + resolved "https://registry.npmjs.org/@aws-sdk/util-locate-window/-/util-locate-window-3.693.0.tgz" + integrity sha512-ttrag6haJLWABhLqtg1Uf+4LgHWIMOVSYL+VYZmAp2v4PUGOwWmWQH0Zk8RM7YuQcLfH/EoR72/Yxz6A4FKcuw== + dependencies: + tslib "^2.6.2" + +"@aws-sdk/util-user-agent-browser@3.654.0": + version "3.654.0" + resolved "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.654.0.tgz" + integrity sha512-ykYAJqvnxLt7wfrqya28wuH3/7NdrwzfiFd7NqEVQf7dXVxL5RPEpD7DxjcyQo3DsHvvdUvGZVaQhozycn1pzA== + dependencies: + "@aws-sdk/types" "3.654.0" + "@smithy/types" "^3.4.2" + bowser "^2.11.0" + tslib "^2.6.2" + +"@aws-sdk/util-user-agent-browser@3.714.0": + version "3.714.0" + resolved "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.714.0.tgz" + integrity sha512-OdJJ03cP9/MgIVToPJPCPUImbpZzTcwdIgbXC0tUQPJhbD7b7cB4LdnkhNHko+MptpOrCq4CPY/33EpOjRdofw== + dependencies: + "@aws-sdk/types" "3.714.0" + "@smithy/types" "^3.7.2" + bowser "^2.11.0" + tslib "^2.6.2" + +"@aws-sdk/util-user-agent-browser@3.734.0": + version "3.734.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.734.0.tgz#bbf3348b14bd7783f60346e1ce86978999450fe7" + integrity sha512-xQTCus6Q9LwUuALW+S76OL0jcWtMOVu14q+GoLnWPUM7QeUw963oQcLhF7oq0CtaLLKyl4GOUfcwc773Zmwwng== + dependencies: + "@aws-sdk/types" "3.734.0" + "@smithy/types" "^4.1.0" + bowser "^2.11.0" + tslib "^2.6.2" + +"@aws-sdk/util-user-agent-node@3.654.0": + version "3.654.0" + resolved "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.654.0.tgz" + integrity sha512-a0ojjdBN6pqv6gB4H/QPPSfhs7mFtlVwnmKCM/QrTaFzN0U810PJ1BST3lBx5sa23I5jWHGaoFY+5q65C3clLQ== + dependencies: + "@aws-sdk/types" "3.654.0" + "@smithy/node-config-provider" "^3.1.7" + "@smithy/types" "^3.4.2" + tslib "^2.6.2" + +"@aws-sdk/util-user-agent-node@3.714.0": + version "3.714.0" + resolved "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.714.0.tgz" + integrity sha512-x8JoZb7yBEbNUmHUNoRAP4L++6A5uZCVf2yFLw8CZKpH4q+Cf1a68ou48OfnND3H0rbBnLXc/3uOlseRvd57/g== + dependencies: + "@aws-sdk/middleware-user-agent" "3.714.0" + "@aws-sdk/types" "3.714.0" + "@smithy/node-config-provider" "^3.1.12" + "@smithy/types" "^3.7.2" + tslib "^2.6.2" + +"@aws-sdk/util-user-agent-node@3.744.0": + version "3.744.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.744.0.tgz#d2a5293d5036c95832020d596ce28d6899223971" + integrity sha512-BJURjwIXhNa4heXkLC0+GcL+8wVXaU7JoyW6ckdvp93LL+sVHeR1d5FxXZHQW/pMI4E3gNlKyBqjKaT75tObNQ== + dependencies: + "@aws-sdk/middleware-user-agent" "3.744.0" + "@aws-sdk/types" "3.734.0" + "@smithy/node-config-provider" "^4.0.1" + "@smithy/types" "^4.1.0" + tslib "^2.6.2" + +"@aws-sdk/xml-builder@3.734.0": + version "3.734.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/xml-builder/-/xml-builder-3.734.0.tgz#174d3269d303919e3ebfbfa3dd9b6d5a6a7a9543" + integrity sha512-Zrjxi5qwGEcUsJ0ru7fRtW74WcTS0rbLcehoFB+rN1GRi2hbLcFaYs4PwVA5diLeAJH0gszv3x4Hr/S87MfbKQ== + dependencies: + "@smithy/types" "^4.1.0" + tslib "^2.6.2" + +"@azure/abort-controller@^1.0.0": + version "1.1.0" + resolved "https://registry.npmjs.org/@azure/abort-controller/-/abort-controller-1.1.0.tgz" + integrity sha512-TrRLIoSQVzfAJX9H1JeFjzAoDGcoK1IYX1UImfceTZpsyYfWr09Ss1aHW1y5TrrR3iq6RZLBwJ3E24uwPhwahw== + dependencies: + tslib "^2.2.0" + +"@azure/abort-controller@^2.0.0", "@azure/abort-controller@^2.1.2": + version "2.1.2" + resolved "https://registry.npmjs.org/@azure/abort-controller/-/abort-controller-2.1.2.tgz" + integrity sha512-nBrLsEWm4J2u5LpAPjxADTlq3trDgVZZXHNKabeXZtpq3d3AbN/KGO82R87rdDz5/lYB024rtEf10/q0urNgsA== + dependencies: + tslib "^2.6.2" + +"@azure/arm-containerinstance@^9.1.0": + version "9.1.0" + resolved "https://registry.npmjs.org/@azure/arm-containerinstance/-/arm-containerinstance-9.1.0.tgz" + integrity sha512-N9T3/HJwWXvJuz7tin+nO+DYYCTGHILJ5Die3TtdF8Wd1ITfXGqB0vY/wOnspUu/AGojhaIKGmawAfPdw2kX8w== + dependencies: + "@azure/abort-controller" "^1.0.0" + "@azure/core-auth" "^1.3.0" + "@azure/core-client" "^1.7.0" + "@azure/core-lro" "^2.5.0" + "@azure/core-paging" "^1.2.0" + "@azure/core-rest-pipeline" "^1.8.0" + tslib "^2.2.0" + +"@azure/core-auth@^1.3.0", "@azure/core-auth@^1.4.0", "@azure/core-auth@^1.8.0", "@azure/core-auth@^1.9.0": + version "1.9.0" + resolved "https://registry.npmjs.org/@azure/core-auth/-/core-auth-1.9.0.tgz" + integrity sha512-FPwHpZywuyasDSLMqJ6fhbOK3TqUdviZNF8OqRGA4W5Ewib2lEEZ+pBsYcBa88B2NGO/SEnYPGhyBqNlE8ilSw== + dependencies: + "@azure/abort-controller" "^2.0.0" + "@azure/core-util" "^1.11.0" + tslib "^2.6.2" + +"@azure/core-client@^1.3.0", "@azure/core-client@^1.6.2", "@azure/core-client@^1.7.0", "@azure/core-client@^1.9.2": + version "1.9.2" + resolved "https://registry.npmjs.org/@azure/core-client/-/core-client-1.9.2.tgz" + integrity sha512-kRdry/rav3fUKHl/aDLd/pDLcB+4pOFwPPTVEExuMyaI5r+JBbMWqRbCY1pn5BniDaU3lRxO9eaQ1AmSMehl/w== + dependencies: + "@azure/abort-controller" "^2.0.0" + "@azure/core-auth" "^1.4.0" + "@azure/core-rest-pipeline" "^1.9.1" + "@azure/core-tracing" "^1.0.0" + "@azure/core-util" "^1.6.1" + "@azure/logger" "^1.0.0" + tslib "^2.6.2" + +"@azure/core-http-compat@^2.0.0": + version "2.1.2" + resolved "https://registry.npmjs.org/@azure/core-http-compat/-/core-http-compat-2.1.2.tgz" + integrity sha512-5MnV1yqzZwgNLLjlizsU3QqOeQChkIXw781Fwh1xdAqJR5AA32IUaq6xv1BICJvfbHoa+JYcaij2HFkhLbNTJQ== + dependencies: + "@azure/abort-controller" "^2.0.0" + "@azure/core-client" "^1.3.0" + "@azure/core-rest-pipeline" "^1.3.0" + +"@azure/core-lro@^2.2.0", "@azure/core-lro@^2.5.0": + version "2.7.2" + resolved "https://registry.npmjs.org/@azure/core-lro/-/core-lro-2.7.2.tgz" + integrity sha512-0YIpccoX8m/k00O7mDDMdJpbr6mf1yWo2dfmxt5A8XVZVVMz2SSKaEbMCeJRvgQ0IaSlqhjT47p4hVIRRy90xw== + dependencies: + "@azure/abort-controller" "^2.0.0" + "@azure/core-util" "^1.2.0" + "@azure/logger" "^1.0.0" + tslib "^2.6.2" + +"@azure/core-paging@^1.1.1", "@azure/core-paging@^1.2.0": + version "1.6.2" + resolved "https://registry.npmjs.org/@azure/core-paging/-/core-paging-1.6.2.tgz" + integrity sha512-YKWi9YuCU04B55h25cnOYZHxXYtEvQEbKST5vqRga7hWY9ydd3FZHdeQF8pyh+acWZvppw13M/LMGx0LABUVMA== + dependencies: + tslib "^2.6.2" + +"@azure/core-rest-pipeline@^1.10.1", "@azure/core-rest-pipeline@^1.17.0", "@azure/core-rest-pipeline@^1.3.0", "@azure/core-rest-pipeline@^1.8.0", "@azure/core-rest-pipeline@^1.9.1": + version "1.18.1" + resolved "https://registry.npmjs.org/@azure/core-rest-pipeline/-/core-rest-pipeline-1.18.1.tgz" + integrity sha512-/wS73UEDrxroUEVywEm7J0p2c+IIiVxyfigCGfsKvCxxCET4V/Hef2aURqltrXMRjNmdmt5IuOgIpl8f6xdO5A== + dependencies: + "@azure/abort-controller" "^2.0.0" + "@azure/core-auth" "^1.8.0" + "@azure/core-tracing" "^1.0.1" + "@azure/core-util" "^1.11.0" + "@azure/logger" "^1.0.0" + http-proxy-agent "^7.0.0" + https-proxy-agent "^7.0.0" + tslib "^2.6.2" + +"@azure/core-tracing@^1.0.0", "@azure/core-tracing@^1.0.1", "@azure/core-tracing@^1.1.2": + version "1.2.0" + resolved "https://registry.npmjs.org/@azure/core-tracing/-/core-tracing-1.2.0.tgz" + integrity sha512-UKTiEJPkWcESPYJz3X5uKRYyOcJD+4nYph+KpfdPRnQJVrZfk0KJgdnaAWKfhsBBtAf/D58Az4AvCJEmWgIBAg== + dependencies: + tslib "^2.6.2" + +"@azure/core-util@^1.11.0", "@azure/core-util@^1.2.0", "@azure/core-util@^1.6.1": + version "1.11.0" + resolved "https://registry.npmjs.org/@azure/core-util/-/core-util-1.11.0.tgz" + integrity sha512-DxOSLua+NdpWoSqULhjDyAZTXFdP/LKkqtYuxxz1SCN289zk3OG8UOpnCQAz/tygyACBtWp/BoO72ptK7msY8g== + dependencies: + "@azure/abort-controller" "^2.0.0" + tslib "^2.6.2" + +"@azure/core-xml@^1.4.3": + version "1.4.4" + resolved "https://registry.npmjs.org/@azure/core-xml/-/core-xml-1.4.4.tgz" + integrity sha512-J4FYAqakGXcbfeZjwjMzjNcpcH4E+JtEBv+xcV1yL0Ydn/6wbQfeFKTCHh9wttAi0lmajHw7yBbHPRG+YHckZQ== + dependencies: + fast-xml-parser "^4.4.1" + tslib "^2.6.2" + +"@azure/identity@^4.2.0": + version "4.5.0" + resolved "https://registry.npmjs.org/@azure/identity/-/identity-4.5.0.tgz" + integrity sha512-EknvVmtBuSIic47xkOqyNabAme0RYTw52BTMz8eBgU1ysTyMrD1uOoM+JdS0J/4Yfp98IBT3osqq3BfwSaNaGQ== + dependencies: + "@azure/abort-controller" "^2.0.0" + "@azure/core-auth" "^1.9.0" + "@azure/core-client" "^1.9.2" + "@azure/core-rest-pipeline" "^1.17.0" + "@azure/core-tracing" "^1.0.0" + "@azure/core-util" "^1.11.0" + "@azure/logger" "^1.0.0" + "@azure/msal-browser" "^3.26.1" + "@azure/msal-node" "^2.15.0" + events "^3.0.0" + jws "^4.0.0" + open "^8.0.0" + stoppable "^1.1.0" + tslib "^2.2.0" + +"@azure/logger@^1.0.0": + version "1.1.4" + resolved "https://registry.npmjs.org/@azure/logger/-/logger-1.1.4.tgz" + integrity sha512-4IXXzcCdLdlXuCG+8UKEwLA1T1NHqUfanhXYHiQTn+6sfWCZXduqbtXDGceg3Ce5QxTGo7EqmbV6Bi+aqKuClQ== + dependencies: + tslib "^2.6.2" + +"@azure/msal-browser@^3.26.1": + version "3.28.0" + resolved "https://registry.npmjs.org/@azure/msal-browser/-/msal-browser-3.28.0.tgz" + integrity sha512-1c1qUF6vB52mWlyoMem4xR1gdwiQWYEQB2uhDkbAL4wVJr8WmAcXybc1Qs33y19N4BdPI8/DHI7rPE8L5jMtWw== + dependencies: + "@azure/msal-common" "14.16.0" + +"@azure/msal-common@14.16.0": + version "14.16.0" + resolved "https://registry.npmjs.org/@azure/msal-common/-/msal-common-14.16.0.tgz" + integrity sha512-1KOZj9IpcDSwpNiQNjt0jDYZpQvNZay7QAEi/5DLubay40iGYtLzya/jbjRPLyOTZhEKyL1MzPuw2HqBCjceYA== + +"@azure/msal-node@^2.15.0": + version "2.16.2" + resolved "https://registry.npmjs.org/@azure/msal-node/-/msal-node-2.16.2.tgz" + integrity sha512-An7l1hEr0w1HMMh1LU+rtDtqL7/jw74ORlc9Wnh06v7TU/xpG39/Zdr1ZJu3QpjUfKJ+E0/OXMW8DRSWTlh7qQ== + dependencies: + "@azure/msal-common" "14.16.0" + jsonwebtoken "^9.0.0" + uuid "^8.3.0" + +"@azure/storage-blob@^12.18.0": + version "12.26.0" + resolved "https://registry.npmjs.org/@azure/storage-blob/-/storage-blob-12.26.0.tgz" + integrity sha512-SriLPKezypIsiZ+TtlFfE46uuBIap2HeaQVS78e1P7rz5OSbq0rsd52WE1mC5f7vAeLiXqv7I7oRhL3WFZEw3Q== + dependencies: + "@azure/abort-controller" "^2.1.2" + "@azure/core-auth" "^1.4.0" + "@azure/core-client" "^1.6.2" + "@azure/core-http-compat" "^2.0.0" + "@azure/core-lro" "^2.2.0" + "@azure/core-paging" "^1.1.1" + "@azure/core-rest-pipeline" "^1.10.1" + "@azure/core-tracing" "^1.1.2" + "@azure/core-util" "^1.6.1" + "@azure/core-xml" "^1.4.3" + "@azure/logger" "^1.0.0" + events "^3.0.0" + tslib "^2.2.0" + +"@azure/storage-queue@^12.22.0": + version "12.25.0" + resolved "https://registry.npmjs.org/@azure/storage-queue/-/storage-queue-12.25.0.tgz" + integrity sha512-uoobHFbH/o7wIul/sCm32X2YFq6zb1XpNdpKIms9I60mwG3BBaOpEs5pgQV5a5ONG5WMSHlo8E1dNFB5ZZIa1g== + dependencies: + "@azure/abort-controller" "^2.1.2" + "@azure/core-auth" "^1.4.0" + "@azure/core-client" "^1.6.2" + "@azure/core-http-compat" "^2.0.0" + "@azure/core-paging" "^1.1.1" + "@azure/core-rest-pipeline" "^1.10.1" + "@azure/core-tracing" "^1.1.2" + "@azure/core-util" "^1.6.1" + "@azure/core-xml" "^1.4.3" + "@azure/logger" "^1.0.0" + tslib "^2.2.0" + +"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.25.9", "@babel/code-frame@^7.26.0", "@babel/code-frame@^7.26.2": + version "7.26.2" + resolved "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.26.2.tgz" + integrity sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ== + dependencies: + "@babel/helper-validator-identifier" "^7.25.9" + js-tokens "^4.0.0" + picocolors "^1.0.0" + +"@babel/compat-data@^7.25.9": + version "7.26.3" + resolved "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.26.3.tgz" + integrity sha512-nHIxvKPniQXpmQLb0vhY3VaFb3S0YrTAwpOWJZh1wn3oJPjJk9Asva204PsBdmAE8vpzfHudT8DB0scYvy9q0g== + +"@babel/core@^7.23.9": + version "7.26.0" + resolved "https://registry.npmjs.org/@babel/core/-/core-7.26.0.tgz" + integrity sha512-i1SLeK+DzNnQ3LL/CswPCa/E5u4lh1k6IAEphON8F+cXt0t9euTshDru0q7/IqMa1PMPz5RnHuHscF8/ZJsStg== + dependencies: + "@ampproject/remapping" "^2.2.0" + "@babel/code-frame" "^7.26.0" + "@babel/generator" "^7.26.0" + "@babel/helper-compilation-targets" "^7.25.9" + "@babel/helper-module-transforms" "^7.26.0" + "@babel/helpers" "^7.26.0" + "@babel/parser" "^7.26.0" + "@babel/template" "^7.25.9" + "@babel/traverse" "^7.25.9" + "@babel/types" "^7.26.0" + convert-source-map "^2.0.0" + debug "^4.1.0" + gensync "^1.0.0-beta.2" + json5 "^2.2.3" + semver "^6.3.1" + +"@babel/generator@^7.26.0", "@babel/generator@^7.26.3": + version "7.26.3" + resolved "https://registry.npmjs.org/@babel/generator/-/generator-7.26.3.tgz" + integrity sha512-6FF/urZvD0sTeO7k6/B15pMLC4CHUv1426lzr3N01aHJTl046uCAh9LXW/fzeXXjPNCJ6iABW5XaWOsIZB93aQ== + dependencies: + "@babel/parser" "^7.26.3" + "@babel/types" "^7.26.3" + "@jridgewell/gen-mapping" "^0.3.5" + "@jridgewell/trace-mapping" "^0.3.25" + jsesc "^3.0.2" + +"@babel/helper-compilation-targets@^7.25.9": + version "7.25.9" + resolved "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.25.9.tgz" + integrity sha512-j9Db8Suy6yV/VHa4qzrj9yZfZxhLWQdVnRlXxmKLYlhWUVB1sB2G5sxuWYXk/whHD9iW76PmNzxZ4UCnTQTVEQ== + dependencies: + "@babel/compat-data" "^7.25.9" + "@babel/helper-validator-option" "^7.25.9" + browserslist "^4.24.0" + lru-cache "^5.1.1" + semver "^6.3.1" + +"@babel/helper-module-imports@^7.25.9": + version "7.25.9" + resolved "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.25.9.tgz" + integrity sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw== + dependencies: + "@babel/traverse" "^7.25.9" + "@babel/types" "^7.25.9" + +"@babel/helper-module-transforms@^7.26.0": + version "7.26.0" + resolved "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.26.0.tgz" + integrity sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw== + dependencies: + "@babel/helper-module-imports" "^7.25.9" + "@babel/helper-validator-identifier" "^7.25.9" + "@babel/traverse" "^7.25.9" + +"@babel/helper-string-parser@^7.25.9": + version "7.25.9" + resolved "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.25.9.tgz" + integrity sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA== + +"@babel/helper-validator-identifier@^7.25.9": + version "7.25.9" + resolved "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz" + integrity sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ== + +"@babel/helper-validator-option@^7.25.9": + version "7.25.9" + resolved "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.25.9.tgz" + integrity sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw== + +"@babel/helpers@^7.26.0": + version "7.26.0" + resolved "https://registry.npmjs.org/@babel/helpers/-/helpers-7.26.0.tgz" + integrity sha512-tbhNuIxNcVb21pInl3ZSjksLCvgdZy9KwJ8brv993QtIVKJBBkYXz4q4ZbAv31GdnC+R90np23L5FbEBlthAEw== + dependencies: + "@babel/template" "^7.25.9" + "@babel/types" "^7.26.0" + +"@babel/parser@^7.21.8", "@babel/parser@^7.23.9", "@babel/parser@^7.25.4", "@babel/parser@^7.25.9", "@babel/parser@^7.26.0", "@babel/parser@^7.26.3": + version "7.26.3" + resolved "https://registry.npmjs.org/@babel/parser/-/parser-7.26.3.tgz" + integrity sha512-WJ/CvmY8Mea8iDXo6a7RK2wbmJITT5fN3BEkRuFlxVyNx8jOKIIhmC4fSkTcPcf8JyavbBwIe6OpiCOBXt/IcA== + dependencies: + "@babel/types" "^7.26.3" + +"@babel/runtime@^7.15.4": + version "7.26.0" + resolved "https://registry.npmjs.org/@babel/runtime/-/runtime-7.26.0.tgz" + integrity sha512-FDSOghenHTiToteC/QRlv2q3DhPZ/oOXTBoirfWNx1Cx3TMVcGWQtMMmQcSvb/JjpNeGzx8Pq/b4fKEJuWm1sw== + dependencies: + regenerator-runtime "^0.14.0" + +"@babel/template@^7.25.9": + version "7.25.9" + resolved "https://registry.npmjs.org/@babel/template/-/template-7.25.9.tgz" + integrity sha512-9DGttpmPvIxBb/2uwpVo3dqJ+O6RooAFOS+lB+xDqoE2PVCE8nfoHMdZLpfCQRLwvohzXISPZcgxt80xLfsuwg== + dependencies: + "@babel/code-frame" "^7.25.9" + "@babel/parser" "^7.25.9" + "@babel/types" "^7.25.9" + +"@babel/traverse@^7.25.9": + version "7.26.4" + resolved "https://registry.npmjs.org/@babel/traverse/-/traverse-7.26.4.tgz" + integrity sha512-fH+b7Y4p3yqvApJALCPJcwb0/XaOSgtK4pzV6WVjPR5GLFQBRI7pfoX2V2iM48NXvX07NUxxm1Vw98YjqTcU5w== + dependencies: + "@babel/code-frame" "^7.26.2" + "@babel/generator" "^7.26.3" + "@babel/parser" "^7.26.3" + "@babel/template" "^7.25.9" + "@babel/types" "^7.26.3" + debug "^4.3.1" + globals "^11.1.0" + +"@babel/types@^7.25.4", "@babel/types@^7.25.9", "@babel/types@^7.26.0", "@babel/types@^7.26.3": + version "7.26.3" + resolved "https://registry.npmjs.org/@babel/types/-/types-7.26.3.tgz" + integrity sha512-vN5p+1kl59GVKMvTHt55NzzmYVxprfJD+ql7U9NFIfKCBkYE55LYtS+WtPlaYOyzydrKI8Nezd+aZextrd+FMA== + dependencies: + "@babel/helper-string-parser" "^7.25.9" + "@babel/helper-validator-identifier" "^7.25.9" + +"@base2/pretty-print-object@1.0.1": + version "1.0.1" + resolved "https://registry.npmjs.org/@base2/pretty-print-object/-/pretty-print-object-1.0.1.tgz" + integrity sha512-4iri8i1AqYHJE2DstZYkyEprg6Pq6sKx3xn5FpySk9sNhH7qN2LLlHJCfDTZRILNwQNPD7mATWM0TBui7uC1pA== + +"@bcoe/v8-coverage@^0.2.3": + version "0.2.3" + resolved "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz" + integrity sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw== + +"@biomejs/biome@1.9.4": + version "1.9.4" + resolved "https://registry.npmjs.org/@biomejs/biome/-/biome-1.9.4.tgz" + integrity sha512-1rkd7G70+o9KkTn5KLmDYXihGoTaIGO9PIIN2ZB7UJxFrWw04CZHPYiMRjYsaDvVV7hP1dYNRLxSANLaBFGpog== + optionalDependencies: + "@biomejs/cli-darwin-arm64" "1.9.4" + "@biomejs/cli-darwin-x64" "1.9.4" + "@biomejs/cli-linux-arm64" "1.9.4" + "@biomejs/cli-linux-arm64-musl" "1.9.4" + "@biomejs/cli-linux-x64" "1.9.4" + "@biomejs/cli-linux-x64-musl" "1.9.4" + "@biomejs/cli-win32-arm64" "1.9.4" + "@biomejs/cli-win32-x64" "1.9.4" + +"@biomejs/cli-darwin-arm64@1.9.4": + version "1.9.4" + resolved "https://registry.npmjs.org/@biomejs/cli-darwin-arm64/-/cli-darwin-arm64-1.9.4.tgz" + integrity sha512-bFBsPWrNvkdKrNCYeAp+xo2HecOGPAy9WyNyB/jKnnedgzl4W4Hb9ZMzYNbf8dMCGmUdSavlYHiR01QaYR58cw== + +"@biomejs/cli-darwin-x64@1.9.4": + version "1.9.4" + resolved "https://registry.yarnpkg.com/@biomejs/cli-darwin-x64/-/cli-darwin-x64-1.9.4.tgz#eafc2ce3849d385fc02238aad1ca4a73395a64d9" + integrity sha512-ngYBh/+bEedqkSevPVhLP4QfVPCpb+4BBe2p7Xs32dBgs7rh9nY2AIYUL6BgLw1JVXV8GlpKmb/hNiuIxfPfZg== + +"@biomejs/cli-linux-arm64-musl@1.9.4": + version "1.9.4" + resolved "https://registry.yarnpkg.com/@biomejs/cli-linux-arm64-musl/-/cli-linux-arm64-musl-1.9.4.tgz#d780c3e01758fc90f3268357e3f19163d1f84fca" + integrity sha512-v665Ct9WCRjGa8+kTr0CzApU0+XXtRgwmzIf1SeKSGAv+2scAlW6JR5PMFo6FzqqZ64Po79cKODKf3/AAmECqA== + +"@biomejs/cli-linux-arm64@1.9.4": + version "1.9.4" + resolved "https://registry.yarnpkg.com/@biomejs/cli-linux-arm64/-/cli-linux-arm64-1.9.4.tgz#8ed1dd0e89419a4b66a47f95aefb8c46ae6041c9" + integrity sha512-fJIW0+LYujdjUgJJuwesP4EjIBl/N/TcOX3IvIHJQNsAqvV2CHIogsmA94BPG6jZATS4Hi+xv4SkBBQSt1N4/g== + +"@biomejs/cli-linux-x64-musl@1.9.4": + version "1.9.4" + resolved "https://registry.yarnpkg.com/@biomejs/cli-linux-x64-musl/-/cli-linux-x64-musl-1.9.4.tgz#f36982b966bd671a36671e1de4417963d7db15fb" + integrity sha512-gEhi/jSBhZ2m6wjV530Yy8+fNqG8PAinM3oV7CyO+6c3CEh16Eizm21uHVsyVBEB6RIM8JHIl6AGYCv6Q6Q9Tg== + +"@biomejs/cli-linux-x64@1.9.4": + version "1.9.4" + resolved "https://registry.yarnpkg.com/@biomejs/cli-linux-x64/-/cli-linux-x64-1.9.4.tgz#a0a7f56680c76b8034ddc149dbf398bdd3a462e8" + integrity sha512-lRCJv/Vi3Vlwmbd6K+oQ0KhLHMAysN8lXoCI7XeHlxaajk06u7G+UsFSO01NAs5iYuWKmVZjmiOzJ0OJmGsMwg== + +"@biomejs/cli-win32-arm64@1.9.4": + version "1.9.4" + resolved "https://registry.yarnpkg.com/@biomejs/cli-win32-arm64/-/cli-win32-arm64-1.9.4.tgz#e2ef4e0084e76b7e26f0fc887c5ef1265ea56200" + integrity sha512-tlbhLk+WXZmgwoIKwHIHEBZUwxml7bRJgk0X2sPyNR3S93cdRq6XulAZRQJ17FYGGzWne0fgrXBKpl7l4M87Hg== + +"@biomejs/cli-win32-x64@1.9.4": + version "1.9.4" + resolved "https://registry.yarnpkg.com/@biomejs/cli-win32-x64/-/cli-win32-x64-1.9.4.tgz#4c7afa90e3970213599b4095e62f87e5972b2340" + integrity sha512-8Y5wMhVIPaWe6jw2H+KlEm4wP/f7EW3810ZLmDlrEEy5KvBsb9ECEfu/kMWD484ijfQ8+nIi0giMgu9g1UAuuA== + +"@colors/colors@1.5.0": + version "1.5.0" + resolved "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz" + integrity sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ== + +"@colors/colors@1.6.0", "@colors/colors@^1.6.0": + version "1.6.0" + resolved "https://registry.npmjs.org/@colors/colors/-/colors-1.6.0.tgz" + integrity sha512-Ir+AOibqzrIsL6ajt3Rz3LskB7OiMVHqltZmspbW/TJuTVuyOMirVqAkjfY6JISiLHgyNqicAC8AyHHGzNd/dA== + +"@commitlint/cli@^19.6.1": + version "19.6.1" + resolved "https://registry.npmjs.org/@commitlint/cli/-/cli-19.6.1.tgz" + integrity sha512-8hcyA6ZoHwWXC76BoC8qVOSr8xHy00LZhZpauiD0iO0VYbVhMnED0da85lTfIULxl7Lj4c6vZgF0Wu/ed1+jlQ== + dependencies: + "@commitlint/format" "^19.5.0" + "@commitlint/lint" "^19.6.0" + "@commitlint/load" "^19.6.1" + "@commitlint/read" "^19.5.0" + "@commitlint/types" "^19.5.0" + tinyexec "^0.3.0" + yargs "^17.0.0" + +"@commitlint/config-validator@^19.5.0": + version "19.5.0" + resolved "https://registry.npmjs.org/@commitlint/config-validator/-/config-validator-19.5.0.tgz" + integrity sha512-CHtj92H5rdhKt17RmgALhfQt95VayrUo2tSqY9g2w+laAXyk7K/Ef6uPm9tn5qSIwSmrLjKaXK9eiNuxmQrDBw== + dependencies: + "@commitlint/types" "^19.5.0" + ajv "^8.11.0" + +"@commitlint/ensure@^19.5.0": + version "19.5.0" + resolved "https://registry.npmjs.org/@commitlint/ensure/-/ensure-19.5.0.tgz" + integrity sha512-Kv0pYZeMrdg48bHFEU5KKcccRfKmISSm9MvgIgkpI6m+ohFTB55qZlBW6eYqh/XDfRuIO0x4zSmvBjmOwWTwkg== + dependencies: + "@commitlint/types" "^19.5.0" + lodash.camelcase "^4.3.0" + lodash.kebabcase "^4.1.1" + lodash.snakecase "^4.1.1" + lodash.startcase "^4.4.0" + lodash.upperfirst "^4.3.1" + +"@commitlint/execute-rule@^19.5.0": + version "19.5.0" + resolved "https://registry.npmjs.org/@commitlint/execute-rule/-/execute-rule-19.5.0.tgz" + integrity sha512-aqyGgytXhl2ejlk+/rfgtwpPexYyri4t8/n4ku6rRJoRhGZpLFMqrZ+YaubeGysCP6oz4mMA34YSTaSOKEeNrg== + +"@commitlint/format@^19.5.0": + version "19.5.0" + resolved "https://registry.npmjs.org/@commitlint/format/-/format-19.5.0.tgz" + integrity sha512-yNy088miE52stCI3dhG/vvxFo9e4jFkU1Mj3xECfzp/bIS/JUay4491huAlVcffOoMK1cd296q0W92NlER6r3A== + dependencies: + "@commitlint/types" "^19.5.0" + chalk "^5.3.0" + +"@commitlint/is-ignored@^19.6.0": + version "19.6.0" + resolved "https://registry.npmjs.org/@commitlint/is-ignored/-/is-ignored-19.6.0.tgz" + integrity sha512-Ov6iBgxJQFR9koOupDPHvcHU9keFupDgtB3lObdEZDroiG4jj1rzky60fbQozFKVYRTUdrBGICHG0YVmRuAJmw== + dependencies: + "@commitlint/types" "^19.5.0" + semver "^7.6.0" + +"@commitlint/lint@^19.6.0": + version "19.6.0" + resolved "https://registry.npmjs.org/@commitlint/lint/-/lint-19.6.0.tgz" + integrity sha512-LRo7zDkXtcIrpco9RnfhOKeg8PAnE3oDDoalnrVU/EVaKHYBWYL1DlRR7+3AWn0JiBqD8yKOfetVxJGdEtZ0tg== + dependencies: + "@commitlint/is-ignored" "^19.6.0" + "@commitlint/parse" "^19.5.0" + "@commitlint/rules" "^19.6.0" + "@commitlint/types" "^19.5.0" + +"@commitlint/load@>6.1.1", "@commitlint/load@^19.6.1": + version "19.6.1" + resolved "https://registry.npmjs.org/@commitlint/load/-/load-19.6.1.tgz" + integrity sha512-kE4mRKWWNju2QpsCWt428XBvUH55OET2N4QKQ0bF85qS/XbsRGG1MiTByDNlEVpEPceMkDr46LNH95DtRwcsfA== + dependencies: + "@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" + cosmiconfig-typescript-loader "^6.1.0" + lodash.isplainobject "^4.0.6" + lodash.merge "^4.6.2" + lodash.uniq "^4.5.0" + +"@commitlint/message@^19.5.0": + version "19.5.0" + resolved "https://registry.npmjs.org/@commitlint/message/-/message-19.5.0.tgz" + integrity sha512-R7AM4YnbxN1Joj1tMfCyBryOC5aNJBdxadTZkuqtWi3Xj0kMdutq16XQwuoGbIzL2Pk62TALV1fZDCv36+JhTQ== + +"@commitlint/parse@^19.5.0": + version "19.5.0" + resolved "https://registry.npmjs.org/@commitlint/parse/-/parse-19.5.0.tgz" + integrity sha512-cZ/IxfAlfWYhAQV0TwcbdR1Oc0/r0Ik1GEessDJ3Lbuma/MRO8FRQX76eurcXtmhJC//rj52ZSZuXUg0oIX0Fw== + dependencies: + "@commitlint/types" "^19.5.0" + conventional-changelog-angular "^7.0.0" + conventional-commits-parser "^5.0.0" + +"@commitlint/read@^19.5.0": + version "19.5.0" + resolved "https://registry.npmjs.org/@commitlint/read/-/read-19.5.0.tgz" + integrity sha512-TjS3HLPsLsxFPQj6jou8/CZFAmOP2y+6V4PGYt3ihbQKTY1Jnv0QG28WRKl/d1ha6zLODPZqsxLEov52dhR9BQ== + 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" + +"@commitlint/resolve-extends@^19.5.0": + version "19.5.0" + resolved "https://registry.npmjs.org/@commitlint/resolve-extends/-/resolve-extends-19.5.0.tgz" + integrity sha512-CU/GscZhCUsJwcKTJS9Ndh3AKGZTNFIOoQB2n8CmFnizE0VnEuJoum+COW+C1lNABEeqk6ssfc1Kkalm4bDklA== + dependencies: + "@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" + +"@commitlint/rules@^19.6.0": + version "19.6.0" + resolved "https://registry.npmjs.org/@commitlint/rules/-/rules-19.6.0.tgz" + integrity sha512-1f2reW7lbrI0X0ozZMesS/WZxgPa4/wi56vFuJENBmed6mWq5KsheN/nxqnl/C23ioxpPO/PL6tXpiiFy5Bhjw== + dependencies: + "@commitlint/ensure" "^19.5.0" + "@commitlint/message" "^19.5.0" + "@commitlint/to-lines" "^19.5.0" + "@commitlint/types" "^19.5.0" + +"@commitlint/to-lines@^19.5.0": + version "19.5.0" + resolved "https://registry.npmjs.org/@commitlint/to-lines/-/to-lines-19.5.0.tgz" + integrity sha512-R772oj3NHPkodOSRZ9bBVNq224DOxQtNef5Pl8l2M8ZnkkzQfeSTr4uxawV2Sd3ui05dUVzvLNnzenDBO1KBeQ== + +"@commitlint/top-level@^19.5.0": + version "19.5.0" + resolved "https://registry.npmjs.org/@commitlint/top-level/-/top-level-19.5.0.tgz" + integrity sha512-IP1YLmGAk0yWrImPRRc578I3dDUI5A2UBJx9FbSOjxe9sTlzFiwVJ+zeMLgAtHMtGZsC8LUnzmW1qRemkFU4ng== + dependencies: + find-up "^7.0.0" + +"@commitlint/types@^19.5.0": + version "19.5.0" + resolved "https://registry.npmjs.org/@commitlint/types/-/types-19.5.0.tgz" + integrity sha512-DSHae2obMSMkAtTBSOulg5X7/z+rGLxcXQIkg3OmWvY6wifojge5uVMydfhUvs7yQj+V7jNmRZ2Xzl8GJyqRgg== + dependencies: + "@types/conventional-commits-parser" "^5.0.0" + chalk "^5.3.0" + +"@cspotcode/source-map-support@^0.8.0": + version "0.8.1" + resolved "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz" + integrity sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw== + dependencies: + "@jridgewell/trace-mapping" "0.3.9" + +"@dabh/diagnostics@^2.0.2": + version "2.0.3" + resolved "https://registry.npmjs.org/@dabh/diagnostics/-/diagnostics-2.0.3.tgz" + integrity sha512-hrlQOIi7hAfzsMqlGSFyVucrx38O+j6wiGOf//H2ecvIEqYN4ADBSS2iLMh5UFyDunCNniUIPk/q3riFv45xRA== + dependencies: + colorspace "1.1.x" + enabled "2.0.x" + kuler "^2.0.0" + +"@dependents/detective-less@^4.1.0": + version "4.1.0" + resolved "https://registry.npmjs.org/@dependents/detective-less/-/detective-less-4.1.0.tgz" + integrity sha512-KrkT6qO5NxqNfy68sBl6CTSoJ4SNDIS5iQArkibhlbGU4LaDukZ3q2HIkh8aUKDio6o4itU4xDR7t82Y2eP1Bg== + dependencies: + gonzales-pe "^4.3.0" + node-source-walk "^6.0.1" + +"@dotenvx/dotenvx@^1.31.0": + version "1.31.0" + resolved "https://registry.npmjs.org/@dotenvx/dotenvx/-/dotenvx-1.31.0.tgz" + integrity sha512-GeDxvtjiRuoyWVU9nQneId879zIyNdL05bS7RKiqMkfBSKpHMWHLoRyRqjYWLaXmX/llKO1hTlqHDmatkQAjPA== + dependencies: + commander "^11.1.0" + dotenv "^16.4.5" + eciesjs "^0.4.10" + execa "^5.1.1" + fdir "^6.2.0" + ignore "^5.3.0" + object-treeify "1.1.33" + picomatch "^4.0.2" + which "^4.0.0" + +"@ecies/ciphers@^0.2.1": + version "0.2.2" + resolved "https://registry.npmjs.org/@ecies/ciphers/-/ciphers-0.2.2.tgz" + integrity sha512-ylfGR7PyTd+Rm2PqQowG08BCKA22QuX8NzrL+LxAAvazN10DMwdJ2fWwAzRj05FI/M8vNFGm3cv9Wq/GFWCBLg== + +"@esbuild/aix-ppc64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz#c7184a326533fcdf1b8ee0733e21c713b975575f" + integrity sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ== + +"@esbuild/aix-ppc64@0.23.1": + version "0.23.1" + resolved "https://registry.yarnpkg.com/@esbuild/aix-ppc64/-/aix-ppc64-0.23.1.tgz#51299374de171dbd80bb7d838e1cfce9af36f353" + integrity sha512-6VhYk1diRqrhBAqpJEdjASR/+WVRtfjpqKuNw11cLiaWpAT/Uu+nokB+UJnevzy/P9C/ty6AOe0dwueMrGh/iQ== + +"@esbuild/android-arm64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz#09d9b4357780da9ea3a7dfb833a1f1ff439b4052" + integrity sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A== + +"@esbuild/android-arm64@0.23.1": + version "0.23.1" + resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.23.1.tgz#58565291a1fe548638adb9c584237449e5e14018" + integrity sha512-xw50ipykXcLstLeWH7WRdQuysJqejuAGPd30vd1i5zSyKK3WE+ijzHmLKxdiCMtH1pHz78rOg0BKSYOSB/2Khw== + +"@esbuild/android-arm@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.21.5.tgz#9b04384fb771926dfa6d7ad04324ecb2ab9b2e28" + integrity sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg== + +"@esbuild/android-arm@0.23.1": + version "0.23.1" + resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.23.1.tgz#5eb8c652d4c82a2421e3395b808e6d9c42c862ee" + integrity sha512-uz6/tEy2IFm9RYOyvKl88zdzZfwEfKZmnX9Cj1BHjeSGNuGLuMD1kR8y5bteYmwqKm1tj8m4cb/aKEorr6fHWQ== + +"@esbuild/android-x64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.21.5.tgz#29918ec2db754cedcb6c1b04de8cd6547af6461e" + integrity sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA== + +"@esbuild/android-x64@0.23.1": + version "0.23.1" + resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.23.1.tgz#ae19d665d2f06f0f48a6ac9a224b3f672e65d517" + integrity sha512-nlN9B69St9BwUoB+jkyU090bru8L0NA3yFvAd7k8dNsVH8bi9a8cUAUSEcEEgTp2z3dbEDGJGfP6VUnkQnlReg== + +"@esbuild/darwin-arm64@0.21.5": + version "0.21.5" + resolved "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz" + integrity sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ== + +"@esbuild/darwin-arm64@0.23.1": + version "0.23.1" + resolved "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.23.1.tgz" + integrity sha512-YsS2e3Wtgnw7Wq53XXBLcV6JhRsEq8hkfg91ESVadIrzr9wO6jJDMZnCQbHm1Guc5t/CdDiFSSfWP58FNuvT3Q== + +"@esbuild/darwin-x64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz#c13838fa57372839abdddc91d71542ceea2e1e22" + integrity sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw== + +"@esbuild/darwin-x64@0.23.1": + version "0.23.1" + resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.23.1.tgz#c58353b982f4e04f0d022284b8ba2733f5ff0931" + integrity sha512-aClqdgTDVPSEGgoCS8QDG37Gu8yc9lTHNAQlsztQ6ENetKEO//b8y31MMu2ZaPbn4kVsIABzVLXYLhCGekGDqw== + +"@esbuild/freebsd-arm64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz#646b989aa20bf89fd071dd5dbfad69a3542e550e" + integrity sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g== + +"@esbuild/freebsd-arm64@0.23.1": + version "0.23.1" + resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.23.1.tgz#f9220dc65f80f03635e1ef96cfad5da1f446f3bc" + integrity sha512-h1k6yS8/pN/NHlMl5+v4XPfikhJulk4G+tKGFIOwURBSFzE8bixw1ebjluLOjfwtLqY0kewfjLSrO6tN2MgIhA== + +"@esbuild/freebsd-x64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz#aa615cfc80af954d3458906e38ca22c18cf5c261" + integrity sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ== + +"@esbuild/freebsd-x64@0.23.1": + version "0.23.1" + resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.23.1.tgz#69bd8511fa013b59f0226d1609ac43f7ce489730" + integrity sha512-lK1eJeyk1ZX8UklqFd/3A60UuZ/6UVfGT2LuGo3Wp4/z7eRTRYY+0xOu2kpClP+vMTi9wKOfXi2vjUpO1Ro76g== + +"@esbuild/linux-arm64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz#70ac6fa14f5cb7e1f7f887bcffb680ad09922b5b" + integrity sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q== + +"@esbuild/linux-arm64@0.23.1": + version "0.23.1" + resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.23.1.tgz#8050af6d51ddb388c75653ef9871f5ccd8f12383" + integrity sha512-/93bf2yxencYDnItMYV/v116zff6UyTjo4EtEQjUBeGiVpMmffDNUyD9UN2zV+V3LRV3/on4xdZ26NKzn6754g== + +"@esbuild/linux-arm@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz#fc6fd11a8aca56c1f6f3894f2bea0479f8f626b9" + integrity sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA== + +"@esbuild/linux-arm@0.23.1": + version "0.23.1" + resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.23.1.tgz#ecaabd1c23b701070484990db9a82f382f99e771" + integrity sha512-CXXkzgn+dXAPs3WBwE+Kvnrf4WECwBdfjfeYHpMeVxWE0EceB6vhWGShs6wi0IYEqMSIzdOF1XjQ/Mkm5d7ZdQ== + +"@esbuild/linux-ia32@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz#3271f53b3f93e3d093d518d1649d6d68d346ede2" + integrity sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg== + +"@esbuild/linux-ia32@0.23.1": + version "0.23.1" + resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.23.1.tgz#3ed2273214178109741c09bd0687098a0243b333" + integrity sha512-VTN4EuOHwXEkXzX5nTvVY4s7E/Krz7COC8xkftbbKRYAl96vPiUssGkeMELQMOnLOJ8k3BY1+ZY52tttZnHcXQ== + +"@esbuild/linux-loong64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz#ed62e04238c57026aea831c5a130b73c0f9f26df" + integrity sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg== + +"@esbuild/linux-loong64@0.23.1": + version "0.23.1" + resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.23.1.tgz#a0fdf440b5485c81b0fbb316b08933d217f5d3ac" + integrity sha512-Vx09LzEoBa5zDnieH8LSMRToj7ir/Jeq0Gu6qJ/1GcBq9GkfoEAoXvLiW1U9J1qE/Y/Oyaq33w5p2ZWrNNHNEw== + +"@esbuild/linux-mips64el@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz#e79b8eb48bf3b106fadec1ac8240fb97b4e64cbe" + integrity sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg== + +"@esbuild/linux-mips64el@0.23.1": + version "0.23.1" + resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.23.1.tgz#e11a2806346db8375b18f5e104c5a9d4e81807f6" + integrity sha512-nrFzzMQ7W4WRLNUOU5dlWAqa6yVeI0P78WKGUo7lg2HShq/yx+UYkeNSE0SSfSure0SqgnsxPvmAUu/vu0E+3Q== + +"@esbuild/linux-ppc64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz#5f2203860a143b9919d383ef7573521fb154c3e4" + integrity sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w== + +"@esbuild/linux-ppc64@0.23.1": + version "0.23.1" + resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.23.1.tgz#06a2744c5eaf562b1a90937855b4d6cf7c75ec96" + integrity sha512-dKN8fgVqd0vUIjxuJI6P/9SSSe/mB9rvA98CSH2sJnlZ/OCZWO1DJvxj8jvKTfYUdGfcq2dDxoKaC6bHuTlgcw== + +"@esbuild/linux-riscv64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz#07bcafd99322d5af62f618cb9e6a9b7f4bb825dc" + integrity sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA== + +"@esbuild/linux-riscv64@0.23.1": + version "0.23.1" + resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.23.1.tgz#65b46a2892fc0d1af4ba342af3fe0fa4a8fe08e7" + integrity sha512-5AV4Pzp80fhHL83JM6LoA6pTQVWgB1HovMBsLQ9OZWLDqVY8MVobBXNSmAJi//Csh6tcY7e7Lny2Hg1tElMjIA== + +"@esbuild/linux-s390x@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz#b7ccf686751d6a3e44b8627ababc8be3ef62d8de" + integrity sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A== + +"@esbuild/linux-s390x@0.23.1": + version "0.23.1" + resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.23.1.tgz#e71ea18c70c3f604e241d16e4e5ab193a9785d6f" + integrity sha512-9ygs73tuFCe6f6m/Tb+9LtYxWR4c9yg7zjt2cYkjDbDpV/xVn+68cQxMXCjUpYwEkze2RcU/rMnfIXNRFmSoDw== + +"@esbuild/linux-x64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz#6d8f0c768e070e64309af8004bb94e68ab2bb3b0" + integrity sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ== + +"@esbuild/linux-x64@0.23.1": + version "0.23.1" + resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.23.1.tgz#d47f97391e80690d4dfe811a2e7d6927ad9eed24" + integrity sha512-EV6+ovTsEXCPAp58g2dD68LxoP/wK5pRvgy0J/HxPGB009omFPv3Yet0HiaqvrIrgPTBuC6wCH1LTOY91EO5hQ== + +"@esbuild/netbsd-x64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz#bbe430f60d378ecb88decb219c602667387a6047" + integrity sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg== + +"@esbuild/netbsd-x64@0.23.1": + version "0.23.1" + resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.23.1.tgz#44e743c9778d57a8ace4b72f3c6b839a3b74a653" + integrity sha512-aevEkCNu7KlPRpYLjwmdcuNz6bDFiE7Z8XC4CPqExjTvrHugh28QzUXVOZtiYghciKUacNktqxdpymplil1beA== + +"@esbuild/openbsd-arm64@0.23.1": + version "0.23.1" + resolved "https://registry.yarnpkg.com/@esbuild/openbsd-arm64/-/openbsd-arm64-0.23.1.tgz#05c5a1faf67b9881834758c69f3e51b7dee015d7" + integrity sha512-3x37szhLexNA4bXhLrCC/LImN/YtWis6WXr1VESlfVtVeoFJBRINPJ3f0a/6LV8zpikqoUg4hyXw0sFBt5Cr+Q== + +"@esbuild/openbsd-x64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz#99d1cf2937279560d2104821f5ccce220cb2af70" + integrity sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow== + +"@esbuild/openbsd-x64@0.23.1": + version "0.23.1" + resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.23.1.tgz#2e58ae511bacf67d19f9f2dcd9e8c5a93f00c273" + integrity sha512-aY2gMmKmPhxfU+0EdnN+XNtGbjfQgwZj43k8G3fyrDM/UdZww6xrWxmDkuz2eCZchqVeABjV5BpildOrUbBTqA== + +"@esbuild/sunos-x64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz#08741512c10d529566baba837b4fe052c8f3487b" + integrity sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg== + +"@esbuild/sunos-x64@0.23.1": + version "0.23.1" + resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.23.1.tgz#adb022b959d18d3389ac70769cef5a03d3abd403" + integrity sha512-RBRT2gqEl0IKQABT4XTj78tpk9v7ehp+mazn2HbUeZl1YMdaGAQqhapjGTCe7uw7y0frDi4gS0uHzhvpFuI1sA== + +"@esbuild/win32-arm64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz#675b7385398411240735016144ab2e99a60fc75d" + integrity sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A== + +"@esbuild/win32-arm64@0.23.1": + version "0.23.1" + resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.23.1.tgz#84906f50c212b72ec360f48461d43202f4c8b9a2" + integrity sha512-4O+gPR5rEBe2FpKOVyiJ7wNDPA8nGzDuJ6gN4okSA1gEOYZ67N8JPk58tkWtdtPeLz7lBnY6I5L3jdsr3S+A6A== + +"@esbuild/win32-ia32@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz#1bfc3ce98aa6ca9a0969e4d2af72144c59c1193b" + integrity sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA== + +"@esbuild/win32-ia32@0.23.1": + version "0.23.1" + resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.23.1.tgz#5e3eacc515820ff729e90d0cb463183128e82fac" + integrity sha512-BcaL0Vn6QwCwre3Y717nVHZbAa4UBEigzFm6VdsVdT/MbZ38xoj1X9HPkZhbmaBGUD1W8vxAfffbDe8bA6AKnQ== + +"@esbuild/win32-x64@0.21.5": + version "0.21.5" + resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz#acad351d582d157bb145535db2a6ff53dd514b5c" + integrity sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw== + +"@esbuild/win32-x64@0.23.1": + version "0.23.1" + resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.23.1.tgz#81fd50d11e2c32b2d6241470e3185b70c7b30699" + integrity sha512-BHpFFeslkWrXWyUPnbKm+xYYVYruCinGcftSBaa8zoF9hZO4BcSCFUvHVTtzpIY6YzUnYtuEhZ+C9iEXjxnasg== + +"@grpc/grpc-js@^1.7.1": + version "1.12.5" + resolved "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.12.5.tgz" + integrity sha512-d3iiHxdpg5+ZcJ6jnDSOT8Z0O0VMVGy34jAnYLUX8yd36b1qn8f1TwOA/Lc7TsOh03IkPJ38eGI5qD2EjNkoEA== + dependencies: + "@grpc/proto-loader" "^0.7.13" + "@js-sdsl/ordered-map" "^4.4.2" + +"@grpc/proto-loader@^0.7.13": + version "0.7.13" + resolved "https://registry.npmjs.org/@grpc/proto-loader/-/proto-loader-0.7.13.tgz" + integrity sha512-AiXO/bfe9bmxBjxxtYxFAXGZvMaN5s8kO+jBHAJCON8rJoB5YS/D6X7ZNc6XQkuHNmyl4CYaMI1fJ/Gn27RGGw== + dependencies: + lodash.camelcase "^4.3.0" + long "^5.0.0" + protobufjs "^7.2.5" + yargs "^17.7.2" + +"@hapi/hoek@^9.0.0", "@hapi/hoek@^9.3.0": + version "9.3.0" + resolved "https://registry.npmjs.org/@hapi/hoek/-/hoek-9.3.0.tgz" + integrity sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ== + +"@hapi/topo@^5.1.0": + version "5.1.0" + resolved "https://registry.npmjs.org/@hapi/topo/-/topo-5.1.0.tgz" + integrity sha512-foQZKJig7Ob0BMAYBfcJk8d77QtOe7Wo4ox7ff1lQYoNNAb6jwcY1ncdoy2e9wQZzvNy7ODZCYJkK8kzmcAnAg== + dependencies: + "@hapi/hoek" "^9.0.0" + +"@inquirer/checkbox@^4.0.3": + version "4.0.3" + resolved "https://registry.npmjs.org/@inquirer/checkbox/-/checkbox-4.0.3.tgz" + integrity sha512-CEt9B4e8zFOGtc/LYeQx5m8nfqQeG/4oNNv0PUvXGG0mys+wR/WbJ3B4KfSQ4Fcr3AQfpiuFOi3fVvmPfvNbxw== + dependencies: + "@inquirer/core" "^10.1.1" + "@inquirer/figures" "^1.0.8" + "@inquirer/type" "^3.0.1" + ansi-escapes "^4.3.2" + yoctocolors-cjs "^2.1.2" + +"@inquirer/confirm@^5.1.0": + version "5.1.0" + resolved "https://registry.npmjs.org/@inquirer/confirm/-/confirm-5.1.0.tgz" + integrity sha512-osaBbIMEqVFjTX5exoqPXs6PilWQdjaLhGtMDXMXg/yxkHXNq43GlxGyTA35lK2HpzUgDN+Cjh/2AmqCN0QJpw== + dependencies: + "@inquirer/core" "^10.1.1" + "@inquirer/type" "^3.0.1" + +"@inquirer/core@^10.1.1": + version "10.1.1" + resolved "https://registry.npmjs.org/@inquirer/core/-/core-10.1.1.tgz" + integrity sha512-rmZVXy9iZvO3ZStEe/ayuuwIJ23LSF13aPMlLMTQARX6lGUBDHGV8UB5i9MRrfy0+mZwt5/9bdy8llszSD3NQA== + dependencies: + "@inquirer/figures" "^1.0.8" + "@inquirer/type" "^3.0.1" + ansi-escapes "^4.3.2" + cli-width "^4.1.0" + mute-stream "^2.0.0" + signal-exit "^4.1.0" + strip-ansi "^6.0.1" + wrap-ansi "^6.2.0" + yoctocolors-cjs "^2.1.2" + +"@inquirer/editor@^4.2.0": + version "4.2.0" + resolved "https://registry.npmjs.org/@inquirer/editor/-/editor-4.2.0.tgz" + integrity sha512-Z3LeGsD3WlItDqLxTPciZDbGtm0wrz7iJGS/uUxSiQxef33ZrBq7LhsXg30P7xrWz1kZX4iGzxxj5SKZmJ8W+w== + dependencies: + "@inquirer/core" "^10.1.1" + "@inquirer/type" "^3.0.1" + external-editor "^3.1.0" + +"@inquirer/expand@^4.0.3": + version "4.0.3" + resolved "https://registry.npmjs.org/@inquirer/expand/-/expand-4.0.3.tgz" + integrity sha512-MDszqW4HYBpVMmAoy/FA9laLrgo899UAga0itEjsYrBthKieDZNc0e16gdn7N3cQ0DSf/6zsTBZMuDYDQU4ktg== + dependencies: + "@inquirer/core" "^10.1.1" + "@inquirer/type" "^3.0.1" + yoctocolors-cjs "^2.1.2" + +"@inquirer/figures@^1.0.8": + version "1.0.8" + resolved "https://registry.npmjs.org/@inquirer/figures/-/figures-1.0.8.tgz" + integrity sha512-tKd+jsmhq21AP1LhexC0pPwsCxEhGgAkg28byjJAd+xhmIs8LUX8JbUc3vBf3PhLxWiB5EvyBE5X7JSPAqMAqg== + +"@inquirer/input@^4.1.0": + version "4.1.0" + resolved "https://registry.npmjs.org/@inquirer/input/-/input-4.1.0.tgz" + integrity sha512-16B8A9hY741yGXzd8UJ9R8su/fuuyO2e+idd7oVLYjP23wKJ6ILRIIHcnXe8/6AoYgwRS2zp4PNsW/u/iZ24yg== + dependencies: + "@inquirer/core" "^10.1.1" + "@inquirer/type" "^3.0.1" + +"@inquirer/number@^3.0.3": + version "3.0.3" + resolved "https://registry.npmjs.org/@inquirer/number/-/number-3.0.3.tgz" + integrity sha512-HA/W4YV+5deKCehIutfGBzNxWH1nhvUC67O4fC9ufSijn72yrYnRmzvC61dwFvlXIG1fQaYWi+cqNE9PaB9n6Q== + dependencies: + "@inquirer/core" "^10.1.1" + "@inquirer/type" "^3.0.1" + +"@inquirer/password@^4.0.3": + version "4.0.3" + resolved "https://registry.npmjs.org/@inquirer/password/-/password-4.0.3.tgz" + integrity sha512-3qWjk6hS0iabG9xx0U1plwQLDBc/HA/hWzLFFatADpR6XfE62LqPr9GpFXBkLU0KQUaIXZ996bNG+2yUvocH8w== + dependencies: + "@inquirer/core" "^10.1.1" + "@inquirer/type" "^3.0.1" + ansi-escapes "^4.3.2" + +"@inquirer/prompts@^7.2.0": + version "7.2.0" + resolved "https://registry.npmjs.org/@inquirer/prompts/-/prompts-7.2.0.tgz" + integrity sha512-ZXYZ5oGVrb+hCzcglPeVerJ5SFwennmDOPfXq1WyeZIrPGySLbl4W6GaSsBFvu3WII36AOK5yB8RMIEEkBjf8w== + dependencies: + "@inquirer/checkbox" "^4.0.3" + "@inquirer/confirm" "^5.1.0" + "@inquirer/editor" "^4.2.0" + "@inquirer/expand" "^4.0.3" + "@inquirer/input" "^4.1.0" + "@inquirer/number" "^3.0.3" + "@inquirer/password" "^4.0.3" + "@inquirer/rawlist" "^4.0.3" + "@inquirer/search" "^3.0.3" + "@inquirer/select" "^4.0.3" + +"@inquirer/rawlist@^4.0.3": + version "4.0.3" + resolved "https://registry.npmjs.org/@inquirer/rawlist/-/rawlist-4.0.3.tgz" + integrity sha512-5MhinSzfmOiZlRoPezfbJdfVCZikZs38ja3IOoWe7H1dxL0l3Z2jAUgbBldeyhhOkELdGvPlBfQaNbeLslib1w== + dependencies: + "@inquirer/core" "^10.1.1" + "@inquirer/type" "^3.0.1" + yoctocolors-cjs "^2.1.2" + +"@inquirer/search@^3.0.3": + version "3.0.3" + resolved "https://registry.npmjs.org/@inquirer/search/-/search-3.0.3.tgz" + integrity sha512-mQTCbdNolTGvGGVCJSI6afDwiSGTV+fMLPEIMDJgIV6L/s3+RYRpxt6t0DYnqMQmemnZ/Zq0vTIRwoHT1RgcTg== + dependencies: + "@inquirer/core" "^10.1.1" + "@inquirer/figures" "^1.0.8" + "@inquirer/type" "^3.0.1" + yoctocolors-cjs "^2.1.2" + +"@inquirer/select@^4.0.3": + version "4.0.3" + resolved "https://registry.npmjs.org/@inquirer/select/-/select-4.0.3.tgz" + integrity sha512-OZfKDtDE8+J54JYAFTUGZwvKNfC7W/gFCjDkcsO7HnTH/wljsZo9y/FJquOxMy++DY0+9l9o/MOZ8s5s1j5wmw== + dependencies: + "@inquirer/core" "^10.1.1" + "@inquirer/figures" "^1.0.8" + "@inquirer/type" "^3.0.1" + ansi-escapes "^4.3.2" + yoctocolors-cjs "^2.1.2" + +"@inquirer/type@^3.0.1": + version "3.0.1" + resolved "https://registry.npmjs.org/@inquirer/type/-/type-3.0.1.tgz" + integrity sha512-+ksJMIy92sOAiAccGpcKZUc3bYO07cADnscIxHBknEm3uNts3movSmBofc1908BNy5edKscxYeAdaX1NXkHS6A== + +"@isaacs/cliui@^8.0.2": + version "8.0.2" + resolved "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz" + integrity sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA== + dependencies: + string-width "^5.1.2" + string-width-cjs "npm:string-width@^4.2.0" + strip-ansi "^7.0.1" + strip-ansi-cjs "npm:strip-ansi@^6.0.1" + wrap-ansi "^8.1.0" + wrap-ansi-cjs "npm:wrap-ansi@^7.0.0" + +"@isaacs/ts-node-temp-fork-for-pr-2009@^10.9.7": + version "10.9.7" + resolved "https://registry.npmjs.org/@isaacs/ts-node-temp-fork-for-pr-2009/-/ts-node-temp-fork-for-pr-2009-10.9.7.tgz" + integrity sha512-9f0bhUr9TnwwpgUhEpr3FjxSaH/OHaARkE2F9fM0lS4nIs2GNerrvGwQz493dk0JKlTaGYVrKbq36vA/whZ34g== + dependencies: + "@cspotcode/source-map-support" "^0.8.0" + "@tsconfig/node14" "*" + "@tsconfig/node16" "*" + "@tsconfig/node18" "*" + "@tsconfig/node20" "*" + acorn "^8.4.1" + acorn-walk "^8.1.1" + arg "^4.1.0" + diff "^4.0.1" + make-error "^1.1.1" + v8-compile-cache-lib "^3.0.1" + +"@istanbuljs/schema@^0.1.2", "@istanbuljs/schema@^0.1.3": + version "0.1.3" + resolved "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz" + integrity sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA== + +"@jitl/quickjs-ffi-types@0.29.2": + version "0.29.2" + resolved "https://registry.npmjs.org/@jitl/quickjs-ffi-types/-/quickjs-ffi-types-0.29.2.tgz" + integrity sha512-069uQTiEla2PphXg6UpyyJ4QXHkTj3S9TeXgaMCd8NDYz3ODBw5U/rkg6fhuU8SMpoDrWjEzybmV5Mi2Pafb5w== + +"@jitl/quickjs-wasmfile-debug-asyncify@0.29.2": + version "0.29.2" + resolved "https://registry.npmjs.org/@jitl/quickjs-wasmfile-debug-asyncify/-/quickjs-wasmfile-debug-asyncify-0.29.2.tgz" + integrity sha512-YdRw2414pFkxzyyoJGv81Grbo9THp/5athDMKipaSBNNQvFE9FGRrgE9tt2DT2mhNnBx1kamtOGj0dX84Yy9bg== + dependencies: + "@jitl/quickjs-ffi-types" "0.29.2" + +"@jitl/quickjs-wasmfile-debug-sync@0.29.2": + version "0.29.2" + resolved "https://registry.npmjs.org/@jitl/quickjs-wasmfile-debug-sync/-/quickjs-wasmfile-debug-sync-0.29.2.tgz" + integrity sha512-VgisubjyPMWEr44g+OU0QWGyIxu7VkApkLHMxdORX351cw22aLTJ+Z79DJ8IVrTWc7jh4CBPsaK71RBQDuVB7w== + dependencies: + "@jitl/quickjs-ffi-types" "0.29.2" + +"@jitl/quickjs-wasmfile-release-asyncify@0.29.2": + version "0.29.2" + resolved "https://registry.npmjs.org/@jitl/quickjs-wasmfile-release-asyncify/-/quickjs-wasmfile-release-asyncify-0.29.2.tgz" + integrity sha512-sf3luCPr8wBVmGV6UV8Set+ie8wcO6mz5wMvDVO0b90UVCKfgnx65A1JfeA+zaSGoaFyTZ3sEpXSGJU+6qJmLw== + dependencies: + "@jitl/quickjs-ffi-types" "0.29.2" + +"@jitl/quickjs-wasmfile-release-sync@0.29.2": + version "0.29.2" + resolved "https://registry.npmjs.org/@jitl/quickjs-wasmfile-release-sync/-/quickjs-wasmfile-release-sync-0.29.2.tgz" + integrity sha512-UFIcbY3LxBRUjEqCHq3Oa6bgX5znt51V5NQck8L2US4u989ErasiMLUjmhq6UPC837Sjqu37letEK/ZpqlJ7aA== + dependencies: + "@jitl/quickjs-ffi-types" "0.29.2" + +"@jridgewell/gen-mapping@^0.3.5": + version "0.3.8" + resolved "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.8.tgz" + integrity sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA== + dependencies: + "@jridgewell/set-array" "^1.2.1" + "@jridgewell/sourcemap-codec" "^1.4.10" + "@jridgewell/trace-mapping" "^0.3.24" + +"@jridgewell/resolve-uri@^3.0.3", "@jridgewell/resolve-uri@^3.1.0": + version "3.1.2" + resolved "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz" + integrity sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw== + +"@jridgewell/set-array@^1.2.1": + version "1.2.1" + resolved "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz" + integrity sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A== + +"@jridgewell/sourcemap-codec@^1.4.10", "@jridgewell/sourcemap-codec@^1.4.14", "@jridgewell/sourcemap-codec@^1.5.0": + version "1.5.0" + resolved "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz" + integrity sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ== + +"@jridgewell/trace-mapping@0.3.9": + version "0.3.9" + resolved "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz" + integrity sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ== + dependencies: + "@jridgewell/resolve-uri" "^3.0.3" + "@jridgewell/sourcemap-codec" "^1.4.10" + +"@jridgewell/trace-mapping@^0.3.12", "@jridgewell/trace-mapping@^0.3.23", "@jridgewell/trace-mapping@^0.3.24", "@jridgewell/trace-mapping@^0.3.25": + version "0.3.25" + resolved "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz" + integrity sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ== + dependencies: + "@jridgewell/resolve-uri" "^3.1.0" + "@jridgewell/sourcemap-codec" "^1.4.14" + +"@js-sdsl/ordered-map@^4.4.2": + version "4.4.2" + resolved "https://registry.npmjs.org/@js-sdsl/ordered-map/-/ordered-map-4.4.2.tgz" + integrity sha512-iUKgm52T8HOE/makSxjqoWhe95ZJA1/G1sYsGev2JDKUSS14KAgg1LHb+Ba+IPow0xflbnSkOsZcO08C7w1gYw== + +"@jsep-plugin/assignment@^1.3.0": + version "1.3.0" + resolved "https://registry.npmjs.org/@jsep-plugin/assignment/-/assignment-1.3.0.tgz" + integrity sha512-VVgV+CXrhbMI3aSusQyclHkenWSAm95WaiKrMxRFam3JSUiIaQjoMIw2sEs/OX4XifnqeQUN4DYbJjlA8EfktQ== + +"@jsep-plugin/regex@^1.0.4": + version "1.0.4" + resolved "https://registry.npmjs.org/@jsep-plugin/regex/-/regex-1.0.4.tgz" + integrity sha512-q7qL4Mgjs1vByCaTnDFcBnV9HS7GVPJX5vyVoCgZHNSC9rjwIlmbXG5sUuorR5ndfHAIlJ8pVStxvjXHbNvtUg== + +"@ngneat/falso@^7.1.1": + version "7.2.0" + resolved "https://registry.npmjs.org/@ngneat/falso/-/falso-7.2.0.tgz" + integrity sha512-283EXBFd05kCbGuGSXgmvhCsQYEYzvD/eJaE7lxd05qRB0tgREvZX7TRlJ1KSp8nHxoK6Ws029G1Y30mt4IVAA== + dependencies: + seedrandom "3.0.5" + uuid "8.3.2" + +"@noble/ciphers@^1.0.0": + version "1.1.3" + resolved "https://registry.npmjs.org/@noble/ciphers/-/ciphers-1.1.3.tgz" + integrity sha512-Ygv6WnWJHLLiW4fnNDC1z+i13bud+enXOFRBlpxI+NJliPWx5wdR+oWlTjLuBPTqjUjtHXtjkU6w3kuuH6upZA== + +"@noble/curves@^1.6.0": + version "1.7.0" + resolved "https://registry.npmjs.org/@noble/curves/-/curves-1.7.0.tgz" + integrity sha512-UTMhXK9SeDhFJVrHeUJ5uZlI6ajXg10O6Ddocf9S6GjbSBVZsJo88HzKwXznNfGpMTRDyJkqMjNDPYgf0qFWnw== + dependencies: + "@noble/hashes" "1.6.0" + +"@noble/hashes@1.6.0": + version "1.6.0" + resolved "https://registry.npmjs.org/@noble/hashes/-/hashes-1.6.0.tgz" + integrity sha512-YUULf0Uk4/mAA89w+k3+yUYh6NrEvxZa5T6SY3wlMvE2chHkxFUUIDI8/XW1QSC357iA5pSnqt7XEhvFOqmDyQ== + +"@noble/hashes@^1.5.0": + version "1.6.1" + resolved "https://registry.npmjs.org/@noble/hashes/-/hashes-1.6.1.tgz" + integrity sha512-pq5D8h10hHBjyqX+cfBm0i8JUXJ0UhczFc4r74zbuT9XgewFo2E3J1cOaGtdZynILNmQ685YWGzGE1Zv6io50w== + +"@nodelib/fs.scandir@2.1.5": + version "2.1.5" + resolved "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz" + integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g== + dependencies: + "@nodelib/fs.stat" "2.0.5" + run-parallel "^1.1.9" + +"@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2": + version "2.0.5" + resolved "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz" + integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== + +"@nodelib/fs.walk@^1.2.3": + version "1.2.8" + resolved "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz" + integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== + dependencies: + "@nodelib/fs.scandir" "2.1.5" + fastq "^1.6.0" + +"@npmcli/agent@^2.0.0": + version "2.2.2" + resolved "https://registry.npmjs.org/@npmcli/agent/-/agent-2.2.2.tgz" + integrity sha512-OrcNPXdpSl9UX7qPVRWbmWMCSXrcDa2M9DvrbOTj7ao1S4PlqVFYv9/yLKMkrJKZ/V5A/kDBC690or307i26Og== + dependencies: + agent-base "^7.1.0" + http-proxy-agent "^7.0.0" + https-proxy-agent "^7.0.1" + lru-cache "^10.0.1" + socks-proxy-agent "^8.0.3" + +"@npmcli/fs@^3.1.0": + version "3.1.1" + resolved "https://registry.npmjs.org/@npmcli/fs/-/fs-3.1.1.tgz" + integrity sha512-q9CRWjpHCMIh5sVyefoD1cA7PkvILqCZsnSOEUUivORLjxCO/Irmue2DprETiNgEqktDBZaM1Bi+jrarx1XdCg== + dependencies: + semver "^7.3.5" + +"@npmcli/git@^5.0.0": + version "5.0.8" + resolved "https://registry.npmjs.org/@npmcli/git/-/git-5.0.8.tgz" + integrity sha512-liASfw5cqhjNW9UFd+ruwwdEf/lbOAQjLL2XY2dFW/bkJheXDYZgOyul/4gVvEV4BWkTXjYGmDqMw9uegdbJNQ== + dependencies: + "@npmcli/promise-spawn" "^7.0.0" + ini "^4.1.3" + lru-cache "^10.0.1" + npm-pick-manifest "^9.0.0" + proc-log "^4.0.0" + promise-inflight "^1.0.1" + promise-retry "^2.0.1" + semver "^7.3.5" + which "^4.0.0" + +"@npmcli/installed-package-contents@^2.0.1": + version "2.1.0" + resolved "https://registry.npmjs.org/@npmcli/installed-package-contents/-/installed-package-contents-2.1.0.tgz" + integrity sha512-c8UuGLeZpm69BryRykLuKRyKFZYJsZSCT4aVY5ds4omyZqJ172ApzgfKJ5eV/r3HgLdUYgFVe54KSFVjKoe27w== + dependencies: + npm-bundled "^3.0.0" + npm-normalize-package-bin "^3.0.0" + +"@npmcli/node-gyp@^3.0.0": + version "3.0.0" + resolved "https://registry.npmjs.org/@npmcli/node-gyp/-/node-gyp-3.0.0.tgz" + integrity sha512-gp8pRXC2oOxu0DUE1/M3bYtb1b3/DbJ5aM113+XJBgfXdussRAsX0YOrOhdd8WvnAR6auDBvJomGAkLKA5ydxA== + +"@npmcli/package-json@^5.0.0": + version "5.2.1" + resolved "https://registry.npmjs.org/@npmcli/package-json/-/package-json-5.2.1.tgz" + integrity sha512-f7zYC6kQautXHvNbLEWgD/uGu1+xCn9izgqBfgItWSx22U0ZDekxN08A1vM8cTxj/cRVe0Q94Ode+tdoYmIOOQ== + dependencies: + "@npmcli/git" "^5.0.0" + glob "^10.2.2" + hosted-git-info "^7.0.0" + json-parse-even-better-errors "^3.0.0" + normalize-package-data "^6.0.0" + proc-log "^4.0.0" + semver "^7.5.3" + +"@npmcli/promise-spawn@^7.0.0": + version "7.0.2" + resolved "https://registry.npmjs.org/@npmcli/promise-spawn/-/promise-spawn-7.0.2.tgz" + integrity sha512-xhfYPXoV5Dy4UkY0D+v2KkwvnDfiA/8Mt3sWCGI/hM03NsYIH8ZaG6QzS9x7pje5vHZBZJ2v6VRFVTWACnqcmQ== + dependencies: + which "^4.0.0" + +"@npmcli/redact@^1.1.0": + version "1.1.0" + resolved "https://registry.npmjs.org/@npmcli/redact/-/redact-1.1.0.tgz" + integrity sha512-PfnWuOkQgu7gCbnSsAisaX7hKOdZ4wSAhAzH3/ph5dSGau52kCRrMMGbiSQLwyTZpgldkZ49b0brkOr1AzGBHQ== + +"@npmcli/run-script@^7.0.0": + version "7.0.4" + resolved "https://registry.npmjs.org/@npmcli/run-script/-/run-script-7.0.4.tgz" + integrity sha512-9ApYM/3+rBt9V80aYg6tZfzj3UWdiYyCt7gJUD1VJKvWF5nwKDSICXbYIQbspFTq6TOpbsEtIC0LArB8d9PFmg== + dependencies: + "@npmcli/node-gyp" "^3.0.0" + "@npmcli/package-json" "^5.0.0" + "@npmcli/promise-spawn" "^7.0.0" + node-gyp "^10.0.0" + which "^4.0.0" + +"@oclif/core@^4", "@oclif/core@^4.0.25": + version "4.1.0" + resolved "https://registry.npmjs.org/@oclif/core/-/core-4.1.0.tgz" + integrity sha512-+LeOq0KK9ruVYjhnDRyfUmEMB68ZXxBP1usj29tVOjewwHInNIctvR7ghH1ls6S3/ZbeCk/Z/JoiE68i8vU6FQ== + dependencies: + ansi-escapes "^4.3.2" + ansis "^3.3.2" + clean-stack "^3.0.1" + cli-spinners "^2.9.2" + debug "^4.4.0" + ejs "^3.1.10" + get-package-type "^0.1.0" + globby "^11.1.0" + indent-string "^4.0.0" + is-wsl "^2.2.0" + lilconfig "^3.1.3" + minimatch "^9.0.5" + semver "^7.6.3" + string-width "^4.2.3" + supports-color "^8" + widest-line "^3.1.0" + wordwrap "^1.0.0" + wrap-ansi "^7.0.0" + +"@oclif/plugin-help@^6.2.13": + version "6.2.19" + resolved "https://registry.npmjs.org/@oclif/plugin-help/-/plugin-help-6.2.19.tgz" + integrity sha512-q2fIACWHJehppWTTgJm/llleKDgxt42IBVcK6Rp4H6qzET24t2zs0vbALx5XxsNCKl3/UuJhyW2XXQqvGmvWJQ== + dependencies: + "@oclif/core" "^4" + +"@oclif/plugin-not-found@^3.2.22": + version "3.2.31" + resolved "https://registry.npmjs.org/@oclif/plugin-not-found/-/plugin-not-found-3.2.31.tgz" + integrity sha512-EF3GmrenxqPLVCU75xLWbwohH1ot/yg+31vyPa4qJAkFspnmQ/Jv28afyk6q4ePcTA5lRC9PYqla5QsALngt3A== + dependencies: + "@inquirer/prompts" "^7.2.0" + "@oclif/core" "^4" + ansis "^3.3.1" + fast-levenshtein "^3.0.0" + +"@opentelemetry/api-logs@0.41.2": + version "0.41.2" + resolved "https://registry.npmjs.org/@opentelemetry/api-logs/-/api-logs-0.41.2.tgz" + integrity sha512-JEV2RAqijAFdWeT6HddYymfnkiRu2ASxoTBr4WsnGJhOjWZkEy6vp+Sx9ozr1NaIODOa2HUyckExIqQjn6qywQ== + dependencies: + "@opentelemetry/api" "^1.0.0" + +"@opentelemetry/api-logs@0.43.0": + version "0.43.0" + resolved "https://registry.npmjs.org/@opentelemetry/api-logs/-/api-logs-0.43.0.tgz" + integrity sha512-0CXMOYPXgAdLM2OzVkiUfAL6QQwWVhnMfUXCqLsITY42FZ9TxAhZIHkoc4mfVxvPuXsBnRYGR8UQZX86p87z4A== + dependencies: + "@opentelemetry/api" "^1.0.0" + +"@opentelemetry/api@^1.0.0", "@opentelemetry/api@^1.4.1": + version "1.4.1" + resolved "https://registry.npmjs.org/@opentelemetry/api/-/api-1.4.1.tgz" + integrity sha512-O2yRJce1GOc6PAy3QxFM4NzFiWzvScDC1/5ihYBL6BUEVdq0XMWN01sppE+H6bBXbaFYipjwFLEWLg5PaSOThA== + +"@opentelemetry/context-async-hooks@^1.17.1": + version "1.30.0" + resolved "https://registry.npmjs.org/@opentelemetry/context-async-hooks/-/context-async-hooks-1.30.0.tgz" + integrity sha512-roCetrG/cz0r/gugQm/jFo75UxblVvHaNSRoR0kSSRSzXFAiIBqFCZuH458BHBNRtRe+0yJdIJ21L9t94bw7+g== + +"@opentelemetry/core@1.15.2": + version "1.15.2" + resolved "https://registry.npmjs.org/@opentelemetry/core/-/core-1.15.2.tgz" + integrity sha512-+gBv15ta96WqkHZaPpcDHiaz0utiiHZVfm2YOYSqFGrUaJpPkMoSuLBB58YFQGi6Rsb9EHos84X6X5+9JspmLw== + dependencies: + "@opentelemetry/semantic-conventions" "1.15.2" + +"@opentelemetry/core@1.17.0": + version "1.17.0" + resolved "https://registry.npmjs.org/@opentelemetry/core/-/core-1.17.0.tgz" + integrity sha512-tfnl3h+UefCgx1aeN2xtrmr6BmdWGKXypk0pflQR0urFS40aE88trnkOMc2HTJZbMrqEEl4HsaBeFhwLVXsrJg== + dependencies: + "@opentelemetry/semantic-conventions" "1.17.0" + +"@opentelemetry/core@1.30.0": + version "1.30.0" + resolved "https://registry.npmjs.org/@opentelemetry/core/-/core-1.30.0.tgz" + integrity sha512-Q/3u/K73KUjTCnFUP97ZY+pBjQ1kPEgjOfXj/bJl8zW7GbXdkw6cwuyZk6ZTXkVgCBsYRYUzx4fvYK1jxdb9MA== + dependencies: + "@opentelemetry/semantic-conventions" "1.28.0" + +"@opentelemetry/exporter-metrics-otlp-grpc@^0.41.2": + version "0.41.2" + resolved "https://registry.npmjs.org/@opentelemetry/exporter-metrics-otlp-grpc/-/exporter-metrics-otlp-grpc-0.41.2.tgz" + integrity sha512-gQuCcd5QSMkfi1XIriWAoak/vaRvFzpvtzh2hjziIvbnA3VtoGD3bDb2dzEzOA1iSWO0/tHwnBsSmmUZsETyOA== + dependencies: + "@grpc/grpc-js" "^1.7.1" + "@opentelemetry/core" "1.15.2" + "@opentelemetry/exporter-metrics-otlp-http" "0.41.2" + "@opentelemetry/otlp-grpc-exporter-base" "0.41.2" + "@opentelemetry/otlp-transformer" "0.41.2" + "@opentelemetry/resources" "1.15.2" + "@opentelemetry/sdk-metrics" "1.15.2" + +"@opentelemetry/exporter-metrics-otlp-http@0.41.2", "@opentelemetry/exporter-metrics-otlp-http@^0.41.2": + version "0.41.2" + resolved "https://registry.npmjs.org/@opentelemetry/exporter-metrics-otlp-http/-/exporter-metrics-otlp-http-0.41.2.tgz" + integrity sha512-+YeIcL4nuldWE89K8NBLImpXCvih04u1MBnn8EzvoywG2TKR5JC3CZEPepODIxlsfGSgP8W5khCEP1NHZzftYw== + dependencies: + "@opentelemetry/core" "1.15.2" + "@opentelemetry/otlp-exporter-base" "0.41.2" + "@opentelemetry/otlp-transformer" "0.41.2" + "@opentelemetry/resources" "1.15.2" + "@opentelemetry/sdk-metrics" "1.15.2" + +"@opentelemetry/exporter-metrics-otlp-proto@^0.41.2": + version "0.41.2" + resolved "https://registry.npmjs.org/@opentelemetry/exporter-metrics-otlp-proto/-/exporter-metrics-otlp-proto-0.41.2.tgz" + integrity sha512-OLNs6wF84uhxn8TJ8Bv1q2ltdJqjKA9oUEtICcUDDzXIiztPxZ9ur/4xdMk9T3ZJeFMfrhj8eYDkpETBy+fjCg== + dependencies: + "@opentelemetry/core" "1.15.2" + "@opentelemetry/exporter-metrics-otlp-http" "0.41.2" + "@opentelemetry/otlp-exporter-base" "0.41.2" + "@opentelemetry/otlp-proto-exporter-base" "0.41.2" + "@opentelemetry/otlp-transformer" "0.41.2" + "@opentelemetry/resources" "1.15.2" + "@opentelemetry/sdk-metrics" "1.15.2" + +"@opentelemetry/exporter-trace-otlp-grpc@^0.43.0": + version "0.43.0" + resolved "https://registry.npmjs.org/@opentelemetry/exporter-trace-otlp-grpc/-/exporter-trace-otlp-grpc-0.43.0.tgz" + integrity sha512-h/oofzwyONMcAeBXD6+E6+foFQg9CPadBFcKAGoMIyVSK7iZgtK5DLEwAF4jz5MhfxWNmwZjHXFRc0GqCRx/tA== + dependencies: + "@grpc/grpc-js" "^1.7.1" + "@opentelemetry/core" "1.17.0" + "@opentelemetry/otlp-grpc-exporter-base" "0.43.0" + "@opentelemetry/otlp-transformer" "0.43.0" + "@opentelemetry/resources" "1.17.0" + "@opentelemetry/sdk-trace-base" "1.17.0" + +"@opentelemetry/exporter-trace-otlp-http@^0.41.2": + version "0.41.2" + resolved "https://registry.npmjs.org/@opentelemetry/exporter-trace-otlp-http/-/exporter-trace-otlp-http-0.41.2.tgz" + integrity sha512-Y0fGLipjZXLMelWtlS1/MDtrPxf25oM408KukRdkN31a1MEFo4h/ZkNwS7ZfmqHGUa+4rWRt2bi6JBiqy7Ytgw== + dependencies: + "@opentelemetry/core" "1.15.2" + "@opentelemetry/otlp-exporter-base" "0.41.2" + "@opentelemetry/otlp-transformer" "0.41.2" + "@opentelemetry/resources" "1.15.2" + "@opentelemetry/sdk-trace-base" "1.15.2" + +"@opentelemetry/exporter-trace-otlp-proto@^0.41.2": + version "0.41.2" + resolved "https://registry.npmjs.org/@opentelemetry/exporter-trace-otlp-proto/-/exporter-trace-otlp-proto-0.41.2.tgz" + integrity sha512-IGZga9IIckqYE3IpRE9FO9G5umabObIrChlXUHYpMJtDgx797dsb3qXCvLeuAwB+HoB8NsEZstlzmLnoa6/HmA== + dependencies: + "@opentelemetry/core" "1.15.2" + "@opentelemetry/otlp-exporter-base" "0.41.2" + "@opentelemetry/otlp-proto-exporter-base" "0.41.2" + "@opentelemetry/otlp-transformer" "0.41.2" + "@opentelemetry/resources" "1.15.2" + "@opentelemetry/sdk-trace-base" "1.15.2" + +"@opentelemetry/exporter-zipkin@^1.15.2": + version "1.30.0" + resolved "https://registry.npmjs.org/@opentelemetry/exporter-zipkin/-/exporter-zipkin-1.30.0.tgz" + integrity sha512-HQUBmXYuuHIIoB1YFukNq7QtWQPqwQh5SN28coUXmN8nCOxaqnEBKIAN+7RQU7BX7NDcNSXpL2shctH/roKL3A== + dependencies: + "@opentelemetry/core" "1.30.0" + "@opentelemetry/resources" "1.30.0" + "@opentelemetry/sdk-trace-base" "1.30.0" + "@opentelemetry/semantic-conventions" "1.28.0" + +"@opentelemetry/otlp-exporter-base@0.41.2": + version "0.41.2" + resolved "https://registry.npmjs.org/@opentelemetry/otlp-exporter-base/-/otlp-exporter-base-0.41.2.tgz" + integrity sha512-pfwa6d+Dax3itZcGWiA0AoXeVaCuZbbqUTsCtOysd2re8C2PWXNxDONUfBWsn+KgxAdi+ljwTjJGiaVLDaIEvQ== + dependencies: + "@opentelemetry/core" "1.15.2" + +"@opentelemetry/otlp-exporter-base@0.43.0": + version "0.43.0" + resolved "https://registry.npmjs.org/@opentelemetry/otlp-exporter-base/-/otlp-exporter-base-0.43.0.tgz" + integrity sha512-LXNtRFVuPRXB9q0qdvrLikQ3NtT9Jmv255Idryz3RJPhOh/Fa03sBASQoj3D55OH3xazmA90KFHfhJ/d8D8y4A== + dependencies: + "@opentelemetry/core" "1.17.0" + +"@opentelemetry/otlp-grpc-exporter-base@0.41.2": + version "0.41.2" + resolved "https://registry.npmjs.org/@opentelemetry/otlp-grpc-exporter-base/-/otlp-grpc-exporter-base-0.41.2.tgz" + integrity sha512-OErK8dYjXG01XIMIpmOV2SzL9ctkZ0Nyhf2UumICOAKtgLvR5dG1JMlsNVp8Jn0RzpsKc6Urv7JpP69wzRXN+A== + dependencies: + "@grpc/grpc-js" "^1.7.1" + "@opentelemetry/core" "1.15.2" + "@opentelemetry/otlp-exporter-base" "0.41.2" + protobufjs "^7.2.3" + +"@opentelemetry/otlp-grpc-exporter-base@0.43.0": + version "0.43.0" + resolved "https://registry.npmjs.org/@opentelemetry/otlp-grpc-exporter-base/-/otlp-grpc-exporter-base-0.43.0.tgz" + integrity sha512-oOpqtDJo9BBa1+nD6ID1qZ55ZdTwEwSSn2idMobw8jmByJKaanVLdr9SJKsn5T9OBqo/c5QY2brMf0TNZkobJQ== + dependencies: + "@grpc/grpc-js" "^1.7.1" + "@opentelemetry/core" "1.17.0" + "@opentelemetry/otlp-exporter-base" "0.43.0" + protobufjs "^7.2.3" + +"@opentelemetry/otlp-proto-exporter-base@0.41.2": + version "0.41.2" + resolved "https://registry.npmjs.org/@opentelemetry/otlp-proto-exporter-base/-/otlp-proto-exporter-base-0.41.2.tgz" + integrity sha512-BxmEMiP6tHiFroe5/dTt9BsxCci7BTLtF7A6d4DKHLiLweWWZxQ9l7hON7qt/IhpKrQcAFD1OzZ1Gq2ZkNzhCw== + dependencies: + "@opentelemetry/core" "1.15.2" + "@opentelemetry/otlp-exporter-base" "0.41.2" + protobufjs "^7.2.3" + +"@opentelemetry/otlp-transformer@0.41.2": + version "0.41.2" + resolved "https://registry.npmjs.org/@opentelemetry/otlp-transformer/-/otlp-transformer-0.41.2.tgz" + integrity sha512-jJbPwB0tNu2v+Xi0c/v/R3YBLJKLonw1p+v3RVjT2VfzeUyzSp/tBeVdY7RZtL6dzZpA9XSmp8UEfWIFQo33yA== + dependencies: + "@opentelemetry/api-logs" "0.41.2" + "@opentelemetry/core" "1.15.2" + "@opentelemetry/resources" "1.15.2" + "@opentelemetry/sdk-logs" "0.41.2" + "@opentelemetry/sdk-metrics" "1.15.2" + "@opentelemetry/sdk-trace-base" "1.15.2" + +"@opentelemetry/otlp-transformer@0.43.0": + version "0.43.0" + resolved "https://registry.npmjs.org/@opentelemetry/otlp-transformer/-/otlp-transformer-0.43.0.tgz" + integrity sha512-KXYmgzWdVBOD5NvPmGW1nEMJjyQ8gK3N8r6pi4HvmEhTp0v4T13qDSax4q0HfsqmbPJR355oqQSJUnu1dHNutw== + dependencies: + "@opentelemetry/api-logs" "0.43.0" + "@opentelemetry/core" "1.17.0" + "@opentelemetry/resources" "1.17.0" + "@opentelemetry/sdk-logs" "0.43.0" + "@opentelemetry/sdk-metrics" "1.17.0" + "@opentelemetry/sdk-trace-base" "1.17.0" + +"@opentelemetry/resources@1.15.2": + version "1.15.2" + resolved "https://registry.npmjs.org/@opentelemetry/resources/-/resources-1.15.2.tgz" + integrity sha512-xmMRLenT9CXmm5HMbzpZ1hWhaUowQf8UB4jMjFlAxx1QzQcsD3KFNAVX/CAWzFPtllTyTplrA4JrQ7sCH3qmYw== + dependencies: + "@opentelemetry/core" "1.15.2" + "@opentelemetry/semantic-conventions" "1.15.2" + +"@opentelemetry/resources@1.17.0": + version "1.17.0" + resolved "https://registry.npmjs.org/@opentelemetry/resources/-/resources-1.17.0.tgz" + integrity sha512-+u0ciVnj8lhuL/qGRBPeVYvk7fL+H/vOddfvmOeJaA1KC+5/3UED1c9KoZQlRsNT5Kw1FaK8LkY2NVLYfOVZQw== + dependencies: + "@opentelemetry/core" "1.17.0" + "@opentelemetry/semantic-conventions" "1.17.0" + +"@opentelemetry/resources@1.30.0", "@opentelemetry/resources@^1.15.2": + version "1.30.0" + resolved "https://registry.npmjs.org/@opentelemetry/resources/-/resources-1.30.0.tgz" + integrity sha512-5mGMjL0Uld/99t7/pcd7CuVtJbkARckLVuiOX84nO8RtLtIz0/J6EOHM2TGvPZ6F4K+XjUq13gMx14w80SVCQg== + dependencies: + "@opentelemetry/core" "1.30.0" + "@opentelemetry/semantic-conventions" "1.28.0" + +"@opentelemetry/sdk-logs@0.41.2": + version "0.41.2" + resolved "https://registry.npmjs.org/@opentelemetry/sdk-logs/-/sdk-logs-0.41.2.tgz" + integrity sha512-smqKIw0tTW15waj7BAPHFomii5c3aHnSE4LQYTszGoK5P9nZs8tEAIpu15UBxi3aG31ZfsLmm4EUQkjckdlFrw== + dependencies: + "@opentelemetry/core" "1.15.2" + "@opentelemetry/resources" "1.15.2" + +"@opentelemetry/sdk-logs@0.43.0": + version "0.43.0" + resolved "https://registry.npmjs.org/@opentelemetry/sdk-logs/-/sdk-logs-0.43.0.tgz" + integrity sha512-JyJ2BBRKm37Mc4cSEhFmsMl5ASQn1dkGhEWzAAMSlhPtLRTv5PfvJwhR+Mboaic/eDLAlciwsgijq8IFlf6IgQ== + dependencies: + "@opentelemetry/core" "1.17.0" + "@opentelemetry/resources" "1.17.0" + +"@opentelemetry/sdk-metrics@1.15.2": + version "1.15.2" + resolved "https://registry.npmjs.org/@opentelemetry/sdk-metrics/-/sdk-metrics-1.15.2.tgz" + integrity sha512-9aIlcX8GnhcsAHW/Wl8bzk4ZnWTpNlLtud+fxUfBtFATu6OZ6TrGrF4JkT9EVrnoxwtPIDtjHdEsSjOqisY/iA== + dependencies: + "@opentelemetry/core" "1.15.2" + "@opentelemetry/resources" "1.15.2" + lodash.merge "^4.6.2" + +"@opentelemetry/sdk-metrics@1.17.0": + version "1.17.0" + resolved "https://registry.npmjs.org/@opentelemetry/sdk-metrics/-/sdk-metrics-1.17.0.tgz" + integrity sha512-HlWM27yGmYuwCoVRe3yg2PqKnIsq0kEF0HQgvkeDWz2NYkq9fFaSspR6kvjxUTbghAlZrabiqbgyKoYpYaXS3w== + dependencies: + "@opentelemetry/core" "1.17.0" + "@opentelemetry/resources" "1.17.0" + lodash.merge "^4.6.2" + +"@opentelemetry/sdk-metrics@^1.15.2": + version "1.30.0" + resolved "https://registry.npmjs.org/@opentelemetry/sdk-metrics/-/sdk-metrics-1.30.0.tgz" + integrity sha512-5kcj6APyRMvv6dEIP5plz2qfJAD4OMipBRT11u/pa1a68rHKI2Ln+iXVkAGKgx8o7CXbD7FdPypTUY88ZQgP4Q== + dependencies: + "@opentelemetry/core" "1.30.0" + "@opentelemetry/resources" "1.30.0" + +"@opentelemetry/sdk-trace-base@1.15.2": + version "1.15.2" + resolved "https://registry.npmjs.org/@opentelemetry/sdk-trace-base/-/sdk-trace-base-1.15.2.tgz" + integrity sha512-BEaxGZbWtvnSPchV98qqqqa96AOcb41pjgvhfzDij10tkBhIu9m0Jd6tZ1tJB5ZHfHbTffqYVYE0AOGobec/EQ== + dependencies: + "@opentelemetry/core" "1.15.2" + "@opentelemetry/resources" "1.15.2" + "@opentelemetry/semantic-conventions" "1.15.2" + +"@opentelemetry/sdk-trace-base@1.17.0": + version "1.17.0" + resolved "https://registry.npmjs.org/@opentelemetry/sdk-trace-base/-/sdk-trace-base-1.17.0.tgz" + integrity sha512-2T5HA1/1iE36Q9eg6D4zYlC4Y4GcycI1J6NsHPKZY9oWfAxWsoYnRlkPfUqyY5XVtocCo/xHpnJvGNHwzT70oQ== + dependencies: + "@opentelemetry/core" "1.17.0" + "@opentelemetry/resources" "1.17.0" + "@opentelemetry/semantic-conventions" "1.17.0" + +"@opentelemetry/sdk-trace-base@1.30.0", "@opentelemetry/sdk-trace-base@^1.15.2": + version "1.30.0" + resolved "https://registry.npmjs.org/@opentelemetry/sdk-trace-base/-/sdk-trace-base-1.30.0.tgz" + integrity sha512-RKQDaDIkV7PwizmHw+rE/FgfB2a6MBx+AEVVlAHXRG1YYxLiBpPX2KhmoB99R5vA4b72iJrjle68NDWnbrE9Dg== + dependencies: + "@opentelemetry/core" "1.30.0" + "@opentelemetry/resources" "1.30.0" + "@opentelemetry/semantic-conventions" "1.28.0" + +"@opentelemetry/semantic-conventions@1.15.2": + version "1.15.2" + resolved "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.15.2.tgz" + integrity sha512-CjbOKwk2s+3xPIMcd5UNYQzsf+v94RczbdNix9/kQh38WiQkM90sUOi3if8eyHFgiBjBjhwXrA7W3ydiSQP9mw== + +"@opentelemetry/semantic-conventions@1.17.0": + version "1.17.0" + resolved "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.17.0.tgz" + integrity sha512-+fguCd2d8d2qruk0H0DsCEy2CTK3t0Tugg7MhZ/UQMvmewbZLNnJ6heSYyzIZWG5IPfAXzoj4f4F/qpM7l4VBA== + +"@opentelemetry/semantic-conventions@1.28.0", "@opentelemetry/semantic-conventions@^1.15.2": + version "1.28.0" + resolved "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.28.0.tgz" + integrity sha512-lp4qAiMTD4sNWW4DbKLBkfiMZ4jbAboJIGOQr5DvciMRI494OapieI9qiODpOt0XBr1LjIDy1xAGAnVs5supTA== + +"@pkgjs/parseargs@^0.11.0": + version "0.11.0" + resolved "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz" + integrity sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg== + +"@playwright/browser-chromium@^1.48.0": + version "1.49.1" + resolved "https://registry.npmjs.org/@playwright/browser-chromium/-/browser-chromium-1.49.1.tgz" + integrity sha512-LLeyllKSucbojsJBOpdJshwW27ZXZs3oypqffkVWLUvxX2azHJMOevsOcWpjCfoYbpevkaEozM2xHeSUGF00lg== + dependencies: + playwright-core "1.49.1" + +"@playwright/test@^1.48.0": + version "1.49.1" + resolved "https://registry.npmjs.org/@playwright/test/-/test-1.49.1.tgz" + integrity sha512-Ky+BVzPz8pL6PQxHqNRW1k3mIyv933LML7HktS8uik0bUXNCdPhoS/kLihiO1tMf/egaJb4IutXd7UywvXEW+g== + dependencies: + playwright "1.49.1" + +"@polka/url@^1.0.0-next.24": + version "1.0.0-next.28" + resolved "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.28.tgz" + integrity sha512-8LduaNlMZGwdZ6qWrKlfa+2M4gahzFkprZiAt2TF8uS0qQgBizKXpXURqvTJ4WtmupWxaLqjRb2UCTe72mu+Aw== + +"@postman/form-data@~3.1.1": + version "3.1.1" + resolved "https://registry.npmjs.org/@postman/form-data/-/form-data-3.1.1.tgz" + integrity sha512-vjh8Q2a8S6UCm/KKs31XFJqEEgmbjBmpPNVV2eVav6905wyFAwaUOBGA1NPBI4ERH9MMZc6w0umFgM6WbEPMdg== + dependencies: + asynckit "^0.4.0" + combined-stream "^1.0.8" + mime-types "^2.1.12" + +"@postman/tough-cookie@~4.1.3-postman.1": + version "4.1.3-postman.1" + resolved "https://registry.npmjs.org/@postman/tough-cookie/-/tough-cookie-4.1.3-postman.1.tgz" + integrity sha512-txpgUqZOnWYnUHZpHjkfb0IwVH4qJmyq77pPnJLlfhMtdCLMFTEeQHlzQiK906aaNCe4NEB5fGJHo9uzGbFMeA== + dependencies: + psl "^1.1.33" + punycode "^2.1.1" + universalify "^0.2.0" + url-parse "^1.5.3" + +"@postman/tunnel-agent@^0.6.4": + version "0.6.4" + resolved "https://registry.npmjs.org/@postman/tunnel-agent/-/tunnel-agent-0.6.4.tgz" + integrity sha512-CJJlq8V7rNKhAw4sBfjixKpJW00SHqebqNUQKxMoepgeWZIbdPcD+rguRcivGhS4N12PymDcKgUgSD4rVC+RjQ== + dependencies: + safe-buffer "^5.0.1" + +"@prisma/client@^6.1.0": + version "6.1.0" + resolved "https://registry.npmjs.org/@prisma/client/-/client-6.1.0.tgz" + integrity sha512-AbQYc5+EJKm1Ydfq3KxwcGiy7wIbm4/QbjCKWWoNROtvy7d6a3gmAGkKjK0iUCzh+rHV8xDhD5Cge8ke/kiy5Q== + +"@prisma/debug@6.1.0": + version "6.1.0" + resolved "https://registry.npmjs.org/@prisma/debug/-/debug-6.1.0.tgz" + integrity sha512-0himsvcM4DGBTtvXkd2Tggv6sl2JyUYLzEGXXleFY+7Kp6rZeSS3hiTW9mwtUlXrwYbJP6pwlVNB7jYElrjWUg== + +"@prisma/engines-version@6.1.0-21.11f085a2012c0f4778414c8db2651556ee0ef959": + version "6.1.0-21.11f085a2012c0f4778414c8db2651556ee0ef959" + resolved "https://registry.npmjs.org/@prisma/engines-version/-/engines-version-6.1.0-21.11f085a2012c0f4778414c8db2651556ee0ef959.tgz" + integrity sha512-PdJqmYM2Fd8K0weOOtQThWylwjsDlTig+8Pcg47/jszMuLL9iLIaygC3cjWJLda69siRW4STlCTMSgOjZzvKPQ== + +"@prisma/engines@6.1.0": + version "6.1.0" + resolved "https://registry.npmjs.org/@prisma/engines/-/engines-6.1.0.tgz" + integrity sha512-GnYJbCiep3Vyr1P/415ReYrgJUjP79fBNc1wCo7NP6Eia0CzL2Ot9vK7Infczv3oK7JLrCcawOSAxFxNFsAERQ== + dependencies: + "@prisma/debug" "6.1.0" + "@prisma/engines-version" "6.1.0-21.11f085a2012c0f4778414c8db2651556ee0ef959" + "@prisma/fetch-engine" "6.1.0" + "@prisma/get-platform" "6.1.0" + +"@prisma/fetch-engine@6.1.0": + version "6.1.0" + resolved "https://registry.npmjs.org/@prisma/fetch-engine/-/fetch-engine-6.1.0.tgz" + integrity sha512-asdFi7TvPlEZ8CzSZ/+Du5wZ27q6OJbRSXh+S8ISZguu+S9KtS/gP7NeXceZyb1Jv1SM1S5YfiCv+STDsG6rrg== + dependencies: + "@prisma/debug" "6.1.0" + "@prisma/engines-version" "6.1.0-21.11f085a2012c0f4778414c8db2651556ee0ef959" + "@prisma/get-platform" "6.1.0" + +"@prisma/get-platform@6.1.0": + version "6.1.0" + resolved "https://registry.npmjs.org/@prisma/get-platform/-/get-platform-6.1.0.tgz" + integrity sha512-ia8bNjboBoHkmKGGaWtqtlgQOhCi7+f85aOkPJKgNwWvYrT6l78KgojLekE8zMhVk0R9lWcifV0Pf8l3/15V0Q== + dependencies: + "@prisma/debug" "6.1.0" + +"@protobufjs/aspromise@^1.1.1", "@protobufjs/aspromise@^1.1.2": + version "1.1.2" + resolved "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz" + integrity sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ== + +"@protobufjs/base64@^1.1.2": + version "1.1.2" + resolved "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz" + integrity sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg== + +"@protobufjs/codegen@^2.0.4": + version "2.0.4" + resolved "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz" + integrity sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg== + +"@protobufjs/eventemitter@^1.1.0": + version "1.1.0" + resolved "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz" + integrity sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q== + +"@protobufjs/fetch@^1.1.0": + version "1.1.0" + resolved "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz" + integrity sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ== + dependencies: + "@protobufjs/aspromise" "^1.1.1" + "@protobufjs/inquire" "^1.1.0" + +"@protobufjs/float@^1.0.2": + version "1.0.2" + resolved "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz" + integrity sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ== + +"@protobufjs/inquire@^1.1.0": + version "1.1.0" + resolved "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz" + integrity sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q== + +"@protobufjs/path@^1.1.2": + version "1.1.2" + resolved "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz" + integrity sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA== + +"@protobufjs/pool@^1.1.0": + version "1.1.0" + resolved "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz" + integrity sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw== + +"@protobufjs/utf8@^1.1.0": + version "1.1.0" + resolved "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz" + integrity sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw== + +"@rollup/rollup-android-arm-eabi@4.28.1": + version "4.28.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.28.1.tgz#7f4c4d8cd5ccab6e95d6750dbe00321c1f30791e" + integrity sha512-2aZp8AES04KI2dy3Ss6/MDjXbwBzj+i0GqKtWXgw2/Ma6E4jJvujryO6gJAghIRVz7Vwr9Gtl/8na3nDUKpraQ== + +"@rollup/rollup-android-arm64@4.28.1": + version "4.28.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.28.1.tgz#17ea71695fb1518c2c324badbe431a0bd1879f2d" + integrity sha512-EbkK285O+1YMrg57xVA+Dp0tDBRB93/BZKph9XhMjezf6F4TpYjaUSuPt5J0fZXlSag0LmZAsTmdGGqPp4pQFA== + +"@rollup/rollup-darwin-arm64@4.28.1": + version "4.28.1" + resolved "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.28.1.tgz" + integrity sha512-prduvrMKU6NzMq6nxzQw445zXgaDBbMQvmKSJaxpaZ5R1QDM8w+eGxo6Y/jhT/cLoCvnZI42oEqf9KQNYz1fqQ== + +"@rollup/rollup-darwin-x64@4.28.1": + version "4.28.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.28.1.tgz#8f63baa1d31784904a380d2e293fa1ddf53dd4a2" + integrity sha512-WsvbOunsUk0wccO/TV4o7IKgloJ942hVFK1CLatwv6TJspcCZb9umQkPdvB7FihmdxgaKR5JyxDjWpCOp4uZlQ== + +"@rollup/rollup-freebsd-arm64@4.28.1": + version "4.28.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.28.1.tgz#30ed247e0df6e8858cdc6ae4090e12dbeb8ce946" + integrity sha512-HTDPdY1caUcU4qK23FeeGxCdJF64cKkqajU0iBnTVxS8F7H/7BewvYoG+va1KPSL63kQ1PGNyiwKOfReavzvNA== + +"@rollup/rollup-freebsd-x64@4.28.1": + version "4.28.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.28.1.tgz#57846f382fddbb508412ae07855b8a04c8f56282" + integrity sha512-m/uYasxkUevcFTeRSM9TeLyPe2QDuqtjkeoTpP9SW0XxUWfcYrGDMkO/m2tTw+4NMAF9P2fU3Mw4ahNvo7QmsQ== + +"@rollup/rollup-linux-arm-gnueabihf@4.28.1": + version "4.28.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.28.1.tgz#378ca666c9dae5e6f94d1d351e7497c176e9b6df" + integrity sha512-QAg11ZIt6mcmzpNE6JZBpKfJaKkqTm1A9+y9O+frdZJEuhQxiugM05gnCWiANHj4RmbgeVJpTdmKRmH/a+0QbA== + +"@rollup/rollup-linux-arm-musleabihf@4.28.1": + version "4.28.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.28.1.tgz#a692eff3bab330d5c33a5d5813a090c15374cddb" + integrity sha512-dRP9PEBfolq1dmMcFqbEPSd9VlRuVWEGSmbxVEfiq2cs2jlZAl0YNxFzAQS2OrQmsLBLAATDMb3Z6MFv5vOcXg== + +"@rollup/rollup-linux-arm64-gnu@4.28.1": + version "4.28.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.28.1.tgz#6b1719b76088da5ac1ae1feccf48c5926b9e3db9" + integrity sha512-uGr8khxO+CKT4XU8ZUH1TTEUtlktK6Kgtv0+6bIFSeiSlnGJHG1tSFSjm41uQ9sAO/5ULx9mWOz70jYLyv1QkA== + +"@rollup/rollup-linux-arm64-musl@4.28.1": + version "4.28.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.28.1.tgz#865baf5b6f5ff67acb32e5a359508828e8dc5788" + integrity sha512-QF54q8MYGAqMLrX2t7tNpi01nvq5RI59UBNx+3+37zoKX5KViPo/gk2QLhsuqok05sSCRluj0D00LzCwBikb0A== + +"@rollup/rollup-linux-loongarch64-gnu@4.28.1": + version "4.28.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.28.1.tgz#23c6609ba0f7fa7a7f2038b6b6a08555a5055a87" + integrity sha512-vPul4uodvWvLhRco2w0GcyZcdyBfpfDRgNKU+p35AWEbJ/HPs1tOUrkSueVbBS0RQHAf/A+nNtDpvw95PeVKOA== + +"@rollup/rollup-linux-powerpc64le-gnu@4.28.1": + version "4.28.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.28.1.tgz#652ef0d9334a9f25b9daf85731242801cb0fc41c" + integrity sha512-pTnTdBuC2+pt1Rmm2SV7JWRqzhYpEILML4PKODqLz+C7Ou2apEV52h19CR7es+u04KlqplggmN9sqZlekg3R1A== + +"@rollup/rollup-linux-riscv64-gnu@4.28.1": + version "4.28.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.28.1.tgz#1eb6651839ee6ebca64d6cc64febbd299e95e6bd" + integrity sha512-vWXy1Nfg7TPBSuAncfInmAI/WZDd5vOklyLJDdIRKABcZWojNDY0NJwruY2AcnCLnRJKSaBgf/GiJfauu8cQZA== + +"@rollup/rollup-linux-s390x-gnu@4.28.1": + version "4.28.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.28.1.tgz#015c52293afb3ff2a293cf0936b1d43975c1e9cd" + integrity sha512-/yqC2Y53oZjb0yz8PVuGOQQNOTwxcizudunl/tFs1aLvObTclTwZ0JhXF2XcPT/zuaymemCDSuuUPXJJyqeDOg== + +"@rollup/rollup-linux-x64-gnu@4.28.1": + version "4.28.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.28.1.tgz#b83001b5abed2bcb5e2dbeec6a7e69b194235c1e" + integrity sha512-fzgeABz7rrAlKYB0y2kSEiURrI0691CSL0+KXwKwhxvj92VULEDQLpBYLHpF49MSiPG4sq5CK3qHMnb9tlCjBw== + +"@rollup/rollup-linux-x64-musl@4.28.1": + version "4.28.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.28.1.tgz#6cc7c84cd4563737f8593e66f33b57d8e228805b" + integrity sha512-xQTDVzSGiMlSshpJCtudbWyRfLaNiVPXt1WgdWTwWz9n0U12cI2ZVtWe/Jgwyv/6wjL7b66uu61Vg0POWVfz4g== + +"@rollup/rollup-win32-arm64-msvc@4.28.1": + version "4.28.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.28.1.tgz#631ffeee094d71279fcd1fe8072bdcf25311bc11" + integrity sha512-wSXmDRVupJstFP7elGMgv+2HqXelQhuNf+IS4V+nUpNVi/GUiBgDmfwD0UGN3pcAnWsgKG3I52wMOBnk1VHr/A== + +"@rollup/rollup-win32-ia32-msvc@4.28.1": + version "4.28.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.28.1.tgz#06d1d60d5b9f718e8a6c4a43f82e3f9e3254587f" + integrity sha512-ZkyTJ/9vkgrE/Rk9vhMXhf8l9D+eAhbAVbsGsXKy2ohmJaWg0LPQLnIxRdRp/bKyr8tXuPlXhIoGlEB5XpJnGA== + +"@rollup/rollup-win32-x64-msvc@4.28.1": + version "4.28.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.28.1.tgz#4dff5c4259ebe6c5b4a8f2c5bc3829b7a8447ff0" + integrity sha512-ZvK2jBafvttJjoIdKm/Q/Bh7IJ1Ose9IBOwpOXcOvW3ikGTQGmKDgxTC6oCAzW6PynbkKP8+um1du81XJHZ0JA== + +"@scarf/scarf@=1.4.0": + version "1.4.0" + resolved "https://registry.npmjs.org/@scarf/scarf/-/scarf-1.4.0.tgz" + integrity sha512-xxeapPiUXdZAE3che6f3xogoJPeZgig6omHEy1rIY5WVsB3H2BHNnZH+gHG6x91SCWyQCzWGsuL2Hh3ClO5/qQ== + +"@sideway/address@^4.1.5": + version "4.1.5" + resolved "https://registry.npmjs.org/@sideway/address/-/address-4.1.5.tgz" + integrity sha512-IqO/DUQHUkPeixNQ8n0JA6102hT9CmaljNTPmQ1u8MEhBo/R4Q8eKLN/vGZxuebwOroDB4cbpjheD4+/sKFK4Q== + dependencies: + "@hapi/hoek" "^9.0.0" + +"@sideway/formula@^3.0.1": + version "3.0.1" + resolved "https://registry.npmjs.org/@sideway/formula/-/formula-3.0.1.tgz" + integrity sha512-/poHZJJVjx3L+zVD6g9KgHfYnb443oi7wLu/XKojDviHy6HOEOA6z1Trk5aR1dGcmPenJEgb2sK2I80LeS3MIg== + +"@sideway/pinpoint@^2.0.0": + version "2.0.0" + resolved "https://registry.npmjs.org/@sideway/pinpoint/-/pinpoint-2.0.0.tgz" + integrity sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ== + +"@sigstore/bundle@^2.3.2": + version "2.3.2" + resolved "https://registry.npmjs.org/@sigstore/bundle/-/bundle-2.3.2.tgz" + integrity sha512-wueKWDk70QixNLB363yHc2D2ItTgYiMTdPwK8D9dKQMR3ZQ0c35IxP5xnwQ8cNLoCgCRcHf14kE+CLIvNX1zmA== + dependencies: + "@sigstore/protobuf-specs" "^0.3.2" + +"@sigstore/core@^1.0.0", "@sigstore/core@^1.1.0": + version "1.1.0" + resolved "https://registry.npmjs.org/@sigstore/core/-/core-1.1.0.tgz" + integrity sha512-JzBqdVIyqm2FRQCulY6nbQzMpJJpSiJ8XXWMhtOX9eKgaXXpfNOF53lzQEjIydlStnd/eFtuC1dW4VYdD93oRg== + +"@sigstore/protobuf-specs@^0.3.2": + version "0.3.2" + resolved "https://registry.npmjs.org/@sigstore/protobuf-specs/-/protobuf-specs-0.3.2.tgz" + integrity sha512-c6B0ehIWxMI8wiS/bj6rHMPqeFvngFV7cDU/MY+B16P9Z3Mp9k8L93eYZ7BYzSickzuqAQqAq0V956b3Ju6mLw== + +"@sigstore/sign@^2.3.2": + version "2.3.2" + resolved "https://registry.npmjs.org/@sigstore/sign/-/sign-2.3.2.tgz" + integrity sha512-5Vz5dPVuunIIvC5vBb0APwo7qKA4G9yM48kPWJT+OEERs40md5GoUR1yedwpekWZ4m0Hhw44m6zU+ObsON+iDA== + dependencies: + "@sigstore/bundle" "^2.3.2" + "@sigstore/core" "^1.0.0" + "@sigstore/protobuf-specs" "^0.3.2" + make-fetch-happen "^13.0.1" + proc-log "^4.2.0" + promise-retry "^2.0.1" + +"@sigstore/tuf@^2.3.4": + version "2.3.4" + resolved "https://registry.npmjs.org/@sigstore/tuf/-/tuf-2.3.4.tgz" + integrity sha512-44vtsveTPUpqhm9NCrbU8CWLe3Vck2HO1PNLw7RIajbB7xhtn5RBPm1VNSCMwqGYHhDsBJG8gDF0q4lgydsJvw== + dependencies: + "@sigstore/protobuf-specs" "^0.3.2" + tuf-js "^2.2.1" + +"@sigstore/verify@^1.2.1": + version "1.2.1" + resolved "https://registry.npmjs.org/@sigstore/verify/-/verify-1.2.1.tgz" + integrity sha512-8iKx79/F73DKbGfRf7+t4dqrc0bRr0thdPrxAtCKWRm/F0tG71i6O1rvlnScncJLLBZHn3h8M3c1BSUAb9yu8g== + dependencies: + "@sigstore/bundle" "^2.3.2" + "@sigstore/core" "^1.1.0" + "@sigstore/protobuf-specs" "^0.3.2" + +"@sindresorhus/is@^4.0.0": + version "4.6.0" + resolved "https://registry.npmjs.org/@sindresorhus/is/-/is-4.6.0.tgz" + integrity sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw== + +"@smithy/abort-controller@^3.1.9": + version "3.1.9" + resolved "https://registry.npmjs.org/@smithy/abort-controller/-/abort-controller-3.1.9.tgz" + integrity sha512-yiW0WI30zj8ZKoSYNx90no7ugVn3khlyH/z5W8qtKBtVE6awRALbhSG+2SAHA1r6bO/6M9utxYKVZ3PCJ1rWxw== + dependencies: + "@smithy/types" "^3.7.2" + tslib "^2.6.2" + +"@smithy/abort-controller@^4.0.1": + version "4.0.1" + resolved "https://registry.yarnpkg.com/@smithy/abort-controller/-/abort-controller-4.0.1.tgz#7c5e73690c4105ad264c2896bd1ea822450c3819" + integrity sha512-fiUIYgIgRjMWznk6iLJz35K2YxSLHzLBA/RC6lBrKfQ8fHbPfvk7Pk9UvpKoHgJjI18MnbPuEju53zcVy6KF1g== + dependencies: + "@smithy/types" "^4.1.0" + tslib "^2.6.2" + +"@smithy/chunked-blob-reader-native@^4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@smithy/chunked-blob-reader-native/-/chunked-blob-reader-native-4.0.0.tgz#33cbba6deb8a3c516f98444f65061784f7cd7f8c" + integrity sha512-R9wM2yPmfEMsUmlMlIgSzOyICs0x9uu7UTHoccMyt7BWw8shcGM8HqB355+BZCPBcySvbTYMs62EgEQkNxz2ig== + dependencies: + "@smithy/util-base64" "^4.0.0" + tslib "^2.6.2" + +"@smithy/chunked-blob-reader@^5.0.0": + version "5.0.0" + resolved "https://registry.yarnpkg.com/@smithy/chunked-blob-reader/-/chunked-blob-reader-5.0.0.tgz#3f6ea5ff4e2b2eacf74cefd737aa0ba869b2e0f6" + integrity sha512-+sKqDBQqb036hh4NPaUiEkYFkTUGYzRsn3EuFhyfQfMy6oGHEUJDurLP9Ufb5dasr/XiAmPNMr6wa9afjQB+Gw== + dependencies: + tslib "^2.6.2" + +"@smithy/config-resolver@^3.0.13", "@smithy/config-resolver@^3.0.8": + version "3.0.13" + resolved "https://registry.npmjs.org/@smithy/config-resolver/-/config-resolver-3.0.13.tgz" + integrity sha512-Gr/qwzyPaTL1tZcq8WQyHhTZREER5R1Wytmz4WnVGL4onA3dNk6Btll55c8Vr58pLdvWZmtG8oZxJTw3t3q7Jg== + dependencies: + "@smithy/node-config-provider" "^3.1.12" + "@smithy/types" "^3.7.2" + "@smithy/util-config-provider" "^3.0.0" + "@smithy/util-middleware" "^3.0.11" + tslib "^2.6.2" + +"@smithy/config-resolver@^4.0.1": + version "4.0.1" + resolved "https://registry.yarnpkg.com/@smithy/config-resolver/-/config-resolver-4.0.1.tgz#3d6c78bbc51adf99c9819bb3f0ea197fe03ad363" + integrity sha512-Igfg8lKu3dRVkTSEm98QpZUvKEOa71jDX4vKRcvJVyRc3UgN3j7vFMf0s7xLQhYmKa8kyJGQgUJDOV5V3neVlQ== + dependencies: + "@smithy/node-config-provider" "^4.0.1" + "@smithy/types" "^4.1.0" + "@smithy/util-config-provider" "^4.0.0" + "@smithy/util-middleware" "^4.0.1" + tslib "^2.6.2" + +"@smithy/core@^2.4.6", "@smithy/core@^2.5.5": + version "2.5.5" + resolved "https://registry.npmjs.org/@smithy/core/-/core-2.5.5.tgz" + integrity sha512-G8G/sDDhXA7o0bOvkc7bgai6POuSld/+XhNnWAbpQTpLv2OZPvyqQ58tLPPlz0bSNsXktldDDREIv1LczFeNEw== + dependencies: + "@smithy/middleware-serde" "^3.0.11" + "@smithy/protocol-http" "^4.1.8" + "@smithy/types" "^3.7.2" + "@smithy/util-body-length-browser" "^3.0.0" + "@smithy/util-middleware" "^3.0.11" + "@smithy/util-stream" "^3.3.2" + "@smithy/util-utf8" "^3.0.0" + tslib "^2.6.2" + +"@smithy/core@^3.1.2": + version "3.1.2" + resolved "https://registry.yarnpkg.com/@smithy/core/-/core-3.1.2.tgz#f5b4c89bf054b717781d71c66b4fb594e06cbb62" + integrity sha512-htwQXkbdF13uwwDevz9BEzL5ABK+1sJpVQXywwGSH973AVOvisHNfpcB8A8761G6XgHoS2kHPqc9DqHJ2gp+/Q== + dependencies: + "@smithy/middleware-serde" "^4.0.2" + "@smithy/protocol-http" "^5.0.1" + "@smithy/types" "^4.1.0" + "@smithy/util-body-length-browser" "^4.0.0" + "@smithy/util-middleware" "^4.0.1" + "@smithy/util-stream" "^4.0.2" + "@smithy/util-utf8" "^4.0.0" + tslib "^2.6.2" + +"@smithy/credential-provider-imds@^3.2.3", "@smithy/credential-provider-imds@^3.2.8": + version "3.2.8" + resolved "https://registry.npmjs.org/@smithy/credential-provider-imds/-/credential-provider-imds-3.2.8.tgz" + integrity sha512-ZCY2yD0BY+K9iMXkkbnjo+08T2h8/34oHd0Jmh6BZUSZwaaGlGCyBT/3wnS7u7Xl33/EEfN4B6nQr3Gx5bYxgw== + dependencies: + "@smithy/node-config-provider" "^3.1.12" + "@smithy/property-provider" "^3.1.11" + "@smithy/types" "^3.7.2" + "@smithy/url-parser" "^3.0.11" + tslib "^2.6.2" + +"@smithy/credential-provider-imds@^4.0.1": + version "4.0.1" + resolved "https://registry.yarnpkg.com/@smithy/credential-provider-imds/-/credential-provider-imds-4.0.1.tgz#807110739982acd1588a4847b61e6edf196d004e" + integrity sha512-l/qdInaDq1Zpznpmev/+52QomsJNZ3JkTl5yrTl02V6NBgJOQ4LY0SFw/8zsMwj3tLe8vqiIuwF6nxaEwgf6mg== + dependencies: + "@smithy/node-config-provider" "^4.0.1" + "@smithy/property-provider" "^4.0.1" + "@smithy/types" "^4.1.0" + "@smithy/url-parser" "^4.0.1" + tslib "^2.6.2" + +"@smithy/eventstream-codec@^4.0.1": + version "4.0.1" + resolved "https://registry.yarnpkg.com/@smithy/eventstream-codec/-/eventstream-codec-4.0.1.tgz#8e0beae84013eb3b497dd189470a44bac4411bae" + integrity sha512-Q2bCAAR6zXNVtJgifsU16ZjKGqdw/DyecKNgIgi7dlqw04fqDu0mnq+JmGphqheypVc64CYq3azSuCpAdFk2+A== + dependencies: + "@aws-crypto/crc32" "5.2.0" + "@smithy/types" "^4.1.0" + "@smithy/util-hex-encoding" "^4.0.0" + tslib "^2.6.2" + +"@smithy/eventstream-serde-browser@^4.0.1": + version "4.0.1" + resolved "https://registry.yarnpkg.com/@smithy/eventstream-serde-browser/-/eventstream-serde-browser-4.0.1.tgz#cdbbb18b9371da363eff312d78a10f6bad82df28" + integrity sha512-HbIybmz5rhNg+zxKiyVAnvdM3vkzjE6ccrJ620iPL8IXcJEntd3hnBl+ktMwIy12Te/kyrSbUb8UCdnUT4QEdA== + dependencies: + "@smithy/eventstream-serde-universal" "^4.0.1" + "@smithy/types" "^4.1.0" + tslib "^2.6.2" + +"@smithy/eventstream-serde-config-resolver@^4.0.1": + version "4.0.1" + resolved "https://registry.yarnpkg.com/@smithy/eventstream-serde-config-resolver/-/eventstream-serde-config-resolver-4.0.1.tgz#3662587f507ad7fac5bd4505c4ed6ed0ac49a010" + integrity sha512-lSipaiq3rmHguHa3QFF4YcCM3VJOrY9oq2sow3qlhFY+nBSTF/nrO82MUQRPrxHQXA58J5G1UnU2WuJfi465BA== + dependencies: + "@smithy/types" "^4.1.0" + tslib "^2.6.2" + +"@smithy/eventstream-serde-node@^4.0.1": + version "4.0.1" + resolved "https://registry.yarnpkg.com/@smithy/eventstream-serde-node/-/eventstream-serde-node-4.0.1.tgz#3799c33e0148d2b923a66577d1dbc590865742ce" + integrity sha512-o4CoOI6oYGYJ4zXo34U8X9szDe3oGjmHgsMGiZM0j4vtNoT+h80TLnkUcrLZR3+E6HIxqW+G+9WHAVfl0GXK0Q== + dependencies: + "@smithy/eventstream-serde-universal" "^4.0.1" + "@smithy/types" "^4.1.0" + tslib "^2.6.2" + +"@smithy/eventstream-serde-universal@^4.0.1": + version "4.0.1" + resolved "https://registry.yarnpkg.com/@smithy/eventstream-serde-universal/-/eventstream-serde-universal-4.0.1.tgz#ddb2ab9f62b8ab60f50acd5f7c8b3ac9d27468e2" + integrity sha512-Z94uZp0tGJuxds3iEAZBqGU2QiaBHP4YytLUjwZWx+oUeohCsLyUm33yp4MMBmhkuPqSbQCXq5hDet6JGUgHWA== + dependencies: + "@smithy/eventstream-codec" "^4.0.1" + "@smithy/types" "^4.1.0" + tslib "^2.6.2" + +"@smithy/fetch-http-handler@^3.2.8": + version "3.2.9" + resolved "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-3.2.9.tgz" + integrity sha512-hYNVQOqhFQ6vOpenifFME546f0GfJn2OiQ3M0FDmuUu8V/Uiwy2wej7ZXxFBNqdx0R5DZAqWM1l6VRhGz8oE6A== + dependencies: + "@smithy/protocol-http" "^4.1.4" + "@smithy/querystring-builder" "^3.0.7" + "@smithy/types" "^3.5.0" + "@smithy/util-base64" "^3.0.0" + tslib "^2.6.2" + +"@smithy/fetch-http-handler@^4.1.2": + version "4.1.2" + resolved "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-4.1.2.tgz" + integrity sha512-R7rU7Ae3ItU4rC0c5mB2sP5mJNbCfoDc8I5XlYjIZnquyUwec7fEo78F6DA3SmgJgkU1qTMcZJuGblxZsl10ZA== + dependencies: + "@smithy/protocol-http" "^4.1.8" + "@smithy/querystring-builder" "^3.0.11" + "@smithy/types" "^3.7.2" + "@smithy/util-base64" "^3.0.0" + tslib "^2.6.2" + +"@smithy/fetch-http-handler@^5.0.1": + version "5.0.1" + resolved "https://registry.yarnpkg.com/@smithy/fetch-http-handler/-/fetch-http-handler-5.0.1.tgz#8463393442ca6a1644204849e42c386066f0df79" + integrity sha512-3aS+fP28urrMW2KTjb6z9iFow6jO8n3MFfineGbndvzGZit3taZhKWtTorf+Gp5RpFDDafeHlhfsGlDCXvUnJA== + dependencies: + "@smithy/protocol-http" "^5.0.1" + "@smithy/querystring-builder" "^4.0.1" + "@smithy/types" "^4.1.0" + "@smithy/util-base64" "^4.0.0" + tslib "^2.6.2" + +"@smithy/hash-blob-browser@^4.0.1": + version "4.0.1" + resolved "https://registry.yarnpkg.com/@smithy/hash-blob-browser/-/hash-blob-browser-4.0.1.tgz#cda18d5828e8724d97441ea9cc4fd16d0db9da39" + integrity sha512-rkFIrQOKZGS6i1D3gKJ8skJ0RlXqDvb1IyAphksaFOMzkn3v3I1eJ8m7OkLj0jf1McP63rcCEoLlkAn/HjcTRw== + dependencies: + "@smithy/chunked-blob-reader" "^5.0.0" + "@smithy/chunked-blob-reader-native" "^4.0.0" + "@smithy/types" "^4.1.0" + tslib "^2.6.2" + +"@smithy/hash-node@^3.0.11", "@smithy/hash-node@^3.0.6": + version "3.0.11" + resolved "https://registry.npmjs.org/@smithy/hash-node/-/hash-node-3.0.11.tgz" + integrity sha512-emP23rwYyZhQBvklqTtwetkQlqbNYirDiEEwXl2v0GYWMnCzxst7ZaRAnWuy28njp5kAH54lvkdG37MblZzaHA== + dependencies: + "@smithy/types" "^3.7.2" + "@smithy/util-buffer-from" "^3.0.0" + "@smithy/util-utf8" "^3.0.0" + tslib "^2.6.2" + +"@smithy/hash-node@^4.0.1": + version "4.0.1" + resolved "https://registry.yarnpkg.com/@smithy/hash-node/-/hash-node-4.0.1.tgz#ce78fc11b848a4f47c2e1e7a07fb6b982d2f130c" + integrity sha512-TJ6oZS+3r2Xu4emVse1YPB3Dq3d8RkZDKcPr71Nj/lJsdAP1c7oFzYqEn1IBc915TsgLl2xIJNuxCz+gLbLE0w== + dependencies: + "@smithy/types" "^4.1.0" + "@smithy/util-buffer-from" "^4.0.0" + "@smithy/util-utf8" "^4.0.0" + tslib "^2.6.2" + +"@smithy/hash-stream-node@^4.0.1": + version "4.0.1" + resolved "https://registry.yarnpkg.com/@smithy/hash-stream-node/-/hash-stream-node-4.0.1.tgz#06126859a3cb1a11e50b61c5a097a4d9a5af2ac1" + integrity sha512-U1rAE1fxmReCIr6D2o/4ROqAQX+GffZpyMt3d7njtGDr2pUNmAKRWa49gsNVhCh2vVAuf3wXzWwNr2YN8PAXIw== + dependencies: + "@smithy/types" "^4.1.0" + "@smithy/util-utf8" "^4.0.0" + tslib "^2.6.2" + +"@smithy/invalid-dependency@^3.0.11", "@smithy/invalid-dependency@^3.0.6": + version "3.0.11" + resolved "https://registry.npmjs.org/@smithy/invalid-dependency/-/invalid-dependency-3.0.11.tgz" + integrity sha512-NuQmVPEJjUX6c+UELyVz8kUx8Q539EDeNwbRyu4IIF8MeV7hUtq1FB3SHVyki2u++5XLMFqngeMKk7ccspnNyQ== + dependencies: + "@smithy/types" "^3.7.2" + tslib "^2.6.2" + +"@smithy/invalid-dependency@^4.0.1": + version "4.0.1" + resolved "https://registry.yarnpkg.com/@smithy/invalid-dependency/-/invalid-dependency-4.0.1.tgz#704d1acb6fac105558c17d53f6d55da6b0d6b6fc" + integrity sha512-gdudFPf4QRQ5pzj7HEnu6FhKRi61BfH/Gk5Yf6O0KiSbr1LlVhgjThcvjdu658VE6Nve8vaIWB8/fodmS1rBPQ== + dependencies: + "@smithy/types" "^4.1.0" + tslib "^2.6.2" + +"@smithy/is-array-buffer@^2.2.0": + version "2.2.0" + resolved "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-2.2.0.tgz" + integrity sha512-GGP3O9QFD24uGeAXYUjwSTXARoqpZykHadOmA8G5vfJPK0/DC67qa//0qvqrJzL1xc8WQWX7/yc7fwudjPHPhA== + dependencies: + tslib "^2.6.2" + +"@smithy/is-array-buffer@^3.0.0": + version "3.0.0" + resolved "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-3.0.0.tgz" + integrity sha512-+Fsu6Q6C4RSJiy81Y8eApjEB5gVtM+oFKTffg+jSuwtvomJJrhUJBu2zS8wjXSgH/g1MKEWrzyChTBe6clb5FQ== + dependencies: + tslib "^2.6.2" + +"@smithy/is-array-buffer@^4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@smithy/is-array-buffer/-/is-array-buffer-4.0.0.tgz#55a939029321fec462bcc574890075cd63e94206" + integrity sha512-saYhF8ZZNoJDTvJBEWgeBccCg+yvp1CX+ed12yORU3NilJScfc6gfch2oVb4QgxZrGUx3/ZJlb+c/dJbyupxlw== + dependencies: + tslib "^2.6.2" + +"@smithy/md5-js@^4.0.1": + version "4.0.1" + resolved "https://registry.yarnpkg.com/@smithy/md5-js/-/md5-js-4.0.1.tgz#d7622e94dc38ecf290876fcef04369217ada8f07" + integrity sha512-HLZ647L27APi6zXkZlzSFZIjpo8po45YiyjMGJZM3gyDY8n7dPGdmxIIljLm4gPt/7rRvutLTTkYJpZVfG5r+A== + dependencies: + "@smithy/types" "^4.1.0" + "@smithy/util-utf8" "^4.0.0" + tslib "^2.6.2" + +"@smithy/middleware-compression@^3.1.5": + version "3.1.5" + resolved "https://registry.npmjs.org/@smithy/middleware-compression/-/middleware-compression-3.1.5.tgz" + integrity sha512-14rZ++nuQwiFERvqPtdDr1uLL8tvWZbDcphMGRw67NfXnBgpKx5QFMSfcQDD+CswQ3Y+0aQRjHJTP+BBjU2TiA== + dependencies: + "@smithy/core" "^2.5.5" + "@smithy/is-array-buffer" "^3.0.0" + "@smithy/node-config-provider" "^3.1.12" + "@smithy/protocol-http" "^4.1.8" + "@smithy/types" "^3.7.2" + "@smithy/util-config-provider" "^3.0.0" + "@smithy/util-middleware" "^3.0.11" + "@smithy/util-utf8" "^3.0.0" + fflate "0.8.1" + tslib "^2.6.2" + +"@smithy/middleware-content-length@^3.0.13", "@smithy/middleware-content-length@^3.0.8": + version "3.0.13" + resolved "https://registry.npmjs.org/@smithy/middleware-content-length/-/middleware-content-length-3.0.13.tgz" + integrity sha512-zfMhzojhFpIX3P5ug7jxTjfUcIPcGjcQYzB9t+rv0g1TX7B0QdwONW+ATouaLoD7h7LOw/ZlXfkq4xJ/g2TrIw== + dependencies: + "@smithy/protocol-http" "^4.1.8" + "@smithy/types" "^3.7.2" + tslib "^2.6.2" + +"@smithy/middleware-content-length@^4.0.1": + version "4.0.1" + resolved "https://registry.yarnpkg.com/@smithy/middleware-content-length/-/middleware-content-length-4.0.1.tgz#378bc94ae623f45e412fb4f164b5bb90b9de2ba3" + integrity sha512-OGXo7w5EkB5pPiac7KNzVtfCW2vKBTZNuCctn++TTSOMpe6RZO/n6WEC1AxJINn3+vWLKW49uad3lo/u0WJ9oQ== + dependencies: + "@smithy/protocol-http" "^5.0.1" + "@smithy/types" "^4.1.0" + tslib "^2.6.2" + +"@smithy/middleware-endpoint@^3.1.3", "@smithy/middleware-endpoint@^3.2.5": + version "3.2.5" + resolved "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-3.2.5.tgz" + integrity sha512-VhJNs/s/lyx4weiZdXSloBgoLoS8osV0dKIain8nGmx7of3QFKu5BSdEuk1z/U8x9iwes1i+XCiNusEvuK1ijg== + dependencies: + "@smithy/core" "^2.5.5" + "@smithy/middleware-serde" "^3.0.11" + "@smithy/node-config-provider" "^3.1.12" + "@smithy/shared-ini-file-loader" "^3.1.12" + "@smithy/types" "^3.7.2" + "@smithy/url-parser" "^3.0.11" + "@smithy/util-middleware" "^3.0.11" + tslib "^2.6.2" + +"@smithy/middleware-endpoint@^4.0.3": + version "4.0.3" + resolved "https://registry.yarnpkg.com/@smithy/middleware-endpoint/-/middleware-endpoint-4.0.3.tgz#74b64fb2473ae35649a8d22d41708bc5d8d99df2" + integrity sha512-YdbmWhQF5kIxZjWqPIgboVfi8i5XgiYMM7GGKFMTvBei4XjNQfNv8sukT50ITvgnWKKKpOtp0C0h7qixLgb77Q== + dependencies: + "@smithy/core" "^3.1.2" + "@smithy/middleware-serde" "^4.0.2" + "@smithy/node-config-provider" "^4.0.1" + "@smithy/shared-ini-file-loader" "^4.0.1" + "@smithy/types" "^4.1.0" + "@smithy/url-parser" "^4.0.1" + "@smithy/util-middleware" "^4.0.1" + tslib "^2.6.2" + +"@smithy/middleware-retry@^3.0.21", "@smithy/middleware-retry@^3.0.30": + version "3.0.30" + resolved "https://registry.npmjs.org/@smithy/middleware-retry/-/middleware-retry-3.0.30.tgz" + integrity sha512-6323RL2BvAR3VQpTjHpa52kH/iSHyxd/G9ohb2MkBk2Ucu+oMtRXT8yi7KTSIS9nb58aupG6nO0OlXnQOAcvmQ== + dependencies: + "@smithy/node-config-provider" "^3.1.12" + "@smithy/protocol-http" "^4.1.8" + "@smithy/service-error-classification" "^3.0.11" + "@smithy/smithy-client" "^3.5.0" + "@smithy/types" "^3.7.2" + "@smithy/util-middleware" "^3.0.11" + "@smithy/util-retry" "^3.0.11" + tslib "^2.6.2" + uuid "^9.0.1" + +"@smithy/middleware-retry@^4.0.4": + version "4.0.4" + resolved "https://registry.yarnpkg.com/@smithy/middleware-retry/-/middleware-retry-4.0.4.tgz#95e55a1b163ff06264f20b4dbbcbd915c8028f60" + integrity sha512-wmxyUBGHaYUqul0wZiset4M39SMtDBOtUr2KpDuftKNN74Do9Y36Go6Eqzj9tL0mIPpr31ulB5UUtxcsCeGXsQ== + dependencies: + "@smithy/node-config-provider" "^4.0.1" + "@smithy/protocol-http" "^5.0.1" + "@smithy/service-error-classification" "^4.0.1" + "@smithy/smithy-client" "^4.1.3" + "@smithy/types" "^4.1.0" + "@smithy/util-middleware" "^4.0.1" + "@smithy/util-retry" "^4.0.1" + tslib "^2.6.2" + uuid "^9.0.1" + +"@smithy/middleware-serde@^3.0.11", "@smithy/middleware-serde@^3.0.6": + version "3.0.11" + resolved "https://registry.npmjs.org/@smithy/middleware-serde/-/middleware-serde-3.0.11.tgz" + integrity sha512-KzPAeySp/fOoQA82TpnwItvX8BBURecpx6ZMu75EZDkAcnPtO6vf7q4aH5QHs/F1s3/snQaSFbbUMcFFZ086Mw== + dependencies: + "@smithy/types" "^3.7.2" + tslib "^2.6.2" + +"@smithy/middleware-serde@^4.0.2": + version "4.0.2" + resolved "https://registry.yarnpkg.com/@smithy/middleware-serde/-/middleware-serde-4.0.2.tgz#f792d72f6ad8fa6b172e3f19c6fe1932a856a56d" + integrity sha512-Sdr5lOagCn5tt+zKsaW+U2/iwr6bI9p08wOkCp6/eL6iMbgdtc2R5Ety66rf87PeohR0ExI84Txz9GYv5ou3iQ== + dependencies: + "@smithy/types" "^4.1.0" + tslib "^2.6.2" + +"@smithy/middleware-stack@^3.0.11", "@smithy/middleware-stack@^3.0.6": + version "3.0.11" + resolved "https://registry.npmjs.org/@smithy/middleware-stack/-/middleware-stack-3.0.11.tgz" + integrity sha512-1HGo9a6/ikgOMrTrWL/WiN9N8GSVYpuRQO5kjstAq4CvV59bjqnh7TbdXGQ4vxLD3xlSjfBjq5t1SOELePsLnA== + dependencies: + "@smithy/types" "^3.7.2" + tslib "^2.6.2" + +"@smithy/middleware-stack@^4.0.1": + version "4.0.1" + resolved "https://registry.yarnpkg.com/@smithy/middleware-stack/-/middleware-stack-4.0.1.tgz#c157653f9df07f7c26e32f49994d368e4e071d22" + integrity sha512-dHwDmrtR/ln8UTHpaIavRSzeIk5+YZTBtLnKwDW3G2t6nAupCiQUvNzNoHBpik63fwUaJPtlnMzXbQrNFWssIA== + dependencies: + "@smithy/types" "^4.1.0" + tslib "^2.6.2" + +"@smithy/node-config-provider@^3.1.12", "@smithy/node-config-provider@^3.1.7": + version "3.1.12" + resolved "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-3.1.12.tgz" + integrity sha512-O9LVEu5J/u/FuNlZs+L7Ikn3lz7VB9hb0GtPT9MQeiBmtK8RSY3ULmsZgXhe6VAlgTw0YO+paQx4p8xdbs43vQ== + dependencies: + "@smithy/property-provider" "^3.1.11" + "@smithy/shared-ini-file-loader" "^3.1.12" + "@smithy/types" "^3.7.2" + tslib "^2.6.2" + +"@smithy/node-config-provider@^4.0.1": + version "4.0.1" + resolved "https://registry.yarnpkg.com/@smithy/node-config-provider/-/node-config-provider-4.0.1.tgz#4e84fe665c0774d5f4ebb75144994fc6ebedf86e" + integrity sha512-8mRTjvCtVET8+rxvmzRNRR0hH2JjV0DFOmwXPrISmTIJEfnCBugpYYGAsCj8t41qd+RB5gbheSQ/6aKZCQvFLQ== + dependencies: + "@smithy/property-provider" "^4.0.1" + "@smithy/shared-ini-file-loader" "^4.0.1" + "@smithy/types" "^4.1.0" + tslib "^2.6.2" + +"@smithy/node-http-handler@^3.2.3", "@smithy/node-http-handler@^3.3.2": + version "3.3.2" + resolved "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-3.3.2.tgz" + integrity sha512-t4ng1DAd527vlxvOfKFYEe6/QFBcsj7WpNlWTyjorwXXcKw3XlltBGbyHfSJ24QT84nF+agDha9tNYpzmSRZPA== + dependencies: + "@smithy/abort-controller" "^3.1.9" + "@smithy/protocol-http" "^4.1.8" + "@smithy/querystring-builder" "^3.0.11" + "@smithy/types" "^3.7.2" + tslib "^2.6.2" + +"@smithy/node-http-handler@^4.0.2": + version "4.0.2" + resolved "https://registry.yarnpkg.com/@smithy/node-http-handler/-/node-http-handler-4.0.2.tgz#48d47a046cf900ab86bfbe7f5fd078b52c82fab6" + integrity sha512-X66H9aah9hisLLSnGuzRYba6vckuFtGE+a5DcHLliI/YlqKrGoxhisD5XbX44KyoeRzoNlGr94eTsMVHFAzPOw== + dependencies: + "@smithy/abort-controller" "^4.0.1" + "@smithy/protocol-http" "^5.0.1" + "@smithy/querystring-builder" "^4.0.1" + "@smithy/types" "^4.1.0" + tslib "^2.6.2" + +"@smithy/property-provider@^3.1.11", "@smithy/property-provider@^3.1.6": + version "3.1.11" + resolved "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-3.1.11.tgz" + integrity sha512-I/+TMc4XTQ3QAjXfOcUWbSS073oOEAxgx4aZy8jHaf8JQnRkq2SZWw8+PfDtBvLUjcGMdxl+YwtzWe6i5uhL/A== + dependencies: + "@smithy/types" "^3.7.2" + tslib "^2.6.2" + +"@smithy/property-provider@^4.0.1": + version "4.0.1" + resolved "https://registry.yarnpkg.com/@smithy/property-provider/-/property-provider-4.0.1.tgz#8d35d5997af2a17cf15c5e921201ef6c5e3fc870" + integrity sha512-o+VRiwC2cgmk/WFV0jaETGOtX16VNPp2bSQEzu0whbReqE1BMqsP2ami2Vi3cbGVdKu1kq9gQkDAGKbt0WOHAQ== + dependencies: + "@smithy/types" "^4.1.0" + tslib "^2.6.2" + +"@smithy/protocol-http@^4.1.3", "@smithy/protocol-http@^4.1.4", "@smithy/protocol-http@^4.1.8": + version "4.1.8" + resolved "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-4.1.8.tgz" + integrity sha512-hmgIAVyxw1LySOwkgMIUN0kjN8TG9Nc85LJeEmEE/cNEe2rkHDUWhnJf2gxcSRFLWsyqWsrZGw40ROjUogg+Iw== + dependencies: + "@smithy/types" "^3.7.2" + tslib "^2.6.2" + +"@smithy/protocol-http@^5.0.1": + version "5.0.1" + resolved "https://registry.yarnpkg.com/@smithy/protocol-http/-/protocol-http-5.0.1.tgz#37c248117b29c057a9adfad4eb1d822a67079ff1" + integrity sha512-TE4cpj49jJNB/oHyh/cRVEgNZaoPaxd4vteJNB0yGidOCVR0jCw/hjPVsT8Q8FRmj8Bd3bFZt8Dh7xGCT+xMBQ== + dependencies: + "@smithy/types" "^4.1.0" + tslib "^2.6.2" + +"@smithy/querystring-builder@^3.0.11", "@smithy/querystring-builder@^3.0.7": + version "3.0.11" + resolved "https://registry.npmjs.org/@smithy/querystring-builder/-/querystring-builder-3.0.11.tgz" + integrity sha512-u+5HV/9uJaeLj5XTb6+IEF/dokWWkEqJ0XiaRRogyREmKGUgZnNecLucADLdauWFKUNbQfulHFEZEdjwEBjXRg== + dependencies: + "@smithy/types" "^3.7.2" + "@smithy/util-uri-escape" "^3.0.0" + tslib "^2.6.2" + +"@smithy/querystring-builder@^4.0.1": + version "4.0.1" + resolved "https://registry.yarnpkg.com/@smithy/querystring-builder/-/querystring-builder-4.0.1.tgz#37e1e05d0d33c6f694088abc3e04eafb65cb6976" + integrity sha512-wU87iWZoCbcqrwszsOewEIuq+SU2mSoBE2CcsLwE0I19m0B2gOJr1MVjxWcDQYOzHbR1xCk7AcOBbGFUYOKvdg== + dependencies: + "@smithy/types" "^4.1.0" + "@smithy/util-uri-escape" "^4.0.0" + tslib "^2.6.2" + +"@smithy/querystring-parser@^3.0.11": + version "3.0.11" + resolved "https://registry.npmjs.org/@smithy/querystring-parser/-/querystring-parser-3.0.11.tgz" + integrity sha512-Je3kFvCsFMnso1ilPwA7GtlbPaTixa3WwC+K21kmMZHsBEOZYQaqxcMqeFFoU7/slFjKDIpiiPydvdJm8Q/MCw== + dependencies: + "@smithy/types" "^3.7.2" + tslib "^2.6.2" + +"@smithy/querystring-parser@^4.0.1": + version "4.0.1" + resolved "https://registry.yarnpkg.com/@smithy/querystring-parser/-/querystring-parser-4.0.1.tgz#312dc62b146f8bb8a67558d82d4722bb9211af42" + integrity sha512-Ma2XC7VS9aV77+clSFylVUnPZRindhB7BbmYiNOdr+CHt/kZNJoPP0cd3QxCnCFyPXC4eybmyE98phEHkqZ5Jw== + dependencies: + "@smithy/types" "^4.1.0" + tslib "^2.6.2" + +"@smithy/service-error-classification@^3.0.11": + version "3.0.11" + resolved "https://registry.npmjs.org/@smithy/service-error-classification/-/service-error-classification-3.0.11.tgz" + integrity sha512-QnYDPkyewrJzCyaeI2Rmp7pDwbUETe+hU8ADkXmgNusO1bgHBH7ovXJiYmba8t0fNfJx75fE8dlM6SEmZxheog== + dependencies: + "@smithy/types" "^3.7.2" + +"@smithy/service-error-classification@^4.0.1": + version "4.0.1" + resolved "https://registry.yarnpkg.com/@smithy/service-error-classification/-/service-error-classification-4.0.1.tgz#84e78579af46c7b79c900b6d6cc822c9465f3259" + integrity sha512-3JNjBfOWpj/mYfjXJHB4Txc/7E4LVq32bwzE7m28GN79+M1f76XHflUaSUkhOriprPDzev9cX/M+dEB80DNDKA== + dependencies: + "@smithy/types" "^4.1.0" + +"@smithy/shared-ini-file-loader@^3.1.12", "@smithy/shared-ini-file-loader@^3.1.7": + version "3.1.12" + resolved "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-3.1.12.tgz" + integrity sha512-1xKSGI+U9KKdbG2qDvIR9dGrw3CNx+baqJfyr0igKEpjbHL5stsqAesYBzHChYHlelWtb87VnLWlhvfCz13H8Q== + dependencies: + "@smithy/types" "^3.7.2" + tslib "^2.6.2" + +"@smithy/shared-ini-file-loader@^4.0.1": + version "4.0.1" + resolved "https://registry.yarnpkg.com/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-4.0.1.tgz#d35c21c29454ca4e58914a4afdde68d3b2def1ee" + integrity sha512-hC8F6qTBbuHRI/uqDgqqi6J0R4GtEZcgrZPhFQnMhfJs3MnUTGSnR1NSJCJs5VWlMydu0kJz15M640fJlRsIOw== + dependencies: + "@smithy/types" "^4.1.0" + tslib "^2.6.2" + +"@smithy/signature-v4@^4.1.4", "@smithy/signature-v4@^4.2.4": + version "4.2.4" + resolved "https://registry.npmjs.org/@smithy/signature-v4/-/signature-v4-4.2.4.tgz" + integrity sha512-5JWeMQYg81TgU4cG+OexAWdvDTs5JDdbEZx+Qr1iPbvo91QFGzjy0IkXAKaXUHqmKUJgSHK0ZxnCkgZpzkeNTA== + dependencies: + "@smithy/is-array-buffer" "^3.0.0" + "@smithy/protocol-http" "^4.1.8" + "@smithy/types" "^3.7.2" + "@smithy/util-hex-encoding" "^3.0.0" + "@smithy/util-middleware" "^3.0.11" + "@smithy/util-uri-escape" "^3.0.0" + "@smithy/util-utf8" "^3.0.0" + tslib "^2.6.2" + +"@smithy/signature-v4@^5.0.1": + version "5.0.1" + resolved "https://registry.yarnpkg.com/@smithy/signature-v4/-/signature-v4-5.0.1.tgz#f93401b176150286ba246681031b0503ec359270" + integrity sha512-nCe6fQ+ppm1bQuw5iKoeJ0MJfz2os7Ic3GBjOkLOPtavbD1ONoyE3ygjBfz2ythFWm4YnRm6OxW+8p/m9uCoIA== + dependencies: + "@smithy/is-array-buffer" "^4.0.0" + "@smithy/protocol-http" "^5.0.1" + "@smithy/types" "^4.1.0" + "@smithy/util-hex-encoding" "^4.0.0" + "@smithy/util-middleware" "^4.0.1" + "@smithy/util-uri-escape" "^4.0.0" + "@smithy/util-utf8" "^4.0.0" + tslib "^2.6.2" + +"@smithy/smithy-client@^3.3.5", "@smithy/smithy-client@^3.5.0": + version "3.5.0" + resolved "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-3.5.0.tgz" + integrity sha512-Y8FeOa7gbDfCWf7njrkoRATPa5eNLUEjlJS5z5rXatYuGkCb80LbHcu8AQR8qgAZZaNHCLyo2N+pxPsV7l+ivg== + dependencies: + "@smithy/core" "^2.5.5" + "@smithy/middleware-endpoint" "^3.2.5" + "@smithy/middleware-stack" "^3.0.11" + "@smithy/protocol-http" "^4.1.8" + "@smithy/types" "^3.7.2" + "@smithy/util-stream" "^3.3.2" + tslib "^2.6.2" + +"@smithy/smithy-client@^4.1.3": + version "4.1.3" + resolved "https://registry.yarnpkg.com/@smithy/smithy-client/-/smithy-client-4.1.3.tgz#2c8f9aff3377e7655cebe84239da6be277ba8554" + integrity sha512-A2Hz85pu8BJJaYFdX8yb1yocqigyqBzn+OVaVgm+Kwi/DkN8vhN2kbDVEfADo6jXf5hPKquMLGA3UINA64UZ7A== + dependencies: + "@smithy/core" "^3.1.2" + "@smithy/middleware-endpoint" "^4.0.3" + "@smithy/middleware-stack" "^4.0.1" + "@smithy/protocol-http" "^5.0.1" + "@smithy/types" "^4.1.0" + "@smithy/util-stream" "^4.0.2" + tslib "^2.6.2" + +"@smithy/types@^3.4.2", "@smithy/types@^3.5.0", "@smithy/types@^3.7.2": + version "3.7.2" + resolved "https://registry.npmjs.org/@smithy/types/-/types-3.7.2.tgz" + integrity sha512-bNwBYYmN8Eh9RyjS1p2gW6MIhSO2rl7X9QeLM8iTdcGRP+eDiIWDt66c9IysCc22gefKszZv+ubV9qZc7hdESg== + dependencies: + tslib "^2.6.2" + +"@smithy/types@^4.1.0": + version "4.1.0" + resolved "https://registry.yarnpkg.com/@smithy/types/-/types-4.1.0.tgz#19de0b6087bccdd4182a334eb5d3d2629699370f" + integrity sha512-enhjdwp4D7CXmwLtD6zbcDMbo6/T6WtuuKCY49Xxc6OMOmUWlBEBDREsxxgV2LIdeQPW756+f97GzcgAwp3iLw== + dependencies: + tslib "^2.6.2" + +"@smithy/url-parser@^3.0.11", "@smithy/url-parser@^3.0.6": + version "3.0.11" + resolved "https://registry.npmjs.org/@smithy/url-parser/-/url-parser-3.0.11.tgz" + integrity sha512-TmlqXkSk8ZPhfc+SQutjmFr5FjC0av3GZP4B/10caK1SbRwe/v+Wzu/R6xEKxoNqL+8nY18s1byiy6HqPG37Aw== + dependencies: + "@smithy/querystring-parser" "^3.0.11" + "@smithy/types" "^3.7.2" + tslib "^2.6.2" + +"@smithy/url-parser@^4.0.1": + version "4.0.1" + resolved "https://registry.yarnpkg.com/@smithy/url-parser/-/url-parser-4.0.1.tgz#b47743f785f5b8d81324878cbb1b5f834bf8d85a" + integrity sha512-gPXcIEUtw7VlK8f/QcruNXm7q+T5hhvGu9tl63LsJPZ27exB6dtNwvh2HIi0v7JcXJ5emBxB+CJxwaLEdJfA+g== + dependencies: + "@smithy/querystring-parser" "^4.0.1" + "@smithy/types" "^4.1.0" + tslib "^2.6.2" + +"@smithy/util-base64@^3.0.0": + version "3.0.0" + resolved "https://registry.npmjs.org/@smithy/util-base64/-/util-base64-3.0.0.tgz" + integrity sha512-Kxvoh5Qtt0CDsfajiZOCpJxgtPHXOKwmM+Zy4waD43UoEMA+qPxxa98aE/7ZhdnBFZFXMOiBR5xbcaMhLtznQQ== + dependencies: + "@smithy/util-buffer-from" "^3.0.0" + "@smithy/util-utf8" "^3.0.0" + tslib "^2.6.2" + +"@smithy/util-base64@^4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@smithy/util-base64/-/util-base64-4.0.0.tgz#8345f1b837e5f636e5f8470c4d1706ae0c6d0358" + integrity sha512-CvHfCmO2mchox9kjrtzoHkWHxjHZzaFojLc8quxXY7WAAMAg43nuxwv95tATVgQFNDwd4M9S1qFzj40Ul41Kmg== + dependencies: + "@smithy/util-buffer-from" "^4.0.0" + "@smithy/util-utf8" "^4.0.0" + tslib "^2.6.2" + +"@smithy/util-body-length-browser@^3.0.0": + version "3.0.0" + resolved "https://registry.npmjs.org/@smithy/util-body-length-browser/-/util-body-length-browser-3.0.0.tgz" + integrity sha512-cbjJs2A1mLYmqmyVl80uoLTJhAcfzMOyPgjwAYusWKMdLeNtzmMz9YxNl3/jRLoxSS3wkqkf0jwNdtXWtyEBaQ== + dependencies: + tslib "^2.6.2" + +"@smithy/util-body-length-browser@^4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@smithy/util-body-length-browser/-/util-body-length-browser-4.0.0.tgz#965d19109a4b1e5fe7a43f813522cce718036ded" + integrity sha512-sNi3DL0/k64/LO3A256M+m3CDdG6V7WKWHdAiBBMUN8S3hK3aMPhwnPik2A/a2ONN+9doY9UxaLfgqsIRg69QA== + dependencies: + tslib "^2.6.2" + +"@smithy/util-body-length-node@^3.0.0": + version "3.0.0" + resolved "https://registry.npmjs.org/@smithy/util-body-length-node/-/util-body-length-node-3.0.0.tgz" + integrity sha512-Tj7pZ4bUloNUP6PzwhN7K386tmSmEET9QtQg0TgdNOnxhZvCssHji+oZTUIuzxECRfG8rdm2PMw2WCFs6eIYkA== + dependencies: + tslib "^2.6.2" + +"@smithy/util-body-length-node@^4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@smithy/util-body-length-node/-/util-body-length-node-4.0.0.tgz#3db245f6844a9b1e218e30c93305bfe2ffa473b3" + integrity sha512-q0iDP3VsZzqJyje8xJWEJCNIu3lktUGVoSy1KB0UWym2CL1siV3artm+u1DFYTLejpsrdGyCSWBdGNjJzfDPjg== + dependencies: + tslib "^2.6.2" + +"@smithy/util-buffer-from@^2.2.0": + version "2.2.0" + resolved "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-2.2.0.tgz" + integrity sha512-IJdWBbTcMQ6DA0gdNhh/BwrLkDR+ADW5Kr1aZmd4k3DIF6ezMV4R2NIAmT08wQJ3yUK82thHWmC/TnK/wpMMIA== + dependencies: + "@smithy/is-array-buffer" "^2.2.0" + tslib "^2.6.2" + +"@smithy/util-buffer-from@^3.0.0": + version "3.0.0" + resolved "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-3.0.0.tgz" + integrity sha512-aEOHCgq5RWFbP+UDPvPot26EJHjOC+bRgse5A8V3FSShqd5E5UN4qc7zkwsvJPPAVsf73QwYcHN1/gt/rtLwQA== + dependencies: + "@smithy/is-array-buffer" "^3.0.0" + tslib "^2.6.2" + +"@smithy/util-buffer-from@^4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@smithy/util-buffer-from/-/util-buffer-from-4.0.0.tgz#b23b7deb4f3923e84ef50c8b2c5863d0dbf6c0b9" + integrity sha512-9TOQ7781sZvddgO8nxueKi3+yGvkY35kotA0Y6BWRajAv8jjmigQ1sBwz0UX47pQMYXJPahSKEKYFgt+rXdcug== + dependencies: + "@smithy/is-array-buffer" "^4.0.0" + tslib "^2.6.2" + +"@smithy/util-config-provider@^3.0.0": + version "3.0.0" + resolved "https://registry.npmjs.org/@smithy/util-config-provider/-/util-config-provider-3.0.0.tgz" + integrity sha512-pbjk4s0fwq3Di/ANL+rCvJMKM5bzAQdE5S/6RL5NXgMExFAi6UgQMPOm5yPaIWPpr+EOXKXRonJ3FoxKf4mCJQ== + dependencies: + tslib "^2.6.2" + +"@smithy/util-config-provider@^4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@smithy/util-config-provider/-/util-config-provider-4.0.0.tgz#e0c7c8124c7fba0b696f78f0bd0ccb060997d45e" + integrity sha512-L1RBVzLyfE8OXH+1hsJ8p+acNUSirQnWQ6/EgpchV88G6zGBTDPdXiiExei6Z1wR2RxYvxY/XLw6AMNCCt8H3w== + dependencies: + tslib "^2.6.2" + +"@smithy/util-defaults-mode-browser@^3.0.21", "@smithy/util-defaults-mode-browser@^3.0.30": + version "3.0.30" + resolved "https://registry.npmjs.org/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-3.0.30.tgz" + integrity sha512-nLuGmgfcr0gzm64pqF2UT4SGWVG8UGviAdayDlVzJPNa6Z4lqvpDzdRXmLxtOdEjVlTOEdpZ9dd3ZMMu488mzg== + dependencies: + "@smithy/property-provider" "^3.1.11" + "@smithy/smithy-client" "^3.5.0" + "@smithy/types" "^3.7.2" + bowser "^2.11.0" + tslib "^2.6.2" + +"@smithy/util-defaults-mode-browser@^4.0.4": + version "4.0.4" + resolved "https://registry.yarnpkg.com/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-4.0.4.tgz#6fa7ba64a80a77f27b9b5c6972918904578b8d5b" + integrity sha512-Ej1bV5sbrIfH++KnWxjjzFNq9nyP3RIUq2c9Iqq7SmMO/idUR24sqvKH2LUQFTSPy/K7G4sB2m8n7YYlEAfZaw== + dependencies: + "@smithy/property-provider" "^4.0.1" + "@smithy/smithy-client" "^4.1.3" + "@smithy/types" "^4.1.0" + bowser "^2.11.0" + tslib "^2.6.2" + +"@smithy/util-defaults-mode-node@^3.0.21", "@smithy/util-defaults-mode-node@^3.0.30": + version "3.0.30" + resolved "https://registry.npmjs.org/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-3.0.30.tgz" + integrity sha512-OD63eWoH68vp75mYcfYyuVH+p7Li/mY4sYOROnauDrtObo1cS4uWfsy/zhOTW8F8ZPxQC1ZXZKVxoxvMGUv2Ow== + dependencies: + "@smithy/config-resolver" "^3.0.13" + "@smithy/credential-provider-imds" "^3.2.8" + "@smithy/node-config-provider" "^3.1.12" + "@smithy/property-provider" "^3.1.11" + "@smithy/smithy-client" "^3.5.0" + "@smithy/types" "^3.7.2" + tslib "^2.6.2" + +"@smithy/util-defaults-mode-node@^4.0.4": + version "4.0.4" + resolved "https://registry.yarnpkg.com/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-4.0.4.tgz#5470fdc96672cee5199620b576d7025de3b17333" + integrity sha512-HE1I7gxa6yP7ZgXPCFfZSDmVmMtY7SHqzFF55gM/GPegzZKaQWZZ+nYn9C2Cc3JltCMyWe63VPR3tSFDEvuGjw== + dependencies: + "@smithy/config-resolver" "^4.0.1" + "@smithy/credential-provider-imds" "^4.0.1" + "@smithy/node-config-provider" "^4.0.1" + "@smithy/property-provider" "^4.0.1" + "@smithy/smithy-client" "^4.1.3" + "@smithy/types" "^4.1.0" + tslib "^2.6.2" + +"@smithy/util-endpoints@^2.1.2", "@smithy/util-endpoints@^2.1.7": + version "2.1.7" + resolved "https://registry.npmjs.org/@smithy/util-endpoints/-/util-endpoints-2.1.7.tgz" + integrity sha512-tSfcqKcN/Oo2STEYCABVuKgJ76nyyr6skGl9t15hs+YaiU06sgMkN7QYjo0BbVw+KT26zok3IzbdSOksQ4YzVw== + dependencies: + "@smithy/node-config-provider" "^3.1.12" + "@smithy/types" "^3.7.2" + tslib "^2.6.2" + +"@smithy/util-endpoints@^3.0.1": + version "3.0.1" + resolved "https://registry.yarnpkg.com/@smithy/util-endpoints/-/util-endpoints-3.0.1.tgz#44ccbf1721447966f69496c9003b87daa8f61975" + integrity sha512-zVdUENQpdtn9jbpD9SCFK4+aSiavRb9BxEtw9ZGUR1TYo6bBHbIoi7VkrFQ0/RwZlzx0wRBaRmPclj8iAoJCLA== + dependencies: + "@smithy/node-config-provider" "^4.0.1" + "@smithy/types" "^4.1.0" + tslib "^2.6.2" + +"@smithy/util-hex-encoding@^3.0.0": + version "3.0.0" + resolved "https://registry.npmjs.org/@smithy/util-hex-encoding/-/util-hex-encoding-3.0.0.tgz" + integrity sha512-eFndh1WEK5YMUYvy3lPlVmYY/fZcQE1D8oSf41Id2vCeIkKJXPcYDCZD+4+xViI6b1XSd7tE+s5AmXzz5ilabQ== + dependencies: + tslib "^2.6.2" + +"@smithy/util-hex-encoding@^4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@smithy/util-hex-encoding/-/util-hex-encoding-4.0.0.tgz#dd449a6452cffb37c5b1807ec2525bb4be551e8d" + integrity sha512-Yk5mLhHtfIgW2W2WQZWSg5kuMZCVbvhFmC7rV4IO2QqnZdbEFPmQnCcGMAX2z/8Qj3B9hYYNjZOhWym+RwhePw== + dependencies: + tslib "^2.6.2" + +"@smithy/util-middleware@^3.0.11", "@smithy/util-middleware@^3.0.6": + version "3.0.11" + resolved "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-3.0.11.tgz" + integrity sha512-dWpyc1e1R6VoXrwLoLDd57U1z6CwNSdkM69Ie4+6uYh2GC7Vg51Qtan7ITzczuVpqezdDTKJGJB95fFvvjU/ow== + dependencies: + "@smithy/types" "^3.7.2" + tslib "^2.6.2" + +"@smithy/util-middleware@^4.0.1": + version "4.0.1" + resolved "https://registry.yarnpkg.com/@smithy/util-middleware/-/util-middleware-4.0.1.tgz#58d363dcd661219298c89fa176a28e98ccc4bf43" + integrity sha512-HiLAvlcqhbzhuiOa0Lyct5IIlyIz0PQO5dnMlmQ/ubYM46dPInB+3yQGkfxsk6Q24Y0n3/JmcA1v5iEhmOF5mA== + dependencies: + "@smithy/types" "^4.1.0" + tslib "^2.6.2" + +"@smithy/util-retry@^3.0.11", "@smithy/util-retry@^3.0.6": + version "3.0.11" + resolved "https://registry.npmjs.org/@smithy/util-retry/-/util-retry-3.0.11.tgz" + integrity sha512-hJUC6W7A3DQgaee3Hp9ZFcOxVDZzmBIRBPlUAk8/fSOEl7pE/aX7Dci0JycNOnm9Mfr0KV2XjIlUOcGWXQUdVQ== + dependencies: + "@smithy/service-error-classification" "^3.0.11" + "@smithy/types" "^3.7.2" + tslib "^2.6.2" + +"@smithy/util-retry@^4.0.1": + version "4.0.1" + resolved "https://registry.yarnpkg.com/@smithy/util-retry/-/util-retry-4.0.1.tgz#fb5f26492383dcb9a09cc4aee23a10f839cd0769" + integrity sha512-WmRHqNVwn3kI3rKk1LsKcVgPBG6iLTBGC1iYOV3GQegwJ3E8yjzHytPt26VNzOWr1qu0xE03nK0Ug8S7T7oufw== + dependencies: + "@smithy/service-error-classification" "^4.0.1" + "@smithy/types" "^4.1.0" + tslib "^2.6.2" + +"@smithy/util-stream@^3.1.8", "@smithy/util-stream@^3.3.2": + version "3.3.2" + resolved "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-3.3.2.tgz" + integrity sha512-sInAqdiVeisUGYAv/FrXpmJ0b4WTFmciTRqzhb7wVuem9BHvhIG7tpiYHLDWrl2stOokNZpTTGqz3mzB2qFwXg== + dependencies: + "@smithy/fetch-http-handler" "^4.1.2" + "@smithy/node-http-handler" "^3.3.2" + "@smithy/types" "^3.7.2" + "@smithy/util-base64" "^3.0.0" + "@smithy/util-buffer-from" "^3.0.0" + "@smithy/util-hex-encoding" "^3.0.0" + "@smithy/util-utf8" "^3.0.0" + tslib "^2.6.2" + +"@smithy/util-stream@^4.0.2": + version "4.0.2" + resolved "https://registry.yarnpkg.com/@smithy/util-stream/-/util-stream-4.0.2.tgz#63495d3f7fba9d78748d540921136dc4a8d4c067" + integrity sha512-0eZ4G5fRzIoewtHtwaYyl8g2C+osYOT4KClXgfdNEDAgkbe2TYPqcnw4GAWabqkZCax2ihRGPe9LZnsPdIUIHA== + dependencies: + "@smithy/fetch-http-handler" "^5.0.1" + "@smithy/node-http-handler" "^4.0.2" + "@smithy/types" "^4.1.0" + "@smithy/util-base64" "^4.0.0" + "@smithy/util-buffer-from" "^4.0.0" + "@smithy/util-hex-encoding" "^4.0.0" + "@smithy/util-utf8" "^4.0.0" + tslib "^2.6.2" + +"@smithy/util-uri-escape@^3.0.0": + version "3.0.0" + resolved "https://registry.npmjs.org/@smithy/util-uri-escape/-/util-uri-escape-3.0.0.tgz" + integrity sha512-LqR7qYLgZTD7nWLBecUi4aqolw8Mhza9ArpNEQ881MJJIU2sE5iHCK6TdyqqzcDLy0OPe10IY4T8ctVdtynubg== + dependencies: + tslib "^2.6.2" + +"@smithy/util-uri-escape@^4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@smithy/util-uri-escape/-/util-uri-escape-4.0.0.tgz#a96c160c76f3552458a44d8081fade519d214737" + integrity sha512-77yfbCbQMtgtTylO9itEAdpPXSog3ZxMe09AEhm0dU0NLTalV70ghDZFR+Nfi1C60jnJoh/Re4090/DuZh2Omg== + dependencies: + tslib "^2.6.2" + +"@smithy/util-utf8@^2.0.0": + version "2.3.0" + resolved "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-2.3.0.tgz" + integrity sha512-R8Rdn8Hy72KKcebgLiv8jQcQkXoLMOGGv5uI1/k0l+snqkOzQ1R0ChUBCxWMlBsFMekWjq0wRudIweFs7sKT5A== + dependencies: + "@smithy/util-buffer-from" "^2.2.0" + tslib "^2.6.2" + +"@smithy/util-utf8@^3.0.0": + version "3.0.0" + resolved "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-3.0.0.tgz" + integrity sha512-rUeT12bxFnplYDe815GXbq/oixEGHfRFFtcTF3YdDi/JaENIM6aSYYLJydG83UNzLXeRI5K8abYd/8Sp/QM0kA== + dependencies: + "@smithy/util-buffer-from" "^3.0.0" + tslib "^2.6.2" + +"@smithy/util-utf8@^4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@smithy/util-utf8/-/util-utf8-4.0.0.tgz#09ca2d9965e5849e72e347c130f2a29d5c0c863c" + integrity sha512-b+zebfKCfRdgNJDknHCob3O7FpeYQN6ZG6YLExMcasDHsCXlsXCEuiPZeLnJLpwa5dvPetGlnGCiMHuLwGvFow== + dependencies: + "@smithy/util-buffer-from" "^4.0.0" + tslib "^2.6.2" + +"@smithy/util-waiter@^3.2.0": + version "3.2.0" + resolved "https://registry.npmjs.org/@smithy/util-waiter/-/util-waiter-3.2.0.tgz" + integrity sha512-PpjSboaDUE6yl+1qlg3Si57++e84oXdWGbuFUSAciXsVfEZJJJupR2Nb0QuXHiunt2vGR+1PTizOMvnUPaG2Qg== + dependencies: + "@smithy/abort-controller" "^3.1.9" + "@smithy/types" "^3.7.2" + tslib "^2.6.2" + +"@smithy/util-waiter@^4.0.2": + version "4.0.2" + resolved "https://registry.yarnpkg.com/@smithy/util-waiter/-/util-waiter-4.0.2.tgz#0a73a0fcd30ea7bbc3009cf98ad199f51b8eac51" + integrity sha512-piUTHyp2Axx3p/kc2CIJkYSv0BAaheBQmbACZgQSSfWUumWNW+R1lL+H9PDBxKJkvOeEX+hKYEFiwO8xagL8AQ== + dependencies: + "@smithy/abort-controller" "^4.0.1" + "@smithy/types" "^4.1.0" + tslib "^2.6.2" + +"@socket.io/component-emitter@~3.1.0": + version "3.1.2" + resolved "https://registry.npmjs.org/@socket.io/component-emitter/-/component-emitter-3.1.2.tgz" + integrity sha512-9BCxFwvbGg/RsZK9tjXd8s4UcwR0MWeFQ1XEKIQVVvAGJyINdrqKMcTRyLoK8Rse1GjzLV9cwjWV1olXRWEXVA== + +"@szmarczak/http-timer@^4.0.5": + version "4.0.6" + resolved "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-4.0.6.tgz" + integrity sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w== + dependencies: + defer-to-connect "^2.0.0" + +"@tapjs/after-each@2.0.8": + version "2.0.8" + resolved "https://registry.npmjs.org/@tapjs/after-each/-/after-each-2.0.8.tgz" + integrity sha512-btkpQ/BhmRyG50rezduxEZb3pMJblECvTQa41+U2ln2te1prDTlllHlpq4lOjceUksl8KFF1avDqcBqIqPzneQ== + dependencies: + function-loop "^4.0.0" + +"@tapjs/after@1.1.31": + version "1.1.31" + resolved "https://registry.npmjs.org/@tapjs/after/-/after-1.1.31.tgz" + integrity sha512-531NkYOls9PvqfnLsEDRzIWwjynoFRbUVq7pTYuA3PRIw4Ka7jA9uUjILeUurcWjaHrQNzUua0jj/Yu94f6YYw== + dependencies: + is-actual-promise "^1.0.1" + +"@tapjs/asserts@2.0.8": + version "2.0.8" + resolved "https://registry.npmjs.org/@tapjs/asserts/-/asserts-2.0.8.tgz" + integrity sha512-57VrI0p2kAqfgHHUwowDvd31eTfDHw3HO4FSSVUCvngPGWa96R6eH9gXa9fNig4qIp4Dup+nI7gJlJfU0R80SA== + dependencies: + "@tapjs/stack" "2.0.1" + is-actual-promise "^1.0.1" + tcompare "7.0.1" + trivial-deferred "^2.0.0" + +"@tapjs/before-each@2.0.8": + version "2.0.8" + resolved "https://registry.npmjs.org/@tapjs/before-each/-/before-each-2.0.8.tgz" + integrity sha512-Xjgk8/fuP7iFa5CYjFDl05p5PZGRe//VyHJNuYNzWpF1K9PNMtVdlmwplfpFmbrNrw/bIPq7R6LuiPmTBgzuOw== + dependencies: + function-loop "^4.0.0" + +"@tapjs/before@2.0.8": + version "2.0.8" + resolved "https://registry.npmjs.org/@tapjs/before/-/before-2.0.8.tgz" + integrity sha512-22ZdGSn/zOKf8J8cb3yfw5R4I/ozdHEDKL8lBWon/zsxxMMvaRTgOtFXEjb4RE+5SDrqQ4NM7ZRYPGhE7T97dw== + dependencies: + is-actual-promise "^1.0.1" + +"@tapjs/chdir@1.1.4": + version "1.1.4" + resolved "https://registry.npmjs.org/@tapjs/chdir/-/chdir-1.1.4.tgz" + integrity sha512-axXkT5kWp2/X8l6inKyrqzUhqgvsgrWI8/0xLAdmirpFZ8H6gFxrl763Ozdm27EAmkLnnnWgFITPqUQCuB/tMA== + +"@tapjs/config@3.1.6": + version "3.1.6" + resolved "https://registry.npmjs.org/@tapjs/config/-/config-3.1.6.tgz" + integrity sha512-5gkDMSLXL5798bbCdX4RdLpB4OUQeu9TXftzKmL1+1T2xbcd4q7zfDnCfOB9zTk50x2f04+4h6Q7Z1NcSKIspg== + dependencies: + "@tapjs/core" "2.1.6" + "@tapjs/test" "2.2.4" + chalk "^5.2.0" + jackspeak "^3.1.2" + polite-json "^4.0.1" + tap-yaml "2.2.2" + walk-up-path "^3.0.1" + +"@tapjs/core@2.1.6": + version "2.1.6" + resolved "https://registry.npmjs.org/@tapjs/core/-/core-2.1.6.tgz" + integrity sha512-NYMp0bl52DxXfcLmivMKvOIE14aaB9qJjdHeUbs6GZ9yxgD5w0yeiOT+gWEL+1PzZgGWRxSFEpghID1YfXAc4w== + dependencies: + "@tapjs/processinfo" "^3.1.8" + "@tapjs/stack" "2.0.1" + "@tapjs/test" "2.2.4" + async-hook-domain "^4.0.1" + diff "^5.2.0" + is-actual-promise "^1.0.1" + minipass "^7.0.4" + signal-exit "4.1" + tap-parser "16.0.1" + tap-yaml "2.2.2" + tcompare "7.0.1" + trivial-deferred "^2.0.0" + +"@tapjs/error-serdes@2.0.1": + version "2.0.1" + resolved "https://registry.npmjs.org/@tapjs/error-serdes/-/error-serdes-2.0.1.tgz" + integrity sha512-P+M4rtcfkDsUveKKmoRNF+07xpbPnRY5KrstIUOnyn483clQ7BJhsnWr162yYNCsyOj4zEfZmAJI1f8Bi7h/ZA== + dependencies: + minipass "^7.0.4" + +"@tapjs/filter@2.0.8": + version "2.0.8" + resolved "https://registry.npmjs.org/@tapjs/filter/-/filter-2.0.8.tgz" + integrity sha512-/ps6nOS3CTh1WLfCjJnU7tS4PH4KFgEasFSVPCIFN+BasyoqDapzj4JKIlzQvppZOGTQadKH3wUakafZl7uz8w== + +"@tapjs/fixture@2.0.8": + version "2.0.8" + resolved "https://registry.npmjs.org/@tapjs/fixture/-/fixture-2.0.8.tgz" + integrity sha512-LJnjeAMSozPFXzu+wQw2HJsjA9djHbTcyeMnsgiRL/Q8ffcLqAawV3SN6XKdDLdWYUg3e1fXhHspnbsouZj+xA== + dependencies: + mkdirp "^3.0.0" + rimraf "^5.0.5" + +"@tapjs/intercept@2.0.8": + version "2.0.8" + resolved "https://registry.npmjs.org/@tapjs/intercept/-/intercept-2.0.8.tgz" + integrity sha512-OF2Q35jtZ20bwV4hRNoca7vqIrzPFR3JR25G2rGru+fgPmq4heN0RLoh0d1O34AbrtXqra2lXkacMB/DPgb01A== + dependencies: + "@tapjs/after" "1.1.31" + "@tapjs/stack" "2.0.1" + +"@tapjs/mock@2.1.6": + version "2.1.6" + resolved "https://registry.npmjs.org/@tapjs/mock/-/mock-2.1.6.tgz" + integrity sha512-bNXKrjg/r+i/gfKij5Oo/5Md2DvGNHPSRCHQmjz3VQjpyxqK7S1FGcR0kyqJ8Nof6Wc8yIhpNOCuibj19200IQ== + dependencies: + "@tapjs/after" "1.1.31" + "@tapjs/stack" "2.0.1" + resolve-import "^1.4.5" + walk-up-path "^3.0.1" + +"@tapjs/node-serialize@2.0.8": + version "2.0.8" + resolved "https://registry.npmjs.org/@tapjs/node-serialize/-/node-serialize-2.0.8.tgz" + integrity sha512-92oqhkmIz5wr0yRs1CPQfim5JSwHPSmoDWnQmJlYUZsY1OYgYouQm3ifnPkqK/9hJpVYzlZEQmefxehxbs2WNQ== + dependencies: + "@tapjs/error-serdes" "2.0.1" + "@tapjs/stack" "2.0.1" + tap-parser "16.0.1" + +"@tapjs/processinfo@^3.1.8": + version "3.1.8" + resolved "https://registry.npmjs.org/@tapjs/processinfo/-/processinfo-3.1.8.tgz" + integrity sha512-FIriEB+qqArPhmVYc1PZwRHD99myRdl7C9Oe/uts04Q2LOxQ5MEmqP9XOP8vVYzpDOYwmL8OmL6eOYt9eZlQKQ== + dependencies: + pirates "^4.0.5" + process-on-spawn "^1.0.0" + signal-exit "^4.0.2" + uuid "^8.3.2" + +"@tapjs/reporter@2.0.8": + version "2.0.8" + resolved "https://registry.npmjs.org/@tapjs/reporter/-/reporter-2.0.8.tgz" + integrity sha512-tZn5ZHIrFwjbi59djtdXHBwgSIZSBXdJpz2i9CZ9HEC1nFhWtIr2Jczvrz4ScfixUgA0GNFirz+q+9iA4IFMvw== + dependencies: + "@tapjs/config" "3.1.6" + "@tapjs/stack" "2.0.1" + chalk "^5.2.0" + ink "^4.4.1" + minipass "^7.0.4" + ms "^2.1.3" + patch-console "^2.0.0" + prismjs-terminal "^1.2.3" + react "^18.2.0" + string-length "^6.0.0" + tap-parser "16.0.1" + tap-yaml "2.2.2" + tcompare "7.0.1" + +"@tapjs/run@2.1.7": + version "2.1.7" + resolved "https://registry.npmjs.org/@tapjs/run/-/run-2.1.7.tgz" + integrity sha512-Hk41E68f1x4eLBm6Rrxx4ARzZzrjwaLbKThb16+f3bGYiajmqAvBdeyNEoQpEWmW+Sv2HSlueOk2SS2P4fyetg== + dependencies: + "@tapjs/after" "1.1.31" + "@tapjs/before" "2.0.8" + "@tapjs/config" "3.1.6" + "@tapjs/processinfo" "^3.1.8" + "@tapjs/reporter" "2.0.8" + "@tapjs/spawn" "2.0.8" + "@tapjs/stdin" "2.0.8" + "@tapjs/test" "2.2.4" + c8 "^9.1.0" + chalk "^5.3.0" + chokidar "^3.6.0" + foreground-child "^3.1.1" + glob "^10.3.16" + minipass "^7.0.4" + mkdirp "^3.0.1" + opener "^1.5.2" + pacote "^17.0.6" + resolve-import "^1.4.5" + rimraf "^5.0.5" + semver "^7.6.0" + signal-exit "^4.1.0" + tap-parser "16.0.1" + tap-yaml "2.2.2" + tcompare "7.0.1" + trivial-deferred "^2.0.0" + which "^4.0.0" + +"@tapjs/snapshot@2.0.8": + version "2.0.8" + resolved "https://registry.npmjs.org/@tapjs/snapshot/-/snapshot-2.0.8.tgz" + integrity sha512-L0vtqWKkgnQt/XNQkvHOme9Np7ffteCNf1P0F9mz2YiJion4er1nv6pZuJoKVxXFQsbNd2k+LGyx0Iw+bIzwFg== + dependencies: + is-actual-promise "^1.0.1" + tcompare "7.0.1" + trivial-deferred "^2.0.0" + +"@tapjs/spawn@2.0.8": + version "2.0.8" + resolved "https://registry.npmjs.org/@tapjs/spawn/-/spawn-2.0.8.tgz" + integrity sha512-vCYwynIYJNijY87uHFANe+gCu9rdGoe4GOBmghl6kwDy7eISmcN/FW5TlmrjePMNhTvrDMeYqOIAzqh3WRYmPA== + +"@tapjs/stack@2.0.1": + version "2.0.1" + resolved "https://registry.npmjs.org/@tapjs/stack/-/stack-2.0.1.tgz" + integrity sha512-3rKbZkRkLeJl9ilV/6b80YfI4C4+OYf7iEz5/d0MIVhmVvxv0ttIy5JnZutAc4Gy9eRp5Ne5UTAIFOVY5k36cg== + +"@tapjs/stdin@2.0.8": + version "2.0.8" + resolved "https://registry.npmjs.org/@tapjs/stdin/-/stdin-2.0.8.tgz" + integrity sha512-tW/exLXuDqjtH2wjptiPHXBahkdSyoppxDY56l9MG4tiz66dMN6NTCZFvQxp7+3t+lsQKqJp/74z8T/ayp+vZA== + +"@tapjs/test@2.2.4": + version "2.2.4" + resolved "https://registry.npmjs.org/@tapjs/test/-/test-2.2.4.tgz" + integrity sha512-QIgq2BhMpwO9SN8I0qlwZYXAllO4xWCfJ0MgAGhc+J7p69B5p9dDNPmyOreHeXWMmk6VlNj3oWveoXb5Zn9xZQ== + dependencies: + "@isaacs/ts-node-temp-fork-for-pr-2009" "^10.9.7" + "@tapjs/after" "1.1.31" + "@tapjs/after-each" "2.0.8" + "@tapjs/asserts" "2.0.8" + "@tapjs/before" "2.0.8" + "@tapjs/before-each" "2.0.8" + "@tapjs/chdir" "1.1.4" + "@tapjs/filter" "2.0.8" + "@tapjs/fixture" "2.0.8" + "@tapjs/intercept" "2.0.8" + "@tapjs/mock" "2.1.6" + "@tapjs/node-serialize" "2.0.8" + "@tapjs/snapshot" "2.0.8" + "@tapjs/spawn" "2.0.8" + "@tapjs/stdin" "2.0.8" + "@tapjs/typescript" "1.4.13" + "@tapjs/worker" "2.0.8" + glob "^10.3.16" + jackspeak "^3.1.2" + mkdirp "^3.0.0" + package-json-from-dist "^1.0.0" + resolve-import "^1.4.5" + rimraf "^5.0.5" + sync-content "^1.0.1" + tap-parser "16.0.1" + tshy "^1.14.0" + typescript "5.4" + walk-up-path "^3.0.1" + +"@tapjs/typescript@1.4.13": + version "1.4.13" + resolved "https://registry.npmjs.org/@tapjs/typescript/-/typescript-1.4.13.tgz" + integrity sha512-MNs7zlhM6G3pNUIjkKXDxgNCwCGZt2bUCGtVunSTDVIrKiUlHAl4QSjQ1oTjumHlCi9gFIWiwFAvpHekzFti0w== + dependencies: + "@isaacs/ts-node-temp-fork-for-pr-2009" "^10.9.7" + +"@tapjs/worker@2.0.8": + version "2.0.8" + resolved "https://registry.npmjs.org/@tapjs/worker/-/worker-2.0.8.tgz" + integrity sha512-AySf2kV6OHvwgD3DrLdT2az2g4hRdoRtKsFCLdZo3jOoKte+ft/IQJEnOW7CPT0RYUskS3elv6eabYgSyTH4tg== + +"@tsconfig/node14@*": + version "14.1.2" + resolved "https://registry.npmjs.org/@tsconfig/node14/-/node14-14.1.2.tgz" + integrity sha512-1vncsbfCZ3TBLPxesRYz02Rn7SNJfbLoDVkcZ7F/ixOV6nwxwgdhD1mdPcc5YQ413qBJ8CvMxXMFfJ7oawjo7Q== + +"@tsconfig/node16@*": + version "16.1.3" + resolved "https://registry.npmjs.org/@tsconfig/node16/-/node16-16.1.3.tgz" + integrity sha512-9nTOUBn+EMKO6rtSZJk+DcqsfgtlERGT9XPJ5PRj/HNENPCBY1yu/JEj5wT6GLtbCLBO2k46SeXDaY0pjMqypw== + +"@tsconfig/node18@*": + version "18.2.4" + resolved "https://registry.npmjs.org/@tsconfig/node18/-/node18-18.2.4.tgz" + integrity sha512-5xxU8vVs9/FNcvm3gE07fPbn9tl6tqGGWA9tSlwsUEkBxtRnTsNmwrV8gasZ9F/EobaSv9+nu8AxUKccw77JpQ== + +"@tsconfig/node20@*": + version "20.1.4" + resolved "https://registry.npmjs.org/@tsconfig/node20/-/node20-20.1.4.tgz" + integrity sha512-sqgsT69YFeLWf5NtJ4Xq/xAF8p4ZQHlmGW74Nu2tD4+g5fAsposc4ZfaaPixVu4y01BEiDCWLRDCvDM5JOsRxg== + +"@tufjs/canonical-json@2.0.0": + version "2.0.0" + resolved "https://registry.npmjs.org/@tufjs/canonical-json/-/canonical-json-2.0.0.tgz" + integrity sha512-yVtV8zsdo8qFHe+/3kw81dSLyF7D576A5cCFCi4X7B39tWT7SekaEFUnvnWJHz+9qO7qJTah1JbrDjWKqFtdWA== + +"@tufjs/models@2.0.1": + version "2.0.1" + resolved "https://registry.npmjs.org/@tufjs/models/-/models-2.0.1.tgz" + integrity sha512-92F7/SFyufn4DXsha9+QfKnN03JGqtMFMXgSHbZOo8JG59WkTni7UzAouNQDf7AuP9OAMxVOPQcqG3sB7w+kkg== + dependencies: + "@tufjs/canonical-json" "2.0.0" + minimatch "^9.0.4" + +"@types/body-parser@*": + version "1.19.5" + resolved "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.5.tgz" + integrity sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg== + dependencies: + "@types/connect" "*" + "@types/node" "*" + +"@types/cacheable-request@^6.0.1": + version "6.0.3" + resolved "https://registry.npmjs.org/@types/cacheable-request/-/cacheable-request-6.0.3.tgz" + integrity sha512-IQ3EbTzGxIigb1I3qPZc1rWJnH0BmSKv5QYTalEwweFvyBDLSAe24zP0le/hyi7ecGfZVlIVAg4BZqb8WBwKqw== + dependencies: + "@types/http-cache-semantics" "*" + "@types/keyv" "^3.1.4" + "@types/node" "*" + "@types/responselike" "^1.0.0" + +"@types/connect@*": + version "3.4.38" + resolved "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz" + integrity sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug== + dependencies: + "@types/node" "*" + +"@types/conventional-commits-parser@^5.0.0": + version "5.0.1" + resolved "https://registry.npmjs.org/@types/conventional-commits-parser/-/conventional-commits-parser-5.0.1.tgz" + integrity sha512-7uz5EHdzz2TqoMfV7ee61Egf5y6NkcO4FB/1iCCQnbeiI1F3xzv3vK5dBCXUCLQgGYS+mUeigK1iKQzvED+QnQ== + dependencies: + "@types/node" "*" + +"@types/cookiejar@^2.1.5": + version "2.1.5" + resolved "https://registry.npmjs.org/@types/cookiejar/-/cookiejar-2.1.5.tgz" + integrity sha512-he+DHOWReW0nghN24E1WUqM0efK4kI9oTqDm6XmK8ZPe2djZ90BSNdGnIyCLzCPw7/pogPlGbzI2wHGGmi4O/Q== + +"@types/cors@^2.8.17": + version "2.8.17" + resolved "https://registry.npmjs.org/@types/cors/-/cors-2.8.17.tgz" + integrity sha512-8CGDvrBj1zgo2qE+oS3pOCyYNqCPryMWY2bGfwA0dcfopWGgxs+78df0Rs3rc9THP4JkOhLsAa+15VdpAqkcUA== + dependencies: + "@types/node" "*" + +"@types/estree@1.0.6", "@types/estree@^1.0.0": + version "1.0.6" + resolved "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz" + integrity sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw== + +"@types/express-serve-static-core@^5.0.0": + version "5.0.2" + resolved "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-5.0.2.tgz" + integrity sha512-vluaspfvWEtE4vcSDlKRNer52DvOGrB2xv6diXy6UKyKW0lqZiWHGNApSyxOv+8DE5Z27IzVvE7hNkxg7EXIcg== + dependencies: + "@types/node" "*" + "@types/qs" "*" + "@types/range-parser" "*" + "@types/send" "*" + +"@types/express-session@^1.18.1": + version "1.18.1" + resolved "https://registry.npmjs.org/@types/express-session/-/express-session-1.18.1.tgz" + integrity sha512-S6TkD/lljxDlQ2u/4A70luD8/ZxZcrU5pQwI1rVXCiaVIywoFgbA+PIUNDjPhQpPdK0dGleLtYc/y7XWBfclBg== + dependencies: + "@types/express" "*" + +"@types/express@*", "@types/express@^5.0.0": + version "5.0.0" + resolved "https://registry.npmjs.org/@types/express/-/express-5.0.0.tgz" + integrity sha512-DvZriSMehGHL1ZNLzi6MidnsDhUZM/x2pRdDIKdwbUNqqwHxMlRdkxtn6/EPKyqKpHqTl/4nRZsRNLpZxZRpPQ== + dependencies: + "@types/body-parser" "*" + "@types/express-serve-static-core" "^5.0.0" + "@types/qs" "*" + "@types/serve-static" "*" + +"@types/http-cache-semantics@*": + version "4.0.4" + resolved "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.4.tgz" + integrity sha512-1m0bIFVc7eJWyve9S0RnuRgcQqF/Xd5QsUZAZeQFr1Q3/p9JWoQQEqmVy+DPTNpGXwhgIetAoYF8JSc33q29QA== + +"@types/http-errors@*": + version "2.0.4" + resolved "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.4.tgz" + integrity sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA== + +"@types/istanbul-lib-coverage@^2.0.1": + version "2.0.6" + resolved "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz" + integrity sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w== + +"@types/keyv@^3.1.4": + version "3.1.4" + resolved "https://registry.npmjs.org/@types/keyv/-/keyv-3.1.4.tgz" + integrity sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg== + dependencies: + "@types/node" "*" + +"@types/lodash@^4.14.175": + version "4.17.13" + resolved "https://registry.npmjs.org/@types/lodash/-/lodash-4.17.13.tgz" + integrity sha512-lfx+dftrEZcdBPczf9d0Qv0x+j/rfNCMuC6OcfXmO8gkfeNAY88PgKUbvG56whcN23gc27yenwF6oJZXGFpYxg== + +"@types/luxon@^3.4.2": + version "3.4.2" + resolved "https://registry.npmjs.org/@types/luxon/-/luxon-3.4.2.tgz" + integrity sha512-TifLZlFudklWlMBfhubvgqTXRzLDI5pCbGa4P8a3wPyUQSW+1xQ5eDsreP9DWHX3tjq1ke96uYG/nwundroWcA== + +"@types/methods@^1.1.4": + version "1.1.4" + resolved "https://registry.npmjs.org/@types/methods/-/methods-1.1.4.tgz" + integrity sha512-ymXWVrDiCxTBE3+RIrrP533E70eA+9qu7zdWoHuOmGujkYtzf4HQF96b8nwHLqhuf4ykX61IGRIB38CC6/sImQ== + +"@types/mime@^1": + version "1.3.5" + resolved "https://registry.npmjs.org/@types/mime/-/mime-1.3.5.tgz" + integrity sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w== + +"@types/morgan@^1.9.9": + version "1.9.9" + resolved "https://registry.npmjs.org/@types/morgan/-/morgan-1.9.9.tgz" + integrity sha512-iRYSDKVaC6FkGSpEVVIvrRGw0DfJMiQzIn3qr2G5B3C//AWkulhXgaBd7tS9/J79GWSYMTHGs7PfI5b3Y8m+RQ== + dependencies: + "@types/node" "*" + +"@types/multer@^1.4.12": + version "1.4.12" + resolved "https://registry.yarnpkg.com/@types/multer/-/multer-1.4.12.tgz#da67bd0c809f3a63fe097c458c0d4af1fea50ab7" + integrity sha512-pQ2hoqvXiJt2FP9WQVLPRO+AmiIm/ZYkavPlIQnx282u4ZrVdztx0pkh3jjpQt0Kz+YI0YhSG264y08UJKoUQg== + dependencies: + "@types/express" "*" + +"@types/node-fetch@^2": + version "2.6.12" + resolved "https://registry.yarnpkg.com/@types/node-fetch/-/node-fetch-2.6.12.tgz#8ab5c3ef8330f13100a7479e2cd56d3386830a03" + integrity sha512-8nneRWKCg3rMtF69nLQJnOYUcbafYeFSjqkw3jCRLsqkWFlHaoQrr5mXmofFGOx3DKn7UfmBMyov8ySvLRVldA== + dependencies: + "@types/node" "*" + form-data "^4.0.0" + +"@types/node-geocoder@^4.2.6": + version "4.2.6" + resolved "https://registry.yarnpkg.com/@types/node-geocoder/-/node-geocoder-4.2.6.tgz#fecbf880b3c33244b1359e4d79b6c4095108d2bd" + integrity sha512-rONIqFylsxAeyqCpfy626vs9ofNI8oXjNyBS2KuI+ePbCyLGrcqkVSrhIvuKxfeXtqikGk118EZtjehU0cUH9w== + dependencies: + "@types/node" "*" + "@types/node-fetch" "^2" + +"@types/node@*", "@types/node@>=13.7.0", "@types/node@^22.10.2": + version "22.10.2" + resolved "https://registry.npmjs.org/@types/node/-/node-22.10.2.tgz" + integrity sha512-Xxr6BBRCAOQixvonOye19wnzyDiUtTeqldOOmj3CkeblonbccA12PFwlufvRdrpjXxqnmUaeiU5EOA+7s5diUQ== + dependencies: + undici-types "~6.20.0" + +"@types/nodemailer@^6.4.17": + version "6.4.17" + resolved "https://registry.npmjs.org/@types/nodemailer/-/nodemailer-6.4.17.tgz" + integrity sha512-I9CCaIp6DTldEg7vyUTZi8+9Vo0hi1/T8gv3C89yk1rSAAzoKQ8H8ki/jBYJSFoH/BisgLP8tkZMlQ91CIquww== + dependencies: + "@types/node" "*" + +"@types/normalize-package-data@^2.4.0": + version "2.4.4" + resolved "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.4.tgz" + integrity sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA== + +"@types/qs@*": + version "6.9.17" + resolved "https://registry.npmjs.org/@types/qs/-/qs-6.9.17.tgz" + integrity sha512-rX4/bPcfmvxHDv0XjfJELTTr+iB+tn032nPILqHm5wbthUUUuVtNGGqzhya9XUxjTP8Fpr0qYgSZZKxGY++svQ== + +"@types/range-parser@*": + version "1.2.7" + resolved "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.7.tgz" + integrity sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ== + +"@types/responselike@^1.0.0": + version "1.0.3" + resolved "https://registry.npmjs.org/@types/responselike/-/responselike-1.0.3.tgz" + integrity sha512-H/+L+UkTV33uf49PH5pCAUBVPNj2nDBXTN+qS1dOwyyg24l3CcicicCA7ca+HMvJBZcFgl5r8e+RR6elsb4Lyw== + dependencies: + "@types/node" "*" + +"@types/send@*": + version "0.17.4" + resolved "https://registry.npmjs.org/@types/send/-/send-0.17.4.tgz" + integrity sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA== + dependencies: + "@types/mime" "^1" + "@types/node" "*" + +"@types/serve-static@*": + version "1.15.7" + resolved "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.7.tgz" + integrity sha512-W8Ym+h8nhuRwaKPaDw34QUkwsGi6Rc4yYqvKFo5rm2FUEhCFbzVWrxXUxuKK8TASjWsysJY0nsmNCGhCOIsrOw== + dependencies: + "@types/http-errors" "*" + "@types/node" "*" + "@types/send" "*" + +"@types/superagent@^8.1.0": + version "8.1.9" + resolved "https://registry.npmjs.org/@types/superagent/-/superagent-8.1.9.tgz" + integrity sha512-pTVjI73witn+9ILmoJdajHGW2jkSaOzhiFYF1Rd3EQ94kymLqB9PjD9ISg7WaALC7+dCHT0FGe9T2LktLq/3GQ== + dependencies: + "@types/cookiejar" "^2.1.5" + "@types/methods" "^1.1.4" + "@types/node" "*" + form-data "^4.0.0" + +"@types/supertest@^6.0.2": + version "6.0.2" + resolved "https://registry.npmjs.org/@types/supertest/-/supertest-6.0.2.tgz" + integrity sha512-137ypx2lk/wTQbW6An6safu9hXmajAifU/s7szAHLN/FeIm5w7yR0Wkl9fdJMRSHwOn4HLAI0DaB2TOORuhPDg== + dependencies: + "@types/methods" "^1.1.4" + "@types/superagent" "^8.1.0" + +"@types/swagger-ui-express@^4.1.7": + version "4.1.7" + resolved "https://registry.npmjs.org/@types/swagger-ui-express/-/swagger-ui-express-4.1.7.tgz" + integrity sha512-ovLM9dNincXkzH4YwyYpll75vhzPBlWx6La89wwvYH7mHjVpf0X0K/vR/aUM7SRxmr5tt9z7E5XJcjQ46q+S3g== + dependencies: + "@types/express" "*" + "@types/serve-static" "*" + +"@types/triple-beam@^1.3.2": + version "1.3.5" + resolved "https://registry.npmjs.org/@types/triple-beam/-/triple-beam-1.3.5.tgz" + integrity sha512-6WaYesThRMCl19iryMYP7/x2OVgCtbIVflDGFpWnb9irXI3UjYE4AzmYuiUKY1AJstGijoY+MgUszMgRxIYTYw== + +"@typescript-eslint/types@5.62.0": + version "5.62.0" + resolved "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.62.0.tgz" + integrity sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ== + +"@typescript-eslint/typescript-estree@^5.62.0": + version "5.62.0" + resolved "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.62.0.tgz" + integrity sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA== + dependencies: + "@typescript-eslint/types" "5.62.0" + "@typescript-eslint/visitor-keys" "5.62.0" + debug "^4.3.4" + globby "^11.1.0" + is-glob "^4.0.3" + semver "^7.3.7" + tsutils "^3.21.0" + +"@typescript-eslint/visitor-keys@5.62.0": + version "5.62.0" + resolved "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.62.0.tgz" + integrity sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw== + dependencies: + "@typescript-eslint/types" "5.62.0" + eslint-visitor-keys "^3.3.0" + +"@usebruno/cli@^1.36.3": + version "1.36.3" + resolved "https://registry.npmjs.org/@usebruno/cli/-/cli-1.36.3.tgz" + integrity sha512-KsgBpxFV4FM1qJuWM0JmTMsTaxWhPqKI/Y2LqFdcOkIgXRMYWh7YXqLV60R9ArwL5OP0QgDoEbVE0WC1mNBD6g== + dependencies: + "@aws-sdk/credential-providers" "3.658.1" + "@usebruno/common" "0.3.0" + "@usebruno/js" "0.22.0" + "@usebruno/lang" "0.18.0" + "@usebruno/vm2" "^3.9.13" + aws4-axios "^3.3.0" + axios "1.7.5" + chai "^4.3.7" + chalk "^3.0.0" + csv-parse "^5.5.6" + debug "^4.3.5" + decomment "^0.9.5" + form-data "^4.0.0" + fs-extra "^10.1.0" + http-proxy-agent "^7.0.0" + https-proxy-agent "^7.0.2" + json-bigint "^1.0.0" + lodash "^4.17.21" + qs "^6.11.0" + socks-proxy-agent "^8.0.2" + tough-cookie "^4.1.3" + xmlbuilder "^15.1.1" + yargs "^17.6.2" + +"@usebruno/common@0.3.0": + version "0.3.0" + resolved "https://registry.npmjs.org/@usebruno/common/-/common-0.3.0.tgz" + integrity sha512-2XFZcQ7k5/KfORSkquIZn6nmLcI6/JkiOdDxInEOrNk4IQakjOPxfoQzhx/3SsANnjlcdLJJYRG3Wrfrh98Whg== + +"@usebruno/js@0.22.0": + version "0.22.0" + resolved "https://registry.npmjs.org/@usebruno/js/-/js-0.22.0.tgz" + integrity sha512-idasGMjGsVQmCTtqAvu5+rX5CsnM5T5ubgjgbCmUBw35EbwtKFVyrdJitx0Iy0EEdONr7xf52rYtVqH9R4sjpQ== + dependencies: + "@usebruno/common" "0.3.0" + "@usebruno/query" "0.1.0" + ajv "^8.12.0" + ajv-formats "^2.1.1" + atob "^2.1.2" + axios "1.7.5" + btoa "^1.2.1" + chai "^4.3.7" + chai-string "^1.5.0" + crypto-js "^4.1.1" + crypto-js-3.1.9-1 "npm:crypto-js@^3.1.9-1" + json-query "^2.2.2" + lodash "^4.17.21" + moment "^2.29.4" + nanoid "3.3.4" + node-fetch "2.7.0" + node-vault "^0.10.2" + path "^0.12.7" + quickjs-emscripten "^0.29.2" + uuid "^9.0.0" + +"@usebruno/lang@0.18.0": + version "0.18.0" + resolved "https://registry.npmjs.org/@usebruno/lang/-/lang-0.18.0.tgz" + integrity sha512-uMFJTZS0efGFXLKGfA6ByvQTMXbB2shZO/qNUE+Z81w7DxsKglMR1JcS6DMenMWlRxrpSgb/zKhoiv85jp/m3g== + dependencies: + arcsecond "^5.0.0" + dotenv "^16.3.1" + lodash "^4.17.21" + ohm-js "^16.6.0" + +"@usebruno/query@0.1.0": + version "0.1.0" + resolved "https://registry.npmjs.org/@usebruno/query/-/query-0.1.0.tgz" + integrity sha512-+upwS01y6mMHS91pgh1Iu2nclish7N4otviIs7dJmNLI4AO3UyC3hEFzykls5A6p7mlbVSP2DCCFOPGThhPVCg== + +"@usebruno/vm2@^3.9.13": + version "3.9.19" + resolved "https://registry.npmjs.org/@usebruno/vm2/-/vm2-3.9.19.tgz" + integrity sha512-WIrR9ODN2xkwUEoJb3awhCZO2dTgq8NWoObofAGuzFQOQ27rw96d2GJU/T8OKcygjfJiNei9nuqidyMh81kiug== + dependencies: + acorn "^8.7.0" + acorn-walk "^8.2.0" + +"@vitest/coverage-istanbul@^2.1.8": + version "2.1.8" + resolved "https://registry.npmjs.org/@vitest/coverage-istanbul/-/coverage-istanbul-2.1.8.tgz" + integrity sha512-cSaCd8KcWWvgDwEJSXm0NEWZ1YTiJzjicKHy+zOEbUm0gjbbkz+qJf1p8q71uBzSlS7vdnZA8wRLeiwVE3fFTA== + dependencies: + "@istanbuljs/schema" "^0.1.3" + debug "^4.3.7" + istanbul-lib-coverage "^3.2.2" + istanbul-lib-instrument "^6.0.3" + istanbul-lib-report "^3.0.1" + istanbul-lib-source-maps "^5.0.6" + istanbul-reports "^3.1.7" + magicast "^0.3.5" + test-exclude "^7.0.1" + tinyrainbow "^1.2.0" + +"@vitest/expect@2.1.8": + version "2.1.8" + resolved "https://registry.npmjs.org/@vitest/expect/-/expect-2.1.8.tgz" + integrity sha512-8ytZ/fFHq2g4PJVAtDX57mayemKgDR6X3Oa2Foro+EygiOJHUXhCqBAAKQYYajZpFoIfvBCF1j6R6IYRSIUFuw== + dependencies: + "@vitest/spy" "2.1.8" + "@vitest/utils" "2.1.8" + chai "^5.1.2" + tinyrainbow "^1.2.0" + +"@vitest/mocker@2.1.8": + version "2.1.8" + resolved "https://registry.npmjs.org/@vitest/mocker/-/mocker-2.1.8.tgz" + integrity sha512-7guJ/47I6uqfttp33mgo6ga5Gr1VnL58rcqYKyShoRK9ebu8T5Rs6HN3s1NABiBeVTdWNrwUMcHH54uXZBN4zA== + dependencies: + "@vitest/spy" "2.1.8" + estree-walker "^3.0.3" + magic-string "^0.30.12" + +"@vitest/pretty-format@2.1.8", "@vitest/pretty-format@^2.1.8": + version "2.1.8" + resolved "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-2.1.8.tgz" + integrity sha512-9HiSZ9zpqNLKlbIDRWOnAWqgcA7xu+8YxXSekhr0Ykab7PAYFkhkwoqVArPOtJhPmYeE2YHgKZlj3CP36z2AJQ== + dependencies: + tinyrainbow "^1.2.0" + +"@vitest/runner@2.1.8": + version "2.1.8" + resolved "https://registry.npmjs.org/@vitest/runner/-/runner-2.1.8.tgz" + integrity sha512-17ub8vQstRnRlIU5k50bG+QOMLHRhYPAna5tw8tYbj+jzjcspnwnwtPtiOlkuKC4+ixDPTuLZiqiWWQ2PSXHVg== + dependencies: + "@vitest/utils" "2.1.8" + pathe "^1.1.2" + +"@vitest/snapshot@2.1.8": + version "2.1.8" + resolved "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-2.1.8.tgz" + integrity sha512-20T7xRFbmnkfcmgVEz+z3AU/3b0cEzZOt/zmnvZEctg64/QZbSDJEVm9fLnnlSi74KibmRsO9/Qabi+t0vCRPg== + dependencies: + "@vitest/pretty-format" "2.1.8" + magic-string "^0.30.12" + pathe "^1.1.2" + +"@vitest/spy@2.1.8": + version "2.1.8" + resolved "https://registry.npmjs.org/@vitest/spy/-/spy-2.1.8.tgz" + integrity sha512-5swjf2q95gXeYPevtW0BLk6H8+bPlMb4Vw/9Em4hFxDcaOxS+e0LOX4yqNxoHzMR2akEB2xfpnWUzkZokmgWDg== + dependencies: + tinyspy "^3.0.2" + +"@vitest/ui@^2.1.8": + version "2.1.8" + resolved "https://registry.npmjs.org/@vitest/ui/-/ui-2.1.8.tgz" + integrity sha512-5zPJ1fs0ixSVSs5+5V2XJjXLmNzjugHRyV11RqxYVR+oMcogZ9qTuSfKW+OcTV0JeFNznI83BNylzH6SSNJ1+w== + dependencies: + "@vitest/utils" "2.1.8" + fflate "^0.8.2" + flatted "^3.3.1" + pathe "^1.1.2" + sirv "^3.0.0" + tinyglobby "^0.2.10" + tinyrainbow "^1.2.0" + +"@vitest/utils@2.1.8": + version "2.1.8" + resolved "https://registry.npmjs.org/@vitest/utils/-/utils-2.1.8.tgz" + integrity sha512-dwSoui6djdwbfFmIgbIjX2ZhIoG7Ex/+xpxyiEgIGzjliY8xGkcpITKTlp6B4MgtGkF2ilvm97cPM96XZaAgcA== + dependencies: + "@vitest/pretty-format" "2.1.8" + loupe "^3.1.2" + tinyrainbow "^1.2.0" + +JSONStream@^1.3.5: + version "1.3.5" + resolved "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.5.tgz" + integrity sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ== + dependencies: + jsonparse "^1.2.0" + through ">=2.2.7 <3" + +abbrev@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/abbrev/-/abbrev-2.0.0.tgz" + integrity sha512-6/mh1E2u2YgEsCHdY0Yx5oW+61gZU+1vXaoiHHrpKeuRNNgFvS+/jrwHiQhB5apAf5oB7UB7E19ol2R2LKH8hQ== + +accepts@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/accepts/-/accepts-2.0.0.tgz" + integrity sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng== + dependencies: + mime-types "^3.0.0" + negotiator "^1.0.0" + +acorn-jsx@^5.3.2: + version "5.3.2" + resolved "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz" + integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== + +acorn-walk@^8.1.1, acorn-walk@^8.2.0: + version "8.3.4" + resolved "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.4.tgz" + integrity sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g== + dependencies: + acorn "^8.11.0" + +acorn@^8.11.0, acorn@^8.4.1, acorn@^8.7.0, acorn@^8.9.0: + version "8.14.0" + resolved "https://registry.npmjs.org/acorn/-/acorn-8.14.0.tgz" + integrity sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA== + +agent-base@6: + version "6.0.2" + resolved "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz" + integrity sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ== + dependencies: + debug "4" + +agent-base@^7.1.0, agent-base@^7.1.2: + version "7.1.3" + resolved "https://registry.npmjs.org/agent-base/-/agent-base-7.1.3.tgz" + integrity sha512-jRR5wdylq8CkOe6hei19GGZnxM6rBGwFl3Bg0YItGDimvjGtAvdZk4Pu6Cl4u4Igsws4a1fd1Vq3ezrhn4KmFw== + +agentkeepalive@^4.1.0: + version "4.5.0" + resolved "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.5.0.tgz" + integrity sha512-5GG/5IbQQpC9FpkRGsSvZI5QYeSCzlJHdpBQntCsuTOxhKD8lqKhrleg2Yi7yvMIf82Ycmmqln9U8V9qwEiJew== + dependencies: + humanize-ms "^1.2.1" + +aggregate-error@^3.0.0: + version "3.1.0" + resolved "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz" + integrity sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA== + dependencies: + clean-stack "^2.0.0" + indent-string "^4.0.0" + +ajv-formats@^2.1.1: + version "2.1.1" + resolved "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz" + integrity sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA== + dependencies: + ajv "^8.0.0" + +ajv@^6.12.3: + version "6.12.6" + resolved "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz" + integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== + dependencies: + fast-deep-equal "^3.1.1" + fast-json-stable-stringify "^2.0.0" + json-schema-traverse "^0.4.1" + uri-js "^4.2.2" + +ajv@^8.0.0, ajv@^8.11.0, ajv@^8.12.0: + version "8.17.1" + resolved "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz" + integrity sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g== + dependencies: + fast-deep-equal "^3.1.3" + fast-uri "^3.0.1" + json-schema-traverse "^1.0.0" + require-from-string "^2.0.2" + +amdefine@>=0.0.4: + version "1.0.1" + resolved "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz" + integrity sha512-S2Hw0TtNkMJhIabBwIojKL9YHO5T0n5eNqWJ7Lrlel/zDbftQpxpapi8tZs3X1HWa+u+QeydGmzzNU0m09+Rcg== + +ansi-escapes@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-2.0.0.tgz" + integrity sha512-tH/fSoQp4DrEodDK3QpdiWiZTSe7sBJ9eOqcQBZ0o9HTM+5M/viSEn+sPMoTuPjQQ8n++w3QJoPEjt8LVPcrCg== + +ansi-escapes@^3.0.0: + version "3.2.0" + resolved "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz" + integrity sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ== + +ansi-escapes@^4.2.1, ansi-escapes@^4.3.2: + version "4.3.2" + resolved "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz" + integrity sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ== + dependencies: + type-fest "^0.21.3" + +ansi-escapes@^6.0.0: + version "6.2.1" + resolved "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-6.2.1.tgz" + integrity sha512-4nJ3yixlEthEJ9Rk4vPcdBRkZvQZlYyu8j4/Mqz5sgIkddmEnH2Yj2ZrnP9S3tQOvSNRUIgVNF/1yPpRAGNRig== + +ansi-escapes@^7.0.0: + version "7.0.0" + resolved "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-7.0.0.tgz" + integrity sha512-GdYO7a61mR0fOlAsvC9/rIHf7L96sBc6dEWzeOu+KAea5bZyQRPIpojrVoI4AXGJS/ycu/fBTdLrUkA4ODrvjw== + dependencies: + environment "^1.0.0" + +ansi-regex@^3.0.0: + version "3.0.1" + resolved "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.1.tgz" + integrity sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw== + +ansi-regex@^5.0.1: + version "5.0.1" + resolved "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz" + integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== + +ansi-regex@^6.0.1: + version "6.1.0" + resolved "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz" + integrity sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA== + +ansi-styles@^3.2.1: + version "3.2.1" + resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz" + integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== + dependencies: + color-convert "^1.9.0" + +ansi-styles@^4.0.0, ansi-styles@^4.1.0: + version "4.3.0" + resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz" + integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== + dependencies: + color-convert "^2.0.1" + +ansi-styles@^6.0.0, ansi-styles@^6.1.0, ansi-styles@^6.2.1: + version "6.2.1" + resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz" + integrity sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug== + +ansis@^3.3.1, ansis@^3.3.2: + version "3.4.0" + resolved "https://registry.npmjs.org/ansis/-/ansis-3.4.0.tgz" + integrity sha512-zVESKSQhWaPhGaWiKj1k+UqvpC7vPBBgG3hjQEeIx2YGzylWt8qA3ziAzRuUtm0OnaGsZKjIvfl8D/sJTt/I0w== + +anymatch@~3.1.2: + version "3.1.3" + resolved "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz" + integrity sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw== + dependencies: + normalize-path "^3.0.0" + picomatch "^2.0.4" + +app-module-path@^2.2.0: + version "2.2.0" + resolved "https://registry.npmjs.org/app-module-path/-/app-module-path-2.2.0.tgz" + integrity sha512-gkco+qxENJV+8vFcDiiFhuoSvRXb2a/QPqpSoWhVz829VNJfOTnELbBmPmNKFxf3xdNnw4DWCkzkDaavcX/1YQ== + +append-field@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/append-field/-/append-field-1.0.0.tgz#1e3440e915f0b1203d23748e78edd7b9b5b43e56" + integrity sha512-klpgFSWLW1ZEs8svjfb7g4qWY0YS5imI82dTg+QahUvJ8YqAY0P10Uk8tTyh9ZGuYEZEMaeJYCF5BFuX552hsw== + +archiver-utils@^2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/archiver-utils/-/archiver-utils-2.1.0.tgz" + integrity sha512-bEL/yUb/fNNiNTuUz979Z0Yg5L+LzLxGJz8x79lYmR54fmTIb6ob/hNQgkQnIUDWIFjZVQwl9Xs356I6BAMHfw== + dependencies: + glob "^7.1.4" + graceful-fs "^4.2.0" + lazystream "^1.0.0" + lodash.defaults "^4.2.0" + lodash.difference "^4.5.0" + lodash.flatten "^4.4.0" + lodash.isplainobject "^4.0.6" + lodash.union "^4.6.0" + normalize-path "^3.0.0" + readable-stream "^2.0.0" + +archiver-utils@^3.0.4: + version "3.0.4" + resolved "https://registry.npmjs.org/archiver-utils/-/archiver-utils-3.0.4.tgz" + integrity sha512-KVgf4XQVrTjhyWmx6cte4RxonPLR9onExufI1jhvw/MQ4BB6IsZD5gT8Lq+u/+pRkWna/6JoHpiQioaqFP5Rzw== + dependencies: + glob "^7.2.3" + graceful-fs "^4.2.0" + lazystream "^1.0.0" + lodash.defaults "^4.2.0" + lodash.difference "^4.5.0" + lodash.flatten "^4.4.0" + lodash.isplainobject "^4.0.6" + lodash.union "^4.6.0" + normalize-path "^3.0.0" + readable-stream "^3.6.0" + +archiver@^5.3.1: + version "5.3.2" + resolved "https://registry.npmjs.org/archiver/-/archiver-5.3.2.tgz" + integrity sha512-+25nxyyznAXF7Nef3y0EbBeqmGZgeN/BxHX29Rs39djAfaFalmQ89SE6CWyDCHzGL0yt/ycBtNOmGTW0FyGWNw== + dependencies: + archiver-utils "^2.1.0" + async "^3.2.4" + buffer-crc32 "^0.2.1" + readable-stream "^3.6.0" + readdir-glob "^1.1.2" + tar-stream "^2.2.0" + zip-stream "^4.1.0" + +arcsecond@^5.0.0: + version "5.0.0" + resolved "https://registry.npmjs.org/arcsecond/-/arcsecond-5.0.0.tgz" + integrity sha512-J/fHdyadnsIencRsM6oUSsraCKG+Ni9Udcgr/eusxjTzX3SEQtCUQSpP0YtImFPfIK6DdT1nqwN0ng4FqNmwgA== + +arg@^4.1.0: + version "4.1.3" + resolved "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz" + integrity sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA== + +argparse@^1.0.7: + version "1.0.10" + resolved "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz" + integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== + dependencies: + sprintf-js "~1.0.2" + +argparse@^2.0.1: + version "2.0.1" + resolved "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz" + integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== + +array-find-index@^1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz" + integrity sha512-M1HQyIXcBGtVywBt8WVdim+lrNaK7VHp99Qt5pSNziXznKHViIBbXWtfRTpEFpF/c4FdfxNAsCCwPp5phBYJtw== + +array-flatten@3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/array-flatten/-/array-flatten-3.0.0.tgz" + integrity sha512-zPMVc3ZYlGLNk4mpK1NzP2wg0ml9t7fUgDsayR5Y5rSzxQilzR9FGu/EH2jQOcKSAeAfWeylyW8juy3OkWRvNA== + +array-ify@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/array-ify/-/array-ify-1.0.0.tgz" + integrity sha512-c5AMf34bKdvPhQ7tBGhqkgKNUzMr4WUs+WDtC2ZUGOUncbxKMTvqxYctiseW3+L4bA8ec+GcZ6/A/FW4m8ukng== + +array-union@^2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz" + integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== + +arrivals@^2.1.2: + version "2.1.2" + resolved "https://registry.npmjs.org/arrivals/-/arrivals-2.1.2.tgz" + integrity sha512-g3+rxhxUen2H4+PPBOz6U6pkQ4esBuQPna1rPskgK1jamBdDZeoppyB2vPUM/l0ccunwRrq4r2rKgCvc2FnrFA== + dependencies: + debug "^4.0.1" + nanotimer "0.3.14" + +artillery-engine-playwright@1.18.0: + version "1.18.0" + resolved "https://registry.npmjs.org/artillery-engine-playwright/-/artillery-engine-playwright-1.18.0.tgz" + integrity sha512-+BJhiiJIiCC+mtXuxdvmKNb8Kj+NXXsZs75SeLILukytg3ZMRhEWFbL7FnfizhzGqh/b2WGvOOjQYUV/OkRt9w== + dependencies: + "@playwright/browser-chromium" "^1.48.0" + "@playwright/test" "^1.48.0" + debug "^4.3.2" + playwright "^1.48.0" + +artillery-plugin-apdex@1.12.0: + version "1.12.0" + resolved "https://registry.npmjs.org/artillery-plugin-apdex/-/artillery-plugin-apdex-1.12.0.tgz" + integrity sha512-RFwfXjSY7ELCMSBrLy5MiXt5WhseLDNrwXwOgbHOvR+40ULhtSb0N+EcC3Kxoxcn6MzPX9414RkS0Kj2e6TmIw== + dependencies: + tap "^19.0.2" + +artillery-plugin-ensure@1.15.0: + version "1.15.0" + resolved "https://registry.npmjs.org/artillery-plugin-ensure/-/artillery-plugin-ensure-1.15.0.tgz" + integrity sha512-iUq+eTatH/jSrGy6SF/l50q5R+yMKiRfLh5S4lVJGq6Tf7FLgYNu7JelybJyTVUxUZcG0kyxHGmPcxnM78PAjQ== + dependencies: + chalk "^2.4.2" + debug "^4.3.3" + filtrex "^2.2.3" + +artillery-plugin-expect@2.15.0: + version "2.15.0" + resolved "https://registry.npmjs.org/artillery-plugin-expect/-/artillery-plugin-expect-2.15.0.tgz" + integrity sha512-hVo628Y6Z/LiWG3frUl1GIwUqLBOlaiCxepsVkY/kN4KSX0FQV+SyWrGgzIw+eE0KDivWIUfnN93zhain9hotw== + dependencies: + chalk "^4.1.2" + debug "^4.3.2" + jmespath "^0.16.0" + lodash "^4.17.21" + +artillery-plugin-fake-data@1.12.0: + version "1.12.0" + resolved "https://registry.npmjs.org/artillery-plugin-fake-data/-/artillery-plugin-fake-data-1.12.0.tgz" + integrity sha512-fsYIQCsJSR9Jw/RFcqUfReHUpDBN4ddnqtaxkuwtpSUfVyqDFuiOIR7QYIsqBFfq1JNSkw2Op47Ol0tNFpZ5fA== + dependencies: + "@ngneat/falso" "^7.1.1" + +artillery-plugin-metrics-by-endpoint@1.15.0: + version "1.15.0" + resolved "https://registry.npmjs.org/artillery-plugin-metrics-by-endpoint/-/artillery-plugin-metrics-by-endpoint-1.15.0.tgz" + integrity sha512-I95bvm4jG67lPYlQwSQZNcKajZee7YtezCVVWBN47tkrFDUDqdaba3dGCI8O+9H9kE5dm0s7WdzyfvUZZCxE+A== + dependencies: + debug "^4.3.2" + +artillery-plugin-publish-metrics@2.26.0: + version "2.26.0" + resolved "https://registry.npmjs.org/artillery-plugin-publish-metrics/-/artillery-plugin-publish-metrics-2.26.0.tgz" + integrity sha512-qI3S3AgkF2PVkP5POxubehju6onMl3HPq9WTGYK29gp3MaSSf/s+5i2UNjkAEmdrO2fqBnhanSo+Df8ffuC0eA== + dependencies: + "@aws-sdk/client-cloudwatch" "^3.370.0" + "@opentelemetry/api" "^1.4.1" + "@opentelemetry/context-async-hooks" "^1.17.1" + "@opentelemetry/exporter-metrics-otlp-grpc" "^0.41.2" + "@opentelemetry/exporter-metrics-otlp-http" "^0.41.2" + "@opentelemetry/exporter-metrics-otlp-proto" "^0.41.2" + "@opentelemetry/exporter-trace-otlp-grpc" "^0.43.0" + "@opentelemetry/exporter-trace-otlp-http" "^0.41.2" + "@opentelemetry/exporter-trace-otlp-proto" "^0.41.2" + "@opentelemetry/exporter-zipkin" "^1.15.2" + "@opentelemetry/resources" "^1.15.2" + "@opentelemetry/sdk-metrics" "^1.15.2" + "@opentelemetry/sdk-trace-base" "^1.15.2" + "@opentelemetry/semantic-conventions" "^1.15.2" + async "^2.6.1" + datadog-metrics "^0.9.3" + debug "^4.1.1" + dogapi "^2.8.4" + hot-shots "^6.0.1" + lightstep-tracer "^0.31.0" + mixpanel "^0.13.0" + opentracing "^0.14.5" + prom-client "^14.0.1" + semver "^7.3.5" + uuid "^8.3.2" + +artillery-plugin-slack@1.10.0: + version "1.10.0" + resolved "https://registry.npmjs.org/artillery-plugin-slack/-/artillery-plugin-slack-1.10.0.tgz" + integrity sha512-3foLJ/fkLeCl5P2tZ43d+hKzikNYvtiWWYaxGaGfKpBlNchKSXmiPh4ZpPur/VzKynnA5IjnG4eagSbf/tZ+Wg== + dependencies: + debug "^4.3.4" + got "^11.8.5" + +artillery@2.0.21: + version "2.0.21" + resolved "https://registry.yarnpkg.com/artillery/-/artillery-2.0.21.tgz#c70d5a3819ab4458d1e2aaca6827717ffe18a19e" + integrity sha512-4viCw0LQnuc9SyGiBlMbvdfGbNZxQao3twRmyEqF7aIiWx4Vfn8ag3uVxo8tNUzInf6sMcTESm0RSUe9jl768w== + dependencies: + "@artilleryio/int-commons" "2.12.0" + "@artilleryio/int-core" "2.16.0" + "@aws-sdk/credential-providers" "^3.127.0" + "@azure/arm-containerinstance" "^9.1.0" + "@azure/identity" "^4.2.0" + "@azure/storage-blob" "^12.18.0" + "@azure/storage-queue" "^12.22.0" + "@oclif/core" "^4.0.25" + "@oclif/plugin-help" "^6.2.13" + "@oclif/plugin-not-found" "^3.2.22" + archiver "^5.3.1" + artillery-engine-playwright "1.18.0" + artillery-plugin-apdex "1.12.0" + artillery-plugin-ensure "1.15.0" + artillery-plugin-expect "2.15.0" + artillery-plugin-fake-data "1.12.0" + artillery-plugin-metrics-by-endpoint "1.15.0" + artillery-plugin-publish-metrics "2.26.0" + artillery-plugin-slack "1.10.0" + async "^2.6.4" + aws-sdk "^2.1338.0" + chalk "^2.4.2" + chokidar "^3.6.0" + ci-info "^4.0.0" + cli-table3 "^0.6.0" + cross-spawn "^7.0.3" + csv-parse "^4.16.3" + debug "^4.3.1" + dependency-tree "^10.0.9" + detective-es6 "^4.0.1" + dotenv "^16.0.1" + driftless "^2.0.3" + esbuild-wasm "^0.19.8" + eventemitter3 "^4.0.4" + fs-extra "^10.1.0" + got "^11.8.5" + joi "^17.6.0" + js-yaml "^3.13.1" + jsonwebtoken "^9.0.1" + lodash "^4.17.19" + moment "^2.29.4" + nanoid "^3.3.4" + ora "^4.0.4" + posthog-node "^2.2.3" + rc "^1.2.8" + sqs-consumer "5.8.0" + temp "^0.9.4" + tmp "0.2.1" + walk-sync "^0.2.3" + yaml-js "^0.2.3" + +asap@^2.0.0: + version "2.0.6" + resolved "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz" + integrity sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA== + +asn1@~0.2.3: + version "0.2.6" + resolved "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz" + integrity sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ== + dependencies: + safer-buffer "~2.1.0" + +assert-plus@1.0.0, assert-plus@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz" + integrity sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw== + +assertion-error@^1.1.0: + version "1.1.0" + resolved "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz" + integrity sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw== + +assertion-error@^2.0.1: + version "2.0.1" + resolved "https://registry.npmjs.org/assertion-error/-/assertion-error-2.0.1.tgz" + integrity sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA== + +ast-module-types@^5.0.0: + version "5.0.0" + resolved "https://registry.npmjs.org/ast-module-types/-/ast-module-types-5.0.0.tgz" + integrity sha512-JvqziE0Wc0rXQfma0HZC/aY7URXHFuZV84fJRtP8u+lhp0JYCNd5wJzVXP45t0PH0Mej3ynlzvdyITYIu0G4LQ== + +async-hook-domain@^4.0.1: + version "4.0.1" + resolved "https://registry.npmjs.org/async-hook-domain/-/async-hook-domain-4.0.1.tgz" + integrity sha512-bSktexGodAjfHWIrSrrqxqWzf1hWBZBpmPNZv+TYUMyWa2eoefFc6q6H1+KtdHYSz35lrhWdmXt/XK9wNEZvww== + +async-limiter@~1.0.0: + version "1.0.1" + resolved "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz" + integrity sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ== + +async@1.5.0: + version "1.5.0" + resolved "https://registry.npmjs.org/async/-/async-1.5.0.tgz" + integrity sha512-m9nMwCtLtz29LszVaR0q/FqsJWkrxVoQL95p7JU0us7qUx4WEcySQgwvuneYSGVyvirl81gz7agflS3V1yW14g== + +async@^2.6.1, async@^2.6.4: + version "2.6.4" + resolved "https://registry.npmjs.org/async/-/async-2.6.4.tgz" + integrity sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA== + dependencies: + lodash "^4.17.14" + +async@^3.2.3, async@^3.2.4: + version "3.2.6" + resolved "https://registry.npmjs.org/async/-/async-3.2.6.tgz" + integrity sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA== + +asynckit@^0.4.0: + version "0.4.0" + resolved "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz" + integrity sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q== + +at-least-node@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz" + integrity sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg== + +atob@^2.1.2: + version "2.1.2" + resolved "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz" + integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg== + +auto-bind@^5.0.1: + version "5.0.1" + resolved "https://registry.npmjs.org/auto-bind/-/auto-bind-5.0.1.tgz" + integrity sha512-ooviqdwwgfIfNmDwo94wlshcdzfO64XV0Cg6oDsDYBJfITDz1EngD2z7DkbvCWn+XIMsIqW27sEVF6qcpJrRcg== + +available-typed-arrays@^1.0.7: + version "1.0.7" + resolved "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz" + integrity sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ== + dependencies: + possible-typed-array-names "^1.0.0" + +aws-sdk@^2.1271.0, aws-sdk@^2.1338.0: + version "2.1692.0" + resolved "https://registry.npmjs.org/aws-sdk/-/aws-sdk-2.1692.0.tgz" + integrity sha512-x511uiJ/57FIsbgUe5csJ13k3uzu25uWQE+XqfBis/sB0SFoiElJWXRkgEAUh0U6n40eT3ay5Ue4oPkRMu1LYw== + dependencies: + buffer "4.9.2" + events "1.1.1" + ieee754 "1.1.13" + jmespath "0.16.0" + querystring "0.2.0" + sax "1.2.1" + url "0.10.3" + util "^0.12.4" + uuid "8.0.0" + xml2js "0.6.2" + +aws-sign2@~0.7.0: + version "0.7.0" + resolved "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz" + integrity sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA== + +aws4-axios@^3.3.0: + version "3.3.12" + resolved "https://registry.npmjs.org/aws4-axios/-/aws4-axios-3.3.12.tgz" + integrity sha512-m1QCS4fBiYL+DA3ps4Lk94PBA6kzJKkQ/gXHCe3ZlVpg6ZFe1CgQ1XvPsZYN3L5Plw8egM/aPYXkyBdEazaKwA== + dependencies: + "@aws-sdk/client-sts" "^3.4.1" + aws4 "^1.12.0" + +aws4@^1.12.0: + version "1.13.2" + resolved "https://registry.npmjs.org/aws4/-/aws4-1.13.2.tgz" + integrity sha512-lHe62zvbTB5eEABUVi/AwVh0ZKY9rMMDhmm+eeyuuUQbQ3+J+fONVQOZyj+DdrvD4BY33uYniyRJ4UJIaSKAfw== + +axios@1.7.5: + version "1.7.5" + resolved "https://registry.npmjs.org/axios/-/axios-1.7.5.tgz" + integrity sha512-fZu86yCo+svH3uqJ/yTdQ0QHpQu5oL+/QE+QPSv6BZSkDAoky9vytxp7u5qk83OJFS3kEBcesWni9WTZAv3tSw== + dependencies: + follow-redirects "^1.15.6" + form-data "^4.0.0" + proxy-from-env "^1.1.0" + +axios@^0.27.0: + version "0.27.2" + resolved "https://registry.npmjs.org/axios/-/axios-0.27.2.tgz" + integrity sha512-t+yRIyySRTp/wua5xEr+z1q60QmLq8ABsS5O9Me1AsE5dfKqgnCFzwiCZZ/cGNd1lq4/7akDWMxdhVlucjmnOQ== + dependencies: + follow-redirects "^1.14.9" + form-data "^4.0.0" + +axios@^1.7.7: + version "1.7.9" + resolved "https://registry.npmjs.org/axios/-/axios-1.7.9.tgz" + integrity sha512-LhLcE7Hbiryz8oMDdDptSrWowmB4Bl6RCt6sIJKpRB4XtVf0iEgewX3au/pJqm+Py1kCASkb/FFKjxQaLtxJvw== + dependencies: + follow-redirects "^1.15.6" + form-data "^4.0.0" + proxy-from-env "^1.1.0" + +balanced-match@^1.0.0: + version "1.0.2" + resolved "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz" + integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== + +base64-js@^1.0.2, base64-js@^1.1.2, base64-js@^1.3.1: + version "1.5.1" + resolved "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz" + integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== + +basic-auth@~2.0.1: + version "2.0.1" + resolved "https://registry.npmjs.org/basic-auth/-/basic-auth-2.0.1.tgz" + integrity sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg== + dependencies: + safe-buffer "5.1.2" + +bcrypt-pbkdf@^1.0.0: + version "1.0.2" + resolved "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz" + integrity sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w== + dependencies: + tweetnacl "^0.14.3" + +bignumber.js@^9.0.0: + version "9.1.2" + resolved "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.1.2.tgz" + integrity sha512-2/mKyZH9K85bzOEfhXDBFZTGd1CTs+5IHpeFQo9luiBG7hghdC851Pj2WAhb6E3R6b9tZj/XKhbg4fum+Kepug== + +binary-extensions@^2.0.0: + version "2.3.0" + resolved "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz" + integrity sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw== + +bindings@^1.5.0: + version "1.5.0" + resolved "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz" + integrity sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ== + dependencies: + file-uri-to-path "1.0.0" + +bintrees@1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/bintrees/-/bintrees-1.0.2.tgz" + integrity sha512-VOMgTMwjAaUG580SXn3LacVgjurrbMme7ZZNYGSSV7mmtY6QQRh0Eg3pwIcntQ77DErK1L0NxkbetjcoXzVwKw== + +bl@^4.0.3, bl@^4.1.0: + version "4.1.0" + resolved "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz" + integrity sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w== + dependencies: + buffer "^5.5.0" + inherits "^2.0.4" + readable-stream "^3.4.0" + +bluebird@^2.6.2: + version "2.11.0" + resolved "https://registry.npmjs.org/bluebird/-/bluebird-2.11.0.tgz" + integrity sha512-UfFSr22dmHPQqPP9XWHRhq+gWnHCYguQGkXQlbyPtW5qTnhFWA8/iXg765tH0cAjy7l/zPJ1aBTO0g5XgA7kvQ== + +bluebird@^3.5.2: + version "3.7.2" + resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.7.2.tgz#9f229c15be272454ffa973ace0dbee79a1b0c36f" + integrity sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg== + +body-parser@^2.0.1: + version "2.0.2" + resolved "https://registry.npmjs.org/body-parser/-/body-parser-2.0.2.tgz" + integrity sha512-SNMk0OONlQ01uk8EPeiBvTW7W4ovpL5b1O3t1sjpPgfxOQ6BqQJ6XjxinDPR79Z6HdcD5zBBwr5ssiTlgdNztQ== + dependencies: + bytes "3.1.2" + content-type "~1.0.5" + debug "3.1.0" + destroy "1.2.0" + http-errors "2.0.0" + iconv-lite "0.5.2" + on-finished "2.4.1" + qs "6.13.0" + raw-body "^3.0.0" + type-is "~1.6.18" + +boolbase@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz" + integrity sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww== + +bowser@^2.11.0: + version "2.11.0" + resolved "https://registry.npmjs.org/bowser/-/bowser-2.11.0.tgz" + integrity sha512-AlcaJBi/pqqJBIQ8U9Mcpc9i8Aqxn88Skv5d+xBX006BY5u8N3mGLHa5Lgppa7L/HfwgwLgZ6NYs+Ag6uUmJRA== + +brace-expansion@^1.1.7: + version "1.1.11" + resolved "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz" + integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== + dependencies: + balanced-match "^1.0.0" + concat-map "0.0.1" + +brace-expansion@^2.0.1: + version "2.0.1" + resolved "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz" + integrity sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA== + dependencies: + balanced-match "^1.0.0" + +braces@^3.0.3, braces@~3.0.2: + version "3.0.3" + resolved "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz" + integrity sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA== + dependencies: + fill-range "^7.1.1" + +brotli@^1.3.3: + version "1.3.3" + resolved "https://registry.npmjs.org/brotli/-/brotli-1.3.3.tgz" + integrity sha512-oTKjJdShmDuGW94SyyaoQvAjf30dZaHnjJ8uAF+u2/vGJkJbJPJAT1gDiOJP5v1Zb6f9KEyW/1HpuaWIXtGHPg== + dependencies: + base64-js "^1.1.2" + +browser-or-node@^1.2.1: + version "1.3.0" + resolved "https://registry.npmjs.org/browser-or-node/-/browser-or-node-1.3.0.tgz" + integrity sha512-0F2z/VSnLbmEeBcUrSuDH5l0HxTXdQQzLjkmBR4cYfvg1zJrKSlmIZFqyFR8oX0NrwPhy3c3HQ6i3OxMbew4Tg== + +browserslist@^4.24.0: + version "4.24.3" + resolved "https://registry.npmjs.org/browserslist/-/browserslist-4.24.3.tgz" + integrity sha512-1CPmv8iobE2fyRMV97dAcMVegvvWKxmq94hkLiAkUGwKVTyDLw33K+ZxiFrREKmmps4rIw6grcCFCnTMSZ/YiA== + dependencies: + caniuse-lite "^1.0.30001688" + electron-to-chromium "^1.5.73" + node-releases "^2.0.19" + update-browserslist-db "^1.1.1" + +btoa@^1.2.1: + version "1.2.1" + resolved "https://registry.npmjs.org/btoa/-/btoa-1.2.1.tgz" + integrity sha512-SB4/MIGlsiVkMcHmT+pSmIPoNDoHg+7cMzmt3Uxt628MTz2487DKSqK/fuhFBrkuqrYv5UCEnACpF4dTFNKc/g== + +buffer-crc32@^0.2.1, buffer-crc32@^0.2.13: + version "0.2.13" + resolved "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz" + integrity sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ== + +buffer-equal-constant-time@1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz" + integrity sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA== + +buffer-from@^1.0.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" + integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== + +buffer@4.9.2: + version "4.9.2" + resolved "https://registry.npmjs.org/buffer/-/buffer-4.9.2.tgz" + integrity sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg== + dependencies: + base64-js "^1.0.2" + ieee754 "^1.1.4" + isarray "^1.0.0" + +buffer@^5.5.0: + version "5.7.1" + resolved "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz" + integrity sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ== + dependencies: + base64-js "^1.3.1" + ieee754 "^1.1.13" + +busboy@^1.0.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/busboy/-/busboy-1.6.0.tgz#966ea36a9502e43cdb9146962523b92f531f6893" + integrity sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA== + dependencies: + streamsearch "^1.1.0" + +bytes@3.1.2: + version "3.1.2" + resolved "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz" + integrity sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg== + +c8@^9.1.0: + version "9.1.0" + resolved "https://registry.npmjs.org/c8/-/c8-9.1.0.tgz" + integrity sha512-mBWcT5iqNir1zIkzSPyI3NCR9EZCVI3WUD+AVO17MVWTSFNyUueXE82qTeampNtTr+ilN/5Ua3j24LgbCKjDVg== + dependencies: + "@bcoe/v8-coverage" "^0.2.3" + "@istanbuljs/schema" "^0.1.3" + find-up "^5.0.0" + foreground-child "^3.1.1" + istanbul-lib-coverage "^3.2.0" + istanbul-lib-report "^3.0.1" + istanbul-reports "^3.1.6" + test-exclude "^6.0.0" + v8-to-istanbul "^9.0.0" + yargs "^17.7.2" + yargs-parser "^21.1.1" + +cac@^6.7.14: + version "6.7.14" + resolved "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz" + integrity sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ== + +cacache@^18.0.0: + version "18.0.4" + resolved "https://registry.npmjs.org/cacache/-/cacache-18.0.4.tgz" + integrity sha512-B+L5iIa9mgcjLbliir2th36yEwPftrzteHYujzsx3dFP/31GCHcIeS8f5MGd80odLOjaOvSpU3EEAmRQptkxLQ== + dependencies: + "@npmcli/fs" "^3.1.0" + fs-minipass "^3.0.0" + glob "^10.2.2" + lru-cache "^10.0.1" + minipass "^7.0.3" + minipass-collect "^2.0.1" + minipass-flush "^1.0.5" + minipass-pipeline "^1.2.4" + p-map "^4.0.0" + ssri "^10.0.0" + tar "^6.1.11" + unique-filename "^3.0.0" + +cacheable-lookup@^5.0.3: + version "5.0.4" + resolved "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-5.0.4.tgz" + integrity sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA== + +cacheable-request@^7.0.2: + version "7.0.4" + resolved "https://registry.npmjs.org/cacheable-request/-/cacheable-request-7.0.4.tgz" + integrity sha512-v+p6ongsrp0yTGbJXjgxPow2+DL93DASP4kXCDKb8/bwRtt9OEF3whggkkDkGNzgcWy2XaF4a8nZglC7uElscg== + dependencies: + clone-response "^1.0.2" + get-stream "^5.1.0" + http-cache-semantics "^4.0.0" + keyv "^4.0.0" + lowercase-keys "^2.0.0" + normalize-url "^6.0.1" + responselike "^2.0.0" + +cachedir@2.3.0: + version "2.3.0" + resolved "https://registry.npmjs.org/cachedir/-/cachedir-2.3.0.tgz" + integrity sha512-A+Fezp4zxnit6FanDmv9EqXNAi3vt9DWp51/71UEhXukb7QUuvtv9344h91dyAxuTLoSYJFU299qzR3tzwPAhw== + +call-bind-apply-helpers@^1.0.0, call-bind-apply-helpers@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.1.tgz" + integrity sha512-BhYE+WDaywFg2TBWYNXAE+8B1ATnThNBqXHP5nQu0jWJdVvY2hvkpyB3qOmtmDePiS5/BDQ8wASEWGMWRG148g== + dependencies: + es-errors "^1.3.0" + function-bind "^1.1.2" + +call-bind@^1.0.8: + version "1.0.8" + resolved "https://registry.npmjs.org/call-bind/-/call-bind-1.0.8.tgz" + integrity sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww== + dependencies: + call-bind-apply-helpers "^1.0.0" + es-define-property "^1.0.0" + get-intrinsic "^1.2.4" + set-function-length "^1.2.2" + +call-bound@^1.0.2, call-bound@^1.0.3: + version "1.0.3" + resolved "https://registry.npmjs.org/call-bound/-/call-bound-1.0.3.tgz" + integrity sha512-YTd+6wGlNlPxSuri7Y6X8tY2dmm12UMH66RpKMhiX6rsk5wXXnYgbUcOt8kiS31/AjfoTOvCsE+w8nZQLQnzHA== + dependencies: + call-bind-apply-helpers "^1.0.1" + get-intrinsic "^1.2.6" + +callsites@^3.0.0: + version "3.1.0" + resolved "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz" + integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== + +caniuse-lite@^1.0.30001688: + version "1.0.30001690" + resolved "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001690.tgz" + integrity sha512-5ExiE3qQN6oF8Clf8ifIDcMRCRE/dMGcETG/XGMD8/XiXm6HXQgQTh1yZYLXXpSOsEUlJm1Xr7kGULZTuGtP/w== + +caseless@~0.12.0: + version "0.12.0" + resolved "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz" + integrity sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw== + +chai-string@^1.5.0: + version "1.5.0" + resolved "https://registry.npmjs.org/chai-string/-/chai-string-1.5.0.tgz" + integrity sha512-sydDC3S3pNAQMYwJrs6dQX0oBQ6KfIPuOZ78n7rocW0eJJlsHPh2t3kwW7xfwYA/1Bf6/arGtSUo16rxR2JFlw== + +chai@^4.3.7: + version "4.5.0" + resolved "https://registry.npmjs.org/chai/-/chai-4.5.0.tgz" + integrity sha512-RITGBfijLkBddZvnn8jdqoTypxvqbOLYQkGGxXzeFjVHvudaPw0HNFD9x928/eUwYWd2dPCugVqspGALTZZQKw== + dependencies: + assertion-error "^1.1.0" + check-error "^1.0.3" + deep-eql "^4.1.3" + get-func-name "^2.0.2" + loupe "^2.3.6" + pathval "^1.1.1" + type-detect "^4.1.0" + +chai@^5.1.2: + version "5.1.2" + resolved "https://registry.npmjs.org/chai/-/chai-5.1.2.tgz" + integrity sha512-aGtmf24DW6MLHHG5gCx4zaI3uBq3KRtxeVs0DjFH6Z0rDNbsvTxFASFvdj79pxjxZ8/5u3PIiN3IwEIQkiiuPw== + dependencies: + assertion-error "^2.0.1" + check-error "^2.1.1" + deep-eql "^5.0.1" + loupe "^3.1.0" + pathval "^2.0.0" + +chalk@4.1.2, chalk@^4.0.2, chalk@^4.1.0, chalk@^4.1.1, chalk@^4.1.2: + version "4.1.2" + resolved "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz" + integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" + +chalk@^2.0.0, chalk@^2.3.1, chalk@^2.4.1, chalk@^2.4.2: + version "2.4.2" + resolved "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz" + integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== + dependencies: + ansi-styles "^3.2.1" + escape-string-regexp "^1.0.5" + supports-color "^5.3.0" + +chalk@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz" + integrity sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg== + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" + +chalk@^5.2.0, chalk@^5.3.0: + version "5.4.0" + resolved "https://registry.npmjs.org/chalk/-/chalk-5.4.0.tgz" + integrity sha512-ZkD35Mx92acjB2yNJgziGqT9oKHEOxjTBTDRpOsRWtdecL/0jM3z5kM/CTzHWvHIen1GvkM85p6TuFfDGfc8/Q== + +chalk@~5.3.0: + version "5.3.0" + resolved "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz" + integrity sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w== + +chardet@^0.4.0: + version "0.4.2" + resolved "https://registry.npmjs.org/chardet/-/chardet-0.4.2.tgz" + integrity sha512-j/Toj7f1z98Hh2cYo2BVr85EpIRWqUi7rtRSGxh/cqUjqrnJe9l9UE7IUGd2vQ2p+kSHLkSzObQPZPLUC6TQwg== + +chardet@^0.7.0: + version "0.7.0" + resolved "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz" + integrity sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA== + +check-error@^1.0.3: + version "1.0.3" + resolved "https://registry.npmjs.org/check-error/-/check-error-1.0.3.tgz" + integrity sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg== + dependencies: + get-func-name "^2.0.2" + +check-error@^2.1.1: + version "2.1.1" + resolved "https://registry.npmjs.org/check-error/-/check-error-2.1.1.tgz" + integrity sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw== + +cheerio-select@^2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/cheerio-select/-/cheerio-select-2.1.0.tgz" + integrity sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g== + dependencies: + boolbase "^1.0.0" + css-select "^5.1.0" + css-what "^6.1.0" + domelementtype "^2.3.0" + domhandler "^5.0.3" + domutils "^3.0.1" + +cheerio@^1.0.0-rc.10: + version "1.0.0" + resolved "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0.tgz" + integrity sha512-quS9HgjQpdaXOvsZz82Oz7uxtXiy6UIsIQcpBj7HRw2M63Skasm9qlDocAM7jNuaxdhpPU7c4kJN+gA5MCu4ww== + dependencies: + cheerio-select "^2.1.0" + dom-serializer "^2.0.0" + domhandler "^5.0.3" + domutils "^3.1.0" + encoding-sniffer "^0.2.0" + htmlparser2 "^9.1.0" + parse5 "^7.1.2" + parse5-htmlparser2-tree-adapter "^7.0.0" + parse5-parser-stream "^7.1.2" + undici "^6.19.5" + whatwg-mimetype "^4.0.0" + +chokidar@^3.6.0: + version "3.6.0" + resolved "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz" + integrity sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw== + dependencies: + anymatch "~3.1.2" + braces "~3.0.2" + glob-parent "~5.1.2" + is-binary-path "~2.1.0" + is-glob "~4.0.1" + normalize-path "~3.0.0" + readdirp "~3.6.0" + optionalDependencies: + fsevents "~2.3.2" + +chownr@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz" + integrity sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ== + +ci-info@^3.2.0: + version "3.9.0" + resolved "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz" + integrity sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ== + +ci-info@^4.0.0: + version "4.1.0" + resolved "https://registry.npmjs.org/ci-info/-/ci-info-4.1.0.tgz" + integrity sha512-HutrvTNsF48wnxkzERIXOe5/mlcfFcbfCmwcg6CJnizbSue78AbDt+1cgl26zwn61WFxhcPykPfZrbqjGmBb4A== + +clean-stack@^2.0.0: + version "2.2.0" + resolved "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz" + integrity sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A== + +clean-stack@^3.0.1: + version "3.0.1" + resolved "https://registry.npmjs.org/clean-stack/-/clean-stack-3.0.1.tgz" + integrity sha512-lR9wNiMRcVQjSB3a7xXGLuz4cr4wJuuXlaAEbRutGowQTmlp7R72/DOgN21e8jdwblMWl9UOJMJXarX94pzKdg== + dependencies: + escape-string-regexp "4.0.0" + +cli-boxes@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/cli-boxes/-/cli-boxes-3.0.0.tgz" + integrity sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g== + +cli-cursor@^2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz" + integrity sha512-8lgKz8LmCRYZZQDpRyT2m5rKJ08TnU4tR9FFFW2rxpxR1FzWi4PQ/NfyODchAatHaUgnSPVcx/R5w6NuTBzFiw== + dependencies: + restore-cursor "^2.0.0" + +cli-cursor@^3.1.0: + version "3.1.0" + resolved "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz" + integrity sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw== + dependencies: + restore-cursor "^3.1.0" + +cli-cursor@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/cli-cursor/-/cli-cursor-4.0.0.tgz" + integrity sha512-VGtlMu3x/4DOtIUwEkRezxUZ2lBacNJCHash0N0WeZDBS+7Ux1dm3XWAgWYxLJFMMdOeXMHXorshEFhbMSGelg== + dependencies: + restore-cursor "^4.0.0" + +cli-cursor@^5.0.0: + version "5.0.0" + resolved "https://registry.npmjs.org/cli-cursor/-/cli-cursor-5.0.0.tgz" + integrity sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw== + dependencies: + restore-cursor "^5.0.0" + +cli-spinners@^2.2.0, cli-spinners@^2.5.0, cli-spinners@^2.9.2: + version "2.9.2" + resolved "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.2.tgz" + integrity sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg== + +cli-table3@^0.6.0: + version "0.6.5" + resolved "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.5.tgz" + integrity sha512-+W/5efTR7y5HRD7gACw9yQjqMVvEMLBHmboM/kPWam+H+Hmyrgjh6YncVKK122YZkXrLudzTuAukUw9FnMf7IQ== + dependencies: + string-width "^4.2.0" + optionalDependencies: + "@colors/colors" "1.5.0" + +cli-truncate@^1.0.0: + version "1.1.0" + resolved "https://registry.npmjs.org/cli-truncate/-/cli-truncate-1.1.0.tgz" + integrity sha512-bAtZo0u82gCfaAGfSNxUdTI9mNyza7D8w4CVCcaOsy7sgwDzvx6ekr6cuWJqY3UGzgnQ1+4wgENup5eIhgxEYA== + dependencies: + slice-ansi "^1.0.0" + string-width "^2.0.0" + +cli-truncate@^3.1.0: + version "3.1.0" + resolved "https://registry.npmjs.org/cli-truncate/-/cli-truncate-3.1.0.tgz" + integrity sha512-wfOBkjXteqSnI59oPcJkcPl/ZmwvMMOj340qUIY1SKZCv0B9Cf4D4fAucRkIKQmsIuYK3x1rrgU7MeGRruiuiA== + dependencies: + slice-ansi "^5.0.0" + string-width "^5.0.0" + +cli-truncate@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/cli-truncate/-/cli-truncate-4.0.0.tgz" + integrity sha512-nPdaFdQ0h/GEigbPClz11D0v/ZJEwxmeVZGeMo3Z5StPtUTkA9o1lD6QwoirYiSDzbcwn2XcjwmCp68W1IS4TA== + dependencies: + slice-ansi "^5.0.0" + string-width "^7.0.0" + +cli-width@^2.0.0: + version "2.2.1" + resolved "https://registry.npmjs.org/cli-width/-/cli-width-2.2.1.tgz" + integrity sha512-GRMWDxpOB6Dgk2E5Uo+3eEBvtOOlimMmpbFiKuLFnQzYDavtLFY3K5ona41jgN/WdRZtG7utuVSVTL4HbZHGkw== + +cli-width@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/cli-width/-/cli-width-3.0.0.tgz" + integrity sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw== + +cli-width@^4.1.0: + version "4.1.0" + resolved "https://registry.npmjs.org/cli-width/-/cli-width-4.1.0.tgz" + integrity sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ== + +cliui@^8.0.1: + version "8.0.1" + resolved "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz" + integrity sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ== + dependencies: + string-width "^4.2.0" + strip-ansi "^6.0.1" + wrap-ansi "^7.0.0" + +clone-response@^1.0.2: + version "1.0.3" + resolved "https://registry.npmjs.org/clone-response/-/clone-response-1.0.3.tgz" + integrity sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA== + dependencies: + mimic-response "^1.0.0" + +clone@^1.0.2: + version "1.0.4" + resolved "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz" + integrity sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg== + +code-excerpt@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/code-excerpt/-/code-excerpt-4.0.0.tgz" + integrity sha512-xxodCmBen3iy2i0WtAK8FlFNrRzjUqjRsMfho58xT/wvZU1YTM3fCnRjcy1gJPMepaRlgm/0e6w8SpWHpn3/cA== + dependencies: + convert-to-spaces "^2.0.1" + +color-convert@^1.9.0, color-convert@^1.9.3: + version "1.9.3" + resolved "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz" + integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== + dependencies: + color-name "1.1.3" + +color-convert@^2.0.1: + version "2.0.1" + resolved "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz" + integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== + dependencies: + color-name "~1.1.4" + +color-name@1.1.3: + version "1.1.3" + resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz" + integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw== + +color-name@^1.0.0, color-name@^1.1.4, color-name@~1.1.4: + version "1.1.4" + resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz" + integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== + +color-string@^1.6.0: + version "1.9.1" + resolved "https://registry.npmjs.org/color-string/-/color-string-1.9.1.tgz" + integrity sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg== + dependencies: + color-name "^1.0.0" + simple-swizzle "^0.2.2" + +color@^3.1.3: + version "3.2.1" + resolved "https://registry.npmjs.org/color/-/color-3.2.1.tgz" + integrity sha512-aBl7dZI9ENN6fUGC7mWpMTPNHmWUSNan9tuWN6ahh5ZLNk9baLJOnSMlrQkHcrfFgz2/RigjUVAjdx36VcemKA== + dependencies: + color-convert "^1.9.3" + color-string "^1.6.0" + +colorette@^2.0.20: + version "2.0.20" + resolved "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz" + integrity sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w== + +colorspace@1.1.x: + version "1.1.4" + resolved "https://registry.npmjs.org/colorspace/-/colorspace-1.1.4.tgz" + integrity sha512-BgvKJiuVu1igBUF2kEjRCZXol6wiiGbY5ipL/oVPwm0BL9sIpMIzM8IK7vwuxIIzOXMV3Ey5w+vxhm0rR/TN8w== + dependencies: + color "^3.1.3" + text-hex "1.0.x" + +combined-stream@^1.0.8, combined-stream@~1.0.6: + version "1.0.8" + resolved "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz" + integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== + dependencies: + delayed-stream "~1.0.0" + +commander@12.0.0: + version "12.0.0" + resolved "https://registry.npmjs.org/commander/-/commander-12.0.0.tgz" + integrity sha512-MwVNWlYjDTtOjX5PiD7o5pK0UrFU/OYgcJfjjK4RaHZETNtjJqrZa9Y9ds88+A+f+d5lv+561eZ+yCKoS3gbAA== + +commander@^10.0.1: + version "10.0.1" + resolved "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz" + integrity sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug== + +commander@^11.1.0: + version "11.1.0" + resolved "https://registry.npmjs.org/commander/-/commander-11.1.0.tgz" + integrity sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ== + +commander@~12.1.0: + version "12.1.0" + resolved "https://registry.npmjs.org/commander/-/commander-12.1.0.tgz" + integrity sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA== + +commitizen-emoji@^1.0.5: + version "1.0.5" + resolved "https://registry.npmjs.org/commitizen-emoji/-/commitizen-emoji-1.0.5.tgz" + integrity sha512-kdnHltyW922+9vMChuKDsPnsfqRu4VUfQ2NNnYQLC3D+zpm9q9jhboyvSXDg4KbLi2pJrfR3Z+5j9fsJ8em51w== + dependencies: + cli-truncate "^1.0.0" + find-up "^5.0.0" + fuse.js "^3.4.5" + inquirer-autocomplete-prompt "^0.12.0" + inquirer-maxlength-input-prompt "^1.0.1" + node-fetch "^2.6.1" + pad "^2.3.0" + read-pkg-up "^7.0.1" + wrap-ansi "^3.0.0" + yup "^0.32.9" + +commitizen@^4.0.3, commitizen@^4.3.1: + version "4.3.1" + resolved "https://registry.npmjs.org/commitizen/-/commitizen-4.3.1.tgz" + integrity sha512-gwAPAVTy/j5YcOOebcCRIijn+mSjWJC+IYKivTu6aG8Ei/scoXgfsMRnuAk6b0GRste2J4NGxVdMN3ZpfNaVaw== + dependencies: + cachedir "2.3.0" + cz-conventional-changelog "3.3.0" + dedent "0.7.0" + detect-indent "6.1.0" + find-node-modules "^2.1.2" + find-root "1.1.0" + fs-extra "9.1.0" + glob "7.2.3" + inquirer "8.2.5" + is-utf8 "^0.2.1" + lodash "4.17.21" + minimist "1.2.7" + strip-bom "4.0.0" + strip-json-comments "3.1.1" + +compare-func@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/compare-func/-/compare-func-2.0.0.tgz" + integrity sha512-zHig5N+tPWARooBnb0Zx1MFcdfpyJrfTJ3Y5L+IFvUm8rM74hHz66z0gw0x4tijh5CorKkKUCnW82R2vmpeCRA== + dependencies: + array-ify "^1.0.0" + dot-prop "^5.1.0" + +component-emitter@^1.3.0: + version "1.3.1" + resolved "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.1.tgz" + integrity sha512-T0+barUSQRTUQASh8bx02dl+DhF54GtIDY13Y3m9oWTklKbb3Wv974meRpeZ3lp1JpLVECWWNHC4vaG2XHXouQ== + +compress-commons@^4.1.2: + version "4.1.2" + resolved "https://registry.npmjs.org/compress-commons/-/compress-commons-4.1.2.tgz" + integrity sha512-D3uMHtGc/fcO1Gt1/L7i1e33VOvD4A9hfQLP+6ewd+BvG/gQ84Yh4oftEhAdjSMgBgwGL+jsppT7JYNpo6MHHg== + dependencies: + buffer-crc32 "^0.2.13" + crc32-stream "^4.0.2" + normalize-path "^3.0.0" + readable-stream "^3.6.0" + +concat-map@0.0.1: + version "0.0.1" + resolved "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz" + integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== + +concat-stream@^1.5.2: + version "1.6.2" + resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.2.tgz#904bdf194cd3122fc675c77fc4ac3d4ff0fd1a34" + integrity sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw== + dependencies: + buffer-from "^1.0.0" + inherits "^2.0.3" + readable-stream "^2.2.2" + typedarray "^0.0.6" + +concurrently@^9.1.0: + version "9.1.0" + resolved "https://registry.npmjs.org/concurrently/-/concurrently-9.1.0.tgz" + integrity sha512-VxkzwMAn4LP7WyMnJNbHN5mKV9L2IbyDjpzemKr99sXNR3GqRNMMHdm7prV1ws9wg7ETj6WUkNOigZVsptwbgg== + dependencies: + chalk "^4.1.2" + lodash "^4.17.21" + rxjs "^7.8.1" + shell-quote "^1.8.1" + supports-color "^8.1.1" + tree-kill "^1.2.2" + yargs "^17.7.2" + +content-disposition@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/content-disposition/-/content-disposition-1.0.0.tgz" + integrity sha512-Au9nRL8VNUut/XSzbQA38+M78dzP4D+eqg3gfJHMIHHYa3bg067xj1KxMUWj+VULbiZMowKngFFbKczUrNJ1mg== + dependencies: + safe-buffer "5.2.1" + +content-type@^1.0.5, content-type@~1.0.4, content-type@~1.0.5: + version "1.0.5" + resolved "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz" + integrity sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA== + +conventional-changelog-angular@^7.0.0: + version "7.0.0" + resolved "https://registry.npmjs.org/conventional-changelog-angular/-/conventional-changelog-angular-7.0.0.tgz" + integrity sha512-ROjNchA9LgfNMTTFSIWPzebCwOGFdgkEq45EnvvrmSLvCtAw0HSmrCs7/ty+wAeYUZyNay0YMUNYFTRL72PkBQ== + dependencies: + compare-func "^2.0.0" + +conventional-commit-types@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/conventional-commit-types/-/conventional-commit-types-3.0.0.tgz" + integrity sha512-SmmCYnOniSsAa9GqWOeLqc179lfr5TRu5b4QFDkbsrJ5TZjPJx85wtOr3zn+1dbeNiXDKGPbZ72IKbPhLXh/Lg== + +conventional-commits-parser@^5.0.0: + version "5.0.0" + resolved "https://registry.npmjs.org/conventional-commits-parser/-/conventional-commits-parser-5.0.0.tgz" + integrity sha512-ZPMl0ZJbw74iS9LuX9YIAiW8pfM5p3yh2o/NbXHbkFuZzY5jvdi5jFycEOkmBW5H5I7nA+D6f3UcsCLP2vvSEA== + dependencies: + JSONStream "^1.3.5" + is-text-path "^2.0.0" + meow "^12.0.1" + split2 "^4.0.0" + +convert-source-map@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz" + integrity sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg== + +convert-to-spaces@^2.0.1: + version "2.0.1" + resolved "https://registry.npmjs.org/convert-to-spaces/-/convert-to-spaces-2.0.1.tgz" + integrity sha512-rcQ1bsQO9799wq24uE5AM2tAILy4gXGIK/njFWcVQkGNZ96edlpY+A7bjwvzjYvLDyzmG1MmMLZhpcsb+klNMQ== + +cookie-parser@^1.4.3, cookie-parser@^1.4.7: + version "1.4.7" + resolved "https://registry.npmjs.org/cookie-parser/-/cookie-parser-1.4.7.tgz" + integrity sha512-nGUvgXnotP3BsjiLX2ypbQnWoGUPIIfHQNZkkC668ntrzGWEZVW70HDEB1qnNGMicPje6EttlIgzo51YSwNQGw== + dependencies: + cookie "0.7.2" + cookie-signature "1.0.6" + +cookie-signature@1.0.6: + version "1.0.6" + resolved "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz" + integrity sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ== + +cookie-signature@1.0.7: + version "1.0.7" + resolved "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.7.tgz" + integrity sha512-NXdYc3dLr47pBkpUCHtKSwIOQXLVn8dZEuywboCOJY/osA0wFSLlSawr3KN8qXJEyX66FcONTH8EIlVuK0yyFA== + +cookie-signature@^1.2.1: + version "1.2.2" + resolved "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.2.2.tgz" + integrity sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg== + +cookie@0.7.1: + version "0.7.1" + resolved "https://registry.npmjs.org/cookie/-/cookie-0.7.1.tgz" + integrity sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w== + +cookie@0.7.2: + version "0.7.2" + resolved "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz" + integrity sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w== + +cookiejar@^2.1.4: + version "2.1.4" + resolved "https://registry.npmjs.org/cookiejar/-/cookiejar-2.1.4.tgz" + integrity sha512-LDx6oHrK+PhzLKJU9j5S7/Y3jM/mUHvD/DeI1WQmJn652iPC5Y4TBzC9l+5OMOXlyTTA+SmVUPm0HQUwpD5Jqw== + +core-util-is@1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz" + integrity sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ== + +core-util-is@~1.0.0: + version "1.0.3" + resolved "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz" + integrity sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ== + +cors@^2.8.5: + version "2.8.5" + resolved "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz" + integrity sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g== + dependencies: + object-assign "^4" + vary "^1" + +cosmiconfig-typescript-loader@^6.1.0: + version "6.1.0" + resolved "https://registry.npmjs.org/cosmiconfig-typescript-loader/-/cosmiconfig-typescript-loader-6.1.0.tgz" + integrity sha512-tJ1w35ZRUiM5FeTzT7DtYWAFFv37ZLqSRkGi2oeCK1gPhvaWjkAtfXvLmvE1pRfxxp9aQo6ba/Pvg1dKj05D4g== + dependencies: + jiti "^2.4.1" + +cosmiconfig@9.0.0, cosmiconfig@^9.0.0: + version "9.0.0" + resolved "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-9.0.0.tgz" + integrity sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg== + dependencies: + env-paths "^2.2.1" + import-fresh "^3.3.0" + js-yaml "^4.1.0" + parse-json "^5.2.0" + +crc-32@^1.2.0: + version "1.2.2" + resolved "https://registry.npmjs.org/crc-32/-/crc-32-1.2.2.tgz" + integrity sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ== + +crc32-stream@^4.0.2: + version "4.0.3" + resolved "https://registry.npmjs.org/crc32-stream/-/crc32-stream-4.0.3.tgz" + integrity sha512-NT7w2JVU7DFroFdYkeq8cywxrgjPHWkdX1wjpRQXPX5Asews3tA+Ght6lddQO5Mkumffp3X7GEqku3epj2toIw== + dependencies: + crc-32 "^1.2.0" + readable-stream "^3.4.0" + +cross-spawn@^7.0.0, cross-spawn@^7.0.3: + version "7.0.6" + resolved "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz" + integrity sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA== + dependencies: + path-key "^3.1.0" + shebang-command "^2.0.0" + which "^2.0.1" + +"crypto-js-3.1.9-1@npm:crypto-js@^3.1.9-1": + version "3.3.0" + resolved "https://registry.npmjs.org/crypto-js/-/crypto-js-3.3.0.tgz" + integrity sha512-DIT51nX0dCfKltpRiXV+/TVZq+Qq2NgF4644+K7Ttnla7zEzqc+kjJyiB96BHNyUTBxyjzRcZYpUdZa+QAqi6Q== + +crypto-js@^4.1.1: + version "4.2.0" + resolved "https://registry.npmjs.org/crypto-js/-/crypto-js-4.2.0.tgz" + integrity sha512-KALDyEYgpY+Rlob/iriUtjV6d5Eq+Y191A5g4UqLAi8CyGP9N1+FdVbkc1SxKc2r4YAYqG8JzO2KGL+AizD70Q== + +css-select@^5.1.0: + version "5.1.0" + resolved "https://registry.npmjs.org/css-select/-/css-select-5.1.0.tgz" + integrity sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg== + dependencies: + boolbase "^1.0.0" + css-what "^6.1.0" + domhandler "^5.0.2" + domutils "^3.0.1" + nth-check "^2.0.1" + +css-what@^6.1.0: + version "6.1.0" + resolved "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz" + integrity sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw== + +csv-parse@^4.16.3: + version "4.16.3" + resolved "https://registry.npmjs.org/csv-parse/-/csv-parse-4.16.3.tgz" + integrity sha512-cO1I/zmz4w2dcKHVvpCr7JVRu8/FymG5OEpmvsZYlccYolPBLoVGKUHgNoc4ZGkFeFlWGEDmMyBM+TTqRdW/wg== + +csv-parse@^5.5.6: + version "5.6.0" + resolved "https://registry.npmjs.org/csv-parse/-/csv-parse-5.6.0.tgz" + integrity sha512-l3nz3euub2QMg5ouu5U09Ew9Wf6/wQ8I++ch1loQ0ljmzhmfZYrH9fflS22i/PQEvsPvxCwxgz5q7UB8K1JO4Q== + +cz-conventional-changelog@3.3.0: + version "3.3.0" + resolved "https://registry.npmjs.org/cz-conventional-changelog/-/cz-conventional-changelog-3.3.0.tgz" + integrity sha512-U466fIzU5U22eES5lTNiNbZ+d8dfcHcssH4o7QsdWaCcRs/feIPCxKYSWkYBNs5mny7MvEfwpTLWjvbm94hecw== + dependencies: + chalk "^2.4.1" + commitizen "^4.0.3" + conventional-commit-types "^3.0.0" + lodash.map "^4.5.1" + longest "^2.0.1" + word-wrap "^1.0.3" + optionalDependencies: + "@commitlint/load" ">6.1.1" + +dargs@^8.0.0: + version "8.1.0" + resolved "https://registry.npmjs.org/dargs/-/dargs-8.1.0.tgz" + integrity sha512-wAV9QHOsNbwnWdNW2FYvE1P56wtgSbM+3SZcdGiWQILwVjACCXDCI3Ai8QlCjMDB8YK5zySiXZYBiwGmNY3lnw== + +dashdash@^1.12.0: + version "1.14.1" + resolved "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz" + integrity sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g== + dependencies: + assert-plus "^1.0.0" + +datadog-metrics@^0.9.3: + version "0.9.3" + resolved "https://registry.npmjs.org/datadog-metrics/-/datadog-metrics-0.9.3.tgz" + integrity sha512-BVsBX2t+4yA3tHs7DnB5H01cHVNiGJ/bHA8y6JppJDyXG7s2DLm6JaozPGpgsgVGd42Is1CHRG/yMDQpt877Xg== + dependencies: + debug "3.1.0" + dogapi "2.8.4" + +debug@2.6.9: + version "2.6.9" + resolved "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz" + integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== + dependencies: + ms "2.0.0" + +debug@3.1.0: + version "3.1.0" + resolved "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz" + integrity sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g== + dependencies: + ms "2.0.0" + +debug@4, debug@^4.0.1, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.3, debug@^4.3.4, debug@^4.3.5, debug@^4.3.7, debug@^4.4.0, debug@~4.4.0: + version "4.4.0" + resolved "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz" + integrity sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA== + dependencies: + ms "^2.1.3" + +debug@4.3.4: + version "4.3.4" + resolved "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz" + integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== + dependencies: + ms "2.1.2" + +debug@4.3.6: + version "4.3.6" + resolved "https://registry.npmjs.org/debug/-/debug-4.3.6.tgz" + integrity sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg== + dependencies: + ms "2.1.2" + +debug@~4.3.1, debug@~4.3.2: + version "4.3.7" + resolved "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz" + integrity sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ== + dependencies: + ms "^2.1.3" + +decomment@^0.9.5: + version "0.9.5" + resolved "https://registry.npmjs.org/decomment/-/decomment-0.9.5.tgz" + integrity sha512-h0TZ8t6Dp49duwyDHo3iw67mnh9/UpFiSSiOb5gDK1sqoXzrfX/SQxIUQd2R2QEiSnqib0KF2fnKnGfAhAs6lg== + dependencies: + esprima "4.0.1" + +decompress-response@^6.0.0: + version "6.0.0" + resolved "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz" + integrity sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ== + dependencies: + mimic-response "^3.1.0" + +dedent@0.7.0: + version "0.7.0" + resolved "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz" + integrity sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA== + +deep-eql@^4.1.3: + version "4.1.4" + resolved "https://registry.npmjs.org/deep-eql/-/deep-eql-4.1.4.tgz" + integrity sha512-SUwdGfqdKOwxCPeVYjwSyRpJ7Z+fhpwIAtmCUdZIWZ/YP5R9WAsyuSgpLVDi9bjWoN2LXHNss/dk3urXtdQxGg== + dependencies: + type-detect "^4.0.0" + +deep-eql@^5.0.1: + version "5.0.2" + resolved "https://registry.npmjs.org/deep-eql/-/deep-eql-5.0.2.tgz" + integrity sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q== + +deep-extend@^0.6.0: + version "0.6.0" + resolved "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz" + integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA== + +deep-for-each@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/deep-for-each/-/deep-for-each-3.0.0.tgz" + integrity sha512-pPN+0f8jlnNP+z90qqOdxGghJU5XM6oBDhvAR+qdQzjCg5pk/7VPPvKK1GqoXEFkHza6ZS+Otzzvmr0g3VUaKw== + dependencies: + lodash.isplainobject "^4.0.6" + +defaults@^1.0.3: + version "1.0.4" + resolved "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz" + integrity sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A== + dependencies: + clone "^1.0.2" + +defer-to-connect@^2.0.0: + version "2.0.1" + resolved "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.1.tgz" + integrity sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg== + +define-data-property@^1.1.4: + version "1.1.4" + resolved "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz" + integrity sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A== + dependencies: + es-define-property "^1.0.0" + es-errors "^1.3.0" + gopd "^1.0.1" + +define-lazy-prop@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz" + integrity sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og== + +delayed-stream@~1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz" + integrity sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ== + +depd@2.0.0, depd@~2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz" + integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw== + +dependency-tree@^10.0.9: + version "10.0.9" + resolved "https://registry.npmjs.org/dependency-tree/-/dependency-tree-10.0.9.tgz" + integrity sha512-dwc59FRIsht+HfnTVM0BCjJaEWxdq2YAvEDy4/Hn6CwS3CBWMtFnL3aZGAkQn3XCYxk/YcTDE4jX2Q7bFTwCjA== + dependencies: + commander "^10.0.1" + filing-cabinet "^4.1.6" + precinct "^11.0.5" + typescript "^5.0.4" + +destroy@1.2.0, destroy@^1.2.0: + version "1.2.0" + resolved "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz" + integrity sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg== + +detect-file@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/detect-file/-/detect-file-1.0.0.tgz" + integrity sha512-DtCOLG98P007x7wiiOmfI0fi3eIKyWiLTGJ2MDnVi/E04lWGbf+JzrRHMm0rgIIZJGtHpKpbVgLWHrv8xXpc3Q== + +detect-indent@6.1.0: + version "6.1.0" + resolved "https://registry.npmjs.org/detect-indent/-/detect-indent-6.1.0.tgz" + integrity sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA== + +detective-amd@^5.0.2: + version "5.0.2" + resolved "https://registry.npmjs.org/detective-amd/-/detective-amd-5.0.2.tgz" + integrity sha512-XFd/VEQ76HSpym80zxM68ieB77unNuoMwopU2TFT/ErUk5n4KvUTwW4beafAVUugrjV48l4BmmR0rh2MglBaiA== + dependencies: + ast-module-types "^5.0.0" + escodegen "^2.0.0" + get-amd-module-type "^5.0.1" + node-source-walk "^6.0.1" + +detective-cjs@^5.0.1: + version "5.0.1" + resolved "https://registry.npmjs.org/detective-cjs/-/detective-cjs-5.0.1.tgz" + integrity sha512-6nTvAZtpomyz/2pmEmGX1sXNjaqgMplhQkskq2MLrar0ZAIkHMrDhLXkRiK2mvbu9wSWr0V5/IfiTrZqAQMrmQ== + dependencies: + ast-module-types "^5.0.0" + node-source-walk "^6.0.0" + +detective-es6@^4.0.1: + version "4.0.1" + resolved "https://registry.npmjs.org/detective-es6/-/detective-es6-4.0.1.tgz" + integrity sha512-k3Z5tB4LQ8UVHkuMrFOlvb3GgFWdJ9NqAa2YLUU/jTaWJIm+JJnEh4PsMc+6dfT223Y8ACKOaC0qcj7diIhBKw== + dependencies: + node-source-walk "^6.0.1" + +detective-postcss@^6.1.3: + version "6.1.3" + resolved "https://registry.npmjs.org/detective-postcss/-/detective-postcss-6.1.3.tgz" + integrity sha512-7BRVvE5pPEvk2ukUWNQ+H2XOq43xENWbH0LcdCE14mwgTBEAMoAx+Fc1rdp76SmyZ4Sp48HlV7VedUnP6GA1Tw== + dependencies: + is-url "^1.2.4" + postcss "^8.4.23" + postcss-values-parser "^6.0.2" + +detective-sass@^5.0.3: + version "5.0.3" + resolved "https://registry.npmjs.org/detective-sass/-/detective-sass-5.0.3.tgz" + integrity sha512-YsYT2WuA8YIafp2RVF5CEfGhhyIVdPzlwQgxSjK+TUm3JoHP+Tcorbk3SfG0cNZ7D7+cYWa0ZBcvOaR0O8+LlA== + dependencies: + gonzales-pe "^4.3.0" + node-source-walk "^6.0.1" + +detective-scss@^4.0.3: + version "4.0.3" + resolved "https://registry.npmjs.org/detective-scss/-/detective-scss-4.0.3.tgz" + integrity sha512-VYI6cHcD0fLokwqqPFFtDQhhSnlFWvU614J42eY6G0s8c+MBhi9QAWycLwIOGxlmD8I/XvGSOUV1kIDhJ70ZPg== + dependencies: + gonzales-pe "^4.3.0" + node-source-walk "^6.0.1" + +detective-stylus@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/detective-stylus/-/detective-stylus-4.0.0.tgz" + integrity sha512-TfPotjhszKLgFBzBhTOxNHDsutIxx9GTWjrL5Wh7Qx/ydxKhwUrlSFeLIn+ZaHPF+h0siVBkAQSuy6CADyTxgQ== + +detective-typescript@^11.1.0: + version "11.2.0" + resolved "https://registry.npmjs.org/detective-typescript/-/detective-typescript-11.2.0.tgz" + integrity sha512-ARFxjzizOhPqs1fYC/2NMC3N4jrQ6HvVflnXBTRqNEqJuXwyKLRr9CrJwkRcV/SnZt1sNXgsF6FPm0x57Tq0rw== + dependencies: + "@typescript-eslint/typescript-estree" "^5.62.0" + ast-module-types "^5.0.0" + node-source-walk "^6.0.2" + typescript "^5.4.4" + +dezalgo@^1.0.4: + version "1.0.4" + resolved "https://registry.npmjs.org/dezalgo/-/dezalgo-1.0.4.tgz" + integrity sha512-rXSP0bf+5n0Qonsb+SVVfNfIsimO4HEtmnIpPHY8Q1UCzKlQrDMfdobr8nJOOsRgWCyMRqeSBQzmWUMq7zvVig== + dependencies: + asap "^2.0.0" + wrappy "1" + +diff@^4.0.1: + version "4.0.2" + resolved "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz" + integrity sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A== + +diff@^5.2.0: + version "5.2.0" + resolved "https://registry.npmjs.org/diff/-/diff-5.2.0.tgz" + integrity sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A== + +dir-glob@^3.0.1: + version "3.0.1" + resolved "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz" + integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA== + dependencies: + path-type "^4.0.0" + +dogapi@2.8.4, dogapi@^2.8.4: + version "2.8.4" + resolved "https://registry.npmjs.org/dogapi/-/dogapi-2.8.4.tgz" + integrity sha512-065fsvu5dB0o4+ENtLjZILvXMClDNH/yA9H6L8nsdcNiz9l0Hzpn7aQaCOPYXxqyzq4CRPOdwkFXUjDOXfRGbg== + dependencies: + extend "^3.0.2" + json-bigint "^1.0.0" + lodash "^4.17.21" + minimist "^1.2.5" + rc "^1.2.8" + +dom-serializer@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz" + integrity sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg== + dependencies: + domelementtype "^2.3.0" + domhandler "^5.0.2" + entities "^4.2.0" + +domelementtype@^2.3.0: + version "2.3.0" + resolved "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz" + integrity sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw== + +domhandler@^5.0.2, domhandler@^5.0.3: + version "5.0.3" + resolved "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz" + integrity sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w== + dependencies: + domelementtype "^2.3.0" + +domutils@^3.0.1, domutils@^3.1.0: + version "3.1.0" + resolved "https://registry.npmjs.org/domutils/-/domutils-3.1.0.tgz" + integrity sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA== + dependencies: + dom-serializer "^2.0.0" + domelementtype "^2.3.0" + domhandler "^5.0.3" + +dot-prop@^5.1.0: + version "5.3.0" + resolved "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz" + integrity sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q== + dependencies: + is-obj "^2.0.0" + +dotenv@^16.0.1, dotenv@^16.3.1, dotenv@^16.4.5: + version "16.4.7" + resolved "https://registry.npmjs.org/dotenv/-/dotenv-16.4.7.tgz" + integrity sha512-47qPchRCykZC03FhkYAhrvwU4xDBFIj1QPqaarj6mdM/hgUzfPHcpkHJOn3mJAufFeeAxAzeGsr5X0M4k6fLZQ== + +driftless@^2.0.3: + version "2.0.3" + resolved "https://registry.npmjs.org/driftless/-/driftless-2.0.3.tgz" + integrity sha512-hSDKsQphnL4O0XLAiyWQ8EiM9suXH0Qd4gMtwF86b5wygGV8r95w0JcA38FOmx9N3LjFCIHLG2winLPNken4Tg== + dependencies: + present "^0.0.3" + +dunder-proto@^1.0.0: + version "1.0.1" + resolved "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz" + integrity sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A== + dependencies: + call-bind-apply-helpers "^1.0.1" + es-errors "^1.3.0" + gopd "^1.2.0" + +eastasianwidth@^0.2.0: + version "0.2.0" + resolved "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz" + integrity sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA== + +ecc-jsbn@~0.1.1: + version "0.1.2" + resolved "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz" + integrity sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw== + dependencies: + jsbn "~0.1.0" + safer-buffer "^2.1.0" + +ecdsa-sig-formatter@1.0.11: + version "1.0.11" + resolved "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz" + integrity sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ== + dependencies: + safe-buffer "^5.0.1" + +eciesjs@^0.4.10: + version "0.4.12" + resolved "https://registry.npmjs.org/eciesjs/-/eciesjs-0.4.12.tgz" + integrity sha512-DGejvMCihsRAmKRFQiL6KZDE34vWVd0gvXlykFq1aEzJy/rD65AVyAIUZKZOvgvaP9ATQRcHGEZV5DfgrgjA4w== + dependencies: + "@ecies/ciphers" "^0.2.1" + "@noble/ciphers" "^1.0.0" + "@noble/curves" "^1.6.0" + "@noble/hashes" "^1.5.0" + +ee-first@1.1.1: + version "1.1.1" + resolved "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz" + integrity sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow== + +ejs@^3.1.10: + version "3.1.10" + resolved "https://registry.npmjs.org/ejs/-/ejs-3.1.10.tgz" + integrity sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA== + dependencies: + jake "^10.8.5" + +electron-to-chromium@^1.5.73: + version "1.5.74" + resolved "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.74.tgz" + integrity sha512-ck3//9RC+6oss/1Bh9tiAVFy5vfSKbRHAFh7Z3/eTRkEqJeWgymloShB17Vg3Z4nmDNp35vAd1BZ6CMW4Wt6Iw== + +emoji-regex@^10.3.0: + version "10.4.0" + resolved "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.4.0.tgz" + integrity sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw== + +emoji-regex@^8.0.0: + version "8.0.0" + resolved "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz" + integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== + +emoji-regex@^9.2.2: + version "9.2.2" + resolved "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz" + integrity sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg== + +enabled@2.0.x: + version "2.0.0" + resolved "https://registry.npmjs.org/enabled/-/enabled-2.0.0.tgz" + integrity sha512-AKrN98kuwOzMIdAizXGI86UFBoo26CL21UM763y1h/GMSJ4/OHU9k2YlsmBpyScFo/wbLzWQJBMCW4+IO3/+OQ== + +encodeurl@^2.0.0, encodeurl@~2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz" + integrity sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg== + +encodeurl@~1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz" + integrity sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w== + +encoding-sniffer@^0.2.0: + version "0.2.0" + resolved "https://registry.npmjs.org/encoding-sniffer/-/encoding-sniffer-0.2.0.tgz" + integrity sha512-ju7Wq1kg04I3HtiYIOrUrdfdDvkyO9s5XM8QAj/bN61Yo/Vb4vgJxy5vi4Yxk01gWHbrofpPtpxM8bKger9jhg== + dependencies: + iconv-lite "^0.6.3" + whatwg-encoding "^3.1.1" + +encoding@^0.1.13: + version "0.1.13" + resolved "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz" + integrity sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A== + dependencies: + iconv-lite "^0.6.2" + +end-of-stream@^1.1.0, end-of-stream@^1.4.1: + version "1.4.4" + resolved "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz" + integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q== + dependencies: + once "^1.4.0" + +engine.io-client@~6.6.1: + version "6.6.2" + resolved "https://registry.npmjs.org/engine.io-client/-/engine.io-client-6.6.2.tgz" + integrity sha512-TAr+NKeoVTjEVW8P3iHguO1LO6RlUz9O5Y8o7EY0fU+gY1NYqas7NN3slpFtbXEsLMHk0h90fJMfKjRkQ0qUIw== + dependencies: + "@socket.io/component-emitter" "~3.1.0" + debug "~4.3.1" + engine.io-parser "~5.2.1" + ws "~8.17.1" + xmlhttprequest-ssl "~2.1.1" + +engine.io-parser@~5.2.1: + version "5.2.3" + resolved "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.2.3.tgz" + integrity sha512-HqD3yTBfnBxIrbnM1DoD6Pcq8NECnh8d4As1Qgh0z5Gg3jRRIqijury0CL3ghu/edArpUYiYqQiDUQBIs4np3Q== + +enhanced-resolve@^5.14.1: + version "5.17.1" + resolved "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.17.1.tgz" + integrity sha512-LMHl3dXhTcfv8gM4kEzIUeTQ+7fpdA0l2tUf34BddXPkz2A5xJ5L/Pchd5BL6rdccM9QGvu0sWZzK1Z1t4wwyg== + dependencies: + graceful-fs "^4.2.4" + tapable "^2.2.0" + +ensure-posix-path@^1.0.0: + version "1.1.1" + resolved "https://registry.npmjs.org/ensure-posix-path/-/ensure-posix-path-1.1.1.tgz" + integrity sha512-VWU0/zXzVbeJNXvME/5EmLuEj2TauvoaTz6aFYK1Z92JCBlDlZ3Gu0tuGR42kpW1754ywTs+QB0g5TP0oj9Zaw== + +entities@^4.2.0, entities@^4.5.0: + version "4.5.0" + resolved "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz" + integrity sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw== + +env-paths@^2.2.0, env-paths@^2.2.1: + version "2.2.1" + resolved "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz" + integrity sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A== + +env-var@^7.5.0: + version "7.5.0" + resolved "https://registry.npmjs.org/env-var/-/env-var-7.5.0.tgz" + integrity sha512-mKZOzLRN0ETzau2W2QXefbFjo5EF4yWq28OyKb9ICdeNhHJlOE/pHHnz4hdYJ9cNZXcJHo5xN4OT4pzuSHSNvA== + +environment@^1.0.0: + version "1.1.0" + resolved "https://registry.npmjs.org/environment/-/environment-1.1.0.tgz" + integrity sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q== + +err-code@^2.0.2: + version "2.0.3" + resolved "https://registry.npmjs.org/err-code/-/err-code-2.0.3.tgz" + integrity sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA== + +error-ex@^1.3.1: + version "1.3.2" + resolved "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz" + integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== + dependencies: + is-arrayish "^0.2.1" + +es-define-property@^1.0.0, es-define-property@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz" + integrity sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g== + +es-errors@^1.3.0: + version "1.3.0" + resolved "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz" + integrity sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw== + +es-module-lexer@^1.5.4: + version "1.5.4" + resolved "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.5.4.tgz" + integrity sha512-MVNK56NiMrOwitFB7cqDwq0CQutbw+0BvLshJSse0MUNU+y1FC3bUS/AQg7oUng+/wKrrki7JfmwtVHkVfPLlw== + +es-object-atoms@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.0.0.tgz" + integrity sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw== + dependencies: + es-errors "^1.3.0" + +esbuild-wasm@^0.19.8: + version "0.19.12" + resolved "https://registry.npmjs.org/esbuild-wasm/-/esbuild-wasm-0.19.12.tgz" + integrity sha512-Zmc4hk6FibJZBcTx5/8K/4jT3/oG1vkGTEeKJUQFCUQKimD6Q7+adp/bdVQyYJFolMKaXkQnVZdV4O5ZaTYmyQ== + +esbuild@^0.21.3: + version "0.21.5" + resolved "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz" + integrity sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw== + optionalDependencies: + "@esbuild/aix-ppc64" "0.21.5" + "@esbuild/android-arm" "0.21.5" + "@esbuild/android-arm64" "0.21.5" + "@esbuild/android-x64" "0.21.5" + "@esbuild/darwin-arm64" "0.21.5" + "@esbuild/darwin-x64" "0.21.5" + "@esbuild/freebsd-arm64" "0.21.5" + "@esbuild/freebsd-x64" "0.21.5" + "@esbuild/linux-arm" "0.21.5" + "@esbuild/linux-arm64" "0.21.5" + "@esbuild/linux-ia32" "0.21.5" + "@esbuild/linux-loong64" "0.21.5" + "@esbuild/linux-mips64el" "0.21.5" + "@esbuild/linux-ppc64" "0.21.5" + "@esbuild/linux-riscv64" "0.21.5" + "@esbuild/linux-s390x" "0.21.5" + "@esbuild/linux-x64" "0.21.5" + "@esbuild/netbsd-x64" "0.21.5" + "@esbuild/openbsd-x64" "0.21.5" + "@esbuild/sunos-x64" "0.21.5" + "@esbuild/win32-arm64" "0.21.5" + "@esbuild/win32-ia32" "0.21.5" + "@esbuild/win32-x64" "0.21.5" + +esbuild@~0.23.0: + version "0.23.1" + resolved "https://registry.npmjs.org/esbuild/-/esbuild-0.23.1.tgz" + integrity sha512-VVNz/9Sa0bs5SELtn3f7qhJCDPCF5oMEl5cO9/SSinpE9hbPVvxbd572HH5AKiP7WD8INO53GgfDDhRjkylHEg== + optionalDependencies: + "@esbuild/aix-ppc64" "0.23.1" + "@esbuild/android-arm" "0.23.1" + "@esbuild/android-arm64" "0.23.1" + "@esbuild/android-x64" "0.23.1" + "@esbuild/darwin-arm64" "0.23.1" + "@esbuild/darwin-x64" "0.23.1" + "@esbuild/freebsd-arm64" "0.23.1" + "@esbuild/freebsd-x64" "0.23.1" + "@esbuild/linux-arm" "0.23.1" + "@esbuild/linux-arm64" "0.23.1" + "@esbuild/linux-ia32" "0.23.1" + "@esbuild/linux-loong64" "0.23.1" + "@esbuild/linux-mips64el" "0.23.1" + "@esbuild/linux-ppc64" "0.23.1" + "@esbuild/linux-riscv64" "0.23.1" + "@esbuild/linux-s390x" "0.23.1" + "@esbuild/linux-x64" "0.23.1" + "@esbuild/netbsd-x64" "0.23.1" + "@esbuild/openbsd-arm64" "0.23.1" + "@esbuild/openbsd-x64" "0.23.1" + "@esbuild/sunos-x64" "0.23.1" + "@esbuild/win32-arm64" "0.23.1" + "@esbuild/win32-ia32" "0.23.1" + "@esbuild/win32-x64" "0.23.1" + +escalade@^3.1.1, escalade@^3.2.0: + version "3.2.0" + resolved "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz" + integrity sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA== + +escape-html@^1.0.3, escape-html@~1.0.3: + version "1.0.3" + resolved "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz" + integrity sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow== + +escape-string-regexp@4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz" + integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== + +escape-string-regexp@^1.0.5: + version "1.0.5" + resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz" + integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg== + +escape-string-regexp@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz" + integrity sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w== + +escodegen@^2.0.0: + version "2.1.0" + resolved "https://registry.npmjs.org/escodegen/-/escodegen-2.1.0.tgz" + integrity sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w== + dependencies: + esprima "^4.0.1" + estraverse "^5.2.0" + esutils "^2.0.2" + optionalDependencies: + source-map "~0.6.1" + +eslint-visitor-keys@^3.3.0, eslint-visitor-keys@^3.4.1: + version "3.4.3" + resolved "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz" + integrity sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag== + +espree@^9.4.1: + version "9.6.1" + resolved "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz" + integrity sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ== + dependencies: + acorn "^8.9.0" + acorn-jsx "^5.3.2" + eslint-visitor-keys "^3.4.1" + +esprima@4.0.1, esprima@^4.0.0, esprima@^4.0.1: + version "4.0.1" + resolved "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz" + integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== + +estraverse@^5.2.0: + version "5.3.0" + resolved "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz" + integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== + +estree-walker@^3.0.3: + version "3.0.3" + resolved "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz" + integrity sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g== + dependencies: + "@types/estree" "^1.0.0" + +esutils@^2.0.2: + version "2.0.3" + resolved "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz" + integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== + +etag@^1.8.1, etag@~1.8.1: + version "1.8.1" + resolved "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz" + integrity sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg== + +eventemitter3@1.1.1: + version "1.1.1" + resolved "https://registry.npmjs.org/eventemitter3/-/eventemitter3-1.1.1.tgz" + integrity sha512-idmH3G0vJjQv2a5N74b+oXcOUKYBqSGJGN1eVV6ELGdUnesAO8RZsU74eaS3VfldRet8N9pFupxppBUKztrBdQ== + +eventemitter3@^4.0.4: + version "4.0.7" + resolved "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz" + integrity sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw== + +eventemitter3@^5.0.1: + version "5.0.1" + resolved "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.1.tgz" + integrity sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA== + +events-to-array@^2.0.3: + version "2.0.3" + resolved "https://registry.npmjs.org/events-to-array/-/events-to-array-2.0.3.tgz" + integrity sha512-f/qE2gImHRa4Cp2y1stEOSgw8wTFyUdVJX7G//bMwbaV9JqISFxg99NbmVQeP7YLnDUZ2un851jlaDrlpmGehQ== + +events@1.1.1: + version "1.1.1" + resolved "https://registry.npmjs.org/events/-/events-1.1.1.tgz" + integrity sha512-kEcvvCBByWXGnZy6JUlgAp2gBIUjfCAV6P6TgT1/aaQKcmuAEC4OZTV1I4EWQLz2gxZw76atuVyvHhTxvi0Flw== + +events@^3.0.0: + version "3.3.0" + resolved "https://registry.npmjs.org/events/-/events-3.3.0.tgz" + integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q== + +execa@^5.1.1: + version "5.1.1" + resolved "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz" + integrity sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg== + dependencies: + cross-spawn "^7.0.3" + get-stream "^6.0.0" + human-signals "^2.1.0" + is-stream "^2.0.0" + merge-stream "^2.0.0" + npm-run-path "^4.0.1" + onetime "^5.1.2" + signal-exit "^3.0.3" + strip-final-newline "^2.0.0" + +execa@~8.0.1: + version "8.0.1" + resolved "https://registry.npmjs.org/execa/-/execa-8.0.1.tgz" + integrity sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg== + dependencies: + cross-spawn "^7.0.3" + get-stream "^8.0.1" + human-signals "^5.0.0" + is-stream "^3.0.0" + merge-stream "^2.0.0" + npm-run-path "^5.1.0" + onetime "^6.0.0" + signal-exit "^4.1.0" + strip-final-newline "^3.0.0" + +expand-tilde@^2.0.0, expand-tilde@^2.0.2: + version "2.0.2" + resolved "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz" + integrity sha512-A5EmesHW6rfnZ9ysHQjPdJRni0SRar0tjtG5MNtm9n5TUvsYU8oozprtRD4AqHxcZWWlVuAmQo2nWKfN9oyjTw== + dependencies: + homedir-polyfill "^1.0.1" + +expect-type@^1.1.0: + version "1.1.0" + resolved "https://registry.npmjs.org/expect-type/-/expect-type-1.1.0.tgz" + integrity sha512-bFi65yM+xZgk+u/KRIpekdSYkTB5W1pEf0Lt8Q8Msh7b+eQ7LXVtIB1Bkm4fvclDEL1b2CZkMhv2mOeF8tMdkA== + +exponential-backoff@^3.1.1: + version "3.1.1" + resolved "https://registry.npmjs.org/exponential-backoff/-/exponential-backoff-3.1.1.tgz" + integrity sha512-dX7e/LHVJ6W3DE1MHWi9S1EYzDESENfLrYohG2G++ovZrYOkm4Knwa0mc1cn84xJOR4KEU0WSchhLbd0UklbHw== + +express-session@^1.18.1: + version "1.18.1" + resolved "https://registry.npmjs.org/express-session/-/express-session-1.18.1.tgz" + integrity sha512-a5mtTqEaZvBCL9A9aqkrtfz+3SMDhOVUnjafjo+s7A9Txkq+SVX2DLvSp1Zrv4uCXa3lMSK3viWnh9Gg07PBUA== + dependencies: + cookie "0.7.2" + cookie-signature "1.0.7" + debug "2.6.9" + depd "~2.0.0" + on-headers "~1.0.2" + parseurl "~1.3.3" + safe-buffer "5.2.1" + uid-safe "~2.1.5" + +express@5: + version "5.0.1" + resolved "https://registry.npmjs.org/express/-/express-5.0.1.tgz" + integrity sha512-ORF7g6qGnD+YtUG9yx4DFoqCShNMmUKiXuT5oWMHiOvt/4WFbHC6yCwQMTSBMno7AqntNCAzzcnnjowRkTL9eQ== + dependencies: + accepts "^2.0.0" + body-parser "^2.0.1" + content-disposition "^1.0.0" + content-type "~1.0.4" + cookie "0.7.1" + cookie-signature "^1.2.1" + debug "4.3.6" + depd "2.0.0" + encodeurl "~2.0.0" + escape-html "~1.0.3" + etag "~1.8.1" + finalhandler "^2.0.0" + fresh "2.0.0" + http-errors "2.0.0" + merge-descriptors "^2.0.0" + methods "~1.1.2" + mime-types "^3.0.0" + on-finished "2.4.1" + once "1.4.0" + parseurl "~1.3.3" + proxy-addr "~2.0.7" + qs "6.13.0" + range-parser "~1.2.1" + router "^2.0.0" + safe-buffer "5.2.1" + send "^1.1.0" + serve-static "^2.1.0" + setprototypeof "1.2.0" + statuses "2.0.1" + type-is "^2.0.0" + utils-merge "1.0.1" + vary "~1.1.2" + +extend@^3.0.2, extend@~3.0.2: + version "3.0.2" + resolved "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz" + integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== + +external-editor@^2.0.4, external-editor@^2.1.0: + version "2.2.0" + resolved "https://registry.npmjs.org/external-editor/-/external-editor-2.2.0.tgz" + integrity sha512-bSn6gvGxKt+b7+6TKEv1ZycHleA7aHhRHyAqJyp5pbUFuYYNIzpZnQDk7AsYckyWdEnTeAnay0aCy2aV6iTk9A== + dependencies: + chardet "^0.4.0" + iconv-lite "^0.4.17" + tmp "^0.0.33" + +external-editor@^3.0.3, external-editor@^3.1.0: + version "3.1.0" + resolved "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz" + integrity sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew== + dependencies: + chardet "^0.7.0" + iconv-lite "^0.4.24" + tmp "^0.0.33" + +extsprintf@1.3.0: + version "1.3.0" + resolved "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz" + integrity sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g== + +extsprintf@^1.2.0: + version "1.4.1" + resolved "https://registry.npmjs.org/extsprintf/-/extsprintf-1.4.1.tgz" + integrity sha512-Wrk35e8ydCKDj/ArClo1VrPVmN8zph5V4AtHwIuHhvMXsKf73UT3BOD+azBIW+3wOJ4FhEH7zyaJCFvChjYvMA== + +fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: + version "3.1.3" + resolved "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz" + integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== + +fast-glob@^3.2.9: + version "3.3.2" + resolved "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz" + integrity sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow== + dependencies: + "@nodelib/fs.stat" "^2.0.2" + "@nodelib/fs.walk" "^1.2.3" + glob-parent "^5.1.2" + merge2 "^1.3.0" + micromatch "^4.0.4" + +fast-json-stable-stringify@^2.0.0: + version "2.1.0" + resolved "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz" + integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== + +fast-levenshtein@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-3.0.0.tgz" + integrity sha512-hKKNajm46uNmTlhHSyZkmToAc56uZJwYq7yrciZjqOxnlfQwERDQJmHPUp7m1m9wx8vgOe8IaCKZ5Kv2k1DdCQ== + dependencies: + fastest-levenshtein "^1.0.7" + +fast-safe-stringify@^2.1.1: + version "2.1.1" + resolved "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz" + integrity sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA== + +fast-uri@^3.0.1: + version "3.0.3" + resolved "https://registry.npmjs.org/fast-uri/-/fast-uri-3.0.3.tgz" + integrity sha512-aLrHthzCjH5He4Z2H9YZ+v6Ujb9ocRuW6ZzkJQOrTxleEijANq4v1TsaPaVG1PZcuurEzrLcWRyYBYXD5cEiaw== + +fast-xml-parser@4.4.1: + version "4.4.1" + resolved "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-4.4.1.tgz" + integrity sha512-xkjOecfnKGkSsOwtZ5Pz7Us/T6mrbPQrq0nh+aCO5V9nk5NLWmasAHumTKjiPJPWANe+kAZ84Jc8ooJkzZ88Sw== + dependencies: + strnum "^1.0.5" + +fast-xml-parser@^4.4.1: + version "4.5.1" + resolved "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-4.5.1.tgz" + integrity sha512-y655CeyUQ+jj7KBbYMc4FG01V8ZQqjN+gDYGJ50RtfsUB8iG9AmwmwoAgeKLJdmueKKMrH1RJ7yXHTSoczdv5w== + dependencies: + strnum "^1.0.5" + +fastest-levenshtein@^1.0.7: + version "1.0.16" + resolved "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz" + integrity sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg== + +fastq@^1.6.0: + version "1.17.1" + resolved "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz" + integrity sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w== + dependencies: + reusify "^1.0.4" + +fdir@^6.2.0, fdir@^6.4.2: + version "6.4.2" + resolved "https://registry.npmjs.org/fdir/-/fdir-6.4.2.tgz" + integrity sha512-KnhMXsKSPZlAhp7+IjUkRZKPb4fUyccpDrdFXbi4QL1qkmFh9kVY09Yox+n4MaOb3lHZ1Tv829C3oaaXoMYPDQ== + +fecha@^4.2.0: + version "4.2.3" + resolved "https://registry.npmjs.org/fecha/-/fecha-4.2.3.tgz" + integrity sha512-OP2IUU6HeYKJi3i0z4A19kHMQoLVs4Hc+DPqqxI2h/DPZHTm/vjsfC6P0b4jCMy14XizLBqvndQ+UilD7707Jw== + +fflate@0.8.1: + version "0.8.1" + resolved "https://registry.npmjs.org/fflate/-/fflate-0.8.1.tgz" + integrity sha512-/exOvEuc+/iaUm105QIiOt4LpBdMTWsXxqR0HDF35vx3fmaKzw7354gTilCh5rkzEt8WYyG//ku3h3nRmd7CHQ== + +fflate@^0.8.2: + version "0.8.2" + resolved "https://registry.npmjs.org/fflate/-/fflate-0.8.2.tgz" + integrity sha512-cPJU47OaAoCbg0pBvzsgpTPhmhqI5eJjh/JIu8tPj5q+T7iLvW/JAYUqmE7KOB4R1ZyEhzBaIQpQpardBF5z8A== + +figures@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz" + integrity sha512-Oa2M9atig69ZkfwiApY8F2Yy+tzMbazyvqv21R0NsSC8floSOC09BbT1ITWAdoMGQvJ/aZnR1KMwdx9tvHnTNA== + dependencies: + escape-string-regexp "^1.0.5" + +figures@^3.0.0: + version "3.2.0" + resolved "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz" + integrity sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg== + dependencies: + escape-string-regexp "^1.0.5" + +file-uri-to-path@1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz" + integrity sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw== + +filelist@^1.0.4: + version "1.0.4" + resolved "https://registry.npmjs.org/filelist/-/filelist-1.0.4.tgz" + integrity sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q== + dependencies: + minimatch "^5.0.1" + +filing-cabinet@^4.1.6: + version "4.2.0" + resolved "https://registry.npmjs.org/filing-cabinet/-/filing-cabinet-4.2.0.tgz" + integrity sha512-YZ21ryzRcyqxpyKggdYSoXx//d3sCJzM3lsYoaeg/FyXdADGJrUl+BW1KIglaVLJN5BBcMtWylkygY8zBp2MrQ== + dependencies: + app-module-path "^2.2.0" + commander "^10.0.1" + enhanced-resolve "^5.14.1" + is-relative-path "^1.0.2" + module-definition "^5.0.1" + module-lookup-amd "^8.0.5" + resolve "^1.22.3" + resolve-dependency-path "^3.0.2" + sass-lookup "^5.0.1" + stylus-lookup "^5.0.1" + tsconfig-paths "^4.2.0" + typescript "^5.0.4" + +fill-range@^7.1.1: + version "7.1.1" + resolved "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz" + integrity sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg== + dependencies: + to-regex-range "^5.0.1" + +filtrex@^0.5.4: + version "0.5.4" + resolved "https://registry.npmjs.org/filtrex/-/filtrex-0.5.4.tgz" + integrity sha512-2phGAjWOYRf96Al6s+w/hMjObP1cRyQ95hoZApjeFO75DXN4Flh9uuUAtL3LI4fkryLa2QWdA8MArvt0GMU0pA== + +filtrex@^2.2.3: + version "2.2.3" + resolved "https://registry.npmjs.org/filtrex/-/filtrex-2.2.3.tgz" + integrity sha512-TL12R6SckvJdZLibXqyp4D//wXZNyCalVYGqaWwQk9zucq9dRxmrJV4oyuRq4PHFHCeV5ZdzncIc/Ybqv1Lr6Q== + +finalhandler@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/finalhandler/-/finalhandler-2.0.0.tgz" + integrity sha512-MX6Zo2adDViYh+GcxxB1dpO43eypOGUOL12rLCOTMQv/DfIbpSJUy4oQIIZhVZkH9e+bZWKMon0XHFEju16tkQ== + dependencies: + debug "2.6.9" + encodeurl "~1.0.2" + escape-html "~1.0.3" + on-finished "2.4.1" + parseurl "~1.3.3" + statuses "2.0.1" + unpipe "~1.0.0" + +find-node-modules@^2.1.2: + version "2.1.3" + resolved "https://registry.npmjs.org/find-node-modules/-/find-node-modules-2.1.3.tgz" + integrity sha512-UC2I2+nx1ZuOBclWVNdcnbDR5dlrOdVb7xNjmT/lHE+LsgztWks3dG7boJ37yTS/venXw84B/mAW9uHVoC5QRg== + dependencies: + findup-sync "^4.0.0" + merge "^2.1.1" + +find-root@1.1.0: + version "1.1.0" + resolved "https://registry.npmjs.org/find-root/-/find-root-1.1.0.tgz" + integrity sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng== + +find-up@^4.1.0: + version "4.1.0" + resolved "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz" + integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw== + dependencies: + locate-path "^5.0.0" + path-exists "^4.0.0" + +find-up@^5.0.0: + version "5.0.0" + resolved "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz" + integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== + dependencies: + locate-path "^6.0.0" + path-exists "^4.0.0" + +find-up@^7.0.0: + version "7.0.0" + resolved "https://registry.npmjs.org/find-up/-/find-up-7.0.0.tgz" + integrity sha512-YyZM99iHrqLKjmt4LJDj58KI+fYyufRLBSYcqycxf//KpBk9FoewoGX0450m9nB44qrZnovzC2oeP5hUibxc/g== + dependencies: + locate-path "^7.2.0" + path-exists "^5.0.0" + unicorn-magic "^0.1.0" + +findup-sync@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/findup-sync/-/findup-sync-4.0.0.tgz" + integrity sha512-6jvvn/12IC4quLBL1KNokxC7wWTvYncaVUYSoxWw7YykPLuRrnv4qdHcSOywOI5RpkOVGeQRtWM8/q+G6W6qfQ== + dependencies: + detect-file "^1.0.0" + is-glob "^4.0.0" + micromatch "^4.0.2" + resolve-dir "^1.0.1" + +flatted@^3.3.1: + version "3.3.2" + resolved "https://registry.npmjs.org/flatted/-/flatted-3.3.2.tgz" + integrity sha512-AiwGJM8YcNOaobumgtng+6NHuOqC3A7MixFeDafM3X9cIUM+xUXoS5Vfgf+OihAYe20fxqNM9yPBXJzRtZ/4eA== + +fn.name@1.x.x: + version "1.1.0" + resolved "https://registry.npmjs.org/fn.name/-/fn.name-1.1.0.tgz" + integrity sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw== + +follow-redirects@^1.14.9, follow-redirects@^1.15.6: + version "1.15.9" + resolved "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.9.tgz" + integrity sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ== + +for-each@^0.3.3: + version "0.3.3" + resolved "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz" + integrity sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw== + dependencies: + is-callable "^1.1.3" + +foreground-child@^3.1.0, foreground-child@^3.1.1: + version "3.3.0" + resolved "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.0.tgz" + integrity sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg== + dependencies: + cross-spawn "^7.0.0" + signal-exit "^4.0.1" + +forever-agent@~0.6.1: + version "0.6.1" + resolved "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz" + integrity sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw== + +form-data@^3.0.0: + version "3.0.2" + resolved "https://registry.npmjs.org/form-data/-/form-data-3.0.2.tgz" + integrity sha512-sJe+TQb2vIaIyO783qN6BlMYWMw3WBOHA1Ay2qxsnjuafEOQFJ2JakedOQirT6D5XPRxDvS7AHYyem9fTpb4LQ== + dependencies: + asynckit "^0.4.0" + combined-stream "^1.0.8" + mime-types "^2.1.12" + +form-data@^4.0.0: + version "4.0.1" + resolved "https://registry.npmjs.org/form-data/-/form-data-4.0.1.tgz" + integrity sha512-tzN8e4TX8+kkxGPK8D5u0FNmjPUjw3lwC9lSLxxoB/+GtsJG91CO8bSWy73APlgAZzZbXEYZJuxjkHH2w+Ezhw== + dependencies: + asynckit "^0.4.0" + combined-stream "^1.0.8" + mime-types "^2.1.12" + +formidable@^3.5.1: + version "3.5.2" + resolved "https://registry.npmjs.org/formidable/-/formidable-3.5.2.tgz" + integrity sha512-Jqc1btCy3QzRbJaICGwKcBfGWuLADRerLzDqi2NwSt/UkXLsHJw2TVResiaoBufHVHy9aSgClOHCeJsSsFLTbg== + dependencies: + dezalgo "^1.0.4" + hexoid "^2.0.0" + once "^1.4.0" + +forwarded@0.2.0: + version "0.2.0" + resolved "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz" + integrity sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow== + +fresh@2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/fresh/-/fresh-2.0.0.tgz" + integrity sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A== + +fresh@^0.5.2: + version "0.5.2" + resolved "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz" + integrity sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q== + +fromentries@^1.2.0: + version "1.3.2" + resolved "https://registry.npmjs.org/fromentries/-/fromentries-1.3.2.tgz" + integrity sha512-cHEpEQHUg0f8XdtZCc2ZAhrHzKzT0MrFUTcvx+hfxYu7rGMDc5SKoXFh+n4YigxsHXRzc6OrCshdR1bWH6HHyg== + +fs-constants@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz" + integrity sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow== + +fs-extra@9.1.0: + version "9.1.0" + resolved "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz" + integrity sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ== + dependencies: + at-least-node "^1.0.0" + graceful-fs "^4.2.0" + jsonfile "^6.0.1" + universalify "^2.0.0" + +fs-extra@^10.1.0: + version "10.1.0" + resolved "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz" + integrity sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ== + dependencies: + graceful-fs "^4.2.0" + jsonfile "^6.0.1" + universalify "^2.0.0" + +fs-minipass@^2.0.0: + version "2.1.0" + resolved "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz" + integrity sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg== + dependencies: + minipass "^3.0.0" + +fs-minipass@^3.0.0: + version "3.0.3" + resolved "https://registry.npmjs.org/fs-minipass/-/fs-minipass-3.0.3.tgz" + integrity sha512-XUBA9XClHbnJWSfBzjkm6RvPsyg3sryZt06BEQoXcF7EK/xpGaQYJgQKDJSUH5SGZ76Y7pFx1QBnXz09rU5Fbw== + dependencies: + minipass "^7.0.3" + +fs.realpath@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz" + integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== + +fsevents@2.3.2: + version "2.3.2" + resolved "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz" + integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== + +fsevents@2.3.3, fsevents@~2.3.2, fsevents@~2.3.3: + version "2.3.3" + resolved "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz" + integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw== + +function-bind@^1.1.2: + version "1.1.2" + resolved "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz" + integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA== + +function-loop@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/function-loop/-/function-loop-4.0.0.tgz" + integrity sha512-f34iQBedYF3XcI93uewZZOnyscDragxgTK/eTvVB74k3fCD0ZorOi5BV9GS4M8rz/JoNi0Kl3qX5Y9MH3S/CLQ== + +fuse.js@^3.4.5: + version "3.6.1" + resolved "https://registry.npmjs.org/fuse.js/-/fuse.js-3.6.1.tgz" + integrity sha512-hT9yh/tiinkmirKrlv4KWOjztdoZo1mx9Qh4KvWqC7isoXwdUY3PNWUxceF4/qO9R6riA2C29jdTOeQOIROjgw== + +gensync@^1.0.0-beta.2: + version "1.0.0-beta.2" + resolved "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz" + integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg== + +get-amd-module-type@^5.0.1: + version "5.0.1" + resolved "https://registry.npmjs.org/get-amd-module-type/-/get-amd-module-type-5.0.1.tgz" + integrity sha512-jb65zDeHyDjFR1loOVk0HQGM5WNwoGB8aLWy3LKCieMKol0/ProHkhO2X1JxojuN10vbz1qNn09MJ7tNp7qMzw== + dependencies: + ast-module-types "^5.0.0" + node-source-walk "^6.0.1" + +get-caller-file@^2.0.5: + version "2.0.5" + resolved "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz" + integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== + +get-east-asian-width@^1.0.0: + version "1.3.0" + resolved "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.3.0.tgz" + integrity sha512-vpeMIQKxczTD/0s2CdEWHcb0eeJe6TFjxb+J5xgX7hScxqrGuyjmv4c1D4A/gelKfyox0gJJwIHF+fLjeaM8kQ== + +get-func-name@^2.0.1, get-func-name@^2.0.2: + version "2.0.2" + resolved "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.2.tgz" + integrity sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ== + +get-intrinsic@^1.2.4, get-intrinsic@^1.2.5, get-intrinsic@^1.2.6: + version "1.2.6" + resolved "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.6.tgz" + integrity sha512-qxsEs+9A+u85HhllWJJFicJfPDhRmjzoYdl64aMWW9yRIJmSyxdn8IEkuIM530/7T+lv0TIHd8L6Q/ra0tEoeA== + dependencies: + call-bind-apply-helpers "^1.0.1" + dunder-proto "^1.0.0" + es-define-property "^1.0.1" + es-errors "^1.3.0" + es-object-atoms "^1.0.0" + function-bind "^1.1.2" + gopd "^1.2.0" + has-symbols "^1.1.0" + hasown "^2.0.2" + math-intrinsics "^1.0.0" + +get-own-enumerable-property-symbols@^3.0.0: + version "3.0.2" + resolved "https://registry.npmjs.org/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz" + integrity sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g== + +get-package-type@^0.1.0: + version "0.1.0" + resolved "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz" + integrity sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q== + +get-stream@^5.1.0: + version "5.2.0" + resolved "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz" + integrity sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA== + dependencies: + pump "^3.0.0" + +get-stream@^6.0.0: + version "6.0.1" + resolved "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz" + integrity sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg== + +get-stream@^8.0.1: + version "8.0.1" + resolved "https://registry.npmjs.org/get-stream/-/get-stream-8.0.1.tgz" + integrity sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA== + +get-tsconfig@^4.7.5: + version "4.8.1" + resolved "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.8.1.tgz" + integrity sha512-k9PN+cFBmaLWtVz29SkUoqU5O0slLuHJXt/2P+tMVFT+phsSGXGkp9t3rQIqdz0e+06EHNGs3oM6ZX1s2zHxRg== + dependencies: + resolve-pkg-maps "^1.0.0" + +getpass@^0.1.1: + version "0.1.7" + resolved "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz" + integrity sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng== + dependencies: + assert-plus "^1.0.0" + +git-raw-commits@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/git-raw-commits/-/git-raw-commits-4.0.0.tgz" + integrity sha512-ICsMM1Wk8xSGMowkOmPrzo2Fgmfo4bMHLNX6ytHjajRJUqvHOw/TFapQ+QG75c3X/tTDDhOSRPGC52dDbNM8FQ== + dependencies: + dargs "^8.0.0" + meow "^12.0.1" + split2 "^4.0.0" + +glob-parent@^5.1.2, glob-parent@~5.1.2: + version "5.1.2" + resolved "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz" + integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== + dependencies: + is-glob "^4.0.1" + +glob@7.2.3, glob@^7.1.3, glob@^7.1.4, glob@^7.2.3: + version "7.2.3" + resolved "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz" + integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.1.1" + once "^1.3.0" + path-is-absolute "^1.0.0" + +glob@^10.2.2, glob@^10.2.6, glob@^10.3.10, glob@^10.3.16, glob@^10.3.3, glob@^10.3.7, glob@^10.4.1: + version "10.4.5" + resolved "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz" + integrity sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg== + dependencies: + foreground-child "^3.1.0" + jackspeak "^3.1.2" + minimatch "^9.0.4" + minipass "^7.1.2" + package-json-from-dist "^1.0.0" + path-scurry "^1.11.1" + +global-directory@^4.0.1: + version "4.0.1" + resolved "https://registry.npmjs.org/global-directory/-/global-directory-4.0.1.tgz" + integrity sha512-wHTUcDUoZ1H5/0iVqEudYW4/kAlN5cZ3j/bXn0Dpbizl9iaUVeWSHqiOjsgk6OW2bkLclbBjzewBz6weQ1zA2Q== + dependencies: + ini "4.1.1" + +global-modules@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz" + integrity sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg== + dependencies: + global-prefix "^1.0.1" + is-windows "^1.0.1" + resolve-dir "^1.0.0" + +global-prefix@^1.0.1: + version "1.0.2" + resolved "https://registry.npmjs.org/global-prefix/-/global-prefix-1.0.2.tgz" + integrity sha512-5lsx1NUDHtSjfg0eHlmYvZKv8/nVqX4ckFbM+FrGcQ+04KWcWFo9P5MxPZYSzUvyzmdTbI7Eix8Q4IbELDqzKg== + dependencies: + expand-tilde "^2.0.2" + homedir-polyfill "^1.0.1" + ini "^1.3.4" + is-windows "^1.0.1" + which "^1.2.14" + +globals@^11.1.0: + version "11.12.0" + resolved "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz" + integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== + +globals@^15.14.0: + version "15.14.0" + resolved "https://registry.npmjs.org/globals/-/globals-15.14.0.tgz" + integrity sha512-OkToC372DtlQeje9/zHIo5CT8lRP/FUgEOKBEhU4e0abL7J7CD24fD9ohiLN5hagG/kWCYj4K5oaxxtj2Z0Dig== + +globby@^11.1.0: + version "11.1.0" + resolved "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz" + integrity sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g== + dependencies: + array-union "^2.1.0" + dir-glob "^3.0.1" + fast-glob "^3.2.9" + ignore "^5.2.0" + merge2 "^1.4.1" + slash "^3.0.0" + +gonzales-pe@^4.3.0: + version "4.3.0" + resolved "https://registry.npmjs.org/gonzales-pe/-/gonzales-pe-4.3.0.tgz" + integrity sha512-otgSPpUmdWJ43VXyiNgEYE4luzHCL2pz4wQ0OnDluC6Eg4Ko3Vexy/SrSynglw/eR+OhkzmqFCZa/OFa/RgAOQ== + dependencies: + minimist "^1.2.5" + +google-protobuf@3.6.1: + version "3.6.1" + resolved "https://registry.npmjs.org/google-protobuf/-/google-protobuf-3.6.1.tgz" + integrity sha512-SJYemeX5GjDLPnadcmCNQePQHCS4Hl5fOcI/JawqDIYFhCmrtYAjcx/oTQx/Wi8UuCuZQhfvftbmPePPAYHFtA== + +gopd@^1.0.1, gopd@^1.2.0: + version "1.2.0" + resolved "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz" + integrity sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg== + +got@^11.8.5: + version "11.8.6" + resolved "https://registry.npmjs.org/got/-/got-11.8.6.tgz" + integrity sha512-6tfZ91bOr7bOXnK7PRDCGBLa1H4U080YHNaAQ2KsMGlLEzRbk44nsZF2E1IeRc3vtJHPVbKCYgdFbaGO2ljd8g== + dependencies: + "@sindresorhus/is" "^4.0.0" + "@szmarczak/http-timer" "^4.0.5" + "@types/cacheable-request" "^6.0.1" + "@types/responselike" "^1.0.0" + cacheable-lookup "^5.0.3" + cacheable-request "^7.0.2" + decompress-response "^6.0.0" + http2-wrapper "^1.0.0-beta.5.2" + lowercase-keys "^2.0.0" + p-cancelable "^2.0.0" + responselike "^2.0.0" + +graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.4, graceful-fs@^4.2.6: + version "4.2.11" + resolved "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz" + integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== + +har-schema@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz" + integrity sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q== + +har-validator@~5.1.3: + version "5.1.5" + resolved "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz" + integrity sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w== + dependencies: + ajv "^6.12.3" + har-schema "^2.0.0" + +has-flag@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz" + integrity sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw== + +has-flag@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz" + integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== + +has-property-descriptors@^1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz" + integrity sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg== + dependencies: + es-define-property "^1.0.0" + +has-symbols@^1.0.3, has-symbols@^1.1.0: + version "1.1.0" + resolved "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz" + integrity sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ== + +has-tostringtag@^1.0.0, has-tostringtag@^1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz" + integrity sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw== + dependencies: + has-symbols "^1.0.3" + +hasown@^2.0.2: + version "2.0.2" + resolved "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz" + integrity sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ== + dependencies: + function-bind "^1.1.2" + +helmet@^8.0.0: + version "8.0.0" + resolved "https://registry.npmjs.org/helmet/-/helmet-8.0.0.tgz" + integrity sha512-VyusHLEIIO5mjQPUI1wpOAEu+wl6Q0998jzTxqUYGE45xCIcAxy3MsbEK/yyJUJ3ADeMoB6MornPH6GMWAf+Pw== + +hex2dec@1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/hex2dec/-/hex2dec-1.0.1.tgz" + integrity sha512-F9QO0+ZI8r1VZudxw21bD/U5pb2Y9LZY3TsnVqCPaijvw5mIhH5jsH29acLPijl5fECfD8FetJtgX8GN5YPM9Q== + +hexoid@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/hexoid/-/hexoid-2.0.0.tgz" + integrity sha512-qlspKUK7IlSQv2o+5I7yhUd7TxlOG2Vr5LTa3ve2XSNVKAL/n/u/7KLvKmFNimomDIKvZFXWHv0T12mv7rT8Aw== + +homedir-polyfill@^1.0.1: + version "1.0.3" + resolved "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz" + integrity sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA== + dependencies: + parse-passwd "^1.0.0" + +hosted-git-info@^2.1.4: + version "2.8.9" + resolved "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz" + integrity sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw== + +hosted-git-info@^7.0.0: + version "7.0.2" + resolved "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-7.0.2.tgz" + integrity sha512-puUZAUKT5m8Zzvs72XWy3HtvVbTWljRE66cP60bxJzAqf2DgICo7lYTY2IHUmLnNpjYvw5bvmoHvPc0QO2a62w== + dependencies: + lru-cache "^10.0.1" + +hot-shots@^6.0.1: + version "6.8.7" + resolved "https://registry.npmjs.org/hot-shots/-/hot-shots-6.8.7.tgz" + integrity sha512-XH8iezBSZgVw2jegu96pUfF1Zv0VZ/iXjb7L5yE3F7mn7/bdhf4qeniXjO0wQWeefe433rhOsazNKLxM+XMI9w== + optionalDependencies: + unix-dgram "2.0.x" + +hpagent@^0.1.1: + version "0.1.2" + resolved "https://registry.npmjs.org/hpagent/-/hpagent-0.1.2.tgz" + integrity sha512-ePqFXHtSQWAFXYmj+JtOTHr84iNrII4/QRlAAPPE+zqnKy4xJo7Ie1Y4kC7AdB+LxLxSTTzBMASsEcy0q8YyvQ== + +html-escaper@^2.0.0: + version "2.0.2" + resolved "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz" + integrity sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg== + +htmlparser2@^9.1.0: + version "9.1.0" + resolved "https://registry.npmjs.org/htmlparser2/-/htmlparser2-9.1.0.tgz" + integrity sha512-5zfg6mHUoaer/97TxnGpxmbR7zJtPwIYFMZ/H5ucTlPZhKvtum05yiPK3Mgai3a0DyVxv7qYqoweaEd2nrYQzQ== + dependencies: + domelementtype "^2.3.0" + domhandler "^5.0.3" + domutils "^3.1.0" + entities "^4.5.0" + +http-cache-semantics@^4.0.0, http-cache-semantics@^4.1.1: + version "4.1.1" + resolved "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz" + integrity sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ== + +http-errors@2.0.0, http-errors@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz" + integrity sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ== + dependencies: + depd "2.0.0" + inherits "2.0.4" + setprototypeof "1.2.0" + statuses "2.0.1" + toidentifier "1.0.1" + +http-proxy-agent@^7.0.0: + version "7.0.2" + resolved "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz" + integrity sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig== + dependencies: + agent-base "^7.1.0" + debug "^4.3.4" + +http-signature@~1.3.1: + version "1.3.6" + resolved "https://registry.npmjs.org/http-signature/-/http-signature-1.3.6.tgz" + integrity sha512-3adrsD6zqo4GsTqtO7FyrejHNv+NgiIfAfv68+jVlFmSr9OGy7zrxONceFRLKvnnZA5jbxQBX1u9PpB6Wi32Gw== + dependencies: + assert-plus "^1.0.0" + jsprim "^2.0.2" + sshpk "^1.14.1" + +http2-wrapper@^1.0.0-beta.5.2: + version "1.0.3" + resolved "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-1.0.3.tgz" + integrity sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg== + dependencies: + quick-lru "^5.1.1" + resolve-alpn "^1.0.0" + +https-proxy-agent@5.0.0: + version "5.0.0" + resolved "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz" + integrity sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA== + dependencies: + agent-base "6" + debug "4" + +https-proxy-agent@^5.0.0: + version "5.0.1" + resolved "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz" + integrity sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA== + dependencies: + agent-base "6" + debug "4" + +https-proxy-agent@^7.0.0, https-proxy-agent@^7.0.1, https-proxy-agent@^7.0.2: + version "7.0.6" + resolved "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz" + integrity sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw== + dependencies: + agent-base "^7.1.2" + debug "4" + +human-signals@^2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz" + integrity sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw== + +human-signals@^5.0.0: + version "5.0.0" + resolved "https://registry.npmjs.org/human-signals/-/human-signals-5.0.0.tgz" + integrity sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ== + +humanize-ms@^1.2.1: + version "1.2.1" + resolved "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz" + integrity sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ== + dependencies: + ms "^2.0.0" + +husky@^9.1.7: + version "9.1.7" + resolved "https://registry.npmjs.org/husky/-/husky-9.1.7.tgz" + integrity sha512-5gs5ytaNjBrh5Ow3zrvdUUY+0VxIuWVL4i9irt6friV+BqdCfmV11CQTWMiBYWHbXhco+J1kHfTOUkePhCDvMA== + +iconv-lite@0.5.2: + version "0.5.2" + resolved "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.5.2.tgz" + integrity sha512-kERHXvpSaB4aU3eANwidg79K8FlrN77m8G9V+0vOR3HYaRifrlwMEpT7ZBJqLSEIHnEgJTHcWK82wwLwwKwtag== + dependencies: + safer-buffer ">= 2.1.2 < 3" + +iconv-lite@0.6.3, iconv-lite@^0.6.2, iconv-lite@^0.6.3: + version "0.6.3" + resolved "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz" + integrity sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw== + dependencies: + safer-buffer ">= 2.1.2 < 3.0.0" + +iconv-lite@^0.4.17, iconv-lite@^0.4.24: + version "0.4.24" + resolved "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz" + integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== + dependencies: + safer-buffer ">= 2.1.2 < 3" + +ieee754@1.1.13: + version "1.1.13" + resolved "https://registry.npmjs.org/ieee754/-/ieee754-1.1.13.tgz" + integrity sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg== + +ieee754@^1.1.13, ieee754@^1.1.4: + version "1.2.1" + resolved "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz" + integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== + +ignore-walk@^6.0.4: + version "6.0.5" + resolved "https://registry.npmjs.org/ignore-walk/-/ignore-walk-6.0.5.tgz" + integrity sha512-VuuG0wCnjhnylG1ABXT3dAuIpTNDs/G8jlpmwXY03fXoXy/8ZK8/T+hMzt8L4WnrLCJgdybqgPagnF/f97cg3A== + dependencies: + minimatch "^9.0.0" + +ignore@^5.2.0, ignore@^5.3.0: + version "5.3.2" + resolved "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz" + integrity sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g== + +import-fresh@^3.3.0: + version "3.3.0" + resolved "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz" + integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== + dependencies: + parent-module "^1.0.0" + resolve-from "^4.0.0" + +import-meta-resolve@^4.0.0: + version "4.1.0" + resolved "https://registry.npmjs.org/import-meta-resolve/-/import-meta-resolve-4.1.0.tgz" + integrity sha512-I6fiaX09Xivtk+THaMfAwnA3MVA5Big1WHF1Dfx9hFuvNIWpXnorlkzhcQf6ehrqQiiZECRt1poOAkPmer3ruw== + +imurmurhash@^0.1.4: + version "0.1.4" + resolved "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz" + integrity sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA== + +indent-string@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz" + integrity sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg== + +indent-string@^5.0.0: + version "5.0.0" + resolved "https://registry.npmjs.org/indent-string/-/indent-string-5.0.0.tgz" + integrity sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg== + +inflight@^1.0.4: + version "1.0.6" + resolved "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz" + integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA== + dependencies: + once "^1.3.0" + wrappy "1" + +inherits@2, inherits@2.0.4, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.3: + version "2.0.4" + resolved "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz" + integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== + +inherits@2.0.3: + version "2.0.3" + resolved "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz" + integrity sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw== + +ini@4.1.1: + version "4.1.1" + resolved "https://registry.npmjs.org/ini/-/ini-4.1.1.tgz" + integrity sha512-QQnnxNyfvmHFIsj7gkPcYymR8Jdw/o7mp5ZFihxn6h8Ci6fh3Dx4E1gPjpQEpIuPo9XVNY/ZUwh4BPMjGyL01g== + +ini@^1.3.4, ini@~1.3.0: + version "1.3.8" + resolved "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz" + integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew== + +ini@^4.1.3: + version "4.1.3" + resolved "https://registry.npmjs.org/ini/-/ini-4.1.3.tgz" + integrity sha512-X7rqawQBvfdjS10YU1y1YVreA3SsLrW9dX2CewP2EbBJM4ypVNLDkO5y04gejPwKIY9lR+7r9gn3rFPt/kmWFg== + +ink@^4.4.1: + version "4.4.1" + resolved "https://registry.npmjs.org/ink/-/ink-4.4.1.tgz" + integrity sha512-rXckvqPBB0Krifk5rn/5LvQGmyXwCUpBfmTwbkQNBY9JY8RSl3b8OftBNEYxg4+SWUhEKcPifgope28uL9inlA== + dependencies: + "@alcalzone/ansi-tokenize" "^0.1.3" + ansi-escapes "^6.0.0" + auto-bind "^5.0.1" + chalk "^5.2.0" + cli-boxes "^3.0.0" + cli-cursor "^4.0.0" + cli-truncate "^3.1.0" + code-excerpt "^4.0.0" + indent-string "^5.0.0" + is-ci "^3.0.1" + is-lower-case "^2.0.2" + is-upper-case "^2.0.2" + lodash "^4.17.21" + patch-console "^2.0.0" + react-reconciler "^0.29.0" + scheduler "^0.23.0" + signal-exit "^3.0.7" + slice-ansi "^6.0.0" + stack-utils "^2.0.6" + string-width "^5.1.2" + type-fest "^0.12.0" + widest-line "^4.0.1" + wrap-ansi "^8.1.0" + ws "^8.12.0" + yoga-wasm-web "~0.3.3" + +inquirer-autocomplete-prompt@^0.12.0: + version "0.12.2" + resolved "https://registry.npmjs.org/inquirer-autocomplete-prompt/-/inquirer-autocomplete-prompt-0.12.2.tgz" + integrity sha512-XbgPlnFdAboyUYWIrOkV8vh426BVZWzvbIKRkNY/aCvKhoCSWOO6ZQagAEOGA5ff2iOboNEaT1Wa/cM9ekj8jw== + dependencies: + ansi-escapes "^3.0.0" + chalk "^2.0.0" + figures "^2.0.0" + inquirer "3.2.0" + run-async "^2.3.0" + +inquirer-maxlength-input-prompt@^1.0.1: + version "1.0.2" + resolved "https://registry.npmjs.org/inquirer-maxlength-input-prompt/-/inquirer-maxlength-input-prompt-1.0.2.tgz" + integrity sha512-bRs4PfQ7k+M3dDGadFo4//PlEYwWV/tKMNHV0m1jVHSGocyLvlRLuWrNgDuVAmXiEydM5QgfEEP7hbWNtgv0oA== + dependencies: + chalk "^2.3.1" + inquirer "^5.1.0" + lodash.invoke "^4.5.2" + lodash.isfunction "^3.0.9" + lodash.partialright "^4.2.1" + +inquirer@3.2.0: + version "3.2.0" + resolved "https://registry.npmjs.org/inquirer/-/inquirer-3.2.0.tgz" + integrity sha512-4CyUYMP7lOBkiUU1rR24WGrfRX6SucwbY2Mqb1PdApU24wnTIk4TsnkQwV72dDdIKZ2ycLP+fWCV+tA7wwgoew== + dependencies: + ansi-escapes "^2.0.0" + chalk "^2.0.0" + cli-cursor "^2.1.0" + cli-width "^2.0.0" + external-editor "^2.0.4" + figures "^2.0.0" + lodash "^4.3.0" + mute-stream "0.0.7" + run-async "^2.2.0" + rx-lite "^4.0.8" + rx-lite-aggregates "^4.0.8" + string-width "^2.1.0" + strip-ansi "^4.0.0" + through "^2.3.6" + +inquirer@8.2.5: + version "8.2.5" + resolved "https://registry.npmjs.org/inquirer/-/inquirer-8.2.5.tgz" + integrity sha512-QAgPDQMEgrDssk1XiwwHoOGYF9BAbUcc1+j+FhEvaOt8/cKRqyLn0U5qA6F74fGhTMGxf92pOvPBeh29jQJDTQ== + dependencies: + ansi-escapes "^4.2.1" + chalk "^4.1.1" + cli-cursor "^3.1.0" + cli-width "^3.0.0" + external-editor "^3.0.3" + figures "^3.0.0" + lodash "^4.17.21" + mute-stream "0.0.8" + ora "^5.4.1" + run-async "^2.4.0" + rxjs "^7.5.5" + string-width "^4.1.0" + strip-ansi "^6.0.0" + through "^2.3.6" + wrap-ansi "^7.0.0" + +inquirer@^12.2.0: + version "12.2.0" + resolved "https://registry.npmjs.org/inquirer/-/inquirer-12.2.0.tgz" + integrity sha512-CI0yGbyd5SS4vP7i180S9i95yI+M3ONaljfLBlNS1IIIZ7n+xbH76WzHkIHj253huRiXaKQZl8zijOl0Y0mjqg== + dependencies: + "@inquirer/core" "^10.1.1" + "@inquirer/prompts" "^7.2.0" + "@inquirer/type" "^3.0.1" + ansi-escapes "^4.3.2" + mute-stream "^2.0.0" + run-async "^3.0.0" + rxjs "^7.8.1" + +inquirer@^5.1.0: + version "5.2.0" + resolved "https://registry.npmjs.org/inquirer/-/inquirer-5.2.0.tgz" + integrity sha512-E9BmnJbAKLPGonz0HeWHtbKf+EeSP93paWO3ZYoUpq/aowXvYGjjCSuashhXPpzbArIjBbji39THkxTz9ZeEUQ== + dependencies: + ansi-escapes "^3.0.0" + chalk "^2.0.0" + cli-cursor "^2.1.0" + cli-width "^2.0.0" + external-editor "^2.1.0" + figures "^2.0.0" + lodash "^4.3.0" + mute-stream "0.0.7" + run-async "^2.2.0" + rxjs "^5.5.2" + string-width "^2.1.0" + strip-ansi "^4.0.0" + through "^2.3.6" + +ip-address@^9.0.5: + version "9.0.5" + resolved "https://registry.npmjs.org/ip-address/-/ip-address-9.0.5.tgz" + integrity sha512-zHtQzGojZXTwZTHQqra+ETKd4Sn3vgi7uBmlPoXVWZqYvuKmtI0l/VZTjqGmJY9x88GGOaZ9+G9ES8hC4T4X8g== + dependencies: + jsbn "1.1.0" + sprintf-js "^1.1.3" + +ipaddr.js@1.9.1: + version "1.9.1" + resolved "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz" + integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g== + +is-actual-promise@^1.0.1: + version "1.0.2" + resolved "https://registry.npmjs.org/is-actual-promise/-/is-actual-promise-1.0.2.tgz" + integrity sha512-xsFiO1of0CLsQnPZ1iXHNTyR9YszOeWKYv+q6n8oSFW3ipooFJ1j1lbRMgiMCr+pp2gLruESI4zb5Ak6eK5OnQ== + +is-arguments@^1.0.4: + version "1.2.0" + resolved "https://registry.npmjs.org/is-arguments/-/is-arguments-1.2.0.tgz" + integrity sha512-7bVbi0huj/wrIAOzb8U1aszg9kdi3KN/CyU19CTI7tAoZYEZoL9yCDXpbXN+uPsuWnP02cyug1gleqq+TU+YCA== + dependencies: + call-bound "^1.0.2" + has-tostringtag "^1.0.2" + +is-arrayish@^0.2.1: + version "0.2.1" + resolved "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz" + integrity sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg== + +is-arrayish@^0.3.1: + version "0.3.2" + resolved "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz" + integrity sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ== + +is-binary-path@~2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz" + integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== + dependencies: + binary-extensions "^2.0.0" + +is-callable@^1.1.3: + version "1.2.7" + resolved "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz" + integrity sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA== + +is-ci@^3.0.1: + version "3.0.1" + resolved "https://registry.npmjs.org/is-ci/-/is-ci-3.0.1.tgz" + integrity sha512-ZYvCgrefwqoQ6yTyYUbQu64HsITZ3NfKX1lzaEYdkTDcfKzzCI/wthRRYKkdjHKFVgNiXKAKm65Zo1pk2as/QQ== + dependencies: + ci-info "^3.2.0" + +is-core-module@^2.16.0: + version "2.16.0" + resolved "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.0.tgz" + integrity sha512-urTSINYfAYgcbLb0yDQ6egFm6h3Mo1DcF9EkyXSRjjzdHbsulg01qhwWuXdOoUBuTkbQ80KDboXa0vFJ+BDH+g== + dependencies: + hasown "^2.0.2" + +is-docker@^2.0.0, is-docker@^2.1.1: + version "2.2.1" + resolved "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz" + integrity sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ== + +is-extglob@^2.1.1: + version "2.1.1" + resolved "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz" + integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== + +is-fullwidth-code-point@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz" + integrity sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w== + +is-fullwidth-code-point@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz" + integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== + +is-fullwidth-code-point@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-4.0.0.tgz" + integrity sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ== + +is-fullwidth-code-point@^5.0.0: + version "5.0.0" + resolved "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-5.0.0.tgz" + integrity sha512-OVa3u9kkBbw7b8Xw5F9P+D/T9X+Z4+JruYVNapTjPYZYUznQ5YfWeFkOj606XYYW8yugTfC8Pj0hYqvi4ryAhA== + dependencies: + get-east-asian-width "^1.0.0" + +is-generator-function@^1.0.7: + version "1.0.10" + resolved "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz" + integrity sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A== + dependencies: + has-tostringtag "^1.0.0" + +is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3, is-glob@~4.0.1: + version "4.0.3" + resolved "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz" + integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== + dependencies: + is-extglob "^2.1.1" + +is-interactive@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz" + integrity sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w== + +is-lambda@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/is-lambda/-/is-lambda-1.0.1.tgz" + integrity sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ== + +is-lower-case@^2.0.2: + version "2.0.2" + resolved "https://registry.npmjs.org/is-lower-case/-/is-lower-case-2.0.2.tgz" + integrity sha512-bVcMJy4X5Og6VZfdOZstSexlEy20Sr0k/p/b2IlQJlfdKAQuMpiv5w2Ccxb8sKdRUNAG1PnHVHjFSdRDVS6NlQ== + dependencies: + tslib "^2.0.3" + +is-number@^7.0.0: + version "7.0.0" + resolved "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz" + integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== + +is-obj@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz" + integrity sha512-l4RyHgRqGN4Y3+9JHVrNqO+tN0rV5My76uW5/nuO4K1b6vw5G8d/cmFjP9tRfEsdhZNt0IFdZuK/c2Vr4Nb+Qg== + +is-obj@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz" + integrity sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w== + +is-plain-object@5.0.0: + version "5.0.0" + resolved "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz" + integrity sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q== + +is-promise@4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/is-promise/-/is-promise-4.0.0.tgz" + integrity sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ== + +is-regexp@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/is-regexp/-/is-regexp-1.0.0.tgz" + integrity sha512-7zjFAPO4/gwyQAAgRRmqeEeyIICSdmCqa3tsVHMdBzaXXRiqopZL4Cyghg/XulGWrtABTpbnYYzzIRffLkP4oA== + +is-relative-path@^1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/is-relative-path/-/is-relative-path-1.0.2.tgz" + integrity sha512-i1h+y50g+0hRbBD+dbnInl3JlJ702aar58snAeX+MxBAPvzXGej7sYoPMhlnykabt0ZzCJNBEyzMlekuQZN7fA== + +is-stream@^2.0.0: + version "2.0.1" + resolved "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz" + integrity sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg== + +is-stream@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz" + integrity sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA== + +is-text-path@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/is-text-path/-/is-text-path-2.0.0.tgz" + integrity sha512-+oDTluR6WEjdXEJMnC2z6A4FRwFoYuvShVVEGsS7ewc0UTi2QtAKMDJuL4BDEVt+5T7MjFo12RP8ghOM75oKJw== + dependencies: + text-extensions "^2.0.0" + +is-typed-array@^1.1.3: + version "1.1.15" + resolved "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.15.tgz" + integrity sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ== + dependencies: + which-typed-array "^1.1.16" + +is-typedarray@~1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz" + integrity sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA== + +is-unicode-supported@^0.1.0: + version "0.1.0" + resolved "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz" + integrity sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw== + +is-upper-case@^2.0.2: + version "2.0.2" + resolved "https://registry.npmjs.org/is-upper-case/-/is-upper-case-2.0.2.tgz" + integrity sha512-44pxmxAvnnAOwBg4tHPnkfvgjPwbc5QIsSstNU+YcJ1ovxVzCWpSGosPJOZh/a1tdl81fbgnLc9LLv+x2ywbPQ== + dependencies: + tslib "^2.0.3" + +is-url-superb@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/is-url-superb/-/is-url-superb-4.0.0.tgz" + integrity sha512-GI+WjezhPPcbM+tqE9LnmsY5qqjwHzTvjJ36wxYX5ujNXefSUJ/T17r5bqDV8yLhcgB59KTPNOc9O9cmHTPWsA== + +is-url@^1.2.4: + version "1.2.4" + resolved "https://registry.npmjs.org/is-url/-/is-url-1.2.4.tgz" + integrity sha512-ITvGim8FhRiYe4IQ5uHSkj7pVaPDrCTkNd3yq3cV7iZAcJdHTUMPMEHcqSOy9xZ9qFenQCvi+2wjH9a1nXqHww== + +is-utf8@^0.2.1: + version "0.2.1" + resolved "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz" + integrity sha512-rMYPYvCzsXywIsldgLaSoPlw5PfoB/ssr7hY4pLfcodrA5M/eArza1a9VmTiNIBNMjOGr1Ow9mTyU2o69U6U9Q== + +is-windows@^1.0.1: + version "1.0.2" + resolved "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz" + integrity sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA== + +is-wsl@^2.2.0: + version "2.2.0" + resolved "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz" + integrity sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww== + dependencies: + is-docker "^2.0.0" + +isarray@^1.0.0, isarray@~1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz" + integrity sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ== + +isexe@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz" + integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== + +isexe@^3.1.1: + version "3.1.1" + resolved "https://registry.npmjs.org/isexe/-/isexe-3.1.1.tgz" + integrity sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ== + +isomorphic-ws@^4.0.1: + version "4.0.1" + resolved "https://registry.npmjs.org/isomorphic-ws/-/isomorphic-ws-4.0.1.tgz" + integrity sha512-BhBvN2MBpWTaSHdWRb/bwdZJ1WaehQ2L1KngkCkfLUGF0mAWAT1sQUQacEmQ0jXkFw/czDXPNQSL5u2/Krsz1w== + +isstream@~0.1.2: + version "0.1.2" + resolved "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz" + integrity sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g== + +istanbul-lib-coverage@^3.0.0, istanbul-lib-coverage@^3.2.0, istanbul-lib-coverage@^3.2.2: + version "3.2.2" + resolved "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz" + integrity sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg== + +istanbul-lib-instrument@^6.0.3: + version "6.0.3" + resolved "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.3.tgz" + integrity sha512-Vtgk7L/R2JHyyGW07spoFlB8/lpjiOLTjMdms6AFMraYt3BaJauod/NGrfnVG/y4Ix1JEuMRPDPEj2ua+zz1/Q== + dependencies: + "@babel/core" "^7.23.9" + "@babel/parser" "^7.23.9" + "@istanbuljs/schema" "^0.1.3" + istanbul-lib-coverage "^3.2.0" + semver "^7.5.4" + +istanbul-lib-report@^3.0.0, istanbul-lib-report@^3.0.1: + version "3.0.1" + resolved "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz" + integrity sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw== + dependencies: + istanbul-lib-coverage "^3.0.0" + make-dir "^4.0.0" + supports-color "^7.1.0" + +istanbul-lib-source-maps@^5.0.6: + version "5.0.6" + resolved "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-5.0.6.tgz" + integrity sha512-yg2d+Em4KizZC5niWhQaIomgf5WlL4vOOjZ5xGCmF8SnPE/mDWWXgvRExdcpCgh9lLRRa1/fSYp2ymmbJ1pI+A== + dependencies: + "@jridgewell/trace-mapping" "^0.3.23" + debug "^4.1.1" + istanbul-lib-coverage "^3.0.0" + +istanbul-reports@^3.1.6, istanbul-reports@^3.1.7: + version "3.1.7" + resolved "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.7.tgz" + integrity sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g== + dependencies: + html-escaper "^2.0.0" + istanbul-lib-report "^3.0.0" + +jackspeak@^3.1.2: + version "3.4.3" + resolved "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz" + integrity sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw== + dependencies: + "@isaacs/cliui" "^8.0.2" + optionalDependencies: + "@pkgjs/parseargs" "^0.11.0" + +jake@^10.8.5: + version "10.9.2" + resolved "https://registry.npmjs.org/jake/-/jake-10.9.2.tgz" + integrity sha512-2P4SQ0HrLQ+fw6llpLnOaGAvN2Zu6778SJMrCUwns4fOoG9ayrTiZk3VV8sCPkVZF8ab0zksVpS8FDY5pRCNBA== + dependencies: + async "^3.2.3" + chalk "^4.0.2" + filelist "^1.0.4" + minimatch "^3.1.2" + +jiti@^2.4.1: + version "2.4.2" + resolved "https://registry.npmjs.org/jiti/-/jiti-2.4.2.tgz" + integrity sha512-rg9zJN+G4n2nfJl5MW3BMygZX56zKPNVEYYqq7adpmMh4Jn2QNEwhvQlFy6jPVdcod7txZtKHWnyZiA3a0zP7A== + +jmespath@0.16.0, jmespath@^0.16.0: + version "0.16.0" + resolved "https://registry.npmjs.org/jmespath/-/jmespath-0.16.0.tgz" + integrity sha512-9FzQjJ7MATs1tSpnco1K6ayiYE3figslrXA72G2HQ/n76RzvYlofyi5QM+iX4YRs/pu3yzxlVQSST23+dMDknw== + +joi@17.13.1: + version "17.13.1" + resolved "https://registry.npmjs.org/joi/-/joi-17.13.1.tgz" + integrity sha512-vaBlIKCyo4FCUtCm7Eu4QZd/q02bWcxfUO6YSXAZOWF6gzcLBeba8kwotUdYJjDLW8Cz8RywsSOqiNJZW0mNvg== + dependencies: + "@hapi/hoek" "^9.3.0" + "@hapi/topo" "^5.1.0" + "@sideway/address" "^4.1.5" + "@sideway/formula" "^3.0.1" + "@sideway/pinpoint" "^2.0.0" + +joi@^17.13.3, joi@^17.6.0: + version "17.13.3" + resolved "https://registry.npmjs.org/joi/-/joi-17.13.3.tgz" + integrity sha512-otDA4ldcIx+ZXsKHWmp0YizCweVRZG96J10b0FevjfuncLO1oX59THoAmHkNubYJ+9gWsYsp5k8v4ib6oDv1fA== + dependencies: + "@hapi/hoek" "^9.3.0" + "@hapi/topo" "^5.1.0" + "@sideway/address" "^4.1.5" + "@sideway/formula" "^3.0.1" + "@sideway/pinpoint" "^2.0.0" + +jose@^5.9.6: + version "5.9.6" + resolved "https://registry.npmjs.org/jose/-/jose-5.9.6.tgz" + integrity sha512-AMlnetc9+CV9asI19zHmrgS/WYsWUwCn2R7RzlbJWD7F9eWYUTGyBmU9o6PxngtLGOiDGPRu+Uc4fhKzbpteZQ== + +"js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz" + integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== + +js-yaml@^3.13.1: + version "3.14.1" + resolved "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz" + integrity sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g== + dependencies: + argparse "^1.0.7" + esprima "^4.0.0" + +js-yaml@^4.1.0: + version "4.1.0" + resolved "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz" + integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== + dependencies: + argparse "^2.0.1" + +jsbn@1.1.0: + version "1.1.0" + resolved "https://registry.npmjs.org/jsbn/-/jsbn-1.1.0.tgz" + integrity sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A== + +jsbn@~0.1.0: + version "0.1.1" + resolved "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz" + integrity sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg== + +jsep@^1.4.0: + version "1.4.0" + resolved "https://registry.npmjs.org/jsep/-/jsep-1.4.0.tgz" + integrity sha512-B7qPcEVE3NVkmSJbaYxvv4cHkVW7DQsZz13pUMrfS8z8Q/BuShN+gcTXrUlPiGqM2/t/EEaI030bpxMqY8gMlw== + +jsesc@^3.0.2: + version "3.1.0" + resolved "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz" + integrity sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA== + +json-bigint@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/json-bigint/-/json-bigint-1.0.0.tgz" + integrity sha512-SiPv/8VpZuWbvLSMtTDU8hEfrZWg/mH/nV/b4o0CYbSxu1UIQPLdwKOCIyLQX+VIPO5vrLX3i8qtqFyhdPSUSQ== + dependencies: + bignumber.js "^9.0.0" + +json-buffer@3.0.1: + version "3.0.1" + resolved "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz" + integrity sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ== + +json-parse-even-better-errors@^2.3.0: + version "2.3.1" + resolved "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz" + integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w== + +json-parse-even-better-errors@^3.0.0: + version "3.0.2" + resolved "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-3.0.2.tgz" + integrity sha512-fi0NG4bPjCHunUJffmLd0gxssIgkNmArMvis4iNah6Owg1MCJjWhEcDLmsK6iGkJq3tHwbDkTlce70/tmXN4cQ== + +json-query@^2.2.2: + version "2.2.2" + resolved "https://registry.npmjs.org/json-query/-/json-query-2.2.2.tgz" + integrity sha512-y+IcVZSdqNmS4fO8t1uZF6RMMs0xh3SrTjJr9bp1X3+v0Q13+7Cyv12dSmKwDswp/H427BVtpkLWhGxYu3ZWRA== + +json-schema-traverse@^0.4.1: + version "0.4.1" + resolved "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz" + integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== + +json-schema-traverse@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz" + integrity sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug== + +json-schema@0.4.0: + version "0.4.0" + resolved "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz" + integrity sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA== + +json-stringify-safe@~5.0.1: + version "5.0.1" + resolved "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz" + integrity sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA== + +json5@^2.2.2, json5@^2.2.3: + version "2.2.3" + resolved "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz" + integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg== + +jsonfile@^6.0.1: + version "6.1.0" + resolved "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz" + integrity sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ== + dependencies: + universalify "^2.0.0" + optionalDependencies: + graceful-fs "^4.1.6" + +jsonparse@^1.2.0, jsonparse@^1.3.1: + version "1.3.1" + resolved "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz" + integrity sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg== + +jsonpath-plus@^10.0.0: + version "10.2.0" + resolved "https://registry.npmjs.org/jsonpath-plus/-/jsonpath-plus-10.2.0.tgz" + integrity sha512-T9V+8iNYKFL2n2rF+w02LBOT2JjDnTjioaNFrxRy0Bv1y/hNsqR/EBK7Ojy2ythRHwmz2cRIls+9JitQGZC/sw== + dependencies: + "@jsep-plugin/assignment" "^1.3.0" + "@jsep-plugin/regex" "^1.0.4" + jsep "^1.4.0" + +jsonwebtoken@^9.0.0, jsonwebtoken@^9.0.1: + version "9.0.2" + resolved "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-9.0.2.tgz" + integrity sha512-PRp66vJ865SSqOlgqS8hujT5U4AOgMfhrwYIuIhfKaoSCZcirrmASQr8CX7cUg+RMih+hgznrjp99o+W4pJLHQ== + dependencies: + jws "^3.2.2" + lodash.includes "^4.3.0" + lodash.isboolean "^3.0.3" + lodash.isinteger "^4.0.4" + lodash.isnumber "^3.0.3" + lodash.isplainobject "^4.0.6" + lodash.isstring "^4.0.1" + lodash.once "^4.0.0" + ms "^2.1.1" + semver "^7.5.4" + +jsprim@^2.0.2: + version "2.0.2" + resolved "https://registry.npmjs.org/jsprim/-/jsprim-2.0.2.tgz" + integrity sha512-gqXddjPqQ6G40VdnI6T6yObEC+pDNvyP95wdQhkWkg7crHH3km5qP1FsOXEkzEQwnz6gz5qGTn1c2Y52wP3OyQ== + dependencies: + assert-plus "1.0.0" + extsprintf "1.3.0" + json-schema "0.4.0" + verror "1.10.0" + +jwa@^1.4.1: + version "1.4.1" + resolved "https://registry.npmjs.org/jwa/-/jwa-1.4.1.tgz" + integrity sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA== + dependencies: + buffer-equal-constant-time "1.0.1" + ecdsa-sig-formatter "1.0.11" + safe-buffer "^5.0.1" + +jwa@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/jwa/-/jwa-2.0.0.tgz" + integrity sha512-jrZ2Qx916EA+fq9cEAeCROWPTfCwi1IVHqT2tapuqLEVVDKFDENFw1oL+MwrTvH6msKxsd1YTDVw6uKEcsrLEA== + dependencies: + buffer-equal-constant-time "1.0.1" + ecdsa-sig-formatter "1.0.11" + safe-buffer "^5.0.1" + +jws@^3.2.2: + version "3.2.2" + resolved "https://registry.npmjs.org/jws/-/jws-3.2.2.tgz" + integrity sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA== + dependencies: + jwa "^1.4.1" + safe-buffer "^5.0.1" + +jws@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/jws/-/jws-4.0.0.tgz" + integrity sha512-KDncfTmOZoOMTFG4mBlG0qUIOlc03fmzH+ru6RgYVZhPkyiy/92Owlt/8UEN+a4TXR1FQetfIpJE8ApdvdVxTg== + dependencies: + jwa "^2.0.0" + safe-buffer "^5.0.1" + +keyv@^4.0.0: + version "4.5.4" + resolved "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz" + integrity sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw== + dependencies: + json-buffer "3.0.1" + +kuler@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/kuler/-/kuler-2.0.0.tgz" + integrity sha512-Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A== + +lazystream@^1.0.0: + version "1.0.1" + resolved "https://registry.npmjs.org/lazystream/-/lazystream-1.0.1.tgz" + integrity sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw== + dependencies: + readable-stream "^2.0.5" + +license-compliance@^3.0.1: + version "3.0.1" + resolved "https://registry.npmjs.org/license-compliance/-/license-compliance-3.0.1.tgz" + integrity sha512-IiuxzX5Y95Cx68E3NYhMjOnutylpw8+GNcwX8fzn+yvSoRltQeXZHwcTQRapFg18FUFUI+kG9fgZ6inkMDJqZg== + dependencies: + chalk "4.1.2" + commander "12.0.0" + cosmiconfig "9.0.0" + debug "4.3.4" + joi "17.13.1" + spdx-expression-parse "4.0.0" + spdx-satisfies "5.0.1" + tslib "2.6.2" + xmlbuilder "15.1.1" + +lightstep-tracer@^0.31.0: + version "0.31.2" + resolved "https://registry.npmjs.org/lightstep-tracer/-/lightstep-tracer-0.31.2.tgz" + integrity sha512-DRdyUrASPkr+hxyHQJ9ImPSIxpUCpqQvfgHwxoZ42G6iEJ2g0/2chCw39tuz60JUmLfTlVp1LFzLscII6YPRoA== + dependencies: + async "1.5.0" + eventemitter3 "1.1.1" + google-protobuf "3.6.1" + hex2dec "1.0.1" + opentracing "^0.14.4" + source-map-support "0.3.3" + thrift "^0.14.1" + +lilconfig@^3.1.3, lilconfig@~3.1.3: + version "3.1.3" + resolved "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.3.tgz" + integrity sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw== + +lines-and-columns@^1.1.6: + version "1.2.4" + resolved "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz" + integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg== + +lint-staged@^15.2.11: + version "15.2.11" + resolved "https://registry.npmjs.org/lint-staged/-/lint-staged-15.2.11.tgz" + integrity sha512-Ev6ivCTYRTGs9ychvpVw35m/bcNDuBN+mnTeObCL5h+boS5WzBEC6LHI4I9F/++sZm1m+J2LEiy0gxL/R9TBqQ== + dependencies: + chalk "~5.3.0" + commander "~12.1.0" + debug "~4.4.0" + execa "~8.0.1" + lilconfig "~3.1.3" + listr2 "~8.2.5" + micromatch "~4.0.8" + pidtree "~0.6.0" + string-argv "~0.3.2" + yaml "~2.6.1" + +listr2@~8.2.5: + version "8.2.5" + resolved "https://registry.npmjs.org/listr2/-/listr2-8.2.5.tgz" + integrity sha512-iyAZCeyD+c1gPyE9qpFu8af0Y+MRtmKOncdGoA2S5EY8iFq99dmmvkNnHiWo+pj0s7yH7l3KPIgee77tKpXPWQ== + dependencies: + cli-truncate "^4.0.0" + colorette "^2.0.20" + eventemitter3 "^5.0.1" + log-update "^6.1.0" + rfdc "^1.4.1" + wrap-ansi "^9.0.0" + +locate-path@^5.0.0: + version "5.0.0" + resolved "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz" + integrity sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g== + dependencies: + p-locate "^4.1.0" + +locate-path@^6.0.0: + version "6.0.0" + resolved "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz" + integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== + dependencies: + p-locate "^5.0.0" + +locate-path@^7.2.0: + version "7.2.0" + resolved "https://registry.npmjs.org/locate-path/-/locate-path-7.2.0.tgz" + integrity sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA== + dependencies: + p-locate "^6.0.0" + +lodash-es@^4.17.21: + version "4.17.21" + resolved "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz" + integrity sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw== + +lodash.camelcase@^4.3.0: + version "4.3.0" + resolved "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz" + integrity sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA== + +lodash.defaults@^4.2.0: + version "4.2.0" + resolved "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-4.2.0.tgz" + integrity sha512-qjxPLHd3r5DnsdGacqOMU6pb/avJzdh9tFX2ymgoZE27BmjXrNy/y4LoaiTeAb+O3gL8AfpJGtqfX/ae2leYYQ== + +lodash.difference@^4.5.0: + version "4.5.0" + resolved "https://registry.npmjs.org/lodash.difference/-/lodash.difference-4.5.0.tgz" + integrity sha512-dS2j+W26TQ7taQBGN8Lbbq04ssV3emRw4NY58WErlTO29pIqS0HmoT5aJ9+TUQ1N3G+JOZSji4eugsWwGp9yPA== + +lodash.flatten@^4.4.0: + version "4.4.0" + resolved "https://registry.npmjs.org/lodash.flatten/-/lodash.flatten-4.4.0.tgz" + integrity sha512-C5N2Z3DgnnKr0LOpv/hKCgKdb7ZZwafIrsesve6lmzvZIRZRGaZ/l6Q8+2W7NaT+ZwO3fFlSCzCzrDCFdJfZ4g== + +lodash.includes@^4.3.0: + version "4.3.0" + resolved "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz" + integrity sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w== + +lodash.invoke@^4.5.2: + version "4.5.2" + resolved "https://registry.npmjs.org/lodash.invoke/-/lodash.invoke-4.5.2.tgz" + integrity sha512-SC4Usc0XbIKuz3eH7oNwPqibKHfTJSGVZwO/6eGhdoPzqexOY7z43pKo8xz0M5zzXSRteADV6fW7cRf6Ru0+VA== + +lodash.isboolean@^3.0.3: + version "3.0.3" + resolved "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz" + integrity sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg== + +lodash.isfunction@^3.0.9: + version "3.0.9" + resolved "https://registry.npmjs.org/lodash.isfunction/-/lodash.isfunction-3.0.9.tgz" + integrity sha512-AirXNj15uRIMMPihnkInB4i3NHeb4iBtNg9WRWuK2o31S+ePwwNmDPaTL3o7dTJ+VXNZim7rFs4rxN4YU1oUJw== + +lodash.isinteger@^4.0.4: + version "4.0.4" + resolved "https://registry.npmjs.org/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz" + integrity sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA== + +lodash.isnumber@^3.0.3: + version "3.0.3" + resolved "https://registry.npmjs.org/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz" + integrity sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw== + +lodash.isplainobject@^4.0.6: + version "4.0.6" + resolved "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz" + integrity sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA== + +lodash.isstring@^4.0.1: + version "4.0.1" + resolved "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz" + integrity sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw== + +lodash.kebabcase@^4.1.1: + version "4.1.1" + resolved "https://registry.npmjs.org/lodash.kebabcase/-/lodash.kebabcase-4.1.1.tgz" + integrity sha512-N8XRTIMMqqDgSy4VLKPnJ/+hpGZN+PHQiJnSenYqPaVV/NCqEogTnAdZLQiGKhxX+JCs8waWq2t1XHWKOmlY8g== + +lodash.map@^4.5.1: + version "4.6.0" + resolved "https://registry.npmjs.org/lodash.map/-/lodash.map-4.6.0.tgz" + integrity sha512-worNHGKLDetmcEYDvh2stPCrrQRkP20E4l0iIS7F8EvzMqBBi7ltvFN5m1HvTf1P7Jk1txKhvFcmYsCr8O2F1Q== + +lodash.merge@^4.6.2: + version "4.6.2" + resolved "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz" + integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== + +lodash.mergewith@^4.6.2: + version "4.6.2" + resolved "https://registry.npmjs.org/lodash.mergewith/-/lodash.mergewith-4.6.2.tgz" + integrity sha512-GK3g5RPZWTRSeLSpgP8Xhra+pnjBC56q9FZYe1d5RN3TJ35dbkGy3YqBSMbyCrlbi+CM9Z3Jk5yTL7RCsqboyQ== + +lodash.once@^4.0.0: + version "4.1.1" + resolved "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz" + integrity sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg== + +lodash.partialright@^4.2.1: + version "4.2.1" + resolved "https://registry.npmjs.org/lodash.partialright/-/lodash.partialright-4.2.1.tgz" + integrity sha512-yebmPMQZH7i4El6SdJTW9rn8irWl8VTcsmiWqm/I4sY8/ZjbSo0Z512HL6soeAu3mh5rhx5uIIo6kYJOQXbCxw== + +lodash.snakecase@^4.1.1: + version "4.1.1" + resolved "https://registry.npmjs.org/lodash.snakecase/-/lodash.snakecase-4.1.1.tgz" + integrity sha512-QZ1d4xoBHYUeuouhEq3lk3Uq7ldgyFXGBhg04+oRLnIz8o9T65Eh+8YdroUwn846zchkA9yDsDl5CVVaV2nqYw== + +lodash.startcase@^4.4.0: + version "4.4.0" + resolved "https://registry.npmjs.org/lodash.startcase/-/lodash.startcase-4.4.0.tgz" + integrity sha512-+WKqsK294HMSc2jEbNgpHpd0JfIBhp7rEV4aqXWqFr6AlXov+SlcgB1Fv01y2kGe3Gc8nMW7VA0SrGuSkRfIEg== + +lodash.union@^4.6.0: + version "4.6.0" + resolved "https://registry.npmjs.org/lodash.union/-/lodash.union-4.6.0.tgz" + integrity sha512-c4pB2CdGrGdjMKYLA+XiRDO7Y0PRQbm/Gzg8qMj+QH+pFVAoTp5sBpO0odL3FjoPCGjK96p6qsP+yQoiLoOBcw== + +lodash.uniq@^4.5.0: + version "4.5.0" + resolved "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz" + integrity sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ== + +lodash.upperfirst@^4.3.1: + version "4.3.1" + resolved "https://registry.npmjs.org/lodash.upperfirst/-/lodash.upperfirst-4.3.1.tgz" + integrity sha512-sReKOYJIJf74dhJONhU4e0/shzi1trVbSWDOhKYE5XV2O+H7Sb2Dihwuc7xWxVl+DgFPyTqIN3zMfT9cq5iWDg== + +lodash@4.17.21, lodash@^4.17.14, lodash@^4.17.19, lodash@^4.17.21, lodash@^4.3.0: + version "4.17.21" + resolved "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz" + integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== + +log-symbols@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/log-symbols/-/log-symbols-3.0.0.tgz" + integrity sha512-dSkNGuI7iG3mfvDzUuYZyvk5dD9ocYCYzNU6CYDE6+Xqd+gwme6Z00NS3dUh8mq/73HaEtT7m6W+yUPtU6BZnQ== + dependencies: + chalk "^2.4.2" + +log-symbols@^4.1.0: + version "4.1.0" + resolved "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz" + integrity sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg== + dependencies: + chalk "^4.1.0" + is-unicode-supported "^0.1.0" + +log-update@^6.1.0: + version "6.1.0" + resolved "https://registry.npmjs.org/log-update/-/log-update-6.1.0.tgz" + integrity sha512-9ie8ItPR6tjY5uYJh8K/Zrv/RMZ5VOlOWvtZdEHYSTFKZfIBPQa9tOAEeAWhd+AnIneLJ22w5fjOYtoutpWq5w== + dependencies: + ansi-escapes "^7.0.0" + cli-cursor "^5.0.0" + slice-ansi "^7.1.0" + strip-ansi "^7.1.0" + wrap-ansi "^9.0.0" + +logform@^2.7.0: + version "2.7.0" + resolved "https://registry.npmjs.org/logform/-/logform-2.7.0.tgz" + integrity sha512-TFYA4jnP7PVbmlBIfhlSe+WKxs9dklXMTEGcBCIvLhE/Tn3H6Gk1norupVW7m5Cnd4bLcr08AytbyV/xj7f/kQ== + dependencies: + "@colors/colors" "1.6.0" + "@types/triple-beam" "^1.3.2" + fecha "^4.2.0" + ms "^2.1.1" + safe-stable-stringify "^2.3.1" + triple-beam "^1.3.0" + +long@^5.0.0: + version "5.2.3" + resolved "https://registry.npmjs.org/long/-/long-5.2.3.tgz" + integrity sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q== + +longest@^2.0.1: + version "2.0.1" + resolved "https://registry.npmjs.org/longest/-/longest-2.0.1.tgz" + integrity sha512-Ajzxb8CM6WAnFjgiloPsI3bF+WCxcvhdIG3KNA2KN962+tdBsHcuQ4k4qX/EcS/2CRkcc0iAkR956Nib6aXU/Q== + +loose-envify@^1.1.0: + version "1.4.0" + resolved "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz" + integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== + dependencies: + js-tokens "^3.0.0 || ^4.0.0" + +loupe@^2.3.6: + version "2.3.7" + resolved "https://registry.npmjs.org/loupe/-/loupe-2.3.7.tgz" + integrity sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA== + dependencies: + get-func-name "^2.0.1" + +loupe@^3.1.0, loupe@^3.1.2: + version "3.1.2" + resolved "https://registry.npmjs.org/loupe/-/loupe-3.1.2.tgz" + integrity sha512-23I4pFZHmAemUnz8WZXbYRSKYj801VDaNv9ETuMh7IrMc7VuVVSo+Z9iLE3ni30+U48iDWfi30d3twAXBYmnCg== + +lowercase-keys@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz" + integrity sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA== + +lru-cache@^10.0.1, lru-cache@^10.2.0: + version "10.4.3" + resolved "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz" + integrity sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ== + +lru-cache@^5.1.1: + version "5.1.1" + resolved "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz" + integrity sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w== + dependencies: + yallist "^3.0.2" + +luxon@^3.5.0: + version "3.5.0" + resolved "https://registry.npmjs.org/luxon/-/luxon-3.5.0.tgz" + integrity sha512-rh+Zjr6DNfUYR3bPwJEnuwDdqMbxZW7LOQfUN4B54+Cl+0o5zaU9RJ6bcidfDtC1cWCZXQ+nvX8bf6bAji37QQ== + +magic-string@^0.30.12: + version "0.30.17" + resolved "https://registry.npmjs.org/magic-string/-/magic-string-0.30.17.tgz" + integrity sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA== + dependencies: + "@jridgewell/sourcemap-codec" "^1.5.0" + +magicast@^0.3.5: + version "0.3.5" + resolved "https://registry.npmjs.org/magicast/-/magicast-0.3.5.tgz" + integrity sha512-L0WhttDl+2BOsybvEOLK7fW3UA0OQ0IQ2d6Zl2x/a6vVRs3bAY0ECOSHHeL5jD+SbOpOCUEi0y1DgHEn9Qn1AQ== + dependencies: + "@babel/parser" "^7.25.4" + "@babel/types" "^7.25.4" + source-map-js "^1.2.0" + +make-dir@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz" + integrity sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw== + dependencies: + semver "^7.5.3" + +make-error@^1.1.1: + version "1.3.6" + resolved "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz" + integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw== + +make-fetch-happen@^13.0.0, make-fetch-happen@^13.0.1: + version "13.0.1" + resolved "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-13.0.1.tgz" + integrity sha512-cKTUFc/rbKUd/9meOvgrpJ2WrNzymt6jfRDdwg5UCnVzv9dTpEj9JS5m3wtziXVCjluIXyL8pcaukYqezIzZQA== + dependencies: + "@npmcli/agent" "^2.0.0" + cacache "^18.0.0" + http-cache-semantics "^4.1.1" + is-lambda "^1.0.1" + minipass "^7.0.2" + minipass-fetch "^3.0.0" + minipass-flush "^1.0.5" + minipass-pipeline "^1.2.4" + negotiator "^0.6.3" + proc-log "^4.2.0" + promise-retry "^2.0.1" + ssri "^10.0.0" + +matcher-collection@^1.0.0: + version "1.1.2" + resolved "https://registry.npmjs.org/matcher-collection/-/matcher-collection-1.1.2.tgz" + integrity sha512-YQ/teqaOIIfUHedRam08PB3NK7Mjct6BvzRnJmpGDm8uFXpNr1sbY4yuflI5JcEs6COpYA0FpRQhSDBf1tT95g== + dependencies: + minimatch "^3.0.2" + +math-intrinsics@^1.0.0: + version "1.1.0" + resolved "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz" + integrity sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g== + +media-typer@0.3.0: + version "0.3.0" + resolved "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz" + integrity sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ== + +media-typer@^1.1.0: + version "1.1.0" + resolved "https://registry.npmjs.org/media-typer/-/media-typer-1.1.0.tgz" + integrity sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw== + +meow@^12.0.1: + version "12.1.1" + resolved "https://registry.npmjs.org/meow/-/meow-12.1.1.tgz" + integrity sha512-BhXM0Au22RwUneMPwSCnyhTOizdWoIEPU9sp0Aqa1PnDMR5Wv2FGXYDjuzJEIX+Eo2Rb8xuYe5jrnm5QowQFkw== + +merge-descriptors@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-2.0.0.tgz" + integrity sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g== + +merge-stream@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz" + integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== + +merge2@^1.3.0, merge2@^1.4.1: + version "1.4.1" + resolved "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz" + integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== + +merge@^2.1.1: + version "2.1.1" + resolved "https://registry.npmjs.org/merge/-/merge-2.1.1.tgz" + integrity sha512-jz+Cfrg9GWOZbQAnDQ4hlVnQky+341Yk5ru8bZSe6sIDTCIg8n9i/u7hSQGSVOF3C7lH6mGtqjkiT9G4wFLL0w== + +methods@^1.1.2, methods@~1.1.2: + version "1.1.2" + resolved "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz" + integrity sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w== + +micromatch@^4.0.2, micromatch@^4.0.4, micromatch@~4.0.8: + version "4.0.8" + resolved "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz" + integrity sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA== + dependencies: + braces "^3.0.3" + picomatch "^2.3.1" + +mime-db@1.52.0: + version "1.52.0" + resolved "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz" + integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== + +mime-db@^1.53.0: + version "1.53.0" + resolved "https://registry.npmjs.org/mime-db/-/mime-db-1.53.0.tgz" + integrity sha512-oHlN/w+3MQ3rba9rqFr6V/ypF10LSkdwUysQL7GkXoTgIWeV+tcXGA852TBxH+gsh8UWoyhR1hKcoMJTuWflpg== + +mime-types@^2.1.12, mime-types@^2.1.35, mime-types@~2.1.24: + version "2.1.35" + resolved "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz" + integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== + dependencies: + mime-db "1.52.0" + +mime-types@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/mime-types/-/mime-types-3.0.0.tgz" + integrity sha512-XqoSHeCGjVClAmoGFG3lVFqQFRIrTVw2OH3axRqAcfaw+gHWIfnASS92AV+Rl/mk0MupgZTRHQOjxY6YVnzK5w== + dependencies: + mime-db "^1.53.0" + +mime@2.6.0: + version "2.6.0" + resolved "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz" + integrity sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg== + +mimic-fn@^1.0.0: + version "1.2.0" + resolved "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz" + integrity sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ== + +mimic-fn@^2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz" + integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== + +mimic-fn@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz" + integrity sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw== + +mimic-function@^5.0.0: + version "5.0.1" + resolved "https://registry.npmjs.org/mimic-function/-/mimic-function-5.0.1.tgz" + integrity sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA== + +mimic-response@^1.0.0: + version "1.0.1" + resolved "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz" + integrity sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ== + +mimic-response@^3.1.0: + version "3.1.0" + resolved "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz" + integrity sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ== + +minimatch@^3.0.2, minimatch@^3.0.4, minimatch@^3.1.1, minimatch@^3.1.2: + version "3.1.2" + resolved "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz" + integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== + dependencies: + brace-expansion "^1.1.7" + +minimatch@^5.0.1, minimatch@^5.1.0: + version "5.1.6" + resolved "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz" + integrity sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g== + dependencies: + brace-expansion "^2.0.1" + +minimatch@^9.0.0, minimatch@^9.0.4, minimatch@^9.0.5: + version "9.0.5" + resolved "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz" + integrity sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow== + dependencies: + brace-expansion "^2.0.1" + +minimist@1.2.7: + version "1.2.7" + resolved "https://registry.npmjs.org/minimist/-/minimist-1.2.7.tgz" + integrity sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g== + +minimist@^1.2.0, minimist@^1.2.5, minimist@^1.2.6, minimist@^1.2.8: + version "1.2.8" + resolved "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz" + integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== + +minipass-collect@^2.0.1: + version "2.0.1" + resolved "https://registry.npmjs.org/minipass-collect/-/minipass-collect-2.0.1.tgz" + integrity sha512-D7V8PO9oaz7PWGLbCACuI1qEOsq7UKfLotx/C0Aet43fCUB/wfQ7DYeq2oR/svFJGYDHPr38SHATeaj/ZoKHKw== + dependencies: + minipass "^7.0.3" + +minipass-fetch@^3.0.0: + version "3.0.5" + resolved "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-3.0.5.tgz" + integrity sha512-2N8elDQAtSnFV0Dk7gt15KHsS0Fyz6CbYZ360h0WTYV1Ty46li3rAXVOQj1THMNLdmrD9Vt5pBPtWtVkpwGBqg== + dependencies: + minipass "^7.0.3" + minipass-sized "^1.0.3" + minizlib "^2.1.2" + optionalDependencies: + encoding "^0.1.13" + +minipass-flush@^1.0.5: + version "1.0.5" + resolved "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz" + integrity sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw== + dependencies: + minipass "^3.0.0" + +minipass-json-stream@^1.0.1: + version "1.0.2" + resolved "https://registry.npmjs.org/minipass-json-stream/-/minipass-json-stream-1.0.2.tgz" + integrity sha512-myxeeTm57lYs8pH2nxPzmEEg8DGIgW+9mv6D4JZD2pa81I/OBjeU7PtICXV6c9eRGTA5JMDsuIPUZRCyBMYNhg== + dependencies: + jsonparse "^1.3.1" + minipass "^3.0.0" + +minipass-pipeline@^1.2.4: + version "1.2.4" + resolved "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz" + integrity sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A== + dependencies: + minipass "^3.0.0" + +minipass-sized@^1.0.3: + version "1.0.3" + resolved "https://registry.npmjs.org/minipass-sized/-/minipass-sized-1.0.3.tgz" + integrity sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g== + dependencies: + minipass "^3.0.0" + +minipass@^3.0.0: + version "3.3.6" + resolved "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz" + integrity sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw== + dependencies: + yallist "^4.0.0" + +minipass@^5.0.0: + version "5.0.0" + resolved "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz" + integrity sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ== + +"minipass@^5.0.0 || ^6.0.2 || ^7.0.0", minipass@^7.0.2, minipass@^7.0.3, minipass@^7.0.4, minipass@^7.1.2: + version "7.1.2" + resolved "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz" + integrity sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw== + +minizlib@^2.1.1, minizlib@^2.1.2: + version "2.1.2" + resolved "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz" + integrity sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg== + dependencies: + minipass "^3.0.0" + yallist "^4.0.0" + +mixpanel@^0.13.0: + version "0.13.0" + resolved "https://registry.npmjs.org/mixpanel/-/mixpanel-0.13.0.tgz" + integrity sha512-YOWmpr/o4+zJ8LPjuLUkWLc2ImFeIkX6hF1t62Wlvq6loC6e8EK8qieYO4gYPTPxxtjAryl7xmIvf/7qnPwjrQ== + dependencies: + https-proxy-agent "5.0.0" + +mkdirp@^0.5.1, mkdirp@^0.5.4: + version "0.5.6" + resolved "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz" + integrity sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw== + dependencies: + minimist "^1.2.6" + +mkdirp@^1.0.3: + version "1.0.4" + resolved "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz" + integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== + +mkdirp@^3.0.0, mkdirp@^3.0.1: + version "3.0.1" + resolved "https://registry.npmjs.org/mkdirp/-/mkdirp-3.0.1.tgz" + integrity sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg== + +module-definition@^5.0.1: + version "5.0.1" + resolved "https://registry.npmjs.org/module-definition/-/module-definition-5.0.1.tgz" + integrity sha512-kvw3B4G19IXk+BOXnYq/D/VeO9qfHaapMeuS7w7sNUqmGaA6hywdFHMi+VWeR9wUScXM7XjoryTffCZ5B0/8IA== + dependencies: + ast-module-types "^5.0.0" + node-source-walk "^6.0.1" + +module-lookup-amd@^8.0.5: + version "8.0.5" + resolved "https://registry.npmjs.org/module-lookup-amd/-/module-lookup-amd-8.0.5.tgz" + integrity sha512-vc3rYLjDo5Frjox8NZpiyLXsNWJ5BWshztc/5KSOMzpg9k5cHH652YsJ7VKKmtM4SvaxuE9RkrYGhiSjH3Ehow== + dependencies: + commander "^10.0.1" + glob "^7.2.3" + requirejs "^2.3.6" + requirejs-config-file "^4.0.0" + +moment@^2.29.4: + version "2.30.1" + resolved "https://registry.npmjs.org/moment/-/moment-2.30.1.tgz" + integrity sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how== + +morgan@^1.10.0: + version "1.10.0" + resolved "https://registry.npmjs.org/morgan/-/morgan-1.10.0.tgz" + integrity sha512-AbegBVI4sh6El+1gNwvD5YIck7nSA36weD7xvIxG4in80j/UoK8AEGaWnnz8v1GxonMCltmlNs5ZKbGvl9b1XQ== + dependencies: + basic-auth "~2.0.1" + debug "2.6.9" + depd "~2.0.0" + on-finished "~2.3.0" + on-headers "~1.0.2" + +mrmime@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/mrmime/-/mrmime-2.0.0.tgz" + integrity sha512-eu38+hdgojoyq63s+yTpN4XMBdt5l8HhMhc4VKLO9KM5caLIBvUm4thi7fFaxyTmCKeNnXZ5pAlBwCUnhA09uw== + +ms@2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz" + integrity sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A== + +ms@2.1.2: + version "2.1.2" + resolved "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz" + integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== + +ms@^2.0.0, ms@^2.1.1, ms@^2.1.3: + version "2.1.3" + resolved "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz" + integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== + +multer@^1.4.5-lts.1: + version "1.4.5-lts.1" + resolved "https://registry.yarnpkg.com/multer/-/multer-1.4.5-lts.1.tgz#803e24ad1984f58edffbc79f56e305aec5cfd1ac" + integrity sha512-ywPWvcDMeH+z9gQq5qYHCCy+ethsk4goepZ45GLD63fOu0YcNecQxi64nDs3qluZB+murG3/D4dJ7+dGctcCQQ== + dependencies: + append-field "^1.0.0" + busboy "^1.0.0" + concat-stream "^1.5.2" + mkdirp "^0.5.4" + object-assign "^4.1.1" + type-is "^1.6.4" + xtend "^4.0.0" + +mustache@^4.2.0: + version "4.2.0" + resolved "https://registry.npmjs.org/mustache/-/mustache-4.2.0.tgz" + integrity sha512-71ippSywq5Yb7/tVYyGbkBggbU8H3u5Rz56fH60jGFgr8uHwxs+aSKeqmluIVzM0m0kB7xQjKS6qPfd0b2ZoqQ== + +mute-stream@0.0.7: + version "0.0.7" + resolved "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz" + integrity sha512-r65nCZhrbXXb6dXOACihYApHw2Q6pV0M3V0PSxd74N0+D8nzAdEAITq2oAjA1jVnKI+tGvEBUpqiMh0+rW6zDQ== + +mute-stream@0.0.8: + version "0.0.8" + resolved "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz" + integrity sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA== + +mute-stream@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/mute-stream/-/mute-stream-2.0.0.tgz" + integrity sha512-WWdIxpyjEn+FhQJQQv9aQAYlHoNVdzIzUySNV1gHUPDSdZJ3yZn7pAAbQcV7B56Mvu881q9FZV+0Vx2xC44VWA== + +nan@^2.16.0: + version "2.22.0" + resolved "https://registry.npmjs.org/nan/-/nan-2.22.0.tgz" + integrity sha512-nbajikzWTMwsW+eSsNm3QwlOs7het9gGJU5dDZzRTQGk03vyBOauxgI4VakDzE0PtsGTmXPsXTbbjVhRwR5mpw== + +nanoclone@^0.2.1: + version "0.2.1" + resolved "https://registry.npmjs.org/nanoclone/-/nanoclone-0.2.1.tgz" + integrity sha512-wynEP02LmIbLpcYw8uBKpcfF6dmg2vcpKqxeH5UcoKEYdExslsdUA4ugFauuaeYdTB76ez6gJW8XAZ6CgkXYxA== + +nanoid@3.3.4: + version "3.3.4" + resolved "https://registry.npmjs.org/nanoid/-/nanoid-3.3.4.tgz" + integrity sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw== + +nanoid@^3.3.4, nanoid@^3.3.7: + version "3.3.8" + resolved "https://registry.npmjs.org/nanoid/-/nanoid-3.3.8.tgz" + integrity sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w== + +nanotimer@0.3.14: + version "0.3.14" + resolved "https://registry.npmjs.org/nanotimer/-/nanotimer-0.3.14.tgz" + integrity sha512-NpKXdP6ZLwZcODvDeyfoDBVoncbrgvC12txO3F4l9BxMycQjZD29AnasGAy7uSi3dcsTGnGn6/zzvQRwbjS4uw== + +negotiator@^0.6.3: + version "0.6.4" + resolved "https://registry.npmjs.org/negotiator/-/negotiator-0.6.4.tgz" + integrity sha512-myRT3DiWPHqho5PrJaIRyaMv2kgYf0mUVgBNOYMuCH5Ki1yEiQaf/ZJuQ62nvpc44wL5WDbTX7yGJi1Neevw8w== + +negotiator@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/negotiator/-/negotiator-1.0.0.tgz" + integrity sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg== + +node-fetch@2.7.0, node-fetch@^2.6.0, node-fetch@^2.6.1: + version "2.7.0" + resolved "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz" + integrity sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A== + dependencies: + whatwg-url "^5.0.0" + +node-geocoder@^4.4.1: + version "4.4.1" + resolved "https://registry.yarnpkg.com/node-geocoder/-/node-geocoder-4.4.1.tgz#f612837dd062ba1084dd33d53f0e81c158694a76" + integrity sha512-krx50Gxl4yBgMBhfUhOuNwStzLi+gAYaa46gs0e+ftTvaqLsjKYDFVxC8ff6RLc2f11Gp7Y+R1mkzwsE2c0chw== + dependencies: + bluebird "^3.5.2" + node-fetch "^2.6.0" + +node-gyp@^10.0.0: + version "10.3.1" + resolved "https://registry.npmjs.org/node-gyp/-/node-gyp-10.3.1.tgz" + integrity sha512-Pp3nFHBThHzVtNY7U6JfPjvT/DTE8+o/4xKsLQtBoU+j2HLsGlhcfzflAoUreaJbNmYnX+LlLi0qjV8kpyO6xQ== + dependencies: + env-paths "^2.2.0" + exponential-backoff "^3.1.1" + glob "^10.3.10" + graceful-fs "^4.2.6" + make-fetch-happen "^13.0.0" + nopt "^7.0.0" + proc-log "^4.1.0" + semver "^7.3.5" + tar "^6.2.1" + which "^4.0.0" + +node-int64@^0.4.0: + version "0.4.0" + resolved "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz" + integrity sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw== + +node-releases@^2.0.19: + version "2.0.19" + resolved "https://registry.npmjs.org/node-releases/-/node-releases-2.0.19.tgz" + integrity sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw== + +node-source-walk@^6.0.0, node-source-walk@^6.0.1, node-source-walk@^6.0.2: + version "6.0.2" + resolved "https://registry.npmjs.org/node-source-walk/-/node-source-walk-6.0.2.tgz" + integrity sha512-jn9vOIK/nfqoFCcpK89/VCVaLg1IHE6UVfDOzvqmANaJ/rWCTEdH8RZ1V278nv2jr36BJdyQXIAavBLXpzdlag== + dependencies: + "@babel/parser" "^7.21.8" + +node-vault@^0.10.2: + version "0.10.2" + resolved "https://registry.npmjs.org/node-vault/-/node-vault-0.10.2.tgz" + integrity sha512-//uc9/YImE7Dx0QHdwMiAzLaOumiKUnOUP8DymgtkZ8nsq6/V2LKvEu6kw91Lcruw8lWUfj4DO7CIXNPRWBuuA== + dependencies: + debug "^4.3.4" + mustache "^4.2.0" + postman-request "^2.88.1-postman.33" + tv4 "^1.3.0" + +nodemailer@^6.9.16: + version "6.9.16" + resolved "https://registry.npmjs.org/nodemailer/-/nodemailer-6.9.16.tgz" + integrity sha512-psAuZdTIRN08HKVd/E8ObdV6NO7NTBY3KsC30F7M4H1OnmLCUNaS56FpYxyb26zWLSyYF9Ozch9KYHhHegsiOQ== + +nopt@^7.0.0: + version "7.2.1" + resolved "https://registry.npmjs.org/nopt/-/nopt-7.2.1.tgz" + integrity sha512-taM24ViiimT/XntxbPyJQzCG+p4EKOpgD3mxFwW38mGjVUrfERQOeY4EDHjdnptttfHuHQXFx+lTP08Q+mLa/w== + dependencies: + abbrev "^2.0.0" + +normalize-package-data@^2.5.0: + version "2.5.0" + resolved "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz" + integrity sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA== + dependencies: + hosted-git-info "^2.1.4" + resolve "^1.10.0" + semver "2 || 3 || 4 || 5" + validate-npm-package-license "^3.0.1" + +normalize-package-data@^6.0.0: + version "6.0.2" + resolved "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-6.0.2.tgz" + integrity sha512-V6gygoYb/5EmNI+MEGrWkC+e6+Rr7mTmfHrxDbLzxQogBkgzo76rkok0Am6thgSF7Mv2nLOajAJj5vDJZEFn7g== + dependencies: + hosted-git-info "^7.0.0" + semver "^7.3.5" + validate-npm-package-license "^3.0.4" + +normalize-path@^3.0.0, normalize-path@~3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz" + integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== + +normalize-url@^6.0.1: + version "6.1.0" + resolved "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz" + integrity sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A== + +npm-bundled@^3.0.0: + version "3.0.1" + resolved "https://registry.npmjs.org/npm-bundled/-/npm-bundled-3.0.1.tgz" + integrity sha512-+AvaheE/ww1JEwRHOrn4WHNzOxGtVp+adrg2AeZS/7KuxGUYFuBta98wYpfHBbJp6Tg6j1NKSEVHNcfZzJHQwQ== + dependencies: + npm-normalize-package-bin "^3.0.0" + +npm-install-checks@^6.0.0: + version "6.3.0" + resolved "https://registry.npmjs.org/npm-install-checks/-/npm-install-checks-6.3.0.tgz" + integrity sha512-W29RiK/xtpCGqn6f3ixfRYGk+zRyr+Ew9F2E20BfXxT5/euLdA/Nm7fO7OeTGuAmTs30cpgInyJ0cYe708YTZw== + dependencies: + semver "^7.1.1" + +npm-normalize-package-bin@^3.0.0: + version "3.0.1" + resolved "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-3.0.1.tgz" + integrity sha512-dMxCf+zZ+3zeQZXKxmyuCKlIDPGuv8EF940xbkC4kQVDTtqoh6rJFO+JTKSA6/Rwi0getWmtuy4Itup0AMcaDQ== + +npm-package-arg@^11.0.0: + version "11.0.3" + resolved "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-11.0.3.tgz" + integrity sha512-sHGJy8sOC1YraBywpzQlIKBE4pBbGbiF95U6Auspzyem956E0+FtDtsx1ZxlOJkQCZ1AFXAY/yuvtFYrOxF+Bw== + dependencies: + hosted-git-info "^7.0.0" + proc-log "^4.0.0" + semver "^7.3.5" + validate-npm-package-name "^5.0.0" + +npm-packlist@^8.0.0: + version "8.0.2" + resolved "https://registry.npmjs.org/npm-packlist/-/npm-packlist-8.0.2.tgz" + integrity sha512-shYrPFIS/JLP4oQmAwDyk5HcyysKW8/JLTEA32S0Z5TzvpaeeX2yMFfoK1fjEBnCBvVyIB/Jj/GBFdm0wsgzbA== + dependencies: + ignore-walk "^6.0.4" + +npm-pick-manifest@^9.0.0: + version "9.1.0" + resolved "https://registry.npmjs.org/npm-pick-manifest/-/npm-pick-manifest-9.1.0.tgz" + integrity sha512-nkc+3pIIhqHVQr085X9d2JzPzLyjzQS96zbruppqC9aZRm/x8xx6xhI98gHtsfELP2bE+loHq8ZaHFHhe+NauA== + dependencies: + npm-install-checks "^6.0.0" + npm-normalize-package-bin "^3.0.0" + npm-package-arg "^11.0.0" + semver "^7.3.5" + +npm-registry-fetch@^16.0.0: + version "16.2.1" + resolved "https://registry.npmjs.org/npm-registry-fetch/-/npm-registry-fetch-16.2.1.tgz" + integrity sha512-8l+7jxhim55S85fjiDGJ1rZXBWGtRLi1OSb4Z3BPLObPuIaeKRlPRiYMSHU4/81ck3t71Z+UwDDl47gcpmfQQA== + dependencies: + "@npmcli/redact" "^1.1.0" + make-fetch-happen "^13.0.0" + minipass "^7.0.2" + minipass-fetch "^3.0.0" + minipass-json-stream "^1.0.1" + minizlib "^2.1.2" + npm-package-arg "^11.0.0" + proc-log "^4.0.0" + +npm-run-path@^4.0.1: + version "4.0.1" + resolved "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz" + integrity sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw== + dependencies: + path-key "^3.0.0" + +npm-run-path@^5.1.0: + version "5.3.0" + resolved "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.3.0.tgz" + integrity sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ== + dependencies: + path-key "^4.0.0" + +nth-check@^2.0.1: + version "2.1.1" + resolved "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz" + integrity sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w== + dependencies: + boolbase "^1.0.0" + +oauth-sign@~0.9.0: + version "0.9.0" + resolved "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz" + integrity sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ== + +object-assign@^4, object-assign@^4.1.1: + version "4.1.1" + resolved "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz" + integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== + +object-inspect@^1.13.3: + version "1.13.3" + resolved "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.3.tgz" + integrity sha512-kDCGIbxkDSXE3euJZZXzc6to7fCrKHNI/hSRQnRuQ+BWjFNzZwiFF8fj/6o2t2G9/jTj8PSIYTfCLelLZEeRpA== + +object-treeify@1.1.33: + version "1.1.33" + resolved "https://registry.npmjs.org/object-treeify/-/object-treeify-1.1.33.tgz" + integrity sha512-EFVjAYfzWqWsBMRHPMAXLCDIJnpMhdWAqR7xG6M6a2cs6PMFpl/+Z20w9zDW4vkxOFfddegBKq9Rehd0bxWE7A== + +ohm-js@^16.6.0: + version "16.6.0" + resolved "https://registry.npmjs.org/ohm-js/-/ohm-js-16.6.0.tgz" + integrity sha512-X9P4koSGa7swgVQ0gt71UCYtkAQGOjciJPJAz74kDxWt8nXbH5HrDOQG6qBDH7SR40ktNv4x61BwpTDE9q4lRA== + +on-finished@2.4.1, on-finished@^2.4.1: + version "2.4.1" + resolved "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz" + integrity sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg== + dependencies: + ee-first "1.1.1" + +on-finished@~2.3.0: + version "2.3.0" + resolved "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz" + integrity sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww== + dependencies: + ee-first "1.1.1" + +on-headers@~1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz" + integrity sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA== + +once@1.4.0, once@^1.3.0, once@^1.3.1, once@^1.4.0: + version "1.4.0" + resolved "https://registry.npmjs.org/once/-/once-1.4.0.tgz" + integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== + dependencies: + wrappy "1" + +one-time@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/one-time/-/one-time-1.0.0.tgz" + integrity sha512-5DXOiRKwuSEcQ/l0kGCF6Q3jcADFv5tSmRaJck/OqkVFcOzutB134KRSfF0xDrL39MNnqxbHBbUUcjZIhTgb2g== + dependencies: + fn.name "1.x.x" + +onetime@^2.0.0: + version "2.0.1" + resolved "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz" + integrity sha512-oyyPpiMaKARvvcgip+JV+7zci5L8D1W9RZIz2l1o08AM3pfspitVWnPt3mzHcBPp12oYMTy0pqrFs/C+m3EwsQ== + dependencies: + mimic-fn "^1.0.0" + +onetime@^5.1.0, onetime@^5.1.2: + version "5.1.2" + resolved "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz" + integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg== + dependencies: + mimic-fn "^2.1.0" + +onetime@^6.0.0: + version "6.0.0" + resolved "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz" + integrity sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ== + dependencies: + mimic-fn "^4.0.0" + +onetime@^7.0.0: + version "7.0.0" + resolved "https://registry.npmjs.org/onetime/-/onetime-7.0.0.tgz" + integrity sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ== + dependencies: + mimic-function "^5.0.0" + +open@^8.0.0: + version "8.4.2" + resolved "https://registry.npmjs.org/open/-/open-8.4.2.tgz" + integrity sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ== + dependencies: + define-lazy-prop "^2.0.0" + is-docker "^2.1.1" + is-wsl "^2.2.0" + +openapi3-ts@^4.1.2, openapi3-ts@^4.4.0: + version "4.4.0" + resolved "https://registry.npmjs.org/openapi3-ts/-/openapi3-ts-4.4.0.tgz" + integrity sha512-9asTNB9IkKEzWMcHmVZE7Ts3kC9G7AFHfs8i7caD8HbI76gEjdkId4z/AkP83xdZsH7PLAnnbl47qZkXuxpArw== + dependencies: + yaml "^2.5.0" + +opener@^1.5.2: + version "1.5.2" + resolved "https://registry.npmjs.org/opener/-/opener-1.5.2.tgz" + integrity sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A== + +opentracing@^0.14.4, opentracing@^0.14.5: + version "0.14.7" + resolved "https://registry.npmjs.org/opentracing/-/opentracing-0.14.7.tgz" + integrity sha512-vz9iS7MJ5+Bp1URw8Khvdyw1H/hGvzHWlKQ7eRrQojSCDL1/SrWfrY9QebLw97n2deyRtzHRC3MkQfVNUCo91Q== + +ora@^4.0.4: + version "4.1.1" + resolved "https://registry.npmjs.org/ora/-/ora-4.1.1.tgz" + integrity sha512-sjYP8QyVWBpBZWD6Vr1M/KwknSw6kJOz41tvGMlwWeClHBtYKTbHMki1PsLZnxKpXMPbTKv9b3pjQu3REib96A== + dependencies: + chalk "^3.0.0" + cli-cursor "^3.1.0" + cli-spinners "^2.2.0" + is-interactive "^1.0.0" + log-symbols "^3.0.0" + mute-stream "0.0.8" + strip-ansi "^6.0.0" + wcwidth "^1.0.1" + +ora@^5.4.1: + version "5.4.1" + resolved "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz" + integrity sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ== + dependencies: + bl "^4.1.0" + chalk "^4.1.0" + cli-cursor "^3.1.0" + cli-spinners "^2.5.0" + is-interactive "^1.0.0" + is-unicode-supported "^0.1.0" + log-symbols "^4.1.0" + strip-ansi "^6.0.0" + wcwidth "^1.0.1" + +os-tmpdir@~1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz" + integrity sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g== + +p-cancelable@^2.0.0: + version "2.1.1" + resolved "https://registry.npmjs.org/p-cancelable/-/p-cancelable-2.1.1.tgz" + integrity sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg== + +p-limit@^2.2.0: + version "2.3.0" + resolved "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz" + integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== + dependencies: + p-try "^2.0.0" + +p-limit@^3.0.2: + version "3.1.0" + resolved "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz" + integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== + dependencies: + yocto-queue "^0.1.0" + +p-limit@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/p-limit/-/p-limit-4.0.0.tgz" + integrity sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ== + dependencies: + yocto-queue "^1.0.0" + +p-locate@^4.1.0: + version "4.1.0" + resolved "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz" + integrity sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A== + dependencies: + p-limit "^2.2.0" + +p-locate@^5.0.0: + version "5.0.0" + resolved "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz" + integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== + dependencies: + p-limit "^3.0.2" + +p-locate@^6.0.0: + version "6.0.0" + resolved "https://registry.npmjs.org/p-locate/-/p-locate-6.0.0.tgz" + integrity sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw== + dependencies: + p-limit "^4.0.0" + +p-map@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz" + integrity sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ== + dependencies: + aggregate-error "^3.0.0" + +p-try@^2.0.0: + version "2.2.0" + resolved "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz" + integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== + +package-json-from-dist@^1.0.0: + version "1.0.1" + resolved "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz" + integrity sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw== + +pacote@^17.0.6: + version "17.0.7" + resolved "https://registry.npmjs.org/pacote/-/pacote-17.0.7.tgz" + integrity sha512-sgvnoUMlkv9xHwDUKjKQFXVyUi8dtJGKp3vg6sYy+TxbDic5RjZCHF3ygv0EJgNRZ2GfRONjlKPUfokJ9lDpwQ== + dependencies: + "@npmcli/git" "^5.0.0" + "@npmcli/installed-package-contents" "^2.0.1" + "@npmcli/promise-spawn" "^7.0.0" + "@npmcli/run-script" "^7.0.0" + cacache "^18.0.0" + fs-minipass "^3.0.0" + minipass "^7.0.2" + npm-package-arg "^11.0.0" + npm-packlist "^8.0.0" + npm-pick-manifest "^9.0.0" + npm-registry-fetch "^16.0.0" + proc-log "^4.0.0" + promise-retry "^2.0.1" + read-package-json "^7.0.0" + read-package-json-fast "^3.0.0" + sigstore "^2.2.0" + ssri "^10.0.0" + tar "^6.1.11" + +pad@^2.3.0: + version "2.3.0" + resolved "https://registry.npmjs.org/pad/-/pad-2.3.0.tgz" + integrity sha512-lxrgnOG5AXmzMRT1O5urWtYFxHnFSE+QntgTHij1nvS4W+ubhQLmQRHmZXDeEvk9I00itAixLqU9Q6fE0gW3sw== + dependencies: + wcwidth "^1.0.1" + +parent-module@^1.0.0: + version "1.0.1" + resolved "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz" + integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== + dependencies: + callsites "^3.0.0" + +parse-json@^5.0.0, parse-json@^5.2.0: + version "5.2.0" + resolved "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz" + integrity sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg== + dependencies: + "@babel/code-frame" "^7.0.0" + error-ex "^1.3.1" + json-parse-even-better-errors "^2.3.0" + lines-and-columns "^1.1.6" + +parse-passwd@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz" + integrity sha512-1Y1A//QUXEZK7YKz+rD9WydcE1+EuPr6ZBgKecAB8tmoW6UFv0NREVJe1p+jRxtThkcbbKkfwIbWJe/IeE6m2Q== + +parse5-htmlparser2-tree-adapter@^7.0.0: + version "7.1.0" + resolved "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-7.1.0.tgz" + integrity sha512-ruw5xyKs6lrpo9x9rCZqZZnIUntICjQAd0Wsmp396Ul9lN/h+ifgVV1x1gZHi8euej6wTfpqX8j+BFQxF0NS/g== + dependencies: + domhandler "^5.0.3" + parse5 "^7.0.0" + +parse5-parser-stream@^7.1.2: + version "7.1.2" + resolved "https://registry.npmjs.org/parse5-parser-stream/-/parse5-parser-stream-7.1.2.tgz" + integrity sha512-JyeQc9iwFLn5TbvvqACIF/VXG6abODeB3Fwmv/TGdLk2LfbWkaySGY72at4+Ty7EkPZj854u4CrICqNk2qIbow== + dependencies: + parse5 "^7.0.0" + +parse5@^7.0.0, parse5@^7.1.2: + version "7.2.1" + resolved "https://registry.npmjs.org/parse5/-/parse5-7.2.1.tgz" + integrity sha512-BuBYQYlv1ckiPdQi/ohiivi9Sagc9JG+Ozs0r7b/0iK3sKmrb0b9FdWdBbOdx6hBCM/F9Ir82ofnBhtZOjCRPQ== + dependencies: + entities "^4.5.0" + +parseurl@^1.3.3, parseurl@~1.3.3: + version "1.3.3" + resolved "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz" + integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== + +patch-console@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/patch-console/-/patch-console-2.0.0.tgz" + integrity sha512-0YNdUceMdaQwoKce1gatDScmMo5pu/tfABfnzEqeG0gtTmd7mh/WcwgUjtAeOU7N8nFFlbQBnFK2gXW5fGvmMA== + +path-exists@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz" + integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== + +path-exists@^5.0.0: + version "5.0.0" + resolved "https://registry.npmjs.org/path-exists/-/path-exists-5.0.0.tgz" + integrity sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ== + +path-is-absolute@^1.0.0: + version "1.0.1" + resolved "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz" + integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== + +path-key@^3.0.0, path-key@^3.1.0: + version "3.1.1" + resolved "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz" + integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== + +path-key@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz" + integrity sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ== + +path-parse@^1.0.7: + version "1.0.7" + resolved "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz" + integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== + +path-scurry@^1.11.1, path-scurry@^1.9.2: + version "1.11.1" + resolved "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz" + integrity sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA== + dependencies: + lru-cache "^10.2.0" + minipass "^5.0.0 || ^6.0.2 || ^7.0.0" + +path-to-regexp@^8.0.0: + version "8.2.0" + resolved "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-8.2.0.tgz" + integrity sha512-TdrF7fW9Rphjq4RjrW0Kp2AW0Ahwu9sRGTkS6bvDi0SCwZlEZYmcfDbEsTz8RVk0EHIS/Vd1bv3JhG+1xZuAyQ== + +path-type@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz" + integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== + +path@^0.12.7: + version "0.12.7" + resolved "https://registry.npmjs.org/path/-/path-0.12.7.tgz" + integrity sha512-aXXC6s+1w7otVF9UletFkFcDsJeO7lSZBPUQhtb5O0xJe8LtYhj/GxldoL09bBj9+ZmE2hNoHqQSFMN5fikh4Q== + dependencies: + process "^0.11.1" + util "^0.10.3" + +pathe@^1.1.2: + version "1.1.2" + resolved "https://registry.npmjs.org/pathe/-/pathe-1.1.2.tgz" + integrity sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ== + +pathval@^1.1.1: + version "1.1.1" + resolved "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz" + integrity sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ== + +pathval@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/pathval/-/pathval-2.0.0.tgz" + integrity sha512-vE7JKRyES09KiunauX7nd2Q9/L7lhok4smP9RZTDeD4MVs72Dp2qNFVz39Nz5a0FVEW0BJR6C0DYrq6unoziZA== + +performance-now@^2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz" + integrity sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow== + +picocolors@^1.0.0, picocolors@^1.1.0, picocolors@^1.1.1: + version "1.1.1" + resolved "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz" + integrity sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA== + +picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.3.1: + version "2.3.1" + resolved "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz" + integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== + +picomatch@^4.0.2: + version "4.0.2" + resolved "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz" + integrity sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg== + +pidtree@~0.6.0: + version "0.6.0" + resolved "https://registry.npmjs.org/pidtree/-/pidtree-0.6.0.tgz" + integrity sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g== + +pirates@^4.0.5: + version "4.0.6" + resolved "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz" + integrity sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg== + +playwright-core@1.49.1: + version "1.49.1" + resolved "https://registry.npmjs.org/playwright-core/-/playwright-core-1.49.1.tgz" + integrity sha512-BzmpVcs4kE2CH15rWfzpjzVGhWERJfmnXmniSyKeRZUs9Ws65m+RGIi7mjJK/euCegfn3i7jvqWeWyHe9y3Vgg== + +playwright@1.49.1, playwright@^1.48.0: + version "1.49.1" + resolved "https://registry.npmjs.org/playwright/-/playwright-1.49.1.tgz" + integrity sha512-VYL8zLoNTBxVOrJBbDuRgDWa3i+mfQgDTrL8Ah9QXZ7ax4Dsj0MSq5bYgytRnDVVe+njoKnfsYkH3HzqVj5UZA== + dependencies: + playwright-core "1.49.1" + optionalDependencies: + fsevents "2.3.2" + +polite-json@^4.0.1: + version "4.0.1" + resolved "https://registry.npmjs.org/polite-json/-/polite-json-4.0.1.tgz" + integrity sha512-8LI5ZeCPBEb4uBbcYKNVwk4jgqNx1yHReWoW4H4uUihWlSqZsUDfSITrRhjliuPgxsNPFhNSudGO2Zu4cbWinQ== + +polite-json@^5.0.0: + version "5.0.0" + resolved "https://registry.npmjs.org/polite-json/-/polite-json-5.0.0.tgz" + integrity sha512-OLS/0XeUAcE8a2fdwemNja+udKgXNnY6yKVIXqAD2zVRx1KvY6Ato/rZ2vdzbxqYwPW0u6SCNC/bAMPNzpzxbw== + +possible-typed-array-names@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz" + integrity sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q== + +postcss-values-parser@^6.0.2: + version "6.0.2" + resolved "https://registry.npmjs.org/postcss-values-parser/-/postcss-values-parser-6.0.2.tgz" + integrity sha512-YLJpK0N1brcNJrs9WatuJFtHaV9q5aAOj+S4DI5S7jgHlRfm0PIbDCAFRYMQD5SHq7Fy6xsDhyutgS0QOAs0qw== + dependencies: + color-name "^1.1.4" + is-url-superb "^4.0.0" + quote-unquote "^1.0.0" + +postcss@^8.4.23, postcss@^8.4.43: + version "8.4.49" + resolved "https://registry.npmjs.org/postcss/-/postcss-8.4.49.tgz" + integrity sha512-OCVPnIObs4N29kxTjzLfUryOkvZEq+pf8jTF0lg8E7uETuWHA+v7j3c/xJmiqpX450191LlmZfUKkXxkTry7nA== + dependencies: + nanoid "^3.3.7" + picocolors "^1.1.1" + source-map-js "^1.2.1" + +posthog-node@^2.2.3: + version "2.6.0" + resolved "https://registry.npmjs.org/posthog-node/-/posthog-node-2.6.0.tgz" + integrity sha512-/BiFw/jwdP0uJSRAIoYqLoBTjZ612xv74b1L/a3T/p1nJVL8e0OrHuxbJW56c6WVW/IKm9gBF/zhbqfaz0XgJQ== + dependencies: + axios "^0.27.0" + +postman-request@^2.88.1-postman.33: + version "2.88.1-postman.40" + resolved "https://registry.npmjs.org/postman-request/-/postman-request-2.88.1-postman.40.tgz" + integrity sha512-uE4AiIqhjtHKp4pj9ei7fkdfNXEX9IqDBlK1plGAQne6y79UUlrTdtYLhwXoO0AMOvqyl9Ar+BU6Eo6P/MPgfg== + dependencies: + "@postman/form-data" "~3.1.1" + "@postman/tough-cookie" "~4.1.3-postman.1" + "@postman/tunnel-agent" "^0.6.4" + aws-sign2 "~0.7.0" + aws4 "^1.12.0" + brotli "^1.3.3" + caseless "~0.12.0" + combined-stream "~1.0.6" + extend "~3.0.2" + forever-agent "~0.6.1" + har-validator "~5.1.3" + http-signature "~1.3.1" + is-typedarray "~1.0.0" + isstream "~0.1.2" + json-stringify-safe "~5.0.1" + mime-types "^2.1.35" + oauth-sign "~0.9.0" + performance-now "^2.1.0" + qs "~6.5.3" + safe-buffer "^5.1.2" + stream-length "^1.0.2" + uuid "^8.3.2" + +precinct@^11.0.5: + version "11.0.5" + resolved "https://registry.npmjs.org/precinct/-/precinct-11.0.5.tgz" + integrity sha512-oHSWLC8cL/0znFhvln26D14KfCQFFn4KOLSw6hmLhd+LQ2SKt9Ljm89but76Pc7flM9Ty1TnXyrA2u16MfRV3w== + dependencies: + "@dependents/detective-less" "^4.1.0" + commander "^10.0.1" + detective-amd "^5.0.2" + detective-cjs "^5.0.1" + detective-es6 "^4.0.1" + detective-postcss "^6.1.3" + detective-sass "^5.0.3" + detective-scss "^4.0.3" + detective-stylus "^4.0.0" + detective-typescript "^11.1.0" + module-definition "^5.0.1" + node-source-walk "^6.0.2" + +present@^0.0.3: + version "0.0.3" + resolved "https://registry.npmjs.org/present/-/present-0.0.3.tgz" + integrity sha512-d0QMXYTKHuAO0n0IfI/x2lbNwybdNWjRQ08hQySzqMQ2M0gwh/IetTv2glkPJihFn+cMDYjK/BiVgcLcjsASgg== + +prisma@^6.1.0: + version "6.1.0" + resolved "https://registry.npmjs.org/prisma/-/prisma-6.1.0.tgz" + integrity sha512-aFI3Yi+ApUxkwCJJwyQSwpyzUX7YX3ihzuHNHOyv4GJg3X5tQsmRaJEnZ+ZyfHpMtnyahhmXVfbTZ+lS8ZtfKw== + dependencies: + "@prisma/engines" "6.1.0" + optionalDependencies: + fsevents "2.3.3" + +prismjs-terminal@^1.2.3: + version "1.2.3" + resolved "https://registry.npmjs.org/prismjs-terminal/-/prismjs-terminal-1.2.3.tgz" + integrity sha512-xc0zuJ5FMqvW+DpiRkvxURlz98DdfDsZcFHdO699+oL+ykbFfgI7O4VDEgUyc07BSL2NHl3zdb8m/tZ/aaqUrw== + dependencies: + chalk "^5.2.0" + prismjs "^1.29.0" + string-length "^6.0.0" + +prismjs@^1.29.0: + version "1.29.0" + resolved "https://registry.npmjs.org/prismjs/-/prismjs-1.29.0.tgz" + integrity sha512-Kx/1w86q/epKcmte75LNrEoT+lX8pBpavuAbvJWRXar7Hz8jrtF+e3vY751p0R8H9HdArwaCTNDDzHg/ScJK1Q== + +proc-log@^4.0.0, proc-log@^4.1.0, proc-log@^4.2.0: + version "4.2.0" + resolved "https://registry.npmjs.org/proc-log/-/proc-log-4.2.0.tgz" + integrity sha512-g8+OnU/L2v+wyiVK+D5fA34J7EH8jZ8DDlvwhRCMxmMj7UCBvxiO1mGeN+36JXIKF4zevU4kRBd8lVgG9vLelA== + +process-nextick-args@~2.0.0: + version "2.0.1" + resolved "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz" + integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== + +process-on-spawn@^1.0.0: + version "1.1.0" + resolved "https://registry.npmjs.org/process-on-spawn/-/process-on-spawn-1.1.0.tgz" + integrity sha512-JOnOPQ/8TZgjs1JIH/m9ni7FfimjNa/PRx7y/Wb5qdItsnhO0jE4AT7fC0HjC28DUQWDr50dwSYZLdRMlqDq3Q== + dependencies: + fromentries "^1.2.0" + +process@^0.11.1: + version "0.11.10" + resolved "https://registry.npmjs.org/process/-/process-0.11.10.tgz" + integrity sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A== + +prom-client@^14.0.1: + version "14.2.0" + resolved "https://registry.npmjs.org/prom-client/-/prom-client-14.2.0.tgz" + integrity sha512-sF308EhTenb/pDRPakm+WgiN+VdM/T1RaHj1x+MvAuT8UiQP8JmOEbxVqtkbfR4LrvOg5n7ic01kRBDGXjYikA== + dependencies: + tdigest "^0.1.1" + +promise-inflight@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz" + integrity sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g== + +promise-retry@^2.0.1: + version "2.0.1" + resolved "https://registry.npmjs.org/promise-retry/-/promise-retry-2.0.1.tgz" + integrity sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g== + dependencies: + err-code "^2.0.2" + retry "^0.12.0" + +property-expr@^2.0.4: + version "2.0.6" + resolved "https://registry.npmjs.org/property-expr/-/property-expr-2.0.6.tgz" + integrity sha512-SVtmxhRE/CGkn3eZY1T6pC8Nln6Fr/lu1mKSgRud0eC73whjGfoAogbn78LkD8aFL0zz3bAFerKSnOl7NlErBA== + +protobufjs@^7.2.3, protobufjs@^7.2.4, protobufjs@^7.2.5: + version "7.4.0" + resolved "https://registry.npmjs.org/protobufjs/-/protobufjs-7.4.0.tgz" + integrity sha512-mRUWCc3KUU4w1jU8sGxICXH/gNS94DvI1gxqDvBzhj1JpcsimQkYiOJfwsPUykUI5ZaspFbSgmBLER8IrQ3tqw== + dependencies: + "@protobufjs/aspromise" "^1.1.2" + "@protobufjs/base64" "^1.1.2" + "@protobufjs/codegen" "^2.0.4" + "@protobufjs/eventemitter" "^1.1.0" + "@protobufjs/fetch" "^1.1.0" + "@protobufjs/float" "^1.0.2" + "@protobufjs/inquire" "^1.1.0" + "@protobufjs/path" "^1.1.2" + "@protobufjs/pool" "^1.1.0" + "@protobufjs/utf8" "^1.1.0" + "@types/node" ">=13.7.0" + long "^5.0.0" + +proxy-addr@~2.0.7: + version "2.0.7" + resolved "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz" + integrity sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg== + dependencies: + forwarded "0.2.0" + ipaddr.js "1.9.1" + +proxy-from-env@^1.1.0: + version "1.1.0" + resolved "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz" + integrity sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg== + +psl@^1.1.33: + version "1.15.0" + resolved "https://registry.npmjs.org/psl/-/psl-1.15.0.tgz" + integrity sha512-JZd3gMVBAVQkSs6HdNZo9Sdo0LNcQeMNP3CozBJb3JYC/QUYZTnKxP+f8oWRX4rHP5EurWxqAHTSwUCjlNKa1w== + dependencies: + punycode "^2.3.1" + +pump@^3.0.0: + version "3.0.2" + resolved "https://registry.npmjs.org/pump/-/pump-3.0.2.tgz" + integrity sha512-tUPXtzlGM8FE3P0ZL6DVs/3P58k9nk8/jZeQCurTJylQA8qFYzHFfhBJkuqyE0FifOsQ0uKWekiZ5g8wtr28cw== + dependencies: + end-of-stream "^1.1.0" + once "^1.3.1" + +punycode@1.3.2: + version "1.3.2" + resolved "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz" + integrity sha512-RofWgt/7fL5wP1Y7fxE7/EmTLzQVnB0ycyibJ0OOHIlJqTNzglYFxVwETOcIoJqJmpDXJ9xImDv+Fq34F/d4Dw== + +punycode@^2.1.0, punycode@^2.1.1, punycode@^2.3.1: + version "2.3.1" + resolved "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz" + integrity sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg== + +q@^1.5.0: + version "1.5.1" + resolved "https://registry.npmjs.org/q/-/q-1.5.1.tgz" + integrity sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw== + +qs@6.13.0: + version "6.13.0" + resolved "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz" + integrity sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg== + dependencies: + side-channel "^1.0.6" + +qs@^6.11.0: + version "6.13.1" + resolved "https://registry.npmjs.org/qs/-/qs-6.13.1.tgz" + integrity sha512-EJPeIn0CYrGu+hli1xilKAPXODtJ12T0sP63Ijx2/khC2JtuaN3JyNIpvmnkmaEtha9ocbG4A4cMcr+TvqvwQg== + dependencies: + side-channel "^1.0.6" + +qs@~6.5.3: + version "6.5.3" + resolved "https://registry.npmjs.org/qs/-/qs-6.5.3.tgz" + integrity sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA== + +querystring@0.2.0: + version "0.2.0" + resolved "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz" + integrity sha512-X/xY82scca2tau62i9mDyU9K+I+djTMUsvwf7xnUX5GLvVzgJybOJf4Y6o9Zx3oJK/LSXg5tTZBjwzqVPaPO2g== + +querystringify@^2.1.1: + version "2.2.0" + resolved "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz" + integrity sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ== + +queue-microtask@^1.2.2: + version "1.2.3" + resolved "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz" + integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== + +quick-lru@^5.1.1: + version "5.1.1" + resolved "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz" + integrity sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA== + +quickjs-emscripten-core@0.29.2: + version "0.29.2" + resolved "https://registry.npmjs.org/quickjs-emscripten-core/-/quickjs-emscripten-core-0.29.2.tgz" + integrity sha512-jEAiURW4jGqwO/fW01VwlWqa2G0AJxnN5FBy1xnVu8VIVhVhiaxUfCe+bHqS6zWzfjFm86HoO40lzpteusvyJA== + dependencies: + "@jitl/quickjs-ffi-types" "0.29.2" + +quickjs-emscripten@^0.29.2: + version "0.29.2" + resolved "https://registry.npmjs.org/quickjs-emscripten/-/quickjs-emscripten-0.29.2.tgz" + integrity sha512-SlvkvyZgarReu2nr4rkf+xz1vN0YDUz7sx4WHz8LFtK6RNg4/vzAGcFjE7nfHYBEbKrzfIWvKnMnxZkctQ898w== + dependencies: + "@jitl/quickjs-wasmfile-debug-asyncify" "0.29.2" + "@jitl/quickjs-wasmfile-debug-sync" "0.29.2" + "@jitl/quickjs-wasmfile-release-asyncify" "0.29.2" + "@jitl/quickjs-wasmfile-release-sync" "0.29.2" + quickjs-emscripten-core "0.29.2" + +quote-unquote@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/quote-unquote/-/quote-unquote-1.0.0.tgz" + integrity sha512-twwRO/ilhlG/FIgYeKGFqyHhoEhqgnKVkcmqMKi2r524gz3ZbDTcyFt38E9xjJI2vT+KbRNHVbnJ/e0I25Azwg== + +random-bytes@~1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/random-bytes/-/random-bytes-1.0.0.tgz" + integrity sha512-iv7LhNVO047HzYR3InF6pUcUsPQiHTM1Qal51DcGSuZFBil1aBBWG5eHPNek7bvILMaYJ/8RU1e8w1AMdHmLQQ== + +range-parser@^1.2.1, range-parser@~1.2.1: + version "1.2.1" + resolved "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz" + integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== + +raw-body@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/raw-body/-/raw-body-3.0.0.tgz" + integrity sha512-RmkhL8CAyCRPXCE28MMH0z2PNWQBNk2Q09ZdxM9IOOXwxwZbN+qbWaatPkdkWIKL2ZVDImrN/pK5HTRz2PcS4g== + dependencies: + bytes "3.1.2" + http-errors "2.0.0" + iconv-lite "0.6.3" + unpipe "1.0.0" + +rc@^1.2.8: + version "1.2.8" + resolved "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz" + integrity sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw== + dependencies: + deep-extend "^0.6.0" + ini "~1.3.0" + minimist "^1.2.0" + strip-json-comments "~2.0.1" + +react-element-to-jsx-string@^15.0.0: + version "15.0.0" + resolved "https://registry.npmjs.org/react-element-to-jsx-string/-/react-element-to-jsx-string-15.0.0.tgz" + integrity sha512-UDg4lXB6BzlobN60P8fHWVPX3Kyw8ORrTeBtClmIlGdkOOE+GYQSFvmEU5iLLpwp/6v42DINwNcwOhOLfQ//FQ== + dependencies: + "@base2/pretty-print-object" "1.0.1" + is-plain-object "5.0.0" + react-is "18.1.0" + +react-is@18.1.0: + version "18.1.0" + resolved "https://registry.npmjs.org/react-is/-/react-is-18.1.0.tgz" + integrity sha512-Fl7FuabXsJnV5Q1qIOQwx/sagGF18kogb4gpfcG4gjLBWO0WDiiz1ko/ExayuxE7InyQkBLkxRFG5oxY6Uu3Kg== + +react-reconciler@^0.29.0: + version "0.29.2" + resolved "https://registry.npmjs.org/react-reconciler/-/react-reconciler-0.29.2.tgz" + integrity sha512-zZQqIiYgDCTP/f1N/mAR10nJGrPD2ZR+jDSEsKWJHYC7Cm2wodlwbR3upZRdC3cjIjSlTLNVyO7Iu0Yy7t2AYg== + dependencies: + loose-envify "^1.1.0" + scheduler "^0.23.2" + +react@^18.2.0: + version "18.3.1" + resolved "https://registry.npmjs.org/react/-/react-18.3.1.tgz" + integrity sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ== + dependencies: + loose-envify "^1.1.0" + +read-package-json-fast@^3.0.0: + version "3.0.2" + resolved "https://registry.npmjs.org/read-package-json-fast/-/read-package-json-fast-3.0.2.tgz" + integrity sha512-0J+Msgym3vrLOUB3hzQCuZHII0xkNGCtz/HJH9xZshwv9DbDwkw1KaE3gx/e2J5rpEY5rtOy6cyhKOPrkP7FZw== + dependencies: + json-parse-even-better-errors "^3.0.0" + npm-normalize-package-bin "^3.0.0" + +read-package-json@^7.0.0: + version "7.0.1" + resolved "https://registry.npmjs.org/read-package-json/-/read-package-json-7.0.1.tgz" + integrity sha512-8PcDiZ8DXUjLf687Ol4BR8Bpm2umR7vhoZOzNRt+uxD9GpBh/K+CAAALVIiYFknmvlmyg7hM7BSNUXPaCCqd0Q== + dependencies: + glob "^10.2.2" + json-parse-even-better-errors "^3.0.0" + normalize-package-data "^6.0.0" + npm-normalize-package-bin "^3.0.0" + +read-pkg-up@^7.0.1: + version "7.0.1" + resolved "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz" + integrity sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg== + dependencies: + find-up "^4.1.0" + read-pkg "^5.2.0" + type-fest "^0.8.1" + +read-pkg@^5.2.0: + version "5.2.0" + resolved "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz" + integrity sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg== + dependencies: + "@types/normalize-package-data" "^2.4.0" + normalize-package-data "^2.5.0" + parse-json "^5.0.0" + type-fest "^0.6.0" + +readable-stream@^2.0.0, readable-stream@^2.0.5, readable-stream@^2.2.2: + version "2.3.8" + resolved "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz" + integrity sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA== + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.3" + isarray "~1.0.0" + process-nextick-args "~2.0.0" + safe-buffer "~5.1.1" + string_decoder "~1.1.1" + util-deprecate "~1.0.1" + +readable-stream@^3.1.1, readable-stream@^3.4.0, readable-stream@^3.6.0, readable-stream@^3.6.2: + version "3.6.2" + resolved "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz" + integrity sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA== + dependencies: + inherits "^2.0.3" + string_decoder "^1.1.1" + util-deprecate "^1.0.1" + +readdir-glob@^1.1.2: + version "1.1.3" + resolved "https://registry.npmjs.org/readdir-glob/-/readdir-glob-1.1.3.tgz" + integrity sha512-v05I2k7xN8zXvPD9N+z/uhXPaj0sUFCe2rcWZIpBsqxfP7xXFQ0tipAd/wjj1YxWyWtUS5IDJpOG82JKt2EAVA== + dependencies: + minimatch "^5.1.0" + +readdirp@~3.6.0: + version "3.6.0" + resolved "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz" + integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA== + dependencies: + picomatch "^2.2.1" + +regenerator-runtime@^0.14.0: + version "0.14.1" + resolved "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz" + integrity sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw== + +require-directory@^2.1.1: + version "2.1.1" + resolved "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz" + integrity sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q== + +require-from-string@^2.0.2: + version "2.0.2" + resolved "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz" + integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw== + +requirejs-config-file@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/requirejs-config-file/-/requirejs-config-file-4.0.0.tgz" + integrity sha512-jnIre8cbWOyvr8a5F2KuqBnY+SDA4NXr/hzEZJG79Mxm2WiFQz2dzhC8ibtPJS7zkmBEl1mxSwp5HhC1W4qpxw== + dependencies: + esprima "^4.0.0" + stringify-object "^3.2.1" + +requirejs@^2.3.6: + version "2.3.7" + resolved "https://registry.npmjs.org/requirejs/-/requirejs-2.3.7.tgz" + integrity sha512-DouTG8T1WanGok6Qjg2SXuCMzszOo0eHeH9hDZ5Y4x8Je+9JB38HdTLT4/VA8OaUhBa0JPVHJ0pyBkM1z+pDsw== + +requires-port@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz" + integrity sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ== + +resolve-alpn@^1.0.0: + version "1.2.1" + resolved "https://registry.npmjs.org/resolve-alpn/-/resolve-alpn-1.2.1.tgz" + integrity sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g== + +resolve-dependency-path@^3.0.2: + version "3.0.2" + resolved "https://registry.npmjs.org/resolve-dependency-path/-/resolve-dependency-path-3.0.2.tgz" + integrity sha512-Tz7zfjhLfsvR39ADOSk9us4421J/1ztVBo4rWUkF38hgHK5m0OCZ3NxFVpqHRkjctnwVa15igEUHFJp8MCS7vA== + +resolve-dir@^1.0.0, resolve-dir@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/resolve-dir/-/resolve-dir-1.0.1.tgz" + integrity sha512-R7uiTjECzvOsWSfdM0QKFNBVFcK27aHOUwdvK53BcW8zqnGdYp0Fbj82cy54+2A4P2tFM22J5kRfe1R+lM/1yg== + dependencies: + expand-tilde "^2.0.0" + global-modules "^1.0.0" + +resolve-from@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz" + integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== + +resolve-from@^5.0.0: + version "5.0.0" + resolved "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz" + integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw== + +resolve-import@^1.4.5: + version "1.4.6" + resolved "https://registry.npmjs.org/resolve-import/-/resolve-import-1.4.6.tgz" + integrity sha512-CIw9e64QcKcCFUj9+KxUCJPy8hYofv6eVfo3U9wdhCm2E4IjvFnZ6G4/yIC4yP3f11+h6uU5b3LdS7O64LgqrA== + dependencies: + glob "^10.3.3" + walk-up-path "^3.0.1" + +resolve-pkg-maps@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz" + integrity sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw== + +resolve@^1.10.0, resolve@^1.22.3: + version "1.22.9" + resolved "https://registry.npmjs.org/resolve/-/resolve-1.22.9.tgz" + integrity sha512-QxrmX1DzraFIi9PxdG5VkRfRwIgjwyud+z/iBwfRRrVmHc+P9Q7u2lSSpQ6bjr2gy5lrqIiU9vb6iAeGf2400A== + dependencies: + is-core-module "^2.16.0" + path-parse "^1.0.7" + supports-preserve-symlinks-flag "^1.0.0" + +responselike@^2.0.0: + version "2.0.1" + resolved "https://registry.npmjs.org/responselike/-/responselike-2.0.1.tgz" + integrity sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw== + dependencies: + lowercase-keys "^2.0.0" + +restore-cursor@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz" + integrity sha512-6IzJLuGi4+R14vwagDHX+JrXmPVtPpn4mffDJ1UdR7/Edm87fl6yi8mMBIVvFtJaNTUvjughmW4hwLhRG7gC1Q== + dependencies: + onetime "^2.0.0" + signal-exit "^3.0.2" + +restore-cursor@^3.1.0: + version "3.1.0" + resolved "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz" + integrity sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA== + dependencies: + onetime "^5.1.0" + signal-exit "^3.0.2" + +restore-cursor@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/restore-cursor/-/restore-cursor-4.0.0.tgz" + integrity sha512-I9fPXU9geO9bHOt9pHHOhOkYerIMsmVaWB0rA2AI9ERh/+x/i7MV5HKBNrg+ljO5eoPVgCcnFuRjJ9uH6I/3eg== + dependencies: + onetime "^5.1.0" + signal-exit "^3.0.2" + +restore-cursor@^5.0.0: + version "5.1.0" + resolved "https://registry.npmjs.org/restore-cursor/-/restore-cursor-5.1.0.tgz" + integrity sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA== + dependencies: + onetime "^7.0.0" + signal-exit "^4.1.0" + +retry@^0.12.0: + version "0.12.0" + resolved "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz" + integrity sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow== + +reusify@^1.0.4: + version "1.0.4" + resolved "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz" + integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== + +rfdc@^1.4.1: + version "1.4.1" + resolved "https://registry.npmjs.org/rfdc/-/rfdc-1.4.1.tgz" + integrity sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA== + +rimraf@^3.0.0: + version "3.0.2" + resolved "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz" + integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== + dependencies: + glob "^7.1.3" + +rimraf@^5.0.1, rimraf@^5.0.5: + version "5.0.10" + resolved "https://registry.npmjs.org/rimraf/-/rimraf-5.0.10.tgz" + integrity sha512-l0OE8wL34P4nJH/H2ffoaniAokM2qSmrtXHmlpvYr5AVVX8msAyW0l8NVJFDxlSK4u3Uh/f41cQheDVdnYijwQ== + dependencies: + glob "^10.3.7" + +rimraf@~2.6.2: + version "2.6.3" + resolved "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz" + integrity sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA== + dependencies: + glob "^7.1.3" + +rollup@^4.20.0: + version "4.28.1" + resolved "https://registry.npmjs.org/rollup/-/rollup-4.28.1.tgz" + integrity sha512-61fXYl/qNVinKmGSTHAZ6Yy8I3YIJC/r2m9feHo6SwVAVcLT5MPwOUFe7EuURA/4m0NR8lXG4BBXuo/IZEsjMg== + dependencies: + "@types/estree" "1.0.6" + optionalDependencies: + "@rollup/rollup-android-arm-eabi" "4.28.1" + "@rollup/rollup-android-arm64" "4.28.1" + "@rollup/rollup-darwin-arm64" "4.28.1" + "@rollup/rollup-darwin-x64" "4.28.1" + "@rollup/rollup-freebsd-arm64" "4.28.1" + "@rollup/rollup-freebsd-x64" "4.28.1" + "@rollup/rollup-linux-arm-gnueabihf" "4.28.1" + "@rollup/rollup-linux-arm-musleabihf" "4.28.1" + "@rollup/rollup-linux-arm64-gnu" "4.28.1" + "@rollup/rollup-linux-arm64-musl" "4.28.1" + "@rollup/rollup-linux-loongarch64-gnu" "4.28.1" + "@rollup/rollup-linux-powerpc64le-gnu" "4.28.1" + "@rollup/rollup-linux-riscv64-gnu" "4.28.1" + "@rollup/rollup-linux-s390x-gnu" "4.28.1" + "@rollup/rollup-linux-x64-gnu" "4.28.1" + "@rollup/rollup-linux-x64-musl" "4.28.1" + "@rollup/rollup-win32-arm64-msvc" "4.28.1" + "@rollup/rollup-win32-ia32-msvc" "4.28.1" + "@rollup/rollup-win32-x64-msvc" "4.28.1" + fsevents "~2.3.2" + +router@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/router/-/router-2.0.0.tgz" + integrity sha512-dIM5zVoG8xhC6rnSN8uoAgFARwTE7BQs8YwHEvK0VCmfxQXMaOuA1uiR1IPwsW7JyK5iTt7Od/TC9StasS2NPQ== + dependencies: + array-flatten "3.0.0" + is-promise "4.0.0" + methods "~1.1.2" + parseurl "~1.3.3" + path-to-regexp "^8.0.0" + setprototypeof "1.2.0" + utils-merge "1.0.1" + +run-async@^2.2.0, run-async@^2.3.0, run-async@^2.4.0: + version "2.4.1" + resolved "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz" + integrity sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ== + +run-async@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/run-async/-/run-async-3.0.0.tgz" + integrity sha512-540WwVDOMxA6dN6We19EcT9sc3hkXPw5mzRNGM3FkdN/vtE9NFvj5lFAPNwUDmJjXidm3v7TC1cTE7t17Ulm1Q== + +run-parallel@^1.1.9: + version "1.2.0" + resolved "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz" + integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== + dependencies: + queue-microtask "^1.2.2" + +rx-lite-aggregates@^4.0.8: + version "4.0.8" + resolved "https://registry.npmjs.org/rx-lite-aggregates/-/rx-lite-aggregates-4.0.8.tgz" + integrity sha512-3xPNZGW93oCjiO7PtKxRK6iOVYBWBvtf9QHDfU23Oc+dLIQmAV//UnyXV/yihv81VS/UqoQPk4NegS8EFi55Hg== + dependencies: + rx-lite "*" + +rx-lite@*, rx-lite@^4.0.8: + version "4.0.8" + resolved "https://registry.npmjs.org/rx-lite/-/rx-lite-4.0.8.tgz" + integrity sha512-Cun9QucwK6MIrp3mry/Y7hqD1oFqTYLQ4pGxaHTjIdaFDWRGGLikqp6u8LcWJnzpoALg9hap+JGk8sFIUuEGNA== + +rxjs@^5.5.2: + version "5.5.12" + resolved "https://registry.npmjs.org/rxjs/-/rxjs-5.5.12.tgz" + integrity sha512-xx2itnL5sBbqeeiVgNPVuQQ1nC8Jp2WfNJhXWHmElW9YmrpS9UVnNzhP3EH3HFqexO5Tlp8GhYY+WEcqcVMvGw== + dependencies: + symbol-observable "1.0.1" + +rxjs@^7.5.5, rxjs@^7.8.1: + version "7.8.1" + resolved "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz" + integrity sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg== + dependencies: + tslib "^2.1.0" + +safe-buffer@5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: + version "5.1.2" + resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz" + integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== + +safe-buffer@5.2.1, safe-buffer@^5.0.1, safe-buffer@^5.1.2, safe-buffer@~5.2.0: + version "5.2.1" + resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz" + integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== + +safe-stable-stringify@^2.3.1: + version "2.5.0" + resolved "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-2.5.0.tgz" + integrity sha512-b3rppTKm9T+PsVCBEOUR46GWI7fdOs00VKZ1+9c1EWDaDMvjQc6tUwuFyIprgGgTcWoVHSKrU8H31ZHA2e0RHA== + +"safer-buffer@>= 2.1.2 < 3", "safer-buffer@>= 2.1.2 < 3.0.0", safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@~2.1.0: + version "2.1.2" + resolved "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz" + integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== + +sass-lookup@^5.0.1: + version "5.0.1" + resolved "https://registry.npmjs.org/sass-lookup/-/sass-lookup-5.0.1.tgz" + integrity sha512-t0X5PaizPc2H4+rCwszAqHZRtr4bugo4pgiCvrBFvIX0XFxnr29g77LJcpyj9A0DcKf7gXMLcgvRjsonYI6x4g== + dependencies: + commander "^10.0.1" + +sax@1.2.1: + version "1.2.1" + resolved "https://registry.npmjs.org/sax/-/sax-1.2.1.tgz" + integrity sha512-8I2a3LovHTOpm7NV5yOyO8IHqgVsfK4+UuySrXU8YXkSRX7k6hCV9b3HrkKCr3nMpgj+0bmocaJJWpvp1oc7ZA== + +sax@>=0.6.0: + version "1.4.1" + resolved "https://registry.npmjs.org/sax/-/sax-1.4.1.tgz" + integrity sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg== + +scheduler@^0.23.0, scheduler@^0.23.2: + version "0.23.2" + resolved "https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz" + integrity sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ== + dependencies: + loose-envify "^1.1.0" + +seedrandom@3.0.5: + version "3.0.5" + resolved "https://registry.npmjs.org/seedrandom/-/seedrandom-3.0.5.tgz" + integrity sha512-8OwmbklUNzwezjGInmZ+2clQmExQPvomqjL7LFqOYqtmuxRgQYqOD3mHaU+MvZn5FLUeVxVfQjwLZW/n/JFuqg== + +"semver@2 || 3 || 4 || 5": + version "5.7.2" + resolved "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz" + integrity sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g== + +semver@^6.3.1: + version "6.3.1" + resolved "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz" + integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== + +semver@^7.1.1, semver@^7.3.5, semver@^7.3.7, semver@^7.5.3, semver@^7.5.4, semver@^7.6.0, semver@^7.6.3: + version "7.6.3" + resolved "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz" + integrity sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A== + +send@^1.0.0, send@^1.1.0: + version "1.1.0" + resolved "https://registry.npmjs.org/send/-/send-1.1.0.tgz" + integrity sha512-v67WcEouB5GxbTWL/4NeToqcZiAWEq90N888fczVArY8A79J0L4FD7vj5hm3eUMua5EpoQ59wa/oovY6TLvRUA== + dependencies: + debug "^4.3.5" + destroy "^1.2.0" + encodeurl "^2.0.0" + escape-html "^1.0.3" + etag "^1.8.1" + fresh "^0.5.2" + http-errors "^2.0.0" + mime-types "^2.1.35" + ms "^2.1.3" + on-finished "^2.4.1" + range-parser "^1.2.1" + statuses "^2.0.1" + +serve-static@^2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/serve-static/-/serve-static-2.1.0.tgz" + integrity sha512-A3We5UfEjG8Z7VkDv6uItWw6HY2bBSBJT1KtVESn6EOoOr2jAxNhxWCLY3jDE2WcuHXByWju74ck3ZgLwL8xmA== + dependencies: + encodeurl "^2.0.0" + escape-html "^1.0.3" + parseurl "^1.3.3" + send "^1.0.0" + +set-function-length@^1.2.2: + version "1.2.2" + resolved "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz" + integrity sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg== + dependencies: + define-data-property "^1.1.4" + es-errors "^1.3.0" + function-bind "^1.1.2" + get-intrinsic "^1.2.4" + gopd "^1.0.1" + has-property-descriptors "^1.0.2" + +setprototypeof@1.2.0: + version "1.2.0" + resolved "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz" + integrity sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw== + +shebang-command@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz" + integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== + dependencies: + shebang-regex "^3.0.0" + +shebang-regex@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz" + integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== + +shell-quote@^1.8.1: + version "1.8.2" + resolved "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.2.tgz" + integrity sha512-AzqKpGKjrj7EM6rKVQEPpB288oCfnrEIuyoT9cyF4nmGa7V8Zk6f7RRqYisX8X9m+Q7bd632aZW4ky7EhbQztA== + +side-channel-list@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz" + integrity sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA== + dependencies: + es-errors "^1.3.0" + object-inspect "^1.13.3" + +side-channel-map@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz" + integrity sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA== + dependencies: + call-bound "^1.0.2" + es-errors "^1.3.0" + get-intrinsic "^1.2.5" + object-inspect "^1.13.3" + +side-channel-weakmap@^1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz" + integrity sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A== + dependencies: + call-bound "^1.0.2" + es-errors "^1.3.0" + get-intrinsic "^1.2.5" + object-inspect "^1.13.3" + side-channel-map "^1.0.1" + +side-channel@^1.0.6: + version "1.1.0" + resolved "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz" + integrity sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw== + dependencies: + es-errors "^1.3.0" + object-inspect "^1.13.3" + side-channel-list "^1.0.0" + side-channel-map "^1.0.1" + side-channel-weakmap "^1.0.2" + +siginfo@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/siginfo/-/siginfo-2.0.0.tgz" + integrity sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g== + +signal-exit@4.1, signal-exit@^4.0.1, signal-exit@^4.0.2, signal-exit@^4.1.0: + version "4.1.0" + resolved "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz" + integrity sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw== + +signal-exit@^3.0.2, signal-exit@^3.0.3, signal-exit@^3.0.7: + version "3.0.7" + resolved "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz" + integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== + +sigstore@^2.2.0: + version "2.3.1" + resolved "https://registry.npmjs.org/sigstore/-/sigstore-2.3.1.tgz" + integrity sha512-8G+/XDU8wNsJOQS5ysDVO0Etg9/2uA5gR9l4ZwijjlwxBcrU6RPfwi2+jJmbP+Ap1Hlp/nVAaEO4Fj22/SL2gQ== + dependencies: + "@sigstore/bundle" "^2.3.2" + "@sigstore/core" "^1.0.0" + "@sigstore/protobuf-specs" "^0.3.2" + "@sigstore/sign" "^2.3.2" + "@sigstore/tuf" "^2.3.4" + "@sigstore/verify" "^1.2.1" + +simple-swizzle@^0.2.2: + version "0.2.2" + resolved "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz" + integrity sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg== + dependencies: + is-arrayish "^0.3.1" + +sirv@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/sirv/-/sirv-3.0.0.tgz" + integrity sha512-BPwJGUeDaDCHihkORDchNyyTvWFhcusy1XMmhEVTQTwGeybFbp8YEmB+njbPnth1FibULBSBVwCQni25XlCUDg== + dependencies: + "@polka/url" "^1.0.0-next.24" + mrmime "^2.0.0" + totalist "^3.0.0" + +slash@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz" + integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== + +slice-ansi@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/slice-ansi/-/slice-ansi-1.0.0.tgz" + integrity sha512-POqxBK6Lb3q6s047D/XsDVNPnF9Dl8JSaqe9h9lURl0OdNqy/ujDrOiIHtsqXMGbWWTIomRzAMaTyawAU//Reg== + dependencies: + is-fullwidth-code-point "^2.0.0" + +slice-ansi@^5.0.0: + version "5.0.0" + resolved "https://registry.npmjs.org/slice-ansi/-/slice-ansi-5.0.0.tgz" + integrity sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ== + dependencies: + ansi-styles "^6.0.0" + is-fullwidth-code-point "^4.0.0" + +slice-ansi@^6.0.0: + version "6.0.0" + resolved "https://registry.npmjs.org/slice-ansi/-/slice-ansi-6.0.0.tgz" + integrity sha512-6bn4hRfkTvDfUoEQYkERg0BVF1D0vrX9HEkMl08uDiNWvVvjylLHvZFZWkDo6wjT8tUctbYl1nCOuE66ZTaUtA== + dependencies: + ansi-styles "^6.2.1" + is-fullwidth-code-point "^4.0.0" + +slice-ansi@^7.1.0: + version "7.1.0" + resolved "https://registry.npmjs.org/slice-ansi/-/slice-ansi-7.1.0.tgz" + integrity sha512-bSiSngZ/jWeX93BqeIAbImyTbEihizcwNjFoRUIY/T1wWQsfsm2Vw1agPKylXvQTU7iASGdHhyqRlqQzfz+Htg== + dependencies: + ansi-styles "^6.2.1" + is-fullwidth-code-point "^5.0.0" + +smart-buffer@^4.2.0: + version "4.2.0" + resolved "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz" + integrity sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg== + +socket.io-client@^4.5.1: + version "4.8.1" + resolved "https://registry.npmjs.org/socket.io-client/-/socket.io-client-4.8.1.tgz" + integrity sha512-hJVXfu3E28NmzGk8o1sHhN3om52tRvwYeidbj7xKy2eIIse5IoKX3USlS6Tqt3BHAtflLIkCQBkzVrEEfWUyYQ== + dependencies: + "@socket.io/component-emitter" "~3.1.0" + debug "~4.3.2" + engine.io-client "~6.6.1" + socket.io-parser "~4.2.4" + +socket.io-parser@~4.2.4: + version "4.2.4" + resolved "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.2.4.tgz" + integrity sha512-/GbIKmo8ioc+NIWIhwdecY0ge+qVBSMdgxGygevmdHj24bsfgtCmcUUcQ5ZzcylGFHsN3k4HB4Cgkl96KVnuew== + dependencies: + "@socket.io/component-emitter" "~3.1.0" + debug "~4.3.1" + +socketio-wildcard@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/socketio-wildcard/-/socketio-wildcard-2.0.0.tgz" + integrity sha512-Bf3ioZq15Z2yhFLDasRvbYitg82rwm+5AuER5kQvEQHhNFf4R4K5o/h57nEpN7A59T9FyRtTj34HZfMWAruw/A== + +socks-proxy-agent@^8.0.2, socks-proxy-agent@^8.0.3: + version "8.0.5" + resolved "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-8.0.5.tgz" + integrity sha512-HehCEsotFqbPW9sJ8WVYB6UbmIMv7kUUORIF2Nncq4VQvBfNBLibW9YZR5dlYCSUhwcD628pRllm7n+E+YTzJw== + dependencies: + agent-base "^7.1.2" + debug "^4.3.4" + socks "^2.8.3" + +socks@^2.8.3: + version "2.8.3" + resolved "https://registry.npmjs.org/socks/-/socks-2.8.3.tgz" + integrity sha512-l5x7VUUWbjVFbafGLxPWkYsHIhEvmF85tbIeFZWc8ZPtoMyybuEhL7Jye/ooC4/d48FgOjSJXgsF/AJPYCW8Zw== + dependencies: + ip-address "^9.0.5" + smart-buffer "^4.2.0" + +source-map-js@^1.2.0, source-map-js@^1.2.1: + version "1.2.1" + resolved "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz" + integrity sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA== + +source-map-support@0.3.3: + version "0.3.3" + resolved "https://registry.npmjs.org/source-map-support/-/source-map-support-0.3.3.tgz" + integrity sha512-9O4+y9n64RewmFoKUZ/5Tx9IHIcXM6Q+RTSw6ehnqybUz4a7iwR3Eaw80uLtqqQ5D0C+5H03D4KKGo9PdP33Gg== + dependencies: + source-map "0.1.32" + +source-map@0.1.32: + version "0.1.32" + resolved "https://registry.npmjs.org/source-map/-/source-map-0.1.32.tgz" + integrity sha512-htQyLrrRLkQ87Zfrir4/yN+vAUd6DNjVayEjTSHXu29AYQJw57I4/xEL/M6p6E/woPNJwvZt6rVlzc7gFEJccQ== + dependencies: + amdefine ">=0.0.4" + +source-map@~0.6.1: + version "0.6.1" + resolved "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz" + integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== + +spdx-compare@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/spdx-compare/-/spdx-compare-1.0.0.tgz" + integrity sha512-C1mDZOX0hnu0ep9dfmuoi03+eOdDoz2yvK79RxbcrVEG1NO1Ph35yW102DHWKN4pk80nwCgeMmSY5L25VE4D9A== + dependencies: + array-find-index "^1.0.2" + spdx-expression-parse "^3.0.0" + spdx-ranges "^2.0.0" + +spdx-correct@^3.0.0: + version "3.2.0" + resolved "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz" + integrity sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA== + dependencies: + spdx-expression-parse "^3.0.0" + spdx-license-ids "^3.0.0" + +spdx-exceptions@^2.1.0: + version "2.5.0" + resolved "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.5.0.tgz" + integrity sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w== + +spdx-expression-parse@4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-4.0.0.tgz" + integrity sha512-Clya5JIij/7C6bRR22+tnGXbc4VKlibKSVj2iHvVeX5iMW7s1SIQlqu699JkODJJIhh/pUu8L0/VLh8xflD+LQ== + dependencies: + spdx-exceptions "^2.1.0" + spdx-license-ids "^3.0.0" + +spdx-expression-parse@^3.0.0: + version "3.0.1" + resolved "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz" + integrity sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q== + dependencies: + spdx-exceptions "^2.1.0" + spdx-license-ids "^3.0.0" + +spdx-license-ids@^3.0.0: + version "3.0.20" + resolved "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.20.tgz" + integrity sha512-jg25NiDV/1fLtSgEgyvVyDunvaNHbuwF9lfNV17gSmPFAlYzdfNBlLtLzXTevwkPj7DhGbmN9VnmJIgLnhvaBw== + +spdx-ranges@^2.0.0: + version "2.1.1" + resolved "https://registry.npmjs.org/spdx-ranges/-/spdx-ranges-2.1.1.tgz" + integrity sha512-mcdpQFV7UDAgLpXEE/jOMqvK4LBoO0uTQg0uvXUewmEFhpiZx5yJSZITHB8w1ZahKdhfZqP5GPEOKLyEq5p8XA== + +spdx-satisfies@5.0.1: + version "5.0.1" + resolved "https://registry.npmjs.org/spdx-satisfies/-/spdx-satisfies-5.0.1.tgz" + integrity sha512-Nwor6W6gzFp8XX4neaKQ7ChV4wmpSh2sSDemMFSzHxpTw460jxFYeOn+jq4ybnSSw/5sc3pjka9MQPouksQNpw== + dependencies: + spdx-compare "^1.0.0" + spdx-expression-parse "^3.0.0" + spdx-ranges "^2.0.0" + +split2@^4.0.0: + version "4.2.0" + resolved "https://registry.npmjs.org/split2/-/split2-4.2.0.tgz" + integrity sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg== + +sprintf-js@^1.1.3: + version "1.1.3" + resolved "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.3.tgz" + integrity sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA== + +sprintf-js@~1.0.2: + version "1.0.3" + resolved "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz" + integrity sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g== + +sqs-consumer@5.8.0: + version "5.8.0" + resolved "https://registry.npmjs.org/sqs-consumer/-/sqs-consumer-5.8.0.tgz" + integrity sha512-pJReMEtDM9/xzQTffb7dxMD5MKagBfOW65m+ITsbpNk0oZmJ38tTC4LPmj0/7ZcKSOqi2LrpA1b0qGYOwxlHJg== + dependencies: + aws-sdk "^2.1271.0" + debug "^4.3.4" + +sshpk@^1.14.1: + version "1.18.0" + resolved "https://registry.npmjs.org/sshpk/-/sshpk-1.18.0.tgz" + integrity sha512-2p2KJZTSqQ/I3+HX42EpYOa2l3f8Erv8MWKsy2I9uf4wA7yFIkXRffYdsx86y6z4vHtV8u7g+pPlr8/4ouAxsQ== + dependencies: + asn1 "~0.2.3" + assert-plus "^1.0.0" + bcrypt-pbkdf "^1.0.0" + dashdash "^1.12.0" + ecc-jsbn "~0.1.1" + getpass "^0.1.1" + jsbn "~0.1.0" + safer-buffer "^2.0.2" + tweetnacl "~0.14.0" + +ssri@^10.0.0: + version "10.0.6" + resolved "https://registry.npmjs.org/ssri/-/ssri-10.0.6.tgz" + integrity sha512-MGrFH9Z4NP9Iyhqn16sDtBpRRNJ0Y2hNa6D65h736fVSaPCHr4DM4sWUNvVaSuC+0OBGhwsrydQwmgfg5LncqQ== + dependencies: + minipass "^7.0.3" + +stack-trace@0.0.x: + version "0.0.10" + resolved "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz" + integrity sha512-KGzahc7puUKkzyMt+IqAep+TVNbKP+k2Lmwhub39m1AsTSkaDutx56aDCo+HLDzf/D26BIHTJWNiTG1KAJiQCg== + +stack-utils@^2.0.6: + version "2.0.6" + resolved "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz" + integrity sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ== + dependencies: + escape-string-regexp "^2.0.0" + +stackback@0.0.2: + version "0.0.2" + resolved "https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz" + integrity sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw== + +statuses@2.0.1, statuses@^2.0.1: + version "2.0.1" + resolved "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz" + integrity sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ== + +std-env@^3.8.0: + version "3.8.0" + resolved "https://registry.npmjs.org/std-env/-/std-env-3.8.0.tgz" + integrity sha512-Bc3YwwCB+OzldMxOXJIIvC6cPRWr/LxOp48CdQTOkPyk/t4JWWJbrilwBd7RJzKV8QW7tJkcgAmeuLLJugl5/w== + +stoppable@^1.1.0: + version "1.1.0" + resolved "https://registry.npmjs.org/stoppable/-/stoppable-1.1.0.tgz" + integrity sha512-KXDYZ9dszj6bzvnEMRYvxgeTHU74QBFL54XKtP3nyMuJ81CFYtABZ3bAzL2EdFUaEwJOBOgENyFj3R7oTzDyyw== + +stream-length@^1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/stream-length/-/stream-length-1.0.2.tgz" + integrity sha512-aI+qKFiwoDV4rsXiS7WRoCt+v2RX1nUj17+KJC5r2gfh5xoSJIfP6Y3Do/HtvesFcTSWthIuJ3l1cvKQY/+nZg== + dependencies: + bluebird "^2.6.2" + +streamsearch@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/streamsearch/-/streamsearch-1.1.0.tgz#404dd1e2247ca94af554e841a8ef0eaa238da764" + integrity sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg== + +string-argv@~0.3.2: + version "0.3.2" + resolved "https://registry.npmjs.org/string-argv/-/string-argv-0.3.2.tgz" + integrity sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q== + +string-length@^6.0.0: + version "6.0.0" + resolved "https://registry.npmjs.org/string-length/-/string-length-6.0.0.tgz" + integrity sha512-1U361pxZHEQ+FeSjzqRpV+cu2vTzYeWeafXFLykiFlv4Vc0n3njgU8HrMbyik5uwm77naWMuVG8fhEF+Ovb1Kg== + dependencies: + strip-ansi "^7.1.0" + +"string-width-cjs@npm:string-width@^4.2.0": + version "4.2.3" + resolved "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz" + integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== + dependencies: + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.1" + +string-width@^2.0.0, string-width@^2.1.0, string-width@^2.1.1: + version "2.1.1" + resolved "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz" + integrity sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw== + dependencies: + is-fullwidth-code-point "^2.0.0" + strip-ansi "^4.0.0" + +string-width@^4.0.0, string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: + version "4.2.3" + resolved "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz" + integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== + dependencies: + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.1" + +string-width@^5.0.0, string-width@^5.0.1, string-width@^5.1.2: + version "5.1.2" + resolved "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz" + integrity sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA== + dependencies: + eastasianwidth "^0.2.0" + emoji-regex "^9.2.2" + strip-ansi "^7.0.1" + +string-width@^7.0.0: + version "7.2.0" + resolved "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz" + integrity sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ== + dependencies: + emoji-regex "^10.3.0" + get-east-asian-width "^1.0.0" + strip-ansi "^7.1.0" + +string_decoder@^1.1.1: + version "1.3.0" + resolved "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz" + integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== + dependencies: + safe-buffer "~5.2.0" + +string_decoder@~1.1.1: + version "1.1.1" + resolved "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz" + integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== + dependencies: + safe-buffer "~5.1.0" + +stringify-object@^3.2.1: + version "3.3.0" + resolved "https://registry.npmjs.org/stringify-object/-/stringify-object-3.3.0.tgz" + integrity sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw== + dependencies: + get-own-enumerable-property-symbols "^3.0.0" + is-obj "^1.0.1" + is-regexp "^1.0.0" + +"strip-ansi-cjs@npm:strip-ansi@^6.0.1": + version "6.0.1" + resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz" + integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== + dependencies: + ansi-regex "^5.0.1" + +strip-ansi@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz" + integrity sha512-4XaJ2zQdCzROZDivEVIDPkcQn8LMFSa8kj8Gxb/Lnwzv9A8VctNZ+lfivC/sV3ivW8ElJTERXZoPBRrZKkNKow== + dependencies: + ansi-regex "^3.0.0" + +strip-ansi@^6.0.0, strip-ansi@^6.0.1: + version "6.0.1" + resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz" + integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== + dependencies: + ansi-regex "^5.0.1" + +strip-ansi@^7.0.1, strip-ansi@^7.1.0: + version "7.1.0" + resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz" + integrity sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ== + dependencies: + ansi-regex "^6.0.1" + +strip-bom@4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz" + integrity sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w== + +strip-bom@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz" + integrity sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA== + +strip-final-newline@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz" + integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA== + +strip-final-newline@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz" + integrity sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw== + +strip-json-comments@3.1.1: + version "3.1.1" + resolved "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz" + integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== + +strip-json-comments@~2.0.1: + version "2.0.1" + resolved "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz" + integrity sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ== + +strnum@^1.0.5: + version "1.0.5" + resolved "https://registry.npmjs.org/strnum/-/strnum-1.0.5.tgz" + integrity sha512-J8bbNyKKXl5qYcR36TIO8W3mVGVHrmmxsd5PAItGkmyzwJvybiw2IVq5nqd0i4LSNSkB/sx9VHllbfFdr9k1JA== + +stylus-lookup@^5.0.1: + version "5.0.1" + resolved "https://registry.npmjs.org/stylus-lookup/-/stylus-lookup-5.0.1.tgz" + integrity sha512-tLtJEd5AGvnVy4f9UHQMw4bkJJtaAcmo54N+ovQBjDY3DuWyK9Eltxzr5+KG0q4ew6v2EHyuWWNnHeiw/Eo7rQ== + dependencies: + commander "^10.0.1" + +superagent@^9.0.1: + version "9.0.2" + resolved "https://registry.npmjs.org/superagent/-/superagent-9.0.2.tgz" + integrity sha512-xuW7dzkUpcJq7QnhOsnNUgtYp3xRwpt2F7abdRYIpCsAt0hhUqia0EdxyXZQQpNmGtsCzYHryaKSV3q3GJnq7w== + dependencies: + component-emitter "^1.3.0" + cookiejar "^2.1.4" + debug "^4.3.4" + fast-safe-stringify "^2.1.1" + form-data "^4.0.0" + formidable "^3.5.1" + methods "^1.1.2" + mime "2.6.0" + qs "^6.11.0" + +supertest@^7.0.0: + version "7.0.0" + resolved "https://registry.npmjs.org/supertest/-/supertest-7.0.0.tgz" + integrity sha512-qlsr7fIC0lSddmA3tzojvzubYxvlGtzumcdHgPwbFWMISQwL22MhM2Y3LNt+6w9Yyx7559VW5ab70dgphm8qQA== + dependencies: + methods "^1.1.2" + superagent "^9.0.1" + +supports-color@^5.3.0: + version "5.5.0" + resolved "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz" + integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== + dependencies: + has-flag "^3.0.0" + +supports-color@^7.1.0: + version "7.2.0" + resolved "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz" + integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== + dependencies: + has-flag "^4.0.0" + +supports-color@^8, supports-color@^8.1.1: + version "8.1.1" + resolved "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz" + integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== + dependencies: + has-flag "^4.0.0" + +supports-preserve-symlinks-flag@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz" + integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== + +swagger-ui-dist@>=5.0.0: + version "5.18.2" + resolved "https://registry.npmjs.org/swagger-ui-dist/-/swagger-ui-dist-5.18.2.tgz" + integrity sha512-J+y4mCw/zXh1FOj5wGJvnAajq6XgHOyywsa9yITmwxIlJbMqITq3gYRZHaeqLVH/eV/HOPphE6NjF+nbSNC5Zw== + dependencies: + "@scarf/scarf" "=1.4.0" + +swagger-ui-express@^5.0.1: + version "5.0.1" + resolved "https://registry.npmjs.org/swagger-ui-express/-/swagger-ui-express-5.0.1.tgz" + integrity sha512-SrNU3RiBGTLLmFU8GIJdOdanJTl4TOmT27tt3bWWHppqYmAZ6IDuEuBvMU6nZq0zLEe6b/1rACXCgLZqO6ZfrA== + dependencies: + swagger-ui-dist ">=5.0.0" + +symbol-observable@1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.0.1.tgz" + integrity sha512-Kb3PrPYz4HanVF1LVGuAdW6LoVgIwjUYJGzFe7NDrBLCN4lsV/5J0MFurV+ygS4bRVwrCEt2c7MQ1R2a72oJDw== + +sync-content@^1.0.1, sync-content@^1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/sync-content/-/sync-content-1.0.2.tgz" + integrity sha512-znd3rYiiSxU3WteWyS9a6FXkTA/Wjk8WQsOyzHbineeL837dLn3DA4MRhsIX3qGcxDMH6+uuFV4axztssk7wEQ== + dependencies: + glob "^10.2.6" + mkdirp "^3.0.1" + path-scurry "^1.9.2" + rimraf "^5.0.1" + +tap-parser@16.0.1: + version "16.0.1" + resolved "https://registry.npmjs.org/tap-parser/-/tap-parser-16.0.1.tgz" + integrity sha512-vKianJzSSzLkJ3bHBwzvZDDRi9yGMwkRANJxwPAjAue50owB8rlluYySmTN4tZVH0nsh6stvrQbg9kuCL5svdg== + dependencies: + events-to-array "^2.0.3" + tap-yaml "2.2.2" + +tap-yaml@2.2.2: + version "2.2.2" + resolved "https://registry.npmjs.org/tap-yaml/-/tap-yaml-2.2.2.tgz" + integrity sha512-MWG4OpAKtNoNVjCz/BqlDJiwTM99tiHRhHPS4iGOe1ZS0CgM4jSFH92lthSFvvy4EdDjQZDV7uYqUFlU9JuNhw== + dependencies: + yaml "^2.4.1" + yaml-types "^0.3.0" + +tap@^19.0.2: + version "19.2.5" + resolved "https://registry.npmjs.org/tap/-/tap-19.2.5.tgz" + integrity sha512-Mz7MznUuKCqrN9dr0s8REt6zLg6WLNrvGXwDSaUyPO73dpXXjakYA7YVKRWu6TBnj7NsSYKuHXpQFROlqZ2KTg== + dependencies: + "@tapjs/after" "1.1.31" + "@tapjs/after-each" "2.0.8" + "@tapjs/asserts" "2.0.8" + "@tapjs/before" "2.0.8" + "@tapjs/before-each" "2.0.8" + "@tapjs/chdir" "1.1.4" + "@tapjs/core" "2.1.6" + "@tapjs/filter" "2.0.8" + "@tapjs/fixture" "2.0.8" + "@tapjs/intercept" "2.0.8" + "@tapjs/mock" "2.1.6" + "@tapjs/node-serialize" "2.0.8" + "@tapjs/run" "2.1.7" + "@tapjs/snapshot" "2.0.8" + "@tapjs/spawn" "2.0.8" + "@tapjs/stdin" "2.0.8" + "@tapjs/test" "2.2.4" + "@tapjs/typescript" "1.4.13" + "@tapjs/worker" "2.0.8" + resolve-import "^1.4.5" + +tapable@^2.2.0: + version "2.2.1" + resolved "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz" + integrity sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ== + +tar-stream@^2.2.0: + version "2.2.0" + resolved "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz" + integrity sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ== + dependencies: + bl "^4.0.3" + end-of-stream "^1.4.1" + fs-constants "^1.0.0" + inherits "^2.0.3" + readable-stream "^3.1.1" + +tar@^6.1.11, tar@^6.2.1: + version "6.2.1" + resolved "https://registry.npmjs.org/tar/-/tar-6.2.1.tgz" + integrity sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A== + dependencies: + chownr "^2.0.0" + fs-minipass "^2.0.0" + minipass "^5.0.0" + minizlib "^2.1.1" + mkdirp "^1.0.3" + yallist "^4.0.0" + +tcompare@7.0.1: + version "7.0.1" + resolved "https://registry.npmjs.org/tcompare/-/tcompare-7.0.1.tgz" + integrity sha512-JN5s7hgmg/Ya5HxZqCnywT+XiOGRFcJRgYhtMyt/1m+h0yWpWwApO7HIM8Bpwyno9hI151ljjp5eAPCHhIGbpQ== + dependencies: + diff "^5.2.0" + react-element-to-jsx-string "^15.0.0" + +tdigest@^0.1.1: + version "0.1.2" + resolved "https://registry.npmjs.org/tdigest/-/tdigest-0.1.2.tgz" + integrity sha512-+G0LLgjjo9BZX2MfdvPfH+MKLCrxlXSYec5DaPYP1fe6Iyhf0/fSmJ0bFiZ1F8BT6cGXl2LpltQptzjXKWEkKA== + dependencies: + bintrees "1.0.2" + +temp@^0.9.4: + version "0.9.4" + resolved "https://registry.npmjs.org/temp/-/temp-0.9.4.tgz" + integrity sha512-yYrrsWnrXMcdsnu/7YMYAofM1ktpL5By7vZhf15CrXijWWrEYZks5AXBudalfSWJLlnen/QUJUB5aoB0kqZUGA== + dependencies: + mkdirp "^0.5.1" + rimraf "~2.6.2" + +test-exclude@^6.0.0: + version "6.0.0" + resolved "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz" + integrity sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w== + dependencies: + "@istanbuljs/schema" "^0.1.2" + glob "^7.1.4" + minimatch "^3.0.4" + +test-exclude@^7.0.1: + version "7.0.1" + resolved "https://registry.npmjs.org/test-exclude/-/test-exclude-7.0.1.tgz" + integrity sha512-pFYqmTw68LXVjeWJMST4+borgQP2AyMNbg1BpZh9LbyhUeNkeaPF9gzfPGUAnSMV3qPYdWUwDIjjCLiSDOl7vg== + dependencies: + "@istanbuljs/schema" "^0.1.2" + glob "^10.4.1" + minimatch "^9.0.4" + +text-extensions@^2.0.0: + version "2.4.0" + resolved "https://registry.npmjs.org/text-extensions/-/text-extensions-2.4.0.tgz" + integrity sha512-te/NtwBwfiNRLf9Ijqx3T0nlqZiQ2XrrtBvu+cLL8ZRrGkO0NHTug8MYFKyoSrv/sHTaSKfilUkizV6XhxMJ3g== + +text-hex@1.0.x: + version "1.0.0" + resolved "https://registry.npmjs.org/text-hex/-/text-hex-1.0.0.tgz" + integrity sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg== + +thrift@^0.14.1: + version "0.14.2" + resolved "https://registry.npmjs.org/thrift/-/thrift-0.14.2.tgz" + integrity sha512-bW8EaE6iw3hSt4HB2HpBdHW86Xpb9IUJfqufx4NwEu7OGuIpS0ISj+Yy1Z1Wvhfno6SPNhKRJ1qFXea84HcrOQ== + dependencies: + browser-or-node "^1.2.1" + isomorphic-ws "^4.0.1" + node-int64 "^0.4.0" + q "^1.5.0" + ws "^5.2.2" + +"through@>=2.2.7 <3", through@^2.3.6: + version "2.3.8" + resolved "https://registry.npmjs.org/through/-/through-2.3.8.tgz" + integrity sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg== + +tinybench@^2.9.0: + version "2.9.0" + resolved "https://registry.npmjs.org/tinybench/-/tinybench-2.9.0.tgz" + integrity sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg== + +tinyexec@^0.3.0, tinyexec@^0.3.1: + version "0.3.1" + resolved "https://registry.npmjs.org/tinyexec/-/tinyexec-0.3.1.tgz" + integrity sha512-WiCJLEECkO18gwqIp6+hJg0//p23HXp4S+gGtAKu3mI2F2/sXC4FvHvXvB0zJVVaTPhx1/tOwdbRsa1sOBIKqQ== + +tinyglobby@^0.2.10: + version "0.2.10" + resolved "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.10.tgz" + integrity sha512-Zc+8eJlFMvgatPZTl6A9L/yht8QqdmUNtURHaKZLmKBE12hNPSrqNkUp2cs3M/UKmNVVAMFQYSjYIVHDjW5zew== + dependencies: + fdir "^6.4.2" + picomatch "^4.0.2" + +tinypool@^1.0.1: + version "1.0.2" + resolved "https://registry.npmjs.org/tinypool/-/tinypool-1.0.2.tgz" + integrity sha512-al6n+QEANGFOMf/dmUMsuS5/r9B06uwlyNjZZql/zv8J7ybHCgoihBNORZCY2mzUuAnomQa2JdhyHKzZxPCrFA== + +tinyrainbow@^1.2.0: + version "1.2.0" + resolved "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-1.2.0.tgz" + integrity sha512-weEDEq7Z5eTHPDh4xjX789+fHfF+P8boiFB+0vbWzpbnbsEr/GRaohi/uMKxg8RZMXnl1ItAi/IUHWMsjDV7kQ== + +tinyspy@^3.0.2: + version "3.0.2" + resolved "https://registry.npmjs.org/tinyspy/-/tinyspy-3.0.2.tgz" + integrity sha512-n1cw8k1k0x4pgA2+9XrOkFydTerNcJ1zWCO5Nn9scWHTD+5tp8dghT2x1uduQePZTZgd3Tupf+x9BxJjeJi77Q== + +tldts-core@^6.1.68: + version "6.1.68" + resolved "https://registry.npmjs.org/tldts-core/-/tldts-core-6.1.68.tgz" + integrity sha512-85TdlS/DLW/gVdf2oyyzqp3ocS30WxjaL4la85EArl9cHUR/nizifKAJPziWewSZjDZS71U517/i6ciUeqtB5Q== + +tldts@^6.1.32: + version "6.1.68" + resolved "https://registry.npmjs.org/tldts/-/tldts-6.1.68.tgz" + integrity sha512-JKF17jROiYkjJPT73hUTEiTp2OBCf+kAlB+1novk8i6Q6dWjHsgEjw9VLiipV4KTJavazXhY1QUXyQFSem2T7w== + dependencies: + tldts-core "^6.1.68" + +tmp@0.2.1: + version "0.2.1" + resolved "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz" + integrity sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ== + dependencies: + rimraf "^3.0.0" + +tmp@^0.0.33: + version "0.0.33" + resolved "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz" + integrity sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw== + dependencies: + os-tmpdir "~1.0.2" + +to-regex-range@^5.0.1: + version "5.0.1" + resolved "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz" + integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== + dependencies: + is-number "^7.0.0" + +toidentifier@1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz" + integrity sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA== + +toposort@^2.0.2: + version "2.0.2" + resolved "https://registry.npmjs.org/toposort/-/toposort-2.0.2.tgz" + integrity sha512-0a5EOkAUp8D4moMi2W8ZF8jcga7BgZd91O/yabJCFY8az+XSzeGyTKs0Aoo897iV1Nj6guFq8orWDS96z91oGg== + +totalist@^3.0.0: + version "3.0.1" + resolved "https://registry.npmjs.org/totalist/-/totalist-3.0.1.tgz" + integrity sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ== + +tough-cookie@^4.1.3: + version "4.1.4" + resolved "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.4.tgz" + integrity sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag== + dependencies: + psl "^1.1.33" + punycode "^2.1.1" + universalify "^0.2.0" + url-parse "^1.5.3" + +tough-cookie@^5.0.0-rc.2: + version "5.0.0" + resolved "https://registry.npmjs.org/tough-cookie/-/tough-cookie-5.0.0.tgz" + integrity sha512-FRKsF7cz96xIIeMZ82ehjC3xW2E+O2+v11udrDYewUbszngYhsGa8z6YUMMzO9QJZzzyd0nGGXnML/TReX6W8Q== + dependencies: + tldts "^6.1.32" + +tr46@~0.0.3: + version "0.0.3" + resolved "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz" + integrity sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw== + +tree-kill@^1.2.2: + version "1.2.2" + resolved "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz" + integrity sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A== + +triple-beam@^1.3.0: + version "1.4.1" + resolved "https://registry.npmjs.org/triple-beam/-/triple-beam-1.4.1.tgz" + integrity sha512-aZbgViZrg1QNcG+LULa7nhZpJTZSLm/mXnHXnbAbjmN5aSa0y7V+wvv6+4WaBtpISJzThKy+PIPxc1Nq1EJ9mg== + +trivial-deferred@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/trivial-deferred/-/trivial-deferred-2.0.0.tgz" + integrity sha512-iGbM7X2slv9ORDVj2y2FFUq3cP/ypbtu2nQ8S38ufjL0glBABvmR9pTdsib1XtS2LUhhLMbelaBUaf/s5J3dSw== + +tsconfig-paths@^4.2.0: + version "4.2.0" + resolved "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-4.2.0.tgz" + integrity sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg== + dependencies: + json5 "^2.2.2" + minimist "^1.2.6" + strip-bom "^3.0.0" + +tshy@^1.14.0: + version "1.18.0" + resolved "https://registry.npmjs.org/tshy/-/tshy-1.18.0.tgz" + integrity sha512-FQudIujBazHRu7CVPHKQE9/Xq1Wc7lezxD/FCnTXx2PTcnoSN32DVpb/ZXvzV2NJBTDB3XKjqX8Cdm+2UK1DlQ== + dependencies: + chalk "^5.3.0" + chokidar "^3.6.0" + foreground-child "^3.1.1" + minimatch "^9.0.4" + mkdirp "^3.0.1" + polite-json "^5.0.0" + resolve-import "^1.4.5" + rimraf "^5.0.1" + sync-content "^1.0.2" + typescript "5" + walk-up-path "^3.0.1" + +tslib@2.6.2: + version "2.6.2" + resolved "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz" + integrity sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q== + +tslib@^1.8.1: + version "1.14.1" + resolved "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz" + integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== + +tslib@^2.0.3, tslib@^2.1.0, tslib@^2.2.0, tslib@^2.6.2: + version "2.8.1" + resolved "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz" + integrity sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w== + +tsutils@^3.21.0: + version "3.21.0" + resolved "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz" + integrity sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA== + dependencies: + tslib "^1.8.1" + +tsx@^4.19.2: + version "4.19.2" + resolved "https://registry.npmjs.org/tsx/-/tsx-4.19.2.tgz" + integrity sha512-pOUl6Vo2LUq/bSa8S5q7b91cgNSjctn9ugq/+Mvow99qW6x/UZYwzxy/3NmqoT66eHYfCVvFvACC58UBPFf28g== + dependencies: + esbuild "~0.23.0" + get-tsconfig "^4.7.5" + optionalDependencies: + fsevents "~2.3.3" + +tuf-js@^2.2.1: + version "2.2.1" + resolved "https://registry.npmjs.org/tuf-js/-/tuf-js-2.2.1.tgz" + integrity sha512-GwIJau9XaA8nLVbUXsN3IlFi7WmQ48gBUrl3FTkkL/XLu/POhBzfmX9hd33FNMX1qAsfl6ozO1iMmW9NC8YniA== + dependencies: + "@tufjs/models" "2.0.1" + debug "^4.3.4" + make-fetch-happen "^13.0.1" + +tv4@^1.3.0: + version "1.3.0" + resolved "https://registry.npmjs.org/tv4/-/tv4-1.3.0.tgz" + integrity sha512-afizzfpJgvPr+eDkREK4MxJ/+r8nEEHcmitwgnPUqpaP+FpwQyadnxNoSACbgc/b1LsZYtODGoPiFxQrgJgjvw== + +tweetnacl@^0.14.3, tweetnacl@~0.14.0: + version "0.14.5" + resolved "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz" + integrity sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA== + +type-detect@^4.0.0, type-detect@^4.1.0: + version "4.1.0" + resolved "https://registry.npmjs.org/type-detect/-/type-detect-4.1.0.tgz" + integrity sha512-Acylog8/luQ8L7il+geoSxhEkazvkslg7PSNKOX59mbB9cOveP5aq9h74Y7YU8yDpJwetzQQrfIwtf4Wp4LKcw== + +type-fest@^0.12.0: + version "0.12.0" + resolved "https://registry.npmjs.org/type-fest/-/type-fest-0.12.0.tgz" + integrity sha512-53RyidyjvkGpnWPMF9bQgFtWp+Sl8O2Rp13VavmJgfAP9WWG6q6TkrKU8iyJdnwnfgHI6k2hTlgqH4aSdjoTbg== + +type-fest@^0.21.3: + version "0.21.3" + resolved "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz" + integrity sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w== + +type-fest@^0.6.0: + version "0.6.0" + resolved "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz" + integrity sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg== + +type-fest@^0.8.1: + version "0.8.1" + resolved "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz" + integrity sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA== + +type-is@^1.6.4, type-is@~1.6.18: + version "1.6.18" + resolved "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz" + integrity sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g== + dependencies: + media-typer "0.3.0" + mime-types "~2.1.24" + +type-is@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/type-is/-/type-is-2.0.0.tgz" + integrity sha512-gd0sGezQYCbWSbkZr75mln4YBidWUN60+devscpLF5mtRDUpiaTvKpBNrdaCvel1NdR2k6vclXybU5fBd2i+nw== + dependencies: + content-type "^1.0.5" + media-typer "^1.1.0" + mime-types "^3.0.0" + +typedarray@^0.0.6: + version "0.0.6" + resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" + integrity sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA== + +typescript@5, typescript@^5.0.4, typescript@^5.4.4, typescript@^5.7.2: + version "5.7.2" + resolved "https://registry.npmjs.org/typescript/-/typescript-5.7.2.tgz" + integrity sha512-i5t66RHxDvVN40HfDd1PsEThGNnlMCMT3jMUuoh9/0TaqWevNontacunWyN02LA9/fIbEWlcHZcgTKb9QoaLfg== + +typescript@5.4: + version "5.4.5" + resolved "https://registry.npmjs.org/typescript/-/typescript-5.4.5.tgz" + integrity sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ== + +uid-safe@~2.1.5: + version "2.1.5" + resolved "https://registry.npmjs.org/uid-safe/-/uid-safe-2.1.5.tgz" + integrity sha512-KPHm4VL5dDXKz01UuEd88Df+KzynaohSL9fBh096KWAxSKZQDI2uBrVqtvRM4rwrIrRRKsdLNML/lnaaVSRioA== + dependencies: + random-bytes "~1.0.0" + +undici-types@~6.20.0: + version "6.20.0" + resolved "https://registry.npmjs.org/undici-types/-/undici-types-6.20.0.tgz" + integrity sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg== + +undici@^6.19.5: + version "6.21.0" + resolved "https://registry.npmjs.org/undici/-/undici-6.21.0.tgz" + integrity sha512-BUgJXc752Kou3oOIuU1i+yZZypyZRqNPW0vqoMPl8VaoalSfeR0D8/t4iAS3yirs79SSMTxTag+ZC86uswv+Cw== + +unicorn-magic@^0.1.0: + version "0.1.0" + resolved "https://registry.npmjs.org/unicorn-magic/-/unicorn-magic-0.1.0.tgz" + integrity sha512-lRfVq8fE8gz6QMBuDM6a+LO3IAzTi05H6gCVaUpir2E1Rwpo4ZUog45KpNXKC/Mn3Yb9UDuHumeFTo9iV/D9FQ== + +unique-filename@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/unique-filename/-/unique-filename-3.0.0.tgz" + integrity sha512-afXhuC55wkAmZ0P18QsVE6kp8JaxrEokN2HGIoIVv2ijHQd419H0+6EigAFcIzXeMIkcIkNBpB3L/DXB3cTS/g== + dependencies: + unique-slug "^4.0.0" + +unique-slug@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/unique-slug/-/unique-slug-4.0.0.tgz" + integrity sha512-WrcA6AyEfqDX5bWige/4NQfPZMtASNVxdmWR76WESYQVAACSgWcR6e9i0mofqqBxYFtL4oAxPIptY73/0YE1DQ== + dependencies: + imurmurhash "^0.1.4" + +universalify@^0.2.0: + version "0.2.0" + resolved "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz" + integrity sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg== + +universalify@^2.0.0: + version "2.0.1" + resolved "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz" + integrity sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw== + +unix-dgram@2.0.x: + version "2.0.6" + resolved "https://registry.npmjs.org/unix-dgram/-/unix-dgram-2.0.6.tgz" + integrity sha512-AURroAsb73BZ6CdAyMrTk/hYKNj3DuYYEuOaB8bYMOHGKupRNScw90Q5C71tWJc3uE7dIeXRyuwN0xLLq3vDTg== + dependencies: + bindings "^1.5.0" + nan "^2.16.0" + +unpipe@1.0.0, unpipe@~1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz" + integrity sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ== + +update-browserslist-db@^1.1.1: + version "1.1.1" + resolved "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.1.tgz" + integrity sha512-R8UzCaa9Az+38REPiJ1tXlImTJXlVfgHZsglwBD/k6nj76ctsH1E3q4doGrukiLQd3sGQYu56r5+lo5r94l29A== + dependencies: + escalade "^3.2.0" + picocolors "^1.1.0" + +uri-js@^4.2.2: + version "4.4.1" + resolved "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz" + integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== + dependencies: + punycode "^2.1.0" + +url-parse@^1.5.3: + version "1.5.10" + resolved "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz" + integrity sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ== + dependencies: + querystringify "^2.1.1" + requires-port "^1.0.0" + +url@0.10.3: + version "0.10.3" + resolved "https://registry.npmjs.org/url/-/url-0.10.3.tgz" + integrity sha512-hzSUW2q06EqL1gKM/a+obYHLIO6ct2hwPuviqTTOcfFVc61UbfJ2Q32+uGL/HCPxKqrdGB5QUwIe7UqlDgwsOQ== + dependencies: + punycode "1.3.2" + querystring "0.2.0" + +util-deprecate@^1.0.1, util-deprecate@~1.0.1: + version "1.0.2" + resolved "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz" + integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== + +util@^0.10.3: + version "0.10.4" + resolved "https://registry.npmjs.org/util/-/util-0.10.4.tgz" + integrity sha512-0Pm9hTQ3se5ll1XihRic3FDIku70C+iHUdT/W926rSgHV5QgXsYbKZN8MSC3tJtSkhuROzvsQjAaFENRXr+19A== + dependencies: + inherits "2.0.3" + +util@^0.12.4: + version "0.12.5" + resolved "https://registry.npmjs.org/util/-/util-0.12.5.tgz" + integrity sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA== + dependencies: + inherits "^2.0.3" + is-arguments "^1.0.4" + is-generator-function "^1.0.7" + is-typed-array "^1.1.3" + which-typed-array "^1.1.2" + +utils-merge@1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz" + integrity sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA== + +uuid@8.0.0: + version "8.0.0" + resolved "https://registry.npmjs.org/uuid/-/uuid-8.0.0.tgz" + integrity sha512-jOXGuXZAWdsTH7eZLtyXMqUb9EcWMGZNbL9YcGBJl4MH4nrxHmZJhEHvyLFrkxo+28uLb/NYRcStH48fnD0Vzw== + +uuid@8.3.2, uuid@^8.0.0, uuid@^8.3.0, uuid@^8.3.2: + version "8.3.2" + resolved "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz" + integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== + +uuid@^9.0.0, uuid@^9.0.1: + version "9.0.1" + resolved "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz" + integrity sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA== + +v8-compile-cache-lib@^3.0.1: + version "3.0.1" + resolved "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz" + integrity sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg== + +v8-to-istanbul@^9.0.0: + version "9.3.0" + resolved "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.3.0.tgz" + integrity sha512-kiGUalWN+rgBJ/1OHZsBtU4rXZOfj/7rKQxULKlIzwzQSvMJUUNgPwJEEh7gU6xEVxC0ahoOBvN2YI8GH6FNgA== + dependencies: + "@jridgewell/trace-mapping" "^0.3.12" + "@types/istanbul-lib-coverage" "^2.0.1" + convert-source-map "^2.0.0" + +validate-npm-package-license@^3.0.1, validate-npm-package-license@^3.0.4: + version "3.0.4" + resolved "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz" + integrity sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew== + dependencies: + spdx-correct "^3.0.0" + spdx-expression-parse "^3.0.0" + +validate-npm-package-name@^5.0.0: + version "5.0.1" + resolved "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-5.0.1.tgz" + integrity sha512-OljLrQ9SQdOUqTaQxqL5dEfZWrXExyyWsozYlAWFawPVNuD83igl7uJD2RTkNMbniIYgt8l81eCJGIdQF7avLQ== + +vary@^1, vary@~1.1.2: + version "1.1.2" + resolved "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz" + integrity sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg== + +verror@1.10.0: + version "1.10.0" + resolved "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz" + integrity sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw== + dependencies: + assert-plus "^1.0.0" + core-util-is "1.0.2" + extsprintf "^1.2.0" + +vite-node@2.1.8: + version "2.1.8" + resolved "https://registry.npmjs.org/vite-node/-/vite-node-2.1.8.tgz" + integrity sha512-uPAwSr57kYjAUux+8E2j0q0Fxpn8M9VoyfGiRI8Kfktz9NcYMCenwY5RnZxnF1WTu3TGiYipirIzacLL3VVGFg== + dependencies: + cac "^6.7.14" + debug "^4.3.7" + es-module-lexer "^1.5.4" + pathe "^1.1.2" + vite "^5.0.0" + +vite@^5.0.0: + version "5.4.11" + resolved "https://registry.npmjs.org/vite/-/vite-5.4.11.tgz" + integrity sha512-c7jFQRklXua0mTzneGW9QVyxFjUgwcihC4bXEtujIo2ouWCe1Ajt/amn2PCxYnhYfd5k09JX3SB7OYWFKYqj8Q== + dependencies: + esbuild "^0.21.3" + postcss "^8.4.43" + rollup "^4.20.0" + optionalDependencies: + fsevents "~2.3.3" + +vitest@^2.1.8: + version "2.1.8" + resolved "https://registry.npmjs.org/vitest/-/vitest-2.1.8.tgz" + integrity sha512-1vBKTZskHw/aosXqQUlVWWlGUxSJR8YtiyZDJAFeW2kPAeX6S3Sool0mjspO+kXLuxVWlEDDowBAeqeAQefqLQ== + dependencies: + "@vitest/expect" "2.1.8" + "@vitest/mocker" "2.1.8" + "@vitest/pretty-format" "^2.1.8" + "@vitest/runner" "2.1.8" + "@vitest/snapshot" "2.1.8" + "@vitest/spy" "2.1.8" + "@vitest/utils" "2.1.8" + chai "^5.1.2" + debug "^4.3.7" + expect-type "^1.1.0" + magic-string "^0.30.12" + pathe "^1.1.2" + std-env "^3.8.0" + tinybench "^2.9.0" + tinyexec "^0.3.1" + tinypool "^1.0.1" + tinyrainbow "^1.2.0" + vite "^5.0.0" + vite-node "2.1.8" + why-is-node-running "^2.3.0" + +wait-on@^8.0.1: + version "8.0.1" + resolved "https://registry.npmjs.org/wait-on/-/wait-on-8.0.1.tgz" + integrity sha512-1wWQOyR2LVVtaqrcIL2+OM+x7bkpmzVROa0Nf6FryXkS+er5Sa1kzFGjzZRqLnHa3n1rACFLeTwUqE1ETL9Mig== + dependencies: + axios "^1.7.7" + joi "^17.13.3" + lodash "^4.17.21" + minimist "^1.2.8" + rxjs "^7.8.1" + +walk-sync@^0.2.3: + version "0.2.7" + resolved "https://registry.npmjs.org/walk-sync/-/walk-sync-0.2.7.tgz" + integrity sha512-OH8GdRMowEFr0XSHQeX5fGweO6zSVHo7bG/0yJQx6LAj9Oukz0C8heI3/FYectT66gY0IPGe89kOvU410/UNpg== + dependencies: + ensure-posix-path "^1.0.0" + matcher-collection "^1.0.0" + +walk-up-path@^3.0.1: + version "3.0.1" + resolved "https://registry.npmjs.org/walk-up-path/-/walk-up-path-3.0.1.tgz" + integrity sha512-9YlCL/ynK3CTlrSRrDxZvUauLzAswPCrsaCgilqFevUYpeEW0/3ScEjaa3kbW/T0ghhkEr7mv+fpjqn1Y1YuTA== + +wcwidth@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz" + integrity sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg== + dependencies: + defaults "^1.0.3" + +webidl-conversions@^3.0.0: + version "3.0.1" + resolved "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz" + integrity sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ== + +whatwg-encoding@^3.1.1: + version "3.1.1" + resolved "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-3.1.1.tgz" + integrity sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ== + dependencies: + iconv-lite "0.6.3" + +whatwg-mimetype@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-4.0.0.tgz" + integrity sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg== + +whatwg-url@^5.0.0: + version "5.0.0" + resolved "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz" + integrity sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw== + dependencies: + tr46 "~0.0.3" + webidl-conversions "^3.0.0" + +which-typed-array@^1.1.16, which-typed-array@^1.1.2: + version "1.1.18" + resolved "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.18.tgz" + integrity sha512-qEcY+KJYlWyLH9vNbsr6/5j59AXk5ni5aakf8ldzBvGde6Iz4sxZGkJyWSAueTG7QhOvNRYb1lDdFmL5Td0QKA== + dependencies: + available-typed-arrays "^1.0.7" + call-bind "^1.0.8" + call-bound "^1.0.3" + for-each "^0.3.3" + gopd "^1.2.0" + has-tostringtag "^1.0.2" + +which@^1.2.14: + version "1.3.1" + resolved "https://registry.npmjs.org/which/-/which-1.3.1.tgz" + integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== + dependencies: + isexe "^2.0.0" + +which@^2.0.1: + version "2.0.2" + resolved "https://registry.npmjs.org/which/-/which-2.0.2.tgz" + integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== + dependencies: + isexe "^2.0.0" + +which@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/which/-/which-4.0.0.tgz" + integrity sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg== + dependencies: + isexe "^3.1.1" + +why-is-node-running@^2.3.0: + version "2.3.0" + resolved "https://registry.npmjs.org/why-is-node-running/-/why-is-node-running-2.3.0.tgz" + integrity sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w== + dependencies: + siginfo "^2.0.0" + stackback "0.0.2" + +widest-line@^3.1.0: + version "3.1.0" + resolved "https://registry.npmjs.org/widest-line/-/widest-line-3.1.0.tgz" + integrity sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg== + dependencies: + string-width "^4.0.0" + +widest-line@^4.0.1: + version "4.0.1" + resolved "https://registry.npmjs.org/widest-line/-/widest-line-4.0.1.tgz" + integrity sha512-o0cyEG0e8GPzT4iGHphIOh0cJOV8fivsXxddQasHPHfoZf1ZexrfeA21w2NaEN1RHE+fXlfISmOE8R9N3u3Qig== + dependencies: + string-width "^5.0.1" + +winston-transport@^4.9.0: + version "4.9.0" + resolved "https://registry.npmjs.org/winston-transport/-/winston-transport-4.9.0.tgz" + integrity sha512-8drMJ4rkgaPo1Me4zD/3WLfI/zPdA9o2IipKODunnGDcuqbHwjsbB79ylv04LCGGzU0xQ6vTznOMpQGaLhhm6A== + dependencies: + logform "^2.7.0" + readable-stream "^3.6.2" + triple-beam "^1.3.0" + +winston@^3.17.0: + version "3.17.0" + resolved "https://registry.npmjs.org/winston/-/winston-3.17.0.tgz" + integrity sha512-DLiFIXYC5fMPxaRg832S6F5mJYvePtmO5G9v9IgUFPhXm9/GkXarH/TUrBAVzhTCzAj9anE/+GjrgXp/54nOgw== + dependencies: + "@colors/colors" "^1.6.0" + "@dabh/diagnostics" "^2.0.2" + async "^3.2.3" + is-stream "^2.0.0" + logform "^2.7.0" + one-time "^1.0.0" + readable-stream "^3.4.0" + safe-stable-stringify "^2.3.1" + stack-trace "0.0.x" + triple-beam "^1.3.0" + winston-transport "^4.9.0" + +word-wrap@^1.0.3: + version "1.2.5" + resolved "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz" + integrity sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA== + +wordwrap@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz" + integrity sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q== + +"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0": + version "7.0.0" + resolved "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz" + integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== + dependencies: + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + +wrap-ansi@^3.0.0: + version "3.0.1" + resolved "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-3.0.1.tgz" + integrity sha512-iXR3tDXpbnTpzjKSylUJRkLuOrEC7hwEB221cgn6wtF8wpmz28puFXAEfPT5zrjM3wahygB//VuWEr1vTkDcNQ== + dependencies: + string-width "^2.1.1" + strip-ansi "^4.0.0" + +wrap-ansi@^6.2.0: + version "6.2.0" + resolved "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz" + integrity sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA== + dependencies: + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + +wrap-ansi@^7.0.0: + version "7.0.0" + resolved "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz" + integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== + dependencies: + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + +wrap-ansi@^8.1.0: + version "8.1.0" + resolved "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz" + integrity sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ== + dependencies: + ansi-styles "^6.1.0" + string-width "^5.0.1" + strip-ansi "^7.0.1" + +wrap-ansi@^9.0.0: + version "9.0.0" + resolved "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.0.tgz" + integrity sha512-G8ura3S+3Z2G+mkgNRq8dqaFZAuxfsxpBB8OCTGRTCtp+l/v9nbFNmCUP1BZMts3G1142MsZfn6eeUKrr4PD1Q== + dependencies: + ansi-styles "^6.2.1" + string-width "^7.0.0" + strip-ansi "^7.1.0" + +wrappy@1: + version "1.0.2" + resolved "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz" + integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== + +ws@^5.2.2: + version "5.2.4" + resolved "https://registry.npmjs.org/ws/-/ws-5.2.4.tgz" + integrity sha512-fFCejsuC8f9kOSu9FYaOw8CdO68O3h5v0lg4p74o8JqWpwTf9tniOD+nOB78aWoVSS6WptVUmDrp/KPsMVBWFQ== + dependencies: + async-limiter "~1.0.0" + +ws@^7.5.7: + version "7.5.10" + resolved "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz" + integrity sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ== + +ws@^8.12.0: + version "8.18.0" + resolved "https://registry.npmjs.org/ws/-/ws-8.18.0.tgz" + integrity sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw== + +ws@~8.17.1: + version "8.17.1" + resolved "https://registry.npmjs.org/ws/-/ws-8.17.1.tgz" + integrity sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ== + +xml2js@0.6.2: + version "0.6.2" + resolved "https://registry.npmjs.org/xml2js/-/xml2js-0.6.2.tgz" + integrity sha512-T4rieHaC1EXcES0Kxxj4JWgaUQHDk+qwHcYOCFHfiwKz7tOVPLq7Hjq9dM1WCMhylqMEfP7hMcOIChvotiZegA== + dependencies: + sax ">=0.6.0" + xmlbuilder "~11.0.0" + +xmlbuilder@15.1.1, xmlbuilder@^15.1.1: + version "15.1.1" + resolved "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-15.1.1.tgz" + integrity sha512-yMqGBqtXyeN1e3TGYvgNgDVZ3j84W4cwkOXQswghol6APgZWaff9lnbvN7MHYJOiXsvGPXtjTYJEiC9J2wv9Eg== + +xmlbuilder@~11.0.0: + version "11.0.1" + resolved "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz" + integrity sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA== + +xmlhttprequest-ssl@~2.1.1: + version "2.1.2" + resolved "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-2.1.2.tgz" + integrity sha512-TEU+nJVUUnA4CYJFLvK5X9AOeH4KvDvhIfm0vV1GaQRtchnG0hgK5p8hw/xjv8cunWYCsiPCSDzObPyhEwq3KQ== + +xtend@^4.0.0: + version "4.0.2" + resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54" + integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== + +y18n@^5.0.5: + version "5.0.8" + resolved "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz" + integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== + +yallist@^3.0.2: + version "3.1.1" + resolved "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz" + integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== + +yallist@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz" + integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== + +yaml-js@^0.2.3: + version "0.2.3" + resolved "https://registry.npmjs.org/yaml-js/-/yaml-js-0.2.3.tgz" + integrity sha512-6xUQtVKl1qcd0EXtTEzUDVJy9Ji1fYa47LtkDtYKlIjhibPE9knNPmoRyf6SGREFHlOAUyDe9OdYqRP4DuSi5Q== + +yaml-types@^0.3.0: + version "0.3.0" + resolved "https://registry.npmjs.org/yaml-types/-/yaml-types-0.3.0.tgz" + integrity sha512-i9RxAO/LZBiE0NJUy9pbN5jFz5EasYDImzRkj8Y81kkInTi1laia3P3K/wlMKzOxFQutZip8TejvQP/DwgbU7A== + +yaml@^2.4.1, yaml@^2.5.0, yaml@~2.6.1: + version "2.6.1" + resolved "https://registry.npmjs.org/yaml/-/yaml-2.6.1.tgz" + integrity sha512-7r0XPzioN/Q9kXBro/XPnA6kznR73DHq+GXh5ON7ZozRO6aMjbmiBuKste2wslTFkC5d1dw0GooOCepZXJ2SAg== + +yargs-parser@^21.1.1: + version "21.1.1" + resolved "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz" + integrity sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw== + +yargs@^17.0.0, yargs@^17.6.2, yargs@^17.7.2: + version "17.7.2" + resolved "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz" + integrity sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w== + dependencies: + cliui "^8.0.1" + escalade "^3.1.1" + get-caller-file "^2.0.5" + require-directory "^2.1.1" + string-width "^4.2.3" + y18n "^5.0.5" + yargs-parser "^21.1.1" + +yocto-queue@^0.1.0: + version "0.1.0" + resolved "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz" + integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== + +yocto-queue@^1.0.0: + version "1.1.1" + resolved "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.1.1.tgz" + integrity sha512-b4JR1PFR10y1mKjhHY9LaGo6tmrgjit7hxVIeAmyMw3jegXR4dhYqLaQF5zMXZxY7tLpMyJeLjr1C4rLmkVe8g== + +yoctocolors-cjs@^2.1.2: + version "2.1.2" + resolved "https://registry.npmjs.org/yoctocolors-cjs/-/yoctocolors-cjs-2.1.2.tgz" + integrity sha512-cYVsTjKl8b+FrnidjibDWskAv7UKOfcwaVZdp/it9n1s9fU3IkgDbhdIRKCW4JDsAlECJY0ytoVPT3sK6kideA== + +yoga-wasm-web@~0.3.3: + version "0.3.3" + resolved "https://registry.npmjs.org/yoga-wasm-web/-/yoga-wasm-web-0.3.3.tgz" + integrity sha512-N+d4UJSJbt/R3wqY7Coqs5pcV0aUj2j9IaQ3rNj9bVCLld8tTGKRa2USARjnvZJWVx1NDmQev8EknoczaOQDOA== + +yup@^0.32.9: + version "0.32.11" + resolved "https://registry.npmjs.org/yup/-/yup-0.32.11.tgz" + integrity sha512-Z2Fe1bn+eLstG8DRR6FTavGD+MeAwyfmouhHsIUgaADz8jvFKbO/fXc2trJKZg+5EBjh4gGm3iU/t3onKlXHIg== + dependencies: + "@babel/runtime" "^7.15.4" + "@types/lodash" "^4.14.175" + lodash "^4.17.21" + lodash-es "^4.17.21" + nanoclone "^0.2.1" + property-expr "^2.0.4" + toposort "^2.0.2" + +zip-stream@^4.1.0: + version "4.1.1" + resolved "https://registry.npmjs.org/zip-stream/-/zip-stream-4.1.1.tgz" + integrity sha512-9qv4rlDiopXg4E69k+vMHjNN63YFMe9sZMrdlvKnCjlCRWeCBswPPMPUfx+ipsAWq1LXHe70RcbaHdJJpS6hyQ== + dependencies: + archiver-utils "^3.0.4" + compress-commons "^4.1.2" + readable-stream "^3.6.0" + +zod@^3.24.1: + version "3.24.1" + resolved "https://registry.npmjs.org/zod/-/zod-3.24.1.tgz" + integrity sha512-muH7gBL9sI1nciMZV67X5fTKKBLtwpZ5VBp1vsOQzj1MhrBZ4wlVCm3gedKZWLp0Oyel8sIGfeiz54Su+OVT+A==