La bibliothèque sortie d'une application
78 composants et 30 fichiers de tests en trente-trois jours. Aucun n'a été écrit pendant ces trente-trois jours, et la facture est arrivée en portugais.
78 composants. 30 fichiers de tests. 12 pages de documentation. Onze versions publiées entre le 3 août et le 2 septembre. Vu de loin, @akira-io/ui ressemble à un mois de travail impossible.
Rien de tout cela n’a été écrit pendant ce mois. Le premier commit du dépôt contient 122 fichiers et 13 055 lignes, sous un message qui ne cherche pas à impressionner: chore: import component library from nosferry-ui. Un dossier de composants qui vivait dans une application Laravel a déménagé, parce qu’une deuxième application demandait la même chose.
Une bibliothèque extraite d’une application en production arrive à sa version 1 avec des problèmes déjà résolus qu’un projet parti de zéro n’aurait pas encore rencontrés. La facture, c’est que l’application vient avec.
Ce que l’application livre
Pas seulement des composants. src/shells a suivi, les mises en page que l’application utilisait. src/blocks aussi, des compositions entières plutôt que des primitives. Et src/editor.ts, avec TipTap dessous.
Un paquet démarré de zéro écrit son Button la première semaine et arrive à l’éditeur de texte riche en novembre, s’il y arrive. Celui-ci avait l’éditeur avant d’avoir son propre nom.
Avoir des composants n’a jamais été la partie difficile. Savoir lesquels une application réelle réclame, voilà la question, et la réponse n’existe qu’une fois que l’application cesse d’être hypothétique.
La facture est arrivée en portugais
La version 1.0.0 est sortie le 3 août, trois jours après l’import, avec quatre ruptures d’API. L’une d’elles s’appelait default every user-facing string to english.
Quarante-quatre chaînes d’interface avaient le portugais par défaut: la combobox, la boîte de confirmation, le filtre à facettes, la palette de commandes, le tour guidé, et l’intégralité du filtre de dates. Deux d’entre elles n’offraient aucun moyen de les remplacer. Un paquet publié sur npm qui répond Semana anterior à quelqu’un qui n’a jamais demandé de portugais n’a pas un problème de traduction.
Le point intéressant se trouve dans les tests:
// src/blocks/date-filter/types.ts, avant la 1.0.0
{ value: 'today', label: 'Hoje' },
{ value: 'yesterday', label: 'Ontem' },
{ value: 'previous_week', label: 'Semana anterior' },
{ value: 'previous_month', label: 'Mês anterior' },
Le test de src/blocks/date-filter/date-filter.test.ts vérifiait ces libellés portugais, en surchargeant l’un d’eux avec all: 'Sempre'. La suite était verte parce qu’elle protégeait le défaut, ce qui explique comment il a survécu à un premier passage qui avait déclaré le fichier terminé. Un test écrit à l’intérieur d’une application encode les hypothèses de cette application, et continue de les encoder après le déménagement.
Aujourd’hui le portugais vit dans src/locales/pt.ts sous forme d’objet typé, à côté de fr.ts. Un nouveau libellé ne compile pas sans traduction.
Ce qui reste, par choix
Le paquet exporte src/inertia.ts, src/inertia-tour-progress.ts et src/inertia-table-filters.ts. Une bibliothèque React générique n’a rien de tout cela. Cette surface existe parce que le code a grandi dans une application Laravel sous Inertia, où les filtres de tableau devaient survivre à un aller-retour serveur.
Elle a été gardée délibérément, et signalée: @inertiajs/react est une dépendance pair optionnelle. Dans une application React ordinaire, ce fichier reste invisible. Dans une application Inertia, l’adaptateur que vous alliez écrire à la main est déjà là.
L’héritage et le choix ont exactement la même apparence dans un diff. Les défauts portugais et les exports Inertia sont arrivés dans le même commit, dans les mêmes 13 055 lignes. Tout le travail du premier mois a consisté à les séparer.
L’objection
Il fallait commencer par le paquet. L’objection est évidente et elle échoue pour une seule raison: un paquet parti de zéro aurait produit 78 composants que personne n’avait utilisés.
Un tour guidé dont la progression persiste, des filtres de tableau qui survivent à une redirection, des coquilles de page à barre latérale repliable: aucune de ces API ne tombe juste du premier coup sans une application pour se plaindre. L’application a servi de test d’acceptation, et elle a tourné pendant des mois avant qu’il existe une version 1.
Quatre ruptures d’API en trente-trois jours se lisent comme de l’instabilité. C’est l’inverse. Casser coûte peu le premier mois et cher le sixième, et cette fenêtre a été utilisée tant qu’elle était ouverte. La version 2.4.0 est sortie le 2 septembre sans rien casser.
Le mois qui suit une extraction ne sert pas à finir la bibliothèque. Il sert à déterminer ce qui, dans le code, appartenait à l’application et non au paquet.