@oneuptime/common 13.0.8 → 14.0.1

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 (514) hide show
  1. package/Models/AnalyticsModels/AuditLog.ts +23 -15
  2. package/Models/DatabaseModels/GlobalConfig.ts +24 -0
  3. package/Models/DatabaseModels/Index.ts +4 -0
  4. package/Models/DatabaseModels/Monitor.ts +3 -2
  5. package/Models/DatabaseModels/MonitorTemplate.ts +2 -1
  6. package/Models/DatabaseModels/ServiceLevelObjectiveFeed.ts +2 -0
  7. package/Models/DatabaseModels/ServiceLevelObjectiveLabelRule.ts +522 -0
  8. package/Models/DatabaseModels/ServiceLevelObjectiveMonitorRule.ts +38 -4
  9. package/Models/DatabaseModels/ServiceLevelObjectiveOwnerRule.ts +603 -0
  10. package/Scripts/generate-service-worker.js +65 -4
  11. package/Server/API/BaseAPI.ts +26 -5
  12. package/Server/API/GlobalConfigAPI.ts +228 -462
  13. package/Server/API/ProjectOIDC.ts +25 -16
  14. package/Server/API/ProjectSSO.ts +24 -16
  15. package/Server/API/StatusPageAPI.ts +100 -42
  16. package/Server/API/TeamMemberAPI.ts +10 -1
  17. package/Server/Enterprise/EnterpriseEdition.ts +649 -0
  18. package/Server/Enterprise/EnterpriseFeature.ts +48 -0
  19. package/Server/Enterprise/EnterpriseLicenseSnapshot.ts +192 -0
  20. package/Server/Enterprise/EnterpriseServerModule.ts +233 -0
  21. package/Server/EnvironmentConfig.ts +147 -2
  22. package/Server/Infrastructure/Postgres/SchemaMigrations/1793900000000-AddEnterpriseEditionFirstSeenAt.ts +25 -0
  23. package/Server/Infrastructure/Postgres/SchemaMigrations/1794100000000-AddSloLabelAndOwnerRules.ts +248 -0
  24. package/Server/Infrastructure/Postgres/SchemaMigrations/1794200000000-AddSloMonitorRuleMonitorType.ts +19 -0
  25. package/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts +6 -0
  26. package/Server/Middleware/UserAuthorization.ts +38 -16
  27. package/Server/Services/AuditLogService.ts +84 -1079
  28. package/Server/Services/DatabaseService.ts +10 -0
  29. package/Server/Services/EnterpriseLicenseService.ts +38 -0
  30. package/Server/Services/GlobalConfigService.ts +80 -1
  31. package/Server/Services/Index.ts +4 -0
  32. package/Server/Services/MonitorProbeService.ts +116 -20
  33. package/Server/Services/MonitorService.ts +59 -6
  34. package/Server/Services/MonitorStatusTimelineService.ts +284 -0
  35. package/Server/Services/MonitorTemplateService.ts +26 -0
  36. package/Server/Services/ProjectService.ts +284 -0
  37. package/Server/Services/RumSessionPinService.ts +25 -6
  38. package/Server/Services/ServiceLevelObjectiveLabelRuleEngineService.ts +385 -0
  39. package/Server/Services/ServiceLevelObjectiveLabelRuleService.ts +51 -0
  40. package/Server/Services/ServiceLevelObjectiveMonitorRuleEngineService.ts +92 -16
  41. package/Server/Services/ServiceLevelObjectiveMonitorRuleService.ts +36 -1
  42. package/Server/Services/ServiceLevelObjectiveOwnerRuleEngineService.ts +521 -0
  43. package/Server/Services/ServiceLevelObjectiveOwnerRuleService.ts +51 -0
  44. package/Server/Services/ServiceLevelObjectiveService.ts +28 -0
  45. package/Server/Services/StatusPagePrivateUserService.ts +7 -3
  46. package/Server/Services/StatusPageService.ts +78 -1
  47. package/Server/Services/TeamMemberService.ts +11 -0
  48. package/Server/Services/TeamService.ts +10 -0
  49. package/Server/Services/UserService.ts +10 -17
  50. package/Server/Types/Database/Permissions/CreatePermission.ts +15 -0
  51. package/Server/Types/Database/Permissions/EditionPermission.ts +208 -18
  52. package/Server/Types/Database/Permissions/TablePermission.ts +10 -3
  53. package/Server/Types/Database/Permissions/UpdatePermission.ts +29 -0
  54. package/Server/Types/Markdown.ts +41 -0
  55. package/Server/Types/Workflow/Components/Telegram/SendMessageToChat.ts +27 -1
  56. package/Server/Utils/AI/Toolbox/SloTools.ts +1 -0
  57. package/Server/Utils/CommunityEditionSsoReport.ts +361 -0
  58. package/Server/Utils/EditionEnforcement.ts +233 -0
  59. package/Server/Utils/FrontendEnvironment.ts +41 -2
  60. package/Server/Utils/InstanceHealth/RedisHealth.ts +12 -277
  61. package/Server/Utils/Monitor/AffectedResourceList.ts +148 -0
  62. package/Server/Utils/Monitor/Criteria/CompareCriteria.ts +1 -1
  63. package/Server/Utils/Monitor/Criteria/EvaluateOverTime.ts +10 -1
  64. package/Server/Utils/Monitor/Criteria/MetricMonitorCriteria.ts +1 -1
  65. package/Server/Utils/Monitor/MonitorCriteriaEvaluator.ts +720 -465
  66. package/Server/Utils/Monitor/MonitoringIntervalValidator.ts +116 -0
  67. package/Server/Utils/Monitor/RootCauseList.ts +139 -0
  68. package/Server/Utils/Rules/RuleRun/RuleRunRegistry.ts +28 -0
  69. package/Server/Utils/Slo/SloRulePatternValidator.ts +42 -0
  70. package/Server/Utils/Workspace/Slack/Slack.ts +423 -10
  71. package/Tests/App/Accounts/LoginPasskey.test.tsx +18 -0
  72. package/Tests/App/Accounts/LoginSsoEdition.test.tsx +616 -0
  73. package/Tests/App/AdminDashboard/AdminAuthenticationSsoEdition.test.tsx +217 -0
  74. package/Tests/App/AdminDashboard/AdminEnterprisePluginPage.test.tsx +357 -0
  75. package/Tests/App/AdminDashboard/EnterpriseLicensesShell.test.tsx +214 -0
  76. package/Tests/App/AdminDashboard/GlobalSSOEnterpriseShells.test.tsx +271 -0
  77. package/Tests/App/AdminDashboard/HealthShells.test.tsx +659 -0
  78. package/Tests/App/Dashboard/AuditLogsAndComplianceShells.test.tsx +572 -0
  79. package/Tests/App/Dashboard/EnterpriseFeatureUpgrade.test.tsx +547 -0
  80. package/Tests/App/Dashboard/EnterprisePluginPage.test.tsx +667 -0
  81. package/Tests/App/Dashboard/FeedFilterSortIntegration.test.tsx +1632 -0
  82. package/Tests/App/Dashboard/FeedOptionsLocales.test.ts +250 -0
  83. package/Tests/App/Dashboard/FeedOrdering.test.ts +279 -9
  84. package/Tests/App/Dashboard/IdentityEnterpriseShells.test.tsx +319 -0
  85. package/Tests/App/Dashboard/InvestigationFeedRefresh.test.tsx +60 -1
  86. package/Tests/App/Dashboard/InvestigationPanel.test.tsx +594 -3
  87. package/Tests/App/Dashboard/OnboardingSsoEmptyState.test.tsx +185 -0
  88. package/Tests/App/Dashboard/ProductOrientation.test.tsx +646 -0
  89. package/Tests/App/Dashboard/ResourceFeed.test.tsx +612 -2
  90. package/Tests/App/Dashboard/ResourceFeedPageWiring.test.ts +30 -0
  91. package/Tests/App/Dashboard/ResourceFeedPagesFilterSort.test.tsx +1202 -0
  92. package/Tests/App/Dashboard/ScheduledMaintenanceFeedRefresh.test.tsx +52 -1
  93. package/Tests/App/Dashboard/SecurityEventConnectionDiagnostics.test.tsx +45 -9
  94. package/Tests/App/Dashboard/SecurityEventDetailPanel.test.tsx +399 -0
  95. package/Tests/App/Dashboard/SecurityEventListRow.test.tsx +214 -0
  96. package/Tests/App/Dashboard/SecurityEventsEmptyState.test.tsx +1 -83
  97. package/Tests/App/Dashboard/SecurityEventsNavTabs.test.tsx +248 -0
  98. package/Tests/App/Dashboard/SecurityEventsViewer.test.tsx +1203 -0
  99. package/Tests/App/Dashboard/SloFeed.test.tsx +106 -1
  100. package/Tests/App/Dashboard/SloMonitorRuleCriteria.test.tsx +566 -0
  101. package/Tests/App/Dashboard/SloNavigationWiring.test.tsx +6 -4
  102. package/Tests/App/Dashboard/SloNoticeBanner.test.tsx +186 -0
  103. package/Tests/App/Dashboard/SloOverviewKpiStrip.test.tsx +388 -44
  104. package/Tests/App/Dashboard/SloOverviewLayout.test.tsx +613 -0
  105. package/Tests/App/Dashboard/UserEmailCallSites.test.tsx +11 -91
  106. package/Tests/App/StatusPage/StatusPageSsoEmptyState.test.tsx +319 -0
  107. package/Tests/Helpers/RefreshAwareApiScan.ts +757 -0
  108. package/Tests/Helpers/TenantScopedRequestScan.ts +515 -0
  109. package/Tests/Models/DatabaseModels/ResourceFeedModels.test.ts +0 -8
  110. package/Tests/Models/DatabaseModels/SloLabelAndOwnerRuleModels.test.ts +404 -0
  111. package/Tests/Models/DatabaseModels/SloOverhaulModels.test.ts +17 -1
  112. package/Tests/Models/DatabaseModels/StaticRuleCriteriaInheritance.test.ts +4 -2
  113. package/Tests/Scripts/GenerateServiceWorker.test.ts +931 -0
  114. package/Tests/Server/API/BaseAPICreateItemDoesNotMutateModel.test.ts +130 -0
  115. package/Tests/Server/API/GlobalConfigLicense.test.ts +742 -497
  116. package/Tests/Server/API/OnCallReadinessAPI.test.ts +35 -909
  117. package/Tests/Server/API/SsoProviderListingsEdition.test.ts +432 -0
  118. package/Tests/Server/API/TeamMemberLeaveScimLockEdition.test.ts +252 -0
  119. package/Tests/Server/Enterprise/EnterpriseEdition.test.ts +824 -0
  120. package/Tests/Server/Enterprise/EnterpriseFeatureActive.test.ts +643 -0
  121. package/Tests/Server/Enterprise/EnterpriseLicenseSnapshot.test.ts +294 -0
  122. package/Tests/Server/Enterprise/EnterpriseModelFeatureMap.test.ts +93 -0
  123. package/Tests/Server/Enterprise/EnterpriseOnlyModulesLiveInEe.test.ts +582 -0
  124. package/Tests/Server/Enterprise/EnterpriseServerModule.test.ts +247 -0
  125. package/Tests/Server/Enterprise/FakeEnterpriseModule.ts +502 -0
  126. package/Tests/Server/Enterprise/TestBillingFlag.ts +70 -0
  127. package/Tests/Server/EnvironmentConfigEnterpriseEdition.test.ts +314 -0
  128. package/Tests/Server/Infrastructure/ContainerBootConfiguration.test.ts +289 -0
  129. package/Tests/Server/Infrastructure/E2EClickHouseFixtureAccess.test.ts +5 -1
  130. package/Tests/Server/Infrastructure/Postgres/AddConfigurableRuleCriteriaMigration.test.ts +3 -0
  131. package/Tests/Server/Infrastructure/Postgres/AddSloLabelAndOwnerRulesMigration.test.ts +407 -0
  132. package/Tests/Server/Infrastructure/Postgres/AddSloMonitorRuleMonitorTypeMigration.test.ts +171 -0
  133. package/Tests/Server/Infrastructure/Postgres/SloProductOverhaulMigration.test.ts +88 -4
  134. package/Tests/Server/Middleware/UserAuthorization.test.ts +37 -2
  135. package/Tests/Server/Middleware/UserAuthorizationEditionEnforcement.test.ts +516 -0
  136. package/Tests/Server/Services/AuditLogService.test.ts +460 -990
  137. package/Tests/Server/Services/CreateAndReadResponsesKeepIds.test.ts +263 -0
  138. package/Tests/Server/Services/DatabaseServiceRuleCriteriaValidation.test.ts +104 -0
  139. package/Tests/Server/Services/EnterpriseLicenseServiceKeyGeneration.test.ts +151 -0
  140. package/Tests/Server/Services/GlobalConfigServiceLicenseColumns.test.ts +357 -0
  141. package/Tests/Server/Services/MonitorDestinationInfoIPv6.test.ts +101 -0
  142. package/Tests/Server/Services/MonitorProbeServiceIntervalScheduling.test.ts +333 -0
  143. package/Tests/Server/Services/MonitorStatusTimelineDailyAggregates.test.ts +303 -0
  144. package/Tests/Server/Services/ProjectServiceAuditLogLicense.test.ts +701 -0
  145. package/Tests/Server/Services/ProjectServiceAuditLogSettingsCache.test.ts +31 -35
  146. package/Tests/Server/Services/RuleRun/LabelRuleEnginesGroupBRun.test.ts +48 -1
  147. package/Tests/Server/Services/RuleRun/OwnerRuleEnginesGroupBRun.test.ts +30 -0
  148. package/Tests/Server/Services/ScimPushGroupsTeamLocksEdition.test.ts +431 -0
  149. package/Tests/Server/Services/ServiceLevelObjectiveLabelAndOwnerRuleEngines.test.ts +1170 -0
  150. package/Tests/Server/Services/ServiceLevelObjectiveLabelAndOwnerRuleServices.test.ts +172 -0
  151. package/Tests/Server/Services/ServiceLevelObjectiveMonitorRuleEngineService.test.ts +323 -0
  152. package/Tests/Server/Services/ServiceLevelObjectiveMonitorRuleService.test.ts +115 -0
  153. package/Tests/Server/Services/ServiceLevelObjectiveMonitorRuleTriggers.test.ts +21 -2
  154. package/Tests/Server/Services/ServiceLevelObjectiveMonitorTypePostgres.test.ts +480 -0
  155. package/Tests/Server/Services/ServiceLevelObjectiveService.test.ts +162 -0
  156. package/Tests/Server/Services/SsoRequirementReadMasking.test.ts +419 -0
  157. package/Tests/Server/Services/SsoRequirementWriteGuard.test.ts +769 -0
  158. package/Tests/Server/Services/StaticRuleCriteriaRuntimeCoverage.test.ts +45 -6
  159. package/Tests/Server/Services/StatusPagePrivateUserInvitationPolicy.test.ts +94 -0
  160. package/Tests/Server/Services/UserAuthenticationService.test.ts +35 -0
  161. package/Tests/Server/Services/UserServiceSeatLimit.test.ts +94 -56
  162. package/Tests/Server/Types/Database/FeedEventTypeFilterQuery.test.ts +745 -0
  163. package/Tests/Server/Types/Database/Permissions/EditionPermission.test.ts +1823 -0
  164. package/Tests/Server/Types/Markdown.test.ts +183 -1
  165. package/Tests/Server/Types/Workflow/Components/ApiComponentSsrf.test.ts +49 -0
  166. package/Tests/Server/Types/Workflow/Components/TelegramSendMessageToChat.test.ts +331 -0
  167. package/Tests/Server/Utils/AI/SloTools.test.ts +10 -0
  168. package/Tests/Server/Utils/CommunityEditionSsoReport.test.ts +565 -0
  169. package/Tests/Server/Utils/EditionEnforcement.test.ts +303 -0
  170. package/Tests/Server/Utils/FrontendEnvironment.test.ts +367 -0
  171. package/Tests/Server/Utils/InstanceHealth/RedisHealth.test.ts +38 -418
  172. package/Tests/Server/Utils/Monitor/AffectedResourceList.test.ts +518 -0
  173. package/Tests/Server/Utils/Monitor/Criteria/EvaluateOverTime.test.ts +24 -4
  174. package/Tests/Server/Utils/Monitor/Criteria/MetricMonitorCriteriaAnomalyUnits.test.ts +1 -1
  175. package/Tests/Server/Utils/Monitor/MonitorCriteriaEvaluator.test.ts +1339 -96
  176. package/Tests/Server/Utils/Monitor/MonitorCriteriaEvaluatorBreachingSamples.test.ts +1101 -0
  177. package/Tests/Server/Utils/Monitor/MonitorCriteriaEvaluatorMetricUnits.test.ts +106 -80
  178. package/Tests/Server/Utils/Monitor/MonitoringIntervalValidator.test.ts +188 -0
  179. package/Tests/Server/Utils/Monitor/RootCauseList.test.ts +252 -0
  180. package/Tests/Server/Utils/Rules/RuleRun/RuleRunPermission.test.ts +154 -0
  181. package/Tests/Server/Utils/SSRFProtection.test.ts +111 -0
  182. package/Tests/Server/Utils/Slo/SloRulePatternValidator.test.ts +67 -0
  183. package/Tests/Server/Utils/VM/VMRunnerSsrf.test.ts +213 -0
  184. package/Tests/Server/Utils/Workspace/Slack/SlackMarkdownSectionSplit.test.ts +1209 -0
  185. package/Tests/Types/API/HostnameFromAuthority.test.ts +20 -10
  186. package/Tests/Types/API/HostnameIPv6.test.ts +149 -0
  187. package/Tests/Types/API/Route.test.ts +56 -0
  188. package/Tests/Types/API/URLSchemeLikePath.test.ts +304 -0
  189. package/Tests/Types/Database/CanonicalModelInstance.test.ts +190 -0
  190. package/Tests/UI/Components/EditionLabelLapseCopy.ts +104 -0
  191. package/Tests/UI/Components/EditionLabelLicenseManagerWiring.test.tsx +254 -0
  192. package/Tests/UI/Components/EditionLabelLicenseRefresh.test.tsx +84 -178
  193. package/Tests/UI/Components/EditionLabelLicenseStatus.test.tsx +1586 -0
  194. package/Tests/UI/Components/EditionLabelLicenseWritesGuard.test.tsx +157 -0
  195. package/Tests/UI/Components/FeedOptions.test.ts +1404 -0
  196. package/Tests/UI/Components/FeedOptionsButton.test.tsx +2603 -0
  197. package/Tests/UI/Components/Graphs/DayUptimeGraph.test.tsx +49 -2
  198. package/Tests/UI/Components/Icon.test.tsx +26 -0
  199. package/Tests/UI/Components/MarkdownConverters.test.ts +684 -0
  200. package/Tests/UI/Components/ModelListEmptyState.test.tsx +289 -0
  201. package/Tests/UI/Components/RuleCriteria/RuleCriteriaModelTable.test.tsx +3 -3
  202. package/Tests/UI/Components/TelemetryViewer/TelemetryViewerEmptyContent.test.tsx +131 -0
  203. package/Tests/UI/Components/useFeedItemsViewKey.test.tsx +1017 -0
  204. package/Tests/UI/Components/useFeedOptions.test.tsx +1107 -0
  205. package/Tests/UI/EsbuildEnterpriseAlias.test.ts +1127 -0
  206. package/Tests/Utils/HostAddressUtil.test.ts +138 -0
  207. package/Tests/Utils/LabelRuleImportExport.test.ts +102 -0
  208. package/Tests/Utils/Monitor/MonitorDestinationUtil.test.ts +313 -0
  209. package/Tests/Utils/Monitor/MonitoringIntervalUtil.test.ts +304 -0
  210. package/Tests/Utils/Slo/SloDuration.test.ts +115 -24
  211. package/Tests/Utils/Slo/SloHealth.test.ts +93 -10
  212. package/Tests/Utils/Slo/SloMonitorRuleCriteria.test.ts +109 -0
  213. package/Tests/Utils/Slo/SloOverviewText.test.ts +64 -0
  214. package/Tests/Utils/StatusPage/UptimeDailyAggregateUtil.test.ts +248 -0
  215. package/Types/API/Hostname.ts +63 -16
  216. package/Types/API/Route.ts +19 -2
  217. package/Types/API/URL.ts +26 -2
  218. package/Types/Database/AccessControl/ColumnAccessControl.ts +19 -7
  219. package/Types/Database/AccessControl/ColumnBillingAccessControl.ts +19 -7
  220. package/Types/Database/AccessControl/OwnerOnlyColumn.ts +15 -6
  221. package/Types/Database/CanonicalModelInstance.ts +102 -0
  222. package/Types/Database/TableColumn.ts +20 -6
  223. package/Types/EnterpriseLicense/EnterpriseLicensePeriods.ts +29 -0
  224. package/Types/IP/IPv6.ts +6 -1
  225. package/Types/Monitor/MetricMonitor/MetricCriteriaContext.ts +6 -5
  226. package/Types/Monitor/MetricMonitor/MetricMonitorResponse.ts +9 -0
  227. package/Types/Monitor/MonitorStep.ts +6 -1
  228. package/Types/Monitor/ProxmoxAlertTemplates.ts +1 -1
  229. package/Types/Permission.ts +90 -0
  230. package/Types/Rules/RuleCriteriaFieldRegistry.ts +11 -0
  231. package/Types/Rules/RuleRun.ts +4 -0
  232. package/Types/StatusPage/UptimeDailyAggregate.ts +110 -0
  233. package/UI/Components/EditionLabel/EditionLabel.tsx +796 -1195
  234. package/UI/Components/EditionLabel/LicenseManager.ts +119 -0
  235. package/UI/Components/Feed/FeedOptions.ts +427 -0
  236. package/UI/Components/Feed/FeedOptionsButton.tsx +692 -0
  237. package/UI/Components/Feed/useFeedItems.ts +28 -9
  238. package/UI/Components/Feed/useFeedOptions.ts +225 -0
  239. package/UI/Components/Graphs/DayUptimeGraph.tsx +123 -15
  240. package/UI/Components/Icon/Icon.tsx +1 -1
  241. package/UI/Components/Markdown.tsx/MarkdownConverters.ts +0 -0
  242. package/UI/Components/ModelList/ModelList.tsx +11 -1
  243. package/UI/Components/MonitorGraphs/Uptime.tsx +69 -0
  244. package/UI/Components/TelemetryViewer/TelemetryViewer.tsx +28 -12
  245. package/UI/esbuild-enterprise.js +263 -0
  246. package/Utils/EnterpriseLicense/EnterpriseLicenseUsage.ts +7 -2
  247. package/Utils/HostAddressUtil.ts +94 -0
  248. package/Utils/LabelRuleImportExport.ts +27 -9
  249. package/Utils/Monitor/MetricValueFormatter.ts +2 -2
  250. package/Utils/Monitor/MonitorDestinationUtil.ts +157 -0
  251. package/Utils/Monitor/MonitoringIntervalUtil.ts +436 -0
  252. package/Utils/Rules/MonitorTypeRuleCriteria.ts +31 -0
  253. package/Utils/Slo/SloDuration.ts +22 -6
  254. package/Utils/Slo/SloHealth.ts +8 -7
  255. package/Utils/Slo/SloMonitorRuleCriteria.ts +33 -1
  256. package/Utils/Slo/SloOverviewText.ts +33 -0
  257. package/Utils/Slo/SloProjection.ts +4 -3
  258. package/Utils/StatusPage/UptimeDailyAggregateUtil.ts +192 -0
  259. package/build/dist/Models/AnalyticsModels/AuditLog.js +23 -15
  260. package/build/dist/Models/AnalyticsModels/AuditLog.js.map +1 -1
  261. package/build/dist/Models/DatabaseModels/GlobalConfig.js +25 -0
  262. package/build/dist/Models/DatabaseModels/GlobalConfig.js.map +1 -1
  263. package/build/dist/Models/DatabaseModels/Index.js +4 -0
  264. package/build/dist/Models/DatabaseModels/Index.js.map +1 -1
  265. package/build/dist/Models/DatabaseModels/Monitor.js +2 -2
  266. package/build/dist/Models/DatabaseModels/Monitor.js.map +1 -1
  267. package/build/dist/Models/DatabaseModels/MonitorTemplate.js +2 -1
  268. package/build/dist/Models/DatabaseModels/MonitorTemplate.js.map +1 -1
  269. package/build/dist/Models/DatabaseModels/ServiceLevelObjectiveFeed.js +2 -0
  270. package/build/dist/Models/DatabaseModels/ServiceLevelObjectiveFeed.js.map +1 -1
  271. package/build/dist/Models/DatabaseModels/ServiceLevelObjectiveLabelRule.js +530 -0
  272. package/build/dist/Models/DatabaseModels/ServiceLevelObjectiveLabelRule.js.map +1 -0
  273. package/build/dist/Models/DatabaseModels/ServiceLevelObjectiveMonitorRule.js +39 -4
  274. package/build/dist/Models/DatabaseModels/ServiceLevelObjectiveMonitorRule.js.map +1 -1
  275. package/build/dist/Models/DatabaseModels/ServiceLevelObjectiveOwnerRule.js +612 -0
  276. package/build/dist/Models/DatabaseModels/ServiceLevelObjectiveOwnerRule.js.map +1 -0
  277. package/build/dist/Server/API/BaseAPI.js +26 -5
  278. package/build/dist/Server/API/BaseAPI.js.map +1 -1
  279. package/build/dist/Server/API/GlobalConfigAPI.js +148 -344
  280. package/build/dist/Server/API/GlobalConfigAPI.js.map +1 -1
  281. package/build/dist/Server/API/ProjectOIDC.js +24 -16
  282. package/build/dist/Server/API/ProjectOIDC.js.map +1 -1
  283. package/build/dist/Server/API/ProjectSSO.js +24 -16
  284. package/build/dist/Server/API/ProjectSSO.js.map +1 -1
  285. package/build/dist/Server/API/StatusPageAPI.js +93 -43
  286. package/build/dist/Server/API/StatusPageAPI.js.map +1 -1
  287. package/build/dist/Server/API/TeamMemberAPI.js +8 -1
  288. package/build/dist/Server/API/TeamMemberAPI.js.map +1 -1
  289. package/build/dist/Server/Enterprise/EnterpriseEdition.js +466 -0
  290. package/build/dist/Server/Enterprise/EnterpriseEdition.js.map +1 -0
  291. package/build/dist/Server/Enterprise/EnterpriseFeature.js +39 -0
  292. package/build/dist/Server/Enterprise/EnterpriseFeature.js.map +1 -0
  293. package/build/dist/Server/Enterprise/EnterpriseLicenseSnapshot.js +70 -0
  294. package/build/dist/Server/Enterprise/EnterpriseLicenseSnapshot.js.map +1 -0
  295. package/build/dist/Server/Enterprise/EnterpriseServerModule.js +84 -0
  296. package/build/dist/Server/Enterprise/EnterpriseServerModule.js.map +1 -0
  297. package/build/dist/Server/EnvironmentConfig.js +84 -2
  298. package/build/dist/Server/EnvironmentConfig.js.map +1 -1
  299. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1793900000000-AddEnterpriseEditionFirstSeenAt.js +18 -0
  300. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1793900000000-AddEnterpriseEditionFirstSeenAt.js.map +1 -0
  301. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1794100000000-AddSloLabelAndOwnerRules.js +93 -0
  302. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1794100000000-AddSloLabelAndOwnerRules.js.map +1 -0
  303. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1794200000000-AddSloMonitorRuleMonitorType.js +12 -0
  304. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1794200000000-AddSloMonitorRuleMonitorType.js.map +1 -0
  305. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js +6 -0
  306. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js.map +1 -1
  307. package/build/dist/Server/Middleware/UserAuthorization.js +30 -11
  308. package/build/dist/Server/Middleware/UserAuthorization.js.map +1 -1
  309. package/build/dist/Server/Services/AuditLogService.js +71 -740
  310. package/build/dist/Server/Services/AuditLogService.js.map +1 -1
  311. package/build/dist/Server/Services/DatabaseService.js +7 -0
  312. package/build/dist/Server/Services/DatabaseService.js.map +1 -1
  313. package/build/dist/Server/Services/EnterpriseLicenseService.js +34 -0
  314. package/build/dist/Server/Services/EnterpriseLicenseService.js.map +1 -1
  315. package/build/dist/Server/Services/GlobalConfigService.js +63 -0
  316. package/build/dist/Server/Services/GlobalConfigService.js.map +1 -1
  317. package/build/dist/Server/Services/Index.js +4 -0
  318. package/build/dist/Server/Services/Index.js.map +1 -1
  319. package/build/dist/Server/Services/MonitorProbeService.js +90 -17
  320. package/build/dist/Server/Services/MonitorProbeService.js.map +1 -1
  321. package/build/dist/Server/Services/MonitorService.js +48 -6
  322. package/build/dist/Server/Services/MonitorService.js.map +1 -1
  323. package/build/dist/Server/Services/MonitorStatusTimelineService.js +242 -0
  324. package/build/dist/Server/Services/MonitorStatusTimelineService.js.map +1 -1
  325. package/build/dist/Server/Services/MonitorTemplateService.js +16 -0
  326. package/build/dist/Server/Services/MonitorTemplateService.js.map +1 -1
  327. package/build/dist/Server/Services/ProjectService.js +214 -0
  328. package/build/dist/Server/Services/ProjectService.js.map +1 -1
  329. package/build/dist/Server/Services/RumSessionPinService.js +24 -6
  330. package/build/dist/Server/Services/RumSessionPinService.js.map +1 -1
  331. package/build/dist/Server/Services/ServiceLevelObjectiveLabelRuleEngineService.js +295 -0
  332. package/build/dist/Server/Services/ServiceLevelObjectiveLabelRuleEngineService.js.map +1 -0
  333. package/build/dist/Server/Services/ServiceLevelObjectiveLabelRuleService.js +56 -0
  334. package/build/dist/Server/Services/ServiceLevelObjectiveLabelRuleService.js.map +1 -0
  335. package/build/dist/Server/Services/ServiceLevelObjectiveMonitorRuleEngineService.js +59 -14
  336. package/build/dist/Server/Services/ServiceLevelObjectiveMonitorRuleEngineService.js.map +1 -1
  337. package/build/dist/Server/Services/ServiceLevelObjectiveMonitorRuleService.js +22 -1
  338. package/build/dist/Server/Services/ServiceLevelObjectiveMonitorRuleService.js.map +1 -1
  339. package/build/dist/Server/Services/ServiceLevelObjectiveOwnerRuleEngineService.js +400 -0
  340. package/build/dist/Server/Services/ServiceLevelObjectiveOwnerRuleEngineService.js.map +1 -0
  341. package/build/dist/Server/Services/ServiceLevelObjectiveOwnerRuleService.js +56 -0
  342. package/build/dist/Server/Services/ServiceLevelObjectiveOwnerRuleService.js.map +1 -0
  343. package/build/dist/Server/Services/ServiceLevelObjectiveService.js +21 -0
  344. package/build/dist/Server/Services/ServiceLevelObjectiveService.js.map +1 -1
  345. package/build/dist/Server/Services/StatusPagePrivateUserService.js +7 -3
  346. package/build/dist/Server/Services/StatusPagePrivateUserService.js.map +1 -1
  347. package/build/dist/Server/Services/StatusPageService.js +71 -0
  348. package/build/dist/Server/Services/StatusPageService.js.map +1 -1
  349. package/build/dist/Server/Services/TeamMemberService.js +10 -0
  350. package/build/dist/Server/Services/TeamMemberService.js.map +1 -1
  351. package/build/dist/Server/Services/TeamService.js +9 -0
  352. package/build/dist/Server/Services/TeamService.js.map +1 -1
  353. package/build/dist/Server/Services/UserService.js +10 -16
  354. package/build/dist/Server/Services/UserService.js.map +1 -1
  355. package/build/dist/Server/Types/Database/Permissions/CreatePermission.js +10 -0
  356. package/build/dist/Server/Types/Database/Permissions/CreatePermission.js.map +1 -1
  357. package/build/dist/Server/Types/Database/Permissions/EditionPermission.js +154 -14
  358. package/build/dist/Server/Types/Database/Permissions/EditionPermission.js.map +1 -1
  359. package/build/dist/Server/Types/Database/Permissions/TablePermission.js +10 -3
  360. package/build/dist/Server/Types/Database/Permissions/TablePermission.js.map +1 -1
  361. package/build/dist/Server/Types/Database/Permissions/UpdatePermission.js +17 -0
  362. package/build/dist/Server/Types/Database/Permissions/UpdatePermission.js.map +1 -1
  363. package/build/dist/Server/Types/Markdown.js +31 -0
  364. package/build/dist/Server/Types/Markdown.js.map +1 -1
  365. package/build/dist/Server/Types/Workflow/Components/Telegram/SendMessageToChat.js +20 -1
  366. package/build/dist/Server/Types/Workflow/Components/Telegram/SendMessageToChat.js.map +1 -1
  367. package/build/dist/Server/Utils/AI/Toolbox/SloTools.js +1 -0
  368. package/build/dist/Server/Utils/AI/Toolbox/SloTools.js.map +1 -1
  369. package/build/dist/Server/Utils/CommunityEditionSsoReport.js +223 -0
  370. package/build/dist/Server/Utils/CommunityEditionSsoReport.js.map +1 -0
  371. package/build/dist/Server/Utils/EditionEnforcement.js +187 -0
  372. package/build/dist/Server/Utils/EditionEnforcement.js.map +1 -0
  373. package/build/dist/Server/Utils/FrontendEnvironment.js +31 -2
  374. package/build/dist/Server/Utils/FrontendEnvironment.js.map +1 -1
  375. package/build/dist/Server/Utils/InstanceHealth/RedisHealth.js +6 -193
  376. package/build/dist/Server/Utils/InstanceHealth/RedisHealth.js.map +1 -1
  377. package/build/dist/Server/Utils/Monitor/AffectedResourceList.js +67 -0
  378. package/build/dist/Server/Utils/Monitor/AffectedResourceList.js.map +1 -0
  379. package/build/dist/Server/Utils/Monitor/Criteria/CompareCriteria.js +1 -1
  380. package/build/dist/Server/Utils/Monitor/Criteria/EvaluateOverTime.js +8 -1
  381. package/build/dist/Server/Utils/Monitor/Criteria/EvaluateOverTime.js.map +1 -1
  382. package/build/dist/Server/Utils/Monitor/Criteria/MetricMonitorCriteria.js +1 -1
  383. package/build/dist/Server/Utils/Monitor/MonitorCriteriaEvaluator.js +585 -367
  384. package/build/dist/Server/Utils/Monitor/MonitorCriteriaEvaluator.js.map +1 -1
  385. package/build/dist/Server/Utils/Monitor/MonitoringIntervalValidator.js +88 -0
  386. package/build/dist/Server/Utils/Monitor/MonitoringIntervalValidator.js.map +1 -0
  387. package/build/dist/Server/Utils/Monitor/RootCauseList.js +101 -0
  388. package/build/dist/Server/Utils/Monitor/RootCauseList.js.map +1 -0
  389. package/build/dist/Server/Utils/Rules/RuleRun/RuleRunRegistry.js +28 -0
  390. package/build/dist/Server/Utils/Rules/RuleRun/RuleRunRegistry.js.map +1 -1
  391. package/build/dist/Server/Utils/Slo/SloRulePatternValidator.js +28 -0
  392. package/build/dist/Server/Utils/Slo/SloRulePatternValidator.js.map +1 -0
  393. package/build/dist/Server/Utils/Workspace/Slack/Slack.js +331 -11
  394. package/build/dist/Server/Utils/Workspace/Slack/Slack.js.map +1 -1
  395. package/build/dist/Types/API/Hostname.js +59 -11
  396. package/build/dist/Types/API/Hostname.js.map +1 -1
  397. package/build/dist/Types/API/Route.js +18 -2
  398. package/build/dist/Types/API/Route.js.map +1 -1
  399. package/build/dist/Types/API/URL.js +23 -2
  400. package/build/dist/Types/API/URL.js.map +1 -1
  401. package/build/dist/Types/Database/AccessControl/ColumnAccessControl.js +19 -7
  402. package/build/dist/Types/Database/AccessControl/ColumnAccessControl.js.map +1 -1
  403. package/build/dist/Types/Database/AccessControl/ColumnBillingAccessControl.js +19 -7
  404. package/build/dist/Types/Database/AccessControl/ColumnBillingAccessControl.js.map +1 -1
  405. package/build/dist/Types/Database/AccessControl/OwnerOnlyColumn.js +13 -6
  406. package/build/dist/Types/Database/AccessControl/OwnerOnlyColumn.js.map +1 -1
  407. package/build/dist/Types/Database/CanonicalModelInstance.js +88 -0
  408. package/build/dist/Types/Database/CanonicalModelInstance.js.map +1 -0
  409. package/build/dist/Types/Database/TableColumn.js +19 -6
  410. package/build/dist/Types/Database/TableColumn.js.map +1 -1
  411. package/build/dist/Types/EnterpriseLicense/EnterpriseLicensePeriods.js +28 -0
  412. package/build/dist/Types/EnterpriseLicense/EnterpriseLicensePeriods.js.map +1 -0
  413. package/build/dist/Types/IP/IPv6.js +6 -1
  414. package/build/dist/Types/IP/IPv6.js.map +1 -1
  415. package/build/dist/Types/Monitor/MonitorStep.js +5 -0
  416. package/build/dist/Types/Monitor/MonitorStep.js.map +1 -1
  417. package/build/dist/Types/Monitor/ProxmoxAlertTemplates.js +1 -1
  418. package/build/dist/Types/Permission.js +84 -0
  419. package/build/dist/Types/Permission.js.map +1 -1
  420. package/build/dist/Types/Rules/RuleCriteriaFieldRegistry.js +11 -0
  421. package/build/dist/Types/Rules/RuleCriteriaFieldRegistry.js.map +1 -1
  422. package/build/dist/Types/Rules/RuleRun.js +4 -0
  423. package/build/dist/Types/Rules/RuleRun.js.map +1 -1
  424. package/build/dist/Types/StatusPage/UptimeDailyAggregate.js +32 -0
  425. package/build/dist/Types/StatusPage/UptimeDailyAggregate.js.map +1 -0
  426. package/build/dist/UI/Components/EditionLabel/EditionLabel.js +414 -585
  427. package/build/dist/UI/Components/EditionLabel/EditionLabel.js.map +1 -1
  428. package/build/dist/UI/Components/EditionLabel/LicenseManager.js +2 -0
  429. package/build/dist/UI/Components/EditionLabel/LicenseManager.js.map +1 -0
  430. package/build/dist/UI/Components/Feed/FeedOptions.js +235 -0
  431. package/build/dist/UI/Components/Feed/FeedOptions.js.map +1 -0
  432. package/build/dist/UI/Components/Feed/FeedOptionsButton.js +346 -0
  433. package/build/dist/UI/Components/Feed/FeedOptionsButton.js.map +1 -0
  434. package/build/dist/UI/Components/Feed/useFeedItems.js +17 -7
  435. package/build/dist/UI/Components/Feed/useFeedItems.js.map +1 -1
  436. package/build/dist/UI/Components/Feed/useFeedOptions.js +130 -0
  437. package/build/dist/UI/Components/Feed/useFeedOptions.js.map +1 -0
  438. package/build/dist/UI/Components/Graphs/DayUptimeGraph.js +90 -17
  439. package/build/dist/UI/Components/Graphs/DayUptimeGraph.js.map +1 -1
  440. package/build/dist/UI/Components/Icon/Icon.js +1 -1
  441. package/build/dist/UI/Components/Icon/Icon.js.map +1 -1
  442. package/build/dist/UI/Components/Markdown.tsx/MarkdownConverters.js +0 -0
  443. package/build/dist/UI/Components/Markdown.tsx/MarkdownConverters.js.map +1 -1
  444. package/build/dist/UI/Components/ModelList/ModelList.js +4 -1
  445. package/build/dist/UI/Components/ModelList/ModelList.js.map +1 -1
  446. package/build/dist/UI/Components/MonitorGraphs/Uptime.js +42 -1
  447. package/build/dist/UI/Components/MonitorGraphs/Uptime.js.map +1 -1
  448. package/build/dist/UI/Components/TelemetryViewer/TelemetryViewer.js +2 -2
  449. package/build/dist/UI/Components/TelemetryViewer/TelemetryViewer.js.map +1 -1
  450. package/build/dist/Utils/EnterpriseLicense/EnterpriseLicenseUsage.js +6 -2
  451. package/build/dist/Utils/EnterpriseLicense/EnterpriseLicenseUsage.js.map +1 -1
  452. package/build/dist/Utils/HostAddressUtil.js +80 -0
  453. package/build/dist/Utils/HostAddressUtil.js.map +1 -0
  454. package/build/dist/Utils/LabelRuleImportExport.js +22 -6
  455. package/build/dist/Utils/LabelRuleImportExport.js.map +1 -1
  456. package/build/dist/Utils/Monitor/MetricValueFormatter.js +2 -2
  457. package/build/dist/Utils/Monitor/MonitorDestinationUtil.js +127 -0
  458. package/build/dist/Utils/Monitor/MonitorDestinationUtil.js.map +1 -0
  459. package/build/dist/Utils/Monitor/MonitoringIntervalUtil.js +374 -0
  460. package/build/dist/Utils/Monitor/MonitoringIntervalUtil.js.map +1 -0
  461. package/build/dist/Utils/Rules/MonitorTypeRuleCriteria.js +18 -0
  462. package/build/dist/Utils/Rules/MonitorTypeRuleCriteria.js.map +1 -0
  463. package/build/dist/Utils/Slo/SloDuration.js +13 -5
  464. package/build/dist/Utils/Slo/SloDuration.js.map +1 -1
  465. package/build/dist/Utils/Slo/SloHealth.js +8 -7
  466. package/build/dist/Utils/Slo/SloHealth.js.map +1 -1
  467. package/build/dist/Utils/Slo/SloMonitorRuleCriteria.js +16 -1
  468. package/build/dist/Utils/Slo/SloMonitorRuleCriteria.js.map +1 -1
  469. package/build/dist/Utils/Slo/SloOverviewText.js +16 -0
  470. package/build/dist/Utils/Slo/SloOverviewText.js.map +1 -1
  471. package/build/dist/Utils/Slo/SloProjection.js.map +1 -1
  472. package/build/dist/Utils/StatusPage/UptimeDailyAggregateUtil.js +148 -0
  473. package/build/dist/Utils/StatusPage/UptimeDailyAggregateUtil.js.map +1 -0
  474. package/jest.config.json +3 -1
  475. package/package.json +1 -1
  476. package/test-setup.sh +103 -34
  477. package/tsconfig.json +13 -0
  478. package/Server/API/EnterpriseLicenseAPI.ts +0 -925
  479. package/Server/API/TeamComplianceAPI.ts +0 -158
  480. package/Server/Middleware/SCIMAuthorization.ts +0 -141
  481. package/Server/Services/TeamComplianceService.ts +0 -733
  482. package/Server/Utils/EnterpriseLicense/EnterpriseLicenseSeatUtil.ts +0 -186
  483. package/Server/Utils/InstanceHealth/PostgresHealth.ts +0 -286
  484. package/Tests/App/AdminDashboard/EnterpriseLicenseInstanceActivity.test.tsx +0 -451
  485. package/Tests/App/Dashboard/AuditLogsTable.test.tsx +0 -598
  486. package/Tests/App/Dashboard/SecurityEventsExplorer.test.tsx +0 -761
  487. package/Tests/App/Dashboard/SecurityEventsSideMenu.test.tsx +0 -247
  488. package/Tests/App/Dashboard/SecurityEventsTableColumns.test.tsx +0 -382
  489. package/Tests/App/Dashboard/SecurityEventsVolumeChart.test.tsx +0 -321
  490. package/Tests/Server/API/EnterpriseLicenseReportUserCount.test.ts +0 -1851
  491. package/Tests/Server/Middleware/SCIMAuthorization.test.ts +0 -525
  492. package/Tests/Server/Services/TeamComplianceServiceBehaviour.test.ts +0 -1845
  493. package/Tests/Server/Utils/EnterpriseLicense/EnterpriseLicenseSeatUtil.test.ts +0 -495
  494. package/Tests/Server/Utils/InstanceHealth/PostgresHealth.test.ts +0 -337
  495. package/Tests/Utils/EnterpriseLicenseSeats.test.ts +0 -576
  496. package/Tests/Utils/EnterpriseLicenseSync.test.ts +0 -568
  497. package/Utils/EnterpriseLicense/EnterpriseLicenseSeats.ts +0 -287
  498. package/Utils/EnterpriseLicense/EnterpriseLicenseSync.ts +0 -244
  499. package/build/dist/Server/API/EnterpriseLicenseAPI.js +0 -646
  500. package/build/dist/Server/API/EnterpriseLicenseAPI.js.map +0 -1
  501. package/build/dist/Server/API/TeamComplianceAPI.js +0 -111
  502. package/build/dist/Server/API/TeamComplianceAPI.js.map +0 -1
  503. package/build/dist/Server/Middleware/SCIMAuthorization.js +0 -124
  504. package/build/dist/Server/Middleware/SCIMAuthorization.js.map +0 -1
  505. package/build/dist/Server/Services/TeamComplianceService.js +0 -537
  506. package/build/dist/Server/Services/TeamComplianceService.js.map +0 -1
  507. package/build/dist/Server/Utils/EnterpriseLicense/EnterpriseLicenseSeatUtil.js +0 -145
  508. package/build/dist/Server/Utils/EnterpriseLicense/EnterpriseLicenseSeatUtil.js.map +0 -1
  509. package/build/dist/Server/Utils/InstanceHealth/PostgresHealth.js +0 -194
  510. package/build/dist/Server/Utils/InstanceHealth/PostgresHealth.js.map +0 -1
  511. package/build/dist/Utils/EnterpriseLicense/EnterpriseLicenseSeats.js +0 -168
  512. package/build/dist/Utils/EnterpriseLicense/EnterpriseLicenseSeats.js.map +0 -1
  513. package/build/dist/Utils/EnterpriseLicense/EnterpriseLicenseSync.js +0 -174
  514. package/build/dist/Utils/EnterpriseLicense/EnterpriseLicenseSync.js.map +0 -1
