@opensip-cli/dashboard 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (309) hide show
  1. package/LICENSE +202 -0
  2. package/NOTICE +8 -0
  3. package/README.md +31 -0
  4. package/dist/__tests__/catalog-provenance.test.d.ts +11 -0
  5. package/dist/__tests__/catalog-provenance.test.d.ts.map +1 -0
  6. package/dist/__tests__/catalog-provenance.test.js +130 -0
  7. package/dist/__tests__/catalog-provenance.test.js.map +1 -0
  8. package/dist/__tests__/coupling-attribution.test.d.ts +9 -0
  9. package/dist/__tests__/coupling-attribution.test.d.ts.map +1 -0
  10. package/dist/__tests__/coupling-attribution.test.js +99 -0
  11. package/dist/__tests__/coupling-attribution.test.js.map +1 -0
  12. package/dist/__tests__/dashboard-bundle-weight.test.d.ts +16 -0
  13. package/dist/__tests__/dashboard-bundle-weight.test.d.ts.map +1 -0
  14. package/dist/__tests__/dashboard-bundle-weight.test.js +73 -0
  15. package/dist/__tests__/dashboard-bundle-weight.test.js.map +1 -0
  16. package/dist/__tests__/dashboard-cell-containment.test.d.ts +2 -0
  17. package/dist/__tests__/dashboard-cell-containment.test.d.ts.map +1 -0
  18. package/dist/__tests__/dashboard-cell-containment.test.js +49 -0
  19. package/dist/__tests__/dashboard-cell-containment.test.js.map +1 -0
  20. package/dist/__tests__/dashboard-cytoscape-vendor.test.d.ts +10 -0
  21. package/dist/__tests__/dashboard-cytoscape-vendor.test.d.ts.map +1 -0
  22. package/dist/__tests__/dashboard-cytoscape-vendor.test.js +40 -0
  23. package/dist/__tests__/dashboard-cytoscape-vendor.test.js.map +1 -0
  24. package/dist/__tests__/dashboard-editor-link.test.d.ts +5 -0
  25. package/dist/__tests__/dashboard-editor-link.test.d.ts.map +1 -0
  26. package/dist/__tests__/dashboard-editor-link.test.js +36 -0
  27. package/dist/__tests__/dashboard-editor-link.test.js.map +1 -0
  28. package/dist/__tests__/dashboard-filters.test.d.ts +9 -0
  29. package/dist/__tests__/dashboard-filters.test.d.ts.map +1 -0
  30. package/dist/__tests__/dashboard-filters.test.js +95 -0
  31. package/dist/__tests__/dashboard-filters.test.js.map +1 -0
  32. package/dist/__tests__/dashboard-function-card-singleton.test.d.ts +9 -0
  33. package/dist/__tests__/dashboard-function-card-singleton.test.d.ts.map +1 -0
  34. package/dist/__tests__/dashboard-function-card-singleton.test.js +87 -0
  35. package/dist/__tests__/dashboard-function-card-singleton.test.js.map +1 -0
  36. package/dist/__tests__/dashboard-function-card.test.d.ts +10 -0
  37. package/dist/__tests__/dashboard-function-card.test.d.ts.map +1 -0
  38. package/dist/__tests__/dashboard-function-card.test.js +403 -0
  39. package/dist/__tests__/dashboard-function-card.test.js.map +1 -0
  40. package/dist/__tests__/dashboard-function-row.test.d.ts +11 -0
  41. package/dist/__tests__/dashboard-function-row.test.d.ts.map +1 -0
  42. package/dist/__tests__/dashboard-function-row.test.js +101 -0
  43. package/dist/__tests__/dashboard-function-row.test.js.map +1 -0
  44. package/dist/__tests__/dashboard-generator-graph-catalog.test.d.ts +9 -0
  45. package/dist/__tests__/dashboard-generator-graph-catalog.test.d.ts.map +1 -0
  46. package/dist/__tests__/dashboard-generator-graph-catalog.test.js +75 -0
  47. package/dist/__tests__/dashboard-generator-graph-catalog.test.js.map +1 -0
  48. package/dist/__tests__/dashboard-graph-offline.integration.test.d.ts +13 -0
  49. package/dist/__tests__/dashboard-graph-offline.integration.test.d.ts.map +1 -0
  50. package/dist/__tests__/dashboard-graph-offline.integration.test.js +55 -0
  51. package/dist/__tests__/dashboard-graph-offline.integration.test.js.map +1 -0
  52. package/dist/__tests__/dashboard-graph-scc.test.d.ts +17 -0
  53. package/dist/__tests__/dashboard-graph-scc.test.d.ts.map +1 -0
  54. package/dist/__tests__/dashboard-graph-scc.test.js +89 -0
  55. package/dist/__tests__/dashboard-graph-scc.test.js.map +1 -0
  56. package/dist/__tests__/dashboard-graph-view-model.test.d.ts +12 -0
  57. package/dist/__tests__/dashboard-graph-view-model.test.d.ts.map +1 -0
  58. package/dist/__tests__/dashboard-graph-view-model.test.js +331 -0
  59. package/dist/__tests__/dashboard-graph-view-model.test.js.map +1 -0
  60. package/dist/__tests__/dashboard-help-drawer.test.d.ts +9 -0
  61. package/dist/__tests__/dashboard-help-drawer.test.d.ts.map +1 -0
  62. package/dist/__tests__/dashboard-help-drawer.test.js +101 -0
  63. package/dist/__tests__/dashboard-help-drawer.test.js.map +1 -0
  64. package/dist/__tests__/dashboard-html.test.d.ts +2 -0
  65. package/dist/__tests__/dashboard-html.test.d.ts.map +1 -0
  66. package/dist/__tests__/dashboard-html.test.js +169 -0
  67. package/dist/__tests__/dashboard-html.test.js.map +1 -0
  68. package/dist/__tests__/dashboard-indexes.test.d.ts +9 -0
  69. package/dist/__tests__/dashboard-indexes.test.d.ts.map +1 -0
  70. package/dist/__tests__/dashboard-indexes.test.js +211 -0
  71. package/dist/__tests__/dashboard-indexes.test.js.map +1 -0
  72. package/dist/__tests__/dashboard-path-utils.test.d.ts +6 -0
  73. package/dist/__tests__/dashboard-path-utils.test.d.ts.map +1 -0
  74. package/dist/__tests__/dashboard-path-utils.test.js +54 -0
  75. package/dist/__tests__/dashboard-path-utils.test.js.map +1 -0
  76. package/dist/__tests__/dashboard-search.test.d.ts +5 -0
  77. package/dist/__tests__/dashboard-search.test.d.ts.map +1 -0
  78. package/dist/__tests__/dashboard-search.test.js +46 -0
  79. package/dist/__tests__/dashboard-search.test.js.map +1 -0
  80. package/dist/__tests__/dashboard-sessions.test.d.ts +14 -0
  81. package/dist/__tests__/dashboard-sessions.test.d.ts.map +1 -0
  82. package/dist/__tests__/dashboard-sessions.test.js +330 -0
  83. package/dist/__tests__/dashboard-sessions.test.js.map +1 -0
  84. package/dist/__tests__/dashboard-trace.test.d.ts +5 -0
  85. package/dist/__tests__/dashboard-trace.test.d.ts.map +1 -0
  86. package/dist/__tests__/dashboard-trace.test.js +147 -0
  87. package/dist/__tests__/dashboard-trace.test.js.map +1 -0
  88. package/dist/__tests__/dashboard-validation.integration.test.d.ts +14 -0
  89. package/dist/__tests__/dashboard-validation.integration.test.d.ts.map +1 -0
  90. package/dist/__tests__/dashboard-validation.integration.test.js +221 -0
  91. package/dist/__tests__/dashboard-validation.integration.test.js.map +1 -0
  92. package/dist/__tests__/dashboard-view-conformance.test.d.ts +12 -0
  93. package/dist/__tests__/dashboard-view-conformance.test.d.ts.map +1 -0
  94. package/dist/__tests__/dashboard-view-conformance.test.js +58 -0
  95. package/dist/__tests__/dashboard-view-conformance.test.js.map +1 -0
  96. package/dist/__tests__/dashboard-view-coupling.test.d.ts +7 -0
  97. package/dist/__tests__/dashboard-view-coupling.test.d.ts.map +1 -0
  98. package/dist/__tests__/dashboard-view-coupling.test.js +381 -0
  99. package/dist/__tests__/dashboard-view-coupling.test.js.map +1 -0
  100. package/dist/__tests__/dashboard-view-distribution.test.d.ts +10 -0
  101. package/dist/__tests__/dashboard-view-distribution.test.d.ts.map +1 -0
  102. package/dist/__tests__/dashboard-view-distribution.test.js +272 -0
  103. package/dist/__tests__/dashboard-view-distribution.test.js.map +1 -0
  104. package/dist/__tests__/dashboard-view-graph.test.d.ts +13 -0
  105. package/dist/__tests__/dashboard-view-graph.test.d.ts.map +1 -0
  106. package/dist/__tests__/dashboard-view-graph.test.js +332 -0
  107. package/dist/__tests__/dashboard-view-graph.test.js.map +1 -0
  108. package/dist/__tests__/dashboard-view-template.test.d.ts +21 -0
  109. package/dist/__tests__/dashboard-view-template.test.d.ts.map +1 -0
  110. package/dist/__tests__/dashboard-view-template.test.js +153 -0
  111. package/dist/__tests__/dashboard-view-template.test.js.map +1 -0
  112. package/dist/__tests__/dashboard.test.d.ts +2 -0
  113. package/dist/__tests__/dashboard.test.d.ts.map +1 -0
  114. package/dist/__tests__/dashboard.test.js +129 -0
  115. package/dist/__tests__/dashboard.test.js.map +1 -0
  116. package/dist/__tests__/graph-tab.test.d.ts +10 -0
  117. package/dist/__tests__/graph-tab.test.d.ts.map +1 -0
  118. package/dist/__tests__/graph-tab.test.js +76 -0
  119. package/dist/__tests__/graph-tab.test.js.map +1 -0
  120. package/dist/checks.d.ts +7 -0
  121. package/dist/checks.d.ts.map +1 -0
  122. package/dist/checks.js +283 -0
  123. package/dist/checks.js.map +1 -0
  124. package/dist/code-paths/__tests__/views-registry.test.d.ts +13 -0
  125. package/dist/code-paths/__tests__/views-registry.test.d.ts.map +1 -0
  126. package/dist/code-paths/__tests__/views-registry.test.js +39 -0
  127. package/dist/code-paths/__tests__/views-registry.test.js.map +1 -0
  128. package/dist/code-paths/catalog-provenance.d.ts +22 -0
  129. package/dist/code-paths/catalog-provenance.d.ts.map +1 -0
  130. package/dist/code-paths/catalog-provenance.js +108 -0
  131. package/dist/code-paths/catalog-provenance.js.map +1 -0
  132. package/dist/code-paths/catalog-recipes-tables.d.ts +11 -0
  133. package/dist/code-paths/catalog-recipes-tables.d.ts.map +1 -0
  134. package/dist/code-paths/catalog-recipes-tables.js +86 -0
  135. package/dist/code-paths/catalog-recipes-tables.js.map +1 -0
  136. package/dist/code-paths/cytoscape-vendor.d.ts +27 -0
  137. package/dist/code-paths/cytoscape-vendor.d.ts.map +1 -0
  138. package/dist/code-paths/cytoscape-vendor.js +68 -0
  139. package/dist/code-paths/cytoscape-vendor.js.map +1 -0
  140. package/dist/code-paths/editor-link.d.ts +10 -0
  141. package/dist/code-paths/editor-link.d.ts.map +1 -0
  142. package/dist/code-paths/editor-link.js +20 -0
  143. package/dist/code-paths/editor-link.js.map +1 -0
  144. package/dist/code-paths/filters.d.ts +19 -0
  145. package/dist/code-paths/filters.d.ts.map +1 -0
  146. package/dist/code-paths/filters.js +47 -0
  147. package/dist/code-paths/filters.js.map +1 -0
  148. package/dist/code-paths/function-card.d.ts +15 -0
  149. package/dist/code-paths/function-card.d.ts.map +1 -0
  150. package/dist/code-paths/function-card.js +169 -0
  151. package/dist/code-paths/function-card.js.map +1 -0
  152. package/dist/code-paths/function-row.d.ts +17 -0
  153. package/dist/code-paths/function-row.d.ts.map +1 -0
  154. package/dist/code-paths/function-row.js +77 -0
  155. package/dist/code-paths/function-row.js.map +1 -0
  156. package/dist/code-paths/graph-controls.d.ts +27 -0
  157. package/dist/code-paths/graph-controls.d.ts.map +1 -0
  158. package/dist/code-paths/graph-controls.js +257 -0
  159. package/dist/code-paths/graph-controls.js.map +1 -0
  160. package/dist/code-paths/graph-scc.d.ts +32 -0
  161. package/dist/code-paths/graph-scc.d.ts.map +1 -0
  162. package/dist/code-paths/graph-scc.js +136 -0
  163. package/dist/code-paths/graph-scc.js.map +1 -0
  164. package/dist/code-paths/graph-stylesheet.d.ts +22 -0
  165. package/dist/code-paths/graph-stylesheet.d.ts.map +1 -0
  166. package/dist/code-paths/graph-stylesheet.js +121 -0
  167. package/dist/code-paths/graph-stylesheet.js.map +1 -0
  168. package/dist/code-paths/graph-view-model.d.ts +120 -0
  169. package/dist/code-paths/graph-view-model.d.ts.map +1 -0
  170. package/dist/code-paths/graph-view-model.js +199 -0
  171. package/dist/code-paths/graph-view-model.js.map +1 -0
  172. package/dist/code-paths/help-drawer.d.ts +18 -0
  173. package/dist/code-paths/help-drawer.d.ts.map +1 -0
  174. package/dist/code-paths/help-drawer.js +54 -0
  175. package/dist/code-paths/help-drawer.js.map +1 -0
  176. package/dist/code-paths/indexes.d.ts +28 -0
  177. package/dist/code-paths/indexes.d.ts.map +1 -0
  178. package/dist/code-paths/indexes.js +97 -0
  179. package/dist/code-paths/indexes.js.map +1 -0
  180. package/dist/code-paths/path-utils.d.ts +15 -0
  181. package/dist/code-paths/path-utils.d.ts.map +1 -0
  182. package/dist/code-paths/path-utils.js +47 -0
  183. package/dist/code-paths/path-utils.js.map +1 -0
  184. package/dist/code-paths/search.d.ts +14 -0
  185. package/dist/code-paths/search.d.ts.map +1 -0
  186. package/dist/code-paths/search.js +54 -0
  187. package/dist/code-paths/search.js.map +1 -0
  188. package/dist/code-paths/trace.d.ts +11 -0
  189. package/dist/code-paths/trace.d.ts.map +1 -0
  190. package/dist/code-paths/trace.js +60 -0
  191. package/dist/code-paths/trace.js.map +1 -0
  192. package/dist/code-paths/view-coupling.d.ts +22 -0
  193. package/dist/code-paths/view-coupling.d.ts.map +1 -0
  194. package/dist/code-paths/view-coupling.js +218 -0
  195. package/dist/code-paths/view-coupling.js.map +1 -0
  196. package/dist/code-paths/view-distribution.d.ts +20 -0
  197. package/dist/code-paths/view-distribution.d.ts.map +1 -0
  198. package/dist/code-paths/view-distribution.js +82 -0
  199. package/dist/code-paths/view-distribution.js.map +1 -0
  200. package/dist/code-paths/view-graph.d.ts +35 -0
  201. package/dist/code-paths/view-graph.d.ts.map +1 -0
  202. package/dist/code-paths/view-graph.js +379 -0
  203. package/dist/code-paths/view-graph.js.map +1 -0
  204. package/dist/code-paths/view-template.d.ts +154 -0
  205. package/dist/code-paths/view-template.d.ts.map +1 -0
  206. package/dist/code-paths/view-template.js +218 -0
  207. package/dist/code-paths/view-template.js.map +1 -0
  208. package/dist/code-paths/views-registry.d.ts +13 -0
  209. package/dist/code-paths/views-registry.d.ts.map +1 -0
  210. package/dist/code-paths/views-registry.js +53 -0
  211. package/dist/code-paths/views-registry.js.map +1 -0
  212. package/dist/code-paths.d.ts +69 -0
  213. package/dist/code-paths.d.ts.map +1 -0
  214. package/dist/code-paths.js +356 -0
  215. package/dist/code-paths.js.map +1 -0
  216. package/dist/css/cards.d.ts +9 -0
  217. package/dist/css/cards.d.ts.map +1 -0
  218. package/dist/css/cards.js +36 -0
  219. package/dist/css/cards.js.map +1 -0
  220. package/dist/css/code-paths.d.ts +9 -0
  221. package/dist/css/code-paths.d.ts.map +1 -0
  222. package/dist/css/code-paths.js +111 -0
  223. package/dist/css/code-paths.js.map +1 -0
  224. package/dist/css/data-table.d.ts +12 -0
  225. package/dist/css/data-table.d.ts.map +1 -0
  226. package/dist/css/data-table.js +103 -0
  227. package/dist/css/data-table.js.map +1 -0
  228. package/dist/css/function-card.d.ts +6 -0
  229. package/dist/css/function-card.d.ts.map +1 -0
  230. package/dist/css/function-card.js +26 -0
  231. package/dist/css/function-card.js.map +1 -0
  232. package/dist/css/help-drawer.d.ts +6 -0
  233. package/dist/css/help-drawer.d.ts.map +1 -0
  234. package/dist/css/help-drawer.js +22 -0
  235. package/dist/css/help-drawer.js.map +1 -0
  236. package/dist/css/tabs.d.ts +9 -0
  237. package/dist/css/tabs.d.ts.map +1 -0
  238. package/dist/css/tabs.js +28 -0
  239. package/dist/css/tabs.js.map +1 -0
  240. package/dist/css/theme.d.ts +8 -0
  241. package/dist/css/theme.d.ts.map +1 -0
  242. package/dist/css/theme.js +34 -0
  243. package/dist/css/theme.js.map +1 -0
  244. package/dist/css.d.ts +13 -0
  245. package/dist/css.d.ts.map +1 -0
  246. package/dist/css.js +30 -0
  247. package/dist/css.js.map +1 -0
  248. package/dist/generator.d.ts +33 -0
  249. package/dist/generator.d.ts.map +1 -0
  250. package/dist/generator.js +161 -0
  251. package/dist/generator.js.map +1 -0
  252. package/dist/index.d.ts +21 -0
  253. package/dist/index.d.ts.map +1 -0
  254. package/dist/index.js +20 -0
  255. package/dist/index.js.map +1 -0
  256. package/dist/overview.d.ts +13 -0
  257. package/dist/overview.d.ts.map +1 -0
  258. package/dist/overview.js +91 -0
  259. package/dist/overview.js.map +1 -0
  260. package/dist/recipes.d.ts +6 -0
  261. package/dist/recipes.d.ts.map +1 -0
  262. package/dist/recipes.js +68 -0
  263. package/dist/recipes.js.map +1 -0
  264. package/dist/sessions.d.ts +6 -0
  265. package/dist/sessions.d.ts.map +1 -0
  266. package/dist/sessions.js +288 -0
  267. package/dist/sessions.js.map +1 -0
  268. package/dist/shared/el.d.ts +13 -0
  269. package/dist/shared/el.d.ts.map +1 -0
  270. package/dist/shared/el.js +27 -0
  271. package/dist/shared/el.js.map +1 -0
  272. package/dist/shared/pagination.d.ts +15 -0
  273. package/dist/shared/pagination.d.ts.map +1 -0
  274. package/dist/shared/pagination.js +113 -0
  275. package/dist/shared/pagination.js.map +1 -0
  276. package/dist/shared/sortable.d.ts +14 -0
  277. package/dist/shared/sortable.d.ts.map +1 -0
  278. package/dist/shared/sortable.js +101 -0
  279. package/dist/shared/sortable.js.map +1 -0
  280. package/dist/shared/tab-activators.d.ts +16 -0
  281. package/dist/shared/tab-activators.d.ts.map +1 -0
  282. package/dist/shared/tab-activators.js +33 -0
  283. package/dist/shared/tab-activators.js.map +1 -0
  284. package/dist/shared/tab-bar.d.ts +8 -0
  285. package/dist/shared/tab-bar.d.ts.map +1 -0
  286. package/dist/shared/tab-bar.js +20 -0
  287. package/dist/shared/tab-bar.js.map +1 -0
  288. package/dist/shared.d.ts +26 -0
  289. package/dist/shared.d.ts.map +1 -0
  290. package/dist/shared.js +39 -0
  291. package/dist/shared.js.map +1 -0
  292. package/dist/subtab-bar.d.ts +23 -0
  293. package/dist/subtab-bar.d.ts.map +1 -0
  294. package/dist/subtab-bar.js +77 -0
  295. package/dist/subtab-bar.js.map +1 -0
  296. package/dist/tool-tab-registry.d.ts +76 -0
  297. package/dist/tool-tab-registry.d.ts.map +1 -0
  298. package/dist/tool-tab-registry.js +44 -0
  299. package/dist/tool-tab-registry.js.map +1 -0
  300. package/dist/tool-tabs-registrations.d.ts +19 -0
  301. package/dist/tool-tabs-registrations.d.ts.map +1 -0
  302. package/dist/tool-tabs-registrations.js +46 -0
  303. package/dist/tool-tabs-registrations.js.map +1 -0
  304. package/dist/tool-tabs.d.ts +12 -0
  305. package/dist/tool-tabs.d.ts.map +1 -0
  306. package/dist/tool-tabs.js +80 -0
  307. package/dist/tool-tabs.js.map +1 -0
  308. package/dist/vendor/cytoscape-bundle.js +600 -0
  309. package/package.json +52 -0
