@opensip-cli/dashboard 0.1.10 → 0.1.12

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 (150) hide show
  1. package/README.md +4 -2
  2. package/dist/client-bundle.generated.d.ts.map +1 -1
  3. package/dist/client-bundle.generated.js +1 -1
  4. package/dist/client-bundle.generated.js.map +1 -1
  5. package/dist/code-paths/graph-view-model.js +0 -1
  6. package/dist/code-paths/graph-view-model.js.map +1 -1
  7. package/dist/css/theme.js +1 -1
  8. package/dist/generator.d.ts +2 -0
  9. package/dist/generator.d.ts.map +1 -1
  10. package/dist/generator.js +10 -4
  11. package/dist/generator.js.map +1 -1
  12. package/dist/report-cup-icon.d.ts +17 -0
  13. package/dist/report-cup-icon.d.ts.map +1 -0
  14. package/dist/report-cup-icon.js +34 -0
  15. package/dist/report-cup-icon.js.map +1 -0
  16. package/dist/tool-tabs-registrations.js +10 -0
  17. package/dist/tool-tabs-registrations.js.map +1 -1
  18. package/package.json +3 -3
  19. package/dist/__tests__/catalog-provenance.test.d.ts +0 -11
  20. package/dist/__tests__/catalog-provenance.test.d.ts.map +0 -1
  21. package/dist/__tests__/catalog-provenance.test.js +0 -112
  22. package/dist/__tests__/catalog-provenance.test.js.map +0 -1
  23. package/dist/__tests__/coupling-attribution.test.d.ts +0 -9
  24. package/dist/__tests__/coupling-attribution.test.d.ts.map +0 -1
  25. package/dist/__tests__/coupling-attribution.test.js +0 -95
  26. package/dist/__tests__/coupling-attribution.test.js.map +0 -1
  27. package/dist/__tests__/dashboard-bundle-weight.test.d.ts +0 -23
  28. package/dist/__tests__/dashboard-bundle-weight.test.d.ts.map +0 -1
  29. package/dist/__tests__/dashboard-bundle-weight.test.js +0 -80
  30. package/dist/__tests__/dashboard-bundle-weight.test.js.map +0 -1
  31. package/dist/__tests__/dashboard-cell-containment.test.d.ts +0 -2
  32. package/dist/__tests__/dashboard-cell-containment.test.d.ts.map +0 -1
  33. package/dist/__tests__/dashboard-cell-containment.test.js +0 -52
  34. package/dist/__tests__/dashboard-cell-containment.test.js.map +0 -1
  35. package/dist/__tests__/dashboard-cytoscape-vendor.test.d.ts +0 -10
  36. package/dist/__tests__/dashboard-cytoscape-vendor.test.d.ts.map +0 -1
  37. package/dist/__tests__/dashboard-cytoscape-vendor.test.js +0 -40
  38. package/dist/__tests__/dashboard-cytoscape-vendor.test.js.map +0 -1
  39. package/dist/__tests__/dashboard-editor-link.test.d.ts +0 -14
  40. package/dist/__tests__/dashboard-editor-link.test.d.ts.map +0 -1
  41. package/dist/__tests__/dashboard-editor-link.test.js +0 -87
  42. package/dist/__tests__/dashboard-editor-link.test.js.map +0 -1
  43. package/dist/__tests__/dashboard-el.test.d.ts +0 -18
  44. package/dist/__tests__/dashboard-el.test.d.ts.map +0 -1
  45. package/dist/__tests__/dashboard-el.test.js +0 -90
  46. package/dist/__tests__/dashboard-el.test.js.map +0 -1
  47. package/dist/__tests__/dashboard-filters.test.d.ts +0 -9
  48. package/dist/__tests__/dashboard-filters.test.d.ts.map +0 -1
  49. package/dist/__tests__/dashboard-filters.test.js +0 -87
  50. package/dist/__tests__/dashboard-filters.test.js.map +0 -1
  51. package/dist/__tests__/dashboard-function-card-singleton.test.d.ts +0 -9
  52. package/dist/__tests__/dashboard-function-card-singleton.test.d.ts.map +0 -1
  53. package/dist/__tests__/dashboard-function-card-singleton.test.js +0 -75
  54. package/dist/__tests__/dashboard-function-card-singleton.test.js.map +0 -1
  55. package/dist/__tests__/dashboard-function-card.test.d.ts +0 -10
  56. package/dist/__tests__/dashboard-function-card.test.d.ts.map +0 -1
  57. package/dist/__tests__/dashboard-function-card.test.js +0 -439
  58. package/dist/__tests__/dashboard-function-card.test.js.map +0 -1
  59. package/dist/__tests__/dashboard-function-row.test.d.ts +0 -11
  60. package/dist/__tests__/dashboard-function-row.test.d.ts.map +0 -1
  61. package/dist/__tests__/dashboard-function-row.test.js +0 -102
  62. package/dist/__tests__/dashboard-function-row.test.js.map +0 -1
  63. package/dist/__tests__/dashboard-generator-graph-catalog.test.d.ts +0 -9
  64. package/dist/__tests__/dashboard-generator-graph-catalog.test.d.ts.map +0 -1
  65. package/dist/__tests__/dashboard-generator-graph-catalog.test.js +0 -77
  66. package/dist/__tests__/dashboard-generator-graph-catalog.test.js.map +0 -1
  67. package/dist/__tests__/dashboard-graph-offline.integration.test.d.ts +0 -13
  68. package/dist/__tests__/dashboard-graph-offline.integration.test.d.ts.map +0 -1
  69. package/dist/__tests__/dashboard-graph-offline.integration.test.js +0 -57
  70. package/dist/__tests__/dashboard-graph-offline.integration.test.js.map +0 -1
  71. package/dist/__tests__/dashboard-graph-scc.test.d.ts +0 -17
  72. package/dist/__tests__/dashboard-graph-scc.test.d.ts.map +0 -1
  73. package/dist/__tests__/dashboard-graph-scc.test.js +0 -89
  74. package/dist/__tests__/dashboard-graph-scc.test.js.map +0 -1
  75. package/dist/__tests__/dashboard-graph-view-model.test.d.ts +0 -12
  76. package/dist/__tests__/dashboard-graph-view-model.test.d.ts.map +0 -1
  77. package/dist/__tests__/dashboard-graph-view-model.test.js +0 -331
  78. package/dist/__tests__/dashboard-graph-view-model.test.js.map +0 -1
  79. package/dist/__tests__/dashboard-help-drawer.test.d.ts +0 -9
  80. package/dist/__tests__/dashboard-help-drawer.test.d.ts.map +0 -1
  81. package/dist/__tests__/dashboard-help-drawer.test.js +0 -95
  82. package/dist/__tests__/dashboard-help-drawer.test.js.map +0 -1
  83. package/dist/__tests__/dashboard-html.test.d.ts +0 -2
  84. package/dist/__tests__/dashboard-html.test.d.ts.map +0 -1
  85. package/dist/__tests__/dashboard-html.test.js +0 -169
  86. package/dist/__tests__/dashboard-html.test.js.map +0 -1
  87. package/dist/__tests__/dashboard-indexes.test.d.ts +0 -11
  88. package/dist/__tests__/dashboard-indexes.test.d.ts.map +0 -1
  89. package/dist/__tests__/dashboard-indexes.test.js +0 -214
  90. package/dist/__tests__/dashboard-indexes.test.js.map +0 -1
  91. package/dist/__tests__/dashboard-pagination.test.d.ts +0 -15
  92. package/dist/__tests__/dashboard-pagination.test.d.ts.map +0 -1
  93. package/dist/__tests__/dashboard-pagination.test.js +0 -140
  94. package/dist/__tests__/dashboard-pagination.test.js.map +0 -1
  95. package/dist/__tests__/dashboard-path-utils.test.d.ts +0 -13
  96. package/dist/__tests__/dashboard-path-utils.test.d.ts.map +0 -1
  97. package/dist/__tests__/dashboard-path-utils.test.js +0 -62
  98. package/dist/__tests__/dashboard-path-utils.test.js.map +0 -1
  99. package/dist/__tests__/dashboard-search.test.d.ts +0 -10
  100. package/dist/__tests__/dashboard-search.test.d.ts.map +0 -1
  101. package/dist/__tests__/dashboard-search.test.js +0 -52
  102. package/dist/__tests__/dashboard-search.test.js.map +0 -1
  103. package/dist/__tests__/dashboard-sessions.test.d.ts +0 -14
  104. package/dist/__tests__/dashboard-sessions.test.d.ts.map +0 -1
  105. package/dist/__tests__/dashboard-sessions.test.js +0 -332
  106. package/dist/__tests__/dashboard-sessions.test.js.map +0 -1
  107. package/dist/__tests__/dashboard-trace.test.d.ts +0 -16
  108. package/dist/__tests__/dashboard-trace.test.d.ts.map +0 -1
  109. package/dist/__tests__/dashboard-trace.test.js +0 -170
  110. package/dist/__tests__/dashboard-trace.test.js.map +0 -1
  111. package/dist/__tests__/dashboard-validation.integration.test.d.ts +0 -14
  112. package/dist/__tests__/dashboard-validation.integration.test.d.ts.map +0 -1
  113. package/dist/__tests__/dashboard-validation.integration.test.js +0 -221
  114. package/dist/__tests__/dashboard-validation.integration.test.js.map +0 -1
  115. package/dist/__tests__/dashboard-view-conformance.test.d.ts +0 -12
  116. package/dist/__tests__/dashboard-view-conformance.test.d.ts.map +0 -1
  117. package/dist/__tests__/dashboard-view-conformance.test.js +0 -52
  118. package/dist/__tests__/dashboard-view-conformance.test.js.map +0 -1
  119. package/dist/__tests__/dashboard-view-coupling.test.d.ts +0 -7
  120. package/dist/__tests__/dashboard-view-coupling.test.d.ts.map +0 -1
  121. package/dist/__tests__/dashboard-view-coupling.test.js +0 -360
  122. package/dist/__tests__/dashboard-view-coupling.test.js.map +0 -1
  123. package/dist/__tests__/dashboard-view-distribution.test.d.ts +0 -10
  124. package/dist/__tests__/dashboard-view-distribution.test.d.ts.map +0 -1
  125. package/dist/__tests__/dashboard-view-distribution.test.js +0 -249
  126. package/dist/__tests__/dashboard-view-distribution.test.js.map +0 -1
  127. package/dist/__tests__/dashboard-view-graph.test.d.ts +0 -13
  128. package/dist/__tests__/dashboard-view-graph.test.d.ts.map +0 -1
  129. package/dist/__tests__/dashboard-view-graph.test.js +0 -299
  130. package/dist/__tests__/dashboard-view-graph.test.js.map +0 -1
  131. package/dist/__tests__/dashboard-view-template.test.d.ts +0 -20
  132. package/dist/__tests__/dashboard-view-template.test.d.ts.map +0 -1
  133. package/dist/__tests__/dashboard-view-template.test.js +0 -206
  134. package/dist/__tests__/dashboard-view-template.test.js.map +0 -1
  135. package/dist/__tests__/dashboard.test.d.ts +0 -2
  136. package/dist/__tests__/dashboard.test.d.ts.map +0 -1
  137. package/dist/__tests__/dashboard.test.js +0 -129
  138. package/dist/__tests__/dashboard.test.js.map +0 -1
  139. package/dist/__tests__/graph-tab.test.d.ts +0 -10
  140. package/dist/__tests__/graph-tab.test.d.ts.map +0 -1
  141. package/dist/__tests__/graph-tab.test.js +0 -78
  142. package/dist/__tests__/graph-tab.test.js.map +0 -1
  143. package/dist/client/el.d.ts +0 -17
  144. package/dist/client/el.d.ts.map +0 -1
  145. package/dist/client/el.js +0 -36
  146. package/dist/client/el.js.map +0 -1
  147. package/dist/code-paths/__tests__/views-registry.test.d.ts +0 -18
  148. package/dist/code-paths/__tests__/views-registry.test.d.ts.map +0 -1
  149. package/dist/code-paths/__tests__/views-registry.test.js +0 -41
  150. package/dist/code-paths/__tests__/views-registry.test.js.map +0 -1
