@@ -5,6 +5,90 @@ Todas as mudanças notáveis neste projeto serão documentadas neste arquivo.
55O formato é baseado em [ Keep a Changelog] ( https://keepachangelog.com/pt-BR/1.0.0/ ) ,
66e este projeto adere ao [ Versionamento Semântico] ( https://semver.org/lang/pt-BR/ ) .
77
8+ ## [ 5.2.0] - 2026-07-13
9+
10+ > Correção do contrato de paginação de ` companies ` contra a API real, provado
11+ > por sonda ao vivo (2026-07-13, duas contas). O request de ` GET /companies ` é
12+ > ** 1-based** — a API rejeita ` pageIndex: 0 ` com `"pageIndex must be greater or
13+ > equal to 1"` — igual ao de ` serviceInvoices` (rejeição de ` pageIndex: 0`
14+ > reconfirmada ao vivo), não o oposto como se supunha.
15+
16+ ### Corrigido
17+
18+ - ** ` companies.listAll() ` e ` companies.listIterator() ` falhavam na primeira
19+ chamada** , por dois motivos independentes: (1) iniciavam a paginação em
20+ ` pageIndex = 0 ` , que a API rejeita — agora iniciam em ` 1 ` ; (2) pediam
21+ ` pageCount: 100 ` , mas a API limita ` GET /companies ` a ** 50 itens por página**
22+ (sonda ao vivo: aceita 2–50; rejeita 1, apesar da mensagem `"between 1 and
23+ 50"` , e rejeita ≥51) — agora pedem ` 50`. Consertados transitivamente os
24+ quatro métodos que dependem de ` listAll() ` : ` findByTaxNumber ` , ` findByName ` ,
25+ ` getCompaniesWithCertificates ` e ` getCompaniesWithExpiringCertificates ` .
26+ - ` companies.list() ` ecoava ` pageCount: 100 ` como default no ` page ` da resposta;
27+ o default real da API é ** 10 itens** quando ` pageCount ` é omitido.
28+ - ⚠️ ** JSDoc de ` companies.update() ` era ativamente enganoso** : dizia * "only
29+ fields to update"* (semântica PATCH), mas a API faz ** PUT (substituição
30+ total)** — update parcial seguindo o docblock resulta em 400 ou em campos
31+ zerados silenciosamente. O JSDoc agora documenta o replace integral com
32+ exemplo read-modify-write. As assinaturas frouxas (` Partial<Company> ` /
33+ ` Omit<Company> ` ) foram mantidas por compat; o aperto para os schemas
34+ estritos fica para a próxima major (política de versionamento) ou para a
35+ migração de CRUD v2.
36+ - JSDoc de ` companies.create() ` documenta os obrigatórios reais do corpo
37+ (` name ` , ` federalTaxNumber ` , ` taxRegime ` , ` address ` ) e que ` email ` ** não**
38+ faz parte dele; exemplo corrigido (o anterior compilava e falhava com 400).
39+ - Vitest coletava os testes ** 5×** através dos symlinks ` client-php ` /
40+ ` client-ruby ` (que apontam de volta para este repo), causando flakes por
41+ corrida no ` .test-temp ` compartilhado e inflando a suíte (3710 → 698 testes
42+ reais). O ` include ` agora é restrito a ` tests/** ` .
43+
44+ ### Deprecado
45+
46+ - ** ` companies.list() ` ** (API v1, paginação offset): a API v1 de companies
47+ está sendo descontinuada. Use ` listV2() ` (cursor, v2) para listagem
48+ paginada, ou ` listAll() ` /` listIterator() ` para varredura completa. O método
49+ continua funcionando (e corrigido — ver acima) durante a convivência.
50+ ** Nota** : ` listAll() ` /` listIterator() ` permanecem no transporte v1 nesta
51+ release porque a enumeração completa via v2 falha de forma determinística
52+ em contas com certos registros (HTTP 500 server-side em qualquer janela
53+ que os contenha — bug reportado ao backend em 2026-07-14), e porque as
54+ projeções v1/v2 divergem de campos. A troca de transporte fica para quando
55+ o backend corrigir o 500.
56+ - JSDoc de ` companies.list ` e ` serviceInvoices.list ` , ` docs/API.md ` e ` README `
57+ exemplificavam ` pageIndex: 0 ` — todos corrigidos para a convenção 1-based.
58+ - ` PaginationOptions.pageIndex ` e ` PageInfo.pageIndex ` documentados como
59+ 1-based (a primeira página é 1).
60+ - Specs OpenAPI (` nf-servico-v1.yaml ` ): ` pageIndex ` agora declara ` minimum: 1 `
61+ em ` /v1/companies ` e na listagem de notas de serviço; ` pageCount ` de
62+ ` /v1/companies ` declara ` maximum: 50 ` .
63+
64+ ### Alterado
65+
66+ - ⚠️ ** Nota de migração** : ` companies.list() ` deixou de subtrair 1 da resposta.
67+ ` list({ pageIndex: 1 }).page.pageIndex ` agora retorna ` 1 ` (antes retornava
68+ ` 0 ` ). A convenção do SDK passa a ser ** 1-based nos dois lados** (request e
69+ response), fiel ao fio da API. Se seu código lia ` page.pageIndex ` assumindo
70+ base 0 (ex.: ` pageIndex + 1 ` para exibir o número da página), remova o ajuste.
71+
72+ ### Adicionado
73+
74+ - ** ` companies.listV2() ` ** — listagem pela API v2 (` api.nfse.io/v2/companies ` ,
75+ contribuintes-v2), ** cursor-based** : `{ limit (1–50, default 10),
76+ startingAfter, endingBefore }` → ` { data, hasMore }` (contrato provado ao
77+ vivo em 2026-07-14). Os itens seguem a projeção v2 (` CompanyResourceItem ` )
78+ — shape diferente do ` Company ` v1 (sem campos de configuração NFS-e; com
79+ ` stateTaxes ` , ` municipalTaxes ` , ` type ` , ` version ` ). ` limit ` fora de 1–50 é
80+ rejeitado client-side (a API aceitaria ` limit: 0 ` devolvendo página vazia).
81+ Tipos novos: ` CompanyV2ListOptions ` , ` CompanyV2ListResponse ` .
82+ - Testes de contrato de paginação: mock espelha a rejeição da API a
83+ ` pageIndex: 0 ` e trava a regressão — ` listAll ` /` listIterator ` são testados
84+ iniciando em 1 e incrementando 1 → 2; suite equivalente para o contrato
85+ cursor do ` listV2 ` .
86+ - Teste de alinhamento de tipos para os corpos de escrita de companies
87+ (` tests/types/company-write-alignment.test-d.ts ` ): pina os obrigatórios de
88+ ` CreateCompanyResourceItem ` /` UpdateCompanyResourceItem ` (mesmo conjunto —
89+ evidência da semântica PUT) e a ausência de ` email ` no corpo; um sync de
90+ spec que mude o contrato quebra o ` npm run test:types ` em vez de driftar.
91+
892## [ 5.1.0] - 2026-07-03
993
1094> Correção do contrato de webhooks contra a API real, provado por sonda ao vivo
@@ -837,7 +921,8 @@ SDK JavaScript legado com API baseada em callbacks.
837921
838922## Links
839923
840- [ Unreleased ] : https://github.com/nfe/client-nodejs/compare/v5.1.0...HEAD
924+ [ Unreleased ] : https://github.com/nfe/client-nodejs/compare/v5.2.0...HEAD
925+ [ 5.2.0 ] : https://github.com/nfe/client-nodejs/compare/v5.1.0...v5.2.0
841926[ 5.1.0 ] : https://github.com/nfe/client-nodejs/compare/v5.0.0...v5.1.0
842927[ 5.0.0 ] : https://github.com/nfe/client-nodejs/releases/tag/v5.0.0
843928[ 3.0.0 ] : https://github.com/nfe/client-nodejs/releases/tag/v3.0.0
0 commit comments