~ $ tens um minutinho
tema pontuação

#09 · sexta, 30 de outubro de 2026 · 450 palavras, dois minutinhos

undefined is not a function

Ilustração de undefined is not a function

Quando te pedem um botão numa página e dizes que é uma tarde de trabalho, abres o projeto e é um monorepo com dezassete packages e um ficheiro package.json que pesa mais do que a tua tese. Fazes npm install e a barra de progresso fica trinta minutos a dizer "idealTree", o que soa a terapia, e no fim tens 1 842 dependências para um botão e 23 vulnerabilidades, sendo 4 críticas, numa biblioteca de 2015 que converte cores em cores. Corres npm audit fix e passam a ser 31.

O projeto está em TypeScript, mas metade dos tipos são any com um comentário a dizer "temporário" de 2022, e a outra metade é um tipo genérico com sete níveis de condicionais que ninguém sabe ler mas que faz o VS Code demorar quatro segundos a mostrar um tooltip. Descobres que o build usa Webpack mas o dev server usa Vite, e os testes usam Jest com Babel a transformar TypeScript para JavaScript para TypeScript outra vez. Há um ficheiro .babelrc e um babel.config.js, e os dois discordam. O ESLint tem 400 regras, das quais 380 estão desligadas com eslint-disable-next-line.

Tu escreves o botão em React, porque é o que está lá, mas o botão não aparece, porque o estado está num Redux que ninguém usa desde que migraram para Context, que ninguém usa desde que migraram para um hook chamado useStore, que vem de uma biblioteca de um único autor que arquivou o repositório em 2023. Abres a consola e a consola diz "undefined is not a function" numa linha 1 de um ficheiro minificado chamado chunk-7a3f.js de 2 MB. Tentas o source map e o source map aponta para um ficheiro que já não existe. Pões um console.log e o console.log aparece doze vezes, porque o componente renderiza doze vezes por motivos que o React chama de otimização. O botão finalmente aparece, mas três pixéis para a esquerda, porque o Tailwind tem uma classe chamada ml-0.5 e outra chamada -ml-0.5 e outra chamada ml-[0.5px], e tu cedes e escreves um style inline como em 2004.

Ao fazer o pull request o CI falha, porque o Prettier quer aspas simples e o ESLint quer aspas duplas, e o Husky bloqueia o commit porque o teste de snapshot de um componente que não tocaste mudou sozinho devido a uma data. Às sete da tarde fazes merge do botão com 14 ficheiros alterados e 2 311 linhas de package-lock.json.

No dia seguinte alguém faz um PR a migrar tudo para um framework novo que saiu ontem e tem 340 estrelas e um logótipo bonito, e o botão deixa de funcionar. Tu abres o Python e escreves print("olá"), e ele diz olá.

Um email por texto, sem mais nada. Confirmas pela ligação que te mandamos e cancelas quando quiseres.