@flanksource/clicky-ui 0.3.45 → 0.3.47

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 (505) hide show
  1. package/NOTICE.md +11 -0
  2. package/README.md +22 -0
  3. package/dist/ai.cjs +13 -8
  4. package/dist/ai.cjs.map +1 -1
  5. package/dist/ai.js +7 -2
  6. package/dist/ai.js.map +1 -1
  7. package/dist/components/ErrorWrapper.cjs +2 -3
  8. package/dist/components/ErrorWrapper.cjs.map +1 -1
  9. package/dist/components/ErrorWrapper.d.ts.map +1 -1
  10. package/dist/components/ErrorWrapper.js +3 -4
  11. package/dist/components/ErrorWrapper.js.map +1 -1
  12. package/dist/data/AccessMark.cjs +23 -0
  13. package/dist/data/AccessMark.cjs.map +1 -0
  14. package/dist/data/AccessMark.d.ts +11 -0
  15. package/dist/data/AccessMark.d.ts.map +1 -0
  16. package/dist/data/AccessMark.js +23 -0
  17. package/dist/data/AccessMark.js.map +1 -0
  18. package/dist/data/Clicky.cjs +3 -0
  19. package/dist/data/Clicky.cjs.map +1 -1
  20. package/dist/data/Clicky.js +3 -0
  21. package/dist/data/Clicky.js.map +1 -1
  22. package/dist/data/CodeDiff.cjs +116 -23
  23. package/dist/data/CodeDiff.cjs.map +1 -1
  24. package/dist/data/CodeDiff.d.ts +26 -0
  25. package/dist/data/CodeDiff.d.ts.map +1 -1
  26. package/dist/data/CodeDiff.js +116 -23
  27. package/dist/data/CodeDiff.js.map +1 -1
  28. package/dist/data/FilterPill.cjs +15 -2
  29. package/dist/data/FilterPill.cjs.map +1 -1
  30. package/dist/data/FilterPill.d.ts +1 -1
  31. package/dist/data/FilterPill.d.ts.map +1 -1
  32. package/dist/data/FilterPill.js +15 -2
  33. package/dist/data/FilterPill.js.map +1 -1
  34. package/dist/data/GraphDiagram.cjs +65 -13
  35. package/dist/data/GraphDiagram.cjs.map +1 -1
  36. package/dist/data/GraphDiagram.d.ts +9 -2
  37. package/dist/data/GraphDiagram.d.ts.map +1 -1
  38. package/dist/data/GraphDiagram.js +66 -14
  39. package/dist/data/GraphDiagram.js.map +1 -1
  40. package/dist/data/GraphDiagramGroups.cjs +100 -0
  41. package/dist/data/GraphDiagramGroups.cjs.map +1 -0
  42. package/dist/data/GraphDiagramGroups.d.ts +24 -0
  43. package/dist/data/GraphDiagramGroups.d.ts.map +1 -0
  44. package/dist/data/GraphDiagramGroups.js +100 -0
  45. package/dist/data/GraphDiagramGroups.js.map +1 -0
  46. package/dist/data/GraphDiagramNodes.cjs +17 -31
  47. package/dist/data/GraphDiagramNodes.cjs.map +1 -1
  48. package/dist/data/GraphDiagramNodes.d.ts +6 -13
  49. package/dist/data/GraphDiagramNodes.d.ts.map +1 -1
  50. package/dist/data/GraphDiagramNodes.js +17 -31
  51. package/dist/data/GraphDiagramNodes.js.map +1 -1
  52. package/dist/data/LogViewer.cjs +27 -8
  53. package/dist/data/LogViewer.cjs.map +1 -1
  54. package/dist/data/LogViewer.d.ts +11 -3
  55. package/dist/data/LogViewer.d.ts.map +1 -1
  56. package/dist/data/LogViewer.js +27 -8
  57. package/dist/data/LogViewer.js.map +1 -1
  58. package/dist/data/Properties.cjs +2 -15
  59. package/dist/data/Properties.cjs.map +1 -1
  60. package/dist/data/Properties.d.ts +4 -0
  61. package/dist/data/Properties.d.ts.map +1 -1
  62. package/dist/data/Properties.js +2 -15
  63. package/dist/data/Properties.js.map +1 -1
  64. package/dist/data/PropertyValue.cjs +37 -0
  65. package/dist/data/PropertyValue.cjs.map +1 -0
  66. package/dist/data/PropertyValue.d.ts +6 -0
  67. package/dist/data/PropertyValue.d.ts.map +1 -0
  68. package/dist/data/PropertyValue.js +37 -0
  69. package/dist/data/PropertyValue.js.map +1 -0
  70. package/dist/data/Tree.cjs +4 -3
  71. package/dist/data/Tree.cjs.map +1 -1
  72. package/dist/data/Tree.d.ts +3 -1
  73. package/dist/data/Tree.d.ts.map +1 -1
  74. package/dist/data/Tree.js +4 -3
  75. package/dist/data/Tree.js.map +1 -1
  76. package/dist/data/TreeNode.cjs +1 -1
  77. package/dist/data/TreeNode.cjs.map +1 -1
  78. package/dist/data/TreeNode.d.ts.map +1 -1
  79. package/dist/data/TreeNode.js +1 -1
  80. package/dist/data/TreeNode.js.map +1 -1
  81. package/dist/data/ai/ChatFab.cjs +1 -1
  82. package/dist/data/ai/ChatFab.cjs.map +1 -1
  83. package/dist/data/ai/ChatFab.js +1 -1
  84. package/dist/data/ai/ChatFab.js.map +1 -1
  85. package/dist/data/ai/ChatWindow.cjs +106 -171
  86. package/dist/data/ai/ChatWindow.cjs.map +1 -1
  87. package/dist/data/ai/ChatWindow.d.ts +6 -2
  88. package/dist/data/ai/ChatWindow.d.ts.map +1 -1
  89. package/dist/data/ai/ChatWindow.header.cjs +104 -0
  90. package/dist/data/ai/ChatWindow.header.cjs.map +1 -0
  91. package/dist/data/ai/ChatWindow.header.d.ts +29 -0
  92. package/dist/data/ai/ChatWindow.header.d.ts.map +1 -0
  93. package/dist/data/ai/ChatWindow.header.js +104 -0
  94. package/dist/data/ai/ChatWindow.header.js.map +1 -0
  95. package/dist/data/ai/ChatWindow.js +107 -172
  96. package/dist/data/ai/ChatWindow.js.map +1 -1
  97. package/dist/data/ai/ChatWindow.placement.cjs +95 -0
  98. package/dist/data/ai/ChatWindow.placement.cjs.map +1 -0
  99. package/dist/data/ai/ChatWindow.placement.d.ts +32 -0
  100. package/dist/data/ai/ChatWindow.placement.d.ts.map +1 -0
  101. package/dist/data/ai/ChatWindow.placement.js +95 -0
  102. package/dist/data/ai/ChatWindow.placement.js.map +1 -0
  103. package/dist/data/ai/SessionChatComposer.cjs +3 -1
  104. package/dist/data/ai/SessionChatComposer.cjs.map +1 -1
  105. package/dist/data/ai/SessionChatComposer.d.ts +4 -1
  106. package/dist/data/ai/SessionChatComposer.d.ts.map +1 -1
  107. package/dist/data/ai/SessionChatComposer.js +3 -1
  108. package/dist/data/ai/SessionChatComposer.js.map +1 -1
  109. package/dist/data/ai/SessionInspector.cjs +68 -72
  110. package/dist/data/ai/SessionInspector.cjs.map +1 -1
  111. package/dist/data/ai/SessionInspector.composer-slot.cjs +8 -0
  112. package/dist/data/ai/SessionInspector.composer-slot.cjs.map +1 -0
  113. package/dist/data/ai/SessionInspector.composer-slot.d.ts +9 -0
  114. package/dist/data/ai/SessionInspector.composer-slot.d.ts.map +1 -0
  115. package/dist/data/ai/SessionInspector.composer-slot.js +8 -0
  116. package/dist/data/ai/SessionInspector.composer-slot.js.map +1 -0
  117. package/dist/data/ai/SessionInspector.d.ts +6 -1
  118. package/dist/data/ai/SessionInspector.d.ts.map +1 -1
  119. package/dist/data/ai/SessionInspector.js +69 -73
  120. package/dist/data/ai/SessionInspector.js.map +1 -1
  121. package/dist/data/ai/SessionInspector.legacy.cjs +41 -42
  122. package/dist/data/ai/SessionInspector.legacy.cjs.map +1 -1
  123. package/dist/data/ai/SessionInspector.legacy.d.ts.map +1 -1
  124. package/dist/data/ai/SessionInspector.legacy.js +41 -42
  125. package/dist/data/ai/SessionInspector.legacy.js.map +1 -1
  126. package/dist/data/ai/SessionInspector.remote-view.cjs +14 -9
  127. package/dist/data/ai/SessionInspector.remote-view.cjs.map +1 -1
  128. package/dist/data/ai/SessionInspector.remote-view.d.ts +6 -2
  129. package/dist/data/ai/SessionInspector.remote-view.d.ts.map +1 -1
  130. package/dist/data/ai/SessionInspector.remote-view.js +14 -9
  131. package/dist/data/ai/SessionInspector.remote-view.js.map +1 -1
  132. package/dist/data/ai/SessionInspector.remote.cjs +84 -16
  133. package/dist/data/ai/SessionInspector.remote.cjs.map +1 -1
  134. package/dist/data/ai/SessionInspector.remote.d.ts +42 -7
  135. package/dist/data/ai/SessionInspector.remote.d.ts.map +1 -1
  136. package/dist/data/ai/SessionInspector.remote.js +86 -18
  137. package/dist/data/ai/SessionInspector.remote.js.map +1 -1
  138. package/dist/data/ai/SessionInspector.transcript.cjs +5 -0
  139. package/dist/data/ai/SessionInspector.transcript.cjs.map +1 -1
  140. package/dist/data/ai/SessionInspector.transcript.d.ts.map +1 -1
  141. package/dist/data/ai/SessionInspector.transcript.js +5 -0
  142. package/dist/data/ai/SessionInspector.transcript.js.map +1 -1
  143. package/dist/data/ai/SessionTail.cjs +63 -0
  144. package/dist/data/ai/SessionTail.cjs.map +1 -0
  145. package/dist/data/ai/SessionTail.d.ts +14 -0
  146. package/dist/data/ai/SessionTail.d.ts.map +1 -0
  147. package/dist/data/ai/SessionTail.js +63 -0
  148. package/dist/data/ai/SessionTail.js.map +1 -0
  149. package/dist/data/ai/SessionViewer.cjs +10 -3
  150. package/dist/data/ai/SessionViewer.cjs.map +1 -1
  151. package/dist/data/ai/SessionViewer.d.ts +7 -1
  152. package/dist/data/ai/SessionViewer.d.ts.map +1 -1
  153. package/dist/data/ai/SessionViewer.js +10 -3
  154. package/dist/data/ai/SessionViewer.js.map +1 -1
  155. package/dist/data/ai/SessionViewer.unified.d.ts +14 -0
  156. package/dist/data/ai/SessionViewer.unified.d.ts.map +1 -1
  157. package/dist/data/ai/index.d.ts +4 -3
  158. package/dist/data/ai/index.d.ts.map +1 -1
  159. package/dist/data/ai/use-session-scroll.cjs +30 -6
  160. package/dist/data/ai/use-session-scroll.cjs.map +1 -1
  161. package/dist/data/ai/use-session-scroll.d.ts +7 -0
  162. package/dist/data/ai/use-session-scroll.d.ts.map +1 -1
  163. package/dist/data/ai/use-session-scroll.js +30 -6
  164. package/dist/data/ai/use-session-scroll.js.map +1 -1
  165. package/dist/data/call-graph/CallGraph.cjs +50 -31
  166. package/dist/data/call-graph/CallGraph.cjs.map +1 -1
  167. package/dist/data/call-graph/CallGraph.d.ts +10 -1
  168. package/dist/data/call-graph/CallGraph.d.ts.map +1 -1
  169. package/dist/data/call-graph/CallGraph.js +52 -33
  170. package/dist/data/call-graph/CallGraph.js.map +1 -1
  171. package/dist/data/call-graph/CallGraphMembers.cjs +5 -4
  172. package/dist/data/call-graph/CallGraphMembers.cjs.map +1 -1
  173. package/dist/data/call-graph/CallGraphMembers.d.ts +1 -1
  174. package/dist/data/call-graph/CallGraphMembers.d.ts.map +1 -1
  175. package/dist/data/call-graph/CallGraphMembers.js +5 -4
  176. package/dist/data/call-graph/CallGraphMembers.js.map +1 -1
  177. package/dist/data/call-graph/CallGraphToolbar.cjs +17 -5
  178. package/dist/data/call-graph/CallGraphToolbar.cjs.map +1 -1
  179. package/dist/data/call-graph/CallGraphToolbar.d.ts +10 -0
  180. package/dist/data/call-graph/CallGraphToolbar.d.ts.map +1 -1
  181. package/dist/data/call-graph/CallGraphToolbar.js +18 -6
  182. package/dist/data/call-graph/CallGraphToolbar.js.map +1 -1
  183. package/dist/data/call-graph/call-graph-model.cjs +169 -18
  184. package/dist/data/call-graph/call-graph-model.cjs.map +1 -1
  185. package/dist/data/call-graph/call-graph-model.d.ts +40 -4
  186. package/dist/data/call-graph/call-graph-model.d.ts.map +1 -1
  187. package/dist/data/call-graph/call-graph-model.js +170 -19
  188. package/dist/data/call-graph/call-graph-model.js.map +1 -1
  189. package/dist/data/call-graph/call-graph-vocabulary.cjs +19 -1
  190. package/dist/data/call-graph/call-graph-vocabulary.cjs.map +1 -1
  191. package/dist/data/call-graph/call-graph-vocabulary.d.ts +4 -0
  192. package/dist/data/call-graph/call-graph-vocabulary.d.ts.map +1 -1
  193. package/dist/data/call-graph/call-graph-vocabulary.js +19 -1
  194. package/dist/data/call-graph/call-graph-vocabulary.js.map +1 -1
  195. package/dist/data/call-graph/call-graph.fixtures.d.ts.map +1 -1
  196. package/dist/data/call-graph/index.d.ts +2 -2
  197. package/dist/data/call-graph/index.d.ts.map +1 -1
  198. package/dist/data/call-graph/types.cjs.map +1 -1
  199. package/dist/data/call-graph/types.d.ts +7 -2
  200. package/dist/data/call-graph/types.d.ts.map +1 -1
  201. package/dist/data/call-graph/types.js.map +1 -1
  202. package/dist/data/chat/Chat.cjs +1 -1
  203. package/dist/data/chat/Chat.cjs.map +1 -1
  204. package/dist/data/chat/Chat.js +1 -1
  205. package/dist/data/chat/Chat.js.map +1 -1
  206. package/dist/data/chat/ChatRuntimeToolbar.cjs +4 -4
  207. package/dist/data/chat/ChatRuntimeToolbar.cjs.map +1 -1
  208. package/dist/data/chat/ChatRuntimeToolbar.d.ts.map +1 -1
  209. package/dist/data/chat/ChatRuntimeToolbar.js +4 -4
  210. package/dist/data/chat/ChatRuntimeToolbar.js.map +1 -1
  211. package/dist/data/chat/PromptInput.cjs +4 -2
  212. package/dist/data/chat/PromptInput.cjs.map +1 -1
  213. package/dist/data/chat/PromptInput.d.ts +5 -1
  214. package/dist/data/chat/PromptInput.d.ts.map +1 -1
  215. package/dist/data/chat/PromptInput.js +4 -2
  216. package/dist/data/chat/PromptInput.js.map +1 -1
  217. package/dist/data/data-access.cjs +8 -0
  218. package/dist/data/data-access.cjs.map +1 -0
  219. package/dist/data/data-access.d.ts +5 -0
  220. package/dist/data/data-access.d.ts.map +1 -0
  221. package/dist/data/data-access.js +8 -0
  222. package/dist/data/data-access.js.map +1 -0
  223. package/dist/data/diagnostics/ErrorDetails.cjs +13 -2
  224. package/dist/data/diagnostics/ErrorDetails.cjs.map +1 -1
  225. package/dist/data/diagnostics/ErrorDetails.d.ts +3 -1
  226. package/dist/data/diagnostics/ErrorDetails.d.ts.map +1 -1
  227. package/dist/data/diagnostics/ErrorDetails.js +14 -3
  228. package/dist/data/diagnostics/ErrorDetails.js.map +1 -1
  229. package/dist/data/diagnostics/FrameSourceWindow.cjs +3 -2
  230. package/dist/data/diagnostics/FrameSourceWindow.cjs.map +1 -1
  231. package/dist/data/diagnostics/FrameSourceWindow.d.ts.map +1 -1
  232. package/dist/data/diagnostics/FrameSourceWindow.js +3 -2
  233. package/dist/data/diagnostics/FrameSourceWindow.js.map +1 -1
  234. package/dist/data/diagnostics/error-diagnostics.cjs +5 -0
  235. package/dist/data/diagnostics/error-diagnostics.cjs.map +1 -1
  236. package/dist/data/diagnostics/error-diagnostics.d.ts +1 -0
  237. package/dist/data/diagnostics/error-diagnostics.d.ts.map +1 -1
  238. package/dist/data/diagnostics/error-diagnostics.js +6 -1
  239. package/dist/data/diagnostics/error-diagnostics.js.map +1 -1
  240. package/dist/data/git/GitChangeList.cjs +6 -2
  241. package/dist/data/git/GitChangeList.cjs.map +1 -1
  242. package/dist/data/git/GitChangeList.d.ts +6 -1
  243. package/dist/data/git/GitChangeList.d.ts.map +1 -1
  244. package/dist/data/git/GitChangeList.js +6 -2
  245. package/dist/data/git/GitChangeList.js.map +1 -1
  246. package/dist/data/graph-columns-layout.cjs +47 -16
  247. package/dist/data/graph-columns-layout.cjs.map +1 -1
  248. package/dist/data/graph-columns-layout.d.ts +34 -0
  249. package/dist/data/graph-columns-layout.d.ts.map +1 -1
  250. package/dist/data/graph-columns-layout.js +47 -16
  251. package/dist/data/graph-columns-layout.js.map +1 -1
  252. package/dist/data/graph-diagram-model.cjs +5 -0
  253. package/dist/data/graph-diagram-model.cjs.map +1 -1
  254. package/dist/data/graph-diagram-model.d.ts +19 -0
  255. package/dist/data/graph-diagram-model.d.ts.map +1 -1
  256. package/dist/data/graph-diagram-model.js +5 -0
  257. package/dist/data/graph-diagram-model.js.map +1 -1
  258. package/dist/data/graph-group-window.cjs +60 -0
  259. package/dist/data/graph-group-window.cjs.map +1 -0
  260. package/dist/data/graph-group-window.d.ts +33 -0
  261. package/dist/data/graph-group-window.d.ts.map +1 -0
  262. package/dist/data/graph-group-window.js +60 -0
  263. package/dist/data/graph-group-window.js.map +1 -0
  264. package/dist/data/har/HarPanel.cjs +3 -1
  265. package/dist/data/har/HarPanel.cjs.map +1 -1
  266. package/dist/data/har/HarPanel.d.ts +4 -1
  267. package/dist/data/har/HarPanel.d.ts.map +1 -1
  268. package/dist/data/har/HarPanel.js +3 -1
  269. package/dist/data/har/HarPanel.js.map +1 -1
  270. package/dist/data/test-runner/Expectation.cjs +57 -0
  271. package/dist/data/test-runner/Expectation.cjs.map +1 -0
  272. package/dist/data/test-runner/Expectation.d.ts +19 -0
  273. package/dist/data/test-runner/Expectation.d.ts.map +1 -0
  274. package/dist/data/test-runner/Expectation.js +57 -0
  275. package/dist/data/test-runner/Expectation.js.map +1 -0
  276. package/dist/data/test-runner/MarkIcons.cjs +38 -0
  277. package/dist/data/test-runner/MarkIcons.cjs.map +1 -0
  278. package/dist/data/test-runner/MarkIcons.d.ts +15 -0
  279. package/dist/data/test-runner/MarkIcons.d.ts.map +1 -0
  280. package/dist/data/test-runner/MarkIcons.js +38 -0
  281. package/dist/data/test-runner/MarkIcons.js.map +1 -0
  282. package/dist/data/test-runner/TestDetailPanel.cjs +74 -42
  283. package/dist/data/test-runner/TestDetailPanel.cjs.map +1 -1
  284. package/dist/data/test-runner/TestDetailPanel.d.ts.map +1 -1
  285. package/dist/data/test-runner/TestDetailPanel.js +76 -44
  286. package/dist/data/test-runner/TestDetailPanel.js.map +1 -1
  287. package/dist/data/test-runner/TestFailureDetail.cjs +23 -27
  288. package/dist/data/test-runner/TestFailureDetail.cjs.map +1 -1
  289. package/dist/data/test-runner/TestFailureDetail.d.ts +2 -2
  290. package/dist/data/test-runner/TestFailureDetail.d.ts.map +1 -1
  291. package/dist/data/test-runner/TestFailureDetail.js +23 -27
  292. package/dist/data/test-runner/TestFailureDetail.js.map +1 -1
  293. package/dist/data/test-runner/TestFilterBar.cjs +87 -93
  294. package/dist/data/test-runner/TestFilterBar.cjs.map +1 -1
  295. package/dist/data/test-runner/TestFilterBar.d.ts +3 -2
  296. package/dist/data/test-runner/TestFilterBar.d.ts.map +1 -1
  297. package/dist/data/test-runner/TestFilterBar.js +89 -95
  298. package/dist/data/test-runner/TestFilterBar.js.map +1 -1
  299. package/dist/data/test-runner/TestRunSummary.cjs +35 -21
  300. package/dist/data/test-runner/TestRunSummary.cjs.map +1 -1
  301. package/dist/data/test-runner/TestRunSummary.d.ts.map +1 -1
  302. package/dist/data/test-runner/TestRunSummary.js +35 -21
  303. package/dist/data/test-runner/TestRunSummary.js.map +1 -1
  304. package/dist/data/test-runner/TestRunner.cjs +52 -30
  305. package/dist/data/test-runner/TestRunner.cjs.map +1 -1
  306. package/dist/data/test-runner/TestRunner.d.ts +3 -2
  307. package/dist/data/test-runner/TestRunner.d.ts.map +1 -1
  308. package/dist/data/test-runner/TestRunner.js +52 -30
  309. package/dist/data/test-runner/TestRunner.js.map +1 -1
  310. package/dist/data/test-runner/TestTree.cjs +5 -2
  311. package/dist/data/test-runner/TestTree.cjs.map +1 -1
  312. package/dist/data/test-runner/TestTree.d.ts +5 -2
  313. package/dist/data/test-runner/TestTree.d.ts.map +1 -1
  314. package/dist/data/test-runner/TestTree.js +5 -2
  315. package/dist/data/test-runner/TestTree.js.map +1 -1
  316. package/dist/data/test-runner/TestTreeNode.cjs +27 -19
  317. package/dist/data/test-runner/TestTreeNode.cjs.map +1 -1
  318. package/dist/data/test-runner/TestTreeNode.d.ts.map +1 -1
  319. package/dist/data/test-runner/TestTreeNode.js +28 -20
  320. package/dist/data/test-runner/TestTreeNode.js.map +1 -1
  321. package/dist/data/test-runner/adapter.cjs +11 -0
  322. package/dist/data/test-runner/adapter.cjs.map +1 -1
  323. package/dist/data/test-runner/adapter.d.ts +18 -7
  324. package/dist/data/test-runner/adapter.d.ts.map +1 -1
  325. package/dist/data/test-runner/adapter.js +11 -0
  326. package/dist/data/test-runner/adapter.js.map +1 -1
  327. package/dist/data/test-runner/copy.cjs +114 -0
  328. package/dist/data/test-runner/copy.cjs.map +1 -0
  329. package/dist/data/test-runner/copy.d.ts +47 -0
  330. package/dist/data/test-runner/copy.d.ts.map +1 -0
  331. package/dist/data/test-runner/copy.js +114 -0
  332. package/dist/data/test-runner/copy.js.map +1 -0
  333. package/dist/data/test-runner/index.d.ts +5 -2
  334. package/dist/data/test-runner/index.d.ts.map +1 -1
  335. package/dist/data/test-runner/marks.cjs +143 -0
  336. package/dist/data/test-runner/marks.cjs.map +1 -0
  337. package/dist/data/test-runner/marks.d.ts +30 -0
  338. package/dist/data/test-runner/marks.d.ts.map +1 -0
  339. package/dist/data/test-runner/marks.js +143 -0
  340. package/dist/data/test-runner/marks.js.map +1 -0
  341. package/dist/data/test-runner/status.cjs +27 -44
  342. package/dist/data/test-runner/status.cjs.map +1 -1
  343. package/dist/data/test-runner/status.d.ts +12 -3
  344. package/dist/data/test-runner/status.d.ts.map +1 -1
  345. package/dist/data/test-runner/status.js +27 -44
  346. package/dist/data/test-runner/status.js.map +1 -1
  347. package/dist/data/use-group-windows.cjs +50 -0
  348. package/dist/data/use-group-windows.cjs.map +1 -0
  349. package/dist/data/use-group-windows.d.ts +27 -0
  350. package/dist/data/use-group-windows.d.ts.map +1 -0
  351. package/dist/data/use-group-windows.js +50 -0
  352. package/dist/data/use-group-windows.js.map +1 -0
  353. package/dist/data/verification/adapterViews.cjs +16 -41
  354. package/dist/data/verification/adapterViews.cjs.map +1 -1
  355. package/dist/data/verification/adapterViews.d.ts.map +1 -1
  356. package/dist/data/verification/adapterViews.js +16 -41
  357. package/dist/data/verification/adapterViews.js.map +1 -1
  358. package/dist/data/verification/adapters.cjs +115 -3
  359. package/dist/data/verification/adapters.cjs.map +1 -1
  360. package/dist/data/verification/adapters.d.ts.map +1 -1
  361. package/dist/data/verification/adapters.js +115 -3
  362. package/dist/data/verification/adapters.js.map +1 -1
  363. package/dist/data/verification/verifyReportTests.cjs.map +1 -1
  364. package/dist/data/verification/verifyReportTests.js.map +1 -1
  365. package/dist/data/version-info.cjs +3 -3
  366. package/dist/data/version-info.js +3 -3
  367. package/dist/data.cjs +54 -3
  368. package/dist/data.cjs.map +1 -1
  369. package/dist/data.d.ts +6 -2
  370. package/dist/data.d.ts.map +1 -1
  371. package/dist/data.js +58 -7
  372. package/dist/data.js.map +1 -1
  373. package/dist/hooks/event-hub.cjs +229 -0
  374. package/dist/hooks/event-hub.cjs.map +1 -0
  375. package/dist/hooks/event-hub.d.ts +26 -0
  376. package/dist/hooks/event-hub.d.ts.map +1 -0
  377. package/dist/hooks/event-hub.js +229 -0
  378. package/dist/hooks/event-hub.js.map +1 -0
  379. package/dist/hooks.cjs +2 -0
  380. package/dist/hooks.cjs.map +1 -1
  381. package/dist/hooks.d.ts +1 -0
  382. package/dist/hooks.d.ts.map +1 -1
  383. package/dist/hooks.js +2 -0
  384. package/dist/hooks.js.map +1 -1
  385. package/dist/icons/components/UiLogoEslint.cjs +10 -0
  386. package/dist/icons/components/UiLogoEslint.cjs.map +1 -0
  387. package/dist/icons/components/UiLogoEslint.d.ts +9 -0
  388. package/dist/icons/components/UiLogoEslint.d.ts.map +1 -0
  389. package/dist/icons/components/UiLogoEslint.js +10 -0
  390. package/dist/icons/components/UiLogoEslint.js.map +1 -0
  391. package/dist/icons/components/UiLogoGo.cjs +10 -0
  392. package/dist/icons/components/UiLogoGo.cjs.map +1 -0
  393. package/dist/icons/components/UiLogoGo.d.ts +9 -0
  394. package/dist/icons/components/UiLogoGo.d.ts.map +1 -0
  395. package/dist/icons/components/UiLogoGo.js +10 -0
  396. package/dist/icons/components/UiLogoGo.js.map +1 -0
  397. package/dist/icons/components/UiLogoJest.cjs +10 -0
  398. package/dist/icons/components/UiLogoJest.cjs.map +1 -0
  399. package/dist/icons/components/UiLogoJest.d.ts +9 -0
  400. package/dist/icons/components/UiLogoJest.d.ts.map +1 -0
  401. package/dist/icons/components/UiLogoJest.js +10 -0
  402. package/dist/icons/components/UiLogoJest.js.map +1 -0
  403. package/dist/icons/components/UiLogoMarkdown.cjs +10 -0
  404. package/dist/icons/components/UiLogoMarkdown.cjs.map +1 -0
  405. package/dist/icons/components/UiLogoMarkdown.d.ts +9 -0
  406. package/dist/icons/components/UiLogoMarkdown.d.ts.map +1 -0
  407. package/dist/icons/components/UiLogoMarkdown.js +10 -0
  408. package/dist/icons/components/UiLogoMarkdown.js.map +1 -0
  409. package/dist/icons/components/UiLogoOxc.cjs +10 -0
  410. package/dist/icons/components/UiLogoOxc.cjs.map +1 -0
  411. package/dist/icons/components/UiLogoOxc.d.ts +9 -0
  412. package/dist/icons/components/UiLogoOxc.d.ts.map +1 -0
  413. package/dist/icons/components/UiLogoOxc.js +10 -0
  414. package/dist/icons/components/UiLogoOxc.js.map +1 -0
  415. package/dist/icons/components/UiLogoPlaywright.cjs +10 -0
  416. package/dist/icons/components/UiLogoPlaywright.cjs.map +1 -0
  417. package/dist/icons/components/UiLogoPlaywright.d.ts +9 -0
  418. package/dist/icons/components/UiLogoPlaywright.d.ts.map +1 -0
  419. package/dist/icons/components/UiLogoPlaywright.js +10 -0
  420. package/dist/icons/components/UiLogoPlaywright.js.map +1 -0
  421. package/dist/icons/components/UiLogoPython.cjs +10 -0
  422. package/dist/icons/components/UiLogoPython.cjs.map +1 -0
  423. package/dist/icons/components/UiLogoPython.d.ts +9 -0
  424. package/dist/icons/components/UiLogoPython.d.ts.map +1 -0
  425. package/dist/icons/components/UiLogoPython.js +10 -0
  426. package/dist/icons/components/UiLogoPython.js.map +1 -0
  427. package/dist/icons/components/UiLogoReact.cjs +10 -0
  428. package/dist/icons/components/UiLogoReact.cjs.map +1 -0
  429. package/dist/icons/components/UiLogoReact.d.ts +9 -0
  430. package/dist/icons/components/UiLogoReact.d.ts.map +1 -0
  431. package/dist/icons/components/UiLogoReact.js +10 -0
  432. package/dist/icons/components/UiLogoReact.js.map +1 -0
  433. package/dist/icons/components/UiLogoRuff.cjs +10 -0
  434. package/dist/icons/components/UiLogoRuff.cjs.map +1 -0
  435. package/dist/icons/components/UiLogoRuff.d.ts +9 -0
  436. package/dist/icons/components/UiLogoRuff.d.ts.map +1 -0
  437. package/dist/icons/components/UiLogoRuff.js +10 -0
  438. package/dist/icons/components/UiLogoRuff.js.map +1 -0
  439. package/dist/icons/components/UiLogoTypescript.cjs +10 -0
  440. package/dist/icons/components/UiLogoTypescript.cjs.map +1 -0
  441. package/dist/icons/components/UiLogoTypescript.d.ts +9 -0
  442. package/dist/icons/components/UiLogoTypescript.d.ts.map +1 -0
  443. package/dist/icons/components/UiLogoTypescript.js +10 -0
  444. package/dist/icons/components/UiLogoTypescript.js.map +1 -0
  445. package/dist/icons/components/UiLogoVitest.cjs +10 -0
  446. package/dist/icons/components/UiLogoVitest.cjs.map +1 -0
  447. package/dist/icons/components/UiLogoVitest.d.ts +9 -0
  448. package/dist/icons/components/UiLogoVitest.d.ts.map +1 -0
  449. package/dist/icons/components/UiLogoVitest.js +10 -0
  450. package/dist/icons/components/UiLogoVitest.js.map +1 -0
  451. package/dist/icons/index.d.ts +11 -0
  452. package/dist/icons/index.d.ts.map +1 -1
  453. package/dist/icons/registry.cjs +22 -0
  454. package/dist/icons/registry.cjs.map +1 -1
  455. package/dist/icons/registry.d.ts.map +1 -1
  456. package/dist/icons/registry.js +22 -0
  457. package/dist/icons/registry.js.map +1 -1
  458. package/dist/icons.cjs +22 -0
  459. package/dist/icons.cjs.map +1 -1
  460. package/dist/icons.js +22 -0
  461. package/dist/icons.js.map +1 -1
  462. package/dist/index.cjs +56 -3
  463. package/dist/index.cjs.map +1 -1
  464. package/dist/index.js +60 -7
  465. package/dist/index.js.map +1 -1
  466. package/dist/overlay/DropdownMenuSubmenu.cjs +4 -4
  467. package/dist/overlay/DropdownMenuSubmenu.cjs.map +1 -1
  468. package/dist/overlay/DropdownMenuSubmenu.js +4 -4
  469. package/dist/overlay/DropdownMenuSubmenu.js.map +1 -1
  470. package/dist/overlay/modalStack.cjs +13 -6
  471. package/dist/overlay/modalStack.cjs.map +1 -1
  472. package/dist/overlay/modalStack.d.ts.map +1 -1
  473. package/dist/overlay/modalStack.js +13 -6
  474. package/dist/overlay/modalStack.js.map +1 -1
  475. package/dist/rpc/InlineError.cjs +12 -43
  476. package/dist/rpc/InlineError.cjs.map +1 -1
  477. package/dist/rpc/InlineError.d.ts.map +1 -1
  478. package/dist/rpc/InlineError.js +13 -44
  479. package/dist/rpc/InlineError.js.map +1 -1
  480. package/dist/rpc/OperationScheduleDialog.cjs +63 -10
  481. package/dist/rpc/OperationScheduleDialog.cjs.map +1 -1
  482. package/dist/rpc/OperationScheduleDialog.d.ts +4 -0
  483. package/dist/rpc/OperationScheduleDialog.d.ts.map +1 -1
  484. package/dist/rpc/OperationScheduleDialog.js +63 -10
  485. package/dist/rpc/OperationScheduleDialog.js.map +1 -1
  486. package/dist/rpc/OperationSchedules.cjs +12 -2
  487. package/dist/rpc/OperationSchedules.cjs.map +1 -1
  488. package/dist/rpc/OperationSchedules.d.ts.map +1 -1
  489. package/dist/rpc/OperationSchedules.js +12 -2
  490. package/dist/rpc/OperationSchedules.js.map +1 -1
  491. package/dist/rpc/operation-schedule-model.cjs +2 -0
  492. package/dist/rpc/operation-schedule-model.cjs.map +1 -1
  493. package/dist/rpc/operation-schedule-model.d.ts.map +1 -1
  494. package/dist/rpc/operation-schedule-model.js +2 -0
  495. package/dist/rpc/operation-schedule-model.js.map +1 -1
  496. package/dist/rpc/operation-schedule-types.d.ts +7 -1
  497. package/dist/rpc/operation-schedule-types.d.ts.map +1 -1
  498. package/dist/styles.css +1 -1
  499. package/package.json +1 -1
  500. package/dist/data/test-runner/frameworkIcon.cjs +0 -27
  501. package/dist/data/test-runner/frameworkIcon.cjs.map +0 -1
  502. package/dist/data/test-runner/frameworkIcon.d.ts +0 -3
  503. package/dist/data/test-runner/frameworkIcon.d.ts.map +0 -1
  504. package/dist/data/test-runner/frameworkIcon.js +0 -27
  505. package/dist/data/test-runner/frameworkIcon.js.map +0 -1
