@arc-js/cooks 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +372 -0
- package/cooks.all.js +910 -0
- package/cooks.all.min.js +2 -0
- package/cooks.all.min.js.map +1 -0
- package/index.d.ts +64 -0
- package/index.js +145 -0
- package/index.min.d.ts +64 -0
- package/index.min.js +2 -0
- package/index.min.js.map +1 -0
- package/package.json +20 -0
- package/tsconfig.json +19 -0
package/README.md
ADDED
|
@@ -0,0 +1,372 @@
|
|
|
1
|
+
# @arc-js/cooks
|
|
2
|
+
|
|
3
|
+
[](LICENSE)
|
|
4
|
+

|
|
5
|
+

|
|
6
|
+

|
|
7
|
+
|
|
8
|
+
**@arc-js/cooks** est une bibliothèque TypeScript/JavaScript légère et type-safe pour la gestion des cookies dans les navigateurs web. Elle offre une API simple et intuitive pour stocker, récupérer et manipuler des cookies avec support des types complexes et des options avancées.
|
|
9
|
+
|
|
10
|
+
## ✨ Fonctionnalités Principales
|
|
11
|
+
|
|
12
|
+
- 🍪 **Gestion complète des cookies** : set, get, remove, has, clear
|
|
13
|
+
- 🔄 **Sérialisation automatique** : support des objets, tableaux, dates, et types primitifs
|
|
14
|
+
- 🛡️ **TypeScript-first** : typage complet et auto-complétion
|
|
15
|
+
- ⚙️ **Options avancées** : expiration, secure, sameSite, domain, path
|
|
16
|
+
- 🚀 **Léger et performant** : 0 dépendance, < 5KB minifié
|
|
17
|
+
- 🧪 **Robuste** : gestion d'erreurs et validation
|
|
18
|
+
- 🌐 **Multi-navigateurs** : support de tous les navigateurs modernes
|
|
19
|
+
|
|
20
|
+
## 📦 Installation
|
|
21
|
+
|
|
22
|
+
### Via npm/yarn/pnpm
|
|
23
|
+
|
|
24
|
+
```bash
|
|
25
|
+
npm install @arc-js/cooks
|
|
26
|
+
# ou
|
|
27
|
+
yarn add @arc-js/cooks
|
|
28
|
+
# ou
|
|
29
|
+
pnpm add @arc-js/cooks
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
### Importation directe (CDN)
|
|
33
|
+
|
|
34
|
+
```html
|
|
35
|
+
<script src="@arc-js/cooks/cooks.all.js"></script>
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
## 🚀 Démarrage Rapide
|
|
39
|
+
|
|
40
|
+
### TypeScript/ES Modules
|
|
41
|
+
|
|
42
|
+
```typescript
|
|
43
|
+
import Cooks from '@arc-js/cooks';
|
|
44
|
+
// ou
|
|
45
|
+
import { Cooks } from '@arc-js/cooks';
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
### CommonJS
|
|
49
|
+
|
|
50
|
+
```javascript
|
|
51
|
+
const { Cooks } = require('@arc-js/cooks');
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
### Navigateur (global)
|
|
55
|
+
|
|
56
|
+
```html
|
|
57
|
+
<script src="@arc-js/cooks/cooks.all.js"></script>
|
|
58
|
+
<script>
|
|
59
|
+
// Disponible globalement comme window.Cooks
|
|
60
|
+
Cooks.set('user', { name: 'John', age: 30 });
|
|
61
|
+
const user = Cooks.get('user');
|
|
62
|
+
console.log(user); // { name: 'John', age: 30 }
|
|
63
|
+
</script>
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
## 📚 Documentation API
|
|
67
|
+
|
|
68
|
+
### Types Supportés
|
|
69
|
+
|
|
70
|
+
```typescript
|
|
71
|
+
type Serializable =
|
|
72
|
+
| string
|
|
73
|
+
| number
|
|
74
|
+
| boolean
|
|
75
|
+
| Date
|
|
76
|
+
| object
|
|
77
|
+
| Array<any>
|
|
78
|
+
| null
|
|
79
|
+
| undefined;
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
### Options des Cookies
|
|
83
|
+
|
|
84
|
+
```typescript
|
|
85
|
+
interface CooksOptions {
|
|
86
|
+
expires?: Date | number; // Date ou nombre de secondes
|
|
87
|
+
path?: string;
|
|
88
|
+
domain?: string;
|
|
89
|
+
secure?: boolean;
|
|
90
|
+
sameSite?: 'strict' | 'lax' | 'none';
|
|
91
|
+
}
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
### Cooks.set()
|
|
95
|
+
|
|
96
|
+
Stocke une valeur dans un cookie avec sérialisation automatique.
|
|
97
|
+
|
|
98
|
+
```typescript
|
|
99
|
+
// Stocker différents types de données
|
|
100
|
+
Cooks.set('user', { name: 'John', age: 30 });
|
|
101
|
+
Cooks.set('preferences', ['dark-mode', 'notifications']);
|
|
102
|
+
Cooks.set('visitCount', 42);
|
|
103
|
+
Cooks.set('isLoggedIn', true);
|
|
104
|
+
Cooks.set('lastVisit', new Date());
|
|
105
|
+
Cooks.set('message', 'Hello World!');
|
|
106
|
+
|
|
107
|
+
// Avec options avancées
|
|
108
|
+
Cooks.set('session', 'token123', {
|
|
109
|
+
expires: 7 * 24 * 3600, // 7 jours en secondes
|
|
110
|
+
secure: true,
|
|
111
|
+
sameSite: 'strict',
|
|
112
|
+
path: '/admin',
|
|
113
|
+
domain: 'example.com'
|
|
114
|
+
});
|
|
115
|
+
```
|
|
116
|
+
|
|
117
|
+
### Cooks.get()
|
|
118
|
+
|
|
119
|
+
Récupère et désérialise un cookie.
|
|
120
|
+
|
|
121
|
+
```typescript
|
|
122
|
+
const user = Cooks.get('user'); // { name: 'John', age: 30 }
|
|
123
|
+
const preferences = Cooks.get('preferences'); // ['dark-mode', 'notifications']
|
|
124
|
+
const visitCount = Cooks.get('visitCount'); // 42
|
|
125
|
+
const isLoggedIn = Cooks.get('isLoggedIn'); // true
|
|
126
|
+
const lastVisit = Cooks.get('lastVisit'); // Date object
|
|
127
|
+
const message = Cooks.get('message'); // 'Hello World!'
|
|
128
|
+
const notFound = Cooks.get('nonexistent'); // null
|
|
129
|
+
```
|
|
130
|
+
|
|
131
|
+
### Cooks.remove()
|
|
132
|
+
|
|
133
|
+
Supprime un cookie.
|
|
134
|
+
|
|
135
|
+
```typescript
|
|
136
|
+
Cooks.remove('session');
|
|
137
|
+
Cooks.remove('user', '/admin', 'example.com'); // avec path et domain
|
|
138
|
+
```
|
|
139
|
+
|
|
140
|
+
### Cooks.has()
|
|
141
|
+
|
|
142
|
+
Vérifie si un cookie existe.
|
|
143
|
+
|
|
144
|
+
```typescript
|
|
145
|
+
if (Cooks.has('user')) {
|
|
146
|
+
console.log('Utilisateur connecté');
|
|
147
|
+
}
|
|
148
|
+
```
|
|
149
|
+
|
|
150
|
+
### Cooks.keys()
|
|
151
|
+
|
|
152
|
+
Retourne toutes les clés de cookies disponibles.
|
|
153
|
+
|
|
154
|
+
```typescript
|
|
155
|
+
const keys = Cooks.keys(); // ['user', 'preferences', 'visitCount', ...]
|
|
156
|
+
console.log('Cookies stockés:', keys);
|
|
157
|
+
```
|
|
158
|
+
|
|
159
|
+
### Cooks.clear()
|
|
160
|
+
|
|
161
|
+
Supprime tous les cookies (à utiliser avec précaution).
|
|
162
|
+
|
|
163
|
+
```typescript
|
|
164
|
+
Cooks.clear(); // Supprime tous les cookies accessibles
|
|
165
|
+
```
|
|
166
|
+
|
|
167
|
+
## 🎯 Exemples Complets
|
|
168
|
+
|
|
169
|
+
### Exemple 1 : Gestion de Session
|
|
170
|
+
|
|
171
|
+
```typescript
|
|
172
|
+
// Connexion utilisateur
|
|
173
|
+
function login(userData: { id: number; name: string; email: string }) {
|
|
174
|
+
Cooks.set('auth_token', 'jwt_token_here', {
|
|
175
|
+
expires: 24 * 3600, // 1 jour
|
|
176
|
+
secure: true,
|
|
177
|
+
sameSite: 'strict'
|
|
178
|
+
});
|
|
179
|
+
|
|
180
|
+
Cooks.set('user', userData, {
|
|
181
|
+
expires: 7 * 24 * 3600 // 7 jours
|
|
182
|
+
});
|
|
183
|
+
|
|
184
|
+
Cooks.set('last_login', new Date());
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
// Vérification de session
|
|
188
|
+
function checkSession() {
|
|
189
|
+
if (Cooks.has('auth_token')) {
|
|
190
|
+
const user = Cooks.get('user');
|
|
191
|
+
const lastLogin = Cooks.get('last_login');
|
|
192
|
+
|
|
193
|
+
console.log('Utilisateur connecté:', user);
|
|
194
|
+
console.log('Dernière connexion:', lastLogin);
|
|
195
|
+
return true;
|
|
196
|
+
}
|
|
197
|
+
return false;
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
// Déconnexion
|
|
201
|
+
function logout() {
|
|
202
|
+
Cooks.remove('auth_token');
|
|
203
|
+
Cooks.remove('user');
|
|
204
|
+
Cooks.remove('last_login');
|
|
205
|
+
}
|
|
206
|
+
```
|
|
207
|
+
|
|
208
|
+
### Exemple 2 : Préférences Utilisateur
|
|
209
|
+
|
|
210
|
+
```typescript
|
|
211
|
+
// Sauvegarder les préférences
|
|
212
|
+
function savePreferences(prefs: {
|
|
213
|
+
theme: 'light' | 'dark';
|
|
214
|
+
language: string;
|
|
215
|
+
notifications: boolean;
|
|
216
|
+
}) {
|
|
217
|
+
Cooks.set('preferences', prefs, {
|
|
218
|
+
expires: 365 * 24 * 3600, // 1 an
|
|
219
|
+
path: '/'
|
|
220
|
+
});
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
// Charger les préférences avec valeurs par défaut
|
|
224
|
+
function loadPreferences() {
|
|
225
|
+
const defaultPrefs = {
|
|
226
|
+
theme: 'light' as const,
|
|
227
|
+
language: 'fr',
|
|
228
|
+
notifications: true
|
|
229
|
+
};
|
|
230
|
+
|
|
231
|
+
return Cooks.get('preferences') || defaultPrefs;
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
// Toggle du thème
|
|
235
|
+
function toggleTheme() {
|
|
236
|
+
const prefs = loadPreferences();
|
|
237
|
+
prefs.theme = prefs.theme === 'light' ? 'dark' : 'light';
|
|
238
|
+
savePreferences(prefs);
|
|
239
|
+
}
|
|
240
|
+
```
|
|
241
|
+
|
|
242
|
+
### Exemple 3 : Panier d'Achat
|
|
243
|
+
|
|
244
|
+
```typescript
|
|
245
|
+
interface CartItem {
|
|
246
|
+
id: number;
|
|
247
|
+
name: string;
|
|
248
|
+
price: number;
|
|
249
|
+
quantity: number;
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
class ShoppingCart {
|
|
253
|
+
private static readonly CART_KEY = 'shopping_cart';
|
|
254
|
+
|
|
255
|
+
static addItem(item: CartItem) {
|
|
256
|
+
const cart = this.getCart();
|
|
257
|
+
const existing = cart.find(i => i.id === item.id);
|
|
258
|
+
|
|
259
|
+
if (existing) {
|
|
260
|
+
existing.quantity += item.quantity;
|
|
261
|
+
} else {
|
|
262
|
+
cart.push(item);
|
|
263
|
+
}
|
|
264
|
+
|
|
265
|
+
Cooks.set(this.CART_KEY, cart, {
|
|
266
|
+
expires: 2 * 24 * 3600 // 2 jours
|
|
267
|
+
});
|
|
268
|
+
}
|
|
269
|
+
|
|
270
|
+
static removeItem(itemId: number) {
|
|
271
|
+
const cart = this.getCart().filter(item => item.id !== itemId);
|
|
272
|
+
Cooks.set(this.CART_KEY, cart);
|
|
273
|
+
}
|
|
274
|
+
|
|
275
|
+
static getCart(): CartItem[] {
|
|
276
|
+
return Cooks.get(this.CART_KEY) || [];
|
|
277
|
+
}
|
|
278
|
+
|
|
279
|
+
static clearCart() {
|
|
280
|
+
Cooks.remove(this.CART_KEY);
|
|
281
|
+
}
|
|
282
|
+
|
|
283
|
+
static getTotal(): number {
|
|
284
|
+
return this.getCart().reduce((sum, item) => sum + (item.price * item.quantity), 0);
|
|
285
|
+
}
|
|
286
|
+
}
|
|
287
|
+
|
|
288
|
+
// Utilisation
|
|
289
|
+
ShoppingCart.addItem({ id: 1, name: 'Produit A', price: 29.99, quantity: 2 });
|
|
290
|
+
console.log('Panier:', ShoppingCart.getCart());
|
|
291
|
+
console.log('Total:', ShoppingCart.getTotal());
|
|
292
|
+
```
|
|
293
|
+
|
|
294
|
+
## 🔧 Build et Développement
|
|
295
|
+
|
|
296
|
+
### Structure du Projet
|
|
297
|
+
|
|
298
|
+
```
|
|
299
|
+
@arc-js/cooks/
|
|
300
|
+
├── cooks.all.js
|
|
301
|
+
├── cooks.all.min.js
|
|
302
|
+
├── index.d.ts
|
|
303
|
+
├── index.js
|
|
304
|
+
├── index.min.d.ts
|
|
305
|
+
├── index.min.js
|
|
306
|
+
├── package.json
|
|
307
|
+
├── tsconfig.json
|
|
308
|
+
└── README.md
|
|
309
|
+
```
|
|
310
|
+
|
|
311
|
+
## 📋 Compatibilité
|
|
312
|
+
|
|
313
|
+
### Navigateurs Supportés
|
|
314
|
+
|
|
315
|
+
- Chrome 60+
|
|
316
|
+
- Firefox 55+
|
|
317
|
+
- Safari 12+
|
|
318
|
+
- Edge 79+
|
|
319
|
+
- Opera 47+
|
|
320
|
+
- Tous les navigateurs supportant les cookies et JSON
|
|
321
|
+
|
|
322
|
+
### Environnements
|
|
323
|
+
|
|
324
|
+
- Navigateurs web (principal usage)
|
|
325
|
+
- Node.js 18+ (avec jsdom pour les tests)
|
|
326
|
+
- Tous les environnements ES5+
|
|
327
|
+
|
|
328
|
+
### Dépendances
|
|
329
|
+
|
|
330
|
+
- @arc-js/timez (pour la gestion du temps)
|
|
331
|
+
|
|
332
|
+
## 🚨 Notes Importantes
|
|
333
|
+
|
|
334
|
+
### Sécurité
|
|
335
|
+
|
|
336
|
+
- **Toujours utiliser `secure: true`** en production pour les cookies sensibles
|
|
337
|
+
- **Utiliser `sameSite: 'strict'`** pour la protection CSRF
|
|
338
|
+
- **Ne jamais stocker** d'informations sensibles (mots de passe, tokens secrets) dans les cookies
|
|
339
|
+
- **Valider et assainir** toutes les données stockées et récupérées
|
|
340
|
+
|
|
341
|
+
### Limitations des Cookies
|
|
342
|
+
|
|
343
|
+
- **Taille limitée** : ~4KB par cookie
|
|
344
|
+
- **Nombre limité** : ~20-50 cookies par domaine (selon le navigateur)
|
|
345
|
+
- **Accessibilité** : Les cookies sont envoyés avec chaque requête HTTP
|
|
346
|
+
- **Performance** : Trop de cookies peuvent ralentir les requêtes
|
|
347
|
+
|
|
348
|
+
### Bonnes Pratiques
|
|
349
|
+
|
|
350
|
+
```typescript
|
|
351
|
+
// ✅ Bonnes pratiques
|
|
352
|
+
Cooks.set('user_prefs', data, {
|
|
353
|
+
expires: 30 * 24 * 3600, // 30 jours max
|
|
354
|
+
secure: window.location.protocol === 'https:',
|
|
355
|
+
sameSite: 'strict',
|
|
356
|
+
path: '/'
|
|
357
|
+
});
|
|
358
|
+
|
|
359
|
+
// ❌ À éviter
|
|
360
|
+
Cooks.set('sensitive_data', 'secret'); // Sans options de sécurité
|
|
361
|
+
Cooks.set('huge_data', largeObject); // Objet trop volumineux
|
|
362
|
+
```
|
|
363
|
+
|
|
364
|
+
## 📄 Licence
|
|
365
|
+
|
|
366
|
+
MIT License - Voir le fichier [LICENSE](LICENSE) pour plus de détails.
|
|
367
|
+
|
|
368
|
+
---
|
|
369
|
+
|
|
370
|
+
**@arc-js/cooks** - Gestion simple et sécurisée des cookies 🍪
|
|
371
|
+
|
|
372
|
+
*Développé par l'équipe INICODE*
|