@opensip-cli/dashboard 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.
- package/LICENSE +202 -0
- package/NOTICE +8 -0
- package/README.md +31 -0
- package/dist/__tests__/catalog-provenance.test.d.ts +11 -0
- package/dist/__tests__/catalog-provenance.test.d.ts.map +1 -0
- package/dist/__tests__/catalog-provenance.test.js +130 -0
- package/dist/__tests__/catalog-provenance.test.js.map +1 -0
- package/dist/__tests__/coupling-attribution.test.d.ts +9 -0
- package/dist/__tests__/coupling-attribution.test.d.ts.map +1 -0
- package/dist/__tests__/coupling-attribution.test.js +99 -0
- package/dist/__tests__/coupling-attribution.test.js.map +1 -0
- package/dist/__tests__/dashboard-bundle-weight.test.d.ts +16 -0
- package/dist/__tests__/dashboard-bundle-weight.test.d.ts.map +1 -0
- package/dist/__tests__/dashboard-bundle-weight.test.js +73 -0
- package/dist/__tests__/dashboard-bundle-weight.test.js.map +1 -0
- package/dist/__tests__/dashboard-cell-containment.test.d.ts +2 -0
- package/dist/__tests__/dashboard-cell-containment.test.d.ts.map +1 -0
- package/dist/__tests__/dashboard-cell-containment.test.js +49 -0
- package/dist/__tests__/dashboard-cell-containment.test.js.map +1 -0
- package/dist/__tests__/dashboard-cytoscape-vendor.test.d.ts +10 -0
- package/dist/__tests__/dashboard-cytoscape-vendor.test.d.ts.map +1 -0
- package/dist/__tests__/dashboard-cytoscape-vendor.test.js +40 -0
- package/dist/__tests__/dashboard-cytoscape-vendor.test.js.map +1 -0
- package/dist/__tests__/dashboard-editor-link.test.d.ts +5 -0
- package/dist/__tests__/dashboard-editor-link.test.d.ts.map +1 -0
- package/dist/__tests__/dashboard-editor-link.test.js +36 -0
- package/dist/__tests__/dashboard-editor-link.test.js.map +1 -0
- package/dist/__tests__/dashboard-filters.test.d.ts +9 -0
- package/dist/__tests__/dashboard-filters.test.d.ts.map +1 -0
- package/dist/__tests__/dashboard-filters.test.js +95 -0
- package/dist/__tests__/dashboard-filters.test.js.map +1 -0
- package/dist/__tests__/dashboard-function-card-singleton.test.d.ts +9 -0
- package/dist/__tests__/dashboard-function-card-singleton.test.d.ts.map +1 -0
- package/dist/__tests__/dashboard-function-card-singleton.test.js +87 -0
- package/dist/__tests__/dashboard-function-card-singleton.test.js.map +1 -0
- package/dist/__tests__/dashboard-function-card.test.d.ts +10 -0
- package/dist/__tests__/dashboard-function-card.test.d.ts.map +1 -0
- package/dist/__tests__/dashboard-function-card.test.js +403 -0
- package/dist/__tests__/dashboard-function-card.test.js.map +1 -0
- package/dist/__tests__/dashboard-function-row.test.d.ts +11 -0
- package/dist/__tests__/dashboard-function-row.test.d.ts.map +1 -0
- package/dist/__tests__/dashboard-function-row.test.js +101 -0
- package/dist/__tests__/dashboard-function-row.test.js.map +1 -0
- package/dist/__tests__/dashboard-generator-graph-catalog.test.d.ts +9 -0
- package/dist/__tests__/dashboard-generator-graph-catalog.test.d.ts.map +1 -0
- package/dist/__tests__/dashboard-generator-graph-catalog.test.js +75 -0
- package/dist/__tests__/dashboard-generator-graph-catalog.test.js.map +1 -0
- package/dist/__tests__/dashboard-graph-offline.integration.test.d.ts +13 -0
- package/dist/__tests__/dashboard-graph-offline.integration.test.d.ts.map +1 -0
- package/dist/__tests__/dashboard-graph-offline.integration.test.js +55 -0
- package/dist/__tests__/dashboard-graph-offline.integration.test.js.map +1 -0
- package/dist/__tests__/dashboard-graph-scc.test.d.ts +17 -0
- package/dist/__tests__/dashboard-graph-scc.test.d.ts.map +1 -0
- package/dist/__tests__/dashboard-graph-scc.test.js +89 -0
- package/dist/__tests__/dashboard-graph-scc.test.js.map +1 -0
- package/dist/__tests__/dashboard-graph-view-model.test.d.ts +12 -0
- package/dist/__tests__/dashboard-graph-view-model.test.d.ts.map +1 -0
- package/dist/__tests__/dashboard-graph-view-model.test.js +331 -0
- package/dist/__tests__/dashboard-graph-view-model.test.js.map +1 -0
- package/dist/__tests__/dashboard-help-drawer.test.d.ts +9 -0
- package/dist/__tests__/dashboard-help-drawer.test.d.ts.map +1 -0
- package/dist/__tests__/dashboard-help-drawer.test.js +101 -0
- package/dist/__tests__/dashboard-help-drawer.test.js.map +1 -0
- package/dist/__tests__/dashboard-html.test.d.ts +2 -0
- package/dist/__tests__/dashboard-html.test.d.ts.map +1 -0
- package/dist/__tests__/dashboard-html.test.js +169 -0
- package/dist/__tests__/dashboard-html.test.js.map +1 -0
- package/dist/__tests__/dashboard-indexes.test.d.ts +9 -0
- package/dist/__tests__/dashboard-indexes.test.d.ts.map +1 -0
- package/dist/__tests__/dashboard-indexes.test.js +211 -0
- package/dist/__tests__/dashboard-indexes.test.js.map +1 -0
- package/dist/__tests__/dashboard-path-utils.test.d.ts +6 -0
- package/dist/__tests__/dashboard-path-utils.test.d.ts.map +1 -0
- package/dist/__tests__/dashboard-path-utils.test.js +54 -0
- package/dist/__tests__/dashboard-path-utils.test.js.map +1 -0
- package/dist/__tests__/dashboard-search.test.d.ts +5 -0
- package/dist/__tests__/dashboard-search.test.d.ts.map +1 -0
- package/dist/__tests__/dashboard-search.test.js +46 -0
- package/dist/__tests__/dashboard-search.test.js.map +1 -0
- package/dist/__tests__/dashboard-sessions.test.d.ts +14 -0
- package/dist/__tests__/dashboard-sessions.test.d.ts.map +1 -0
- package/dist/__tests__/dashboard-sessions.test.js +330 -0
- package/dist/__tests__/dashboard-sessions.test.js.map +1 -0
- package/dist/__tests__/dashboard-trace.test.d.ts +5 -0
- package/dist/__tests__/dashboard-trace.test.d.ts.map +1 -0
- package/dist/__tests__/dashboard-trace.test.js +147 -0
- package/dist/__tests__/dashboard-trace.test.js.map +1 -0
- package/dist/__tests__/dashboard-validation.integration.test.d.ts +14 -0
- package/dist/__tests__/dashboard-validation.integration.test.d.ts.map +1 -0
- package/dist/__tests__/dashboard-validation.integration.test.js +221 -0
- package/dist/__tests__/dashboard-validation.integration.test.js.map +1 -0
- package/dist/__tests__/dashboard-view-conformance.test.d.ts +12 -0
- package/dist/__tests__/dashboard-view-conformance.test.d.ts.map +1 -0
- package/dist/__tests__/dashboard-view-conformance.test.js +58 -0
- package/dist/__tests__/dashboard-view-conformance.test.js.map +1 -0
- package/dist/__tests__/dashboard-view-coupling.test.d.ts +7 -0
- package/dist/__tests__/dashboard-view-coupling.test.d.ts.map +1 -0
- package/dist/__tests__/dashboard-view-coupling.test.js +381 -0
- package/dist/__tests__/dashboard-view-coupling.test.js.map +1 -0
- package/dist/__tests__/dashboard-view-distribution.test.d.ts +10 -0
- package/dist/__tests__/dashboard-view-distribution.test.d.ts.map +1 -0
- package/dist/__tests__/dashboard-view-distribution.test.js +272 -0
- package/dist/__tests__/dashboard-view-distribution.test.js.map +1 -0
- package/dist/__tests__/dashboard-view-graph.test.d.ts +13 -0
- package/dist/__tests__/dashboard-view-graph.test.d.ts.map +1 -0
- package/dist/__tests__/dashboard-view-graph.test.js +332 -0
- package/dist/__tests__/dashboard-view-graph.test.js.map +1 -0
- package/dist/__tests__/dashboard-view-template.test.d.ts +21 -0
- package/dist/__tests__/dashboard-view-template.test.d.ts.map +1 -0
- package/dist/__tests__/dashboard-view-template.test.js +153 -0
- package/dist/__tests__/dashboard-view-template.test.js.map +1 -0
- package/dist/__tests__/dashboard.test.d.ts +2 -0
- package/dist/__tests__/dashboard.test.d.ts.map +1 -0
- package/dist/__tests__/dashboard.test.js +129 -0
- package/dist/__tests__/dashboard.test.js.map +1 -0
- package/dist/__tests__/graph-tab.test.d.ts +10 -0
- package/dist/__tests__/graph-tab.test.d.ts.map +1 -0
- package/dist/__tests__/graph-tab.test.js +76 -0
- package/dist/__tests__/graph-tab.test.js.map +1 -0
- package/dist/checks.d.ts +7 -0
- package/dist/checks.d.ts.map +1 -0
- package/dist/checks.js +283 -0
- package/dist/checks.js.map +1 -0
- package/dist/code-paths/__tests__/views-registry.test.d.ts +13 -0
- package/dist/code-paths/__tests__/views-registry.test.d.ts.map +1 -0
- package/dist/code-paths/__tests__/views-registry.test.js +39 -0
- package/dist/code-paths/__tests__/views-registry.test.js.map +1 -0
- package/dist/code-paths/catalog-provenance.d.ts +22 -0
- package/dist/code-paths/catalog-provenance.d.ts.map +1 -0
- package/dist/code-paths/catalog-provenance.js +108 -0
- package/dist/code-paths/catalog-provenance.js.map +1 -0
- package/dist/code-paths/catalog-recipes-tables.d.ts +11 -0
- package/dist/code-paths/catalog-recipes-tables.d.ts.map +1 -0
- package/dist/code-paths/catalog-recipes-tables.js +86 -0
- package/dist/code-paths/catalog-recipes-tables.js.map +1 -0
- package/dist/code-paths/cytoscape-vendor.d.ts +27 -0
- package/dist/code-paths/cytoscape-vendor.d.ts.map +1 -0
- package/dist/code-paths/cytoscape-vendor.js +68 -0
- package/dist/code-paths/cytoscape-vendor.js.map +1 -0
- package/dist/code-paths/editor-link.d.ts +10 -0
- package/dist/code-paths/editor-link.d.ts.map +1 -0
- package/dist/code-paths/editor-link.js +20 -0
- package/dist/code-paths/editor-link.js.map +1 -0
- package/dist/code-paths/filters.d.ts +19 -0
- package/dist/code-paths/filters.d.ts.map +1 -0
- package/dist/code-paths/filters.js +47 -0
- package/dist/code-paths/filters.js.map +1 -0
- package/dist/code-paths/function-card.d.ts +15 -0
- package/dist/code-paths/function-card.d.ts.map +1 -0
- package/dist/code-paths/function-card.js +169 -0
- package/dist/code-paths/function-card.js.map +1 -0
- package/dist/code-paths/function-row.d.ts +17 -0
- package/dist/code-paths/function-row.d.ts.map +1 -0
- package/dist/code-paths/function-row.js +77 -0
- package/dist/code-paths/function-row.js.map +1 -0
- package/dist/code-paths/graph-controls.d.ts +27 -0
- package/dist/code-paths/graph-controls.d.ts.map +1 -0
- package/dist/code-paths/graph-controls.js +257 -0
- package/dist/code-paths/graph-controls.js.map +1 -0
- package/dist/code-paths/graph-scc.d.ts +32 -0
- package/dist/code-paths/graph-scc.d.ts.map +1 -0
- package/dist/code-paths/graph-scc.js +136 -0
- package/dist/code-paths/graph-scc.js.map +1 -0
- package/dist/code-paths/graph-stylesheet.d.ts +22 -0
- package/dist/code-paths/graph-stylesheet.d.ts.map +1 -0
- package/dist/code-paths/graph-stylesheet.js +121 -0
- package/dist/code-paths/graph-stylesheet.js.map +1 -0
- package/dist/code-paths/graph-view-model.d.ts +120 -0
- package/dist/code-paths/graph-view-model.d.ts.map +1 -0
- package/dist/code-paths/graph-view-model.js +199 -0
- package/dist/code-paths/graph-view-model.js.map +1 -0
- package/dist/code-paths/help-drawer.d.ts +18 -0
- package/dist/code-paths/help-drawer.d.ts.map +1 -0
- package/dist/code-paths/help-drawer.js +54 -0
- package/dist/code-paths/help-drawer.js.map +1 -0
- package/dist/code-paths/indexes.d.ts +28 -0
- package/dist/code-paths/indexes.d.ts.map +1 -0
- package/dist/code-paths/indexes.js +97 -0
- package/dist/code-paths/indexes.js.map +1 -0
- package/dist/code-paths/path-utils.d.ts +15 -0
- package/dist/code-paths/path-utils.d.ts.map +1 -0
- package/dist/code-paths/path-utils.js +47 -0
- package/dist/code-paths/path-utils.js.map +1 -0
- package/dist/code-paths/search.d.ts +14 -0
- package/dist/code-paths/search.d.ts.map +1 -0
- package/dist/code-paths/search.js +54 -0
- package/dist/code-paths/search.js.map +1 -0
- package/dist/code-paths/trace.d.ts +11 -0
- package/dist/code-paths/trace.d.ts.map +1 -0
- package/dist/code-paths/trace.js +60 -0
- package/dist/code-paths/trace.js.map +1 -0
- package/dist/code-paths/view-coupling.d.ts +22 -0
- package/dist/code-paths/view-coupling.d.ts.map +1 -0
- package/dist/code-paths/view-coupling.js +218 -0
- package/dist/code-paths/view-coupling.js.map +1 -0
- package/dist/code-paths/view-distribution.d.ts +20 -0
- package/dist/code-paths/view-distribution.d.ts.map +1 -0
- package/dist/code-paths/view-distribution.js +82 -0
- package/dist/code-paths/view-distribution.js.map +1 -0
- package/dist/code-paths/view-graph.d.ts +35 -0
- package/dist/code-paths/view-graph.d.ts.map +1 -0
- package/dist/code-paths/view-graph.js +379 -0
- package/dist/code-paths/view-graph.js.map +1 -0
- package/dist/code-paths/view-template.d.ts +154 -0
- package/dist/code-paths/view-template.d.ts.map +1 -0
- package/dist/code-paths/view-template.js +218 -0
- package/dist/code-paths/view-template.js.map +1 -0
- package/dist/code-paths/views-registry.d.ts +13 -0
- package/dist/code-paths/views-registry.d.ts.map +1 -0
- package/dist/code-paths/views-registry.js +53 -0
- package/dist/code-paths/views-registry.js.map +1 -0
- package/dist/code-paths.d.ts +69 -0
- package/dist/code-paths.d.ts.map +1 -0
- package/dist/code-paths.js +356 -0
- package/dist/code-paths.js.map +1 -0
- package/dist/css/cards.d.ts +9 -0
- package/dist/css/cards.d.ts.map +1 -0
- package/dist/css/cards.js +36 -0
- package/dist/css/cards.js.map +1 -0
- package/dist/css/code-paths.d.ts +9 -0
- package/dist/css/code-paths.d.ts.map +1 -0
- package/dist/css/code-paths.js +111 -0
- package/dist/css/code-paths.js.map +1 -0
- package/dist/css/data-table.d.ts +12 -0
- package/dist/css/data-table.d.ts.map +1 -0
- package/dist/css/data-table.js +103 -0
- package/dist/css/data-table.js.map +1 -0
- package/dist/css/function-card.d.ts +6 -0
- package/dist/css/function-card.d.ts.map +1 -0
- package/dist/css/function-card.js +26 -0
- package/dist/css/function-card.js.map +1 -0
- package/dist/css/help-drawer.d.ts +6 -0
- package/dist/css/help-drawer.d.ts.map +1 -0
- package/dist/css/help-drawer.js +22 -0
- package/dist/css/help-drawer.js.map +1 -0
- package/dist/css/tabs.d.ts +9 -0
- package/dist/css/tabs.d.ts.map +1 -0
- package/dist/css/tabs.js +28 -0
- package/dist/css/tabs.js.map +1 -0
- package/dist/css/theme.d.ts +8 -0
- package/dist/css/theme.d.ts.map +1 -0
- package/dist/css/theme.js +34 -0
- package/dist/css/theme.js.map +1 -0
- package/dist/css.d.ts +13 -0
- package/dist/css.d.ts.map +1 -0
- package/dist/css.js +30 -0
- package/dist/css.js.map +1 -0
- package/dist/generator.d.ts +33 -0
- package/dist/generator.d.ts.map +1 -0
- package/dist/generator.js +161 -0
- package/dist/generator.js.map +1 -0
- package/dist/index.d.ts +21 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +20 -0
- package/dist/index.js.map +1 -0
- package/dist/overview.d.ts +13 -0
- package/dist/overview.d.ts.map +1 -0
- package/dist/overview.js +91 -0
- package/dist/overview.js.map +1 -0
- package/dist/recipes.d.ts +6 -0
- package/dist/recipes.d.ts.map +1 -0
- package/dist/recipes.js +68 -0
- package/dist/recipes.js.map +1 -0
- package/dist/sessions.d.ts +6 -0
- package/dist/sessions.d.ts.map +1 -0
- package/dist/sessions.js +288 -0
- package/dist/sessions.js.map +1 -0
- package/dist/shared/el.d.ts +13 -0
- package/dist/shared/el.d.ts.map +1 -0
- package/dist/shared/el.js +27 -0
- package/dist/shared/el.js.map +1 -0
- package/dist/shared/pagination.d.ts +15 -0
- package/dist/shared/pagination.d.ts.map +1 -0
- package/dist/shared/pagination.js +113 -0
- package/dist/shared/pagination.js.map +1 -0
- package/dist/shared/sortable.d.ts +14 -0
- package/dist/shared/sortable.d.ts.map +1 -0
- package/dist/shared/sortable.js +101 -0
- package/dist/shared/sortable.js.map +1 -0
- package/dist/shared/tab-activators.d.ts +16 -0
- package/dist/shared/tab-activators.d.ts.map +1 -0
- package/dist/shared/tab-activators.js +33 -0
- package/dist/shared/tab-activators.js.map +1 -0
- package/dist/shared/tab-bar.d.ts +8 -0
- package/dist/shared/tab-bar.d.ts.map +1 -0
- package/dist/shared/tab-bar.js +20 -0
- package/dist/shared/tab-bar.js.map +1 -0
- package/dist/shared.d.ts +26 -0
- package/dist/shared.d.ts.map +1 -0
- package/dist/shared.js +39 -0
- package/dist/shared.js.map +1 -0
- package/dist/subtab-bar.d.ts +23 -0
- package/dist/subtab-bar.d.ts.map +1 -0
- package/dist/subtab-bar.js +77 -0
- package/dist/subtab-bar.js.map +1 -0
- package/dist/tool-tab-registry.d.ts +76 -0
- package/dist/tool-tab-registry.d.ts.map +1 -0
- package/dist/tool-tab-registry.js +44 -0
- package/dist/tool-tab-registry.js.map +1 -0
- package/dist/tool-tabs-registrations.d.ts +19 -0
- package/dist/tool-tabs-registrations.d.ts.map +1 -0
- package/dist/tool-tabs-registrations.js +46 -0
- package/dist/tool-tabs-registrations.js.map +1 -0
- package/dist/tool-tabs.d.ts +12 -0
- package/dist/tool-tabs.d.ts.map +1 -0
- package/dist/tool-tabs.js +80 -0
- package/dist/tool-tabs.js.map +1 -0
- package/dist/vendor/cytoscape-bundle.js +600 -0
- package/package.json +52 -0
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Containment contract for `.data-table` cells.
|
|
3
|
+
*
|
|
4
|
+
* Long free-text columns (finding messages, file paths, and the code
|
|
5
|
+
* snippets inside suggestions) used to overrun the card edge and bleed
|
|
6
|
+
* past the page boundary, because the table default was
|
|
7
|
+
* `white-space: nowrap` with no break behaviour. The fix flips the
|
|
8
|
+
* BODY-cell default to wrap-and-break, with an explicit `.cell-nowrap`
|
|
9
|
+
* opt-out for short metric columns.
|
|
10
|
+
*
|
|
11
|
+
* This guards the systemic invariant: no view can bleed horizontally
|
|
12
|
+
* unless it deliberately opts a long-text cell out of wrapping.
|
|
13
|
+
*/
|
|
14
|
+
import { describe, it, expect } from 'vitest';
|
|
15
|
+
import { dashboardCss } from '../css.js';
|
|
16
|
+
import { generateDashboardHtml } from '../generator.js';
|
|
17
|
+
// Collapse whitespace so the assertions don't depend on formatting.
|
|
18
|
+
const css = dashboardCss().replaceAll(/\s+/g, ' ');
|
|
19
|
+
describe('data-table cell containment contract', () => {
|
|
20
|
+
it('body cells wrap and break long unbreakable tokens by default', () => {
|
|
21
|
+
expect(css).toContain('.data-table td { white-space: normal; overflow-wrap: anywhere; }');
|
|
22
|
+
});
|
|
23
|
+
it('exposes a .cell-nowrap opt-out for short metric columns', () => {
|
|
24
|
+
expect(css).toContain('.data-table td.cell-nowrap { white-space: nowrap; }');
|
|
25
|
+
});
|
|
26
|
+
it('keeps header labels on a single line', () => {
|
|
27
|
+
expect(css).toContain('.data-table th { white-space: nowrap; }');
|
|
28
|
+
});
|
|
29
|
+
it('does not re-introduce a blanket nowrap on body cells', () => {
|
|
30
|
+
// The old footgun: a rule forcing every td onto one line. If this
|
|
31
|
+
// reappears, free-text columns overflow again.
|
|
32
|
+
expect(css).not.toContain('.data-table td, .data-table th { white-space: nowrap; }');
|
|
33
|
+
});
|
|
34
|
+
it('the session timestamp cell opts out via .cell-nowrap', () => {
|
|
35
|
+
// Guards the view wiring: short, space-containing cells (timestamps)
|
|
36
|
+
// must stay on one line under the wrap-by-default contract.
|
|
37
|
+
const html = generateDashboardHtml({ sessions: [] });
|
|
38
|
+
expect(html).toContain("class:'cell-nowrap'");
|
|
39
|
+
});
|
|
40
|
+
it('the coupling matrix (the one non-.data-table table) stays contained by its own scroll wrapper', () => {
|
|
41
|
+
// The coupling grid deliberately opts out of the .data-table contract
|
|
42
|
+
// (it is a wide 2D matrix, not free-text rows). Its containment relies
|
|
43
|
+
// on .coupling-scroll bounding it to the card instead of bleeding past
|
|
44
|
+
// the page. Pin that so the opt-out keeps its own safety net.
|
|
45
|
+
expect(css).toContain('.coupling-scroll { overflow: auto;');
|
|
46
|
+
expect(css).toContain('max-width: 100%;');
|
|
47
|
+
});
|
|
48
|
+
});
|
|
49
|
+
//# sourceMappingURL=dashboard-cell-containment.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dashboard-cell-containment.test.js","sourceRoot":"","sources":["../../src/__tests__/dashboard-cell-containment.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AACH,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAE9C,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,EAAE,qBAAqB,EAAE,MAAM,iBAAiB,CAAC;AAExD,oEAAoE;AACpE,MAAM,GAAG,GAAG,YAAY,EAAE,CAAC,UAAU,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;AAEnD,QAAQ,CAAC,sCAAsC,EAAE,GAAG,EAAE;IACpD,EAAE,CAAC,8DAA8D,EAAE,GAAG,EAAE;QACtE,MAAM,CAAC,GAAG,CAAC,CAAC,SAAS,CAAC,kEAAkE,CAAC,CAAC;IAC5F,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,yDAAyD,EAAE,GAAG,EAAE;QACjE,MAAM,CAAC,GAAG,CAAC,CAAC,SAAS,CAAC,qDAAqD,CAAC,CAAC;IAC/E,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,sCAAsC,EAAE,GAAG,EAAE;QAC9C,MAAM,CAAC,GAAG,CAAC,CAAC,SAAS,CAAC,yCAAyC,CAAC,CAAC;IACnE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,sDAAsD,EAAE,GAAG,EAAE;QAC9D,kEAAkE;QAClE,+CAA+C;QAC/C,MAAM,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,yDAAyD,CAAC,CAAC;IACvF,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,sDAAsD,EAAE,GAAG,EAAE;QAC9D,qEAAqE;QACrE,4DAA4D;QAC5D,MAAM,IAAI,GAAG,qBAAqB,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC,CAAC;QACrD,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,qBAAqB,CAAC,CAAC;IAChD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+FAA+F,EAAE,GAAG,EAAE;QACvG,sEAAsE;QACtE,uEAAuE;QACvE,uEAAuE;QACvE,8DAA8D;QAC9D,MAAM,CAAC,GAAG,CAAC,CAAC,SAAS,CAAC,oCAAoC,CAAC,CAAC;QAC5D,MAAM,CAAC,GAAG,CAAC,CAAC,SAAS,CAAC,kBAAkB,CAAC,CAAC;IAC5C,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Vendored Cytoscape emitter — smoke + byte-size guard.
|
|
3
|
+
*
|
|
4
|
+
* The emitter reads the committed `src/vendor/cytoscape-bundle.js` blob
|
|
5
|
+
* and returns it verbatim. These tests assert the version-stamp banner is
|
|
6
|
+
* present, the renderer globals are declared, and the raw size stays
|
|
7
|
+
* within the Phase 0 budget so a careless version bump fails CI.
|
|
8
|
+
*/
|
|
9
|
+
export {};
|
|
10
|
+
//# sourceMappingURL=dashboard-cytoscape-vendor.test.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dashboard-cytoscape-vendor.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/dashboard-cytoscape-vendor.test.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Vendored Cytoscape emitter — smoke + byte-size guard.
|
|
3
|
+
*
|
|
4
|
+
* The emitter reads the committed `src/vendor/cytoscape-bundle.js` blob
|
|
5
|
+
* and returns it verbatim. These tests assert the version-stamp banner is
|
|
6
|
+
* present, the renderer globals are declared, and the raw size stays
|
|
7
|
+
* within the Phase 0 budget so a careless version bump fails CI.
|
|
8
|
+
*/
|
|
9
|
+
import { describe, expect, it } from 'vitest';
|
|
10
|
+
import { dashboardCytoscapeVendorJs } from '../code-paths/cytoscape-vendor.js';
|
|
11
|
+
/** Phase 0 raw-byte budget (matches scripts/vendor-cytoscape.mjs). */
|
|
12
|
+
const BUDGET_KB = 600;
|
|
13
|
+
describe('dashboardCytoscapeVendorJs', () => {
|
|
14
|
+
it('starts with the vendor version-stamp banner', () => {
|
|
15
|
+
const js = dashboardCytoscapeVendorJs();
|
|
16
|
+
expect(js.startsWith('/*')).toBe(true);
|
|
17
|
+
expect(js).toContain('VENDORED — DO NOT EDIT BY HAND.');
|
|
18
|
+
expect(js).toContain('cytoscape@');
|
|
19
|
+
expect(js).toContain('cytoscape-dagre@');
|
|
20
|
+
});
|
|
21
|
+
it('declares the cytoscape + cytoscapeDagre UMD globals', () => {
|
|
22
|
+
const js = dashboardCytoscapeVendorJs();
|
|
23
|
+
// UMD wrappers assign the global via `root["cytoscape"]` / `root.cytoscape`.
|
|
24
|
+
expect(js.includes('cytoscape')).toBe(true);
|
|
25
|
+
expect(/cytoscapeDagre|cytoscape-dagre/.test(js)).toBe(true);
|
|
26
|
+
});
|
|
27
|
+
it('does not vendor a standalone dagre global (self-bundled by cytoscape-dagre)', () => {
|
|
28
|
+
const js = dashboardCytoscapeVendorJs();
|
|
29
|
+
// The banner documents the deliberate omission.
|
|
30
|
+
expect(js).toContain('no standalone dagre is');
|
|
31
|
+
});
|
|
32
|
+
it('stays within the raw-byte budget', () => {
|
|
33
|
+
const bytes = Buffer.byteLength(dashboardCytoscapeVendorJs(), 'utf8');
|
|
34
|
+
expect(bytes).toBeLessThan(BUDGET_KB * 1024);
|
|
35
|
+
});
|
|
36
|
+
it('is deterministic across calls (cached)', () => {
|
|
37
|
+
expect(dashboardCytoscapeVendorJs()).toBe(dashboardCytoscapeVendorJs());
|
|
38
|
+
});
|
|
39
|
+
});
|
|
40
|
+
//# sourceMappingURL=dashboard-cytoscape-vendor.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dashboard-cytoscape-vendor.test.js","sourceRoot":"","sources":["../../src/__tests__/dashboard-cytoscape-vendor.test.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAE9C,OAAO,EAAE,0BAA0B,EAAE,MAAM,mCAAmC,CAAC;AAE/E,sEAAsE;AACtE,MAAM,SAAS,GAAG,GAAG,CAAC;AAEtB,QAAQ,CAAC,4BAA4B,EAAE,GAAG,EAAE;IAC1C,EAAE,CAAC,6CAA6C,EAAE,GAAG,EAAE;QACrD,MAAM,EAAE,GAAG,0BAA0B,EAAE,CAAC;QACxC,MAAM,CAAC,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACvC,MAAM,CAAC,EAAE,CAAC,CAAC,SAAS,CAAC,iCAAiC,CAAC,CAAC;QACxD,MAAM,CAAC,EAAE,CAAC,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC;QACnC,MAAM,CAAC,EAAE,CAAC,CAAC,SAAS,CAAC,kBAAkB,CAAC,CAAC;IAC3C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qDAAqD,EAAE,GAAG,EAAE;QAC7D,MAAM,EAAE,GAAG,0BAA0B,EAAE,CAAC;QACxC,6EAA6E;QAC7E,MAAM,CAAC,EAAE,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC5C,MAAM,CAAC,gCAAgC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC/D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6EAA6E,EAAE,GAAG,EAAE;QACrF,MAAM,EAAE,GAAG,0BAA0B,EAAE,CAAC;QACxC,gDAAgD;QAChD,MAAM,CAAC,EAAE,CAAC,CAAC,SAAS,CAAC,wBAAwB,CAAC,CAAC;IACjD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,kCAAkC,EAAE,GAAG,EAAE;QAC1C,MAAM,KAAK,GAAG,MAAM,CAAC,UAAU,CAAC,0BAA0B,EAAE,EAAE,MAAM,CAAC,CAAC;QACtE,MAAM,CAAC,KAAK,CAAC,CAAC,YAAY,CAAC,SAAS,GAAG,IAAI,CAAC,CAAC;IAC/C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wCAAwC,EAAE,GAAG,EAAE;QAChD,MAAM,CAAC,0BAA0B,EAAE,CAAC,CAAC,IAAI,CAAC,0BAA0B,EAAE,CAAC,CAAC;IAC1E,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dashboard-editor-link.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/dashboard-editor-link.test.ts"],"names":[],"mappings":"AAAA;;GAEG"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Editor deep-link URL generator tests.
|
|
3
|
+
*/
|
|
4
|
+
import { describe, expect, it } from 'vitest';
|
|
5
|
+
import { dashboardEditorLinkJs } from '../code-paths/editor-link.js';
|
|
6
|
+
function loadEditorLink(protocol) {
|
|
7
|
+
const protoSrc = protocol === null
|
|
8
|
+
? 'var EDITOR_PROTOCOL = null;'
|
|
9
|
+
: 'var EDITOR_PROTOCOL = ' + JSON.stringify(protocol) + ';';
|
|
10
|
+
// eslint-disable-next-line @typescript-eslint/no-implied-eval, sonarjs/code-eval -- Trusted source.
|
|
11
|
+
const fn = new Function(protoSrc + dashboardEditorLinkJs() + '\nreturn editorLinkUrl;')();
|
|
12
|
+
return fn;
|
|
13
|
+
}
|
|
14
|
+
describe('editorLinkUrl', () => {
|
|
15
|
+
it('produces vscode://file/<path>:<line> for vscode', () => {
|
|
16
|
+
const f = loadEditorLink('vscode');
|
|
17
|
+
expect(f('packages/x/src/x.ts', 42)).toBe('vscode://file/packages/x/src/x.ts:42');
|
|
18
|
+
});
|
|
19
|
+
it('produces cursor://file/<path>:<line> for cursor', () => {
|
|
20
|
+
const f = loadEditorLink('cursor');
|
|
21
|
+
expect(f('packages/x/src/x.ts', 7)).toBe('cursor://file/packages/x/src/x.ts:7');
|
|
22
|
+
});
|
|
23
|
+
it('returns null when EDITOR_PROTOCOL is null', () => {
|
|
24
|
+
const f = loadEditorLink(null);
|
|
25
|
+
expect(f('packages/x/src/x.ts', 1)).toBeNull();
|
|
26
|
+
});
|
|
27
|
+
it('returns null for an unrecognized protocol', () => {
|
|
28
|
+
const f = loadEditorLink('mystery');
|
|
29
|
+
expect(f('packages/x/src/x.ts', 1)).toBeNull();
|
|
30
|
+
});
|
|
31
|
+
it('falls back to line 1 when no line is provided', () => {
|
|
32
|
+
const f = loadEditorLink('vscode');
|
|
33
|
+
expect(f('packages/x/src/x.ts', 0)).toBe('vscode://file/packages/x/src/x.ts:1');
|
|
34
|
+
});
|
|
35
|
+
});
|
|
36
|
+
//# sourceMappingURL=dashboard-editor-link.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dashboard-editor-link.test.js","sourceRoot":"","sources":["../../src/__tests__/dashboard-editor-link.test.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAE9C,OAAO,EAAE,qBAAqB,EAAE,MAAM,8BAA8B,CAAC;AAErE,SAAS,cAAc,CACrB,QAAuB;IAEvB,MAAM,QAAQ,GACZ,QAAQ,KAAK,IAAI;QACf,CAAC,CAAC,6BAA6B;QAC/B,CAAC,CAAC,wBAAwB,GAAG,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,GAAG,GAAG,CAAC;IAChE,oGAAoG;IACpG,MAAM,EAAE,GAAG,IAAI,QAAQ,CAAC,QAAQ,GAAG,qBAAqB,EAAE,GAAG,yBAAyB,CAAC,EAGrE,CAAC;IACnB,OAAO,EAAE,CAAC;AACZ,CAAC;AAED,QAAQ,CAAC,eAAe,EAAE,GAAG,EAAE;IAC7B,EAAE,CAAC,iDAAiD,EAAE,GAAG,EAAE;QACzD,MAAM,CAAC,GAAG,cAAc,CAAC,QAAQ,CAAC,CAAC;QACnC,MAAM,CAAC,CAAC,CAAC,qBAAqB,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,sCAAsC,CAAC,CAAC;IACpF,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iDAAiD,EAAE,GAAG,EAAE;QACzD,MAAM,CAAC,GAAG,cAAc,CAAC,QAAQ,CAAC,CAAC;QACnC,MAAM,CAAC,CAAC,CAAC,qBAAqB,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,qCAAqC,CAAC,CAAC;IAClF,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2CAA2C,EAAE,GAAG,EAAE;QACnD,MAAM,CAAC,GAAG,cAAc,CAAC,IAAI,CAAC,CAAC;QAC/B,MAAM,CAAC,CAAC,CAAC,qBAAqB,EAAE,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC;IACjD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2CAA2C,EAAE,GAAG,EAAE;QACnD,MAAM,CAAC,GAAG,cAAc,CAAC,SAAS,CAAC,CAAC;QACpC,MAAM,CAAC,CAAC,CAAC,qBAAqB,EAAE,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC;IACjD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+CAA+C,EAAE,GAAG,EAAE;QACvD,MAAM,CAAC,GAAG,cAAc,CAAC,QAAQ,CAAC,CAAC;QACnC,MAAM,CAAC,CAAC,CAAC,qBAAqB,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,qCAAqC,CAAC,CAAC;IAClF,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @vitest-environment jsdom
|
|
3
|
+
*
|
|
4
|
+
* Filter chip predicate tests. Exercises the per-row `passesFilter`
|
|
5
|
+
* predicate (per-view filter behavior is asserted in each view's
|
|
6
|
+
* own test file; this file covers the predicate shape).
|
|
7
|
+
*/
|
|
8
|
+
export {};
|
|
9
|
+
//# sourceMappingURL=dashboard-filters.test.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dashboard-filters.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/dashboard-filters.test.ts"],"names":[],"mappings":"AACA;;;;;;GAMG"}
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
/// <reference lib="dom" />
|
|
2
|
+
/**
|
|
3
|
+
* @vitest-environment jsdom
|
|
4
|
+
*
|
|
5
|
+
* Filter chip predicate tests. Exercises the per-row `passesFilter`
|
|
6
|
+
* predicate (per-view filter behavior is asserted in each view's
|
|
7
|
+
* own test file; this file covers the predicate shape).
|
|
8
|
+
*/
|
|
9
|
+
import { describe, expect, it } from 'vitest';
|
|
10
|
+
import { dashboardFiltersJs } from '../code-paths/filters.js';
|
|
11
|
+
import { dashboardPathUtilsJs } from '../code-paths/path-utils.js';
|
|
12
|
+
function loadFilterEnv() {
|
|
13
|
+
// The filters/path-utils emitters expect `el(...)` and `views`/`graph*`
|
|
14
|
+
// globals at runtime. The `passesFilter` and `packageOfPath` functions
|
|
15
|
+
// we test here have no such dependency; we inject minimal shims.
|
|
16
|
+
const stubs = `
|
|
17
|
+
function el(tag, attrs, children) { const e = document.createElement(tag); return e; }
|
|
18
|
+
const views = [];
|
|
19
|
+
let activeViewId = null;
|
|
20
|
+
let graphCatalog = null;
|
|
21
|
+
let graphIndexes = null;
|
|
22
|
+
`;
|
|
23
|
+
const tail = `
|
|
24
|
+
return { passesFilter, packageOfPath };
|
|
25
|
+
`;
|
|
26
|
+
// eslint-disable-next-line @typescript-eslint/no-implied-eval, sonarjs/code-eval -- Trusted source.
|
|
27
|
+
const factory = new Function(stubs + dashboardPathUtilsJs() + dashboardFiltersJs() + tail);
|
|
28
|
+
return factory();
|
|
29
|
+
}
|
|
30
|
+
function makeOcc(over) {
|
|
31
|
+
return {
|
|
32
|
+
qualifiedName: over.simpleName,
|
|
33
|
+
filePath: 'packages/contracts/src/x.ts',
|
|
34
|
+
line: 1,
|
|
35
|
+
column: 0,
|
|
36
|
+
endLine: 5,
|
|
37
|
+
kind: 'function-declaration',
|
|
38
|
+
params: [],
|
|
39
|
+
returnType: null,
|
|
40
|
+
enclosingClass: null,
|
|
41
|
+
decorators: [],
|
|
42
|
+
visibility: 'exported',
|
|
43
|
+
inTestFile: false,
|
|
44
|
+
definedInGenerated: false,
|
|
45
|
+
calls: [],
|
|
46
|
+
...over,
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
describe('passesFilter (filter chip predicate)', () => {
|
|
50
|
+
it('rejects test files by default (includeTests=false)', () => {
|
|
51
|
+
const env = loadFilterEnv();
|
|
52
|
+
const occ = makeOcc({ bodyHash: 'h', simpleName: 'f', inTestFile: true });
|
|
53
|
+
const fs = { packages: new Set(), kinds: new Set(), includeTests: false };
|
|
54
|
+
expect(env.passesFilter(occ, fs)).toBe(false);
|
|
55
|
+
});
|
|
56
|
+
it('accepts test files when includeTests=true', () => {
|
|
57
|
+
const env = loadFilterEnv();
|
|
58
|
+
const occ = makeOcc({ bodyHash: 'h', simpleName: 'f', inTestFile: true });
|
|
59
|
+
const fs = { packages: new Set(), kinds: new Set(), includeTests: true };
|
|
60
|
+
expect(env.passesFilter(occ, fs)).toBe(true);
|
|
61
|
+
});
|
|
62
|
+
it('rejects functions whose package is not in the active set (when set is non-empty)', () => {
|
|
63
|
+
const env = loadFilterEnv();
|
|
64
|
+
const occ = makeOcc({ bodyHash: 'h', simpleName: 'f', filePath: 'packages/cli/src/x.ts' });
|
|
65
|
+
const fs = {
|
|
66
|
+
packages: new Set(['contracts']),
|
|
67
|
+
kinds: new Set(),
|
|
68
|
+
includeTests: false,
|
|
69
|
+
};
|
|
70
|
+
expect(env.passesFilter(occ, fs)).toBe(false);
|
|
71
|
+
});
|
|
72
|
+
it('accepts functions whose package is in the active set', () => {
|
|
73
|
+
const env = loadFilterEnv();
|
|
74
|
+
const occ = makeOcc({ bodyHash: 'h', simpleName: 'f', filePath: 'packages/cli/src/x.ts' });
|
|
75
|
+
const fs = { packages: new Set(['cli']), kinds: new Set(), includeTests: false };
|
|
76
|
+
expect(env.passesFilter(occ, fs)).toBe(true);
|
|
77
|
+
});
|
|
78
|
+
it('rejects functions whose kind is not in the active kinds set', () => {
|
|
79
|
+
const env = loadFilterEnv();
|
|
80
|
+
const occ = makeOcc({ bodyHash: 'h', simpleName: 'f', kind: 'arrow' });
|
|
81
|
+
const fs = {
|
|
82
|
+
packages: new Set(),
|
|
83
|
+
kinds: new Set(['method']),
|
|
84
|
+
includeTests: false,
|
|
85
|
+
};
|
|
86
|
+
expect(env.passesFilter(occ, fs)).toBe(false);
|
|
87
|
+
});
|
|
88
|
+
it('empty packages set means "all allowed"', () => {
|
|
89
|
+
const env = loadFilterEnv();
|
|
90
|
+
const occ = makeOcc({ bodyHash: 'h', simpleName: 'f', filePath: 'packages/anywhere/src/x.ts' });
|
|
91
|
+
const fs = { packages: new Set(), kinds: new Set(), includeTests: false };
|
|
92
|
+
expect(env.passesFilter(occ, fs)).toBe(true);
|
|
93
|
+
});
|
|
94
|
+
});
|
|
95
|
+
//# sourceMappingURL=dashboard-filters.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dashboard-filters.test.js","sourceRoot":"","sources":["../../src/__tests__/dashboard-filters.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @vitest-environment jsdom
|
|
3
|
+
*
|
|
4
|
+
* §10.2 invariant: at most one .function-card-overlay element exists
|
|
5
|
+
* in the DOM at any moment, even when opening cards in rapid
|
|
6
|
+
* succession.
|
|
7
|
+
*/
|
|
8
|
+
export {};
|
|
9
|
+
//# sourceMappingURL=dashboard-function-card-singleton.test.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dashboard-function-card-singleton.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/dashboard-function-card-singleton.test.ts"],"names":[],"mappings":"AACA;;;;;;GAMG"}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
/// <reference lib="dom" />
|
|
2
|
+
/**
|
|
3
|
+
* @vitest-environment jsdom
|
|
4
|
+
*
|
|
5
|
+
* §10.2 invariant: at most one .function-card-overlay element exists
|
|
6
|
+
* in the DOM at any moment, even when opening cards in rapid
|
|
7
|
+
* succession.
|
|
8
|
+
*/
|
|
9
|
+
import { describe, expect, it, beforeEach } from 'vitest';
|
|
10
|
+
import { dashboardEditorLinkJs } from '../code-paths/editor-link.js';
|
|
11
|
+
import { dashboardFunctionCardJs } from '../code-paths/function-card.js';
|
|
12
|
+
import { dashboardIndexesJs } from '../code-paths/indexes.js';
|
|
13
|
+
import { dashboardPathUtilsJs } from '../code-paths/path-utils.js';
|
|
14
|
+
import { dashboardTraceJs } from '../code-paths/trace.js';
|
|
15
|
+
function makeOcc(over) {
|
|
16
|
+
return {
|
|
17
|
+
qualifiedName: over.simpleName,
|
|
18
|
+
filePath: 'packages/x/src/x.ts',
|
|
19
|
+
line: 1,
|
|
20
|
+
column: 0,
|
|
21
|
+
endLine: 5,
|
|
22
|
+
kind: 'function-declaration',
|
|
23
|
+
params: [],
|
|
24
|
+
returnType: null,
|
|
25
|
+
enclosingClass: null,
|
|
26
|
+
decorators: [],
|
|
27
|
+
visibility: 'exported',
|
|
28
|
+
inTestFile: false,
|
|
29
|
+
definedInGenerated: false,
|
|
30
|
+
calls: [],
|
|
31
|
+
...over,
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
function loadEnv(catalog) {
|
|
35
|
+
const elSrc = `
|
|
36
|
+
function el(tag, attrs, children) {
|
|
37
|
+
const e = document.createElement(tag);
|
|
38
|
+
if (attrs) Object.entries(attrs).forEach(([k,v]) => {
|
|
39
|
+
if (k === 'text') e.textContent = v;
|
|
40
|
+
else if (k === 'class') e.className = v;
|
|
41
|
+
else if (k.startsWith('on')) e.addEventListener(k.slice(2), v);
|
|
42
|
+
else e.setAttribute(k, v);
|
|
43
|
+
});
|
|
44
|
+
if (children) children.forEach(c => { if (typeof c === 'string') e.appendChild(document.createTextNode(c)); else if (c) e.appendChild(c); });
|
|
45
|
+
return e;
|
|
46
|
+
}
|
|
47
|
+
var EDITOR_PROTOCOL = null;
|
|
48
|
+
`;
|
|
49
|
+
const tail = `
|
|
50
|
+
var graphCatalog = ${JSON.stringify(catalog)};
|
|
51
|
+
var graphIndexes = buildIndexes(graphCatalog);
|
|
52
|
+
return { open: openFunctionCard };
|
|
53
|
+
`;
|
|
54
|
+
// eslint-disable-next-line @typescript-eslint/no-implied-eval, sonarjs/code-eval -- Trusted source.
|
|
55
|
+
return new Function(elSrc +
|
|
56
|
+
dashboardPathUtilsJs() +
|
|
57
|
+
dashboardIndexesJs() +
|
|
58
|
+
dashboardEditorLinkJs() +
|
|
59
|
+
dashboardTraceJs() +
|
|
60
|
+
dashboardFunctionCardJs() +
|
|
61
|
+
tail)();
|
|
62
|
+
}
|
|
63
|
+
beforeEach(() => {
|
|
64
|
+
document.body.innerHTML = '';
|
|
65
|
+
});
|
|
66
|
+
describe('Function Card singleton — §10.2', () => {
|
|
67
|
+
it('opening three cards in succession leaves exactly one overlay in the DOM', () => {
|
|
68
|
+
const env = loadEnv({
|
|
69
|
+
version: '2.0',
|
|
70
|
+
tool: 'graph',
|
|
71
|
+
language: 'typescript',
|
|
72
|
+
builtAt: 'now',
|
|
73
|
+
functions: {
|
|
74
|
+
a: [makeOcc({ bodyHash: 'ha', simpleName: 'a' })],
|
|
75
|
+
b: [makeOcc({ bodyHash: 'hb', simpleName: 'b' })],
|
|
76
|
+
c: [makeOcc({ bodyHash: 'hc', simpleName: 'c' })],
|
|
77
|
+
},
|
|
78
|
+
});
|
|
79
|
+
env.open('ha');
|
|
80
|
+
env.open('hb');
|
|
81
|
+
env.open('hc');
|
|
82
|
+
const overlays = document.querySelectorAll('.function-card-overlay');
|
|
83
|
+
expect(overlays.length).toBe(1);
|
|
84
|
+
expect(overlays[0].textContent).toContain('c');
|
|
85
|
+
});
|
|
86
|
+
});
|
|
87
|
+
//# sourceMappingURL=dashboard-function-card-singleton.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dashboard-function-card-singleton.test.js","sourceRoot":"","sources":["../../src/__tests__/dashboard-function-card-singleton.test.ts"],"names":[],"mappings":"AAAA,2BAA2B;AAC3B;;;;;;GAMG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AAE1D,OAAO,EAAE,qBAAqB,EAAE,MAAM,8BAA8B,CAAC;AACrE,OAAO,EAAE,uBAAuB,EAAE,MAAM,gCAAgC,CAAC;AACzE,OAAO,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAC9D,OAAO,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAC;AACnE,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAQ1D,SAAS,OAAO,CACd,IAAiF;IAEjF,OAAO;QACL,aAAa,EAAE,IAAI,CAAC,UAAU;QAC9B,QAAQ,EAAE,qBAAqB;QAC/B,IAAI,EAAE,CAAC;QACP,MAAM,EAAE,CAAC;QACT,OAAO,EAAE,CAAC;QACV,IAAI,EAAE,sBAAsB;QAC5B,MAAM,EAAE,EAAE;QACV,UAAU,EAAE,IAAI;QAChB,cAAc,EAAE,IAAI;QACpB,UAAU,EAAE,EAAE;QACd,UAAU,EAAE,UAAU;QACtB,UAAU,EAAE,KAAK;QACjB,kBAAkB,EAAE,KAAK;QACzB,KAAK,EAAE,EAAE;QACT,GAAG,IAAI;KACR,CAAC;AACJ,CAAC;AAED,SAAS,OAAO,CAAC,OAAqB;IACpC,MAAM,KAAK,GAAG;;;;;;;;;;;;;CAaf,CAAC;IACA,MAAM,IAAI,GAAG;qBACM,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC;;;CAG3C,CAAC;IACA,oGAAoG;IACpG,OAAO,IAAI,QAAQ,CACjB,KAAK;QACH,oBAAoB,EAAE;QACtB,kBAAkB,EAAE;QACpB,qBAAqB,EAAE;QACvB,gBAAgB,EAAE;QAClB,uBAAuB,EAAE;QACzB,IAAI,CACP,EAAS,CAAC;AACb,CAAC;AAED,UAAU,CAAC,GAAG,EAAE;IACd,QAAQ,CAAC,IAAI,CAAC,SAAS,GAAG,EAAE,CAAC;AAC/B,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,iCAAiC,EAAE,GAAG,EAAE;IAC/C,EAAE,CAAC,yEAAyE,EAAE,GAAG,EAAE;QACjF,MAAM,GAAG,GAAG,OAAO,CAAC;YAClB,OAAO,EAAE,KAAK;YACd,IAAI,EAAE,OAAO;YACb,QAAQ,EAAE,YAAY;YACtB,OAAO,EAAE,KAAK;YACd,SAAS,EAAE;gBACT,CAAC,EAAE,CAAC,OAAO,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,UAAU,EAAE,GAAG,EAAE,CAAC,CAAC;gBACjD,CAAC,EAAE,CAAC,OAAO,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,UAAU,EAAE,GAAG,EAAE,CAAC,CAAC;gBACjD,CAAC,EAAE,CAAC,OAAO,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,UAAU,EAAE,GAAG,EAAE,CAAC,CAAC;aAClD;SACF,CAAC,CAAC;QACH,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACf,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACf,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACf,MAAM,QAAQ,GAAG,QAAQ,CAAC,gBAAgB,CAAC,wBAAwB,CAAC,CAAC;QACrE,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAChC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;IACjD,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @vitest-environment jsdom
|
|
3
|
+
*
|
|
4
|
+
* Function Card overlay behavior tests. Loads the emitted JS from the
|
|
5
|
+
* indexes + function-card + function-row + path-utils + editor-link +
|
|
6
|
+
* trace + filters + views-registry modules into a jsdom global, then
|
|
7
|
+
* exercises the public API (openFunctionCard, closeFunctionCard).
|
|
8
|
+
*/
|
|
9
|
+
export {};
|
|
10
|
+
//# sourceMappingURL=dashboard-function-card.test.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dashboard-function-card.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/dashboard-function-card.test.ts"],"names":[],"mappings":"AACA;;;;;;;GAOG"}
|