@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,507 @@
1
+ import EnterpriseLicenseInstanceSummary from "../../Types/EnterpriseLicense/EnterpriseLicenseInstanceSummary";
2
+ import EnterpriseLicenseSeatsUtil, {
3
+ SeatUsage,
4
+ SeatUsageInput,
5
+ } from "../../Utils/EnterpriseLicense/EnterpriseLicenseSeats";
6
+ import { describe, expect, it } from "@jest/globals";
7
+
8
+ /*
9
+ * The arithmetic behind "you cannot add another user".
10
+ *
11
+ * An enterprise license is bought for a number of users and shared by every
12
+ * instance the customer runs on that key. Until now nothing on the customer's
13
+ * side acted on that number — the limit was mirrored into GlobalConfig, drawn
14
+ * on a progress bar, and otherwise ignored, so a 50-seat license and a 5000-
15
+ * seat license behaved identically.
16
+ *
17
+ * Deciding whether one more user fits is not a comparison, because neither
18
+ * number this installation holds is the answer:
19
+ *
20
+ * localUserCount live, and blind to the customer's other instances.
21
+ * aggregatedUserCount deduplicated across every instance, and up to a day
22
+ * old — so it does not know about the person being
23
+ * invited right now, which is the only person the check
24
+ * is about.
25
+ *
26
+ * These tests pin how those are combined, and — at least as importantly — pin
27
+ * which way every "cannot tell" case is allowed to fall. Under-enforcing is
28
+ * corrected by the next daily report. Over-enforcing locks a paying customer
29
+ * out of their own installation, so no missing, malformed or contradictory
30
+ * field is allowed to invent seats that are not there.
31
+ */
32
+
33
+ type MakeInstanceFunction = (
34
+ overrides?: Partial<EnterpriseLicenseInstanceSummary>,
35
+ ) => EnterpriseLicenseInstanceSummary;
36
+
37
+ const makeInstance: MakeInstanceFunction = (
38
+ overrides?: Partial<EnterpriseLicenseInstanceSummary>,
39
+ ): EnterpriseLicenseInstanceSummary => {
40
+ return {
41
+ instanceId: "instance-1",
42
+ host: "oneuptime.acme.internal",
43
+ userCount: 10,
44
+ lastReportedAt: "2026-01-01T00:00:00.000Z",
45
+ version: "12.0.30",
46
+ ...overrides,
47
+ };
48
+ };
49
+
50
+ type SeatsFunction = (input: Partial<SeatUsageInput>) => SeatUsage;
51
+
52
+ const seats: SeatsFunction = (input: Partial<SeatUsageInput>): SeatUsage => {
53
+ return EnterpriseLicenseSeatsUtil.getSeatUsage({
54
+ localUserCount: 0,
55
+ ...input,
56
+ } as SeatUsageInput);
57
+ };
58
+
59
+ describe("EnterpriseLicenseSeatsUtil - is there a limit at all", () => {
60
+ it("does not enforce when the license carries no seat limit", () => {
61
+ const usage: SeatUsage = seats({ userLimit: null, localUserCount: 9999 });
62
+
63
+ expect(usage.isEnforced).toBe(false);
64
+ expect(usage.userLimit).toBeNull();
65
+ expect(usage.seatsRemaining).toBeNull();
66
+ expect(usage.hasSeatForNewUser).toBe(true);
67
+ });
68
+
69
+ it("does not enforce when the seat limit was never set", () => {
70
+ expect(seats({ localUserCount: 9999 }).isEnforced).toBe(false);
71
+ expect(
72
+ seats({ userLimit: undefined, localUserCount: 9999 }).isEnforced,
73
+ ).toBe(false);
74
+ });
75
+
76
+ /*
77
+ * Zero is read as "no limit", matching the license modal and the breach
78
+ * notification job, both of which treat userLimit <= 0 as nothing to measure
79
+ * against. Reading it as "nobody may have an account" would leave a stray
80
+ * zero — a bad import, a half-filled form on oneuptime.com — unable to create
81
+ * even the first user of an installation.
82
+ */
83
+ it("treats a zero seat limit as no limit rather than no seats", () => {
84
+ const usage: SeatUsage = seats({ userLimit: 0, localUserCount: 0 });
85
+
86
+ expect(usage.isEnforced).toBe(false);
87
+ expect(usage.hasSeatForNewUser).toBe(true);
88
+ });
89
+
90
+ it("ignores a negative seat limit", () => {
91
+ expect(seats({ userLimit: -10, localUserCount: 5 }).isEnforced).toBe(false);
92
+ });
93
+
94
+ it.each([
95
+ ["a fractional limit", 10.5],
96
+ ["infinity", Number.POSITIVE_INFINITY],
97
+ ["NaN", Number.NaN],
98
+ ])("ignores %s as a seat limit", (_label: string, userLimit: number) => {
99
+ expect(seats({ userLimit: userLimit, localUserCount: 5 }).isEnforced).toBe(
100
+ false,
101
+ );
102
+ });
103
+
104
+ it("ignores a seat limit that is not a number at all", () => {
105
+ expect(
106
+ seats({
107
+ userLimit: "150" as unknown as number,
108
+ localUserCount: 5,
109
+ }).isEnforced,
110
+ ).toBe(false);
111
+ });
112
+
113
+ it("enforces the smallest real limit there is", () => {
114
+ expect(seats({ userLimit: 1, localUserCount: 0 }).hasSeatForNewUser).toBe(
115
+ true,
116
+ );
117
+ expect(seats({ userLimit: 1, localUserCount: 1 }).hasSeatForNewUser).toBe(
118
+ false,
119
+ );
120
+ });
121
+ });
122
+
123
+ describe("EnterpriseLicenseSeatsUtil - a single instance", () => {
124
+ it("has room while users are below the limit", () => {
125
+ const usage: SeatUsage = seats({ userLimit: 10, localUserCount: 7 });
126
+
127
+ expect(usage.isEnforced).toBe(true);
128
+ expect(usage.seatsInUse).toBe(7);
129
+ expect(usage.seatsRemaining).toBe(3);
130
+ expect(usage.hasSeatForNewUser).toBe(true);
131
+ });
132
+
133
+ /*
134
+ * The boundary the whole feature turns on. A license bought for 10 users
135
+ * covers the 10th; it is the 11th that has to be refused.
136
+ */
137
+ it("refuses the user that would step past the limit", () => {
138
+ expect(seats({ userLimit: 10, localUserCount: 9 }).hasSeatForNewUser).toBe(
139
+ true,
140
+ );
141
+ expect(seats({ userLimit: 10, localUserCount: 10 }).hasSeatForNewUser).toBe(
142
+ false,
143
+ );
144
+ });
145
+
146
+ it("reports no seats remaining rather than a negative number when over the limit", () => {
147
+ const usage: SeatUsage = seats({ userLimit: 10, localUserCount: 25 });
148
+
149
+ expect(usage.seatsInUse).toBe(25);
150
+ expect(usage.seatsRemaining).toBe(0);
151
+ expect(usage.hasSeatForNewUser).toBe(false);
152
+ });
153
+
154
+ it("still reports usage on an unlimited license, it just never blocks", () => {
155
+ const usage: SeatUsage = seats({ userLimit: null, localUserCount: 25 });
156
+
157
+ expect(usage.seatsInUse).toBe(25);
158
+ expect(usage.hasSeatForNewUser).toBe(true);
159
+ });
160
+
161
+ it.each([
162
+ ["a negative count", -5],
163
+ ["a fractional count", 4.5],
164
+ ["NaN", Number.NaN],
165
+ ])(
166
+ "falls back to zero local users for %s",
167
+ (_label: string, localUserCount: number) => {
168
+ expect(
169
+ seats({ userLimit: 10, localUserCount: localUserCount }).seatsInUse,
170
+ ).toBe(0);
171
+ },
172
+ );
173
+ });
174
+
175
+ describe("EnterpriseLicenseSeatsUtil - the licence-wide count", () => {
176
+ /*
177
+ * The aggregate is the only number that knows about the customer's other
178
+ * instances, so it has to be able to exhaust the limit on its own — even
179
+ * though this installation has barely any users of its own.
180
+ */
181
+ it("blocks on the licence-wide count even when this instance is nearly empty", () => {
182
+ const usage: SeatUsage = seats({
183
+ userLimit: 100,
184
+ localUserCount: 3,
185
+ aggregatedUserCount: 100,
186
+ });
187
+
188
+ expect(usage.seatsInUse).toBe(100);
189
+ expect(usage.hasSeatForNewUser).toBe(false);
190
+ });
191
+
192
+ /*
193
+ * And the live local count has to be able to exhaust it on its own too: the
194
+ * aggregate is up to a day old, so it is systematically behind on exactly
195
+ * the users this check exists to catch.
196
+ */
197
+ it("blocks on the live local count even when the last report was lower", () => {
198
+ const usage: SeatUsage = seats({
199
+ userLimit: 100,
200
+ localUserCount: 100,
201
+ aggregatedUserCount: 12,
202
+ });
203
+
204
+ expect(usage.seatsInUse).toBe(100);
205
+ expect(usage.hasSeatForNewUser).toBe(false);
206
+ });
207
+
208
+ it.each([
209
+ ["null", null],
210
+ ["undefined", undefined],
211
+ ["a negative number", -1],
212
+ ["a fraction", 12.5],
213
+ ["a string", "12" as unknown as number],
214
+ ])(
215
+ "ignores a licence-wide count of %s and falls back to the local one",
216
+ (_label: string, aggregatedUserCount: number | null | undefined) => {
217
+ const usage: SeatUsage = seats({
218
+ userLimit: 100,
219
+ localUserCount: 40,
220
+ aggregatedUserCount: aggregatedUserCount,
221
+ });
222
+
223
+ expect(usage.seatsInUse).toBe(40);
224
+ expect(usage.hasSeatForNewUser).toBe(true);
225
+ },
226
+ );
227
+ });
228
+
229
+ describe("EnterpriseLicenseSeatsUtil - several instances on one licence", () => {
230
+ /*
231
+ * The case the whole instance breakdown exists for. Two instances share a
232
+ * 100-seat license: this one has 60 users, the other 30, and 10 people have
233
+ * accounts on both. oneuptime.com deduplicates that to 80.
234
+ *
235
+ * Neither number alone is right here — 60 lets the customer overshoot, 80 is
236
+ * a day stale. Subtracting this instance's last reported count from the
237
+ * aggregate leaves the 20 seats that are somebody else's, and adding the
238
+ * live local count back gives a figure that is current here and complete
239
+ * everywhere else.
240
+ */
241
+ it("adds this instance's live users to the seats other instances hold", () => {
242
+ const usage: SeatUsage = seats({
243
+ userLimit: 100,
244
+ localUserCount: 60,
245
+ aggregatedUserCount: 80,
246
+ thisInstanceId: "instance-1",
247
+ instances: [
248
+ makeInstance({ instanceId: "instance-1", userCount: 60 }),
249
+ makeInstance({ instanceId: "instance-2", userCount: 30 }),
250
+ ],
251
+ });
252
+
253
+ expect(usage.seatsUsedByOtherInstances).toBe(20);
254
+ expect(usage.seatsInUse).toBe(80);
255
+ expect(usage.seatsRemaining).toBe(20);
256
+ expect(usage.hasSeatForNewUser).toBe(true);
257
+ });
258
+
259
+ it("sees users added here since the last report, which the aggregate cannot", () => {
260
+ const usage: SeatUsage = seats({
261
+ userLimit: 100,
262
+ // 25 people signed up since the report that said 60.
263
+ localUserCount: 85,
264
+ aggregatedUserCount: 80,
265
+ thisInstanceId: "instance-1",
266
+ instances: [
267
+ makeInstance({ instanceId: "instance-1", userCount: 60 }),
268
+ makeInstance({ instanceId: "instance-2", userCount: 30 }),
269
+ ],
270
+ });
271
+
272
+ expect(usage.seatsInUse).toBe(105);
273
+ expect(usage.seatsRemaining).toBe(0);
274
+ expect(usage.hasSeatForNewUser).toBe(false);
275
+ });
276
+
277
+ it("counts users deleted here since the last report back off the total", () => {
278
+ const usage: SeatUsage = seats({
279
+ userLimit: 100,
280
+ localUserCount: 40,
281
+ aggregatedUserCount: 80,
282
+ thisInstanceId: "instance-1",
283
+ instances: [
284
+ makeInstance({ instanceId: "instance-1", userCount: 60 }),
285
+ makeInstance({ instanceId: "instance-2", userCount: 30 }),
286
+ ],
287
+ });
288
+
289
+ // 20 seats elsewhere + 40 live here. The stale 80 no longer decides it.
290
+ expect(usage.seatsInUse).toBe(60);
291
+ expect(usage.hasSeatForNewUser).toBe(true);
292
+ });
293
+
294
+ /*
295
+ * Complete overlap: the same 60 people on both instances is 60 seats, not
296
+ * 120. Subtracting our own reported count is what stops this instance being
297
+ * charged twice for its own users.
298
+ */
299
+ it("does not double-count users who exist on more than one instance", () => {
300
+ const usage: SeatUsage = seats({
301
+ userLimit: 100,
302
+ localUserCount: 60,
303
+ aggregatedUserCount: 60,
304
+ thisInstanceId: "instance-1",
305
+ instances: [
306
+ makeInstance({ instanceId: "instance-1", userCount: 60 }),
307
+ makeInstance({ instanceId: "instance-2", userCount: 60 }),
308
+ ],
309
+ });
310
+
311
+ expect(usage.seatsUsedByOtherInstances).toBe(0);
312
+ expect(usage.seatsInUse).toBe(60);
313
+ expect(usage.hasSeatForNewUser).toBe(true);
314
+ });
315
+
316
+ /*
317
+ * The stale licence-wide figure is deliberately NOT allowed to outvote the
318
+ * live local count once the breakdown makes it decomposable. Freeing seats by
319
+ * deleting users has to free them now, not at the next daily report - which
320
+ * is the difference between a limit and a lockout.
321
+ */
322
+ it("does not let the stale licence-wide figure hold seats that were just freed", () => {
323
+ const usage: SeatUsage = seats({
324
+ userLimit: 80,
325
+ localUserCount: 40,
326
+ aggregatedUserCount: 80,
327
+ thisInstanceId: "instance-1",
328
+ instances: [
329
+ makeInstance({ instanceId: "instance-1", userCount: 60 }),
330
+ makeInstance({ instanceId: "instance-2", userCount: 30 }),
331
+ ],
332
+ });
333
+
334
+ expect(usage.seatsInUse).toBe(60);
335
+ expect(usage.hasSeatForNewUser).toBe(true);
336
+ });
337
+
338
+ it("never lets other instances hold a negative number of seats", () => {
339
+ const usage: SeatUsage = seats({
340
+ userLimit: 100,
341
+ localUserCount: 70,
342
+ // Our own last report is somehow larger than the licence-wide total.
343
+ aggregatedUserCount: 40,
344
+ thisInstanceId: "instance-1",
345
+ instances: [makeInstance({ instanceId: "instance-1", userCount: 70 })],
346
+ });
347
+
348
+ expect(usage.seatsUsedByOtherInstances).toBe(0);
349
+ expect(usage.seatsInUse).toBe(70);
350
+ });
351
+ });
352
+
353
+ describe("EnterpriseLicenseSeatsUtil - when the topology cannot be read", () => {
354
+ /*
355
+ * Every branch here resolves to "assume nothing is held elsewhere". That is
356
+ * the under-enforcing direction on purpose: the daily report corrects an
357
+ * undercount, and nothing corrects an installation that has wrongly locked
358
+ * its administrator out of adding users.
359
+ */
360
+ it.each([
361
+ ["there is no instance list", undefined],
362
+ ["the instance list is null", null],
363
+ ["the instance list is empty", []],
364
+ ])(
365
+ "attributes nothing to other instances when %s",
366
+ (
367
+ _label: string,
368
+ instances: Array<EnterpriseLicenseInstanceSummary> | null | undefined,
369
+ ) => {
370
+ const usage: SeatUsage = seats({
371
+ userLimit: 100,
372
+ localUserCount: 20,
373
+ aggregatedUserCount: 80,
374
+ thisInstanceId: "instance-1",
375
+ instances: instances,
376
+ });
377
+
378
+ expect(usage.seatsUsedByOtherInstances).toBe(0);
379
+ expect(usage.seatsInUse).toBe(80);
380
+ },
381
+ );
382
+
383
+ it("attributes nothing to other instances when this instance has no id", () => {
384
+ const usage: SeatUsage = seats({
385
+ userLimit: 100,
386
+ localUserCount: 20,
387
+ aggregatedUserCount: 80,
388
+ thisInstanceId: null,
389
+ instances: [makeInstance({ instanceId: "instance-2", userCount: 80 })],
390
+ });
391
+
392
+ expect(usage.seatsUsedByOtherInstances).toBe(0);
393
+ expect(usage.seatsInUse).toBe(80);
394
+ });
395
+
396
+ /*
397
+ * The dangerous reading of "we are not in the list" is "then the whole
398
+ * aggregate belongs to somebody else". It is right for an instance that has
399
+ * genuinely never registered, and catastrophic for one whose instance id
400
+ * changed after its users had already been counted under the old one — that
401
+ * installation would be charged twice for every user it has and could lock
402
+ * itself out. It is not taken.
403
+ */
404
+ it("does not assume the whole aggregate is somebody else's when this instance is missing from the list", () => {
405
+ const usage: SeatUsage = seats({
406
+ userLimit: 100,
407
+ localUserCount: 80,
408
+ aggregatedUserCount: 80,
409
+ thisInstanceId: "instance-that-was-renamed",
410
+ instances: [makeInstance({ instanceId: "instance-1", userCount: 80 })],
411
+ });
412
+
413
+ expect(usage.seatsUsedByOtherInstances).toBe(0);
414
+ expect(usage.seatsInUse).toBe(80);
415
+ expect(usage.hasSeatForNewUser).toBe(true);
416
+ });
417
+
418
+ it.each([
419
+ ["null", null],
420
+ ["a fraction", 12.5 as unknown as number],
421
+ ["a string", "60" as unknown as number],
422
+ ])(
423
+ "attributes nothing to other instances when our own reported count is %s",
424
+ (_label: string, userCount: number | null) => {
425
+ const usage: SeatUsage = seats({
426
+ userLimit: 100,
427
+ localUserCount: 20,
428
+ aggregatedUserCount: 80,
429
+ thisInstanceId: "instance-1",
430
+ instances: [
431
+ makeInstance({ instanceId: "instance-1", userCount: userCount }),
432
+ ],
433
+ });
434
+
435
+ expect(usage.seatsUsedByOtherInstances).toBe(0);
436
+ expect(usage.seatsInUse).toBe(80);
437
+ },
438
+ );
439
+
440
+ it("survives a malformed entry in the instance list", () => {
441
+ const usage: SeatUsage = seats({
442
+ userLimit: 100,
443
+ localUserCount: 60,
444
+ aggregatedUserCount: 80,
445
+ thisInstanceId: "instance-1",
446
+ instances: [
447
+ null as unknown as EnterpriseLicenseInstanceSummary,
448
+ makeInstance({ instanceId: "instance-1", userCount: 60 }),
449
+ ],
450
+ });
451
+
452
+ expect(usage.seatsUsedByOtherInstances).toBe(20);
453
+ expect(usage.seatsInUse).toBe(80);
454
+ });
455
+
456
+ it("matches this instance by its id even with surrounding whitespace", () => {
457
+ const usage: SeatUsage = seats({
458
+ userLimit: 100,
459
+ localUserCount: 60,
460
+ aggregatedUserCount: 80,
461
+ thisInstanceId: " instance-1 ",
462
+ instances: [makeInstance({ instanceId: "instance-1", userCount: 60 })],
463
+ });
464
+
465
+ expect(usage.seatsUsedByOtherInstances).toBe(20);
466
+ });
467
+ });
468
+
469
+ describe("EnterpriseLicenseSeatsUtil - the message an administrator reads", () => {
470
+ it("names the limit, the usage and what to do about it", () => {
471
+ const message: string =
472
+ EnterpriseLicenseSeatsUtil.getSeatLimitReachedMessage({
473
+ seatsInUse: 150,
474
+ userLimit: 150,
475
+ });
476
+
477
+ expect(message).toContain("150");
478
+ expect(message).toContain("sales@oneuptime.com");
479
+ expect(message).toContain("Refresh license");
480
+ });
481
+
482
+ it("does not say 1 users", () => {
483
+ const message: string =
484
+ EnterpriseLicenseSeatsUtil.getSeatLimitReachedMessage({
485
+ seatsInUse: 1,
486
+ userLimit: 1,
487
+ });
488
+
489
+ expect(message).toContain("1-user limit");
490
+ expect(message).not.toContain("1 users");
491
+ });
492
+
493
+ /*
494
+ * The message is shown to a person who is being told no. It must not read
495
+ * like a bug, so it always states both halves of the arithmetic.
496
+ */
497
+ it("states the usage even when it exceeds the limit", () => {
498
+ const message: string =
499
+ EnterpriseLicenseSeatsUtil.getSeatLimitReachedMessage({
500
+ seatsInUse: 212,
501
+ userLimit: 150,
502
+ });
503
+
504
+ expect(message).toContain("150");
505
+ expect(message).toContain("212");
506
+ });
507
+ });