@oneuptime/common 12.0.30 → 12.0.31

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 (489) hide show
  1. package/Models/AnalyticsModels/SecurityEvent.ts +48 -16
  2. package/Models/AnalyticsModels/ThreatIntelIndicator.ts +10 -5
  3. package/Models/DatabaseModels/AlertSeverity.ts +44 -0
  4. package/Models/DatabaseModels/DetectionRule.ts +16 -5
  5. package/Models/DatabaseModels/GoogleSecOpsConnection.ts +14 -5
  6. package/Models/DatabaseModels/IncidentSeverity.ts +44 -0
  7. package/Models/DatabaseModels/Index.ts +2 -0
  8. package/Models/DatabaseModels/NetworkDevice.ts +113 -3
  9. package/Models/DatabaseModels/NetworkDeviceAutoImportRule.ts +88 -0
  10. package/Models/DatabaseModels/NetworkDeviceDiscoveryScan.ts +22 -0
  11. package/Models/DatabaseModels/NetworkDeviceOidTemplate.ts +499 -0
  12. package/Models/DatabaseModels/ThreatIntelFeed.ts +16 -5
  13. package/Server/API/GlobalConfigAPI.ts +362 -183
  14. package/Server/API/TelemetryAPI.ts +42 -4
  15. package/Server/EnvironmentConfig.ts +112 -0
  16. package/Server/Infrastructure/Postgres/SchemaMigrations/1790500000000-AddNetworkDeviceOidTemplate.ts +59 -0
  17. package/Server/Infrastructure/Postgres/SchemaMigrations/1790600000000-AddAutoImportRuleOidTemplate.ts +25 -0
  18. package/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts +4 -0
  19. package/Server/Middleware/MultipartFormData.ts +118 -32
  20. package/Server/Services/AlertEpisodeLabelRuleEngineService.ts +9 -1
  21. package/Server/Services/AlertEpisodeOnCallRuleEngineService.ts +9 -1
  22. package/Server/Services/AlertEpisodeOwnerRuleEngineService.ts +9 -1
  23. package/Server/Services/AlertEpisodePrivacyRuleEngineService.ts +9 -1
  24. package/Server/Services/AlertGroupingEngineService.ts +9 -1
  25. package/Server/Services/AlertLabelRuleEngineService.ts +9 -1
  26. package/Server/Services/AlertOnCallRuleEngineService.ts +9 -1
  27. package/Server/Services/AlertOwnerRuleEngineService.ts +9 -1
  28. package/Server/Services/AlertPrivacyRuleEngineService.ts +9 -1
  29. package/Server/Services/AlertReminderRuleService.ts +9 -1
  30. package/Server/Services/AutoRemediationRuleEngineService.ts +9 -1
  31. package/Server/Services/CephClusterLabelRuleEngineService.ts +9 -1
  32. package/Server/Services/CephClusterOwnerRuleEngineService.ts +9 -1
  33. package/Server/Services/CloudResourceLabelRuleEngineService.ts +9 -1
  34. package/Server/Services/CloudResourceOwnerRuleEngineService.ts +9 -1
  35. package/Server/Services/DashboardLabelRuleEngineService.ts +9 -1
  36. package/Server/Services/DashboardOwnerRuleEngineService.ts +9 -1
  37. package/Server/Services/DockerHostLabelRuleEngineService.ts +9 -1
  38. package/Server/Services/DockerHostOwnerRuleEngineService.ts +9 -1
  39. package/Server/Services/DockerSwarmClusterLabelRuleEngineService.ts +9 -1
  40. package/Server/Services/DockerSwarmClusterOwnerRuleEngineService.ts +9 -1
  41. package/Server/Services/HostLabelRuleEngineService.ts +9 -1
  42. package/Server/Services/HostOwnerRuleEngineService.ts +9 -1
  43. package/Server/Services/IncidentEpisodeLabelRuleEngineService.ts +9 -1
  44. package/Server/Services/IncidentEpisodeOnCallRuleEngineService.ts +9 -1
  45. package/Server/Services/IncidentEpisodeOwnerRuleEngineService.ts +9 -1
  46. package/Server/Services/IncidentEpisodePrivacyRuleEngineService.ts +9 -1
  47. package/Server/Services/IncidentGroupingEngineService.ts +9 -1
  48. package/Server/Services/IncidentLabelRuleEngineService.ts +9 -1
  49. package/Server/Services/IncidentOnCallRuleEngineService.ts +9 -1
  50. package/Server/Services/IncidentOwnerRuleEngineService.ts +9 -1
  51. package/Server/Services/IncidentPrivacyRuleEngineService.ts +9 -1
  52. package/Server/Services/IncidentReminderRuleService.ts +9 -1
  53. package/Server/Services/IncidentSlaRuleService.ts +9 -1
  54. package/Server/Services/IncomingCallPolicyLabelRuleEngineService.ts +9 -1
  55. package/Server/Services/IncomingCallPolicyOwnerRuleEngineService.ts +9 -1
  56. package/Server/Services/Index.ts +2 -0
  57. package/Server/Services/IoTFleetLabelRuleEngineService.ts +9 -1
  58. package/Server/Services/IoTFleetOwnerRuleEngineService.ts +9 -1
  59. package/Server/Services/KubernetesClusterLabelRuleEngineService.ts +9 -1
  60. package/Server/Services/KubernetesClusterOwnerRuleEngineService.ts +9 -1
  61. package/Server/Services/KubernetesResourceService.ts +5 -1
  62. package/Server/Services/MonitorLabelRuleEngineService.ts +9 -1
  63. package/Server/Services/MonitorOwnerRuleEngineService.ts +9 -1
  64. package/Server/Services/NetworkDeviceAutoImportRuleEngineService.ts +35 -0
  65. package/Server/Services/NetworkDeviceAutoImportRuleService.ts +96 -0
  66. package/Server/Services/NetworkDeviceLabelRuleEngineService.ts +9 -1
  67. package/Server/Services/NetworkDeviceOidTemplateService.ts +201 -0
  68. package/Server/Services/NetworkDeviceOwnerRuleEngineService.ts +9 -1
  69. package/Server/Services/NetworkDeviceService.ts +209 -1
  70. package/Server/Services/OnCallDutyPolicyLabelRuleEngineService.ts +9 -1
  71. package/Server/Services/OnCallDutyPolicyOwnerRuleEngineService.ts +9 -1
  72. package/Server/Services/OnCallDutyPolicyScheduleLabelRuleEngineService.ts +9 -1
  73. package/Server/Services/OnCallDutyPolicyScheduleOwnerRuleEngineService.ts +9 -1
  74. package/Server/Services/PodmanHostLabelRuleEngineService.ts +9 -1
  75. package/Server/Services/PodmanHostOwnerRuleEngineService.ts +9 -1
  76. package/Server/Services/ProxmoxClusterLabelRuleEngineService.ts +9 -1
  77. package/Server/Services/ProxmoxClusterOwnerRuleEngineService.ts +9 -1
  78. package/Server/Services/RumApplicationLabelRuleEngineService.ts +9 -1
  79. package/Server/Services/RumApplicationOwnerRuleEngineService.ts +9 -1
  80. package/Server/Services/RunbookLabelRuleEngineService.ts +9 -1
  81. package/Server/Services/RunbookOwnerRuleEngineService.ts +9 -1
  82. package/Server/Services/RunbookRuleEngineService.ts +9 -1
  83. package/Server/Services/ScheduledMaintenanceLabelRuleEngineService.ts +9 -1
  84. package/Server/Services/ScheduledMaintenanceOwnerRuleEngineService.ts +9 -1
  85. package/Server/Services/ScheduledMaintenanceReminderRuleService.ts +9 -1
  86. package/Server/Services/ServerlessFunctionLabelRuleEngineService.ts +9 -1
  87. package/Server/Services/ServerlessFunctionOwnerRuleEngineService.ts +9 -1
  88. package/Server/Services/ServiceLabelRuleEngineService.ts +9 -1
  89. package/Server/Services/ServiceOwnerRuleEngineService.ts +9 -1
  90. package/Server/Services/StatusPageLabelRuleEngineService.ts +9 -1
  91. package/Server/Services/StatusPageMonitorRuleEngineService.ts +7 -0
  92. package/Server/Services/StatusPageOwnerRuleEngineService.ts +9 -1
  93. package/Server/Services/TelemetrySourceMapService.ts +266 -23
  94. package/Server/Services/UserService.ts +27 -0
  95. package/Server/Services/WorkflowLabelRuleEngineService.ts +9 -1
  96. package/Server/Services/WorkflowOwnerRuleEngineService.ts +9 -1
  97. package/Server/Utils/EnterpriseLicense/EnterpriseLicenseSeatUtil.ts +186 -0
  98. package/Server/Utils/Monitor/CapturedMetricAttributeUtil.ts +245 -0
  99. package/Server/Utils/Monitor/Criteria/SnmpMonitorCriteria.ts +21 -2
  100. package/Server/Utils/Monitor/MonitorMetricUtil.ts +55 -21
  101. package/Server/Utils/Monitor/MonitorTemplateUtil.ts +32 -0
  102. package/Server/Utils/Monitor/NetworkDeviceMetricUtil.ts +15 -2
  103. package/Server/Utils/Monitor/NetworkDeviceWalkUtil.ts +18 -1
  104. package/Server/Utils/Monitor/NetworkInventoryUtil.ts +10 -0
  105. package/Server/Utils/Monitor/SeriesResourceLabels.ts +34 -0
  106. package/Server/Utils/Rules/RuleEngineRuleRead.ts +48 -0
  107. package/Server/Utils/Telemetry/ExceptionSanitizer.ts +14 -1
  108. package/Server/Utils/Telemetry/LogExceptionExtractor.ts +14 -2
  109. package/Server/Utils/Telemetry/SourceMapResolver.ts +16 -5
  110. package/Server/Utils/Telemetry/StackTraceParser.ts +399 -0
  111. package/Tests/App/Dashboard/EventOverlayHook.test.tsx +125 -0
  112. package/Tests/App/Dashboard/HeaderImageAssets.test.tsx +93 -0
  113. package/Tests/App/Dashboard/OnCallReadinessSurfaces.test.tsx +3 -3
  114. package/Tests/App/Dashboard/UserElementEmail.test.tsx +12 -4
  115. package/Tests/App/Dashboard/UserEmailCallSites.test.tsx +1 -1
  116. package/Tests/Models/DatabaseModels/DomainRoleTierCoverage.test.ts +14 -0
  117. package/Tests/Models/DatabaseModels/ModelRegistryInvariants.test.ts +469 -0
  118. package/Tests/Models/SecurityDomainAccessControl.test.ts +429 -0
  119. package/Tests/Server/API/GlobalConfigLicense.test.ts +657 -0
  120. package/Tests/Server/API/SecurityEventAttributesAPI.test.ts +84 -6
  121. package/Tests/Server/API/TelemetryResolveStackTraceAPI.test.ts +805 -0
  122. package/Tests/Server/Infrastructure/Postgres/AddOnCallCalendarFeedsMigration.test.ts +32 -7
  123. package/Tests/Server/Middleware/IdentityRateLimit.test.ts +1144 -0
  124. package/Tests/Server/Middleware/MultipartFormData.test.ts +618 -3
  125. package/Tests/Server/Services/MonitorLabelRuleEngineScale.test.ts +520 -0
  126. package/Tests/Server/Services/NetworkDeviceOidTemplateService.test.ts +332 -0
  127. package/Tests/Server/Services/NetworkDeviceOidTemplateWriteGuards.test.ts +409 -0
  128. package/Tests/Server/Services/RuleEngineRuleFetchLimit.test.ts +239 -0
  129. package/Tests/Server/Services/TelemetrySourceMapService.test.ts +1210 -2
  130. package/Tests/Server/Services/UserServiceSeatLimit.test.ts +182 -0
  131. package/Tests/Server/Types/AnalyticsDatabase/SecurityEventModelPermission.test.ts +255 -0
  132. package/Tests/Server/Types/Database/Permissions/ReadBlockPermission.test.ts +212 -0
  133. package/Tests/Server/Types/Database/Permissions/SecurityRoleAccess.test.ts +413 -0
  134. package/Tests/Server/Utils/CodeRepository.test.ts +689 -0
  135. package/Tests/Server/Utils/EnterpriseLicense/EnterpriseLicenseSeatUtil.test.ts +495 -0
  136. package/Tests/Server/Utils/ExceptionSanitizer.test.ts +77 -0
  137. package/Tests/Server/Utils/Monitor/CapturedMetricAttributeUtil.test.ts +284 -0
  138. package/Tests/Server/Utils/Monitor/MonitorCustomMetricAttributes.test.ts +503 -0
  139. package/Tests/Server/Utils/Monitor/MonitorTemplatePrototypePollution.test.ts +106 -0
  140. package/Tests/Server/Utils/Monitor/NetworkDeviceWalkLogWritePath.test.ts +33 -4
  141. package/Tests/Server/Utils/Monitor/NetworkDeviceWalkUtil.test.ts +14 -4
  142. package/Tests/Server/Utils/Monitor/NetworkInventoryUtil.test.ts +44 -0
  143. package/Tests/Server/Utils/OpenAPISpec.test.ts +536 -0
  144. package/Tests/Server/Utils/Rules/RuleEngineRuleRead.test.ts +115 -0
  145. package/Tests/Server/Utils/StackTraceParser.test.ts +610 -0
  146. package/Tests/Server/Utils/Telemetry/LogExceptionExtractor.test.ts +0 -0
  147. package/Tests/Server/Utils/Telemetry/SourceMapLimits.test.ts +656 -0
  148. package/Tests/Server/Utils/Telemetry/SourceMapResolver.test.ts +100 -0
  149. package/Tests/Types/Monitor/SnmpMonitor/SnmpOidListUtil.test.ts +454 -0
  150. package/Tests/Types/SecurityRolePermissions.test.ts +193 -0
  151. package/Tests/UI/Components/Charts/AnnotationLayout.test.ts +773 -0
  152. package/Tests/UI/Components/Charts/ChartAnnotationRail.test.tsx +789 -0
  153. package/Tests/UI/Components/Charts/ChartBucketIdentity.test.ts +254 -0
  154. package/Tests/UI/Components/Charts/TimeAnnotation.test.ts +471 -0
  155. package/Tests/UI/Components/EditionLabelLicenseRefresh.test.tsx +405 -0
  156. package/Tests/UI/Components/ErrorMessageRefreshControl.test.tsx +83 -0
  157. package/Tests/UI/Components/MarkdownConverters.test.ts +686 -0
  158. package/Tests/UI/Components/ModelTable/BaseModelTableDeleteAndEmptyStates.test.tsx +341 -0
  159. package/Tests/UI/Components/OrderedStatesList.test.tsx +5 -5
  160. package/Tests/UI/Components/PendingProjectInvitations.test.tsx +1 -1
  161. package/Tests/UI/Components/TableSortAndMobileColumns.test.tsx +195 -0
  162. package/Tests/UI/Components/XAxis.test.ts +270 -5
  163. package/Tests/UI/Components/XAxisDaylightSaving.test.ts +113 -0
  164. package/Tests/UI/Styles/ChartFocusRing.test.ts +153 -0
  165. package/Tests/UI/Styles/ChartFocusRingCoverage.test.tsx +377 -0
  166. package/Tests/UI/Styles/ThemeStylesheet.ts +162 -0
  167. package/Tests/Utils/EnterpriseLicenseSeats.test.ts +507 -0
  168. package/Tests/Utils/NetworkDiscovery/DiscoveredDeviceBuilder.test.ts +951 -1
  169. package/Tests/Utils/NetworkDiscovery/DiscoveredHostUtil.test.ts +238 -0
  170. package/Tests/Utils/NetworkDiscovery/DiscoveryReverseDnsChain.test.ts +1056 -0
  171. package/Tests/Utils/NetworkDiscovery/ReverseDnsNameUtil.test.ts +882 -0
  172. package/Types/Date.ts +39 -0
  173. package/Types/Monitor/SnmpMonitor/SnmpOidListUtil.ts +333 -0
  174. package/Types/Permission.ts +96 -0
  175. package/Types/Rum/SessionReplay.ts +21 -0
  176. package/Types/Telemetry/SourceMap.ts +8 -0
  177. package/UI/Components/Charts/ChartLibrary/Annotations/AnnotationHoverCard.tsx +176 -0
  178. package/UI/Components/Charts/ChartLibrary/Annotations/AnnotationLayout.ts +745 -0
  179. package/UI/Components/Charts/ChartLibrary/Annotations/ChartAnnotationLayer.tsx +576 -0
  180. package/UI/Components/Charts/ChartLibrary/Annotations/UseChartAnnotations.tsx +204 -0
  181. package/UI/Components/Charts/ChartLibrary/AreaChart/AreaChart.tsx +491 -544
  182. package/UI/Components/Charts/ChartLibrary/BarChart/BarChart.tsx +324 -372
  183. package/UI/Components/Charts/ChartLibrary/LineChart/LineChart.tsx +487 -540
  184. package/UI/Components/Charts/ChartLibrary/Types/FormattedReferenceRegion.ts +7 -3
  185. package/UI/Components/Charts/ChartLibrary/Types/FormattedTimeReferenceLine.ts +14 -3
  186. package/UI/Components/Charts/Types/ChartEventKind.ts +13 -0
  187. package/UI/Components/Charts/Types/ReferenceRegionProps.ts +6 -0
  188. package/UI/Components/Charts/Types/TimeReferenceLineProps.ts +20 -3
  189. package/UI/Components/Charts/Utils/TimeAnnotation.ts +69 -35
  190. package/UI/Components/Charts/Utils/XAxis.ts +125 -18
  191. package/UI/Components/EditionLabel/EditionLabel.tsx +280 -26
  192. package/UI/Components/ErrorMessage/ErrorMessage.tsx +21 -10
  193. package/UI/Components/Feed/FeedItem.tsx +4 -5
  194. package/UI/Components/Header/HeaderIconDropdownButton.tsx +1 -2
  195. package/UI/Components/Header/UserProfile/UserProfile.tsx +1 -2
  196. package/UI/Components/Image/Image.tsx +20 -3
  197. package/UI/Components/Markdown.tsx/MarkdownConverters.ts +0 -0
  198. package/UI/Components/MemberRoleAssignment/MemberRoleAssignment.tsx +1 -2
  199. package/UI/Components/ModelTable/BaseModelTable.tsx +150 -24
  200. package/UI/Components/Table/TableHeader.tsx +64 -48
  201. package/UI/Components/Table/TableRow.tsx +13 -3
  202. package/UI/Styles/Theme.css +38 -0
  203. package/Utils/EnterpriseLicense/EnterpriseLicenseSeats.ts +271 -0
  204. package/Utils/NetworkDiscovery/AutoImportRuleMatcher.ts +6 -0
  205. package/Utils/NetworkDiscovery/DiscoveredDeviceBuilder.ts +141 -10
  206. package/Utils/NetworkDiscovery/DiscoveredHostUtil.ts +55 -3
  207. package/Utils/NetworkDiscovery/ReverseDnsNameUtil.ts +151 -0
  208. package/Utils/Rules/RuleEngineLimits.ts +32 -0
  209. package/build/dist/Models/AnalyticsModels/SecurityEvent.js +48 -16
  210. package/build/dist/Models/AnalyticsModels/SecurityEvent.js.map +1 -1
  211. package/build/dist/Models/AnalyticsModels/ThreatIntelIndicator.js +10 -5
  212. package/build/dist/Models/AnalyticsModels/ThreatIntelIndicator.js.map +1 -1
  213. package/build/dist/Models/DatabaseModels/AlertSeverity.js +46 -1
  214. package/build/dist/Models/DatabaseModels/AlertSeverity.js.map +1 -1
  215. package/build/dist/Models/DatabaseModels/DetectionRule.js +16 -5
  216. package/build/dist/Models/DatabaseModels/DetectionRule.js.map +1 -1
  217. package/build/dist/Models/DatabaseModels/GoogleSecOpsConnection.js +14 -5
  218. package/build/dist/Models/DatabaseModels/GoogleSecOpsConnection.js.map +1 -1
  219. package/build/dist/Models/DatabaseModels/IncidentSeverity.js +46 -1
  220. package/build/dist/Models/DatabaseModels/IncidentSeverity.js.map +1 -1
  221. package/build/dist/Models/DatabaseModels/Index.js +2 -0
  222. package/build/dist/Models/DatabaseModels/Index.js.map +1 -1
  223. package/build/dist/Models/DatabaseModels/NetworkDevice.js +115 -3
  224. package/build/dist/Models/DatabaseModels/NetworkDevice.js.map +1 -1
  225. package/build/dist/Models/DatabaseModels/NetworkDeviceAutoImportRule.js +88 -0
  226. package/build/dist/Models/DatabaseModels/NetworkDeviceAutoImportRule.js.map +1 -1
  227. package/build/dist/Models/DatabaseModels/NetworkDeviceDiscoveryScan.js.map +1 -1
  228. package/build/dist/Models/DatabaseModels/NetworkDeviceOidTemplate.js +519 -0
  229. package/build/dist/Models/DatabaseModels/NetworkDeviceOidTemplate.js.map +1 -0
  230. package/build/dist/Models/DatabaseModels/ThreatIntelFeed.js +16 -5
  231. package/build/dist/Models/DatabaseModels/ThreatIntelFeed.js.map +1 -1
  232. package/build/dist/Server/API/GlobalConfigAPI.js +293 -176
  233. package/build/dist/Server/API/GlobalConfigAPI.js.map +1 -1
  234. package/build/dist/Server/API/TelemetryAPI.js +31 -3
  235. package/build/dist/Server/API/TelemetryAPI.js.map +1 -1
  236. package/build/dist/Server/EnvironmentConfig.js +83 -0
  237. package/build/dist/Server/EnvironmentConfig.js.map +1 -1
  238. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1790500000000-AddNetworkDeviceOidTemplate.js +26 -0
  239. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1790500000000-AddNetworkDeviceOidTemplate.js.map +1 -0
  240. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1790600000000-AddAutoImportRuleOidTemplate.js +14 -0
  241. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1790600000000-AddAutoImportRuleOidTemplate.js.map +1 -0
  242. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js +4 -0
  243. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js.map +1 -1
  244. package/build/dist/Server/Middleware/MultipartFormData.js +93 -28
  245. package/build/dist/Server/Middleware/MultipartFormData.js.map +1 -1
  246. package/build/dist/Server/Services/AlertEpisodeLabelRuleEngineService.js +8 -1
  247. package/build/dist/Server/Services/AlertEpisodeLabelRuleEngineService.js.map +1 -1
  248. package/build/dist/Server/Services/AlertEpisodeOnCallRuleEngineService.js +8 -1
  249. package/build/dist/Server/Services/AlertEpisodeOnCallRuleEngineService.js.map +1 -1
  250. package/build/dist/Server/Services/AlertEpisodeOwnerRuleEngineService.js +8 -1
  251. package/build/dist/Server/Services/AlertEpisodeOwnerRuleEngineService.js.map +1 -1
  252. package/build/dist/Server/Services/AlertEpisodePrivacyRuleEngineService.js +8 -1
  253. package/build/dist/Server/Services/AlertEpisodePrivacyRuleEngineService.js.map +1 -1
  254. package/build/dist/Server/Services/AlertGroupingEngineService.js +8 -1
  255. package/build/dist/Server/Services/AlertGroupingEngineService.js.map +1 -1
  256. package/build/dist/Server/Services/AlertLabelRuleEngineService.js +8 -1
  257. package/build/dist/Server/Services/AlertLabelRuleEngineService.js.map +1 -1
  258. package/build/dist/Server/Services/AlertOnCallRuleEngineService.js +8 -1
  259. package/build/dist/Server/Services/AlertOnCallRuleEngineService.js.map +1 -1
  260. package/build/dist/Server/Services/AlertOwnerRuleEngineService.js +8 -1
  261. package/build/dist/Server/Services/AlertOwnerRuleEngineService.js.map +1 -1
  262. package/build/dist/Server/Services/AlertPrivacyRuleEngineService.js +8 -1
  263. package/build/dist/Server/Services/AlertPrivacyRuleEngineService.js.map +1 -1
  264. package/build/dist/Server/Services/AlertReminderRuleService.js +8 -1
  265. package/build/dist/Server/Services/AlertReminderRuleService.js.map +1 -1
  266. package/build/dist/Server/Services/AutoRemediationRuleEngineService.js +8 -1
  267. package/build/dist/Server/Services/AutoRemediationRuleEngineService.js.map +1 -1
  268. package/build/dist/Server/Services/CephClusterLabelRuleEngineService.js +8 -1
  269. package/build/dist/Server/Services/CephClusterLabelRuleEngineService.js.map +1 -1
  270. package/build/dist/Server/Services/CephClusterOwnerRuleEngineService.js +8 -1
  271. package/build/dist/Server/Services/CephClusterOwnerRuleEngineService.js.map +1 -1
  272. package/build/dist/Server/Services/CloudResourceLabelRuleEngineService.js +8 -1
  273. package/build/dist/Server/Services/CloudResourceLabelRuleEngineService.js.map +1 -1
  274. package/build/dist/Server/Services/CloudResourceOwnerRuleEngineService.js +8 -1
  275. package/build/dist/Server/Services/CloudResourceOwnerRuleEngineService.js.map +1 -1
  276. package/build/dist/Server/Services/DashboardLabelRuleEngineService.js +8 -1
  277. package/build/dist/Server/Services/DashboardLabelRuleEngineService.js.map +1 -1
  278. package/build/dist/Server/Services/DashboardOwnerRuleEngineService.js +8 -1
  279. package/build/dist/Server/Services/DashboardOwnerRuleEngineService.js.map +1 -1
  280. package/build/dist/Server/Services/DockerHostLabelRuleEngineService.js +8 -1
  281. package/build/dist/Server/Services/DockerHostLabelRuleEngineService.js.map +1 -1
  282. package/build/dist/Server/Services/DockerHostOwnerRuleEngineService.js +8 -1
  283. package/build/dist/Server/Services/DockerHostOwnerRuleEngineService.js.map +1 -1
  284. package/build/dist/Server/Services/DockerSwarmClusterLabelRuleEngineService.js +8 -1
  285. package/build/dist/Server/Services/DockerSwarmClusterLabelRuleEngineService.js.map +1 -1
  286. package/build/dist/Server/Services/DockerSwarmClusterOwnerRuleEngineService.js +8 -1
  287. package/build/dist/Server/Services/DockerSwarmClusterOwnerRuleEngineService.js.map +1 -1
  288. package/build/dist/Server/Services/HostLabelRuleEngineService.js +8 -1
  289. package/build/dist/Server/Services/HostLabelRuleEngineService.js.map +1 -1
  290. package/build/dist/Server/Services/HostOwnerRuleEngineService.js +8 -1
  291. package/build/dist/Server/Services/HostOwnerRuleEngineService.js.map +1 -1
  292. package/build/dist/Server/Services/IncidentEpisodeLabelRuleEngineService.js +8 -1
  293. package/build/dist/Server/Services/IncidentEpisodeLabelRuleEngineService.js.map +1 -1
  294. package/build/dist/Server/Services/IncidentEpisodeOnCallRuleEngineService.js +8 -1
  295. package/build/dist/Server/Services/IncidentEpisodeOnCallRuleEngineService.js.map +1 -1
  296. package/build/dist/Server/Services/IncidentEpisodeOwnerRuleEngineService.js +8 -1
  297. package/build/dist/Server/Services/IncidentEpisodeOwnerRuleEngineService.js.map +1 -1
  298. package/build/dist/Server/Services/IncidentEpisodePrivacyRuleEngineService.js +8 -1
  299. package/build/dist/Server/Services/IncidentEpisodePrivacyRuleEngineService.js.map +1 -1
  300. package/build/dist/Server/Services/IncidentGroupingEngineService.js +8 -1
  301. package/build/dist/Server/Services/IncidentGroupingEngineService.js.map +1 -1
  302. package/build/dist/Server/Services/IncidentLabelRuleEngineService.js +8 -1
  303. package/build/dist/Server/Services/IncidentLabelRuleEngineService.js.map +1 -1
  304. package/build/dist/Server/Services/IncidentOnCallRuleEngineService.js +8 -1
  305. package/build/dist/Server/Services/IncidentOnCallRuleEngineService.js.map +1 -1
  306. package/build/dist/Server/Services/IncidentOwnerRuleEngineService.js +8 -1
  307. package/build/dist/Server/Services/IncidentOwnerRuleEngineService.js.map +1 -1
  308. package/build/dist/Server/Services/IncidentPrivacyRuleEngineService.js +8 -1
  309. package/build/dist/Server/Services/IncidentPrivacyRuleEngineService.js.map +1 -1
  310. package/build/dist/Server/Services/IncidentReminderRuleService.js +8 -1
  311. package/build/dist/Server/Services/IncidentReminderRuleService.js.map +1 -1
  312. package/build/dist/Server/Services/IncidentSlaRuleService.js +8 -1
  313. package/build/dist/Server/Services/IncidentSlaRuleService.js.map +1 -1
  314. package/build/dist/Server/Services/IncomingCallPolicyLabelRuleEngineService.js +8 -1
  315. package/build/dist/Server/Services/IncomingCallPolicyLabelRuleEngineService.js.map +1 -1
  316. package/build/dist/Server/Services/IncomingCallPolicyOwnerRuleEngineService.js +8 -1
  317. package/build/dist/Server/Services/IncomingCallPolicyOwnerRuleEngineService.js.map +1 -1
  318. package/build/dist/Server/Services/Index.js +2 -0
  319. package/build/dist/Server/Services/Index.js.map +1 -1
  320. package/build/dist/Server/Services/IoTFleetLabelRuleEngineService.js +8 -1
  321. package/build/dist/Server/Services/IoTFleetLabelRuleEngineService.js.map +1 -1
  322. package/build/dist/Server/Services/IoTFleetOwnerRuleEngineService.js +8 -1
  323. package/build/dist/Server/Services/IoTFleetOwnerRuleEngineService.js.map +1 -1
  324. package/build/dist/Server/Services/KubernetesClusterLabelRuleEngineService.js +8 -1
  325. package/build/dist/Server/Services/KubernetesClusterLabelRuleEngineService.js.map +1 -1
  326. package/build/dist/Server/Services/KubernetesClusterOwnerRuleEngineService.js +8 -1
  327. package/build/dist/Server/Services/KubernetesClusterOwnerRuleEngineService.js.map +1 -1
  328. package/build/dist/Server/Services/KubernetesResourceService.js +5 -1
  329. package/build/dist/Server/Services/KubernetesResourceService.js.map +1 -1
  330. package/build/dist/Server/Services/MonitorLabelRuleEngineService.js +8 -1
  331. package/build/dist/Server/Services/MonitorLabelRuleEngineService.js.map +1 -1
  332. package/build/dist/Server/Services/MonitorOwnerRuleEngineService.js +8 -1
  333. package/build/dist/Server/Services/MonitorOwnerRuleEngineService.js.map +1 -1
  334. package/build/dist/Server/Services/NetworkDeviceAutoImportRuleEngineService.js +30 -21
  335. package/build/dist/Server/Services/NetworkDeviceAutoImportRuleEngineService.js.map +1 -1
  336. package/build/dist/Server/Services/NetworkDeviceAutoImportRuleService.js +64 -0
  337. package/build/dist/Server/Services/NetworkDeviceAutoImportRuleService.js.map +1 -1
  338. package/build/dist/Server/Services/NetworkDeviceLabelRuleEngineService.js +8 -1
  339. package/build/dist/Server/Services/NetworkDeviceLabelRuleEngineService.js.map +1 -1
  340. package/build/dist/Server/Services/NetworkDeviceOidTemplateService.js +180 -0
  341. package/build/dist/Server/Services/NetworkDeviceOidTemplateService.js.map +1 -0
  342. package/build/dist/Server/Services/NetworkDeviceOwnerRuleEngineService.js +8 -1
  343. package/build/dist/Server/Services/NetworkDeviceOwnerRuleEngineService.js.map +1 -1
  344. package/build/dist/Server/Services/NetworkDeviceService.js +154 -1
  345. package/build/dist/Server/Services/NetworkDeviceService.js.map +1 -1
  346. package/build/dist/Server/Services/OnCallDutyPolicyLabelRuleEngineService.js +8 -1
  347. package/build/dist/Server/Services/OnCallDutyPolicyLabelRuleEngineService.js.map +1 -1
  348. package/build/dist/Server/Services/OnCallDutyPolicyOwnerRuleEngineService.js +8 -1
  349. package/build/dist/Server/Services/OnCallDutyPolicyOwnerRuleEngineService.js.map +1 -1
  350. package/build/dist/Server/Services/OnCallDutyPolicyScheduleLabelRuleEngineService.js +8 -1
  351. package/build/dist/Server/Services/OnCallDutyPolicyScheduleLabelRuleEngineService.js.map +1 -1
  352. package/build/dist/Server/Services/OnCallDutyPolicyScheduleOwnerRuleEngineService.js +8 -1
  353. package/build/dist/Server/Services/OnCallDutyPolicyScheduleOwnerRuleEngineService.js.map +1 -1
  354. package/build/dist/Server/Services/PodmanHostLabelRuleEngineService.js +8 -1
  355. package/build/dist/Server/Services/PodmanHostLabelRuleEngineService.js.map +1 -1
  356. package/build/dist/Server/Services/PodmanHostOwnerRuleEngineService.js +8 -1
  357. package/build/dist/Server/Services/PodmanHostOwnerRuleEngineService.js.map +1 -1
  358. package/build/dist/Server/Services/ProxmoxClusterLabelRuleEngineService.js +8 -1
  359. package/build/dist/Server/Services/ProxmoxClusterLabelRuleEngineService.js.map +1 -1
  360. package/build/dist/Server/Services/ProxmoxClusterOwnerRuleEngineService.js +8 -1
  361. package/build/dist/Server/Services/ProxmoxClusterOwnerRuleEngineService.js.map +1 -1
  362. package/build/dist/Server/Services/RumApplicationLabelRuleEngineService.js +8 -1
  363. package/build/dist/Server/Services/RumApplicationLabelRuleEngineService.js.map +1 -1
  364. package/build/dist/Server/Services/RumApplicationOwnerRuleEngineService.js +8 -1
  365. package/build/dist/Server/Services/RumApplicationOwnerRuleEngineService.js.map +1 -1
  366. package/build/dist/Server/Services/RunbookLabelRuleEngineService.js +8 -1
  367. package/build/dist/Server/Services/RunbookLabelRuleEngineService.js.map +1 -1
  368. package/build/dist/Server/Services/RunbookOwnerRuleEngineService.js +8 -1
  369. package/build/dist/Server/Services/RunbookOwnerRuleEngineService.js.map +1 -1
  370. package/build/dist/Server/Services/RunbookRuleEngineService.js +8 -1
  371. package/build/dist/Server/Services/RunbookRuleEngineService.js.map +1 -1
  372. package/build/dist/Server/Services/ScheduledMaintenanceLabelRuleEngineService.js +8 -1
  373. package/build/dist/Server/Services/ScheduledMaintenanceLabelRuleEngineService.js.map +1 -1
  374. package/build/dist/Server/Services/ScheduledMaintenanceOwnerRuleEngineService.js +8 -1
  375. package/build/dist/Server/Services/ScheduledMaintenanceOwnerRuleEngineService.js.map +1 -1
  376. package/build/dist/Server/Services/ScheduledMaintenanceReminderRuleService.js +8 -1
  377. package/build/dist/Server/Services/ScheduledMaintenanceReminderRuleService.js.map +1 -1
  378. package/build/dist/Server/Services/ServerlessFunctionLabelRuleEngineService.js +8 -1
  379. package/build/dist/Server/Services/ServerlessFunctionLabelRuleEngineService.js.map +1 -1
  380. package/build/dist/Server/Services/ServerlessFunctionOwnerRuleEngineService.js +8 -1
  381. package/build/dist/Server/Services/ServerlessFunctionOwnerRuleEngineService.js.map +1 -1
  382. package/build/dist/Server/Services/ServiceLabelRuleEngineService.js +8 -1
  383. package/build/dist/Server/Services/ServiceLabelRuleEngineService.js.map +1 -1
  384. package/build/dist/Server/Services/ServiceOwnerRuleEngineService.js +8 -1
  385. package/build/dist/Server/Services/ServiceOwnerRuleEngineService.js.map +1 -1
  386. package/build/dist/Server/Services/StatusPageLabelRuleEngineService.js +8 -1
  387. package/build/dist/Server/Services/StatusPageLabelRuleEngineService.js.map +1 -1
  388. package/build/dist/Server/Services/StatusPageMonitorRuleEngineService.js +6 -0
  389. package/build/dist/Server/Services/StatusPageMonitorRuleEngineService.js.map +1 -1
  390. package/build/dist/Server/Services/StatusPageOwnerRuleEngineService.js +8 -1
  391. package/build/dist/Server/Services/StatusPageOwnerRuleEngineService.js.map +1 -1
  392. package/build/dist/Server/Services/TelemetrySourceMapService.js +213 -19
  393. package/build/dist/Server/Services/TelemetrySourceMapService.js.map +1 -1
  394. package/build/dist/Server/Services/UserService.js +25 -0
  395. package/build/dist/Server/Services/UserService.js.map +1 -1
  396. package/build/dist/Server/Services/WorkflowLabelRuleEngineService.js +8 -1
  397. package/build/dist/Server/Services/WorkflowLabelRuleEngineService.js.map +1 -1
  398. package/build/dist/Server/Services/WorkflowOwnerRuleEngineService.js +8 -1
  399. package/build/dist/Server/Services/WorkflowOwnerRuleEngineService.js.map +1 -1
  400. package/build/dist/Server/Utils/EnterpriseLicense/EnterpriseLicenseSeatUtil.js +145 -0
  401. package/build/dist/Server/Utils/EnterpriseLicense/EnterpriseLicenseSeatUtil.js.map +1 -0
  402. package/build/dist/Server/Utils/Monitor/CapturedMetricAttributeUtil.js +201 -0
  403. package/build/dist/Server/Utils/Monitor/CapturedMetricAttributeUtil.js.map +1 -0
  404. package/build/dist/Server/Utils/Monitor/Criteria/SnmpMonitorCriteria.js +19 -2
  405. package/build/dist/Server/Utils/Monitor/Criteria/SnmpMonitorCriteria.js.map +1 -1
  406. package/build/dist/Server/Utils/Monitor/MonitorMetricUtil.js +42 -23
  407. package/build/dist/Server/Utils/Monitor/MonitorMetricUtil.js.map +1 -1
  408. package/build/dist/Server/Utils/Monitor/MonitorTemplateUtil.js +29 -0
  409. package/build/dist/Server/Utils/Monitor/MonitorTemplateUtil.js.map +1 -1
  410. package/build/dist/Server/Utils/Monitor/NetworkDeviceMetricUtil.js +11 -2
  411. package/build/dist/Server/Utils/Monitor/NetworkDeviceMetricUtil.js.map +1 -1
  412. package/build/dist/Server/Utils/Monitor/NetworkDeviceWalkUtil.js +16 -1
  413. package/build/dist/Server/Utils/Monitor/NetworkDeviceWalkUtil.js.map +1 -1
  414. package/build/dist/Server/Utils/Monitor/NetworkInventoryUtil.js +10 -0
  415. package/build/dist/Server/Utils/Monitor/NetworkInventoryUtil.js.map +1 -1
  416. package/build/dist/Server/Utils/Monitor/SeriesResourceLabels.js +33 -0
  417. package/build/dist/Server/Utils/Monitor/SeriesResourceLabels.js.map +1 -1
  418. package/build/dist/Server/Utils/Rules/RuleEngineRuleRead.js +37 -0
  419. package/build/dist/Server/Utils/Rules/RuleEngineRuleRead.js.map +1 -0
  420. package/build/dist/Server/Utils/Telemetry/ExceptionSanitizer.js +12 -1
  421. package/build/dist/Server/Utils/Telemetry/ExceptionSanitizer.js.map +1 -1
  422. package/build/dist/Server/Utils/Telemetry/LogExceptionExtractor.js +14 -2
  423. package/build/dist/Server/Utils/Telemetry/LogExceptionExtractor.js.map +1 -1
  424. package/build/dist/Server/Utils/Telemetry/SourceMapResolver.js +15 -5
  425. package/build/dist/Server/Utils/Telemetry/SourceMapResolver.js.map +1 -1
  426. package/build/dist/Server/Utils/Telemetry/StackTraceParser.js +307 -0
  427. package/build/dist/Server/Utils/Telemetry/StackTraceParser.js.map +1 -1
  428. package/build/dist/Types/Date.js +27 -0
  429. package/build/dist/Types/Date.js.map +1 -1
  430. package/build/dist/Types/Monitor/SnmpMonitor/SnmpOidListUtil.js +253 -0
  431. package/build/dist/Types/Monitor/SnmpMonitor/SnmpOidListUtil.js.map +1 -0
  432. package/build/dist/Types/Permission.js +86 -0
  433. package/build/dist/Types/Permission.js.map +1 -1
  434. package/build/dist/Types/Rum/SessionReplay.js +19 -0
  435. package/build/dist/Types/Rum/SessionReplay.js.map +1 -1
  436. package/build/dist/UI/Components/Charts/ChartLibrary/Annotations/AnnotationHoverCard.js +83 -0
  437. package/build/dist/UI/Components/Charts/ChartLibrary/Annotations/AnnotationHoverCard.js.map +1 -0
  438. package/build/dist/UI/Components/Charts/ChartLibrary/Annotations/AnnotationLayout.js +531 -0
  439. package/build/dist/UI/Components/Charts/ChartLibrary/Annotations/AnnotationLayout.js.map +1 -0
  440. package/build/dist/UI/Components/Charts/ChartLibrary/Annotations/ChartAnnotationLayer.js +264 -0
  441. package/build/dist/UI/Components/Charts/ChartLibrary/Annotations/ChartAnnotationLayer.js.map +1 -0
  442. package/build/dist/UI/Components/Charts/ChartLibrary/Annotations/UseChartAnnotations.js +122 -0
  443. package/build/dist/UI/Components/Charts/ChartLibrary/Annotations/UseChartAnnotations.js.map +1 -0
  444. package/build/dist/UI/Components/Charts/ChartLibrary/AreaChart/AreaChart.js +213 -233
  445. package/build/dist/UI/Components/Charts/ChartLibrary/AreaChart/AreaChart.js.map +1 -1
  446. package/build/dist/UI/Components/Charts/ChartLibrary/BarChart/BarChart.js +139 -152
  447. package/build/dist/UI/Components/Charts/ChartLibrary/BarChart/BarChart.js.map +1 -1
  448. package/build/dist/UI/Components/Charts/ChartLibrary/LineChart/LineChart.js +212 -232
  449. package/build/dist/UI/Components/Charts/ChartLibrary/LineChart/LineChart.js.map +1 -1
  450. package/build/dist/UI/Components/Charts/Types/ChartEventKind.js +14 -0
  451. package/build/dist/UI/Components/Charts/Types/ChartEventKind.js.map +1 -0
  452. package/build/dist/UI/Components/Charts/Utils/TimeAnnotation.js +57 -28
  453. package/build/dist/UI/Components/Charts/Utils/TimeAnnotation.js.map +1 -1
  454. package/build/dist/UI/Components/Charts/Utils/XAxis.js +103 -17
  455. package/build/dist/UI/Components/Charts/Utils/XAxis.js.map +1 -1
  456. package/build/dist/UI/Components/EditionLabel/EditionLabel.js +198 -23
  457. package/build/dist/UI/Components/EditionLabel/EditionLabel.js.map +1 -1
  458. package/build/dist/UI/Components/ErrorMessage/ErrorMessage.js +15 -5
  459. package/build/dist/UI/Components/ErrorMessage/ErrorMessage.js.map +1 -1
  460. package/build/dist/UI/Components/Feed/FeedItem.js +4 -5
  461. package/build/dist/UI/Components/Feed/FeedItem.js.map +1 -1
  462. package/build/dist/UI/Components/Header/HeaderIconDropdownButton.js +1 -2
  463. package/build/dist/UI/Components/Header/HeaderIconDropdownButton.js.map +1 -1
  464. package/build/dist/UI/Components/Header/UserProfile/UserProfile.js.map +1 -1
  465. package/build/dist/UI/Components/Image/Image.js +6 -1
  466. package/build/dist/UI/Components/Image/Image.js.map +1 -1
  467. package/build/dist/UI/Components/Markdown.tsx/MarkdownConverters.js +0 -0
  468. package/build/dist/UI/Components/Markdown.tsx/MarkdownConverters.js.map +1 -1
  469. package/build/dist/UI/Components/MemberRoleAssignment/MemberRoleAssignment.js +1 -2
  470. package/build/dist/UI/Components/MemberRoleAssignment/MemberRoleAssignment.js.map +1 -1
  471. package/build/dist/UI/Components/ModelTable/BaseModelTable.js +104 -23
  472. package/build/dist/UI/Components/ModelTable/BaseModelTable.js.map +1 -1
  473. package/build/dist/UI/Components/Table/TableHeader.js +20 -22
  474. package/build/dist/UI/Components/Table/TableHeader.js.map +1 -1
  475. package/build/dist/UI/Components/Table/TableRow.js +13 -4
  476. package/build/dist/UI/Components/Table/TableRow.js.map +1 -1
  477. package/build/dist/Utils/EnterpriseLicense/EnterpriseLicenseSeats.js +153 -0
  478. package/build/dist/Utils/EnterpriseLicense/EnterpriseLicenseSeats.js.map +1 -0
  479. package/build/dist/Utils/NetworkDiscovery/AutoImportRuleMatcher.js.map +1 -1
  480. package/build/dist/Utils/NetworkDiscovery/DiscoveredDeviceBuilder.js +127 -7
  481. package/build/dist/Utils/NetworkDiscovery/DiscoveredDeviceBuilder.js.map +1 -1
  482. package/build/dist/Utils/NetworkDiscovery/DiscoveredHostUtil.js +50 -3
  483. package/build/dist/Utils/NetworkDiscovery/DiscoveredHostUtil.js.map +1 -1
  484. package/build/dist/Utils/NetworkDiscovery/ReverseDnsNameUtil.js +132 -0
  485. package/build/dist/Utils/NetworkDiscovery/ReverseDnsNameUtil.js.map +1 -0
  486. package/build/dist/Utils/Rules/RuleEngineLimits.js +31 -0
  487. package/build/dist/Utils/Rules/RuleEngineLimits.js.map +1 -0
  488. package/jest.config.json +1 -0
  489. package/package.json +2 -2
