AkiraAkira.dev
4 min de leitura

A biblioteca que saiu de uma app

O primeiro commit do @akira-io/ui tem 13.055 linhas que ninguém escreveu nesse dia. Foram mudadas de sítio, e o preço veio no mês seguinte.

também em EN FR

O primeiro commit do @akira-io/ui tem 122 ficheiros e 13.055 linhas. Nenhuma delas foi escrita nesse dia. A mensagem é honesta ao ponto de ser aborrecida: chore: import component library from nosferry-ui. No mesmo dia veio o segundo commit, a mudar o nome do pacote. Uma pasta de componentes que vivia dentro de uma aplicação Laravel mudou de casa porque apareceu uma segunda aplicação a precisar do mesmo.

Uma biblioteca extraída de uma aplicação chega à versão 1 com problemas já resolvidos que um projeto de raiz nem teria descoberto. A fatura é a aplicação vir agarrada. Foram trinta e três dias e quatro releases com breaking changes a raspá-la.

O que veio já resolvido

O pacote tem hoje 78 componentes e 30 ficheiros de teste. Isso não é ritmo de escrita, é inventário de uma aplicação que já estava em produção.

E não são só componentes. Vieram src/shells, os arranjos de página que a aplicação usava; vieram src/blocks, composições inteiras; veio src/editor.ts, com o TipTap por trás. Um pacote começado do zero teria escrito o Button na primeira semana e chegado ao editor de texto rico em novembro, se lá chegasse. Este chegou lá antes de ter nome próprio.

A parte difícil de uma biblioteca de componentes nunca foi ter componentes. É saber quais é que a aplicação real pede quando a aplicação real deixa de ser hipotética.

A fatura chegou em português

A versão 1.0.0 saiu a 3 de agosto, três dias depois da importação. Levou quatro breaking changes com ela, e um deles chamava-se default every user-facing string to english.

Quarenta e quatro strings de interface tinham português por omissão. Estavam na combobox, no diálogo de confirmação, no filtro facetado, na paleta de comandos, no tour, e no filtro de datas inteiro. Duas delas nem sequer tinham forma de ser substituídas. Um pacote publicado no npm que responde Semana anterior a quem nunca pediu português não tem um problema de tradução, tem uma marca de nascença.

O detalhe que interessa é outro. Os defaults do filtro de datas eram estes:

// src/blocks/date-filter/types.ts, antes da 1.0.0
{ value: 'today', label: 'Hoje' },
{ value: 'yesterday', label: 'Ontem' },
{ value: 'previous_week', label: 'Semana anterior' },
{ value: 'previous_month', label: 'Mês anterior' },

E o teste em src/blocks/date-filter/date-filter.test.ts assertava-os em português, com um override a passar all: 'Sempre'. Foi assim que aquilo sobreviveu a uma passagem anterior que deu o ficheiro por arrumado. A suite estava verde porque estava a proteger o defeito. Um teste escrito dentro de uma aplicação assume o mundo dessa aplicação, e continua a assumi-lo depois de a pasta mudar de sítio.

Hoje os valores portugueses vivem em src/locales/pt.ts como objeto tipado, ao lado de fr.ts, e uma label nova não passa a compilação sem tradução. O teste asserta os defaults ingleses e ganhou um bloco paralelo que prova que o objeto de locale ainda produz o texto antigo.

A parte que não sai

Nem tudo o que a aplicação deixou lá é dívida.

O pacote exporta src/inertia.ts, src/inertia-tour-progress.ts e src/inertia-table-filters.ts. Uma biblioteca React genérica não tem nada disto. Existe porque nasceu dentro de uma aplicação Laravel com Inertia, e as tabelas dessa aplicação precisavam que os filtros falassem com o backend.

A decisão foi mantê-la e marcá-la: o @inertiajs/react é peer dependency opcional. Quem usa React e mais nada instala o pacote e nunca sabe que aquele ficheiro existe. Quem usa Inertia poupa o adaptador que ia escrever à mão.

A diferença entre esta superfície e as strings portuguesas é que uma foi escolhida e a outra foi herdada sem ninguém reparar. O trabalho do primeiro mês foi separar as duas.

Então devia ter começado pelo pacote

É a objeção óbvia, e falha por uma razão só: um pacote começado de raiz teria 78 componentes que ninguém experimentou.

O tour com progresso guardado, os filtros de tabela que sobrevivem ao redirect, os shells de página com a barra lateral colapsável, o editor. São coisas que ninguém desenha por antecipação, e das quais ninguém acerta a API à primeira sem uma aplicação a queixar-se. A aplicação foi o teste de aceitação, e correu durante meses antes de existir uma versão 1.

O que a extração custa é aquele mês de releases a partir a API de propósito. Quatro breaking changes em trinta e três dias parecem instabilidade e são o contrário: é a janela em que partir ainda é barato, usada enquanto está aberta. A versão 2.4.0 saiu a 2 de setembro sem partir nada.

Uma biblioteca de componentes que nunca serviu uma aplicação real é uma coleção de opiniões. Esta começou por ser uma aplicação, e o primeiro mês foi passado a descobrir quais dessas opiniões eram dela.

partilhar