@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.
Files changed (211) hide show
  1. package/README.md +2 -2
  2. package/dist/__tests__/catalog-provenance.test.js +6 -24
  3. package/dist/__tests__/catalog-provenance.test.js.map +1 -1
  4. package/dist/__tests__/coupling-attribution.test.js +10 -14
  5. package/dist/__tests__/coupling-attribution.test.js.map +1 -1
  6. package/dist/__tests__/dashboard-bundle-weight.test.d.ts +9 -2
  7. package/dist/__tests__/dashboard-bundle-weight.test.d.ts.map +1 -1
  8. package/dist/__tests__/dashboard-bundle-weight.test.js +19 -12
  9. package/dist/__tests__/dashboard-bundle-weight.test.js.map +1 -1
  10. package/dist/__tests__/dashboard-cell-containment.test.js +5 -2
  11. package/dist/__tests__/dashboard-cell-containment.test.js.map +1 -1
  12. package/dist/__tests__/dashboard-editor-link.test.d.ts +9 -0
  13. package/dist/__tests__/dashboard-editor-link.test.d.ts.map +1 -1
  14. package/dist/__tests__/dashboard-editor-link.test.js +72 -21
  15. package/dist/__tests__/dashboard-editor-link.test.js.map +1 -1
  16. package/dist/__tests__/dashboard-el.test.d.ts +18 -0
  17. package/dist/__tests__/dashboard-el.test.d.ts.map +1 -0
  18. package/dist/__tests__/dashboard-el.test.js +90 -0
  19. package/dist/__tests__/dashboard-el.test.js.map +1 -0
  20. package/dist/__tests__/dashboard-filters.test.js +6 -14
  21. package/dist/__tests__/dashboard-filters.test.js.map +1 -1
  22. package/dist/__tests__/dashboard-function-card-singleton.test.js +15 -27
  23. package/dist/__tests__/dashboard-function-card-singleton.test.js.map +1 -1
  24. package/dist/__tests__/dashboard-function-card.test.d.ts +4 -4
  25. package/dist/__tests__/dashboard-function-card.test.js +80 -44
  26. package/dist/__tests__/dashboard-function-card.test.js.map +1 -1
  27. package/dist/__tests__/dashboard-function-row.test.js +52 -51
  28. package/dist/__tests__/dashboard-function-row.test.js.map +1 -1
  29. package/dist/__tests__/dashboard-generator-graph-catalog.test.js +3 -1
  30. package/dist/__tests__/dashboard-generator-graph-catalog.test.js.map +1 -1
  31. package/dist/__tests__/dashboard-graph-offline.integration.test.js +3 -1
  32. package/dist/__tests__/dashboard-graph-offline.integration.test.js.map +1 -1
  33. package/dist/__tests__/dashboard-help-drawer.test.js +11 -17
  34. package/dist/__tests__/dashboard-help-drawer.test.js.map +1 -1
  35. package/dist/__tests__/dashboard-indexes.test.d.ts +6 -4
  36. package/dist/__tests__/dashboard-indexes.test.d.ts.map +1 -1
  37. package/dist/__tests__/dashboard-indexes.test.js +10 -7
  38. package/dist/__tests__/dashboard-indexes.test.js.map +1 -1
  39. package/dist/__tests__/dashboard-pagination.test.d.ts +15 -0
  40. package/dist/__tests__/dashboard-pagination.test.d.ts.map +1 -0
  41. package/dist/__tests__/dashboard-pagination.test.js +140 -0
  42. package/dist/__tests__/dashboard-pagination.test.js.map +1 -0
  43. package/dist/__tests__/dashboard-path-utils.test.d.ts +7 -0
  44. package/dist/__tests__/dashboard-path-utils.test.d.ts.map +1 -1
  45. package/dist/__tests__/dashboard-path-utils.test.js +11 -3
  46. package/dist/__tests__/dashboard-path-utils.test.js.map +1 -1
  47. package/dist/__tests__/dashboard-search.test.d.ts +5 -0
  48. package/dist/__tests__/dashboard-search.test.d.ts.map +1 -1
  49. package/dist/__tests__/dashboard-search.test.js +9 -3
  50. package/dist/__tests__/dashboard-search.test.js.map +1 -1
  51. package/dist/__tests__/dashboard-sessions.test.js +13 -11
  52. package/dist/__tests__/dashboard-sessions.test.js.map +1 -1
  53. package/dist/__tests__/dashboard-trace.test.d.ts +11 -0
  54. package/dist/__tests__/dashboard-trace.test.d.ts.map +1 -1
  55. package/dist/__tests__/dashboard-trace.test.js +55 -32
  56. package/dist/__tests__/dashboard-trace.test.js.map +1 -1
  57. package/dist/__tests__/dashboard-view-conformance.test.js +9 -15
  58. package/dist/__tests__/dashboard-view-conformance.test.js.map +1 -1
  59. package/dist/__tests__/dashboard-view-coupling.test.js +14 -35
  60. package/dist/__tests__/dashboard-view-coupling.test.js.map +1 -1
  61. package/dist/__tests__/dashboard-view-distribution.test.js +14 -37
  62. package/dist/__tests__/dashboard-view-distribution.test.js.map +1 -1
  63. package/dist/__tests__/dashboard-view-graph.test.js +29 -62
  64. package/dist/__tests__/dashboard-view-graph.test.js.map +1 -1
  65. package/dist/__tests__/dashboard-view-template.test.d.ts +13 -14
  66. package/dist/__tests__/dashboard-view-template.test.d.ts.map +1 -1
  67. package/dist/__tests__/dashboard-view-template.test.js +165 -112
  68. package/dist/__tests__/dashboard-view-template.test.js.map +1 -1
  69. package/dist/__tests__/graph-tab.test.js +4 -2
  70. package/dist/__tests__/graph-tab.test.js.map +1 -1
  71. package/dist/client/el.d.ts +17 -0
  72. package/dist/client/el.d.ts.map +1 -0
  73. package/dist/client/el.js +36 -0
  74. package/dist/client/el.js.map +1 -0
  75. package/dist/client-bundle.generated.d.ts +2 -0
  76. package/dist/client-bundle.generated.d.ts.map +1 -0
  77. package/dist/client-bundle.generated.js +3 -0
  78. package/dist/client-bundle.generated.js.map +1 -0
  79. package/dist/code-paths/__tests__/views-registry.test.d.ts +13 -8
  80. package/dist/code-paths/__tests__/views-registry.test.d.ts.map +1 -1
  81. package/dist/code-paths/__tests__/views-registry.test.js +27 -25
  82. package/dist/code-paths/__tests__/views-registry.test.js.map +1 -1
  83. package/dist/code-paths.d.ts +21 -62
  84. package/dist/code-paths.d.ts.map +1 -1
  85. package/dist/code-paths.js +24 -349
  86. package/dist/code-paths.js.map +1 -1
  87. package/dist/generator.d.ts +2 -0
  88. package/dist/generator.d.ts.map +1 -1
  89. package/dist/generator.js +28 -17
  90. package/dist/generator.js.map +1 -1
  91. package/package.json +5 -4
  92. package/dist/checks.d.ts +0 -7
  93. package/dist/checks.d.ts.map +0 -1
  94. package/dist/checks.js +0 -283
  95. package/dist/checks.js.map +0 -1
  96. package/dist/code-paths/catalog-provenance.d.ts +0 -22
  97. package/dist/code-paths/catalog-provenance.d.ts.map +0 -1
  98. package/dist/code-paths/catalog-provenance.js +0 -108
  99. package/dist/code-paths/catalog-provenance.js.map +0 -1
  100. package/dist/code-paths/catalog-recipes-tables.d.ts +0 -11
  101. package/dist/code-paths/catalog-recipes-tables.d.ts.map +0 -1
  102. package/dist/code-paths/catalog-recipes-tables.js +0 -86
  103. package/dist/code-paths/catalog-recipes-tables.js.map +0 -1
  104. package/dist/code-paths/editor-link.d.ts +0 -10
  105. package/dist/code-paths/editor-link.d.ts.map +0 -1
  106. package/dist/code-paths/editor-link.js +0 -20
  107. package/dist/code-paths/editor-link.js.map +0 -1
  108. package/dist/code-paths/filters.d.ts +0 -19
  109. package/dist/code-paths/filters.d.ts.map +0 -1
  110. package/dist/code-paths/filters.js +0 -47
  111. package/dist/code-paths/filters.js.map +0 -1
  112. package/dist/code-paths/function-card.d.ts +0 -15
  113. package/dist/code-paths/function-card.d.ts.map +0 -1
  114. package/dist/code-paths/function-card.js +0 -169
  115. package/dist/code-paths/function-card.js.map +0 -1
  116. package/dist/code-paths/function-row.d.ts +0 -17
  117. package/dist/code-paths/function-row.d.ts.map +0 -1
  118. package/dist/code-paths/function-row.js +0 -77
  119. package/dist/code-paths/function-row.js.map +0 -1
  120. package/dist/code-paths/graph-controls.d.ts +0 -27
  121. package/dist/code-paths/graph-controls.d.ts.map +0 -1
  122. package/dist/code-paths/graph-controls.js +0 -257
  123. package/dist/code-paths/graph-controls.js.map +0 -1
  124. package/dist/code-paths/graph-stylesheet.d.ts +0 -22
  125. package/dist/code-paths/graph-stylesheet.d.ts.map +0 -1
  126. package/dist/code-paths/graph-stylesheet.js +0 -121
  127. package/dist/code-paths/graph-stylesheet.js.map +0 -1
  128. package/dist/code-paths/help-drawer.d.ts +0 -18
  129. package/dist/code-paths/help-drawer.d.ts.map +0 -1
  130. package/dist/code-paths/help-drawer.js +0 -54
  131. package/dist/code-paths/help-drawer.js.map +0 -1
  132. package/dist/code-paths/indexes.d.ts +0 -28
  133. package/dist/code-paths/indexes.d.ts.map +0 -1
  134. package/dist/code-paths/indexes.js +0 -97
  135. package/dist/code-paths/indexes.js.map +0 -1
  136. package/dist/code-paths/path-utils.d.ts +0 -15
  137. package/dist/code-paths/path-utils.d.ts.map +0 -1
  138. package/dist/code-paths/path-utils.js +0 -47
  139. package/dist/code-paths/path-utils.js.map +0 -1
  140. package/dist/code-paths/search.d.ts +0 -14
  141. package/dist/code-paths/search.d.ts.map +0 -1
  142. package/dist/code-paths/search.js +0 -54
  143. package/dist/code-paths/search.js.map +0 -1
  144. package/dist/code-paths/trace.d.ts +0 -11
  145. package/dist/code-paths/trace.d.ts.map +0 -1
  146. package/dist/code-paths/trace.js +0 -60
  147. package/dist/code-paths/trace.js.map +0 -1
  148. package/dist/code-paths/view-coupling.d.ts +0 -22
  149. package/dist/code-paths/view-coupling.d.ts.map +0 -1
  150. package/dist/code-paths/view-coupling.js +0 -218
  151. package/dist/code-paths/view-coupling.js.map +0 -1
  152. package/dist/code-paths/view-distribution.d.ts +0 -20
  153. package/dist/code-paths/view-distribution.d.ts.map +0 -1
  154. package/dist/code-paths/view-distribution.js +0 -82
  155. package/dist/code-paths/view-distribution.js.map +0 -1
  156. package/dist/code-paths/view-graph.d.ts +0 -35
  157. package/dist/code-paths/view-graph.d.ts.map +0 -1
  158. package/dist/code-paths/view-graph.js +0 -379
  159. package/dist/code-paths/view-graph.js.map +0 -1
  160. package/dist/code-paths/view-template.d.ts +0 -154
  161. package/dist/code-paths/view-template.d.ts.map +0 -1
  162. package/dist/code-paths/view-template.js +0 -218
  163. package/dist/code-paths/view-template.js.map +0 -1
  164. package/dist/code-paths/views-registry.d.ts +0 -13
  165. package/dist/code-paths/views-registry.d.ts.map +0 -1
  166. package/dist/code-paths/views-registry.js +0 -53
  167. package/dist/code-paths/views-registry.js.map +0 -1
  168. package/dist/overview.d.ts +0 -13
  169. package/dist/overview.d.ts.map +0 -1
  170. package/dist/overview.js +0 -91
  171. package/dist/overview.js.map +0 -1
  172. package/dist/recipes.d.ts +0 -6
  173. package/dist/recipes.d.ts.map +0 -1
  174. package/dist/recipes.js +0 -68
  175. package/dist/recipes.js.map +0 -1
  176. package/dist/sessions.d.ts +0 -6
  177. package/dist/sessions.d.ts.map +0 -1
  178. package/dist/sessions.js +0 -288
  179. package/dist/sessions.js.map +0 -1
  180. package/dist/shared/el.d.ts +0 -13
  181. package/dist/shared/el.d.ts.map +0 -1
  182. package/dist/shared/el.js +0 -27
  183. package/dist/shared/el.js.map +0 -1
  184. package/dist/shared/pagination.d.ts +0 -15
  185. package/dist/shared/pagination.d.ts.map +0 -1
  186. package/dist/shared/pagination.js +0 -113
  187. package/dist/shared/pagination.js.map +0 -1
  188. package/dist/shared/sortable.d.ts +0 -14
  189. package/dist/shared/sortable.d.ts.map +0 -1
  190. package/dist/shared/sortable.js +0 -101
  191. package/dist/shared/sortable.js.map +0 -1
  192. package/dist/shared/tab-activators.d.ts +0 -16
  193. package/dist/shared/tab-activators.d.ts.map +0 -1
  194. package/dist/shared/tab-activators.js +0 -33
  195. package/dist/shared/tab-activators.js.map +0 -1
  196. package/dist/shared/tab-bar.d.ts +0 -8
  197. package/dist/shared/tab-bar.d.ts.map +0 -1
  198. package/dist/shared/tab-bar.js +0 -20
  199. package/dist/shared/tab-bar.js.map +0 -1
  200. package/dist/shared.d.ts +0 -26
  201. package/dist/shared.d.ts.map +0 -1
  202. package/dist/shared.js +0 -39
  203. package/dist/shared.js.map +0 -1
  204. package/dist/subtab-bar.d.ts +0 -23
  205. package/dist/subtab-bar.d.ts.map +0 -1
  206. package/dist/subtab-bar.js +0 -77
  207. package/dist/subtab-bar.js.map +0 -1
  208. package/dist/tool-tabs.d.ts +0 -12
  209. package/dist/tool-tabs.d.ts.map +0 -1
  210. package/dist/tool-tabs.js +0 -80
  211. package/dist/tool-tabs.js.map +0 -1
