- Dernière version
- 2026-10-04
- Premier commit
- 2026-09-29
Packages
Bibliothèque · TypeScript · npm
Les paquets npm sous ce site, sous Taverla, sous Séance et sous on-record, typés aussi loin que va le compilateur.
Des petits paquets TypeScript sans dépendance tierce à l’exécution, publiés sur npm, chacun sorti d’un projet dès qu’un deuxième en avait besoin. L’un traduit, et sait dès la compilation ce que chaque message attend ; un autre dit si quelque chose a marché, sans exception et sans null ; les suivants gardent le thème choisi sans flash, ôtent les exceptions de localStorage et du presse-papiers, et partagent le reset, l’anneau de focus et les réglages du compilateur et du linter dont part chaque projet.
- TypeScript
- React
- Intl
- Vitest
- Biome
- Changesets
- GitHub Actions
const EN = defineDictionary({ greeting: 'Hello {name}' })
translate('greeting', { name: 'Ada' })
translate('greeting')
Expected 2 arguments, but got 1
translate('greeting', { nom: 'Ada' })
'nom' does not exist in type '{ name: string }'
translate('greting', { name: 'Ada' })
not assignable to '"greeting"'
Les arguments d’un message se lisent dans le message lui-même : oubliez {name} et l’appel ne compile pas. Ni génération de code, ni plugin de build.
- Paquets
- 11sous @adrienlcp
- Dernière version
- 2026-10-04sur npm, avec provenance
- Commits
- 64sur main, lus le 2026-10-04
- Couverture
- 96 %lignes exécutées par les tests de chaque paquet, lues le 2026-10-02
- Installés par
- 6 appsTaverla, on-record, Séance, Analytics, Scoreboard, Ce site
Tel que le compilateur le lit
Mis en page comme dans un éditeur : une ligne ondulée est un build qui refuse, une ligne violette est ce que le compilateur déduit tout seul.
const parse = (input: string): Result<number, 'not_a_number'> => { const value = Number(input) return Number.isNaN(value) ? Result.failure('not_a_number') : Result.success(value) } const result = parse(raw) if (result.status === 'failure') return result.error 'not_a_number' result.data numberResult tient en trente lignes. Un succès qui ne porte rien n’a pas de clé data du tout : personne n’y lit undefined.
export const themeStore = createThemePreferenceStore({ storageKey: 'app:theme' }) // vite.config.ts: runs before the first paint plugins: [themePreferencePlugin(themeStore)] themeStore.setPreference('dark') <html data-theme="dark"> dark theme-color: media="all" light theme-color: media="not all"Un téléphone peint sa barre d’outils avec les balises theme-color, qui suivent le système, pas le visiteur. Le paquet de thème réécrit leur media query avant le premier rendu : un choix sombre sur un téléphone clair a aussi sa barre sombre.
const locale = readRecognizedText({ key: 'app:locale', isRecognized: isLocale }) if (locale.status === 'failure') { locale.error 'unavailable' | 'unrecognized' } else { locale.data 'en' | 'fr' | null }La fenêtre privée de Safari levait une exception à chaque écriture dans localStorage ; safe-storage y renvoie un Result, comme pour un quota plein ou une valeur rangée par une ancienne version.
Ce qui est livré
- Le dictionnaire français est typé contre l’anglais, jusqu’à chaque paramètre : une clé oubliée ou un {nom} écrit à la place de {name} casse le build au lieu de s’afficher à l’écran.
- Chaque règle qu’elle impose est une erreur de compilation : ces tests-là s’écrivent en types et c’est tsc qui les vérifie.
- browser copie dans le presse-papiers même en HTTP simple, où l’API Clipboard n’existe pas.
- Versionnés avec Changesets et publiés depuis GitHub Actions avec la provenance npm, jamais depuis un portable.
- Ce site, Taverla, Séance et on-record les installent depuis npm, jusqu’à leurs configs TypeScript et Biome.
Les 11
Chacun à sa version sur npm, et quelle app l’installe.
- 2026-10-03 · 11 paquets publiés sur npm, avec provenanceDocumentationgithub.com/AdrienLcp/packages
@adrienlcp/theme-preference
Garde le thème choisi sans flash, jusqu’à la barre du téléphone.
0.3.0Livré@adrienlcp/browser
Copie dans le presse-papiers même en HTTP simple, où l’API Clipboard n’existe pas.
0.1.1Livré@adrienlcp/react-aria
L’anneau de focus et la composition de classes sur react-aria-components.
0.1.0Livré@adrienlcp/safe-storage
Ôte les exceptions de localStorage et renvoie un Result à la place.
0.1.0Livré
Historique
Tiré du git log, abrégé, et laissé dans sa langue : 8 commits sur 64, du plus récent au plus ancien.
- Darken the muted ink until it reads at WCAG AA on every surface, checked by a test
- Format a Temporal ZonedDateTime in {x:date}, in its own zone and calendar
- Check colour token contrast against WCAG from a test, through @adrienlcp/styles/contrast
- Add the documentation site, built from the packages' own sources
- Animate exits through CSS, and animate navigations with React's ViewTransition
- Add container query mixins and let sizes transition to keywords
- Hold back a package npm has never seen instead of failing the release
- Publish the i18n and result packagesPremier commit