Bibliothèque d'utilitaires moderne pour les développeurs JavaScript/TypeScript. Une collection de fonctions fiables et bien testées pour les tâches de programmation courantes.
- 🚀 Syntaxe moderne ES2020+
- 📦 Builds ESM et CommonJS optimisés par tree-shaking
- 💪 Prise en charge complète de TypeScript avec définitions de types complètes
- ✅ Tests unitaires complets
- 🔒 Aucune dépendance
- 📖 Bien documenté avec des commentaires JSDoc
21 fonctions utilitaires organisées en 6 modules :
slugify()- Convertit le texte en slugs compatibles avec les URLcapitalize()- Met la première lettre en majusculetruncate()- Tronque le texte avec des points de suspensionrandomString()- Génère des chaînes de caractères aléatoires
formatNumber()- Formate les nombres avec des séparateurs de milliersclamp()- Limite une valeur entre un minimum et un maximumroundTo()- Arrondit à un nombre de décimales spécifiépercent()- Calcule les pourcentages
formatDate()- Formate les dates selon la localetimeAgo()- Affiche le temps écoulé de manière lisibleisValidDate()- Valide les dates
deepClone()- Crée une copie complète et indépendante d'un objet, y compris tous les niveaux imbriquésmerge()- Combine plusieurs objets en un seul en fusionnant récursivement leurs propriétésomit()- Crée un nouvel objet en excluant certaines propriétés spécifiquespick()- Crée un nouvel objet en ne gardant que les propriétés sélectionnées
unique()- Supprime les doublonschunk()- Divise un tableau en plusieurs morceauxflatten()- Aplatit les tableaux imbriquésgroupBy()- Regroupe les éléments par clé/fonctionpaginate()- Pagine un tableau avec plusieurs stratégies (offset, page, cursor)
formatTimestamp()- Formate un timestamp UNIX en différents formats de date lisibles
npm install @progestionsoft/axiomyarn add @progestionsoft/axiompnpm add @progestionsoft/axiomimport { formatNumber, slugify } from '@progestionsoft/axiom';
console.log(formatNumber(1234567.89)); // "1,234,567.89"
console.log(slugify('Hello World!')); // "hello-world"import axiom from '@progestionsoft/axiom';
console.log(axiom.formatNumber(1234567.89)); // "1,234,567.89"
console.log(axiom.slugify('Hello World!')); // "hello-world"Convertit une chaîne de caractères en un slug compatible avec les URL.
slugify('Hello World!'); // "hello-world"
slugify('Café Français'); // "cafe-francais"Met la première lettre d'une chaîne de caractères en majuscule.
capitalize('hello world'); // "Hello world"
capitalize('HELLO'); // "Bonjour"Tronque une chaîne de caractères à une longueur spécifiée et ajoute des points de suspension.
truncate('Lorem ipsum dolor sit amet', 10); // "Lorem ipsu..."
truncate('Hello World', 8, '…'); // "Hello W…"Génère une chaîne de caractères aléatoire de longueur spécifiée.
randomString(8); // "aB3dE7fG"
randomString(6, 'ABC123'); // "A1B2C3"Formate un nombre avec des séparateurs de milliers et des décimales.
formatNumber(1234567.89); // "1,234,567.89"
formatNumber(1234.5, 0); // "1,235"
formatNumber(1234.56, 2, 'de-DE'); // "1.234,56"Limite un nombre entre une valeur minimale et maximale.
clamp(10, 0, 5); // 5
clamp(-5, 0, 10); // 0
clamp(7, 0, 10); // 7Arrondit un nombre à un nombre spécifié de décimales.
roundTo(3.14159, 2); // 3.14
roundTo(2.5); // 3Calcule le pourcentage d'une valeur par rapport à un total.
percent(25, 100); // 25
percent(1, 3, 2); // 33.33formatDate(date: Date | string | number, options?: Intl.DateTimeFormatOptions, locale?: string): string
Formate une date selon une locale.
formatDate(new Date('2024-01-15')); // "15/01/2024"
formatDate(new Date(), { dateStyle: 'full' }); // "lundi 15 janvier 2024"
formatDate(Date.now(), { year: 'numeric', month: 'long' }); // "janvier 2024"Renvoie la différence de temps par rapport à maintenant, dans un format lisible.
timeAgo(new Date(Date.now() - 60000)); // "il y a 1 minute"
timeAgo(new Date(Date.now() + 3600000)); // "dans 1 heure"Vérifie si une date est valide.
isValidDate(new Date()); // true
isValidDate('2024-01-15'); // true
isValidDate('invalid'); // falseLes fonctions d'objets permettent de manipuler les structures de données complexes de manière sûre et efficace.
Crée une copie complète et indépendante d'un objet, incluant tous les niveaux imbriqués. Contrairement à une copie superficielle, les modifications sur le clone n'affectent pas l'original.
- Créer une copie de données pour les modifier sans affecter l'original
- Éviter les effets de bord lors de la manipulation d'objets
- Sauvegarder un état avant modification
const original = { a: 1, b: { c: 2 } };
const cloned = deepClone(original);
cloned.b.c = 3; // original.b.c reste 2Combine plusieurs objets en un seul en fusionnant récursivement leurs propriétés. Les propriétés des objets sources écrasent celles de la cible, mais les objets imbriqués sont fusionnés plutôt que remplacés.
- Fusionner des configurations par défaut avec des paramètres utilisateur
- Combiner plusieurs options partielles en un objet complet
- Créer des objets composites à partir de plusieurs sources
merge({ a: 1 }, { b: 2 }, { c: 3 }); // { a: 1, b: 2, c: 3 }
merge({ a: { x: 1 } }, { a: { y: 2 } }); // { a: { x: 1, y: 2 } }Crée un nouvel objet en excluant certaines propriétés spécifiques. Utile pour filtrer les données sensibles ou indésirables.
- Supprimer des propriétés sensibles avant d'envoyer des données (ex: mots de passe)
- Nettoyer des objets en retirant des champs temporaires ou inutiles
- Préparer des données pour des API qui n'acceptent que certains champs
omit({ a: 1, b: 2, c: 3 }, ['b', 'c']); // { a: 1 }Crée un nouvel objet en ne gardant que les propriétés sélectionnées. C'est l'inverse de omit.
- Extraire seulement les données nécessaires d'un objet volumineux
- Créer des vues partielles d'objets complexes
- Sélectionner des champs spécifiques pour une API ou un formulaire
pick({ a: 1, b: 2, c: 3 }, ['a', 'c']); // { a: 1, c: 3 }Retourne un tableau avec des valeurs uniques.
unique([1, 2, 2, 3, 3, 3]); // [1, 2, 3]
unique(['a', 'b', 'a']); // ['a', 'b']Divise un tableau en morceaux de taille spécifiée.
chunk([1, 2, 3, 4, 5], 2); // [[1, 2], [3, 4], [5]]Aplatit un tableau imbriqué jusqu'à une profondeur spécifiée.
flatten([1, [2, [3, [4]]]]); // [1, 2, [3, [4]]]
flatten([1, [2, [3, [4]]]], 2); // [1, 2, 3, [4]]
flatten([1, [2, [3, [4]]]], Infinity); // [1, 2, 3, 4]Regroupe les éléments d'un tableau par une clé ou une fonction.
groupBy([{ age: 21 }, { age: 22 }, { age: 21 }], 'age');
// { '21': [{ age: 21 }, { age: 21 }], '22': [{ age: 22 }] }
groupBy([1.3, 2.1, 2.4], Math.floor);
// { '1': [1.3], '2': [2.1, 2.4] }Pagine un tableau avec plusieurs stratégies : offset, page ou cursor. Retourne les données paginées avec les métadonnées associées.
- Offset-based : Utilise un décalage (offset) et une limite pour paginer
- Page-based : Utilise un numéro de page et une taille de page
- Cursor-based : Utilise un curseur pour naviguer dans les données (idéal pour les flux continus)
// Pagination par offset
paginate([1, 2, 3, 4, 5], { type: 'offset', offset: 2, limit: 2 })
// returns { type: 'offset', data: [3, 4], total: 5, hasMore: true, offset: 2, limit: 2 }
// Pagination par page
paginate([1, 2, 3, 4, 5], { type: 'page', page: 2, pageSize: 2 })
// returns { type: 'page', data: [3, 4], total: 5, hasMore: true, page: 2, pageSize: 2, totalPages: 3 }
// Pagination par curseur
const items = [{ id: '1' }, { id: '2' }, { id: '3' }];
paginate(items, { type: 'cursor', cursor: '1', limit: 2, getCursorValue: item => item.id })
// returns { type: 'cursor', data: [{ id: '2' }, { id: '3' }], total: 3, hasMore: false, nextCursor: null, prevCursor: '1' }Formate un timestamp UNIX (en millisecondes) en différents formats de date lisibles.
'timestamp'- Retourne le timestamp d'origine (par défaut)'full'- Format complet : "vendredi 14 novembre 2025"'compact'- Format compact : "vend. 14 novembre 2025"'long'- Format long : "14 novembre 2025"'medium'- Format moyen : "14 nov. 2025"'short'- Format court : "14/11/2025"'datetime'- Date et heure : "14 nov. 2025 10:04:02"'time'- Heure uniquement : "22:14:03"'iso'- Format ISO 8601 : "2025-11-14T22:14:03.001Z"'relative'- Format relatif : "il y a 2 jours"
formatTimestamp(1756868642754, 'full'); // "vendredi 14 novembre 2025"
formatTimestamp(Date.now(), 'relative'); // "il y a 2 jours"
formatTimestamp(1756868642754, 'iso'); // "2025-11-14T22:14:03.001Z"
formatTimestamp(1756868642754, 'short'); // "14/11/2025"
formatTimestamp(1756868642754, 'time'); // "22:14:03"
formatTimestamp(1756868642754, 'datetime', 'en-US'); // "Nov 14, 2025 10:04:02 PM"Testez toutes les fonctions de manière interactive avec notre Axiom Playground conçu avec Nuxt et Tailwind CSS !
L'espace de test comprend des pages interactives pour tester chaque catégorie d'utilitaires avec des résultats en temps réel.
Consultez playground/README.md pour plus de détails.
Les contributions sont les bienvenues ! N'hésitez pas à soumettre une Pull Request.
- Forkez le dépôt
- Créez votre branche de fonctionnalité (
git checkout -b feature/amazing-feature) - Commitez vos modifications (
git commit -m 'Ajout d'une fonctionnalité incroyable') - Poussez vers la branche (
git push origin feature/amazing-feature) - Ouvrez une Pull Request
Ce projet est sous licence MIT.
Si vous avez des questions ou rencontrez des problèmes, veuillez ouvrir une issue sur GitHub.