@cccsaurora/howler-ui 2.19.0-dev.999 → 2.20.0-dev.1352

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 (653) hide show
  1. package/api/action/index.d.ts +5 -4
  2. package/api/action/index.js +8 -8
  3. package/api/analytic/index.d.ts +5 -5
  4. package/api/analytic/index.js +5 -6
  5. package/api/analytic/owner.d.ts +2 -1
  6. package/api/analytic/owner.js +2 -2
  7. package/api/dossier/index.d.ts +4 -3
  8. package/api/dossier/index.js +6 -6
  9. package/api/hit/index.d.ts +3 -2
  10. package/api/hit/index.js +4 -4
  11. package/api/hit/labels.d.ts +3 -2
  12. package/api/hit/labels.js +4 -4
  13. package/api/hit/overwrite.d.ts +2 -1
  14. package/api/hit/overwrite.js +2 -2
  15. package/api/hit/transition.d.ts +2 -1
  16. package/api/hit/transition.js +2 -2
  17. package/api/index.d.ts +10 -5
  18. package/api/index.js +18 -10
  19. package/api/overview/index.d.ts +4 -3
  20. package/api/overview/index.js +6 -6
  21. package/api/search/action.js +1 -1
  22. package/api/search/analytic.js +1 -1
  23. package/api/search/case.d.ts +4 -0
  24. package/api/search/case.js +8 -0
  25. package/api/search/count/hit.js +1 -1
  26. package/api/search/dossier.js +1 -1
  27. package/api/search/eql/hit.js +1 -1
  28. package/api/search/explain/hit.js +1 -1
  29. package/api/search/facet/hit.d.ts +1 -3
  30. package/api/search/facet/hit.js +1 -1
  31. package/api/search/facet/index.d.ts +3 -1
  32. package/api/search/grouped/hit.js +1 -1
  33. package/api/search/grouped/user.js +1 -1
  34. package/api/search/histogram/hit.js +1 -1
  35. package/api/search/hit.js +1 -1
  36. package/api/search/index.d.ts +3 -1
  37. package/api/search/index.js +2 -1
  38. package/api/search/overview.d.ts +2 -2
  39. package/api/search/overview.js +1 -1
  40. package/api/search/sigma/hit.js +1 -1
  41. package/api/search/template.js +1 -1
  42. package/api/search/user.js +1 -1
  43. package/api/search/view.js +1 -1
  44. package/api/socket/index.d.ts +3 -0
  45. package/api/socket/index.js +6 -0
  46. package/api/socket/viewers.d.ts +2 -0
  47. package/api/socket/viewers.js +8 -0
  48. package/api/socket/viewers.test.js +44 -0
  49. package/api/template/index.d.ts +4 -3
  50. package/api/template/index.js +6 -6
  51. package/api/user/index.d.ts +2 -1
  52. package/api/user/index.js +2 -2
  53. package/api/v2/case/index.d.ts +9 -0
  54. package/api/v2/case/index.js +21 -0
  55. package/api/v2/case/items.d.ts +9 -0
  56. package/api/v2/case/items.js +19 -0
  57. package/api/v2/case/rules.d.ts +6 -0
  58. package/api/v2/case/rules.js +18 -0
  59. package/api/v2/fuzzy.d.ts +17 -0
  60. package/api/v2/fuzzy.js +11 -0
  61. package/api/v2/index.d.ts +5 -0
  62. package/api/v2/index.js +7 -0
  63. package/api/v2/search/facet.d.ts +3 -0
  64. package/api/v2/search/facet.js +12 -0
  65. package/api/v2/search/index.d.ts +6 -0
  66. package/api/v2/search/index.js +24 -0
  67. package/api/view/index.d.ts +4 -3
  68. package/api/view/index.js +6 -6
  69. package/branding/AppBrand.d.ts +2 -2
  70. package/commons/components/app/AppSkeleton.js +1 -1
  71. package/commons/components/app/hooks/useAppConfigs.d.ts +2 -2
  72. package/commons/components/app/hooks/useAppSitemap.d.ts +5 -2
  73. package/commons/components/breadcrumbs/BreadcrumbIcon.js +1 -1
  74. package/commons/components/breadcrumbs/Breadcrumbs.d.ts +3 -2
  75. package/commons/components/display/AppToc.d.ts +2 -1
  76. package/commons/components/display/AppToc.js +1 -1
  77. package/commons/components/display/hooks/useAppColor.d.ts +1 -1
  78. package/commons/components/leftnav/LeftNavDrawer.d.ts +2 -1
  79. package/commons/components/leftnav/LeftNavDrawer.js +1 -1
  80. package/commons/components/leftnav/LeftNavGroup.d.ts +2 -1
  81. package/commons/components/leftnav/LeftNavItem.d.ts +2 -1
  82. package/commons/components/leftnav/LeftNavItem.js +1 -1
  83. package/commons/components/notification/Notification.js +1 -1
  84. package/commons/components/notification/elements/NotificationHeader.js +1 -1
  85. package/commons/components/notification/elements/NotificationItems.js +1 -1
  86. package/commons/components/notification/elements/item/NotificationItemAuthor.js +1 -1
  87. package/commons/components/pages/PageCenter.d.ts +2 -1
  88. package/commons/components/pages/PageContent.d.ts +2 -1
  89. package/commons/components/pages/PageFullScreen.d.ts +2 -1
  90. package/commons/components/search/AppSearch.js +1 -1
  91. package/commons/components/search/AppSearchInput.d.ts +2 -1
  92. package/commons/components/search/AppSearchResult.d.ts +2 -1
  93. package/commons/components/topnav/AppBar.d.ts +2 -1
  94. package/commons/components/topnav/AppName.d.ts +3 -2
  95. package/commons/components/topnav/AppSwitcher.d.ts +2 -1
  96. package/commons/components/topnav/ThemeSelection.d.ts +2 -1
  97. package/commons/components/topnav/ThemeSelection.js +1 -1
  98. package/commons/components/topnav/UserProfile.d.ts +2 -1
  99. package/commons/components/topnav/UserProfile.js +1 -1
  100. package/commons/components/utils/hooks/useThemeBuilder.d.ts +1 -1
  101. package/components/app/App.js +52 -12
  102. package/components/app/drawers/ApiKeyDrawer.js +1 -1
  103. package/components/app/hooks/useMatchers.d.ts +1 -1
  104. package/components/app/hooks/useMatchers.js +27 -15
  105. package/components/app/hooks/useMatchers.test.js +22 -22
  106. package/components/app/hooks/useTitle.js +6 -6
  107. package/components/app/providers/AnalyticProvider.js +1 -1
  108. package/components/app/providers/AvatarProvider.js +1 -1
  109. package/components/app/providers/FavouritesProvider.js +3 -3
  110. package/components/app/providers/GridColumnsProvider.d.ts +52 -0
  111. package/components/app/providers/GridColumnsProvider.js +177 -0
  112. package/components/app/providers/GridColumnsProvider.test.js +255 -0
  113. package/components/app/providers/ModalProvider.d.ts +1 -0
  114. package/components/app/providers/OverviewProvider.js +1 -1
  115. package/components/app/providers/ParameterProvider.d.ts +25 -3
  116. package/components/app/providers/ParameterProvider.js +163 -226
  117. package/components/app/providers/ParameterProvider.test.js +358 -94
  118. package/components/app/providers/RecordProvider.d.ts +23 -0
  119. package/components/app/providers/{HitProvider.js → RecordProvider.js} +47 -43
  120. package/components/app/providers/{HitSearchProvider.d.ts → RecordSearchProvider.d.ts} +6 -6
  121. package/components/app/providers/{HitSearchProvider.js → RecordSearchProvider.js} +24 -37
  122. package/components/app/providers/{HitSearchProvider.test.js → RecordSearchProvider.test.js} +52 -71
  123. package/components/app/providers/SearchResponseProvider.d.ts +21 -0
  124. package/components/app/providers/SearchResponseProvider.js +81 -0
  125. package/components/app/providers/SearchResponseProvider.test.d.ts +1 -0
  126. package/components/app/providers/SearchResponseProvider.test.js +406 -0
  127. package/components/app/providers/SocketProvider.d.ts +11 -2
  128. package/components/app/providers/SocketProvider.js +21 -8
  129. package/components/app/providers/UserListProvider.js +28 -8
  130. package/components/app/providers/UserListProvider.test.d.ts +1 -0
  131. package/components/app/providers/UserListProvider.test.js +150 -0
  132. package/components/app/providers/ViewProvider.js +3 -3
  133. package/components/app/providers/ViewProvider.test.js +4 -1
  134. package/components/elements/Comment.js +2 -2
  135. package/components/elements/ContextMenu.d.ts +56 -0
  136. package/components/elements/ContextMenu.js +113 -0
  137. package/components/elements/ContextMenu.test.d.ts +1 -0
  138. package/components/elements/ContextMenu.test.js +215 -0
  139. package/components/elements/EditRow.js +4 -4
  140. package/components/{routes/overviews/OverviewEditor.js → elements/MarkdownEditor.js} +3 -3
  141. package/components/elements/ObjectDetails.d.ts +6 -0
  142. package/components/elements/{hit/HitDetails.js → ObjectDetails.js} +17 -17
  143. package/components/elements/PluginChip.d.ts +1 -1
  144. package/components/elements/PluginChip.js +0 -1
  145. package/components/elements/PluginTypography.d.ts +2 -1
  146. package/components/elements/PluginTypography.js +3 -2
  147. package/components/elements/UserList.d.ts +5 -2
  148. package/components/elements/UserList.js +34 -17
  149. package/components/elements/UserList.test.d.ts +1 -0
  150. package/components/elements/UserList.test.js +122 -0
  151. package/components/elements/addons/buttons/CustomIconButton.test.d.ts +1 -0
  152. package/components/elements/addons/buttons/CustomIconButton.test.js +81 -0
  153. package/components/elements/addons/buttons/index.d.ts +1 -1
  154. package/components/elements/addons/layout/FlexOne.d.ts +3 -2
  155. package/components/elements/addons/layout/FlexPort.d.ts +2 -1
  156. package/components/elements/addons/layout/FlexVertical.d.ts +2 -1
  157. package/components/elements/addons/layout/FlexVertical.test.d.ts +1 -0
  158. package/components/elements/addons/layout/FlexVertical.test.js +32 -0
  159. package/components/elements/addons/layout/vsbox/VSBoxContent.test.d.ts +1 -0
  160. package/components/elements/addons/layout/vsbox/VSBoxContent.test.js +26 -0
  161. package/components/elements/addons/layout/vsbox/VSBoxElement.d.ts +2 -1
  162. package/components/elements/addons/lists/TuiList.d.ts +2 -1
  163. package/components/elements/addons/lists/TuiListBase.d.ts +2 -1
  164. package/components/elements/addons/lists/TuiListElement.d.ts +3 -2
  165. package/components/elements/addons/lists/TuiListElement.js +0 -1
  166. package/components/elements/addons/lists/TuiListMenu.d.ts +2 -1
  167. package/components/elements/addons/lists/TuiListMenu.js +1 -1
  168. package/components/elements/addons/lists/table/TuiTableHeader.d.ts +3 -2
  169. package/components/elements/addons/lists/table/index.d.ts +1 -1
  170. package/components/elements/addons/search/SearchPagination.d.ts +2 -1
  171. package/components/elements/addons/search/SearchPagination.js +4 -4
  172. package/components/elements/addons/search/SearchTotal.js +1 -1
  173. package/components/elements/addons/search/SearchTotal.test.js +5 -3
  174. package/components/elements/addons/search/phrase/Phrase.js +1 -1
  175. package/components/elements/addons/search/phrase/WordLexer.test.d.ts +1 -0
  176. package/components/elements/addons/search/phrase/WordLexer.test.js +55 -0
  177. package/components/elements/case/CaseCard.d.ts +12 -0
  178. package/components/elements/case/CaseCard.js +43 -0
  179. package/components/elements/case/CasePreview.d.ts +6 -0
  180. package/components/elements/case/CasePreview.js +17 -0
  181. package/components/elements/case/StatusIcon.d.ts +5 -0
  182. package/components/elements/case/StatusIcon.js +13 -0
  183. package/components/elements/display/ActionButton.js +1 -1
  184. package/components/elements/display/ChipPopper.d.ts +1 -1
  185. package/components/elements/display/ChipPopper.js +7 -6
  186. package/components/elements/display/Classification.js +1 -1
  187. package/components/elements/display/ClassificationChip.d.ts +14 -0
  188. package/components/elements/display/ClassificationChip.js +36 -0
  189. package/components/elements/display/HandlebarsMarkdown.js +38 -3
  190. package/components/elements/display/HowlerAvatar.js +2 -2
  191. package/components/elements/display/HowlerCard.js +1 -1
  192. package/components/elements/display/HowlerCard.test.js +5 -9
  193. package/components/elements/display/Image.js +3 -3
  194. package/components/elements/display/ItemManager.d.ts +2 -2
  195. package/components/elements/display/ItemManager.js +3 -3
  196. package/components/elements/display/Markdown.js +2 -2
  197. package/components/elements/display/Modal.js +2 -0
  198. package/components/elements/display/QueryResultText.d.ts +1 -0
  199. package/components/elements/display/QueryResultText.js +2 -2
  200. package/components/elements/display/handlebars/helpers.d.ts +4 -0
  201. package/components/elements/display/handlebars/helpers.js +134 -35
  202. package/components/elements/display/json/JSONViewer.js +2 -2
  203. package/components/elements/display/modals/RationaleModal.js +2 -2
  204. package/components/elements/display/modals/RationaleModal.test.js +1 -1
  205. package/components/elements/event/EventCard.d.ts +6 -0
  206. package/components/elements/event/EventCard.js +22 -0
  207. package/components/elements/event/EventPreview.d.ts +6 -0
  208. package/components/elements/event/EventPreview.js +12 -0
  209. package/components/elements/hit/HitActions.d.ts +1 -1
  210. package/components/elements/hit/HitActions.js +5 -5
  211. package/components/elements/hit/HitBanner.d.ts +1 -0
  212. package/components/elements/hit/HitBanner.js +32 -50
  213. package/components/elements/hit/HitCard.d.ts +4 -0
  214. package/components/elements/hit/HitCard.js +7 -7
  215. package/components/elements/hit/HitLabels.js +3 -3
  216. package/components/elements/hit/HitLabels.test.d.ts +1 -0
  217. package/components/elements/hit/HitLabels.test.js +77 -0
  218. package/components/elements/hit/HitLinks.d.ts +5 -4
  219. package/components/elements/hit/HitLinks.js +28 -10
  220. package/components/elements/hit/HitNotebooks.js +32 -31
  221. package/components/elements/hit/HitOutline.d.ts +1 -0
  222. package/components/elements/hit/HitOutline.js +4 -4
  223. package/components/elements/hit/HitOverview.js +2 -2
  224. package/components/elements/hit/{HitQuickSearch.d.ts → HitPreview.d.ts} +3 -3
  225. package/components/elements/hit/{HitQuickSearch.js → HitPreview.js} +11 -5
  226. package/components/elements/hit/HitSummary.d.ts +2 -1
  227. package/components/elements/hit/HitSummary.js +8 -7
  228. package/components/elements/hit/NotebookTooltip.d.ts +3 -0
  229. package/components/elements/hit/NotebookTooltip.js +8 -0
  230. package/components/elements/hit/PivotTooltip.d.ts +7 -0
  231. package/components/elements/hit/PivotTooltip.js +9 -0
  232. package/components/elements/hit/RelatedLinkTooltip.d.ts +6 -0
  233. package/components/elements/hit/RelatedLinkTooltip.js +8 -0
  234. package/components/elements/hit/ResolvePivotUrl.d.ts +4 -0
  235. package/components/elements/hit/ResolvePivotUrl.js +22 -0
  236. package/components/elements/hit/actions/ButtonActions.js +1 -3
  237. package/components/elements/hit/aggregate/HitGraph.js +9 -9
  238. package/components/elements/hit/elements/AnalyticLink.d.ts +9 -0
  239. package/components/elements/hit/elements/AnalyticLink.js +22 -0
  240. package/components/elements/hit/elements/{HitUsers.d.ts → Assigned.d.ts} +2 -4
  241. package/components/elements/hit/elements/Assigned.js +35 -0
  242. package/components/elements/hit/elements/Assigned.test.d.ts +1 -0
  243. package/components/elements/hit/elements/Assigned.test.js +65 -0
  244. package/components/{routes/hits/search → elements/hit}/grid/AddColumnModal.js +6 -5
  245. package/components/{routes/hits/search → elements/hit}/grid/ColumnHeader.d.ts +2 -1
  246. package/components/{routes/hits/search → elements/hit}/grid/ColumnHeader.js +3 -3
  247. package/components/{routes/hits/search → elements/hit}/grid/EnhancedCell.d.ts +2 -1
  248. package/components/{routes/hits/search → elements/hit}/grid/EnhancedCell.js +2 -2
  249. package/components/{routes/hits/search/grid/HitRow.d.ts → elements/hit/grid/RecordRow.d.ts} +4 -3
  250. package/components/{routes/hits/search/grid/HitRow.js → elements/hit/grid/RecordRow.js} +12 -10
  251. package/components/elements/hit/grid/RecordTable.d.ts +13 -0
  252. package/components/elements/hit/grid/RecordTable.js +84 -0
  253. package/components/elements/hit/outlines/DefaultOutline.js +2 -4
  254. package/components/elements/hit/related/PivotLink.d.ts +3 -0
  255. package/components/elements/hit/related/PivotLink.js +6 -3
  256. package/components/elements/hit/related/RelatedLink.d.ts +1 -0
  257. package/components/elements/hit/related/RelatedLink.js +18 -15
  258. package/components/elements/hit/related/RelatedRecords.js +63 -0
  259. package/components/elements/{hit/HitComments.d.ts → record/RecordComments.d.ts} +5 -4
  260. package/components/elements/{hit/HitComments.js → record/RecordComments.js} +33 -34
  261. package/components/{routes/hits/search/HitContextMenu.d.ts → elements/record/RecordContextMenu.d.ts} +3 -3
  262. package/components/elements/record/RecordContextMenu.js +268 -0
  263. package/components/elements/record/RecordContextMenu.test.d.ts +1 -0
  264. package/components/{routes/hits/search/HitContextMenu.test.js → elements/record/RecordContextMenu.test.js} +143 -49
  265. package/components/elements/record/RecordRelated.d.ts +7 -0
  266. package/components/elements/record/RecordRelated.js +34 -0
  267. package/components/elements/{hit/HitWorklog.d.ts → record/RecordWorklog.d.ts} +4 -3
  268. package/components/elements/{hit/HitWorklog.js → record/RecordWorklog.js} +16 -14
  269. package/components/elements/search/FuzzySearchBar.d.ts +7 -0
  270. package/components/elements/search/FuzzySearchBar.js +33 -0
  271. package/components/elements/search/FuzzySearchBar.test.d.ts +1 -0
  272. package/components/elements/search/FuzzySearchBar.test.js +87 -0
  273. package/components/elements/view/LayoutToggle.d.ts +8 -0
  274. package/components/elements/view/LayoutToggle.js +12 -0
  275. package/components/elements/view/ViewTitle.d.ts +4 -0
  276. package/components/elements/view/ViewTitle.js +13 -3
  277. package/components/hooks/useHitActions.d.ts +1 -1
  278. package/components/hooks/useHitActions.js +5 -5
  279. package/components/hooks/useLocalStorage.js +1 -1
  280. package/components/hooks/useLocalStorageItem.test.js +2 -2
  281. package/components/hooks/useMyApi.d.ts +1 -1
  282. package/components/hooks/useMyChart.d.ts +23 -23
  283. package/components/hooks/useMyPreferences.js +10 -1
  284. package/components/hooks/useMySearch.js +2 -2
  285. package/components/hooks/useMySitemap.js +3 -1
  286. package/components/hooks/useMySnackbar.js +1 -1
  287. package/components/hooks/useMyTheme.js +9 -2
  288. package/components/hooks/useMyTheme.test.d.ts +1 -0
  289. package/components/hooks/useMyTheme.test.js +35 -0
  290. package/components/hooks/useMyUserFunctions.d.ts +21 -21
  291. package/components/hooks/{useHitSelection.d.ts → useRecordSelection.d.ts} +2 -2
  292. package/components/hooks/{useHitSelection.js → useRecordSelection.js} +12 -33
  293. package/components/hooks/useRelatedRecords.d.ts +13 -0
  294. package/components/hooks/useRelatedRecords.js +32 -0
  295. package/components/logins/Login.js +1 -1
  296. package/components/logins/auth/OAuthLogin.js +1 -1
  297. package/components/logins/hooks/useLogin.js +2 -2
  298. package/components/routes/ErrorBoundary.d.ts +2 -13
  299. package/components/routes/ErrorBoundary.js +12 -1
  300. package/components/routes/ErrorBoundary.test.js +27 -4
  301. package/components/routes/action/edit/ActionEditor.js +6 -6
  302. package/components/routes/action/shared/OperationEntry.js +1 -1
  303. package/components/routes/action/shared/OperationStep.js +1 -1
  304. package/components/routes/action/useMyActionFunctions.js +6 -3
  305. package/components/routes/action/view/ActionDetails.js +9 -3
  306. package/components/routes/action/view/ActionSearch.js +25 -19
  307. package/components/routes/admin/users/UserEditor.js +1 -1
  308. package/components/routes/admin/users/UserSearch.js +5 -5
  309. package/components/routes/advanced/QueryBuilder.js +6 -29
  310. package/components/routes/advanced/QueryEditor.js +3 -3
  311. package/components/routes/advanced/eqlTokenProvider.test.d.ts +1 -0
  312. package/components/routes/advanced/eqlTokenProvider.test.js +34 -0
  313. package/components/routes/advanced/historyCompletionProvider.js +3 -3
  314. package/components/routes/advanced/luceneCompletionProvider.js +1 -1
  315. package/components/routes/advanced/luceneTokenProvider.test.d.ts +1 -0
  316. package/components/routes/advanced/luceneTokenProvider.test.js +34 -0
  317. package/components/routes/analytics/AnalyticComments.js +3 -5
  318. package/components/routes/analytics/AnalyticDetails.js +8 -56
  319. package/components/routes/analytics/AnalyticHitComments.js +1 -1
  320. package/components/routes/analytics/AnalyticHitComments.test.js +1 -1
  321. package/components/routes/analytics/AnalyticOverview.js +2 -2
  322. package/components/routes/analytics/AnalyticOverviews.js +1 -1
  323. package/components/routes/analytics/AnalyticSearch.js +16 -25
  324. package/components/routes/analytics/AnalyticTemplates.js +1 -1
  325. package/components/routes/analytics/TriageSettings.js +2 -2
  326. package/components/routes/analytics/widgets/Assessment.js +1 -1
  327. package/components/routes/analytics/widgets/Created.js +1 -1
  328. package/components/routes/analytics/widgets/Escalation.js +1 -1
  329. package/components/routes/analytics/widgets/Stacked.js +1 -1
  330. package/components/routes/cases/CaseViewer.d.ts +2 -0
  331. package/components/routes/cases/CaseViewer.js +44 -0
  332. package/components/routes/cases/CaseViewer.test.d.ts +1 -0
  333. package/components/routes/cases/CaseViewer.test.js +156 -0
  334. package/components/routes/cases/Cases.d.ts +2 -0
  335. package/components/routes/cases/Cases.js +140 -0
  336. package/components/routes/cases/constants.d.ts +6 -0
  337. package/components/routes/cases/constants.js +6 -0
  338. package/components/routes/cases/detail/AlertPanel.d.ts +6 -0
  339. package/components/routes/cases/detail/AlertPanel.js +34 -0
  340. package/components/routes/cases/detail/AlertPanel.test.d.ts +1 -0
  341. package/components/routes/cases/detail/AlertPanel.test.js +107 -0
  342. package/components/routes/cases/detail/CaseDashboard.d.ts +7 -0
  343. package/components/routes/cases/detail/CaseDashboard.js +66 -0
  344. package/components/routes/cases/detail/CaseDashboard.test.d.ts +1 -0
  345. package/components/routes/cases/detail/CaseDashboard.test.js +218 -0
  346. package/components/routes/cases/detail/CaseDetails.d.ts +6 -0
  347. package/components/routes/cases/detail/CaseDetails.js +79 -0
  348. package/components/routes/cases/detail/CaseDetails.test.d.ts +1 -0
  349. package/components/routes/cases/detail/CaseDetails.test.js +145 -0
  350. package/components/routes/cases/detail/CaseObservables.d.ts +6 -0
  351. package/components/routes/cases/detail/CaseObservables.js +127 -0
  352. package/components/routes/cases/detail/CaseObservables.test.d.ts +1 -0
  353. package/components/routes/cases/detail/CaseObservables.test.js +167 -0
  354. package/components/routes/cases/detail/CaseOverview.d.ts +7 -0
  355. package/components/routes/cases/detail/CaseOverview.js +40 -0
  356. package/components/routes/cases/detail/CaseRules.d.ts +7 -0
  357. package/components/routes/cases/detail/CaseRules.js +55 -0
  358. package/components/routes/cases/detail/CaseRules.test.d.ts +1 -0
  359. package/components/routes/cases/detail/CaseRules.test.js +238 -0
  360. package/components/routes/cases/detail/CaseSearch.d.ts +3 -0
  361. package/components/routes/cases/detail/CaseSearch.js +78 -0
  362. package/components/routes/cases/detail/CaseSearch.test.d.ts +1 -0
  363. package/components/routes/cases/detail/CaseSearch.test.js +154 -0
  364. package/components/routes/cases/detail/CaseSidebar.d.ts +8 -0
  365. package/components/routes/cases/detail/CaseSidebar.js +147 -0
  366. package/components/routes/cases/detail/CaseSidebar.test.d.ts +1 -0
  367. package/components/routes/cases/detail/CaseSidebar.test.js +155 -0
  368. package/components/routes/cases/detail/CaseTask.d.ts +14 -0
  369. package/components/routes/cases/detail/CaseTask.js +71 -0
  370. package/components/routes/cases/detail/CaseTask.test.d.ts +1 -0
  371. package/components/routes/cases/detail/CaseTask.test.js +143 -0
  372. package/components/routes/cases/detail/CaseTimeline.d.ts +12 -0
  373. package/components/routes/cases/detail/CaseTimeline.js +120 -0
  374. package/components/routes/cases/detail/CaseTimeline.test.d.ts +1 -0
  375. package/components/routes/cases/detail/CaseTimeline.test.js +319 -0
  376. package/components/routes/cases/detail/CreateRuleDialog.d.ts +9 -0
  377. package/components/routes/cases/detail/CreateRuleDialog.js +145 -0
  378. package/components/routes/cases/detail/CreateRuleDialog.test.d.ts +1 -0
  379. package/components/routes/cases/detail/CreateRuleDialog.test.js +218 -0
  380. package/components/routes/cases/detail/ItemPage.d.ts +6 -0
  381. package/components/routes/cases/detail/ItemPage.js +100 -0
  382. package/components/routes/cases/detail/ItemPage.test.d.ts +1 -0
  383. package/components/routes/cases/detail/ItemPage.test.js +238 -0
  384. package/components/routes/cases/detail/MarkdownPage.d.ts +8 -0
  385. package/components/routes/cases/detail/MarkdownPage.js +63 -0
  386. package/components/routes/cases/detail/MarkdownPage.test.d.ts +1 -0
  387. package/components/routes/cases/detail/MarkdownPage.test.js +116 -0
  388. package/components/routes/cases/detail/RelatedCasePanel.d.ts +6 -0
  389. package/components/routes/cases/detail/RelatedCasePanel.js +34 -0
  390. package/components/routes/cases/detail/RelatedCasePanel.test.d.ts +1 -0
  391. package/components/routes/cases/detail/RelatedCasePanel.test.js +115 -0
  392. package/components/routes/cases/detail/TaskPanel.d.ts +7 -0
  393. package/components/routes/cases/detail/TaskPanel.js +95 -0
  394. package/components/routes/cases/detail/TaskPanel.test.d.ts +1 -0
  395. package/components/routes/cases/detail/TaskPanel.test.js +145 -0
  396. package/components/routes/cases/detail/aggregates/CaseAggregate.d.ts +11 -0
  397. package/components/routes/cases/detail/aggregates/CaseAggregate.js +24 -0
  398. package/components/routes/cases/detail/aggregates/SourceAggregate.d.ts +6 -0
  399. package/components/routes/cases/detail/aggregates/SourceAggregate.js +26 -0
  400. package/components/routes/cases/detail/observables/Observable.d.ts +8 -0
  401. package/components/routes/cases/detail/observables/Observable.js +14 -0
  402. package/components/routes/cases/detail/observables/Observable.test.d.ts +1 -0
  403. package/components/routes/cases/detail/observables/Observable.test.js +80 -0
  404. package/components/routes/cases/detail/observables/ObservableTable.d.ts +7 -0
  405. package/components/routes/cases/detail/observables/ObservableTable.js +61 -0
  406. package/components/routes/cases/detail/observables/ObservableTable.test.d.ts +1 -0
  407. package/components/routes/cases/detail/observables/ObservableTable.test.js +97 -0
  408. package/components/routes/cases/detail/sidebar/CaseFolder.d.ts +22 -0
  409. package/components/routes/cases/detail/sidebar/CaseFolder.js +105 -0
  410. package/components/routes/cases/detail/sidebar/CaseFolder.test.d.ts +1 -0
  411. package/components/routes/cases/detail/sidebar/CaseFolder.test.js +98 -0
  412. package/components/routes/cases/detail/sidebar/CaseFolderContextMenu.d.ts +32 -0
  413. package/components/routes/cases/detail/sidebar/CaseFolderContextMenu.js +99 -0
  414. package/components/routes/cases/detail/sidebar/CaseFolderContextMenu.test.d.ts +1 -0
  415. package/components/routes/cases/detail/sidebar/CaseFolderContextMenu.test.js +117 -0
  416. package/components/routes/cases/detail/sidebar/FolderEntry.d.ts +25 -0
  417. package/components/routes/cases/detail/sidebar/FolderEntry.js +89 -0
  418. package/components/routes/cases/detail/sidebar/FolderEntry.test.d.ts +1 -0
  419. package/components/routes/cases/detail/sidebar/FolderEntry.test.js +81 -0
  420. package/components/routes/cases/detail/sidebar/RootDropZone.d.ts +5 -0
  421. package/components/routes/cases/detail/sidebar/RootDropZone.js +33 -0
  422. package/components/routes/cases/detail/sidebar/types.d.ts +9 -0
  423. package/components/routes/cases/detail/sidebar/utils.d.ts +10 -0
  424. package/components/routes/cases/detail/sidebar/utils.js +51 -0
  425. package/components/routes/cases/detail/sidebar/utils.test.d.ts +1 -0
  426. package/components/routes/cases/detail/sidebar/utils.test.js +82 -0
  427. package/components/routes/cases/detail/types.d.ts +22 -0
  428. package/components/routes/cases/detail/utils.d.ts +28 -0
  429. package/components/routes/cases/detail/utils.js +117 -0
  430. package/components/routes/cases/detail/utils.test.d.ts +1 -0
  431. package/components/routes/cases/detail/utils.test.js +166 -0
  432. package/components/routes/cases/hooks/useCase.d.ts +13 -0
  433. package/components/routes/cases/hooks/useCase.js +67 -0
  434. package/components/routes/cases/hooks/useCase.test.d.ts +1 -0
  435. package/components/routes/cases/hooks/useCase.test.js +170 -0
  436. package/components/routes/cases/modals/AddRecordToCaseModal.d.ts +7 -0
  437. package/components/routes/cases/modals/AddRecordToCaseModal.js +57 -0
  438. package/components/routes/cases/modals/AddRecordToCaseModal.test.d.ts +1 -0
  439. package/components/routes/cases/modals/AddRecordToCaseModal.test.js +309 -0
  440. package/components/routes/cases/modals/AddToCaseModal.d.ts +9 -0
  441. package/components/routes/cases/modals/AddToCaseModal.js +72 -0
  442. package/components/routes/cases/modals/CaseRecordRow.d.ts +9 -0
  443. package/components/routes/cases/modals/CaseRecordRow.js +14 -0
  444. package/components/routes/cases/modals/CreateCaseModal.d.ts +7 -0
  445. package/components/routes/cases/modals/CreateCaseModal.js +53 -0
  446. package/components/routes/cases/modals/CreateCaseModal.test.d.ts +1 -0
  447. package/components/routes/cases/modals/CreateCaseModal.test.js +319 -0
  448. package/components/routes/cases/modals/RenameItemModal.d.ts +9 -0
  449. package/components/routes/cases/modals/RenameItemModal.js +44 -0
  450. package/components/routes/cases/modals/ResolveModal.d.ts +7 -0
  451. package/components/routes/cases/modals/ResolveModal.js +120 -0
  452. package/components/routes/cases/modals/ResolveModal.test.d.ts +1 -0
  453. package/components/routes/cases/modals/ResolveModal.test.js +520 -0
  454. package/components/routes/cases/modals/hooks.d.ts +7 -0
  455. package/components/routes/cases/modals/hooks.js +40 -0
  456. package/components/routes/cases/modals/types.d.ts +13 -0
  457. package/components/routes/cases/search/CaseAssigneeFilter.d.ts +6 -0
  458. package/components/routes/cases/search/CaseAssigneeFilter.js +33 -0
  459. package/components/routes/cases/search/CaseAssigneeFilter.test.d.ts +1 -0
  460. package/components/routes/cases/search/CaseAssigneeFilter.test.js +127 -0
  461. package/components/routes/cases/search/CaseDateFilter.d.ts +13 -0
  462. package/components/routes/cases/search/CaseDateFilter.js +26 -0
  463. package/components/routes/cases/search/CaseDateFilter.test.d.ts +1 -0
  464. package/components/routes/cases/search/CaseDateFilter.test.js +115 -0
  465. package/components/routes/cases/search/CaseStatusFilter.d.ts +6 -0
  466. package/components/routes/cases/search/CaseStatusFilter.js +13 -0
  467. package/components/routes/cases/search/CaseStatusFilter.test.d.ts +1 -0
  468. package/components/routes/cases/search/CaseStatusFilter.test.js +86 -0
  469. package/components/routes/cases/utils.d.ts +3 -0
  470. package/components/routes/cases/utils.js +21 -0
  471. package/components/routes/dossiers/DossierEditor.js +4 -4
  472. package/components/routes/dossiers/DossierEditor.test.js +2 -2
  473. package/components/routes/dossiers/Dossiers.js +16 -14
  474. package/components/routes/dossiers/PivotForm.js +2 -4
  475. package/components/routes/events/EventViewer.d.ts +7 -0
  476. package/components/routes/events/EventViewer.js +24 -0
  477. package/components/routes/help/ApiDocumentation.js +2 -2
  478. package/components/routes/help/HitBannerDocumentation.js +2 -1
  479. package/components/routes/help/HitDocumentation.js +1 -3
  480. package/components/routes/help/HitSchemaDocumentation.js +1 -1
  481. package/components/routes/help/OverviewDocumentation.d.ts +1 -1
  482. package/components/routes/help/OverviewDocumentation.js +0 -1
  483. package/components/routes/help/RetentionDocumentation.js +2 -2
  484. package/components/routes/help/SearchDocumentation.js +1 -1
  485. package/components/routes/help/markdown/en/client.md.js +1 -1
  486. package/components/routes/help/markdown/fr/client.md.js +1 -1
  487. package/components/routes/hits/search/InformationPane.d.ts +1 -0
  488. package/components/routes/hits/search/InformationPane.js +52 -65
  489. package/components/routes/hits/search/QuerySettings.js +2 -1
  490. package/components/routes/hits/search/QuerySettings.test.js +19 -17
  491. package/components/routes/hits/search/{HitBrowser.js → RecordBrowser.js} +13 -12
  492. package/components/routes/hits/search/{HitQuery.d.ts → RecordQuery.d.ts} +2 -2
  493. package/components/routes/hits/search/{HitQuery.js → RecordQuery.js} +6 -6
  494. package/components/routes/hits/search/SearchPane.js +28 -50
  495. package/components/routes/hits/search/ViewLink.js +7 -6
  496. package/components/routes/hits/search/ViewLink.test.js +8 -9
  497. package/components/routes/hits/search/grid/RecordGrid.d.ts +3 -0
  498. package/components/routes/hits/search/grid/RecordGrid.js +64 -0
  499. package/components/routes/hits/search/shared/CustomSort.js +1 -1
  500. package/components/routes/hits/search/shared/CustomSpan.test.js +3 -4
  501. package/components/routes/hits/search/shared/HitFilter.d.ts +1 -1
  502. package/components/routes/hits/search/shared/HitSort.d.ts +1 -1
  503. package/components/routes/hits/search/shared/HitSort.js +2 -1
  504. package/components/routes/hits/search/shared/IndexPicker.d.ts +8 -0
  505. package/components/routes/hits/search/shared/IndexPicker.js +21 -0
  506. package/components/routes/hits/search/shared/LayoutSettings.js +25 -0
  507. package/components/routes/hits/search/shared/SearchActionMenu.d.ts +4 -0
  508. package/components/routes/hits/search/shared/SearchActionMenu.js +11 -0
  509. package/components/routes/hits/search/shared/SearchSpan.d.ts +1 -1
  510. package/components/routes/hits/search/shared/SearchSpan.js +1 -1
  511. package/components/routes/hits/view/HitViewer.js +16 -17
  512. package/components/routes/home/AddNewCard.js +2 -2
  513. package/components/routes/home/AddNewCard.test.js +20 -2
  514. package/components/routes/home/AnalyticCard.js +1 -1
  515. package/components/routes/home/EntryWrapper.js +1 -1
  516. package/components/routes/home/HomeSettings.js +1 -1
  517. package/components/routes/home/HomeSettings.test.d.ts +1 -0
  518. package/components/routes/home/HomeSettings.test.js +44 -0
  519. package/components/routes/home/ViewCard.js +52 -46
  520. package/components/routes/home/ViewRefresh.test.js +1 -1
  521. package/components/routes/home/index.js +2 -2
  522. package/components/routes/overviews/OverviewCard.js +1 -1
  523. package/components/routes/overviews/OverviewViewer.js +13 -10
  524. package/components/routes/overviews/Overviews.js +16 -14
  525. package/components/routes/overviews/markdownExtendedTokenProvider.js +15 -15
  526. package/components/routes/overviews/markdownExtendedTokenProvider.test.d.ts +1 -0
  527. package/components/routes/overviews/markdownExtendedTokenProvider.test.js +50 -0
  528. package/components/routes/settings/ProfileSection.js +2 -2
  529. package/components/routes/templates/TemplateEditor.d.ts +3 -2
  530. package/components/routes/templates/TemplateEditor.js +1 -1
  531. package/components/routes/templates/TemplateViewer.js +10 -5
  532. package/components/routes/templates/Templates.js +19 -14
  533. package/components/routes/views/ViewComposer.js +78 -26
  534. package/components/routes/views/Views.js +17 -14
  535. package/i18n.js +1 -1
  536. package/index.css +4 -0
  537. package/index.d.ts +1 -1
  538. package/index.js +1 -1
  539. package/locales/en/translation.json +188 -34
  540. package/locales/fr/translation.json +186 -32
  541. package/models/WithMetadata.d.ts +2 -1
  542. package/models/entities/generated/Analytic.d.ts +0 -3
  543. package/models/entities/generated/ApiType.d.ts +3 -1
  544. package/models/entities/generated/AttachmentsFile.d.ts +12 -0
  545. package/models/entities/generated/Case.d.ts +29 -0
  546. package/models/entities/generated/Column.d.ts +7 -0
  547. package/models/entities/generated/DestinationOriginal.d.ts +19 -0
  548. package/models/entities/generated/ECSEvent.d.ts +31 -0
  549. package/models/entities/generated/EmailAttachment.d.ts +8 -0
  550. package/models/entities/generated/EmailParent.d.ts +19 -0
  551. package/models/entities/generated/Enrichments.d.ts +7 -0
  552. package/models/entities/generated/EnrichmentsIndicator.d.ts +21 -0
  553. package/models/entities/generated/Event.d.ts +80 -26
  554. package/models/entities/generated/EventCloud.d.ts +20 -0
  555. package/models/entities/generated/EventDestination.d.ts +23 -0
  556. package/models/entities/generated/EventEmail.d.ts +30 -0
  557. package/models/entities/generated/EventFile.d.ts +36 -0
  558. package/models/entities/generated/EventHowler.d.ts +42 -0
  559. package/models/entities/generated/EventHttp.d.ts +11 -0
  560. package/models/entities/generated/EventObserver.d.ts +21 -0
  561. package/models/entities/generated/EventOrganization.d.ts +7 -0
  562. package/models/entities/generated/EventProcess.d.ts +34 -0
  563. package/models/entities/generated/EventSource.d.ts +23 -0
  564. package/models/entities/generated/EventThreat.d.ts +21 -0
  565. package/models/entities/generated/EventTls.d.ts +12 -0
  566. package/models/entities/generated/Hit.d.ts +3 -2
  567. package/models/entities/generated/Host.d.ts +1 -0
  568. package/models/entities/generated/Howler.d.ts +1 -6
  569. package/models/entities/generated/HttpResponse.d.ts +11 -0
  570. package/models/entities/generated/Item.d.ts +12 -0
  571. package/models/entities/generated/ObserverIngress.d.ts +9 -0
  572. package/models/entities/generated/Rule.d.ts +8 -9
  573. package/models/entities/generated/Settings.d.ts +4 -0
  574. package/models/entities/generated/Task.d.ts +10 -0
  575. package/models/entities/generated/Threat.d.ts +2 -2
  576. package/models/entities/generated/{Enrichment.d.ts → ThreatEnrichment.d.ts} +1 -1
  577. package/models/entities/generated/View.d.ts +1 -0
  578. package/models/socket/CaseUpdate.d.ts +5 -0
  579. package/models/socket/ViewersUpdate.d.ts +4 -0
  580. package/package.json +156 -137
  581. package/plugins/clue/components/ClueLeadForm.js +1 -1
  582. package/plugins/clue/components/CluePivotForm.js +2 -2
  583. package/plugins/clue/components/ClueTypography.js +2 -2
  584. package/plugins/clue/helpers.js +4 -4
  585. package/plugins/clue/index.d.ts +3 -2
  586. package/plugins/clue/index.js +0 -1
  587. package/plugins/clue/utils.d.ts +2 -1
  588. package/rest/AxiosClient.test.d.ts +1 -0
  589. package/rest/AxiosClient.test.js +185 -0
  590. package/tests/mocks.d.ts +11 -1
  591. package/tests/mocks.js +12 -7
  592. package/tests/server-handlers.js +11 -1
  593. package/tests/utils.d.ts +4 -0
  594. package/tests/utils.js +21 -0
  595. package/utils/Throttler.test.js +2 -2
  596. package/utils/actionUtils.d.ts +3 -3
  597. package/utils/classificationParser.d.ts +195 -0
  598. package/utils/classificationParser.js +680 -0
  599. package/utils/constants.d.ts +4 -3
  600. package/utils/constants.js +6 -0
  601. package/utils/localStorage.js +1 -1
  602. package/utils/menuUtils.js +0 -4
  603. package/utils/recordFunctions.d.ts +3 -0
  604. package/utils/recordFunctions.js +8 -0
  605. package/utils/recordFunctions.test.d.ts +1 -0
  606. package/utils/{hitFunctions.test.js → recordFunctions.test.js} +1 -1
  607. package/utils/socketUtils.d.ts +14 -0
  608. package/utils/socketUtils.js +17 -1
  609. package/utils/socketUtils.test.js +49 -16
  610. package/utils/stringUtils.d.ts +1 -0
  611. package/utils/stringUtils.js +7 -0
  612. package/utils/stringUtils.test.js +22 -2
  613. package/utils/typeUtils.d.ts +7 -0
  614. package/utils/typeUtils.js +27 -0
  615. package/utils/utils.d.ts +1 -1
  616. package/utils/utils.js +2 -2
  617. package/utils/utils.test.js +119 -2
  618. package/utils/viewUtils.js +3 -0
  619. package/utils/xsrf.js +1 -1
  620. package/api/analytic/rules.d.ts +0 -3
  621. package/api/analytic/rules.js +0 -8
  622. package/components/app/providers/HitProvider.d.ts +0 -22
  623. package/components/elements/display/icons/BundleButton.d.ts +0 -6
  624. package/components/elements/display/icons/BundleButton.js +0 -32
  625. package/components/elements/hit/HitRelated.d.ts +0 -6
  626. package/components/elements/hit/HitRelated.js +0 -7
  627. package/components/elements/hit/elements/HitUsers.js +0 -33
  628. package/components/routes/advanced/RuleModal.d.ts +0 -7
  629. package/components/routes/advanced/RuleModal.js +0 -83
  630. package/components/routes/analytics/RuleView.d.ts +0 -8
  631. package/components/routes/analytics/RuleView.js +0 -48
  632. package/components/routes/help/BundleDocumentation.d.ts +0 -3
  633. package/components/routes/help/BundleDocumentation.js +0 -12
  634. package/components/routes/help/markdown/en/bundles.md.js +0 -1
  635. package/components/routes/help/markdown/fr/bundles.md.js +0 -1
  636. package/components/routes/hits/search/BundleParentMenu.d.ts +0 -6
  637. package/components/routes/hits/search/BundleParentMenu.js +0 -32
  638. package/components/routes/hits/search/BundleScroller.d.ts +0 -2
  639. package/components/routes/hits/search/BundleScroller.js +0 -6
  640. package/components/routes/hits/search/HitContextMenu.js +0 -239
  641. package/components/routes/hits/search/LayoutSettings.js +0 -24
  642. package/components/routes/hits/search/grid/HitGrid.d.ts +0 -3
  643. package/components/routes/hits/search/grid/HitGrid.js +0 -132
  644. package/utils/hitFunctions.d.ts +0 -2
  645. package/utils/hitFunctions.js +0 -8
  646. /package/{components/app/providers/HitSearchProvider.test.d.ts → api/socket/viewers.test.d.ts} +0 -0
  647. /package/components/{routes/hits/search/HitContextMenu.test.d.ts → app/providers/GridColumnsProvider.test.d.ts} +0 -0
  648. /package/{utils/hitFunctions.test.d.ts → components/app/providers/RecordSearchProvider.test.d.ts} +0 -0
  649. /package/components/{routes/overviews/OverviewEditor.d.ts → elements/MarkdownEditor.d.ts} +0 -0
  650. /package/components/{routes/hits/search → elements/hit}/grid/AddColumnModal.d.ts +0 -0
  651. /package/components/elements/hit/{HitDetails.d.ts → related/RelatedRecords.d.ts} +0 -0
  652. /package/components/routes/hits/search/{HitBrowser.d.ts → RecordBrowser.d.ts} +0 -0
  653. /package/components/routes/hits/search/{LayoutSettings.d.ts → shared/LayoutSettings.d.ts} +0 -0
