@oneuptime/common 13.0.1 → 13.0.3

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 (769) hide show
  1. package/Models/AnalyticsModels/RumSession.ts +34 -0
  2. package/Models/DatabaseModels/AlertEpisodeLabelRule.ts +2 -2
  3. package/Models/DatabaseModels/AlertEpisodeOnCallRule.ts +2 -2
  4. package/Models/DatabaseModels/AlertEpisodeOwnerRule.ts +2 -2
  5. package/Models/DatabaseModels/AlertEpisodePrivacyRule.ts +2 -2
  6. package/Models/DatabaseModels/AlertGroupingRule.ts +2 -2
  7. package/Models/DatabaseModels/AlertLabelRule.ts +2 -2
  8. package/Models/DatabaseModels/AlertOnCallRule.ts +2 -2
  9. package/Models/DatabaseModels/AlertOwnerRule.ts +2 -2
  10. package/Models/DatabaseModels/AlertPrivacyRule.ts +2 -2
  11. package/Models/DatabaseModels/AlertReminderRule.ts +6 -4
  12. package/Models/DatabaseModels/AutoRemediationRule.ts +2 -2
  13. package/Models/DatabaseModels/CephClusterLabelRule.ts +2 -2
  14. package/Models/DatabaseModels/CephClusterOwnerRule.ts +2 -2
  15. package/Models/DatabaseModels/CloudResourceLabelRule.ts +2 -2
  16. package/Models/DatabaseModels/CloudResourceOwnerRule.ts +2 -2
  17. package/Models/DatabaseModels/DashboardLabelRule.ts +2 -2
  18. package/Models/DatabaseModels/DashboardOwnerRule.ts +2 -2
  19. package/Models/DatabaseModels/DatabaseBaseModel/RelationOnlyRuleBaseModel.ts +11 -0
  20. package/Models/DatabaseModels/DatabaseBaseModel/RuleBaseModel.ts +44 -0
  21. package/Models/DatabaseModels/DockerHostLabelRule.ts +2 -2
  22. package/Models/DatabaseModels/DockerHostOwnerRule.ts +2 -2
  23. package/Models/DatabaseModels/DockerSwarmClusterLabelRule.ts +2 -2
  24. package/Models/DatabaseModels/DockerSwarmClusterOwnerRule.ts +2 -2
  25. package/Models/DatabaseModels/HostLabelRule.ts +2 -2
  26. package/Models/DatabaseModels/HostOwnerRule.ts +2 -2
  27. package/Models/DatabaseModels/IncidentEpisodeLabelRule.ts +2 -2
  28. package/Models/DatabaseModels/IncidentEpisodeOnCallRule.ts +2 -2
  29. package/Models/DatabaseModels/IncidentEpisodeOwnerRule.ts +2 -2
  30. package/Models/DatabaseModels/IncidentEpisodePrivacyRule.ts +2 -2
  31. package/Models/DatabaseModels/IncidentGroupingRule.ts +2 -2
  32. package/Models/DatabaseModels/IncidentLabelRule.ts +2 -2
  33. package/Models/DatabaseModels/IncidentOnCallRule.ts +2 -2
  34. package/Models/DatabaseModels/IncidentOwnerRule.ts +2 -2
  35. package/Models/DatabaseModels/IncidentPrivacyRule.ts +2 -2
  36. package/Models/DatabaseModels/IncidentReminderRule.ts +6 -4
  37. package/Models/DatabaseModels/IncidentSlaRule.ts +2 -2
  38. package/Models/DatabaseModels/IncomingCallPolicy.ts +3 -4
  39. package/Models/DatabaseModels/IncomingCallPolicyLabelRule.ts +2 -2
  40. package/Models/DatabaseModels/IncomingCallPolicyOwnerRule.ts +2 -2
  41. package/Models/DatabaseModels/IncomingCallPolicyPhoneNumber.ts +254 -0
  42. package/Models/DatabaseModels/Index.ts +2 -0
  43. package/Models/DatabaseModels/IoTFleetLabelRule.ts +2 -2
  44. package/Models/DatabaseModels/IoTFleetOwnerRule.ts +2 -2
  45. package/Models/DatabaseModels/KubernetesClusterLabelRule.ts +2 -2
  46. package/Models/DatabaseModels/KubernetesClusterOwnerRule.ts +2 -2
  47. package/Models/DatabaseModels/MonitorLabelRule.ts +2 -2
  48. package/Models/DatabaseModels/MonitorOwnerRule.ts +2 -2
  49. package/Models/DatabaseModels/NetworkDeviceAutoImportRule.ts +2 -2
  50. package/Models/DatabaseModels/NetworkDeviceLabelRule.ts +2 -2
  51. package/Models/DatabaseModels/NetworkDeviceOwnerRule.ts +2 -2
  52. package/Models/DatabaseModels/NetworkSiteAssignmentRule.ts +2 -2
  53. package/Models/DatabaseModels/OnCallDutyPolicyLabelRule.ts +2 -2
  54. package/Models/DatabaseModels/OnCallDutyPolicyOwnerRule.ts +2 -2
  55. package/Models/DatabaseModels/OnCallDutyPolicyScheduleLabelRule.ts +2 -2
  56. package/Models/DatabaseModels/OnCallDutyPolicyScheduleOwnerRule.ts +2 -2
  57. package/Models/DatabaseModels/PodmanHostLabelRule.ts +2 -2
  58. package/Models/DatabaseModels/PodmanHostOwnerRule.ts +2 -2
  59. package/Models/DatabaseModels/ProxmoxClusterLabelRule.ts +2 -2
  60. package/Models/DatabaseModels/ProxmoxClusterOwnerRule.ts +2 -2
  61. package/Models/DatabaseModels/RumApplicationLabelRule.ts +2 -2
  62. package/Models/DatabaseModels/RumApplicationOwnerRule.ts +2 -2
  63. package/Models/DatabaseModels/RunbookLabelRule.ts +2 -2
  64. package/Models/DatabaseModels/RunbookOwnerRule.ts +2 -2
  65. package/Models/DatabaseModels/RunbookRule.ts +2 -2
  66. package/Models/DatabaseModels/ScheduledMaintenanceLabelRule.ts +2 -2
  67. package/Models/DatabaseModels/ScheduledMaintenanceOwnerRule.ts +2 -2
  68. package/Models/DatabaseModels/ScheduledMaintenanceReminderRule.ts +6 -4
  69. package/Models/DatabaseModels/ServerlessFunctionLabelRule.ts +2 -2
  70. package/Models/DatabaseModels/ServerlessFunctionOwnerRule.ts +2 -2
  71. package/Models/DatabaseModels/ServiceLabelRule.ts +2 -2
  72. package/Models/DatabaseModels/ServiceLevelObjectiveBurnRateRule.ts +283 -4
  73. package/Models/DatabaseModels/ServiceOwnerRule.ts +2 -2
  74. package/Models/DatabaseModels/StatusPageLabelRule.ts +2 -2
  75. package/Models/DatabaseModels/StatusPageMonitorRule.ts +2 -2
  76. package/Models/DatabaseModels/StatusPageOwnerRule.ts +2 -2
  77. package/Models/DatabaseModels/VMwareVCenterLabelRule.ts +2 -2
  78. package/Models/DatabaseModels/VMwareVCenterOwnerRule.ts +2 -2
  79. package/Models/DatabaseModels/WorkflowLabelRule.ts +2 -2
  80. package/Models/DatabaseModels/WorkflowOwnerRule.ts +2 -2
  81. package/Server/API/TelemetryAPI.ts +323 -2
  82. package/Server/Infrastructure/Postgres/SchemaMigrations/1792400000000-AddSloBurnRateRuleIncidents.ts +111 -0
  83. package/Server/Infrastructure/Postgres/SchemaMigrations/1792500000000-AddConfigurableRuleCriteria.ts +644 -0
  84. package/Server/Infrastructure/Postgres/SchemaMigrations/1792600000000-AddIncomingCallPolicyPhoneNumbers.ts +72 -0
  85. package/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts +6 -0
  86. package/Server/Middleware/MultipartFormData.ts +46 -21
  87. package/Server/Services/AlertEpisodeLabelRuleEngineService.ts +21 -0
  88. package/Server/Services/AlertEpisodeOnCallRuleEngineService.ts +21 -0
  89. package/Server/Services/AlertEpisodeOwnerRuleEngineService.ts +21 -0
  90. package/Server/Services/AlertEpisodePrivacyRuleEngineService.ts +21 -0
  91. package/Server/Services/AlertGroupingEngineService.ts +27 -0
  92. package/Server/Services/AlertLabelRuleEngineService.ts +27 -0
  93. package/Server/Services/AlertOnCallRuleEngineService.ts +27 -0
  94. package/Server/Services/AlertOwnerRuleEngineService.ts +27 -0
  95. package/Server/Services/AlertPrivacyRuleEngineService.ts +27 -0
  96. package/Server/Services/AlertReminderRuleService.ts +65 -33
  97. package/Server/Services/AutoRemediationRuleEngineService.ts +90 -8
  98. package/Server/Services/CephClusterLabelRuleEngineService.ts +20 -0
  99. package/Server/Services/CephClusterOwnerRuleEngineService.ts +20 -0
  100. package/Server/Services/CloudResourceLabelRuleEngineService.ts +20 -0
  101. package/Server/Services/CloudResourceOwnerRuleEngineService.ts +20 -0
  102. package/Server/Services/DashboardLabelRuleEngineService.ts +20 -0
  103. package/Server/Services/DashboardOwnerRuleEngineService.ts +20 -0
  104. package/Server/Services/DatabaseService.ts +409 -6
  105. package/Server/Services/DockerHostLabelRuleEngineService.ts +20 -0
  106. package/Server/Services/DockerHostOwnerRuleEngineService.ts +20 -0
  107. package/Server/Services/DockerSwarmClusterLabelRuleEngineService.ts +23 -0
  108. package/Server/Services/DockerSwarmClusterOwnerRuleEngineService.ts +23 -0
  109. package/Server/Services/HostLabelRuleEngineService.ts +13 -0
  110. package/Server/Services/HostOwnerRuleEngineService.ts +13 -0
  111. package/Server/Services/IncidentEpisodeLabelRuleEngineService.ts +21 -0
  112. package/Server/Services/IncidentEpisodeOnCallRuleEngineService.ts +21 -0
  113. package/Server/Services/IncidentEpisodeOwnerRuleEngineService.ts +21 -0
  114. package/Server/Services/IncidentEpisodePrivacyRuleEngineService.ts +21 -0
  115. package/Server/Services/IncidentGroupingEngineService.ts +64 -13
  116. package/Server/Services/IncidentLabelRuleEngineService.ts +64 -9
  117. package/Server/Services/IncidentOnCallRuleEngineService.ts +64 -10
  118. package/Server/Services/IncidentOwnerRuleEngineService.ts +64 -10
  119. package/Server/Services/IncidentPrivacyRuleEngineService.ts +64 -10
  120. package/Server/Services/IncidentReminderRuleService.ts +66 -34
  121. package/Server/Services/IncidentSlaRuleService.ts +55 -12
  122. package/Server/Services/IncomingCallPolicyLabelRuleEngineService.ts +20 -0
  123. package/Server/Services/IncomingCallPolicyOwnerRuleEngineService.ts +20 -0
  124. package/Server/Services/IncomingCallPolicyPhoneNumberService.ts +184 -0
  125. package/Server/Services/IncomingCallPolicyService.ts +276 -5
  126. package/Server/Services/Index.ts +2 -0
  127. package/Server/Services/IoTFleetLabelRuleEngineService.ts +20 -0
  128. package/Server/Services/IoTFleetOwnerRuleEngineService.ts +20 -0
  129. package/Server/Services/KubernetesClusterLabelRuleEngineService.ts +23 -0
  130. package/Server/Services/KubernetesClusterOwnerRuleEngineService.ts +23 -0
  131. package/Server/Services/LabelService.ts +50 -7
  132. package/Server/Services/MonitorLabelRuleEngineService.ts +20 -0
  133. package/Server/Services/MonitorOwnerRuleEngineService.ts +20 -0
  134. package/Server/Services/NetworkDeviceAutoImportRuleEngineService.ts +2 -0
  135. package/Server/Services/NetworkDeviceAutoImportRuleService.ts +93 -1
  136. package/Server/Services/NetworkDeviceLabelRuleEngineService.ts +26 -0
  137. package/Server/Services/NetworkDeviceOwnerRuleEngineService.ts +25 -0
  138. package/Server/Services/NetworkDeviceService.ts +2 -0
  139. package/Server/Services/NetworkSiteAssignmentRuleService.ts +90 -1
  140. package/Server/Services/NetworkSiteService.ts +242 -29
  141. package/Server/Services/NetworkSiteTypeService.ts +177 -77
  142. package/Server/Services/OnCallDutyPolicyLabelRuleEngineService.ts +20 -0
  143. package/Server/Services/OnCallDutyPolicyOwnerRuleEngineService.ts +20 -0
  144. package/Server/Services/OnCallDutyPolicyScheduleLabelRuleEngineService.ts +22 -0
  145. package/Server/Services/OnCallDutyPolicyScheduleOwnerRuleEngineService.ts +22 -0
  146. package/Server/Services/PodmanHostLabelRuleEngineService.ts +20 -0
  147. package/Server/Services/PodmanHostOwnerRuleEngineService.ts +20 -0
  148. package/Server/Services/ProjectCallSMSConfigService.ts +156 -7
  149. package/Server/Services/ProxmoxClusterLabelRuleEngineService.ts +25 -0
  150. package/Server/Services/ProxmoxClusterOwnerRuleEngineService.ts +25 -0
  151. package/Server/Services/RumApplicationLabelRuleEngineService.ts +22 -0
  152. package/Server/Services/RumApplicationOwnerRuleEngineService.ts +22 -0
  153. package/Server/Services/RunbookLabelRuleEngineService.ts +20 -0
  154. package/Server/Services/RunbookOwnerRuleEngineService.ts +20 -0
  155. package/Server/Services/RunbookRuleEngineService.ts +18 -1
  156. package/Server/Services/ScheduledMaintenanceLabelRuleEngineService.ts +62 -10
  157. package/Server/Services/ScheduledMaintenanceOwnerRuleEngineService.ts +62 -11
  158. package/Server/Services/ScheduledMaintenanceReminderRuleService.ts +48 -18
  159. package/Server/Services/ServerlessFunctionLabelRuleEngineService.ts +25 -0
  160. package/Server/Services/ServerlessFunctionOwnerRuleEngineService.ts +25 -0
  161. package/Server/Services/ServiceLabelRuleEngineService.ts +20 -0
  162. package/Server/Services/ServiceLevelObjectiveBurnRateRuleService.ts +675 -12
  163. package/Server/Services/ServiceLevelObjectiveService.ts +55 -13
  164. package/Server/Services/ServiceOwnerRuleEngineService.ts +20 -0
  165. package/Server/Services/StatusPageLabelRuleEngineService.ts +20 -0
  166. package/Server/Services/StatusPageMonitorRuleEngineService.ts +31 -2
  167. package/Server/Services/StatusPageMonitorRuleService.ts +34 -1
  168. package/Server/Services/StatusPageOwnerRuleEngineService.ts +20 -0
  169. package/Server/Services/UserService.ts +23 -50
  170. package/Server/Services/VMwareVCenterLabelRuleEngineService.ts +25 -0
  171. package/Server/Services/VMwareVCenterOwnerRuleEngineService.ts +25 -0
  172. package/Server/Services/WorkflowLabelRuleEngineService.ts +20 -0
  173. package/Server/Services/WorkflowOwnerRuleEngineService.ts +20 -0
  174. package/Server/Static/Brand/README.md +10 -5
  175. package/Server/Static/Brand/favicons/oneuptime-up-v1.svg +8 -0
  176. package/Server/Types/Database/QueryHelper.ts +88 -0
  177. package/Server/Utils/AI/Toolbox/SloTools.ts +19 -2
  178. package/Server/Utils/IncomingCallPhoneNumber.ts +29 -16
  179. package/Server/Utils/Profiling.ts +13 -1
  180. package/Server/Utils/Rules/MonitorRuleCriteriaCache.ts +38 -0
  181. package/Server/Utils/SessionReplay/SessionReplayReadService.ts +498 -0
  182. package/Server/Utils/Telemetry.ts +3 -1
  183. package/Server/Utils/VendorAssets.ts +3 -0
  184. package/Tests/App/Dashboard/AIInsightViewTriage.test.tsx +348 -0
  185. package/Tests/App/Dashboard/ArchiveResourceCard.test.tsx +476 -0
  186. package/Tests/App/Dashboard/CloudDocumentationCard.test.tsx +25 -0
  187. package/Tests/App/Dashboard/DashboardLazyPages.test.tsx +449 -24
  188. package/Tests/App/Dashboard/DashboardPersistentSideMenuLayouts.test.tsx +702 -0
  189. package/Tests/App/Dashboard/ExceptionsLandingRedirect.test.tsx +63 -0
  190. package/Tests/App/Dashboard/FeedOrdering.test.ts +150 -0
  191. package/Tests/App/Dashboard/GoogleSecOpsConnectionsErrors.test.tsx +279 -100
  192. package/Tests/App/Dashboard/InventoryItemSideMenu.test.tsx +155 -0
  193. package/Tests/App/Dashboard/InvestigationFeedRefresh.test.tsx +11 -0
  194. package/Tests/App/Dashboard/PasskeySettings.test.tsx +215 -71
  195. package/Tests/App/Dashboard/ResourceArchiveSettings.test.tsx +347 -0
  196. package/Tests/App/Dashboard/ResourceAuditLogsSideMenus.test.tsx +263 -0
  197. package/Tests/App/Dashboard/ResourceFeed.test.tsx +413 -17
  198. package/Tests/App/Dashboard/RumSessionReplaySideMenu.test.tsx +138 -0
  199. package/Tests/App/Dashboard/SloDashboardTemplateWidgets.test.tsx +940 -0
  200. package/Tests/App/Dashboard/TelemetryIngestionKeyEdit.test.tsx +378 -0
  201. package/Tests/App/Dashboard/TelemetryIngestionKeyForm.test.tsx +735 -0
  202. package/Tests/App/Dashboard/TwoFactorStatus.test.tsx +275 -108
  203. package/Tests/App/StatusPage/BulkAddStatusPageMonitorsModal.test.tsx +13 -3
  204. package/Tests/Models/AnalyticsModels/RumSessionReplayColumns.test.ts +127 -4
  205. package/Tests/Models/DatabaseModels/DomainRoleTierCoverage.test.ts +5 -4
  206. package/Tests/Models/DatabaseModels/IncomingCallPolicyPhoneNumber.test.ts +362 -0
  207. package/Tests/Models/DatabaseModels/RuleBaseModel.test.ts +69 -0
  208. package/Tests/Models/DatabaseModels/StaticRuleCriteriaInheritance.test.ts +181 -0
  209. package/Tests/Server/API/SessionReplayAPI.test.ts +1303 -145
  210. package/Tests/Server/API/UserTwoFactorSelfService.test.ts +407 -0
  211. package/Tests/Server/Infrastructure/Postgres/AddConfigurableRuleCriteriaMigration.test.ts +611 -0
  212. package/Tests/Server/Middleware/MultipartFormData.test.ts +61 -3
  213. package/Tests/Server/Middleware/TelemetryIngestionDisabled.test.ts +211 -0
  214. package/Tests/Server/Services/AlertIncidentRuleCriteriaEngineServices.test.ts +651 -0
  215. package/Tests/Server/Services/AutoRemediationRuleEngineService.test.ts +79 -0
  216. package/Tests/Server/Services/DatabaseServiceRelationOnlyRuleRollout.test.ts +330 -0
  217. package/Tests/Server/Services/DatabaseServiceRuleCriteriaValidation.test.ts +522 -0
  218. package/Tests/Server/Services/IncidentSlaRuleCriteriaCorrelation.test.ts +99 -0
  219. package/Tests/Server/Services/IncomingCallPolicyPhoneNumberService.test.ts +1540 -0
  220. package/Tests/Server/Services/NetworkDeviceRuleEngines.test.ts +179 -2
  221. package/Tests/Server/Services/NetworkSiteAssignmentRuleService.test.ts +170 -0
  222. package/Tests/Server/Services/NetworkSiteService.test.ts +559 -53
  223. package/Tests/Server/Services/NetworkSiteTypeService.test.ts +122 -55
  224. package/Tests/Server/Services/ReminderRuleCriteria.test.ts +173 -0
  225. package/Tests/Server/Services/ResourceRuleCriteriaEngineServices.test.ts +170 -0
  226. package/Tests/Server/Services/ScheduledMaintenanceRuleCriteriaCorrelation.test.ts +154 -0
  227. package/Tests/Server/Services/ServiceLevelObjectiveBurnRateRuleService.test.ts +2450 -470
  228. package/Tests/Server/Services/ServiceLevelObjectiveService.test.ts +464 -121
  229. package/Tests/Server/Services/StaticRuleCriteriaRuntimeCoverage.test.ts +281 -0
  230. package/Tests/Server/Services/StatusPageMonitorRuleEngineService.test.ts +132 -0
  231. package/Tests/Server/Services/StatusPageMonitorRuleHooks.test.ts +159 -14
  232. package/Tests/Server/Services/UserEmailChangePasswordResetExpiry.test.ts +6 -8
  233. package/Tests/Server/Services/UserTwoFactorAuthAdmin.test.ts +203 -34
  234. package/Tests/Server/Types/Database/QueryHelperJsonArrayObjects.test.ts +128 -0
  235. package/Tests/Server/Utils/AI/SloTools.test.ts +190 -1
  236. package/Tests/Server/Utils/AI/Toolbox/AIToolbox.test.ts +461 -0
  237. package/Tests/Server/Utils/AnalyticsDatabase/StatementGenerator.test.ts +25 -0
  238. package/Tests/Server/Utils/Billing/BillingFailureNoticeThrottle.test.ts +359 -0
  239. package/Tests/Server/Utils/CodeRepository/GitHub/GitHubWebhookEvents.test.ts +318 -0
  240. package/Tests/Server/Utils/CustomField/CustomFieldDefinitionMappingHooks.test.ts +220 -0
  241. package/Tests/Server/Utils/Dashboard/SloTemplatePublicDashboard.test.ts +1043 -0
  242. package/Tests/Server/Utils/Execute.test.ts +302 -0
  243. package/Tests/Server/Utils/GracefulShutdown.test.ts +565 -0
  244. package/Tests/Server/Utils/IncomingCallPhoneNumber.test.ts +36 -20
  245. package/Tests/Server/Utils/Monitor/SloTemplateMetricEmitterContract.test.ts +750 -0
  246. package/Tests/Server/Utils/ProductAnalytics.test.ts +404 -0
  247. package/Tests/Server/Utils/Profiling.test.ts +366 -0
  248. package/Tests/Server/Utils/Rules/MonitorRuleCriteriaCache.test.ts +99 -0
  249. package/Tests/Server/Utils/SessionReplay/SessionReplayReadServiceQueries.test.ts +558 -0
  250. package/Tests/Server/Utils/VendorAssets.test.ts +17 -0
  251. package/Tests/Types/Dashboard/DashboardTemplateEditorialInvariants.test.ts +659 -0
  252. package/Tests/Types/Dashboard/DashboardTemplateInvariants.test.ts +97 -0
  253. package/Tests/Types/Dashboard/SloDashboardTemplate.test.ts +1179 -0
  254. package/Tests/Types/Database/AccessControl/OwnedThrough.test.ts +136 -0
  255. package/Tests/Types/Rum/SessionReplayApiContracts.test.ts +180 -1
  256. package/Tests/UI/Components/AiInvestigationSettingsCard.test.tsx +13 -6
  257. package/Tests/UI/Components/Alert.test.tsx +532 -93
  258. package/Tests/UI/Components/Feed.test.tsx +241 -0
  259. package/Tests/UI/Components/Forms/BasicFormStepNavigation.test.tsx +368 -0
  260. package/Tests/UI/Components/Forms/FormSummary.test.tsx +454 -0
  261. package/Tests/UI/Components/Forms/ModelFormJsonColumns.test.tsx +290 -0
  262. package/Tests/UI/Components/Forms/ModelFormRuleCriteria.test.tsx +331 -0
  263. package/Tests/UI/Components/IconOpticalSize.test.tsx +79 -31
  264. package/Tests/UI/Components/ModelTable/ModelTableWrapContent.test.tsx +6 -6
  265. package/Tests/UI/Components/NavBar.test.tsx +91 -2
  266. package/Tests/UI/Components/PencilButton.test.tsx +211 -0
  267. package/Tests/UI/Components/RuleCriteria/RuleCriteriaBuilder.test.tsx +510 -0
  268. package/Tests/UI/Components/RuleCriteria/RuleCriteriaModelTable.test.tsx +350 -0
  269. package/Tests/UI/Components/TableSortAndMobileColumns.test.tsx +50 -0
  270. package/Tests/UI/Components/Telemetry/TelemetryRetentionConfigForm.test.tsx +329 -0
  271. package/Tests/UI/Components/useFeedItems.test.tsx +107 -0
  272. package/Tests/UI/Rum/ChunkLoader.test.ts +401 -0
  273. package/Tests/UI/Rum/RecordingHealthCard.test.tsx +1 -1
  274. package/Tests/UI/Rum/RecordingHealthStrip.test.tsx +7 -1
  275. package/Tests/UI/Rum/ReplayCorrelationPanel.test.tsx +2 -0
  276. package/Tests/UI/Rum/ReplayEngine.test.ts +1069 -5
  277. package/Tests/UI/Rum/ReplayHeader.test.tsx +579 -2
  278. package/Tests/UI/Rum/ReplayPlayerChrome.test.tsx +23 -5
  279. package/Tests/UI/Rum/ReplayRail.test.tsx +143 -1
  280. package/Tests/UI/Rum/ReplayRenderBudget.test.tsx +338 -0
  281. package/Tests/UI/Rum/ReplaySignals.test.ts +179 -0
  282. package/Tests/UI/Rum/ReplayStage.test.tsx +210 -3
  283. package/Tests/UI/Rum/ReplayTimeline.test.tsx +180 -1
  284. package/Tests/UI/Rum/ReplayUserSessionsMenu.test.tsx +405 -0
  285. package/Tests/UI/Rum/SessionReplayEmptyState.test.tsx +13 -16
  286. package/Tests/UI/Rum/SessionReplayFacets.test.tsx +199 -0
  287. package/Tests/UI/Rum/SessionReplaySearchBar.test.tsx +58 -21
  288. package/Tests/UI/Rum/SessionReplaySetupGuide.test.tsx +2 -0
  289. package/Tests/UI/Rum/SessionReplayTable.test.tsx +717 -4
  290. package/Tests/UI/Rum/SessionReplayUsersPage.test.tsx +435 -0
  291. package/Tests/UI/Rum/SessionReplayUsersTable.test.tsx +577 -0
  292. package/Tests/UI/Utils/Breadcrumb/fixtures/RealBreadcrumbTrails.ts +1 -1
  293. package/Tests/UI/Utils/Breadcrumb/fixtures/RealRoutePatterns.ts +1 -1
  294. package/Tests/UI/Utils/LabelRuleImportExport.test.ts +192 -0
  295. package/Tests/UI/Utils/Navigation.test.ts +30 -0
  296. package/Tests/Utils/Dashboard/SloTemplateVariableScoping.test.ts +880 -0
  297. package/Tests/Utils/LabelRuleImportExport.test.ts +158 -0
  298. package/Tests/Utils/NetworkDiscovery/AutoImportRuleMatcher.test.ts +93 -0
  299. package/Tests/Utils/NetworkSite/CidrMatchUtil.test.ts +138 -0
  300. package/Tests/Utils/NetworkSite/TypeHierarchyUtil.test.ts +174 -0
  301. package/Tests/Utils/Rules/RuleCriteriaMatcher.test.ts +1424 -0
  302. package/Tests/Utils/Rum/SessionIdentity.test.ts +72 -0
  303. package/Tests/Utils/Slo/SloBurnRateRuleState.test.ts +374 -28
  304. package/Tests/Utils/Telemetry/OriginAllowList.test.ts +118 -0
  305. package/Types/Dashboard/DashboardTemplates.ts +465 -0
  306. package/Types/Rules/RuleCriteria.ts +51 -0
  307. package/Types/Rules/RuleCriteriaFieldRegistry.ts +437 -0
  308. package/Types/Rum/SessionReplay.ts +75 -0
  309. package/Types/Rum/SessionReplayApi.ts +93 -0
  310. package/UI/Components/Alerts/Alert.tsx +102 -72
  311. package/UI/Components/Button/Button.tsx +4 -1
  312. package/UI/Components/Dropdown/Dropdown.tsx +2 -0
  313. package/UI/Components/Feed/Feed.tsx +15 -0
  314. package/UI/Components/Feed/useFeedItems.ts +227 -0
  315. package/UI/Components/Forms/BasicForm.tsx +42 -21
  316. package/UI/Components/Forms/ModelForm.tsx +80 -1
  317. package/UI/Components/Icon/Icon.tsx +3 -35
  318. package/UI/Components/ModelTable/ModelTable.tsx +19 -0
  319. package/UI/Components/Navbar/NavBar.tsx +1 -0
  320. package/UI/Components/RuleCriteria/RuleCriteriaBuilder.tsx +735 -0
  321. package/UI/Components/RuleCriteria/RuleCriteriaModelForm.tsx +209 -0
  322. package/UI/Components/RuleCriteria/RuleCriteriaModelTable.tsx +205 -0
  323. package/UI/Components/RuleCriteria/RuleCriteriaSummary.tsx +123 -0
  324. package/UI/Components/Table/Table.tsx +3 -0
  325. package/UI/Components/Table/TableBody.tsx +3 -0
  326. package/UI/Components/Table/TableRow.tsx +8 -2
  327. package/UI/Components/Telemetry/TelemetryRetentionConfigForm.tsx +14 -2
  328. package/UI/Styles/Theme.css +1 -0
  329. package/UI/Utils/LabelRuleImportExport.ts +114 -6
  330. package/UI/Utils/Navigation.ts +1 -2
  331. package/UI/esbuild-config.js +46 -0
  332. package/Utils/Faker.ts +93 -6
  333. package/Utils/LabelRuleImportExport.ts +295 -2
  334. package/Utils/NetworkDiscovery/AutoImportRuleMatcher.ts +108 -8
  335. package/Utils/NetworkSite/CidrMatchUtil.ts +102 -0
  336. package/Utils/NetworkSite/TypeHierarchyUtil.ts +152 -2
  337. package/Utils/Rules/RuleCriteriaMatcher.ts +931 -0
  338. package/Utils/Rum/SessionIdentity.ts +16 -0
  339. package/Utils/Slo/SloBurnRateRuleState.ts +87 -33
  340. package/Utils/Telemetry/OriginAllowList.ts +74 -0
  341. package/build/dist/Models/AnalyticsModels/RumSession.js +32 -0
  342. package/build/dist/Models/AnalyticsModels/RumSession.js.map +1 -1
  343. package/build/dist/Models/DatabaseModels/AlertEpisodeLabelRule.js +2 -2
  344. package/build/dist/Models/DatabaseModels/AlertEpisodeLabelRule.js.map +1 -1
  345. package/build/dist/Models/DatabaseModels/AlertEpisodeOnCallRule.js +2 -2
  346. package/build/dist/Models/DatabaseModels/AlertEpisodeOnCallRule.js.map +1 -1
  347. package/build/dist/Models/DatabaseModels/AlertEpisodeOwnerRule.js +2 -2
  348. package/build/dist/Models/DatabaseModels/AlertEpisodeOwnerRule.js.map +1 -1
  349. package/build/dist/Models/DatabaseModels/AlertEpisodePrivacyRule.js +2 -2
  350. package/build/dist/Models/DatabaseModels/AlertEpisodePrivacyRule.js.map +1 -1
  351. package/build/dist/Models/DatabaseModels/AlertGroupingRule.js +2 -2
  352. package/build/dist/Models/DatabaseModels/AlertGroupingRule.js.map +1 -1
  353. package/build/dist/Models/DatabaseModels/AlertLabelRule.js +2 -2
  354. package/build/dist/Models/DatabaseModels/AlertLabelRule.js.map +1 -1
  355. package/build/dist/Models/DatabaseModels/AlertOnCallRule.js +2 -2
  356. package/build/dist/Models/DatabaseModels/AlertOnCallRule.js.map +1 -1
  357. package/build/dist/Models/DatabaseModels/AlertOwnerRule.js +2 -2
  358. package/build/dist/Models/DatabaseModels/AlertOwnerRule.js.map +1 -1
  359. package/build/dist/Models/DatabaseModels/AlertPrivacyRule.js +2 -2
  360. package/build/dist/Models/DatabaseModels/AlertPrivacyRule.js.map +1 -1
  361. package/build/dist/Models/DatabaseModels/AlertReminderRule.js +6 -5
  362. package/build/dist/Models/DatabaseModels/AlertReminderRule.js.map +1 -1
  363. package/build/dist/Models/DatabaseModels/AutoRemediationRule.js +2 -2
  364. package/build/dist/Models/DatabaseModels/AutoRemediationRule.js.map +1 -1
  365. package/build/dist/Models/DatabaseModels/CephClusterLabelRule.js +2 -2
  366. package/build/dist/Models/DatabaseModels/CephClusterLabelRule.js.map +1 -1
  367. package/build/dist/Models/DatabaseModels/CephClusterOwnerRule.js +2 -2
  368. package/build/dist/Models/DatabaseModels/CephClusterOwnerRule.js.map +1 -1
  369. package/build/dist/Models/DatabaseModels/CloudResourceLabelRule.js +2 -2
  370. package/build/dist/Models/DatabaseModels/CloudResourceLabelRule.js.map +1 -1
  371. package/build/dist/Models/DatabaseModels/CloudResourceOwnerRule.js +2 -2
  372. package/build/dist/Models/DatabaseModels/CloudResourceOwnerRule.js.map +1 -1
  373. package/build/dist/Models/DatabaseModels/DashboardLabelRule.js +2 -2
  374. package/build/dist/Models/DatabaseModels/DashboardLabelRule.js.map +1 -1
  375. package/build/dist/Models/DatabaseModels/DashboardOwnerRule.js +2 -2
  376. package/build/dist/Models/DatabaseModels/DashboardOwnerRule.js.map +1 -1
  377. package/build/dist/Models/DatabaseModels/DatabaseBaseModel/RelationOnlyRuleBaseModel.js +12 -0
  378. package/build/dist/Models/DatabaseModels/DatabaseBaseModel/RelationOnlyRuleBaseModel.js.map +1 -0
  379. package/build/dist/Models/DatabaseModels/DatabaseBaseModel/RuleBaseModel.js +50 -0
  380. package/build/dist/Models/DatabaseModels/DatabaseBaseModel/RuleBaseModel.js.map +1 -0
  381. package/build/dist/Models/DatabaseModels/DockerHostLabelRule.js +2 -2
  382. package/build/dist/Models/DatabaseModels/DockerHostLabelRule.js.map +1 -1
  383. package/build/dist/Models/DatabaseModels/DockerHostOwnerRule.js +2 -2
  384. package/build/dist/Models/DatabaseModels/DockerHostOwnerRule.js.map +1 -1
  385. package/build/dist/Models/DatabaseModels/DockerSwarmClusterLabelRule.js +2 -2
  386. package/build/dist/Models/DatabaseModels/DockerSwarmClusterLabelRule.js.map +1 -1
  387. package/build/dist/Models/DatabaseModels/DockerSwarmClusterOwnerRule.js +2 -2
  388. package/build/dist/Models/DatabaseModels/DockerSwarmClusterOwnerRule.js.map +1 -1
  389. package/build/dist/Models/DatabaseModels/HostLabelRule.js +2 -2
  390. package/build/dist/Models/DatabaseModels/HostLabelRule.js.map +1 -1
  391. package/build/dist/Models/DatabaseModels/HostOwnerRule.js +2 -2
  392. package/build/dist/Models/DatabaseModels/HostOwnerRule.js.map +1 -1
  393. package/build/dist/Models/DatabaseModels/IncidentEpisodeLabelRule.js +2 -2
  394. package/build/dist/Models/DatabaseModels/IncidentEpisodeLabelRule.js.map +1 -1
  395. package/build/dist/Models/DatabaseModels/IncidentEpisodeOnCallRule.js +2 -2
  396. package/build/dist/Models/DatabaseModels/IncidentEpisodeOnCallRule.js.map +1 -1
  397. package/build/dist/Models/DatabaseModels/IncidentEpisodeOwnerRule.js +2 -2
  398. package/build/dist/Models/DatabaseModels/IncidentEpisodeOwnerRule.js.map +1 -1
  399. package/build/dist/Models/DatabaseModels/IncidentEpisodePrivacyRule.js +2 -2
  400. package/build/dist/Models/DatabaseModels/IncidentEpisodePrivacyRule.js.map +1 -1
  401. package/build/dist/Models/DatabaseModels/IncidentGroupingRule.js +2 -2
  402. package/build/dist/Models/DatabaseModels/IncidentGroupingRule.js.map +1 -1
  403. package/build/dist/Models/DatabaseModels/IncidentLabelRule.js +2 -2
  404. package/build/dist/Models/DatabaseModels/IncidentLabelRule.js.map +1 -1
  405. package/build/dist/Models/DatabaseModels/IncidentOnCallRule.js +2 -2
  406. package/build/dist/Models/DatabaseModels/IncidentOnCallRule.js.map +1 -1
  407. package/build/dist/Models/DatabaseModels/IncidentOwnerRule.js +2 -2
  408. package/build/dist/Models/DatabaseModels/IncidentOwnerRule.js.map +1 -1
  409. package/build/dist/Models/DatabaseModels/IncidentPrivacyRule.js +2 -2
  410. package/build/dist/Models/DatabaseModels/IncidentPrivacyRule.js.map +1 -1
  411. package/build/dist/Models/DatabaseModels/IncidentReminderRule.js +6 -5
  412. package/build/dist/Models/DatabaseModels/IncidentReminderRule.js.map +1 -1
  413. package/build/dist/Models/DatabaseModels/IncidentSlaRule.js +2 -2
  414. package/build/dist/Models/DatabaseModels/IncidentSlaRule.js.map +1 -1
  415. package/build/dist/Models/DatabaseModels/IncomingCallPolicy.js +3 -4
  416. package/build/dist/Models/DatabaseModels/IncomingCallPolicy.js.map +1 -1
  417. package/build/dist/Models/DatabaseModels/IncomingCallPolicyLabelRule.js +2 -2
  418. package/build/dist/Models/DatabaseModels/IncomingCallPolicyLabelRule.js.map +1 -1
  419. package/build/dist/Models/DatabaseModels/IncomingCallPolicyOwnerRule.js +2 -2
  420. package/build/dist/Models/DatabaseModels/IncomingCallPolicyOwnerRule.js.map +1 -1
  421. package/build/dist/Models/DatabaseModels/IncomingCallPolicyPhoneNumber.js +277 -0
  422. package/build/dist/Models/DatabaseModels/IncomingCallPolicyPhoneNumber.js.map +1 -0
  423. package/build/dist/Models/DatabaseModels/Index.js +2 -0
  424. package/build/dist/Models/DatabaseModels/Index.js.map +1 -1
  425. package/build/dist/Models/DatabaseModels/IoTFleetLabelRule.js +2 -2
  426. package/build/dist/Models/DatabaseModels/IoTFleetLabelRule.js.map +1 -1
  427. package/build/dist/Models/DatabaseModels/IoTFleetOwnerRule.js +2 -2
  428. package/build/dist/Models/DatabaseModels/IoTFleetOwnerRule.js.map +1 -1
  429. package/build/dist/Models/DatabaseModels/KubernetesClusterLabelRule.js +2 -2
  430. package/build/dist/Models/DatabaseModels/KubernetesClusterLabelRule.js.map +1 -1
  431. package/build/dist/Models/DatabaseModels/KubernetesClusterOwnerRule.js +2 -2
  432. package/build/dist/Models/DatabaseModels/KubernetesClusterOwnerRule.js.map +1 -1
  433. package/build/dist/Models/DatabaseModels/MonitorLabelRule.js +2 -2
  434. package/build/dist/Models/DatabaseModels/MonitorLabelRule.js.map +1 -1
  435. package/build/dist/Models/DatabaseModels/MonitorOwnerRule.js +2 -2
  436. package/build/dist/Models/DatabaseModels/MonitorOwnerRule.js.map +1 -1
  437. package/build/dist/Models/DatabaseModels/NetworkDeviceAutoImportRule.js +2 -2
  438. package/build/dist/Models/DatabaseModels/NetworkDeviceAutoImportRule.js.map +1 -1
  439. package/build/dist/Models/DatabaseModels/NetworkDeviceLabelRule.js +2 -2
  440. package/build/dist/Models/DatabaseModels/NetworkDeviceLabelRule.js.map +1 -1
  441. package/build/dist/Models/DatabaseModels/NetworkDeviceOwnerRule.js +2 -2
  442. package/build/dist/Models/DatabaseModels/NetworkDeviceOwnerRule.js.map +1 -1
  443. package/build/dist/Models/DatabaseModels/NetworkSiteAssignmentRule.js +2 -2
  444. package/build/dist/Models/DatabaseModels/NetworkSiteAssignmentRule.js.map +1 -1
  445. package/build/dist/Models/DatabaseModels/OnCallDutyPolicyLabelRule.js +2 -2
  446. package/build/dist/Models/DatabaseModels/OnCallDutyPolicyLabelRule.js.map +1 -1
  447. package/build/dist/Models/DatabaseModels/OnCallDutyPolicyOwnerRule.js +2 -2
  448. package/build/dist/Models/DatabaseModels/OnCallDutyPolicyOwnerRule.js.map +1 -1
  449. package/build/dist/Models/DatabaseModels/OnCallDutyPolicyScheduleLabelRule.js +2 -2
  450. package/build/dist/Models/DatabaseModels/OnCallDutyPolicyScheduleLabelRule.js.map +1 -1
  451. package/build/dist/Models/DatabaseModels/OnCallDutyPolicyScheduleOwnerRule.js +2 -2
  452. package/build/dist/Models/DatabaseModels/OnCallDutyPolicyScheduleOwnerRule.js.map +1 -1
  453. package/build/dist/Models/DatabaseModels/PodmanHostLabelRule.js +2 -2
  454. package/build/dist/Models/DatabaseModels/PodmanHostLabelRule.js.map +1 -1
  455. package/build/dist/Models/DatabaseModels/PodmanHostOwnerRule.js +2 -2
  456. package/build/dist/Models/DatabaseModels/PodmanHostOwnerRule.js.map +1 -1
  457. package/build/dist/Models/DatabaseModels/ProxmoxClusterLabelRule.js +2 -2
  458. package/build/dist/Models/DatabaseModels/ProxmoxClusterLabelRule.js.map +1 -1
  459. package/build/dist/Models/DatabaseModels/ProxmoxClusterOwnerRule.js +2 -2
  460. package/build/dist/Models/DatabaseModels/ProxmoxClusterOwnerRule.js.map +1 -1
  461. package/build/dist/Models/DatabaseModels/RumApplicationLabelRule.js +2 -2
  462. package/build/dist/Models/DatabaseModels/RumApplicationLabelRule.js.map +1 -1
  463. package/build/dist/Models/DatabaseModels/RumApplicationOwnerRule.js +2 -2
  464. package/build/dist/Models/DatabaseModels/RumApplicationOwnerRule.js.map +1 -1
  465. package/build/dist/Models/DatabaseModels/RunbookLabelRule.js +2 -2
  466. package/build/dist/Models/DatabaseModels/RunbookLabelRule.js.map +1 -1
  467. package/build/dist/Models/DatabaseModels/RunbookOwnerRule.js +2 -2
  468. package/build/dist/Models/DatabaseModels/RunbookOwnerRule.js.map +1 -1
  469. package/build/dist/Models/DatabaseModels/RunbookRule.js +2 -2
  470. package/build/dist/Models/DatabaseModels/RunbookRule.js.map +1 -1
  471. package/build/dist/Models/DatabaseModels/ScheduledMaintenanceLabelRule.js +2 -2
  472. package/build/dist/Models/DatabaseModels/ScheduledMaintenanceLabelRule.js.map +1 -1
  473. package/build/dist/Models/DatabaseModels/ScheduledMaintenanceOwnerRule.js +2 -2
  474. package/build/dist/Models/DatabaseModels/ScheduledMaintenanceOwnerRule.js.map +1 -1
  475. package/build/dist/Models/DatabaseModels/ScheduledMaintenanceReminderRule.js +6 -5
  476. package/build/dist/Models/DatabaseModels/ScheduledMaintenanceReminderRule.js.map +1 -1
  477. package/build/dist/Models/DatabaseModels/ServerlessFunctionLabelRule.js +2 -2
  478. package/build/dist/Models/DatabaseModels/ServerlessFunctionLabelRule.js.map +1 -1
  479. package/build/dist/Models/DatabaseModels/ServerlessFunctionOwnerRule.js +2 -2
  480. package/build/dist/Models/DatabaseModels/ServerlessFunctionOwnerRule.js.map +1 -1
  481. package/build/dist/Models/DatabaseModels/ServiceLabelRule.js +2 -2
  482. package/build/dist/Models/DatabaseModels/ServiceLabelRule.js.map +1 -1
  483. package/build/dist/Models/DatabaseModels/ServiceLevelObjectiveBurnRateRule.js +281 -4
  484. package/build/dist/Models/DatabaseModels/ServiceLevelObjectiveBurnRateRule.js.map +1 -1
  485. package/build/dist/Models/DatabaseModels/ServiceOwnerRule.js +2 -2
  486. package/build/dist/Models/DatabaseModels/ServiceOwnerRule.js.map +1 -1
  487. package/build/dist/Models/DatabaseModels/StatusPageLabelRule.js +2 -2
  488. package/build/dist/Models/DatabaseModels/StatusPageLabelRule.js.map +1 -1
  489. package/build/dist/Models/DatabaseModels/StatusPageMonitorRule.js +2 -2
  490. package/build/dist/Models/DatabaseModels/StatusPageMonitorRule.js.map +1 -1
  491. package/build/dist/Models/DatabaseModels/StatusPageOwnerRule.js +2 -2
  492. package/build/dist/Models/DatabaseModels/StatusPageOwnerRule.js.map +1 -1
  493. package/build/dist/Models/DatabaseModels/VMwareVCenterLabelRule.js +2 -2
  494. package/build/dist/Models/DatabaseModels/VMwareVCenterLabelRule.js.map +1 -1
  495. package/build/dist/Models/DatabaseModels/VMwareVCenterOwnerRule.js +2 -2
  496. package/build/dist/Models/DatabaseModels/VMwareVCenterOwnerRule.js.map +1 -1
  497. package/build/dist/Models/DatabaseModels/WorkflowLabelRule.js +2 -2
  498. package/build/dist/Models/DatabaseModels/WorkflowLabelRule.js.map +1 -1
  499. package/build/dist/Models/DatabaseModels/WorkflowOwnerRule.js +2 -2
  500. package/build/dist/Models/DatabaseModels/WorkflowOwnerRule.js.map +1 -1
  501. package/build/dist/Server/API/TelemetryAPI.js +211 -4
  502. package/build/dist/Server/API/TelemetryAPI.js.map +1 -1
  503. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1792400000000-AddSloBurnRateRuleIncidents.js +60 -0
  504. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1792400000000-AddSloBurnRateRuleIncidents.js.map +1 -0
  505. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1792500000000-AddConfigurableRuleCriteria.js +301 -0
  506. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1792500000000-AddConfigurableRuleCriteria.js.map +1 -0
  507. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1792600000000-AddIncomingCallPolicyPhoneNumbers.js +30 -0
  508. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1792600000000-AddIncomingCallPolicyPhoneNumbers.js.map +1 -0
  509. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js +6 -0
  510. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js.map +1 -1
  511. package/build/dist/Server/Middleware/MultipartFormData.js +38 -21
  512. package/build/dist/Server/Middleware/MultipartFormData.js.map +1 -1
  513. package/build/dist/Server/Services/AlertEpisodeLabelRuleEngineService.js +17 -0
  514. package/build/dist/Server/Services/AlertEpisodeLabelRuleEngineService.js.map +1 -1
  515. package/build/dist/Server/Services/AlertEpisodeOnCallRuleEngineService.js +17 -0
  516. package/build/dist/Server/Services/AlertEpisodeOnCallRuleEngineService.js.map +1 -1
  517. package/build/dist/Server/Services/AlertEpisodeOwnerRuleEngineService.js +17 -0
  518. package/build/dist/Server/Services/AlertEpisodeOwnerRuleEngineService.js.map +1 -1
  519. package/build/dist/Server/Services/AlertEpisodePrivacyRuleEngineService.js +17 -0
  520. package/build/dist/Server/Services/AlertEpisodePrivacyRuleEngineService.js.map +1 -1
  521. package/build/dist/Server/Services/AlertGroupingEngineService.js +21 -0
  522. package/build/dist/Server/Services/AlertGroupingEngineService.js.map +1 -1
  523. package/build/dist/Server/Services/AlertLabelRuleEngineService.js +21 -0
  524. package/build/dist/Server/Services/AlertLabelRuleEngineService.js.map +1 -1
  525. package/build/dist/Server/Services/AlertOnCallRuleEngineService.js +21 -0
  526. package/build/dist/Server/Services/AlertOnCallRuleEngineService.js.map +1 -1
  527. package/build/dist/Server/Services/AlertOwnerRuleEngineService.js +21 -0
  528. package/build/dist/Server/Services/AlertOwnerRuleEngineService.js.map +1 -1
  529. package/build/dist/Server/Services/AlertPrivacyRuleEngineService.js +21 -0
  530. package/build/dist/Server/Services/AlertPrivacyRuleEngineService.js.map +1 -1
  531. package/build/dist/Server/Services/AlertReminderRuleService.js +44 -26
  532. package/build/dist/Server/Services/AlertReminderRuleService.js.map +1 -1
  533. package/build/dist/Server/Services/AutoRemediationRuleEngineService.js +54 -11
  534. package/build/dist/Server/Services/AutoRemediationRuleEngineService.js.map +1 -1
  535. package/build/dist/Server/Services/CephClusterLabelRuleEngineService.js +16 -0
  536. package/build/dist/Server/Services/CephClusterLabelRuleEngineService.js.map +1 -1
  537. package/build/dist/Server/Services/CephClusterOwnerRuleEngineService.js +16 -0
  538. package/build/dist/Server/Services/CephClusterOwnerRuleEngineService.js.map +1 -1
  539. package/build/dist/Server/Services/CloudResourceLabelRuleEngineService.js +16 -0
  540. package/build/dist/Server/Services/CloudResourceLabelRuleEngineService.js.map +1 -1
  541. package/build/dist/Server/Services/CloudResourceOwnerRuleEngineService.js +16 -0
  542. package/build/dist/Server/Services/CloudResourceOwnerRuleEngineService.js.map +1 -1
  543. package/build/dist/Server/Services/DashboardLabelRuleEngineService.js +16 -0
  544. package/build/dist/Server/Services/DashboardLabelRuleEngineService.js.map +1 -1
  545. package/build/dist/Server/Services/DashboardOwnerRuleEngineService.js +16 -0
  546. package/build/dist/Server/Services/DashboardOwnerRuleEngineService.js.map +1 -1
  547. package/build/dist/Server/Services/DatabaseService.js +235 -10
  548. package/build/dist/Server/Services/DatabaseService.js.map +1 -1
  549. package/build/dist/Server/Services/DockerHostLabelRuleEngineService.js +16 -0
  550. package/build/dist/Server/Services/DockerHostLabelRuleEngineService.js.map +1 -1
  551. package/build/dist/Server/Services/DockerHostOwnerRuleEngineService.js +16 -0
  552. package/build/dist/Server/Services/DockerHostOwnerRuleEngineService.js.map +1 -1
  553. package/build/dist/Server/Services/DockerSwarmClusterLabelRuleEngineService.js +16 -0
  554. package/build/dist/Server/Services/DockerSwarmClusterLabelRuleEngineService.js.map +1 -1
  555. package/build/dist/Server/Services/DockerSwarmClusterOwnerRuleEngineService.js +16 -0
  556. package/build/dist/Server/Services/DockerSwarmClusterOwnerRuleEngineService.js.map +1 -1
  557. package/build/dist/Server/Services/HostLabelRuleEngineService.js +12 -0
  558. package/build/dist/Server/Services/HostLabelRuleEngineService.js.map +1 -1
  559. package/build/dist/Server/Services/HostOwnerRuleEngineService.js +12 -0
  560. package/build/dist/Server/Services/HostOwnerRuleEngineService.js.map +1 -1
  561. package/build/dist/Server/Services/IncidentEpisodeLabelRuleEngineService.js +17 -0
  562. package/build/dist/Server/Services/IncidentEpisodeLabelRuleEngineService.js.map +1 -1
  563. package/build/dist/Server/Services/IncidentEpisodeOnCallRuleEngineService.js +17 -0
  564. package/build/dist/Server/Services/IncidentEpisodeOnCallRuleEngineService.js.map +1 -1
  565. package/build/dist/Server/Services/IncidentEpisodeOwnerRuleEngineService.js +17 -0
  566. package/build/dist/Server/Services/IncidentEpisodeOwnerRuleEngineService.js.map +1 -1
  567. package/build/dist/Server/Services/IncidentEpisodePrivacyRuleEngineService.js +17 -0
  568. package/build/dist/Server/Services/IncidentEpisodePrivacyRuleEngineService.js.map +1 -1
  569. package/build/dist/Server/Services/IncidentGroupingEngineService.js +39 -13
  570. package/build/dist/Server/Services/IncidentGroupingEngineService.js.map +1 -1
  571. package/build/dist/Server/Services/IncidentLabelRuleEngineService.js +39 -9
  572. package/build/dist/Server/Services/IncidentLabelRuleEngineService.js.map +1 -1
  573. package/build/dist/Server/Services/IncidentOnCallRuleEngineService.js +39 -10
  574. package/build/dist/Server/Services/IncidentOnCallRuleEngineService.js.map +1 -1
  575. package/build/dist/Server/Services/IncidentOwnerRuleEngineService.js +39 -10
  576. package/build/dist/Server/Services/IncidentOwnerRuleEngineService.js.map +1 -1
  577. package/build/dist/Server/Services/IncidentPrivacyRuleEngineService.js +39 -10
  578. package/build/dist/Server/Services/IncidentPrivacyRuleEngineService.js.map +1 -1
  579. package/build/dist/Server/Services/IncidentReminderRuleService.js +44 -26
  580. package/build/dist/Server/Services/IncidentReminderRuleService.js.map +1 -1
  581. package/build/dist/Server/Services/IncidentSlaRuleService.js +33 -12
  582. package/build/dist/Server/Services/IncidentSlaRuleService.js.map +1 -1
  583. package/build/dist/Server/Services/IncomingCallPolicyLabelRuleEngineService.js +16 -0
  584. package/build/dist/Server/Services/IncomingCallPolicyLabelRuleEngineService.js.map +1 -1
  585. package/build/dist/Server/Services/IncomingCallPolicyOwnerRuleEngineService.js +16 -0
  586. package/build/dist/Server/Services/IncomingCallPolicyOwnerRuleEngineService.js.map +1 -1
  587. package/build/dist/Server/Services/IncomingCallPolicyPhoneNumberService.js +127 -0
  588. package/build/dist/Server/Services/IncomingCallPolicyPhoneNumberService.js.map +1 -0
  589. package/build/dist/Server/Services/IncomingCallPolicyService.js +187 -4
  590. package/build/dist/Server/Services/IncomingCallPolicyService.js.map +1 -1
  591. package/build/dist/Server/Services/Index.js +2 -0
  592. package/build/dist/Server/Services/Index.js.map +1 -1
  593. package/build/dist/Server/Services/IoTFleetLabelRuleEngineService.js +16 -0
  594. package/build/dist/Server/Services/IoTFleetLabelRuleEngineService.js.map +1 -1
  595. package/build/dist/Server/Services/IoTFleetOwnerRuleEngineService.js +16 -0
  596. package/build/dist/Server/Services/IoTFleetOwnerRuleEngineService.js.map +1 -1
  597. package/build/dist/Server/Services/KubernetesClusterLabelRuleEngineService.js +16 -0
  598. package/build/dist/Server/Services/KubernetesClusterLabelRuleEngineService.js.map +1 -1
  599. package/build/dist/Server/Services/KubernetesClusterOwnerRuleEngineService.js +16 -0
  600. package/build/dist/Server/Services/KubernetesClusterOwnerRuleEngineService.js.map +1 -1
  601. package/build/dist/Server/Services/LabelService.js +39 -7
  602. package/build/dist/Server/Services/LabelService.js.map +1 -1
  603. package/build/dist/Server/Services/MonitorLabelRuleEngineService.js +16 -0
  604. package/build/dist/Server/Services/MonitorLabelRuleEngineService.js.map +1 -1
  605. package/build/dist/Server/Services/MonitorOwnerRuleEngineService.js +16 -0
  606. package/build/dist/Server/Services/MonitorOwnerRuleEngineService.js.map +1 -1
  607. package/build/dist/Server/Services/NetworkDeviceAutoImportRuleEngineService.js +2 -0
  608. package/build/dist/Server/Services/NetworkDeviceAutoImportRuleEngineService.js.map +1 -1
  609. package/build/dist/Server/Services/NetworkDeviceAutoImportRuleService.js +57 -1
  610. package/build/dist/Server/Services/NetworkDeviceAutoImportRuleService.js.map +1 -1
  611. package/build/dist/Server/Services/NetworkDeviceLabelRuleEngineService.js +17 -0
  612. package/build/dist/Server/Services/NetworkDeviceLabelRuleEngineService.js.map +1 -1
  613. package/build/dist/Server/Services/NetworkDeviceOwnerRuleEngineService.js +16 -0
  614. package/build/dist/Server/Services/NetworkDeviceOwnerRuleEngineService.js.map +1 -1
  615. package/build/dist/Server/Services/NetworkDeviceService.js +2 -0
  616. package/build/dist/Server/Services/NetworkDeviceService.js.map +1 -1
  617. package/build/dist/Server/Services/NetworkSiteAssignmentRuleService.js +56 -1
  618. package/build/dist/Server/Services/NetworkSiteAssignmentRuleService.js.map +1 -1
  619. package/build/dist/Server/Services/NetworkSiteService.js +187 -22
  620. package/build/dist/Server/Services/NetworkSiteService.js.map +1 -1
  621. package/build/dist/Server/Services/NetworkSiteTypeService.js +126 -51
  622. package/build/dist/Server/Services/NetworkSiteTypeService.js.map +1 -1
  623. package/build/dist/Server/Services/OnCallDutyPolicyLabelRuleEngineService.js +16 -0
  624. package/build/dist/Server/Services/OnCallDutyPolicyLabelRuleEngineService.js.map +1 -1
  625. package/build/dist/Server/Services/OnCallDutyPolicyOwnerRuleEngineService.js +16 -0
  626. package/build/dist/Server/Services/OnCallDutyPolicyOwnerRuleEngineService.js.map +1 -1
  627. package/build/dist/Server/Services/OnCallDutyPolicyScheduleLabelRuleEngineService.js +16 -0
  628. package/build/dist/Server/Services/OnCallDutyPolicyScheduleLabelRuleEngineService.js.map +1 -1
  629. package/build/dist/Server/Services/OnCallDutyPolicyScheduleOwnerRuleEngineService.js +16 -0
  630. package/build/dist/Server/Services/OnCallDutyPolicyScheduleOwnerRuleEngineService.js.map +1 -1
  631. package/build/dist/Server/Services/PodmanHostLabelRuleEngineService.js +16 -0
  632. package/build/dist/Server/Services/PodmanHostLabelRuleEngineService.js.map +1 -1
  633. package/build/dist/Server/Services/PodmanHostOwnerRuleEngineService.js +16 -0
  634. package/build/dist/Server/Services/PodmanHostOwnerRuleEngineService.js.map +1 -1
  635. package/build/dist/Server/Services/ProjectCallSMSConfigService.js +115 -6
  636. package/build/dist/Server/Services/ProjectCallSMSConfigService.js.map +1 -1
  637. package/build/dist/Server/Services/ProxmoxClusterLabelRuleEngineService.js +16 -0
  638. package/build/dist/Server/Services/ProxmoxClusterLabelRuleEngineService.js.map +1 -1
  639. package/build/dist/Server/Services/ProxmoxClusterOwnerRuleEngineService.js +16 -0
  640. package/build/dist/Server/Services/ProxmoxClusterOwnerRuleEngineService.js.map +1 -1
  641. package/build/dist/Server/Services/RumApplicationLabelRuleEngineService.js +16 -0
  642. package/build/dist/Server/Services/RumApplicationLabelRuleEngineService.js.map +1 -1
  643. package/build/dist/Server/Services/RumApplicationOwnerRuleEngineService.js +16 -0
  644. package/build/dist/Server/Services/RumApplicationOwnerRuleEngineService.js.map +1 -1
  645. package/build/dist/Server/Services/RunbookLabelRuleEngineService.js +16 -0
  646. package/build/dist/Server/Services/RunbookLabelRuleEngineService.js.map +1 -1
  647. package/build/dist/Server/Services/RunbookOwnerRuleEngineService.js +16 -0
  648. package/build/dist/Server/Services/RunbookOwnerRuleEngineService.js.map +1 -1
  649. package/build/dist/Server/Services/RunbookRuleEngineService.js +12 -0
  650. package/build/dist/Server/Services/RunbookRuleEngineService.js.map +1 -1
  651. package/build/dist/Server/Services/ScheduledMaintenanceLabelRuleEngineService.js +38 -9
  652. package/build/dist/Server/Services/ScheduledMaintenanceLabelRuleEngineService.js.map +1 -1
  653. package/build/dist/Server/Services/ScheduledMaintenanceOwnerRuleEngineService.js +38 -10
  654. package/build/dist/Server/Services/ScheduledMaintenanceOwnerRuleEngineService.js.map +1 -1
  655. package/build/dist/Server/Services/ScheduledMaintenanceReminderRuleService.js +32 -14
  656. package/build/dist/Server/Services/ScheduledMaintenanceReminderRuleService.js.map +1 -1
  657. package/build/dist/Server/Services/ServerlessFunctionLabelRuleEngineService.js +16 -0
  658. package/build/dist/Server/Services/ServerlessFunctionLabelRuleEngineService.js.map +1 -1
  659. package/build/dist/Server/Services/ServerlessFunctionOwnerRuleEngineService.js +16 -0
  660. package/build/dist/Server/Services/ServerlessFunctionOwnerRuleEngineService.js.map +1 -1
  661. package/build/dist/Server/Services/ServiceLabelRuleEngineService.js +16 -0
  662. package/build/dist/Server/Services/ServiceLabelRuleEngineService.js.map +1 -1
  663. package/build/dist/Server/Services/ServiceLevelObjectiveBurnRateRuleService.js +554 -12
  664. package/build/dist/Server/Services/ServiceLevelObjectiveBurnRateRuleService.js.map +1 -1
  665. package/build/dist/Server/Services/ServiceLevelObjectiveService.js +50 -14
  666. package/build/dist/Server/Services/ServiceLevelObjectiveService.js.map +1 -1
  667. package/build/dist/Server/Services/ServiceOwnerRuleEngineService.js +16 -0
  668. package/build/dist/Server/Services/ServiceOwnerRuleEngineService.js.map +1 -1
  669. package/build/dist/Server/Services/StatusPageLabelRuleEngineService.js +16 -0
  670. package/build/dist/Server/Services/StatusPageLabelRuleEngineService.js.map +1 -1
  671. package/build/dist/Server/Services/StatusPageMonitorRuleEngineService.js +25 -2
  672. package/build/dist/Server/Services/StatusPageMonitorRuleEngineService.js.map +1 -1
  673. package/build/dist/Server/Services/StatusPageMonitorRuleService.js +19 -1
  674. package/build/dist/Server/Services/StatusPageMonitorRuleService.js.map +1 -1
  675. package/build/dist/Server/Services/StatusPageOwnerRuleEngineService.js +16 -0
  676. package/build/dist/Server/Services/StatusPageOwnerRuleEngineService.js.map +1 -1
  677. package/build/dist/Server/Services/UserService.js +14 -49
  678. package/build/dist/Server/Services/UserService.js.map +1 -1
  679. package/build/dist/Server/Services/VMwareVCenterLabelRuleEngineService.js +16 -0
  680. package/build/dist/Server/Services/VMwareVCenterLabelRuleEngineService.js.map +1 -1
  681. package/build/dist/Server/Services/VMwareVCenterOwnerRuleEngineService.js +16 -0
  682. package/build/dist/Server/Services/VMwareVCenterOwnerRuleEngineService.js.map +1 -1
  683. package/build/dist/Server/Services/WorkflowLabelRuleEngineService.js +16 -0
  684. package/build/dist/Server/Services/WorkflowLabelRuleEngineService.js.map +1 -1
  685. package/build/dist/Server/Services/WorkflowOwnerRuleEngineService.js +16 -0
  686. package/build/dist/Server/Services/WorkflowOwnerRuleEngineService.js.map +1 -1
  687. package/build/dist/Server/Types/Database/QueryHelper.js +67 -0
  688. package/build/dist/Server/Types/Database/QueryHelper.js.map +1 -1
  689. package/build/dist/Server/Utils/AI/Toolbox/SloTools.js +21 -4
  690. package/build/dist/Server/Utils/AI/Toolbox/SloTools.js.map +1 -1
  691. package/build/dist/Server/Utils/IncomingCallPhoneNumber.js +9 -3
  692. package/build/dist/Server/Utils/IncomingCallPhoneNumber.js.map +1 -1
  693. package/build/dist/Server/Utils/Profiling.js +10 -1
  694. package/build/dist/Server/Utils/Profiling.js.map +1 -1
  695. package/build/dist/Server/Utils/Rules/MonitorRuleCriteriaCache.js +30 -0
  696. package/build/dist/Server/Utils/Rules/MonitorRuleCriteriaCache.js.map +1 -0
  697. package/build/dist/Server/Utils/SessionReplay/SessionReplayReadService.js +344 -0
  698. package/build/dist/Server/Utils/SessionReplay/SessionReplayReadService.js.map +1 -1
  699. package/build/dist/Server/Utils/Telemetry.js +1 -1
  700. package/build/dist/Server/Utils/Telemetry.js.map +1 -1
  701. package/build/dist/Server/Utils/VendorAssets.js +2 -0
  702. package/build/dist/Server/Utils/VendorAssets.js.map +1 -1
  703. package/build/dist/Types/Dashboard/DashboardTemplates.js +425 -0
  704. package/build/dist/Types/Dashboard/DashboardTemplates.js.map +1 -1
  705. package/build/dist/Types/Rules/RuleCriteria.js +18 -0
  706. package/build/dist/Types/Rules/RuleCriteria.js.map +1 -0
  707. package/build/dist/Types/Rules/RuleCriteriaFieldRegistry.js +426 -0
  708. package/build/dist/Types/Rules/RuleCriteriaFieldRegistry.js.map +1 -0
  709. package/build/dist/Types/Rum/SessionReplay.js +64 -0
  710. package/build/dist/Types/Rum/SessionReplay.js.map +1 -1
  711. package/build/dist/Types/Rum/SessionReplayApi.js.map +1 -1
  712. package/build/dist/UI/Components/Alerts/Alert.js +63 -41
  713. package/build/dist/UI/Components/Alerts/Alert.js.map +1 -1
  714. package/build/dist/UI/Components/Button/Button.js +3 -1
  715. package/build/dist/UI/Components/Button/Button.js.map +1 -1
  716. package/build/dist/UI/Components/Dropdown/Dropdown.js +1 -1
  717. package/build/dist/UI/Components/Dropdown/Dropdown.js.map +1 -1
  718. package/build/dist/UI/Components/Feed/Feed.js +4 -1
  719. package/build/dist/UI/Components/Feed/Feed.js.map +1 -1
  720. package/build/dist/UI/Components/Feed/useFeedItems.js +137 -0
  721. package/build/dist/UI/Components/Feed/useFeedItems.js.map +1 -0
  722. package/build/dist/UI/Components/Forms/BasicForm.js +38 -19
  723. package/build/dist/UI/Components/Forms/BasicForm.js.map +1 -1
  724. package/build/dist/UI/Components/Forms/ModelForm.js +65 -1
  725. package/build/dist/UI/Components/Forms/ModelForm.js.map +1 -1
  726. package/build/dist/UI/Components/Icon/Icon.js +3 -35
  727. package/build/dist/UI/Components/Icon/Icon.js.map +1 -1
  728. package/build/dist/UI/Components/ModelTable/ModelTable.js +12 -1
  729. package/build/dist/UI/Components/ModelTable/ModelTable.js.map +1 -1
  730. package/build/dist/UI/Components/Navbar/NavBar.js +1 -0
  731. package/build/dist/UI/Components/Navbar/NavBar.js.map +1 -1
  732. package/build/dist/UI/Components/RuleCriteria/RuleCriteriaBuilder.js +383 -0
  733. package/build/dist/UI/Components/RuleCriteria/RuleCriteriaBuilder.js.map +1 -0
  734. package/build/dist/UI/Components/RuleCriteria/RuleCriteriaModelForm.js +124 -0
  735. package/build/dist/UI/Components/RuleCriteria/RuleCriteriaModelForm.js.map +1 -0
  736. package/build/dist/UI/Components/RuleCriteria/RuleCriteriaModelTable.js +126 -0
  737. package/build/dist/UI/Components/RuleCriteria/RuleCriteriaModelTable.js.map +1 -0
  738. package/build/dist/UI/Components/RuleCriteria/RuleCriteriaSummary.js +63 -0
  739. package/build/dist/UI/Components/RuleCriteria/RuleCriteriaSummary.js.map +1 -0
  740. package/build/dist/UI/Components/Table/Table.js +1 -1
  741. package/build/dist/UI/Components/Table/Table.js.map +1 -1
  742. package/build/dist/UI/Components/Table/TableBody.js +4 -2
  743. package/build/dist/UI/Components/Table/TableBody.js.map +1 -1
  744. package/build/dist/UI/Components/Table/TableRow.js +3 -2
  745. package/build/dist/UI/Components/Table/TableRow.js.map +1 -1
  746. package/build/dist/UI/Components/Telemetry/TelemetryRetentionConfigForm.js +14 -2
  747. package/build/dist/UI/Components/Telemetry/TelemetryRetentionConfigForm.js.map +1 -1
  748. package/build/dist/UI/Utils/LabelRuleImportExport.js +81 -5
  749. package/build/dist/UI/Utils/LabelRuleImportExport.js.map +1 -1
  750. package/build/dist/UI/Utils/Navigation.js.map +1 -1
  751. package/build/dist/Utils/Faker.js +76 -6
  752. package/build/dist/Utils/Faker.js.map +1 -1
  753. package/build/dist/Utils/LabelRuleImportExport.js +157 -3
  754. package/build/dist/Utils/LabelRuleImportExport.js.map +1 -1
  755. package/build/dist/Utils/NetworkDiscovery/AutoImportRuleMatcher.js +81 -5
  756. package/build/dist/Utils/NetworkDiscovery/AutoImportRuleMatcher.js.map +1 -1
  757. package/build/dist/Utils/NetworkSite/CidrMatchUtil.js +77 -0
  758. package/build/dist/Utils/NetworkSite/CidrMatchUtil.js.map +1 -1
  759. package/build/dist/Utils/NetworkSite/TypeHierarchyUtil.js +109 -2
  760. package/build/dist/Utils/NetworkSite/TypeHierarchyUtil.js.map +1 -1
  761. package/build/dist/Utils/Rules/RuleCriteriaMatcher.js +526 -0
  762. package/build/dist/Utils/Rules/RuleCriteriaMatcher.js.map +1 -0
  763. package/build/dist/Utils/Rum/SessionIdentity.js +13 -1
  764. package/build/dist/Utils/Rum/SessionIdentity.js.map +1 -1
  765. package/build/dist/Utils/Slo/SloBurnRateRuleState.js +28 -15
  766. package/build/dist/Utils/Slo/SloBurnRateRuleState.js.map +1 -1
  767. package/build/dist/Utils/Telemetry/OriginAllowList.js +61 -0
  768. package/build/dist/Utils/Telemetry/OriginAllowList.js.map +1 -1
  769. package/package.json +20 -20