@@ -0,0 +1,495 @@
1
+ import GlobalConfig from "../../../../Models/DatabaseModels/GlobalConfig";
2
+ import GlobalConfigService from "../../../../Server/Services/GlobalConfigService";
3
+ import EnterpriseLicenseSeatUtil from "../../../../Server/Utils/EnterpriseLicense/EnterpriseLicenseSeatUtil";
4
+ import BadDataException from "../../../../Types/Exception/BadDataException";
5
+ import ObjectID from "../../../../Types/ObjectID";
6
+ import { SeatUsage } from "../../../../Utils/EnterpriseLicense/EnterpriseLicenseSeats";
7
+ import {
8
+ beforeEach,
9
+ afterEach,
10
+ describe,
11
+ expect,
12
+ it,
13
+ jest,
14
+ } from "@jest/globals";
15
+
16
+ /*
17
+ * The half of seat enforcement that decides whether this installation
18
+ * enforces at all, and reads the license state it enforces against.
19
+ *
20
+ * Three things have to hold, and each of them is a way the feature could be
21
+ * quietly wrong rather than loudly broken:
22
+ *
23
+ * 1. It runs on self-hosted Enterprise and nowhere else. oneuptime.com bounds
24
+ * seats through subscriptions, and Community Edition has no license — a
25
+ * second, different answer on either of those would be a regression that
26
+ * nobody notices until a customer cannot sign up.
27
+ * 2. It never counts the User table when there is no limit to compare it
28
+ * against. That query runs on the create path of every user on the
29
+ * installation.
30
+ * 3. It does not exempt root. Team invitations create the invited user with
31
+ * isRoot: true, so an isRoot exemption would exempt invitations — the one
32
+ * path this was asked for.
33
+ */
34
+
35
+ let mockBillingEnabled: boolean = false;
36
+ let mockEnterpriseEdition: boolean = true;
37
+
38
+ /*
39
+ * Live accessors rather than plain values: the util reads these when it runs,
40
+ * and object spread would flatten them to whatever they were at import time.
41
+ */
42
+ jest.mock("../../../../Server/EnvironmentConfig", () => {
43
+ const actual: Record<string, unknown> = jest.requireActual(
44
+ "../../../../Server/EnvironmentConfig",
45
+ ) as Record<string, unknown>;
46
+
47
+ const mocked: Record<string, unknown> = {
48
+ ...actual,
49
+ __esModule: true,
50
+ };
51
+
52
+ Object.defineProperty(mocked, "IsBillingEnabled", {
53
+ get: (): boolean => {
54
+ return mockBillingEnabled;
55
+ },
56
+ });
57
+
58
+ Object.defineProperty(mocked, "IsEnterpriseEdition", {
59
+ get: (): boolean => {
60
+ return mockEnterpriseEdition;
61
+ },
62
+ });
63
+
64
+ return mocked;
65
+ });
66
+
67
+ jest.mock("../../../../Server/Services/GlobalConfigService", () => {
68
+ return {
69
+ __esModule: true,
70
+ default: {
71
+ findOneById: jest.fn(),
72
+ },
73
+ };
74
+ });
75
+
76
+ /*
77
+ * Both @types/jest and @jest/globals are installed, and their Mock types are
78
+ * not assignable to each other. Taking the type from jest.fn keeps fresh mocks
79
+ * on whichever one is actually in scope.
80
+ */
81
+ type MockFunction = ReturnType<typeof jest.fn>;
82
+
83
+ const INSTANCE_ID: ObjectID = ObjectID.generate();
84
+
85
+ type MakeConfigFunction = (overrides?: Record<string, unknown>) => GlobalConfig;
86
+
87
+ const makeConfig: MakeConfigFunction = (
88
+ overrides?: Record<string, unknown>,
89
+ ): GlobalConfig => {
90
+ const config: GlobalConfig = new GlobalConfig();
91
+ config.instanceId = INSTANCE_ID;
92
+ config.enterpriseLicenseUserLimit = 10;
93
+ config.enterpriseLicenseCurrentUserCount = 4;
94
+ config.enterpriseLicenseInstances = [];
95
+
96
+ return Object.assign(config, overrides || {});
97
+ };
98
+
99
+ type SetStoredConfigFunction = (config: GlobalConfig | null) => void;
100
+
101
+ const setStoredConfig: SetStoredConfigFunction = (
102
+ config: GlobalConfig | null,
103
+ ): void => {
104
+ (GlobalConfigService.findOneById as unknown as jest.Mock).mockResolvedValue(
105
+ config as never,
106
+ );
107
+ };
108
+
109
+ describe("EnterpriseLicenseSeatUtil - which installations enforce", () => {
110
+ beforeEach(() => {
111
+ jest.clearAllMocks();
112
+ mockBillingEnabled = false;
113
+ mockEnterpriseEdition = true;
114
+ setStoredConfig(makeConfig());
115
+ });
116
+
117
+ afterEach(() => {
118
+ jest.restoreAllMocks();
119
+ });
120
+
121
+ it("enforces on a self-hosted enterprise installation", () => {
122
+ expect(EnterpriseLicenseSeatUtil.isSeatLimitEnforceable()).toBe(true);
123
+ });
124
+
125
+ it("does not enforce on Community Edition", () => {
126
+ mockEnterpriseEdition = false;
127
+
128
+ expect(EnterpriseLicenseSeatUtil.isSeatLimitEnforceable()).toBe(false);
129
+ });
130
+
131
+ /*
132
+ * oneuptime.com runs with billing on and bounds seats per project through
133
+ * subscriptions (TeamMemberService.onBeforeCreate). Enforcing an enterprise
134
+ * license limit there as well would be a second answer to the same question.
135
+ */
136
+ it("does not enforce where billing is doing the bounding", () => {
137
+ mockBillingEnabled = true;
138
+
139
+ expect(EnterpriseLicenseSeatUtil.isSeatLimitEnforceable()).toBe(false);
140
+ });
141
+
142
+ it.each([
143
+ ["Community Edition", false, false],
144
+ ["billing enabled", true, true],
145
+ ])(
146
+ "returns no seat usage at all on %s, and never reads the config",
147
+ async (
148
+ _label: string,
149
+ billingEnabled: boolean,
150
+ enterpriseEdition: boolean,
151
+ ) => {
152
+ mockBillingEnabled = billingEnabled;
153
+ mockEnterpriseEdition = enterpriseEdition;
154
+
155
+ const getLocalUserCount: MockFunction = jest.fn();
156
+
157
+ const usage: SeatUsage | null =
158
+ await EnterpriseLicenseSeatUtil.getSeatUsage({
159
+ getLocalUserCount:
160
+ getLocalUserCount as unknown as () => Promise<number>,
161
+ });
162
+
163
+ expect(usage).toBeNull();
164
+ expect(GlobalConfigService.findOneById).not.toHaveBeenCalled();
165
+ expect(getLocalUserCount).not.toHaveBeenCalled();
166
+ },
167
+ );
168
+ });
169
+
170
+ describe("EnterpriseLicenseSeatUtil - reading the licence", () => {
171
+ let getLocalUserCount: MockFunction;
172
+
173
+ beforeEach(() => {
174
+ jest.clearAllMocks();
175
+ mockBillingEnabled = false;
176
+ mockEnterpriseEdition = true;
177
+ getLocalUserCount = jest.fn(async (): Promise<number> => {
178
+ return 4;
179
+ }) as unknown as MockFunction;
180
+ setStoredConfig(makeConfig());
181
+ });
182
+
183
+ afterEach(() => {
184
+ jest.restoreAllMocks();
185
+ });
186
+
187
+ type UsageFunction = () => Promise<SeatUsage | null>;
188
+
189
+ const usage: UsageFunction = (): Promise<SeatUsage | null> => {
190
+ return EnterpriseLicenseSeatUtil.getSeatUsage({
191
+ getLocalUserCount: getLocalUserCount as unknown as () => Promise<number>,
192
+ });
193
+ };
194
+
195
+ it("reads the licence columns it needs off the singleton config row", async () => {
196
+ await usage();
197
+
198
+ const call: Record<string, unknown> = (
199
+ GlobalConfigService.findOneById as unknown as jest.Mock
200
+ ).mock.calls[0]![0] as Record<string, unknown>;
201
+
202
+ expect((call["id"] as ObjectID).toString()).toBe(
203
+ ObjectID.getZeroObjectID().toString(),
204
+ );
205
+ expect(
206
+ Object.keys(call["select"] as Record<string, unknown>).sort(),
207
+ ).toEqual([
208
+ "enterpriseLicenseCurrentUserCount",
209
+ "enterpriseLicenseInstances",
210
+ "enterpriseLicenseUserLimit",
211
+ "instanceId",
212
+ ]);
213
+ expect((call["props"] as Record<string, unknown>)["isRoot"]).toBe(true);
214
+ });
215
+
216
+ it("combines the stored licence with the live user count", async () => {
217
+ getLocalUserCount = jest.fn(async (): Promise<number> => {
218
+ return 9;
219
+ }) as unknown as MockFunction;
220
+
221
+ const seatUsage: SeatUsage | null = await usage();
222
+
223
+ expect(seatUsage?.isEnforced).toBe(true);
224
+ expect(seatUsage?.userLimit).toBe(10);
225
+ expect(seatUsage?.seatsInUse).toBe(9);
226
+ expect(seatUsage?.hasSeatForNewUser).toBe(true);
227
+ });
228
+
229
+ /*
230
+ * Counting the User table on a licence that has no limit would be a query
231
+ * per user creation bought for nothing — and an unlimited licence is exactly
232
+ * the kind a large installation holds.
233
+ */
234
+ it("does not count users when the licence has no seat limit", async () => {
235
+ setStoredConfig(
236
+ makeConfig({ enterpriseLicenseUserLimit: undefined } as Record<
237
+ string,
238
+ unknown
239
+ >),
240
+ );
241
+
242
+ const seatUsage: SeatUsage | null = await usage();
243
+
244
+ expect(seatUsage?.isEnforced).toBe(false);
245
+ expect(seatUsage?.hasSeatForNewUser).toBe(true);
246
+ expect(getLocalUserCount).not.toHaveBeenCalled();
247
+ });
248
+
249
+ it("counts users exactly once when the licence does have a limit", async () => {
250
+ await usage();
251
+
252
+ expect(getLocalUserCount).toHaveBeenCalledTimes(1);
253
+ });
254
+
255
+ /*
256
+ * A fresh installation whose GlobalConfig row has not been seeded yet. There
257
+ * is no licence, so there is no limit — and certainly no reason to refuse the
258
+ * very first user.
259
+ */
260
+ it("enforces nothing when there is no config row at all", async () => {
261
+ setStoredConfig(null);
262
+
263
+ const seatUsage: SeatUsage | null = await usage();
264
+
265
+ expect(seatUsage?.isEnforced).toBe(false);
266
+ expect(seatUsage?.hasSeatForNewUser).toBe(true);
267
+ expect(getLocalUserCount).not.toHaveBeenCalled();
268
+ });
269
+
270
+ it("attributes the licence-wide overflow to the customer's other instances", async () => {
271
+ setStoredConfig(
272
+ makeConfig({
273
+ enterpriseLicenseUserLimit: 100,
274
+ enterpriseLicenseCurrentUserCount: 80,
275
+ enterpriseLicenseInstances: [
276
+ {
277
+ instanceId: INSTANCE_ID.toString(),
278
+ host: "prod.acme.internal",
279
+ userCount: 60,
280
+ lastReportedAt: "2026-01-01T00:00:00.000Z",
281
+ version: "12.0.30",
282
+ },
283
+ {
284
+ instanceId: "another-instance",
285
+ host: "staging.acme.internal",
286
+ userCount: 30,
287
+ lastReportedAt: "2026-01-01T00:00:00.000Z",
288
+ version: "12.0.30",
289
+ },
290
+ ],
291
+ }),
292
+ );
293
+
294
+ getLocalUserCount = jest.fn(async (): Promise<number> => {
295
+ return 60;
296
+ }) as unknown as MockFunction;
297
+
298
+ const seatUsage: SeatUsage | null = await usage();
299
+
300
+ expect(seatUsage?.seatsUsedByOtherInstances).toBe(20);
301
+ expect(seatUsage?.seatsInUse).toBe(80);
302
+ });
303
+
304
+ it("survives an instance list stored as something other than an array", async () => {
305
+ setStoredConfig(
306
+ makeConfig({
307
+ enterpriseLicenseInstances: "not-an-array",
308
+ } as unknown as Record<string, unknown>),
309
+ );
310
+
311
+ const seatUsage: SeatUsage | null = await usage();
312
+
313
+ expect(seatUsage?.seatsUsedByOtherInstances).toBe(0);
314
+ expect(seatUsage?.isEnforced).toBe(true);
315
+ });
316
+ });
317
+
318
+ describe("EnterpriseLicenseSeatUtil - refusing a new user", () => {
319
+ let localUserCount: number;
320
+
321
+ type AssertFunction = () => Promise<void>;
322
+
323
+ const assertSeat: AssertFunction = (): Promise<void> => {
324
+ return EnterpriseLicenseSeatUtil.assertSeatAvailableForNewUser({
325
+ getLocalUserCount: async (): Promise<number> => {
326
+ return localUserCount;
327
+ },
328
+ });
329
+ };
330
+
331
+ beforeEach(() => {
332
+ jest.clearAllMocks();
333
+ mockBillingEnabled = false;
334
+ mockEnterpriseEdition = true;
335
+ localUserCount = 4;
336
+ setStoredConfig(makeConfig());
337
+ });
338
+
339
+ afterEach(() => {
340
+ jest.restoreAllMocks();
341
+ });
342
+
343
+ it("allows a user while seats are free", async () => {
344
+ localUserCount = 9;
345
+
346
+ await expect(assertSeat()).resolves.toBeUndefined();
347
+ });
348
+
349
+ it("refuses the user that would step past the limit", async () => {
350
+ localUserCount = 10;
351
+
352
+ await expect(assertSeat()).rejects.toBeInstanceOf(BadDataException);
353
+ });
354
+
355
+ it("explains the refusal in terms the administrator can act on", async () => {
356
+ localUserCount = 10;
357
+
358
+ let message: string = "";
359
+
360
+ try {
361
+ await assertSeat();
362
+ } catch (err) {
363
+ message = (err as BadDataException).message;
364
+ }
365
+
366
+ expect(message).toContain("10");
367
+ expect(message).toContain("enterprise license");
368
+ expect(message).toContain("sales@oneuptime.com");
369
+ });
370
+
371
+ it("keeps refusing once the installation is already over the limit", async () => {
372
+ localUserCount = 40;
373
+
374
+ await expect(assertSeat()).rejects.toBeInstanceOf(BadDataException);
375
+ });
376
+
377
+ it("allows everything on a licence with no seat limit", async () => {
378
+ setStoredConfig(
379
+ makeConfig({ enterpriseLicenseUserLimit: undefined } as Record<
380
+ string,
381
+ unknown
382
+ >),
383
+ );
384
+ localUserCount = 100_000;
385
+
386
+ await expect(assertSeat()).resolves.toBeUndefined();
387
+ });
388
+
389
+ it("allows everything on Community Edition", async () => {
390
+ mockEnterpriseEdition = false;
391
+ localUserCount = 100_000;
392
+
393
+ await expect(assertSeat()).resolves.toBeUndefined();
394
+ });
395
+
396
+ it("allows everything where billing does the bounding", async () => {
397
+ mockBillingEnabled = true;
398
+ localUserCount = 100_000;
399
+
400
+ await expect(assertSeat()).resolves.toBeUndefined();
401
+ });
402
+
403
+ /*
404
+ * The seats already spoken for on the customer's other instances count
405
+ * against this one. Otherwise two instances on a 10-seat licence would each
406
+ * happily fill up to 10.
407
+ */
408
+ it("refuses when the licence is full because of another instance", async () => {
409
+ setStoredConfig(
410
+ makeConfig({
411
+ enterpriseLicenseUserLimit: 10,
412
+ enterpriseLicenseCurrentUserCount: 10,
413
+ enterpriseLicenseInstances: [
414
+ {
415
+ instanceId: INSTANCE_ID.toString(),
416
+ host: "prod.acme.internal",
417
+ userCount: 2,
418
+ lastReportedAt: "2026-01-01T00:00:00.000Z",
419
+ version: "12.0.30",
420
+ },
421
+ {
422
+ instanceId: "another-instance",
423
+ host: "staging.acme.internal",
424
+ userCount: 8,
425
+ lastReportedAt: "2026-01-01T00:00:00.000Z",
426
+ version: "12.0.30",
427
+ },
428
+ ],
429
+ }),
430
+ );
431
+
432
+ localUserCount = 2;
433
+
434
+ await expect(assertSeat()).rejects.toBeInstanceOf(BadDataException);
435
+ });
436
+ });
437
+
438
+ describe("EnterpriseLicenseSeatUtil - usage from an already-loaded config", () => {
439
+ beforeEach(() => {
440
+ jest.clearAllMocks();
441
+ mockBillingEnabled = false;
442
+ mockEnterpriseEdition = true;
443
+ });
444
+
445
+ afterEach(() => {
446
+ jest.restoreAllMocks();
447
+ });
448
+
449
+ /*
450
+ * The license endpoint has just read GlobalConfig to build its response.
451
+ * Reading it a second time to answer the same question would be silly, so
452
+ * there is an entry point that takes the row — and it has to agree exactly
453
+ * with the one that loads it.
454
+ */
455
+ it("does not go back to the database for a config it was handed", async () => {
456
+ const seatUsage: SeatUsage | null =
457
+ await EnterpriseLicenseSeatUtil.getSeatUsageForLoadedGlobalConfig({
458
+ config: makeConfig({ enterpriseLicenseUserLimit: 10 }),
459
+ getLocalUserCount: async (): Promise<number> => {
460
+ return 10;
461
+ },
462
+ });
463
+
464
+ expect(GlobalConfigService.findOneById).not.toHaveBeenCalled();
465
+ expect(seatUsage?.hasSeatForNewUser).toBe(false);
466
+ expect(seatUsage?.seatsRemaining).toBe(0);
467
+ });
468
+
469
+ it("returns null on an installation that does not enforce", async () => {
470
+ mockEnterpriseEdition = false;
471
+
472
+ const seatUsage: SeatUsage | null =
473
+ await EnterpriseLicenseSeatUtil.getSeatUsageForLoadedGlobalConfig({
474
+ config: makeConfig(),
475
+ getLocalUserCount: async (): Promise<number> => {
476
+ return 10;
477
+ },
478
+ });
479
+
480
+ expect(seatUsage).toBeNull();
481
+ });
482
+
483
+ it("handles a null config the same way as a licence with no limit", async () => {
484
+ const seatUsage: SeatUsage | null =
485
+ await EnterpriseLicenseSeatUtil.getSeatUsageForLoadedGlobalConfig({
486
+ config: null,
487
+ getLocalUserCount: async (): Promise<number> => {
488
+ return 10;
489
+ },
490
+ });
491
+
492
+ expect(seatUsage?.isEnforced).toBe(false);
493
+ expect(seatUsage?.hasSeatForNewUser).toBe(true);
494
+ });
495
+ });
@@ -68,3 +68,80 @@ describe("sanitizeStackTrace", () => {
68
68
  expect(sanitized).not.toContain("jane@customer.com");
69
69
  });
