@oneuptime/common 12.0.13 → 12.0.14

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 (376) hide show
  1. package/Models/DatabaseModels/OnCallDutyPolicySchedule.ts +14 -0
  2. package/Models/DatabaseModels/UserCall.ts +94 -3
  3. package/Models/DatabaseModels/UserEmail.ts +94 -3
  4. package/Models/DatabaseModels/UserIncomingCallNumber.ts +94 -3
  5. package/Models/DatabaseModels/UserPush.ts +37 -0
  6. package/Models/DatabaseModels/UserSMS.ts +94 -3
  7. package/Models/DatabaseModels/UserWhatsApp.ts +93 -2
  8. package/Server/API/BaseAPI.ts +79 -14
  9. package/Server/API/UserCallAPI.ts +53 -45
  10. package/Server/API/UserEmailAPI.ts +53 -44
  11. package/Server/API/UserIncomingCallNumberAPI.ts +48 -38
  12. package/Server/API/UserNotificationMethodAdminAPI.ts +481 -0
  13. package/Server/API/UserPushAPI.ts +126 -2
  14. package/Server/API/UserSmsAPI.ts +53 -44
  15. package/Server/API/UserWhatsAppAPI.ts +53 -50
  16. package/Server/Infrastructure/Postgres/SchemaMigrations/1787142779538-MigrationName.ts +154 -0
  17. package/Server/Infrastructure/Postgres/SchemaMigrations/1787156982416-MigrationName.ts +17 -0
  18. package/Server/Infrastructure/Postgres/SchemaMigrations/1787700000000-FixTotpOtpUrlAlgorithm.ts +45 -0
  19. package/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts +6 -0
  20. package/Server/Middleware/VerificationCodeRateLimit.ts +586 -0
  21. package/Server/Services/AnalyticsDatabaseService.ts +169 -0
  22. package/Server/Services/DatabaseService.ts +101 -0
  23. package/Server/Services/LogAggregationService.ts +5 -0
  24. package/Server/Services/PushNotificationService.ts +127 -12
  25. package/Server/Services/TeamMemberService.ts +53 -13
  26. package/Server/Services/UserCallService.ts +55 -24
  27. package/Server/Services/UserEmailService.ts +83 -17
  28. package/Server/Services/UserIncomingCallNumberService.ts +49 -85
  29. package/Server/Services/UserNotificationMethodAdminService.ts +1527 -0
  30. package/Server/Services/UserNotificationRuleService.ts +26 -0
  31. package/Server/Services/UserPushService.ts +89 -0
  32. package/Server/Services/UserSmsService.ts +50 -17
  33. package/Server/Services/UserWhatsAppService.ts +48 -15
  34. package/Server/Types/Database/QueryHelper.ts +30 -0
  35. package/Server/Utils/AnalyticsDatabase/QuerySettingsHelper.ts +59 -0
  36. package/Server/Utils/ChannelVerification.ts +510 -0
  37. package/Server/Utils/Monitor/Criteria/IncomingRequestCriteria.ts +13 -16
  38. package/Server/Utils/Monitor/MonitorAlert.ts +24 -21
  39. package/Server/Utils/Monitor/MonitorIncident.ts +21 -18
  40. package/Server/Utils/Monitor/MonitorResourceContext.ts +107 -0
  41. package/Server/Utils/Monitor/MonitorStepResourceIdentity.ts +442 -0
  42. package/Server/Utils/Monitor/SeriesResourceLabels.ts +3 -3
  43. package/Server/Utils/Monitor/SeriesResourceLinker.ts +96 -28
  44. package/Server/Utils/TotpAuth.ts +137 -9
  45. package/Server/Utils/UserRegistrationToken.ts +182 -0
  46. package/Server/Utils/VerificationCode.ts +134 -0
  47. package/Tests/App/Dashboard/AdminNotificationRulesPage.test.tsx +173 -94
  48. package/Tests/App/Dashboard/AdminUserNotificationMethodsPage.test.tsx +1151 -0
  49. package/Tests/App/Dashboard/AdminUserOnCallPages.test.tsx +905 -0
  50. package/Tests/App/Dashboard/DashboardCommandPalette.test.tsx +338 -0
  51. package/Tests/App/Dashboard/InvestigationPanel.test.tsx +1 -1
  52. package/Tests/App/Dashboard/MonitorTypePicker.test.tsx +28 -0
  53. package/Tests/Models/UserPushCriticalAlertColumn.test.ts +172 -0
  54. package/Tests/Server/API/BaseAPIGetListParallel.test.ts +519 -0
  55. package/Tests/Server/API/NotificationChannelVerificationAPI.test.ts +543 -0
  56. package/Tests/Server/API/UserIncomingCallNumberApi.test.ts +108 -18
  57. package/Tests/Server/API/UserNotificationMethodAdminAPI.test.ts +963 -0
  58. package/Tests/Server/API/UserPushCriticalAlertsApi.test.ts +114 -0
  59. package/Tests/Server/API/UserSmsApi.test.ts +107 -14
  60. package/Tests/Server/API/UserTotpAuthAPI.test.ts +427 -0
  61. package/Tests/Server/Infrastructure/Postgres/FixTotpOtpUrlAlgorithmMigration.test.ts +315 -0
  62. package/Tests/Server/Middleware/VerificationCodeRateLimit.test.ts +775 -0
  63. package/Tests/Server/Services/AddNetworkDeviceReachabilityColumnsMigration.test.ts +10 -62
  64. package/Tests/Server/Services/AnalyticsDatabasePaginationStability.test.ts +33 -13
  65. package/Tests/Server/Services/AnalyticsDatabaseSortKeyBoundary.test.ts +658 -0
  66. package/Tests/Server/Services/CriticalOnCallAlertDelivery.test.ts +458 -0
  67. package/Tests/Server/Services/CriticalPushAlertPayload.test.ts +301 -0
  68. package/Tests/Server/Services/DatabaseServiceAtomicIncrement.test.ts +143 -0
  69. package/Tests/Server/Services/DeliverNotificationForRuleExtraction.test.ts +1 -0
  70. package/Tests/Server/Services/LogAggregationScanMemory.test.ts +421 -0
  71. package/Tests/Server/Services/LogAggregationService.test.ts +2 -2
  72. package/Tests/Server/Services/NotificationChannelCodeIssuance.test.ts +401 -0
  73. package/Tests/Server/Services/PushNotificationDeliveryOptions.test.ts +204 -0
  74. package/Tests/Server/Services/TeamMemberAutoAcceptInvitation.test.ts +21 -1
  75. package/Tests/Server/Services/TeamMemberInviteRegistrationToken.test.ts +290 -0
  76. package/Tests/Server/Services/UserNotificationMethodAdminService.test.ts +948 -0
  77. package/Tests/Server/Services/UserNotificationRuleExecuteItem.test.ts +1 -0
  78. package/Tests/Server/Services/UserPushCriticalAlertToggle.test.ts +255 -0
  79. package/Tests/Server/Services/UserTotpAuthEnrolment.test.ts +218 -0
  80. package/Tests/Server/TestingUtils/AuthenticatorApp.ts +248 -0
  81. package/Tests/Server/Types/Database/Permissions/NotificationChannelVerificationColumns.test.ts +135 -0
  82. package/Tests/Server/Types/Database/Permissions/OnCallScheduleRelationSelect.test.ts +504 -0
  83. package/Tests/Server/Types/Database/QueryHelperFindWithSameTextAnyOf.test.ts +91 -0
  84. package/Tests/Server/Types/Workflow/Components/JsonToText.test.ts +384 -0
  85. package/Tests/Server/Types/Workflow/Components/MergeJson.test.ts +403 -0
  86. package/Tests/Server/Utils/Browser.test.ts +162 -0
  87. package/Tests/Server/Utils/ChannelVerification.test.ts +689 -0
  88. package/Tests/Server/Utils/Express.test.ts +371 -0
  89. package/Tests/Server/Utils/Monitor/Criteria/CustomCodeMonitorCriteria.test.ts +707 -0
  90. package/Tests/Server/Utils/Monitor/Criteria/DnsMonitorCriteria.test.ts +698 -0
  91. package/Tests/Server/Utils/Monitor/Criteria/IncomingEmailBodyCriteria.test.ts +243 -0
  92. package/Tests/Server/Utils/Monitor/Criteria/IncomingRequestBodyCriteria.test.ts +278 -0
  93. package/Tests/Server/Utils/Monitor/MonitorAlertResourceLinking.test.ts +160 -20
  94. package/Tests/Server/Utils/Monitor/MonitorDependencySuppressionCreatorSkip.test.ts +13 -8
  95. package/Tests/Server/Utils/Monitor/MonitorIncidentResourceLinking.test.ts +162 -18
  96. package/Tests/Server/Utils/Monitor/MonitorResourceContext.test.ts +349 -0
  97. package/Tests/Server/Utils/Monitor/MonitorStepResourceIdentity.test.ts +690 -0
  98. package/Tests/Server/Utils/Monitor/MonitorSummaryPersistence.test.ts +7 -2
  99. package/Tests/Server/Utils/Monitor/SeriesResourceLinker.test.ts +92 -18
  100. package/Tests/Server/Utils/PushNotificationUtilCreators.test.ts +267 -0
  101. package/Tests/Server/Utils/Telemetry/OneuptimeLabel.test.ts +439 -0
  102. package/Tests/Server/Utils/TotpAuth.test.ts +719 -0
  103. package/Tests/Server/Utils/UserRegistrationToken.test.ts +322 -0
  104. package/Tests/Server/Utils/VerificationCode.test.ts +296 -0
  105. package/Tests/Types/AutoRemediation/AutoRemediationSuggestionStatus.test.ts +192 -0
  106. package/Tests/Types/Call/CallRequest.test.ts +189 -0
  107. package/Tests/Types/Dashboard/DashboardSize.test.ts +226 -0
  108. package/Tests/Types/Incident/IncidentSlaStatus.test.ts +191 -0
  109. package/Tests/Types/Metrics/MetricDashboardMetricType.test.ts +278 -0
  110. package/Tests/Types/Metrics/MetricPipelineRuleType.test.ts +517 -0
  111. package/Tests/Types/Monitor/IncomingMonitorDefaultCriteria.test.ts +470 -0
  112. package/Tests/Types/Monitor/MonitorCriteriaInstance.test.ts +6 -4
  113. package/Tests/Types/Monitor/Recommendation/MonitorRecommendationCatalog.test.ts +262 -5
  114. package/Tests/Types/Monitor/Recommendation/MonitorRecommendationCoverage.test.ts +1 -1
  115. package/Tests/Types/Monitor/Recommendation/MonitorRecommendationNotificationMode.test.ts +1 -1
  116. package/Tests/Types/Monitor/ServiceAlertTemplates.test.ts +905 -0
  117. package/Tests/Types/Service/ServiceLanguage.test.ts +255 -0
  118. package/Tests/Types/TextRandomGeneration.test.ts +211 -0
  119. package/Tests/UI/Components/Button.test.tsx +175 -1
  120. package/Tests/UI/Components/CodeBlockLanguages.test.tsx +236 -0
  121. package/Tests/UI/Components/CommandPalette/CommandPalette.test.tsx +568 -0
  122. package/Tests/UI/Components/CommandPalette/CommandPaletteKeyboard.test.tsx +239 -0
  123. package/Tests/UI/Components/CommandPalette/CommandPaletteProviders.test.tsx +400 -0
  124. package/Tests/UI/Components/CommandPalette/PaletteFilter.test.ts +234 -0
  125. package/Tests/UI/Components/CommandPalette/RecentCommands.test.ts +97 -0
  126. package/Tests/UI/Components/CountModelSideMenuItemGuard.test.tsx +198 -0
  127. package/Tests/UI/Components/FeedItemSafeMode.test.tsx +1 -1
  128. package/Tests/UI/Components/Forms/Utils/FormFieldSchemaTypeUtil.test.ts +267 -0
  129. package/Tests/UI/Components/List.test.tsx +9 -2
  130. package/Tests/UI/Components/ListLoadingStates.test.tsx +173 -0
  131. package/Tests/UI/Components/MarkdownLazy.test.tsx +113 -0
  132. package/Tests/UI/Components/MarkdownMermaidRetry.test.tsx +110 -0
  133. package/Tests/UI/Components/ModelTable/useCustomFieldColumns.test.tsx +8 -0
  134. package/Tests/UI/Components/MonitorTemplateVariables/TemplateVariablesCatalog.test.ts +692 -0
  135. package/Tests/UI/Components/MoreMenuMotion.test.tsx +118 -0
  136. package/Tests/UI/Components/NavBarCommandKGating.test.tsx +178 -0
  137. package/Tests/UI/Components/OrderedStatesList.test.tsx +19 -2
  138. package/Tests/UI/Components/SideOverMotion.test.tsx +109 -0
  139. package/Tests/UI/Components/Skeleton.test.tsx +71 -0
  140. package/Tests/UI/Components/TableLoadingStates.test.tsx +279 -0
  141. package/Tests/UI/Components/Tabs.test.tsx +24 -0
  142. package/Tests/UI/Components/Toast.test.tsx +130 -7
  143. package/Tests/UI/Components/ToastStacking.test.tsx +198 -0
  144. package/Tests/UI/Utils/Dropdown.test.ts +423 -0
  145. package/Tests/UI/Utils/ModelAPITenantHeader.test.ts +122 -0
  146. package/Tests/UI/Utils/ModelListCache.test.ts +338 -0
  147. package/Tests/UI/Utils/ProjectListCacheInvalidation.test.ts +225 -0
  148. package/Tests/Utils/API.test.ts +16 -2
  149. package/Tests/Utils/Dashboard/Components/DashboardKubernetesResourceListShared.test.ts +347 -0
  150. package/Tests/Utils/Dashboard/Components/DashboardListSharedArgs.test.ts +259 -0
  151. package/Tests/Utils/Dashboard/Components/DashboardMonitorListComponent.test.ts +466 -0
  152. package/Tests/Utils/Rum/UrlScrubberSegments.test.ts +362 -0
  153. package/Types/Email/EmailTemplateType.ts +1 -0
  154. package/Types/Monitor/MonitorCriteriaInstance.ts +41 -20
  155. package/Types/Monitor/Recommendation/MonitorRecommendationCatalog.ts +131 -8
  156. package/Types/Monitor/Recommendation/MonitorRecommendationTypes.ts +48 -8
  157. package/Types/Monitor/ServiceAlertTemplates.ts +1352 -0
  158. package/Types/Permission.ts +35 -0
  159. package/Types/PushNotification/AndroidNotificationChannel.ts +26 -0
  160. package/Types/PushNotification/PushNotificationMessage.ts +15 -0
  161. package/Types/PushNotification/PushNotificationRequest.ts +8 -16
  162. package/Types/Service/ServiceLanguage.ts +144 -0
  163. package/Types/Text.ts +111 -19
  164. package/UI/Components/Button/Button.tsx +27 -14
  165. package/UI/Components/CodeBlock/CodeBlock.tsx +54 -7
  166. package/UI/Components/CodeBlock/LanguageRegistry.ts +103 -0
  167. package/UI/Components/CommandPalette/CommandPalette.tsx +790 -0
  168. package/UI/Components/CommandPalette/PaletteFilter.ts +196 -0
  169. package/UI/Components/CommandPalette/PaletteRow.tsx +173 -0
  170. package/UI/Components/CommandPalette/RecentCommands.ts +57 -0
  171. package/UI/Components/CommandPalette/Types.ts +49 -0
  172. package/UI/Components/CommandPalette/UseProviderSearch.ts +129 -0
  173. package/UI/Components/Dropdown/Dropdown.tsx +6 -1
  174. package/UI/Components/Feed/FeedItem.tsx +1 -1
  175. package/UI/Components/List/List.tsx +37 -5
  176. package/UI/Components/List/ListSkeleton.tsx +54 -0
  177. package/UI/Components/Markdown.tsx/LazyMarkdownViewer.tsx +6 -1
  178. package/UI/Components/Markdown.tsx/MarkdownViewer.tsx +71 -26
  179. package/UI/Components/Modal/Modal.tsx +2 -2
  180. package/UI/Components/ModelTable/BaseModelTable.tsx +1 -1
  181. package/UI/Components/ModelTable/useCustomFieldColumns.ts +11 -5
  182. package/UI/Components/MoreMenu/MoreMenu.tsx +39 -1
  183. package/UI/Components/Navbar/NavBar.tsx +14 -1
  184. package/UI/Components/OrderedStatesList/OrderedStatesList.tsx +50 -5
  185. package/UI/Components/SideMenu/CountModelSideMenuItem.tsx +40 -1
  186. package/UI/Components/SideOver/SideOver.tsx +37 -2
  187. package/UI/Components/Skeleton/Skeleton.tsx +53 -0
  188. package/UI/Components/Table/Table.tsx +74 -44
  189. package/UI/Components/Table/TableSkeletonRows.tsx +141 -0
  190. package/UI/Components/Tabs/Tab.tsx +1 -1
  191. package/UI/Components/Toast/Toast.tsx +118 -53
  192. package/UI/Components/Toast/ToastInit.tsx +82 -32
  193. package/UI/Styles/Theme.css +40 -0
  194. package/UI/Utils/ModelAPI/ModelAPI.ts +20 -10
  195. package/UI/Utils/ModelListCache.ts +188 -0
  196. package/UI/Utils/Project.ts +29 -0
  197. package/Utils/API.ts +6 -1
  198. package/build/dist/Models/DatabaseModels/OnCallDutyPolicySchedule.js +14 -0
  199. package/build/dist/Models/DatabaseModels/OnCallDutyPolicySchedule.js.map +1 -1
  200. package/build/dist/Models/DatabaseModels/UserCall.js +101 -3
  201. package/build/dist/Models/DatabaseModels/UserCall.js.map +1 -1
  202. package/build/dist/Models/DatabaseModels/UserEmail.js +101 -3
  203. package/build/dist/Models/DatabaseModels/UserEmail.js.map +1 -1
  204. package/build/dist/Models/DatabaseModels/UserIncomingCallNumber.js +101 -3
  205. package/build/dist/Models/DatabaseModels/UserIncomingCallNumber.js.map +1 -1
  206. package/build/dist/Models/DatabaseModels/UserPush.js +38 -0
  207. package/build/dist/Models/DatabaseModels/UserPush.js.map +1 -1
  208. package/build/dist/Models/DatabaseModels/UserSMS.js +101 -3
  209. package/build/dist/Models/DatabaseModels/UserSMS.js.map +1 -1
  210. package/build/dist/Models/DatabaseModels/UserWhatsApp.js +100 -2
  211. package/build/dist/Models/DatabaseModels/UserWhatsApp.js.map +1 -1
  212. package/build/dist/Server/API/BaseAPI.js +69 -13
  213. package/build/dist/Server/API/BaseAPI.js.map +1 -1
  214. package/build/dist/Server/API/UserCallAPI.js +42 -38
  215. package/build/dist/Server/API/UserCallAPI.js.map +1 -1
  216. package/build/dist/Server/API/UserEmailAPI.js +42 -38
  217. package/build/dist/Server/API/UserEmailAPI.js.map +1 -1
  218. package/build/dist/Server/API/UserIncomingCallNumberAPI.js +37 -32
  219. package/build/dist/Server/API/UserIncomingCallNumberAPI.js.map +1 -1
  220. package/build/dist/Server/API/UserNotificationMethodAdminAPI.js +341 -0
  221. package/build/dist/Server/API/UserNotificationMethodAdminAPI.js.map +1 -0
  222. package/build/dist/Server/API/UserPushAPI.js +95 -2
  223. package/build/dist/Server/API/UserPushAPI.js.map +1 -1
  224. package/build/dist/Server/API/UserSmsAPI.js +42 -38
  225. package/build/dist/Server/API/UserSmsAPI.js.map +1 -1
  226. package/build/dist/Server/API/UserWhatsAppAPI.js +42 -40
  227. package/build/dist/Server/API/UserWhatsAppAPI.js.map +1 -1
  228. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1787142779538-MigrationName.js +89 -0
  229. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1787142779538-MigrationName.js.map +1 -0
  230. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1787156982416-MigrationName.js +12 -0
  231. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1787156982416-MigrationName.js.map +1 -0
  232. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1787700000000-FixTotpOtpUrlAlgorithm.js +40 -0
  233. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1787700000000-FixTotpOtpUrlAlgorithm.js.map +1 -0
  234. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js +6 -0
  235. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js.map +1 -1
  236. package/build/dist/Server/Middleware/VerificationCodeRateLimit.js +393 -0
  237. package/build/dist/Server/Middleware/VerificationCodeRateLimit.js.map +1 -0
  238. package/build/dist/Server/Services/AnalyticsDatabaseService.js +136 -0
  239. package/build/dist/Server/Services/AnalyticsDatabaseService.js.map +1 -1
  240. package/build/dist/Server/Services/DatabaseService.js +74 -0
  241. package/build/dist/Server/Services/DatabaseService.js.map +1 -1
  242. package/build/dist/Server/Services/LogAggregationService.js +5 -0
  243. package/build/dist/Server/Services/LogAggregationService.js.map +1 -1
  244. package/build/dist/Server/Services/PushNotificationService.js +69 -30
  245. package/build/dist/Server/Services/PushNotificationService.js.map +1 -1
  246. package/build/dist/Server/Services/TeamMemberService.js +43 -7
  247. package/build/dist/Server/Services/TeamMemberService.js.map +1 -1
  248. package/build/dist/Server/Services/UserCallService.js +54 -22
  249. package/build/dist/Server/Services/UserCallService.js.map +1 -1
  250. package/build/dist/Server/Services/UserEmailService.js +78 -17
  251. package/build/dist/Server/Services/UserEmailService.js.map +1 -1
  252. package/build/dist/Server/Services/UserIncomingCallNumberService.js +45 -74
  253. package/build/dist/Server/Services/UserIncomingCallNumberService.js.map +1 -1
  254. package/build/dist/Server/Services/UserNotificationMethodAdminService.js +1117 -0
  255. package/build/dist/Server/Services/UserNotificationMethodAdminService.js.map +1 -0
  256. package/build/dist/Server/Services/UserNotificationRuleService.js +20 -0
  257. package/build/dist/Server/Services/UserNotificationRuleService.js.map +1 -1
  258. package/build/dist/Server/Services/UserPushService.js +77 -0
  259. package/build/dist/Server/Services/UserPushService.js.map +1 -1
  260. package/build/dist/Server/Services/UserSmsService.js +50 -17
  261. package/build/dist/Server/Services/UserSmsService.js.map +1 -1
  262. package/build/dist/Server/Services/UserWhatsAppService.js +48 -15
  263. package/build/dist/Server/Services/UserWhatsAppService.js.map +1 -1
  264. package/build/dist/Server/Types/Database/QueryHelper.js +27 -0
  265. package/build/dist/Server/Types/Database/QueryHelper.js.map +1 -1
  266. package/build/dist/Server/Utils/AnalyticsDatabase/QuerySettingsHelper.js +46 -0
  267. package/build/dist/Server/Utils/AnalyticsDatabase/QuerySettingsHelper.js.map +1 -1
  268. package/build/dist/Server/Utils/ChannelVerification.js +348 -0
  269. package/build/dist/Server/Utils/ChannelVerification.js.map +1 -0
  270. package/build/dist/Server/Utils/Monitor/Criteria/IncomingRequestCriteria.js +13 -12
  271. package/build/dist/Server/Utils/Monitor/Criteria/IncomingRequestCriteria.js.map +1 -1
  272. package/build/dist/Server/Utils/Monitor/MonitorAlert.js +20 -17
  273. package/build/dist/Server/Utils/Monitor/MonitorAlert.js.map +1 -1
  274. package/build/dist/Server/Utils/Monitor/MonitorIncident.js +17 -14
  275. package/build/dist/Server/Utils/Monitor/MonitorIncident.js.map +1 -1
  276. package/build/dist/Server/Utils/Monitor/MonitorResourceContext.js +95 -0
  277. package/build/dist/Server/Utils/Monitor/MonitorResourceContext.js.map +1 -0
  278. package/build/dist/Server/Utils/Monitor/MonitorStepResourceIdentity.js +313 -0
  279. package/build/dist/Server/Utils/Monitor/MonitorStepResourceIdentity.js.map +1 -0
  280. package/build/dist/Server/Utils/Monitor/SeriesResourceLabels.js +3 -3
  281. package/build/dist/Server/Utils/Monitor/SeriesResourceLinker.js +67 -26
  282. package/build/dist/Server/Utils/Monitor/SeriesResourceLinker.js.map +1 -1
  283. package/build/dist/Server/Utils/TotpAuth.js +127 -8
  284. package/build/dist/Server/Utils/TotpAuth.js.map +1 -1
  285. package/build/dist/Server/Utils/UserRegistrationToken.js +170 -0
  286. package/build/dist/Server/Utils/UserRegistrationToken.js.map +1 -0
  287. package/build/dist/Server/Utils/VerificationCode.js +120 -0
  288. package/build/dist/Server/Utils/VerificationCode.js.map +1 -0
  289. package/build/dist/Types/Email/EmailTemplateType.js +1 -0
  290. package/build/dist/Types/Email/EmailTemplateType.js.map +1 -1
  291. package/build/dist/Types/Monitor/MonitorCriteriaInstance.js +42 -21
  292. package/build/dist/Types/Monitor/MonitorCriteriaInstance.js.map +1 -1
  293. package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationCatalog.js +77 -5
  294. package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationCatalog.js.map +1 -1
  295. package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationTypes.js +18 -6
  296. package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationTypes.js.map +1 -1
  297. package/build/dist/Types/Monitor/ServiceAlertTemplates.js +1028 -0
  298. package/build/dist/Types/Monitor/ServiceAlertTemplates.js.map +1 -0
  299. package/build/dist/Types/Permission.js +33 -0
  300. package/build/dist/Types/Permission.js.map +1 -1
  301. package/build/dist/Types/PushNotification/AndroidNotificationChannel.js +27 -0
  302. package/build/dist/Types/PushNotification/AndroidNotificationChannel.js.map +1 -0
  303. package/build/dist/Types/Service/ServiceLanguage.js +96 -0
  304. package/build/dist/Types/Service/ServiceLanguage.js.map +1 -0
  305. package/build/dist/Types/Text.js +82 -17
  306. package/build/dist/Types/Text.js.map +1 -1
  307. package/build/dist/UI/Components/Button/Button.js +22 -14
  308. package/build/dist/UI/Components/Button/Button.js.map +1 -1
  309. package/build/dist/UI/Components/CodeBlock/CodeBlock.js +35 -3
  310. package/build/dist/UI/Components/CodeBlock/CodeBlock.js.map +1 -1
  311. package/build/dist/UI/Components/CodeBlock/LanguageRegistry.js +57 -0
  312. package/build/dist/UI/Components/CodeBlock/LanguageRegistry.js.map +1 -0
  313. package/build/dist/UI/Components/CommandPalette/CommandPalette.js +439 -0
  314. package/build/dist/UI/Components/CommandPalette/CommandPalette.js.map +1 -0
  315. package/build/dist/UI/Components/CommandPalette/PaletteFilter.js +135 -0
  316. package/build/dist/UI/Components/CommandPalette/PaletteFilter.js.map +1 -0
  317. package/build/dist/UI/Components/CommandPalette/PaletteRow.js +83 -0
  318. package/build/dist/UI/Components/CommandPalette/PaletteRow.js.map +1 -0
  319. package/build/dist/UI/Components/CommandPalette/RecentCommands.js +47 -0
  320. package/build/dist/UI/Components/CommandPalette/RecentCommands.js.map +1 -0
  321. package/build/dist/UI/Components/CommandPalette/Types.js +2 -0
  322. package/build/dist/UI/Components/CommandPalette/Types.js.map +1 -0
  323. package/build/dist/UI/Components/CommandPalette/UseProviderSearch.js +88 -0
  324. package/build/dist/UI/Components/CommandPalette/UseProviderSearch.js.map +1 -0
  325. package/build/dist/UI/Components/Dropdown/Dropdown.js +6 -1
  326. package/build/dist/UI/Components/Dropdown/Dropdown.js.map +1 -1
  327. package/build/dist/UI/Components/Feed/FeedItem.js +1 -1
  328. package/build/dist/UI/Components/Feed/FeedItem.js.map +1 -1
  329. package/build/dist/UI/Components/List/List.js +19 -5
  330. package/build/dist/UI/Components/List/List.js.map +1 -1
  331. package/build/dist/UI/Components/List/ListSkeleton.js +21 -0
  332. package/build/dist/UI/Components/List/ListSkeleton.js.map +1 -0
  333. package/build/dist/UI/Components/Markdown.tsx/LazyMarkdownViewer.js.map +1 -1
  334. package/build/dist/UI/Components/Markdown.tsx/MarkdownViewer.js +52 -25
  335. package/build/dist/UI/Components/Markdown.tsx/MarkdownViewer.js.map +1 -1
  336. package/build/dist/UI/Components/Modal/Modal.js +2 -2
  337. package/build/dist/UI/Components/ModelTable/BaseModelTable.js +1 -1
  338. package/build/dist/UI/Components/ModelTable/BaseModelTable.js.map +1 -1
  339. package/build/dist/UI/Components/ModelTable/useCustomFieldColumns.js +9 -2
  340. package/build/dist/UI/Components/ModelTable/useCustomFieldColumns.js.map +1 -1
  341. package/build/dist/UI/Components/MoreMenu/MoreMenu.js +32 -1
  342. package/build/dist/UI/Components/MoreMenu/MoreMenu.js.map +1 -1
  343. package/build/dist/UI/Components/Navbar/NavBar.js +5 -1
  344. package/build/dist/UI/Components/Navbar/NavBar.js.map +1 -1
  345. package/build/dist/UI/Components/OrderedStatesList/OrderedStatesList.js +29 -5
  346. package/build/dist/UI/Components/OrderedStatesList/OrderedStatesList.js.map +1 -1
  347. package/build/dist/UI/Components/SideMenu/CountModelSideMenuItem.js +23 -1
  348. package/build/dist/UI/Components/SideMenu/CountModelSideMenuItem.js.map +1 -1
  349. package/build/dist/UI/Components/SideOver/SideOver.js +23 -2
  350. package/build/dist/UI/Components/SideOver/SideOver.js.map +1 -1
  351. package/build/dist/UI/Components/Skeleton/Skeleton.js +23 -0
  352. package/build/dist/UI/Components/Skeleton/Skeleton.js.map +1 -0
  353. package/build/dist/UI/Components/Table/Table.js +35 -24
  354. package/build/dist/UI/Components/Table/Table.js.map +1 -1
  355. package/build/dist/UI/Components/Table/TableSkeletonRows.js +52 -0
  356. package/build/dist/UI/Components/Table/TableSkeletonRows.js.map +1 -0
  357. package/build/dist/UI/Components/Tabs/Tab.js +1 -1
  358. package/build/dist/UI/Components/Tabs/Tab.js.map +1 -1
  359. package/build/dist/UI/Components/Toast/Toast.js +77 -23
  360. package/build/dist/UI/Components/Toast/Toast.js.map +1 -1
  361. package/build/dist/UI/Components/Toast/ToastInit.js +37 -15
  362. package/build/dist/UI/Components/Toast/ToastInit.js.map +1 -1
  363. package/build/dist/UI/Utils/ModelAPI/ModelAPI.js +18 -9
  364. package/build/dist/UI/Utils/ModelAPI/ModelAPI.js.map +1 -1
  365. package/build/dist/UI/Utils/ModelListCache.js +126 -0
  366. package/build/dist/UI/Utils/ModelListCache.js.map +1 -0
  367. package/build/dist/UI/Utils/Project.js +24 -1
  368. package/build/dist/UI/Utils/Project.js.map +1 -1
  369. package/build/dist/Utils/API.js +6 -1
  370. package/build/dist/Utils/API.js.map +1 -1
  371. package/jest.config.json +1 -1
  372. package/package.json +2 -3
  373. package/Server/Utils/Monitor/MonitorClusterContext.ts +0 -182
  374. package/Tests/__mocks__/otpauth.js +0 -30
  375. package/build/dist/Server/Utils/Monitor/MonitorClusterContext.js +0 -141
  376. package/build/dist/Server/Utils/Monitor/MonitorClusterContext.js.map +0 -1