@@ -0,0 +1,263 @@
1
+ /**
2
+ * Enterprise Edition resolution for the frontend builds (Dashboard and
3
+ * AdminDashboard).
4
+ *
5
+ * Each of those frontends imports its Enterprise UI through one bare
6
+ * specifier, from one file (src/Enterprise/Plugins.ts):
7
+ *
8
+ * Dashboard "@oneuptime/ee-dashboard" -> ee/Dashboard/Index.tsx
9
+ * AdminDashboard "@oneuptime/ee-admin-dashboard" -> ee/AdminDashboard/Index.tsx
10
+ *
11
+ * This module decides what that specifier means for one build and returns the
12
+ * esbuild aliases that make it so. The frontends pass the result to
13
+ * createConfig({ additionalAlias }) - nothing else about the build changes.
14
+ *
15
+ * ONEUPTIME_EDITION picks the edition:
16
+ *
17
+ * auto (default) Enterprise when the ee plugin file is on disk, Community
18
+ * otherwise. A plain checkout builds whatever it contains.
19
+ * community Always the Community stub, even with ee/ present.
20
+ * enterprise The ee plugin, and a hard error when it is missing. The
21
+ * Enterprise image sets this, so a broken COPY of ee/ fails
22
+ * the build instead of quietly shipping the Community UI
23
+ * under an Enterprise tag.
24
+ *
25
+ * Where ee/ is looked for, relative to the frontend directory:
26
+ *
27
+ * <frontend>/../../../../ee the repository: packages/App/FeatureSet/<F>
28
+ * <frontend>/../../../ee the image: /usr/src/app/FeatureSet/<F> -> /usr/src/ee
29
+ *
30
+ * ONEUPTIME_EE_DIR replaces both with one directory (fixtures, tests, odd
31
+ * layouts) - the same variable the server-side loader honours.
32
+ *
33
+ * "Found" means the plugin's Index.tsx FILE exists. The alias points at that
34
+ * file rather than its directory: esbuild resolves a directory alias to a
35
+ * lowercase index.* and would miss Index.tsx on a case-sensitive filesystem.
36
+ *
37
+ * Two more aliases are always returned, so ee code can reach core without
38
+ * relative paths and without an install of its own:
39
+ *
40
+ * "@oneuptime/dashboard/..." (or "@oneuptime/admin-dashboard/...")
41
+ * -> <frontend>/src/...
42
+ * "Common/..." -> <frontend>/node_modules/Common/...
43
+ *
44
+ * Bundling therefore never depends on ee/node_modules. Both are applied in
45
+ * the Community build too, so core resolves identically in both editions.
46
+ *
47
+ * CommonJS, like esbuild-config.js: the frontends' esbuild.config.js files
48
+ * are plain node scripts.
49
+ */
50
+
51
+ const fs = require("fs");
52
+ const path = require("path");
53
+
54
+ const EDITION_ENV_VAR = "ONEUPTIME_EDITION";
55
+ const EE_DIR_ENV_VAR = "ONEUPTIME_EE_DIR";
56
+
57
+ const EDITION_AUTO = "auto";
58
+ const EDITION_COMMUNITY = "community";
59
+ const EDITION_ENTERPRISE = "enterprise";
60
+
61
+ const VALID_EDITIONS = [EDITION_AUTO, EDITION_COMMUNITY, EDITION_ENTERPRISE];
62
+
63
+ const PLUGIN_ENTRY_FILENAME = "Index.tsx";
64
+
65
+ /*
66
+ * The Community stub, relative to the frontend directory. Every tsconfig and
67
+ * jest config maps the plugin specifier to this same file.
68
+ */
69
+ const COMMUNITY_STUB_PATH = path.join(
70
+ "src",
71
+ "Enterprise",
72
+ "CommunityPlugins.ts",
73
+ );
74
+
75
+ function isFile(filePath) {
76
+ try {
77
+ return fs.statSync(filePath).isFile();
78
+ } catch (error) {
79
+ return false;
80
+ }
81
+ }
82
+
83
+ /**
84
+ * The edition the environment asks for: "auto", "community" or "enterprise".
85
+ * Unset or blank means "auto". Anything else is a typo, and a typo must not
86
+ * silently build the wrong edition, so it throws.
87
+ * @param {Object} [env] - Environment to read (defaults to process.env)
88
+ * @returns {string}
89
+ */
90
+ function readRequestedEdition(env) {
91
+ const source = env || process.env;
92
+ const raw = source[EDITION_ENV_VAR];
93
+
94
+ if (raw === undefined || raw === null || String(raw).trim() === "") {
95
+ return EDITION_AUTO;
96
+ }
97
+
98
+ const value = String(raw).trim().toLowerCase();
99
+
100
+ if (!VALID_EDITIONS.includes(value)) {
101
+ throw new Error(
102
+ `${EDITION_ENV_VAR} must be one of ${VALID_EDITIONS.join(", ")} (got "${raw}").`,
103
+ );
104
+ }
105
+
106
+ return value;
107
+ }
108
+
109
+ /**
110
+ * Every path the plugin entry may live at, in the order they are tried.
111
+ * @param {string} frontendDir - Absolute path of the frontend package
112
+ * @param {string} eeSubdir - "Dashboard" or "AdminDashboard"
113
+ * @param {Object} [env] - Environment to read (defaults to process.env)
114
+ * @returns {Array<string>}
115
+ */
116
+ function getEnterpriseCandidates(frontendDir, eeSubdir, env) {
117
+ const source = env || process.env;
118
+ const override = source[EE_DIR_ENV_VAR];
119
+
120
+ if (override !== undefined && override !== null && String(override).trim()) {
121
+ return [
122
+ path.resolve(String(override).trim(), eeSubdir, PLUGIN_ENTRY_FILENAME),
123
+ ];
124
+ }
125
+
126
+ return [
127
+ // Repository: packages/App/FeatureSet/<Frontend> -> <repo>/ee
128
+ path.resolve(
129
+ frontendDir,
130
+ "..",
131
+ "..",
132
+ "..",
133
+ "..",
134
+ "ee",
135
+ eeSubdir,
136
+ PLUGIN_ENTRY_FILENAME,
137
+ ),
138
+ // Image: /usr/src/app/FeatureSet/<Frontend> -> /usr/src/ee
139
+ path.resolve(
140
+ frontendDir,
141
+ "..",
142
+ "..",
143
+ "..",
144
+ "ee",
145
+ eeSubdir,
146
+ PLUGIN_ENTRY_FILENAME,
147
+ ),
148
+ ];
149
+ }
150
+
151
+ function assertNonEmptyString(value, name) {
152
+ if (typeof value !== "string" || value.trim() === "") {
153
+ throw new Error(`resolveEnterpriseBuild: "${name}" is required.`);
154
+ }
155
+ }
156
+
157
+ /**
158
+ * Decide the edition for one frontend build.
159
+ * @param {Object} options
160
+ * @param {string} options.frontendDir - Absolute path of the frontend package (its esbuild.config.js __dirname)
161
+ * @param {string} options.pluginSpecifier - e.g. "@oneuptime/ee-dashboard"
162
+ * @param {string} options.eeSubdir - Directory under ee/, e.g. "Dashboard"
163
+ * @param {string} options.internalSpecifier - e.g. "@oneuptime/dashboard"; ee code imports <frontend>/src through it
164
+ * @param {Object} [options.env] - Environment to read (defaults to process.env)
165
+ * @returns {{ edition: string, requestedEdition: string, pluginEntry: (string|null), communityStub: string, candidates: Array<string>, alias: Object }}
166
+ */
167
+ function resolveEnterpriseBuild(options) {
168
+ const {
169
+ frontendDir,
170
+ pluginSpecifier,
171
+ eeSubdir,
172
+ internalSpecifier,
173
+ env = process.env,
174
+ } = options || {};
175
+
176
+ assertNonEmptyString(frontendDir, "frontendDir");
177
+ assertNonEmptyString(pluginSpecifier, "pluginSpecifier");
178
+ assertNonEmptyString(eeSubdir, "eeSubdir");
179
+ assertNonEmptyString(internalSpecifier, "internalSpecifier");
180
+
181
+ if (!path.isAbsolute(frontendDir)) {
182
+ throw new Error(
183
+ `resolveEnterpriseBuild: "frontendDir" must be absolute (got "${frontendDir}").`,
184
+ );
185
+ }
186
+
187
+ const communityStub = path.join(frontendDir, COMMUNITY_STUB_PATH);
188
+
189
+ if (!isFile(communityStub)) {
190
+ throw new Error(
191
+ `The Community plugin stub is missing: ${communityStub}. Every frontend that imports ${pluginSpecifier} needs one.`,
192
+ );
193
+ }
194
+
195
+ const requestedEdition = readRequestedEdition(env);
196
+ const candidates = getEnterpriseCandidates(frontendDir, eeSubdir, env);
197
+
198
+ const pluginEntry =
199
+ requestedEdition === EDITION_COMMUNITY
200
+ ? null
201
+ : candidates.find(isFile) || null;
202
+
203
+ if (requestedEdition === EDITION_ENTERPRISE && !pluginEntry) {
204
+ throw new Error(
205
+ `${EDITION_ENV_VAR}=${EDITION_ENTERPRISE}, but the Enterprise UI plugin for ${eeSubdir} was not found. Looked for: ${candidates.join(
206
+ ", ",
207
+ )}. Copy the ee/ directory into the build, or unset ${EDITION_ENV_VAR} to build the Community Edition.`,
208
+ );
209
+ }
210
+
211
+ return {
212
+ edition: pluginEntry ? EDITION_ENTERPRISE : EDITION_COMMUNITY,
213
+ requestedEdition,
214
+ pluginEntry,
215
+ communityStub,
216
+ candidates,
217
+ alias: {
218
+ [pluginSpecifier]: pluginEntry || communityStub,
219
+ [internalSpecifier]: path.join(frontendDir, "src"),
220
+ Common: path.join(frontendDir, "node_modules", "Common"),
221
+ },
222
+ };
223
+ }
224
+
225
+ /**
226
+ * The esbuild aliases for one frontend build - what esbuild.config.js passes
227
+ * to createConfig({ additionalAlias }). Same options as resolveEnterpriseBuild.
228
+ * @param {Object} options
229
+ * @returns {Object}
230
+ */
231
+ function resolveEnterpriseAliases(options) {
232
+ return resolveEnterpriseBuild(options).alias;
233
+ }
234
+
235
+ /**
236
+ * One line for the build log, so a CI log shows which edition was bundled.
237
+ * @param {string} serviceName
238
+ * @param {Object} build - A resolveEnterpriseBuild() result
239
+ * @returns {string}
240
+ */
241
+ function describeEnterpriseBuild(serviceName, build) {
242
+ if (build.edition === EDITION_ENTERPRISE) {
243
+ return `${serviceName}: building the Enterprise Edition UI from ${build.pluginEntry}`;
244
+ }
245
+
246
+ return `${serviceName}: building the Community Edition UI (${EDITION_ENV_VAR}=${build.requestedEdition})`;
247
+ }
248
+
249
+ module.exports = {
250
+ EDITION_ENV_VAR,
251
+ EE_DIR_ENV_VAR,
252
+ EDITION_AUTO,
253
+ EDITION_COMMUNITY,
254
+ EDITION_ENTERPRISE,
255
+ VALID_EDITIONS,
256
+ PLUGIN_ENTRY_FILENAME,
257
+ COMMUNITY_STUB_PATH,
258
+ readRequestedEdition,
259
+ getEnterpriseCandidates,
260
+ resolveEnterpriseBuild,
261
+ resolveEnterpriseAliases,
262
+ describeEnterpriseBuild,
263
+ };
@@ -1,3 +1,4 @@
1
+ import { ENTERPRISE_LICENSE_GRACE_PERIOD_IN_DAYS } from "../../Types/EnterpriseLicense/EnterpriseLicensePeriods";
1
2
  import EnterpriseLicenseUserCountSource from "../../Types/EnterpriseLicense/EnterpriseLicenseUserCountSource";