@@ -0,0 +1,185 @@
1
+ /// <reference types="vitest" />
2
+ import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest';
3
+ import AxiosClient from './AxiosClient';
4
+ // ---------------------------------------------------------------------------
5
+ // vi.hoisted() ensures these values are available when the vi.mock factories
6
+ // run (which happens before any module code executes).
7
+ // ---------------------------------------------------------------------------
8
+ const { mockAxiosInstance, mockAxiosError, mockInterceptorResponseUse, interceptorRef } = vi.hoisted(() => {
9
+ // Ref object used to capture the response interceptor across test resets
10
+ const _interceptorRef = { fn: null };
11
+ const _mockInterceptorResponseUse = vi.fn().mockImplementation((onFulfilled) => {
12
+ _interceptorRef.fn = onFulfilled;
13
+ });
14
+ const _mockAxiosInstance = vi.fn();
15
+ _mockAxiosInstance.interceptors = {
16
+ response: { use: _mockInterceptorResponseUse }
17
+ };
18
+ class MockAxiosError extends Error {
19
+ response;
20
+ constructor(message, response) {
21
+ super(message);
22
+ this.name = 'AxiosError';
23
+ this.response = response;
24
+ }
25
+ }
26
+ return {
27
+ mockAxiosInstance: _mockAxiosInstance,
28
+ mockAxiosError: MockAxiosError,
29
+ mockInterceptorResponseUse: _mockInterceptorResponseUse,
30
+ interceptorRef: _interceptorRef
31
+ };
32
+ });
33
+ vi.mock('axios', () => ({
34
+ create: vi.fn(() => mockAxiosInstance),
35
+ default: { create: vi.fn(() => mockAxiosInstance) },
36
+ AxiosError: mockAxiosError
37
+ }));
38
+ vi.mock('axios-retry', () => ({
39
+ default: vi.fn(),
40
+ exponentialDelay: vi.fn(),
41
+ isNetworkError: vi.fn()
42
+ }));
43
+ vi.mock('utils/sessionStorage', () => ({
44
+ getAxiosCache: vi.fn(() => ({})),
45
+ setAxiosCache: vi.fn()
46
+ }));
47
+ // ---------------------------------------------------------------------------
48
+ // Tests
49
+ // ---------------------------------------------------------------------------
50
+ describe('AxiosClient', () => {
51
+ let client;
52
+ beforeEach(() => {
53
+ interceptorRef.fn = null;
54
+ client = new AxiosClient();
55
+ });
56
+ afterEach(() => {
57
+ vi.clearAllMocks();
58
+ });
59
+ // -------------------------------------------------------------------------
60
+ // fetch() – happy paths
61
+ // -------------------------------------------------------------------------
62
+ describe('fetch() – successful responses', () => {
63
+ it('returns [data, status, headers] on a 200 response', async () => {
64
+ const payload = { api_response: { items: [] } };
65
+ mockAxiosInstance.mockResolvedValueOnce({
66
+ data: payload,
67
+ status: 200,
68
+ headers: { 'content-type': 'application/json' }
69
+ });
70
+ const result = await client.fetch('/api/v1/hit');
71
+ expect(result[0]).toEqual(payload);
72
+ expect(result[1]).toBe(200);
73
+ });
74
+ it('uses GET as the default HTTP method', async () => {
75
+ mockAxiosInstance.mockResolvedValueOnce({ data: {}, status: 200, headers: {} });
76
+ await client.fetch('/api/v1/hit');
77
+ const config = mockAxiosInstance.mock.calls[0][0];
78
+ expect(config.method).toBe('get');
79
+ });
80
+ it('passes POST as the HTTP method when specified', async () => {
81
+ mockAxiosInstance.mockResolvedValueOnce({ data: {}, status: 201, headers: {} });
82
+ await client.fetch('/api/v1/hit', 'post', { key: 'val' });
83
+ const config = mockAxiosInstance.mock.calls[0][0];
84
+ expect(config.method).toBe('post');
85
+ });
86
+ it('serialises the body as a JSON string', async () => {
87
+ mockAxiosInstance.mockResolvedValueOnce({ data: {}, status: 200, headers: {} });
88
+ await client.fetch('/api/v1/hit', 'post', { status: 'open' });
89
+ const config = mockAxiosInstance.mock.calls[0][0];
90
+ expect(config.data).toBe(JSON.stringify({ status: 'open' }));
91
+ });
92
+ it('passes URLSearchParams through as params', async () => {
93
+ mockAxiosInstance.mockResolvedValueOnce({ data: {}, status: 200, headers: {} });
94
+ const params = new URLSearchParams({ q: 'test' });
95
+ await client.fetch('/api/v1/hit', 'get', undefined, params);
96
+ const config = mockAxiosInstance.mock.calls[0][0];
97
+ expect(config.params).toBe(params);
98
+ });
99
+ it('forwards custom headers', async () => {
100
+ mockAxiosInstance.mockResolvedValueOnce({ data: {}, status: 200, headers: {} });
101
+ const headers = { Authorization: '******' };
102
+ await client.fetch('/api/v1/hit', 'get', undefined, undefined, headers);
103
+ const config = mockAxiosInstance.mock.calls[0][0];
104
+ expect(config.headers).toEqual(headers);
105
+ });
106
+ it('sets withCredentials to true', async () => {
107
+ mockAxiosInstance.mockResolvedValueOnce({ data: {}, status: 200, headers: {} });
108
+ await client.fetch('/api/v1/hit');
109
+ const config = mockAxiosInstance.mock.calls[0][0];
110
+ expect(config.withCredentials).toBe(true);
111
+ });
112
+ it('passes the URL through to the axios config', async () => {
113
+ mockAxiosInstance.mockResolvedValueOnce({ data: {}, status: 200, headers: {} });
114
+ await client.fetch('/api/v1/test-url');
115
+ const config = mockAxiosInstance.mock.calls[0][0];
116
+ expect(config.url).toBe('/api/v1/test-url');
117
+ });
118
+ });
119
+ // -------------------------------------------------------------------------
120
+ // fetch() – error handling
121
+ // -------------------------------------------------------------------------
122
+ describe('fetch() – error handling', () => {
123
+ it('returns [data, status, headers] when the error is an AxiosError with a response', async () => {
124
+ const errorResponse = { data: { error: 'not found' }, status: 404, headers: {} };
125
+ const axiosErr = new mockAxiosError('Not Found', errorResponse);
126
+ mockAxiosInstance.mockRejectedValueOnce(axiosErr);
127
+ const result = await client.fetch('/api/v1/missing');
128
+ expect(result[0]).toEqual({ error: 'not found' });
129
+ expect(result[1]).toBe(404);
130
+ });
131
+ it('rethrows non-AxiosError exceptions', async () => {
132
+ mockAxiosInstance.mockRejectedValueOnce(new TypeError('network failure'));
133
+ await expect(client.fetch('/api/v1/hit')).rejects.toThrow('network failure');
134
+ });
135
+ it('rethrows AxiosError that has no response body', async () => {
136
+ // AxiosError without a .response property → condition `e.response?.data` is falsy → rethrow
137
+ const axiosErr = new mockAxiosError('timeout');
138
+ mockAxiosInstance.mockRejectedValueOnce(axiosErr);
139
+ await expect(client.fetch('/api/v1/hit')).rejects.toThrow('timeout');
140
+ });
141
+ });
142
+ // -------------------------------------------------------------------------
143
+ // AxiosCache – response interceptor
144
+ // -------------------------------------------------------------------------
145
+ describe('AxiosCache response interceptor', () => {
146
+ it('is registered on the axios instance during construction', () => {
147
+ expect(mockInterceptorResponseUse).toHaveBeenCalled();
148
+ expect(interceptorRef.fn).toBeTypeOf('function');
149
+ });
150
+ it('stores a new etag cache entry on a 2xx response with an etag header', async () => {
151
+ const { setAxiosCache } = await import('utils/sessionStorage');
152
+ const res = {
153
+ status: 200,
154
+ headers: { etag: '"abc123"' },
155
+ data: { value: 1 },
156
+ config: { headers: {} }
157
+ };
158
+ await interceptorRef.fn(res);
159
+ expect(setAxiosCache).toHaveBeenCalledWith('"abc123"', { value: 1 });
160
+ });
161
+ it('replaces data from cache on a 304 response', async () => {
162
+ const { getAxiosCache } = await import('utils/sessionStorage');
163
+ getAxiosCache.mockReturnValueOnce({ '"etag-v1"': { cached: true } });
164
+ const res = {
165
+ status: 304,
166
+ headers: {},
167
+ data: null,
168
+ config: { headers: { 'If-Match': '"etag-v1"' } }
169
+ };
170
+ const result = await interceptorRef.fn(res);
171
+ expect(result.data).toEqual({ cached: true });
172
+ });
173
+ it('passes through a 2xx response without an etag without caching', async () => {
174
+ const { setAxiosCache } = await import('utils/sessionStorage');
175
+ const res = {
176
+ status: 200,
177
+ headers: {},
178
+ data: { ok: true },
179
+ config: { headers: {} }
180
+ };
181
+ await interceptorRef.fn(res);
182
+ expect(setAxiosCache).not.toHaveBeenCalled();
183
+ });
184
+ });
185
+ });
package/tests/mocks.d.ts CHANGED
@@ -7,7 +7,17 @@ export declare const setupContextSelectorMock: () => void;
7
7
  * Sets up a mock for react-router-dom with common defaults
