@facet-coverage/core 0.3.0 → 0.5.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 (75) hide show
  1. package/README.md +64 -574
  2. package/dist/cli/commands/generate.d.ts.map +1 -1
  3. package/dist/cli/commands/generate.js +224 -25
  4. package/dist/cli/commands/generate.js.map +1 -1
  5. package/dist/cli/commands/serve.d.ts +12 -0
  6. package/dist/cli/commands/serve.d.ts.map +1 -0
  7. package/dist/cli/commands/serve.js +76 -0
  8. package/dist/cli/commands/serve.js.map +1 -0
  9. package/dist/cli/index.js +10 -0
  10. package/dist/cli/index.js.map +1 -1
  11. package/dist/client/index.js +60 -0
  12. package/dist/core/FacetParser.d.ts +37 -1
  13. package/dist/core/FacetParser.d.ts.map +1 -1
  14. package/dist/core/FacetParser.js +123 -5
  15. package/dist/core/FacetParser.js.map +1 -1
  16. package/dist/core/TestScanner.d.ts +4 -1
  17. package/dist/core/TestScanner.d.ts.map +1 -1
  18. package/dist/core/TestScanner.js +42 -13
  19. package/dist/core/TestScanner.js.map +1 -1
  20. package/dist/core/Validator.d.ts +4 -0
  21. package/dist/core/Validator.d.ts.map +1 -1
  22. package/dist/core/Validator.js +22 -4
  23. package/dist/core/Validator.js.map +1 -1
  24. package/dist/server/DevServer.d.ts +48 -0
  25. package/dist/server/DevServer.d.ts.map +1 -0
  26. package/dist/server/DevServer.js +126 -0
  27. package/dist/server/DevServer.js.map +1 -0
  28. package/dist/server/HotReloadManager.d.ts +49 -0
  29. package/dist/server/HotReloadManager.d.ts.map +1 -0
  30. package/dist/server/HotReloadManager.js +187 -0
  31. package/dist/server/HotReloadManager.js.map +1 -0
  32. package/dist/server/index.d.ts +3 -0
  33. package/dist/server/index.d.ts.map +1 -0
  34. package/dist/server/index.js +6 -0
  35. package/dist/server/index.js.map +1 -0
  36. package/dist/server/routes.d.ts +12 -0
  37. package/dist/server/routes.d.ts.map +1 -0
  38. package/dist/server/routes.js +272 -0
  39. package/dist/server/routes.js.map +1 -0
  40. package/dist/server/views/Dashboard.d.ts +6 -0
  41. package/dist/server/views/Dashboard.d.ts.map +1 -0
  42. package/dist/server/views/Dashboard.js +121 -0
  43. package/dist/server/views/Dashboard.js.map +1 -0
  44. package/dist/server/views/FacetPage.d.ts +6 -0
  45. package/dist/server/views/FacetPage.d.ts.map +1 -0
  46. package/dist/server/views/FacetPage.js +190 -0
  47. package/dist/server/views/FacetPage.js.map +1 -0
  48. package/dist/server/views/FeaturePage.d.ts +6 -0
  49. package/dist/server/views/FeaturePage.d.ts.map +1 -0
  50. package/dist/server/views/FeaturePage.js +98 -0
  51. package/dist/server/views/FeaturePage.js.map +1 -0
  52. package/dist/server/views/Layout.d.ts +17 -0
  53. package/dist/server/views/Layout.d.ts.map +1 -0
  54. package/dist/server/views/Layout.js +59 -0
  55. package/dist/server/views/Layout.js.map +1 -0
  56. package/dist/server/views/Sidebar.d.ts +6 -0
  57. package/dist/server/views/Sidebar.d.ts.map +1 -0
  58. package/dist/server/views/Sidebar.js +59 -0
  59. package/dist/server/views/Sidebar.js.map +1 -0
  60. package/dist/server/views/TestPanel.d.ts +6 -0
  61. package/dist/server/views/TestPanel.d.ts.map +1 -0
  62. package/dist/server/views/TestPanel.js +69 -0
  63. package/dist/server/views/TestPanel.js.map +1 -0
  64. package/dist/server/views/scripts.d.ts +5 -0
  65. package/dist/server/views/scripts.d.ts.map +1 -0
  66. package/dist/server/views/scripts.js +203 -0
  67. package/dist/server/views/scripts.js.map +1 -0
  68. package/dist/server/views/styles.d.ts +6 -0
  69. package/dist/server/views/styles.d.ts.map +1 -0
  70. package/dist/server/views/styles.js +608 -0
  71. package/dist/server/views/styles.js.map +1 -0
  72. package/dist/types.d.ts +27 -3
  73. package/dist/types.d.ts.map +1 -1
  74. package/dist/types.js.map +1 -1
  75. package/package.json +9 -4