2
3
 
3
4
  /*
@@ -49,9 +50,13 @@ export default class EnterpriseLicenseUsageUtil {
49
50
  /*
50
51
  * Expired licenses keep getting a daily "expired" email for this many
51
52
  * days after expiry, then go quiet — an abandoned license should not be
52
- * emailed forever.
53
+ * emailed forever. It has to outlast the grace period by a clear margin:
54
+ * the email that says single sign-on, SCIM provisioning and audit logging
55
+ * have now stopped is only worth sending after they have, which is when
56
+ * the grace period ends.
53
57
  */
54
- public static readonly expiredNotificationCutoffDays: number = 30;
58
+ public static readonly expiredNotificationCutoffDays: number =
59
+ ENTERPRISE_LICENSE_GRACE_PERIOD_IN_DAYS + 14;
55
60
 
56
61
  /*
57
62
  * License keys are shown/emailed masked — enough to identify the key
@@ -0,0 +1,94 @@
1
+ import IP from "../Types/IP/IP";
2
+
3
+ /*
4
+ * The two things every caller that holds a host string needs to get right
5
+ * when that host might be an IPv6 literal, in one place.
6
+ *
7
+ * Both are pure text problems that only exist for IPv6, which is exactly why
8
+ * they kept being got wrong one call site at a time:
9
+ *
10
+ * 1. BRACKETS ARE URL SYNTAX, NOT PART OF THE ADDRESS. "[2001:db8::1]" is
11
+ * how RFC 3986 writes an IPv6 host inside a URL authority, and that is
12
+ * the form URL.fromString and Hostname.fromAuthority hand back. Node
13
+ * does NOT strip them: net.connect({host: "[::1]"}) and
14
+ * https.get({host: "[::1]"}) both go to the resolver and come back
15
+ * ENOTFOUND, and `ping [::1]` fails the same way. An IPv4 host never
16
+ * carries brackets, so every one of those call sites worked until
17
+ * somebody pointed it at IPv6.
18
+ *
19
+ * 2. "host:port" IS AMBIGUOUS FOR IPv6, AND NOT IN A WAY THAT LOOKS WRONG.
20
+ * "192.0.2.1:179" cannot be mistaken for an address. Appending ":179" to
21
+ * "2001:518:2800:9::2" produces "2001:518:2800:9::2:179", which node's
22
+ * net.isIP() reports as a PERFECTLY VALID IPv6 address - a different
23
+ * host from the one that was meant. So the unbracketed spelling does not
24
+ * merely read oddly, it silently renames the target.
25
+ */
26
+ export default class HostAddressUtil {
27
+ /*
28
+ * True when the value is an IPv6 literal, written bare ("2001:db8::1") or
29
+ * bracketed ("[2001:db8::1]"). Anything else - a DNS name, an IPv4 literal,
30
+ * an authority with a port - is false.
31
+ */
32
+ public static isIPv6(host: string): boolean {
33
+ const bare: string = HostAddressUtil.stripBrackets(host);
34
+
35
+ if (!bare) {
36
+ return false;
37
+ }
38
+
39
+ return IP.isIP(bare) && new IP(bare).isIPv6();
40
+ }
41
+
42
+ /*
43
+ * The address to hand to a socket, a resolver or the ping binary: the same
44
+ * host with any IPv6 URL brackets removed.
45
+ *
46
+ * Brackets are only removed when what is inside them really is an IPv6
47
+ * address. "[not-an-address]" is returned untouched so it fails validation
48
+ * downstream as the nonsense it is, rather than being quietly laundered
49
+ * into a bare hostname.
50
+ */
51
+ public static stripBrackets(host: string): string {
52
+ const trimmed: string = (host || "").trim();
53
+
54
+ if (!trimmed.startsWith("[") || !trimmed.endsWith("]")) {
55
+ return trimmed;
56
+ }
57
+
58
+ const inner: string = trimmed.substring(1, trimmed.length - 1);
59
+
60
+ if (!inner || !IP.isIP(inner) || !new IP(inner).isIPv6()) {
61
+ return trimmed;
62
+ }
63
+
64
+ return inner;
65
+ }
66
+
67
+ /*
68
+ * The authority form: an IPv6 host is bracketed so the ":" before the port
69
+ * cannot be read as another group of the address. Already-bracketed input
70
+ * is not bracketed twice.
71
+ *
72
+ * A missing/empty port returns the host on its own, bare. That is
73
+ * deliberate: a port-less destination is stored and pinged as the address
74
+ * itself, and wrapping it in brackets there would change what is written to
75
+ * the database and shown to the user for no benefit - the ambiguity this
76
+ * guards against only exists once a ":port" is appended.
77
+ */
78
+ public static formatHostAndPort(data: {
79
+ host: string;
80
+ port?: string | number | undefined;
81
+ }): string {
82
+ const bare: string = HostAddressUtil.stripBrackets(data.host);
83
+ const port: string =
84
+ data.port === undefined || data.port === null ? "" : String(data.port);
85
+
86
+ if (!port) {
87
+ return bare;
88
+ }
89
+
90
+ return HostAddressUtil.isIPv6(bare)
91
+ ? `[${bare}]:${port}`
92
+ : `${bare}:${port}`;
93
+ }
94
+ }
@@ -25,6 +25,7 @@ import RunbookLabelRule from "../Models/DatabaseModels/RunbookLabelRule";
25
25
  import ScheduledMaintenanceLabelRule from "../Models/DatabaseModels/ScheduledMaintenanceLabelRule";
