@coherent.js/devtools 1.0.0-beta.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,508 @@
1
+ // src/profiler.js
2
+ var PerformanceProfiler = class {
3
+ constructor(options = {}) {
4
+ this.options = {
5
+ enabled: true,
6
+ sampleRate: 1,
7
+ // 1.0 = 100% sampling
8
+ slowThreshold: 16,
9
+ // 16ms = 60fps
10
+ trackMemory: typeof performance !== "undefined" && performance.memory,
11
+ maxSamples: options.maxSamples || 1e3,
12
+ ...options
13
+ };
14
+ this.measurements = [];
15
+ this.sessions = /* @__PURE__ */ new Map();
16
+ this.currentSession = null;
17
+ this.marks = /* @__PURE__ */ new Map();
18
+ }
19
+ /**
20
+ * Start a profiling session
21
+ */
22
+ start(name = "default") {
23
+ if (!this.options.enabled) {
24
+ return null;
25
+ }
26
+ if (this.options.sampleRate < 1 && Math.random() > this.options.sampleRate) {
27
+ return null;
28
+ }
29
+ const session = {
30
+ id: this.generateId(),
31
+ name,
32
+ startTime: Date.now(),
33
+ measurements: [],
34
+ marks: [],
35
+ active: true
36
+ };
37
+ this.sessions.set(session.id, session);
38
+ this.currentSession = session;
39
+ if (typeof performance !== "undefined" && performance.mark) {
40
+ performance.mark(`coherent-session-start-${session.id}`);
41
+ }
42
+ return session.id;
43
+ }
44
+ /**
45
+ * Stop a profiling session
46
+ */
47
+ stop(sessionId) {
48
+ if (!sessionId) {
49
+ return null;
50
+ }
51
+ const session = this.sessions.get(sessionId);
52
+ if (!session) {
53
+ return null;
54
+ }
55
+ session.endTime = Date.now();
56
+ session.duration = session.endTime - session.startTime;
57
+ session.active = false;
58
+ if (typeof performance !== "undefined" && performance.mark) {
59
+ performance.mark(`coherent-session-end-${session.id}`);
60
+ }
61
+ if (this.currentSession === session) {
62
+ this.currentSession = null;
63
+ }
64
+ this.measurements.push(session);
65
+ if (this.measurements.length > this.options.maxSamples) {
66
+ this.measurements.shift();
67
+ }
68
+ return this.analyzeSession(session);
69
+ }
70
+ /**
71
+ * Start measuring a render
72
+ */
73
+ startRender(componentName, props = {}) {
74
+ if (!this.options.enabled) return null;
75
+ if (Math.random() > this.options.sampleRate) return null;
76
+ const measurementId = this.generateId();
77
+ const measurement = {
78
+ id: measurementId,
79
+ componentName,
80
+ props,
81
+ startTime: Date.now(),
82
+ startMemory: this.getMemoryUsage(),
83
+ phase: "render"
84
+ };
85
+ this.marks.set(measurementId, measurement);
86
+ if (typeof performance !== "undefined" && performance.mark) {
87
+ performance.mark(`coherent-render-start-${measurementId}`);
88
+ }
89
+ return measurementId;
90
+ }
91
+ /**
92
+ * End measuring a render
93
+ */
94
+ endRender(measurementId, result = {}) {
95
+ if (!measurementId || !this.marks.has(measurementId)) return null;
96
+ const measurement = this.marks.get(measurementId);
97
+ measurement.endTime = Date.now();
98
+ measurement.duration = measurement.endTime - measurement.startTime;
99
+ measurement.endMemory = this.getMemoryUsage();
100
+ measurement.memoryDelta = measurement.endMemory - measurement.startMemory;
101
+ measurement.result = result;
102
+ measurement.slow = measurement.duration > this.options.slowThreshold;
103
+ if (typeof performance !== "undefined" && performance.mark) {
104
+ performance.mark(`coherent-render-end-${measurementId}`);
105
+ if (performance.measure) {
106
+ try {
107
+ performance.measure(
108
+ `coherent-render-${measurementId}`,
109
+ `coherent-render-start-${measurementId}`,
110
+ `coherent-render-end-${measurementId}`
111
+ );
112
+ } catch {
113
+ }
114
+ }
115
+ }
116
+ this.measurements.push(measurement);
117
+ if (this.currentSession) {
118
+ this.currentSession.measurements.push(measurement);
119
+ }
120
+ this.marks.delete(measurementId);
121
+ return measurement;
122
+ }
123
+ /**
124
+ * Mark a point in time
125
+ */
126
+ mark(name, data = {}) {
127
+ const mark = {
128
+ name,
129
+ timestamp: Date.now(),
130
+ data,
131
+ memory: this.getMemoryUsage()
132
+ };
133
+ if (this.currentSession) {
134
+ this.currentSession.marks.push(mark);
135
+ }
136
+ if (typeof performance !== "undefined" && performance.mark) {
137
+ performance.mark(`coherent-mark-${name}`);
138
+ }
139
+ return mark;
140
+ }
141
+ /**
142
+ * Measure time between two marks
143
+ */
144
+ measure(startMark, endMark) {
145
+ const start = this.findMark(startMark);
146
+ const end = this.findMark(endMark);
147
+ if (!start || !end) {
148
+ throw new Error("Mark not found");
149
+ }
150
+ return {
151
+ duration: end.timestamp - start.timestamp,
152
+ startMark: start.name,
153
+ endMark: end.name
154
+ };
155
+ }
156
+ /**
157
+ * Get memory usage
158
+ */
159
+ getMemoryUsage() {
160
+ if (typeof performance !== "undefined" && performance.memory) {
161
+ return {
162
+ used: performance.memory.usedJSHeapSize,
163
+ total: performance.memory.totalJSHeapSize,
164
+ limit: performance.memory.jsHeapSizeLimit
165
+ };
166
+ }
167
+ return null;
168
+ }
169
+ /**
170
+ * Find a mark by name
171
+ */
172
+ findMark(name) {
173
+ if (!this.currentSession) return null;
174
+ return this.currentSession.marks.find((m) => m.name === name);
175
+ }
176
+ /**
177
+ * Get all measurements
178
+ */
179
+ getMeasurements(filter = {}) {
180
+ let results = [...this.measurements];
181
+ if (filter.componentName) {
182
+ results = results.filter((m) => m.componentName === filter.componentName);
183
+ }
184
+ if (filter.slow) {
185
+ results = results.filter((m) => m.slow);
186
+ }
187
+ if (filter.minDuration) {
188
+ results = results.filter((m) => m.duration >= filter.minDuration);
189
+ }
190
+ if (filter.limit) {
191
+ results = results.slice(0, filter.limit);
192
+ }
193
+ return results;
194
+ }
195
+ /**
196
+ * Analyze a session
197
+ */
198
+ analyzeSession(session) {
199
+ const measurements = session.measurements;
200
+ if (measurements.length === 0) {
201
+ return {
202
+ session: session.id,
203
+ duration: session.duration,
204
+ measurements: 0,
205
+ analysis: null
206
+ };
207
+ }
208
+ const durations = measurements.map((m) => m.duration);
209
+ const sorted = [...durations].sort((a, b) => a - b);
210
+ return {
211
+ session: session.id,
212
+ name: session.name,
213
+ duration: session.duration,
214
+ measurements: measurements.length,
215
+ analysis: {
216
+ total: durations.reduce((a, b) => a + b, 0),
217
+ average: durations.reduce((a, b) => a + b, 0) / durations.length,
218
+ median: sorted[Math.floor(sorted.length / 2)],
219
+ min: Math.min(...durations),
220
+ max: Math.max(...durations),
221
+ p95: sorted[Math.floor(sorted.length * 0.95)],
222
+ p99: sorted[Math.floor(sorted.length * 0.99)],
223
+ slowRenders: measurements.filter((m) => m.slow).length,
224
+ slowPercentage: measurements.filter((m) => m.slow).length / measurements.length * 100
225
+ },
226
+ byComponent: this.groupByComponent(measurements),
227
+ slowest: measurements.sort((a, b) => b.duration - a.duration).slice(0, 10).map((m) => ({
228
+ component: m.componentName,
229
+ duration: m.duration,
230
+ timestamp: m.startTime
231
+ }))
232
+ };
233
+ }
234
+ /**
235
+ * Group measurements by component
236
+ */
237
+ groupByComponent(measurements) {
238
+ const groups = {};
239
+ measurements.forEach((m) => {
240
+ if (!groups[m.componentName]) {
241
+ groups[m.componentName] = {
242
+ count: 0,
243
+ totalDuration: 0,
244
+ durations: []
245
+ };
246
+ }
247
+ groups[m.componentName].count++;
248
+ groups[m.componentName].totalDuration += m.duration;
249
+ groups[m.componentName].durations.push(m.duration);
250
+ });
251
+ Object.keys(groups).forEach((name) => {
252
+ const group = groups[name];
253
+ group.average = group.totalDuration / group.count;
254
+ group.min = Math.min(...group.durations);
255
+ group.max = Math.max(...group.durations);
256
+ });
257
+ return groups;
258
+ }
259
+ /**
260
+ * Get performance summary
261
+ */
262
+ getSummary() {
263
+ const allMeasurements = this.measurements;
264
+ if (allMeasurements.length === 0) {
265
+ return {
266
+ totalMeasurements: 0,
267
+ totalSessions: this.sessions.size,
268
+ analysis: null
269
+ };
270
+ }
271
+ const durations = allMeasurements.map((m) => m.duration);
272
+ return {
273
+ totalMeasurements: allMeasurements.length,
274
+ totalSessions: this.sessions.size,
275
+ slowRenders: allMeasurements.filter((m) => m.slow).length,
276
+ analysis: {
277
+ average: durations.reduce((a, b) => a + b, 0) / durations.length,
278
+ min: Math.min(...durations),
279
+ max: Math.max(...durations),
280
+ slowPercentage: allMeasurements.filter((m) => m.slow).length / allMeasurements.length * 100
281
+ },
282
+ byComponent: this.groupByComponent(allMeasurements),
283
+ recentSlow: allMeasurements.filter((m) => m.slow).slice(-10).map((m) => ({
284
+ component: m.componentName,
285
+ duration: m.duration,
286
+ timestamp: m.startTime
287
+ }))
288
+ };
289
+ }
290
+ /**
291
+ * Get statistics
292
+ */
293
+ getStatistics() {
294
+ if (this.measurements.length === 0) {
295
+ return { mean: 0, median: 0, min: 0, max: 0, stdDev: 0 };
296
+ }
297
+ const durations = this.measurements.map((m) => m.duration);
298
+ const sum = durations.reduce((a, b) => a + b, 0);
299
+ const mean = sum / durations.length;
300
+ const sorted = [...durations].sort((a, b) => a - b);
301
+ const median = sorted[Math.floor(sorted.length / 2)];
302
+ const variance = durations.reduce((acc, val) => acc + Math.pow(val - mean, 2), 0) / durations.length;
303
+ const stdDev = Math.sqrt(variance);
304
+ return {
305
+ mean,
306
+ median,
307
+ min: Math.min(...durations),
308
+ max: Math.max(...durations),
309
+ stdDev
310
+ };
311
+ }
312
+ /**
313
+ * Get bottlenecks
314
+ */
315
+ getBottlenecks(threshold = null) {
316
+ const slowThreshold = threshold || this.options.slowThreshold;
317
+ return this.measurements.filter((m) => m.duration > slowThreshold).sort((a, b) => b.duration - a.duration).map((m) => ({
318
+ name: m.name,
319
+ duration: m.duration,
320
+ timestamp: m.startTime
321
+ }));
322
+ }
323
+ /**
324
+ * Get metrics
325
+ */
326
+ getMetrics() {
327
+ const operationCounts = {};
328
+ this.measurements.forEach((m) => {
329
+ operationCounts[m.name] = (operationCounts[m.name] || 0) + 1;
330
+ });
331
+ const totalDuration = this.measurements.reduce((sum, m) => sum + m.duration, 0);
332
+ return {
333
+ totalOperations: this.measurements.length,
334
+ totalDuration,
335
+ operationCounts,
336
+ averageDuration: this.measurements.length > 0 ? totalDuration / this.measurements.length : 0,
337
+ memoryUsage: this.options.trackMemory && typeof performance !== "undefined" && performance.memory ? performance.memory.usedJSHeapSize : null
338
+ };
339
+ }
340
+ /**
341
+ * Generate report
342
+ */
343
+ generateReport() {
344
+ const stats = this.getStatistics();
345
+ const metrics = this.getMetrics();
346
+ const bottlenecks = this.getBottlenecks();
347
+ const recommendations = this.getRecommendations();
348
+ return {
349
+ summary: {
350
+ totalOperations: metrics.totalOperations,
351
+ averageDuration: metrics.averageDuration,
352
+ slowOperations: bottlenecks.length
353
+ },
354
+ statistics: stats,
355
+ operations: this.measurements.map((m) => ({
356
+ name: m.name,
357
+ duration: m.duration,
358
+ timestamp: m.startTime
359
+ })),
360
+ bottlenecks: bottlenecks.slice(0, 10),
361
+ recommendations,
362
+ timestamp: Date.now()
363
+ };
364
+ }
365
+ /**
366
+ * Export profiling data
367
+ */
368
+ export() {
369
+ return {
370
+ sessions: Array.from(this.sessions.values()),
371
+ measurements: this.measurements,
372
+ metrics: this.getMetrics(),
373
+ statistics: this.getStatistics(),
374
+ exportedAt: Date.now()
375
+ };
376
+ }
377
+ /**
378
+ * Format metrics for display
379
+ */
380
+ formatMetrics() {
381
+ const metrics = this.getMetrics();
382
+ const stats = this.getStatistics();
383
+ let output = `Performance Metrics
384
+ `;
385
+ output += `==================
386
+ `;
387
+ output += `Total Operations: ${metrics.totalOperations}
388
+ `;
389
+ output += `Average Duration: ${metrics.averageDuration.toFixed(2)}ms
390
+ `;
391
+ output += `Mean: ${stats.mean.toFixed(2)}ms
392
+ `;
393
+ output += `Median: ${stats.median.toFixed(2)}ms
394
+ `;
395
+ output += `Min: ${stats.min.toFixed(2)}ms
396
+ `;
397
+ output += `Max: ${stats.max.toFixed(2)}ms
398
+ `;
399
+ return output;
400
+ }
401
+ /**
402
+ * Compare two profiles
403
+ */
404
+ compare(profileId1, profileId2) {
405
+ const session1 = this.sessions.get(profileId1);
406
+ const session2 = this.sessions.get(profileId2);
407
+ if (!session1 || !session2) {
408
+ return null;
409
+ }
410
+ return {
411
+ difference: session2.duration - session1.duration,
412
+ percentChange: (session2.duration - session1.duration) / session1.duration * 100,
413
+ profile1: { name: session1.name, duration: session1.duration },
414
+ profile2: { name: session2.name, duration: session2.duration }
415
+ };
416
+ }
417
+ /**
418
+ * Get performance recommendations
419
+ */
420
+ getRecommendations() {
421
+ const recommendations = [];
422
+ const bottlenecks = this.getBottlenecks();
423
+ const stats = this.getStatistics();
424
+ if (bottlenecks.length > 0) {
425
+ bottlenecks.slice(0, 5).forEach((bottleneck) => {
426
+ recommendations.push({
427
+ type: "bottleneck",
428
+ operation: bottleneck.name,
429
+ suggestion: `Optimize ${bottleneck.name} - duration: ${bottleneck.duration.toFixed(2)}ms exceeds threshold`,
430
+ severity: "high",
431
+ message: `Found slow operation exceeding ${this.options.slowThreshold}ms`
432
+ });
433
+ });
434
+ }
435
+ if (stats.max > this.options.slowThreshold * 2) {
436
+ recommendations.push({
437
+ type: "performance",
438
+ operation: "general",
439
+ suggestion: `Review operations with high duration`,
440
+ message: `Maximum duration (${stats.max.toFixed(2)}ms) is significantly high`,
441
+ severity: "medium"
442
+ });
443
+ }
444
+ return recommendations;
445
+ }
446
+ /**
447
+ * Clear all data
448
+ */
449
+ clear() {
450
+ this.measurements = [];
451
+ this.sessions.clear();
452
+ this.currentSession = null;
453
+ this.marks.clear();
454
+ }
455
+ /**
456
+ * Enable profiler
457
+ */
458
+ enable() {
459
+ this.options.enabled = true;
460
+ }
461
+ /**
462
+ * Disable profiler
463
+ */
464
+ disable() {
465
+ this.options.enabled = false;
466
+ }
467
+ /**
468
+ * Generate unique ID
469
+ */
470
+ generateId() {
471
+ return `prof-${Date.now()}-${Math.random().toString(36).substring(7)}`;
472
+ }
473
+ };
474
+ function createProfiler(options = {}) {
475
+ return new PerformanceProfiler(options);
476
+ }
477
+ async function measure(name, fn, profiler = null) {
478
+ const prof = profiler || new PerformanceProfiler();
479
+ const sessionId = prof.start(name);
480
+ try {
481
+ const value = await fn();
482
+ const result = prof.stop(sessionId);
483
+ return { value, duration: result?.duration || 0 };
484
+ } catch (error) {
485
+ const result = prof.stop(sessionId);
486
+ throw { error, duration: result?.duration || 0 };
487
+ }
488
+ }
489
+ function profile(fn) {
490
+ return function(...args) {
491
+ const result = fn(...args);
492
+ return result;
493
+ };
494
+ }
495
+ var profiler_default = {
496
+ PerformanceProfiler,
497
+ createProfiler,
498
+ measure,
499
+ profile
500
+ };
501
+ export {
502
+ PerformanceProfiler,
503
+ createProfiler,
504
+ profiler_default as default,
505
+ measure,
506
+ profile
507
+ };
508
+ //# sourceMappingURL=profiler.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/profiler.js"],
4
+ "sourcesContent": ["/**\n * Coherent.js Performance Profiler\n * \n * Tracks and analyzes rendering performance\n * \n * @module devtools/profiler\n */\n\n/**\n * Performance Profiler\n * Measures and analyzes component rendering performance\n */\nexport class PerformanceProfiler {\n constructor(options = {}) {\n this.options = {\n enabled: true,\n sampleRate: 1.0, // 1.0 = 100% sampling\n slowThreshold: 16, // 16ms = 60fps\n trackMemory: typeof performance !== 'undefined' && performance.memory,\n maxSamples: options.maxSamples || 1000,\n ...options\n };\n \n this.measurements = [];\n this.sessions = new Map();\n this.currentSession = null;\n this.marks = new Map();\n }\n\n /**\n * Start a profiling session\n */\n start(name = 'default') {\n if (!this.options.enabled) {\n return null;\n }\n\n // Apply sampling\n if (this.options.sampleRate < 1.0 && Math.random() > this.options.sampleRate) {\n return null;\n }\n\n const session = {\n id: this.generateId(),\n name,\n startTime: Date.now(),\n measurements: [],\n marks: [],\n active: true\n };\n\n this.sessions.set(session.id, session);\n this.currentSession = session;\n\n if (typeof performance !== 'undefined' && performance.mark) {\n performance.mark(`coherent-session-start-${session.id}`);\n }\n\n return session.id;\n }\n\n /**\n * Stop a profiling session\n */\n stop(sessionId) {\n if (!sessionId) {\n return null;\n }\n\n const session = this.sessions.get(sessionId);\n\n if (!session) {\n return null; // Gracefully handle non-existent sessions\n }\n\n session.endTime = Date.now();\n session.duration = session.endTime - session.startTime;\n session.active = false;\n\n if (typeof performance !== 'undefined' && performance.mark) {\n performance.mark(`coherent-session-end-${session.id}`);\n }\n\n if (this.currentSession === session) {\n this.currentSession = null;\n }\n\n // Store measurement\n this.measurements.push(session);\n \n // Limit measurements (maxSamples)\n if (this.measurements.length > this.options.maxSamples) {\n this.measurements.shift();\n }\n\n return this.analyzeSession(session);\n }\n\n /**\n * Start measuring a render\n */\n startRender(componentName, props = {}) {\n if (!this.options.enabled) return null;\n \n // Sample rate check\n if (Math.random() > this.options.sampleRate) return null;\n\n const measurementId = this.generateId();\n const measurement = {\n id: measurementId,\n componentName,\n props,\n startTime: Date.now(),\n startMemory: this.getMemoryUsage(),\n phase: 'render'\n };\n\n this.marks.set(measurementId, measurement);\n\n if (typeof performance !== 'undefined' && performance.mark) {\n performance.mark(`coherent-render-start-${measurementId}`);\n }\n\n return measurementId;\n }\n\n /**\n * End measuring a render\n */\n endRender(measurementId, result = {}) {\n if (!measurementId || !this.marks.has(measurementId)) return null;\n\n const measurement = this.marks.get(measurementId);\n measurement.endTime = Date.now();\n measurement.duration = measurement.endTime - measurement.startTime;\n measurement.endMemory = this.getMemoryUsage();\n measurement.memoryDelta = measurement.endMemory - measurement.startMemory;\n measurement.result = result;\n measurement.slow = measurement.duration > this.options.slowThreshold;\n\n if (typeof performance !== 'undefined' && performance.mark) {\n performance.mark(`coherent-render-end-${measurementId}`);\n \n if (performance.measure) {\n try {\n performance.measure(\n `coherent-render-${measurementId}`,\n `coherent-render-start-${measurementId}`,\n `coherent-render-end-${measurementId}`\n );\n } catch {\n // Ignore measure errors\n }\n }\n }\n\n // Add to measurements\n this.measurements.push(measurement);\n \n // Add to current session\n if (this.currentSession) {\n this.currentSession.measurements.push(measurement);\n }\n\n // Clean up\n this.marks.delete(measurementId);\n\n return measurement;\n }\n\n /**\n * Mark a point in time\n */\n mark(name, data = {}) {\n const mark = {\n name,\n timestamp: Date.now(),\n data,\n memory: this.getMemoryUsage()\n };\n\n if (this.currentSession) {\n this.currentSession.marks.push(mark);\n }\n\n if (typeof performance !== 'undefined' && performance.mark) {\n performance.mark(`coherent-mark-${name}`);\n }\n\n return mark;\n }\n\n /**\n * Measure time between two marks\n */\n measure(startMark, endMark) {\n const start = this.findMark(startMark);\n const end = this.findMark(endMark);\n\n if (!start || !end) {\n throw new Error('Mark not found');\n }\n\n return {\n duration: end.timestamp - start.timestamp,\n startMark: start.name,\n endMark: end.name\n };\n }\n\n /**\n * Get memory usage\n */\n getMemoryUsage() {\n if (typeof performance !== 'undefined' && performance.memory) {\n return {\n used: performance.memory.usedJSHeapSize,\n total: performance.memory.totalJSHeapSize,\n limit: performance.memory.jsHeapSizeLimit\n };\n }\n return null;\n }\n\n /**\n * Find a mark by name\n */\n findMark(name) {\n if (!this.currentSession) return null;\n return this.currentSession.marks.find(m => m.name === name);\n }\n\n /**\n * Get all measurements\n */\n getMeasurements(filter = {}) {\n let results = [...this.measurements];\n\n if (filter.componentName) {\n results = results.filter(m => m.componentName === filter.componentName);\n }\n\n if (filter.slow) {\n results = results.filter(m => m.slow);\n }\n\n if (filter.minDuration) {\n results = results.filter(m => m.duration >= filter.minDuration);\n }\n\n if (filter.limit) {\n results = results.slice(0, filter.limit);\n }\n\n return results;\n }\n\n /**\n * Analyze a session\n */\n analyzeSession(session) {\n const measurements = session.measurements;\n\n if (measurements.length === 0) {\n return {\n session: session.id,\n duration: session.duration,\n measurements: 0,\n analysis: null\n };\n }\n\n const durations = measurements.map(m => m.duration);\n const sorted = [...durations].sort((a, b) => a - b);\n\n return {\n session: session.id,\n name: session.name,\n duration: session.duration,\n measurements: measurements.length,\n analysis: {\n total: durations.reduce((a, b) => a + b, 0),\n average: durations.reduce((a, b) => a + b, 0) / durations.length,\n median: sorted[Math.floor(sorted.length / 2)],\n min: Math.min(...durations),\n max: Math.max(...durations),\n p95: sorted[Math.floor(sorted.length * 0.95)],\n p99: sorted[Math.floor(sorted.length * 0.99)],\n slowRenders: measurements.filter(m => m.slow).length,\n slowPercentage: (measurements.filter(m => m.slow).length / measurements.length) * 100\n },\n byComponent: this.groupByComponent(measurements),\n slowest: measurements\n .sort((a, b) => b.duration - a.duration)\n .slice(0, 10)\n .map(m => ({\n component: m.componentName,\n duration: m.duration,\n timestamp: m.startTime\n }))\n };\n }\n\n /**\n * Group measurements by component\n */\n groupByComponent(measurements) {\n const groups = {};\n\n measurements.forEach(m => {\n if (!groups[m.componentName]) {\n groups[m.componentName] = {\n count: 0,\n totalDuration: 0,\n durations: []\n };\n }\n\n groups[m.componentName].count++;\n groups[m.componentName].totalDuration += m.duration;\n groups[m.componentName].durations.push(m.duration);\n });\n\n // Calculate stats for each component\n Object.keys(groups).forEach(name => {\n const group = groups[name];\n group.average = group.totalDuration / group.count;\n group.min = Math.min(...group.durations);\n group.max = Math.max(...group.durations);\n });\n\n return groups;\n }\n\n /**\n * Get performance summary\n */\n getSummary() {\n const allMeasurements = this.measurements;\n\n if (allMeasurements.length === 0) {\n return {\n totalMeasurements: 0,\n totalSessions: this.sessions.size,\n analysis: null\n };\n }\n\n const durations = allMeasurements.map(m => m.duration);\n\n return {\n totalMeasurements: allMeasurements.length,\n totalSessions: this.sessions.size,\n slowRenders: allMeasurements.filter(m => m.slow).length,\n analysis: {\n average: durations.reduce((a, b) => a + b, 0) / durations.length,\n min: Math.min(...durations),\n max: Math.max(...durations),\n slowPercentage: (allMeasurements.filter(m => m.slow).length / allMeasurements.length) * 100\n },\n byComponent: this.groupByComponent(allMeasurements),\n recentSlow: allMeasurements\n .filter(m => m.slow)\n .slice(-10)\n .map(m => ({\n component: m.componentName,\n duration: m.duration,\n timestamp: m.startTime\n }))\n };\n }\n\n /**\n * Get statistics\n */\n getStatistics() {\n if (this.measurements.length === 0) {\n return { mean: 0, median: 0, min: 0, max: 0, stdDev: 0 };\n }\n\n const durations = this.measurements.map(m => m.duration);\n const sum = durations.reduce((a, b) => a + b, 0);\n const mean = sum / durations.length;\n \n const sorted = [...durations].sort((a, b) => a - b);\n const median = sorted[Math.floor(sorted.length / 2)];\n \n const variance = durations.reduce((acc, val) => acc + Math.pow(val - mean, 2), 0) / durations.length;\n const stdDev = Math.sqrt(variance);\n\n return {\n mean,\n median,\n min: Math.min(...durations),\n max: Math.max(...durations),\n stdDev\n };\n }\n\n /**\n * Get bottlenecks\n */\n getBottlenecks(threshold = null) {\n const slowThreshold = threshold || this.options.slowThreshold;\n return this.measurements\n .filter(m => m.duration > slowThreshold)\n .sort((a, b) => b.duration - a.duration)\n .map(m => ({\n name: m.name,\n duration: m.duration,\n timestamp: m.startTime\n }));\n }\n\n /**\n * Get metrics\n */\n getMetrics() {\n const operationCounts = {};\n this.measurements.forEach(m => {\n operationCounts[m.name] = (operationCounts[m.name] || 0) + 1;\n });\n\n const totalDuration = this.measurements.reduce((sum, m) => sum + m.duration, 0);\n\n return {\n totalOperations: this.measurements.length,\n totalDuration,\n operationCounts,\n averageDuration: this.measurements.length > 0 ? totalDuration / this.measurements.length : 0,\n memoryUsage: this.options.trackMemory && typeof performance !== 'undefined' && performance.memory\n ? performance.memory.usedJSHeapSize\n : null\n };\n }\n\n /**\n * Generate report\n */\n generateReport() {\n const stats = this.getStatistics();\n const metrics = this.getMetrics();\n const bottlenecks = this.getBottlenecks();\n const recommendations = this.getRecommendations();\n\n return {\n summary: {\n totalOperations: metrics.totalOperations,\n averageDuration: metrics.averageDuration,\n slowOperations: bottlenecks.length\n },\n statistics: stats,\n operations: this.measurements.map(m => ({\n name: m.name,\n duration: m.duration,\n timestamp: m.startTime\n })),\n bottlenecks: bottlenecks.slice(0, 10),\n recommendations,\n timestamp: Date.now()\n };\n }\n\n /**\n * Export profiling data\n */\n export() {\n return {\n sessions: Array.from(this.sessions.values()),\n measurements: this.measurements,\n metrics: this.getMetrics(),\n statistics: this.getStatistics(),\n exportedAt: Date.now()\n };\n }\n\n /**\n * Format metrics for display\n */\n formatMetrics() {\n const metrics = this.getMetrics();\n const stats = this.getStatistics();\n \n let output = `Performance Metrics\\n`;\n output += `==================\\n`;\n output += `Total Operations: ${metrics.totalOperations}\\n`;\n output += `Average Duration: ${metrics.averageDuration.toFixed(2)}ms\\n`;\n output += `Mean: ${stats.mean.toFixed(2)}ms\\n`;\n output += `Median: ${stats.median.toFixed(2)}ms\\n`;\n output += `Min: ${stats.min.toFixed(2)}ms\\n`;\n output += `Max: ${stats.max.toFixed(2)}ms\\n`;\n \n return output;\n }\n\n /**\n * Compare two profiles\n */\n compare(profileId1, profileId2) {\n const session1 = this.sessions.get(profileId1);\n const session2 = this.sessions.get(profileId2);\n\n if (!session1 || !session2) {\n return null;\n }\n\n return {\n difference: session2.duration - session1.duration,\n percentChange: ((session2.duration - session1.duration) / session1.duration) * 100,\n profile1: { name: session1.name, duration: session1.duration },\n profile2: { name: session2.name, duration: session2.duration }\n };\n }\n\n /**\n * Get performance recommendations\n */\n getRecommendations() {\n const recommendations = [];\n const bottlenecks = this.getBottlenecks();\n const stats = this.getStatistics();\n\n if (bottlenecks.length > 0) {\n bottlenecks.slice(0, 5).forEach(bottleneck => {\n recommendations.push({\n type: 'bottleneck',\n operation: bottleneck.name,\n suggestion: `Optimize ${bottleneck.name} - duration: ${bottleneck.duration.toFixed(2)}ms exceeds threshold`,\n severity: 'high',\n message: `Found slow operation exceeding ${this.options.slowThreshold}ms`\n });\n });\n }\n\n if (stats.max > this.options.slowThreshold * 2) {\n recommendations.push({\n type: 'performance',\n operation: 'general',\n suggestion: `Review operations with high duration`,\n message: `Maximum duration (${stats.max.toFixed(2)}ms) is significantly high`,\n severity: 'medium'\n });\n }\n\n return recommendations;\n }\n\n /**\n * Clear all data\n */\n clear() {\n this.measurements = [];\n this.sessions.clear();\n this.currentSession = null;\n this.marks.clear();\n }\n\n /**\n * Enable profiler\n */\n enable() {\n this.options.enabled = true;\n }\n\n /**\n * Disable profiler\n */\n disable() {\n this.options.enabled = false;\n }\n\n /**\n * Generate unique ID\n */\n generateId() {\n return `prof-${Date.now()}-${Math.random().toString(36).substring(7)}`;\n }\n}\n\n/**\n * Create a performance profiler\n */\nexport function createProfiler(options = {}) {\n return new PerformanceProfiler(options);\n}\n\n/**\n * Measure a function execution\n */\nexport async function measure(name, fn, profiler = null) {\n const prof = profiler || new PerformanceProfiler();\n const sessionId = prof.start(name);\n \n try {\n const value = await fn();\n const result = prof.stop(sessionId);\n return { value, duration: result?.duration || 0 };\n } catch (error) {\n const result = prof.stop(sessionId);\n throw { error, duration: result?.duration || 0 };\n }\n}\n\n/**\n * Create a profiling decorator\n */\nexport function profile(fn) {\n return function(...args) {\n const result = fn(...args);\n return result;\n };\n}\n\nexport default {\n PerformanceProfiler,\n createProfiler,\n measure,\n profile\n};\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }
package/package.json ADDED
@@ -0,0 +1,43 @@
1
+ {
2
+ "name": "@coherent.js/devtools",
3
+ "version": "1.0.0-beta.2",
4
+ "description": "Developer tools for Coherent.js applications",
5
+ "type": "module",
6
+ "main": "./dist/index.js",
7
+ "types": "./types/index.d.ts",
8
+ "exports": {
9
+ ".": "./dist/index.js",
10
+ "./inspector": "./dist/inspector.js",
11
+ "./profiler": "./dist/profiler.js",
12
+ "./logger": "./dist/logger.js"
13
+ },
14
+ "files": [
15
+ "dist/",
16
+ "types/",
17
+ "README.md",
18
+ "LICENSE"
19
+ ],
20
+ "keywords": [
21
+ "coherent",
22
+ "devtools",
23
+ "debugging",
24
+ "profiling",
25
+ "inspector"
26
+ ],
27
+ "author": "Coherent.js Team",
28
+ "license": "MIT",
29
+ "peerDependencies": {
30
+ "@coherent.js/core": "1.0.0-beta.2"
31
+ },
32
+ "repository": {
33
+ "type": "git",
34
+ "url": "git+https://github.com/Tomdrouv1/coherent.js.git"
35
+ },
36
+ "publishConfig": {
37
+ "access": "public"
38
+ },
39
+ "scripts": {
40
+ "build": "node build.mjs",
41
+ "clean": "rm -rf dist"
42
+ }
43
+ }