8
8
  * @param options - Override specific router behavior
9
9
  */
10
- export declare const setupReactRouterMock: () => void;
10
+ export declare const setupReactRouterMock: () => {
11
+ mockSearchParams: URLSearchParams;
12
+ mockSetParams: import("vitest").Mock<(...args: any[]) => any>;
13
+ mockLocation: {
14
+ pathname: string;
15
+ search: string;
16
+ };
17
+ mockParams: {
18
+ id: any;
19
+ };
20
+ };
11
21
  /**
12
22
  * Sets up a mock localStorage instance
13
23
  */
package/tests/mocks.js CHANGED
@@ -31,15 +31,20 @@ export const setupReactRouterMock = () => {
31
31
  const mockSearchParams = vi.hoisted(() => new URLSearchParams());
32
32
  const mockSetParams = vi.hoisted(() => vi.fn());
33
33
  beforeAll(() => {
34
- vi.mock('react-router-dom', () => ({
35
- Link: forwardRef(({ to, children, ...props }, ref) => (_jsx("a", { ref: ref, href: to, ...props, children: children }))),
36
- useLocation: vi.fn(() => mockLocation),
37
- useParams: vi.fn(() => mockParams),
38
- useSearchParams: vi.fn(() => [mockSearchParams, mockSetParams]),
39
- useNavigate: () => vi.fn()
40
- }));
34
+ vi.mock('react-router-dom', async () => {
35
+ const actual = await vi.importActual('react-router-dom');
36
+ return {
37
+ ...actual,
38
+ Link: forwardRef(({ to, children, ...props }, ref) => (_jsx("a", { ref: ref, href: to, ...props, children: children }))),
39
+ useLocation: vi.fn(() => mockLocation),
40
+ useParams: vi.fn(() => mockParams),
41
+ useSearchParams: vi.fn(() => [mockSearchParams, mockSetParams]),
42
+ useNavigate: () => vi.fn()
43
+ };
44
+ });
41
45
  });
42
46
  afterAll(() => vi.resetModules());
47
+ return { mockSearchParams, mockSetParams, mockLocation, mockParams };
43
48
  };
