@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 @@
|
|
|
1
|
+
{"version":3,"file":"dashboard-view-graph.test.js","sourceRoot":"","sources":["../../src/__tests__/dashboard-view-graph.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Ranked-view emitter — `defineRankedView`.
|
|
3
|
+
*
|
|
4
|
+
* `defineRankedView` is a JS-source emitter: it splices a declarative config
|
|
5
|
+
* into the in-page `views.push({ … })` literal the Code Paths bundle ships.
|
|
6
|
+
* The only first-party caller (the Functions/distribution view) turns EVERY
|
|
7
|
+
* optional affordance ON (search box, Kind/Package selects, a filter toggle,
|
|
8
|
+
* a preamble, a custom predicate), so the emitter's DEFAULT/OFF branches —
|
|
9
|
+
* the ones a minimal ranked view uses — never run in production wiring.
|
|
10
|
+
*
|
|
11
|
+
* These tests drive the emitter directly with a minimal config (all optional
|
|
12
|
+
* flags omitted) and a maximal config (every flag on), and assert on the
|
|
13
|
+
* emitted JS so a regression in what the dashboard ships is caught:
|
|
14
|
+
* - minimal → no controls row, no search input, no Kind/Package selects, no
|
|
15
|
+
* toggle, no onActivate hook, the default `passesFilter` predicate and a
|
|
16
|
+
* `{}` row-extras splice;
|
|
17
|
+
* - maximal → all of those present, with the supplied predicate, preamble,
|
|
18
|
+
* row-extras, custom column values, and per-id-namespaced state vars.
|
|
19
|
+
*/
|
|
20
|
+
export {};
|
|
21
|
+
//# sourceMappingURL=dashboard-view-template.test.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dashboard-view-template.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/dashboard-view-template.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG"}
|
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Ranked-view emitter — `defineRankedView`.
|
|
3
|
+
*
|
|
4
|
+
* `defineRankedView` is a JS-source emitter: it splices a declarative config
|
|
5
|
+
* into the in-page `views.push({ … })` literal the Code Paths bundle ships.
|
|
6
|
+
* The only first-party caller (the Functions/distribution view) turns EVERY
|
|
7
|
+
* optional affordance ON (search box, Kind/Package selects, a filter toggle,
|
|
8
|
+
* a preamble, a custom predicate), so the emitter's DEFAULT/OFF branches —
|
|
9
|
+
* the ones a minimal ranked view uses — never run in production wiring.
|
|
10
|
+
*
|
|
11
|
+
* These tests drive the emitter directly with a minimal config (all optional
|
|
12
|
+
* flags omitted) and a maximal config (every flag on), and assert on the
|
|
13
|
+
* emitted JS so a regression in what the dashboard ships is caught:
|
|
14
|
+
* - minimal → no controls row, no search input, no Kind/Package selects, no
|
|
15
|
+
* toggle, no onActivate hook, the default `passesFilter` predicate and a
|
|
16
|
+
* `{}` row-extras splice;
|
|
17
|
+
* - maximal → all of those present, with the supplied predicate, preamble,
|
|
18
|
+
* row-extras, custom column values, and per-id-namespaced state vars.
|
|
19
|
+
*/
|
|
20
|
+
import { describe, expect, it } from 'vitest';
|
|
21
|
+
import { defineRankedView } from '../code-paths/view-template.js';
|
|
22
|
+
function minimalConfig() {
|
|
23
|
+
return {
|
|
24
|
+
id: 'plain',
|
|
25
|
+
label: 'Plain',
|
|
26
|
+
help: { title: 'Plain', sections: [{ heading: 'h', body: 'b' }] },
|
|
27
|
+
metric: 'occ.line',
|
|
28
|
+
columns: [{ label: 'Function', value: 'o => o.simpleName' }],
|
|
29
|
+
headingText: 'Plain things',
|
|
30
|
+
emptyMessage: 'Nothing here.',
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
describe('defineRankedView — minimal config (default/off branches)', () => {
|
|
34
|
+
const js = defineRankedView(minimalConfig());
|
|
35
|
+
it('emits a views.push with the configured id, label, and heading', () => {
|
|
36
|
+
expect(js).toContain('views.push({');
|
|
37
|
+
expect(js).toContain("id: 'plain'");
|
|
38
|
+
expect(js).toContain("label: 'Plain'");
|
|
39
|
+
expect(js).toContain('Plain things');
|
|
40
|
+
expect(js).toContain('Nothing here.');
|
|
41
|
+
});
|
|
42
|
+
it('uses the default passesFilter predicate when none is supplied', () => {
|
|
43
|
+
expect(js).toContain('passesFilter(occ, filterState)');
|
|
44
|
+
});
|
|
45
|
+
it('splices an empty row-extras object when rowExtras is omitted', () => {
|
|
46
|
+
// The Object.assign row build must close over a `{}` extras literal.
|
|
47
|
+
expect(js).toContain('return {}; })(r.occ, r.metric)');
|
|
48
|
+
});
|
|
49
|
+
it('emits NO controls row, search input, Kind/Package selects, or toggle', () => {
|
|
50
|
+
expect(js).not.toContain('code-paths-ranked-controls');
|
|
51
|
+
expect(js).not.toContain('code-paths-search-plain');
|
|
52
|
+
expect(js).not.toContain("'data-control': 'fn-kind'");
|
|
53
|
+
expect(js).not.toContain("'data-control': 'fn-package'");
|
|
54
|
+
expect(js).not.toContain("'data-control': 'fn-toggle'");
|
|
55
|
+
});
|
|
56
|
+
it('emits the trivial always-true row filter and no per-view state vars', () => {
|
|
57
|
+
expect(js).toContain('(function(){ return true; })');
|
|
58
|
+
expect(js).not.toContain('__rankedSearchQuery_plain');
|
|
59
|
+
expect(js).not.toContain('__rankedKind_plain');
|
|
60
|
+
expect(js).not.toContain('__rankedToggle_plain');
|
|
61
|
+
});
|
|
62
|
+
it('emits no onActivate hook (search auto-focus) for a non-search view', () => {
|
|
63
|
+
expect(js).not.toContain('onActivate()');
|
|
64
|
+
});
|
|
65
|
+
});
|
|
66
|
+
describe('defineRankedView — maximal config (populated branches)', () => {
|
|
67
|
+
const js = defineRankedView({
|
|
68
|
+
id: 'rich-1',
|
|
69
|
+
label: 'Rich',
|
|
70
|
+
help: { title: 'Rich', sections: [{ heading: 'h', body: 'b' }] },
|
|
71
|
+
metric: 'occ.line',
|
|
72
|
+
predicate: "passesFilter(occ, filterState) && occ.kind === 'function-declaration'",
|
|
73
|
+
rowExtras: '{ __thumb: occ.params.length }',
|
|
74
|
+
preamble: 'function helper(o) { return o.simpleName; }',
|
|
75
|
+
columns: [{ label: 'Name', value: 'o => helper(o)' }],
|
|
76
|
+
headingText: 'Rich functions',
|
|
77
|
+
emptyMessage: 'No rich functions.',
|
|
78
|
+
searchByName: true,
|
|
79
|
+
filterByKindPackage: true,
|
|
80
|
+
filterToggle: { label: 'Test-only', predicate: 'isTestOnly(occ)' },
|
|
81
|
+
});
|
|
82
|
+
it('splices the custom predicate verbatim (replacing the default)', () => {
|
|
83
|
+
expect(js).toContain("passesFilter(occ, filterState) && occ.kind === 'function-declaration'");
|
|
84
|
+
});
|
|
85
|
+
it('splices the preamble helper and custom row-extras', () => {
|
|
86
|
+
expect(js).toContain('function helper(o) { return o.simpleName; }');
|
|
87
|
+
expect(js).toContain('return { __thumb: occ.params.length }; })(r.occ, r.metric)');
|
|
88
|
+
});
|
|
89
|
+
it('renders the controls row with search, Kind/Package selects, and toggle', () => {
|
|
90
|
+
expect(js).toContain('code-paths-ranked-controls');
|
|
91
|
+
expect(js).toContain('code-paths-search-rich-1');
|
|
92
|
+
expect(js).toContain("'data-control': 'fn-kind'");
|
|
93
|
+
expect(js).toContain("'data-control': 'fn-package'");
|
|
94
|
+
expect(js).toContain("'data-control': 'fn-toggle'");
|
|
95
|
+
expect(js).toContain('Test-only');
|
|
96
|
+
});
|
|
97
|
+
it('namespaces every piece of view state by a sanitized id', () => {
|
|
98
|
+
// The hyphen in `rich-1` becomes `_` in the state-var suffix.
|
|
99
|
+
expect(js).toContain('__rankedSearchQuery_rich_1');
|
|
100
|
+
expect(js).toContain('__rankedKind_rich_1');
|
|
101
|
+
expect(js).toContain('__rankedPkg_rich_1');
|
|
102
|
+
expect(js).toContain('__rankedToggle_rich_1');
|
|
103
|
+
});
|
|
104
|
+
it('builds a non-trivial row filter that consults kind, package, name, and toggle', () => {
|
|
105
|
+
expect(js).toContain('occ.kind !== __rankedKind_rich_1');
|
|
106
|
+
expect(js).toContain('pkgOf(occ) !== __rankedPkg_rich_1');
|
|
107
|
+
expect(js).toContain("occ.simpleName || ''");
|
|
108
|
+
expect(js).toContain('!(isTestOnly(occ))');
|
|
109
|
+
// And it is NOT the trivial always-true filter.
|
|
110
|
+
expect(js).not.toContain('(function(){ return true; })');
|
|
111
|
+
});
|
|
112
|
+
it('emits an onActivate hook that focuses the search box', () => {
|
|
113
|
+
expect(js).toContain('onActivate()');
|
|
114
|
+
expect(js).toContain("getElementById('code-paths-search-rich-1')");
|
|
115
|
+
});
|
|
116
|
+
});
|
|
117
|
+
describe('defineRankedView — partial configs (each flag independently)', () => {
|
|
118
|
+
it('search-only: controls + search input, but no Kind/Package or toggle', () => {
|
|
119
|
+
const js = defineRankedView({ ...minimalConfig(), id: 'searchonly', searchByName: true });
|
|
120
|
+
expect(js).toContain('code-paths-ranked-controls');
|
|
121
|
+
expect(js).toContain('code-paths-search-searchonly');
|
|
122
|
+
expect(js).toContain('__rankedSearchQuery_searchonly');
|
|
123
|
+
expect(js).not.toContain("'data-control': 'fn-kind'");
|
|
124
|
+
expect(js).not.toContain("'data-control': 'fn-toggle'");
|
|
125
|
+
expect(js).toContain('onActivate()');
|
|
126
|
+
});
|
|
127
|
+
it('toggle-only: controls + toggle checkbox, but no search input or selects', () => {
|
|
128
|
+
const js = defineRankedView({
|
|
129
|
+
...minimalConfig(),
|
|
130
|
+
id: 'toggleonly',
|
|
131
|
+
filterToggle: { label: 'Only X', predicate: 'isX(occ)' },
|
|
132
|
+
});
|
|
133
|
+
expect(js).toContain('code-paths-ranked-controls');
|
|
134
|
+
expect(js).toContain("'data-control': 'fn-toggle'");
|
|
135
|
+
expect(js).toContain('__rankedToggle_toggleonly');
|
|
136
|
+
expect(js).toContain('!(isX(occ))');
|
|
137
|
+
expect(js).not.toContain('code-paths-search-toggleonly');
|
|
138
|
+
expect(js).not.toContain("'data-control': 'fn-kind'");
|
|
139
|
+
// A toggle without search → no auto-focus hook.
|
|
140
|
+
expect(js).not.toContain('onActivate()');
|
|
141
|
+
});
|
|
142
|
+
it('kind/package-only: selects present, but no search input or toggle', () => {
|
|
143
|
+
const js = defineRankedView({ ...minimalConfig(), id: 'kponly', filterByKindPackage: true });
|
|
144
|
+
expect(js).toContain("'data-control': 'fn-kind'");
|
|
145
|
+
expect(js).toContain("'data-control': 'fn-package'");
|
|
146
|
+
expect(js).toContain('__rankedKind_kponly');
|
|
147
|
+
expect(js).toContain('occ.kind !== __rankedKind_kponly');
|
|
148
|
+
expect(js).not.toContain('code-paths-search-kponly');
|
|
149
|
+
expect(js).not.toContain("'data-control': 'fn-toggle'");
|
|
150
|
+
expect(js).not.toContain('onActivate()');
|
|
151
|
+
});
|
|
152
|
+
});
|
|
153
|
+
//# sourceMappingURL=dashboard-view-template.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dashboard-view-template.test.js","sourceRoot":"","sources":["../../src/__tests__/dashboard-view-template.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dashboard.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/dashboard.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
import { describe, expect, it } from 'vitest';
|
|
2
|
+
import { generateDashboardHtml } from '../generator.js';
|
|
3
|
+
function makeSession(overrides = {}) {
|
|
4
|
+
return {
|
|
5
|
+
id: 'sess-1',
|
|
6
|
+
tool: 'fit',
|
|
7
|
+
startedAt: new Date().toISOString(),
|
|
8
|
+
completedAt: new Date().toISOString(),
|
|
9
|
+
cwd: '/proj',
|
|
10
|
+
score: 92,
|
|
11
|
+
passed: true,
|
|
12
|
+
durationMs: 100,
|
|
13
|
+
// Tool-owned opaque detail; contracts no longer carries summary/checks.
|
|
14
|
+
payload: { summary: { total: 10, passed: 9, failed: 1, errors: 0, warnings: 0 }, checks: [] },
|
|
15
|
+
...overrides,
|
|
16
|
+
};
|
|
17
|
+
}
|
|
18
|
+
// Catalog entry shapes are fitness-owned (L1); the dashboard consumes
|
|
19
|
+
// them structurally, so the test supplies plain objects.
|
|
20
|
+
const checkCatalog = [
|
|
21
|
+
{
|
|
22
|
+
slug: 'no-console-log',
|
|
23
|
+
name: 'No console.log',
|
|
24
|
+
icon: '🚫',
|
|
25
|
+
description: 'Forbids console.log in production',
|
|
26
|
+
tags: ['quality'],
|
|
27
|
+
confidence: 'high',
|
|
28
|
+
source: 'built-in',
|
|
29
|
+
},
|
|
30
|
+
];
|
|
31
|
+
const recipeCatalog = [
|
|
32
|
+
{
|
|
33
|
+
name: 'default',
|
|
34
|
+
displayName: 'Default',
|
|
35
|
+
description: 'All checks',
|
|
36
|
+
tags: [],
|
|
37
|
+
selectorType: 'all',
|
|
38
|
+
mode: 'parallel',
|
|
39
|
+
timeout: 30_000,
|
|
40
|
+
},
|
|
41
|
+
];
|
|
42
|
+
describe('generateDashboardHtml', () => {
|
|
43
|
+
it('produces a complete HTML5 document', () => {
|
|
44
|
+
const html = generateDashboardHtml({ sessions: [makeSession()] });
|
|
45
|
+
expect(html).toContain('<!DOCTYPE html>');
|
|
46
|
+
expect(html).toContain('</html>');
|
|
47
|
+
});
|
|
48
|
+
it('inlines the latest session score in the document title', () => {
|
|
49
|
+
const html = generateDashboardHtml({ sessions: [makeSession({ score: 85 })] });
|
|
50
|
+
expect(html).toContain('Pass Rate: 85%');
|
|
51
|
+
});
|
|
52
|
+
it('omits the score from the title when there are no sessions', () => {
|
|
53
|
+
const html = generateDashboardHtml({ sessions: [] });
|
|
54
|
+
expect(html).toMatch(/<title>OpenSIP CLI<\/title>/);
|
|
55
|
+
});
|
|
56
|
+
it('inlines session, check catalog, and recipe catalog as JS data', () => {
|
|
57
|
+
const html = generateDashboardHtml({
|
|
58
|
+
sessions: [makeSession({ id: 'special-session-id' })],
|
|
59
|
+
checkCatalog,
|
|
60
|
+
recipeCatalog,
|
|
61
|
+
});
|
|
62
|
+
expect(html).toContain('special-session-id');
|
|
63
|
+
expect(html).toContain('no-console-log');
|
|
64
|
+
expect(html).toContain('default');
|
|
65
|
+
});
|
|
66
|
+
it('escapes < and > in inlined JSON to prevent script injection', () => {
|
|
67
|
+
// A session whose cwd contains a fake </script> tag must not break out
|
|
68
|
+
const evil = makeSession({ cwd: '</script><script>alert(1)</script>' });
|
|
69
|
+
const html = generateDashboardHtml({ sessions: [evil] });
|
|
70
|
+
expect(html).not.toMatch(/<\/script>\s*<script>alert\(1\)/);
|
|
71
|
+
expect(html).toContain(String.raw `</script>`);
|
|
72
|
+
});
|
|
73
|
+
// Regression for the 2026-05-25 audit fix on serializeOptionalBlob.
|
|
74
|
+
// The 'literal' arm (used for editorProtocol) previously called
|
|
75
|
+
// JSON.stringify without escapeForScriptContext; JSON.stringify does not
|
|
76
|
+
// escape `<`, so a caller-controlled editorProtocol containing the literal
|
|
77
|
+
// sequence `</script>` would close the inline <script> block. After the
|
|
78
|
+
// fix, both arms apply the same escape — `<` becomes `<`.
|
|
79
|
+
it('escapes </script> in editorProtocol literal so it cannot close the inline script block', () => {
|
|
80
|
+
const html = generateDashboardHtml({
|
|
81
|
+
sessions: [],
|
|
82
|
+
editorProtocol: '</script><img src=x onerror=alert(1)>',
|
|
83
|
+
});
|
|
84
|
+
// The escaped form must be present; the raw form must NOT appear inside
|
|
85
|
+
// the EDITOR_PROTOCOL constant assignment.
|
|
86
|
+
const literalLine = html
|
|
87
|
+
.split('\n')
|
|
88
|
+
.find((line) => line.startsWith('const EDITOR_PROTOCOL = '));
|
|
89
|
+
expect(literalLine).toBeDefined();
|
|
90
|
+
expect(literalLine ?? '').not.toContain('</script>');
|
|
91
|
+
// The escape function rewrites `<` to the JS Unicode escape `<`,
|
|
92
|
+
// which the HTML tokenizer does not match against `</script>`.
|
|
93
|
+
// (`String.raw`<`` is the 1-char `<` because the JS lexer processes
|
|
94
|
+
// Unicode escapes before String.raw sees them — a backslash literal
|
|
95
|
+
// is required for the 6-character on-disk sequence.)
|
|
96
|
+
expect(literalLine ?? '').toContain('\\u003c');
|
|
97
|
+
});
|
|
98
|
+
// Regression for the 2026-05-25 audit fix on the <title> interpolation:
|
|
99
|
+
// session.score is typed `number` but originates from a SQLite column; a
|
|
100
|
+
// corrupted row carrying a non-numeric value would otherwise interpolate
|
|
101
|
+
// directly into the page title. coerceScoreForTitle falls back to 0 for
|
|
102
|
+
// anything non-finite.
|
|
103
|
+
it('renders score 0 in <title> when the session score is non-finite', () => {
|
|
104
|
+
const bad = makeSession({ score: Number.NaN });
|
|
105
|
+
const html = generateDashboardHtml({ sessions: [bad] });
|
|
106
|
+
expect(html).toMatch(/<title>OpenSIP CLI — Pass Rate: 0%<\/title>/);
|
|
107
|
+
});
|
|
108
|
+
it('renders all three tab panels (overview, fitness, simulation)', () => {
|
|
109
|
+
const html = generateDashboardHtml({ sessions: [] });
|
|
110
|
+
expect(html).toContain('id="panel-overview"');
|
|
111
|
+
expect(html).toContain('id="panel-fitness"');
|
|
112
|
+
expect(html).toContain('id="panel-simulation"');
|
|
113
|
+
});
|
|
114
|
+
it('includes inline CSS', () => {
|
|
115
|
+
const html = generateDashboardHtml({ sessions: [] });
|
|
116
|
+
expect(html).toMatch(/<style>[\s\S]+?<\/style>/);
|
|
117
|
+
});
|
|
118
|
+
it('partitions sessions into fit vs sim arrays in the page script', () => {
|
|
119
|
+
const html = generateDashboardHtml({
|
|
120
|
+
sessions: [
|
|
121
|
+
makeSession({ id: 'fit-1', tool: 'fit' }),
|
|
122
|
+
makeSession({ id: 'sim-1', tool: 'sim' }),
|
|
123
|
+
],
|
|
124
|
+
});
|
|
125
|
+
expect(html).toContain("sessions.filter(s => s.tool === 'fit')");
|
|
126
|
+
expect(html).toContain("sessions.filter(s => s.tool === 'sim')");
|
|
127
|
+
});
|
|
128
|
+
});
|
|
129
|
+
//# sourceMappingURL=dashboard.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dashboard.test.js","sourceRoot":"","sources":["../../src/__tests__/dashboard.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Dashboard graph-tab render wiring (Plan B, Phase 5 Task 5.4).
|
|
3
|
+
*
|
|
4
|
+
* Feeds a DashboardInput carrying graphRuleCatalog + graphRecipeCatalog through
|
|
5
|
+
* generateDashboardHtml and asserts the emitted HTML embeds the graph rule
|
|
6
|
+
* slugs + recipe names. Also re-confirms decoupling: @opensip-cli/dashboard
|
|
7
|
+
* has no @opensip-cli/graph dependency.
|
|
8
|
+
*/
|
|
9
|
+
export {};
|
|
10
|
+
//# sourceMappingURL=graph-tab.test.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"graph-tab.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/graph-tab.test.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG"}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Dashboard graph-tab render wiring (Plan B, Phase 5 Task 5.4).
|
|
3
|
+
*
|
|
4
|
+
* Feeds a DashboardInput carrying graphRuleCatalog + graphRecipeCatalog through
|
|
5
|
+
* generateDashboardHtml and asserts the emitted HTML embeds the graph rule
|
|
6
|
+
* slugs + recipe names. Also re-confirms decoupling: @opensip-cli/dashboard
|
|
7
|
+
* has no @opensip-cli/graph dependency.
|
|
8
|
+
*/
|
|
9
|
+
import { readFileSync } from 'node:fs';
|
|
10
|
+
import { dirname, join } from 'node:path';
|
|
11
|
+
import { fileURLToPath } from 'node:url';
|
|
12
|
+
import { describe, expect, it } from 'vitest';
|
|
13
|
+
import { generateDashboardHtml } from '../generator.js';
|
|
14
|
+
const HERE = dirname(fileURLToPath(import.meta.url));
|
|
15
|
+
describe('dashboard graph-tab — rule/recipe catalog wiring', () => {
|
|
16
|
+
const html = generateDashboardHtml({
|
|
17
|
+
sessions: [],
|
|
18
|
+
graphRuleCatalog: [
|
|
19
|
+
{ slug: 'graph:orphan-subtree', defaultSeverity: 'warning', source: 'built-in' },
|
|
20
|
+
{ slug: 'graph:duplicated-function-body', defaultSeverity: 'warning', source: 'built-in' },
|
|
21
|
+
],
|
|
22
|
+
graphRecipeCatalog: [
|
|
23
|
+
{
|
|
24
|
+
name: 'default',
|
|
25
|
+
displayName: 'Default',
|
|
26
|
+
description: 'Run all graph rules',
|
|
27
|
+
tags: ['default'],
|
|
28
|
+
selectorType: 'all',
|
|
29
|
+
},
|
|
30
|
+
],
|
|
31
|
+
});
|
|
32
|
+
it('emits the graphRuleCatalog JS const carrying the rule slugs', () => {
|
|
33
|
+
expect(html).toContain('const graphRuleCatalog =');
|
|
34
|
+
expect(html).toContain('graph:orphan-subtree');
|
|
35
|
+
expect(html).toContain('graph:duplicated-function-body');
|
|
36
|
+
});
|
|
37
|
+
it('emits the graphRecipeCatalog JS const carrying the recipe display name', () => {
|
|
38
|
+
expect(html).toContain('const graphRecipeCatalog =');
|
|
39
|
+
expect(html).toContain('Default');
|
|
40
|
+
});
|
|
41
|
+
it('keeps the graphRuleCatalog/graphRecipeCatalog consts distinct from the fitness check/recipe consts', () => {
|
|
42
|
+
// The fitness-owned consts are still emitted; the graph consts must not
|
|
43
|
+
// clobber them (distinct keys).
|
|
44
|
+
expect(html).toContain('const checkCatalog =');
|
|
45
|
+
expect(html).toContain('const recipeCatalog =');
|
|
46
|
+
expect(html).toContain('const graphRuleCatalog =');
|
|
47
|
+
expect(html).toContain('const graphRecipeCatalog =');
|
|
48
|
+
});
|
|
49
|
+
it('renders the Catalog rule cell without a monospace/font-mono override (item 13)', () => {
|
|
50
|
+
// The Rule slug cell used to force font-family: var(--font-mono,monospace).
|
|
51
|
+
// It must now inherit the shared .data-table td styling instead. Guard the
|
|
52
|
+
// emitted renderGraphRuleCatalog source against the regression.
|
|
53
|
+
const ruleCellMarker = "el('td', { text: rule.slug,";
|
|
54
|
+
const idx = html.indexOf(ruleCellMarker);
|
|
55
|
+
expect(idx).toBeGreaterThan(-1);
|
|
56
|
+
const cellDecl = html.slice(idx, idx + 120);
|
|
57
|
+
expect(cellDecl).not.toContain('font-mono');
|
|
58
|
+
expect(cellDecl).not.toContain('monospace');
|
|
59
|
+
});
|
|
60
|
+
it('gives .data-table td a shared font baseline (standard site font, 13px)', () => {
|
|
61
|
+
// There are several `.data-table td` rules (containment default,
|
|
62
|
+
// font baseline, …). Assert that the font baseline lives on one of
|
|
63
|
+
// them rather than assuming a single rule / source order.
|
|
64
|
+
const baselineRule = html
|
|
65
|
+
.split('.data-table td')
|
|
66
|
+
.find((seg) => seg.startsWith(' {') && seg.slice(0, seg.indexOf('}')).includes('font-size: 13px'));
|
|
67
|
+
expect(baselineRule).toBeDefined();
|
|
68
|
+
expect(baselineRule).toContain('font-family: var(--font)');
|
|
69
|
+
});
|
|
70
|
+
it('@opensip-cli/dashboard declares no @opensip-cli/graph dependency (decoupled)', () => {
|
|
71
|
+
const pkg = JSON.parse(readFileSync(join(HERE, '..', '..', 'package.json'), 'utf8'));
|
|
72
|
+
expect(pkg.dependencies?.['@opensip-cli/graph']).toBeUndefined();
|
|
73
|
+
expect(pkg.devDependencies?.['@opensip-cli/graph']).toBeUndefined();
|
|
74
|
+
});
|
|
75
|
+
});
|
|
76
|
+
//# sourceMappingURL=graph-tab.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"graph-tab.test.js","sourceRoot":"","sources":["../../src/__tests__/graph-tab.test.ts"],"names":[],"mappings":"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"}
|
package/dist/checks.d.ts
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Checks catalog rendering — browsable catalog of checks with run stats.
|
|
3
|
+
* Reusable: renderChecksCatalog(container, catalogData) can be called from any panel.
|
|
4
|
+
* Returns JS code as a string.
|
|
5
|
+
*/
|
|
6
|
+
export declare function dashboardChecksJs(): string;
|
|
7
|
+
//# sourceMappingURL=checks.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"checks.d.ts","sourceRoot":"","sources":["../src/checks.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,wBAAgB,iBAAiB,IAAI,MAAM,CAoR1C"}
|