@@ -3,6 +3,7 @@ import MonitorRecommendationCatalog, {
3
3
  } from "../../../../Types/Monitor/Recommendation/MonitorRecommendationCatalog";
4
4
  import {
5
5
  MonitorRecommendation,
6
+ MonitorRecommendationContext,
6
7
  MonitorRecommendationResourceType,
7
8
  buildRecommendationId,
8
9
  } from "../../../../Types/Monitor/Recommendation/MonitorRecommendationTypes";
@@ -17,9 +18,14 @@ import { getAllKubernetesAlertTemplates } from "../../../../Types/Monitor/Kubern
17
18
  import { getAllPodmanAlertTemplates } from "../../../../Types/Monitor/PodmanAlertTemplates";
18
19
  import { getAllProxmoxAlertTemplates } from "../../../../Types/Monitor/ProxmoxAlertTemplates";
19
20
  import { getAllRumAlertTemplates } from "../../../../Types/Monitor/RumAlertTemplates";
21
+ import {
22
+ getAllServiceAlertTemplates,
23
+ getLanguagesWithServiceAlertTemplates,
24
+ getServiceAlertTemplates,
25
+ } from "../../../../Types/Monitor/ServiceAlertTemplates";
20
26
 
21
27
  /*
22
- * The catalog is the seam between eight independently-maintained alert-template
28
+ * The catalog is the seam between ten independently-maintained alert-template
23
29
  * modules and one Recommendations UI. Everything it can silently get wrong is
24
30
  * a wiring mistake that produces a page that looks fine and creates broken or
25
31
  * duplicated monitors:
@@ -43,12 +49,25 @@ import { getAllRumAlertTemplates } from "../../../../Types/Monitor/RumAlertTempl
43
49
  interface ModuleExpectation {
44
50
  resourceType: MonitorRecommendationResourceType;
45
51
  monitorTypes: Array<MonitorType>;
52
+ /*
53
+ * Everything the module can ever produce. For nine of the ten this is also
54
+ * what the page shows; for Service it is the union across every runtime.
55
+ */
46
56
  templateCount: number;