44
49
  /**
45
50
  * Sets up a mock localStorage instance
@@ -30,7 +30,17 @@ export const MOCK_RESPONSES = {
30
30
  total: 1,
31
31
  rows: 1
32
32
  },
33
- '/api/v1/analytic': [createMockAnalytic()]
33
+ '/api/v1/analytic': [createMockAnalytic()],
34
+ '/api/v2/search/hit,event': {
35
+ items: [],
36
+ total: 0,
37
+ rows: 0
38
+ },
39
+ '/api/v2/search/hit': {
40
+ items: [],
41
+ total: 0,
42
+ rows: 0
43
+ }
34
44
  };
35
45
  const handlers = [
36
46
  ...Object.entries(MOCK_RESPONSES).map(([path, data]) => http.all(path, async () => HttpResponse.json({ api_response: data }))),
package/tests/utils.d.ts CHANGED
@@ -1,6 +1,8 @@
1
1
  import type { Action } from '@cccsaurora/howler-ui/models/entities/generated/Action';
2
2
  import type { Analytic } from '@cccsaurora/howler-ui/models/entities/generated/Analytic';
3
+ import type { Case } from '@cccsaurora/howler-ui/models/entities/generated/Case';
3
4
  import type { Dossier } from '@cccsaurora/howler-ui/models/entities/generated/Dossier';
5
+ import type { Event } from '@cccsaurora/howler-ui/models/entities/generated/Event';
4
6
  import type { Hit } from '@cccsaurora/howler-ui/models/entities/generated/Hit';
5
7
  import type { Template } from '@cccsaurora/howler-ui/models/entities/generated/Template';
6
8
  import type { View } from '@cccsaurora/howler-ui/models/entities/generated/View';
@@ -8,9 +10,11 @@ type RecursivePartial<T> = {
8
10
  [P in keyof T]?: T[P] extends (infer U)[] ? RecursivePartial<U>[] : T[P] extends object | undefined ? RecursivePartial<T[P]> : T[P];
9
11
  };
10
12
  export declare const createMockHit: (overrides?: RecursivePartial<Hit>) => Hit;
13
+ export declare const createMockEvent: (overrides?: RecursivePartial<Event>) => Event;
11
14
  export declare const createMockAnalytic: (overrides?: Partial<Analytic>) => Analytic;
12
15
  export declare const createMockTemplate: (overrides?: Partial<Template>) => Template;
13
16
  export declare const createMockAction: (overrides?: Partial<Action>) => Action;
14
17
  export declare const createMockView: (overrides?: Partial<View>) => View;
18
+ export declare const createMockCase: (overrides?: Partial<Case>) => Case;
15
19
  export declare const createMockDossier: (overrides?: Partial<Dossier>) => Dossier;
16
20
  export {};
package/tests/utils.js CHANGED
@@ -1,5 +1,7 @@
1
1
  // Mock data factories
2
2
  export const createMockHit = (overrides) => ({
3
+ ...overrides,
4
+ __index: 'hit',
3
5
  howler: {
4
6
  id: 'test-hit-1',
5
7
  analytic: 'test-analytic',
@@ -14,6 +16,17 @@ export const createMockHit = (overrides) => ({
14
16
  ...overrides?.event
15
17
  }
16
18
  });
19
+ export const createMockEvent = (overrides) => ({
20
+ ...overrides,
21
+ __index: 'event',
22
+ howler: {
23
+ id: 'test-event-1',
24
+ analytic: 'test-analytic',
25
+ detection: 'Test Detection',
26
+ hash: '',
27
+ ...overrides?.howler
28
+ }
29
+ });
17
30
  export const createMockAnalytic = (overrides) => ({
18
31
  analytic_id: 'test-analytic-id',
19
32
  name: 'test-analytic',
@@ -52,6 +65,14 @@ export const createMockView = (overrides) => ({
52
65
  },
53
66
  ...overrides
54
67
  });
68
+ export const createMockCase = (overrides) => ({
69
+ __index: 'case',
70
+ case_id: 'test-case-id',
71
+ title: 'Test Case',
72
+ summary: 'Test case summary',
73
+ items: [],
74
+ ...overrides
75
+ });
55
76
  // Helper function to create mock dossiers
56
77
  export const createMockDossier = (overrides) => ({
57
78
  dossier_id: 'test-dossier-id',
@@ -97,7 +97,7 @@ describe('Throttler', () => {
97
97
  it('does not invoke fn before the delay', async () => {
98
98
  const fn = vi.fn().mockResolvedValue('x');
99
99
  const t = new Throttler(100);
100
- t.delayAsync(fn);
100
+ void t.delayAsync(fn);
101
101
  expect(fn).not.toHaveBeenCalled();
102
102
  });
103
103
  it('resolves with the return value of fn', async () => {
@@ -124,7 +124,7 @@ describe('Throttler', () => {
124
124
  it('cancels the previous pending call when invoked again', async () => {
125
125
  const fn = vi.fn().mockResolvedValue(42);
126
126
  const t = new Throttler(100);
127
- t.delayAsync(fn);
127
+ void t.delayAsync(fn);
128
128
  vi.advanceTimersByTime(50);
129
129
  const second = t.delayAsync(fn);
130
130
  vi.advanceTimersByTime(100);
@@ -14,18 +14,18 @@ export declare const checkArgsAreFilled: (step: ActionOperationStep, values: str
14
14
  * @param context The values provided so far by the user
15
15
  * @returns a list of options matching the current context
16
16
  */
