Contexto
Comecei o JS Utilities na Feedzai depois de encontrar as mesmas pequenas funções copiadas entre produtos. Noutros casos, as equipas instalavam pacotes generalistas como lodash ou react-use para obter um ou dois auxiliares, acrescentando mais código e outra dependência para resolver um problema limitado.
Cada função era simples. A implementação repetida, as correções inconsistentes e o custo acumulado nos bundles não eram. Queria uma única biblioteca testada que as equipas pudessem adotar seletivamente, sem a transformar noutro framework de utilitários demasiado grande.
Processo e decisões
Construí a biblioteca a partir de padrões já usados em produção. Inclui pequenos auxiliares de teste como random e draw; verificações de tipo como isNil, isEmpty e isPromise; utilitários para arrays e objetos; abstrações para armazenamento no navegador e cookies; e hooks React como useAutoId, useConstant, usePrevious, useMount e useIntersection.
O pacote publica versões ESM e CommonJS com as respetivas declarações TypeScript. O CommonJS manteve a compatibilidade com ferramentas antigas da Feedzai, enquanto ESM e sideEffects: false permitem que os bundlers modernos removam código não utilizado.
Os hooks React vivem numa exportação ./hooks separada. Assim, quem usa JavaScript sem React pode importar funções como classNames, chunk ou getValue sem incluir código específico de React no bundle.
O limite de 11 kB partiu do tamanho total do bundle da versão 1.0.0. Transformei esse valor inicial num limite automático, para impedir que novas conveniências se transformassem silenciosamente em peso desnecessário. Os testes de componentes com Cypress exercitam as funções e os hooks num navegador.
A minha versão vive no monorepo frontend partilhado porque o React A11y Tools depende dela e porque os pacotes podem partilhar a infraestrutura de build, testes, documentação e publicação, em vez de repetirem essa configuração em repositórios separados.
Resultado
O pacote original @feedzai/js-utilities é usado nos principais produtos da Feedzai, incluindo Case Manager, Pulse, Genome, RiskOps Studio, SAR Manager e o sistema de design Escudo. A substituição de auxiliares copiados e dependências generalistas maiores reduziu a duplicação e o tamanho dos bundles de produção nesse conjunto de produtos.
Continuo a manter e publicar @jtmdias/js-utilities no npm. Uso-o diariamente nos meus projetos, onde fornece a mesma base focada aos restantes pacotes do monorepo.
Aprendizagem
Uma biblioteca de utilitários partilhada continua a ser útil quando cada adição justifica o seu lugar. Pontos de entrada separados, consumidores reais e um limite fixo de tamanho impedem que a conveniência se transforme noutra fonte de peso nas dependências.



