Une interface de stockage structuré de données, simple, rapide et intuitive ✨
Fluid Storage est un petit systeme qui propose une API simple, unifiée et fluide pour gérer le stockage côté client (localStorage, sessionStorage, cookies) avec des fonctionnalités avancées inspirées de Laravel.
- 📦 Multi-backend - Supporte localStorage, sessionStorage et cookies
- ⚡ Interface fluide - API chainable et intuitive
- 🕒 Expiration automatique - Gestion native de l'expiration des données
- 🔧 TypeScript - Complètement typé pour une meilleure expérience de développement
- 📏 Léger - Seulement ~8KB gzippé
- 🛡️ Robustesse - Gestion d'erreurs et fallbacks automatiques
- 🎯 Polyvalent - Supporte tous les environnements (Node.js, navigateur, modules)
npm install fluid-storageou
yarn add fluid-storageimport { init } from 'fluid-storage';
const storage = init('myApp', 'localstorage', 60);
// Stocker des données
storage.set('user', { name: 'John', age: 30 });
storage.set('settings', { theme: 'dark' }, 1440); // Expire dans 24h
storage.set('userId', 1); // Accepte les nombres
storage.set('token', 'ejHhu.....'); // Accepte les chaines
storage.set('permissions', ['ADD_DATA', 'REMOVE_DATA']); // Accepte les tableau
storage.set('phone', {id: 12, price: '2000 USD', name: 'Iphone 10'}); // Accepte les objets
// Récupérer des données
const user = storage.get('user');
const settings = storage.get('settings');
// Méthodes avancées
storage.increment('visits');
storage.remember('cachedData', () => expensiveOperation());const { init } = require('fluid-storage');
const storage = init('myApp');
// Même API que ES Modules<script src="https://unpkg.com/fluid-storage/dist/index.umd.js"></script>
<script>
const storage = fluidStorage.init('myApp');
storage.set('key', 'value');
console.log(storage.get('key'));
</script>const storage = init(prefix?, type?, defaultExpire?);- prefix (
string, optionnel) - Préfixe pour toutes les clés (défaut:'fs') - type (
'localstorage' | 'sessionstorage' | 'cookie' | StorageAdapter, optionnel) - Type de stockage (défaut:'localstorage') - defaultExpire (
number, optionnel) - Expiration par défaut en minutes (défaut:0- pas d'expiration)
// Stocker une valeur
storage.set('key', 'value');
storage.set('key', { object: 'value' }, 60); // Expire dans 60 minutes
// Stocker multiple
storage.setMany({
key1: 'value1',
key2: 'value2'
}, 120); // Expire dans 120 minutes
// Récupérer une valeur
const value = storage.get('key');
// Récupérer multiple
const values = storage.many(['key1', 'key2', 'key3']);
// Récupérer tout
const allData = storage.getAll();storage.has('key'); // → boolean
storage.exists('key'); // → boolean
storage.missing('key'); // → boolean
storage.hasAny(['k1', 'k2']);// → boolean
storage.hasAll(['k1', 'k2']);// → boolean// Incrémentation/Décrémentation
storage.increment('counter'); // +1
storage.increment('counter', 5); // +5
storage.decrement('counter', 2); // -2
// Remember (récupère ou calcule)
const data = await storage.remember('key', async() => {
return fetchAPIData();
}, 60); // Cache pendant 60 minutes
// Remember synchrone
const data = storage.rememberSync('key', () => {
return expensiveOperation();
}, 60); // Cache pendant 60 minutes
// Pull (récupère et supprime)
const value = storage.pull('key');
// Tap (modifie une valeur)
storage.tap('key', currentValue => {
return currentValue + 1;
});// Obtenir seulement certaines clés
const filtered = storage.only('key1', 'key2');
// Exclure certaines clés
const without = storage.except('keyToExclude');
// Premier/dernier résultat existant
const first = storage.first(['key1', 'key2', 'key3']);
const last = storage.last(['key1', 'key2', 'key3']);
// Valeur aléatoire
const random = storage.random(); // Une valeur aléatoire
const randomMultiple = storage.random(3); // 3 valeurs aléatoires// Définir l'expiration
storage.expire('key', 30); // Expire dans 30 minutes
// Obtenir le temps restant
const minutesLeft = storage.getExpire('key'); // → number | null
// Étendre/Réduire l'expiration
storage.extend('key', 15); // Ajoute 15 minutes
storage.reduce('key', 10); // Retire 10 minutes
// Définir plusieurs expirations
storage.expireMany(['k1', 'k2'], 60);storage.remove('key'); // Supprimer une clé
storage.remove('k1', 'k2'); // Supprimer plusieurs clés
storage.forget('key'); // Alias de remove
storage.clear(); // Tout supprimer
storage.flush(); // Alias de clear// Vérification de contenu
storage.isEmpty('key'); // → boolean
storage.isNotEmpty('key'); // → boolean
// Information
storage.count(); // Nombre total d'items
storage.keys(); // Tableau de toutes les clés
storage.values(); // Tableau de toutes les valeurs
// Stockage permanent
storage.forever('key', 'value'); // N'expire jamais
// Ajout conditionnel
storage.add('key', 'value'); // → boolean (true si ajouté, false si existait déjà)const userStorage = init('userApp', 'localstorage', 120);
// Connexion utilisateur
userStorage.set('auth', {
token: 'jwt_token_here',
user: { id: 1, name: 'John Doe' }
}, 1440); // Expire dans 24h
// Métriques
userStorage.increment('loginCount');
userStorage.set('lastLogin', new Date().toISOString());
// Données temporaires
userStorage.remember('userPreferences', () => {
return fetchUserPreferences(); // Seulement appelé si non caché
}, 60);const apiCache = init('apiCache', 'sessionstorage', 10); // 10 minutes par défaut
async function fetchWithCache(url) {
return apiCache.remember(`api:${url}`, async () => {
const response = await fetch(url);
return response.json();
}, 5); // Cache pour 5 minutes
}const cartStorage = init('cart', 'localstorage');
// Ajouter au panier
cartStorage.tap('items', (currentItems = []) => {
return [...currentItems, { id: 123, quantity: 1 }];
});
// Mettre à jour la quantité
cartStorage.tap('items', items =>
items.map(item =>
item.id === 123 ? { ...item, quantity: 2 } : item
)
);
// Total du panier
const total = cartStorage.get('items')?.reduce((sum, item) =>
sum + (item.price * item.quantity), 0
);import { init, BaseAdapter } from 'fluid-storage';
class CustomAdapter extends BaseAdapter {
get(key) { /* implémentation */ }
set(key, value, expire) { /* implémentation */ }
remove(key) { /* implémentation */ }
clear() { /* implémentation */ }
getAll() { /* implémentation */ }
}
const storage = init('myApp', new CustomAdapter('custom-prefix'));// Stockage principal
const mainStorage = init('app', 'localstorage');
// Stockage de session
const sessionStorage = init('app-session', 'sessionstorage');
// Stockage temporaire
const tempStorage = init('app-temp', 'localstorage', 10); // 10 minutes| Fonctionnalité | localStorage | sessionStorage | Cookies |
|---|---|---|---|
| Persistance | ✅ Permanent | ❌ Session | ✅ Permanent |
| Capacité | ~5-10MB | ~5-10MB | ~4KB |
| Accès serveur | ❌ Non | ❌ Non | ✅ Oui |
| Expiration | Manuel | Session | Automatique |
| Performance | ⚡ Rapide | ⚡ Rapide | 🐢 Lente |
git clone https://github.com/dimtrovich/fluid-storage.git
cd fluid-storage
npm installnpm run buildnpm test
npm run test:coveragesrc/
├── adapters/ # Adaptateurs de stockage
│ ├── base-adapter.ts
│ ├── local-storage.ts
│ ├── session-storage.ts
│ └── cookie-storage.ts
├── types.ts # Définitions TypeScript
├── storage.ts # Coeur fonctionnel
├── utils.ts # Méthodes utilitaires
└── index.ts Point d'entrée
Les contributions sont les bienvenues ! N'hésitez pas à :
- Fork le projet
- Créer une branche feature (
git checkout -b feature/amazing-feature) - Commit vos changements (
git commit -m 'Add amazing feature') - Push sur la branche (
git push origin feature/amazing-feature) - Ouvrir une Pull Request
MIT License - voir le fichier LICENSE pour plus de détails.
- Les cookies ont une capacité limitée (~4KB)
- L'expiration des cookies est gérée différemment
- Safari en mode privé bloque localStorage
- Support IndexedDB
- Chiffrement des données
- Synchronisation entre onglets
- Plugins et middleware
- Support des observables (RxJS)
- Utilisez des préfixes significatifs pour éviter les collisions
- Choisissez le bon backend selon vos besoins
- Gérez les quotas avec try/catch pour localStorage
- Utilisez l'expiration pour les données temporaires
- Validez les données à la récupération
- Chrome 4+
- Firefox 3.5+
- Safari 4+
- IE 8+
- Edge 12+
- Node.js 12+
- 📧 Email: [email protected]
- 🐛 Issues GitHub
- 💬 Discussions GitHub
Développé avec ❤️ par Dimitri Sitchet Tomkeu