17
- export declare const getOptionsByContext: (options: ActionOperationStep["options"], arg: string, context: string) => string[];
17
+ export declare const getOptionsByContext: (options: ActionOperationStep['options'], arg: string, context: string) => string[];
18
18
  /**
19
19
  * Get a list of arguments to display based on the current context, using the current values supplied for the action entry.
20
20
  * @param args a complete list of all arguments in the action
21
21
  * @param values the current list of values provided by the user
22
22
  * @returns A list of arguments to display
23
23
  */
24
- export declare const getArgsByContext: (args: ActionOperationStep["args"], values: string) => string[];
24
+ export declare const getArgsByContext: (args: ActionOperationStep['args'], values: string) => string[];
25
25
  /**
26
26
  * Check to see if a given action has all the data necessary to execute successfully
27
27
  * @param data The user-provided data
28
28
  * @param action The action to validate
29
29
  * @returns whether the action is ready to execute
30
30
  */
31
- export declare const operationReady: (data: Operation["data_json"], action: ActionOperation) => boolean;
31
+ export declare const operationReady: (data: Operation['data_json'], action: ActionOperation) => boolean;
@@ -0,0 +1,195 @@
1
+ /**
2
+ * Classification related utils.
3
+ *
4
+ * WARNING:
5
+ * Actual classification enforcement is handled server side. These utils are convenience functions mostly used for
6
+ * display purposes. They and are not expected to be used for critical access control enforcement. As such, error
7
+ * conditions are not raised and suitable default values are returned.
8
+ *
9
+ */
10
+ export type FormatProp = 'long' | 'short';
11
+ type LevelStylesheet = {
12
+ banner?: string;
13
+ label?: string;
14
+ text?: string;
15
+ color?: string;
16
+ };
17
+ type ClassificationLevel = {
18
+ aliases: string[];
19
+ css: LevelStylesheet;
20
+ description: string;
21
+ lvl: number;
22
+ name: string;
23
+ short_name: string;
24
+ is_hidden?: boolean;
25
+ };
26
+ type ClassificationRequired = {
27
+ aliases: string[];
28
+ description: string;
29
+ name: string;
30
+ is_required_group?: boolean;
31
+ require_lvl?: number;
32
+ short_name: string;
33
+ is_hidden?: boolean;
34
+ };
35
+ type ClassificationGroup = {
36
+ aliases: string[];
37
+ auto_select?: boolean;
38
+ description: string;
39
+ name: string;
40
+ short_name: string;
41
+ solitary_display_name?: string;
42
+ is_hidden?: boolean;
43
+ };
44
+ type ClassificationSubGroup = {
45
+ aliases: string[];
46
+ auto_select?: boolean;
47
+ description: string;
48
+ limited_to_group?: string;
49
+ name: string;
50
+ require_group?: string;
51
+ short_name: string;
52
+ solitary_display_name?: string;
53
+ is_hidden?: boolean;
54
+ };
55
+ type ClassificationYAMLDefinition = {
56
+ dynamic_groups: boolean;
57
+ dynamic_groups_type: string;
58
+ enforce: boolean;
59
+ groups: ClassificationGroup[];
60
+ levels: ClassificationLevel[];
61
+ required: ClassificationRequired[];
62
+ restricted: string;
63
+ subgroups: ClassificationSubGroup[];
64
+ unrestricted: string;
65
+ };
66
+ type StringMap = {
67
+ [propName: string]: string;
68
+ };
69
+ type StringMapArray = {
70
+ [propName: string]: string[];
71
+ };
72
+ type StylesheetMap = {
73
+ [propName: string]: LevelStylesheet;
74
+ };
75
+ type ParamsMap = {
76
+ [propName: string]: {
77
+ is_required_group?: boolean;
78
+ solitary_display_name?: string;
79
+ require_lvl?: number;
80
+ require_group?: string;
81
+ limited_to_group?: string;
82
+ is_hidden?: boolean;
83
+ };
84
+ };
85
+ export type ClassificationDefinition = {
86
+ RESTRICTED: string;
87
+ UNRESTRICTED: string;
88
+ access_req_aliases: StringMapArray;
89
+ access_req_map_lts: StringMap;
90
+ access_req_map_stl: StringMap;
91
+ description: StringMap;
92
+ dynamic_groups: boolean;
93
+ dynamic_groups_type: 'email' | 'group' | 'all';
94
+ enforce: boolean;
95
+ groups_aliases: StringMapArray;
96
+ groups_auto_select: string[];
97
+ groups_auto_select_short: string[];
98
+ groups_map_lts: StringMap;
99
+ groups_map_stl: StringMap;
100
+ invalid_mode: boolean;
101
+ levels_aliases: StringMap;
102
+ levels_map: StringMap;
103
+ levels_map_lts: StringMap;
104
+ levels_map_stl: StringMap;
105
+ levels_styles_map: StylesheetMap;
106
+ original_definition: ClassificationYAMLDefinition;
107
+ params_map: ParamsMap;
108
+ subgroups_aliases: StringMapArray;
109
+ subgroups_auto_select: string[];
110
+ subgroups_auto_select_short: string[];
111
+ subgroups_map_lts: StringMap;
112
+ subgroups_map_stl: StringMap;
113
+ };
114
+ export type ClassificationParts = {
115
+ lvlIdx: number;
116
+ lvl: string;
117
+ req: string[];
118
+ groups: string[];
119
+ subgroups: string[];
120
+ };
121
+ export declare const defaultParts: ClassificationParts;
122
+ type DisabledControls = {
123
+ levels: string[];
124
+ groups: string[];
125
+ };
126
+ export declare const defaultDisabled: DisabledControls;
127
+ export declare class InvalidClassification extends Error {
128
+ }
129
+ export declare const getLevelText: (lvl: number, c12nDef: ClassificationDefinition, format: FormatProp, isMobile: boolean) => string;
130
+ export declare const getParts: (c12n: string, c12nDef: ClassificationDefinition, format: FormatProp, isMobile: boolean) => ClassificationParts;
131
+ export declare const canSeeRequired: (user_req: string[], req: string[]) => boolean;
132
+ export declare const canSeeGroups: (user_groups: string[], groups: string[]) => boolean;
133
+ /**
134
+ * Normalize a given classification by applying the rules defined in the classification definition.
135
+ * This function will remove any invalid parts and add missing parts to the classification.
136
+ * It will also ensure that the display of the classification is always done the same way
137
+ *
138
+ * Note: This function mutates the passed in `parts` parameter.
139
+ *
140
+ * @param parts - `ClassificationParts` object containing the parsed classification components
141
+ * @param c12nDef - ClassificationDefinition returned by the API server
142
+ * @param format - return results in `long` or `short` format
143
+ * @param isMobile - `true`/`false` if the results should be returned for display on a mobile device
144
+ * @param skipAutoSelect - `true`/`false` skip auto selecting required groups
145
+ *
146
+ * @returns A normalized version of the original classification
147
+ *
148
+ */
149
+ export declare const normalizedClassification: (parts: ClassificationParts, c12nDef: ClassificationDefinition, format: FormatProp, isMobile: boolean, skipAutoSelect?: boolean) => string;
150
+ type ClassificationValidator = {
151
+ disabled: DisabledControls;
152
+ parts: ClassificationParts;
153
+ };
154
+ export declare const defaultClassificationValidator: ClassificationValidator;
155
+ /**
156
+ * Applies the Level, Require and Group rules and returns valid and invalid options based on the given input
157
+ *
158
+ * @param parts - `ClassificationParts` object containing the parsed classification components
159
+ * @param c12nDef - ClassificationDefinition returned by the API server
160
+ * @param format - return results in `long` or `short` format
161
+ * @param isMobile - `true`/`false` if the results should be returned for display on a mobile device
162
+ * @param userClassification - `true`/`false` if to apply `auto select` based on the user
163
+ *
164
+ * @returns The most restrictive classification that we could create out of the two
165
+ *
166
+ */
167
+ export declare const applyClassificationRules: (parts: ClassificationParts, c12nDef: ClassificationDefinition, format: FormatProp, isMobile: boolean, userClassification?: boolean) => ClassificationValidator;
168
+ /**
169
+ * Mixes two classifications and returns to most restrictive form for them
170
+ *
171
+ * @param c12n_1 - First classification
172
+ * @param c12n_2 - Second classification
173
+ * @param c12nDef - ClassificationDefinition returned by the API server
174
+ * @param format - return results in `long` or `short` format
175
+ * @param isMobile - `true`/`false` if the results should be returned for display on a mobile device
176
+ *
177
+ * @returns The most restrictive classification that we could create out of the two
178
+ *
179
+ */
180
+ export declare const getMaxClassification: (c12n_1: string, c12n_2: string, c12nDef: ClassificationDefinition, format: FormatProp, isMobile: boolean) => string;
181
+ /**
182
+ *
183
+ * Given a user classification, check if a user is allow to see a certain classification
184
+ *
185
+ * @param user_c12n - Maximum classification for the user
186
+ * @param c12n - Classification the user wishes to see
187
+ * @param c12nDef - ClassificationDefinition returned by the API server
188
+ * @param enforce - `true`/`false` if access controls are enabled
189
+ * @param ignoreInvalid - `true`/`false` if invalid classifications should raise errors or just deny access
190
+ *
191
+ * @returns True is the user can see the classification
192
+ *
193
+ */
194
+ export declare const isAccessible: (user_c12n: string, c12n: string, c12nDef: ClassificationDefinition, enforce?: boolean, ignoreInvalid?: boolean) => boolean;
195
+ export {};