70
70
  });
71
+
72
+ /*
73
+ * Firefox and Safari indent nothing and emit no header line, so the
74
+ * indentation heuristic above classified every one of their frames as a
75
+ * header and ran the fingerprint normalizer over it — rewriting the bundle's
76
+ * content hash to <HEX_ID> and `:1:98217` to `:<LINE>:<COL>)`. That is exactly
77
+ * the file:line reference sanitizeStackTrace exists to preserve for the code
78
+ * agent, so browser frames get a second, shape-based test.
79
+ */
80
+ describe("sanitizeStackTrace - Firefox / Safari frames", () => {
81
+ const BROWSER_FRAME: string =
82
+ "handleSubmit@https://app.example.com/_nuxt/entry.a1b2c3d4.js:1:98217";
83
+
84
+ test("the header normalizer would have destroyed a browser frame", () => {
85
+ // Guards the premise: if this ever stops being true, the fix is dead code.
86
+ const normalized: string = normalizeExceptionText(BROWSER_FRAME);
87
+
88
+ expect(normalized).not.toContain("entry.a1b2c3d4.js");
89
+ expect(normalized).not.toContain(":1:98217");
90
+ });
91
+
92
+ test("preserves the frame verbatim, hash and line:col included", () => {
93
+ const sanitized: string = sanitizeStackTrace(
94
+ [
95
+ "TypeError: cannot read x of undefined for jane@customer.com",
96
+ BROWSER_FRAME,
97
+ "onClick/<@https://app.example.com/_nuxt/entry.a1b2c3d4.js:1:74102",
98
+ "@https://app.example.com/_nuxt/entry.a1b2c3d4.js:1:2211",
99
+ ].join("\n"),
100
+ );
101
+
102
+ expect(sanitized).toContain(BROWSER_FRAME);
103
+ expect(sanitized).toContain(
104
+ "@https://app.example.com/_nuxt/entry.a1b2c3d4.js:1:2211",
105
+ );
106
+ // The header above the frames is still normalized.
107
+ expect(sanitized).not.toContain("jane@customer.com");
108
+ });
109
+
110
+ test("preserves Safari pseudo-frames and self-hosted frames", () => {
111
+ const sanitized: string = sanitizeStackTrace(
112
+ [
113
+ "global code@https://app.example.com/build/main.js:1:1",
114
+ "forEach@[native code]",
115
+ "next@self-hosted:1154:9",
116
+ ].join("\n"),
117
+ );
118
+
119
+ expect(sanitized).toContain(
120
+ "global code@https://app.example.com/build/main.js:1:1",
121
+ );
122
+ expect(sanitized).toContain("forEach@[native code]");
123
+ expect(sanitized).toContain("next@self-hosted:1154:9");
124
+ });
125
+
126
+ test("still normalizes an unindented line that is not a frame", () => {
127
+ const sanitized: string = sanitizeStackTrace(
128
+ [
129
+ "failed for user jane@customer.com on host 10.2.3.4",
130
+ "handleSubmit@https://app.example.com/assets/app.js:1:2",
131
+ ].join("\n"),
132
+ );
133
+
134
+ expect(sanitized).not.toContain("jane@customer.com");
135
+ expect(sanitized).toContain(
136
+ "handleSubmit@https://app.example.com/assets/app.js:1:2",
137
+ );
138
+ });
139
+
140
+ test("leaves V8 frames exactly as they were", () => {
141
+ const sanitized: string = sanitizeStackTrace(
142
+ "Error: boom\n at charge (/app/src/billing/charge.ts:12:5)",
143
+ );
144
+
145
+ expect(sanitized).toContain("/app/src/billing/charge.ts:12:5");
146
+ });
147
+ });