Skip to content

chore(deps): atualização agressiva — Baileys rc13, Prisma 7, Express 5, ESLint 10, Redis 6, TS 6#2575

Open
pastoriniMatheus wants to merge 14 commits into
developfrom
upgrade-rc13
Open

chore(deps): atualização agressiva — Baileys rc13, Prisma 7, Express 5, ESLint 10, Redis 6, TS 6#2575
pastoriniMatheus wants to merge 14 commits into
developfrom
upgrade-rc13

Conversation

@pastoriniMatheus

Copy link
Copy Markdown

Atualização Agressiva de Dependências — Baileys rc13 + grande up (sem perder Botões/Listas/Carrosséis)

Esta PR moderniza toda a stack da Evolution API para as versões mais recentes possíveis sem quebrar a implementação de botões interativos, listas e carrosséis (injeção de nós <biz> via additionalNodes no relayMessage do Baileys). O trabalho foi feito em camadas (tiers) de risco crescente, cada uma com tsc --noEmit + tsup build + lint limpos e commit isolado, e validada ao final por envio real para um número de teste.

Princípio: agressivo, porém sem estragar. Quando um major era incompatível com a arquitetura (CommonJS, multi-provider, peers do Baileys), a decisão foi documentada com evidência — nunca forçada às cegas.


1. Resumo das versões (de → para)

