@oneuptime/common 12.0.12 → 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 (596) hide show
  1. package/Models/DatabaseModels/DatabaseBaseModel/DatabaseBaseModel.ts +32 -5
  2. package/Models/DatabaseModels/NetworkDevice.ts +64 -0
  3. package/Models/DatabaseModels/OnCallDutyPolicySchedule.ts +14 -0
  4. package/Models/DatabaseModels/StatusPage.ts +59 -0
  5. package/Models/DatabaseModels/StatusPageOidc.ts +2 -0
  6. package/Models/DatabaseModels/UserCall.ts +94 -3
  7. package/Models/DatabaseModels/UserEmail.ts +94 -3
  8. package/Models/DatabaseModels/UserIncomingCallNumber.ts +94 -3
  9. package/Models/DatabaseModels/UserPush.ts +37 -0
  10. package/Models/DatabaseModels/UserSMS.ts +94 -3
  11. package/Models/DatabaseModels/UserWhatsApp.ts +93 -2
  12. package/Models/DatabaseModels/WorkspaceProjectAuthToken.ts +19 -2
  13. package/Server/API/AIChatAPI.ts +55 -56
  14. package/Server/API/BaseAPI.ts +79 -14
  15. package/Server/API/CommonAPI.ts +89 -0
  16. package/Server/API/MicrosoftTeamsAPI.ts +20 -9
  17. package/Server/API/SlackAPI.ts +13 -10
  18. package/Server/API/StatusPageAPI.ts +2197 -2128
  19. package/Server/API/TelemetryAPI.ts +72 -3
  20. package/Server/API/UserCallAPI.ts +53 -45
  21. package/Server/API/UserEmailAPI.ts +53 -44
  22. package/Server/API/UserIncomingCallNumberAPI.ts +48 -38
  23. package/Server/API/UserNotificationMethodAdminAPI.ts +481 -0
  24. package/Server/API/UserPushAPI.ts +126 -2
  25. package/Server/API/UserSmsAPI.ts +53 -44
  26. package/Server/API/UserWhatsAppAPI.ts +53 -50
  27. package/Server/Infrastructure/Postgres/SchemaMigrations/1787142779538-MigrationName.ts +154 -0
  28. package/Server/Infrastructure/Postgres/SchemaMigrations/1787156982416-MigrationName.ts +17 -0
  29. package/Server/Infrastructure/Postgres/SchemaMigrations/1787500000000-AddEnableSearchEngineIndexingToStatusPage.ts +30 -0
  30. package/Server/Infrastructure/Postgres/SchemaMigrations/1787600000000-AddNetworkDeviceReachabilityColumns.ts +47 -0
  31. package/Server/Infrastructure/Postgres/SchemaMigrations/1787700000000-FixTotpOtpUrlAlgorithm.ts +45 -0
  32. package/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts +10 -0
  33. package/Server/Middleware/UserAuthorization.ts +11 -2
  34. package/Server/Middleware/VerificationCodeRateLimit.ts +586 -0
  35. package/Server/Services/AnalyticsDatabaseService.ts +169 -0
  36. package/Server/Services/ApiKeyPermissionService.ts +116 -2
  37. package/Server/Services/DatabaseService.ts +118 -6
  38. package/Server/Services/LogAggregationService.ts +39 -0
  39. package/Server/Services/LogService.ts +21 -0
  40. package/Server/Services/NetworkSiteService.ts +12 -0
  41. package/Server/Services/PushNotificationService.ts +127 -12
  42. package/Server/Services/SpanService.ts +21 -0
  43. package/Server/Services/TeamMemberService.ts +53 -13
  44. package/Server/Services/TraceAggregationService.ts +15 -0
  45. package/Server/Services/UserCallService.ts +55 -24
  46. package/Server/Services/UserEmailService.ts +83 -17
  47. package/Server/Services/UserIncomingCallNumberService.ts +49 -85
  48. package/Server/Services/UserNotificationMethodAdminService.ts +1527 -0
  49. package/Server/Services/UserNotificationRuleService.ts +26 -0
  50. package/Server/Services/UserPushService.ts +89 -0
  51. package/Server/Services/UserSmsService.ts +50 -17
  52. package/Server/Services/UserWhatsAppService.ts +48 -15
  53. package/Server/Services/WorkspaceNotificationRuleService.ts +172 -220
  54. package/Server/Types/AnalyticsDatabase/ModelPermission.ts +9 -0
  55. package/Server/Types/Database/Permissions/AccessControlPermission.ts +47 -16
  56. package/Server/Types/Database/QueryHelper.ts +30 -0
  57. package/Server/Utils/APIKey/AccessPermission.ts +16 -40
  58. package/Server/Utils/AnalyticsDatabase/QuerySettingsHelper.ts +59 -0
  59. package/Server/Utils/AnalyticsDatabase/StatementGenerator.ts +144 -0
  60. package/Server/Utils/ChannelVerification.ts +510 -0
  61. package/Server/Utils/LogRedaction.ts +576 -0
  62. package/Server/Utils/Logger.ts +123 -46
  63. package/Server/Utils/Monitor/Criteria/IncomingRequestCriteria.ts +13 -16
  64. package/Server/Utils/Monitor/Criteria/SSLMonitorCriteria.ts +94 -23
  65. package/Server/Utils/Monitor/MonitorAlert.ts +24 -21
  66. package/Server/Utils/Monitor/MonitorIncident.ts +21 -18
  67. package/Server/Utils/Monitor/MonitorResource.ts +29 -9
  68. package/Server/Utils/Monitor/MonitorResourceContext.ts +107 -0
  69. package/Server/Utils/Monitor/MonitorStepResourceIdentity.ts +442 -0
  70. package/Server/Utils/Monitor/NetworkInventoryUtil.ts +28 -7
  71. package/Server/Utils/Monitor/SeriesResourceLabels.ts +3 -3
  72. package/Server/Utils/Monitor/SeriesResourceLinker.ts +96 -28
  73. package/Server/Utils/SessionReplay/SessionReplayGateCacheStore.ts +56 -10
  74. package/Server/Utils/StartServer.ts +30 -9
  75. package/Server/Utils/StatusPageSearchEngineIndexing.ts +33 -0
  76. package/Server/Utils/Telemetry/ResourceEntityFilter.ts +441 -0
  77. package/Server/Utils/TotpAuth.ts +137 -9
  78. package/Server/Utils/UserRegistrationToken.ts +182 -0
  79. package/Server/Utils/VerificationCode.ts +134 -0
  80. package/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeams.ts +488 -46
  81. package/Tests/App/Dashboard/AdminNotificationRulesPage.test.tsx +173 -94
  82. package/Tests/App/Dashboard/AdminUserNotificationMethodsPage.test.tsx +1151 -0
  83. package/Tests/App/Dashboard/AdminUserOnCallPages.test.tsx +905 -0
  84. package/Tests/App/Dashboard/DashboardCommandPalette.test.tsx +338 -0
  85. package/Tests/App/Dashboard/InvestigationPanel.test.tsx +1 -1
  86. package/Tests/App/Dashboard/MonitorTypePicker.test.tsx +328 -0
  87. package/Tests/App/StatusPage/StatusPageIndexPageRobotsMeta.test.ts +130 -0
  88. package/Tests/Models/DatabaseModels/DatabaseBaseModelToJSONObjectCache.test.ts +180 -0
  89. package/Tests/Models/StatusPageEnableSearchEngineIndexing.test.ts +157 -0
  90. package/Tests/Models/UserPushCriticalAlertColumn.test.ts +172 -0
  91. package/Tests/Server/API/AIChatCancelAndFeedback.test.ts +23 -1
  92. package/Tests/Server/API/AIChatRouteAuthorization.test.ts +785 -0
  93. package/Tests/Server/API/BaseAPIApiKeyAuth.test.ts +21 -8
  94. package/Tests/Server/API/BaseAPIGetListParallel.test.ts +519 -0
  95. package/Tests/Server/API/CommonAPIAuthGuard.test.ts +290 -0
  96. package/Tests/Server/API/MicrosoftTeamsManifest.test.ts +7 -1
  97. package/Tests/Server/API/NotificationChannelVerificationAPI.test.ts +543 -0
  98. package/Tests/Server/API/StatusPageOverviewCache.test.ts +474 -0
  99. package/Tests/Server/API/StatusPageSeoSearchEngineIndexing.test.ts +189 -0
  100. package/Tests/Server/API/UserIncomingCallNumberApi.test.ts +108 -18
  101. package/Tests/Server/API/UserNotificationMethodAdminAPI.test.ts +963 -0
  102. package/Tests/Server/API/UserPushCriticalAlertsApi.test.ts +114 -0
  103. package/Tests/Server/API/UserSmsApi.test.ts +107 -14
  104. package/Tests/Server/API/UserTotpAuthAPI.test.ts +427 -0
  105. package/Tests/Server/Infrastructure/InMemoryTTLCache.test.ts +158 -0
  106. package/Tests/Server/Infrastructure/Postgres/DeviceRoleAndDeclaredLinkParentMigration.test.ts +9 -60
  107. package/Tests/Server/Infrastructure/Postgres/FixTotpOtpUrlAlgorithmMigration.test.ts +315 -0
  108. package/Tests/Server/Middleware/ProjectAuthorizationApiKeyMiddleware.test.ts +24 -15
  109. package/Tests/Server/Middleware/UserAuthorization.test.ts +79 -0
  110. package/Tests/Server/Middleware/VerificationCodeRateLimit.test.ts +775 -0
  111. package/Tests/Server/Services/AddNetworkDeviceReachabilityColumnsMigration.test.ts +280 -0
  112. package/Tests/Server/Services/AnalyticsDatabasePaginationStability.test.ts +33 -13
  113. package/Tests/Server/Services/AnalyticsDatabaseSortKeyBoundary.test.ts +658 -0
  114. package/Tests/Server/Services/ApiKeyPermissionService.test.ts +347 -0
  115. package/Tests/Server/Services/CriticalOnCallAlertDelivery.test.ts +458 -0
  116. package/Tests/Server/Services/CriticalPushAlertPayload.test.ts +301 -0
  117. package/Tests/Server/Services/DatabaseServiceAtomicIncrement.test.ts +143 -0
  118. package/Tests/Server/Services/DatabaseServiceUpdateDebugLogging.test.ts +282 -0
  119. package/Tests/Server/Services/DeliverNotificationForRuleExtraction.test.ts +1 -0
  120. package/Tests/Server/Services/LogAggregationScanMemory.test.ts +421 -0
  121. package/Tests/Server/Services/LogAggregationService.test.ts +2 -2
  122. package/Tests/Server/Services/NetworkSiteService.test.ts +56 -2
  123. package/Tests/Server/Services/NotificationChannelCodeIssuance.test.ts +401 -0
  124. package/Tests/Server/Services/PushNotificationDeliveryOptions.test.ts +204 -0
  125. package/Tests/Server/Services/TeamMemberAutoAcceptInvitation.test.ts +21 -1
  126. package/Tests/Server/Services/TeamMemberInviteRegistrationToken.test.ts +290 -0
  127. package/Tests/Server/Services/TelemetryResourceFacetFilters.test.ts +267 -0
  128. package/Tests/Server/Services/UserNotificationMethodAdminService.test.ts +948 -0
  129. package/Tests/Server/Services/UserNotificationRuleExecuteItem.test.ts +1 -0
  130. package/Tests/Server/Services/UserPushCriticalAlertToggle.test.ts +255 -0
  131. package/Tests/Server/Services/UserTotpAuthEnrolment.test.ts +218 -0
  132. package/Tests/Server/Services/WorkspaceNotificationRuleTestRuleChannels.test.ts +702 -0
  133. package/Tests/Server/TestingUtils/AuthenticatorApp.ts +248 -0
  134. package/Tests/Server/Types/Database/Permissions/AccessControlPermission.test.ts +165 -0
  135. package/Tests/Server/Types/Database/Permissions/NotificationChannelVerificationColumns.test.ts +135 -0
  136. package/Tests/Server/Types/Database/Permissions/OnCallScheduleRelationSelect.test.ts +504 -0
  137. package/Tests/Server/Types/Database/QueryHelperFindWithSameTextAnyOf.test.ts +91 -0
  138. package/Tests/Server/Types/Workflow/Components/JsonToText.test.ts +384 -0
  139. package/Tests/Server/Types/Workflow/Components/MergeJson.test.ts +403 -0
  140. package/Tests/Server/Utils/APIKey/AccessPermission.test.ts +48 -36
  141. package/Tests/Server/Utils/AnalyticsDatabase/StatementGenerator.test.ts +213 -0
  142. package/Tests/Server/Utils/Browser.test.ts +162 -0
  143. package/Tests/Server/Utils/ChannelVerification.test.ts +689 -0
  144. package/Tests/Server/Utils/Express.test.ts +371 -0
  145. package/Tests/Server/Utils/LogRedaction.test.ts +415 -0
  146. package/Tests/Server/Utils/LoggerCredentialLeak.test.ts +245 -0
  147. package/Tests/Server/Utils/Monitor/Criteria/CustomCodeMonitorCriteria.test.ts +707 -0
  148. package/Tests/Server/Utils/Monitor/Criteria/DnsMonitorCriteria.test.ts +698 -0
  149. package/Tests/Server/Utils/Monitor/Criteria/IncomingEmailBodyCriteria.test.ts +243 -0
  150. package/Tests/Server/Utils/Monitor/Criteria/IncomingRequestBodyCriteria.test.ts +278 -0
  151. package/Tests/Server/Utils/Monitor/Criteria/SSLMonitorCriteria.test.ts +374 -4
  152. package/Tests/Server/Utils/Monitor/MonitorAlertResourceLinking.test.ts +160 -20
  153. package/Tests/Server/Utils/Monitor/MonitorDependencySuppressionCreatorSkip.test.ts +13 -8
  154. package/Tests/Server/Utils/Monitor/MonitorIncidentResourceLinking.test.ts +162 -18
  155. package/Tests/Server/Utils/Monitor/MonitorResourceContext.test.ts +349 -0
  156. package/Tests/Server/Utils/Monitor/MonitorResourceIngestedStepSelection.test.ts +455 -0
  157. package/Tests/Server/Utils/Monitor/MonitorStepResourceIdentity.test.ts +690 -0
  158. package/Tests/Server/Utils/Monitor/MonitorSummaryPersistence.test.ts +7 -2
  159. package/Tests/Server/Utils/Monitor/NetworkDeviceReachabilityRoundTrip.test.ts +369 -0
  160. package/Tests/Server/Utils/Monitor/NetworkInventoryUtil.test.ts +86 -8
  161. package/Tests/Server/Utils/Monitor/SeriesResourceLinker.test.ts +92 -18
  162. package/Tests/Server/Utils/PrivacyFilterUtil.test.ts +64 -0
  163. package/Tests/Server/Utils/PushNotificationUtilCreators.test.ts +267 -0
  164. package/Tests/Server/Utils/SessionReplay/SessionReplayGateCacheStore.test.ts +207 -0
  165. package/Tests/Server/Utils/StartServerBodyVerify.test.ts +335 -0
  166. package/Tests/Server/Utils/StatusPageSearchEngineIndexing.test.ts +60 -0
  167. package/Tests/Server/Utils/Telemetry/OneuptimeLabel.test.ts +439 -0
  168. package/Tests/Server/Utils/Telemetry/ResourceEntityFilter.test.ts +435 -0
  169. package/Tests/Server/Utils/TotpAuth.test.ts +719 -0
  170. package/Tests/Server/Utils/UserRegistrationToken.test.ts +322 -0
  171. package/Tests/Server/Utils/VerificationCode.test.ts +296 -0
  172. package/Tests/Server/Utils/Workspace/MicrosoftTeamsChannelSend.test.ts +607 -62
  173. package/Tests/Server/Utils/Workspace/MicrosoftTeamsInstalledTeamIdSpace.test.ts +778 -0
  174. package/Tests/Server/Utils/Workspace/MicrosoftTeamsTeamInstalls.test.ts +44 -10
  175. package/Tests/Types/API/HostnameFromAuthority.test.ts +164 -0
  176. package/Tests/Types/AutoRemediation/AutoRemediationSuggestionStatus.test.ts +192 -0
  177. package/Tests/Types/Call/CallRequest.test.ts +189 -0
  178. package/Tests/Types/Dashboard/DashboardSize.test.ts +226 -0
  179. package/Tests/Types/Database/AccessControl/ColumnAccessControlCache.test.ts +344 -0
  180. package/Tests/Types/Database/DatabasePropertyFindOperator.test.ts +518 -0
  181. package/Tests/Types/Database/TableColumnMetadataCache.test.ts +286 -0
  182. package/Tests/Types/Incident/IncidentSlaStatus.test.ts +191 -0
  183. package/Tests/Types/Metrics/MetricDashboardMetricType.test.ts +278 -0
  184. package/Tests/Types/Metrics/MetricPipelineRuleType.test.ts +517 -0
  185. package/Tests/Types/Monitor/IncomingMonitorDefaultCriteria.test.ts +470 -0
  186. package/Tests/Types/Monitor/MonitorCriteriaInstance.test.ts +6 -4
  187. package/Tests/Types/Monitor/MonitorStep.test.ts +100 -0
  188. package/Tests/Types/Monitor/MonitorTypeKeywords.test.ts +360 -0
  189. package/Tests/Types/Monitor/Recommendation/MonitorRecommendationCatalog.test.ts +262 -5
  190. package/Tests/Types/Monitor/Recommendation/MonitorRecommendationCoverage.test.ts +1 -1
  191. package/Tests/Types/Monitor/Recommendation/MonitorRecommendationNotificationMode.test.ts +1 -1
  192. package/Tests/Types/Monitor/ServiceAlertTemplates.test.ts +905 -0
  193. package/Tests/Types/Service/ServiceLanguage.test.ts +255 -0
  194. package/Tests/Types/StatusPage/SearchEngineIndexing.test.ts +86 -0
  195. package/Tests/Types/Telemetry/ResourceEntityFacet.test.ts +254 -0
  196. package/Tests/Types/TextRandomGeneration.test.ts +211 -0
  197. package/Tests/UI/Components/Button.test.tsx +175 -1
  198. package/Tests/UI/Components/CardSelect.test.tsx +1021 -0
  199. package/Tests/UI/Components/CodeBlockLanguages.test.tsx +236 -0
  200. package/Tests/UI/Components/CommandPalette/CommandPalette.test.tsx +568 -0
  201. package/Tests/UI/Components/CommandPalette/CommandPaletteKeyboard.test.tsx +239 -0
  202. package/Tests/UI/Components/CommandPalette/CommandPaletteProviders.test.tsx +400 -0
  203. package/Tests/UI/Components/CommandPalette/PaletteFilter.test.ts +234 -0
  204. package/Tests/UI/Components/CommandPalette/RecentCommands.test.ts +97 -0
  205. package/Tests/UI/Components/CountModelSideMenuItemGuard.test.tsx +198 -0
  206. package/Tests/UI/Components/FeedItemSafeMode.test.tsx +1 -1
  207. package/Tests/UI/Components/Forms/Utils/FormFieldSchemaTypeUtil.test.ts +267 -0
  208. package/Tests/UI/Components/List.test.tsx +9 -2
  209. package/Tests/UI/Components/ListLoadingStates.test.tsx +173 -0
  210. package/Tests/UI/Components/MarkdownLazy.test.tsx +113 -0
  211. package/Tests/UI/Components/MarkdownMermaidRetry.test.tsx +110 -0
  212. package/Tests/UI/Components/MasterPage.test.tsx +36 -1
  213. package/Tests/UI/Components/ModelTable/useCustomFieldColumns.test.tsx +8 -0
  214. package/Tests/UI/Components/MonitorTemplateVariables/TemplateVariablesCatalog.test.ts +692 -0
  215. package/Tests/UI/Components/MoreMenuMotion.test.tsx +118 -0
  216. package/Tests/UI/Components/NavBarCommandKGating.test.tsx +178 -0
  217. package/Tests/UI/Components/OrderedStatesList.test.tsx +19 -2
  218. package/Tests/UI/Components/SideOverMotion.test.tsx +109 -0
  219. package/Tests/UI/Components/Skeleton.test.tsx +71 -0
  220. package/Tests/UI/Components/TableLoadingStates.test.tsx +279 -0
  221. package/Tests/UI/Components/Tabs.test.tsx +24 -0
  222. package/Tests/UI/Components/Toast.test.tsx +130 -7
  223. package/Tests/UI/Components/ToastStacking.test.tsx +198 -0
  224. package/Tests/UI/Utils/Dropdown.test.ts +423 -0
  225. package/Tests/UI/Utils/ModelAPITenantHeader.test.ts +122 -0
  226. package/Tests/UI/Utils/ModelListCache.test.ts +338 -0
  227. package/Tests/UI/Utils/ProjectListCacheInvalidation.test.ts +225 -0
  228. package/Tests/Utils/API.test.ts +16 -2
  229. package/Tests/Utils/Dashboard/Components/DashboardKubernetesResourceListShared.test.ts +347 -0
  230. package/Tests/Utils/Dashboard/Components/DashboardListSharedArgs.test.ts +259 -0
  231. package/Tests/Utils/Dashboard/Components/DashboardMonitorListComponent.test.ts +466 -0
  232. package/Tests/Utils/Monitor/MonitorMetricType.test.ts +66 -1
  233. package/Tests/Utils/Monitor/NetworkTopologyUtil.test.ts +115 -6
  234. package/Tests/Utils/NetworkDevice/DeviceReachabilityUtil.test.ts +610 -0
  235. package/Tests/Utils/NetworkSite/SiteStatusRollupUtil.test.ts +114 -45
  236. package/Tests/Utils/Rum/UrlScrubberSegments.test.ts +362 -0
  237. package/Types/API/Hostname.ts +79 -0
  238. package/Types/Database/AccessControl/ColumnAccessControl.ts +33 -11
  239. package/Types/Database/AccessControl/ColumnBillingAccessControl.ts +33 -11
  240. package/Types/Database/DatabaseProperty.ts +38 -0
  241. package/Types/Database/TableColumn.ts +34 -7
  242. package/Types/Email/EmailTemplateType.ts +1 -0
  243. package/Types/Events/Recurring.ts +16 -1
  244. package/Types/Monitor/MonitorCriteriaInstance.ts +41 -20
  245. package/Types/Monitor/MonitorStep.ts +13 -1
  246. package/Types/Monitor/MonitorType.ts +345 -40
  247. package/Types/Monitor/Recommendation/MonitorRecommendationCatalog.ts +131 -8
  248. package/Types/Monitor/Recommendation/MonitorRecommendationTypes.ts +48 -8
  249. package/Types/Monitor/SSLMonitor/SslMonitorResponse.ts +43 -0
  250. package/Types/Monitor/ServiceAlertTemplates.ts +1352 -0
  251. package/Types/Permission.ts +35 -0
  252. package/Types/PushNotification/AndroidNotificationChannel.ts +26 -0
  253. package/Types/PushNotification/PushNotificationMessage.ts +15 -0
  254. package/Types/PushNotification/PushNotificationRequest.ts +8 -16
  255. package/Types/Service/ServiceLanguage.ts +144 -0
  256. package/Types/StatusPage/SearchEngineIndexing.ts +61 -0
  257. package/Types/Telemetry/ResourceEntityFacet.ts +211 -0
  258. package/Types/Text.ts +111 -19
  259. package/UI/Components/Button/Button.tsx +27 -14
  260. package/UI/Components/CardSelect/CardSelect.tsx +714 -105
  261. package/UI/Components/CodeBlock/CodeBlock.tsx +54 -7
  262. package/UI/Components/CodeBlock/LanguageRegistry.ts +103 -0
  263. package/UI/Components/CommandPalette/CommandPalette.tsx +790 -0
  264. package/UI/Components/CommandPalette/PaletteFilter.ts +196 -0
  265. package/UI/Components/CommandPalette/PaletteRow.tsx +173 -0
  266. package/UI/Components/CommandPalette/RecentCommands.ts +57 -0
  267. package/UI/Components/CommandPalette/Types.ts +49 -0
  268. package/UI/Components/CommandPalette/UseProviderSearch.ts +129 -0
  269. package/UI/Components/Dropdown/Dropdown.tsx +6 -1
  270. package/UI/Components/EmptyState/EmptyState.tsx +8 -1
  271. package/UI/Components/Feed/FeedItem.tsx +1 -1
  272. package/UI/Components/Footer/Footer.tsx +32 -6
  273. package/UI/Components/Forms/Fields/FormField.tsx +3 -0
  274. package/UI/Components/Forms/Types/Field.ts +8 -0
  275. package/UI/Components/List/List.tsx +37 -5
  276. package/UI/Components/List/ListSkeleton.tsx +54 -0
  277. package/UI/Components/Loader/PageLoader.tsx +29 -8
  278. package/UI/Components/LogsViewer/components/LogsAnalyticsView.tsx +26 -4
  279. package/UI/Components/Markdown.tsx/LazyMarkdownViewer.tsx +23 -2
  280. package/UI/Components/Markdown.tsx/MarkdownViewer.tsx +71 -26
  281. package/UI/Components/MasterPage/MasterPage.tsx +24 -11
  282. package/UI/Components/Modal/Modal.tsx +2 -2
  283. package/UI/Components/ModelTable/BaseModelTable.tsx +1 -1
  284. package/UI/Components/ModelTable/useCustomFieldColumns.ts +11 -5
  285. package/UI/Components/MoreMenu/MoreMenu.tsx +39 -1
  286. package/UI/Components/Navbar/NavBar.tsx +14 -1
  287. package/UI/Components/OrderedStatesList/OrderedStatesList.tsx +50 -5
  288. package/UI/Components/SideMenu/CountModelSideMenuItem.tsx +40 -1
  289. package/UI/Components/SideOver/SideOver.tsx +37 -2
  290. package/UI/Components/Skeleton/Skeleton.tsx +53 -0
  291. package/UI/Components/Table/Table.tsx +74 -44
  292. package/UI/Components/Table/TableSkeletonRows.tsx +141 -0
  293. package/UI/Components/Tabs/Tab.tsx +1 -1
  294. package/UI/Components/Toast/Toast.tsx +118 -53
  295. package/UI/Components/Toast/ToastInit.tsx +82 -32
  296. package/UI/Styles/Theme.css +40 -0
  297. package/UI/Utils/ModelAPI/ModelAPI.ts +20 -10
  298. package/UI/Utils/ModelListCache.ts +188 -0
  299. package/UI/Utils/Project.ts +29 -0
  300. package/Utils/API.ts +6 -1
  301. package/Utils/Monitor/MonitorMetricType.ts +16 -1
  302. package/Utils/Monitor/NetworkTopologyUtil.ts +60 -8
  303. package/Utils/NetworkDevice/DeviceReachabilityUtil.ts +262 -0
  304. package/Utils/NetworkSite/SiteStatusRollupUtil.ts +41 -24
  305. package/Utils/Telemetry/CrossSignalScope.ts +75 -4
  306. package/build/dist/Models/DatabaseModels/DatabaseBaseModel/DatabaseBaseModel.js +20 -4
  307. package/build/dist/Models/DatabaseModels/DatabaseBaseModel/DatabaseBaseModel.js.map +1 -1
  308. package/build/dist/Models/DatabaseModels/NetworkDevice.js +66 -0
  309. package/build/dist/Models/DatabaseModels/NetworkDevice.js.map +1 -1
  310. package/build/dist/Models/DatabaseModels/OnCallDutyPolicySchedule.js +14 -0
  311. package/build/dist/Models/DatabaseModels/OnCallDutyPolicySchedule.js.map +1 -1
  312. package/build/dist/Models/DatabaseModels/StatusPage.js +60 -0
  313. package/build/dist/Models/DatabaseModels/StatusPage.js.map +1 -1
  314. package/build/dist/Models/DatabaseModels/StatusPageOidc.js +2 -0
  315. package/build/dist/Models/DatabaseModels/StatusPageOidc.js.map +1 -1
  316. package/build/dist/Models/DatabaseModels/UserCall.js +101 -3
  317. package/build/dist/Models/DatabaseModels/UserCall.js.map +1 -1
  318. package/build/dist/Models/DatabaseModels/UserEmail.js +101 -3
  319. package/build/dist/Models/DatabaseModels/UserEmail.js.map +1 -1
  320. package/build/dist/Models/DatabaseModels/UserIncomingCallNumber.js +101 -3
  321. package/build/dist/Models/DatabaseModels/UserIncomingCallNumber.js.map +1 -1
  322. package/build/dist/Models/DatabaseModels/UserPush.js +38 -0
  323. package/build/dist/Models/DatabaseModels/UserPush.js.map +1 -1
  324. package/build/dist/Models/DatabaseModels/UserSMS.js +101 -3
  325. package/build/dist/Models/DatabaseModels/UserSMS.js.map +1 -1
  326. package/build/dist/Models/DatabaseModels/UserWhatsApp.js +100 -2
  327. package/build/dist/Models/DatabaseModels/UserWhatsApp.js.map +1 -1
  328. package/build/dist/Models/DatabaseModels/WorkspaceProjectAuthToken.js.map +1 -1
  329. package/build/dist/Server/API/AIChatAPI.js +48 -35
  330. package/build/dist/Server/API/AIChatAPI.js.map +1 -1
  331. package/build/dist/Server/API/BaseAPI.js +69 -13
  332. package/build/dist/Server/API/BaseAPI.js.map +1 -1
  333. package/build/dist/Server/API/CommonAPI.js +59 -0
  334. package/build/dist/Server/API/CommonAPI.js.map +1 -1
  335. package/build/dist/Server/API/MicrosoftTeamsAPI.js +20 -6
  336. package/build/dist/Server/API/MicrosoftTeamsAPI.js.map +1 -1
  337. package/build/dist/Server/API/SlackAPI.js +13 -10
  338. package/build/dist/Server/API/SlackAPI.js.map +1 -1
  339. package/build/dist/Server/API/StatusPageAPI.js +745 -673
  340. package/build/dist/Server/API/StatusPageAPI.js.map +1 -1
  341. package/build/dist/Server/API/TelemetryAPI.js +34 -3
  342. package/build/dist/Server/API/TelemetryAPI.js.map +1 -1
  343. package/build/dist/Server/API/UserCallAPI.js +42 -38
  344. package/build/dist/Server/API/UserCallAPI.js.map +1 -1
  345. package/build/dist/Server/API/UserEmailAPI.js +42 -38
  346. package/build/dist/Server/API/UserEmailAPI.js.map +1 -1
  347. package/build/dist/Server/API/UserIncomingCallNumberAPI.js +37 -32
  348. package/build/dist/Server/API/UserIncomingCallNumberAPI.js.map +1 -1
  349. package/build/dist/Server/API/UserNotificationMethodAdminAPI.js +341 -0
  350. package/build/dist/Server/API/UserNotificationMethodAdminAPI.js.map +1 -0
  351. package/build/dist/Server/API/UserPushAPI.js +95 -2
  352. package/build/dist/Server/API/UserPushAPI.js.map +1 -1
  353. package/build/dist/Server/API/UserSmsAPI.js +42 -38
  354. package/build/dist/Server/API/UserSmsAPI.js.map +1 -1
  355. package/build/dist/Server/API/UserWhatsAppAPI.js +42 -40
  356. package/build/dist/Server/API/UserWhatsAppAPI.js.map +1 -1
  357. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1787142779538-MigrationName.js +89 -0
  358. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1787142779538-MigrationName.js.map +1 -0
  359. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1787156982416-MigrationName.js +12 -0
  360. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1787156982416-MigrationName.js.map +1 -0
  361. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1787500000000-AddEnableSearchEngineIndexingToStatusPage.js +23 -0
  362. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1787500000000-AddEnableSearchEngineIndexingToStatusPage.js.map +1 -0
  363. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1787600000000-AddNetworkDeviceReachabilityColumns.js +34 -0
  364. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1787600000000-AddNetworkDeviceReachabilityColumns.js.map +1 -0
  365. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1787700000000-FixTotpOtpUrlAlgorithm.js +40 -0
  366. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1787700000000-FixTotpOtpUrlAlgorithm.js.map +1 -0
  367. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js +10 -0
  368. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js.map +1 -1
  369. package/build/dist/Server/Middleware/UserAuthorization.js +6 -2
  370. package/build/dist/Server/Middleware/UserAuthorization.js.map +1 -1
  371. package/build/dist/Server/Middleware/VerificationCodeRateLimit.js +393 -0
  372. package/build/dist/Server/Middleware/VerificationCodeRateLimit.js.map +1 -0
  373. package/build/dist/Server/Services/AnalyticsDatabaseService.js +136 -0
  374. package/build/dist/Server/Services/AnalyticsDatabaseService.js.map +1 -1
  375. package/build/dist/Server/Services/ApiKeyPermissionService.js +90 -1
  376. package/build/dist/Server/Services/ApiKeyPermissionService.js.map +1 -1
  377. package/build/dist/Server/Services/DatabaseService.js +89 -6
  378. package/build/dist/Server/Services/DatabaseService.js.map +1 -1
  379. package/build/dist/Server/Services/LogAggregationService.js +7 -0
  380. package/build/dist/Server/Services/LogAggregationService.js.map +1 -1
  381. package/build/dist/Server/Services/LogService.js +16 -0
  382. package/build/dist/Server/Services/LogService.js.map +1 -1
  383. package/build/dist/Server/Services/NetworkSiteService.js +12 -0
  384. package/build/dist/Server/Services/NetworkSiteService.js.map +1 -1
  385. package/build/dist/Server/Services/PushNotificationService.js +69 -30
  386. package/build/dist/Server/Services/PushNotificationService.js.map +1 -1
  387. package/build/dist/Server/Services/SpanService.js +16 -0
  388. package/build/dist/Server/Services/SpanService.js.map +1 -1
  389. package/build/dist/Server/Services/TeamMemberService.js +43 -7
  390. package/build/dist/Server/Services/TeamMemberService.js.map +1 -1
  391. package/build/dist/Server/Services/TraceAggregationService.js +2 -0
  392. package/build/dist/Server/Services/TraceAggregationService.js.map +1 -1
  393. package/build/dist/Server/Services/UserCallService.js +54 -22
  394. package/build/dist/Server/Services/UserCallService.js.map +1 -1
  395. package/build/dist/Server/Services/UserEmailService.js +78 -17
  396. package/build/dist/Server/Services/UserEmailService.js.map +1 -1
  397. package/build/dist/Server/Services/UserIncomingCallNumberService.js +45 -74
  398. package/build/dist/Server/Services/UserIncomingCallNumberService.js.map +1 -1
  399. package/build/dist/Server/Services/UserNotificationMethodAdminService.js +1117 -0
  400. package/build/dist/Server/Services/UserNotificationMethodAdminService.js.map +1 -0
  401. package/build/dist/Server/Services/UserNotificationRuleService.js +20 -0
  402. package/build/dist/Server/Services/UserNotificationRuleService.js.map +1 -1
  403. package/build/dist/Server/Services/UserPushService.js +77 -0
  404. package/build/dist/Server/Services/UserPushService.js.map +1 -1
  405. package/build/dist/Server/Services/UserSmsService.js +50 -17
  406. package/build/dist/Server/Services/UserSmsService.js.map +1 -1
  407. package/build/dist/Server/Services/UserWhatsAppService.js +48 -15
  408. package/build/dist/Server/Services/UserWhatsAppService.js.map +1 -1
  409. package/build/dist/Server/Services/WorkspaceNotificationRuleService.js +137 -164
  410. package/build/dist/Server/Services/WorkspaceNotificationRuleService.js.map +1 -1
  411. package/build/dist/Server/Types/AnalyticsDatabase/ModelPermission.js +9 -0
  412. package/build/dist/Server/Types/AnalyticsDatabase/ModelPermission.js.map +1 -1
  413. package/build/dist/Server/Types/Database/Permissions/AccessControlPermission.js +21 -13
  414. package/build/dist/Server/Types/Database/Permissions/AccessControlPermission.js.map +1 -1
  415. package/build/dist/Server/Types/Database/QueryHelper.js +27 -0
  416. package/build/dist/Server/Types/Database/QueryHelper.js.map +1 -1
  417. package/build/dist/Server/Utils/APIKey/AccessPermission.js +9 -32
  418. package/build/dist/Server/Utils/APIKey/AccessPermission.js.map +1 -1
  419. package/build/dist/Server/Utils/AnalyticsDatabase/QuerySettingsHelper.js +46 -0
  420. package/build/dist/Server/Utils/AnalyticsDatabase/QuerySettingsHelper.js.map +1 -1
  421. package/build/dist/Server/Utils/AnalyticsDatabase/StatementGenerator.js +87 -0
  422. package/build/dist/Server/Utils/AnalyticsDatabase/StatementGenerator.js.map +1 -1
  423. package/build/dist/Server/Utils/ChannelVerification.js +348 -0
  424. package/build/dist/Server/Utils/ChannelVerification.js.map +1 -0
  425. package/build/dist/Server/Utils/LogRedaction.js +449 -0
  426. package/build/dist/Server/Utils/LogRedaction.js.map +1 -0
  427. package/build/dist/Server/Utils/Logger.js +98 -45
  428. package/build/dist/Server/Utils/Logger.js.map +1 -1
  429. package/build/dist/Server/Utils/Monitor/Criteria/IncomingRequestCriteria.js +13 -12
  430. package/build/dist/Server/Utils/Monitor/Criteria/IncomingRequestCriteria.js.map +1 -1
  431. package/build/dist/Server/Utils/Monitor/Criteria/SSLMonitorCriteria.js +65 -13
  432. package/build/dist/Server/Utils/Monitor/Criteria/SSLMonitorCriteria.js.map +1 -1
  433. package/build/dist/Server/Utils/Monitor/MonitorAlert.js +20 -17
  434. package/build/dist/Server/Utils/Monitor/MonitorAlert.js.map +1 -1
  435. package/build/dist/Server/Utils/Monitor/MonitorIncident.js +17 -14
  436. package/build/dist/Server/Utils/Monitor/MonitorIncident.js.map +1 -1
  437. package/build/dist/Server/Utils/Monitor/MonitorResource.js +20 -3
  438. package/build/dist/Server/Utils/Monitor/MonitorResource.js.map +1 -1
  439. package/build/dist/Server/Utils/Monitor/MonitorResourceContext.js +95 -0
  440. package/build/dist/Server/Utils/Monitor/MonitorResourceContext.js.map +1 -0
  441. package/build/dist/Server/Utils/Monitor/MonitorStepResourceIdentity.js +313 -0
  442. package/build/dist/Server/Utils/Monitor/MonitorStepResourceIdentity.js.map +1 -0
  443. package/build/dist/Server/Utils/Monitor/NetworkInventoryUtil.js +27 -7
  444. package/build/dist/Server/Utils/Monitor/NetworkInventoryUtil.js.map +1 -1
  445. package/build/dist/Server/Utils/Monitor/SeriesResourceLabels.js +3 -3
  446. package/build/dist/Server/Utils/Monitor/SeriesResourceLinker.js +67 -26
  447. package/build/dist/Server/Utils/Monitor/SeriesResourceLinker.js.map +1 -1
  448. package/build/dist/Server/Utils/SessionReplay/SessionReplayGateCacheStore.js +29 -10
  449. package/build/dist/Server/Utils/SessionReplay/SessionReplayGateCacheStore.js.map +1 -1
  450. package/build/dist/Server/Utils/StartServer.js +10 -7
  451. package/build/dist/Server/Utils/StartServer.js.map +1 -1
  452. package/build/dist/Server/Utils/StatusPageSearchEngineIndexing.js +24 -0
  453. package/build/dist/Server/Utils/StatusPageSearchEngineIndexing.js.map +1 -0
  454. package/build/dist/Server/Utils/Telemetry/ResourceEntityFilter.js +311 -0
  455. package/build/dist/Server/Utils/Telemetry/ResourceEntityFilter.js.map +1 -0
  456. package/build/dist/Server/Utils/TotpAuth.js +127 -8
  457. package/build/dist/Server/Utils/TotpAuth.js.map +1 -1
  458. package/build/dist/Server/Utils/UserRegistrationToken.js +170 -0
  459. package/build/dist/Server/Utils/UserRegistrationToken.js.map +1 -0
  460. package/build/dist/Server/Utils/VerificationCode.js +120 -0
  461. package/build/dist/Server/Utils/VerificationCode.js.map +1 -0
  462. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeams.js +366 -37
  463. package/build/dist/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeams.js.map +1 -1
  464. package/build/dist/Types/API/Hostname.js +63 -0
  465. package/build/dist/Types/API/Hostname.js.map +1 -1
  466. package/build/dist/Types/Database/AccessControl/ColumnAccessControl.js +20 -6
  467. package/build/dist/Types/Database/AccessControl/ColumnAccessControl.js.map +1 -1
  468. package/build/dist/Types/Database/AccessControl/ColumnBillingAccessControl.js +20 -6
  469. package/build/dist/Types/Database/AccessControl/ColumnBillingAccessControl.js.map +1 -1
  470. package/build/dist/Types/Database/DatabaseProperty.js +38 -0
  471. package/build/dist/Types/Database/DatabaseProperty.js.map +1 -1
  472. package/build/dist/Types/Database/TableColumn.js +24 -6
  473. package/build/dist/Types/Database/TableColumn.js.map +1 -1
  474. package/build/dist/Types/Email/EmailTemplateType.js +1 -0
  475. package/build/dist/Types/Email/EmailTemplateType.js.map +1 -1
  476. package/build/dist/Types/Events/Recurring.js +13 -1
  477. package/build/dist/Types/Events/Recurring.js.map +1 -1
  478. package/build/dist/Types/Monitor/MonitorCriteriaInstance.js +42 -21
  479. package/build/dist/Types/Monitor/MonitorCriteriaInstance.js.map +1 -1
  480. package/build/dist/Types/Monitor/MonitorStep.js +9 -1
  481. package/build/dist/Types/Monitor/MonitorStep.js.map +1 -1
  482. package/build/dist/Types/Monitor/MonitorType.js +330 -31
  483. package/build/dist/Types/Monitor/MonitorType.js.map +1 -1
  484. package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationCatalog.js +77 -5
  485. package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationCatalog.js.map +1 -1
  486. package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationTypes.js +18 -6
  487. package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationTypes.js.map +1 -1
  488. package/build/dist/Types/Monitor/ServiceAlertTemplates.js +1028 -0
  489. package/build/dist/Types/Monitor/ServiceAlertTemplates.js.map +1 -0
  490. package/build/dist/Types/Permission.js +33 -0
  491. package/build/dist/Types/Permission.js.map +1 -1
  492. package/build/dist/Types/PushNotification/AndroidNotificationChannel.js +27 -0
  493. package/build/dist/Types/PushNotification/AndroidNotificationChannel.js.map +1 -0
  494. package/build/dist/Types/Service/ServiceLanguage.js +96 -0
  495. package/build/dist/Types/Service/ServiceLanguage.js.map +1 -0
  496. package/build/dist/Types/StatusPage/SearchEngineIndexing.js +55 -0
  497. package/build/dist/Types/StatusPage/SearchEngineIndexing.js.map +1 -0
  498. package/build/dist/Types/Telemetry/ResourceEntityFacet.js +156 -0
  499. package/build/dist/Types/Telemetry/ResourceEntityFacet.js.map +1 -0
  500. package/build/dist/Types/Text.js +82 -17
  501. package/build/dist/Types/Text.js.map +1 -1
  502. package/build/dist/UI/Components/Button/Button.js +22 -14
  503. package/build/dist/UI/Components/Button/Button.js.map +1 -1
  504. package/build/dist/UI/Components/CardSelect/CardSelect.js +360 -40
  505. package/build/dist/UI/Components/CardSelect/CardSelect.js.map +1 -1
  506. package/build/dist/UI/Components/CodeBlock/CodeBlock.js +35 -3
  507. package/build/dist/UI/Components/CodeBlock/CodeBlock.js.map +1 -1
  508. package/build/dist/UI/Components/CodeBlock/LanguageRegistry.js +57 -0
  509. package/build/dist/UI/Components/CodeBlock/LanguageRegistry.js.map +1 -0
  510. package/build/dist/UI/Components/CommandPalette/CommandPalette.js +439 -0
  511. package/build/dist/UI/Components/CommandPalette/CommandPalette.js.map +1 -0
  512. package/build/dist/UI/Components/CommandPalette/PaletteFilter.js +135 -0
  513. package/build/dist/UI/Components/CommandPalette/PaletteFilter.js.map +1 -0
  514. package/build/dist/UI/Components/CommandPalette/PaletteRow.js +83 -0
  515. package/build/dist/UI/Components/CommandPalette/PaletteRow.js.map +1 -0
  516. package/build/dist/UI/Components/CommandPalette/RecentCommands.js +47 -0
  517. package/build/dist/UI/Components/CommandPalette/RecentCommands.js.map +1 -0
  518. package/build/dist/UI/Components/CommandPalette/Types.js +2 -0
  519. package/build/dist/UI/Components/CommandPalette/Types.js.map +1 -0
  520. package/build/dist/UI/Components/CommandPalette/UseProviderSearch.js +88 -0
  521. package/build/dist/UI/Components/CommandPalette/UseProviderSearch.js.map +1 -0
  522. package/build/dist/UI/Components/Dropdown/Dropdown.js +6 -1
  523. package/build/dist/UI/Components/Dropdown/Dropdown.js.map +1 -1
  524. package/build/dist/UI/Components/EmptyState/EmptyState.js +1 -1
  525. package/build/dist/UI/Components/EmptyState/EmptyState.js.map +1 -1
  526. package/build/dist/UI/Components/Feed/FeedItem.js +1 -1
  527. package/build/dist/UI/Components/Feed/FeedItem.js.map +1 -1
  528. package/build/dist/UI/Components/Footer/Footer.js +7 -4
  529. package/build/dist/UI/Components/Footer/Footer.js.map +1 -1
  530. package/build/dist/UI/Components/Forms/Fields/FormField.js +1 -1
  531. package/build/dist/UI/Components/Forms/Fields/FormField.js.map +1 -1
  532. package/build/dist/UI/Components/List/List.js +19 -5
  533. package/build/dist/UI/Components/List/List.js.map +1 -1
  534. package/build/dist/UI/Components/List/ListSkeleton.js +21 -0
  535. package/build/dist/UI/Components/List/ListSkeleton.js.map +1 -0
  536. package/build/dist/UI/Components/Loader/PageLoader.js +15 -5
  537. package/build/dist/UI/Components/Loader/PageLoader.js.map +1 -1
  538. package/build/dist/UI/Components/LogsViewer/components/LogsAnalyticsView.js +16 -3
  539. package/build/dist/UI/Components/LogsViewer/components/LogsAnalyticsView.js.map +1 -1
  540. package/build/dist/UI/Components/Markdown.tsx/LazyMarkdownViewer.js +13 -1
  541. package/build/dist/UI/Components/Markdown.tsx/LazyMarkdownViewer.js.map +1 -1
  542. package/build/dist/UI/Components/Markdown.tsx/MarkdownViewer.js +52 -25
  543. package/build/dist/UI/Components/Markdown.tsx/MarkdownViewer.js.map +1 -1
  544. package/build/dist/UI/Components/MasterPage/MasterPage.js +10 -2
  545. package/build/dist/UI/Components/MasterPage/MasterPage.js.map +1 -1
  546. package/build/dist/UI/Components/Modal/Modal.js +2 -2
  547. package/build/dist/UI/Components/ModelTable/BaseModelTable.js +1 -1
  548. package/build/dist/UI/Components/ModelTable/BaseModelTable.js.map +1 -1
  549. package/build/dist/UI/Components/ModelTable/useCustomFieldColumns.js +9 -2
  550. package/build/dist/UI/Components/ModelTable/useCustomFieldColumns.js.map +1 -1
  551. package/build/dist/UI/Components/MoreMenu/MoreMenu.js +32 -1
  552. package/build/dist/UI/Components/MoreMenu/MoreMenu.js.map +1 -1
  553. package/build/dist/UI/Components/Navbar/NavBar.js +5 -1
  554. package/build/dist/UI/Components/Navbar/NavBar.js.map +1 -1
  555. package/build/dist/UI/Components/OrderedStatesList/OrderedStatesList.js +29 -5
  556. package/build/dist/UI/Components/OrderedStatesList/OrderedStatesList.js.map +1 -1
  557. package/build/dist/UI/Components/SideMenu/CountModelSideMenuItem.js +23 -1
  558. package/build/dist/UI/Components/SideMenu/CountModelSideMenuItem.js.map +1 -1
  559. package/build/dist/UI/Components/SideOver/SideOver.js +23 -2
  560. package/build/dist/UI/Components/SideOver/SideOver.js.map +1 -1
  561. package/build/dist/UI/Components/Skeleton/Skeleton.js +23 -0
  562. package/build/dist/UI/Components/Skeleton/Skeleton.js.map +1 -0
  563. package/build/dist/UI/Components/Table/Table.js +35 -24
  564. package/build/dist/UI/Components/Table/Table.js.map +1 -1
  565. package/build/dist/UI/Components/Table/TableSkeletonRows.js +52 -0
  566. package/build/dist/UI/Components/Table/TableSkeletonRows.js.map +1 -0
  567. package/build/dist/UI/Components/Tabs/Tab.js +1 -1
  568. package/build/dist/UI/Components/Tabs/Tab.js.map +1 -1
  569. package/build/dist/UI/Components/Toast/Toast.js +77 -23
  570. package/build/dist/UI/Components/Toast/Toast.js.map +1 -1
  571. package/build/dist/UI/Components/Toast/ToastInit.js +37 -15
  572. package/build/dist/UI/Components/Toast/ToastInit.js.map +1 -1
  573. package/build/dist/UI/Utils/ModelAPI/ModelAPI.js +18 -9
  574. package/build/dist/UI/Utils/ModelAPI/ModelAPI.js.map +1 -1
  575. package/build/dist/UI/Utils/ModelListCache.js +126 -0
  576. package/build/dist/UI/Utils/ModelListCache.js.map +1 -0
  577. package/build/dist/UI/Utils/Project.js +24 -1
  578. package/build/dist/UI/Utils/Project.js.map +1 -1
  579. package/build/dist/Utils/API.js +6 -1
  580. package/build/dist/Utils/API.js.map +1 -1
  581. package/build/dist/Utils/Monitor/MonitorMetricType.js +13 -1
  582. package/build/dist/Utils/Monitor/MonitorMetricType.js.map +1 -1
  583. package/build/dist/Utils/Monitor/NetworkTopologyUtil.js +34 -7
  584. package/build/dist/Utils/Monitor/NetworkTopologyUtil.js.map +1 -1
  585. package/build/dist/Utils/NetworkDevice/DeviceReachabilityUtil.js +177 -0
  586. package/build/dist/Utils/NetworkDevice/DeviceReachabilityUtil.js.map +1 -0
  587. package/build/dist/Utils/NetworkSite/SiteStatusRollupUtil.js +23 -27
  588. package/build/dist/Utils/NetworkSite/SiteStatusRollupUtil.js.map +1 -1
  589. package/build/dist/Utils/Telemetry/CrossSignalScope.js +44 -4
  590. package/build/dist/Utils/Telemetry/CrossSignalScope.js.map +1 -1
  591. package/jest.config.json +1 -1
  592. package/package.json +2 -3
  593. package/Server/Utils/Monitor/MonitorClusterContext.ts +0 -182
  594. package/Tests/__mocks__/otpauth.js +0 -30
  595. package/build/dist/Server/Utils/Monitor/MonitorClusterContext.js +0 -141
  596. package/build/dist/Server/Utils/Monitor/MonitorClusterContext.js.map +0 -1