@@ -0,0 +1,114 @@
1
+ import { formatTestDuration, outcomeFor } from "./status.js";
2
+ const OUTPUT_TITLES = /* @__PURE__ */ new Set(["stdout", "stderr"]);
3
+ function fact(label, value) {
4
+ return value ? [{ label, value }] : [];
5
+ }
6
+ function section(title, body, lang) {
7
+ if (!body) return [];
8
+ return [lang ? { title, lang, body } : { title, body }];
9
+ }
10
+ function nodeLocation(node) {
11
+ if (!node.file) return void 0;
12
+ return node.line ? `${node.file}:${node.line}` : node.file;
13
+ }
14
+ function errorBody(node) {
15
+ var _a;
16
+ const summary = (_a = node.failure_detail) == null ? void 0 : _a.summary;
17
+ const lines = [node.message, summary !== node.message ? summary : void 0];
18
+ return lines.filter(Boolean).join("\n");
19
+ }
20
+ function expectationBody(node) {
21
+ const failure = node.failure_detail;
22
+ if (!failure) return "";
23
+ return [
24
+ failure.matcher && `matcher: ${failure.matcher}`,
25
+ failure.expected && `expected: ${failure.expected}`,
26
+ failure.actual && `actual: ${failure.actual}`,
27
+ failure.location && `at: ${failure.location}`
28
+ ].filter(Boolean).join("\n");
29
+ }
30
+ function genericCopySections(node) {
31
+ var _a;
32
+ const duration = node.duration ? formatTestDuration(node.duration) : void 0;
33
+ return {
34
+ facts: [
35
+ ...fact("Result", outcomeFor(node) ?? void 0),
36
+ ...fact("Tool", node.framework),
37
+ ...fact("Location", nodeLocation(node)),
38
+ ...fact("Duration", duration)
39
+ ],
40
+ brief: [
41
+ ...section("Error", errorBody(node)),
42
+ ...section("Expectation", expectationBody(node)),
43
+ ...section("Stack", (_a = node.failure_detail) == null ? void 0 : _a.stack),
44
+ ...section("stdout", node.stdout),
45
+ ...section("stderr", node.stderr)
46
+ ],
47
+ items: []
48
+ };
49
+ }
50
+ function uniqueBy(values, key) {
51
+ const seen = /* @__PURE__ */ new Set();
52
+ return values.filter((value) => {
53
+ const k = key(value);
54
+ if (seen.has(k)) return false;
55
+ seen.add(k);
56
+ return true;
57
+ });
58
+ }
59
+ function mergeCopySections(parts) {
60
+ return {
61
+ facts: uniqueBy(
62
+ parts.flatMap((p) => p.facts ?? []),
63
+ (f) => f.label
64
+ ),
65
+ brief: uniqueBy(
66
+ parts.flatMap((p) => p.brief ?? []),
67
+ (s) => s.title
68
+ ),
69
+ items: uniqueBy(
70
+ parts.flatMap((p) => p.items ?? []),
71
+ (i) => i.label
72
+ )
73
+ };
74
+ }
75
+ function fence(body) {
76
+ const longest = Math.max(0, ...(body.match(/`+/g) ?? []).map((run) => run.length));
77
+ return "`".repeat(Math.max(3, longest + 1));
78
+ }
79
+ function buildBrief(node, sections, facts) {
80
+ const lines = [`# ${node.name}`];
81
+ if (facts.length > 0) lines.push("", ...facts.map((f) => `- **${f.label}:** ${f.value}`));
82
+ for (const s of sections) {
83
+ if (!s.body) continue;
84
+ lines.push("", `## ${s.title}`, "");
85
+ if (s.markdown) {
86
+ lines.push(s.body);
87
+ continue;
88
+ }
89
+ const marker = fence(s.body);
90
+ lines.push(`${marker}${s.lang ?? ""}`, s.body, marker);
91
+ }
92
+ return lines.join("\n");
93
+ }
94
+ function buildNodeBrief(node, adapter) {
95
+ const generic = genericCopySections(node);
96
+ const merged = mergeCopySections([
97
+ { facts: generic.facts, brief: generic.brief.filter((s) => !OUTPUT_TITLES.has(s.title)) },
98
+ adapter,
99
+ { brief: generic.brief.filter((s) => OUTPUT_TITLES.has(s.title)) }
100
+ ]);
101
+ return buildBrief(node, merged.brief, merged.facts);
102
+ }
103
+ function buildNodeJson(node) {
104
+ const { children: _children, ...rest } = node;
105
+ return JSON.stringify(rest, null, 2);
106
+ }
107
+ export {
108
+ buildBrief,
109
+ buildNodeBrief,
110
+ buildNodeJson,
111
+ genericCopySections,
112
+ mergeCopySections
113
+ };
114
+ //# sourceMappingURL=copy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"copy.js","sources":["../../../src/data/test-runner/copy.ts"],"sourcesContent":["// Clipboard payloads for the detail header's \"Copy details\" split button. The\n// primary payload is a Markdown brief: a `# name` heading, `- **Label:** value`\n// facts, then one fenced `## Title` section per piece of evidence. The generic\n// sections here read only common `Test` fields; node adapters contribute the\n// domain sections (a command, a CEL assertion, a recording) and extra menu items\n// through `TestNodeAdapter.copy`. Pure — no React, no clipboard — so every\n// payload is unit-testable as a string.\n\nimport type { StaticIconComponent } from \"../Icon\";\nimport type { Test } from \"./types\";\nimport { formatTestDuration, outcomeFor } from \"./status\";\n\n/** One `- **label:** value` line under the brief's heading. */\nexport type BriefFact = { label: string; value: string };\n\n/**\n * One `## title` block of the brief: fenced (tagged with `lang`) by default, or\n * inserted as-is when `markdown` — for lists and links that must stay live.\n */\nexport type BriefSection = { title: string; lang?: string; markdown?: boolean; body: string };\n\ntype CopyItemBase = { label: string; icon?: StaticIconComponent | string };\n\n/** A copy menu item: the text it copies, or why there is nothing to copy. */\nexport type CopyItem = (CopyItemBase & { value: string }) | (CopyItemBase & { reason: string });\n\nexport type CopySections = {\n facts?: BriefFact[];\n brief?: BriefSection[];\n items?: CopyItem[];\n};\n\n/** Generic sections rendered after every adapter section, so evidence reads before raw output. */\nconst OUTPUT_TITLES = new Set([\"stdout\", \"stderr\"]);\n\nfunction fact(label: string, value: string | undefined): BriefFact[] {\n return value ? [{ label, value }] : [];\n}\n\nfunction section(title: string, body: string | undefined, lang?: string): BriefSection[] {\n if (!body) return [];\n return [lang ? { title, lang, body } : { title, body }];\n}\n\nfunction nodeLocation(node: Test): string | undefined {\n if (!node.file) return undefined;\n return node.line ? `${node.file}:${node.line}` : node.file;\n}\n\nfunction errorBody(node: Test): string {\n const summary = node.failure_detail?.summary;\n const lines = [node.message, summary !== node.message ? summary : undefined];\n return lines.filter(Boolean).join(\"\\n\");\n}\n\nfunction expectationBody(node: Test): string {\n const failure = node.failure_detail;\n if (!failure) return \"\";\n return [\n failure.matcher && `matcher: ${failure.matcher}`,\n failure.expected && `expected: ${failure.expected}`,\n failure.actual && `actual: ${failure.actual}`,\n failure.location && `at: ${failure.location}`,\n ]\n .filter(Boolean)\n .join(\"\\n\");\n}\n\n/** Sections every node gets, read from the common `Test` fields only. */\nexport function genericCopySections(node: Test): Required<CopySections> {\n const duration = node.duration ? formatTestDuration(node.duration) : undefined;\n return {\n facts: [\n ...fact(\"Result\", outcomeFor(node) ?? undefined),\n ...fact(\"Tool\", node.framework),\n ...fact(\"Location\", nodeLocation(node)),\n ...fact(\"Duration\", duration),\n ],\n brief: [\n ...section(\"Error\", errorBody(node)),\n ...section(\"Expectation\", expectationBody(node)),\n ...section(\"Stack\", node.failure_detail?.stack),\n ...section(\"stdout\", node.stdout),\n ...section(\"stderr\", node.stderr),\n ],\n items: [],\n };\n}\n\nfunction uniqueBy<T>(values: T[], key: (value: T) => string): T[] {\n const seen = new Set<string>();\n return values.filter((value) => {\n const k = key(value);\n if (seen.has(k)) return false;\n seen.add(k);\n return true;\n });\n}\n\n/** Concatenates sections in order, keeping the first fact/section/item per label or title. */\nexport function mergeCopySections(parts: CopySections[]): Required<CopySections> {\n return {\n facts: uniqueBy(\n parts.flatMap((p) => p.facts ?? []),\n (f) => f.label,\n ),\n brief: uniqueBy(\n parts.flatMap((p) => p.brief ?? []),\n (s) => s.title,\n ),\n items: uniqueBy(\n parts.flatMap((p) => p.items ?? []),\n (i) => i.label,\n ),\n };\n}\n\n// A fence one backtick longer than any run in the body, so captured output that\n// itself contains ``` cannot close the block early (CommonMark).\nfunction fence(body: string): string {\n const longest = Math.max(0, ...(body.match(/`+/g) ?? []).map((run) => run.length));\n return \"`\".repeat(Math.max(3, longest + 1));\n}\n\n/** The Markdown brief: `# name`, the facts as bullets, then each non-empty section (fenced unless `markdown`). */\nexport function buildBrief(node: Test, sections: BriefSection[], facts: BriefFact[]): string {\n const lines = [`# ${node.name}`];\n if (facts.length > 0) lines.push(\"\", ...facts.map((f) => `- **${f.label}:** ${f.value}`));\n for (const s of sections) {\n if (!s.body) continue;\n lines.push(\"\", `## ${s.title}`, \"\");\n if (s.markdown) {\n lines.push(s.body);\n continue;\n }\n const marker = fence(s.body);\n lines.push(`${marker}${s.lang ?? \"\"}`, s.body, marker);\n }\n return lines.join(\"\\n\");\n}\n\n/**\n * The primary \"Copy details\" payload: generic facts and error/expectation\n * sections, then the adapters' sections, then the captured stdout/stderr.\n */\nexport function buildNodeBrief(node: Test, adapter: CopySections): string {\n const generic = genericCopySections(node);\n const merged = mergeCopySections([\n { facts: generic.facts, brief: generic.brief.filter((s) => !OUTPUT_TITLES.has(s.title)) },\n adapter,\n { brief: generic.brief.filter((s) => OUTPUT_TITLES.has(s.title)) },\n ]);\n return buildBrief(node, merged.brief, merged.facts);\n}\n\n/** \"Copy as JSON\": the node without its children subtree, 2-space indented. */\nexport function buildNodeJson(node: Test): string {\n const { children: _children, ...rest } = node;\n return JSON.stringify(rest, null, 2);\n}\n"],"names":[],"mappings":"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"}
@@ -3,12 +3,15 @@ export { TestTree } from './TestTree.js';
3
3
  export { TestTreeNode } from './TestTreeNode.js';
4
4
  export { TestDetailPanel } from './TestDetailPanel.js';
5
5
  export { TestFailureDetail, TestOutput, TestAttempts, } from './TestFailureDetail.js';
6
+ export { Expectation, type ExpectationProps } from './Expectation.js';
6
7
  export { TestRunSummary, type TestRunSummaryProps } from './TestRunSummary.js';
7
8
  export { TestFilterBar, type TestFilterBarProps } from './TestFilterBar.js';
8
9
  export { TestRunnerProvider, useTestRunner, type TestRunnerContext, } from './context.js';
9
10
  export { TestNodeAdapterRegistry, createTestRunnerRegistry, type TestNodeAdapter, type AdapterContext, type DetailTab, } from './adapter.js';
10
- export { type StatusCounts, type TestStatus, sum, sumNonTaskTests, aggregateStatusCounts, STATUS_LABELS, hasFailed, hasPending, testStatus, totalDuration, statusIconFor, statusToneFor, formatTestDuration, formatCount, humanizeName, collectFrameworks, collapseSingleChildChains, filterTests, } from './status.js';
11
- export { frameworkIcon } from './frameworkIcon.js';
11
+ export { genericCopySections, mergeCopySections, buildBrief, buildNodeBrief, buildNodeJson, type BriefFact, type BriefSection, type CopyItem, type CopySections, } from './copy.js';
12
+ export { type StatusCounts, type TestStatus, sum, sumNonTaskTests, aggregateStatusCounts, STATUS_LABELS, hasFailed, hasPending, testStatus, totalDuration, outcomeFor, type TestOutcome, statusToneFor, formatTestDuration, formatCount, humanizeName, collectFrameworks, collapseSingleChildChains, filterTests, } from './status.js';
13
+ export { TEST_OUTCOMES, LINT_SEVERITIES, TEST_TOOLS, toolMark, type ResultMark, type LintSeverity, type ToolKind, type ToolMark, } from './marks.js';
14
+ export { OutcomeIcon, LintSeverityIcon, ToolIcon } from './MarkIcons.js';
12
15
  export { slugify, annotateRoutePaths, findNodeByRoutePath } from './routePath.js';
13
16
  export { type FilterMode, type FilterState, type TestFilters, emptyTestFilters, decodeFilterState, encodeFilterState, cycleFilterState, matchesFilterState, filterStateToRecord, recordToFilterState, } from './filterState.js';
14
17
  export type { Test, TestSummary, TestAttempt, FailureDetail, FailureKind, GoTestContext, GinkgoContext, FixtureContext, TaskContext, RunMeta, Snapshot, SnapshotGit, SnapshotStatus, } from './types.js';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/data/test-runner/index.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,UAAU,EAAE,KAAK,eAAe,EAAE,MAAM,cAAc,CAAC;AAChE,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EACL,iBAAiB,EACjB,UAAU,EACV,YAAY,GACb,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,cAAc,EAAE,KAAK,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAC5E,OAAO,EAAE,aAAa,EAAE,KAAK,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AAEzE,OAAO,EACL,kBAAkB,EAClB,aAAa,EACb,KAAK,iBAAiB,GACvB,MAAM,WAAW,CAAC;AAEnB,OAAO,EACL,uBAAuB,EACvB,wBAAwB,EACxB,KAAK,eAAe,EACpB,KAAK,cAAc,EACnB,KAAK,SAAS,GACf,MAAM,WAAW,CAAC;AAEnB,OAAO,EACL,KAAK,YAAY,EACjB,KAAK,UAAU,EACf,GAAG,EACH,eAAe,EACf,qBAAqB,EACrB,aAAa,EACb,SAAS,EACT,UAAU,EACV,UAAU,EACV,aAAa,EACb,aAAa,EACb,aAAa,EACb,kBAAkB,EAClB,WAAW,EACX,YAAY,EACZ,iBAAiB,EACjB,yBAAyB,EACzB,WAAW,GACZ,MAAM,UAAU,CAAC;AAElB,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAEhD,OAAO,EAAE,OAAO,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAE/E,OAAO,EACL,KAAK,UAAU,EACf,KAAK,WAAW,EAChB,KAAK,WAAW,EAChB,gBAAgB,EAChB,iBAAiB,EACjB,iBAAiB,EACjB,gBAAgB,EAChB,kBAAkB,EAClB,mBAAmB,EACnB,mBAAmB,GACpB,MAAM,eAAe,CAAC;AAEvB,YAAY,EACV,IAAI,EACJ,WAAW,EACX,WAAW,EACX,aAAa,EACb,WAAW,EACX,aAAa,EACb,aAAa,EACb,cAAc,EACd,WAAW,EACX,OAAO,EACP,QAAQ,EACR,WAAW,EACX,cAAc,GACf,MAAM,SAAS,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/data/test-runner/index.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,UAAU,EAAE,KAAK,eAAe,EAAE,MAAM,cAAc,CAAC;AAChE,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EACL,iBAAiB,EACjB,UAAU,EACV,YAAY,GACb,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,WAAW,EAAE,KAAK,gBAAgB,EAAE,MAAM,eAAe,CAAC;AACnE,OAAO,EAAE,cAAc,EAAE,KAAK,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAC5E,OAAO,EAAE,aAAa,EAAE,KAAK,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AAEzE,OAAO,EACL,kBAAkB,EAClB,aAAa,EACb,KAAK,iBAAiB,GACvB,MAAM,WAAW,CAAC;AAEnB,OAAO,EACL,uBAAuB,EACvB,wBAAwB,EACxB,KAAK,eAAe,EACpB,KAAK,cAAc,EACnB,KAAK,SAAS,GACf,MAAM,WAAW,CAAC;AAEnB,OAAO,EACL,mBAAmB,EACnB,iBAAiB,EACjB,UAAU,EACV,cAAc,EACd,aAAa,EACb,KAAK,SAAS,EACd,KAAK,YAAY,EACjB,KAAK,QAAQ,EACb,KAAK,YAAY,GAClB,MAAM,QAAQ,CAAC;AAEhB,OAAO,EACL,KAAK,YAAY,EACjB,KAAK,UAAU,EACf,GAAG,EACH,eAAe,EACf,qBAAqB,EACrB,aAAa,EACb,SAAS,EACT,UAAU,EACV,UAAU,EACV,aAAa,EACb,UAAU,EACV,KAAK,WAAW,EAChB,aAAa,EACb,kBAAkB,EAClB,WAAW,EACX,YAAY,EACZ,iBAAiB,EACjB,yBAAyB,EACzB,WAAW,GACZ,MAAM,UAAU,CAAC;AAElB,OAAO,EACL,aAAa,EACb,eAAe,EACf,UAAU,EACV,QAAQ,EACR,KAAK,UAAU,EACf,KAAK,YAAY,EACjB,KAAK,QAAQ,EACb,KAAK,QAAQ,GACd,MAAM,SAAS,CAAC;AACjB,OAAO,EAAE,WAAW,EAAE,gBAAgB,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAEtE,OAAO,EAAE,OAAO,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAE/E,OAAO,EACL,KAAK,UAAU,EACf,KAAK,WAAW,EAChB,KAAK,WAAW,EAChB,gBAAgB,EAChB,iBAAiB,EACjB,iBAAiB,EACjB,gBAAgB,EAChB,kBAAkB,EAClB,mBAAmB,EACnB,mBAAmB,GACpB,MAAM,eAAe,CAAC;AAEvB,YAAY,EACV,IAAI,EACJ,WAAW,EACX,WAAW,EACX,aAAa,EACb,WAAW,EACX,aAAa,EACb,aAAa,EACb,cAAc,EACd,WAAW,EACX,OAAO,EACP,QAAQ,EACR,WAAW,EACX,cAAc,GACf,MAAM,SAAS,CAAC"}
@@ -0,0 +1,143 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
+ const status = require("./status.cjs");
4
+ const UiInfo = require("../../icons/components/UiInfo.cjs");
5
+ const UiWarningTriangle = require("../../icons/components/UiWarningTriangle.cjs");
6
+ const UiCircleX = require("../../icons/components/UiCircleX.cjs");
7
+ const UiLoader = require("../../icons/components/UiLoader.cjs");
8
+ const UiCircleOutline = require("../../icons/components/UiCircleOutline.cjs");
9
+ const UiSkipForward = require("../../icons/components/UiSkipForward.cjs");
10
+ const UiPass = require("../../icons/components/UiPass.cjs");
11
+ const UiTimer = require("../../icons/components/UiTimer.cjs");
12
+ const UiProhibit = require("../../icons/components/UiProhibit.cjs");
13
+ const UiLogoReact = require("../../icons/components/UiLogoReact.cjs");
14
+ const UiCopy = require("../../icons/components/UiCopy.cjs");
15
+ const UiKey = require("../../icons/components/UiKey.cjs");
16
+ const UiLogoRuff = require("../../icons/components/UiLogoRuff.cjs");
17
+ const UiLogoPython = require("../../icons/components/UiLogoPython.cjs");
18
+ const UiLogoMarkdown = require("../../icons/components/UiLogoMarkdown.cjs");
19
+ const UiLogoTypescript = require("../../icons/components/UiLogoTypescript.cjs");
20
+ const UiLogoOxc = require("../../icons/components/UiLogoOxc.cjs");
21
+ const UiLogoEslint = require("../../icons/components/UiLogoEslint.cjs");
22
+ const UiLogoGo = require("../../icons/components/UiLogoGo.cjs");
23
+ const UiSealCheck = require("../../icons/components/UiSealCheck.cjs");
24
+ const UiDatabase = require("../../icons/components/UiDatabase.cjs");
25
+ const UiSparkles = require("../../icons/components/UiSparkles.cjs");
26
+ const UiListChecks = require("../../icons/components/UiListChecks.cjs");
27
+ const UiBeaker = require("../../icons/components/UiBeaker.cjs");
28
+ const UiTerminal = require("../../icons/components/UiTerminal.cjs");
29
+ const UiLogoPlaywright = require("../../icons/components/UiLogoPlaywright.cjs");
30
+ const UiLogoJest = require("../../icons/components/UiLogoJest.cjs");
31
+ const UiLogoVitest = require("../../icons/components/UiLogoVitest.cjs");
32
+ const LABEL = Object.fromEntries(status.STATUS_LABELS.map((s) => [s.key, s.label]));
33
+ const RED = "text-red-600 dark:text-red-400";
34
+ const AMBER = "text-amber-600 dark:text-amber-400";
35
+ const TEST_OUTCOMES = {
36
+ failed: { icon: UiCircleX.UiCircleX, label: LABEL.failed, className: RED },
37
+ errored: { icon: UiProhibit.UiProhibit, label: "Could not run", className: RED },
38
+ timedout: { icon: UiTimer.UiTimer, label: LABEL.timedout, className: AMBER },
39
+ warned: { icon: UiWarningTriangle.UiWarningTriangle, label: LABEL.warned, className: AMBER },
40
+ passed: {
41
+ icon: UiPass.UiPass,
42
+ label: LABEL.passed,
43
+ className: "text-emerald-600 dark:text-emerald-400"
44
+ },
45
+ skipped: { icon: UiSkipForward.UiSkipForward, label: LABEL.skipped, className: "text-slate-500" },
46
+ pending: {
47
+ icon: UiCircleOutline.UiCircleOutline,
48
+ label: LABEL.pending,
49
+ className: "text-slate-400 dark:text-slate-500"
50
+ },
51
+ running: {
52
+ icon: UiLoader.UiLoader,
53
+ label: LABEL.running,
54
+ className: "text-blue-600 dark:text-blue-400",
55
+ spin: true
56
+ }
57
+ };
58
+ const LINT_SEVERITIES = {
59
+ error: { ...TEST_OUTCOMES.failed, label: "Error" },
60
+ warning: { ...TEST_OUTCOMES.warned, label: "Warning" },
61
+ info: { icon: UiInfo.UiInfo, label: "Info", className: "text-sky-600 dark:text-sky-400" }
62
+ };
63
+ const GO = "text-[#00add8]";
64
+ const MARKDOWN = "text-foreground";
65
+ const MUTED = "text-muted-foreground";
66
+ const TEST_TOOLS = {
67
+ "go test": { icon: UiLogoGo.UiLogoGo, label: "go test", kind: "test", className: GO },
68
+ ginkgo: { icon: UiLogoGo.UiLogoGo, label: "Ginkgo", kind: "test", className: GO },
69
+ vitest: { icon: UiLogoVitest.UiLogoVitest, label: "Vitest", kind: "test", className: "text-[#6e9f18]" },
70
+ jest: { icon: UiLogoJest.UiLogoJest, label: "Jest", kind: "test", className: "text-[#c21325] dark:text-[#e5576a]" },
71
+ playwright: {
72
+ icon: UiLogoPlaywright.UiLogoPlaywright,
73
+ label: "Playwright",
74
+ kind: "test",
75
+ className: "text-[#2ead33]"
76
+ },
77
+ fixture: { icon: UiLogoMarkdown.UiLogoMarkdown, label: "Markdown fixture", kind: "test", className: MARKDOWN },
78
+ task: { icon: UiTerminal.UiTerminal, label: "Task", kind: "runner", className: MUTED },
79
+ // Fixture step types (gavel fixtures FixtureResult.Type) and the
80
+ // "checklist" node verifyReportTests synthesizes for acceptance criteria.
81
+ exec: { icon: UiTerminal.UiTerminal, label: "Command", kind: "fixture", className: MUTED },
82
+ test: { icon: UiBeaker.UiBeaker, label: "Test step", kind: "fixture", className: MUTED },
83
+ lint: { icon: UiListChecks.UiListChecks, label: "Lint step", kind: "fixture", className: MUTED },
84
+ verify: {
85
+ icon: UiSparkles.UiSparkles,
86
+ label: "AI review",
87
+ kind: "fixture",
88
+ className: "text-violet-600 dark:text-violet-400"
89
+ },
90
+ query: { icon: UiDatabase.UiDatabase, label: "Query", kind: "fixture", className: MUTED },
91
+ criterion: { icon: UiSealCheck.UiSealCheck, label: "Acceptance criterion", kind: "fixture", className: MUTED },
92
+ checklist: { icon: UiSealCheck.UiSealCheck, label: "Acceptance criteria", kind: "fixture", className: MUTED },
93
+ "golangci-lint": { icon: UiLogoGo.UiLogoGo, label: "golangci-lint", kind: "lint", className: GO },
94
+ eslint: {
95
+ icon: UiLogoEslint.UiLogoEslint,
96
+ label: "ESLint",
97
+ kind: "lint",
98
+ className: "text-[#4b32c3] dark:text-[#8080f2]"
99
+ },
100
+ oxlint: {
101
+ icon: UiLogoOxc.UiLogoOxc,
102
+ label: "oxlint",
103
+ kind: "lint",
104
+ className: "text-[#0891b2] dark:text-[#00f7f1]"
105
+ },
106
+ tsc: {
107
+ icon: UiLogoTypescript.UiLogoTypescript,
108
+ label: "TypeScript compiler",
109
+ kind: "lint",
110
+ className: "text-[#3178c6]"
111
+ },
112
+ markdownlint: { icon: UiLogoMarkdown.UiLogoMarkdown, label: "markdownlint", kind: "lint", className: MARKDOWN },
113
+ vale: { icon: UiLogoMarkdown.UiLogoMarkdown, label: "Vale (prose)", kind: "lint", className: MARKDOWN },
114
+ pyright: {
115
+ icon: UiLogoPython.UiLogoPython,
116
+ label: "Pyright",
117
+ kind: "lint",
118
+ className: "text-[#3776ab] dark:text-[#ffd43b]"
119
+ },
120
+ ruff: {
121
+ icon: UiLogoRuff.UiLogoRuff,
122
+ label: "Ruff",
123
+ kind: "lint",
124
+ className: "text-[#261230] dark:text-[#d7ff64]"
125
+ },
126
+ // A secret scanner's finding is about a credential, not a language.
127
+ betterleaks: { icon: UiKey.UiKey, label: "betterleaks (secrets)", kind: "lint", className: MUTED },
128
+ jscpd: { icon: UiCopy.UiCopy, label: "jscpd (duplicate code)", kind: "lint", className: MUTED },
129
+ reactdoctor: {
130
+ icon: UiLogoReact.UiLogoReact,
131
+ label: "React Doctor",
132
+ kind: "lint",
133
+ className: "text-[#0e7490] dark:text-[#61dafb]"
134
+ }
135
+ };
136
+ function toolMark(tool) {
137
+ return tool && TEST_TOOLS[tool] || null;
138
+ }
139
+ exports.LINT_SEVERITIES = LINT_SEVERITIES;
140
+ exports.TEST_OUTCOMES = TEST_OUTCOMES;
141
+ exports.TEST_TOOLS = TEST_TOOLS;
142
+ exports.toolMark = toolMark;
143
+ //# sourceMappingURL=marks.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"marks.cjs","sources":["../../../src/data/test-runner/marks.ts"],"sourcesContent":["// The shared iconography for test and lint results: what happened (outcome),\n// how bad a finding is (lint severity), and what produced it (tool).\n//\n// Every outcome has its own outline glyph, so a result never reads by colour\n// alone.\n// Tool marks are bundled Simple Icons brand glyphs (offline, no runtime icon\n// names), coloured per theme here because one brand hex can't hold up on both\n// light and dark surfaces.\n\nimport type { StaticIconComponent } from \"../Icon\";\nimport {\n UiCircleOutline,\n UiCircleX,\n UiBeaker,\n UiCopy,\n UiDatabase,\n UiInfo,\n UiKey,\n UiListChecks,\n UiLoader,\n UiLogoEslint,\n UiLogoGo,\n UiLogoJest,\n UiLogoMarkdown,\n UiLogoOxc,\n UiLogoPlaywright,\n UiLogoPython,\n UiLogoReact,\n UiLogoRuff,\n UiLogoTypescript,\n UiLogoVitest,\n UiPass,\n UiProhibit,\n UiSealCheck,\n UiSkipForward,\n UiSparkles,\n UiTerminal,\n UiTimer,\n UiWarningTriangle,\n} from \"../../icons\";\nimport { STATUS_LABELS, type TestOutcome } from \"./status\";\n\nexport type { TestOutcome } from \"./status\";\n\nexport type ResultMark = {\n icon: StaticIconComponent;\n label: string;\n /** Text colour classes for light and dark themes. */\n className: string;\n spin?: boolean;\n};\n\nconst LABEL = Object.fromEntries(STATUS_LABELS.map((s) => [s.key, s.label]));\n\nconst RED = \"text-red-600 dark:text-red-400\";\nconst AMBER = \"text-amber-600 dark:text-amber-400\";\n\nexport const TEST_OUTCOMES: Record<TestOutcome, ResultMark> = {\n failed: { icon: UiCircleX, label: LABEL.failed!, className: RED },\n errored: { icon: UiProhibit, label: \"Could not run\", className: RED },\n timedout: { icon: UiTimer, label: LABEL.timedout!, className: AMBER },\n warned: { icon: UiWarningTriangle, label: LABEL.warned!, className: AMBER },\n passed: {\n icon: UiPass,\n label: LABEL.passed!,\n className: \"text-emerald-600 dark:text-emerald-400\",\n },\n skipped: { icon: UiSkipForward, label: LABEL.skipped!, className: \"text-slate-500\" },\n pending: {\n icon: UiCircleOutline,\n label: LABEL.pending!,\n className: \"text-slate-400 dark:text-slate-500\",\n },\n running: {\n icon: UiLoader,\n label: LABEL.running!,\n className: \"text-blue-600 dark:text-blue-400\",\n spin: true,\n },\n};\n\nexport type LintSeverity = \"error\" | \"warning\" | \"info\";\n\n/** An error-severity finding fails the verdict and a warning warns it, so they share those outcomes' marks. */\nexport const LINT_SEVERITIES: Record<LintSeverity, ResultMark> = {\n error: { ...TEST_OUTCOMES.failed, label: \"Error\" },\n warning: { ...TEST_OUTCOMES.warned, label: \"Warning\" },\n info: { icon: UiInfo, label: \"Info\", className: \"text-sky-600 dark:text-sky-400\" },\n};\n\nexport type ToolKind = \"test\" | \"lint\" | \"fixture\" | \"runner\";\n\nexport type ToolMark = {\n icon: StaticIconComponent;\n label: string;\n kind: ToolKind;\n className: string;\n};\n\nconst GO = \"text-[#00add8]\";\nconst MARKDOWN = \"text-foreground\";\nconst MUTED = \"text-muted-foreground\";\n\n/**\n * Keyed by the identifiers gavel reports: testrunner/parsers Framework values\n * and each linter's Name(). A tool without a mark of its own takes its\n * language's (golangci-lint → Go, pyright → Python).\n */\nexport const TEST_TOOLS: Record<string, ToolMark> = {\n \"go test\": { icon: UiLogoGo, label: \"go test\", kind: \"test\", className: GO },\n ginkgo: { icon: UiLogoGo, label: \"Ginkgo\", kind: \"test\", className: GO },\n vitest: { icon: UiLogoVitest, label: \"Vitest\", kind: \"test\", className: \"text-[#6e9f18]\" },\n jest: { icon: UiLogoJest, label: \"Jest\", kind: \"test\", className: \"text-[#c21325] dark:text-[#e5576a]\" },\n playwright: {\n icon: UiLogoPlaywright,\n label: \"Playwright\",\n kind: \"test\",\n className: \"text-[#2ead33]\",\n },\n fixture: { icon: UiLogoMarkdown, label: \"Markdown fixture\", kind: \"test\", className: MARKDOWN },\n task: { icon: UiTerminal, label: \"Task\", kind: \"runner\", className: MUTED },\n // Fixture step types (gavel fixtures FixtureResult.Type) and the\n // \"checklist\" node verifyReportTests synthesizes for acceptance criteria.\n exec: { icon: UiTerminal, label: \"Command\", kind: \"fixture\", className: MUTED },\n test: { icon: UiBeaker, label: \"Test step\", kind: \"fixture\", className: MUTED },\n lint: { icon: UiListChecks, label: \"Lint step\", kind: \"fixture\", className: MUTED },\n verify: {\n icon: UiSparkles,\n label: \"AI review\",\n kind: \"fixture\",\n className: \"text-violet-600 dark:text-violet-400\",\n },\n query: { icon: UiDatabase, label: \"Query\", kind: \"fixture\", className: MUTED },\n criterion: { icon: UiSealCheck, label: \"Acceptance criterion\", kind: \"fixture\", className: MUTED },\n checklist: { icon: UiSealCheck, label: \"Acceptance criteria\", kind: \"fixture\", className: MUTED },\n \"golangci-lint\": { icon: UiLogoGo, label: \"golangci-lint\", kind: \"lint\", className: GO },\n eslint: {\n icon: UiLogoEslint,\n label: \"ESLint\",\n kind: \"lint\",\n className: \"text-[#4b32c3] dark:text-[#8080f2]\",\n },\n oxlint: {\n icon: UiLogoOxc,\n label: \"oxlint\",\n kind: \"lint\",\n className: \"text-[#0891b2] dark:text-[#00f7f1]\",\n },\n tsc: {\n icon: UiLogoTypescript,\n label: \"TypeScript compiler\",\n kind: \"lint\",\n className: \"text-[#3178c6]\",\n },\n markdownlint: { icon: UiLogoMarkdown, label: \"markdownlint\", kind: \"lint\", className: MARKDOWN },\n vale: { icon: UiLogoMarkdown, label: \"Vale (prose)\", kind: \"lint\", className: MARKDOWN },\n pyright: {\n icon: UiLogoPython,\n label: \"Pyright\",\n kind: \"lint\",\n className: \"text-[#3776ab] dark:text-[#ffd43b]\",\n },\n ruff: {\n icon: UiLogoRuff,\n label: \"Ruff\",\n kind: \"lint\",\n className: \"text-[#261230] dark:text-[#d7ff64]\",\n },\n // A secret scanner's finding is about a credential, not a language.\n betterleaks: { icon: UiKey, label: \"betterleaks (secrets)\", kind: \"lint\", className: MUTED },\n jscpd: { icon: UiCopy, label: \"jscpd (duplicate code)\", kind: \"lint\", className: MUTED },\n reactdoctor: {\n icon: UiLogoReact,\n label: \"React Doctor\",\n kind: \"lint\",\n className: \"text-[#0e7490] dark:text-[#61dafb]\",\n },\n};\n\n/** The tool's mark, or null for a tool the catalog doesn't know (render its name alone). */\nexport function toolMark(tool: string | undefined): ToolMark | null {\n return (tool && TEST_TOOLS[tool]) || null;\n}\n\n"],"names":["STATUS_LABELS","UiCircleX","UiProhibit","UiTimer","UiWarningTriangle","UiPass","UiSkipForward","UiCircleOutline","UiLoader","UiInfo","UiLogoGo","UiLogoVitest","UiLogoJest","UiLogoPlaywright","UiLogoMarkdown","UiTerminal","UiBeaker","UiListChecks","UiSparkles","UiDatabase","UiSealCheck","UiLogoEslint","UiLogoOxc","UiLogoTypescript","UiLogoPython","UiLogoRuff","UiKey","UiCopy","UiLogoReact"],"mappings":"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"}
@@ -0,0 +1,30 @@
1
+ import { StaticIconComponent } from '../Icon.js';
2
+ import { TestOutcome } from './status.js';
3
+ export type { TestOutcome } from './status.js';
4
+ export type ResultMark = {
5
+ icon: StaticIconComponent;
6
+ label: string;
7
+ /** Text colour classes for light and dark themes. */
8
+ className: string;
9
+ spin?: boolean;
10
+ };
11
+ export declare const TEST_OUTCOMES: Record<TestOutcome, ResultMark>;
12
+ export type LintSeverity = "error" | "warning" | "info";
13
+ /** An error-severity finding fails the verdict and a warning warns it, so they share those outcomes' marks. */
14
+ export declare const LINT_SEVERITIES: Record<LintSeverity, ResultMark>;
15
+ export type ToolKind = "test" | "lint" | "fixture" | "runner";
16
+ export type ToolMark = {
17
+ icon: StaticIconComponent;
18
+ label: string;
19
+ kind: ToolKind;
20
+ className: string;
21
+ };
22
+ /**
23
+ * Keyed by the identifiers gavel reports: testrunner/parsers Framework values
24
+ * and each linter's Name(). A tool without a mark of its own takes its
25
+ * language's (golangci-lint → Go, pyright → Python).
26
+ */
27
+ export declare const TEST_TOOLS: Record<string, ToolMark>;
28
+ /** The tool's mark, or null for a tool the catalog doesn't know (render its name alone). */
29
+ export declare function toolMark(tool: string | undefined): ToolMark | null;
30
+ //# sourceMappingURL=marks.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"marks.d.ts","sourceRoot":"","sources":["../../../src/data/test-runner/marks.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,SAAS,CAAC;AA+BnD,OAAO,EAAiB,KAAK,WAAW,EAAE,MAAM,UAAU,CAAC;AAE3D,YAAY,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAE5C,MAAM,MAAM,UAAU,GAAG;IACvB,IAAI,EAAE,mBAAmB,CAAC;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,qDAAqD;IACrD,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB,CAAC;AAOF,eAAO,MAAM,aAAa,EAAE,MAAM,CAAC,WAAW,EAAE,UAAU,CAsBzD,CAAC;AAEF,MAAM,MAAM,YAAY,GAAG,OAAO,GAAG,SAAS,GAAG,MAAM,CAAC;AAExD,+GAA+G;AAC/G,eAAO,MAAM,eAAe,EAAE,MAAM,CAAC,YAAY,EAAE,UAAU,CAI5D,CAAC;AAEF,MAAM,MAAM,QAAQ,GAAG,MAAM,GAAG,MAAM,GAAG,SAAS,GAAG,QAAQ,CAAC;AAE9D,MAAM,MAAM,QAAQ,GAAG;IACrB,IAAI,EAAE,mBAAmB,CAAC;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,QAAQ,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;CACnB,CAAC;AAMF;;;;GAIG;AACH,eAAO,MAAM,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,QAAQ,CAqE/C,CAAC;AAEF,4FAA4F;AAC5F,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,GAAG,QAAQ,GAAG,IAAI,CAElE"}
@@ -0,0 +1,143 @@
1
+ import { STATUS_LABELS } from "./status.js";
2
+ import { UiInfo } from "../../icons/components/UiInfo.js";
3
+ import { UiWarningTriangle } from "../../icons/components/UiWarningTriangle.js";
4
+ import { UiCircleX } from "../../icons/components/UiCircleX.js";
5
+ import { UiLoader } from "../../icons/components/UiLoader.js";
6
+ import { UiCircleOutline } from "../../icons/components/UiCircleOutline.js";
7
+ import { UiSkipForward } from "../../icons/components/UiSkipForward.js";
8
+ import { UiPass } from "../../icons/components/UiPass.js";
9
+ import { UiTimer } from "../../icons/components/UiTimer.js";
10
+ import { UiProhibit } from "../../icons/components/UiProhibit.js";
11
+ import { UiLogoReact } from "../../icons/components/UiLogoReact.js";
12
+ import { UiCopy } from "../../icons/components/UiCopy.js";
13
+ import { UiKey } from "../../icons/components/UiKey.js";
14
+ import { UiLogoRuff } from "../../icons/components/UiLogoRuff.js";
15
+ import { UiLogoPython } from "../../icons/components/UiLogoPython.js";
16
+ import { UiLogoMarkdown } from "../../icons/components/UiLogoMarkdown.js";
17
+ import { UiLogoTypescript } from "../../icons/components/UiLogoTypescript.js";
18
+ import { UiLogoOxc } from "../../icons/components/UiLogoOxc.js";
19
+ import { UiLogoEslint } from "../../icons/components/UiLogoEslint.js";
20
+ import { UiLogoGo } from "../../icons/components/UiLogoGo.js";
21
+ import { UiSealCheck } from "../../icons/components/UiSealCheck.js";
22
+ import { UiDatabase } from "../../icons/components/UiDatabase.js";
23
+ import { UiSparkles } from "../../icons/components/UiSparkles.js";
24
+ import { UiListChecks } from "../../icons/components/UiListChecks.js";
25
+ import { UiBeaker } from "../../icons/components/UiBeaker.js";
26
+ import { UiTerminal } from "../../icons/components/UiTerminal.js";
27
+ import { UiLogoPlaywright } from "../../icons/components/UiLogoPlaywright.js";
28
+ import { UiLogoJest } from "../../icons/components/UiLogoJest.js";
29
+ import { UiLogoVitest } from "../../icons/components/UiLogoVitest.js";
30
+ const LABEL = Object.fromEntries(STATUS_LABELS.map((s) => [s.key, s.label]));
31
+ const RED = "text-red-600 dark:text-red-400";
32
+ const AMBER = "text-amber-600 dark:text-amber-400";
33
+ const TEST_OUTCOMES = {
34
+ failed: { icon: UiCircleX, label: LABEL.failed, className: RED },
35
+ errored: { icon: UiProhibit, label: "Could not run", className: RED },
36
+ timedout: { icon: UiTimer, label: LABEL.timedout, className: AMBER },
37
+ warned: { icon: UiWarningTriangle, label: LABEL.warned, className: AMBER },
38
+ passed: {
39
+ icon: UiPass,
40
+ label: LABEL.passed,
41
+ className: "text-emerald-600 dark:text-emerald-400"
42
+ },
43
+ skipped: { icon: UiSkipForward, label: LABEL.skipped, className: "text-slate-500" },
44
+ pending: {
45
+ icon: UiCircleOutline,
46
+ label: LABEL.pending,
47
+ className: "text-slate-400 dark:text-slate-500"
48
+ },
49
+ running: {
50
+ icon: UiLoader,
51
+ label: LABEL.running,
52
+ className: "text-blue-600 dark:text-blue-400",
53
+ spin: true
54
+ }
55
+ };
56
+ const LINT_SEVERITIES = {
57
+ error: { ...TEST_OUTCOMES.failed, label: "Error" },
58
+ warning: { ...TEST_OUTCOMES.warned, label: "Warning" },
59
+ info: { icon: UiInfo, label: "Info", className: "text-sky-600 dark:text-sky-400" }
60
+ };
61
+ const GO = "text-[#00add8]";
62
+ const MARKDOWN = "text-foreground";
63
+ const MUTED = "text-muted-foreground";
64
+ const TEST_TOOLS = {
65
+ "go test": { icon: UiLogoGo, label: "go test", kind: "test", className: GO },
66
+ ginkgo: { icon: UiLogoGo, label: "Ginkgo", kind: "test", className: GO },
67
+ vitest: { icon: UiLogoVitest, label: "Vitest", kind: "test", className: "text-[#6e9f18]" },
68
+ jest: { icon: UiLogoJest, label: "Jest", kind: "test", className: "text-[#c21325] dark:text-[#e5576a]" },
69
+ playwright: {
70
+ icon: UiLogoPlaywright,
71
+ label: "Playwright",
72
+ kind: "test",
73
+ className: "text-[#2ead33]"
74
+ },
75
+ fixture: { icon: UiLogoMarkdown, label: "Markdown fixture", kind: "test", className: MARKDOWN },
76
+ task: { icon: UiTerminal, label: "Task", kind: "runner", className: MUTED },
77
+ // Fixture step types (gavel fixtures FixtureResult.Type) and the
78
+ // "checklist" node verifyReportTests synthesizes for acceptance criteria.
79
+ exec: { icon: UiTerminal, label: "Command", kind: "fixture", className: MUTED },
80
+ test: { icon: UiBeaker, label: "Test step", kind: "fixture", className: MUTED },
81
+ lint: { icon: UiListChecks, label: "Lint step", kind: "fixture", className: MUTED },
82
+ verify: {
83
+ icon: UiSparkles,
84
+ label: "AI review",
85
+ kind: "fixture",
86
+ className: "text-violet-600 dark:text-violet-400"
87
+ },
88
+ query: { icon: UiDatabase, label: "Query", kind: "fixture", className: MUTED },
89
+ criterion: { icon: UiSealCheck, label: "Acceptance criterion", kind: "fixture", className: MUTED },
90
+ checklist: { icon: UiSealCheck, label: "Acceptance criteria", kind: "fixture", className: MUTED },
91
+ "golangci-lint": { icon: UiLogoGo, label: "golangci-lint", kind: "lint", className: GO },
92
+ eslint: {
93
+ icon: UiLogoEslint,
94
+ label: "ESLint",
95
+ kind: "lint",
96
+ className: "text-[#4b32c3] dark:text-[#8080f2]"
97
+ },
98
+ oxlint: {
99
+ icon: UiLogoOxc,
100
+ label: "oxlint",
101
+ kind: "lint",
102
+ className: "text-[#0891b2] dark:text-[#00f7f1]"
103
+ },
104
+ tsc: {
105
+ icon: UiLogoTypescript,
106
+ label: "TypeScript compiler",
107
+ kind: "lint",
108
+ className: "text-[#3178c6]"
109
+ },
110
+ markdownlint: { icon: UiLogoMarkdown, label: "markdownlint", kind: "lint", className: MARKDOWN },
111
+ vale: { icon: UiLogoMarkdown, label: "Vale (prose)", kind: "lint", className: MARKDOWN },
112
+ pyright: {
113
+ icon: UiLogoPython,
114
+ label: "Pyright",
115
+ kind: "lint",
116
+ className: "text-[#3776ab] dark:text-[#ffd43b]"
117
+ },
118
+ ruff: {
119
+ icon: UiLogoRuff,
120
+ label: "Ruff",
121
+ kind: "lint",
122
+ className: "text-[#261230] dark:text-[#d7ff64]"
123
+ },
124
+ // A secret scanner's finding is about a credential, not a language.
125
+ betterleaks: { icon: UiKey, label: "betterleaks (secrets)", kind: "lint", className: MUTED },
126
+ jscpd: { icon: UiCopy, label: "jscpd (duplicate code)", kind: "lint", className: MUTED },
127
+ reactdoctor: {
128
+ icon: UiLogoReact,
129
+ label: "React Doctor",
130
+ kind: "lint",
131
+ className: "text-[#0e7490] dark:text-[#61dafb]"
132
+ }
133
+ };
134
+ function toolMark(tool) {
135
+ return tool && TEST_TOOLS[tool] || null;
136
+ }
137
+ export {
138
+ LINT_SEVERITIES,
139
+ TEST_OUTCOMES,
140
+ TEST_TOOLS,
141
+ toolMark
142
+ };
143
+ //# sourceMappingURL=marks.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"marks.js","sources":["../../../src/data/test-runner/marks.ts"],"sourcesContent":["// The shared iconography for test and lint results: what happened (outcome),\n// how bad a finding is (lint severity), and what produced it (tool).\n//\n// Every outcome has its own outline glyph, so a result never reads by colour\n// alone.\n// Tool marks are bundled Simple Icons brand glyphs (offline, no runtime icon\n// names), coloured per theme here because one brand hex can't hold up on both\n// light and dark surfaces.\n\nimport type { StaticIconComponent } from \"../Icon\";\nimport {\n UiCircleOutline,\n UiCircleX,\n UiBeaker,\n UiCopy,\n UiDatabase,\n UiInfo,\n UiKey,\n UiListChecks,\n UiLoader,\n UiLogoEslint,\n UiLogoGo,\n UiLogoJest,\n UiLogoMarkdown,\n UiLogoOxc,\n UiLogoPlaywright,\n UiLogoPython,\n UiLogoReact,\n UiLogoRuff,\n UiLogoTypescript,\n UiLogoVitest,\n UiPass,\n UiProhibit,\n UiSealCheck,\n UiSkipForward,\n UiSparkles,\n UiTerminal,\n UiTimer,\n UiWarningTriangle,\n} from \"../../icons\";\nimport { STATUS_LABELS, type TestOutcome } from \"./status\";\n\nexport type { TestOutcome } from \"./status\";\n\nexport type ResultMark = {\n icon: StaticIconComponent;\n label: string;\n /** Text colour classes for light and dark themes. */\n className: string;\n spin?: boolean;\n};\n\nconst LABEL = Object.fromEntries(STATUS_LABELS.map((s) => [s.key, s.label]));\n\nconst RED = \"text-red-600 dark:text-red-400\";\nconst AMBER = \"text-amber-600 dark:text-amber-400\";\n\nexport const TEST_OUTCOMES: Record<TestOutcome, ResultMark> = {\n failed: { icon: UiCircleX, label: LABEL.failed!, className: RED },\n errored: { icon: UiProhibit, label: \"Could not run\", className: RED },\n timedout: { icon: UiTimer, label: LABEL.timedout!, className: AMBER },\n warned: { icon: UiWarningTriangle, label: LABEL.warned!, className: AMBER },\n passed: {\n icon: UiPass,\n label: LABEL.passed!,\n className: \"text-emerald-600 dark:text-emerald-400\",\n },\n skipped: { icon: UiSkipForward, label: LABEL.skipped!, className: \"text-slate-500\" },\n pending: {\n icon: UiCircleOutline,\n label: LABEL.pending!,\n className: \"text-slate-400 dark:text-slate-500\",\n },\n running: {\n icon: UiLoader,\n label: LABEL.running!,\n className: \"text-blue-600 dark:text-blue-400\",\n spin: true,\n },\n};\n\nexport type LintSeverity = \"error\" | \"warning\" | \"info\";\n\n/** An error-severity finding fails the verdict and a warning warns it, so they share those outcomes' marks. */\nexport const LINT_SEVERITIES: Record<LintSeverity, ResultMark> = {\n error: { ...TEST_OUTCOMES.failed, label: \"Error\" },\n warning: { ...TEST_OUTCOMES.warned, label: \"Warning\" },\n info: { icon: UiInfo, label: \"Info\", className: \"text-sky-600 dark:text-sky-400\" },\n};\n\nexport type ToolKind = \"test\" | \"lint\" | \"fixture\" | \"runner\";\n\nexport type ToolMark = {\n icon: StaticIconComponent;\n label: string;\n kind: ToolKind;\n className: string;\n};\n\nconst GO = \"text-[#00add8]\";\nconst MARKDOWN = \"text-foreground\";\nconst MUTED = \"text-muted-foreground\";\n\n/**\n * Keyed by the identifiers gavel reports: testrunner/parsers Framework values\n * and each linter's Name(). A tool without a mark of its own takes its\n * language's (golangci-lint → Go, pyright → Python).\n */\nexport const TEST_TOOLS: Record<string, ToolMark> = {\n \"go test\": { icon: UiLogoGo, label: \"go test\", kind: \"test\", className: GO },\n ginkgo: { icon: UiLogoGo, label: \"Ginkgo\", kind: \"test\", className: GO },\n vitest: { icon: UiLogoVitest, label: \"Vitest\", kind: \"test\", className: \"text-[#6e9f18]\" },\n jest: { icon: UiLogoJest, label: \"Jest\", kind: \"test\", className: \"text-[#c21325] dark:text-[#e5576a]\" },\n playwright: {\n icon: UiLogoPlaywright,\n label: \"Playwright\",\n kind: \"test\",\n className: \"text-[#2ead33]\",\n },\n fixture: { icon: UiLogoMarkdown, label: \"Markdown fixture\", kind: \"test\", className: MARKDOWN },\n task: { icon: UiTerminal, label: \"Task\", kind: \"runner\", className: MUTED },\n // Fixture step types (gavel fixtures FixtureResult.Type) and the\n // \"checklist\" node verifyReportTests synthesizes for acceptance criteria.\n exec: { icon: UiTerminal, label: \"Command\", kind: \"fixture\", className: MUTED },\n test: { icon: UiBeaker, label: \"Test step\", kind: \"fixture\", className: MUTED },\n lint: { icon: UiListChecks, label: \"Lint step\", kind: \"fixture\", className: MUTED },\n verify: {\n icon: UiSparkles,\n label: \"AI review\",\n kind: \"fixture\",\n className: \"text-violet-600 dark:text-violet-400\",\n },\n query: { icon: UiDatabase, label: \"Query\", kind: \"fixture\", className: MUTED },\n criterion: { icon: UiSealCheck, label: \"Acceptance criterion\", kind: \"fixture\", className: MUTED },\n checklist: { icon: UiSealCheck, label: \"Acceptance criteria\", kind: \"fixture\", className: MUTED },\n \"golangci-lint\": { icon: UiLogoGo, label: \"golangci-lint\", kind: \"lint\", className: GO },\n eslint: {\n icon: UiLogoEslint,\n label: \"ESLint\",\n kind: \"lint\",\n className: \"text-[#4b32c3] dark:text-[#8080f2]\",\n },\n oxlint: {\n icon: UiLogoOxc,\n label: \"oxlint\",\n kind: \"lint\",\n className: \"text-[#0891b2] dark:text-[#00f7f1]\",\n },\n tsc: {\n icon: UiLogoTypescript,\n label: \"TypeScript compiler\",\n kind: \"lint\",\n className: \"text-[#3178c6]\",\n },\n markdownlint: { icon: UiLogoMarkdown, label: \"markdownlint\", kind: \"lint\", className: MARKDOWN },\n vale: { icon: UiLogoMarkdown, label: \"Vale (prose)\", kind: \"lint\", className: MARKDOWN },\n pyright: {\n icon: UiLogoPython,\n label: \"Pyright\",\n kind: \"lint\",\n className: \"text-[#3776ab] dark:text-[#ffd43b]\",\n },\n ruff: {\n icon: UiLogoRuff,\n label: \"Ruff\",\n kind: \"lint\",\n className: \"text-[#261230] dark:text-[#d7ff64]\",\n },\n // A secret scanner's finding is about a credential, not a language.\n betterleaks: { icon: UiKey, label: \"betterleaks (secrets)\", kind: \"lint\", className: MUTED },\n jscpd: { icon: UiCopy, label: \"jscpd (duplicate code)\", kind: \"lint\", className: MUTED },\n reactdoctor: {\n icon: UiLogoReact,\n label: \"React Doctor\",\n kind: \"lint\",\n className: \"text-[#0e7490] dark:text-[#61dafb]\",\n },\n};\n\n/** The tool's mark, or null for a tool the catalog doesn't know (render its name alone). */\nexport function toolMark(tool: string | undefined): ToolMark | null {\n return (tool && TEST_TOOLS[tool]) || null;\n}\n\n"],"names":[],"mappings":"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"}
@@ -1,13 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
3
  const filterState = require("./filterState.cjs");
4
- const UiHourglass = require("../../icons/components/UiHourglass.cjs");
5
- const UiLoader = require("../../icons/components/UiLoader.cjs");
6
- const UiPause = require("../../icons/components/UiPause.cjs");
7
- const UiError = require("../../icons/components/UiError.cjs");
8
- const UiWarningTriangle = require("../../icons/components/UiWarningTriangle.cjs");
9
- const UiPass = require("../../icons/components/UiPass.cjs");
10
- const UiClass = require("../../icons/components/UiClass.cjs");
11
4
  const emptyCounts = () => ({
12
5
  total: 0,
13
6
  passed: 0,
@@ -113,44 +106,34 @@ function testStatus(t) {
113
106
  if (t.passed) return "passed";
114
107
  return null;
115
108
  }
116
- function statusIconFor(t) {
117
- if (t.timed_out) return UiHourglass.UiHourglass;
118
- if (t.running) return UiLoader.UiLoader;
119
- if (t.pending) return UiPause.UiPause;
120
- if (t.failed) return UiError.UiError;
121
- if (t.warned) return UiWarningTriangle.UiWarningTriangle;
122
- if (t.skipped) return UiPause.UiPause;
123
- if (t.passed) return UiPass.UiPass;
124
- if (t.children && t.children.length > 0) {
125
- const s = sum(t);
126
- if (hasTimedOutDescendant(t)) return UiHourglass.UiHourglass;
127
- if (s.failed > 0) return UiError.UiError;
128
- if (s.warned > 0) return UiWarningTriangle.UiWarningTriangle;
129
- if (s.running > 0) return UiLoader.UiLoader;
130
- if (s.pending > 0) return UiPause.UiPause;
131
- return UiPass.UiPass;
132
- }
133
- return UiClass.UiClass;
109
+ function outcomeFor(t) {
110
+ var _a;
111
+ const own = testStatus(t);
112
+ if (own) return own;
113
+ if (!((_a = t.children) == null ? void 0 : _a.length)) return null;
114
+ const s = sum(t);
115
+ if (hasTimedOutDescendant(t)) return "timedout";
116
+ if (s.failed > 0) return "failed";
117
+ if (s.warned > 0) return "warned";
118
+ if (s.running > 0) return "running";
119
+ if (s.pending > 0) return "pending";
120
+ if (s.total > 0 && s.skipped === s.total) return "skipped";
121
+ return "passed";
134
122
  }
135
123
  function statusToneFor(t) {
136
- if (t.timed_out) return "warning";
137
- if (t.running) return "info";
138
- if (t.pending) return "neutral";
139
- if (t.failed) return "danger";
140
- if (t.warned) return "warning";
141
- if (t.skipped) return "warning";
142
- if (t.passed) return "success";
143
- if (t.children && t.children.length > 0) {
144
- const s = sum(t);
145
- if (hasTimedOutDescendant(t)) return "warning";
146
- if (s.failed > 0) return "danger";
147
- if (s.warned > 0) return "warning";
148
- if (s.running > 0) return "info";
149
- if (s.pending > 0) return "neutral";
150
- return "success";
151
- }
152
- return "neutral";
153
- }
124
+ const outcome = outcomeFor(t);
125
+ return outcome ? OUTCOME_TONE[outcome] : "neutral";
126
+ }
127
+ const OUTCOME_TONE = {
128
+ failed: "danger",
129
+ errored: "danger",
130
+ timedout: "warning",
131
+ warned: "warning",
132
+ skipped: "warning",
133
+ running: "info",
134
+ pending: "neutral",
135
+ passed: "success"
136
+ };
154
137
  function formatTestDuration(ns) {
155
138
  if (ns <= 0) return "";
156
139
  const ms = ns / 1e6;
@@ -241,7 +224,7 @@ exports.formatTestDuration = formatTestDuration;
241
224
  exports.hasFailed = hasFailed;
242
225
  exports.hasPending = hasPending;
243
226
  exports.humanizeName = humanizeName;
244
- exports.statusIconFor = statusIconFor;
227
+ exports.outcomeFor = outcomeFor;
245
228
  exports.statusToneFor = statusToneFor;
246
229
  exports.sum = sum;
247
230
  exports.sumNonTaskTests = sumNonTaskTests;