Pacote De Para Observação
baileys 7.0.0-rc.9 7.0.0-rc13 última publicada; patch de waveform removido (upstream)
prisma / @prisma/client 6.16 7.8.0 driver adapters + generator prisma-client
express 4.21 5.2.1 path-to-regexp v8
eslint 8.45 10.4.1 flat config
openai 4.77 6.42 API runs.*
redis 4.7 6.0 RESP3
typescript 5.7 6.0.3 moduleResolution: bundler
undici 7.16 8.3
amqplib 0.10 2.0.1 callback_api mantido
i18next 23 26.3.1
uuid 13 14
dotenv 16 17.4.2
node-cron 3 4.2.1
mime-types 2 3.0.2
class-validator 0.14 0.15.1
@paralleldrive/cuid2 2 3.3.0
pusher 5.2 5.3.3
https-proxy-agent 7 9.0 ESM-only (destravado pelo bundler)
socks-proxy-agent 8 10.0 ESM-only
@commitlint/*, lint-staged 19 / 16 21 / 17
@typescript-eslint/*, prettier, tsx, @types/node, etc. latest bumps seguros

Mantidos/adicionados: override whatsapp-rust-bridge@0.5.5; substituição eslint-plugin-importeslint-plugin-import-x@4; troca @typescript-eslint/* pelo meta-pacote typescript-eslint.


2. Execução em camadas (tiers)

Tier 0 — Baileys rc.9 → rc13 (EVO-1652)

  • package.json: baileys 7.0.0-rc.97.0.0-rc13.
  • Removido patches/baileys+7.0.0-rc.6.patch: a correção de waveform PTT (requiresWaveformProcessing) já está upstream no rc13.
  • Confirmado por leitura de código que relayMessage({ additionalNodes }) é idêntico no rc13 (stanza.content.push(...additionalNodes)) → botões/lista/carrossel preservados.

Tier 1 — Bumps minor/patch seguros (EVO-1653)

  • axios 1.17, @sentry/node 10.56, pg 8.21, socket.io(+client) 4.8.3, minio, mediainfo.js, libphonenumber-js, jsonwebtoken, cors, fetch-socks, multer 2.1, @aws-sdk/client-sqs, dev deps.
  • Correção: axios 1.17 endureceu AxiosHeaderValue → cast as string em response.headers['content-type'] (whatsapp.baileys.service.ts, chatwoot.service.ts).

Tier 2 — Majors de baixo/médio risco (EVO-1654)

  • uuid 14, dotenv 17, node-cron 4, i18next 26, class-validator 0.15, mime-types 3, amqplib 2, cuid2 3, pusher 5.3, undici 8.
  • Correção amqplib 2: port: url.port || 5672port: url.port ? Number(url.port) : 5672 (o Connect exige number).

Tier 3a — ESLint 8 → 10 (flat config) (EVO-1655, EVO-1664)

  • Novo eslint.config.mjs (flat config) com o meta-pacote typescript-eslint, @eslint/js, globals, prettier/recommended, simple-import-sort e eslint-plugin-import-x (o eslint-plugin-import não suporta ESLint 10).
  • Removidos .eslintrc.js e .eslintignore; scripts lint/lint:check sem --ext; commitlint 21 + lint-staged 17.
  • Regras novas do recommended do ESLint 10 (preserve-caught-error, no-useless-assignment) desativadas para preservar o baseline.

Tier 3b — Express 4 → 5 (EVO-1656, EVO-1662)

  • Rotas wildcard adaptadas ao path-to-regexp v8: /assets/*/assets/*splat (e req.params[0] → array juntado), SPA '*'/{*splat}.
  • 29 casts as string em req.params.<id> nos 7 routers de chatbot (req.params virou string | string[]).
  • Removido express-async-errors (peer só Express 4; o Express 5 trata erros async nativamente).

Tier 3c — OpenAI 4 → 6 (EVO-1657)

  • beta.threads.runs.retrieve/submitToolOutputs passaram a receber runId + thread_id no objeto de params (openai.service.ts).

Tier 3d — Redis 4 → 6 (EVO-1658)

  • RESP3 tipa get/hGet como string | {} → casts as string em rediscache.ts; exists() já tratado como número.

Tier 3e — TypeScript 5 → 6 (EVO-1659)

  • tsc 6.0.3 (compatível com typescript-eslint).

Tier 3f — moduleResolution + proxy agents (EVO-1667, EVO-1668)

  • tsconfig: module: preserve + moduleResolution: bundler; removidos baseUrl e ignoreDeprecations — dívida do TS 6/7 (node10/baseUrl) eliminada por completo.
  • https-proxy-agent 7→9 e socks-proxy-agent 8→10 (majors ESM-only, destravados pelo bundler).

Tier 4 — Prisma 6 → 7 (EVO-1660) — a migração mais complexa

  • Driver adapters @prisma/adapter-pg + @prisma/adapter-mariadb (não há adapter-mysql).
  • Generator prisma-client-jsprisma-client com output ./generated/client (TS gerado) nos 3 schemas; url/directUrl removidos do datasource (proibidos no v7).
  • prisma.config.ts (novo): connection string (DATABASE_CONNECTION_URI) + seleção dinâmica de schema/migrations por DATABASE_PROVIDER — multi-provider preservado.
  • repository.service.ts: instancia o PrismaClient com o adapter correto por provider.
  • Sem editar os 28 importadores: @prisma/client é aliasado ao client gerado no tsconfig (tsx/tsc) e reforçado no tsup (noExternal: [/^@prisma\/client$/] + esbuildOptions.alias + shims: true para o import.meta.url no bundle CJS), pois o esbuild não honra os paths do tsconfig.
  • JsonValue migrado de @prisma/client/runtime/library/runtime/client (3 DTOs).
  • start:proddist/main.js (CJS); o ESM puro quebra por imports sem extensão do @figuro/chatwoot-sdk.
  • prisma/generated/ adicionado ao .gitignore.

3. Imprevistos resolvidos (não previstos no plano)

  • whatsapp-rust-bridge ESM-only impedia o boot (EVO-1661): o rc13 depende da 0.5.4 (sem condição require no exports), causando ERR_PACKAGE_PATH_NOT_EXPORTED em runtime CJS. Fixado via overrides para 0.5.5.
  • express-async-errors incompatível com Express 5 (EVO-1662): removido (redundante no Express 5).
  • Conflitos de peer do Baileys rc13 (EVO-1663): audio-decode, link-preview-js, pino, jimp mantidos na faixa do Baileys (ver seção Travados).
  • eslint-plugin-import sem suporte a ESLint 10 (EVO-1664): trocado por eslint-plugin-import-x.
  • prisma generate necessário após instalação limpa (EVO-1665): documentado (não está no postinstall).
  • Refactor de áudio (EVO-1670): removido o getAudioMetadata() redundante — o Baileys rc13 calcula seconds/waveform nativamente (getAudioWaveform/getAudioDuration via audio-decode). Agora URLs de áudio também ganham waveform.

4. Validação

Estática (do zero)

npm cinpm run db:generatenpx tsc --noEmitnpm run build (tsup) → npm run lint:checktodos limpos.

Runtime

  • Boot dev (tsx) e produção (node dist/main.js)Repository:Prisma - ON, redis ready, HTTP - ON: 3210 (healthcheck 200).
  • Infra de teste: Postgres (banco evolution, migrations aplicadas via db:deploy com Prisma 7) + Redis (com senha) — conexões reais OK, sem erro de código.

Smoke test de envio real (instância conectada → número de teste)

Todos HTTP 201 e renderização confirmada no WhatsApp:

Teste Endpoint Resultado
Lista (2 seções/3 itens) /message/sendList ✅ 201
Botões reply (x3) /message/sendButtons ✅ 201
Botões CTA (url+call) /message/sendButtons ✅ 201
Botão copy /message/sendButtons ✅ 201
Botão PIX /message/sendButtons ✅ 201
Carrossel (2 cards img+botões) /message/sendCarousel ✅ 201
Áudio PTT /message/sendWhatsAppAudio ✅ 201 (seconds+waveform nativos do Baileys)

Regras de negócio confirmadas no buttonMessage: reply até 3 (isolado), CTA até 2 (isolado), PIX 1 (sozinho).
As rotas wildcard do Express 5 (/assets/*splat, SPA /{*splat}) servem o manager (SPA) corretamente.


5. Segurança

  • npm audit: 57 → 12 vulnerabilidades (2 low, 4 moderate, 6 high). Remanescentes presas por upstream (axios aninhado no @figuro/chatwoot-sdk, link-preview-js/baileys) ou dev-only (commitizen, dev tooling do Prisma 7). npm audit fix --force não aplicado para não quebrar (EVO-1669).

6. Conscientemente travados (sobem quando o Baileys ampliar os peers — EVO-1663)

audio-decode@2, link-preview-js@3, pino@9, jimp@1.6 — mantidos na faixa de peer do Baileys rc13 para não quebrar funcionalidades internas (waveform de áudio, preview de link, logger). Forçar os majors novos quebraria o Baileys (ex.: a API do audio-decode v3 é incompatível). Sobem "de graça" quando o Baileys publicar peers ampliados.


7. Arquivos principais tocados

  • package.json, package-lock.json, tsconfig.json, tsup.config.ts, eslint.config.mjs (novo), prisma.config.ts (novo), .gitignore.
  • prisma/postgresql-schema.prisma, prisma/mysql-schema.prisma, prisma/psql_bouncer-schema.prisma.
  • src/api/repository/repository.service.ts (driver adapters).
  • src/api/integrations/channel/whatsapp/whatsapp.baileys.service.ts (áudio, casts).
  • src/api/routes/index.router.ts, view.router.ts (rotas wildcard Express 5) + os 7 routers de chatbot (casts req.params).
  • src/cache/rediscache.ts (Redis 6), src/api/integrations/event/rabbitmq/rabbitmq.controller.ts (amqplib 2), src/api/integrations/chatbot/openai/services/openai.service.ts (OpenAI 6), src/api/abstract/abstract.router.ts (remoção express-async-errors), 3 DTOs (JsonValue).

8. Como testar

npm ci
DATABASE_PROVIDER=postgresql npm run db:generate
npm run build          # tsc --noEmit && tsup  → deve passar limpo
npm run lint:check     # eslint (flat config)  → deve passar limpo
# com Postgres + Redis disponíveis e .env configurado:
npm run db:deploy      # aplica migrations (Prisma 7)
npm run dev:server     # boot → Repository:Prisma - ON, redis ready, HTTP - ON: 3210
# enviar sendButtons/sendList/sendCarousel/sendWhatsAppAudio para um número conectado

9. Rastreabilidade (Linear — time EVO)

19 issues com descrição da tarefa + comentário técnico (o que foi codado, como resolveu, testes): EVO-1652 (Baileys rc13) · EVO-1653 · EVO-1654 · EVO-1655 (ESLint 10) · EVO-1656 (Express 5) · EVO-1657 (OpenAI 6) · EVO-1658 (Redis 6) · EVO-1659 (TS 6) · EVO-1660 (Prisma 7) · EVO-1661 (whatsapp-rust-bridge) · EVO-1662 (express-async-errors) · EVO-1663 (peers Baileys) · EVO-1664 (import-x) · EVO-1665 (prisma generate) · EVO-1666 (smoke test) · EVO-1667 (moduleResolution) · EVO-1668 (proxy agents) · EVO-1669 (vulnerabilidades) · EVO-1670 (áudio nativo).


🤖 Generated with Claude Code

Matheus Pastorini and others added 14 commits June 5, 2026 16:08
…rm patch

- baileys atualizado para a ultima versao publicada (rc13)
- remove patches/baileys+7.0.0-rc.6.patch: a correcao de waveform PTT (requiresWaveformProcessing) ja foi incorporada upstream no rc13
- API additionalNodes do relayMessage confirmada identica: botoes/lista/carrossel preservados
- adiciona ATUALIZACAO-DEPENDENCIAS.md (plano de atualizacao em tiers)

tsc --noEmit e build (tsup) passam limpos.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
- runtime: axios 1.17, @sentry/node 10.56, pg 8.21, dayjs, jimp, socket.io(+client) 4.8.3, minio, mediainfo.js, libphonenumber-js, jsonwebtoken, cors, fetch-socks, multer 2.1, @aws-sdk/client-sqs, prisma+@prisma/client 6.19.3, undici 7.27
- dev: prettier 3.8, tsx 4.22, @typescript-eslint/* 8.60, eslint-plugin-prettier, @types/node 24, lint-staged 16
- fix(types): cast response.headers['content-type'] as string (axios 1.17 endureceu AxiosHeaderValue) em whatsapp.baileys.service.ts e chatwoot.service.ts

tsc --noEmit e build passam limpos.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
- uuid 14, dotenv 17, node-cron 4, i18next 26, @paralleldrive/cuid2 3, class-validator 0.15, pusher 5.3, mime-types 3 (+@types/mime-types 3), amqplib 2
- fix(rabbitmq): coerce url.port para Number (amqplib 2 exige port:number)
- mantidos na faixa de peer do baileys rc13 (evita ERESOLVE/quebra interna): audio-decode 2, link-preview-js 3, pino 9, jimp 1.6
- adiados (majors ESM-only que exigiriam mudar moduleResolution): https-proxy-agent 9, socks-proxy-agent 10, undici 8 -> mantidos em 7/8/7

tsc --noEmit e build passam limpos.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
- eslint 8 -> 10 com eslint.config.mjs (flat config), removendo .eslintrc.js e .eslintignore
- substitui @typescript-eslint/eslint-plugin+parser pelo meta-pacote typescript-eslint 8
- troca eslint-plugin-import (sem suporte a eslint 10) por eslint-plugin-import-x 4 (regras import-x/first e import-x/no-duplicates)
- simple-import-sort 13, @commitlint/* 21, lint-staged 17, globals
- desativa regras novas do recommended do eslint 10 (preserve-caught-error, no-useless-assignment) para preservar baseline
- scripts lint/lint:check sem --ext (flat config)
- reinstalacao limpa da arvore (lock regenerado, peers do baileys respeitados)

lint:check, tsc --noEmit e build passam limpos (apos prisma generate).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
- express 4 -> 5 (+@types/express 5), movido de volta para dependencies
- rotas wildcard adaptadas ao path-to-regexp v8:
  - index.router.ts: /assets/* -> /assets/*splat (req.params.splat agora e array, juntado com '/')
  - view.router.ts: '*' -> /{*splat}
- cast 'as string' em req.params.<id> nos 7 routers de chatbot (req.params agora e string|string[] no @types/express 5; rotas :param sempre retornam string)

tsc --noEmit, lint e build passam limpos.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…tivel com express 5)

- openai 4 -> 6: beta.threads.runs.retrieve/submitToolOutputs agora recebem runId e thread_id no objeto de params
- remove express-async-errors (peer so suporta express 4; express 5 ja trata erros async de handlers nativamente) e seu import em abstract.router.ts

tsc --noEmit, lint e build passam limpos.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
- redis 4 -> 6: cast 'as string' no retorno de get()/hGet() em rediscache.ts (redis 6/RESP3 tipa retorno como string|{}; JSON.parse exige string)
- has() ja tratava exists() > 0 (exists retorna numero)

tsc --noEmit, lint e build passam limpos.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
- typescript 5.7 -> 6.0.3 (compativel com typescript-eslint <6.1.0)
- adiciona 'ignoreDeprecations: 6.0' no tsconfig: baseUrl e moduleResolution=node10 viraram deprecation-error no TS 6; migracao real (node16/bundler) exigiria extensoes .js em todos os imports — adiado para o TS 7

tsc --noEmit, lint e build passam limpos.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…tas finais

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…solution)

- baileys rc13 depende de whatsapp-rust-bridge@0.5.4 (ESM-only, exports so com 'import'): app nao sobe via tsx/require (ERR_PACKAGE_PATH_NOT_EXPORTED)
- 0.5.5 adiciona condicao 'require' nos exports -> resolve em contexto CommonJS (Node 24 suporta require de ESM)
- aplicado via overrides no package.json

Validado: require do modulo funciona e dev:server inicializa toda a stack ate a conexao de infra (DB/Redis).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
- tsconfig: module CommonJS->preserve, moduleResolution node10->bundler
- remove baseUrl e ignoreDeprecations: elimina por completo a divida de deprecacao do TS 6/7 (node10 e baseUrl); paths resolvem relativo ao tsconfig (validado em tsc, tsup e tsx)
- https-proxy-agent 7->9 e socks-proxy-agent 8->10 (majors ESM-only, agora resolviveis com bundler)
- src nao usa require()/export = (compativel com module preserve)

Validado: tsc, lint, build limpos; dev:server carrega TODOS os modulos (aliases + proxy agents ESM-only) ate a fronteira de infra (auth do Postgres).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…lient generator)

BREAKING: Prisma 6 -> 7 (ESM-only, driver adapters obrigatorios)

- @prisma/client+prisma 7.8.0; adiciona @prisma/adapter-pg e @prisma/adapter-mariadb
- generator 'prisma-client-js' -> 'prisma-client' com output ./generated/client (TS gerado) nos 3 schemas (postgresql, mysql, psql_bouncer); url removida do datasource (proibida no v7)
- prisma.config.ts: connection string (datasource.url via DATABASE_CONNECTION_URI) + selecao dinamica de schema/migrations por DATABASE_PROVIDER (multi-provider)
- repository.service.ts: instancia PrismaClient com driver adapter conforme provider (PrismaPg | PrismaMariaDb)
- alias @prisma/client -> client gerado: no tsconfig (tsx/tsc) e reforcado no tsup (noExternal + esbuild alias), pois esbuild nao honra paths do tsconfig
- tsup: shims:true (shim de import.meta.url p/ client v7 no bundle CJS) e platform:node
- start:prod usa dist/main.js (CJS) - ESM puro quebra por imports sem extensao do @figuro/chatwoot-sdk
- 3 imports de JsonValue: @prisma/client/runtime/library -> /runtime/client (caminho mudou no v7)
- prisma/generated/ no .gitignore (gerado por provider via db:generate)

Validado: db:generate (postgres+mysql), tsc, lint, build; boot dev (tsx) e prod (node dist/main.js) inicializam ate a query real (DriverAdapterError: AuthenticationFailed = credenciais/infra, nao codigo). HTTP server sobe na porta 3210.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
… concluidos

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…1670)

Remove o getAudioMetadata() redundante: o Baileys rc13 ja calcula seconds/waveform nativamente (getAudioDuration/getAudioWaveform via audio-decode) quando ausentes no envio de PTT.

- removido getAudioMetadata() (~50 linhas) e o import orfao de audio-decode
- audioWhatsapp() para de passar seconds/waveform nos 2 caminhos; agora URL tambem ganha waveform
- audio-decode mantido no package.json (peerOptional usado internamente pelo Baileys)

Validado: tsc/lint/build limpos; PTT real -> resposta com seconds:9 + waveform (Uint8Array) gerados pelo Baileys; confirmado visualmente pelo usuario.

Ref: EVO-1670

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

@sourcery-ai sourcery-ai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Sorry @pastoriniMatheus, you have reached your weekly rate limit of 500000 diff characters.

Please try again later or upgrade to continue using Sourcery

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant