C'EST QUOI ?
hucre est un moteur de tableur écrit en TypeScript pur, sans aucune dépendance. Il lit et écrit du XLSX, du CSV, de l'ODS, du JSON, du NDJSON et du XML, et lit en plus le XLS legacy et le XLSB. Le core n'utilise aucune API Node (fs, crypto, Buffer) ni eval, donc le même paquet tourne dans Node 24+, Deno, Bun, un navigateur, un Cloudflare Worker ou une edge function Vercel.
POURQUOI C'EST INTÉRESSANT ?
- Zéro dépendance et imports tree-shakeable : chaque format a son sous-chemin.
parseCsv+writeCsvdepuishucre/csvpèsent 3,7 Ko gzippés,readXlsxseul 34 Ko, la lib entière 129 Ko. Ces tailles sont figées dans un budget que la CI fait échouer dès qu'une entrée déborde - Streaming des deux côtés :
streamXlsxRowsest un générateur async qui parse le ZIP de bout en bout directement depuis unReadableStream, avec plafond de lignes et filtre de plage A1.writeXlsxStreamconsomme n'importe quel itérable - un curseur de base de données, un autre flux - et la mémoire ne grimpe pas avec le nombre de lignes - Deux chemins séparés volontairement :
openXlsx/saveXlsxrecopie octet pour octet chaque partie qu'il ne régénère pas, donc les graphiques, les macros VBA et les thèmes survivent à une modification.readXlsx/writeXlsxest le chemin d'auteur, qui reconstruit le classeur depuis le modèle - L'écriture couvre les parties pénibles : styles de cellules, largeurs de colonnes calculées selon la police (caractères CJK double largeur compris), volets figés, filtres automatiques, validation de données, liens, images, commentaires, tableaux, mises en forme conditionnelles avec leurs styles dxf, sparklines et cases à cocher natives Excel 2024
- Validation de schéma intégrée :
validateWithSchemacoerce les types et appliquerequired,pattern,min/max,enumet des validateurs maison, puis rend les objets propres d'un côté et la liste des erreurs (ligne, champ, valeur) de l'autre - API unifiée et CLI :
read()détecte le format aux octets magiques ou au premier caractère,write()sort dans neuf formats, etnpx hucre convert|inspect|validatefait la même chose depuis un terminal, stdin et stdout compris
CAS D'USAGE
- Générer un export Excel stylé depuis une route API ou une edge function, sans ajouter la moindre dépendance
- Ingérer un fichier client de plusieurs millions de lignes en flux, avec un schéma qui contrôle chaque ligne au passage
- Modifier une cellule dans un classeur métier truffé de graphiques et de macros sans casser le reste du fichier
- Convertir un XLS legacy ou un CSV vers du XLSX, du Markdown ou du NDJSON en une seule commande