26
26
  import ServerlessFunctionLabelRule from "../Models/DatabaseModels/ServerlessFunctionLabelRule";
27
27
  import ServiceLabelRule from "../Models/DatabaseModels/ServiceLabelRule";
28
+ import ServiceLevelObjectiveLabelRule from "../Models/DatabaseModels/ServiceLevelObjectiveLabelRule";
28
29
  import StatusPageLabelRule from "../Models/DatabaseModels/StatusPageLabelRule";
29
30
  import WorkflowLabelRule from "../Models/DatabaseModels/WorkflowLabelRule";
30
31
  import Select from "../Types/BaseDatabase/Select";
@@ -74,10 +75,22 @@ export const LABEL_RULE_MODELS: Array<DatabaseBaseModelType> = [
74
75
  ScheduledMaintenanceLabelRule,
75
76
  ServerlessFunctionLabelRule,
76
77
  ServiceLabelRule,
78
+ ServiceLevelObjectiveLabelRule,
77
79
  StatusPageLabelRule,
78
80
  WorkflowLabelRule,
79
81
  ];
80
82
 
83
+ /*
84
+ * Rule types whose engines match patterns through RulePatternMatchUtil: a
85
+ * regex, with a '*' wildcard fallback, on the trimmed pattern. Every other
86
+ * label rule compiles its pattern as a plain regex, so a pattern moving
87
+ * between the two groups can change what it matches.
88
+ */
89
+ const WILDCARD_PATTERN_RULE_TYPES: ReadonlySet<string> = new Set<string>([
90
+ "NetworkDeviceLabelRule",
91
+ "ServiceLevelObjectiveLabelRule",
92
+ ]);
93
+
81
94
  export interface ParsedLabelRuleImport {
82
95
  sourceResourceType: string;
83
96
  destinationResourceType: string;
@@ -759,13 +772,14 @@ export default class LabelRuleImportExport {
759
772
  );
760
773
  }
