@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 ADDED
@@ -0,0 +1,372 @@
1
+ # @arc-js/cooks
2
+
3
+ [![License](https://img.shields.io/badge/license-MIT-blue.svg)](LICENSE)
4
+ ![TypeScript](https://img.shields.io/badge/TypeScript-5.0+-007ACC)
5
+ ![Browser](https://img.shields.io/badge/browser-compatible-green)
6
+ ![Zero Dependencies](https://img.shields.io/badge/dependencies-0-brightgreen)
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*