@coherent.js/devtools 1.0.0-beta.8 → 1.0.0-rc.2

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.
@@ -0,0 +1,313 @@
1
+ // src/performance/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/performance/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
+ }