@@ -0,0 +1,255 @@
1
+ import {
2
+ SERVICE_LANGUAGE_DISPLAY_NAMES,
3
+ ServiceLanguage,
4
+ detectServiceLanguage,
5
+ } from "../../../Types/Service/ServiceLanguage";
6
+ import TechStack from "../../../Types/Service/TechStack";
7
+
8
+ /*
9
+ * Which runtime a service is written in, decided from three sources of
10
+ * evidence of decreasing trustworthiness.
11
+ *
12
+ * This used to only pick which charts to draw on the service overview, where
13
+ * a wrong answer is a chart with no data in it. It now also picks which
14
+ * monitors OneUptime recommends, where a wrong answer is a monitor that
15
+ * queries a metric the service never emits and therefore never fires — a
16
+ * silent gap that reads as coverage. Every case below is about the difference
17
+ * between "we know" and "we are guessing".
18
+ */
19
+
20
+ const ALL_LANGUAGES: Array<ServiceLanguage> = Object.keys(
21
+ SERVICE_LANGUAGE_DISPLAY_NAMES,
22
+ ) as Array<ServiceLanguage>;
23
+
24
+ describe("detectServiceLanguage", () => {
25
+ describe("precedence between the three sources", () => {
26
+ /*
27
+ * The order is not arbitrary. `telemetry.sdk.language` is stamped by the
28
+ * SDK inside the process, so it describes what the process actually runs
29
+ * on. `process.runtime.name` is the same information one hop later.
30
+ * The tech stack is a human's answer typed into a form, which can be
31
+ * months out of date. Each test below sets up a deliberate disagreement
32
+ * so the winner is unambiguous.
33
+ */
34
+ it("prefers the SDK language over the runtime name", () => {
35
+ expect(
36
+ detectServiceLanguage({
37
+ telemetrySdkLanguage: "go",
38
+ runtimeName: "OpenJDK Runtime Environment",
39
+ }),
40
+ ).toBe("go");
41
+ });
42
+
43
+ it("prefers the SDK language over the tech stack", () => {
44
+ expect(
45
+ detectServiceLanguage({
46
+ telemetrySdkLanguage: "python",
47
+ techStack: [TechStack.Java],
48
+ }),
49
+ ).toBe("python");
50
+ });
51
+
52
+ it("prefers the runtime name over the tech stack", () => {
53
+ expect(
54
+ detectServiceLanguage({
55
+ runtimeName: "node",
56
+ techStack: [TechStack.Java],
57
+ }),
58
+ ).toBe("nodejs");
59
+ });
60
+
61
+ it("falls through to the tech stack when telemetry says nothing", () => {
62
+ expect(
63
+ detectServiceLanguage({
64
+ techStack: [TechStack.Rust],
65
+ }),
66
+ ).toBe("rust");
67
+ });
68
+ });
69
+
70
+ describe("the SDK language attribute", () => {
71
+ it.each(ALL_LANGUAGES)("recognises %s", (language: ServiceLanguage) => {
72
+ expect(detectServiceLanguage({ telemetrySdkLanguage: language })).toBe(
73
+ language,
74
+ );
75
+ });
76
+
77
+ it("is matched case-insensitively and ignores surrounding whitespace", () => {
78
+ expect(
79
+ detectServiceLanguage({ telemetrySdkLanguage: " DotNet " }),
80
+ ).toBe("dotnet");
81
+ });
82
+
83
+ /*
84
+ * The important negative case. An unrecognised value must NOT be returned
85
+ * verbatim — it would be a string that looks like a `ServiceLanguage` to
86
+ * every consumer and matches no template set, so the recommendations page
87
+ * would show nothing at all rather than the language-agnostic set.
88
+ */
89
+ it("does not pass an unrecognised SDK language through", () => {
90
+ expect(
91
+ detectServiceLanguage({ telemetrySdkLanguage: "cobol" }),
92
+ ).toBeNull();
93
+ });
94
+
95
+ it("falls through to the other sources when the SDK language is unknown", () => {
96
+ expect(
97
+ detectServiceLanguage({
98
+ telemetrySdkLanguage: "cobol",
99
+ techStack: [TechStack.Go],
100
+ }),
101
+ ).toBe("go");
102
+ });
103
+ });
104
+
105
+ describe("the runtime name markers", () => {
106
+ it.each([
107
+ ["OpenJDK 64-Bit Server VM", "java"],
108
+ ["GraalVM CE", "java"],
109
+ ["Java HotSpot(TM) 64-Bit Server VM", "java"],
110
+ [".NET 9.0.0", "dotnet"],
111
+ ["dotnet", "dotnet"],
112
+ ["node", "nodejs"],
113
+ ["Deno", "nodejs"],
114
+ ["bun", "nodejs"],
115
+ ["CPython", "python"],
116
+ ["PyPy", "python"],
117
+ ["BEAM", "erlang"],
118
+ ["Erlang/OTP 26", "erlang"],
119
+ ["ruby", "ruby"],
120
+ ["PHP 8.3", "php"],
121
+ ["rustc", "rust"],
122
+ ["swift", "swift"],
123
+ ["go", "go"],
124
+ ])(
125
+ "maps runtime name %s to %s",
126
+ (runtimeName: string, expected: string) => {
127
+ expect(detectServiceLanguage({ runtimeName: runtimeName })).toBe(
128
+ expected,
129
+ );
130
+ },
131
+ );
132
+
133
+ /*
134
+ * `go` is a two-letter substring, so it appears inside plenty of words —
135
+ * "GraalVM" does not contain it, but the ordering still matters and this
136
+ * pins it: the JVM markers are checked first, so a runtime string that
137
+ * contains both loses to the more specific one.
138
+ */
139
+ it("checks specific markers before the two-letter go marker", () => {
140
+ expect(
141
+ detectServiceLanguage({ runtimeName: "GraalVM for Go interop" }),
142
+ ).toBe("java");
143
+ });
144
+
145
+ it("returns null for a runtime name it does not recognise", () => {
146
+ expect(detectServiceLanguage({ runtimeName: "SomeVM 1.0" })).toBeNull();
147
+ });
148
+ });
149
+
150
+ describe("the tech stack fallback", () => {
151
+ it("maps Kotlin to java, because the runtime is what matters", () => {
152
+ expect(detectServiceLanguage({ techStack: [TechStack.Kotlin] })).toBe(
153
+ "java",
154
+ );
155
+ });
156
+
157
+ it("maps C# to dotnet", () => {
158
+ expect(detectServiceLanguage({ techStack: [TechStack.CSharp] })).toBe(
159
+ "dotnet",
160
+ );
161
+ });
162
+
163
+ it.each([TechStack.TypeScript, TechStack.JavaScript, TechStack.NodeJS])(
164
+ "maps %s to nodejs",
165
+ (techStack: TechStack) => {
166
+ expect(detectServiceLanguage({ techStack: [techStack] })).toBe(
167
+ "nodejs",
168
+ );
169
+ },
170
+ );
171
+
172
+ it("maps React to webjs rather than to nodejs", () => {
173
+ expect(detectServiceLanguage({ techStack: [TechStack.React] })).toBe(
174
+ "webjs",
175
+ );
176
+ });
177
+
178
+ it("takes the first entry that maps to a runtime", () => {
179
+ expect(
180
+ detectServiceLanguage({
181
+ techStack: [TechStack.Shell, TechStack.Markdown, TechStack.Go],
182
+ }),
183
+ ).toBe("go");
184
+ });
185
+
186
+ it.each([TechStack.Shell, TechStack.Markdown, TechStack.Other])(
187
+ "does not invent a runtime for %s",
188
+ (techStack: TechStack) => {
189
+ expect(detectServiceLanguage({ techStack: [techStack] })).toBeNull();
190
+ },
191
+ );
192
+ });
193
+
194
+ describe("when nothing identifies the runtime", () => {
195
+ /*
196
+ * Null, never a default. A default would hand every unidentified service
197
+ * one language's recommendations — monitors on metrics it does not emit,
198
+ * presented as if OneUptime had established what it runs on.
199
+ */
200
+ it("returns null for no input at all", () => {
201
+ expect(detectServiceLanguage({})).toBeNull();
202
+ });
203
+
204
+ it("returns null for empty strings and an empty tech stack", () => {
205
+ expect(
206
+ detectServiceLanguage({
207
+ telemetrySdkLanguage: "",
208
+ runtimeName: "",
209
+ techStack: [],
210
+ }),
211
+ ).toBeNull();
212
+ });
213
+
214
+ it("returns null for whitespace-only telemetry values", () => {
215
+ expect(
216
+ detectServiceLanguage({
217
+ telemetrySdkLanguage: " ",
218
+ runtimeName: " ",
219
+ }),
220
+ ).toBeNull();
221
+ });
222
+
223
+ it("returns null for explicitly undefined fields", () => {
224
+ expect(
225
+ detectServiceLanguage({
226
+ telemetrySdkLanguage: undefined,
227
+ runtimeName: undefined,
228
+ techStack: undefined,
229
+ }),
230
+ ).toBeNull();
231
+ });
232
+ });
233
+ });
234
+
235
+ describe("SERVICE_LANGUAGE_DISPLAY_NAMES", () => {
236
+ it("names every language, non-blank", () => {
237
+ expect(ALL_LANGUAGES.length).toBeGreaterThan(0);
238
+
239
+ for (const language of ALL_LANGUAGES) {
240
+ expect(
241
+ SERVICE_LANGUAGE_DISPLAY_NAMES[language].trim().length,
242
+ ).toBeGreaterThan(0);
243
+ }
244
+ });
245
+
246
+ it("gives each language a distinct display name", () => {
247
+ const names: Array<string> = ALL_LANGUAGES.map(
248
+ (language: ServiceLanguage) => {
249
+ return SERVICE_LANGUAGE_DISPLAY_NAMES[language];
250
+ },
251
+ );
252
+
253
+ expect(new Set<string>(names).size).toBe(names.length);
254
+ });
255
+ });
@@ -0,0 +1,86 @@
1
+ /**
2
+ * The single place that decides "is this status page indexable?".
3
+ *
4
+ * Every renderer feeds this the raw flag off the /seo API response, and the
5
+ * answer decides whether a <meta name="robots"> and an X-Robots-Tag go out.
6
+ * The interesting half is what it does with values that are NOT an explicit
7
+ * off - a missing field, a null, an API that did not answer - because that is
8
+ * the state the internal HTTP call lands in whenever anything goes wrong, and
9
+ * it must resolve to "indexable" rather than silently de-indexing pages whose
10
+ * owners never asked for it.
11
+ */
12
+
13
+ import {
14
+ NOINDEX_ROBOTS_DIRECTIVE,
15
+ SEARCH_ENGINE_INDEXING_FLAG_NAME,
16
+ X_ROBOTS_TAG_HEADER_NAME,
17
+ isSearchEngineIndexingEnabled,
18
+ } from "../../../Types/StatusPage/SearchEngineIndexing";
19
+ import { describe, expect, test } from "@jest/globals";
20
+
21
+ describe("isSearchEngineIndexingEnabled", () => {
22
+ test("the owner turning the toggle off is the only thing that blocks indexing", () => {
23
+ expect(isSearchEngineIndexingEnabled(false)).toBe(false);
24
+ });
25
+
26
+ test("the toggle left on indexes", () => {
27
+ expect(isSearchEngineIndexingEnabled(true)).toBe(true);
28
+ });
29
+
30
+ test("a JSON round-trip that stringified the boolean still reads as off", () => {
31
+ /*
32
+ * The flag crosses an HTTP boundary between the API and the two frontend
33
+ * servers. A serializer that renders booleans as strings must not turn an
34
+ * opt-out back into an opt-in.
35
+ */
36
+ expect(isSearchEngineIndexingEnabled("false")).toBe(false);
37
+ expect(isSearchEngineIndexingEnabled("true")).toBe(true);
38
+ });
39
+
40
+ describe("anything that is not an explicit off leaves the page indexable", () => {
41
+ /*
42
+ * These are the shapes an unreachable or older /seo API produces. Reading
43
+ * any of them as "noindex" would take a page out of Google over a blip on
44
+ * an internal HTTP call - a failure the owner never asked for and would
45
+ * have no way to see.
46
+ */
47
+ const notAnExplicitOff: Array<[string, unknown]> = [
48
+ ["field absent from the response", undefined],
49
+ ["field present but null", null],
50
+ ["empty string", ""],
51
+ ["zero", 0],
52
+ ["the string 'no'", "no"],
53
+ ["the string 'FALSE' in the wrong case", "FALSE"],
54
+ ["an object", {}],
55
+ ];
56
+
57
+ test.each(notAnExplicitOff)("%s", (_label: string, value: unknown) => {
58
+ expect(isSearchEngineIndexingEnabled(value)).toBe(true);
59
+ });
60
+ });
61
+ });
62
+
63
+ describe("the directives that go on the wire", () => {
64
+ /*
65
+ * Pinned strings. Crawlers parse these literally, so a typo here is a
66
+ * feature that silently does nothing - the page keeps being indexed and
67
+ * nothing errors.
68
+ */
69
+ test("the robots directive is noindex, nofollow", () => {
70
+ expect(NOINDEX_ROBOTS_DIRECTIVE).toBe("noindex, nofollow");
71
+ });
72
+
73
+ test("the response header is X-Robots-Tag", () => {
74
+ expect(X_ROBOTS_TAG_HEADER_NAME).toBe("X-Robots-Tag");
75
+ });
76
+
77
+ test("the API/template flag name matches the model column name", () => {
78
+ /*
79
+ * The /seo API keys its response off this constant, and index.ejs reads a
80
+ * variable of the same name. Renaming the column without renaming this
81
+ * would leave the template reading undefined - which reads as indexable,
82
+ * so the toggle would just stop working, quietly.
83
+ */
84
+ expect(SEARCH_ENGINE_INDEXING_FLAG_NAME).toBe("enableSearchEngineIndexing");
85
+ });
86
+ });
@@ -0,0 +1,254 @@
1
+ import { describe, expect, test } from "@jest/globals";
2
+ import {
3
+ ALL_RESOURCE_FACET_KEYS,
4
+ MAX_RESOURCE_IDS_PER_FACET,
5
+ RESOURCE_ENTITY_FACET_KEYS,
6
+ ResourceEntityFacetSelections,
7
+ SERVICE_FACET_KEYS,
8
+ collectResourceEntityFacetSelections,
9
+ collectServiceFacetSelections,
10
+ hasResourceEntityFacetSelections,
11
+ isResourceEntityFacetKey,
12
+ isResourceFacetKey,
13
+ isServiceFacetKey,
14
+ parseResourceEntityFacetSelections,
15
+ } from "../../../Types/Telemetry/ResourceEntityFacet";
16
+
17
+ /*
18
+ * The split this module encodes is the whole fix for issue #3216: the
19
+ * Services facet reads out of `primaryEntityId`, every other resource facet
20
+ * has to be resolved through the resource's entity key. Getting a key into
21
+ * the wrong bucket silently reintroduces the bug (a cluster id compared
22
+ * against a column that only holds Service ids), so the classification is
23
+ * pinned here rather than left to the call sites.
24
+ */
25
+
26
+ const CLUSTER_ID: string = "8c0f2f1e-2e4f-4a8c-9a1a-2f5b6c7d8e9f";
27
+ const OTHER_CLUSTER_ID: string = "1a2b3c4d-5e6f-4071-8293-a4b5c6d7e8f9";
28
+ const HOST_ID: string = "5f4e3d2c-1b0a-4998-8776-655443322110";
29
+ const SERVICE_ID: string = "0d1c2b3a-4958-4867-9776-8574a3b2c1d0";
30
+
31
+ function facetMap(
32
+ entries: Record<string, Array<string>>,
33
+ ): Map<string, Set<string>> {
34
+ const map: Map<string, Set<string>> = new Map();
35
+
36
+ for (const [key, values] of Object.entries(entries)) {
37
+ map.set(key, new Set(values));
38
+ }
39
+
40
+ return map;
41
+ }
42
+
43
+ describe("ResourceEntityFacet", () => {
44
+ describe("facet classification", () => {
45
+ test("the Services facet and its pre-rename alias read out of primaryEntityId", () => {
46
+ expect(isServiceFacetKey("primaryEntityId")).toBe(true);
47
+ expect(isServiceFacetKey("serviceId")).toBe(true);
48
+ expect(isResourceEntityFacetKey("primaryEntityId")).toBe(false);
49
+ expect(isResourceEntityFacetKey("serviceId")).toBe(false);
50
+ });
51
+
52
+ test("every non-Service resource facet needs entity-key resolution", () => {
53
+ for (const facetKey of [
54
+ "hostId",
55
+ "dockerHostId",
56
+ "podmanHostId",
57
+ "kubernetesClusterId",
58
+ ]) {
59
+ expect(isResourceEntityFacetKey(facetKey)).toBe(true);
60
+ expect(isServiceFacetKey(facetKey)).toBe(false);
61
+ }
62
+ });
63
+
64
+ test("non-resource facets belong to neither group", () => {
65
+ for (const facetKey of [
66
+ "severityText",
67
+ "traceId",
68
+ "spanId",
69
+ "attributes.k8s.cluster.name",
70
+ "",
71
+ ]) {
72
+ expect(isResourceFacetKey(facetKey)).toBe(false);
73
+ }
74
+ });
75
+
76
+ test("the combined list is exactly the two groups, with no overlap", () => {
77
+ expect(ALL_RESOURCE_FACET_KEYS).toEqual([
78
+ ...SERVICE_FACET_KEYS,
79
+ ...RESOURCE_ENTITY_FACET_KEYS,
80
+ ]);
81
+ expect(new Set(ALL_RESOURCE_FACET_KEYS).size).toBe(
82
+ ALL_RESOURCE_FACET_KEYS.length,
83
+ );
84
+ });
85
+ });
86
+
87
+ describe("collectResourceEntityFacetSelections", () => {
88
+ test("keeps each facet's ids under its own key", () => {
89
+ const selections: ResourceEntityFacetSelections =
90
+ collectResourceEntityFacetSelections(
91
+ facetMap({
92
+ kubernetesClusterId: [CLUSTER_ID],
93
+ hostId: [HOST_ID],
94
+ }).entries(),
95
+ );
96
+
97
+ expect(selections).toEqual({
98
+ kubernetesClusterId: [CLUSTER_ID],
99
+ hostId: [HOST_ID],
100
+ });
101
+ });
102
+
103
+ test("leaves Service selections out — they are not entity-key resolved", () => {
104
+ const selections: ResourceEntityFacetSelections =
105
+ collectResourceEntityFacetSelections(
106
+ facetMap({
107
+ primaryEntityId: [SERVICE_ID],
108
+ serviceId: [SERVICE_ID],
109
+ severityText: ["Error"],
110
+ }).entries(),
111
+ );
112
+
113
+ expect(selections).toEqual({});
114
+ });
115
+
116
+ test("accepts a plain record via Object.entries (the traces explorer's shape)", () => {
117
+ const selections: ResourceEntityFacetSelections =
118
+ collectResourceEntityFacetSelections(
119
+ Object.entries({
120
+ kubernetesClusterId: [CLUSTER_ID, OTHER_CLUSTER_ID],
121
+ }),
122
+ );
123
+
124
+ expect(selections["kubernetesClusterId"]).toEqual([
125
+ CLUSTER_ID,
126
+ OTHER_CLUSTER_ID,
127
+ ]);
128
+ });
129
+
130
+ test("de-duplicates repeated ids within one facet", () => {
131
+ const selections: ResourceEntityFacetSelections =
132
+ collectResourceEntityFacetSelections(
133
+ Object.entries({
134
+ kubernetesClusterId: [CLUSTER_ID, CLUSTER_ID],
135
+ }),
136
+ );
137
+
138
+ expect(selections["kubernetesClusterId"]).toEqual([CLUSTER_ID]);
139
+ });
140
+
141
+ test("drops a facet whose last chip was just removed rather than emitting []", () => {
142
+ const selections: ResourceEntityFacetSelections =
143
+ collectResourceEntityFacetSelections(
144
+ facetMap({ kubernetesClusterId: [] }).entries(),
145
+ );
146
+
147
+ expect(selections).toEqual({});
148
+ expect(hasResourceEntityFacetSelections(selections)).toBe(false);
149
+ });
150
+
151
+ test("skips blank values", () => {
152
+ const selections: ResourceEntityFacetSelections =
153
+ collectResourceEntityFacetSelections(
154
+ Object.entries({ hostId: ["", HOST_ID] }),
155
+ );
156
+
157
+ expect(selections["hostId"]).toEqual([HOST_ID]);
158
+ });
159
+ });
160
+
161
+ describe("collectServiceFacetSelections", () => {
162
+ test("unions the canonical key and its alias", () => {
163
+ expect(
164
+ collectServiceFacetSelections(
165
+ facetMap({
166
+ primaryEntityId: [SERVICE_ID],
167
+ serviceId: [SERVICE_ID, HOST_ID],
168
+ }).entries(),
169
+ ),
170
+ ).toEqual([SERVICE_ID, HOST_ID]);
171
+ });
172
+
173
+ test("ignores non-Service resource facets", () => {
174
+ expect(
175
+ collectServiceFacetSelections(
176
+ facetMap({ kubernetesClusterId: [CLUSTER_ID] }).entries(),
177
+ ),
178
+ ).toEqual([]);
179
+ });
180
+ });
181
+
182
+ describe("parseResourceEntityFacetSelections", () => {
183
+ test("accepts a well-formed selection map", () => {
184
+ expect(
185
+ parseResourceEntityFacetSelections({
186
+ kubernetesClusterId: [CLUSTER_ID],
187
+ }),
188
+ ).toEqual({ kubernetesClusterId: [CLUSTER_ID] });
189
+ });
190
+
191
+ test("drops unknown facet keys", () => {
192
+ expect(
193
+ parseResourceEntityFacetSelections({
194
+ kubernetesClusterId: [CLUSTER_ID],
195
+ primaryEntityId: [SERVICE_ID],
196
+ somethingElse: [CLUSTER_ID],
197
+ }),
198
+ ).toEqual({ kubernetesClusterId: [CLUSTER_ID] });
199
+ });
200
+
201
+ test("drops ids that are not ObjectID strings", () => {
202
+ expect(
203
+ parseResourceEntityFacetSelections({
204
+ kubernetesClusterId: [CLUSTER_ID, "not-an-id", "'; DROP TABLE --"],
205
+ }),
206
+ ).toEqual({ kubernetesClusterId: [CLUSTER_ID] });
207
+ });
208
+
209
+ test("a facet left with no valid id is dropped entirely", () => {
210
+ expect(parseResourceEntityFacetSelections({ hostId: ["nope"] })).toEqual(
211
+ {},
212
+ );
213
+ });
214
+
215
+ test("non-array values carry no filter", () => {
216
+ expect(
217
+ parseResourceEntityFacetSelections({
218
+ kubernetesClusterId: CLUSTER_ID,
219
+ }),
220
+ ).toEqual({});
221
+ });
222
+
223
+ test("junk input parses to no constraint rather than throwing", () => {
224
+ for (const junk of [undefined, null, "", 0, [], "string", true]) {
225
+ expect(parseResourceEntityFacetSelections(junk)).toEqual({});
226
+ }
227
+ });
228
+
229
+ test("caps the id list so a crafted request cannot send an unbounded IN", () => {
230
+ const many: Array<string> = Array.from(
231
+ { length: MAX_RESOURCE_IDS_PER_FACET + 25 },
232
+ (_unused: unknown, index: number): string => {
233
+ return `00000000-0000-4000-8000-${String(index).padStart(12, "0")}`;
234
+ },
235
+ );
236
+
237
+ const parsed: ResourceEntityFacetSelections =
238
+ parseResourceEntityFacetSelections({ kubernetesClusterId: many });
239
+
240
+ expect(parsed["kubernetesClusterId"]).toHaveLength(
241
+ MAX_RESOURCE_IDS_PER_FACET,
242
+ );
243
+ });
244
+
245
+ test("de-duplicates before capping", () => {
246
+ const parsed: ResourceEntityFacetSelections =
247
+ parseResourceEntityFacetSelections({
248
+ hostId: [HOST_ID, HOST_ID, HOST_ID],
249
+ });
250
+
251
+ expect(parsed["hostId"]).toEqual([HOST_ID]);
252
+ });
253
+ });
254
+ });