@opensip-cli/dashboard 0.1.7 → 0.1.9
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/README.md +2 -2
- package/dist/__tests__/catalog-provenance.test.js +6 -24
- package/dist/__tests__/catalog-provenance.test.js.map +1 -1
- package/dist/__tests__/coupling-attribution.test.js +10 -14
- package/dist/__tests__/coupling-attribution.test.js.map +1 -1
- package/dist/__tests__/dashboard-bundle-weight.test.d.ts +9 -2
- package/dist/__tests__/dashboard-bundle-weight.test.d.ts.map +1 -1
- package/dist/__tests__/dashboard-bundle-weight.test.js +19 -12
- package/dist/__tests__/dashboard-bundle-weight.test.js.map +1 -1
- package/dist/__tests__/dashboard-cell-containment.test.js +5 -2
- package/dist/__tests__/dashboard-cell-containment.test.js.map +1 -1
- package/dist/__tests__/dashboard-editor-link.test.d.ts +9 -0
- package/dist/__tests__/dashboard-editor-link.test.d.ts.map +1 -1
- package/dist/__tests__/dashboard-editor-link.test.js +72 -21
- package/dist/__tests__/dashboard-editor-link.test.js.map +1 -1
- package/dist/__tests__/dashboard-el.test.d.ts +18 -0
- package/dist/__tests__/dashboard-el.test.d.ts.map +1 -0
- package/dist/__tests__/dashboard-el.test.js +90 -0
- package/dist/__tests__/dashboard-el.test.js.map +1 -0
- package/dist/__tests__/dashboard-filters.test.js +6 -14
- package/dist/__tests__/dashboard-filters.test.js.map +1 -1
- package/dist/__tests__/dashboard-function-card-singleton.test.js +15 -27
- package/dist/__tests__/dashboard-function-card-singleton.test.js.map +1 -1
- package/dist/__tests__/dashboard-function-card.test.d.ts +4 -4
- package/dist/__tests__/dashboard-function-card.test.js +80 -44
- package/dist/__tests__/dashboard-function-card.test.js.map +1 -1
- package/dist/__tests__/dashboard-function-row.test.js +52 -51
- package/dist/__tests__/dashboard-function-row.test.js.map +1 -1
- package/dist/__tests__/dashboard-generator-graph-catalog.test.js +3 -1
- package/dist/__tests__/dashboard-generator-graph-catalog.test.js.map +1 -1
- package/dist/__tests__/dashboard-graph-offline.integration.test.js +3 -1
- package/dist/__tests__/dashboard-graph-offline.integration.test.js.map +1 -1
- package/dist/__tests__/dashboard-help-drawer.test.js +11 -17
- package/dist/__tests__/dashboard-help-drawer.test.js.map +1 -1
- package/dist/__tests__/dashboard-indexes.test.d.ts +6 -4
- package/dist/__tests__/dashboard-indexes.test.d.ts.map +1 -1
- package/dist/__tests__/dashboard-indexes.test.js +10 -7
- package/dist/__tests__/dashboard-indexes.test.js.map +1 -1
- package/dist/__tests__/dashboard-pagination.test.d.ts +15 -0
- package/dist/__tests__/dashboard-pagination.test.d.ts.map +1 -0
- package/dist/__tests__/dashboard-pagination.test.js +140 -0
- package/dist/__tests__/dashboard-pagination.test.js.map +1 -0
- package/dist/__tests__/dashboard-path-utils.test.d.ts +7 -0
- package/dist/__tests__/dashboard-path-utils.test.d.ts.map +1 -1
- package/dist/__tests__/dashboard-path-utils.test.js +11 -3
- package/dist/__tests__/dashboard-path-utils.test.js.map +1 -1
- package/dist/__tests__/dashboard-search.test.d.ts +5 -0
- package/dist/__tests__/dashboard-search.test.d.ts.map +1 -1
- package/dist/__tests__/dashboard-search.test.js +9 -3
- package/dist/__tests__/dashboard-search.test.js.map +1 -1
- package/dist/__tests__/dashboard-sessions.test.js +13 -11
- package/dist/__tests__/dashboard-sessions.test.js.map +1 -1
- package/dist/__tests__/dashboard-trace.test.d.ts +11 -0
- package/dist/__tests__/dashboard-trace.test.d.ts.map +1 -1
- package/dist/__tests__/dashboard-trace.test.js +55 -32
- package/dist/__tests__/dashboard-trace.test.js.map +1 -1
- package/dist/__tests__/dashboard-view-conformance.test.js +9 -15
- package/dist/__tests__/dashboard-view-conformance.test.js.map +1 -1
- package/dist/__tests__/dashboard-view-coupling.test.js +14 -35
- package/dist/__tests__/dashboard-view-coupling.test.js.map +1 -1
- package/dist/__tests__/dashboard-view-distribution.test.js +14 -37
- package/dist/__tests__/dashboard-view-distribution.test.js.map +1 -1
- package/dist/__tests__/dashboard-view-graph.test.js +29 -62
- package/dist/__tests__/dashboard-view-graph.test.js.map +1 -1
- package/dist/__tests__/dashboard-view-template.test.d.ts +13 -14
- package/dist/__tests__/dashboard-view-template.test.d.ts.map +1 -1
- package/dist/__tests__/dashboard-view-template.test.js +165 -112
- package/dist/__tests__/dashboard-view-template.test.js.map +1 -1
- package/dist/__tests__/graph-tab.test.js +4 -2
- package/dist/__tests__/graph-tab.test.js.map +1 -1
- package/dist/client/el.d.ts +17 -0
- package/dist/client/el.d.ts.map +1 -0
- package/dist/client/el.js +36 -0
- package/dist/client/el.js.map +1 -0
- package/dist/client-bundle.generated.d.ts +2 -0
- package/dist/client-bundle.generated.d.ts.map +1 -0
- package/dist/client-bundle.generated.js +3 -0
- package/dist/client-bundle.generated.js.map +1 -0
- package/dist/code-paths/__tests__/views-registry.test.d.ts +13 -8
- package/dist/code-paths/__tests__/views-registry.test.d.ts.map +1 -1
- package/dist/code-paths/__tests__/views-registry.test.js +27 -25
- package/dist/code-paths/__tests__/views-registry.test.js.map +1 -1
- package/dist/code-paths.d.ts +21 -62
- package/dist/code-paths.d.ts.map +1 -1
- package/dist/code-paths.js +24 -349
- package/dist/code-paths.js.map +1 -1
- package/dist/generator.d.ts +2 -0
- package/dist/generator.d.ts.map +1 -1
- package/dist/generator.js +28 -17
- package/dist/generator.js.map +1 -1
- package/package.json +5 -4
- package/dist/checks.d.ts +0 -7
- package/dist/checks.d.ts.map +0 -1
- package/dist/checks.js +0 -283
- package/dist/checks.js.map +0 -1
- package/dist/code-paths/catalog-provenance.d.ts +0 -22
- package/dist/code-paths/catalog-provenance.d.ts.map +0 -1
- package/dist/code-paths/catalog-provenance.js +0 -108
- package/dist/code-paths/catalog-provenance.js.map +0 -1
- package/dist/code-paths/catalog-recipes-tables.d.ts +0 -11
- package/dist/code-paths/catalog-recipes-tables.d.ts.map +0 -1
- package/dist/code-paths/catalog-recipes-tables.js +0 -86
- package/dist/code-paths/catalog-recipes-tables.js.map +0 -1
- package/dist/code-paths/editor-link.d.ts +0 -10
- package/dist/code-paths/editor-link.d.ts.map +0 -1
- package/dist/code-paths/editor-link.js +0 -20
- package/dist/code-paths/editor-link.js.map +0 -1
- package/dist/code-paths/filters.d.ts +0 -19
- package/dist/code-paths/filters.d.ts.map +0 -1
- package/dist/code-paths/filters.js +0 -47
- package/dist/code-paths/filters.js.map +0 -1
- package/dist/code-paths/function-card.d.ts +0 -15
- package/dist/code-paths/function-card.d.ts.map +0 -1
- package/dist/code-paths/function-card.js +0 -169
- package/dist/code-paths/function-card.js.map +0 -1
- package/dist/code-paths/function-row.d.ts +0 -17
- package/dist/code-paths/function-row.d.ts.map +0 -1
- package/dist/code-paths/function-row.js +0 -77
- package/dist/code-paths/function-row.js.map +0 -1
- package/dist/code-paths/graph-controls.d.ts +0 -27
- package/dist/code-paths/graph-controls.d.ts.map +0 -1
- package/dist/code-paths/graph-controls.js +0 -257
- package/dist/code-paths/graph-controls.js.map +0 -1
- package/dist/code-paths/graph-stylesheet.d.ts +0 -22
- package/dist/code-paths/graph-stylesheet.d.ts.map +0 -1
- package/dist/code-paths/graph-stylesheet.js +0 -121
- package/dist/code-paths/graph-stylesheet.js.map +0 -1
- package/dist/code-paths/help-drawer.d.ts +0 -18
- package/dist/code-paths/help-drawer.d.ts.map +0 -1
- package/dist/code-paths/help-drawer.js +0 -54
- package/dist/code-paths/help-drawer.js.map +0 -1
- package/dist/code-paths/indexes.d.ts +0 -28
- package/dist/code-paths/indexes.d.ts.map +0 -1
- package/dist/code-paths/indexes.js +0 -97
- package/dist/code-paths/indexes.js.map +0 -1
- package/dist/code-paths/path-utils.d.ts +0 -15
- package/dist/code-paths/path-utils.d.ts.map +0 -1
- package/dist/code-paths/path-utils.js +0 -47
- package/dist/code-paths/path-utils.js.map +0 -1
- package/dist/code-paths/search.d.ts +0 -14
- package/dist/code-paths/search.d.ts.map +0 -1
- package/dist/code-paths/search.js +0 -54
- package/dist/code-paths/search.js.map +0 -1
- package/dist/code-paths/trace.d.ts +0 -11
- package/dist/code-paths/trace.d.ts.map +0 -1
- package/dist/code-paths/trace.js +0 -60
- package/dist/code-paths/trace.js.map +0 -1
- package/dist/code-paths/view-coupling.d.ts +0 -22
- package/dist/code-paths/view-coupling.d.ts.map +0 -1
- package/dist/code-paths/view-coupling.js +0 -218
- package/dist/code-paths/view-coupling.js.map +0 -1
- package/dist/code-paths/view-distribution.d.ts +0 -20
- package/dist/code-paths/view-distribution.d.ts.map +0 -1
- package/dist/code-paths/view-distribution.js +0 -82
- package/dist/code-paths/view-distribution.js.map +0 -1
- package/dist/code-paths/view-graph.d.ts +0 -35
- package/dist/code-paths/view-graph.d.ts.map +0 -1
- package/dist/code-paths/view-graph.js +0 -379
- package/dist/code-paths/view-graph.js.map +0 -1
- package/dist/code-paths/view-template.d.ts +0 -154
- package/dist/code-paths/view-template.d.ts.map +0 -1
- package/dist/code-paths/view-template.js +0 -218
- package/dist/code-paths/view-template.js.map +0 -1
- package/dist/code-paths/views-registry.d.ts +0 -13
- package/dist/code-paths/views-registry.d.ts.map +0 -1
- package/dist/code-paths/views-registry.js +0 -53
- package/dist/code-paths/views-registry.js.map +0 -1
- package/dist/overview.d.ts +0 -13
- package/dist/overview.d.ts.map +0 -1
- package/dist/overview.js +0 -91
- package/dist/overview.js.map +0 -1
- package/dist/recipes.d.ts +0 -6
- package/dist/recipes.d.ts.map +0 -1
- package/dist/recipes.js +0 -68
- package/dist/recipes.js.map +0 -1
- package/dist/sessions.d.ts +0 -6
- package/dist/sessions.d.ts.map +0 -1
- package/dist/sessions.js +0 -288
- package/dist/sessions.js.map +0 -1
- package/dist/shared/el.d.ts +0 -13
- package/dist/shared/el.d.ts.map +0 -1
- package/dist/shared/el.js +0 -27
- package/dist/shared/el.js.map +0 -1
- package/dist/shared/pagination.d.ts +0 -15
- package/dist/shared/pagination.d.ts.map +0 -1
- package/dist/shared/pagination.js +0 -113
- package/dist/shared/pagination.js.map +0 -1
- package/dist/shared/sortable.d.ts +0 -14
- package/dist/shared/sortable.d.ts.map +0 -1
- package/dist/shared/sortable.js +0 -101
- package/dist/shared/sortable.js.map +0 -1
- package/dist/shared/tab-activators.d.ts +0 -16
- package/dist/shared/tab-activators.d.ts.map +0 -1
- package/dist/shared/tab-activators.js +0 -33
- package/dist/shared/tab-activators.js.map +0 -1
- package/dist/shared/tab-bar.d.ts +0 -8
- package/dist/shared/tab-bar.d.ts.map +0 -1
- package/dist/shared/tab-bar.js +0 -20
- package/dist/shared/tab-bar.js.map +0 -1
- package/dist/shared.d.ts +0 -26
- package/dist/shared.d.ts.map +0 -1
- package/dist/shared.js +0 -39
- package/dist/shared.js.map +0 -1
- package/dist/subtab-bar.d.ts +0 -23
- package/dist/subtab-bar.d.ts.map +0 -1
- package/dist/subtab-bar.js +0 -77
- package/dist/subtab-bar.js.map +0 -1
- package/dist/tool-tabs.d.ts +0 -12
- package/dist/tool-tabs.d.ts.map +0 -1
- package/dist/tool-tabs.js +0 -80
- package/dist/tool-tabs.js.map +0 -1
|
@@ -1,153 +1,206 @@
|
|
|
1
|
+
/// <reference lib="dom" />
|
|
1
2
|
/**
|
|
2
|
-
*
|
|
3
|
+
* @vitest-environment jsdom
|
|
3
4
|
*
|
|
4
|
-
*
|
|
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.
|
|
5
|
+
* Ranked-view skeleton — `defineRankedView`.
|
|
10
6
|
*
|
|
11
|
-
*
|
|
12
|
-
*
|
|
13
|
-
* emitted
|
|
7
|
+
* `defineRankedView` registers a ranked-list view (rank-and-render skeleton)
|
|
8
|
+
* into the shared `views` registry. It used to splice JS-source strings into an
|
|
9
|
+
* emitted `views.push({ … })` literal; it is now a typed bundle function taking
|
|
10
|
+
* real callbacks. These tests load the client bundle (which exposes
|
|
11
|
+
* `defineRankedView` + `views` as page globals), register a MINIMAL config (all
|
|
12
|
+
* optional flags omitted) and a MAXIMAL config (every flag on), then assert on
|
|
13
|
+
* the RENDERED DOM so a regression in the controls a ranked view ships is
|
|
14
|
+
* caught:
|
|
14
15
|
* - minimal → no controls row, no search input, no Kind/Package selects, no
|
|
15
|
-
* toggle, no onActivate hook, the default `passesFilter` predicate
|
|
16
|
-
*
|
|
17
|
-
*
|
|
18
|
-
* row-extras, custom column values, and per-id-namespaced state vars.
|
|
16
|
+
* toggle, no onActivate hook, the default `passesFilter` predicate;
|
|
17
|
+
* - maximal → all of those present, with the supplied predicate / row-extras /
|
|
18
|
+
* custom columns active.
|
|
19
19
|
*/
|
|
20
|
-
import { describe, expect, it } from 'vitest';
|
|
21
|
-
import {
|
|
20
|
+
import { describe, expect, it, beforeEach } from 'vitest';
|
|
21
|
+
import { DASHBOARD_CLIENT_BUNDLE } from '../client-bundle.generated.js';
|
|
22
|
+
function loadEnv() {
|
|
23
|
+
// The ranked-view skeleton lives in the typed client bundle (L4); loading the
|
|
24
|
+
// bundle exposes `defineRankedView`, `views`, `buildIndexes`, `filterState` as
|
|
25
|
+
// page globals. Declare the page globals the bundle reads at load.
|
|
26
|
+
const head = `
|
|
27
|
+
var sessions = [];
|
|
28
|
+
var EDITOR_PROTOCOL = null;
|
|
29
|
+
var graphCatalog = null;
|
|
30
|
+
var graphIndexes = null;
|
|
31
|
+
`;
|
|
32
|
+
const tail = `return { defineRankedView, views, buildIndexes, filterState };`;
|
|
33
|
+
// eslint-disable-next-line @typescript-eslint/no-implied-eval, sonarjs/code-eval -- Trusted source: our own bundled dashboard JS.
|
|
34
|
+
const factory = new Function(head + DASHBOARD_CLIENT_BUNDLE + tail);
|
|
35
|
+
return factory();
|
|
36
|
+
}
|
|
37
|
+
function makeOcc(over) {
|
|
38
|
+
return {
|
|
39
|
+
qualifiedName: over.simpleName,
|
|
40
|
+
line: 1,
|
|
41
|
+
column: 0,
|
|
42
|
+
endLine: 5,
|
|
43
|
+
kind: 'function-declaration',
|
|
44
|
+
params: [],
|
|
45
|
+
returnType: null,
|
|
46
|
+
enclosingClass: null,
|
|
47
|
+
decorators: [],
|
|
48
|
+
visibility: 'exported',
|
|
49
|
+
inTestFile: false,
|
|
50
|
+
definedInGenerated: false,
|
|
51
|
+
calls: [],
|
|
52
|
+
...over,
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
const SAMPLE = {
|
|
56
|
+
version: '2.0',
|
|
57
|
+
tool: 'graph',
|
|
58
|
+
language: 'typescript',
|
|
59
|
+
builtAt: 'now',
|
|
60
|
+
functions: {
|
|
61
|
+
a: [makeOcc({ bodyHash: 'a', simpleName: 'alpha', filePath: 'packages/cli/src/a.ts' })],
|
|
62
|
+
b: [
|
|
63
|
+
makeOcc({
|
|
64
|
+
bodyHash: 'b',
|
|
65
|
+
simpleName: 'beta',
|
|
66
|
+
filePath: 'packages/cli/src/b.ts',
|
|
67
|
+
kind: 'method',
|
|
68
|
+
}),
|
|
69
|
+
],
|
|
70
|
+
},
|
|
71
|
+
};
|
|
22
72
|
function minimalConfig() {
|
|
23
73
|
return {
|
|
24
74
|
id: 'plain',
|
|
25
75
|
label: 'Plain',
|
|
26
76
|
help: { title: 'Plain', sections: [{ heading: 'h', body: 'b' }] },
|
|
27
|
-
metric:
|
|
28
|
-
columns: [{ label: 'Function', value:
|
|
77
|
+
metric: (occ) => occ.line ?? 0,
|
|
78
|
+
columns: [{ label: 'Function', value: (o) => o.simpleName }],
|
|
29
79
|
headingText: 'Plain things',
|
|
30
80
|
emptyMessage: 'Nothing here.',
|
|
31
81
|
};
|
|
32
82
|
}
|
|
83
|
+
function renderConfig(env, config) {
|
|
84
|
+
env.defineRankedView(config);
|
|
85
|
+
const view = env.views.find((v) => v.id === config.id);
|
|
86
|
+
const host = document.createElement('div');
|
|
87
|
+
document.body.append(host);
|
|
88
|
+
const indexes = env.buildIndexes(SAMPLE);
|
|
89
|
+
view.render(host, SAMPLE, indexes, env.filterState);
|
|
90
|
+
return host;
|
|
91
|
+
}
|
|
92
|
+
beforeEach(() => {
|
|
93
|
+
document.body.innerHTML = '';
|
|
94
|
+
});
|
|
33
95
|
describe('defineRankedView — minimal config (default/off branches)', () => {
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
expect(
|
|
39
|
-
expect(
|
|
40
|
-
expect(
|
|
41
|
-
});
|
|
42
|
-
it('
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
expect(
|
|
52
|
-
expect(
|
|
53
|
-
expect(
|
|
54
|
-
expect(
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
it('emits no onActivate hook (search auto-focus) for a non-search view', () => {
|
|
63
|
-
expect(js).not.toContain('onActivate()');
|
|
96
|
+
it('registers a view with the configured id, label, and heading count', () => {
|
|
97
|
+
const env = loadEnv();
|
|
98
|
+
const host = renderConfig(env, minimalConfig());
|
|
99
|
+
const view = env.views.find((v) => v.id === 'plain');
|
|
100
|
+
expect(view).toBeDefined();
|
|
101
|
+
expect(view.label).toBe('Plain');
|
|
102
|
+
expect(host.querySelector('h3').textContent).toContain('Plain things (2)');
|
|
103
|
+
});
|
|
104
|
+
it('renders rows with the default (passesFilter) predicate', () => {
|
|
105
|
+
const env = loadEnv();
|
|
106
|
+
const host = renderConfig(env, minimalConfig());
|
|
107
|
+
// Both sample functions pass the default whole-graph filter.
|
|
108
|
+
expect(host.querySelectorAll('[data-body-hash]').length).toBe(2);
|
|
109
|
+
});
|
|
110
|
+
it('renders NO controls row, search input, Kind/Package selects, or toggle', () => {
|
|
111
|
+
const env = loadEnv();
|
|
112
|
+
const host = renderConfig(env, minimalConfig());
|
|
113
|
+
expect(host.querySelector('.code-paths-ranked-controls')).toBeNull();
|
|
114
|
+
expect(host.querySelector('#code-paths-search-plain')).toBeNull();
|
|
115
|
+
expect(host.querySelector('select[data-control="fn-kind"]')).toBeNull();
|
|
116
|
+
expect(host.querySelector('select[data-control="fn-package"]')).toBeNull();
|
|
117
|
+
expect(host.querySelector('input[data-control="fn-toggle"]')).toBeNull();
|
|
118
|
+
});
|
|
119
|
+
it('registers no onActivate hook for a non-search view', () => {
|
|
120
|
+
const env = loadEnv();
|
|
121
|
+
env.defineRankedView(minimalConfig());
|
|
122
|
+
const view = env.views.find((v) => v.id === 'plain');
|
|
123
|
+
expect(view.onActivate).toBeUndefined();
|
|
64
124
|
});
|
|
65
125
|
});
|
|
66
|
-
|
|
67
|
-
|
|
126
|
+
function maximalConfig() {
|
|
127
|
+
return {
|
|
68
128
|
id: 'rich-1',
|
|
69
129
|
label: 'Rich',
|
|
70
130
|
help: { title: 'Rich', sections: [{ heading: 'h', body: 'b' }] },
|
|
71
|
-
metric:
|
|
72
|
-
predicate:
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
columns: [{ label: 'Name', value:
|
|
131
|
+
metric: (occ) => occ.line ?? 0,
|
|
132
|
+
// Custom predicate: keep only function-declarations.
|
|
133
|
+
predicate: (occ) => occ.kind === 'function-declaration',
|
|
134
|
+
rowExtras: (occ) => ({ __thumb: (occ.params ?? []).length }),
|
|
135
|
+
columns: [{ label: 'Name', value: (o) => o.simpleName }],
|
|
76
136
|
headingText: 'Rich functions',
|
|
77
137
|
emptyMessage: 'No rich functions.',
|
|
78
138
|
searchByName: true,
|
|
79
139
|
filterByKindPackage: true,
|
|
80
|
-
filterToggle: { label: 'Test-only', predicate:
|
|
81
|
-
}
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
140
|
+
filterToggle: { label: 'Test-only', predicate: (occ) => occ.inTestFile === true },
|
|
141
|
+
};
|
|
142
|
+
}
|
|
143
|
+
describe('defineRankedView — maximal config (populated branches)', () => {
|
|
144
|
+
it('applies the custom predicate (drops non-matching rows)', () => {
|
|
145
|
+
const env = loadEnv();
|
|
146
|
+
const host = renderConfig(env, maximalConfig());
|
|
147
|
+
// Only 'alpha' is a function-declaration; 'beta' is a method → dropped.
|
|
148
|
+
expect(host.querySelectorAll('[data-body-hash]').length).toBe(1);
|
|
149
|
+
expect(host.textContent).toContain('alpha');
|
|
150
|
+
expect(host.textContent).not.toContain('beta');
|
|
88
151
|
});
|
|
89
152
|
it('renders the controls row with search, Kind/Package selects, and toggle', () => {
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
expect(
|
|
93
|
-
expect(
|
|
94
|
-
expect(
|
|
95
|
-
expect(
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
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')");
|
|
153
|
+
const env = loadEnv();
|
|
154
|
+
const host = renderConfig(env, maximalConfig());
|
|
155
|
+
expect(host.querySelector('.code-paths-ranked-controls')).not.toBeNull();
|
|
156
|
+
expect(host.querySelector('#code-paths-search-rich-1')).not.toBeNull();
|
|
157
|
+
expect(host.querySelector('select[data-control="fn-kind"]')).not.toBeNull();
|
|
158
|
+
expect(host.querySelector('select[data-control="fn-package"]')).not.toBeNull();
|
|
159
|
+
expect(host.querySelector('input[data-control="fn-toggle"]')).not.toBeNull();
|
|
160
|
+
expect(host.textContent).toContain('Test-only');
|
|
161
|
+
});
|
|
162
|
+
it('registers an onActivate hook that focuses the search box', () => {
|
|
163
|
+
const env = loadEnv();
|
|
164
|
+
env.defineRankedView(maximalConfig());
|
|
165
|
+
const view = env.views.find((v) => v.id === 'rich-1');
|
|
166
|
+
expect(typeof view.onActivate).toBe('function');
|
|
115
167
|
});
|
|
116
168
|
});
|
|
117
169
|
describe('defineRankedView — partial configs (each flag independently)', () => {
|
|
118
170
|
it('search-only: controls + search input, but no Kind/Package or toggle', () => {
|
|
119
|
-
const
|
|
120
|
-
|
|
121
|
-
expect(
|
|
122
|
-
expect(
|
|
123
|
-
expect(
|
|
124
|
-
expect(
|
|
125
|
-
|
|
171
|
+
const env = loadEnv();
|
|
172
|
+
const host = renderConfig(env, { ...minimalConfig(), id: 'searchonly', searchByName: true });
|
|
173
|
+
expect(host.querySelector('.code-paths-ranked-controls')).not.toBeNull();
|
|
174
|
+
expect(host.querySelector('#code-paths-search-searchonly')).not.toBeNull();
|
|
175
|
+
expect(host.querySelector('select[data-control="fn-kind"]')).toBeNull();
|
|
176
|
+
expect(host.querySelector('input[data-control="fn-toggle"]')).toBeNull();
|
|
177
|
+
const view = env.views.find((v) => v.id === 'searchonly');
|
|
178
|
+
expect(typeof view.onActivate).toBe('function');
|
|
126
179
|
});
|
|
127
180
|
it('toggle-only: controls + toggle checkbox, but no search input or selects', () => {
|
|
128
|
-
const
|
|
181
|
+
const env = loadEnv();
|
|
182
|
+
const host = renderConfig(env, {
|
|
129
183
|
...minimalConfig(),
|
|
130
184
|
id: 'toggleonly',
|
|
131
|
-
filterToggle: { label: 'Only X', predicate:
|
|
185
|
+
filterToggle: { label: 'Only X', predicate: () => true },
|
|
132
186
|
});
|
|
133
|
-
expect(
|
|
134
|
-
expect(
|
|
135
|
-
expect(
|
|
136
|
-
expect(
|
|
137
|
-
|
|
138
|
-
expect(js).not.toContain("'data-control': 'fn-kind'");
|
|
187
|
+
expect(host.querySelector('.code-paths-ranked-controls')).not.toBeNull();
|
|
188
|
+
expect(host.querySelector('input[data-control="fn-toggle"]')).not.toBeNull();
|
|
189
|
+
expect(host.querySelector('#code-paths-search-toggleonly')).toBeNull();
|
|
190
|
+
expect(host.querySelector('select[data-control="fn-kind"]')).toBeNull();
|
|
191
|
+
const view = env.views.find((v) => v.id === 'toggleonly');
|
|
139
192
|
// A toggle without search → no auto-focus hook.
|
|
140
|
-
expect(
|
|
193
|
+
expect(view.onActivate).toBeUndefined();
|
|
141
194
|
});
|
|
142
195
|
it('kind/package-only: selects present, but no search input or toggle', () => {
|
|
143
|
-
const
|
|
144
|
-
|
|
145
|
-
expect(
|
|
146
|
-
expect(
|
|
147
|
-
expect(
|
|
148
|
-
expect(
|
|
149
|
-
|
|
150
|
-
expect(
|
|
196
|
+
const env = loadEnv();
|
|
197
|
+
const host = renderConfig(env, { ...minimalConfig(), id: 'kponly', filterByKindPackage: true });
|
|
198
|
+
expect(host.querySelector('select[data-control="fn-kind"]')).not.toBeNull();
|
|
199
|
+
expect(host.querySelector('select[data-control="fn-package"]')).not.toBeNull();
|
|
200
|
+
expect(host.querySelector('#code-paths-search-kponly')).toBeNull();
|
|
201
|
+
expect(host.querySelector('input[data-control="fn-toggle"]')).toBeNull();
|
|
202
|
+
const view = env.views.find((v) => v.id === 'kponly');
|
|
203
|
+
expect(view.onActivate).toBeUndefined();
|
|
151
204
|
});
|
|
152
205
|
});
|
|
153
206
|
//# sourceMappingURL=dashboard-view-template.test.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dashboard-view-template.test.js","sourceRoot":"","sources":["../../src/__tests__/dashboard-view-template.test.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"dashboard-view-template.test.js","sourceRoot":"","sources":["../../src/__tests__/dashboard-view-template.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -49,8 +49,10 @@ describe('dashboard graph-tab — rule/recipe catalog wiring', () => {
|
|
|
49
49
|
it('renders the Catalog rule cell without a monospace/font-mono override (item 13)', () => {
|
|
50
50
|
// The Rule slug cell used to force font-family: var(--font-mono,monospace).
|
|
51
51
|
// It must now inherit the shared .data-table td styling instead. Guard the
|
|
52
|
-
//
|
|
53
|
-
|
|
52
|
+
// renderGraphRuleCatalog source against the regression. `renderGraphRuleCatalog`
|
|
53
|
+
// now lives in the typed client bundle (L4) — esbuild emits double-quoted
|
|
54
|
+
// strings, so the marker is the bundled (double-quote) form.
|
|
55
|
+
const ruleCellMarker = 'el("td", { text: rule.slug,';
|
|
54
56
|
const idx = html.indexOf(ruleCellMarker);
|
|
55
57
|
expect(idx).toBeGreaterThan(-1);
|
|
56
58
|
const cellDecl = html.slice(idx, idx + 120);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"graph-tab.test.js","sourceRoot":"","sources":["../../src/__tests__/graph-tab.test.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAEzC,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAE9C,OAAO,EAAE,qBAAqB,EAAE,MAAM,iBAAiB,CAAC;AAExD,MAAM,IAAI,GAAG,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AAErD,QAAQ,CAAC,kDAAkD,EAAE,GAAG,EAAE;IAChE,MAAM,IAAI,GAAG,qBAAqB,CAAC;QACjC,QAAQ,EAAE,EAAE;QACZ,gBAAgB,EAAE;YAChB,EAAE,IAAI,EAAE,sBAAsB,EAAE,eAAe,EAAE,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE;YAChF,EAAE,IAAI,EAAE,gCAAgC,EAAE,eAAe,EAAE,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE;SAC3F;QACD,kBAAkB,EAAE;YAClB;gBACE,IAAI,EAAE,SAAS;gBACf,WAAW,EAAE,SAAS;gBACtB,WAAW,EAAE,qBAAqB;gBAClC,IAAI,EAAE,CAAC,SAAS,CAAC;gBACjB,YAAY,EAAE,KAAK;aACpB;SACF;KACF,CAAC,CAAC;IAEH,EAAE,CAAC,6DAA6D,EAAE,GAAG,EAAE;QACrE,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,0BAA0B,CAAC,CAAC;QACnD,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,sBAAsB,CAAC,CAAC;QAC/C,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,gCAAgC,CAAC,CAAC;IAC3D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wEAAwE,EAAE,GAAG,EAAE;QAChF,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,4BAA4B,CAAC,CAAC;QACrD,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;IACpC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,oGAAoG,EAAE,GAAG,EAAE;QAC5G,wEAAwE;QACxE,gCAAgC;QAChC,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,sBAAsB,CAAC,CAAC;QAC/C,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,uBAAuB,CAAC,CAAC;QAChD,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,0BAA0B,CAAC,CAAC;QACnD,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,4BAA4B,CAAC,CAAC;IACvD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gFAAgF,EAAE,GAAG,EAAE;QACxF,4EAA4E;QAC5E,2EAA2E;QAC3E,
|
|
1
|
+
{"version":3,"file":"graph-tab.test.js","sourceRoot":"","sources":["../../src/__tests__/graph-tab.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `el(tag, attrs, children)` — tiny DOM-builder helper used everywhere a string
|
|
3
|
+
* of `document.createElement` + setAttribute calls would otherwise live.
|
|
4
|
+
*
|
|
5
|
+
* Special attribute keys: `text` sets `textContent`, `class` sets `className`,
|
|
6
|
+
* anything starting with `on` is treated as an event listener (e.g. `onclick`),
|
|
7
|
+
* everything else passes through to `setAttribute`. `children` may include strings
|
|
8
|
+
* (auto-wrapped into text nodes) or `null`/`undefined` (skipped).
|
|
9
|
+
*
|
|
10
|
+
* First module migrated out of the legacy String.raw emitters (L4): real,
|
|
11
|
+
* type-checked TypeScript (DOM lib) bundled into the inlined client `<script>`.
|
|
12
|
+
*/
|
|
13
|
+
type ElAttrs = Record<string, unknown>;
|
|
14
|
+
type ElChild = Node | string | null | undefined;
|
|
15
|
+
export declare function el(tag: string, attrs?: ElAttrs, children?: readonly ElChild[]): HTMLElement;
|
|
16
|
+
export {};
|
|
17
|
+
//# sourceMappingURL=el.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"el.d.ts","sourceRoot":"","sources":["../../src/client/el.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,KAAK,OAAO,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AACvC,KAAK,OAAO,GAAG,IAAI,GAAG,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;AAEhD,wBAAgB,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,OAAO,EAAE,QAAQ,CAAC,EAAE,SAAS,OAAO,EAAE,GAAG,WAAW,CAiB3F"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `el(tag, attrs, children)` — tiny DOM-builder helper used everywhere a string
|
|
3
|
+
* of `document.createElement` + setAttribute calls would otherwise live.
|
|
4
|
+
*
|
|
5
|
+
* Special attribute keys: `text` sets `textContent`, `class` sets `className`,
|
|
6
|
+
* anything starting with `on` is treated as an event listener (e.g. `onclick`),
|
|
7
|
+
* everything else passes through to `setAttribute`. `children` may include strings
|
|
8
|
+
* (auto-wrapped into text nodes) or `null`/`undefined` (skipped).
|
|
9
|
+
*
|
|
10
|
+
* First module migrated out of the legacy String.raw emitters (L4): real,
|
|
11
|
+
* type-checked TypeScript (DOM lib) bundled into the inlined client `<script>`.
|
|
12
|
+
*/
|
|
13
|
+
export function el(tag, attrs, children) {
|
|
14
|
+
const e = document.createElement(tag);
|
|
15
|
+
if (attrs)
|
|
16
|
+
Object.entries(attrs).forEach(([k, v]) => {
|
|
17
|
+
if (k === 'text')
|
|
18
|
+
e.textContent = v;
|
|
19
|
+
else if (k === 'class')
|
|
20
|
+
e.className = v;
|
|
21
|
+
else if (k.startsWith('on'))
|
|
22
|
+
e.addEventListener(k.slice(2), v);
|
|
23
|
+
else
|
|
24
|
+
e.setAttribute(k, v);
|
|
25
|
+
});
|
|
26
|
+
if (children)
|
|
27
|
+
children.forEach((c) => {
|
|
28
|
+
// `append(string)` creates a text node — identical to the prior
|
|
29
|
+
// appendChild(createTextNode(...)); `append(node)` appends the node. Skip
|
|
30
|
+
// null/undefined; an empty string '' is still appended (as before).
|
|
31
|
+
if (typeof c === 'string' || c)
|
|
32
|
+
e.append(c);
|
|
33
|
+
});
|
|
34
|
+
return e;
|
|
35
|
+
}
|
|
36
|
+
//# sourceMappingURL=el.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"el.js","sourceRoot":"","sources":["../../src/client/el.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAKH,MAAM,UAAU,EAAE,CAAC,GAAW,EAAE,KAAe,EAAE,QAA6B;IAC5E,MAAM,CAAC,GAAG,QAAQ,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC;IACtC,IAAI,KAAK;QACP,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE;YACvC,IAAI,CAAC,KAAK,MAAM;gBAAE,CAAC,CAAC,WAAW,GAAG,CAAW,CAAC;iBACzC,IAAI,CAAC,KAAK,OAAO;gBAAE,CAAC,CAAC,SAAS,GAAG,CAAW,CAAC;iBAC7C,IAAI,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC;gBAAE,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAkB,CAAC,CAAC;;gBAC3E,CAAC,CAAC,YAAY,CAAC,CAAC,EAAE,CAAW,CAAC,CAAC;QACtC,CAAC,CAAC,CAAC;IACL,IAAI,QAAQ;QACV,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE;YACrB,gEAAgE;YAChE,0EAA0E;YAC1E,oEAAoE;YACpE,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC;gBAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QAC9C,CAAC,CAAC,CAAC;IACL,OAAO,CAAC,CAAC;AACX,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client-bundle.generated.d.ts","sourceRoot":"","sources":["../src/client-bundle.generated.ts"],"names":[],"mappings":"AACA,eAAO,MAAM,uBAAuB,EAAE,MAAu3uH,CAAC"}
|