Akira UI 3.0.0 casse trois imports, rien de plus
Une application qui n'importait que Button devait installer recharts pour que le bundler passe. La 3.0.0 sort charts, data table et form sur leurs propres subpaths.
Voilà toute la migration vers la 3.0.0 d’Akira UI :
// avant, en 2.6.0
import { AreaChart, DataTable, Form } from '@akira-io/ui';
// après, en 3.0.0
import { AreaChart } from '@akira-io/ui/charts';
import { DataTable } from '@akira-io/ui/data-table';
import { Form } from '@akira-io/ui/form';
Trois lignes. Les exports déplacés gardent leur nom, leurs props et leurs libellés. ChartContainer, CHART_PALETTE, chartColorVariable, FacetedFilter, RowActionsMenu, FormField et les types Column, Row et ColumnDef suivent le composant auquel ils sont rattachés. Une application qui n’affiche ni graphique, ni tableau, ni formulaire supprime trois dépendances et ne réécrit rien.
Pourquoi il fallait casser quelque chose
Depuis la 1.1.0, le manifeste déclarait recharts, @tanstack/react-table et react-hook-form comme peers optionnels. Le point d’entrée racine les importait tous les trois d’emblée. Optionnel sur le papier, obligatoire au moment du bundling :
Cannot find package recharts imported from node_modules/@akira-io/ui/dist/index.js
Ce message vient d’une application réelle, début septembre. L’intégration Astro de payable-docs avait installé les trois paquets pour consommer des primitives de navigation et des overlays. Rien de ce qu’elle affiche n’est un graphique.
Elle aurait pu aller chercher le chunk voulu directement dans dist/. Elle s’y est refusée, et elle avait raison : un chunk interne n’est pas une API publique et casse à la première release qui réorganise le build. Restait la surface publiée, et la surface publiée facturait trois paquets à l’installation.
Un test parcourt désormais, dans le build, le graphe d’imports des huit points d’entrée de sa liste, fichiers de déclarations compris, et échoue dès que l’un d’eux atteint un de ces trois peers. Il vérifie aussi que chaque export a bien quitté la racine et rejoint son subpath, pour que la régression ne revienne pas en silence.
Une majeure pour trois lignes d’import
L’objection est légitime : monter une version majeure pour des chemins d’import gonfle le numéro. Le versionnement sémantique dit si le code du consommateur casse, pas combien coûte la réparation. Ici il casse, donc la majeure est honnête, et la réparation tient dans un rechercher-remplacer sur trois noms.
Ce qui a changé, c’est la promesse sous le numéro. En 2.6.0, une application payait pour des composants qu’elle n’affichait jamais. En 3.0.0, elle paie ce qu’elle importe.
Le reste de la release
Les passkeys arrivent en blocs composables : une liste, un élément, un bouton d’enregistrement, un bouton de connexion et un point d’entrée Inertia relié à @laravel/passkeys, pour qu’une application Laravel branche le flux d’identifiants sans réécrire la chorégraphie WebAuthn.
Le calendrier et le filtre de plage de dates suivent la locale de dates du provider au lieu de figer le portugais. Le genre de valeur par défaut qui ne convient qu’à celui qui l’a écrite.
Les couleurs de séries d’un graphique ne se télescopent plus quand deux clés sont normalisées vers le même nom de custom property. Ce correctif était prêt avant la 2.6.0 et en avait été retiré : sa revue avait montré qu’il cassait l’infobulle et la légende. Réparé pour de bon, il sort ici.
La boîte de dialogue de configuration du double facteur explique le jour de retard. Le QR code s’étirait sur toute la largeur du panneau et poussait le titre et le bouton Continuer hors de l’écran. Le défaut est apparu sur la démo du site de documentation, pas dans un test et pas par un utilisateur. Le QR tient maintenant une taille fixe dans un cadre clair, la clé de configuration est un champ en lecture seule avec révélation et copie, et le corps de la boîte défile en gardant le titre et l’action principale hors de la zone de défilement.
Un peer optionnel que la racine importe est un peer obligatoire mal documenté.