Skip to content

feat: add stripCpfCnpj (alphanumeric-safe CPF/CNPJ sanitizer)#39

Merged
FabioRolin merged 1 commit into
masterfrom
feat/strip-cpf-cnpj
Jun 18, 2026
Merged

feat: add stripCpfCnpj (alphanumeric-safe CPF/CNPJ sanitizer)#39
FabioRolin merged 1 commit into
masterfrom
feat/strip-cpf-cnpj

Conversation

@FabioRolin

Copy link
Copy Markdown
Contributor

Summary

Adiciona um export público stripCpfCnpj — o sanitizador de CPF/CNPJ que estava faltando para o ecossistema lidar com CNPJ alfanumérico (Receita Federal — NT 49/2024, vigente a partir de 2026).

import { stripCpfCnpj } from '@useblu/utils';

stripCpfCnpj('12.345.678/0001-95'); // '12345678000195'  (CNPJ numérico)
stripCpfCnpj('AB.345.678/XY01-74'); // 'AB345678XY0174'  (CNPJ alfanumérico — letras preservadas)
stripCpfCnpj('ab.345.678/xy01-74'); // 'AB345678XY0174'  (normaliza upper-case)

Remove só os separadores da máscara (qualquer não-alfanumérico) e normaliza para upper-case, preservando as letras do CNPJ alfanumérico. É o inverso de normalizeCpfOrCnpj (que aplica a máscara).

Por quê

Hoje os MFEs limpam CNPJ com stripNumbers ou value.replace(/\D/g, '') — ambos descartam as letras A–Z e transformam um CNPJ alfanumérico válido em inválido (AB.345.678/XY01-743456780174). O bug aparece como "CNPJ inválido"/"cliente não encontrado" para novos clientes a partir de 2026.

Não havia um strip alfanumérico-safe público na lib:

  • stripNumbers → destrutivo (/\D/g)
  • normalizeCpfOrCnpj → aplica máscara (o inverso de um strip)

Por isso vários MFEs criaram helpers locais stripCnpj/stripCpfCnpj duplicados (mfe-signup, mfe-bill, mfe-charge-management, mfe-payment-transfer, mfe-suppliers-lighthouse, mfe-pix, mfe-home). Este export centraliza a regra num único ponto de atualização, conforme stack/alphanumeric-cnpj-stripping.md (§2 — helper central), e permite remover os helpers locais.

Implementação

  • src/utils/stripCpfCnpj.ts — delega ao stripAlphanumeric interno (src/masks/strip.ts), que já é usado e testado por maskValue, maskComplete, normalizeCpfOrCnpj e formatCnpj. Zero lógica nova/duplicada.
  • src/index.ts — novo export na seção // utils.
  • tests/stripCpfCnpj.spec.ts — CPF, CNPJ numérico, alfanumérico (maiúsc./minúsc.), idempotência e undefined/vazio.

Test plan

  • yarn test24 suites / 153 testes (inclui os 6 novos), tudo verde
  • yarn build (tsc --declaration) → compila; export confirmado em lib/ (stripCpfCnpj('AB.345.678/XY01-74')AB345678XY0174)

Próximos passos (follow-up)

  1. PR de bump de versão (convenção do repo: bump em PR separado, ex. bump: upgrade version to 1.2.1 #34/OR-145: bump version para 1.2.2 #36) → publica a nova versão no npm.
  2. Por MFE: bump do @useblu/utils + trocar o helper local por import { stripCpfCnpj } from 'core/blu-utils' + deletar o arquivo local. (Depende de 1 estar publicado — caso contrário recriaríamos o erro is not a function em CI.)

Referências

  • stack/alphanumeric-cnpj-stripping.md
  • Receita Federal — NT 49/2024 (CNPJ alfanumérico)

🤖 Generated with Claude Code

Expõe um export público `stripCpfCnpj` que remove os separadores da máscara e
normaliza para upper-case PRESERVANDO as letras do CNPJ alfanumérico (RFB
NT 49/2024). Delega ao `stripAlphanumeric` interno (já usado/testado por
maskValue, normalizeCpfOrCnpj e formatCnpj), evitando duplicar a regra.

Motivação: hoje os MFEs usam `stripNumbers`/`value.replace(/\D/g,'')` para
limpar CNPJ, o que descarta as letras A–Z e quebra CNPJ alfanumérico a partir
de 2026. Como não havia um *strip* alfanumérico-safe público (stripNumbers é
destrutivo; normalizeCpfOrCnpj aplica máscara, o inverso), cada MFE criou um
helper local. Este export centraliza a regra em um único ponto de atualização,
conforme stack/alphanumeric-cnpj-stripping.md (§2), e permite remover os
helpers duplicados nos MFEs.

stripCpfCnpj é o inverso de normalizeCpfOrCnpj.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
@FabioRolin FabioRolin self-assigned this Jun 18, 2026
@FabioRolin FabioRolin requested review from a team and removed request for danimuller20 and leonardodouradol June 18, 2026 17:38
@FabioRolin FabioRolin merged commit 7903fbf into master Jun 18, 2026
2 checks passed
@FabioRolin FabioRolin deleted the feat/strip-cpf-cnpj branch June 18, 2026 17:40
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.

3 participants