@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,403 @@
1
+ /// <reference lib="dom" />
2
+ /**
3
+ * @vitest-environment jsdom
4
+ *
5
+ * Function Card overlay behavior tests. Loads the emitted JS from the
6
+ * indexes + function-card + function-row + path-utils + editor-link +
7
+ * trace + filters + views-registry modules into a jsdom global, then
8
+ * exercises the public API (openFunctionCard, closeFunctionCard).
9
+ */
10
+ import { describe, expect, it, beforeEach } from 'vitest';
11
+ import { dashboardEditorLinkJs } from '../code-paths/editor-link.js';
12
+ import { dashboardFiltersJs } from '../code-paths/filters.js';
13
+ import { dashboardFunctionCardJs } from '../code-paths/function-card.js';
14
+ import { dashboardIndexesJs } from '../code-paths/indexes.js';
15
+ import { dashboardPathUtilsJs } from '../code-paths/path-utils.js';
16
+ import { dashboardTraceJs } from '../code-paths/trace.js';
17
+ function makeOcc(over) {
18
+ return {
19
+ qualifiedName: over.simpleName,
20
+ filePath: 'packages/x/src/x.ts',
21
+ line: 10,
22
+ column: 0,
23
+ endLine: 30,
24
+ kind: 'function-declaration',
25
+ params: [],
26
+ returnType: null,
27
+ enclosingClass: null,
28
+ decorators: [],
29
+ visibility: 'exported',
30
+ inTestFile: false,
31
+ definedInGenerated: false,
32
+ calls: [],
33
+ ...over,
34
+ };
35
+ }
36
+ function bootDashboard(catalog) {
37
+ // The emitted JS expects an `el(tag, attrs, children)` helper to exist
38
+ // in scope (provided by shared.ts). We provide a minimal compatible
39
+ // version for the test environment.
40
+ const elSrc = `
41
+ function el(tag, attrs, children) {
42
+ const e = document.createElement(tag);
43
+ if (attrs) Object.entries(attrs).forEach(([k,v]) => {
44
+ if (k === 'text') e.textContent = v;
45
+ else if (k === 'class') e.className = v;
46
+ else if (k.startsWith('on')) e.addEventListener(k.slice(2), v);
47
+ else e.setAttribute(k, v);
48
+ });
49
+ if (children) children.forEach(c => { if (typeof c === 'string') e.appendChild(document.createTextNode(c)); else if (c) e.appendChild(c); });
50
+ return e;
51
+ }
52
+ `;
53
+ const editorProtocolSrc = `var EDITOR_PROTOCOL = null;`;
54
+ const tail = `
55
+ var graphCatalog = ${JSON.stringify(catalog)};
56
+ var graphIndexes = buildIndexes(graphCatalog);
57
+ window.openFunctionCard = openFunctionCard;
58
+ window.closeFunctionCard = closeFunctionCard;
59
+ window.graphIndexes = graphIndexes;
60
+ `;
61
+ const src = [
62
+ elSrc,
63
+ editorProtocolSrc,
64
+ dashboardPathUtilsJs(),
65
+ dashboardIndexesJs(),
66
+ dashboardFiltersJs(),
67
+ dashboardEditorLinkJs(),
68
+ dashboardTraceJs(),
69
+ dashboardFunctionCardJs(),
70
+ tail,
71
+ ].join('\n');
72
+ // eslint-disable-next-line @typescript-eslint/no-implied-eval, sonarjs/code-eval -- Trusted source: our own emitter.
73
+ new Function(src).call(globalThis);
74
+ }
75
+ function w() {
76
+ return globalThis;
77
+ }
78
+ beforeEach(() => {
79
+ document.body.innerHTML = '';
80
+ });
81
+ describe('Function Card overlay', () => {
82
+ it('opens with name + location for a function-declaration occurrence', () => {
83
+ bootDashboard({
84
+ version: '2.0',
85
+ tool: 'graph',
86
+ language: 'typescript',
87
+ builtAt: 'now',
88
+ functions: {
89
+ resolveProjectPaths: [
90
+ makeOcc({
91
+ bodyHash: 'h1',
92
+ simpleName: 'resolveProjectPaths',
93
+ filePath: 'packages/core/src/lib/paths.ts',
94
+ line: 78,
95
+ endLine: 96,
96
+ }),
97
+ ],
98
+ },
99
+ });
100
+ w().openFunctionCard('h1');
101
+ const overlay = document.querySelector('.function-card-overlay');
102
+ expect(overlay).not.toBeNull();
103
+ expect(overlay.textContent).toContain('resolveProjectPaths');
104
+ expect(overlay.textContent).toContain('packages/core/src/lib/paths.ts:78');
105
+ expect(overlay.textContent).toContain('function-declaration');
106
+ });
107
+ it('renders a method shape (kind=method) correctly', () => {
108
+ bootDashboard({
109
+ version: '2.0',
110
+ tool: 'graph',
111
+ language: 'typescript',
112
+ builtAt: 'now',
113
+ functions: {
114
+ format: [
115
+ makeOcc({
116
+ bodyHash: 'm1',
117
+ simpleName: 'format',
118
+ kind: 'method',
119
+ enclosingClass: 'Logger',
120
+ }),
121
+ ],
122
+ },
123
+ });
124
+ w().openFunctionCard('m1');
125
+ expect(document.querySelector('.function-card-overlay').textContent).toContain('method');
126
+ });
127
+ it('renders an arrow shape', () => {
128
+ bootDashboard({
129
+ version: '2.0',
130
+ tool: 'graph',
131
+ language: 'typescript',
132
+ builtAt: 'now',
133
+ functions: {
134
+ '<arrow:foo.ts:1:1>': [
135
+ makeOcc({ bodyHash: 'a1', simpleName: '<arrow:foo.ts:1:1>', kind: 'arrow' }),
136
+ ],
137
+ },
138
+ });
139
+ w().openFunctionCard('a1');
140
+ const overlay = document.querySelector('.function-card-overlay');
141
+ // Synthetic names are collapsed to just the kind tag in the card
142
+ // header; the full simpleName never appears verbatim.
143
+ expect(overlay.querySelector('.function-card h3').textContent).toBe('<arrow>');
144
+ expect(overlay.textContent).not.toContain('<arrow:foo.ts:1:1>');
145
+ // The kind label still surfaces in the meta row.
146
+ expect(overlay.querySelector('.fc-meta').textContent).toContain('arrow');
147
+ });
148
+ it('renders a getter and constructor with the right kind label', () => {
149
+ bootDashboard({
150
+ version: '2.0',
151
+ tool: 'graph',
152
+ language: 'typescript',
153
+ builtAt: 'now',
154
+ functions: {
155
+ size: [makeOcc({ bodyHash: 'g1', simpleName: 'size', kind: 'getter' })],
156
+ constructor: [makeOcc({ bodyHash: 'c1', simpleName: 'constructor', kind: 'constructor' })],
157
+ },
158
+ });
159
+ w().openFunctionCard('g1');
160
+ expect(document.querySelector('.function-card-overlay').textContent).toContain('getter');
161
+ w().openFunctionCard('c1');
162
+ expect(document.querySelector('.function-card-overlay').textContent).toContain('constructor');
163
+ });
164
+ it('groups callers by package and shows the right count', () => {
165
+ bootDashboard({
166
+ version: '2.0',
167
+ tool: 'graph',
168
+ language: 'typescript',
169
+ builtAt: 'now',
170
+ functions: {
171
+ target: [makeOcc({ bodyHash: 't1', simpleName: 'target' })],
172
+ a: [
173
+ makeOcc({
174
+ bodyHash: 'ca',
175
+ simpleName: 'a',
176
+ filePath: 'packages/cli/src/a.ts',
177
+ calls: [
178
+ {
179
+ to: ['t1'],
180
+ line: 1,
181
+ column: 0,
182
+ resolution: 'static',
183
+ confidence: 'high',
184
+ text: 'target()',
185
+ },
186
+ ],
187
+ }),
188
+ ],
189
+ b: [
190
+ makeOcc({
191
+ bodyHash: 'cb',
192
+ simpleName: 'b',
193
+ filePath: 'packages/cli/src/b.ts',
194
+ calls: [
195
+ {
196
+ to: ['t1'],
197
+ line: 1,
198
+ column: 0,
199
+ resolution: 'static',
200
+ confidence: 'high',
201
+ text: 'target()',
202
+ },
203
+ ],
204
+ }),
205
+ ],
206
+ c: [
207
+ makeOcc({
208
+ bodyHash: 'cc',
209
+ simpleName: 'c',
210
+ filePath: 'packages/contracts/src/c.ts',
211
+ calls: [
212
+ {
213
+ to: ['t1'],
214
+ line: 1,
215
+ column: 0,
216
+ resolution: 'static',
217
+ confidence: 'high',
218
+ text: 'target()',
219
+ },
220
+ ],
221
+ }),
222
+ ],
223
+ d: [
224
+ makeOcc({
225
+ bodyHash: 'cd',
226
+ simpleName: 'd',
227
+ filePath: 'packages/contracts/src/d.ts',
228
+ calls: [
229
+ {
230
+ to: ['t1'],
231
+ line: 1,
232
+ column: 0,
233
+ resolution: 'static',
234
+ confidence: 'high',
235
+ text: 'target()',
236
+ },
237
+ ],
238
+ }),
239
+ ],
240
+ e: [
241
+ makeOcc({
242
+ bodyHash: 'ce',
243
+ simpleName: 'e',
244
+ filePath: 'packages/contracts/src/e.ts',
245
+ calls: [
246
+ {
247
+ to: ['t1'],
248
+ line: 1,
249
+ column: 0,
250
+ resolution: 'static',
251
+ confidence: 'high',
252
+ text: 'target()',
253
+ },
254
+ ],
255
+ }),
256
+ ],
257
+ f: [
258
+ makeOcc({
259
+ bodyHash: 'cf',
260
+ simpleName: 'f',
261
+ filePath: 'packages/contracts/src/f.ts',
262
+ calls: [
263
+ {
264
+ to: ['t1'],
265
+ line: 1,
266
+ column: 0,
267
+ resolution: 'static',
268
+ confidence: 'high',
269
+ text: 'target()',
270
+ },
271
+ ],
272
+ }),
273
+ ],
274
+ g: [
275
+ makeOcc({
276
+ bodyHash: 'cg',
277
+ simpleName: 'g',
278
+ filePath: 'packages/contracts/src/g.ts',
279
+ calls: [
280
+ {
281
+ to: ['t1'],
282
+ line: 1,
283
+ column: 0,
284
+ resolution: 'static',
285
+ confidence: 'high',
286
+ text: 'target()',
287
+ },
288
+ ],
289
+ }),
290
+ ],
291
+ },
292
+ });
293
+ w().openFunctionCard('t1');
294
+ const text = document.querySelector('.function-card-overlay').textContent ?? '';
295
+ expect(text).toContain('Callers (7)');
296
+ expect(text).toContain('cli (2)');
297
+ expect(text).toContain('contracts (5)');
298
+ });
299
+ it('shows "No callers in catalog." when there are zero callers', () => {
300
+ bootDashboard({
301
+ version: '2.0',
302
+ tool: 'graph',
303
+ language: 'typescript',
304
+ builtAt: 'now',
305
+ functions: { lonely: [makeOcc({ bodyHash: 'l1', simpleName: 'lonely' })] },
306
+ });
307
+ w().openFunctionCard('l1');
308
+ expect(document.querySelector('.function-card-overlay').textContent).toContain('No callers in catalog.');
309
+ });
310
+ it('shows polymorphic callees as three resolved entries', () => {
311
+ bootDashboard({
312
+ version: '2.0',
313
+ tool: 'graph',
314
+ language: 'typescript',
315
+ builtAt: 'now',
316
+ functions: {
317
+ f: [
318
+ makeOcc({
319
+ bodyHash: 'fh',
320
+ simpleName: 'f',
321
+ calls: [
322
+ {
323
+ to: ['h1', 'h2', 'h3'],
324
+ line: 2,
325
+ column: 0,
326
+ resolution: 'method-dispatch',
327
+ confidence: 'medium',
328
+ text: 'x.foo()',
329
+ },
330
+ ],
331
+ }),
332
+ ],
333
+ a: [makeOcc({ bodyHash: 'h1', simpleName: 'a' })],
334
+ b: [makeOcc({ bodyHash: 'h2', simpleName: 'b' })],
335
+ c: [makeOcc({ bodyHash: 'h3', simpleName: 'c' })],
336
+ },
337
+ });
338
+ w().openFunctionCard('fh');
339
+ const list = document
340
+ .querySelectorAll('.function-card .fc-section')[1]
341
+ .querySelectorAll('li[data-body-hash]');
342
+ expect(list.length).toBe(3);
343
+ });
344
+ it('opening a caller swaps the overlay content (recursion uses a single overlay)', () => {
345
+ bootDashboard({
346
+ version: '2.0',
347
+ tool: 'graph',
348
+ language: 'typescript',
349
+ builtAt: 'now',
350
+ functions: {
351
+ target: [makeOcc({ bodyHash: 't1', simpleName: 'target' })],
352
+ caller: [
353
+ makeOcc({
354
+ bodyHash: 'cr',
355
+ simpleName: 'caller',
356
+ calls: [
357
+ {
358
+ to: ['t1'],
359
+ line: 1,
360
+ column: 0,
361
+ resolution: 'static',
362
+ confidence: 'high',
363
+ text: 'target()',
364
+ },
365
+ ],
366
+ }),
367
+ ],
368
+ },
369
+ });
370
+ w().openFunctionCard('t1');
371
+ expect(document.querySelectorAll('.function-card-overlay').length).toBe(1);
372
+ w().openFunctionCard('cr');
373
+ expect(document.querySelectorAll('.function-card-overlay').length).toBe(1);
374
+ expect(document.querySelector('.function-card-overlay').textContent).toContain('caller');
375
+ });
376
+ it('closeFunctionCard removes the overlay node', () => {
377
+ bootDashboard({
378
+ version: '2.0',
379
+ tool: 'graph',
380
+ language: 'typescript',
381
+ builtAt: 'now',
382
+ functions: { f: [makeOcc({ bodyHash: 'h', simpleName: 'f' })] },
383
+ });
384
+ w().openFunctionCard('h');
385
+ expect(document.querySelector('.function-card-overlay')).not.toBeNull();
386
+ w().closeFunctionCard();
387
+ expect(document.querySelector('.function-card-overlay')).toBeNull();
388
+ });
389
+ it('clicking the overlay backdrop closes the card', () => {
390
+ bootDashboard({
391
+ version: '2.0',
392
+ tool: 'graph',
393
+ language: 'typescript',
394
+ builtAt: 'now',
395
+ functions: { f: [makeOcc({ bodyHash: 'h', simpleName: 'f' })] },
396
+ });
397
+ w().openFunctionCard('h');
398
+ const overlay = document.querySelector('.function-card-overlay');
399
+ overlay.dispatchEvent(new MouseEvent('click', { bubbles: true }));
400
+ expect(document.querySelector('.function-card-overlay')).toBeNull();
401
+ });
402
+ });
403
+ //# sourceMappingURL=dashboard-function-card.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dashboard-function-card.test.js","sourceRoot":"","sources":["../../src/__tests__/dashboard-function-card.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * @vitest-environment jsdom
3
+ *
4
+ * `renderFunctionRows` shared helper — §11.2 / §11.4.
5
+ *
6
+ * Three column configurations corresponding to the Hot/Big/Wide views:
7
+ * verifies the helper produces the right header cells and the right
8
+ * per-row cell values.
9
+ */
10
+ export {};
11
+ //# sourceMappingURL=dashboard-function-row.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dashboard-function-row.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/dashboard-function-row.test.ts"],"names":[],"mappings":"AACA;;;;;;;;GAQG"}
@@ -0,0 +1,101 @@
1
+ /// <reference lib="dom" />
2
+ /**
3
+ * @vitest-environment jsdom
4
+ *
5
+ * `renderFunctionRows` shared helper — §11.2 / §11.4.
6
+ *
7
+ * Three column configurations corresponding to the Hot/Big/Wide views:
8
+ * verifies the helper produces the right header cells and the right
9
+ * per-row cell values.
10
+ */
11
+ import { describe, expect, it, beforeEach } from 'vitest';
12
+ import { dashboardFunctionRowJs } from '../code-paths/function-row.js';
13
+ function loadRenderFn() {
14
+ const elSrc = `
15
+ function el(tag, attrs, children) {
16
+ const e = document.createElement(tag);
17
+ if (attrs) Object.entries(attrs).forEach(([k,v]) => {
18
+ if (k === 'text') e.textContent = v;
19
+ else if (k === 'class') e.className = v;
20
+ else if (k.startsWith('on')) e.addEventListener(k.slice(2), v);
21
+ else e.setAttribute(k, v);
22
+ });
23
+ if (children) children.forEach(c => { if (typeof c === 'string') e.appendChild(document.createTextNode(c)); else if (c) e.appendChild(c); });
24
+ return e;
25
+ }
26
+ `;
27
+ // eslint-disable-next-line @typescript-eslint/no-implied-eval, sonarjs/code-eval -- Trusted source.
28
+ return new Function(elSrc + dashboardFunctionRowJs() + '\nreturn renderFunctionRows;')();
29
+ }
30
+ beforeEach(() => {
31
+ document.body.innerHTML = '';
32
+ });
33
+ describe('renderFunctionRows', () => {
34
+ it('Hot view column shape: Function / Callers / Package / File', () => {
35
+ const f = loadRenderFn();
36
+ const c = document.createElement('div');
37
+ f(c, [{ simpleName: 'logger', __callers: 12, filePath: 'packages/core/src/lib/logger.ts:42' }], [
38
+ { label: 'Function', value: (o) => o.simpleName },
39
+ { label: 'Callers', value: (o) => o.__callers },
40
+ { label: 'Package', value: () => 'core' },
41
+ { label: 'File', value: (o) => o.filePath },
42
+ ]);
43
+ // eslint-disable-next-line unicorn/prefer-spread -- TS NodeListOf iteration via spread requires lib.dom.iterable; Array.from is the portable form for the test target.
44
+ const ths = Array.from(c.querySelectorAll('th'));
45
+ expect(ths.map((t) => t.textContent)).toEqual(['Function', 'Callers', 'Package', 'File']);
46
+ // eslint-disable-next-line unicorn/prefer-spread -- See above.
47
+ const tds = Array.from(c.querySelectorAll('tbody td'));
48
+ expect(tds.map((t) => t.textContent)).toEqual([
49
+ 'logger',
50
+ '12',
51
+ 'core',
52
+ 'packages/core/src/lib/logger.ts:42',
53
+ ]);
54
+ });
55
+ it('Big view column shape: Function / Lines / Kind / Package / File', () => {
56
+ const f = loadRenderFn();
57
+ const c = document.createElement('div');
58
+ f(c, [
59
+ {
60
+ simpleName: 'foo',
61
+ __size: 42,
62
+ kind: 'function-declaration',
63
+ filePath: 'packages/x/src/x.ts:1',
64
+ },
65
+ ], [
66
+ { label: 'Function', value: (o) => o.simpleName },
67
+ { label: 'Lines', value: (o) => o.__size },
68
+ { label: 'Kind', value: (o) => o.kind },
69
+ { label: 'Package', value: () => 'x' },
70
+ { label: 'File', value: (o) => o.filePath },
71
+ ]);
72
+ expect(c.querySelectorAll('thead th').length).toBe(5);
73
+ });
74
+ it('Wide view shape includes a Signature column with the parameter thumb', () => {
75
+ const f = loadRenderFn();
76
+ const c = document.createElement('div');
77
+ f(c, [
78
+ {
79
+ simpleName: 'connect',
80
+ __arity: 5,
81
+ __thumb: '(a, b, c, d, e)',
82
+ filePath: 'packages/x/x.ts:1',
83
+ },
84
+ ], [
85
+ { label: 'Function', value: (o) => o.simpleName },
86
+ { label: 'Params', value: (o) => o.__arity },
87
+ { label: 'Signature', value: (o) => o.__thumb },
88
+ { label: 'Package', value: () => 'x' },
89
+ { label: 'File', value: (o) => o.filePath },
90
+ ]);
91
+ const sigCell = c.querySelectorAll('tbody td')[2];
92
+ expect(sigCell.textContent).toBe('(a, b, c, d, e)');
93
+ });
94
+ it('renders the empty state for zero rows', () => {
95
+ const f = loadRenderFn();
96
+ const c = document.createElement('div');
97
+ f(c, [], [{ label: 'X', value: () => 'y' }]);
98
+ expect(c.querySelector('.empty')).not.toBeNull();
99
+ });
100
+ });
101
+ //# sourceMappingURL=dashboard-function-row.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dashboard-function-row.test.js","sourceRoot":"","sources":["../../src/__tests__/dashboard-function-row.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Generator-level wiring tests for the v0.3 graph-catalog inline blob
3
+ * and the editor-protocol JS constant.
4
+ *
5
+ * Covers Phase P0 (catalog block emission, null vs non-null) and the
6
+ * Phase P9 hook (editor protocol constant).
7
+ */
8
+ export {};
9
+ //# sourceMappingURL=dashboard-generator-graph-catalog.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dashboard-generator-graph-catalog.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/dashboard-generator-graph-catalog.test.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG"}
@@ -0,0 +1,75 @@
1
+ /**
2
+ * Generator-level wiring tests for the v0.3 graph-catalog inline blob
3
+ * and the editor-protocol JS constant.
4
+ *
5
+ * Covers Phase P0 (catalog block emission, null vs non-null) and the
6
+ * Phase P9 hook (editor protocol constant).
7
+ */
8
+ import { describe, expect, it } from 'vitest';
9
+ import { generateDashboardHtml } from '../generator.js';
10
+ const minimalCatalog = {
11
+ version: '2.0',
12
+ tool: 'graph',
13
+ language: 'typescript',
14
+ builtAt: '2026-05-17T00:00:00Z',
15
+ functions: {
16
+ foo: [
17
+ {
18
+ bodyHash: 'h1',
19
+ simpleName: 'foo',
20
+ qualifiedName: 'pkg.foo',
21
+ filePath: 'packages/x/src/foo.ts',
22
+ line: 1,
23
+ column: 0,
24
+ endLine: 5,
25
+ kind: 'function-declaration',
26
+ params: [],
27
+ returnType: null,
28
+ enclosingClass: null,
29
+ decorators: [],
30
+ visibility: 'exported',
31
+ inTestFile: false,
32
+ definedInGenerated: false,
33
+ calls: [],
34
+ },
35
+ ],
36
+ },
37
+ };
38
+ describe('generateDashboardHtml — graph catalog wiring', () => {
39
+ it('emits no id="graph-catalog" block when graphCatalog is null', () => {
40
+ const html = generateDashboardHtml({ sessions: [], graphCatalog: null });
41
+ expect(html).not.toContain('id="graph-catalog"');
42
+ });
43
+ it('emits the graph-catalog blob and is parseable JSON when supplied', () => {
44
+ const html = generateDashboardHtml({ sessions: [], graphCatalog: minimalCatalog });
45
+ expect(html).toContain('id="graph-catalog"');
46
+ // Pull out the blob and re-parse it.
47
+ const m = /<script type="application\/json" id="graph-catalog">([\s\S]*?)<\/script>/.exec(html);
48
+ expect(m).not.toBeNull();
49
+ const blob = m[1];
50
+ // Reverse the < / > escape that escapeForScriptContext applies.
51
+ const unescaped = blob.replaceAll(String.raw `<`, '<').replaceAll(String.raw `>`, '>');
52
+ const parsed = JSON.parse(unescaped);
53
+ expect(parsed.version).toBe('2.0');
54
+ expect(Object.keys(parsed.functions)).toContain('foo');
55
+ });
56
+ it('embeds EDITOR_PROTOCOL = null when no editorProtocol is supplied', () => {
57
+ const html = generateDashboardHtml({ sessions: [], graphCatalog: null });
58
+ expect(html).toContain('const EDITOR_PROTOCOL = null;');
59
+ });
60
+ it('embeds EDITOR_PROTOCOL as a JS string constant when supplied', () => {
61
+ const html = generateDashboardHtml({
62
+ sessions: [],
63
+ graphCatalog: minimalCatalog,
64
+ editorProtocol: 'vscode',
65
+ });
66
+ expect(html).toContain('const EDITOR_PROTOCOL = "vscode";');
67
+ });
68
+ it('embeds the restructured view ids via the views[] registry', () => {
69
+ const html = generateDashboardHtml({ sessions: [], graphCatalog: minimalCatalog });
70
+ for (const id of ['graph', 'coupling', 'distribution']) {
71
+ expect(html).toContain(`id: '${id}'`);
72
+ }
73
+ });
74
+ });
75
+ //# sourceMappingURL=dashboard-generator-graph-catalog.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dashboard-generator-graph-catalog.test.js","sourceRoot":"","sources":["../../src/__tests__/dashboard-generator-graph-catalog.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Offline-render guarantee for the Graph view.
3
+ *
4
+ * Playwright is not part of this package's toolchain, so rather than boot a
5
+ * real browser this test asserts the offline property at the artifact
6
+ * level: a generated report inlines the Cytoscape renderer and the
7
+ * projected view-model with ZERO external `<script src>` references, so it
8
+ * renders the Graph view with the network disabled ("open an archived
9
+ * report on a plane"). The only permitted external reference is the Google
10
+ * Fonts stylesheet `<link>` the report already carried before this work.
11
+ */
12
+ export {};
13
+ //# sourceMappingURL=dashboard-graph-offline.integration.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dashboard-graph-offline.integration.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/dashboard-graph-offline.integration.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG"}