@@ -0,0 +1,218 @@
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
@@ -0,0 +1 @@
1
+ {"version":3,"file":"view-template.js","sourceRoot":"","sources":["../../src/code-paths/view-template.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
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
@@ -0,0 +1 @@
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"}
@@ -0,0 +1,53 @@
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
@@ -0,0 +1 @@
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"}
@@ -0,0 +1,69 @@
1
+ /**
2
+ * Dashboard Code Paths panel — graph-tool surface with two subtabs:
3
+ * 1. Sessions — recent graph runs and their per-rule findings
4
+ * (uses the shared renderSessionTable from sessions.ts).
5
+ * 2. Explore — interactive catalog browser with three views
6
+ * (Graph, Coupling, Functions/distribution). The Graph view
7
+ * carries the SCC cycle highlight that the standalone SCCs view
8
+ * used to own. The Functions view absorbs the former standalone
9
+ * Search subtab via an in-table name filter.
10
+ *
11
+ * Architecture: vanilla DOM, no framework. Each view-*.ts emits a
12
+ * JS string that pushes a `View` literal into the singleton `views`
13
+ * registry. The Explore subtab renders the view tab bar + one
14
+ * container per view; Sessions subtab renders the standard session
15
+ * table.
16
+ *
17
+ * The file imports JS-string emitters from sibling modules under
18
+ * `code-paths/`. It MUST NOT import from `@opensip-cli/graph` —
19
+ * the catalog is consumed by JSON shape only (the structural shape
20
+ * lives in @opensip-cli/contracts to keep this panel decoupled
21
+ * from the graph engine's runtime types).
22
+ */
23
+ /**
24
+ * Concatenation order is load-bearing — each emitter declares
25
+ * top-level names that later emitters reference. The order below is
26
+ * the topological sort; reordering will silently break the page with
27
+ * `<name> is not defined`. Free-identifier dependencies of each
28
+ * emitter, listed against the emitter that supplies them:
29
+ *
30
+ * 1. path-utils — declares `displayName`, `packageOfPath`, `pkgOf`,
31
+ * `shortPkg`.
32
+ * 2. indexes — declares `buildIndexes`, `resolveCalleeOcc`. Uses
33
+ * `pkgOf` (path-utils, above).
34
+ * 3. filters — declares `filterState` (default, non-interactive),
35
+ * `passesFilter`, `packagesInCatalog`, `KIND_LIST`.
36
+ * Uses `pkgOf` (path-utils, above).
37
+ * 4. editor-link — declares `editorLink`. Reads `EDITOR_PROTOCOL`
38
+ * (declared in generator.ts before the script
39
+ * block).
40
+ * 5. trace — declares `findUpstreamTrace`. Uses `indexes`.
41
+ * 6. search — declares `searchFunctions`. Uses `indexes`,
42
+ * `displayName`.
43
+ * 7. function-row — declares `renderFunctionRows` and the empty
44
+ * states it uses. Calls `el`, `displayName`,
45
+ * `packageOfPath`, `passesFilter`.
46
+ * 8. function-card — declares `openFunctionCard`, `closeFunctionCard`.
47
+ * Uses `editorLink`, `findUpstreamTrace`, `el`.
48
+ * 9. views-registry — declares the singleton `views = []` array.
49
+ * Must come before any view emitter.
50
+ * 10. help-drawer — declares `openHelpDrawer`. No external deps
51
+ * beyond `el`.
52
+ * 11-13. view-* — push View descriptors into `views` in TAB order:
53
+ * coupling / distribution / graph (alphabetical:
54
+ * Coupling, Functions, Visualization — the first is the
55
+ * default view). Each renderer closes over `el`,
56
+ * `passesFilter`, `displayName`, `packageOfPath`,
57
+ * `renderFunctionRows`, plus its own utilities; the
58
+ * Visualization renderer also uses `resolveCalleeOcc`
59
+ * (prelude) for its function-level projection.
60
+ * 15. panelOrchestrator — top-level `renderCodePathsTab`,
61
+ * `renderCodePathsExplore`, `openCodePathsSession`.
62
+ * Uses every name above plus `renderSubtabBar`
63
+ * (from shared/) and `registerTabActivator`.
64
+ *
65
+ * If the list grows past ~30 entries, replace this manual order with
66
+ * a `{ id, deps, emit }` topological sort.
67
+ */
68
+ export declare function dashboardCodePathsJs(_restructured?: boolean): string;
69
+ //# sourceMappingURL=code-paths.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"code-paths.d.ts","sourceRoot":"","sources":["../src/code-paths.ts"],"names":[],"mappings":"AACA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAuCH;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4CG;AACH,wBAAgB,oBAAoB,CAAC,aAAa,GAAE,OAAmC,GAAG,MAAM,CAyC/F"}