@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
@@ -0,0 +1,191 @@
1
+ import { describe, expect, test } from "@jest/globals";
2
+ import IncidentSlaStatus from "../../../Types/Incident/IncidentSlaStatus";
3
+
4
+ /*
5
+ * IncidentSlaStatus is a plain string enum. These tests lock in the exact
6
+ * string value of every member, the structural invariants of the enum object
7
+ * (member count, key set, value uniqueness, absence of a reverse mapping) and
8
+ * the runtime semantics that consumers rely on (equality, switch dispatch and
9
+ * membership checks). Everything here is deterministic and pure: no network,
10
+ * database, wall-clock or randomness is involved.
11
+ */
12
+
13
+ describe("enum IncidentSlaStatus", () => {
14
+ describe("member values", () => {
15
+ test("OnTrack maps to the human-readable 'On Track'", () => {
16
+ expect(IncidentSlaStatus.OnTrack).toBe("On Track");
17
+ });
18
+
19
+ test("AtRisk maps to the human-readable 'At Risk'", () => {
20
+ expect(IncidentSlaStatus.AtRisk).toBe("At Risk");
21
+ });
22
+
23
+ test("ResponseBreached maps to 'Response Breached'", () => {
24
+ expect(IncidentSlaStatus.ResponseBreached).toBe("Response Breached");
25
+ });
26
+
27
+ test("ResolutionBreached maps to 'Resolution Breached'", () => {
28
+ expect(IncidentSlaStatus.ResolutionBreached).toBe("Resolution Breached");
29
+ });
30
+
31
+ test("Met maps to 'Met'", () => {
32
+ expect(IncidentSlaStatus.Met).toBe("Met");
33
+ });
34
+ });
35
+
36
+ describe("structural invariants", () => {
37
+ test("exposes exactly five members", () => {
38
+ /*
39
+ * A string enum produces no reverse numeric mapping, so the key count is
40
+ * exactly the number of declared members.
41
+ */
42
+ const keys: Array<string> = Object.keys(IncidentSlaStatus);
43
+ expect(keys).toHaveLength(5);
44
+ });
45
+
46
+ test("declares the full, ordered key set", () => {
47
+ const keys: Array<string> = Object.keys(IncidentSlaStatus);
48
+ expect(keys).toEqual([
49
+ "OnTrack",
50
+ "AtRisk",
51
+ "ResponseBreached",
52
+ "ResolutionBreached",
53
+ "Met",
54
+ ]);
55
+ });
56
+
57
+ test("declares the full, ordered value set", () => {
58
+ const values: Array<string> = Object.values(IncidentSlaStatus);
59
+ expect(values).toEqual([
60
+ "On Track",
61
+ "At Risk",
62
+ "Response Breached",
63
+ "Resolution Breached",
64
+ "Met",
65
+ ]);
66
+ });
67
+
68
+ test("every member value is unique", () => {
69
+ const values: Array<string> = Object.values(IncidentSlaStatus);
70
+ const uniqueValues: Set<string> = new Set(values);
71
+ expect(uniqueValues.size).toBe(values.length);
72
+ });
73
+
74
+ test("every member key is unique", () => {
75
+ const keys: Array<string> = Object.keys(IncidentSlaStatus);
76
+ const uniqueKeys: Set<string> = new Set(keys);
77
+ expect(uniqueKeys.size).toBe(keys.length);
78
+ });
79
+
80
+ test("has no reverse mapping from value back to key", () => {
81
+ /*
82
+ * Numeric enums create a reverse mapping (obj[0] === "Key"), which would
83
+ * pollute the key set. A string enum must not; guard against a member
84
+ * accidentally becoming numeric. The values below all contain a space, so
85
+ * they can never coincide with a member key and unambiguously prove that
86
+ * no value-to-key entry exists.
87
+ */
88
+ const record: Record<string, string> =
89
+ IncidentSlaStatus as unknown as Record<string, string>;
90
+ expect(record["On Track"]).toBeUndefined();
91
+ expect(record["At Risk"]).toBeUndefined();
92
+ expect(record["Response Breached"]).toBeUndefined();
93
+ expect(record["Resolution Breached"]).toBeUndefined();
94
+ });
95
+
96
+ test("every value is a non-empty string", () => {
97
+ const values: Array<string> = Object.values(IncidentSlaStatus);
98
+ for (const value of values) {
99
+ expect(typeof value).toBe("string");
100
+ expect(value.length).toBeGreaterThan(0);
101
+ }
102
+ });
103
+ });
104
+
105
+ describe("runtime semantics", () => {
106
+ test("distinct members are not equal to one another", () => {
107
+ const members: Array<IncidentSlaStatus> = [
108
+ IncidentSlaStatus.OnTrack,
109
+ IncidentSlaStatus.AtRisk,
110
+ IncidentSlaStatus.ResponseBreached,
111
+ IncidentSlaStatus.ResolutionBreached,
112
+ IncidentSlaStatus.Met,
113
+ ];
114
+
115
+ for (let i: number = 0; i < members.length; i++) {
116
+ for (let j: number = 0; j < members.length; j++) {
117
+ if (i === j) {
118
+ expect(members[i]).toBe(members[j]);
119
+ } else {
120
+ expect(members[i]).not.toBe(members[j]);
121
+ }
122
+ }
123
+ }
124
+ });
125
+
126
+ test("a member can be located by its string value", () => {
127
+ const values: Array<string> = Object.values(IncidentSlaStatus);
128
+ expect(values.includes(IncidentSlaStatus.ResponseBreached)).toBe(true);
129
+ expect(values.includes("Not A Status")).toBe(false);
130
+ });
131
+
132
+ test("drives switch dispatch by member identity", () => {
133
+ /*
134
+ * classify is a tiny local pure helper. It exercises every enum branch
135
+ * plus the exhaustive default so a switch over the enum is verified to
136
+ * reach each case deterministically.
137
+ */
138
+ const classify: (status: IncidentSlaStatus) => string = (
139
+ status: IncidentSlaStatus,
140
+ ): string => {
141
+ switch (status) {
142
+ case IncidentSlaStatus.OnTrack:
143
+ return "healthy";
144
+ case IncidentSlaStatus.AtRisk:
145
+ return "warning";
146
+ case IncidentSlaStatus.ResponseBreached:
147
+ case IncidentSlaStatus.ResolutionBreached:
148
+ return "breached";
149
+ case IncidentSlaStatus.Met:
150
+ return "closed";
151
+ default:
152
+ return "unknown";
153
+ }
154
+ };
155
+
156
+ expect(classify(IncidentSlaStatus.OnTrack)).toBe("healthy");
157
+ expect(classify(IncidentSlaStatus.AtRisk)).toBe("warning");
158
+ expect(classify(IncidentSlaStatus.ResponseBreached)).toBe("breached");
159
+ expect(classify(IncidentSlaStatus.ResolutionBreached)).toBe("breached");
160
+ expect(classify(IncidentSlaStatus.Met)).toBe("closed");
161
+ });
162
+
163
+ test("an out-of-enum value falls through switch to the default branch", () => {
164
+ const classify: (status: IncidentSlaStatus) => string = (
165
+ status: IncidentSlaStatus,
166
+ ): string => {
167
+ switch (status) {
168
+ case IncidentSlaStatus.OnTrack:
169
+ return "healthy";
170
+ default:
171
+ return "unknown";
172
+ }
173
+ };
174
+
175
+ /*
176
+ * A raw string that is not one of the enum values must not match any
177
+ * case. Cast through unknown to feed the negative/edge input safely.
178
+ */
179
+ const strayValue: IncidentSlaStatus =
180
+ "In Progress" as unknown as IncidentSlaStatus;
181
+ expect(classify(strayValue)).toBe("unknown");
182
+ });
183
+
184
+ test("serializes to its string value in JSON, not to an index", () => {
185
+ const payload: { status: IncidentSlaStatus } = {
186
+ status: IncidentSlaStatus.ResolutionBreached,
187
+ };
188
+ expect(JSON.stringify(payload)).toBe('{"status":"Resolution Breached"}');
189
+ });
190
+ });
191
+ });
@@ -0,0 +1,278 @@
1
+ import MetricDashboardMetricType from "../../../Types/Metrics/MetricDashboardMetricType";
2
+ import { describe, expect, test } from "@jest/globals";
3
+
4
+ /*
5
+ * MetricDashboardMetricType is a plain string enum whose values are the
6
+ * OpenTelemetry-style metric identifiers surfaced in dashboards. The tests
7
+ * below lock down the exact member-to-value mapping, the structural
8
+ * invariants a string enum guarantees (uniqueness, no reverse mapping) and
9
+ * the naming/namespacing conventions the values are expected to follow.
10
+ */
11
+
12
+ /*
13
+ * The single source of truth for what the enum is expected to contain. Any
14
+ * accidental rename, typo or duplicated value will diverge from this table
15
+ * and fail the mapping assertions below.
16
+ */
17
+ const EXPECTED_ENTRIES: Record<string, string> = {
18
+ /* HTTP metrics */
19
+ HttpRequestDuration: "http.server.request.duration",
20
+ HttpRequestCount: "http.server.request.count",
21
+ HttpRequestErrorRate: "http.server.request.error.rate",
22
+ HttpResponseSize: "http.server.response.body.size",
23
+ HttpRequestSize: "http.server.request.body.size",
24
+ HttpActiveRequests: "http.server.active_requests",
25
+
26
+ /* System metrics */
27
+ SystemCpuUtilization: "system.cpu.utilization",
28
+ SystemMemoryUsage: "system.memory.usage",
29
+ SystemDiskIo: "system.disk.io",
30
+ SystemNetworkIo: "system.network.io",
31
+
32
+ /* Runtime metrics */
33
+ ProcessCpuUtilization: "process.cpu.utilization",
34
+ ProcessMemoryUsage: "process.runtime.jvm.memory.usage",
35
+ GcDuration: "process.runtime.jvm.gc.duration",
36
+ ThreadCount: "process.runtime.jvm.threads.count",
37
+
38
+ /* Custom application metrics */
39
+ CustomCounter: "custom.counter",
40
+ CustomGauge: "custom.gauge",
41
+ CustomHistogram: "custom.histogram",
42
+ };
43
+
44
+ describe("MetricDashboardMetricType", () => {
45
+ describe("member-to-value mapping", () => {
46
+ test("maps every member to its exact OpenTelemetry-style value", () => {
47
+ /*
48
+ * Comparing the spread enum object against the expected table checks
49
+ * both directions at once: no member is missing, none is unexpected,
50
+ * and every value string matches character-for-character.
51
+ */
52
+ expect({ ...MetricDashboardMetricType }).toEqual(EXPECTED_ENTRIES);
53
+ });
54
+
55
+ test("keeps the representative HTTP members stable", () => {
56
+ expect(MetricDashboardMetricType.HttpRequestDuration).toBe(
57
+ "http.server.request.duration",
58
+ );
59
+ expect(MetricDashboardMetricType.HttpRequestCount).toBe(
60
+ "http.server.request.count",
61
+ );
62
+ /* active_requests intentionally uses an underscore, not a dot. */
63
+ expect(MetricDashboardMetricType.HttpActiveRequests).toBe(
64
+ "http.server.active_requests",
65
+ );
66
+ });
67
+
68
+ test("keeps request vs response body size distinct", () => {
69
+ /*
70
+ * These two are easy to confuse — response uses "response.body.size"
71
+ * while request uses "request.body.size". Guard the pair explicitly.
72
+ */
73
+ expect(MetricDashboardMetricType.HttpResponseSize).toBe(
74
+ "http.server.response.body.size",
75
+ );
76
+ expect(MetricDashboardMetricType.HttpRequestSize).toBe(
77
+ "http.server.request.body.size",
78
+ );
79
+ expect(MetricDashboardMetricType.HttpResponseSize).not.toBe(
80
+ MetricDashboardMetricType.HttpRequestSize,
81
+ );
82
+ });
83
+
84
+ test("keeps the custom application members stable", () => {
85
+ expect(MetricDashboardMetricType.CustomCounter).toBe("custom.counter");
86
+ expect(MetricDashboardMetricType.CustomGauge).toBe("custom.gauge");
87
+ expect(MetricDashboardMetricType.CustomHistogram).toBe(
88
+ "custom.histogram",
89
+ );
90
+ });
91
+ });
92
+
93
+ describe("completeness and uniqueness", () => {
94
+ const keys: Array<string> = Object.keys(MetricDashboardMetricType);
95
+ const values: Array<string> = Object.values(MetricDashboardMetricType);
96
+
97
+ test("declares exactly seventeen members", () => {
98
+ expect(keys.length).toBe(17);
99
+ expect(values.length).toBe(17);
100
+ });
101
+
102
+ test("exposes no reverse mapping (string enums are one-way)", () => {
103
+ /*
104
+ * Numeric enums generate a value -> name reverse mapping; string enums
105
+ * do not. Object.keys must therefore be the member names only, and a
106
+ * lookup by value string must resolve to undefined.
107
+ */
108
+ expect(keys).toEqual(Object.keys(EXPECTED_ENTRIES));
109
+ const asRecord: Record<string, string> =
110
+ MetricDashboardMetricType as unknown as Record<string, string>;
111
+ expect(asRecord["http.server.request.count"]).toBeUndefined();
112
+ expect(asRecord["custom.counter"]).toBeUndefined();
113
+ });
114
+
115
+ test("has no duplicate value strings", () => {
116
+ const unique: Set<string> = new Set(values);
117
+ expect(unique.size).toBe(values.length);
118
+ });
119
+
120
+ test("has no duplicate member names", () => {
121
+ const unique: Set<string> = new Set(keys);
122
+ expect(unique.size).toBe(keys.length);
123
+ });
124
+
125
+ test("Object.values returns precisely the expected value set", () => {
126
+ const expectedValues: Array<string> = Object.values(EXPECTED_ENTRIES);
127
+ expect([...values].sort()).toEqual([...expectedValues].sort());
128
+ });
129
+ });
130
+
131
+ describe("value format invariants", () => {
132
+ const values: Array<string> = Object.values(MetricDashboardMetricType);
133
+
134
+ test("every value is a non-empty string", () => {
135
+ for (const value of values) {
136
+ expect(typeof value).toBe("string");
137
+ expect(value.length).toBeGreaterThan(0);
138
+ }
139
+ });
140
+
141
+ test("every value is lowercase with no surrounding or inner whitespace", () => {
142
+ for (const value of values) {
143
+ expect(value).toBe(value.toLowerCase());
144
+ expect(value).toBe(value.trim());
145
+ const whitespace: RegExp = /\s/;
146
+ expect(whitespace.test(value)).toBe(false);
147
+ }
148
+ });
149
+
150
+ test("every value uses only [a-z0-9._] characters", () => {
151
+ const allowed: RegExp = /^[a-z0-9]+([._][a-z0-9]+)*$/;
152
+ for (const value of values) {
153
+ expect(allowed.test(value)).toBe(true);
154
+ }
155
+ });
156
+
157
+ test("no dot-delimited segment is empty (no leading, trailing or doubled dots)", () => {
158
+ for (const value of values) {
159
+ expect(value.startsWith(".")).toBe(false);
160
+ expect(value.endsWith(".")).toBe(false);
161
+ expect(value.includes("..")).toBe(false);
162
+ const segments: Array<string> = value.split(".");
163
+ for (const segment of segments) {
164
+ expect(segment.length).toBeGreaterThan(0);
165
+ }
166
+ }
167
+ });
168
+ });
169
+
170
+ describe("namespacing conventions", () => {
171
+ test("all HTTP members live under the http.server. namespace", () => {
172
+ const httpValues: Array<string> = [
173
+ MetricDashboardMetricType.HttpRequestDuration,
174
+ MetricDashboardMetricType.HttpRequestCount,
175
+ MetricDashboardMetricType.HttpRequestErrorRate,
176
+ MetricDashboardMetricType.HttpResponseSize,
177
+ MetricDashboardMetricType.HttpRequestSize,
178
+ MetricDashboardMetricType.HttpActiveRequests,
179
+ ];
180
+ for (const value of httpValues) {
181
+ expect(value.startsWith("http.server.")).toBe(true);
182
+ }
183
+ });
184
+
185
+ test("all system members live under the system. namespace", () => {
186
+ const systemValues: Array<string> = [
187
+ MetricDashboardMetricType.SystemCpuUtilization,
188
+ MetricDashboardMetricType.SystemMemoryUsage,
189
+ MetricDashboardMetricType.SystemDiskIo,
190
+ MetricDashboardMetricType.SystemNetworkIo,
191
+ ];
192
+ for (const value of systemValues) {
193
+ expect(value.startsWith("system.")).toBe(true);
194
+ }
195
+ });
196
+
197
+ test("all custom members live under the custom. namespace", () => {
198
+ const customValues: Array<string> = [
199
+ MetricDashboardMetricType.CustomCounter,
200
+ MetricDashboardMetricType.CustomGauge,
201
+ MetricDashboardMetricType.CustomHistogram,
202
+ ];
203
+ for (const value of customValues) {
204
+ expect(value.startsWith("custom.")).toBe(true);
205
+ }
206
+ });
207
+
208
+ test("all runtime members live under the process. namespace", () => {
209
+ const runtimeValues: Array<string> = [
210
+ MetricDashboardMetricType.ProcessCpuUtilization,
211
+ MetricDashboardMetricType.ProcessMemoryUsage,
212
+ MetricDashboardMetricType.GcDuration,
213
+ MetricDashboardMetricType.ThreadCount,
214
+ ];
215
+ for (const value of runtimeValues) {
216
+ expect(value.startsWith("process.")).toBe(true);
217
+ }
218
+ });
219
+
220
+ test("only the JVM runtime members carry the process.runtime.jvm. prefix", () => {
221
+ /*
222
+ * Edge case worth pinning: ProcessCpuUtilization deliberately sits at
223
+ * "process.cpu.utilization" (host-level), while memory/gc/thread
224
+ * metrics are JVM-scoped under "process.runtime.jvm.". A refactor that
225
+ * "normalised" the CPU value under the JVM prefix would be caught here.
226
+ */
227
+ expect(
228
+ MetricDashboardMetricType.ProcessCpuUtilization.startsWith(
229
+ "process.runtime.jvm.",
230
+ ),
231
+ ).toBe(false);
232
+
233
+ const jvmValues: Array<string> = [
234
+ MetricDashboardMetricType.ProcessMemoryUsage,
235
+ MetricDashboardMetricType.GcDuration,
236
+ MetricDashboardMetricType.ThreadCount,
237
+ ];
238
+ for (const value of jvmValues) {
239
+ expect(value.startsWith("process.runtime.jvm.")).toBe(true);
240
+ }
241
+ });
242
+
243
+ test("each value belongs to exactly one of the four known namespaces", () => {
244
+ const prefixes: Array<string> = [
245
+ "http.server.",
246
+ "system.",
247
+ "process.",
248
+ "custom.",
249
+ ];
250
+ for (const value of Object.values(MetricDashboardMetricType)) {
251
+ const matched: Array<string> = prefixes.filter((prefix: string) => {
252
+ return value.startsWith(prefix);
253
+ });
254
+ expect(matched.length).toBe(1);
255
+ }
256
+ });
257
+ });
258
+
259
+ describe("membership helpers", () => {
260
+ test("recognises a declared value as a member", () => {
261
+ const values: Array<string> = Object.values(MetricDashboardMetricType);
262
+ expect(values.includes("http.server.request.duration")).toBe(true);
263
+ expect(values.includes("custom.histogram")).toBe(true);
264
+ });
265
+
266
+ test("rejects near-miss strings that are not members", () => {
267
+ const values: Array<string> = Object.values(MetricDashboardMetricType);
268
+ /* Empty, casing variants and plausible-but-absent identifiers. */
269
+ expect(values.includes("")).toBe(false);
270
+ expect(values.includes("HTTP.SERVER.REQUEST.DURATION")).toBe(false);
271
+ expect(values.includes("http.server.request.latency")).toBe(false);
272
+ expect(values.includes("custom.timer")).toBe(false);
273
+ expect(values.includes("process.runtime.jvm.cpu.utilization")).toBe(
274
+ false,
275
+ );
276
+ });
277
+ });
278
+ });