761
774
  if (validatePattern && column.endsWith("Pattern") && value) {
762
- const valid: boolean =
763
- resourceType === "NetworkDeviceLabelRule"
764
- ? RulePatternMatchUtil.isSupportedPattern(value)
765
- : RulePatternMatchUtil.isValidRegex(value);
775
+ const acceptsWildcards: boolean =
776
+ WILDCARD_PATTERN_RULE_TYPES.has(resourceType);
777
+ const valid: boolean = acceptsWildcards
778
+ ? RulePatternMatchUtil.isSupportedPattern(value)
779
+ : RulePatternMatchUtil.isValidRegex(value);
766
780
  if (!valid) {
767
781
  throw new BadDataException(
768
- `${title} is not a valid ${resourceType === "NetworkDeviceLabelRule" ? "regular expression or wildcard pattern" : "regular expression"}.`,
782
+ `${title} is not a valid ${acceptsWildcards ? "regular expression or wildcard pattern" : "regular expression"}.`,
769
783
  );
770
784
  }
771
785
  }
@@ -776,13 +790,17 @@ export default class LabelRuleImportExport {
776
790
  source: string,
777
791
  destination: string,
778
792
  ): void {
793
+ // Two rule types that match patterns the same way can trade any pattern.
779
794
  if (
780
- (source === "NetworkDeviceLabelRule" ||
781
- destination === "NetworkDeviceLabelRule") &&
782
- (pattern.includes("*") || pattern !== pattern.trim())
795
+ WILDCARD_PATTERN_RULE_TYPES.has(source) ===
796
+ WILDCARD_PATTERN_RULE_TYPES.has(destination)
783
797
  ) {
798
+ return;
799
+ }
800
+
801
+ if (pattern.includes("*") || pattern !== pattern.trim()) {
784
802
  throw new BadDataException(
785
- "Network device patterns also use wildcard matching and trim surrounding whitespace. A pattern containing '*' or surrounding whitespace cannot be transferred between network devices and another rule type without changing its meaning. Edit this pattern for the destination before importing.",
803
+ "Network device and SLO patterns also use wildcard matching and trim surrounding whitespace. A pattern containing '*' or surrounding whitespace cannot be transferred between those rules and another rule type without changing its meaning. Edit this pattern for the destination before importing.",
786
804
  );
787
805
  }
788
806
  }