57
+ /*
58
+ * What `getRecommendations(resourceType)` returns with NO context — what a
59
+ * caller that knows nothing about the specific resource is offered. Equal to
60
+ * `templateCount` for every resource type whose set is a constant, and
61
+ * smaller for Service, where knowing nothing means the language-agnostic
62
+ * subset.
63
+ */
64
+ contextFreeTemplateCount: number;
47
65
  identifierFieldName:
48
66
  | "clusterIdentifier"
49
67
  | "hostIdentifier"
50
68
  | "fleetIdentifier"
51
- | "rumApplicationId";
69
+ | "rumApplicationId"
70
+ | "serviceId";
52
71
  }
53
72
 
54
73
  const MODULE_EXPECTATIONS: Array<ModuleExpectation> = [
@@ -56,48 +75,56 @@ const MODULE_EXPECTATIONS: Array<ModuleExpectation> = [
56
75
  resourceType: MonitorRecommendationResourceType.Kubernetes,
57
76
  monitorTypes: [MonitorType.Kubernetes],
58
77
  templateCount: getAllKubernetesAlertTemplates().length,
78
+ contextFreeTemplateCount: getAllKubernetesAlertTemplates().length,
59
79
  identifierFieldName: "clusterIdentifier",
60
80
  },
61
81
  {
62
82
  resourceType: MonitorRecommendationResourceType.Host,
63
83
  monitorTypes: [MonitorType.Host],
64
84
  templateCount: getAllHostAlertTemplates().length,
85
+ contextFreeTemplateCount: getAllHostAlertTemplates().length,
65
86
  identifierFieldName: "hostIdentifier",
66
87
  },
67
88
  {
68
89
  resourceType: MonitorRecommendationResourceType.Docker,
69
90
  monitorTypes: [MonitorType.Docker],
70
91
  templateCount: getAllDockerAlertTemplates().length,
92
+ contextFreeTemplateCount: getAllDockerAlertTemplates().length,
71
93
  identifierFieldName: "hostIdentifier",
72
94
  },
73
95
  {
74
96
  resourceType: MonitorRecommendationResourceType.DockerSwarm,
75
97
  monitorTypes: [MonitorType.DockerSwarm],
76
98
  templateCount: getAllDockerSwarmAlertTemplates().length,
99
+ contextFreeTemplateCount: getAllDockerSwarmAlertTemplates().length,
77
100
  identifierFieldName: "clusterIdentifier",
78
101
  },
79
102
  {
80
103
  resourceType: MonitorRecommendationResourceType.Podman,
81
104
  monitorTypes: [MonitorType.Podman],
82
105
  templateCount: getAllPodmanAlertTemplates().length,
106
+ contextFreeTemplateCount: getAllPodmanAlertTemplates().length,
83
107
  identifierFieldName: "hostIdentifier",
84
108
  },
85
109
  {
86
110
  resourceType: MonitorRecommendationResourceType.Proxmox,
87
111
  monitorTypes: [MonitorType.Proxmox],
88
112
  templateCount: getAllProxmoxAlertTemplates().length,
113
+ contextFreeTemplateCount: getAllProxmoxAlertTemplates().length,
89
114
  identifierFieldName: "clusterIdentifier",
90
115
  },
91
116
  {
92
117
  resourceType: MonitorRecommendationResourceType.Ceph,
93
118
  monitorTypes: [MonitorType.Ceph],
94
119
  templateCount: getAllCephAlertTemplates().length,
120
+ contextFreeTemplateCount: getAllCephAlertTemplates().length,
95
121
  identifierFieldName: "clusterIdentifier",
96
122
  },
97
123
  {
98
124
  resourceType: MonitorRecommendationResourceType.IoTDevice,
99
125
  monitorTypes: [MonitorType.IoTDevice],
100
126
  templateCount: getAllIoTAlertTemplates().length,
127
+ contextFreeTemplateCount: getAllIoTAlertTemplates().length,
101
128
  identifierFieldName: "fleetIdentifier",
102
129
  },
103
130
  {
@@ -108,8 +135,26 @@ const MODULE_EXPECTATIONS: Array<ModuleExpectation> = [
108
135
  MonitorType.Exceptions,
109
136
  ],
110
137
  templateCount: getAllRumAlertTemplates().length,
138
+ contextFreeTemplateCount: getAllRumAlertTemplates().length,
111
139
  identifierFieldName: "rumApplicationId",
112
140
  },
141
+ {
142
+ resourceType: MonitorRecommendationResourceType.Service,
143
+ monitorTypes: [
144
+ MonitorType.Metrics,
145
+ MonitorType.Traces,
146
+ MonitorType.Exceptions,
147
+ ],
148
+ templateCount: getAllServiceAlertTemplates().length,
149
+ /*
150
+ * The only row where these two differ, and the reason the field exists.
151
+ * `getServiceAlertTemplates(null)` is the module's own answer to "what
152
+ * applies to a service whose runtime is unknown", so this stays correct
153
+ * when a template moves between the agnostic and language-specific sets.
154
+ */
155
+ contextFreeTemplateCount: getServiceAlertTemplates(null).length,
156
+ identifierFieldName: "serviceId",
157
+ },
113
158
  ];
