@oneuptime/common 14.0.6 → 14.0.8

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 (556) hide show
  1. package/Models/DatabaseModels/Incident.ts +267 -1
  2. package/Models/DatabaseModels/IncidentCustomField.ts +202 -0
  3. package/Models/DatabaseModels/IncidentEpisode.ts +30 -0
  4. package/Models/DatabaseModels/IncidentTemplate.ts +126 -1
  5. package/Models/DatabaseModels/InventoryItem.ts +23 -12
  6. package/Models/DatabaseModels/StatusPage.ts +55 -0
  7. package/Models/DatabaseModels/StatusPageSubscriber.ts +128 -0
  8. package/Server/API/IncidentAPI.ts +162 -0
  9. package/Server/API/StatusPageAPI.ts +487 -171
  10. package/Server/API/StatusPageSubscriberAPI.ts +63 -15
  11. package/Server/Infrastructure/Postgres/SchemaMigrations/1795200000000-AddInventoryItemProjectEntityKeyIndex.ts +217 -0
  12. package/Server/Infrastructure/Postgres/SchemaMigrations/1795300000000-SkipHiddenIncidentCreatedNotifications.ts +49 -0
  13. package/Server/Infrastructure/Postgres/SchemaMigrations/1795400000000-AddIncidentStatusPageScope.ts +108 -0
  14. package/Server/Infrastructure/Postgres/SchemaMigrations/1795500000000-AddIncidentTemplateStatusPageScopeFlag.ts +33 -0
  15. package/Server/Infrastructure/Postgres/SchemaMigrations/1795600000000-AddStatusPageSubscriberUnsubscribeToken.ts +51 -0
  16. package/Server/Infrastructure/Postgres/SchemaMigrations/1795700000000-AddStatusPageSubscriberIsAddedByTeam.ts +33 -0
  17. package/Server/Infrastructure/Postgres/SchemaMigrations/1795800000000-AddIncidentCustomFieldCreateAndNotificationSettings.ts +168 -0
  18. package/Server/Infrastructure/Postgres/SchemaMigrations/1795900000000-AddSubscriberNotificationClaimedAt.ts +44 -0
  19. package/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts +16 -0
  20. package/Server/Infrastructure/Semaphore.ts +10 -0
  21. package/Server/Middleware/IdentityRateLimit.ts +108 -3
  22. package/Server/Middleware/SubscriberNotificationPreviewRateLimit.ts +237 -0
  23. package/Server/Middleware/SubscriberNotificationTestSendRateLimit.ts +304 -0
  24. package/Server/Services/AlertService.ts +32 -36
  25. package/Server/Services/DatabaseService.ts +93 -10
  26. package/Server/Services/IncidentAlertService.ts +609 -2
  27. package/Server/Services/IncidentCustomFieldService.ts +276 -1
  28. package/Server/Services/IncidentEpisodePublicNoteService.ts +28 -0
  29. package/Server/Services/IncidentEpisodeService.ts +15 -0
  30. package/Server/Services/IncidentEpisodeStateTimelineService.ts +27 -1
  31. package/Server/Services/IncidentPublicNoteService.ts +30 -1
  32. package/Server/Services/IncidentService.ts +1663 -103
  33. package/Server/Services/IncidentStateTimelineService.ts +13 -0
  34. package/Server/Services/IncidentTemplateService.ts +109 -0
  35. package/Server/Services/InventoryItemService.ts +38 -0
  36. package/Server/Services/IoTDeviceCredentialService.ts +13 -4
  37. package/Server/Services/ScheduledMaintenancePublicNoteService.ts +30 -1
  38. package/Server/Services/ScheduledMaintenanceService.ts +118 -64
  39. package/Server/Services/SmsService.ts +10 -0
  40. package/Server/Services/StatusPageService.ts +65 -8
  41. package/Server/Services/StatusPageSubscriberNotificationTemplateService.ts +299 -37
  42. package/Server/Services/StatusPageSubscriberNotificationTemplateStatusPageService.ts +129 -0
  43. package/Server/Services/StatusPageSubscriberService.ts +1161 -64
  44. package/Server/Services/UserNotificationRuleService.ts +55 -53
  45. package/Server/Services/WorkspaceNotificationSummaryService.ts +38 -20
  46. package/Server/Types/Markdown.ts +153 -6
  47. package/Server/Types/Workflow/Components/Email.ts +61 -2
  48. package/Server/Utils/AffectedResources/LinkedAffectedResources.ts +576 -0
  49. package/Server/Utils/Alert/AlertStateChangeAuthorization.ts +129 -0
  50. package/Server/Utils/CustomField/CustomFieldRename.ts +378 -0
  51. package/Server/Utils/DataSource/EgressGuard.ts +66 -21
  52. package/Server/Utils/Inventory/InventoryOverviewAggregation.ts +111 -0
  53. package/Server/Utils/Mail/PinnedSmtpSocket.ts +130 -0
  54. package/Server/Utils/Monitor/MonitorCriteriaObservationBuilder.ts +10 -0
  55. package/Server/Utils/Response.ts +31 -0
  56. package/Server/Utils/SSRFProtection.ts +76 -16
  57. package/Server/Utils/StatusPage/IncidentStatusPageScope.ts +948 -0
  58. package/Server/Utils/StatusPage/IncidentSubscriberAudienceBuilder.ts +656 -0
  59. package/Server/Utils/StatusPage/IncidentTemplateVariableBuilder.ts +805 -0
  60. package/Server/Utils/StatusPage/StatusPageExclusion.ts +18 -0
  61. package/Server/Utils/StatusPage/StatusPageReadAccess.ts +125 -0
  62. package/Server/Utils/StatusPage/StatusPageSubscriberUnsubscribeNotice.ts +151 -0
  63. package/Server/Utils/StatusPage/StatusPageSubscriberUnsubscribeToken.ts +70 -0
  64. package/Server/Utils/StatusPage/SubscriberIncidentEmailBuilder.ts +421 -0
  65. package/Server/Utils/StatusPage/SubscriberNotificationClaim.ts +107 -0
  66. package/Server/Utils/StatusPage/SubscriberNotificationDeliveryRecord.ts +1049 -0
  67. package/Server/Utils/StatusPage/SubscriberNotificationFanOut.ts +180 -0
  68. package/Server/Utils/StatusPage/SubscriberNotificationPreviewBuilder.ts +839 -0
  69. package/Server/Utils/StatusPage/SubscriberNotificationResendAccess.ts +393 -0
  70. package/Server/Utils/StatusPage/SubscriberNotificationRunLimit.ts +246 -0
  71. package/Server/Utils/StatusPage/SubscriberNotificationTiming.ts +133 -0
  72. package/Server/Utils/StatusPage/SubscriberTemplateIncidentRecordAccess.ts +215 -0
  73. package/Server/Utils/StatusPageResource.ts +51 -20
  74. package/Server/Utils/Topology/TopologyConcurrencyLimiter.ts +229 -0
  75. package/Server/Utils/Topology/TopologyQueries.ts +1350 -0
  76. package/Server/Utils/Topology/TopologyRequest.ts +463 -0
  77. package/Server/Utils/Topology/TopologyResponseCache.ts +183 -0
  78. package/Server/Utils/Topology/TopologySql.ts +1024 -0
  79. package/Server/Utils/VM/VMAPI.ts +1 -0
  80. package/Server/Utils/VM/VMRunner.ts +10 -0
  81. package/Server/Utils/Workflow/OAuth2TokenClient.ts +10 -0
  82. package/Server/Views/Partials/SensitiveUrlToken.ejs +8 -5
  83. package/Tests/App/Accounts/RegisterVerifyEmail.test.tsx +748 -0
  84. package/Tests/App/Accounts/ResendVerificationEmail.test.tsx +1222 -0
  85. package/Tests/App/Accounts/VerificationEmailResendUtils.test.ts +797 -0
  86. package/Tests/App/Accounts/VerifyEmailPending.test.tsx +538 -0
  87. package/Tests/App/Accounts/VerifyEmailResend.test.tsx +779 -0
  88. package/Tests/App/Dashboard/AcknowledgeAlertsOnDeclare.test.ts +369 -0
  89. package/Tests/App/Dashboard/AffectedResourcesSlo.test.tsx +1 -1
  90. package/Tests/App/Dashboard/AffectedResourcesSummaryStep.test.tsx +510 -123
  91. package/Tests/App/Dashboard/AlertsTableAffectedResources.test.tsx +490 -0
  92. package/Tests/App/Dashboard/ChangeAlertStateDeclareIncident.test.tsx +886 -0
  93. package/Tests/App/Dashboard/CreateReviewStepRoleSummary.test.tsx +1250 -0
  94. package/Tests/App/Dashboard/CreateReviewStepSelectionSummary.test.tsx +738 -0
  95. package/Tests/App/Dashboard/CustomFieldsSettingsIncidentOptions.test.tsx +357 -0
  96. package/Tests/App/Dashboard/DeclareIncidentFromAlert.test.ts +417 -0
  97. package/Tests/App/Dashboard/EntityDetailPanel.test.tsx +1948 -229
  98. package/Tests/App/Dashboard/EntityDetailPanelLifecycle.test.tsx +493 -0
  99. package/Tests/App/Dashboard/EntityDetailPanelNavigation.test.tsx +439 -0
  100. package/Tests/App/Dashboard/EventNotes.test.tsx +776 -0
  101. package/Tests/App/Dashboard/EventNotesPages.test.tsx +119 -0
  102. package/Tests/App/Dashboard/EventNotesUtil.test.ts +116 -17
  103. package/Tests/App/Dashboard/EventOverviewPages.test.tsx +534 -6
  104. package/Tests/App/Dashboard/EventStatusPanel.test.tsx +798 -2
  105. package/Tests/App/Dashboard/FetchStateAndSeverityElements.test.tsx +669 -0
  106. package/Tests/App/Dashboard/FetchUsers.test.tsx +230 -0
  107. package/Tests/App/Dashboard/IncidentChangeStateNotifyDefault.test.tsx +91 -1
  108. package/Tests/App/Dashboard/IncidentCreateAcknowledgeAlerts.test.tsx +1611 -0
  109. package/Tests/App/Dashboard/IncidentCreateDetailsStep.test.tsx +643 -0
  110. package/Tests/App/Dashboard/IncidentCreateFromAlerts.test.tsx +8 -1
  111. package/Tests/App/Dashboard/IncidentCreateStatusPageScope.test.tsx +601 -0
  112. package/Tests/App/Dashboard/IncidentCustomFieldTemplateVariables.test.tsx +386 -0
  113. package/Tests/App/Dashboard/IncidentNoteTemplatePlaceholders.test.tsx +124 -0
  114. package/Tests/App/Dashboard/IncidentNoteTemplateVariablesLoader.test.ts +305 -0
  115. package/Tests/App/Dashboard/IncidentOverviewNotifyDefault.test.tsx +112 -0
  116. package/Tests/App/Dashboard/IncidentSettingsRenotifyOnPublish.test.tsx +674 -0
  117. package/Tests/App/Dashboard/IncidentSettingsStatusPageScope.test.tsx +1051 -0
  118. package/Tests/App/Dashboard/IncidentTemplateCustomFields.test.tsx +384 -0
  119. package/Tests/App/Dashboard/IncidentTemplateStatusPageScopeCard.test.tsx +215 -0
  120. package/Tests/App/Dashboard/InfrastructureExplorer.test.tsx +1365 -57
  121. package/Tests/App/Dashboard/InfrastructureGraph.test.tsx +964 -23
  122. package/Tests/App/Dashboard/InventoryRelationships.test.tsx +885 -0
  123. package/Tests/App/Dashboard/PublicNotePagesNotifyDefault.test.tsx +113 -1
  124. package/Tests/App/Dashboard/ServiceMapDatabaseLink.test.tsx +201 -15
  125. package/Tests/App/Dashboard/ServiceMapGraph.test.tsx +508 -36
  126. package/Tests/App/Dashboard/SubscriberAudienceSummary.test.tsx +512 -0
  127. package/Tests/App/Dashboard/SubscriberNotificationPreviewModal.test.tsx +837 -0
  128. package/Tests/App/Dashboard/SubscriberNotificationStatusLabel.test.tsx +88 -0
  129. package/Tests/App/Dashboard/SubscriberNotificationStatusResend.test.tsx +473 -0
  130. package/Tests/App/Dashboard/SubscriberTemplateLivePreview.test.tsx +196 -0
  131. package/Tests/App/Dashboard/TeamAddedSubscribersUnsubscribedNotice.test.tsx +248 -0
  132. package/Tests/App/Dashboard/TopologyDataLifecycle.test.tsx +583 -0
  133. package/Tests/App/Dashboard/TopologyDataLoading.test.tsx +982 -218
  134. package/Tests/App/Dashboard/TopologyPageNavigation.test.tsx +818 -114
  135. package/Tests/App/SensitiveUrlTokenBootstrap.test.ts +64 -3
  136. package/Tests/App/StatusPage/StatusPageUnsubscribePage.test.tsx +412 -0
  137. package/Tests/Models/IncidentCustomFieldApiSchemaContract.test.ts +217 -0
  138. package/Tests/Models/IncidentCustomFieldCreateSettingsColumns.test.ts +252 -0
  139. package/Tests/Models/StatusPageSubscriberUnsubscribeColumns.test.ts +218 -0
  140. package/Tests/Server/API/ExpiredSessionRouteGuards.test.ts +7 -0
  141. package/Tests/Server/API/IncidentSubscriberAudienceAPI.test.ts +1408 -0
  142. package/Tests/Server/API/StatusPageIncidentScope.test.ts +1868 -0
  143. package/Tests/Server/API/StatusPageIncidentScopePostgres.test.ts +790 -0
  144. package/Tests/Server/API/StatusPageManageSubscriptionRecipient.test.ts +10 -1
  145. package/Tests/Server/API/StatusPageManageSubscriptionTemplateVariables.test.ts +206 -18
  146. package/Tests/Server/API/StatusPagePostmortemVisibility.test.ts +14 -2
  147. package/Tests/Server/API/StatusPageSubscriberCreateResponse.test.ts +217 -0
  148. package/Tests/Server/API/StatusPageSubscriberOwnership.test.ts +103 -2
  149. package/Tests/Server/API/StatusPageUnsubscribeAPI.test.ts +396 -0
  150. package/Tests/Server/Infrastructure/Postgres/AddIncidentStatusPageScopeMigration.test.ts +395 -0
  151. package/Tests/Server/Infrastructure/Postgres/AddIncidentTemplateStatusPageScopeFlagMigration.test.ts +150 -0
  152. package/Tests/Server/Infrastructure/Postgres/AddSubscriberNotificationClaimedAtMigration.test.ts +156 -0
  153. package/Tests/Server/Infrastructure/Postgres/RenameInventoryItemMigration.test.ts +90 -21
  154. package/Tests/Server/Infrastructure/Postgres/SkipHiddenIncidentCreatedNotificationsMigration.test.ts +410 -0
  155. package/Tests/Server/Middleware/IdentityRateLimit.test.ts +551 -1
  156. package/Tests/Server/Middleware/SubscriberNotificationPreviewRateLimit.test.ts +238 -0
  157. package/Tests/Server/Middleware/SubscriberNotificationTestSendRateLimit.test.ts +245 -0
  158. package/Tests/Server/Services/AddStatusPageSubscriberUnsubscribeTokenMigration.test.ts +152 -0
  159. package/Tests/Server/Services/CrossProjectRelationWriteGuard.test.ts +221 -36
  160. package/Tests/Server/Services/DatabaseServiceCompareAndSetColumns.test.ts +191 -0
  161. package/Tests/Server/Services/DomainService.test.ts +525 -0
  162. package/Tests/Server/Services/IncidentAlertAcknowledgeOnDeclare.test.ts +2630 -0
  163. package/Tests/Server/Services/IncidentAlertPostgres.test.ts +1625 -1
  164. package/Tests/Server/Services/IncidentCreatedRenotifyOnPublish.test.ts +681 -0
  165. package/Tests/Server/Services/IncidentCreatedResend.test.ts +775 -0
  166. package/Tests/Server/Services/IncidentCustomFieldRenamePostgres.test.ts +713 -0
  167. package/Tests/Server/Services/IncidentCustomFieldService.test.ts +751 -0
  168. package/Tests/Server/Services/IncidentCustomFieldValueValidation.test.ts +556 -0
  169. package/Tests/Server/Services/IncidentDeclareAcknowledgeAlerts.test.ts +2189 -0
  170. package/Tests/Server/Services/IncidentStatusPageScope.test.ts +2971 -0
  171. package/Tests/Server/Services/IncidentStatusPageScopeFeed.test.ts +131 -0
  172. package/Tests/Server/Services/IncidentStatusPageScopePostgres.test.ts +625 -0
  173. package/Tests/Server/Services/IncidentTemplateCustomFieldsCopy.test.ts +311 -0
  174. package/Tests/Server/Services/IncidentTemplateStatusPageScope.test.ts +363 -0
  175. package/Tests/Server/Services/InventoryItemServiceOverviewCounts.test.ts +345 -0
  176. package/Tests/Server/Services/InventoryOverviewPostgres.test.ts +254 -0
  177. package/Tests/Server/Services/IoTDeviceCredentialService.test.ts +819 -0
  178. package/Tests/Server/Services/LinkedAffectedResourcesCreatedFeed.test.ts +420 -0
  179. package/Tests/Server/Services/PublicNoteEditFeedEventType.test.ts +213 -0
  180. package/Tests/Server/Services/PublicNoteResendAccess.test.ts +994 -0
  181. package/Tests/Server/Services/ScheduledMaintenanceSubscriberTemplateFormats.test.ts +289 -9
  182. package/Tests/Server/Services/SloAffectedResourceCreatedFeed.test.ts +92 -36
  183. package/Tests/Server/Services/SmsServiceFailIfNotSent.test.ts +67 -0
  184. package/Tests/Server/Services/StatusPageReportIncidentCounts.test.ts +610 -0
  185. package/Tests/Server/Services/StatusPageSubscriberAudienceCounts.test.ts +201 -0
  186. package/Tests/Server/Services/StatusPageSubscriberAudienceCountsPostgres.test.ts +271 -0
  187. package/Tests/Server/Services/StatusPageSubscriberConfirmationTemplateEscaping.test.ts +200 -0
  188. package/Tests/Server/Services/StatusPageSubscriberNotificationLogRedaction.test.ts +54 -0
  189. package/Tests/Server/Services/StatusPageSubscriberNotificationTemplateCompile.test.ts +37 -0
  190. package/Tests/Server/Services/StatusPageSubscriberNotificationTemplateIncidentRecordAccess.test.ts +772 -0
  191. package/Tests/Server/Services/StatusPageSubscriberNotificationTemplateLookup.test.ts +506 -0
  192. package/Tests/Server/Services/StatusPageSubscriberNotificationTemplateLookupPostgres.test.ts +261 -0
  193. package/Tests/Server/Services/StatusPageSubscriberReport.test.ts +21 -5
  194. package/Tests/Server/Services/StatusPageSubscriberUnsubscribe.test.ts +1618 -0
  195. package/Tests/Server/Services/StatusPageSubscriberUnsubscribeLinkSenders.test.ts +373 -0
  196. package/Tests/Server/Services/StatusPageSubscriberUnsubscribePostgres.test.ts +388 -0
  197. package/Tests/Server/Services/SubscriberNotificationInFlightRequeue.test.ts +500 -0
  198. package/Tests/Server/Types/MarkdownEmailLinks.test.ts +320 -0
  199. package/Tests/Server/Types/Workflow/Components/Email.test.ts +491 -1
  200. package/Tests/Server/Types/Workflow/Components/EmailSmtpPinning.test.ts +398 -0
  201. package/Tests/Server/Utils/AffectedResources/LinkedAffectedResources.test.ts +858 -0
  202. package/Tests/Server/Utils/Alert/AlertStateChangeAuthorization.test.ts +1172 -0
  203. package/Tests/Server/Utils/CustomField/CustomFieldRename.test.ts +586 -0
  204. package/Tests/Server/Utils/DataSource/EgressGuard.test.ts +246 -10
  205. package/Tests/Server/Utils/DataSource/EgressGuardDeploymentConfig.test.ts +226 -0
  206. package/Tests/Server/Utils/DataSource/EgressGuardPinning.test.ts +131 -0
  207. package/Tests/Server/Utils/DataSource/HttpFetch.test.ts +4 -0
  208. package/Tests/Server/Utils/EgressPolicyEnvironment.ts +45 -0
  209. package/Tests/Server/Utils/Mail/PinnedSmtpSocket.test.ts +409 -0
  210. package/Tests/Server/Utils/Monitor/MonitorCriteriaObservationBuilderUnits.test.ts +23 -0
  211. package/Tests/Server/Utils/SSRFProtection.test.ts +4 -0
  212. package/Tests/Server/Utils/SSRFProtectionCloudServiceAddresses.test.ts +4 -0
  213. package/Tests/Server/Utils/SSRFProtectionPrivateNetwork.test.ts +4 -0
  214. package/Tests/Server/Utils/SSRFProtectionResolutionDetail.test.ts +314 -0
  215. package/Tests/Server/Utils/StatusPage/IncidentStatusPageScope.test.ts +1699 -0
  216. package/Tests/Server/Utils/StatusPage/IncidentStatusPageScopeQueriesPostgres.test.ts +508 -0
  217. package/Tests/Server/Utils/StatusPage/IncidentSubscriberAudienceCallerPermission.test.ts +246 -0
  218. package/Tests/Server/Utils/StatusPage/IncidentTemplateVariableBuilder.test.ts +1348 -0
  219. package/Tests/Server/Utils/StatusPage/StatusPageReadAccess.test.ts +221 -0
  220. package/Tests/Server/Utils/StatusPage/StatusPageSubscriberUnsubscribeNotice.test.ts +132 -0
  221. package/Tests/Server/Utils/StatusPage/StatusPageSubscriberUnsubscribeToken.test.ts +155 -0
  222. package/Tests/Server/Utils/StatusPage/SubscriberIncidentEmailBuilder.test.ts +708 -0
  223. package/Tests/Server/Utils/StatusPage/SubscriberNotificationClaim.test.ts +255 -0
  224. package/Tests/Server/Utils/StatusPage/SubscriberNotificationClaimPostgres.test.ts +528 -0
  225. package/Tests/Server/Utils/StatusPage/SubscriberNotificationDeliveryRecord.test.ts +1238 -0
  226. package/Tests/Server/Utils/StatusPage/SubscriberNotificationFanOut.test.ts +472 -0
  227. package/Tests/Server/Utils/StatusPage/SubscriberNotificationPreviewBuilder.test.ts +1168 -0
  228. package/Tests/Server/Utils/StatusPage/SubscriberNotificationRunLimit.test.ts +275 -0
  229. package/Tests/Server/Utils/StatusPage/SubscriberNotificationTiming.test.ts +131 -0
  230. package/Tests/Server/Utils/StatusPageResource.test.ts +98 -0
  231. package/Tests/Server/Utils/Topology/InventoryItemEntityKeyIndexMigration.test.ts +386 -0
  232. package/Tests/Server/Utils/Topology/InventoryItemEntityKeyIndexMigrationPostgres.test.ts +430 -0
  233. package/Tests/Server/Utils/Topology/TopologyActivityParityPostgres.test.ts +279 -0
  234. package/Tests/Server/Utils/Topology/TopologyConcurrencyLimiter.test.ts +534 -0
  235. package/Tests/Server/Utils/Topology/TopologyEstateGenerator.ts +624 -0
  236. package/Tests/Server/Utils/Topology/TopologyJsonResponse.test.ts +90 -0
  237. package/Tests/Server/Utils/Topology/TopologyQueries.test.ts +1634 -0
  238. package/Tests/Server/Utils/Topology/TopologyQueriesDifferentialPostgres.test.ts +683 -0
  239. package/Tests/Server/Utils/Topology/TopologyQueriesPostgres.test.ts +2624 -0
  240. package/Tests/Server/Utils/Topology/TopologyReference.ts +1018 -0
  241. package/Tests/Server/Utils/Topology/TopologyRequest.test.ts +643 -0
  242. package/Tests/Server/Utils/Topology/TopologyResponseCache.test.ts +305 -0
  243. package/Tests/Server/Utils/Topology/TopologySql.test.ts +973 -0
  244. package/Tests/Server/Utils/VM/VMRunnerPrivateNetworkWiring.test.ts +17 -0
  245. package/Tests/Server/Utils/VM/VMRunnerSsrf.test.ts +75 -0
  246. package/Tests/Types/CustomField/CustomFieldSavedViews.test.ts +247 -0
  247. package/Tests/Types/CustomField/CustomFieldTemplateValues.test.ts +186 -0
  248. package/Tests/Types/CustomField/CustomFieldTypeCorrespondence.test.ts +48 -0
  249. package/Tests/Types/CustomField/CustomFieldValueFormat.test.ts +215 -0
  250. package/Tests/Types/CustomField/CustomFieldValueValidator.test.ts +343 -0
  251. package/Tests/Types/CustomField/CustomFieldVariableKey.test.ts +364 -0
  252. package/Tests/Types/SafeHtml.test.ts +102 -0
  253. package/Tests/Types/StatusPage/IncidentCreatedRenotify.test.ts +419 -0
  254. package/Tests/Types/StatusPage/IncidentCreatedResend.test.ts +118 -0
  255. package/Tests/Types/StatusPage/IncidentScopeAddedPagesNotification.test.ts +558 -0
  256. package/Tests/Types/StatusPage/IncidentSubscriberAudience.test.ts +284 -0
  257. package/Tests/Types/StatusPage/StatusPageSubscriberUnsubscribe.test.ts +341 -0
  258. package/Tests/Types/StatusPage/SubscriberNotificationPreview.test.ts +196 -0
  259. package/Tests/Types/StatusPage/SubscriberNotificationResend.test.ts +201 -0
  260. package/Tests/Types/StatusPage/SubscriberNotificationTemplateCompiler.test.ts +277 -0
  261. package/Tests/Types/StatusPage/SubscriberNotificationTemplatePreview.test.ts +179 -0
  262. package/Tests/Types/StatusPage/SubscriberNotificationTemplateVariables.test.ts +324 -0
  263. package/Tests/Types/StatusPage/SubscriberUpdateNotification.test.ts +60 -13
  264. package/Tests/Types/Topology/TopologyTypeRules.test.ts +176 -0
  265. package/Tests/UI/Components/CustomFields/CustomFieldFormFields.test.ts +432 -0
  266. package/Tests/UI/Components/CustomFields/CustomFieldModelFormFields.test.tsx +685 -0
  267. package/Tests/UI/Components/CustomFields/CustomFieldsDetailOrder.test.tsx +469 -0
  268. package/Tests/UI/Components/Forms/ModelFormCustomFieldInputs.test.tsx +325 -0
  269. package/Tests/UI/Components/Forms/ModelFormDropdownOptionsRefused.test.tsx +358 -0
  270. package/Tests/UI/Components/ModelTable/CustomFieldColumns.test.tsx +22 -0
  271. package/Tests/UI/Monitor/NetworkPathView.test.tsx +289 -0
  272. package/Tests/Utils/Incident/IncidentFromAlerts.test.ts +302 -0
  273. package/Tests/Utils/Incident/IncidentNoteTemplateVariables.test.ts +623 -0
  274. package/Tests/Utils/Markdown/MarkdownEscape.test.ts +89 -0
  275. package/Tests/Utils/ProbeNetworkFailureUtil.test.ts +992 -0
  276. package/Tests/Utils/RequestFailedDetails.test.ts +575 -0
  277. package/Types/CustomField/CustomFieldOrder.ts +55 -0
  278. package/Types/CustomField/CustomFieldSavedViews.ts +225 -0
  279. package/Types/CustomField/CustomFieldTemplateMerge.ts +71 -0
  280. package/Types/CustomField/CustomFieldType.ts +14 -0
  281. package/Types/CustomField/CustomFieldValueFormat.ts +161 -0
  282. package/Types/CustomField/CustomFieldValueValidator.ts +488 -0
  283. package/Types/CustomField/CustomFieldVariableKey.ts +211 -0
  284. package/Types/Incident/IncidentAlertLink.ts +19 -0
  285. package/Types/SafeHtml.ts +93 -0
  286. package/Types/StatusPage/IncidentCreatedRenotify.ts +224 -0
  287. package/Types/StatusPage/IncidentCreatedResend.ts +108 -0
  288. package/Types/StatusPage/IncidentScopeAddedPagesNotification.ts +343 -0
  289. package/Types/StatusPage/IncidentSubscriberAudience.ts +332 -0
  290. package/Types/StatusPage/StatusPageSubscriberUnsubscribe.ts +405 -0
  291. package/Types/StatusPage/SubscriberNotificationInterruption.ts +32 -0
  292. package/Types/StatusPage/SubscriberNotificationPreview.ts +322 -0
  293. package/Types/StatusPage/SubscriberNotificationResend.ts +132 -0
  294. package/Types/StatusPage/SubscriberNotificationTemplateCompiler.ts +180 -0
  295. package/Types/StatusPage/SubscriberNotificationTemplatePreview.ts +301 -0
  296. package/Types/StatusPage/SubscriberNotificationTemplateVariables.ts +217 -4
  297. package/Types/StatusPage/SubscriberUpdateNotification.ts +32 -11
  298. package/Types/Telemetry/InventoryLiveness.ts +26 -0
  299. package/Types/Topology/TopologyApi.ts +428 -0
  300. package/Types/Topology/TopologyTypeRules.ts +191 -0
  301. package/UI/Components/CustomFields/CustomFieldFormFields.ts +317 -0
  302. package/UI/Components/CustomFields/CustomFieldModelFormFields.tsx +395 -0
  303. package/UI/Components/CustomFields/CustomFieldsDetail.tsx +95 -55
  304. package/UI/Components/Forms/ModelForm.tsx +70 -8
  305. package/UI/Components/Forms/Validation.ts +1 -1
  306. package/UI/Components/ModelFormModal/ModelFormModal.tsx +2 -4
  307. package/UI/Components/ModelTable/AnalyticsModelTable.tsx +2 -6
  308. package/UI/Components/ModelTable/BaseModelTable.tsx +9 -8
  309. package/UI/Components/ModelTable/CustomFieldColumns.tsx +14 -1
  310. package/UI/Components/ModelTable/ModelTable.tsx +6 -7
  311. package/UI/Utils/SensitiveUrlToken.ts +10 -5
  312. package/Utils/API.ts +247 -2
  313. package/Utils/Incident/IncidentFromAlerts.ts +78 -0
  314. package/Utils/Incident/IncidentNoteTemplateVariables.ts +304 -0
  315. package/Utils/Markdown/MarkdownEscape.ts +65 -0
  316. package/Utils/ProbeNetworkFailureUtil.ts +673 -0
  317. package/build/dist/Models/DatabaseModels/Incident.js +267 -1
  318. package/build/dist/Models/DatabaseModels/Incident.js.map +1 -1
  319. package/build/dist/Models/DatabaseModels/IncidentCustomField.js +207 -1
  320. package/build/dist/Models/DatabaseModels/IncidentCustomField.js.map +1 -1
  321. package/build/dist/Models/DatabaseModels/IncidentEpisode.js +31 -0
  322. package/build/dist/Models/DatabaseModels/IncidentEpisode.js.map +1 -1
  323. package/build/dist/Models/DatabaseModels/IncidentTemplate.js +124 -1
  324. package/build/dist/Models/DatabaseModels/IncidentTemplate.js.map +1 -1
  325. package/build/dist/Models/DatabaseModels/InventoryItem.js +20 -11
  326. package/build/dist/Models/DatabaseModels/InventoryItem.js.map +1 -1
  327. package/build/dist/Models/DatabaseModels/StatusPage.js +56 -0
  328. package/build/dist/Models/DatabaseModels/StatusPage.js.map +1 -1
  329. package/build/dist/Models/DatabaseModels/StatusPageSubscriber.js +131 -0
  330. package/build/dist/Models/DatabaseModels/StatusPageSubscriber.js.map +1 -1
  331. package/build/dist/Server/API/IncidentAPI.js +100 -1
  332. package/build/dist/Server/API/IncidentAPI.js.map +1 -1
  333. package/build/dist/Server/API/StatusPageAPI.js +417 -176
  334. package/build/dist/Server/API/StatusPageAPI.js.map +1 -1
  335. package/build/dist/Server/API/StatusPageSubscriberAPI.js +52 -13
  336. package/build/dist/Server/API/StatusPageSubscriberAPI.js.map +1 -1
  337. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1795200000000-AddInventoryItemProjectEntityKeyIndex.js +165 -0
  338. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1795200000000-AddInventoryItemProjectEntityKeyIndex.js.map +1 -0
  339. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1795300000000-SkipHiddenIncidentCreatedNotifications.js +41 -0
  340. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1795300000000-SkipHiddenIncidentCreatedNotifications.js.map +1 -0
  341. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1795400000000-AddIncidentStatusPageScope.js +57 -0
  342. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1795400000000-AddIncidentStatusPageScope.js.map +1 -0
  343. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1795500000000-AddIncidentTemplateStatusPageScopeFlag.js +23 -0
  344. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1795500000000-AddIncidentTemplateStatusPageScopeFlag.js.map +1 -0
  345. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1795600000000-AddStatusPageSubscriberUnsubscribeToken.js +40 -0
  346. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1795600000000-AddStatusPageSubscriberUnsubscribeToken.js.map +1 -0
  347. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1795700000000-AddStatusPageSubscriberIsAddedByTeam.js +26 -0
  348. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1795700000000-AddStatusPageSubscriberIsAddedByTeam.js.map +1 -0
  349. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1795800000000-AddIncidentCustomFieldCreateAndNotificationSettings.js +89 -0
  350. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1795800000000-AddIncidentCustomFieldCreateAndNotificationSettings.js.map +1 -0
  351. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1795900000000-AddSubscriberNotificationClaimedAt.js +29 -0
  352. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1795900000000-AddSubscriberNotificationClaimedAt.js.map +1 -0
  353. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js +16 -0
  354. package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js.map +1 -1
  355. package/build/dist/Server/Infrastructure/Semaphore.js +3 -0
  356. package/build/dist/Server/Infrastructure/Semaphore.js.map +1 -1
  357. package/build/dist/Server/Middleware/IdentityRateLimit.js +89 -3
  358. package/build/dist/Server/Middleware/IdentityRateLimit.js.map +1 -1
  359. package/build/dist/Server/Middleware/SubscriberNotificationPreviewRateLimit.js +149 -0
  360. package/build/dist/Server/Middleware/SubscriberNotificationPreviewRateLimit.js.map +1 -0
  361. package/build/dist/Server/Middleware/SubscriberNotificationTestSendRateLimit.js +190 -0
  362. package/build/dist/Server/Middleware/SubscriberNotificationTestSendRateLimit.js.map +1 -0
  363. package/build/dist/Server/Services/AlertService.js +21 -33
  364. package/build/dist/Server/Services/AlertService.js.map +1 -1
  365. package/build/dist/Server/Services/DatabaseService.js +56 -7
  366. package/build/dist/Server/Services/DatabaseService.js.map +1 -1
  367. package/build/dist/Server/Services/IncidentAlertService.js +457 -3
  368. package/build/dist/Server/Services/IncidentAlertService.js.map +1 -1
  369. package/build/dist/Server/Services/IncidentCustomFieldService.js +204 -8
  370. package/build/dist/Server/Services/IncidentCustomFieldService.js.map +1 -1
  371. package/build/dist/Server/Services/IncidentEpisodePublicNoteService.js +24 -0
  372. package/build/dist/Server/Services/IncidentEpisodePublicNoteService.js.map +1 -1
  373. package/build/dist/Server/Services/IncidentEpisodeService.js +14 -0
  374. package/build/dist/Server/Services/IncidentEpisodeService.js.map +1 -1
  375. package/build/dist/Server/Services/IncidentEpisodeStateTimelineService.js +26 -0
  376. package/build/dist/Server/Services/IncidentEpisodeStateTimelineService.js.map +1 -1
  377. package/build/dist/Server/Services/IncidentPublicNoteService.js +26 -1
  378. package/build/dist/Server/Services/IncidentPublicNoteService.js.map +1 -1
  379. package/build/dist/Server/Services/IncidentService.js +1148 -42
  380. package/build/dist/Server/Services/IncidentService.js.map +1 -1
  381. package/build/dist/Server/Services/IncidentStateTimelineService.js +12 -0
  382. package/build/dist/Server/Services/IncidentStateTimelineService.js.map +1 -1
  383. package/build/dist/Server/Services/IncidentTemplateService.js +83 -0
  384. package/build/dist/Server/Services/IncidentTemplateService.js.map +1 -1
  385. package/build/dist/Server/Services/InventoryItemService.js +31 -0
  386. package/build/dist/Server/Services/InventoryItemService.js.map +1 -1
  387. package/build/dist/Server/Services/IoTDeviceCredentialService.js +12 -5
  388. package/build/dist/Server/Services/IoTDeviceCredentialService.js.map +1 -1
  389. package/build/dist/Server/Services/ScheduledMaintenancePublicNoteService.js +26 -1
  390. package/build/dist/Server/Services/ScheduledMaintenancePublicNoteService.js.map +1 -1
  391. package/build/dist/Server/Services/ScheduledMaintenanceService.js +84 -57
  392. package/build/dist/Server/Services/ScheduledMaintenanceService.js.map +1 -1
  393. package/build/dist/Server/Services/SmsService.js +2 -22
  394. package/build/dist/Server/Services/SmsService.js.map +1 -1
  395. package/build/dist/Server/Services/StatusPageService.js +47 -9
  396. package/build/dist/Server/Services/StatusPageService.js.map +1 -1
  397. package/build/dist/Server/Services/StatusPageSubscriberNotificationTemplateService.js +237 -32
  398. package/build/dist/Server/Services/StatusPageSubscriberNotificationTemplateService.js.map +1 -1
  399. package/build/dist/Server/Services/StatusPageSubscriberNotificationTemplateStatusPageService.js +109 -0
  400. package/build/dist/Server/Services/StatusPageSubscriberNotificationTemplateStatusPageService.js.map +1 -1
  401. package/build/dist/Server/Services/StatusPageSubscriberService.js +925 -99
  402. package/build/dist/Server/Services/StatusPageSubscriberService.js.map +1 -1
  403. package/build/dist/Server/Services/UserNotificationRuleService.js +55 -51
  404. package/build/dist/Server/Services/UserNotificationRuleService.js.map +1 -1
  405. package/build/dist/Server/Services/WorkspaceNotificationSummaryService.js +42 -25
  406. package/build/dist/Server/Services/WorkspaceNotificationSummaryService.js.map +1 -1
  407. package/build/dist/Server/Types/Markdown.js +110 -6
  408. package/build/dist/Server/Types/Markdown.js.map +1 -1
  409. package/build/dist/Server/Types/Workflow/Components/Email.js +55 -6
  410. package/build/dist/Server/Types/Workflow/Components/Email.js.map +1 -1
  411. package/build/dist/Server/Utils/AffectedResources/LinkedAffectedResources.js +405 -0
  412. package/build/dist/Server/Utils/AffectedResources/LinkedAffectedResources.js.map +1 -0
  413. package/build/dist/Server/Utils/Alert/AlertStateChangeAuthorization.js +112 -0
  414. package/build/dist/Server/Utils/Alert/AlertStateChangeAuthorization.js.map +1 -0
  415. package/build/dist/Server/Utils/CustomField/CustomFieldRename.js +211 -0
  416. package/build/dist/Server/Utils/CustomField/CustomFieldRename.js.map +1 -0
  417. package/build/dist/Server/Utils/DataSource/EgressGuard.js +41 -12
  418. package/build/dist/Server/Utils/DataSource/EgressGuard.js.map +1 -1
  419. package/build/dist/Server/Utils/Inventory/InventoryOverviewAggregation.js +81 -0
  420. package/build/dist/Server/Utils/Inventory/InventoryOverviewAggregation.js.map +1 -0
  421. package/build/dist/Server/Utils/Mail/PinnedSmtpSocket.js +101 -0
  422. package/build/dist/Server/Utils/Mail/PinnedSmtpSocket.js.map +1 -0
  423. package/build/dist/Server/Utils/Monitor/MonitorCriteriaObservationBuilder.js +9 -0
  424. package/build/dist/Server/Utils/Monitor/MonitorCriteriaObservationBuilder.js.map +1 -1
  425. package/build/dist/Server/Utils/Response.js +30 -0
  426. package/build/dist/Server/Utils/Response.js.map +1 -1
  427. package/build/dist/Server/Utils/SSRFProtection.js +48 -6
  428. package/build/dist/Server/Utils/SSRFProtection.js.map +1 -1
  429. package/build/dist/Server/Utils/StatusPage/IncidentStatusPageScope.js +631 -0
  430. package/build/dist/Server/Utils/StatusPage/IncidentStatusPageScope.js.map +1 -0
  431. package/build/dist/Server/Utils/StatusPage/IncidentSubscriberAudienceBuilder.js +403 -0
  432. package/build/dist/Server/Utils/StatusPage/IncidentSubscriberAudienceBuilder.js.map +1 -0
  433. package/build/dist/Server/Utils/StatusPage/IncidentTemplateVariableBuilder.js +451 -0
  434. package/build/dist/Server/Utils/StatusPage/IncidentTemplateVariableBuilder.js.map +1 -0
  435. package/build/dist/Server/Utils/StatusPage/StatusPageExclusion.js +13 -0
  436. package/build/dist/Server/Utils/StatusPage/StatusPageExclusion.js.map +1 -0
  437. package/build/dist/Server/Utils/StatusPage/StatusPageReadAccess.js +91 -0
  438. package/build/dist/Server/Utils/StatusPage/StatusPageReadAccess.js.map +1 -0
  439. package/build/dist/Server/Utils/StatusPage/StatusPageSubscriberUnsubscribeNotice.js +101 -0
  440. package/build/dist/Server/Utils/StatusPage/StatusPageSubscriberUnsubscribeNotice.js.map +1 -0
  441. package/build/dist/Server/Utils/StatusPage/StatusPageSubscriberUnsubscribeToken.js +47 -0
  442. package/build/dist/Server/Utils/StatusPage/StatusPageSubscriberUnsubscribeToken.js.map +1 -0
  443. package/build/dist/Server/Utils/StatusPage/SubscriberIncidentEmailBuilder.js +273 -0
  444. package/build/dist/Server/Utils/StatusPage/SubscriberIncidentEmailBuilder.js.map +1 -0
  445. package/build/dist/Server/Utils/StatusPage/SubscriberNotificationClaim.js +73 -0
  446. package/build/dist/Server/Utils/StatusPage/SubscriberNotificationClaim.js.map +1 -0
  447. package/build/dist/Server/Utils/StatusPage/SubscriberNotificationDeliveryRecord.js +722 -0
  448. package/build/dist/Server/Utils/StatusPage/SubscriberNotificationDeliveryRecord.js.map +1 -0
  449. package/build/dist/Server/Utils/StatusPage/SubscriberNotificationFanOut.js +102 -0
  450. package/build/dist/Server/Utils/StatusPage/SubscriberNotificationFanOut.js.map +1 -0
  451. package/build/dist/Server/Utils/StatusPage/SubscriberNotificationPreviewBuilder.js +527 -0
  452. package/build/dist/Server/Utils/StatusPage/SubscriberNotificationPreviewBuilder.js.map +1 -0
  453. package/build/dist/Server/Utils/StatusPage/SubscriberNotificationResendAccess.js +278 -0
  454. package/build/dist/Server/Utils/StatusPage/SubscriberNotificationResendAccess.js.map +1 -0
  455. package/build/dist/Server/Utils/StatusPage/SubscriberNotificationRunLimit.js +137 -0
  456. package/build/dist/Server/Utils/StatusPage/SubscriberNotificationRunLimit.js.map +1 -0
  457. package/build/dist/Server/Utils/StatusPage/SubscriberNotificationTiming.js +103 -0
  458. package/build/dist/Server/Utils/StatusPage/SubscriberNotificationTiming.js.map +1 -0
  459. package/build/dist/Server/Utils/StatusPage/SubscriberTemplateIncidentRecordAccess.js +114 -0
  460. package/build/dist/Server/Utils/StatusPage/SubscriberTemplateIncidentRecordAccess.js.map +1 -0
  461. package/build/dist/Server/Utils/StatusPageResource.js +39 -7
  462. package/build/dist/Server/Utils/StatusPageResource.js.map +1 -1
  463. package/build/dist/Server/Utils/Topology/TopologyConcurrencyLimiter.js +178 -0
  464. package/build/dist/Server/Utils/Topology/TopologyConcurrencyLimiter.js.map +1 -0
  465. package/build/dist/Server/Utils/Topology/TopologyQueries.js +884 -0
  466. package/build/dist/Server/Utils/Topology/TopologyQueries.js.map +1 -0
  467. package/build/dist/Server/Utils/Topology/TopologyRequest.js +275 -0
  468. package/build/dist/Server/Utils/Topology/TopologyRequest.js.map +1 -0
  469. package/build/dist/Server/Utils/Topology/TopologyResponseCache.js +146 -0
  470. package/build/dist/Server/Utils/Topology/TopologyResponseCache.js.map +1 -0
  471. package/build/dist/Server/Utils/Topology/TopologySql.js +688 -0
  472. package/build/dist/Server/Utils/Topology/TopologySql.js.map +1 -0
  473. package/build/dist/Server/Utils/VM/VMAPI.js.map +1 -1
  474. package/build/dist/Server/Utils/VM/VMRunner.js +1 -0
  475. package/build/dist/Server/Utils/VM/VMRunner.js.map +1 -1
  476. package/build/dist/Server/Utils/Workflow/OAuth2TokenClient.js +3 -0
  477. package/build/dist/Server/Utils/Workflow/OAuth2TokenClient.js.map +1 -1
  478. package/build/dist/Types/CustomField/CustomFieldOrder.js +36 -0
  479. package/build/dist/Types/CustomField/CustomFieldOrder.js.map +1 -0
  480. package/build/dist/Types/CustomField/CustomFieldSavedViews.js +135 -0
  481. package/build/dist/Types/CustomField/CustomFieldSavedViews.js.map +1 -0
  482. package/build/dist/Types/CustomField/CustomFieldTemplateMerge.js +27 -0
  483. package/build/dist/Types/CustomField/CustomFieldTemplateMerge.js.map +1 -0
  484. package/build/dist/Types/CustomField/CustomFieldType.js +12 -0
  485. package/build/dist/Types/CustomField/CustomFieldType.js.map +1 -1
  486. package/build/dist/Types/CustomField/CustomFieldValueFormat.js +126 -0
  487. package/build/dist/Types/CustomField/CustomFieldValueFormat.js.map +1 -0
  488. package/build/dist/Types/CustomField/CustomFieldValueValidator.js +280 -0
  489. package/build/dist/Types/CustomField/CustomFieldValueValidator.js.map +1 -0
  490. package/build/dist/Types/CustomField/CustomFieldVariableKey.js +150 -0
  491. package/build/dist/Types/CustomField/CustomFieldVariableKey.js.map +1 -0
  492. package/build/dist/Types/Incident/IncidentAlertLink.js +17 -0
  493. package/build/dist/Types/Incident/IncidentAlertLink.js.map +1 -1
  494. package/build/dist/Types/SafeHtml.js +84 -0
  495. package/build/dist/Types/SafeHtml.js.map +1 -0
  496. package/build/dist/Types/StatusPage/IncidentCreatedRenotify.js +117 -0
  497. package/build/dist/Types/StatusPage/IncidentCreatedRenotify.js.map +1 -0
  498. package/build/dist/Types/StatusPage/IncidentCreatedResend.js +86 -0
  499. package/build/dist/Types/StatusPage/IncidentCreatedResend.js.map +1 -0
  500. package/build/dist/Types/StatusPage/IncidentScopeAddedPagesNotification.js +246 -0
  501. package/build/dist/Types/StatusPage/IncidentScopeAddedPagesNotification.js.map +1 -0
  502. package/build/dist/Types/StatusPage/IncidentSubscriberAudience.js +183 -0
  503. package/build/dist/Types/StatusPage/IncidentSubscriberAudience.js.map +1 -0
  504. package/build/dist/Types/StatusPage/StatusPageSubscriberUnsubscribe.js +277 -0
  505. package/build/dist/Types/StatusPage/StatusPageSubscriberUnsubscribe.js.map +1 -0
  506. package/build/dist/Types/StatusPage/SubscriberNotificationInterruption.js +27 -0
  507. package/build/dist/Types/StatusPage/SubscriberNotificationInterruption.js.map +1 -0
  508. package/build/dist/Types/StatusPage/SubscriberNotificationPreview.js +190 -0
  509. package/build/dist/Types/StatusPage/SubscriberNotificationPreview.js.map +1 -0
  510. package/build/dist/Types/StatusPage/SubscriberNotificationResend.js +102 -0
  511. package/build/dist/Types/StatusPage/SubscriberNotificationResend.js.map +1 -0
  512. package/build/dist/Types/StatusPage/SubscriberNotificationTemplateCompiler.js +97 -0
  513. package/build/dist/Types/StatusPage/SubscriberNotificationTemplateCompiler.js.map +1 -0
  514. package/build/dist/Types/StatusPage/SubscriberNotificationTemplatePreview.js +175 -0
  515. package/build/dist/Types/StatusPage/SubscriberNotificationTemplatePreview.js.map +1 -0
  516. package/build/dist/Types/StatusPage/SubscriberNotificationTemplateVariables.js +144 -4
  517. package/build/dist/Types/StatusPage/SubscriberNotificationTemplateVariables.js.map +1 -1
  518. package/build/dist/Types/StatusPage/SubscriberUpdateNotification.js +29 -9
  519. package/build/dist/Types/StatusPage/SubscriberUpdateNotification.js.map +1 -1
  520. package/build/dist/Types/Telemetry/InventoryLiveness.js +23 -0
  521. package/build/dist/Types/Telemetry/InventoryLiveness.js.map +1 -1
  522. package/build/dist/Types/Topology/TopologyApi.js +55 -0
  523. package/build/dist/Types/Topology/TopologyApi.js.map +1 -0
  524. package/build/dist/Types/Topology/TopologyTypeRules.js +165 -0
  525. package/build/dist/Types/Topology/TopologyTypeRules.js.map +1 -0
  526. package/build/dist/UI/Components/CustomFields/CustomFieldFormFields.js +169 -0
  527. package/build/dist/UI/Components/CustomFields/CustomFieldFormFields.js.map +1 -0
  528. package/build/dist/UI/Components/CustomFields/CustomFieldModelFormFields.js +212 -0
  529. package/build/dist/UI/Components/CustomFields/CustomFieldModelFormFields.js.map +1 -0
  530. package/build/dist/UI/Components/CustomFields/CustomFieldsDetail.js +64 -49
  531. package/build/dist/UI/Components/CustomFields/CustomFieldsDetail.js.map +1 -1
  532. package/build/dist/UI/Components/Forms/ModelForm.js +39 -5
  533. package/build/dist/UI/Components/Forms/ModelForm.js.map +1 -1
  534. package/build/dist/UI/Components/Forms/Validation.js +1 -1
  535. package/build/dist/UI/Components/Forms/Validation.js.map +1 -1
  536. package/build/dist/UI/Components/ModelFormModal/ModelFormModal.js.map +1 -1
  537. package/build/dist/UI/Components/ModelTable/AnalyticsModelTable.js.map +1 -1
  538. package/build/dist/UI/Components/ModelTable/BaseModelTable.js +2 -2
  539. package/build/dist/UI/Components/ModelTable/BaseModelTable.js.map +1 -1
  540. package/build/dist/UI/Components/ModelTable/CustomFieldColumns.js +13 -1
  541. package/build/dist/UI/Components/ModelTable/CustomFieldColumns.js.map +1 -1
  542. package/build/dist/UI/Components/ModelTable/ModelTable.js +1 -1
  543. package/build/dist/UI/Components/ModelTable/ModelTable.js.map +1 -1
  544. package/build/dist/UI/Utils/SensitiveUrlToken.js +10 -5
  545. package/build/dist/UI/Utils/SensitiveUrlToken.js.map +1 -1
  546. package/build/dist/Utils/API.js +177 -1
  547. package/build/dist/Utils/API.js.map +1 -1
  548. package/build/dist/Utils/Incident/IncidentFromAlerts.js +38 -0
  549. package/build/dist/Utils/Incident/IncidentFromAlerts.js.map +1 -1
  550. package/build/dist/Utils/Incident/IncidentNoteTemplateVariables.js +155 -0
  551. package/build/dist/Utils/Incident/IncidentNoteTemplateVariables.js.map +1 -0
  552. package/build/dist/Utils/Markdown/MarkdownEscape.js +48 -0
  553. package/build/dist/Utils/Markdown/MarkdownEscape.js.map +1 -1
  554. package/build/dist/Utils/ProbeNetworkFailureUtil.js +460 -0
  555. package/build/dist/Utils/ProbeNetworkFailureUtil.js.map +1 -0
  556. package/package.json +1 -1