@@ -1,153 +1,206 @@
1
+ /// <reference lib="dom" />
1
2
  /**
2
- * Ranked-view emitter — `defineRankedView`.
3
+ * @vitest-environment jsdom
3
4
  *
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.
5
+ * Ranked-view skeleton `defineRankedView`.
10
6
  *
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:
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 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.
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 { defineRankedView } from '../code-paths/view-template.js';
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: 'occ.line',
28
- columns: [{ label: 'Function', value: 'o => o.simpleName' }],
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
- 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()');
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
- describe('defineRankedView — maximal config (populated branches)', () => {
67
- const js = defineRankedView({
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: '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)' }],
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: '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)');
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
- 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')");
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 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()');
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 js = defineRankedView({
181
+ const env = loadEnv();
182
+ const host = renderConfig(env, {
129
183
  ...minimalConfig(),
130
184
  id: 'toggleonly',
131
- filterToggle: { label: 'Only X', predicate: 'isX(occ)' },
185
+ filterToggle: { label: 'Only X', predicate: () => true },
132
186
  });
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'");
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(js).not.toContain('onActivate()');
193
+ expect(view.onActivate).toBeUndefined();
141
194
  });
142
195
  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()');
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":"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"}
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
- // emitted renderGraphRuleCatalog source against the regression.
53
- const ruleCellMarker = "el('td', { text: rule.slug,";
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":"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"}
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,2 @@
1
+ export declare const DASHBOARD_CLIENT_BUNDLE: string;
2
+ //# sourceMappingURL=client-bundle.generated.d.ts.map
@@ -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"}