@opensip-cli/dashboard 0.1.6 → 0.1.8

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 (199) 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-filters.test.js +6 -14
  17. package/dist/__tests__/dashboard-filters.test.js.map +1 -1
  18. package/dist/__tests__/dashboard-function-card-singleton.test.js +15 -27
  19. package/dist/__tests__/dashboard-function-card-singleton.test.js.map +1 -1
  20. package/dist/__tests__/dashboard-function-card.test.d.ts +4 -4
  21. package/dist/__tests__/dashboard-function-card.test.js +23 -44
  22. package/dist/__tests__/dashboard-function-card.test.js.map +1 -1
  23. package/dist/__tests__/dashboard-function-row.test.js +6 -16
  24. package/dist/__tests__/dashboard-function-row.test.js.map +1 -1
  25. package/dist/__tests__/dashboard-generator-graph-catalog.test.js +3 -1
  26. package/dist/__tests__/dashboard-generator-graph-catalog.test.js.map +1 -1
  27. package/dist/__tests__/dashboard-graph-offline.integration.test.js +3 -1
  28. package/dist/__tests__/dashboard-graph-offline.integration.test.js.map +1 -1
  29. package/dist/__tests__/dashboard-help-drawer.test.js +11 -17
  30. package/dist/__tests__/dashboard-help-drawer.test.js.map +1 -1
  31. package/dist/__tests__/dashboard-indexes.test.d.ts +6 -4
  32. package/dist/__tests__/dashboard-indexes.test.d.ts.map +1 -1
  33. package/dist/__tests__/dashboard-indexes.test.js +10 -7
  34. package/dist/__tests__/dashboard-indexes.test.js.map +1 -1
  35. package/dist/__tests__/dashboard-path-utils.test.d.ts +7 -0
  36. package/dist/__tests__/dashboard-path-utils.test.d.ts.map +1 -1
  37. package/dist/__tests__/dashboard-path-utils.test.js +11 -3
  38. package/dist/__tests__/dashboard-path-utils.test.js.map +1 -1
  39. package/dist/__tests__/dashboard-search.test.d.ts +5 -0
  40. package/dist/__tests__/dashboard-search.test.d.ts.map +1 -1
  41. package/dist/__tests__/dashboard-search.test.js +9 -3
  42. package/dist/__tests__/dashboard-search.test.js.map +1 -1
  43. package/dist/__tests__/dashboard-sessions.test.js +13 -11
  44. package/dist/__tests__/dashboard-sessions.test.js.map +1 -1
  45. package/dist/__tests__/dashboard-trace.test.d.ts +11 -0
  46. package/dist/__tests__/dashboard-trace.test.d.ts.map +1 -1
  47. package/dist/__tests__/dashboard-trace.test.js +55 -32
  48. package/dist/__tests__/dashboard-trace.test.js.map +1 -1
  49. package/dist/__tests__/dashboard-view-conformance.test.js +9 -15
  50. package/dist/__tests__/dashboard-view-conformance.test.js.map +1 -1
  51. package/dist/__tests__/dashboard-view-coupling.test.js +14 -35
  52. package/dist/__tests__/dashboard-view-coupling.test.js.map +1 -1
  53. package/dist/__tests__/dashboard-view-distribution.test.js +14 -37
  54. package/dist/__tests__/dashboard-view-distribution.test.js.map +1 -1
  55. package/dist/__tests__/dashboard-view-graph.test.js +29 -62
  56. package/dist/__tests__/dashboard-view-graph.test.js.map +1 -1
  57. package/dist/__tests__/dashboard-view-template.test.d.ts +13 -14
  58. package/dist/__tests__/dashboard-view-template.test.d.ts.map +1 -1
  59. package/dist/__tests__/dashboard-view-template.test.js +165 -112
  60. package/dist/__tests__/dashboard-view-template.test.js.map +1 -1
  61. package/dist/__tests__/graph-tab.test.js +4 -2
  62. package/dist/__tests__/graph-tab.test.js.map +1 -1
  63. package/dist/client-bundle.generated.d.ts +2 -0
  64. package/dist/client-bundle.generated.d.ts.map +1 -0
  65. package/dist/client-bundle.generated.js +3 -0
  66. package/dist/client-bundle.generated.js.map +1 -0
  67. package/dist/code-paths/__tests__/views-registry.test.d.ts +13 -8
  68. package/dist/code-paths/__tests__/views-registry.test.d.ts.map +1 -1
  69. package/dist/code-paths/__tests__/views-registry.test.js +27 -25
  70. package/dist/code-paths/__tests__/views-registry.test.js.map +1 -1
  71. package/dist/code-paths.d.ts +21 -62
  72. package/dist/code-paths.d.ts.map +1 -1
  73. package/dist/code-paths.js +24 -349
  74. package/dist/code-paths.js.map +1 -1
  75. package/dist/generator.d.ts +2 -0
  76. package/dist/generator.d.ts.map +1 -1
  77. package/dist/generator.js +28 -17
  78. package/dist/generator.js.map +1 -1
  79. package/package.json +5 -4
  80. package/dist/checks.d.ts +0 -7
  81. package/dist/checks.d.ts.map +0 -1
  82. package/dist/checks.js +0 -283
  83. package/dist/checks.js.map +0 -1
  84. package/dist/code-paths/catalog-provenance.d.ts +0 -22
  85. package/dist/code-paths/catalog-provenance.d.ts.map +0 -1
  86. package/dist/code-paths/catalog-provenance.js +0 -108
  87. package/dist/code-paths/catalog-provenance.js.map +0 -1
  88. package/dist/code-paths/catalog-recipes-tables.d.ts +0 -11
  89. package/dist/code-paths/catalog-recipes-tables.d.ts.map +0 -1
  90. package/dist/code-paths/catalog-recipes-tables.js +0 -86
  91. package/dist/code-paths/catalog-recipes-tables.js.map +0 -1
  92. package/dist/code-paths/editor-link.d.ts +0 -10
  93. package/dist/code-paths/editor-link.d.ts.map +0 -1
  94. package/dist/code-paths/editor-link.js +0 -20
  95. package/dist/code-paths/editor-link.js.map +0 -1
  96. package/dist/code-paths/filters.d.ts +0 -19
  97. package/dist/code-paths/filters.d.ts.map +0 -1
  98. package/dist/code-paths/filters.js +0 -47
  99. package/dist/code-paths/filters.js.map +0 -1
  100. package/dist/code-paths/function-card.d.ts +0 -15
  101. package/dist/code-paths/function-card.d.ts.map +0 -1
  102. package/dist/code-paths/function-card.js +0 -169
  103. package/dist/code-paths/function-card.js.map +0 -1
  104. package/dist/code-paths/function-row.d.ts +0 -17
  105. package/dist/code-paths/function-row.d.ts.map +0 -1
  106. package/dist/code-paths/function-row.js +0 -77
  107. package/dist/code-paths/function-row.js.map +0 -1
  108. package/dist/code-paths/graph-controls.d.ts +0 -27
  109. package/dist/code-paths/graph-controls.d.ts.map +0 -1
  110. package/dist/code-paths/graph-controls.js +0 -257
  111. package/dist/code-paths/graph-controls.js.map +0 -1
  112. package/dist/code-paths/graph-stylesheet.d.ts +0 -22
  113. package/dist/code-paths/graph-stylesheet.d.ts.map +0 -1
  114. package/dist/code-paths/graph-stylesheet.js +0 -121
  115. package/dist/code-paths/graph-stylesheet.js.map +0 -1
  116. package/dist/code-paths/help-drawer.d.ts +0 -18
  117. package/dist/code-paths/help-drawer.d.ts.map +0 -1
  118. package/dist/code-paths/help-drawer.js +0 -54
  119. package/dist/code-paths/help-drawer.js.map +0 -1
  120. package/dist/code-paths/indexes.d.ts +0 -28
  121. package/dist/code-paths/indexes.d.ts.map +0 -1
  122. package/dist/code-paths/indexes.js +0 -97
  123. package/dist/code-paths/indexes.js.map +0 -1
  124. package/dist/code-paths/path-utils.d.ts +0 -15
  125. package/dist/code-paths/path-utils.d.ts.map +0 -1
  126. package/dist/code-paths/path-utils.js +0 -47
  127. package/dist/code-paths/path-utils.js.map +0 -1
  128. package/dist/code-paths/search.d.ts +0 -14
  129. package/dist/code-paths/search.d.ts.map +0 -1
  130. package/dist/code-paths/search.js +0 -54
  131. package/dist/code-paths/search.js.map +0 -1
  132. package/dist/code-paths/trace.d.ts +0 -11
  133. package/dist/code-paths/trace.d.ts.map +0 -1
  134. package/dist/code-paths/trace.js +0 -60
  135. package/dist/code-paths/trace.js.map +0 -1
  136. package/dist/code-paths/view-coupling.d.ts +0 -22
  137. package/dist/code-paths/view-coupling.d.ts.map +0 -1
  138. package/dist/code-paths/view-coupling.js +0 -218
  139. package/dist/code-paths/view-coupling.js.map +0 -1
  140. package/dist/code-paths/view-distribution.d.ts +0 -20
  141. package/dist/code-paths/view-distribution.d.ts.map +0 -1
  142. package/dist/code-paths/view-distribution.js +0 -82
  143. package/dist/code-paths/view-distribution.js.map +0 -1
  144. package/dist/code-paths/view-graph.d.ts +0 -35
  145. package/dist/code-paths/view-graph.d.ts.map +0 -1
  146. package/dist/code-paths/view-graph.js +0 -379
  147. package/dist/code-paths/view-graph.js.map +0 -1
  148. package/dist/code-paths/view-template.d.ts +0 -154
  149. package/dist/code-paths/view-template.d.ts.map +0 -1
  150. package/dist/code-paths/view-template.js +0 -218
  151. package/dist/code-paths/view-template.js.map +0 -1
  152. package/dist/code-paths/views-registry.d.ts +0 -13
  153. package/dist/code-paths/views-registry.d.ts.map +0 -1
  154. package/dist/code-paths/views-registry.js +0 -53
  155. package/dist/code-paths/views-registry.js.map +0 -1
  156. package/dist/overview.d.ts +0 -13
  157. package/dist/overview.d.ts.map +0 -1
  158. package/dist/overview.js +0 -91
  159. package/dist/overview.js.map +0 -1
  160. package/dist/recipes.d.ts +0 -6
  161. package/dist/recipes.d.ts.map +0 -1
  162. package/dist/recipes.js +0 -68
  163. package/dist/recipes.js.map +0 -1
  164. package/dist/sessions.d.ts +0 -6
  165. package/dist/sessions.d.ts.map +0 -1
  166. package/dist/sessions.js +0 -288
  167. package/dist/sessions.js.map +0 -1
  168. package/dist/shared/el.d.ts +0 -13
  169. package/dist/shared/el.d.ts.map +0 -1
  170. package/dist/shared/el.js +0 -27
  171. package/dist/shared/el.js.map +0 -1
  172. package/dist/shared/pagination.d.ts +0 -15
  173. package/dist/shared/pagination.d.ts.map +0 -1
  174. package/dist/shared/pagination.js +0 -113
  175. package/dist/shared/pagination.js.map +0 -1
  176. package/dist/shared/sortable.d.ts +0 -14
  177. package/dist/shared/sortable.d.ts.map +0 -1
  178. package/dist/shared/sortable.js +0 -101
  179. package/dist/shared/sortable.js.map +0 -1
  180. package/dist/shared/tab-activators.d.ts +0 -16
  181. package/dist/shared/tab-activators.d.ts.map +0 -1
  182. package/dist/shared/tab-activators.js +0 -33
  183. package/dist/shared/tab-activators.js.map +0 -1
  184. package/dist/shared/tab-bar.d.ts +0 -8
  185. package/dist/shared/tab-bar.d.ts.map +0 -1
  186. package/dist/shared/tab-bar.js +0 -20
  187. package/dist/shared/tab-bar.js.map +0 -1
  188. package/dist/shared.d.ts +0 -26
  189. package/dist/shared.d.ts.map +0 -1
  190. package/dist/shared.js +0 -39
  191. package/dist/shared.js.map +0 -1
  192. package/dist/subtab-bar.d.ts +0 -23
  193. package/dist/subtab-bar.d.ts.map +0 -1
  194. package/dist/subtab-bar.js +0 -77
  195. package/dist/subtab-bar.js.map +0 -1
  196. package/dist/tool-tabs.d.ts +0 -12
  197. package/dist/tool-tabs.d.ts.map +0 -1
  198. package/dist/tool-tabs.js +0 -80
  199. package/dist/tool-tabs.js.map +0 -1