@@ -0,0 +1,126 @@
1
+ import { isCustomFieldValueEmpty } from "./CustomFieldValueMapping";
2
+ /*
3
+ * How a stored custom field value reads as words, for everything that puts a
4
+ * value in front of a person outside the Custom Fields card: an incident
5
+ * note's {{customFields.<key>}} placeholder (Common/Utils/Incident/
6
+ * IncidentNoteTemplateVariables) and the status page subscriber messages
7
+ * (Common/Server/Utils/StatusPage/IncidentTemplateVariableBuilder).
8
+ *
9
+ * Only the reading is shared here. Where the words then go decides the rest:
10
+ * a note escapes them as Markdown, an email as HTML, an SMS takes them as
11
+ * they are. A date and time reads in the note author's time zone in a note,
12
+ * and in the status page's subscriber time zones in its emails, so that is
13
+ * left to the caller too.
14
+ *
15
+ * Pure, with no database or React imports, so the server and the dashboard
16
+ * share it and it is tested directly.
17
+ */
18
+ /*
19
+ * A day with no time zone: "2026-09-27", or a wall-clock time on it with no
20
+ * offset ("2026-09-27T00:00:00"). Its day is the one it names, wherever it is
21
+ * read.
22
+ */
23
+ const DAY_WITHOUT_TIME_ZONE_PATTERN = /^(\d{4}-\d{2}-\d{2})(?:[T ]\d{2}:\d{2}(?::\d{2}(?:\.\d+)?)?)?$/;
24
+ /*
25
+ * What a Date value's instant is moved by before its UTC day is read; see
26
+ * formatCustomFieldCalendarDate.
27
+ */
28
+ const PICKED_DAY_SHIFT_MS = 13 * 60 * 60 * 1000;
29
+ /**
30
+ * Plain text for a value of no particular type: a list joined with commas
31
+ * (its empty entries left out), a Date as its ISO string, an object as JSON,
32
+ * anything else as String() gives it. null and undefined are "".
33
+ */
34
+ export const customFieldValueToText = (value) => {
35
+ if (value === null || value === undefined) {
36
+ return "";
37
+ }
38
+ if (Array.isArray(value)) {
39
+ return value
40
+ .filter((entry) => {
41
+ return !isCustomFieldValueEmpty(entry);
42
+ })
43
+ .map((entry) => {
44
+ return customFieldValueToText(entry);
45
+ })
46
+ .join(", ");
47
+ }
48
+ if (value instanceof Date) {
49
+ return isNaN(value.getTime()) ? "" : value.toISOString();
50
+ }
51
+ if (typeof value === "object") {
52
+ try {
53
+ return JSON.stringify(value);
54
+ }
55
+ catch (_a) {
56
+ return String(value);
57
+ }
58
+ }
59
+ return String(value);
60
+ };
61
+ /**
62
+ * The instant a Date or DateTime value holds, or null when it holds none
63
+ * (an empty string, text that is not a date).
64
+ */
65
+ export const customFieldValueToDate = (value) => {
66
+ if (value instanceof Date) {
67
+ return isNaN(value.getTime()) ? null : value;
68
+ }
69
+ if (typeof value === "string" && value.trim().length > 0) {
70
+ const date = new Date(value.trim());
71
+ return isNaN(date.getTime()) ? null : date;
72
+ }
73
+ return null;
74
+ };
75
+ /**
76
+ * Yes or No for a Boolean value, which is stored as true or false (or, from
77
+ * an older form, as "true" or "false"). Anything else reads as it is.
78
+ */
79
+ export const formatCustomFieldBoolean = (value) => {
80
+ if (value === true || value === "true") {
81
+ return "Yes";
82
+ }
83
+ if (value === false || value === "false") {
84
+ return "No";
85
+ }
86
+ return customFieldValueToText(value);
87
+ };
88
+ /**
89
+ * A Date value - a calendar day with no time of day - as the day that was
90
+ * picked, "2026-09-27". A value that is no date reads as it is.
91
+ *
92
+ * The dashboard does not store the day itself. Its date input stores the
93
+ * picked day's midnight in the author's time zone, as a UTC instant: 27 Sep
94
+ * picked in Berlin (UTC+2) is "2026-09-26T22:00:00.000Z", in New York
95
+ * (UTC-4) "2026-09-27T04:00:00.000Z". So neither the UTC day of the instant
96
+ * (26 Sep for Berlin: every author east of UTC would get the day before) nor
97
+ * the reader's day (a reader in another zone than the author's) is the day
98
+ * that was picked, and who picked it, and where, is not stored.
99
+ *
100
+ * The instant is read as the nearest plausible local midnight instead: moved
101
+ * 13 hours on, its UTC day is the picked day for an author anywhere from
102
+ * UTC-10:59 to UTC+13:00 - Hawaii to New Zealand in summer - and for a value
103
+ * an API client stored as UTC midnight. Only an author in UTC-11 or UTC-12,
104
+ * or past UTC+13, gets the day after or the day before. It is the same day
105
+ * whoever reads it, so a note and an email about one incident agree.
106
+ *
107
+ * A bare day ("2026-09-27"), or a time with no offset, is the day it names.
108
+ */
109
+ export const formatCustomFieldCalendarDate = (value) => {
110
+ const match = typeof value === "string"
111
+ ? value.trim().match(DAY_WITHOUT_TIME_ZONE_PATTERN)
112
+ : null;
113
+ if (match) {
114
+ return match[1];
115
+ }
116
+ const date = customFieldValueToDate(value);
117
+ const pickedDay = date
118
+ ? new Date(date.getTime() + PICKED_DAY_SHIFT_MS)
119
+ : null;
120
+ // Invalid only at the very end of the range a Date can hold.
121
+ if (!pickedDay || isNaN(pickedDay.getTime())) {
122
+ return customFieldValueToText(value);
123
+ }
124
+ return pickedDay.toISOString().slice(0, 10);
125
+ };
126
+ //# sourceMappingURL=CustomFieldValueFormat.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CustomFieldValueFormat.js","sourceRoot":"","sources":["../../../../Types/CustomField/CustomFieldValueFormat.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,280 @@
1
+ import { parseCustomFieldDropdownOptions, } from "./CustomFieldDropdownOption";
2
+ import CustomFieldType from "./CustomFieldType";
3
+ import { isCustomFieldValueEmpty } from "./CustomFieldValueMapping";
4
+ /*
5
+ * Values and option lists are quoted back in the message, bounded so that a
6
+ * pasted essay or a field with two hundred options still reads as one line.
7
+ */
8
+ const MAX_QUOTED_VALUE_LENGTH = 80;
9
+ const MAX_LISTED_OPTIONS = 10;
10
+ const quote = (value) => {
11
+ let text;
12
+ try {
13
+ text = typeof value === "string" ? value : JSON.stringify(value);
14
+ }
15
+ catch (_a) {
16
+ text = String(value);
17
+ }
18
+ if (text === undefined) {
19
+ text = String(value);
20
+ }
21
+ if (text.length > MAX_QUOTED_VALUE_LENGTH) {
22
+ text = `${text.slice(0, MAX_QUOTED_VALUE_LENGTH)}...`;
23
+ }
24
+ return `"${text}"`;
25
+ };
26
+ const listOptions = (options) => {
27
+ const listed = options
28
+ .slice(0, MAX_LISTED_OPTIONS)
29
+ .map((option) => {
30
+ return quote(option);
31
+ })
32
+ .join(", ");
33
+ const more = options.length - MAX_LISTED_OPTIONS;
34
+ return more > 0 ? `${listed} and ${more} more` : listed;
35
+ };
36
+ const canonicalize = (value) => {
37
+ if (Array.isArray(value)) {
38
+ return JSON.stringify([...value]
39
+ .map((entry) => {
40
+ return String(entry);
41
+ })
42
+ .sort());
43
+ }
44
+ if (value instanceof Date) {
45
+ // toISOString throws on an invalid date; that one is checked, not compared.
46
+ return isNaN(value.getTime())
47
+ ? "invalid-date"
48
+ : JSON.stringify(value.toISOString());
49
+ }
50
+ return JSON.stringify(value !== null && value !== void 0 ? value : null);
51
+ };
52
+ const isPlainObject = (value) => {
53
+ return (value !== null &&
54
+ typeof value === "object" &&
55
+ !Array.isArray(value) &&
56
+ !(value instanceof Date));
57
+ };
58
+ // The values a dropdown option can be written as: its text, or a bare number.
59
+ const isOptionScalar = (value) => {
60
+ return (typeof value === "string" ||
61
+ (typeof value === "number" && Number.isFinite(value)) ||
62
+ typeof value === "boolean");
63
+ };
64
+ const isNumberValue = (value) => {
65
+ if (typeof value === "number") {
66
+ return Number.isFinite(value);
67
+ }
68
+ /*
69
+ * The dashboard's number input submits what was typed, as a string -
70
+ * "0", "42", "3.5" - which is how most stored Number values look.
71
+ */
72
+ if (typeof value === "string") {
73
+ const trimmed = value.trim();
74
+ return trimmed.length > 0 && Number.isFinite(Number(trimmed));
75
+ }
76
+ return false;
77
+ };
78
+ const isBooleanValue = (value) => {
79
+ /*
80
+ * The strings are accepted because the table and filters already read them
81
+ * as Yes and No, and hand-written API requests send them.
82
+ */
83
+ return typeof value === "boolean" || value === "true" || value === "false";
84
+ };
85
+ const isDateValue = (value) => {
86
+ if (value instanceof Date) {
87
+ return !isNaN(value.getTime());
88
+ }
89
+ if (typeof value !== "string" || value.trim().length === 0) {
90
+ return false;
91
+ }
92
+ return !isNaN(new Date(value.trim()).getTime());
93
+ };
94
+ // Text of any kind: what was typed, or a number or yes/no sent over the API.
95
+ const isTextValue = (value) => {
96
+ return (typeof value === "string" ||
97
+ (typeof value === "number" && Number.isFinite(value)) ||
98
+ typeof value === "boolean");
99
+ };
100
+ const validateDropdownValue = (data) => {
101
+ const name = data.definition.name;
102
+ if (!isOptionScalar(data.value)) {
103
+ return `${quote(name)} holds one of its options, but was sent ${quote(data.value)}.`;
104
+ }
105
+ const options = parseCustomFieldDropdownOptions(data.definition.dropdownOptions).map((option) => {
106
+ return option.value;
107
+ });
108
+ /*
109
+ * A dropdown nobody has given options to cannot be checked against them;
110
+ * refusing every value would make the field unusable over the API until an
111
+ * admin finishes defining it.
112
+ */
113
+ if (options.length === 0 || options.includes(String(data.value))) {
114
+ return null;
115
+ }
116
+ return `${quote(data.value)} is not one of the options for ${quote(name)}. Choose one of: ${listOptions(options)}.`;
117
+ };
118
+ const validateMultiSelectValue = (data) => {
119
+ const name = data.definition.name;
120
+ /*
121
+ * A single value is accepted as a selection of one: a field that was
122
+ * switched from single to multi select still holds bare strings, and the
123
+ * table renders one that way.
124
+ */
125
+ const entries = Array.isArray(data.value)
126
+ ? data.value
127
+ : [data.value];
128
+ const invalidShape = entries.find((entry) => {
129
+ return !isOptionScalar(entry);
130
+ });
131
+ if (invalidShape !== undefined) {
132
+ return `${quote(name)} holds a list of its options, but was sent ${quote(data.value)}.`;
133
+ }
134
+ const options = parseCustomFieldDropdownOptions(data.definition.dropdownOptions).map((option) => {
135
+ return option.value;
136
+ });
137
+ if (options.length === 0) {
138
+ return null;
139
+ }
140
+ // Entries the record already holds stay valid, removed options included.
141
+ const alreadyHeld = new Set((Array.isArray(data.storedValue)
142
+ ? data.storedValue
143
+ : data.storedValue === undefined || data.storedValue === null
144
+ ? []
145
+ : [data.storedValue]).map((entry) => {
146
+ return String(entry);
147
+ }));
148
+ const notOptions = entries
149
+ .map((entry) => {
150
+ return String(entry);
151
+ })
152
+ .filter((entry) => {
153
+ return !alreadyHeld.has(entry) && !options.includes(entry);
154
+ });
155
+ if (notOptions.length === 0) {
156
+ return null;
157
+ }
158
+ return `${notOptions
159
+ .map((entry) => {
160
+ return quote(entry);
161
+ })
162
+ .join(", ")} ${notOptions.length === 1 ? "is not one of" : "are not among"} the options for ${quote(name)}. Choose from: ${listOptions(options)}.`;
163
+ };
164
+ const validateValue = (data) => {
165
+ const name = data.definition.name;
166
+ switch (data.definition.customFieldType) {
167
+ case CustomFieldType.Text:
168
+ case CustomFieldType.LongText:
169
+ case CustomFieldType.Markdown:
170
+ return isTextValue(data.value)
171
+ ? null
172
+ : `${quote(name)} holds text, but was sent ${quote(data.value)}.`;
173
+ case CustomFieldType.Number:
174
+ return isNumberValue(data.value)
175
+ ? null
176
+ : `${quote(name)} holds a number, but was sent ${quote(data.value)}.`;
177
+ case CustomFieldType.Boolean:
178
+ return isBooleanValue(data.value)
179
+ ? null
180
+ : `${quote(name)} holds true or false, but was sent ${quote(data.value)}.`;
181
+ case CustomFieldType.Date:
182
+ return isDateValue(data.value)
183
+ ? null
184
+ : `${quote(name)} holds a date, but was sent ${quote(data.value)}.`;
185
+ case CustomFieldType.DateTime:
186
+ return isDateValue(data.value)
187
+ ? null
188
+ : `${quote(name)} holds a date and time, but was sent ${quote(data.value)}.`;
189
+ case CustomFieldType.Dropdown:
190
+ return validateDropdownValue(data);
191
+ case CustomFieldType.MultiSelectDropdown:
192
+ return validateMultiSelectValue(data);
193
+ default:
194
+ // No type, or one this version does not know: nothing to check.
195
+ return null;
196
+ }
197
+ };
198
+ /**
199
+ * Every value this write changes that does not fit its field, in the order
200
+ * the write lists them. Empty when the write is fine.
201
+ */
202
+ export const validateCustomFieldValues = (data) => {
203
+ if (!isPlainObject(data.customFields)) {
204
+ return [];
205
+ }
206
+ const stored = isPlainObject(data.storedCustomFields)
207
+ ? data.storedCustomFields
208
+ : {};
209
+ const definitionsByName = new Map();
210
+ for (const definition of data.definitions || []) {
211
+ if (definition && typeof definition.name === "string") {
212
+ definitionsByName.set(definition.name, definition);
213
+ }
214
+ }
215
+ const errors = [];
216
+ for (const [fieldName, value] of Object.entries(data.customFields)) {
217
+ const definition = definitionsByName.get(fieldName);
218
+ if (!definition) {
219
+ continue;
220
+ }
221
+ if (isCustomFieldValueEmpty(value)) {
222
+ continue;
223
+ }
224
+ const storedValue = Object.prototype.hasOwnProperty.call(stored, fieldName)
225
+ ? stored[fieldName]
226
+ : undefined;
227
+ if (canonicalize(value) === canonicalize(storedValue)) {
228
+ continue;
229
+ }
230
+ const message = validateValue({
231
+ definition: definition,
232
+ value: value,
233
+ storedValue: storedValue,
234
+ });
235
+ if (message) {
236
+ errors.push({ fieldName: fieldName, message: message });
237
+ }
238
+ }
239
+ return errors;
240
+ };
241
+ /** One message for an API error response. */
242
+ export const formatCustomFieldValueValidationErrors = (errors) => {
243
+ return errors
244
+ .map((error) => {
245
+ return error.message;
246
+ })
247
+ .join(" ");
248
+ };
249
+ /**
250
+ * The values of a bag that a create would accept, each judged on its own as
251
+ * if it were new: an option since removed from a dropdown, or a word in a
252
+ * Number field, is left out.
253
+ *
254
+ * For a bag copied onto a new record from elsewhere - an incident template's
255
+ * values, when an incident is declared from it. Those were written long
256
+ * before the incident and may no longer fit their fields; sent as they are,
257
+ * one stale value would refuse the whole declaration over a field the person
258
+ * declaring may not even be shown. Keys with no definition, and empty values,
259
+ * are kept, as validateCustomFieldValues passes them.
260
+ */
261
+ export const keepValidCustomFieldValues = (data) => {
262
+ if (!isPlainObject(data.customFields)) {
263
+ return {};
264
+ }
265
+ const invalidFieldNames = new Set(validateCustomFieldValues({
266
+ definitions: data.definitions,
267
+ customFields: data.customFields,
268
+ storedCustomFields: {},
269
+ }).map((error) => {
270
+ return error.fieldName;
271
+ }));
272
+ const result = {};
273
+ for (const [fieldName, value] of Object.entries(data.customFields)) {
274
+ if (!invalidFieldNames.has(fieldName)) {
275
+ result[fieldName] = value;
276
+ }
277
+ }
278
+ return result;
279
+ };
280
+ //# sourceMappingURL=CustomFieldValueValidator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CustomFieldValueValidator.js","sourceRoot":"","sources":["../../../../Types/CustomField/CustomFieldValueValidator.ts"],"names":[],"mappings":"AACA,OAAO,EAEL,+BAA+B,GAChC,MAAM,6BAA6B,CAAC;AACrC,OAAO,eAAe,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,uBAAuB,EAAE,MAAM,2BAA2B,CAAC;AAwCpE;;;GAGG;AACH,MAAM,uBAAuB,GAAW,EAAE,CAAC;AAC3C,MAAM,kBAAkB,GAAW,EAAE,CAAC;AAItC,MAAM,KAAK,GAAkB,CAAC,KAAc,EAAU,EAAE;IACtD,IAAI,IAAY,CAAC;IAEjB,IAAI,CAAC;QACH,IAAI,GAAG,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;IACnE,CAAC;IAAC,WAAM,CAAC;QACP,IAAI,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;IACvB,CAAC;IAED,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;QACvB,IAAI,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;IACvB,CAAC;IAED,IAAI,IAAI,CAAC,MAAM,GAAG,uBAAuB,EAAE,CAAC;QAC1C,IAAI,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,uBAAuB,CAAC,KAAK,CAAC;IACxD,CAAC;IAED,OAAO,IAAI,IAAI,GAAG,CAAC;AACrB,CAAC,CAAC;AAIF,MAAM,WAAW,GAAwB,CAAC,OAAsB,EAAU,EAAE;IAC1E,MAAM,MAAM,GAAW,OAAO;SAC3B,KAAK,CAAC,CAAC,EAAE,kBAAkB,CAAC;SAC5B,GAAG,CAAC,CAAC,MAAc,EAAE,EAAE;QACtB,OAAO,KAAK,CAAC,MAAM,CAAC,CAAC;IACvB,CAAC,CAAC;SACD,IAAI,CAAC,IAAI,CAAC,CAAC;IAEd,MAAM,IAAI,GAAW,OAAO,CAAC,MAAM,GAAG,kBAAkB,CAAC;IAEzD,OAAO,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,MAAM,QAAQ,IAAI,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC;AAC1D,CAAC,CAAC;AAQF,MAAM,YAAY,GAAyB,CAAC,KAAc,EAAU,EAAE;IACpE,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO,IAAI,CAAC,SAAS,CACnB,CAAC,GAAG,KAAK,CAAC;aACP,GAAG,CAAC,CAAC,KAAc,EAAE,EAAE;YACtB,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC;QACvB,CAAC,CAAC;aACD,IAAI,EAAE,CACV,CAAC;IACJ,CAAC;IAED,IAAI,KAAK,YAAY,IAAI,EAAE,CAAC;QAC1B,4EAA4E;QAC5E,OAAO,KAAK,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC;YAC3B,CAAC,CAAC,cAAc;YAChB,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC,CAAC;IAC1C,CAAC;IAED,OAAO,IAAI,CAAC,SAAS,CAAC,KAAK,aAAL,KAAK,cAAL,KAAK,GAAI,IAAI,CAAC,CAAC;AACvC,CAAC,CAAC;AAMF,MAAM,aAAa,GAA0B,CAC3C,KAAc,EACoB,EAAE;IACpC,OAAO,CACL,KAAK,KAAK,IAAI;QACd,OAAO,KAAK,KAAK,QAAQ;QACzB,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QACrB,CAAC,CAAC,KAAK,YAAY,IAAI,CAAC,CACzB,CAAC;AACJ,CAAC,CAAC;AAIF,8EAA8E;AAC9E,MAAM,cAAc,GAAqB,CAAC,KAAc,EAAW,EAAE;IACnE,OAAO,CACL,OAAO,KAAK,KAAK,QAAQ;QACzB,CAAC,OAAO,KAAK,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;QACrD,OAAO,KAAK,KAAK,SAAS,CAC3B,CAAC;AACJ,CAAC,CAAC;AAEF,MAAM,aAAa,GAAqB,CAAC,KAAc,EAAW,EAAE;IAClE,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9B,OAAO,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;IAChC,CAAC;IAED;;;OAGG;IACH,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9B,MAAM,OAAO,GAAW,KAAK,CAAC,IAAI,EAAE,CAAC;QAErC,OAAO,OAAO,CAAC,MAAM,GAAG,CAAC,IAAI,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC;IAChE,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC,CAAC;AAEF,MAAM,cAAc,GAAqB,CAAC,KAAc,EAAW,EAAE;IACnE;;;OAGG;IACH,OAAO,OAAO,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,MAAM,IAAI,KAAK,KAAK,OAAO,CAAC;AAC7E,CAAC,CAAC;AAEF,MAAM,WAAW,GAAqB,CAAC,KAAc,EAAW,EAAE;IAChE,IAAI,KAAK,YAAY,IAAI,EAAE,CAAC;QAC1B,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;IACjC,CAAC;IAED,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC3D,OAAO,KAAK,CAAC;IACf,CAAC;IAED,OAAO,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;AAClD,CAAC,CAAC;AAEF,6EAA6E;AAC7E,MAAM,WAAW,GAAqB,CAAC,KAAc,EAAW,EAAE;IAChE,OAAO,CACL,OAAO,KAAK,KAAK,QAAQ;QACzB,CAAC,OAAO,KAAK,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;QACrD,OAAO,KAAK,KAAK,SAAS,CAC3B,CAAC;AACJ,CAAC,CAAC;AAQF,MAAM,qBAAqB,GAAwB,CAAC,IAInD,EAAiB,EAAE;IAClB,MAAM,IAAI,GAAW,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;IAE1C,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;QAChC,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC,2CAA2C,KAAK,CACnE,IAAI,CAAC,KAAK,CACX,GAAG,CAAC;IACP,CAAC;IAED,MAAM,OAAO,GAAkB,+BAA+B,CAC5D,IAAI,CAAC,UAAU,CAAC,eAAe,CAChC,CAAC,GAAG,CAAC,CAAC,MAAiC,EAAE,EAAE;QAC1C,OAAO,MAAM,CAAC,KAAK,CAAC;IACtB,CAAC,CAAC,CAAC;IAEH;;;;OAIG;IACH,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,IAAI,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC;QACjE,OAAO,IAAI,CAAC;IACd,CAAC;IAED,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,kCAAkC,KAAK,CAChE,IAAI,CACL,oBAAoB,WAAW,CAAC,OAAO,CAAC,GAAG,CAAC;AAC/C,CAAC,CAAC;AAEF,MAAM,wBAAwB,GAAwB,CAAC,IAItD,EAAiB,EAAE;IAClB,MAAM,IAAI,GAAW,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;IAE1C;;;;OAIG;IACH,MAAM,OAAO,GAAmB,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC;QACvD,CAAC,CAAC,IAAI,CAAC,KAAK;QACZ,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAEjB,MAAM,YAAY,GAAY,OAAO,CAAC,IAAI,CAAC,CAAC,KAAc,EAAE,EAAE;QAC5D,OAAO,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC;IAChC,CAAC,CAAC,CAAC;IAEH,IAAI,YAAY,KAAK,SAAS,EAAE,CAAC;QAC/B,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC,8CAA8C,KAAK,CACtE,IAAI,CAAC,KAAK,CACX,GAAG,CAAC;IACP,CAAC;IAED,MAAM,OAAO,GAAkB,+BAA+B,CAC5D,IAAI,CAAC,UAAU,CAAC,eAAe,CAChC,CAAC,GAAG,CAAC,CAAC,MAAiC,EAAE,EAAE;QAC1C,OAAO,MAAM,CAAC,KAAK,CAAC;IACtB,CAAC,CAAC,CAAC;IAEH,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,yEAAyE;IACzE,MAAM,WAAW,GAAgB,IAAI,GAAG,CACtC,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,WAAW,CAAC;QAC9B,CAAC,CAAC,IAAI,CAAC,WAAW;QAClB,CAAC,CAAC,IAAI,CAAC,WAAW,KAAK,SAAS,IAAI,IAAI,CAAC,WAAW,KAAK,IAAI;YAC3D,CAAC,CAAC,EAAE;YACJ,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CACvB,CAAC,GAAG,CAAC,CAAC,KAAc,EAAE,EAAE;QACvB,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC;IACvB,CAAC,CAAC,CACH,CAAC;IAEF,MAAM,UAAU,GAAkB,OAAO;SACtC,GAAG,CAAC,CAAC,KAAc,EAAE,EAAE;QACtB,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC;IACvB,CAAC,CAAC;SACD,MAAM,CAAC,CAAC,KAAa,EAAE,EAAE;QACxB,OAAO,CAAC,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;IAC7D,CAAC,CAAC,CAAC;IAEL,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC5B,OAAO,IAAI,CAAC;IACd,CAAC;IAED,OAAO,GAAG,UAAU;SACjB,GAAG,CAAC,CAAC,KAAa,EAAE,EAAE;QACrB,OAAO,KAAK,CAAC,KAAK,CAAC,CAAC;IACtB,CAAC,CAAC;SACD,IAAI,CAAC,IAAI,CAAC,IACX,UAAU,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,eAC9C,oBAAoB,KAAK,CAAC,IAAI,CAAC,kBAAkB,WAAW,CAAC,OAAO,CAAC,GAAG,CAAC;AAC3E,CAAC,CAAC;AAEF,MAAM,aAAa,GAAwB,CAAC,IAI3C,EAAiB,EAAE;IAClB,MAAM,IAAI,GAAW,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;IAE1C,QAAQ,IAAI,CAAC,UAAU,CAAC,eAAe,EAAE,CAAC;QACxC,KAAK,eAAe,CAAC,IAAI,CAAC;QAC1B,KAAK,eAAe,CAAC,QAAQ,CAAC;QAC9B,KAAK,eAAe,CAAC,QAAQ;YAC3B,OAAO,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC;gBAC5B,CAAC,CAAC,IAAI;gBACN,CAAC,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,6BAA6B,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC;QAEtE,KAAK,eAAe,CAAC,MAAM;YACzB,OAAO,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC;gBAC9B,CAAC,CAAC,IAAI;gBACN,CAAC,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,iCAAiC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC;QAE1E,KAAK,eAAe,CAAC,OAAO;YAC1B,OAAO,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC;gBAC/B,CAAC,CAAC,IAAI;gBACN,CAAC,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,sCAAsC,KAAK,CACvD,IAAI,CAAC,KAAK,CACX,GAAG,CAAC;QAEX,KAAK,eAAe,CAAC,IAAI;YACvB,OAAO,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC;gBAC5B,CAAC,CAAC,IAAI;gBACN,CAAC,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,+BAA+B,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC;QAExE,KAAK,eAAe,CAAC,QAAQ;YAC3B,OAAO,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC;gBAC5B,CAAC,CAAC,IAAI;gBACN,CAAC,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,wCAAwC,KAAK,CACzD,IAAI,CAAC,KAAK,CACX,GAAG,CAAC;QAEX,KAAK,eAAe,CAAC,QAAQ;YAC3B,OAAO,qBAAqB,CAAC,IAAI,CAAC,CAAC;QAErC,KAAK,eAAe,CAAC,mBAAmB;YACtC,OAAO,wBAAwB,CAAC,IAAI,CAAC,CAAC;QAExC;YACE,gEAAgE;YAChE,OAAO,IAAI,CAAC;IAChB,CAAC;AACH,CAAC,CAAC;AAWF;;;GAGG;AACH,MAAM,CAAC,MAAM,yBAAyB,GACpC,CAAC,IAIA,EAA0C,EAAE;IAC3C,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,YAAY,CAAC,EAAE,CAAC;QACtC,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,MAAM,MAAM,GAA4B,aAAa,CACnD,IAAI,CAAC,kBAAkB,CACxB;QACC,CAAC,CAAC,IAAI,CAAC,kBAAkB;QACzB,CAAC,CAAC,EAAE,CAAC;IAEP,MAAM,iBAAiB,GAAuC,IAAI,GAAG,EAGlE,CAAC;IAEJ,KAAK,MAAM,UAAU,IAAI,IAAI,CAAC,WAAW,IAAI,EAAE,EAAE,CAAC;QAChD,IAAI,UAAU,IAAI,OAAO,UAAU,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YACtD,iBAAiB,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;QACrD,CAAC;IACH,CAAC;IAED,MAAM,MAAM,GAA2C,EAAE,CAAC;IAE1D,KAAK,MAAM,CAAC,SAAS,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,YAAY,CAAC,EAAE,CAAC;QACnE,MAAM,UAAU,GACd,iBAAiB,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QAEnC,IAAI,CAAC,UAAU,EAAE,CAAC;YAChB,SAAS;QACX,CAAC;QAED,IAAI,uBAAuB,CAAC,KAAK,CAAC,EAAE,CAAC;YACnC,SAAS;QACX,CAAC;QAED,MAAM,WAAW,GAAY,MAAM,CAAC,SAAS,CAAC,cAAc,CAAC,IAAI,CAC/D,MAAM,EACN,SAAS,CACV;YACC,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC;YACnB,CAAC,CAAC,SAAS,CAAC;QAEd,IAAI,YAAY,CAAC,KAAK,CAAC,KAAK,YAAY,CAAC,WAAW,CAAC,EAAE,CAAC;YACtD,SAAS;QACX,CAAC;QAED,MAAM,OAAO,GAAkB,aAAa,CAAC;YAC3C,UAAU,EAAE,UAAU;YACtB,KAAK,EAAE,KAAK;YACZ,WAAW,EAAE,WAAW;SACzB,CAAC,CAAC;QAEH,IAAI,OAAO,EAAE,CAAC;YACZ,MAAM,CAAC,IAAI,CAAC,EAAE,SAAS,EAAE,SAAS,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC;QAC1D,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC,CAAC;AAMJ,6CAA6C;AAC7C,MAAM,CAAC,MAAM,sCAAsC,GACjD,CAAC,MAA8C,EAAU,EAAE;IACzD,OAAO,MAAM;SACV,GAAG,CAAC,CAAC,KAAsC,EAAE,EAAE;QAC9C,OAAO,KAAK,CAAC,OAAO,CAAC;IACvB,CAAC,CAAC;SACD,IAAI,CAAC,GAAG,CAAC,CAAC;AACf,CAAC,CAAC;AAOJ;;;;;;;;;;;GAWG;AACH,MAAM,CAAC,MAAM,0BAA0B,GACrC,CAAC,IAGA,EAA2B,EAAE;IAC5B,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,YAAY,CAAC,EAAE,CAAC;QACtC,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,MAAM,iBAAiB,GAAgB,IAAI,GAAG,CAC5C,yBAAyB,CAAC;QACxB,WAAW,EAAE,IAAI,CAAC,WAAW;QAC7B,YAAY,EAAE,IAAI,CAAC,YAAY;QAC/B,kBAAkB,EAAE,EAAE;KACvB,CAAC,CAAC,GAAG,CAAC,CAAC,KAAsC,EAAE,EAAE;QAChD,OAAO,KAAK,CAAC,SAAS,CAAC;IACzB,CAAC,CAAC,CACH,CAAC;IAEF,MAAM,MAAM,GAA4B,EAAE,CAAC;IAE3C,KAAK,MAAM,CAAC,SAAS,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,YAAY,CAAC,EAAE,CAAC;QACnE,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC;YACtC,MAAM,CAAC,SAAS,CAAC,GAAG,KAAK,CAAC;QAC5B,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC,CAAC"}
@@ -0,0 +1,150 @@
1
+ import SubscriberNotificationTemplateCompiler from "../StatusPage/SubscriberNotificationTemplateCompiler";
2
+ /*
3
+ * The key an incident custom field is reached by in a template:
4
+ * {{customFields.<key>}} in a status page's custom subscriber email, and in
5
+ * anything else that fills placeholders the same way.
6
+ *
7
+ * Why a key at all, rather than the field's name: values are stored under
8
+ * the display name ("Expected Resolution"), and a name can hold anything a
9
+ * person types - spaces, hyphens, accents, emoji, other scripts. The template
10
+ * compiler only fills placeholders made of ASCII word characters and dots
11
+ * (SubscriberNotificationTemplateCompiler.isPlaceholderName), so a name is
12
+ * not something a template can refer to. The key is made from the name once,
13
+ * when the field is created, and never changes: renaming a field must not
14
+ * silently break every template that already uses it.
15
+ *
16
+ * Why not Slug.getSlug: it joins words with hyphens and appends a random
17
+ * number, and a hyphen is exactly what the placeholder pattern rejects.
18
+ *
19
+ * The shape: lowercase letters and digits in runs joined by single
20
+ * underscores - "expected_resolution" - with no leading, trailing or doubled
21
+ * underscore. A key already taken in the project gets "_2", "_3", ... in the
22
+ * order fields were created.
23
+ *
24
+ * Pure, and free of database and React imports, so the service that stamps a
25
+ * new field, the migration that stamps the existing ones and the dashboard
26
+ * all produce the same key from the same name.
27
+ */
28
+ /*
29
+ * Long enough for any name a person would give a field, short enough to type
30
+ * into a template. The column itself allows 100 characters.
31
+ */
32
+ export const CUSTOM_FIELD_VARIABLE_KEY_MAX_LENGTH = 64;
33
+ /*
34
+ * What a name with nothing usable in it becomes: "!!!", or a name written
35
+ * wholly in a script with no Latin transliteration here, such as "影响" or
36
+ * "Влияние". Numbered like any other collision, so a project with several
37
+ * gets field, field_2, field_3.
38
+ */
39
+ export const CUSTOM_FIELD_VARIABLE_KEY_FALLBACK = "field";
40
+ /*
41
+ * Where a key sits among the template variables: {{customFields.<key>}}.
42
+ */
43
+ export const CUSTOM_FIELD_TEMPLATE_VARIABLE_PREFIX = "customFields.";
44
+ const VARIABLE_KEY_PATTERN = /^[a-z0-9]+(?:_[a-z0-9]+)*$/;
45
+ /*
46
+ * Latin letters that Unicode normalisation does not take apart into a base
47
+ * letter and an accent, so stripping accents alone would lose them: "Größe"
48
+ * would become "gr_e". Everything else accented (é, ñ, å, ç, ő, ...) is
49
+ * handled by NFKD below.
50
+ */
51
+ const LETTERS_WITHOUT_DECOMPOSITION = {
52
+ ß: "ss",
53
+ ẞ: "ss",
54
+ æ: "ae",
55
+ Æ: "ae",
56
+ œ: "oe",
57
+ Œ: "oe",
58
+ ø: "o",
59
+ Ø: "o",
60
+ đ: "d",
61
+ Đ: "d",
62
+ ð: "d",
63
+ Ð: "d",
64
+ þ: "th",
65
+ Þ: "th",
66
+ ł: "l",
67
+ Ł: "l",
68
+ ı: "i",
69
+ ħ: "h",
70
+ Ħ: "h",
71
+ ŧ: "t",
72
+ Ŧ: "t",
73
+ ŋ: "ng",
74
+ Ŋ: "ng",
75
+ ĸ: "k",
76
+ };
77
+ const transliterate = (name) => {
78
+ var _a;
79
+ let result = "";
80
+ for (const character of name) {
81
+ result += (_a = LETTERS_WITHOUT_DECOMPOSITION[character]) !== null && _a !== void 0 ? _a : character;
82
+ }
83
+ /*
84
+ * NFKD splits "é" into "e" plus a combining accent, and also folds
85
+ * compatibility forms: full-width "A" to "A", "fi" to "fi", "①" to "1".
86
+ * Dropping the combining marks then leaves the base letters.
87
+ */
88
+ return result.normalize("NFKD").replace(/\p{M}/gu, "");
89
+ };
90
+ // Cut to a length without leaving a dangling underscore at the end.
91
+ const trimToLength = (key, maxLength) => {
92
+ return key.slice(0, Math.max(maxLength, 0)).replace(/_+$/, "");
93
+ };
94
+ /**
95
+ * The key a field of this name gets when nothing else in the project has it.
96
+ * Never empty, and always a valid key.
97
+ */
98
+ export const getCustomFieldVariableKeyBase = (name) => {
99
+ const words = transliterate(typeof name === "string" ? name : "")
100
+ .toLowerCase()
101
+ .replace(/[^a-z0-9]+/g, "_")
102
+ .replace(/^_+|_+$/g, "");
103
+ const key = trimToLength(words, CUSTOM_FIELD_VARIABLE_KEY_MAX_LENGTH);
104
+ return key || CUSTOM_FIELD_VARIABLE_KEY_FALLBACK;
105
+ };
106
+ /**
107
+ * Whether a key has the generator's shape and can be used as
108
+ * {{customFields.<key>}} in a template the compiler fills.
109
+ */
110
+ export const isValidCustomFieldVariableKey = (key) => {
111
+ return (typeof key === "string" &&
112
+ key.length > 0 &&
113
+ key.length <= CUSTOM_FIELD_VARIABLE_KEY_MAX_LENGTH &&
114
+ VARIABLE_KEY_PATTERN.test(key) &&
115
+ SubscriberNotificationTemplateCompiler.isPlaceholderName(`${CUSTOM_FIELD_TEMPLATE_VARIABLE_PREFIX}${key}`));
116
+ };
117
+ /**
118
+ * The key for a new field: its name's key, or the first of name_2, name_3,
119
+ * ... that no other field in the project holds.
120
+ */
121
+ export const generateCustomFieldVariableKey = (data) => {
122
+ const taken = new Set();
123
+ for (const key of data.existingKeys) {
124
+ if (typeof key === "string" && key.length > 0) {
125
+ taken.add(key);
126
+ }
127
+ }
128
+ const base = getCustomFieldVariableKeyBase(data.name);
129
+ if (!taken.has(base)) {
130
+ return base;
131
+ }
132
+ /*
133
+ * One more than there are keys is always enough: at most that many of the
134
+ * candidates can be taken.
135
+ */
136
+ for (let suffix = 2; suffix <= taken.size + 2; suffix++) {
137
+ const ending = `_${suffix}`;
138
+ const candidate = `${trimToLength(base, CUSTOM_FIELD_VARIABLE_KEY_MAX_LENGTH - ending.length)}${ending}`;
139
+ if (!taken.has(candidate)) {
140
+ return candidate;
141
+ }
142
+ }
143
+ // Unreachable (see the loop bound); kept so the function always returns.
144
+ return `${CUSTOM_FIELD_VARIABLE_KEY_FALLBACK}_${taken.size + 2}`;
145
+ };
146
+ /** "expected_resolution" -> "customFields.expected_resolution". */
147
+ export const getCustomFieldTemplateVariableName = (key) => {
148
+ return `${CUSTOM_FIELD_TEMPLATE_VARIABLE_PREFIX}${key}`;
149
+ };
150
+ //# sourceMappingURL=CustomFieldVariableKey.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CustomFieldVariableKey.js","sourceRoot":"","sources":["../../../../Types/CustomField/CustomFieldVariableKey.ts"],"names":[],"mappings":"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"}
@@ -10,6 +10,23 @@
10
10
  * the dashboard.