@@ -1,221 +0,0 @@
1
- // @fitness-ignore-file no-stub-tests -- expect(true).toBe(true) is used as a deliberate "skip-marker" when the dashboard report isn't present; test bodies are gated by readReportOrSkip()
2
- /// <reference lib="dom" />
3
- /**
4
- * @vitest-environment jsdom
5
- *
6
- * Phase V — End-to-end validation against OpenSIP CLI's own
7
- * generated dashboard. Reads the live latest.html (produced by the
8
- * preceding `pnpm dashboard` run during workspace test bootstrap)
9
- * and exercises every view + the Function Card flow.
10
- *
11
- * Skipped when latest.html is missing or contains no graph catalog
12
- * (e.g. fresh checkout without a dogfood run). The harness can re-
13
- * run the dashboard CLI separately and re-execute this test.
14
- */
15
- import { existsSync, readFileSync } from 'node:fs';
16
- import { dirname, join } from 'node:path';
17
- import { fileURLToPath } from 'node:url';
18
- import { beforeAll, beforeEach, describe, expect, it } from 'vitest';
19
- const HERE = dirname(fileURLToPath(import.meta.url));
20
- // HERE is packages/contracts/src/__tests__; repo root is four levels up.
21
- const REPO_ROOT = join(HERE, '..', '..', '..', '..');
22
- const REPORT = join(REPO_ROOT, 'opensip-cli', '.runtime', 'reports', 'latest.html');
23
- function readReportOrSkip() {
24
- if (!existsSync(REPORT))
25
- return null;
26
- const html = readFileSync(REPORT, 'utf8');
27
- if (!html.includes('id="graph-catalog"'))
28
- return null;
29
- return html;
30
- }
31
- function bootDashboard(html) {
32
- // Render the full HTML into the jsdom document, then evaluate the
33
- // inlined script bodies in a single sandbox. Returns the local
34
- // bindings (views, activateView, openFunctionCard) — they're const
35
- // so they never reach globalThis.
36
- //
37
- // Booted ONCE per file (see beforeAll): the live report embeds the full
38
- // graph catalog (tens of MB), and each boot parses it, builds indexes, and
39
- // attaches document-level listeners that capture that state. Re-booting per
40
- // test never releases the prior boots' listeners/closures, so the worker
41
- // heap climbs with each `it` and eventually OOMs. One boot keeps it flat.
42
- document.documentElement.innerHTML = html
43
- .replace(/^[\s\S]*?<html[^>]*>/i, '')
44
- .replace(/<\/html>[\s\S]*$/i, '');
45
- // eslint-disable-next-line unicorn/prefer-spread -- NodeListOf<HTMLScriptElement> spread requires lib.dom.iterable.
46
- const scripts = Array.from(document.querySelectorAll('script'));
47
- let combined = '';
48
- for (const s of scripts) {
49
- const type = s.getAttribute('type');
50
- if (type && type !== 'text/javascript' && type !== '')
51
- continue;
52
- const src = s.textContent ?? '';
53
- if (src.length === 0)
54
- continue;
55
- combined += '\n' + src;
56
- }
57
- combined += '\nreturn { views, activateView, openFunctionCard, openCodePathsSession };';
58
- // eslint-disable-next-line @typescript-eslint/no-implied-eval, sonarjs/code-eval -- Trusted source: our own emitted HTML.
59
- return new Function(combined).call(globalThis);
60
- }
61
- function activateExploreSubtab() {
62
- const exploreTab = document.querySelector('#panel-code-paths .subtab[data-subtab="explore"]');
63
- if (exploreTab)
64
- exploreTab.click();
65
- }
66
- describe.runIf(existsSync(REPORT))('Phase V — dashboard end-to-end validation', () => {
67
- // The report embeds the full graph catalog (tens of MB). Boot the dashboard
68
- // exactly ONCE for the whole file (see bootDashboard) and share the result —
69
- // re-booting per test accumulated listeners/closures and OOM'd the worker.
70
- let env = null;
71
- let reportHtml = null;
72
- beforeAll(() => {
73
- reportHtml = readReportOrSkip();
74
- if (reportHtml)
75
- env = bootDashboard(reportHtml);
76
- });
77
- // Strip transient overlays/drawers between tests so the single shared boot
78
- // doesn't leak UI state across `it` blocks.
79
- beforeEach(() => {
80
- if (!env)
81
- return;
82
- for (const sel of ['.function-card-overlay', '.help-drawer-overlay', '.help-drawer']) {
83
- for (const node of document.querySelectorAll(sel))
84
- node.remove();
85
- }
86
- });
87
- it('latest.html embeds the graph catalog', () => {
88
- if (!reportHtml) {
89
- expect(true).toBe(true);
90
- return;
91
- }
92
- expect(reportHtml).toContain('id="graph-catalog"');
93
- });
94
- it('boots without throwing and registers the 3 restructured Code Paths views', () => {
95
- if (!env) {
96
- expect(true).toBe(true);
97
- return;
98
- }
99
- expect(env.views).toBeDefined();
100
- // The restructured explore set: graph (node-link, with the SCC cycle
101
- // highlight fold) / coupling / distribution. The single-metric views
102
- // (hot/big/wide/untested) and the standalone SCCs view were dropped
103
- // once their signal moved into the engine gate rules; the standalone
104
- // Search subtab was folded into the Functions (distribution) view.
105
- expect(env.views.length).toBe(3);
106
- expect(new Set(env.views.map((v) => v.id))).toEqual(new Set(['graph', 'coupling', 'distribution']));
107
- });
108
- it('Code Paths panel hosts Sessions and Explore subtabs', () => {
109
- if (!env) {
110
- expect(true).toBe(true);
111
- return;
112
- }
113
- expect(document.querySelector('#panel-code-paths-sessions')).not.toBeNull();
114
- expect(document.querySelector('#panel-code-paths-explore')).not.toBeNull();
115
- expect(document.querySelector('#panel-code-paths .subtab[data-subtab="sessions"]')).not.toBeNull();
116
- expect(document.querySelector('#panel-code-paths .subtab[data-subtab="explore"]')).not.toBeNull();
117
- });
118
- it('renders the name-filter search input inside the Functions (distribution) view', () => {
119
- if (!env) {
120
- expect(true).toBe(true);
121
- return;
122
- }
123
- activateExploreSubtab();
124
- env.activateView('distribution');
125
- const input = document.querySelector('#code-paths-view-distribution #code-paths-search-distribution');
126
- expect(input).not.toBeNull();
127
- // The standalone Search view is gone — no #code-paths-view-search container.
128
- expect(document.querySelector('#code-paths-view-search')).toBeNull();
129
- });
130
- it('every Explore view container exists and the active one renders something', () => {
131
- if (!env) {
132
- expect(true).toBe(true);
133
- return;
134
- }
135
- activateExploreSubtab();
136
- for (const id of ['graph', 'coupling', 'distribution']) {
137
- const c = document.querySelector('#code-paths-view-' + id);
138
- expect(c).not.toBeNull();
139
- }
140
- const active = document.querySelector('.code-paths-view.active');
141
- expect(active).not.toBeNull();
142
- const hasRows = active.querySelector('[data-body-hash]');
143
- const hasEmpty = active.querySelector('.empty');
144
- expect(Boolean(hasRows) || Boolean(hasEmpty)).toBe(true);
145
- });
146
- it('Function Card overlay opens for the first row of the distribution view', () => {
147
- if (!env) {
148
- expect(true).toBe(true);
149
- return;
150
- }
151
- activateExploreSubtab();
152
- env.activateView('distribution');
153
- const firstRow = document.querySelector('#code-paths-view-distribution [data-body-hash]');
154
- if (!firstRow) {
155
- expect(true).toBe(true);
156
- return;
157
- }
158
- env.openFunctionCard(firstRow.dataset.bodyHash);
159
- const overlays = document.querySelectorAll('.function-card-overlay');
160
- expect(overlays.length).toBe(1);
161
- });
162
- it('typing into the Functions name filter re-filters the table in place', () => {
163
- if (!env) {
164
- expect(true).toBe(true);
165
- return;
166
- }
167
- activateExploreSubtab();
168
- env.activateView('distribution');
169
- const view = document.querySelector('#code-paths-view-distribution');
170
- const allRowsBefore = view.querySelectorAll('[data-body-hash]').length;
171
- const input = view.querySelector('#code-paths-search-distribution');
172
- // A query that should match nothing collapses to the empty state.
173
- input.value = 'zzz_no_such_function_xyzzy';
174
- input.dispatchEvent(new Event('input', { bubbles: true }));
175
- const afterNoMatch = view.querySelectorAll('[data-body-hash]').length;
176
- const hasEmpty = view.querySelector('.empty');
177
- expect(afterNoMatch === 0 || Boolean(hasEmpty)).toBe(true);
178
- // Clearing the query restores the full distribution.
179
- input.value = '';
180
- input.dispatchEvent(new Event('input', { bubbles: true }));
181
- const afterClear = view.querySelectorAll('[data-body-hash]').length;
182
- expect(afterClear).toBe(allRowsBefore);
183
- });
184
- it('the active view section heading exposes an info button that opens the help drawer', () => {
185
- if (!env) {
186
- expect(true).toBe(true);
187
- return;
188
- }
189
- activateExploreSubtab();
190
- env.activateView('distribution');
191
- const info = document.querySelector('#code-paths-view-distribution .section-info');
192
- expect(info).not.toBeNull();
193
- info.click();
194
- const drawer = document.querySelector('.help-drawer');
195
- expect(drawer).not.toBeNull();
196
- expect(drawer.querySelector('h3').textContent).toBe('Functions (distribution)');
197
- // Close.
198
- document.querySelector('.help-drawer-close').click();
199
- expect(document.querySelector('.help-drawer-overlay')).toBeNull();
200
- });
201
- it('openCodePathsSession switches to Code Paths and selects the session row', () => {
202
- if (!env) {
203
- expect(true).toBe(true);
204
- return;
205
- }
206
- const firstGraphRow = document.querySelector('#panel-code-paths-sessions tr[data-session-id]');
207
- if (!firstGraphRow) {
208
- expect(true).toBe(true);
209
- return;
210
- } // No graph sessions yet.
211
- const sessionId = firstGraphRow.dataset.sessionId;
212
- env.openCodePathsSession(sessionId);
213
- const codePathsTab = document.querySelector('.tab[data-tab="code-paths"]');
214
- expect(codePathsTab.classList.contains('active')).toBe(true);
215
- expect(document.querySelector('#panel-code-paths-sessions').classList.contains('active')).toBe(true);
216
- const selected = document.querySelector('#panel-code-paths-sessions tr.selected');
217
- expect(selected).not.toBeNull();
218
- expect(selected.dataset.sessionId).toBe(sessionId);
219
- });
220
- });
221
- //# sourceMappingURL=dashboard-validation.integration.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"dashboard-validation.integration.test.js","sourceRoot":"","sources":["../../src/__tests__/dashboard-validation.integration.test.ts"],"names":[],"mappings":"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"}
@@ -1,12 +0,0 @@
1
- /**
2
- * @vitest-environment jsdom
3
- *
4
- * View conformance — §10.1 invariant asserted at runtime.
5
- *
6
- * Every registered View must have:
7
- * - id ∈ {graph, coupling, distribution}
8
- * - label: non-empty string
9
- * - render: a function
10
- */
11
- export {};
12
- //# sourceMappingURL=dashboard-view-conformance.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"dashboard-view-conformance.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/dashboard-view-conformance.test.ts"],"names":[],"mappings":"AACA;;;;;;;;;GASG"}
@@ -1,52 +0,0 @@
1
- /// <reference lib="dom" />
2
- /**
3
- * @vitest-environment jsdom
4
- *
5
- * View conformance — §10.1 invariant asserted at runtime.
6
- *
7
- * Every registered View must have:
8
- * - id ∈ {graph, coupling, distribution}
9
- * - label: non-empty string
10
- * - render: a function
11
- */
12
- import { describe, expect, it } from 'vitest';
13
- import { DASHBOARD_CLIENT_BUNDLE } from '../client-bundle.generated.js';
14
- const expectedIds = new Set(['graph', 'coupling', 'distribution']);
15
- function loadViews() {
16
- // The whole Code Paths panel + its three views now live in the typed client
17
- // bundle (L4): loading the bundle registers coupling / distribution / graph
18
- // into the bundle's `views` global at IIFE eval. Declare the page globals the
19
- // bundle reads at load.
20
- const head = `
21
- var sessions = [];
22
- var EDITOR_PROTOCOL = null;
23
- `;
24
- const tail = `
25
- return { views };
26
- `;
27
- // eslint-disable-next-line @typescript-eslint/no-implied-eval, sonarjs/code-eval -- Trusted source: our own bundled dashboard JS.
28
- const factory = new Function(head + DASHBOARD_CLIENT_BUNDLE + tail);
29
- return factory().views;
30
- }
31
- describe('view conformance — §10.1', () => {
32
- it('exactly three views are registered', () => {
33
- const views = loadViews();
34
- expect(views.length).toBe(3);
35
- });
36
- it('every view has a known id, non-empty label, and a render function', () => {
37
- const views = loadViews();
38
- for (const v of views) {
39
- expect(expectedIds.has(v.id)).toBe(true);
40
- expect(typeof v.label).toBe('string');
41
- expect(v.label.length).toBeGreaterThan(0);
42
- expect(typeof v.render).toBe('function');
43
- }
44
- });
45
- it('all expected ids are present', () => {
46
- const views = loadViews();
47
- const ids = new Set(views.map((v) => v.id));
48
- for (const id of expectedIds)
49
- expect(ids.has(id)).toBe(true);
50
- });
51
- });
52
- //# sourceMappingURL=dashboard-view-conformance.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"dashboard-view-conformance.test.js","sourceRoot":"","sources":["../../src/__tests__/dashboard-view-conformance.test.ts"],"names":[],"mappings":"AAAA,2BAA2B;AAC3B;;;;;;;;;GASG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAE9C,OAAO,EAAE,uBAAuB,EAAE,MAAM,+BAA+B,CAAC;AAExE,MAAM,WAAW,GAAG,IAAI,GAAG,CAAC,CAAC,OAAO,EAAE,UAAU,EAAE,cAAc,CAAC,CAAC,CAAC;AAMnE,SAAS,SAAS;IAChB,4EAA4E;IAC5E,4EAA4E;IAC5E,8EAA8E;IAC9E,wBAAwB;IACxB,MAAM,IAAI,GAAG;;;CAGd,CAAC;IACA,MAAM,IAAI,GAAG;;CAEd,CAAC;IACA,kIAAkI;IAClI,MAAM,OAAO,GAAG,IAAI,QAAQ,CAAC,IAAI,GAAG,uBAAuB,GAAG,IAAI,CAAC,CAAC;IACpE,OAAQ,OAAO,EAAY,CAAC,KAAK,CAAC;AACpC,CAAC;AAED,QAAQ,CAAC,0BAA0B,EAAE,GAAG,EAAE;IACxC,EAAE,CAAC,oCAAoC,EAAE,GAAG,EAAE;QAC5C,MAAM,KAAK,GAAG,SAAS,EAAE,CAAC;QAC1B,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAC/B,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mEAAmE,EAAE,GAAG,EAAE;QAC3E,MAAM,KAAK,GAAG,SAAS,EAAE,CAAC;QAC1B,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;YACtB,MAAM,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACzC,MAAM,CAAC,OAAO,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YACtC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;YAC1C,MAAM,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QAC3C,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,8BAA8B,EAAE,GAAG,EAAE;QACtC,MAAM,KAAK,GAAG,SAAS,EAAE,CAAC;QAC1B,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QAC5C,KAAK,MAAM,EAAE,IAAI,WAAW;YAAE,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC/D,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -1,7 +0,0 @@
1
- /**
2
- * @vitest-environment jsdom
3
- *
4
- * View 4 (Package coupling) — N×N matrix + drilldown.
5
- */
6
- export {};
7
- //# sourceMappingURL=dashboard-view-coupling.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"dashboard-view-coupling.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/dashboard-view-coupling.test.ts"],"names":[],"mappings":"AACA;;;;GAIG"}