@@ -1,218 +0,0 @@
1
- /**
2
- * `defineRankedView` — JS-string emitter for ranked-list views.
3
- *
4
- * Hot, Big, Wide, and Untested all share the same skeleton:
5
- *
6
- * 1. Bail out with an empty-state message if the catalog is missing.
7
- * 2. Walk `indexes.byBodyHash.values()`, applying the active filter
8
- * chips (`passesFilter`) and an optional view-specific predicate.
9
- * 3. Compute a per-occurrence numeric metric.
10
- * 4. Sort descending by that metric.
11
- * 5. Render via `renderFunctionRows` with the supplied column
12
- * definitions, or show an empty-state if everything was filtered
13
- * out.
14
- *
15
- * This helper accepts a declarative config and emits the JS source for
16
- * one view. Each `view-*.ts` that fits the shape collapses to ~15 lines
17
- * of config; bespoke views (coupling, sccs, search) keep their own
18
- * emitters.
19
- *
20
- * The `metric` and `predicate` (and column `value`) fields are JS
21
- * source strings that close over the in-page locals `occ`, `o`,
22
- * `indexes`, `filterState`, etc. The helper splices them directly into
23
- * the emitted view; that is how the existing per-view emitters work
24
- * too. The skeleton is the only place that knows the rank-and-render
25
- * shape — adding a new ranked view means writing a config, not a new
26
- * `view-*.ts` file from scratch.
27
- */
28
- /**
29
- * Emit the JS source for a ranked view.
30
- *
31
- * The generated JS pushes a `View` literal into the `views` registry
32
- * already declared by `dashboardViewsRegistryJs`. The helper assumes
33
- * the standard set of in-page locals (`el`, `passesFilter`,
34
- * `displayName`, `packageOfPath`, `renderFunctionRows`) are available
35
- * — which they are, because `code-paths.ts` orders the emitters so
36
- * those declarations precede the view emitters.
37
- */
38
- /**
39
- * Emit a JS source string literal in the project house style — single
40
- * quotes with `'` and `\\` escaped. Used so the generated views stay
41
- * byte-comparable to the hand-written ones they replace.
42
- */
43
- function jsString(value) {
44
- // Order matters — escape backslashes before quotes so the substituted
45
- // backslashes from quote-escaping aren't doubled.
46
- const BACKSLASH = String.fromCodePoint(92);
47
- const QUOTE = String.fromCodePoint(39);
48
- const escaped = value
49
- .split(BACKSLASH)
50
- .join(BACKSLASH + BACKSLASH)
51
- .split(QUOTE)
52
- .join(BACKSLASH + QUOTE);
53
- return QUOTE + escaped + QUOTE;
54
- }
55
- export function defineRankedView(config) {
56
- const helpJson = JSON.stringify(config.help);
57
- const columnsLiteral = config.columns
58
- .map((c) => ` { label: ${jsString(c.label)}, value: ${c.value} }`)
59
- .join(',\n');
60
- const predicate = config.predicate ?? 'passesFilter(occ, filterState)';
61
- const rowExtras = config.rowExtras ?? '{}';
62
- const preamble = config.preamble ?? '';
63
- // When searchByName is on, the view keeps a module-scoped query string,
64
- // renders a search input above the table, and re-filters the ranked
65
- // rows by simple-name (case-insensitive substring) in place. The state
66
- // var is namespaced by view id so multiple search-enabled views can
67
- // coexist without clobbering each other.
68
- const searchByName = config.searchByName === true;
69
- const filterByKP = config.filterByKindPackage === true;
70
- const toggle = config.filterToggle ?? null;
71
- const hasControls = searchByName || filterByKP || toggle !== null;
72
- const idSuffix = config.id.replaceAll(/\W/g, '_');
73
- const queryVar = `__rankedSearchQuery_${idSuffix}`;
74
- const kindVar = `__rankedKind_${idSuffix}`;
75
- const pkgVar = `__rankedPkg_${idSuffix}`;
76
- const toggleVar = `__rankedToggle_${idSuffix}`;
77
- const stateDecl = (searchByName ? `let ${queryVar} = '';\n` : '') +
78
- (filterByKP ? `let ${kindVar} = '';\nlet ${pkgVar} = '';\n` : '') +
79
- (toggle ? `let ${toggleVar} = false;\n` : '');
80
- // Kind + Package single-selects (filterByKindPackage). Built into the shared
81
- // controls row; each re-filters the table in place. Options come from the
82
- // shared KIND_LIST / packagesInCatalog (declared by the filters emitter).
83
- const kindPackageBlock = filterByKP
84
- ? String.raw `
85
- controlsRow.appendChild(el('span', { class: 'code-paths-graph-toolbar-label', text: 'Kind' }));
86
- const fnKindSel = el('select', { class: 'code-paths-graph-select', 'data-control': 'fn-kind' });
87
- fnKindSel.appendChild(el('option', { value: '', text: 'All kinds' }));
88
- (typeof KIND_LIST !== 'undefined' ? KIND_LIST : []).forEach(function(k) {
89
- const o = el('option', { value: k, text: k });
90
- if (k === ${kindVar}) o.selected = true;
91
- fnKindSel.appendChild(o);
92
- });
93
- fnKindSel.addEventListener('change', e => { ${kindVar} = (e.target && e.target.value) || ''; renderRows(); });
94
- controlsRow.appendChild(fnKindSel);
95
- controlsRow.appendChild(el('span', { class: 'code-paths-graph-toolbar-label', text: 'Package' }));
96
- const fnPkgSel = el('select', { class: 'code-paths-graph-select', 'data-control': 'fn-package' });
97
- fnPkgSel.appendChild(el('option', { value: '', text: 'All packages' }));
98
- ((typeof packagesInCatalog === 'function') ? packagesInCatalog(catalog) : []).forEach(function(p) {
99
- const o = el('option', { value: p, text: p });
100
- if (p === ${pkgVar}) o.selected = true;
101
- fnPkgSel.appendChild(o);
102
- });
103
- fnPkgSel.addEventListener('change', e => { ${pkgVar} = (e.target && e.target.value) || ''; renderRows(); });
104
- controlsRow.appendChild(fnPkgSel);`
105
- : '';
106
- const searchInputBlock = searchByName
107
- ? String.raw `
108
- const searchInput = el('input', {
109
- type: 'search',
110
- class: 'search-input code-paths-search',
111
- id: 'code-paths-search-${config.id}',
112
- placeholder: 'Filter functions by name…',
113
- });
114
- searchInput.value = ${queryVar};
115
- searchInput.addEventListener('input', e => {
116
- ${queryVar} = (e.target && e.target.value) || '';
117
- renderRows();
118
- });
119
- controlsRow.appendChild(searchInput);`
120
- : '';
121
- // Checkbox toggle (filterToggle) — rendered AFTER the search box; narrows the
122
- // table to rows matching the predicate when checked.
123
- const toggleBlock = toggle
124
- ? String.raw `
125
- const toggleLabel = el('label', { class: 'code-paths-graph-checkbox' });
126
- const toggleCb = el('input', { type: 'checkbox', 'data-control': 'fn-toggle' });
127
- toggleCb.checked = ${toggleVar};
128
- toggleCb.addEventListener('change', () => { ${toggleVar} = toggleCb.checked; renderRows(); });
129
- toggleLabel.appendChild(toggleCb);
130
- toggleLabel.appendChild(document.createTextNode(' ' + ${jsString(toggle.label)}));
131
- controlsRow.appendChild(toggleLabel);`
132
- : '';
133
- // The controls row (Kind · Package · search · toggle) sits above the table.
134
- // When no controls are configured, rows render straight into the container.
135
- const controlsBlock = hasControls
136
- ? String.raw `
137
- const controlsRow = el('div', { class: 'code-paths-ranked-controls' });${kindPackageBlock}${searchInputBlock}${toggleBlock}
138
- container.appendChild(controlsRow);`
139
- : '';
140
- // The section heading renders into its OWN host ABOVE the controls (so the
141
- // "Functions (N) ⓘ" heading sits above the dropdowns, consistent with the
142
- // Coupling and Visualization views). The rows always render into a separate
143
- // host below — renderFunctionRows clears its host, so it must NOT be the
144
- // shared container (that would wipe the heading + controls).
145
- // Combined row predicate: Kind, Package, then name substring. Each clause is
146
- // skipped when its control is absent or set to "all"/empty.
147
- const kindClause = filterByKP ? `if (${kindVar} && occ.kind !== ${kindVar}) return false;` : '';
148
- const pkgClause = filterByKP ? `if (${pkgVar} && pkgOf(occ) !== ${pkgVar}) return false;` : '';
149
- const nameClause = searchByName
150
- ? `const q = (${queryVar} || '').trim().toLowerCase(); if (q.length && (occ.simpleName || '').toLowerCase().indexOf(q) === -1) return false;`
151
- : '';
152
- const toggleClause = toggle ? `if (${toggleVar} && !(${toggle.predicate})) return false;` : '';
153
- const rowFilterExpr = hasControls
154
- ? `(function(occ){ ${kindClause} ${pkgClause} ${nameClause} ${toggleClause} return true; })`
155
- : '(function(){ return true; })';
156
- const onActivateBlock = searchByName
157
- ? String.raw `,
158
- onActivate() {
159
- const input = document.getElementById('code-paths-search-${config.id}');
160
- if (input && typeof input.focus === 'function') input.focus();
161
- }`
162
- : '';
163
- return String.raw `
164
- ${stateDecl}views.push({
165
- id: ${jsString(config.id)},
166
- label: ${jsString(config.label)},
167
- help: ${helpJson},
168
- render(container, catalog, indexes, filterState) {
169
- while (container.firstChild) container.removeChild(container.firstChild);
170
- if (!catalog || !catalog.functions) {
171
- container.appendChild(el('div', { class: 'empty', text: 'No catalog loaded.' }));
172
- return;
173
- }
174
- ${preamble}
175
- const ranked = [];
176
- for (const occ of indexes.byBodyHash.values()) {
177
- if (!(${predicate})) continue;
178
- const metric = (${config.metric});
179
- if (metric === false) continue;
180
- ranked.push({ occ, metric });
181
- }
182
- ranked.sort((a, b) => b.metric - a.metric);
183
- if (ranked.length === 0) {
184
- container.appendChild(el('div', { class: 'empty', text: ${jsString(config.emptyMessage)} }));
185
- return;
186
- }
187
- const headingHost = el('div'); container.appendChild(headingHost);
188
- ${controlsBlock}
189
- const rowsHost = el('div'); container.appendChild(rowsHost);
190
- const __rowFilter = ${rowFilterExpr};
191
- function renderRows() {
192
- const filtered = ranked.filter(r => __rowFilter(r.occ));
193
- // Heading (with the ⓘ help button) above the controls; its count tracks
194
- // the currently-shown rows as the filters narrow them.
195
- while (headingHost.firstChild) headingHost.removeChild(headingHost.firstChild);
196
- headingHost.appendChild(makeSectionHeading(${jsString(config.headingText)} + ' (' + filtered.length + ')', ${jsString(config.id)}));
197
- if (filtered.length === 0) {
198
- while (rowsHost.firstChild) rowsHost.removeChild(rowsHost.firstChild);
199
- rowsHost.appendChild(el('div', { class: 'empty', text: ${jsString(config.emptyMessage)} }));
200
- return;
201
- }
202
- renderFunctionRows(
203
- rowsHost,
204
- filtered.map(r => Object.assign({}, r.occ, { __metric: r.metric }, (function(occ, metric){ return ${rowExtras}; })(r.occ, r.metric))),
205
- [
206
- ${columnsLiteral}
207
- ],
208
- ${jsString(config.headingText)},
209
- ${jsString(config.id)},
210
- true,
211
- );
212
- }
213
- renderRows();
214
- }${onActivateBlock}
215
- });
216
- `;
217
- }
218
- //# sourceMappingURL=view-template.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"view-template.js","sourceRoot":"","sources":["../../src/code-paths/view-template.ts"],"names":[],"mappings":"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"}
@@ -1,13 +0,0 @@
1
- /**
2
- * View registry — emits the singleton `views = []` and the dispatch
3
- * helpers (`activateView(id)`, `renderActiveView()`).
4
- *
5
- * Each `view-*.ts` file pushes its own `View` literal into `views`. The
6
- * panel orchestrator iterates the registry to render tabs and to fan
7
- * out filter-change notifications (§10.1 / §10.3).
8
- *
9
- * `activateView(id)` updates `location.hash` to `#code-paths/<id>` so
10
- * each view is deep-linkable (§7 Phase P3 step 4).
11
- */
12
- export declare function dashboardViewsRegistryJs(): string;
13
- //# sourceMappingURL=views-registry.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"views-registry.d.ts","sourceRoot":"","sources":["../../src/code-paths/views-registry.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,wBAAgB,wBAAwB,IAAI,MAAM,CAwCjD"}
@@ -1,53 +0,0 @@
1
- /**
2
- * View registry — emits the singleton `views = []` and the dispatch
3
- * helpers (`activateView(id)`, `renderActiveView()`).
4
- *
5
- * Each `view-*.ts` file pushes its own `View` literal into `views`. The
6
- * panel orchestrator iterates the registry to render tabs and to fan
7
- * out filter-change notifications (§10.1 / §10.3).
8
- *
9
- * `activateView(id)` updates `location.hash` to `#code-paths/<id>` so
10
- * each view is deep-linkable (§7 Phase P3 step 4).
11
- */
12
- export function dashboardViewsRegistryJs() {
13
- return String.raw `
14
- const views = [];
15
- let activeViewId = null;
16
-
17
- function getView(id) {
18
- for (const v of views) if (v.id === id) return v;
19
- return null;
20
- }
21
-
22
- function renderActiveView() {
23
- if (!activeViewId) return;
24
- const view = getView(activeViewId);
25
- if (!view) return;
26
- const container = document.getElementById('code-paths-view-' + view.id);
27
- if (!container) return;
28
- view.render(container, graphCatalog, graphIndexes, filterState);
29
- }
30
-
31
- function activateView(id) {
32
- const view = getView(id);
33
- if (!view) return;
34
- activeViewId = id;
35
- document.querySelectorAll('.code-paths-tab').forEach(t => {
36
- t.classList.toggle('active', t.dataset.view === id);
37
- });
38
- document.querySelectorAll('.code-paths-view').forEach(p => {
39
- p.classList.toggle('active', p.id === 'code-paths-view-' + id);
40
- });
41
- // Deep-link via hash, but don't loop on programmatic updates.
42
- const next = '#code-paths/' + id;
43
- if (typeof window !== 'undefined' && window.location.hash !== next) {
44
- try { history.replaceState(null, '', next); } catch (e) { /* ignore */ }
45
- }
46
- renderActiveView();
47
- if (typeof view.onActivate === 'function') {
48
- try { view.onActivate(); } catch (e) { /* ignore */ }
49
- }
50
- }
51
- `;
52
- }
53
- //# sourceMappingURL=views-registry.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"views-registry.js","sourceRoot":"","sources":["../../src/code-paths/views-registry.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,MAAM,UAAU,wBAAwB;IACtC,OAAO,MAAM,CAAC,GAAG,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAsClB,CAAC;AACF,CAAC"}
@@ -1,13 +0,0 @@
1
- /**
2
- * Overview tab — cross-tool recent activity table.
3
- * Returns JS code as a string.
4
- *
5
- * The `toolBadgeStyles` and `tabMap` literals spliced into the emitted
6
- * JS are derived from the `defineToolTab` registry rather than
7
- * hard-coded — every registered tool tab contributes one entry to
8
- * each map. Adding a new tool is a `defineToolTab` call; this
9
- * function picks it up automatically. (F1/F8.)
10
- */
11
- import './tool-tabs-registrations.js';
12
- export declare function dashboardOverviewJs(): string;
13
- //# sourceMappingURL=overview.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"overview.d.ts","sourceRoot":"","sources":["../src/overview.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAGH,OAAO,8BAA8B,CAAC;AAEtC,wBAAgB,mBAAmB,IAAI,MAAM,CA6E5C"}
package/dist/overview.js DELETED
@@ -1,91 +0,0 @@
1
- /**
2
- * Overview tab — cross-tool recent activity table.
3
- * Returns JS code as a string.
4
- *
5
- * The `toolBadgeStyles` and `tabMap` literals spliced into the emitted
6
- * JS are derived from the `defineToolTab` registry rather than
7
- * hard-coded — every registered tool tab contributes one entry to
8
- * each map. Adding a new tool is a `defineToolTab` call; this
9
- * function picks it up automatically. (F1/F8.)
10
- */
11
- import { listToolTabs } from './tool-tab-registry.js';
12
- import './tool-tabs-registrations.js'; // side-effect: registers fit/sim/graph
13
- export function dashboardOverviewJs() {
14
- const toolTabs = listToolTabs();
15
- const badgeStylesEntries = toolTabs
16
- .map((t) => ` ${JSON.stringify(t.tool)}: ${JSON.stringify(t.badgeStyle)},`)
17
- .join('\n');
18
- const tabMapEntries = toolTabs
19
- .map((t) => `${JSON.stringify(t.tool)}: ${JSON.stringify(t.id)}`)
20
- .join(', ');
21
- return `
22
- // =======================================================
23
- // OVERVIEW TAB
24
- // =======================================================
25
- function renderOverview() {
26
- const panel = document.getElementById('panel-overview');
27
- if (!sessions.length) { panel.appendChild(el('div', {class:'empty', text:'No sessions yet.'})); return; }
28
-
29
- const sec = el('div', {class:'section'}, [el('h3', {text:'Recent Activity'})]);
30
- const table = el('table', {class:'data-table sortable'});
31
- const thead = el('thead');
32
- const headerRow = el('tr');
33
- ['Timestamp', 'Tool', 'Recipe', 'Pass Rate', 'Status', 'Checks', 'Findings', 'Duration'].forEach(h => {
34
- headerRow.appendChild(el('th', {text: h}));
35
- });
36
- thead.appendChild(headerRow);
37
- table.appendChild(thead);
38
-
39
- const tbody = el('tbody');
40
- // Derived from the defineToolTab registry — see tool-tab-registry.ts
41
- // and tool-tabs-registrations.ts. New tools register descriptors;
42
- // these maps update automatically.
43
- const toolBadgeStyles = {
44
- ${badgeStylesEntries}
45
- };
46
- const tabMap = { ${tabMapEntries} };
47
-
48
- sessions.forEach(s => {
49
- const sc2 = s.score >= 90 ? 'color:var(--success)' : s.score >= 70 ? 'color:var(--warning)' : 'color:var(--error)';
50
- // Per-session counts live in the tool-owned opaque payload. Tools
51
- // that persist no summary (or none yet) fall back to zeros so the
52
- // cross-tool row stays well-formed.
53
- const sm = (s.payload && s.payload.summary) || { total: 0, passed: 0, failed: 0, errors: 0, warnings: 0 };
54
- const row = el('tr', {class:'clickable', onclick: () => {
55
- // Tabs that need session-aware deep-linking (Code Paths today;
56
- // future fit/sim detail views) register an activator into the
57
- // shared tabActivators registry. If one matches this session's
58
- // tool, hand off to it. Otherwise fall back to plain top-level
59
- // tab switching by name.
60
- if (activateTabForSession(s)) return;
61
- const tabName = tabMap[s.tool] || s.tool;
62
- document.querySelectorAll('.tab').forEach(t => t.classList.remove('active'));
63
- document.querySelectorAll('.tab-panel').forEach(p => p.classList.remove('active'));
64
- const tab = document.querySelector('.tab[data-tab="' + tabName + '"]');
65
- if (tab) tab.classList.add('active');
66
- const panel = document.getElementById('panel-' + tabName);
67
- if (panel) panel.classList.add('active');
68
- }});
69
- row.appendChild(el('td', {class:'cell-nowrap', text: new Date(s.startedAt).toLocaleString(), style:'color:var(--text-dim)'}));
70
- const toolCell = el('td');
71
- toolCell.appendChild(el('span', {class:'badge', style: toolBadgeStyles[s.tool] || '', text: s.tool.toUpperCase()}));
72
- row.appendChild(toolCell);
73
- row.appendChild(el('td', {text: s.recipe || 'default', style:'color:var(--text-muted)'}));
74
- row.appendChild(el('td', {text: s.score+'%', style:'font-weight:600;'+sc2}));
75
- const statusCell = el('td');
76
- statusCell.appendChild(statusBadge(sessionStatus(s)));
77
- row.appendChild(statusCell);
78
- row.appendChild(el('td', {text: sm.passed+'/'+sm.total}));
79
- row.appendChild(el('td', {text: ''+(sm.errors + (sm.warnings || 0))}));
80
- row.appendChild(el('td', {text: (s.durationMs/1000).toFixed(1)+'s', style:'color:var(--text-dim)'}));
81
- tbody.appendChild(row);
82
- });
83
- table.appendChild(tbody);
84
- const pag = el('div', {class:'pagination'});
85
- sec.appendChild(el('div', {class:'card'}, [table, pag]));
86
- panel.appendChild(sec);
87
- paginateTable(tbody, pag, 10);
88
- }
89
- `;
90
- }
91
- //# sourceMappingURL=overview.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"overview.js","sourceRoot":"","sources":["../src/overview.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AACtD,OAAO,8BAA8B,CAAC,CAAC,uCAAuC;AAE9E,MAAM,UAAU,mBAAmB;IACjC,MAAM,QAAQ,GAAG,YAAY,EAAE,CAAC;IAChC,MAAM,kBAAkB,GAAG,QAAQ;SAChC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC;SAC7E,IAAI,CAAC,IAAI,CAAC,CAAC;IACd,MAAM,aAAa,GAAG,QAAQ;SAC3B,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC;SAChE,IAAI,CAAC,IAAI,CAAC,CAAC;IACd,OAAO;;;;;;;;;;;;;;;;;;;;;;;EAuBP,kBAAkB;;qBAEC,aAAa;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA2CjC,CAAC;AACF,CAAC"}
package/dist/recipes.d.ts DELETED
@@ -1,6 +0,0 @@
1
- /**
2
- * Recipes catalog rendering — shows available recipes with their configuration.
3
- * Returns JS code as a string.
4
- */
5
- export declare function dashboardRecipesJs(): string;
6
- //# sourceMappingURL=recipes.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"recipes.d.ts","sourceRoot":"","sources":["../src/recipes.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,wBAAgB,kBAAkB,IAAI,MAAM,CA8D3C"}
package/dist/recipes.js DELETED
@@ -1,68 +0,0 @@
1
- /**
2
- * Recipes catalog rendering — shows available recipes with their configuration.
3
- * Returns JS code as a string.
4
- */
5
- export function dashboardRecipesJs() {
6
- return `
7
- // =======================================================
8
- // RECIPES CATALOG
9
- // =======================================================
10
-
11
- function renderRecipesPanel(container, recipesData) {
12
- if (!recipesData || !recipesData.length) {
13
- container.appendChild(el('div', {class:'empty', text:'No recipes available.'}));
14
- return;
15
- }
16
-
17
- const table = el('table', {class:'data-table'});
18
- const thead = el('thead');
19
- const headerRow = el('tr');
20
- ['Recipe', 'Description', 'Selector', 'Mode', 'Timeout', 'Tags'].forEach(h => {
21
- headerRow.appendChild(el('th', {text: h}));
22
- });
23
- thead.appendChild(headerRow);
24
- table.appendChild(thead);
25
-
26
- const tbody = el('tbody');
27
- recipesData.forEach(recipe => {
28
- const row = el('tr');
29
-
30
- // Name
31
- const nameCell = el('td', {style:'font-weight:500'});
32
- nameCell.appendChild(el('div', {text: recipe.displayName}));
33
- nameCell.appendChild(el('div', {text: recipe.name, style:'font-size:11px;color:var(--text-dim);font-weight:400'}));
34
- row.appendChild(nameCell);
35
-
36
- // Description
37
- row.appendChild(el('td', {text: recipe.description, style:'color:var(--text-muted)'}));
38
-
39
- // Selector type
40
- const selCell = el('td');
41
- selCell.appendChild(el('span', {class:'badge', style:'background:var(--bg-hover);color:var(--text-muted)', text: recipe.selectorType}));
42
- row.appendChild(selCell);
43
-
44
- // Mode
45
- const modeCell = el('td');
46
- const modeColor = recipe.mode === 'parallel' ? 'color:var(--success)' : 'color:var(--warning)';
47
- modeCell.appendChild(el('span', {text: recipe.mode, style: modeColor + ';font-size:12px'}));
48
- row.appendChild(modeCell);
49
-
50
- // Timeout
51
- row.appendChild(el('td', {text: (recipe.timeout / 1000) + 's', style:'color:var(--text-dim);font-size:12px'}));
52
-
53
- // Tags
54
- const tagsCell = el('td');
55
- (recipe.tags || []).forEach(t => {
56
- tagsCell.appendChild(el('span', {class:'tag-badge', text: t}));
57
- });
58
- row.appendChild(tagsCell);
59
-
60
- tbody.appendChild(row);
61
- });
62
-
63
- table.appendChild(tbody);
64
- container.appendChild(el('div', {class:'card'}, [table]));
65
- }
66
- `;
67
- }
68
- //# sourceMappingURL=recipes.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"recipes.js","sourceRoot":"","sources":["../src/recipes.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,UAAU,kBAAkB;IAChC,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA4DR,CAAC;AACF,CAAC"}
@@ -1,6 +0,0 @@
1
- /**
2
- * Session table + session detail rendering — used by fitness/sim tabs.
3
- * Returns JS code as a string.
4
- */
5
- export declare function dashboardSessionsJs(): string;
6
- //# sourceMappingURL=sessions.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"sessions.d.ts","sourceRoot":"","sources":["../src/sessions.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,wBAAgB,mBAAmB,IAAI,MAAM,CA0R5C"}