esm-imports-analyzer 0.1.0

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.
Files changed (48) hide show
  1. package/README.md +113 -0
  2. package/dist/analysis/cycle-detector.d.ts +3 -0
  3. package/dist/analysis/cycle-detector.d.ts.map +1 -0
  4. package/dist/analysis/cycle-detector.js +111 -0
  5. package/dist/analysis/cycle-detector.js.map +1 -0
  6. package/dist/analysis/folder-tree.d.ts +3 -0
  7. package/dist/analysis/folder-tree.d.ts.map +1 -0
  8. package/dist/analysis/folder-tree.js +141 -0
  9. package/dist/analysis/folder-tree.js.map +1 -0
  10. package/dist/analysis/grouper.d.ts +4 -0
  11. package/dist/analysis/grouper.d.ts.map +1 -0
  12. package/dist/analysis/grouper.js +156 -0
  13. package/dist/analysis/grouper.js.map +1 -0
  14. package/dist/analysis/timing.d.ts +9 -0
  15. package/dist/analysis/timing.d.ts.map +1 -0
  16. package/dist/analysis/timing.js +37 -0
  17. package/dist/analysis/timing.js.map +1 -0
  18. package/dist/analysis/tree-builder.d.ts +3 -0
  19. package/dist/analysis/tree-builder.d.ts.map +1 -0
  20. package/dist/analysis/tree-builder.js +47 -0
  21. package/dist/analysis/tree-builder.js.map +1 -0
  22. package/dist/cli.d.ts +3 -0
  23. package/dist/cli.d.ts.map +1 -0
  24. package/dist/cli.js +184 -0
  25. package/dist/cli.js.map +1 -0
  26. package/dist/loader/hooks.d.ts +4 -0
  27. package/dist/loader/hooks.d.ts.map +1 -0
  28. package/dist/loader/hooks.js +79 -0
  29. package/dist/loader/hooks.js.map +1 -0
  30. package/dist/loader/register.d.ts +2 -0
  31. package/dist/loader/register.d.ts.map +1 -0
  32. package/dist/loader/register.js +35 -0
  33. package/dist/loader/register.js.map +1 -0
  34. package/dist/report/generator.d.ts +3 -0
  35. package/dist/report/generator.d.ts.map +1 -0
  36. package/dist/report/generator.js +50 -0
  37. package/dist/report/generator.js.map +1 -0
  38. package/dist/report/template.html +146 -0
  39. package/dist/report/ui/cycles-panel.js +80 -0
  40. package/dist/report/ui/filters.js +13 -0
  41. package/dist/report/ui/graph.js +1310 -0
  42. package/dist/report/ui/styles.css +531 -0
  43. package/dist/report/ui/table.js +209 -0
  44. package/dist/types.d.ts +47 -0
  45. package/dist/types.d.ts.map +1 -0
  46. package/dist/types.js +2 -0
  47. package/dist/types.js.map +1 -0
  48. package/package.json +33 -0