@@ -0,0 +1,608 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getStyles = getStyles;
4
+ /**
5
+ * CSS styles for the documentation server
6
+ * Based on the HtmlReporter design system
7
+ */
8
+ function getStyles() {
9
+ return `
10
+ :root {
11
+ --color-success: #22c55e;
12
+ --color-warning: #eab308;
13
+ --color-error: #ef4444;
14
+ --color-bg: #0f172a;
15
+ --color-card: #1e293b;
16
+ --color-sidebar: #1a2332;
17
+ --color-text: #f1f5f9;
18
+ --color-muted: #94a3b8;
19
+ --color-border: #334155;
20
+ --color-accent: #3b82f6;
21
+ --sidebar-width: 280px;
22
+ --panel-width: 400px;
23
+ }
24
+
25
+ * {
26
+ margin: 0;
27
+ padding: 0;
28
+ box-sizing: border-box;
29
+ }
30
+
31
+ body {
32
+ font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif;
33
+ background: var(--color-bg);
34
+ color: var(--color-text);
35
+ line-height: 1.6;
36
+ height: 100vh;
37
+ overflow: hidden;
38
+ }
39
+
40
+ /* Layout */
41
+ .app {
42
+ display: flex;
43
+ height: 100vh;
44
+ }
45
+
46
+ .sidebar {
47
+ width: var(--sidebar-width);
48
+ background: var(--color-sidebar);
49
+ border-right: 1px solid var(--color-border);
50
+ display: flex;
51
+ flex-direction: column;
52
+ flex-shrink: 0;
53
+ }
54
+
55
+ .sidebar-header {
56
+ padding: 1rem;
57
+ border-bottom: 1px solid var(--color-border);
58
+ }
59
+
60
+ .sidebar-header h1 {
61
+ font-size: 1.25rem;
62
+ display: flex;
63
+ align-items: center;
64
+ gap: 0.5rem;
65
+ }
66
+
67
+ .sidebar-search {
68
+ padding: 0.75rem 1rem;
69
+ border-bottom: 1px solid var(--color-border);
70
+ }
71
+
72
+ .sidebar-search input {
73
+ width: 100%;
74
+ padding: 0.5rem 0.75rem;
75
+ background: var(--color-bg);
76
+ border: 1px solid var(--color-border);
77
+ border-radius: 6px;
78
+ color: var(--color-text);
79
+ font-size: 0.875rem;
80
+ }
81
+
82
+ .sidebar-search input:focus {
83
+ outline: none;
84
+ border-color: var(--color-accent);
85
+ }
86
+
87
+ .sidebar-nav {
88
+ flex: 1;
89
+ overflow-y: auto;
90
+ padding: 0.5rem;
91
+ }
92
+
93
+ .nav-section {
94
+ margin-bottom: 0.5rem;
95
+ }
96
+
97
+ .nav-section-header {
98
+ display: flex;
99
+ align-items: center;
100
+ padding: 0.5rem;
101
+ cursor: pointer;
102
+ border-radius: 6px;
103
+ transition: background 0.15s;
104
+ }
105
+
106
+ .nav-section-header:hover {
107
+ background: var(--color-card);
108
+ }
109
+
110
+ .nav-section-title {
111
+ flex: 1;
112
+ font-weight: 600;
113
+ font-size: 0.875rem;
114
+ }
115
+
116
+ .nav-section-badge {
117
+ font-size: 0.75rem;
118
+ padding: 0.125rem 0.5rem;
119
+ border-radius: 4px;
120
+ font-weight: 600;
121
+ }
122
+
123
+ .nav-section-badge.success { background: var(--color-success); color: #000; }
124
+ .nav-section-badge.warning { background: var(--color-warning); color: #000; }
125
+ .nav-section-badge.error { background: var(--color-error); color: #fff; }
126
+
127
+ .nav-items {
128
+ padding-left: 1rem;
129
+ }
130
+
131
+ .nav-item {
132
+ display: block;
133
+ padding: 0.375rem 0.5rem;
134
+ color: var(--color-muted);
135
+ text-decoration: none;
136
+ font-size: 0.8125rem;
137
+ border-radius: 4px;
138
+ transition: all 0.15s;
139
+ }
140
+
141
+ .nav-item:hover {
142
+ background: var(--color-card);
143
+ color: var(--color-text);
144
+ }
145
+
146
+ .nav-item.active {
147
+ background: var(--color-accent);
148
+ color: #fff;
149
+ }
150
+
151
+ .nav-item.covered::before {
152
+ content: '\\2713';
153
+ margin-right: 0.5rem;
154
+ color: var(--color-success);
155
+ }
156
+
157
+ .nav-item.uncovered::before {
158
+ content: '\\2717';
159
+ margin-right: 0.5rem;
160
+ color: var(--color-error);
161
+ }
162
+
163
+ /* Main content area */
164
+ .main {
165
+ flex: 1;
166
+ display: flex;
167
+ overflow: hidden;
168
+ }
169
+
170
+ .doc-panel {
171
+ flex: 1;
172
+ overflow-y: auto;
173
+ padding: 2rem;
174
+ min-width: 0;
175
+ }
176
+
177
+ .test-panel {
178
+ width: var(--panel-width);
179
+ background: var(--color-card);
180
+ border-left: 1px solid var(--color-border);
181
+ display: flex;
182
+ flex-direction: column;
183
+ flex-shrink: 0;
184
+ }
185
+
186
+ .test-panel-header {
187
+ padding: 1rem;
188
+ border-bottom: 1px solid var(--color-border);
189
+ font-weight: 600;
190
+ }
191
+
192
+ .test-panel-content {
193
+ flex: 1;
194
+ overflow-y: auto;
195
+ padding: 1rem;
196
+ }
197
+
198
+ /* Cards */
199
+ .card {
200
+ background: var(--color-card);
201
+ border-radius: 12px;
202
+ padding: 1.5rem;
203
+ margin-bottom: 1.5rem;
204
+ border: 1px solid var(--color-border);
205
+ }
206
+
207
+ .card h2 {
208
+ margin-bottom: 1rem;
209
+ font-size: 1.25rem;
210
+ }
211
+
212
+ /* Coverage stats */
213
+ .stats-grid {
214
+ display: grid;
215
+ grid-template-columns: repeat(auto-fit, minmax(120px, 1fr));
216
+ gap: 1rem;
217
+ }
218
+
219
+ .stat {
220
+ text-align: center;
221
+ padding: 1rem;
222
+ background: var(--color-bg);
223
+ border-radius: 8px;
224
+ }
225
+
226
+ .stat-value {
227
+ font-size: 1.75rem;
228
+ font-weight: bold;
229
+ }
230
+
231
+ .stat-label {
232
+ color: var(--color-muted);
233
+ font-size: 0.8125rem;
234
+ margin-top: 0.25rem;
235
+ }
236
+
237
+ .stat-value.success { color: var(--color-success); }
238
+ .stat-value.warning { color: var(--color-warning); }
239
+ .stat-value.error { color: var(--color-error); }
240
+
241
+ /* Coverage bar */
242
+ .coverage-bar {
243
+ height: 6px;
244
+ background: var(--color-border);
245
+ border-radius: 3px;
246
+ overflow: hidden;
247
+ margin-top: 0.5rem;
248
+ }
249
+
250
+ .coverage-fill {
251
+ height: 100%;
252
+ transition: width 0.3s ease;
253
+ }
254
+
255
+ .coverage-fill.success { background: var(--color-success); }
256
+ .coverage-fill.warning { background: var(--color-warning); }
257
+ .coverage-fill.error { background: var(--color-error); }
258
+
259
+ /* Type grid */
260
+ .type-grid {
261
+ display: grid;
262
+ grid-template-columns: repeat(auto-fit, minmax(150px, 1fr));
263
+ gap: 1rem;
264
+ }
265
+
266
+ .type-card {
267
+ padding: 1rem;
268
+ background: var(--color-bg);
269
+ border-radius: 8px;
270
+ }
271
+
272
+ .type-header {
273
+ display: flex;
274
+ justify-content: space-between;
275
+ align-items: center;
276
+ margin-bottom: 0.5rem;
277
+ }
278
+
279
+ .type-name {
280
+ font-weight: 600;
281
+ text-transform: capitalize;
282
+ font-size: 0.875rem;
283
+ }
284
+
285
+ .type-percentage {
286
+ font-weight: bold;
287
+ font-size: 0.875rem;
288
+ }
289
+
290
+ /* Feature grid */
291
+ .feature-grid {
292
+ display: grid;
293
+ grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));
294
+ gap: 1rem;
295
+ }
296
+
297
+ .feature-card {
298
+ padding: 1rem;
299
+ background: var(--color-bg);
300
+ border-radius: 8px;
301
+ text-decoration: none;
302
+ color: inherit;
303
+ transition: all 0.15s;
304
+ border: 1px solid transparent;
305
+ }
306
+
307
+ .feature-card:hover {
308
+ border-color: var(--color-accent);
309
+ transform: translateY(-2px);
310
+ }
311
+
312
+ .feature-name {
313
+ font-weight: 600;
314
+ margin-bottom: 0.5rem;
315
+ }
316
+
317
+ .feature-stats {
318
+ display: flex;
319
+ justify-content: space-between;
320
+ align-items: center;
321
+ color: var(--color-muted);
322
+ font-size: 0.8125rem;
323
+ }
324
+
325
+ /* Facet list */
326
+ .facet-list {
327
+ display: flex;
328
+ flex-direction: column;
329
+ gap: 0.75rem;
330
+ }
331
+
332
+ .facet-item {
333
+ padding: 1rem;
334
+ background: var(--color-bg);
335
+ border-radius: 8px;
336
+ text-decoration: none;
337
+ color: inherit;
338
+ transition: all 0.15s;
339
+ border-left: 3px solid transparent;
340
+ }
341
+
342
+ .facet-item:hover {
343
+ background: var(--color-card);
344
+ }
345
+
346
+ .facet-item.covered {
347
+ border-left-color: var(--color-success);
348
+ }
349
+
350
+ .facet-item.uncovered {
351
+ border-left-color: var(--color-error);
352
+ }
353
+
354
+ .facet-header {
355
+ display: flex;
356
+ justify-content: space-between;
357
+ align-items: center;
358
+ margin-bottom: 0.25rem;
359
+ }
360
+
361
+ .facet-id {
362
+ font-family: monospace;
363
+ font-weight: 600;
364
+ font-size: 0.875rem;
365
+ }
366
+
367
+ .facet-type {
368
+ font-size: 0.75rem;
369
+ padding: 0.125rem 0.5rem;
370
+ background: var(--color-card);
371
+ border-radius: 4px;
372
+ text-transform: capitalize;
373
+ }
374
+
375
+ .facet-source {
376
+ color: var(--color-muted);
377
+ font-size: 0.8125rem;
378
+ }
379
+
380
+ /* Test list */
381
+ .test-list {
382
+ display: flex;
383
+ flex-direction: column;
384
+ gap: 0.75rem;
385
+ }
386
+
387
+ .test-item {
388
+ padding: 0.75rem;
389
+ background: var(--color-bg);
390
+ border-radius: 6px;
391
+ cursor: pointer;
392
+ transition: all 0.15s;
393
+ }
394
+
395
+ .test-item:hover {
396
+ background: var(--color-border);
397
+ }
398
+
399
+ .test-item.active {
400
+ border: 1px solid var(--color-accent);
401
+ }
402
+
403
+ .test-file {
404
+ font-size: 0.75rem;
405
+ color: var(--color-muted);
406
+ font-family: monospace;
407
+ }
408
+
409
+ .test-title {
410
+ font-weight: 500;
411
+ margin-top: 0.25rem;
412
+ font-size: 0.875rem;
413
+ }
414
+
415
+ .test-line {
416
+ font-size: 0.75rem;
417
+ color: var(--color-muted);
418
+ margin-top: 0.25rem;
419
+ }
420
+
421
+ /* Code block */
422
+ .code-block {
423
+ background: var(--color-bg);
424
+ border-radius: 8px;
425
+ overflow: hidden;
426
+ margin-top: 1rem;
427
+ }
428
+
429
+ .code-header {
430
+ padding: 0.5rem 1rem;
431
+ background: var(--color-border);
432
+ font-family: monospace;
433
+ font-size: 0.75rem;
434
+ color: var(--color-muted);
435
+ display: flex;
436
+ justify-content: space-between;
437
+ align-items: center;
438
+ }
439
+
440
+ .code-content {
441
+ padding: 1rem;
442
+ overflow-x: auto;
443
+ font-family: 'SF Mono', Monaco, 'Cascadia Code', 'Roboto Mono', monospace;
444
+ font-size: 0.8125rem;
445
+ line-height: 1.5;
446
+ }
447
+
448
+ .code-content pre {
449
+ margin: 0;
450
+ }
451
+
452
+ .code-line {
453
+ display: flex;
454
+ }
455
+
456
+ .code-line-number {
457
+ width: 3rem;
458
+ color: var(--color-muted);
459
+ text-align: right;
460
+ padding-right: 1rem;
461
+ user-select: none;
462
+ flex-shrink: 0;
463
+ }
464
+
465
+ .code-line-content {
466
+ flex: 1;
467
+ }
468
+
469
+ .code-line.highlight {
470
+ background: rgba(59, 130, 246, 0.2);
471
+ margin: 0 -1rem;
472
+ padding: 0 1rem;
473
+ }
474
+
475
+ /* Markdown content */
476
+ .markdown-content h1 { font-size: 1.75rem; margin-bottom: 1rem; }
477
+ .markdown-content h2 { font-size: 1.5rem; margin: 1.5rem 0 0.75rem; }
478
+ .markdown-content h3 { font-size: 1.25rem; margin: 1.25rem 0 0.5rem; }
479
+ .markdown-content h4 { font-size: 1.1rem; margin: 1rem 0 0.5rem; }
480
+ .markdown-content p { margin-bottom: 0.75rem; }
481
+ .markdown-content ul, .markdown-content ol { margin-bottom: 0.75rem; padding-left: 1.5rem; }
482
+ .markdown-content li { margin-bottom: 0.25rem; }
483
+ .markdown-content code {
484
+ background: var(--color-card);
485
+ padding: 0.125rem 0.375rem;
486
+ border-radius: 4px;
487
+ font-family: monospace;
488
+ font-size: 0.875em;
489
+ }
490
+ .markdown-content pre {
491
+ background: var(--color-card);
492
+ padding: 1rem;
493
+ border-radius: 8px;
494
+ overflow-x: auto;
495
+ margin-bottom: 0.75rem;
496
+ }
497
+ .markdown-content pre code {
498
+ background: none;
499
+ padding: 0;
500
+ }
501
+
502
+ /* Badges */
503
+ .badge {
504
+ display: inline-block;
505
+ padding: 0.125rem 0.5rem;
506
+ border-radius: 4px;
507
+ font-size: 0.75rem;
508
+ font-weight: 600;
509
+ }
510
+
511
+ .badge.success { background: var(--color-success); color: #000; }
512
+ .badge.warning { background: var(--color-warning); color: #000; }
513
+ .badge.error { background: var(--color-error); color: #fff; }
514
+
515
+ /* Breadcrumb */
516
+ .breadcrumb {
517
+ display: flex;
518
+ align-items: center;
519
+ gap: 0.5rem;
520
+ margin-bottom: 1rem;
521
+ font-size: 0.875rem;
522
+ }
523
+
524
+ .breadcrumb a {
525
+ color: var(--color-muted);
526
+ text-decoration: none;
527
+ }
528
+
529
+ .breadcrumb a:hover {
530
+ color: var(--color-text);
531
+ }
532
+
533
+ .breadcrumb-separator {
534
+ color: var(--color-muted);
535
+ }
536
+
537
+ /* Status indicator */
538
+ .status-indicator {
539
+ position: fixed;
540
+ bottom: 1rem;
541
+ right: 1rem;
542
+ padding: 0.5rem 1rem;
543
+ background: var(--color-card);
544
+ border: 1px solid var(--color-border);
545
+ border-radius: 8px;
546
+ font-size: 0.8125rem;
547
+ display: none;
548
+ align-items: center;
549
+ gap: 0.5rem;
550
+ z-index: 1000;
551
+ }
552
+
553
+ .status-indicator.visible {
554
+ display: flex;
555
+ }
556
+
557
+ .status-indicator.updating {
558
+ border-color: var(--color-warning);
559
+ }
560
+
561
+ .status-indicator.connected {
562
+ border-color: var(--color-success);
563
+ }
564
+
565
+ .spinner {
566
+ width: 14px;
567
+ height: 14px;
568
+ border: 2px solid var(--color-border);
569
+ border-top-color: var(--color-warning);
570
+ border-radius: 50%;
571
+ animation: spin 0.8s linear infinite;
572
+ }
573
+
574
+ @keyframes spin {
575
+ to { transform: rotate(360deg); }
576
+ }
577
+
578
+ /* Empty state */
579
+ .empty-state {
580
+ text-align: center;
581
+ padding: 3rem 1rem;
582
+ color: var(--color-muted);
583
+ }
584
+
585
+ .empty-state-icon {
586
+ font-size: 3rem;
587
+ margin-bottom: 1rem;
588
+ }
589
+
590
+ /* Copy button */
591
+ .copy-btn {
592
+ padding: 0.25rem 0.5rem;
593
+ background: var(--color-card);
594
+ border: 1px solid var(--color-border);
595
+ border-radius: 4px;
596
+ color: var(--color-muted);
597
+ cursor: pointer;
598
+ font-size: 0.75rem;
599
+ transition: all 0.15s;
600
+ }
601
+
602
+ .copy-btn:hover {
603
+ background: var(--color-border);
604
+ color: var(--color-text);
605
+ }
606
+ `;
607
+ }
608
+ //# sourceMappingURL=styles.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"styles.js","sourceRoot":"","sources":["../../../src/server/views/styles.ts"],"names":[],"mappings":";;AAIA,8BAulBC;AA3lBD;;;GAGG;AACH,SAAgB,SAAS;IACvB,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAqlBN,CAAC;AACJ,CAAC"}
package/dist/types.d.ts CHANGED
@@ -13,6 +13,8 @@ export interface Facet {
13
13
  file: string;
14
14
  /** Section identifier within the file (slug) */
15
15
  section: string;
16
+ /** Line number for sub-facets */
17
+ line?: number;
16
18
  };