@@ -0,0 +1,931 @@
1
+ import FilterCondition from "../../Types/Filter/FilterCondition";
2
+ import ObjectID from "../../Types/ObjectID";
3
+ import RuleCriteria, {
4
+ RULE_CRITERIA_LEGACY_NEVER_MATCH_PATTERN,
5
+ RULE_CRITERIA_SCHEMA_VERSION,
6
+ RuleCriteriaFilter,
7
+ RuleCriteriaOperator,
8
+ RuleCriteriaValue,
9
+ } from "../../Types/Rules/RuleCriteria";
10
+ import RulePatternMatchUtil from "./RulePatternMatchUtil";
11
+
12
+ export const RULE_CRITERIA_MAX_FILTERS: number = 50;
13
+ export const RULE_CRITERIA_MAX_STRING_LENGTH: number = 500;
14
+ export const RULE_CRITERIA_MAX_RELATION_VALUES: number = 100;
15
+
16
+ const RULE_CRITERIA_OPERATORS: ReadonlySet<RuleCriteriaOperator> = new Set(
17
+ Object.values(RuleCriteriaOperator),
18
+ );
19
+
20
+ const RELATION_OPERATORS: ReadonlySet<RuleCriteriaOperator> = new Set([
21
+ RuleCriteriaOperator.HasAnyOf,
22
+ RuleCriteriaOperator.HasAllOf,
23
+ RuleCriteriaOperator.HasNoneOf,
24
+ ]);
25
+
26
+ const NEGATED_OPERATORS: ReadonlySet<RuleCriteriaOperator> = new Set([
27
+ RuleCriteriaOperator.NotEquals,
28
+ RuleCriteriaOperator.DoesNotContain,
29
+ RuleCriteriaOperator.DoesNotMatchPattern,
30
+ RuleCriteriaOperator.HasNoneOf,
31
+ ]);
32
+
33
+ const RULE_CRITERIA_KEYS: ReadonlySet<string> = new Set([
34
+ "schemaVersion",
35
+ "filterCondition",
36
+ "filters",
37
+ "isEnabled",
38
+ ]);
39
+
40
+ const RULE_CRITERIA_FILTER_KEYS: ReadonlySet<string> = new Set([
41
+ "field",
42
+ "operator",
43
+ "value",
44
+ ]);
45
+
46
+ interface RuleCriteriaCarrier {
47
+ criteria?: unknown;
48
+ }
49
+
50
+ export interface RuleCriteriaMatchOptions {
51
+ criteria: unknown;
52
+ emptyResult: boolean;
53
+ matchesFilter: (filter: RuleCriteriaFilter) => Promise<boolean> | boolean;
54
+ }
55
+
56
+ export interface RuleCriteriaMatchSyncOptions {
57
+ criteria: unknown;
58
+ emptyResult: boolean;
59
+ matchesFilter: (filter: RuleCriteriaFilter) => boolean;
60
+ }
61
+
62
+ export interface MatchesWithLegacyOptions<
63
+ RuleType extends RuleCriteriaCarrier,
64
+ CorrelationCandidateType = never,
65
+ > {
66
+ rule: RuleType;
67
+ legacyFields: ReadonlyArray<Extract<keyof RuleType, string>>;
68
+ emptyResult: boolean;
69
+ matchesLegacyRule: (rule: RuleType) => Promise<boolean> | boolean;
70
+ correlation?: LegacyFilterCorrelation<RuleType, CorrelationCandidateType>;
71
+ }
72
+
73
+ export interface LegacyFilterCorrelation<
74
+ RuleType extends RuleCriteriaCarrier,
75
+ CorrelationCandidateType,
76
+ > {
77
+ fields: ReadonlyArray<Extract<keyof RuleType, string>>;
78
+ getCandidates: () =>
79
+ | Promise<ReadonlyArray<CorrelationCandidateType>>
80
+ | ReadonlyArray<CorrelationCandidateType>;
81
+ matchesLegacyRuleForCandidate: (
82
+ rule: RuleType,
83
+ candidate: CorrelationCandidateType,
84
+ ) => Promise<boolean> | boolean;
85
+ }
86
+
87
+ export interface MatchesWithLegacySyncOptions<
88
+ RuleType extends RuleCriteriaCarrier,
89
+ > {
90
+ rule: RuleType;
91
+ legacyFields: ReadonlyArray<Extract<keyof RuleType, string>>;
92
+ emptyResult: boolean;
93
+ matchesLegacyRule: (rule: RuleType) => boolean;
94
+ }
95
+
96
+ interface LegacyTextValue {
97
+ pattern: string;
98
+ negate: boolean;
99
+ }
100
+
101
+ interface IdBearingStub {
102
+ _id: string;
103
+ id: ObjectID;
104
+ }
105
+
106
+ function isRecord(value: unknown): value is Record<string, unknown> {
107
+ return typeof value === "object" && value !== null && !Array.isArray(value);
108
+ }
109
+
110
+ function hasExactlyKeys(
111
+ value: Record<string, unknown>,
112
+ expectedKeys: ReadonlySet<string>,
113
+ ): boolean {
114
+ const actualKeys: Array<string> = Object.keys(value);
115
+
116
+ return (
117
+ actualKeys.length === expectedKeys.size &&
118
+ actualKeys.every((key: string): boolean => {
119
+ return expectedKeys.has(key);
120
+ })
121
+ );
122
+ }
123
+
124
+ export function isRuleCriteriaOperator(
125
+ value: unknown,
126
+ ): value is RuleCriteriaOperator {
127
+ return (
128
+ typeof value === "string" &&
129
+ RULE_CRITERIA_OPERATORS.has(value as RuleCriteriaOperator)
130
+ );
131
+ }
132
+
133
+ export function isRuleCriteriaValue(
134
+ value: unknown,
135
+ ): value is RuleCriteriaValue {
136
+ if (typeof value === "string") {
137
+ return (
138
+ value.trim().length > 0 && value.length <= RULE_CRITERIA_MAX_STRING_LENGTH
139
+ );
140
+ }
141
+
142
+ if (typeof value === "number") {
143
+ return Number.isFinite(value);
144
+ }
145
+
146
+ if (typeof value === "boolean") {
147
+ return true;
148
+ }
149
+
150
+ if (Array.isArray(value)) {
151
+ return (
152
+ value.length > 0 &&
153
+ value.length <= RULE_CRITERIA_MAX_RELATION_VALUES &&
154
+ value.every((item: unknown): item is string => {
155
+ return (
156
+ typeof item === "string" &&
157
+ item.trim().length > 0 &&
158
+ item.length <= RULE_CRITERIA_MAX_STRING_LENGTH
159
+ );
160
+ })
161
+ );
162
+ }
163
+
164
+ return false;
165
+ }
166
+
167
+ export function getRuleCriteriaFilterValidationError(
168
+ value: unknown,
169
+ ): string | null {
170
+ if (!isRecord(value)) {
171
+ return "A rule criteria filter must be an object.";
172
+ }
173
+
174
+ if (typeof value["field"] !== "string") {
175
+ return "A rule criteria filter field must be a string.";
176
+ }
177
+
178
+ if (value["field"].trim().length === 0) {
179
+ return "A rule criteria filter field cannot be blank.";
180
+ }
181
+
182
+ if (value["field"].length > RULE_CRITERIA_MAX_STRING_LENGTH) {
183
+ return `A rule criteria filter field cannot exceed ${RULE_CRITERIA_MAX_STRING_LENGTH} characters.`;
184
+ }
185
+
186
+ if (!isRuleCriteriaOperator(value["operator"])) {
187
+ return "A rule criteria filter has an unsupported operator.";
188
+ }
189
+
190
+ if (
191
+ Array.isArray(value["value"]) &&
192
+ value["value"].length > RULE_CRITERIA_MAX_RELATION_VALUES
193
+ ) {
194
+ return `A rule criteria relation value cannot contain more than ${RULE_CRITERIA_MAX_RELATION_VALUES} items.`;
195
+ }
196
+
197
+ if (!isRuleCriteriaValue(value["value"])) {
198
+ return `A rule criteria filter value must be a finite number, a boolean, a non-blank string no longer than ${RULE_CRITERIA_MAX_STRING_LENGTH} characters, or a non-empty array of such strings.`;
199
+ }
200
+
201
+ const operator: RuleCriteriaOperator = value["operator"];
202
+ const isRelationOperator: boolean = RELATION_OPERATORS.has(operator);
203
+ const isArrayValue: boolean = Array.isArray(value["value"]);
204
+
205
+ if (isRelationOperator && !isArrayValue) {
206
+ return "A relation rule criteria operator requires an array of string IDs.";
207
+ }
208
+
209
+ if (!isRelationOperator && isArrayValue) {
210
+ return "A text rule criteria operator requires a scalar value.";
211
+ }
212
+
213
+ if (
214
+ (operator === RuleCriteriaOperator.MatchesPattern ||
215
+ operator === RuleCriteriaOperator.DoesNotMatchPattern) &&
216
+ (typeof value["value"] !== "string" ||
217
+ !RulePatternMatchUtil.isSupportedPattern(value["value"]))
218
+ ) {
219
+ return "A pattern rule criteria operator requires a valid regular expression or wildcard pattern.";
220
+ }
221
+
222
+ if (!hasExactlyKeys(value, RULE_CRITERIA_FILTER_KEYS)) {
223
+ return "A rule criteria filter may only contain field, operator, and value.";
224
+ }
225
+
226
+ return null;
227
+ }
228
+
229
+ export function getRuleCriteriaValidationError(value: unknown): string | null {
230
+ if (!isRecord(value)) {
231
+ return "Rule criteria must be an object.";
232
+ }
233
+
234
+ if (value["schemaVersion"] !== RULE_CRITERIA_SCHEMA_VERSION) {
235
+ return `Rule criteria schemaVersion must be ${RULE_CRITERIA_SCHEMA_VERSION}.`;
236
+ }
237
+
238
+ if (
239
+ value["filterCondition"] !== FilterCondition.All &&
240
+ value["filterCondition"] !== FilterCondition.Any
241
+ ) {
242
+ return "Rule criteria filterCondition must be All or Any.";
243
+ }
244
+
245
+ if (!Array.isArray(value["filters"])) {
246
+ return "Rule criteria filters must be an array.";
247
+ }
248
+
249
+ if (value["filters"].length > RULE_CRITERIA_MAX_FILTERS) {
250
+ return `Rule criteria cannot contain more than ${RULE_CRITERIA_MAX_FILTERS} filters.`;
251
+ }
252
+
253
+ if (
254
+ Object.keys(value).some((key: string): boolean => {
255
+ return !RULE_CRITERIA_KEYS.has(key);
256
+ })
257
+ ) {
258
+ return "Rule criteria may only contain schemaVersion, filterCondition, filters, and optional isEnabled.";
259
+ }
260
+
261
+ if (
262
+ value["isEnabled"] !== undefined &&
263
+ typeof value["isEnabled"] !== "boolean"
264
+ ) {
265
+ return "Rule criteria isEnabled must be a boolean when supplied.";
266
+ }
267
+
268
+ for (let index: number = 0; index < value["filters"].length; index++) {
269
+ const validationError: string | null = getRuleCriteriaFilterValidationError(
270
+ value["filters"][index],
271
+ );
272
+
273
+ if (validationError) {
274
+ return `Rule criteria filter ${index + 1}: ${validationError}`;
275
+ }
276
+ }
277
+
278
+ return null;
279
+ }
280
+
281
+ export function isValidRuleCriteria(value: unknown): value is RuleCriteria {
282
+ return getRuleCriteriaValidationError(value) === null;
283
+ }
284
+
285
+ /**
286
+ * Evaluates validated conditions sequentially so All/Any can short-circuit.
287
+ * A configured but malformed payload fails closed. Callers choose the meaning
288
+ * of a valid, configured empty filter list through emptyResult.
289
+ */
290
+ export class RuleCriteriaMatcher {
291
+ public static async matches(
292
+ options: RuleCriteriaMatchOptions,
293
+ ): Promise<boolean> {
294
+ if (!isValidRuleCriteria(options.criteria)) {
295
+ return false;
296
+ }
297
+
298
+ if (options.criteria.filters.length === 0) {
299
+ return options.emptyResult;
300
+ }
301
+
302
+ if (options.criteria.filterCondition === FilterCondition.All) {
303
+ for (const filter of options.criteria.filters) {
304
+ if (!(await options.matchesFilter(filter))) {
305
+ return false;
306
+ }
307
+ }
308
+
309
+ return true;
310
+ }
311
+
312
+ for (const filter of options.criteria.filters) {
313
+ if (await options.matchesFilter(filter)) {
314
+ return true;
315
+ }
316
+ }
317
+
318
+ return false;
319
+ }
320
+
321
+ public static matchesSync(options: RuleCriteriaMatchSyncOptions): boolean {
322
+ if (!isValidRuleCriteria(options.criteria)) {
323
+ return false;
324
+ }
325
+
326
+ if (options.criteria.filters.length === 0) {
327
+ return options.emptyResult;
328
+ }
329
+
330
+ if (options.criteria.filterCondition === FilterCondition.All) {
331
+ for (const filter of options.criteria.filters) {
332
+ if (!options.matchesFilter(filter)) {
333
+ return false;
334
+ }
335
+ }
336
+
337
+ return true;
338
+ }
339
+
340
+ for (const filter of options.criteria.filters) {
341
+ if (options.matchesFilter(filter)) {
342
+ return true;
343
+ }
344
+ }
345
+
346
+ return false;
347
+ }
348
+
349
+ public static async matchesWithLegacy<
350
+ RuleType extends RuleCriteriaCarrier,
351
+ CorrelationCandidateType = never,
352
+ >(
353
+ options: MatchesWithLegacyOptions<RuleType, CorrelationCandidateType>,
354
+ ): Promise<boolean> {
355
+ if (options.rule.criteria === undefined || options.rule.criteria === null) {
356
+ return await options.matchesLegacyRule(options.rule);
357
+ }
358
+
359
+ if (!isValidRuleCriteria(options.rule.criteria)) {
360
+ return false;
361
+ }
362
+
363
+ if (
364
+ options.correlation &&
365
+ options.rule.criteria.filters.some((filter: RuleCriteriaFilter) => {
366
+ return RuleCriteriaMatcher.isCorrelatedField({
367
+ correlation: options.correlation!,
368
+ filter: filter,
369
+ });
370
+ })
371
+ ) {
372
+ return await RuleCriteriaMatcher.matchesWithCorrelation({
373
+ ...options,
374
+ criteria: options.rule.criteria,
375
+ correlation: options.correlation,
376
+ });
377
+ }
378
+
379
+ return await RuleCriteriaMatcher.matches({
380
+ criteria: options.rule.criteria,
381
+ emptyResult: options.emptyResult,
382
+ matchesFilter: async (filter: RuleCriteriaFilter): Promise<boolean> => {
383
+ return await RuleCriteriaMatcher.matchesLegacyFilter({
384
+ ...options,
385
+ filter: filter,
386
+ });
387
+ },
388
+ });
389
+ }
390
+
391
+ private static async matchesWithCorrelation<
392
+ RuleType extends RuleCriteriaCarrier,
393
+ CorrelationCandidateType,
394
+ >(
395
+ options: MatchesWithLegacyOptions<RuleType, CorrelationCandidateType> & {
396
+ criteria: RuleCriteria;
397
+ correlation: LegacyFilterCorrelation<RuleType, CorrelationCandidateType>;
398
+ },
399
+ ): Promise<boolean> {
400
+ if (options.criteria.filters.length === 0) {
401
+ return options.emptyResult;
402
+ }
403
+
404
+ let candidatesPromise:
405
+ | Promise<ReadonlyArray<CorrelationCandidateType>>
406
+ | undefined;
407
+ const getCandidates: () => Promise<
408
+ ReadonlyArray<CorrelationCandidateType>
409
+ > = async (): Promise<ReadonlyArray<CorrelationCandidateType>> => {
410
+ if (!candidatesPromise) {
411
+ candidatesPromise = Promise.resolve(
412
+ options.correlation.getCandidates(),
413
+ );
414
+ }
415
+
416
+ return await candidatesPromise;
417
+ };
418
+
419
+ if (options.criteria.filterCondition === FilterCondition.Any) {
420
+ for (const filter of options.criteria.filters) {
421
+ const isPositiveCorrelatedFilter: boolean =
422
+ RuleCriteriaMatcher.isCorrelatedField({
423
+ correlation: options.correlation,
424
+ filter: filter,
425
+ }) && !NEGATED_OPERATORS.has(filter.operator);
426
+
427
+ if (isPositiveCorrelatedFilter) {
428
+ if (
429
+ await RuleCriteriaMatcher.matchesCorrelatedFilterAgainstAnyCandidate(
430
+ {
431
+ ...options,
432
+ filter: filter,
433
+ candidates: await getCandidates(),
434
+ },
435
+ )
436
+ ) {
437
+ return true;
438
+ }
439
+
440
+ continue;
441
+ }
442
+
443
+ /*
444
+ * Negation over a related collection is global: it means that no
445
+ * candidate matches the positive form, not that one candidate does
446
+ * not match it. Non-correlated filters are global as well.
447
+ */
448
+ if (
449
+ await RuleCriteriaMatcher.matchesLegacyFilter({
450
+ ...options,
451
+ filter: filter,
452
+ })
453
+ ) {
454
+ return true;
455
+ }
456
+ }
457
+
458
+ return false;
459
+ }
460
+
461
+ return await RuleCriteriaMatcher.matchesAllWithCorrelation({
462
+ ...options,
463
+ getCandidates: getCandidates,
464
+ });
465
+ }
466
+
467
+ private static async matchesAllWithCorrelation<
468
+ RuleType extends RuleCriteriaCarrier,
469
+ CorrelationCandidateType,
470
+ >(
471
+ options: MatchesWithLegacyOptions<RuleType, CorrelationCandidateType> & {
472
+ criteria: RuleCriteria;
473
+ correlation: LegacyFilterCorrelation<RuleType, CorrelationCandidateType>;
474
+ getCandidates: () => Promise<ReadonlyArray<CorrelationCandidateType>>;
475
+ },
476
+ ): Promise<boolean> {
477
+ const positiveCorrelatedFilters: Array<RuleCriteriaFilter> = [];
478
+
479
+ for (const filter of options.criteria.filters) {
480
+ if (
481
+ RuleCriteriaMatcher.isCorrelatedField({
482
+ correlation: options.correlation,
483
+ filter: filter,
484
+ }) &&
485
+ !NEGATED_OPERATORS.has(filter.operator)
486
+ ) {
487
+ positiveCorrelatedFilters.push(filter);
488
+ continue;
489
+ }
490
+
491
+ /*
492
+ * Keep negative correlated filters global. Evaluating a negated filter
493
+ * per candidate would incorrectly turn "none match" into "one does not
494
+ * match" whenever a collection contains mixed candidates.
495
+ */
496
+ if (
497
+ !(await RuleCriteriaMatcher.matchesLegacyFilter({
498
+ ...options,
499
+ filter: filter,
500
+ }))
501
+ ) {
502
+ return false;
503
+ }
504
+ }
505
+
506
+ if (positiveCorrelatedFilters.length === 0) {
507
+ return true;
508
+ }
509
+
510
+ const candidates: ReadonlyArray<CorrelationCandidateType> =
511
+ await options.getCandidates();
512
+
513
+ for (const candidate of candidates) {
514
+ let candidateMatchesAll: boolean = true;
515
+
516
+ for (const filter of positiveCorrelatedFilters) {
517
+ if (
518
+ !(await RuleCriteriaMatcher.matchesLegacyFilter({
519
+ ...options,
520
+ filter: filter,
521
+ matchesLegacyRule: async (rule: RuleType): Promise<boolean> => {
522
+ return await options.correlation.matchesLegacyRuleForCandidate(
523
+ rule,
524
+ candidate,
525
+ );
526
+ },
527
+ }))
528
+ ) {
529
+ candidateMatchesAll = false;
530
+ break;
531
+ }
532
+ }
533
+
534
+ if (candidateMatchesAll) {
535
+ return true;
536
+ }
537
+ }
538
+
539
+ return false;
540
+ }
541
+
542
+ private static async matchesCorrelatedFilterAgainstAnyCandidate<
543
+ RuleType extends RuleCriteriaCarrier,
544
+ CorrelationCandidateType,
545
+ >(
546
+ options: MatchesWithLegacyOptions<RuleType, CorrelationCandidateType> & {
547
+ correlation: LegacyFilterCorrelation<RuleType, CorrelationCandidateType>;
548
+ filter: RuleCriteriaFilter;
549
+ candidates: ReadonlyArray<CorrelationCandidateType>;
550
+ },
551
+ ): Promise<boolean> {
552
+ for (const candidate of options.candidates) {
553
+ if (
554
+ await RuleCriteriaMatcher.matchesLegacyFilter({
555
+ ...options,
556
+ matchesLegacyRule: async (rule: RuleType): Promise<boolean> => {
557
+ return await options.correlation.matchesLegacyRuleForCandidate(
558
+ rule,
559
+ candidate,
560
+ );
561
+ },
562
+ })
563
+ ) {
564
+ return true;
565
+ }
566
+ }
567
+
568
+ return false;
569
+ }
570
+
571
+ private static isCorrelatedField<
572
+ RuleType extends RuleCriteriaCarrier,
573
+ CorrelationCandidateType,
574
+ >(options: {
575
+ correlation: LegacyFilterCorrelation<RuleType, CorrelationCandidateType>;
576
+ filter: RuleCriteriaFilter;
577
+ }): boolean {
578
+ return options.correlation.fields.some((field: string): boolean => {
579
+ return field === options.filter.field;
580
+ });
581
+ }
582
+
583
+ public static matchesWithLegacySync<RuleType extends RuleCriteriaCarrier>(
584
+ options: MatchesWithLegacySyncOptions<RuleType>,
585
+ ): boolean {
586
+ if (options.rule.criteria === undefined || options.rule.criteria === null) {
587
+ return options.matchesLegacyRule(options.rule);
588
+ }
589
+
590
+ return RuleCriteriaMatcher.matchesSync({
591
+ criteria: options.rule.criteria,
592
+ emptyResult: options.emptyResult,
593
+ matchesFilter: (filter: RuleCriteriaFilter): boolean => {
594
+ return RuleCriteriaMatcher.matchesLegacyFilterSync({
595
+ ...options,
596
+ filter: filter,
597
+ });
598
+ },
599
+ });
600
+ }
601
+
602
+ private static async matchesLegacyFilter<
603
+ RuleType extends RuleCriteriaCarrier,
604
+ CorrelationCandidateType = never,
605
+ >(
606
+ options: MatchesWithLegacyOptions<RuleType, CorrelationCandidateType> & {
607
+ filter: RuleCriteriaFilter;
608
+ },
609
+ ): Promise<boolean> {
610
+ try {
611
+ if (!RuleCriteriaMatcher.isAllowedLegacyField(options)) {
612
+ return false;
613
+ }
614
+
615
+ if (RELATION_OPERATORS.has(options.filter.operator)) {
616
+ return await RuleCriteriaMatcher.matchesLegacyRelationFilter(options);
617
+ }
618
+
619
+ const textValue: LegacyTextValue = RuleCriteriaMatcher.toLegacyTextValue(
620
+ options.filter,
621
+ );
622
+ const rule: RuleType = RuleCriteriaMatcher.cloneRuleForFilter({
623
+ ...options,
624
+ value: textValue.pattern,
625
+ });
626
+ const result: boolean = await options.matchesLegacyRule(rule);
627
+
628
+ return textValue.negate ? !result : result;
629
+ } catch {
630
+ return false;
631
+ }
632
+ }
633
+
634
+ private static matchesLegacyFilterSync<RuleType extends RuleCriteriaCarrier>(
635
+ options: MatchesWithLegacySyncOptions<RuleType> & {
636
+ filter: RuleCriteriaFilter;
637
+ },
638
+ ): boolean {
639
+ try {
640
+ if (!RuleCriteriaMatcher.isAllowedLegacyField(options)) {
641
+ return false;
642
+ }
643
+
644
+ if (RELATION_OPERATORS.has(options.filter.operator)) {
645
+ return RuleCriteriaMatcher.matchesLegacyRelationFilterSync(options);
646
+ }
647
+
648
+ const textValue: LegacyTextValue = RuleCriteriaMatcher.toLegacyTextValue(
649
+ options.filter,
650
+ );
651
+ const rule: RuleType = RuleCriteriaMatcher.cloneRuleForFilter({
652
+ ...options,
653
+ value: textValue.pattern,
654
+ });
655
+ const result: boolean = options.matchesLegacyRule(rule);
656
+
657
+ return textValue.negate ? !result : result;
658
+ } catch {
659
+ return false;
660
+ }
661
+ }
662
+
663
+ private static async matchesLegacyRelationFilter<
664
+ RuleType extends RuleCriteriaCarrier,
665
+ CorrelationCandidateType = never,
666
+ >(
667
+ options: MatchesWithLegacyOptions<RuleType, CorrelationCandidateType> & {
668
+ filter: RuleCriteriaFilter;
669
+ },
670
+ ): Promise<boolean> {
671
+ const values: Array<string> = options.filter.value as Array<string>;
672
+
673
+ if (options.filter.operator === RuleCriteriaOperator.HasAnyOf) {
674
+ if (values.length === 0) {
675
+ return false;
676
+ }
677
+
678
+ return await options.matchesLegacyRule(
679
+ RuleCriteriaMatcher.cloneRuleForFilter({
680
+ ...options,
681
+ value: values.map(RuleCriteriaMatcher.toIdBearingStub),
682
+ }),
683
+ );
684
+ }
685
+
686
+ for (const value of values) {
687
+ const matches: boolean = await options.matchesLegacyRule(
688
+ RuleCriteriaMatcher.cloneRuleForFilter({
689
+ ...options,
690
+ value: [RuleCriteriaMatcher.toIdBearingStub(value)],
691
+ }),
692
+ );
693
+
694
+ if (
695
+ options.filter.operator === RuleCriteriaOperator.HasAllOf &&
696
+ !matches
697
+ ) {
698
+ return false;
699
+ }
700
+
701
+ if (
702
+ options.filter.operator === RuleCriteriaOperator.HasNoneOf &&
703
+ matches
704
+ ) {
705
+ return false;
706
+ }
707
+ }
708
+
709
+ return true;
710
+ }
711
+
712
+ private static matchesLegacyRelationFilterSync<
713
+ RuleType extends RuleCriteriaCarrier,
714
+ >(
715
+ options: MatchesWithLegacySyncOptions<RuleType> & {
716
+ filter: RuleCriteriaFilter;
717
+ },
718
+ ): boolean {
719
+ const values: Array<string> = options.filter.value as Array<string>;
720
+
721
+ if (options.filter.operator === RuleCriteriaOperator.HasAnyOf) {
722
+ if (values.length === 0) {
723
+ return false;
724
+ }
725
+
726
+ return options.matchesLegacyRule(
727
+ RuleCriteriaMatcher.cloneRuleForFilter({
728
+ ...options,
729
+ value: values.map(RuleCriteriaMatcher.toIdBearingStub),
730
+ }),
731
+ );
732
+ }
733
+
734
+ for (const value of values) {
735
+ const matches: boolean = options.matchesLegacyRule(
736
+ RuleCriteriaMatcher.cloneRuleForFilter({
737
+ ...options,
738
+ value: [RuleCriteriaMatcher.toIdBearingStub(value)],
739
+ }),
740
+ );
741
+
742
+ if (
743
+ options.filter.operator === RuleCriteriaOperator.HasAllOf &&
744
+ !matches
745
+ ) {
746
+ return false;
747
+ }
748
+
749
+ if (
750
+ options.filter.operator === RuleCriteriaOperator.HasNoneOf &&
751
+ matches
752
+ ) {
753
+ return false;
754
+ }
755
+ }
756
+
757
+ return true;
758
+ }
759
+
760
+ private static cloneRuleForFilter<
761
+ RuleType extends RuleCriteriaCarrier,
762
+ >(options: {
763
+ rule: RuleType;
764
+ legacyFields: ReadonlyArray<Extract<keyof RuleType, string>>;
765
+ filter: RuleCriteriaFilter;
766
+ value: unknown;
767
+ }): RuleType {
768
+ const clone: RuleType = Object.assign(
769
+ Object.create(
770
+ Object.getPrototypeOf(options.rule) as Record<string, unknown> | null,
771
+ ) as Record<string, unknown>,
772
+ options.rule,
773
+ ) as RuleType;
774
+ const mutableClone: Record<string, unknown> = clone as unknown as Record<
775
+ string,
776
+ unknown
777
+ >;
778
+
779
+ for (const field of options.legacyFields) {
780
+ mutableClone[field] = undefined;
781
+ }
782
+
783
+ mutableClone["criteria"] = undefined;
784
+ mutableClone[options.filter.field] = options.value;
785
+
786
+ return clone;
787
+ }
788
+
789
+ private static isAllowedLegacyField<
790
+ RuleType extends RuleCriteriaCarrier,
791
+ >(options: {
792
+ legacyFields: ReadonlyArray<Extract<keyof RuleType, string>>;
793
+ filter: RuleCriteriaFilter;
794
+ }): boolean {
795
+ return options.legacyFields.some((field: string): boolean => {
796
+ return field === options.filter.field;
797
+ });
798
+ }
799
+
800
+ private static toLegacyTextValue(
801
+ filter: RuleCriteriaFilter,
802
+ ): LegacyTextValue {
803
+ const value: string = String(filter.value);
804
+
805
+ switch (filter.operator) {
806
+ case RuleCriteriaOperator.Equals:
807
+ return {
808
+ pattern: `^${RuleCriteriaMatcher.escapeRegex(value)}$`,
809
+ negate: false,
810
+ };
811
+ case RuleCriteriaOperator.NotEquals:
812
+ return {
813
+ pattern: `^${RuleCriteriaMatcher.escapeRegex(value)}$`,
814
+ negate: true,
815
+ };
816
+ case RuleCriteriaOperator.Contains:
817
+ return {
818
+ pattern: RuleCriteriaMatcher.escapeRegex(value),
819
+ negate: false,
820
+ };
821
+ case RuleCriteriaOperator.DoesNotContain:
822
+ return {
823
+ pattern: RuleCriteriaMatcher.escapeRegex(value),
824
+ negate: true,
825
+ };
826
+ case RuleCriteriaOperator.StartsWith:
827
+ return {
828
+ pattern: `^${RuleCriteriaMatcher.escapeRegex(value)}`,
829
+ negate: false,
830
+ };
831
+ case RuleCriteriaOperator.EndsWith:
832
+ return {
833
+ pattern: `${RuleCriteriaMatcher.escapeRegex(value)}$`,
834
+ negate: false,
835
+ };
836
+ case RuleCriteriaOperator.MatchesPattern:
837
+ return {
838
+ pattern: RuleCriteriaMatcher.toLegacyPattern(value),
839
+ negate: false,
840
+ };
841
+ case RuleCriteriaOperator.DoesNotMatchPattern:
842
+ return {
843
+ pattern: RuleCriteriaMatcher.toLegacyPattern(value),
844
+ negate: true,
845
+ };
846
+ default:
847
+ return {
848
+ pattern: RULE_CRITERIA_LEGACY_NEVER_MATCH_PATTERN,
849
+ negate: false,
850
+ };
851
+ }
852
+ }
853
+
854
+ private static escapeRegex(value: string): string {
855
+ return value.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
856
+ }
857
+
858
+ private static toLegacyPattern(value: string): string {
859
+ if (RulePatternMatchUtil.isValidRegex(value)) {
860
+ return value;
861
+ }
862
+
863
+ if (value.includes("*")) {
864
+ return RuleCriteriaMatcher.toSafeLegacyGlobPattern(value);
865
+ }
866
+
867
+ throw new Error("Unsupported rule criteria pattern.");
868
+ }
869
+
870
+ /**
871
+ * Converts a wildcard into a regex for legacy engines that compile patterns
872
+ * directly. Each wildcard-delimited literal is consumed atomically via a
873
+ * lookahead/backreference pair. This preserves full-string glob semantics
874
+ * without constructing chains of ambiguous `.*` expressions that can cause
875
+ * catastrophic regex backtracking. Unbounded runs use `{0,}` instead of `*`
876
+ * so legacy matchers that add a glob fallback do not reinterpret this safe
877
+ * generated regex as another wildcard supplied by the user.
878
+ */
879
+ private static toSafeLegacyGlobPattern(value: string): string {
880
+ const hasLeadingWildcard: boolean = value.startsWith("*");
881
+ const hasTrailingWildcard: boolean = value.endsWith("*");
882
+ const literals: Array<string> = value
883
+ .split("*")
884
+ .filter((literal: string): boolean => {
885
+ return literal.length > 0;
886
+ });
887
+
888
+ if (literals.length === 0) {
889
+ return "^[\\s\\S]{0,}$";
890
+ }
891
+
892
+ let pattern: string = "^";
893
+ let literalIndex: number = 0;
894
+
895
+ if (!hasLeadingWildcard) {
896
+ pattern += RuleCriteriaMatcher.escapeRegex(literals[0] || "");
897
+ literalIndex = 1;
898
+ }
899
+
900
+ const suffixIndex: number = hasTrailingWildcard
901
+ ? literals.length
902
+ : literals.length - 1;
903
+
904
+ for (; literalIndex < suffixIndex; literalIndex++) {
905
+ const groupName: string = `ruleGlob${literalIndex}`;
906
+ pattern += `(?=(?<${groupName}>[\\s\\S]{0,}?${RuleCriteriaMatcher.escapeRegex(
907
+ literals[literalIndex] || "",
908
+ )}))\\k<${groupName}>`;
909
+ }
910
+
911
+ if (!hasTrailingWildcard) {
912
+ const groupName: string = `ruleGlobSuffix${literalIndex}`;
913
+ pattern += `(?=(?<${groupName}>[\\s\\S]{0,}${RuleCriteriaMatcher.escapeRegex(
914
+ literals[literals.length - 1] || "",
915
+ )}$))\\k<${groupName}>`;
916
+ } else {
917
+ pattern += "[\\s\\S]{0,}$";
918
+ }
919
+
920
+ return pattern;
921
+ }
922
+
923
+ private static toIdBearingStub(value: string): IdBearingStub {
924
+ return {
925
+ _id: value,
926
+ id: new ObjectID(value),
927
+ };
928
+ }
929
+ }
930
+
931
+ export default RuleCriteriaMatcher;