@@ -0,0 +1,531 @@
1
+ :root {
2
+ --bg-primary: #1e1e2e;
3
+ --bg-secondary: #282839;
4
+ --bg-tertiary: #313147;
5
+ --text-primary: #cdd6f4;
6
+ --text-secondary: #a6adc8;
7
+ --text-muted: #6c7086;
8
+ --accent: #89b4fa;
9
+ --accent-hover: #74c7ec;
10
+ --border: #45475a;
11
+ --success: #a6e3a1;
12
+ --warning: #f9e2af;
13
+ --danger: #f38ba8;
14
+ --cycle-highlight: #fab387;
15
+ --timing-fast: #a6e3a1;
16
+ --timing-medium: #f9e2af;
17
+ --timing-slow: #f38ba8;
18
+ --font-mono: 'SF Mono', 'Cascadia Code', 'Fira Code', Consolas, monospace;
19
+ --font-sans: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
20
+ }
21
+
22
+ * {
23
+ margin: 0;
24
+ padding: 0;
25
+ box-sizing: border-box;
26
+ }
27
+
28
+ body {
29
+ font-family: var(--font-sans);
30
+ background: var(--bg-primary);
31
+ color: var(--text-primary);
32
+ overflow: hidden;
33
+ height: 100vh;
34
+ }
35
+
36
+ /* Header */
37
+ .header {
38
+ display: flex;
39
+ align-items: center;
40
+ justify-content: space-between;
41
+ padding: 8px 16px;
42
+ background: var(--bg-secondary);
43
+ border-bottom: 1px solid var(--border);
44
+ height: 48px;
45
+ }
46
+
47
+ .header h1 {
48
+ font-size: 14px;
49
+ font-weight: 600;
50
+ color: var(--text-primary);
51
+ }
52
+
53
+ .header-meta {
54
+ font-size: 12px;
55
+ color: var(--text-secondary);
56
+ font-family: var(--font-mono);
57
+ display: flex;
58
+ align-items: center;
59
+ gap: 6px;
60
+ }
61
+
62
+ .timing-note {
63
+ cursor: help;
64
+ color: var(--text-muted);
65
+ font-size: 14px;
66
+ }
67
+
68
+ .header-controls {
69
+ display: flex;
70
+ align-items: center;
71
+ gap: 12px;
72
+ }
73
+
74
+ /* Filters */
75
+ .filter-group {
76
+ display: flex;
77
+ align-items: center;
78
+ gap: 8px;
79
+ }
80
+
81
+ .filter-group label {
82
+ font-size: 12px;
83
+ color: var(--text-secondary);
84
+ cursor: pointer;
85
+ display: flex;
86
+ align-items: center;
87
+ gap: 4px;
88
+ }
89
+
90
+ .filter-group input[type="checkbox"] {
91
+ accent-color: var(--accent);
92
+ }
93
+
94
+ .relayout-btn {
95
+ background: var(--bg-tertiary);
96
+ border: 1px solid var(--border);
97
+ border-radius: 4px;
98
+ padding: 4px 10px;
99
+ color: var(--text-secondary);
100
+ font-size: 12px;
101
+ cursor: pointer;
102
+ }
103
+
104
+ .relayout-btn:hover {
105
+ background: var(--border);
106
+ color: var(--text-primary);
107
+ }
108
+
109
+ .search-input {
110
+ background: var(--bg-tertiary);
111
+ border: 1px solid var(--border);
112
+ border-radius: 4px;
113
+ padding: 4px 8px;
114
+ color: var(--text-primary);
115
+ font-size: 12px;
116
+ font-family: var(--font-mono);
117
+ width: 200px;
118
+ outline: none;
119
+ }
120
+
121
+ .search-input:focus {
122
+ border-color: var(--accent);
123
+ }
124
+
125
+ /* Main layout */
126
+ .main-container {
127
+ display: flex;
128
+ height: calc(100vh - 48px);
129
+ }
130
+
131
+ /* Cycles panel */
132
+ .cycles-panel {
133
+ width: 280px;
134
+ min-width: 200px;
135
+ background: var(--bg-secondary);
136
+ border-right: 1px solid var(--border);
137
+ display: flex;
138
+ flex-direction: column;
139
+ overflow: hidden;
140
+ }
141
+
142
+ .cycles-header {
143
+ display: flex;
144
+ align-items: center;
145
+ padding: 8px 12px;
146
+ border-bottom: 1px solid var(--border);
147
+ }
148
+
149
+ .cycles-header h2 {
150
+ font-size: 12px;
151
+ font-weight: 600;
152
+ text-transform: uppercase;
153
+ letter-spacing: 0.5px;
154
+ color: var(--text-secondary);
155
+ }
156
+
157
+ .cycles-list {
158
+ overflow-y: auto;
159
+ flex: 1;
160
+ padding: 8px;
161
+ }
162
+
163
+ .cycle-item {
164
+ padding: 8px;
165
+ margin-bottom: 4px;
166
+ border-radius: 4px;
167
+ cursor: pointer;
168
+ font-size: 12px;
169
+ border: 1px solid transparent;
170
+ transition: background 0.15s;
171
+ }
172
+
173
+ .cycle-item:hover {
174
+ background: var(--bg-tertiary);
175
+ }
176
+
177
+ .cycle-item.active {
178
+ background: var(--bg-tertiary);
179
+ border-color: var(--cycle-highlight);
180
+ }
181
+
182
+ .cycle-item-header {
183
+ display: flex;
184
+ align-items: center;
185
+ justify-content: space-between;
186
+ }
187
+
188
+ .cycle-item .cycle-length {
189
+ color: var(--cycle-highlight);
190
+ font-weight: 600;
191
+ font-family: var(--font-mono);
192
+ }
193
+
194
+ .cycle-copy-btn {
195
+ background: none;
196
+ border: none;
197
+ color: var(--text-muted);
198
+ cursor: pointer;
199
+ font-size: 13px;
200
+ padding: 0 2px;
201
+ line-height: 1;
202
+ opacity: 0;
203
+ transition: opacity 0.15s;
204
+ }
205
+
206
+ .cycle-item:hover .cycle-copy-btn {
207
+ opacity: 1;
208
+ }
209
+
210
+ .cycle-copy-btn:hover {
211
+ color: var(--text-primary);
212
+ }
213
+
214
+ .cycle-item .cycle-modules {
215
+ color: var(--text-muted);
216
+ font-family: var(--font-mono);
217
+ font-size: 11px;
218
+ margin-top: 4px;
219
+ line-height: 1.4;
220
+ }
221
+
222
+ .clear-highlight-btn {
223
+ display: block;
224
+ width: calc(100% - 16px);
225
+ margin: 8px;
226
+ padding: 6px;
227
+ background: var(--bg-tertiary);
228
+ border: 1px solid var(--border);
229
+ border-radius: 4px;
230
+ color: var(--text-secondary);
231
+ font-size: 11px;
232
+ cursor: pointer;
233
+ text-align: center;
234
+ }
235
+
236
+ .clear-highlight-btn:hover {
237
+ background: var(--border);
238
+ }
239
+
240
+ .no-cycles {
241
+ padding: 16px;
242
+ text-align: center;
243
+ color: var(--text-muted);
244
+ font-size: 12px;
245
+ }
246
+
247
+ /* Center area (graph + table) */
248
+ .center-area {
249
+ flex: 1;
250
+ display: flex;
251
+ flex-direction: column;
252
+ overflow: hidden;
253
+ }
254
+
255
+ /* Graph */
256
+ .graph-container {
257
+ flex: 1;
258
+ position: relative;
259
+ min-height: 200px;
260
+ }
261
+
262
+ #cy {
263
+ width: 100%;
264
+ height: 100%;
265
+ }
266
+
267
+ /* Layout overlay */
268
+ .layout-overlay {
269
+ position: absolute;
270
+ inset: 0;
271
+ background: rgba(30, 30, 46, 0.85);
272
+ display: flex;
273
+ align-items: center;
274
+ justify-content: center;
275
+ z-index: 200;
276
+ transition: opacity 0.2s;
277
+ }
278
+
279
+ .layout-overlay.hidden {
280
+ opacity: 0;
281
+ pointer-events: none;
282
+ }
283
+
284
+ .layout-overlay-content {
285
+ display: flex;
286
+ flex-direction: column;
287
+ align-items: center;
288
+ gap: 12px;
289
+ color: var(--text-secondary);
290
+ font-size: 13px;
291
+ }
292
+
293
+ .layout-spinner {
294
+ width: 28px;
295
+ height: 28px;
296
+ border: 3px solid var(--border);
297
+ border-top-color: var(--accent);
298
+ border-radius: 50%;
299
+ animation: spin 0.8s linear infinite;
300
+ }
301
+
302
+ @keyframes spin {
303
+ to { transform: rotate(360deg); }
304
+ }
305
+
306
+ .graph-tooltip {
307
+ position: absolute;
308
+ background: var(--bg-tertiary);
309
+ border: 1px solid var(--border);
310
+ border-radius: 4px;
311
+ padding: 8px 12px;
312
+ font-size: 11px;
313
+ font-family: var(--font-mono);
314
+ color: var(--text-primary);
315
+ pointer-events: none;
316
+ z-index: 100;
317
+ max-width: 400px;
318
+ display: none;
319
+ }
320
+
321
+ .graph-tooltip .tooltip-path {
322
+ color: var(--text-secondary);
323
+ word-break: break-all;
324
+ }
325
+
326
+ .graph-tooltip .tooltip-time {
327
+ color: var(--warning);
328
+ margin-top: 2px;
329
+ }
330
+
331
+ /* Resize handle */
332
+ .resize-handle {
333
+ height: 4px;
334
+ background: var(--border);
335
+ cursor: row-resize;
336
+ flex-shrink: 0;
337
+ }
338
+
339
+ .resize-handle:hover {
340
+ background: var(--accent);
341
+ }
342
+
343
+ /* Table */
344
+ .table-container {
345
+ height: 300px;
346
+ min-height: 100px;
347
+ background: var(--bg-secondary);
348
+ border-top: 1px solid var(--border);
349
+ display: flex;
350
+ flex-direction: column;
351
+ overflow: hidden;
352
+ }
353
+
354
+ .table-title-row {
355
+ display: flex;
356
+ align-items: center;
357
+ justify-content: space-between;
358
+ padding: 6px 16px;
359
+ background: var(--bg-secondary);
360
+ border-bottom: 1px solid var(--border);
361
+ }
362
+
363
+ .table-title {
364
+ font-size: 12px;
365
+ font-weight: 600;
366
+ text-transform: uppercase;
367
+ letter-spacing: 0.5px;
368
+ color: var(--text-secondary);
369
+ }
370
+
371
+ .table-count-control {
372
+ font-size: 11px;
373
+ color: var(--text-muted);
374
+ display: flex;
375
+ align-items: center;
376
+ gap: 4px;
377
+ }
378
+
379
+ .table-count-control input {
380
+ background: var(--bg-tertiary);
381
+ border: 1px solid var(--border);
382
+ border-radius: 3px;
383
+ padding: 2px 6px;
384
+ color: var(--text-primary);
385
+ font-size: 11px;
386
+ font-family: var(--font-mono);
387
+ width: 50px;
388
+ text-align: right;
389
+ outline: none;
390
+ }
391
+
392
+ .table-count-control input:focus {
393
+ border-color: var(--accent);
394
+ }
395
+
396
+ .table-header-row {
397
+ display: flex;
398
+ padding: 6px 16px;
399
+ background: var(--bg-tertiary);
400
+ border-bottom: 1px solid var(--border);
401
+ font-size: 11px;
402
+ font-weight: 600;
403
+ text-transform: uppercase;
404
+ letter-spacing: 0.5px;
405
+ color: var(--text-secondary);
406
+ cursor: pointer;
407
+ user-select: none;
408
+ }
409
+
410
+ .table-header-row span {
411
+ display: flex;
412
+ align-items: center;
413
+ gap: 4px;
414
+ white-space: nowrap;
415
+ }
416
+
417
+ .table-header-row span:hover {
418
+ color: var(--text-primary);
419
+ }
420
+
421
+ .col-module { flex: 1; }
422
+ .col-time { width: 90px; text-align: right; justify-content: flex-end; font-family: var(--font-mono); }
423
+ .col-imports { width: 80px; text-align: right; justify-content: flex-end; font-family: var(--font-mono); }
424
+
425
+ .header-info-icon {
426
+ cursor: help;
427
+ color: var(--text-muted);
428
+ font-size: 12px;
429
+ }
430
+
431
+ .table-body {
432
+ overflow-y: auto;
433
+ flex: 1;
434
+ }
435
+
436
+ .table-row {
437
+ display: flex;
438
+ padding: 4px 16px;
439
+ font-size: 12px;
440
+ border-bottom: 1px solid var(--bg-primary);
441
+ cursor: pointer;
442
+ transition: background 0.1s;
443
+ align-items: center;
444
+ }
445
+
446
+ .table-row:hover {
447
+ background: var(--bg-tertiary);
448
+ }
449
+
450
+ .table-row.highlighted {
451
+ background: var(--bg-tertiary);
452
+ border-left: 2px solid var(--accent);
453
+ }
454
+
455
+ .table-row .module-name {
456
+ flex: 1;
457
+ font-family: var(--font-mono);
458
+ overflow: hidden;
459
+ text-overflow: ellipsis;
460
+ white-space: nowrap;
461
+ display: flex;
462
+ align-items: center;
463
+ gap: 4px;
464
+ }
465
+
466
+ .table-row .chevron {
467
+ display: inline-block;
468
+ width: 16px;
469
+ font-size: 10px;
470
+ color: var(--text-muted);
471
+ flex-shrink: 0;
472
+ text-align: center;
473
+ cursor: pointer;
474
+ }
475
+
476
+ .table-row .chevron.expanded {
477
+ transform: rotate(90deg);
478
+ }
479
+
480
+ .table-row .module-label {
481
+ overflow: hidden;
482
+ text-overflow: ellipsis;
483
+ }
484
+
485
+ .table-row .time-value {
486
+ width: 90px;
487
+ text-align: right;
488
+ font-family: var(--font-mono);
489
+ }
490
+
491
+ .table-row .imports-count {
492
+ width: 80px;
493
+ text-align: right;
494
+ font-family: var(--font-mono);
495
+ color: var(--text-muted);
496
+ }
497
+
498
+ /* Graph context menu */
499
+ .graph-context-menu {
500
+ position: absolute;
501
+ background: var(--bg-tertiary);
502
+ border: 1px solid var(--border);
503
+ border-radius: 4px;
504
+ padding: 4px 0;
505
+ z-index: 150;
506
+ min-width: 160px;
507
+ box-shadow: 0 4px 12px rgba(0, 0, 0, 0.3);
508
+ }
509
+
510
+ .graph-context-menu-item {
511
+ padding: 6px 12px;
512
+ font-size: 12px;
513
+ color: var(--text-primary);
514
+ cursor: pointer;
515
+ }
516
+
517
+ .graph-context-menu-item:hover {
518
+ background: var(--border);
519
+ }
520
+
521
+ .graph-context-menu-item .menu-info-icon {
522
+ cursor: help;
523
+ color: var(--text-muted);
524
+ font-size: 11px;
525
+ margin-left: 6px;
526
+ }
527
+
528
+ /* Sort indicator */
529
+ .sort-arrow {
530
+ font-size: 10px;
531
+ }