@@ -14,9 +14,9 @@ import ValueFormatter from "../ValueFormatter";
14
14
  * head at 3am to find out whether the pod is anywhere near its limit.
15
15
  *
16
16
  * This module is the single place that decides how a (value, unit) pair
17
- * is rendered for a notification, so the breaching-samples table, the
17
+ * is rendered for a notification, so the breaching-samples list, the
18
18
  * "Filter Conditions Met" sentence, the observation summary and the
19
- * per-platform resource tables cannot drift apart inside one email.
19
+ * per-platform resource lists cannot drift apart inside one email.
20
20
  *
21
21
  * WHY IT WRAPS ValueFormatter RATHER THAN BEING A CALL TO IT.
22
22
  *
@@ -0,0 +1,157 @@
1
+ import Hostname from "../../Types/API/Hostname";
2
+ import URL from "../../Types/API/URL";
3
+ import Exception from "../../Types/Exception/Exception";
4
+ import IP from "../../Types/IP/IP";
5
+ import MonitorType from "../../Types/Monitor/MonitorType";
6
+ import HostAddressUtil from "../HostAddressUtil";
7
+
8
+ export interface ParsedMonitorDestination {
9
+ destination: IP | URL | Hostname | undefined;
10
+ // Null when the value parsed. A string is the message to show the operator.
11
+ error: string | null;
12
+ }
13
+
14
+ /*
15
+ * Turns what somebody typed (or, far more often, PASTED) into the monitor
16
+ * destination for a monitor type, or into the reason it cannot be one.
17
+ *
18
+ * Lives here rather than inline in the dashboard form so the parsing is
19
+ * testable on its own — the form's job is state, not address syntax.
20
+ *
21
+ * Two IPv6 shapes have to be handled that IPv4 never needed, and getting
22
+ * either wrong is SILENT rather than loud:
23
+ *
24
+ * - SURROUNDING WHITESPACE. An address copied out of a looking glass, a
25
+ * router config or a terminal usually arrives with a trailing space or a
26
+ * newline. IP.isIP deliberately does not trim, so " 2001:db8::1" was not
27
+ * an IP; it fell through to Hostname.fromString, which split it on the
28
+ * first colon into host "2001" / port 518 — a legal Port, so nothing
29
+ * threw, no error appeared, and the monitor saved was pointed at a host
30
+ * called "2001". The IPv4 equivalent, "1.1.1.1 ", has no colon and
31
+ * Hostname trims, so it always worked. That asymmetry is the whole bug:
32
+ * the same paste that works for v4 corrupts v6.
33
+ *
34
+ * - BRACKETS. "[2001:db8::1]" is how an IPv6 host is written inside a URL,
35
+ * so it is what people have in front of them. For a Ping/IP/Port
36
+ * destination there is no URL, so the brackets are noise and are dropped
37
+ * — rather than rejected with "Hostname [2001 is not in valid format".
38
+ */
39
+ export default class MonitorDestinationUtil {
40
+ public static parse(data: {
41
+ value: string;
42
+ monitorType: MonitorType;
43
+ }): ParsedMonitorDestination {
44
+ const value: string = (data.value || "").trim();
45
+
46
+ if (!value) {
47
+ return { destination: undefined, error: "Destination is required" };
48
+ }
49
+
50
+ try {
51
+ switch (data.monitorType) {
52
+ case MonitorType.IP:
53
+ return {
54
+ destination: IP.fromString(HostAddressUtil.stripBrackets(value)),
55
+ error: null,
56
+ };
57
+
58
+ case MonitorType.Ping:
59
+ case MonitorType.Port: {
60
+ const host: string = HostAddressUtil.stripBrackets(value);
61
+
62
+ if (IP.isIP(host)) {
63
+ return { destination: IP.fromString(host), error: null };
64
+ }
65
+
66
+ /*
67
+ * A trailing colon is a port that was not typed, and
68
+ * Hostname.fromAuthority DROPS it — deliberately, because a stored
69
+ * "host:" should still read back as a host. Here that would be the
70
+ * same class of bug this whole file exists to stop: "2001:" would
71
+ * be stored as "2001", which is not what anybody typed. Say so
72
+ * instead.
73
+ */
74
+ if (host.endsWith(":")) {
75
+ return {
76
+ destination: undefined,
77
+ error: `${value} is not a valid hostname or IP address.`,
78
+ };
79
+ }
80
+
81
+ /*
82
+ * Not an address, so it is a name — possibly with a ":port", which
83
+ * is what someone pasting "rs1.example.net:179" means.
84
+ *
85
+ * fromAuthority rather than `new Hostname`: the constructor accepts
86
+ * a whole authority and stores it as the HOST, so the destination
87
+ * would be a host literally named "rs1.example.net:179" and the
88
+ * socket would go looking for it in DNS. fromAuthority splits the
89
+ * port off properly, and — unlike the fromString this used to
90
+ * call — leaves a bare IPv6 literal alone.
91
+ */
92
+ return { destination: Hostname.fromAuthority(host), error: null };
93
+ }
94
+
95
+ case MonitorType.Website:
96
+ case MonitorType.API:
97
+ case MonitorType.SSLCertificate:
98
+ return {
99
+ destination: URL.fromString(
100
+ MonitorDestinationUtil.toUrlWithBracketedIpv6Host(value),
101
+ ),
102
+ error: null,
103
+ };
104
+
105
+ default:
106
+ return { destination: undefined, error: null };
107
+ }
108
+ } catch (err: unknown) {
109
+ return {
110
+ destination: undefined,
111
+ error:
112
+ err instanceof Exception
113
+ ? err.getMessage()
114
+ : (err as Error)?.message || "Invalid Destination",
115
+ };
116
+ }
117
+ }
118
+
119
+ /*
120
+ * A URL whose host is a BARE IPv6 literal is not a URL: "https://2001:db8::1/"
121
+ * has to be written "https://[2001:db8::1]/", because otherwise the first
122
+ * colon reads as the port separator. Node's own URL parser, axios and every
123
+ * browser reject the bare form, so a Website or API monitor saved with one
124
+ * failed permanently with an opaque target error.
125
+ *
126
+ * Brackets the host when it needs them, and leaves every other URL — every
127
+ * IPv4 and DNS one — byte for byte alone.
128
+ */
129
+ public static toUrlWithBracketedIpv6Host(value: string): string {
130
+ const trimmed: string = value.trim();
131
+ const schemeMatch: RegExpMatchArray | null = trimmed.match(
132
+ /^([a-zA-Z][a-zA-Z0-9+.-]*:\/\/)(.*)$/,
133
+ );
134
+
135
+ const scheme: string = schemeMatch ? (schemeMatch[1] as string) : "";
136
+ const rest: string = schemeMatch ? (schemeMatch[2] as string) : trimmed;
137
+
138
+ // The authority ends at the first "/", "?" or "#".
139
+ const authorityEnd: number = rest.search(/[/?#]/);
140
+ const authority: string =
141
+ authorityEnd === -1 ? rest : rest.substring(0, authorityEnd);
142
+ const remainder: string =
143
+ authorityEnd === -1 ? "" : rest.substring(authorityEnd);
144
+
145
+ // Userinfo is not a host; everything after the last "@" is.
146
+ const atIndex: number = authority.lastIndexOf("@");
147
+ const userInfo: string =
148
+ atIndex === -1 ? "" : authority.substring(0, atIndex + 1);
149
+ const host: string = authority.substring(atIndex + 1);
150
+
151
+ if (!HostAddressUtil.isIPv6(host) || host.startsWith("[")) {
152
+ return trimmed;
153
+ }
154
+
155
+ return `${scheme}${userInfo}[${host}]${remainder}`;
156
+ }
157
+ }