@coherent.js/performance 1.0.0-beta.6 → 1.0.0-beta.7

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/dist/cache.js ADDED
@@ -0,0 +1,417 @@
1
+ // src/cache.js
2
+ var LRUCache = class {
3
+ constructor(options = {}) {
4
+ this.maxSize = options.maxSize || 100;
5
+ this.ttl = options.ttl || null;
6
+ this.cache = /* @__PURE__ */ new Map();
7
+ this.accessOrder = [];
8
+ }
9
+ /**
10
+ * Get value from cache
11
+ */
12
+ get(key) {
13
+ if (!this.cache.has(key)) {
14
+ return void 0;
15
+ }
16
+ const entry = this.cache.get(key);
17
+ if (this.ttl && Date.now() - entry.timestamp > this.ttl) {
18
+ this.delete(key);
19
+ return void 0;
20
+ }
21
+ this.updateAccessOrder(key);
22
+ return entry.value;
23
+ }
24
+ /**
25
+ * Set value in cache
26
+ */
27
+ set(key, value) {
28
+ if (this.cache.has(key)) {
29
+ this.delete(key);
30
+ }
31
+ if (this.cache.size >= this.maxSize) {
32
+ this.evict();
33
+ }
34
+ this.cache.set(key, {
35
+ value,
36
+ timestamp: Date.now()
37
+ });
38
+ this.accessOrder.push(key);
39
+ return this;
40
+ }
41
+ /**
42
+ * Check if key exists
43
+ */
44
+ has(key) {
45
+ if (!this.cache.has(key)) {
46
+ return false;
47
+ }
48
+ const entry = this.cache.get(key);
49
+ if (this.ttl && Date.now() - entry.timestamp > this.ttl) {
50
+ this.delete(key);
51
+ return false;
52
+ }
53
+ return true;
54
+ }
55
+ /**
56
+ * Delete key
57
+ */
58
+ delete(key) {
59
+ this.cache.delete(key);
60
+ const index = this.accessOrder.indexOf(key);
61
+ if (index > -1) {
62
+ this.accessOrder.splice(index, 1);
63
+ }
64
+ return this;
65
+ }
66
+ /**
67
+ * Clear cache
68
+ */
69
+ clear() {
70
+ this.cache.clear();
71
+ this.accessOrder = [];
72
+ return this;
73
+ }
74
+ /**
75
+ * Get cache size
76
+ */
77
+ size() {
78
+ return this.cache.size;
79
+ }
80
+ /**
81
+ * Update access order
82
+ */
83
+ updateAccessOrder(key) {
84
+ const index = this.accessOrder.indexOf(key);
85
+ if (index > -1) {
86
+ this.accessOrder.splice(index, 1);
87
+ }
88
+ this.accessOrder.push(key);
89
+ }
90
+ /**
91
+ * Evict least recently used
92
+ */
93
+ evict() {
94
+ if (this.accessOrder.length > 0) {
95
+ const oldest = this.accessOrder.shift();
96
+ this.cache.delete(oldest);
97
+ }
98
+ }
99
+ /**
100
+ * Get all keys
101
+ */
102
+ keys() {
103
+ return Array.from(this.cache.keys());
104
+ }
105
+ /**
106
+ * Get all values
107
+ */
108
+ values() {
109
+ return Array.from(this.cache.values()).map((entry) => entry.value);
110
+ }
111
+ /**
112
+ * Get statistics
113
+ */
114
+ getStats() {
115
+ return {
116
+ size: this.cache.size,
117
+ maxSize: this.maxSize,
118
+ utilizationPercent: (this.cache.size / this.maxSize * 100).toFixed(2),
119
+ oldestKey: this.accessOrder[0],
120
+ newestKey: this.accessOrder[this.accessOrder.length - 1]
121
+ };
122
+ }
123
+ };
124
+ var MemoryCache = class {
125
+ constructor(options = {}) {
126
+ this.options = {
127
+ strategy: "lru",
128
+ // lru, lfu, fifo
129
+ maxSize: 100,
130
+ ttl: null,
131
+ ...options
132
+ };
133
+ this.cache = /* @__PURE__ */ new Map();
134
+ this.metadata = /* @__PURE__ */ new Map();
135
+ this.hits = 0;
136
+ this.misses = 0;
137
+ }
138
+ /**
139
+ * Get from cache
140
+ */
141
+ get(key) {
142
+ if (!this.cache.has(key)) {
143
+ this.misses++;
144
+ return void 0;
145
+ }
146
+ const entry = this.cache.get(key);
147
+ if (entry.ttl && Date.now() > entry.expiresAt) {
148
+ this.delete(key);
149
+ this.misses++;
150
+ return void 0;
151
+ }
152
+ this.updateMetadata(key);
153
+ this.hits++;
154
+ return entry.value;
155
+ }
156
+ /**
157
+ * Set in cache
158
+ */
159
+ set(key, value, options = {}) {
160
+ if (this.cache.size >= this.options.maxSize && !this.cache.has(key)) {
161
+ this.evict();
162
+ }
163
+ const ttl = options.ttl || this.options.ttl;
164
+ this.cache.set(key, {
165
+ value,
166
+ ttl,
167
+ expiresAt: ttl ? Date.now() + ttl : null,
168
+ createdAt: Date.now()
169
+ });
170
+ this.metadata.set(key, {
171
+ accessCount: 0,
172
+ lastAccess: Date.now()
173
+ });
174
+ return this;
175
+ }
176
+ /**
177
+ * Update metadata based on strategy
178
+ */
179
+ updateMetadata(key) {
180
+ const meta = this.metadata.get(key);
181
+ if (meta) {
182
+ meta.accessCount++;
183
+ meta.lastAccess = Date.now();
184
+ }
185
+ }
186
+ /**
187
+ * Evict based on strategy
188
+ */
189
+ evict() {
190
+ let keyToEvict;
191
+ switch (this.options.strategy) {
192
+ case "lru":
193
+ keyToEvict = this.findLRU();
194
+ break;
195
+ case "lfu":
196
+ keyToEvict = this.findLFU();
197
+ break;
198
+ case "fifo":
199
+ keyToEvict = this.findFIFO();
200
+ break;
201
+ default:
202
+ keyToEvict = this.cache.keys().next().value;
203
+ }
204
+ if (keyToEvict) {
205
+ this.delete(keyToEvict);
206
+ }
207
+ }
208
+ /**
209
+ * Find least recently used key
210
+ */
211
+ findLRU() {
212
+ let oldest = null;
213
+ let oldestTime = Infinity;
214
+ for (const [key, meta] of this.metadata.entries()) {
215
+ if (meta.lastAccess < oldestTime) {
216
+ oldestTime = meta.lastAccess;
217
+ oldest = key;
218
+ }
219
+ }
220
+ return oldest;
221
+ }
222
+ /**
223
+ * Find least frequently used key
224
+ */
225
+ findLFU() {
226
+ let leastUsed = null;
227
+ let minCount = Infinity;
228
+ for (const [key, meta] of this.metadata.entries()) {
229
+ if (meta.accessCount < minCount) {
230
+ minCount = meta.accessCount;
231
+ leastUsed = key;
232
+ }
233
+ }
234
+ return leastUsed;
235
+ }
236
+ /**
237
+ * Find first in (oldest)
238
+ */
239
+ findFIFO() {
240
+ let oldest = null;
241
+ let oldestTime = Infinity;
242
+ for (const [key, entry] of this.cache.entries()) {
243
+ if (entry.createdAt < oldestTime) {
244
+ oldestTime = entry.createdAt;
245
+ oldest = key;
246
+ }
247
+ }
248
+ return oldest;
249
+ }
250
+ /**
251
+ * Check if key exists
252
+ */
253
+ has(key) {
254
+ return this.cache.has(key);
255
+ }
256
+ /**
257
+ * Delete key
258
+ */
259
+ delete(key) {
260
+ this.cache.delete(key);
261
+ this.metadata.delete(key);
262
+ return this;
263
+ }
264
+ /**
265
+ * Clear cache
266
+ */
267
+ clear() {
268
+ this.cache.clear();
269
+ this.metadata.clear();
270
+ this.hits = 0;
271
+ this.misses = 0;
272
+ return this;
273
+ }
274
+ /**
275
+ * Get cache statistics
276
+ */
277
+ getStats() {
278
+ const total = this.hits + this.misses;
279
+ const hitRate = total > 0 ? (this.hits / total * 100).toFixed(2) : 0;
280
+ return {
281
+ size: this.cache.size,
282
+ maxSize: this.options.maxSize,
283
+ hits: this.hits,
284
+ misses: this.misses,
285
+ hitRate: `${hitRate}%`,
286
+ strategy: this.options.strategy
287
+ };
288
+ }
289
+ };
290
+ var MemoCache = class {
291
+ constructor(options = {}) {
292
+ this.cache = new LRUCache(options);
293
+ this.keyGenerator = options.keyGenerator || this.defaultKeyGenerator;
294
+ }
295
+ /**
296
+ * Default key generator
297
+ */
298
+ defaultKeyGenerator(...args) {
299
+ return JSON.stringify(args);
300
+ }
301
+ /**
302
+ * Memoize a function
303
+ */
304
+ memoize(fn) {
305
+ return (...args) => {
306
+ const key = this.keyGenerator(...args);
307
+ if (this.cache.has(key)) {
308
+ return this.cache.get(key);
309
+ }
310
+ const result = fn(...args);
311
+ this.cache.set(key, result);
312
+ return result;
313
+ };
314
+ }
315
+ /**
316
+ * Clear memoization cache
317
+ */
318
+ clear() {
319
+ this.cache.clear();
320
+ }
321
+ /**
322
+ * Get statistics
323
+ */
324
+ getStats() {
325
+ return this.cache.getStats();
326
+ }
327
+ };
328
+ var RenderCache = class {
329
+ constructor(options = {}) {
330
+ this.cache = new MemoryCache({
331
+ maxSize: options.maxSize || 50,
332
+ ttl: options.ttl || 6e4,
333
+ // 1 minute default
334
+ strategy: "lru"
335
+ });
336
+ }
337
+ /**
338
+ * Generate cache key for component
339
+ */
340
+ generateKey(component, props) {
341
+ const componentName = component.name || "anonymous";
342
+ const propsKey = this.hashProps(props);
343
+ return `${componentName}:${propsKey}`;
344
+ }
345
+ /**
346
+ * Hash props for cache key
347
+ */
348
+ hashProps(props) {
349
+ try {
350
+ return JSON.stringify(props, Object.keys(props).sort());
351
+ } catch {
352
+ return String(Date.now());
353
+ }
354
+ }
355
+ /**
356
+ * Get cached render
357
+ */
358
+ get(component, props) {
359
+ const key = this.generateKey(component, props);
360
+ return this.cache.get(key);
361
+ }
362
+ /**
363
+ * Cache render result
364
+ */
365
+ set(component, props, result, options = {}) {
366
+ const key = this.generateKey(component, props);
367
+ this.cache.set(key, result, options);
368
+ }
369
+ /**
370
+ * Clear cache
371
+ */
372
+ clear() {
373
+ this.cache.clear();
374
+ }
375
+ /**
376
+ * Get statistics
377
+ */
378
+ getStats() {
379
+ return this.cache.getStats();
380
+ }
381
+ };
382
+ function createCache(type = "lru", options = {}) {
383
+ switch (type) {
384
+ case "lru":
385
+ return new LRUCache(options);
386
+ case "memory":
387
+ return new MemoryCache(options);
388
+ case "memo":
389
+ return new MemoCache(options);
390
+ case "render":
391
+ return new RenderCache(options);
392
+ default:
393
+ return new LRUCache(options);
394
+ }
395
+ }
396
+ function memoize(fn, options = {}) {
397
+ const cache = new MemoCache(options);
398
+ return cache.memoize(fn);
399
+ }
400
+ var cache_default = {
401
+ LRUCache,
402
+ MemoryCache,
403
+ MemoCache,
404
+ RenderCache,
405
+ createCache,
406
+ memoize
407
+ };
408
+ export {
409
+ LRUCache,
410
+ MemoCache,
411
+ MemoryCache,
412
+ RenderCache,
413
+ createCache,
414
+ cache_default as default,
415
+ memoize
416
+ };
417
+ //# sourceMappingURL=cache.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/cache.js"],
4
+ "sourcesContent": ["/**\n * Coherent.js Advanced Caching\n * \n * Smart caching strategies for performance optimization\n * \n * @module performance/cache\n */\n\n/**\n * LRU Cache\n * Least Recently Used cache implementation\n */\nexport class LRUCache {\n constructor(options = {}) {\n this.maxSize = options.maxSize || 100;\n this.ttl = options.ttl || null; // Time to live in ms\n this.cache = new Map();\n this.accessOrder = [];\n }\n\n /**\n * Get value from cache\n */\n get(key) {\n if (!this.cache.has(key)) {\n return undefined;\n }\n\n const entry = this.cache.get(key);\n\n // Check TTL\n if (this.ttl && Date.now() - entry.timestamp > this.ttl) {\n this.delete(key);\n return undefined;\n }\n\n // Update access order\n this.updateAccessOrder(key);\n\n return entry.value;\n }\n\n /**\n * Set value in cache\n */\n set(key, value) {\n // Remove if exists\n if (this.cache.has(key)) {\n this.delete(key);\n }\n\n // Evict if at capacity\n if (this.cache.size >= this.maxSize) {\n this.evict();\n }\n\n // Add new entry\n this.cache.set(key, {\n value,\n timestamp: Date.now()\n });\n\n this.accessOrder.push(key);\n\n return this;\n }\n\n /**\n * Check if key exists\n */\n has(key) {\n if (!this.cache.has(key)) {\n return false;\n }\n\n const entry = this.cache.get(key);\n\n // Check TTL\n if (this.ttl && Date.now() - entry.timestamp > this.ttl) {\n this.delete(key);\n return false;\n }\n\n return true;\n }\n\n /**\n * Delete key\n */\n delete(key) {\n this.cache.delete(key);\n const index = this.accessOrder.indexOf(key);\n if (index > -1) {\n this.accessOrder.splice(index, 1);\n }\n return this;\n }\n\n /**\n * Clear cache\n */\n clear() {\n this.cache.clear();\n this.accessOrder = [];\n return this;\n }\n\n /**\n * Get cache size\n */\n size() {\n return this.cache.size;\n }\n\n /**\n * Update access order\n */\n updateAccessOrder(key) {\n const index = this.accessOrder.indexOf(key);\n if (index > -1) {\n this.accessOrder.splice(index, 1);\n }\n this.accessOrder.push(key);\n }\n\n /**\n * Evict least recently used\n */\n evict() {\n if (this.accessOrder.length > 0) {\n const oldest = this.accessOrder.shift();\n this.cache.delete(oldest);\n }\n }\n\n /**\n * Get all keys\n */\n keys() {\n return Array.from(this.cache.keys());\n }\n\n /**\n * Get all values\n */\n values() {\n return Array.from(this.cache.values()).map(entry => entry.value);\n }\n\n /**\n * Get statistics\n */\n getStats() {\n return {\n size: this.cache.size,\n maxSize: this.maxSize,\n utilizationPercent: (this.cache.size / this.maxSize * 100).toFixed(2),\n oldestKey: this.accessOrder[0],\n newestKey: this.accessOrder[this.accessOrder.length - 1]\n };\n }\n}\n\n/**\n * Memory Cache with strategies\n */\nexport class MemoryCache {\n constructor(options = {}) {\n this.options = {\n strategy: 'lru', // lru, lfu, fifo\n maxSize: 100,\n ttl: null,\n ...options\n };\n\n this.cache = new Map();\n this.metadata = new Map();\n this.hits = 0;\n this.misses = 0;\n }\n\n /**\n * Get from cache\n */\n get(key) {\n if (!this.cache.has(key)) {\n this.misses++;\n return undefined;\n }\n\n const entry = this.cache.get(key);\n\n // Check TTL\n if (entry.ttl && Date.now() > entry.expiresAt) {\n this.delete(key);\n this.misses++;\n return undefined;\n }\n\n // Update metadata\n this.updateMetadata(key);\n this.hits++;\n\n return entry.value;\n }\n\n /**\n * Set in cache\n */\n set(key, value, options = {}) {\n // Evict if needed\n if (this.cache.size >= this.options.maxSize && !this.cache.has(key)) {\n this.evict();\n }\n\n const ttl = options.ttl || this.options.ttl;\n\n this.cache.set(key, {\n value,\n ttl,\n expiresAt: ttl ? Date.now() + ttl : null,\n createdAt: Date.now()\n });\n\n this.metadata.set(key, {\n accessCount: 0,\n lastAccess: Date.now()\n });\n\n return this;\n }\n\n /**\n * Update metadata based on strategy\n */\n updateMetadata(key) {\n const meta = this.metadata.get(key);\n if (meta) {\n meta.accessCount++;\n meta.lastAccess = Date.now();\n }\n }\n\n /**\n * Evict based on strategy\n */\n evict() {\n let keyToEvict;\n\n switch (this.options.strategy) {\n case 'lru': // Least Recently Used\n keyToEvict = this.findLRU();\n break;\n case 'lfu': // Least Frequently Used\n keyToEvict = this.findLFU();\n break;\n case 'fifo': // First In First Out\n keyToEvict = this.findFIFO();\n break;\n default:\n keyToEvict = this.cache.keys().next().value;\n }\n\n if (keyToEvict) {\n this.delete(keyToEvict);\n }\n }\n\n /**\n * Find least recently used key\n */\n findLRU() {\n let oldest = null;\n let oldestTime = Infinity;\n\n for (const [key, meta] of this.metadata.entries()) {\n if (meta.lastAccess < oldestTime) {\n oldestTime = meta.lastAccess;\n oldest = key;\n }\n }\n\n return oldest;\n }\n\n /**\n * Find least frequently used key\n */\n findLFU() {\n let leastUsed = null;\n let minCount = Infinity;\n\n for (const [key, meta] of this.metadata.entries()) {\n if (meta.accessCount < minCount) {\n minCount = meta.accessCount;\n leastUsed = key;\n }\n }\n\n return leastUsed;\n }\n\n /**\n * Find first in (oldest)\n */\n findFIFO() {\n let oldest = null;\n let oldestTime = Infinity;\n\n for (const [key, entry] of this.cache.entries()) {\n if (entry.createdAt < oldestTime) {\n oldestTime = entry.createdAt;\n oldest = key;\n }\n }\n\n return oldest;\n }\n\n /**\n * Check if key exists\n */\n has(key) {\n return this.cache.has(key);\n }\n\n /**\n * Delete key\n */\n delete(key) {\n this.cache.delete(key);\n this.metadata.delete(key);\n return this;\n }\n\n /**\n * Clear cache\n */\n clear() {\n this.cache.clear();\n this.metadata.clear();\n this.hits = 0;\n this.misses = 0;\n return this;\n }\n\n /**\n * Get cache statistics\n */\n getStats() {\n const total = this.hits + this.misses;\n const hitRate = total > 0 ? (this.hits / total * 100).toFixed(2) : 0;\n\n return {\n size: this.cache.size,\n maxSize: this.options.maxSize,\n hits: this.hits,\n misses: this.misses,\n hitRate: `${hitRate}%`,\n strategy: this.options.strategy\n };\n }\n}\n\n/**\n * Memoization cache\n */\nexport class MemoCache {\n constructor(options = {}) {\n this.cache = new LRUCache(options);\n this.keyGenerator = options.keyGenerator || this.defaultKeyGenerator;\n }\n\n /**\n * Default key generator\n */\n defaultKeyGenerator(...args) {\n return JSON.stringify(args);\n }\n\n /**\n * Memoize a function\n */\n memoize(fn) {\n return (...args) => {\n const key = this.keyGenerator(...args);\n \n if (this.cache.has(key)) {\n return this.cache.get(key);\n }\n\n const result = fn(...args);\n this.cache.set(key, result);\n \n return result;\n };\n }\n\n /**\n * Clear memoization cache\n */\n clear() {\n this.cache.clear();\n }\n\n /**\n * Get statistics\n */\n getStats() {\n return this.cache.getStats();\n }\n}\n\n/**\n * Component render cache\n */\nexport class RenderCache {\n constructor(options = {}) {\n this.cache = new MemoryCache({\n maxSize: options.maxSize || 50,\n ttl: options.ttl || 60000, // 1 minute default\n strategy: 'lru'\n });\n }\n\n /**\n * Generate cache key for component\n */\n generateKey(component, props) {\n const componentName = component.name || 'anonymous';\n const propsKey = this.hashProps(props);\n return `${componentName}:${propsKey}`;\n }\n\n /**\n * Hash props for cache key\n */\n hashProps(props) {\n try {\n return JSON.stringify(props, Object.keys(props).sort());\n } catch {\n return String(Date.now());\n }\n }\n\n /**\n * Get cached render\n */\n get(component, props) {\n const key = this.generateKey(component, props);\n return this.cache.get(key);\n }\n\n /**\n * Cache render result\n */\n set(component, props, result, options = {}) {\n const key = this.generateKey(component, props);\n this.cache.set(key, result, options);\n }\n\n /**\n * Clear cache\n */\n clear() {\n this.cache.clear();\n }\n\n /**\n * Get statistics\n */\n getStats() {\n return this.cache.getStats();\n }\n}\n\n/**\n * Create a cache instance\n */\nexport function createCache(type = 'lru', options = {}) {\n switch (type) {\n case 'lru':\n return new LRUCache(options);\n case 'memory':\n return new MemoryCache(options);\n case 'memo':\n return new MemoCache(options);\n case 'render':\n return new RenderCache(options);\n default:\n return new LRUCache(options);\n }\n}\n\n/**\n * Memoize a function\n */\nexport function memoize(fn, options = {}) {\n const cache = new MemoCache(options);\n return cache.memoize(fn);\n}\n\nexport default {\n LRUCache,\n MemoryCache,\n MemoCache,\n RenderCache,\n createCache,\n memoize\n};\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }
@@ -0,0 +1,313 @@
1
+ // src/code-splitting.js
2
+ var CodeSplitter = class {
3
+ constructor(options = {}) {
4
+ this.options = {
5
+ preload: [],
6
+ prefetch: [],
7
+ timeout: 1e4,
8
+ retries: 3,
9
+ ...options
10
+ };
11
+ this.modules = /* @__PURE__ */ new Map();
12
+ this.loading = /* @__PURE__ */ new Map();
13
+ this.failed = /* @__PURE__ */ new Set();
14
+ }
15
+ /**
16
+ * Dynamically import a module
17
+ *
18
+ * @param {string} path - Module path
19
+ * @param {Object} [options] - Import options
20
+ * @returns {Promise} Module exports
21
+ */
22
+ async import(path, options = {}) {
23
+ if (this.modules.has(path)) {
24
+ return this.modules.get(path);
25
+ }
26
+ if (this.loading.has(path)) {
27
+ return this.loading.get(path);
28
+ }
29
+ const importPromise = this.loadModule(path, options);
30
+ this.loading.set(path, importPromise);
31
+ try {
32
+ const module = await importPromise;
33
+ this.modules.set(path, module);
34
+ this.loading.delete(path);
35
+ return module;
36
+ } catch (error) {
37
+ this.loading.delete(path);
38
+ this.failed.add(path);
39
+ throw error;
40
+ }
41
+ }
42
+ /**
43
+ * Load module with retries
44
+ */
45
+ async loadModule(path, options = {}) {
46
+ const maxRetries = options.retries ?? this.options.retries;
47
+ const timeout = options.timeout ?? this.options.timeout;
48
+ let lastError;
49
+ for (let attempt = 0; attempt <= maxRetries; attempt++) {
50
+ try {
51
+ const importPath = attempt > 0 ? `${path}?retry=${attempt}&t=${Date.now()}` : path;
52
+ const module = await Promise.race([
53
+ import(importPath),
54
+ new Promise(
55
+ (_, reject) => setTimeout(() => reject(new Error("Import timeout")), timeout)
56
+ )
57
+ ]);
58
+ return module;
59
+ } catch (error) {
60
+ lastError = error;
61
+ if (attempt < maxRetries) {
62
+ await new Promise(
63
+ (resolve) => setTimeout(resolve, Math.pow(2, attempt) * 1e3)
64
+ );
65
+ }
66
+ }
67
+ }
68
+ throw new Error(`Failed to load module ${path}: ${lastError.message}`);
69
+ }
70
+ /**
71
+ * Preload modules
72
+ */
73
+ async preload(paths) {
74
+ const pathArray = Array.isArray(paths) ? paths : [paths];
75
+ return Promise.all(
76
+ pathArray.map((path) => this.import(path).catch((err) => {
77
+ console.warn(`Failed to preload ${path}:`, err);
78
+ return null;
79
+ }))
80
+ );
81
+ }
82
+ /**
83
+ * Prefetch modules (low priority)
84
+ */
85
+ prefetch(paths) {
86
+ const pathArray = Array.isArray(paths) ? paths : [paths];
87
+ if (typeof requestIdleCallback !== "undefined") {
88
+ requestIdleCallback(() => {
89
+ pathArray.forEach((path) => {
90
+ this.import(path).catch(() => {
91
+ });
92
+ });
93
+ });
94
+ } else {
95
+ setTimeout(() => {
96
+ pathArray.forEach((path) => {
97
+ this.import(path).catch(() => {
98
+ });
99
+ });
100
+ }, 0);
101
+ }
102
+ }
103
+ /**
104
+ * Check if module is loaded
105
+ */
106
+ isLoaded(path) {
107
+ return this.modules.has(path);
108
+ }
109
+ /**
110
+ * Check if module is loading
111
+ */
112
+ isLoading(path) {
113
+ return this.loading.has(path);
114
+ }
115
+ /**
116
+ * Check if module failed to load
117
+ */
118
+ hasFailed(path) {
119
+ return this.failed.has(path);
120
+ }
121
+ /**
122
+ * Clear cache
123
+ */
124
+ clearCache(path = null) {
125
+ if (path) {
126
+ this.modules.delete(path);
127
+ this.failed.delete(path);
128
+ } else {
129
+ this.modules.clear();
130
+ this.failed.clear();
131
+ }
132
+ }
133
+ /**
134
+ * Get statistics
135
+ */
136
+ getStats() {
137
+ return {
138
+ loaded: this.modules.size,
139
+ loading: this.loading.size,
140
+ failed: this.failed.size,
141
+ modules: Array.from(this.modules.keys())
142
+ };
143
+ }
144
+ };
145
+ function createCodeSplitter(options = {}) {
146
+ return new CodeSplitter(options);
147
+ }
148
+ function lazy(loader, options = {}) {
149
+ let modulePromise = null;
150
+ let module = null;
151
+ let error = null;
152
+ return function LazyComponent(props = {}) {
153
+ if (module) {
154
+ const Component = module.default || module;
155
+ return Component(props);
156
+ }
157
+ if (error) {
158
+ if (options.errorComponent) {
159
+ return options.errorComponent({ error, retry: () => {
160
+ error = null;
161
+ modulePromise = null;
162
+ return LazyComponent(props);
163
+ } });
164
+ }
165
+ return {
166
+ div: {
167
+ className: "lazy-error",
168
+ text: `Error loading component: ${error.message}`
169
+ }
170
+ };
171
+ }
172
+ if (!modulePromise) {
173
+ modulePromise = loader().then((mod) => {
174
+ module = mod;
175
+ return mod;
176
+ }).catch((err) => {
177
+ error = err;
178
+ throw err;
179
+ });
180
+ }
181
+ if (options.loadingComponent) {
182
+ return options.loadingComponent(props);
183
+ }
184
+ return {
185
+ div: {
186
+ className: "lazy-loading",
187
+ text: options.loadingText || "Loading..."
188
+ }
189
+ };
190
+ };
191
+ }
192
+ function splitComponent(componentPath, options = {}) {
193
+ const splitter = new CodeSplitter(options);
194
+ return lazy(
195
+ () => splitter.import(componentPath),
196
+ options
197
+ );
198
+ }
199
+ function createRouteSplitter(routes) {
200
+ const splitter = new CodeSplitter();
201
+ const routeMap = /* @__PURE__ */ new Map();
202
+ for (const [path, config] of Object.entries(routes)) {
203
+ if (typeof config === "string") {
204
+ routeMap.set(path, {
205
+ loader: () => splitter.import(config)
206
+ });
207
+ } else {
208
+ routeMap.set(path, {
209
+ loader: () => splitter.import(config.component),
210
+ preload: config.preload || [],
211
+ ...config
212
+ });
213
+ }
214
+ }
215
+ return {
216
+ /**
217
+ * Load route component
218
+ */
219
+ async loadRoute(path) {
220
+ const route = routeMap.get(path);
221
+ if (!route) {
222
+ throw new Error(`Route not found: ${path}`);
223
+ }
224
+ if (route.preload && route.preload.length > 0) {
225
+ splitter.prefetch(route.preload);
226
+ }
227
+ return await route.loader();
228
+ },
229
+ /**
230
+ * Preload route
231
+ */
232
+ preloadRoute(path) {
233
+ const route = routeMap.get(path);
234
+ if (route) {
235
+ return route.loader();
236
+ }
237
+ },
238
+ /**
239
+ * Get all routes
240
+ */
241
+ getRoutes() {
242
+ return Array.from(routeMap.keys());
243
+ },
244
+ /**
245
+ * Get splitter instance
246
+ */
247
+ getSplitter() {
248
+ return splitter;
249
+ }
250
+ };
251
+ }
252
+ var BundleAnalyzer = class {
253
+ constructor() {
254
+ this.chunks = /* @__PURE__ */ new Map();
255
+ this.loadTimes = /* @__PURE__ */ new Map();
256
+ }
257
+ /**
258
+ * Track chunk load
259
+ */
260
+ trackLoad(chunkName, size, loadTime) {
261
+ this.chunks.set(chunkName, { size, loadTime });
262
+ this.loadTimes.set(chunkName, loadTime);
263
+ }
264
+ /**
265
+ * Get bundle statistics
266
+ */
267
+ getStats() {
268
+ const chunks = Array.from(this.chunks.entries());
269
+ const totalSize = chunks.reduce((sum, [, chunk]) => sum + chunk.size, 0);
270
+ const avgLoadTime = chunks.reduce((sum, [, chunk]) => sum + chunk.loadTime, 0) / chunks.length;
271
+ return {
272
+ totalChunks: chunks.length,
273
+ totalSize,
274
+ averageLoadTime: avgLoadTime,
275
+ chunks: chunks.map(([name, data]) => ({
276
+ name,
277
+ size: data.size,
278
+ loadTime: data.loadTime,
279
+ percentage: (data.size / totalSize * 100).toFixed(2)
280
+ }))
281
+ };
282
+ }
283
+ /**
284
+ * Find largest chunks
285
+ */
286
+ getLargestChunks(limit = 10) {
287
+ return Array.from(this.chunks.entries()).sort((a, b) => b[1].size - a[1].size).slice(0, limit).map(([name, data]) => ({ name, ...data }));
288
+ }
289
+ /**
290
+ * Find slowest chunks
291
+ */
292
+ getSlowestChunks(limit = 10) {
293
+ return Array.from(this.chunks.entries()).sort((a, b) => b[1].loadTime - a[1].loadTime).slice(0, limit).map(([name, data]) => ({ name, ...data }));
294
+ }
295
+ };
296
+ var code_splitting_default = {
297
+ CodeSplitter,
298
+ createCodeSplitter,
299
+ lazy,
300
+ splitComponent,
301
+ createRouteSplitter,
302
+ BundleAnalyzer
303
+ };
304
+ export {
305
+ BundleAnalyzer,
306
+ CodeSplitter,
307
+ createCodeSplitter,
308
+ createRouteSplitter,
309
+ code_splitting_default as default,
310
+ lazy,
311
+ splitComponent
312
+ };
313
+ //# sourceMappingURL=code-splitting.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/code-splitting.js"],
4
+ "sourcesContent": ["/**\n * Coherent.js Code Splitting\n * \n * Dynamic imports and code splitting utilities\n * \n * @module performance/code-splitting\n */\n\n/**\n * Code Splitter\n * Manages dynamic imports and lazy loading\n */\nexport class CodeSplitter {\n constructor(options = {}) {\n this.options = {\n preload: [],\n prefetch: [],\n timeout: 10000,\n retries: 3,\n ...options\n };\n \n this.modules = new Map();\n this.loading = new Map();\n this.failed = new Set();\n }\n\n /**\n * Dynamically import a module\n * \n * @param {string} path - Module path\n * @param {Object} [options] - Import options\n * @returns {Promise} Module exports\n */\n async import(path, options = {}) {\n // Check cache\n if (this.modules.has(path)) {\n return this.modules.get(path);\n }\n\n // Check if already loading\n if (this.loading.has(path)) {\n return this.loading.get(path);\n }\n\n // Create import promise\n const importPromise = this.loadModule(path, options);\n this.loading.set(path, importPromise);\n\n try {\n const module = await importPromise;\n this.modules.set(path, module);\n this.loading.delete(path);\n return module;\n } catch (error) {\n this.loading.delete(path);\n this.failed.add(path);\n throw error;\n }\n }\n\n /**\n * Load module with retries\n */\n async loadModule(path, options = {}) {\n const maxRetries = options.retries ?? this.options.retries;\n const timeout = options.timeout ?? this.options.timeout;\n \n let lastError;\n \n for (let attempt = 0; attempt <= maxRetries; attempt++) {\n try {\n // Add cache busting if retry\n const importPath = attempt > 0 \n ? `${path}?retry=${attempt}&t=${Date.now()}`\n : path;\n\n // Import with timeout\n const module = await Promise.race([\n import(importPath),\n new Promise((_, reject) => \n setTimeout(() => reject(new Error('Import timeout')), timeout)\n )\n ]);\n\n return module;\n } catch (error) {\n lastError = error;\n \n if (attempt < maxRetries) {\n // Exponential backoff\n await new Promise(resolve => \n setTimeout(resolve, Math.pow(2, attempt) * 1000)\n );\n }\n }\n }\n\n throw new Error(`Failed to load module ${path}: ${lastError.message}`);\n }\n\n /**\n * Preload modules\n */\n async preload(paths) {\n const pathArray = Array.isArray(paths) ? paths : [paths];\n \n return Promise.all(\n pathArray.map(path => this.import(path).catch(err => {\n console.warn(`Failed to preload ${path}:`, err);\n return null;\n }))\n );\n }\n\n /**\n * Prefetch modules (low priority)\n */\n prefetch(paths) {\n const pathArray = Array.isArray(paths) ? paths : [paths];\n \n if (typeof requestIdleCallback !== 'undefined') {\n requestIdleCallback(() => {\n pathArray.forEach(path => {\n this.import(path).catch(() => {});\n });\n });\n } else {\n setTimeout(() => {\n pathArray.forEach(path => {\n this.import(path).catch(() => {});\n });\n }, 0);\n }\n }\n\n /**\n * Check if module is loaded\n */\n isLoaded(path) {\n return this.modules.has(path);\n }\n\n /**\n * Check if module is loading\n */\n isLoading(path) {\n return this.loading.has(path);\n }\n\n /**\n * Check if module failed to load\n */\n hasFailed(path) {\n return this.failed.has(path);\n }\n\n /**\n * Clear cache\n */\n clearCache(path = null) {\n if (path) {\n this.modules.delete(path);\n this.failed.delete(path);\n } else {\n this.modules.clear();\n this.failed.clear();\n }\n }\n\n /**\n * Get statistics\n */\n getStats() {\n return {\n loaded: this.modules.size,\n loading: this.loading.size,\n failed: this.failed.size,\n modules: Array.from(this.modules.keys())\n };\n }\n}\n\n/**\n * Create a code splitter\n */\nexport function createCodeSplitter(options = {}) {\n return new CodeSplitter(options);\n}\n\n/**\n * Lazy load a component\n * \n * @param {Function} loader - Function that returns import promise\n * @param {Object} [options] - Lazy loading options\n * @returns {Function} Lazy component\n */\nexport function lazy(loader, options = {}) {\n let modulePromise = null;\n let module = null;\n let error = null;\n\n return function LazyComponent(props = {}) {\n // If already loaded, return component\n if (module) {\n const Component = module.default || module;\n return Component(props);\n }\n\n // If error occurred, show error\n if (error) {\n if (options.errorComponent) {\n return options.errorComponent({ error, retry: () => {\n error = null;\n modulePromise = null;\n return LazyComponent(props);\n }});\n }\n return {\n div: {\n className: 'lazy-error',\n text: `Error loading component: ${error.message}`\n }\n };\n }\n\n // Start loading if not already\n if (!modulePromise) {\n modulePromise = loader()\n .then(mod => {\n module = mod;\n return mod;\n })\n .catch(err => {\n error = err;\n throw err;\n });\n }\n\n // Show loading state\n if (options.loadingComponent) {\n return options.loadingComponent(props);\n }\n\n return {\n div: {\n className: 'lazy-loading',\n text: options.loadingText || 'Loading...'\n }\n };\n };\n}\n\n/**\n * Split component into chunks\n */\nexport function splitComponent(componentPath, options = {}) {\n const splitter = new CodeSplitter(options);\n \n return lazy(\n () => splitter.import(componentPath),\n options\n );\n}\n\n/**\n * Create route-based code splitting\n */\nexport function createRouteSplitter(routes) {\n const splitter = new CodeSplitter();\n const routeMap = new Map();\n\n // Process routes\n for (const [path, config] of Object.entries(routes)) {\n if (typeof config === 'string') {\n // Simple path to component\n routeMap.set(path, {\n loader: () => splitter.import(config)\n });\n } else {\n // Full config\n routeMap.set(path, {\n loader: () => splitter.import(config.component),\n preload: config.preload || [],\n ...config\n });\n }\n }\n\n return {\n /**\n * Load route component\n */\n async loadRoute(path) {\n const route = routeMap.get(path);\n if (!route) {\n throw new Error(`Route not found: ${path}`);\n }\n\n // Preload dependencies\n if (route.preload && route.preload.length > 0) {\n splitter.prefetch(route.preload);\n }\n\n // Load main component\n return await route.loader();\n },\n\n /**\n * Preload route\n */\n preloadRoute(path) {\n const route = routeMap.get(path);\n if (route) {\n return route.loader();\n }\n },\n\n /**\n * Get all routes\n */\n getRoutes() {\n return Array.from(routeMap.keys());\n },\n\n /**\n * Get splitter instance\n */\n getSplitter() {\n return splitter;\n }\n };\n}\n\n/**\n * Bundle analyzer helper\n */\nexport class BundleAnalyzer {\n constructor() {\n this.chunks = new Map();\n this.loadTimes = new Map();\n }\n\n /**\n * Track chunk load\n */\n trackLoad(chunkName, size, loadTime) {\n this.chunks.set(chunkName, { size, loadTime });\n this.loadTimes.set(chunkName, loadTime);\n }\n\n /**\n * Get bundle statistics\n */\n getStats() {\n const chunks = Array.from(this.chunks.entries());\n const totalSize = chunks.reduce((sum, [, chunk]) => sum + chunk.size, 0);\n const avgLoadTime = chunks.reduce((sum, [, chunk]) => sum + chunk.loadTime, 0) / chunks.length;\n\n return {\n totalChunks: chunks.length,\n totalSize,\n averageLoadTime: avgLoadTime,\n chunks: chunks.map(([name, data]) => ({\n name,\n size: data.size,\n loadTime: data.loadTime,\n percentage: (data.size / totalSize * 100).toFixed(2)\n }))\n };\n }\n\n /**\n * Find largest chunks\n */\n getLargestChunks(limit = 10) {\n return Array.from(this.chunks.entries())\n .sort((a, b) => b[1].size - a[1].size)\n .slice(0, limit)\n .map(([name, data]) => ({ name, ...data }));\n }\n\n /**\n * Find slowest chunks\n */\n getSlowestChunks(limit = 10) {\n return Array.from(this.chunks.entries())\n .sort((a, b) => b[1].loadTime - a[1].loadTime)\n .slice(0, limit)\n .map(([name, data]) => ({ name, ...data }));\n }\n}\n\nexport default {\n CodeSplitter,\n createCodeSplitter,\n lazy,\n splitComponent,\n createRouteSplitter,\n BundleAnalyzer\n};\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/code-splitting.js", "../src/cache.js", "../src/lazy-loading.js"],
4
+ "sourcesContent": ["/**\n * Coherent.js Code Splitting\n * \n * Dynamic imports and code splitting utilities\n * \n * @module performance/code-splitting\n */\n\n/**\n * Code Splitter\n * Manages dynamic imports and lazy loading\n */\nexport class CodeSplitter {\n constructor(options = {}) {\n this.options = {\n preload: [],\n prefetch: [],\n timeout: 10000,\n retries: 3,\n ...options\n };\n \n this.modules = new Map();\n this.loading = new Map();\n this.failed = new Set();\n }\n\n /**\n * Dynamically import a module\n * \n * @param {string} path - Module path\n * @param {Object} [options] - Import options\n * @returns {Promise} Module exports\n */\n async import(path, options = {}) {\n // Check cache\n if (this.modules.has(path)) {\n return this.modules.get(path);\n }\n\n // Check if already loading\n if (this.loading.has(path)) {\n return this.loading.get(path);\n }\n\n // Create import promise\n const importPromise = this.loadModule(path, options);\n this.loading.set(path, importPromise);\n\n try {\n const module = await importPromise;\n this.modules.set(path, module);\n this.loading.delete(path);\n return module;\n } catch (error) {\n this.loading.delete(path);\n this.failed.add(path);\n throw error;\n }\n }\n\n /**\n * Load module with retries\n */\n async loadModule(path, options = {}) {\n const maxRetries = options.retries ?? this.options.retries;\n const timeout = options.timeout ?? this.options.timeout;\n \n let lastError;\n \n for (let attempt = 0; attempt <= maxRetries; attempt++) {\n try {\n // Add cache busting if retry\n const importPath = attempt > 0 \n ? `${path}?retry=${attempt}&t=${Date.now()}`\n : path;\n\n // Import with timeout\n const module = await Promise.race([\n import(importPath),\n new Promise((_, reject) => \n setTimeout(() => reject(new Error('Import timeout')), timeout)\n )\n ]);\n\n return module;\n } catch (error) {\n lastError = error;\n \n if (attempt < maxRetries) {\n // Exponential backoff\n await new Promise(resolve => \n setTimeout(resolve, Math.pow(2, attempt) * 1000)\n );\n }\n }\n }\n\n throw new Error(`Failed to load module ${path}: ${lastError.message}`);\n }\n\n /**\n * Preload modules\n */\n async preload(paths) {\n const pathArray = Array.isArray(paths) ? paths : [paths];\n \n return Promise.all(\n pathArray.map(path => this.import(path).catch(err => {\n console.warn(`Failed to preload ${path}:`, err);\n return null;\n }))\n );\n }\n\n /**\n * Prefetch modules (low priority)\n */\n prefetch(paths) {\n const pathArray = Array.isArray(paths) ? paths : [paths];\n \n if (typeof requestIdleCallback !== 'undefined') {\n requestIdleCallback(() => {\n pathArray.forEach(path => {\n this.import(path).catch(() => {});\n });\n });\n } else {\n setTimeout(() => {\n pathArray.forEach(path => {\n this.import(path).catch(() => {});\n });\n }, 0);\n }\n }\n\n /**\n * Check if module is loaded\n */\n isLoaded(path) {\n return this.modules.has(path);\n }\n\n /**\n * Check if module is loading\n */\n isLoading(path) {\n return this.loading.has(path);\n }\n\n /**\n * Check if module failed to load\n */\n hasFailed(path) {\n return this.failed.has(path);\n }\n\n /**\n * Clear cache\n */\n clearCache(path = null) {\n if (path) {\n this.modules.delete(path);\n this.failed.delete(path);\n } else {\n this.modules.clear();\n this.failed.clear();\n }\n }\n\n /**\n * Get statistics\n */\n getStats() {\n return {\n loaded: this.modules.size,\n loading: this.loading.size,\n failed: this.failed.size,\n modules: Array.from(this.modules.keys())\n };\n }\n}\n\n/**\n * Create a code splitter\n */\nexport function createCodeSplitter(options = {}) {\n return new CodeSplitter(options);\n}\n\n/**\n * Lazy load a component\n * \n * @param {Function} loader - Function that returns import promise\n * @param {Object} [options] - Lazy loading options\n * @returns {Function} Lazy component\n */\nexport function lazy(loader, options = {}) {\n let modulePromise = null;\n let module = null;\n let error = null;\n\n return function LazyComponent(props = {}) {\n // If already loaded, return component\n if (module) {\n const Component = module.default || module;\n return Component(props);\n }\n\n // If error occurred, show error\n if (error) {\n if (options.errorComponent) {\n return options.errorComponent({ error, retry: () => {\n error = null;\n modulePromise = null;\n return LazyComponent(props);\n }});\n }\n return {\n div: {\n className: 'lazy-error',\n text: `Error loading component: ${error.message}`\n }\n };\n }\n\n // Start loading if not already\n if (!modulePromise) {\n modulePromise = loader()\n .then(mod => {\n module = mod;\n return mod;\n })\n .catch(err => {\n error = err;\n throw err;\n });\n }\n\n // Show loading state\n if (options.loadingComponent) {\n return options.loadingComponent(props);\n }\n\n return {\n div: {\n className: 'lazy-loading',\n text: options.loadingText || 'Loading...'\n }\n };\n };\n}\n\n/**\n * Split component into chunks\n */\nexport function splitComponent(componentPath, options = {}) {\n const splitter = new CodeSplitter(options);\n \n return lazy(\n () => splitter.import(componentPath),\n options\n );\n}\n\n/**\n * Create route-based code splitting\n */\nexport function createRouteSplitter(routes) {\n const splitter = new CodeSplitter();\n const routeMap = new Map();\n\n // Process routes\n for (const [path, config] of Object.entries(routes)) {\n if (typeof config === 'string') {\n // Simple path to component\n routeMap.set(path, {\n loader: () => splitter.import(config)\n });\n } else {\n // Full config\n routeMap.set(path, {\n loader: () => splitter.import(config.component),\n preload: config.preload || [],\n ...config\n });\n }\n }\n\n return {\n /**\n * Load route component\n */\n async loadRoute(path) {\n const route = routeMap.get(path);\n if (!route) {\n throw new Error(`Route not found: ${path}`);\n }\n\n // Preload dependencies\n if (route.preload && route.preload.length > 0) {\n splitter.prefetch(route.preload);\n }\n\n // Load main component\n return await route.loader();\n },\n\n /**\n * Preload route\n */\n preloadRoute(path) {\n const route = routeMap.get(path);\n if (route) {\n return route.loader();\n }\n },\n\n /**\n * Get all routes\n */\n getRoutes() {\n return Array.from(routeMap.keys());\n },\n\n /**\n * Get splitter instance\n */\n getSplitter() {\n return splitter;\n }\n };\n}\n\n/**\n * Bundle analyzer helper\n */\nexport class BundleAnalyzer {\n constructor() {\n this.chunks = new Map();\n this.loadTimes = new Map();\n }\n\n /**\n * Track chunk load\n */\n trackLoad(chunkName, size, loadTime) {\n this.chunks.set(chunkName, { size, loadTime });\n this.loadTimes.set(chunkName, loadTime);\n }\n\n /**\n * Get bundle statistics\n */\n getStats() {\n const chunks = Array.from(this.chunks.entries());\n const totalSize = chunks.reduce((sum, [, chunk]) => sum + chunk.size, 0);\n const avgLoadTime = chunks.reduce((sum, [, chunk]) => sum + chunk.loadTime, 0) / chunks.length;\n\n return {\n totalChunks: chunks.length,\n totalSize,\n averageLoadTime: avgLoadTime,\n chunks: chunks.map(([name, data]) => ({\n name,\n size: data.size,\n loadTime: data.loadTime,\n percentage: (data.size / totalSize * 100).toFixed(2)\n }))\n };\n }\n\n /**\n * Find largest chunks\n */\n getLargestChunks(limit = 10) {\n return Array.from(this.chunks.entries())\n .sort((a, b) => b[1].size - a[1].size)\n .slice(0, limit)\n .map(([name, data]) => ({ name, ...data }));\n }\n\n /**\n * Find slowest chunks\n */\n getSlowestChunks(limit = 10) {\n return Array.from(this.chunks.entries())\n .sort((a, b) => b[1].loadTime - a[1].loadTime)\n .slice(0, limit)\n .map(([name, data]) => ({ name, ...data }));\n }\n}\n\nexport default {\n CodeSplitter,\n createCodeSplitter,\n lazy,\n splitComponent,\n createRouteSplitter,\n BundleAnalyzer\n};\n", "/**\n * Coherent.js Advanced Caching\n * \n * Smart caching strategies for performance optimization\n * \n * @module performance/cache\n */\n\n/**\n * LRU Cache\n * Least Recently Used cache implementation\n */\nexport class LRUCache {\n constructor(options = {}) {\n this.maxSize = options.maxSize || 100;\n this.ttl = options.ttl || null; // Time to live in ms\n this.cache = new Map();\n this.accessOrder = [];\n }\n\n /**\n * Get value from cache\n */\n get(key) {\n if (!this.cache.has(key)) {\n return undefined;\n }\n\n const entry = this.cache.get(key);\n\n // Check TTL\n if (this.ttl && Date.now() - entry.timestamp > this.ttl) {\n this.delete(key);\n return undefined;\n }\n\n // Update access order\n this.updateAccessOrder(key);\n\n return entry.value;\n }\n\n /**\n * Set value in cache\n */\n set(key, value) {\n // Remove if exists\n if (this.cache.has(key)) {\n this.delete(key);\n }\n\n // Evict if at capacity\n if (this.cache.size >= this.maxSize) {\n this.evict();\n }\n\n // Add new entry\n this.cache.set(key, {\n value,\n timestamp: Date.now()\n });\n\n this.accessOrder.push(key);\n\n return this;\n }\n\n /**\n * Check if key exists\n */\n has(key) {\n if (!this.cache.has(key)) {\n return false;\n }\n\n const entry = this.cache.get(key);\n\n // Check TTL\n if (this.ttl && Date.now() - entry.timestamp > this.ttl) {\n this.delete(key);\n return false;\n }\n\n return true;\n }\n\n /**\n * Delete key\n */\n delete(key) {\n this.cache.delete(key);\n const index = this.accessOrder.indexOf(key);\n if (index > -1) {\n this.accessOrder.splice(index, 1);\n }\n return this;\n }\n\n /**\n * Clear cache\n */\n clear() {\n this.cache.clear();\n this.accessOrder = [];\n return this;\n }\n\n /**\n * Get cache size\n */\n size() {\n return this.cache.size;\n }\n\n /**\n * Update access order\n */\n updateAccessOrder(key) {\n const index = this.accessOrder.indexOf(key);\n if (index > -1) {\n this.accessOrder.splice(index, 1);\n }\n this.accessOrder.push(key);\n }\n\n /**\n * Evict least recently used\n */\n evict() {\n if (this.accessOrder.length > 0) {\n const oldest = this.accessOrder.shift();\n this.cache.delete(oldest);\n }\n }\n\n /**\n * Get all keys\n */\n keys() {\n return Array.from(this.cache.keys());\n }\n\n /**\n * Get all values\n */\n values() {\n return Array.from(this.cache.values()).map(entry => entry.value);\n }\n\n /**\n * Get statistics\n */\n getStats() {\n return {\n size: this.cache.size,\n maxSize: this.maxSize,\n utilizationPercent: (this.cache.size / this.maxSize * 100).toFixed(2),\n oldestKey: this.accessOrder[0],\n newestKey: this.accessOrder[this.accessOrder.length - 1]\n };\n }\n}\n\n/**\n * Memory Cache with strategies\n */\nexport class MemoryCache {\n constructor(options = {}) {\n this.options = {\n strategy: 'lru', // lru, lfu, fifo\n maxSize: 100,\n ttl: null,\n ...options\n };\n\n this.cache = new Map();\n this.metadata = new Map();\n this.hits = 0;\n this.misses = 0;\n }\n\n /**\n * Get from cache\n */\n get(key) {\n if (!this.cache.has(key)) {\n this.misses++;\n return undefined;\n }\n\n const entry = this.cache.get(key);\n\n // Check TTL\n if (entry.ttl && Date.now() > entry.expiresAt) {\n this.delete(key);\n this.misses++;\n return undefined;\n }\n\n // Update metadata\n this.updateMetadata(key);\n this.hits++;\n\n return entry.value;\n }\n\n /**\n * Set in cache\n */\n set(key, value, options = {}) {\n // Evict if needed\n if (this.cache.size >= this.options.maxSize && !this.cache.has(key)) {\n this.evict();\n }\n\n const ttl = options.ttl || this.options.ttl;\n\n this.cache.set(key, {\n value,\n ttl,\n expiresAt: ttl ? Date.now() + ttl : null,\n createdAt: Date.now()\n });\n\n this.metadata.set(key, {\n accessCount: 0,\n lastAccess: Date.now()\n });\n\n return this;\n }\n\n /**\n * Update metadata based on strategy\n */\n updateMetadata(key) {\n const meta = this.metadata.get(key);\n if (meta) {\n meta.accessCount++;\n meta.lastAccess = Date.now();\n }\n }\n\n /**\n * Evict based on strategy\n */\n evict() {\n let keyToEvict;\n\n switch (this.options.strategy) {\n case 'lru': // Least Recently Used\n keyToEvict = this.findLRU();\n break;\n case 'lfu': // Least Frequently Used\n keyToEvict = this.findLFU();\n break;\n case 'fifo': // First In First Out\n keyToEvict = this.findFIFO();\n break;\n default:\n keyToEvict = this.cache.keys().next().value;\n }\n\n if (keyToEvict) {\n this.delete(keyToEvict);\n }\n }\n\n /**\n * Find least recently used key\n */\n findLRU() {\n let oldest = null;\n let oldestTime = Infinity;\n\n for (const [key, meta] of this.metadata.entries()) {\n if (meta.lastAccess < oldestTime) {\n oldestTime = meta.lastAccess;\n oldest = key;\n }\n }\n\n return oldest;\n }\n\n /**\n * Find least frequently used key\n */\n findLFU() {\n let leastUsed = null;\n let minCount = Infinity;\n\n for (const [key, meta] of this.metadata.entries()) {\n if (meta.accessCount < minCount) {\n minCount = meta.accessCount;\n leastUsed = key;\n }\n }\n\n return leastUsed;\n }\n\n /**\n * Find first in (oldest)\n */\n findFIFO() {\n let oldest = null;\n let oldestTime = Infinity;\n\n for (const [key, entry] of this.cache.entries()) {\n if (entry.createdAt < oldestTime) {\n oldestTime = entry.createdAt;\n oldest = key;\n }\n }\n\n return oldest;\n }\n\n /**\n * Check if key exists\n */\n has(key) {\n return this.cache.has(key);\n }\n\n /**\n * Delete key\n */\n delete(key) {\n this.cache.delete(key);\n this.metadata.delete(key);\n return this;\n }\n\n /**\n * Clear cache\n */\n clear() {\n this.cache.clear();\n this.metadata.clear();\n this.hits = 0;\n this.misses = 0;\n return this;\n }\n\n /**\n * Get cache statistics\n */\n getStats() {\n const total = this.hits + this.misses;\n const hitRate = total > 0 ? (this.hits / total * 100).toFixed(2) : 0;\n\n return {\n size: this.cache.size,\n maxSize: this.options.maxSize,\n hits: this.hits,\n misses: this.misses,\n hitRate: `${hitRate}%`,\n strategy: this.options.strategy\n };\n }\n}\n\n/**\n * Memoization cache\n */\nexport class MemoCache {\n constructor(options = {}) {\n this.cache = new LRUCache(options);\n this.keyGenerator = options.keyGenerator || this.defaultKeyGenerator;\n }\n\n /**\n * Default key generator\n */\n defaultKeyGenerator(...args) {\n return JSON.stringify(args);\n }\n\n /**\n * Memoize a function\n */\n memoize(fn) {\n return (...args) => {\n const key = this.keyGenerator(...args);\n \n if (this.cache.has(key)) {\n return this.cache.get(key);\n }\n\n const result = fn(...args);\n this.cache.set(key, result);\n \n return result;\n };\n }\n\n /**\n * Clear memoization cache\n */\n clear() {\n this.cache.clear();\n }\n\n /**\n * Get statistics\n */\n getStats() {\n return this.cache.getStats();\n }\n}\n\n/**\n * Component render cache\n */\nexport class RenderCache {\n constructor(options = {}) {\n this.cache = new MemoryCache({\n maxSize: options.maxSize || 50,\n ttl: options.ttl || 60000, // 1 minute default\n strategy: 'lru'\n });\n }\n\n /**\n * Generate cache key for component\n */\n generateKey(component, props) {\n const componentName = component.name || 'anonymous';\n const propsKey = this.hashProps(props);\n return `${componentName}:${propsKey}`;\n }\n\n /**\n * Hash props for cache key\n */\n hashProps(props) {\n try {\n return JSON.stringify(props, Object.keys(props).sort());\n } catch {\n return String(Date.now());\n }\n }\n\n /**\n * Get cached render\n */\n get(component, props) {\n const key = this.generateKey(component, props);\n return this.cache.get(key);\n }\n\n /**\n * Cache render result\n */\n set(component, props, result, options = {}) {\n const key = this.generateKey(component, props);\n this.cache.set(key, result, options);\n }\n\n /**\n * Clear cache\n */\n clear() {\n this.cache.clear();\n }\n\n /**\n * Get statistics\n */\n getStats() {\n return this.cache.getStats();\n }\n}\n\n/**\n * Create a cache instance\n */\nexport function createCache(type = 'lru', options = {}) {\n switch (type) {\n case 'lru':\n return new LRUCache(options);\n case 'memory':\n return new MemoryCache(options);\n case 'memo':\n return new MemoCache(options);\n case 'render':\n return new RenderCache(options);\n default:\n return new LRUCache(options);\n }\n}\n\n/**\n * Memoize a function\n */\nexport function memoize(fn, options = {}) {\n const cache = new MemoCache(options);\n return cache.memoize(fn);\n}\n\nexport default {\n LRUCache,\n MemoryCache,\n MemoCache,\n RenderCache,\n createCache,\n memoize\n};\n", "/**\n * Coherent.js Lazy Loading\n * \n * Utilities for lazy loading resources\n * \n * @module performance/lazy-loading\n */\n\n/**\n * Lazy Loader\n * Manages lazy loading of images, scripts, and other resources\n */\nexport class LazyLoader {\n constructor(options = {}) {\n this.options = {\n rootMargin: '50px',\n threshold: 0.01,\n ...options\n };\n \n this.observer = null;\n this.observed = new Set();\n this.loaded = new Set();\n \n this.initObserver();\n }\n\n /**\n * Initialize Intersection Observer\n */\n initObserver() {\n if (typeof IntersectionObserver === 'undefined') {\n return;\n }\n\n this.observer = new IntersectionObserver(\n (entries) => this.handleIntersection(entries),\n {\n rootMargin: this.options.rootMargin,\n threshold: this.options.threshold\n }\n );\n }\n\n /**\n * Handle intersection\n */\n handleIntersection(entries) {\n entries.forEach(entry => {\n if (entry.isIntersecting) {\n this.loadElement(entry.target);\n }\n });\n }\n\n /**\n * Observe an element\n */\n observe(element) {\n if (!this.observer || this.observed.has(element)) {\n return;\n }\n\n this.observer.observe(element);\n this.observed.add(element);\n }\n\n /**\n * Unobserve an element\n */\n unobserve(element) {\n if (!this.observer) {\n return;\n }\n\n this.observer.unobserve(element);\n this.observed.delete(element);\n }\n\n /**\n * Load an element\n */\n loadElement(element) {\n if (this.loaded.has(element)) {\n return;\n }\n\n // Load based on element type\n if (element.tagName === 'IMG') {\n this.loadImage(element);\n } else if (element.tagName === 'SCRIPT') {\n this.loadScript(element);\n } else if (element.tagName === 'IFRAME') {\n this.loadIframe(element);\n }\n\n this.loaded.add(element);\n this.unobserve(element);\n }\n\n /**\n * Load image\n */\n loadImage(img) {\n const src = img.dataset.src;\n const srcset = img.dataset.srcset;\n\n if (src) {\n img.src = src;\n }\n\n if (srcset) {\n img.srcset = srcset;\n }\n\n img.classList.add('loaded');\n }\n\n /**\n * Load script\n */\n loadScript(script) {\n const src = script.dataset.src;\n \n if (src) {\n script.src = src;\n }\n }\n\n /**\n * Load iframe\n */\n loadIframe(iframe) {\n const src = iframe.dataset.src;\n \n if (src) {\n iframe.src = src;\n }\n }\n\n /**\n * Disconnect observer\n */\n disconnect() {\n if (this.observer) {\n this.observer.disconnect();\n }\n this.observed.clear();\n }\n}\n\n/**\n * Image lazy loader\n */\nexport class ImageLazyLoader {\n constructor(options = {}) {\n this.options = {\n placeholder: 'data:image/svg+xml,%3Csvg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 1 1\"%3E%3C/svg%3E',\n loadingClass: 'lazy-loading',\n loadedClass: 'lazy-loaded',\n errorClass: 'lazy-error',\n ...options\n };\n \n this.loader = new LazyLoader(options);\n }\n\n /**\n * Create lazy image component\n */\n createImage(src, options = {}) {\n return {\n img: {\n src: this.options.placeholder,\n 'data-src': src,\n 'data-srcset': options.srcset,\n alt: options.alt || '',\n className: this.options.loadingClass,\n loading: 'lazy',\n onload: `this.classList.add(\"${ this.options.loadedClass }\")`,\n onerror: `this.classList.add(\"${ this.options.errorClass }\")`\n }\n };\n }\n\n /**\n * Observe images\n */\n observe(selector = 'img[data-src]') {\n if (typeof document === 'undefined') {\n return;\n }\n\n const images = document.querySelectorAll(selector);\n images.forEach(img => this.loader.observe(img));\n }\n\n /**\n * Load all images immediately\n */\n loadAll() {\n this.observed.forEach(element => {\n this.loader.loadElement(element);\n });\n }\n}\n\n/**\n * Resource preloader\n */\nexport class ResourcePreloader {\n constructor() {\n this.preloaded = new Set();\n this.preloading = new Map();\n }\n\n /**\n * Preload an image\n */\n async preloadImage(src) {\n if (this.preloaded.has(src)) {\n return;\n }\n\n if (this.preloading.has(src)) {\n return this.preloading.get(src);\n }\n\n const promise = new Promise((resolve, reject) => {\n const img = new Image();\n img.onload = () => {\n this.preloaded.add(src);\n this.preloading.delete(src);\n resolve(img);\n };\n img.onerror = () => {\n this.preloading.delete(src);\n reject(new Error(`Failed to preload image: ${src}`));\n };\n img.src = src;\n });\n\n this.preloading.set(src, promise);\n return promise;\n }\n\n /**\n * Preload multiple images\n */\n async preloadImages(sources) {\n return Promise.all(sources.map(src => this.preloadImage(src)));\n }\n\n /**\n * Preload a script\n */\n async preloadScript(src) {\n if (this.preloaded.has(src)) {\n return;\n }\n\n if (this.preloading.has(src)) {\n return this.preloading.get(src);\n }\n\n const promise = new Promise((resolve, reject) => {\n const link = document.createElement('link');\n link.rel = 'preload';\n link.as = 'script';\n link.href = src;\n link.onload = () => {\n this.preloaded.add(src);\n this.preloading.delete(src);\n resolve();\n };\n link.onerror = () => {\n this.preloading.delete(src);\n reject(new Error(`Failed to preload script: ${src}`));\n };\n document.head.appendChild(link);\n });\n\n this.preloading.set(src, promise);\n return promise;\n }\n\n /**\n * Prefetch a resource\n */\n prefetch(href, options = {}) {\n if (typeof document === 'undefined') {\n return;\n }\n\n const link = document.createElement('link');\n link.rel = 'prefetch';\n link.href = href;\n \n if (options.as) {\n link.as = options.as;\n }\n\n document.head.appendChild(link);\n }\n\n /**\n * Check if resource is preloaded\n */\n isPreloaded(src) {\n return this.preloaded.has(src);\n }\n\n /**\n * Clear preload cache\n */\n clear() {\n this.preloaded.clear();\n this.preloading.clear();\n }\n}\n\n/**\n * Progressive image loader\n */\nexport class ProgressiveImageLoader {\n /**\n * Create progressive image component\n */\n createImage(lowResSrc, highResSrc, options = {}) {\n return {\n div: {\n className: 'progressive-image',\n style: options.style || {},\n children: [\n {\n img: {\n src: lowResSrc,\n className: 'progressive-image-low',\n alt: options.alt || '',\n style: 'filter: blur(10px); transition: opacity 0.3s;'\n }\n },\n {\n img: {\n 'data-src': highResSrc,\n className: 'progressive-image-high',\n alt: options.alt || '',\n style: 'opacity: 0; transition: opacity 0.3s;',\n onload: 'this.style.opacity = 1; this.previousElementSibling.style.opacity = 0;'\n }\n }\n ]\n }\n };\n }\n}\n\n/**\n * Create a lazy loader\n */\nexport function createLazyLoader(options = {}) {\n return new LazyLoader(options);\n}\n\n/**\n * Create an image lazy loader\n */\nexport function createImageLazyLoader(options = {}) {\n return new ImageLazyLoader(options);\n}\n\n/**\n * Create a resource preloader\n */\nexport function createPreloader() {\n return new ResourcePreloader();\n}\n\n/**\n * Quick lazy image helper\n */\nexport function lazyImage(src, options = {}) {\n const loader = new ImageLazyLoader();\n return loader.createImage(src, options);\n}\n\n/**\n * Quick progressive image helper\n */\nexport function progressiveImage(lowRes, highRes, options = {}) {\n const loader = new ProgressiveImageLoader();\n return loader.createImage(lowRes, highRes, options);\n}\n\nexport default {\n LazyLoader,\n ImageLazyLoader,\n ResourcePreloader,\n ProgressiveImageLoader,\n createLazyLoader,\n createImageLazyLoader,\n createPreloader,\n lazyImage,\n progressiveImage\n};\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }
@@ -0,0 +1,332 @@
1
+ // src/lazy-loading.js
2
+ var LazyLoader = class {
3
+ constructor(options = {}) {
4
+ this.options = {
5
+ rootMargin: "50px",
6
+ threshold: 0.01,
7
+ ...options
8
+ };
9
+ this.observer = null;
10
+ this.observed = /* @__PURE__ */ new Set();
11
+ this.loaded = /* @__PURE__ */ new Set();
12
+ this.initObserver();
13
+ }
14
+ /**
15
+ * Initialize Intersection Observer
16
+ */
17
+ initObserver() {
18
+ if (typeof IntersectionObserver === "undefined") {
19
+ return;
20
+ }
21
+ this.observer = new IntersectionObserver(
22
+ (entries) => this.handleIntersection(entries),
23
+ {
24
+ rootMargin: this.options.rootMargin,
25
+ threshold: this.options.threshold
26
+ }
27
+ );
28
+ }
29
+ /**
30
+ * Handle intersection
31
+ */
32
+ handleIntersection(entries) {
33
+ entries.forEach((entry) => {
34
+ if (entry.isIntersecting) {
35
+ this.loadElement(entry.target);
36
+ }
37
+ });
38
+ }
39
+ /**
40
+ * Observe an element
41
+ */
42
+ observe(element) {
43
+ if (!this.observer || this.observed.has(element)) {
44
+ return;
45
+ }
46
+ this.observer.observe(element);
47
+ this.observed.add(element);
48
+ }
49
+ /**
50
+ * Unobserve an element
51
+ */
52
+ unobserve(element) {
53
+ if (!this.observer) {
54
+ return;
55
+ }
56
+ this.observer.unobserve(element);
57
+ this.observed.delete(element);
58
+ }
59
+ /**
60
+ * Load an element
61
+ */
62
+ loadElement(element) {
63
+ if (this.loaded.has(element)) {
64
+ return;
65
+ }
66
+ if (element.tagName === "IMG") {
67
+ this.loadImage(element);
68
+ } else if (element.tagName === "SCRIPT") {
69
+ this.loadScript(element);
70
+ } else if (element.tagName === "IFRAME") {
71
+ this.loadIframe(element);
72
+ }
73
+ this.loaded.add(element);
74
+ this.unobserve(element);
75
+ }
76
+ /**
77
+ * Load image
78
+ */
79
+ loadImage(img) {
80
+ const src = img.dataset.src;
81
+ const srcset = img.dataset.srcset;
82
+ if (src) {
83
+ img.src = src;
84
+ }
85
+ if (srcset) {
86
+ img.srcset = srcset;
87
+ }
88
+ img.classList.add("loaded");
89
+ }
90
+ /**
91
+ * Load script
92
+ */
93
+ loadScript(script) {
94
+ const src = script.dataset.src;
95
+ if (src) {
96
+ script.src = src;
97
+ }
98
+ }
99
+ /**
100
+ * Load iframe
101
+ */
102
+ loadIframe(iframe) {
103
+ const src = iframe.dataset.src;
104
+ if (src) {
105
+ iframe.src = src;
106
+ }
107
+ }
108
+ /**
109
+ * Disconnect observer
110
+ */
111
+ disconnect() {
112
+ if (this.observer) {
113
+ this.observer.disconnect();
114
+ }
115
+ this.observed.clear();
116
+ }
117
+ };
118
+ var ImageLazyLoader = class {
119
+ constructor(options = {}) {
120
+ this.options = {
121
+ placeholder: 'data:image/svg+xml,%3Csvg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1 1"%3E%3C/svg%3E',
122
+ loadingClass: "lazy-loading",
123
+ loadedClass: "lazy-loaded",
124
+ errorClass: "lazy-error",
125
+ ...options
126
+ };
127
+ this.loader = new LazyLoader(options);
128
+ }
129
+ /**
130
+ * Create lazy image component
131
+ */
132
+ createImage(src, options = {}) {
133
+ return {
134
+ img: {
135
+ src: this.options.placeholder,
136
+ "data-src": src,
137
+ "data-srcset": options.srcset,
138
+ alt: options.alt || "",
139
+ className: this.options.loadingClass,
140
+ loading: "lazy",
141
+ onload: `this.classList.add("${this.options.loadedClass}")`,
142
+ onerror: `this.classList.add("${this.options.errorClass}")`
143
+ }
144
+ };
145
+ }
146
+ /**
147
+ * Observe images
148
+ */
149
+ observe(selector = "img[data-src]") {
150
+ if (typeof document === "undefined") {
151
+ return;
152
+ }
153
+ const images = document.querySelectorAll(selector);
154
+ images.forEach((img) => this.loader.observe(img));
155
+ }
156
+ /**
157
+ * Load all images immediately
158
+ */
159
+ loadAll() {
160
+ this.observed.forEach((element) => {
161
+ this.loader.loadElement(element);
162
+ });
163
+ }
164
+ };
165
+ var ResourcePreloader = class {
166
+ constructor() {
167
+ this.preloaded = /* @__PURE__ */ new Set();
168
+ this.preloading = /* @__PURE__ */ new Map();
169
+ }
170
+ /**
171
+ * Preload an image
172
+ */
173
+ async preloadImage(src) {
174
+ if (this.preloaded.has(src)) {
175
+ return;
176
+ }
177
+ if (this.preloading.has(src)) {
178
+ return this.preloading.get(src);
179
+ }
180
+ const promise = new Promise((resolve, reject) => {
181
+ const img = new Image();
182
+ img.onload = () => {
183
+ this.preloaded.add(src);
184
+ this.preloading.delete(src);
185
+ resolve(img);
186
+ };
187
+ img.onerror = () => {
188
+ this.preloading.delete(src);
189
+ reject(new Error(`Failed to preload image: ${src}`));
190
+ };
191
+ img.src = src;
192
+ });
193
+ this.preloading.set(src, promise);
194
+ return promise;
195
+ }
196
+ /**
197
+ * Preload multiple images
198
+ */
199
+ async preloadImages(sources) {
200
+ return Promise.all(sources.map((src) => this.preloadImage(src)));
201
+ }
202
+ /**
203
+ * Preload a script
204
+ */
205
+ async preloadScript(src) {
206
+ if (this.preloaded.has(src)) {
207
+ return;
208
+ }
209
+ if (this.preloading.has(src)) {
210
+ return this.preloading.get(src);
211
+ }
212
+ const promise = new Promise((resolve, reject) => {
213
+ const link = document.createElement("link");
214
+ link.rel = "preload";
215
+ link.as = "script";
216
+ link.href = src;
217
+ link.onload = () => {
218
+ this.preloaded.add(src);
219
+ this.preloading.delete(src);
220
+ resolve();
221
+ };
222
+ link.onerror = () => {
223
+ this.preloading.delete(src);
224
+ reject(new Error(`Failed to preload script: ${src}`));
225
+ };
226
+ document.head.appendChild(link);
227
+ });
228
+ this.preloading.set(src, promise);
229
+ return promise;
230
+ }
231
+ /**
232
+ * Prefetch a resource
233
+ */
234
+ prefetch(href, options = {}) {
235
+ if (typeof document === "undefined") {
236
+ return;
237
+ }
238
+ const link = document.createElement("link");
239
+ link.rel = "prefetch";
240
+ link.href = href;
241
+ if (options.as) {
242
+ link.as = options.as;
243
+ }
244
+ document.head.appendChild(link);
245
+ }
246
+ /**
247
+ * Check if resource is preloaded
248
+ */
249
+ isPreloaded(src) {
250
+ return this.preloaded.has(src);
251
+ }
252
+ /**
253
+ * Clear preload cache
254
+ */
255
+ clear() {
256
+ this.preloaded.clear();
257
+ this.preloading.clear();
258
+ }
259
+ };
260
+ var ProgressiveImageLoader = class {
261
+ /**
262
+ * Create progressive image component
263
+ */
264
+ createImage(lowResSrc, highResSrc, options = {}) {
265
+ return {
266
+ div: {
267
+ className: "progressive-image",
268
+ style: options.style || {},
269
+ children: [
270
+ {
271
+ img: {
272
+ src: lowResSrc,
273
+ className: "progressive-image-low",
274
+ alt: options.alt || "",
275
+ style: "filter: blur(10px); transition: opacity 0.3s;"
276
+ }
277
+ },
278
+ {
279
+ img: {
280
+ "data-src": highResSrc,
281
+ className: "progressive-image-high",
282
+ alt: options.alt || "",
283
+ style: "opacity: 0; transition: opacity 0.3s;",
284
+ onload: "this.style.opacity = 1; this.previousElementSibling.style.opacity = 0;"
285
+ }
286
+ }
287
+ ]
288
+ }
289
+ };
290
+ }
291
+ };
292
+ function createLazyLoader(options = {}) {
293
+ return new LazyLoader(options);
294
+ }
295
+ function createImageLazyLoader(options = {}) {
296
+ return new ImageLazyLoader(options);
297
+ }
298
+ function createPreloader() {
299
+ return new ResourcePreloader();
300
+ }
301
+ function lazyImage(src, options = {}) {
302
+ const loader = new ImageLazyLoader();
303
+ return loader.createImage(src, options);
304
+ }
305
+ function progressiveImage(lowRes, highRes, options = {}) {
306
+ const loader = new ProgressiveImageLoader();
307
+ return loader.createImage(lowRes, highRes, options);
308
+ }
309
+ var lazy_loading_default = {
310
+ LazyLoader,
311
+ ImageLazyLoader,
312
+ ResourcePreloader,
313
+ ProgressiveImageLoader,
314
+ createLazyLoader,
315
+ createImageLazyLoader,
316
+ createPreloader,
317
+ lazyImage,
318
+ progressiveImage
319
+ };
320
+ export {
321
+ ImageLazyLoader,
322
+ LazyLoader,
323
+ ProgressiveImageLoader,
324
+ ResourcePreloader,
325
+ createImageLazyLoader,
326
+ createLazyLoader,
327
+ createPreloader,
328
+ lazy_loading_default as default,
329
+ lazyImage,
330
+ progressiveImage
331
+ };
332
+ //# sourceMappingURL=lazy-loading.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/lazy-loading.js"],
4
+ "sourcesContent": ["/**\n * Coherent.js Lazy Loading\n * \n * Utilities for lazy loading resources\n * \n * @module performance/lazy-loading\n */\n\n/**\n * Lazy Loader\n * Manages lazy loading of images, scripts, and other resources\n */\nexport class LazyLoader {\n constructor(options = {}) {\n this.options = {\n rootMargin: '50px',\n threshold: 0.01,\n ...options\n };\n \n this.observer = null;\n this.observed = new Set();\n this.loaded = new Set();\n \n this.initObserver();\n }\n\n /**\n * Initialize Intersection Observer\n */\n initObserver() {\n if (typeof IntersectionObserver === 'undefined') {\n return;\n }\n\n this.observer = new IntersectionObserver(\n (entries) => this.handleIntersection(entries),\n {\n rootMargin: this.options.rootMargin,\n threshold: this.options.threshold\n }\n );\n }\n\n /**\n * Handle intersection\n */\n handleIntersection(entries) {\n entries.forEach(entry => {\n if (entry.isIntersecting) {\n this.loadElement(entry.target);\n }\n });\n }\n\n /**\n * Observe an element\n */\n observe(element) {\n if (!this.observer || this.observed.has(element)) {\n return;\n }\n\n this.observer.observe(element);\n this.observed.add(element);\n }\n\n /**\n * Unobserve an element\n */\n unobserve(element) {\n if (!this.observer) {\n return;\n }\n\n this.observer.unobserve(element);\n this.observed.delete(element);\n }\n\n /**\n * Load an element\n */\n loadElement(element) {\n if (this.loaded.has(element)) {\n return;\n }\n\n // Load based on element type\n if (element.tagName === 'IMG') {\n this.loadImage(element);\n } else if (element.tagName === 'SCRIPT') {\n this.loadScript(element);\n } else if (element.tagName === 'IFRAME') {\n this.loadIframe(element);\n }\n\n this.loaded.add(element);\n this.unobserve(element);\n }\n\n /**\n * Load image\n */\n loadImage(img) {\n const src = img.dataset.src;\n const srcset = img.dataset.srcset;\n\n if (src) {\n img.src = src;\n }\n\n if (srcset) {\n img.srcset = srcset;\n }\n\n img.classList.add('loaded');\n }\n\n /**\n * Load script\n */\n loadScript(script) {\n const src = script.dataset.src;\n \n if (src) {\n script.src = src;\n }\n }\n\n /**\n * Load iframe\n */\n loadIframe(iframe) {\n const src = iframe.dataset.src;\n \n if (src) {\n iframe.src = src;\n }\n }\n\n /**\n * Disconnect observer\n */\n disconnect() {\n if (this.observer) {\n this.observer.disconnect();\n }\n this.observed.clear();\n }\n}\n\n/**\n * Image lazy loader\n */\nexport class ImageLazyLoader {\n constructor(options = {}) {\n this.options = {\n placeholder: 'data:image/svg+xml,%3Csvg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 1 1\"%3E%3C/svg%3E',\n loadingClass: 'lazy-loading',\n loadedClass: 'lazy-loaded',\n errorClass: 'lazy-error',\n ...options\n };\n \n this.loader = new LazyLoader(options);\n }\n\n /**\n * Create lazy image component\n */\n createImage(src, options = {}) {\n return {\n img: {\n src: this.options.placeholder,\n 'data-src': src,\n 'data-srcset': options.srcset,\n alt: options.alt || '',\n className: this.options.loadingClass,\n loading: 'lazy',\n onload: `this.classList.add(\"${ this.options.loadedClass }\")`,\n onerror: `this.classList.add(\"${ this.options.errorClass }\")`\n }\n };\n }\n\n /**\n * Observe images\n */\n observe(selector = 'img[data-src]') {\n if (typeof document === 'undefined') {\n return;\n }\n\n const images = document.querySelectorAll(selector);\n images.forEach(img => this.loader.observe(img));\n }\n\n /**\n * Load all images immediately\n */\n loadAll() {\n this.observed.forEach(element => {\n this.loader.loadElement(element);\n });\n }\n}\n\n/**\n * Resource preloader\n */\nexport class ResourcePreloader {\n constructor() {\n this.preloaded = new Set();\n this.preloading = new Map();\n }\n\n /**\n * Preload an image\n */\n async preloadImage(src) {\n if (this.preloaded.has(src)) {\n return;\n }\n\n if (this.preloading.has(src)) {\n return this.preloading.get(src);\n }\n\n const promise = new Promise((resolve, reject) => {\n const img = new Image();\n img.onload = () => {\n this.preloaded.add(src);\n this.preloading.delete(src);\n resolve(img);\n };\n img.onerror = () => {\n this.preloading.delete(src);\n reject(new Error(`Failed to preload image: ${src}`));\n };\n img.src = src;\n });\n\n this.preloading.set(src, promise);\n return promise;\n }\n\n /**\n * Preload multiple images\n */\n async preloadImages(sources) {\n return Promise.all(sources.map(src => this.preloadImage(src)));\n }\n\n /**\n * Preload a script\n */\n async preloadScript(src) {\n if (this.preloaded.has(src)) {\n return;\n }\n\n if (this.preloading.has(src)) {\n return this.preloading.get(src);\n }\n\n const promise = new Promise((resolve, reject) => {\n const link = document.createElement('link');\n link.rel = 'preload';\n link.as = 'script';\n link.href = src;\n link.onload = () => {\n this.preloaded.add(src);\n this.preloading.delete(src);\n resolve();\n };\n link.onerror = () => {\n this.preloading.delete(src);\n reject(new Error(`Failed to preload script: ${src}`));\n };\n document.head.appendChild(link);\n });\n\n this.preloading.set(src, promise);\n return promise;\n }\n\n /**\n * Prefetch a resource\n */\n prefetch(href, options = {}) {\n if (typeof document === 'undefined') {\n return;\n }\n\n const link = document.createElement('link');\n link.rel = 'prefetch';\n link.href = href;\n \n if (options.as) {\n link.as = options.as;\n }\n\n document.head.appendChild(link);\n }\n\n /**\n * Check if resource is preloaded\n */\n isPreloaded(src) {\n return this.preloaded.has(src);\n }\n\n /**\n * Clear preload cache\n */\n clear() {\n this.preloaded.clear();\n this.preloading.clear();\n }\n}\n\n/**\n * Progressive image loader\n */\nexport class ProgressiveImageLoader {\n /**\n * Create progressive image component\n */\n createImage(lowResSrc, highResSrc, options = {}) {\n return {\n div: {\n className: 'progressive-image',\n style: options.style || {},\n children: [\n {\n img: {\n src: lowResSrc,\n className: 'progressive-image-low',\n alt: options.alt || '',\n style: 'filter: blur(10px); transition: opacity 0.3s;'\n }\n },\n {\n img: {\n 'data-src': highResSrc,\n className: 'progressive-image-high',\n alt: options.alt || '',\n style: 'opacity: 0; transition: opacity 0.3s;',\n onload: 'this.style.opacity = 1; this.previousElementSibling.style.opacity = 0;'\n }\n }\n ]\n }\n };\n }\n}\n\n/**\n * Create a lazy loader\n */\nexport function createLazyLoader(options = {}) {\n return new LazyLoader(options);\n}\n\n/**\n * Create an image lazy loader\n */\nexport function createImageLazyLoader(options = {}) {\n return new ImageLazyLoader(options);\n}\n\n/**\n * Create a resource preloader\n */\nexport function createPreloader() {\n return new ResourcePreloader();\n}\n\n/**\n * Quick lazy image helper\n */\nexport function lazyImage(src, options = {}) {\n const loader = new ImageLazyLoader();\n return loader.createImage(src, options);\n}\n\n/**\n * Quick progressive image helper\n */\nexport function progressiveImage(lowRes, highRes, options = {}) {\n const loader = new ProgressiveImageLoader();\n return loader.createImage(lowRes, highRes, options);\n}\n\nexport default {\n LazyLoader,\n ImageLazyLoader,\n ResourcePreloader,\n ProgressiveImageLoader,\n createLazyLoader,\n createImageLazyLoader,\n createPreloader,\n lazyImage,\n progressiveImage\n};\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@coherent.js/performance",
3
- "version": "1.0.0-beta.6",
3
+ "version": "1.0.0-beta.7",
4
4
  "description": "Performance optimization utilities for Coherent.js",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -20,17 +20,25 @@
20
20
  "author": "Coherent.js Team",
21
21
  "license": "MIT",
22
22
  "peerDependencies": {
23
- "@coherent.js/core": "1.0.0-beta.6"
23
+ "@coherent.js/core": "1.0.0-beta.7"
24
24
  },
25
25
  "repository": {
26
26
  "type": "git",
27
27
  "url": "git+https://github.com/Tomdrouv1/coherent.js.git"
28
28
  },
29
+ "homepage": "https://github.com/Tomdrouv1/coherent.js",
30
+ "bugs": {
31
+ "url": "https://github.com/Tomdrouv1/coherent.js/issues"
32
+ },
29
33
  "publishConfig": {
30
34
  "access": "public"
31
35
  },
36
+ "engines": {
37
+ "node": ">=20.0.0"
38
+ },
32
39
  "types": "./types/index.d.ts",
33
40
  "files": [
41
+ "dist/",
34
42
  "LICENSE",
35
43
  "README.md",
36
44
  "types/"
@@ -38,6 +46,8 @@
38
46
  "sideEffects": false,
39
47
  "scripts": {
40
48
  "build": "node build.mjs",
41
- "clean": "rm -rf dist"
49
+ "clean": "rm -rf dist",
50
+ "test": "vitest run",
51
+ "test:watch": "vitest"
42
52
  }
43
53
  }