11
11
  */
12
12
  export const INCIDENT_ALERT_IDS_TO_LINK_KEY = "alertIdsToLink";
13
+ /*
14
+ * Declaring an incident from alerts does not, on its own, change the alerts:
15
+ * they keep escalating until somebody acknowledges them. Sending
16
+ * `miscDataProps[INCIDENT_ACKNOWLEDGE_ALERTS_TO_LINK_KEY] = true` along with
17
+ * INCIDENT_ALERT_IDS_TO_LINK_KEY also acknowledges them, as the declaring
18
+ * user, once they are linked - which is what stops their on-call escalation.
19
+ * Alerts already acknowledged (or past it) are left as they are, and the
20
+ * caller must be allowed to change the state of every alert that is not.
21
+ * Off unless asked for.
22
+ *
23
+ * One exception: when the incident is declared straight into an
24
+ * acknowledged or resolved state and the project's linked-alert switches
25
+ * already move linked alerts along with it, those alerts are left to the
26
+ * switches (one writer per alert) - acknowledged or resolved as the switch
27
+ * does it, not credited to the declaring user.
28
+ */
29
+ export const INCIDENT_ACKNOWLEDGE_ALERTS_TO_LINK_KEY = "acknowledgeAlertsToLink";
13
30
  /*
14
31
  * The create-incident page reads the alerts to declare an incident from out of
15
32
  * this query string parameter, as a comma separated list of alert ids.
@@ -1 +1 @@
1
- {"version":3,"file":"IncidentAlertLink.js","sourceRoot":"","sources":["../../../../Types/Incident/IncidentAlertLink.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,8BAA8B,GAAW,gBAAgB,CAAC;AAEvE;;;GAGG;AACH,MAAM,CAAC,MAAM,qCAAqC,GAAW,UAAU,CAAC;AAExE;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,mCAAmC,GAAW,EAAE,CAAC;AAE9D;;;;;GAKG;AACH,MAAM,CAAC,MAAM,qCAAqC,GAChD,gDAAgD,CAAC"}
1
+ {"version":3,"file":"IncidentAlertLink.js","sourceRoot":"","sources":["../../../../Types/Incident/IncidentAlertLink.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,8BAA8B,GAAW,gBAAgB,CAAC;AAEvE;;;;;;;;;;;;;;;GAeG;AACH,MAAM,CAAC,MAAM,uCAAuC,GAClD,yBAAyB,CAAC;AAE5B;;;GAGG;AACH,MAAM,CAAC,MAAM,qCAAqC,GAAW,UAAU,CAAC;AAExE;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,mCAAmC,GAAW,EAAE,CAAC;AAE9D;;;;;GAKG;AACH,MAAM,CAAC,MAAM,qCAAqC,GAChD,gDAAgD,CAAC"}