17
19
  /** Type of facet (business, compliance, ux, etc.) */
18
20
  type: string;
@@ -20,6 +22,10 @@ export interface Facet {
20
22
  title?: string;
21
23
  /** Optional description */
22
24
  description?: string;
25
+ /** Parent facet ID for sub-facets (hierarchical structure) */
26
+ parentId?: string;
27
+ /** Whether this is a sub-facet (from list item ID or comment marker) */
28
+ isSubFacet?: boolean;
23
29
  }
24
30
  /**
25
31
  * Structure definition for a feature
@@ -117,7 +123,7 @@ export interface CoverageReport {
117
123
  */
118
124
  export interface ValidationError {
119
125
  /** Error type */
120
- type: 'missing-source' | 'missing-section' | 'invalid-facet-id' | 'orphan-test' | 'duplicate-id';
126
+ type: 'missing-source' | 'missing-section' | 'invalid-facet-id' | 'orphan-test' | 'duplicate-id' | 'orphan-subfacet';
121
127
  /** Error message */
122
128
  message: string;
123
129
  /** File where the error occurred */
@@ -152,6 +158,8 @@ export interface FacetConfig {
152
158
  facetPattern?: string | string[];
153
159
  /** Known facet types used in this project (for resolving Facets.CONSTANT references) */
154
160
  facetTypes?: string[];
161
+ /** Heading levels that become sub-facets (e.g., [3] for h3, [3, 4] for h3 and h4) */
162
+ subFacetHeadingLevels?: number[];
155
163
  /** Validation options */
156
164
  validation: {
157
165
  /** Verify facet source files exist */
@@ -186,7 +194,7 @@ export declare const defaultConfig: FacetConfig;
186
194
  export interface MarkdownSection {
187
195
  /** Section title */
188
196
  title: string;
189
- /** Slug (URL-friendly version of title, or explicit anchor if provided) */
197
+ /** Slug (URL-friendly version of title, or explicit ID if provided via [](#id)) */
190
198
  slug: string;
191
199
  /** Heading level (1-6) */
192
200
  level: number;
@@ -196,8 +204,24 @@ export interface MarkdownSection {
196
204
  endLine: number;
197
205
  /** Section content */
198
206
  content: string;
199
- /** Explicit anchor ID if provided via {#anchor} syntax */
207
+ /** Explicit ID if provided via [](#id) on line after heading */
200
208
  explicitId?: string;
209
+ /** Sub-facet markers found within this section */
210
+ subFacets?: SubFacetMarker[];
211
+ }
212
+ /**
213
+ * Represents a sub-facet marker found within a section
214
+ * Can be from <!-- @facet:id --> comment, [](#id) link, or heading
215
+ */
216
+ export interface SubFacetMarker {
217
+ /** The sub-facet ID (local, will be combined with parent) */
218
+ id: string;
219
+ /** Title extracted from the heading or nearby content */
220
+ title?: string;
221
+ /** Line number where the marker was found */
222
+ line: number;
223
+ /** Type of marker: 'comment' for <!-- @facet:id -->, 'link' for [](#id), 'heading' for h3+ */
224
+ type: 'comment' | 'link' | 'heading';
201
225
  }
202
226
  /**
203
227
  * Parsed markdown file
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
package/dist/types.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":";AAAA;;GAEG;;;AA2LH;;GAEG;AACU,QAAA,aAAa,GAAgB;IACxC,cAAc,EAAE,CAAC,mCAAmC,CAAC;IACrD,OAAO,EAAE,qBAAqB;IAC9B,YAAY,EAAE,CAAC,cAAc,EAAE,cAAc,CAAC;IAC9C,YAAY,EAAE,CAAC,wBAAwB,EAAE,yBAAyB,CAAC;IACnE,UAAU,EAAE,CAAC,SAAS,EAAE,IAAI,EAAE,WAAW,EAAE,YAAY,EAAE,UAAU,EAAE,IAAI,CAAC;IAC1E,UAAU,EAAE;QACV,mBAAmB,EAAE,IAAI;QACzB,oBAAoB,EAAE,IAAI;QAC1B,qBAAqB,EAAE,KAAK;KAC7B;IACD,MAAM,EAAE;QACN,GAAG,EAAE,iBAAiB;QACtB,OAAO,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,UAAU,CAAC;KACtC;IACD,UAAU,EAAE;QACV,MAAM,EAAE,EAAE;QACV,MAAM,EAAE,EAAE;KACX;CACF,CAAC"}
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":";AAAA;;GAEG;;;AAmMH;;GAEG;AACU,QAAA,aAAa,GAAgB;IACxC,cAAc,EAAE,CAAC,mCAAmC,CAAC;IACrD,OAAO,EAAE,qBAAqB;IAC9B,YAAY,EAAE,CAAC,cAAc,EAAE,cAAc,CAAC;IAC9C,YAAY,EAAE,CAAC,wBAAwB,EAAE,yBAAyB,CAAC;IACnE,UAAU,EAAE,CAAC,SAAS,EAAE,IAAI,EAAE,WAAW,EAAE,YAAY,EAAE,UAAU,EAAE,IAAI,CAAC;IAC1E,UAAU,EAAE;QACV,mBAAmB,EAAE,IAAI;QACzB,oBAAoB,EAAE,IAAI;QAC1B,qBAAqB,EAAE,KAAK;KAC7B;IACD,MAAM,EAAE;QACN,GAAG,EAAE,iBAAiB;QACtB,OAAO,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,UAAU,CAAC;KACtC;IACD,UAAU,EAAE;QACV,MAAM,EAAE,EAAE;QACV,MAAM,EAAE,EAAE;KACX;CACF,CAAC"}