114
159
 
115
160
  describe("MonitorRecommendationCatalog", () => {
@@ -143,7 +188,17 @@ describe("MonitorRecommendationCatalog", () => {
143
188
  /*
144
189
  * A dropped `.map` or a filtered adapter would show up here as a count
145
190
  * mismatch rather than as a quietly shorter list in the UI.
191
+ *
192
+ * Two counts, because the two questions are different and only one of
193
+ * them is context-free: `getRecommendations` with no context answers
194
+ * "what applies to a resource we know nothing about", while
195
+ * `getAllRecommendations` has to stay exhaustive or every invariant
196
+ * downstream of it silently stops covering the language-specific half of
197
+ * the service catalog.
146
198
  */
199
+ const allRecommendations: Array<MonitorRecommendation> =
200
+ MonitorRecommendationCatalog.getAllRecommendations();
201
+
147
202
  for (const expectation of MODULE_EXPECTATIONS) {
148
203
  const recommendations: Array<MonitorRecommendation> =
149
204
  MonitorRecommendationCatalog.getRecommendations(
@@ -151,7 +206,16 @@ describe("MonitorRecommendationCatalog", () => {
151
206
  );
152
207
 
153
208
  expect(expectation.templateCount).toBeGreaterThan(0);
154
- expect(recommendations.length).toBe(expectation.templateCount);
209
+ expect(expectation.contextFreeTemplateCount).toBeGreaterThan(0);
210
+ expect(recommendations.length).toBe(
211
+ expectation.contextFreeTemplateCount,
212
+ );
213
+
214
+ expect(
215
+ allRecommendations.filter((recommendation: MonitorRecommendation) => {
216
+ return recommendation.resourceType === expectation.resourceType;
217
+ }).length,
218
+ ).toBe(expectation.templateCount);
155
219
  }
156
220
  });
157
221
 
@@ -195,8 +259,8 @@ describe("MonitorRecommendationCatalog", () => {
195
259
  it("canary: raw templateIds happen to be globally unique today", () => {
196
260
  /*
197
261
  * Every module self-prefixes (`host-high-cpu`, `docker-high-cpu`,
198
- * `podman-high-cpu`), so no two of the 76 collide right now. That is a
199
- * convention across eight independently maintained files, not a
262
+ * `podman-high-cpu`), so no two of them collide right now. That is a
263
+ * convention across ten independently maintained files, not a
200
264
  * contract — each module only promises uniqueness within itself.
201
265
  *
202
266
  * This test is a canary, NOT a requirement the registry depends on. If
@@ -396,4 +460,197 @@ describe("MonitorRecommendationCatalog", () => {
396
460
  ).toEqual([]);
397
461
  });
398
462
  });
463
+
464
+ /*
465
+ * Services are the only resource type whose recommendation set is not a
466
+ * constant. Everything below is about the seam between "what applies to this
467
+ * resource" and "what this catalog can ever produce" — the two are the same
468
+ * question for nine resource types and different for the tenth, and the
469
+ * failure mode of conflating them is a page that offers JVM heap monitors to
470
+ * a Go service.
471
+ */
472
+ describe("context-aware recommendations", () => {
473
+ const AGNOSTIC_COUNT: number = getServiceAlertTemplates(null).length;
474
+
475
+ function serviceRecommendationIds(
476
+ context?: MonitorRecommendationContext | undefined,
477
+ ): Array<string> {
478
+ return MonitorRecommendationCatalog.getRecommendations(
479
+ MonitorRecommendationResourceType.Service,
480
+ context,
481
+ ).map((recommendation: MonitorRecommendation) => {
482
+ return recommendation.recommendationId;
483
+ });
484
+ }
485
+
486
+ it("treats no context, an empty context and a null language alike", () => {
487
+ /*
488
+ * `detectServiceLanguage` returns null while an absent field is
489
+ * undefined, so both reach this API in practice. They mean the same
490
+ * thing and must not diverge — a null narrowing to some default language
491
+ * would be the worst possible reading of "we could not tell".
492
+ */
493
+ const noContext: Array<string> = serviceRecommendationIds();
494
+
495
+ expect(noContext.length).toBe(AGNOSTIC_COUNT);
496
+ expect(serviceRecommendationIds({})).toEqual(noContext);
497
+ expect(serviceRecommendationIds({ serviceLanguage: null })).toEqual(
498
+ noContext,
499
+ );
500
+ expect(serviceRecommendationIds({ serviceLanguage: undefined })).toEqual(
501
+ noContext,
502
+ );
503
+ });
504
+
505
+ it("adds a runtime's own recommendations on top of the agnostic set", () => {
506
+ const agnostic: Array<string> = serviceRecommendationIds();
507
+ const forJava: Array<string> = serviceRecommendationIds({
508
+ serviceLanguage: "java",
509
+ });
510
+
511
+ expect(forJava.length).toBeGreaterThan(agnostic.length);
512
+
513
+ for (const recommendationId of agnostic) {
514
+ expect(forJava).toContain(recommendationId);
515
+ }
516
+ });
517
+
518
+ it("never offers one runtime's recommendations to another", () => {
519
+ const forJava: Array<string> = serviceRecommendationIds({
520
+ serviceLanguage: "java",
521
+ });
522
+ const forGo: Array<string> = serviceRecommendationIds({
523
+ serviceLanguage: "go",
524
+ });
525
+
526
+ const javaOnly: Array<string> = forJava.filter(
527
+ (recommendationId: string) => {
528
+ return !serviceRecommendationIds().includes(recommendationId);
529
+ },
530
+ );
531
+
532
+ expect(javaOnly.length).toBeGreaterThan(0);
533
+
534
+ for (const recommendationId of javaOnly) {
535
+ expect(forGo).not.toContain(recommendationId);
536
+ }
537
+ });
538
+
539
+ it("is inert for every resource type whose set is a constant", () => {
540
+ for (const resourceType of Object.values(
541
+ MonitorRecommendationResourceType,
542
+ )) {
543
+ if (resourceType === MonitorRecommendationResourceType.Service) {
544
+ continue;
545
+ }
546
+
547
+ const withoutContext: Array<string> =
548
+ MonitorRecommendationCatalog.getRecommendations(resourceType).map(
549
+ (recommendation: MonitorRecommendation) => {
550
+ return recommendation.recommendationId;
551
+ },
552
+ );
553
+
554
+ const withContext: Array<string> =
555
+ MonitorRecommendationCatalog.getRecommendations(resourceType, {
556
+ serviceLanguage: "java",
557
+ }).map((recommendation: MonitorRecommendation) => {
558
+ return recommendation.recommendationId;
559
+ });
560
+
561
+ expect(withContext).toEqual(withoutContext);
562
+ }
563
+ });
564
+
565
+ it("keeps getAllRecommendations exhaustive", () => {
566
+ /*
567
+ * The registry-wide invariants — unique ids, distinct fingerprints,
568
+ * a mappable severity — all run over this. If it narrowed to the
569
+ * context-free subset, the language-specific templates would be the ones
570
+ * left unchecked, which is exactly the half most likely to collide.
571
+ */
572
+ const serviceRecommendations: Array<MonitorRecommendation> =
573
+ MonitorRecommendationCatalog.getAllRecommendations().filter(
574
+ (recommendation: MonitorRecommendation) => {
575
+ return (
576
+ recommendation.resourceType ===
577
+ MonitorRecommendationResourceType.Service
578
+ );
579
+ },
580
+ );
581
+
582
+ expect(serviceRecommendations.length).toBe(
583
+ getAllServiceAlertTemplates().length,
584
+ );
585
+ expect(serviceRecommendations.length).toBeGreaterThan(AGNOSTIC_COUNT);
586
+ });
587
+
588
+ it("resolves a language-specific recommendation by id, with no context", () => {
589
+ /*
590
+ * The path a dismissal takes: the row stores a recommendation id and
591
+ * nothing about the language, so lookup has to work without one.
592
+ */
593
+ for (const template of getAllServiceAlertTemplates()) {
594
+ const recommendationId: string = buildRecommendationId(
595
+ MonitorRecommendationResourceType.Service,
596
+ template.id,
597
+ );
598
+
599
+ expect(
600
+ MonitorRecommendationCatalog.getRecommendationById(recommendationId),
601
+ ).toBeDefined();
602
+ }
603
+ });
604
+
605
+ it("lists the agnostic categories first, whatever the runtime", () => {
606
+ const agnosticCategories: Array<string> =
607
+ MonitorRecommendationCatalog.getCategories(
608
+ MonitorRecommendationResourceType.Service,
609
+ );
610
+
611
+ expect(agnosticCategories.length).toBeGreaterThan(0);
612
+
613
+ for (const language of getLanguagesWithServiceAlertTemplates()) {
614
+ const categories: Array<string> =
615
+ MonitorRecommendationCatalog.getCategories(
616
+ MonitorRecommendationResourceType.Service,
617
+ { serviceLanguage: language },
618
+ );
619
+
620
+ expect(categories.slice(0, agnosticCategories.length)).toEqual(
621
+ agnosticCategories,
622
+ );
623
+ expect(categories.length).toBeGreaterThan(agnosticCategories.length);
624
+ }
625
+ });
626
+
627
+ it("carries the service monitor types the coverage query needs", () => {
628
+ /*
629
+ * The page queries existing monitors by these types. A missing one means
630
+ * monitors of that type are never considered, so every recommendation it
631
+ * covers renders as still-to-do and accepting it creates a duplicate.
632
+ */
633
+ const definition: MonitorRecommendationResourceTypeDefinition =
634
+ MonitorRecommendationCatalog.getResourceTypeDefinition(
635
+ MonitorRecommendationResourceType.Service,
636
+ )!;
637
+
638
+ const usedMonitorTypes: Set<MonitorType> = new Set<MonitorType>(
639
+ MonitorRecommendationCatalog.getAllRecommendations()
640
+ .filter((recommendation: MonitorRecommendation) => {
641
+ return (
642
+ recommendation.resourceType ===
643
+ MonitorRecommendationResourceType.Service
644
+ );
645
+ })
646
+ .map((recommendation: MonitorRecommendation) => {
647
+ return recommendation.monitorType;
648
+ }),
649
+ );
650
+
651
+ for (const monitorType of usedMonitorTypes) {
652
+ expect(definition.monitorTypes).toContain(monitorType);
653
+ }
654
+ });
655
+ });
399
656
  });
@@ -513,7 +513,7 @@ describe("MonitorRecommendationUtil.getCoveredRecommendationMonitorIds", () => {
513
513
  * both a covered and an uncovered answer are exercised for all eight
514
514
  * resource types.
515
515
  */
516
- expect(RESOURCE_TYPE_DEFINITIONS.length).toBe(9);
516
+ expect(RESOURCE_TYPE_DEFINITIONS.length).toBe(10);
517
517
 
518
518
  for (const definition of RESOURCE_TYPE_DEFINITIONS) {
519
519
  const recommendations: Array<MonitorRecommendation> =
@@ -149,7 +149,7 @@ describe("MonitorRecommendationNotificationMode", () => {
149
149
  it("has recommendations to test at all", () => {
150
150
  // Guards every for-loop in this file against a vacuous pass.
151
151
  expect(ALL_RECOMMENDATIONS.length).toBeGreaterThan(0);
152
- expect(ONE_PER_RESOURCE_TYPE.length).toBe(9);
152
+ expect(ONE_PER_RESOURCE_TYPE.length).toBe(10);
153
153
  });
154
154
 
155
155
  it("ships every unhealthy criteria with createIncidents AND createAlerts true, and both arrays populated", () => {