@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.
- package/Models/DatabaseModels/Incident.ts +267 -1
- package/Models/DatabaseModels/IncidentCustomField.ts +202 -0
- package/Models/DatabaseModels/IncidentEpisode.ts +30 -0
- package/Models/DatabaseModels/IncidentTemplate.ts +126 -1
- package/Models/DatabaseModels/InventoryItem.ts +23 -12
- package/Models/DatabaseModels/StatusPage.ts +55 -0
- package/Models/DatabaseModels/StatusPageSubscriber.ts +128 -0
- package/Server/API/IncidentAPI.ts +162 -0
- package/Server/API/StatusPageAPI.ts +487 -171
- package/Server/API/StatusPageSubscriberAPI.ts +63 -15
- package/Server/Infrastructure/Postgres/SchemaMigrations/1795200000000-AddInventoryItemProjectEntityKeyIndex.ts +217 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1795300000000-SkipHiddenIncidentCreatedNotifications.ts +49 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1795400000000-AddIncidentStatusPageScope.ts +108 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1795500000000-AddIncidentTemplateStatusPageScopeFlag.ts +33 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1795600000000-AddStatusPageSubscriberUnsubscribeToken.ts +51 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1795700000000-AddStatusPageSubscriberIsAddedByTeam.ts +33 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1795800000000-AddIncidentCustomFieldCreateAndNotificationSettings.ts +168 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1795900000000-AddSubscriberNotificationClaimedAt.ts +44 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts +16 -0
- package/Server/Infrastructure/Semaphore.ts +10 -0
- package/Server/Middleware/IdentityRateLimit.ts +108 -3
- package/Server/Middleware/SubscriberNotificationPreviewRateLimit.ts +237 -0
- package/Server/Middleware/SubscriberNotificationTestSendRateLimit.ts +304 -0
- package/Server/Services/AlertService.ts +32 -36
- package/Server/Services/DatabaseService.ts +93 -10
- package/Server/Services/IncidentAlertService.ts +609 -2
- package/Server/Services/IncidentCustomFieldService.ts +276 -1
- package/Server/Services/IncidentEpisodePublicNoteService.ts +28 -0
- package/Server/Services/IncidentEpisodeService.ts +15 -0
- package/Server/Services/IncidentEpisodeStateTimelineService.ts +27 -1
- package/Server/Services/IncidentPublicNoteService.ts +30 -1
- package/Server/Services/IncidentService.ts +1663 -103
- package/Server/Services/IncidentStateTimelineService.ts +13 -0
- package/Server/Services/IncidentTemplateService.ts +109 -0
- package/Server/Services/InventoryItemService.ts +38 -0
- package/Server/Services/IoTDeviceCredentialService.ts +13 -4
- package/Server/Services/ScheduledMaintenancePublicNoteService.ts +30 -1
- package/Server/Services/ScheduledMaintenanceService.ts +118 -64
- package/Server/Services/SmsService.ts +10 -0
- package/Server/Services/StatusPageService.ts +65 -8
- package/Server/Services/StatusPageSubscriberNotificationTemplateService.ts +299 -37
- package/Server/Services/StatusPageSubscriberNotificationTemplateStatusPageService.ts +129 -0
- package/Server/Services/StatusPageSubscriberService.ts +1161 -64
- package/Server/Services/UserNotificationRuleService.ts +55 -53
- package/Server/Services/WorkspaceNotificationSummaryService.ts +38 -20
- package/Server/Types/Markdown.ts +153 -6
- package/Server/Types/Workflow/Components/Email.ts +61 -2
- package/Server/Utils/AffectedResources/LinkedAffectedResources.ts +576 -0
- package/Server/Utils/Alert/AlertStateChangeAuthorization.ts +129 -0
- package/Server/Utils/CustomField/CustomFieldRename.ts +378 -0
- package/Server/Utils/DataSource/EgressGuard.ts +66 -21
- package/Server/Utils/Inventory/InventoryOverviewAggregation.ts +111 -0
- package/Server/Utils/Mail/PinnedSmtpSocket.ts +130 -0
- package/Server/Utils/Monitor/MonitorCriteriaObservationBuilder.ts +10 -0
- package/Server/Utils/Response.ts +31 -0
- package/Server/Utils/SSRFProtection.ts +76 -16
- package/Server/Utils/StatusPage/IncidentStatusPageScope.ts +948 -0
- package/Server/Utils/StatusPage/IncidentSubscriberAudienceBuilder.ts +656 -0
- package/Server/Utils/StatusPage/IncidentTemplateVariableBuilder.ts +805 -0
- package/Server/Utils/StatusPage/StatusPageExclusion.ts +18 -0
- package/Server/Utils/StatusPage/StatusPageReadAccess.ts +125 -0
- package/Server/Utils/StatusPage/StatusPageSubscriberUnsubscribeNotice.ts +151 -0
- package/Server/Utils/StatusPage/StatusPageSubscriberUnsubscribeToken.ts +70 -0
- package/Server/Utils/StatusPage/SubscriberIncidentEmailBuilder.ts +421 -0
- package/Server/Utils/StatusPage/SubscriberNotificationClaim.ts +107 -0
- package/Server/Utils/StatusPage/SubscriberNotificationDeliveryRecord.ts +1049 -0
- package/Server/Utils/StatusPage/SubscriberNotificationFanOut.ts +180 -0
- package/Server/Utils/StatusPage/SubscriberNotificationPreviewBuilder.ts +839 -0
- package/Server/Utils/StatusPage/SubscriberNotificationResendAccess.ts +393 -0
- package/Server/Utils/StatusPage/SubscriberNotificationRunLimit.ts +246 -0
- package/Server/Utils/StatusPage/SubscriberNotificationTiming.ts +133 -0
- package/Server/Utils/StatusPage/SubscriberTemplateIncidentRecordAccess.ts +215 -0
- package/Server/Utils/StatusPageResource.ts +51 -20
- package/Server/Utils/Topology/TopologyConcurrencyLimiter.ts +229 -0
- package/Server/Utils/Topology/TopologyQueries.ts +1350 -0
- package/Server/Utils/Topology/TopologyRequest.ts +463 -0
- package/Server/Utils/Topology/TopologyResponseCache.ts +183 -0
- package/Server/Utils/Topology/TopologySql.ts +1024 -0
- package/Server/Utils/VM/VMAPI.ts +1 -0
- package/Server/Utils/VM/VMRunner.ts +10 -0
- package/Server/Utils/Workflow/OAuth2TokenClient.ts +10 -0
- package/Server/Views/Partials/SensitiveUrlToken.ejs +8 -5
- package/Tests/App/Accounts/RegisterVerifyEmail.test.tsx +748 -0
- package/Tests/App/Accounts/ResendVerificationEmail.test.tsx +1222 -0
- package/Tests/App/Accounts/VerificationEmailResendUtils.test.ts +797 -0
- package/Tests/App/Accounts/VerifyEmailPending.test.tsx +538 -0
- package/Tests/App/Accounts/VerifyEmailResend.test.tsx +779 -0
- package/Tests/App/Dashboard/AcknowledgeAlertsOnDeclare.test.ts +369 -0
- package/Tests/App/Dashboard/AffectedResourcesSlo.test.tsx +1 -1
- package/Tests/App/Dashboard/AffectedResourcesSummaryStep.test.tsx +510 -123
- package/Tests/App/Dashboard/AlertsTableAffectedResources.test.tsx +490 -0
- package/Tests/App/Dashboard/ChangeAlertStateDeclareIncident.test.tsx +886 -0
- package/Tests/App/Dashboard/CreateReviewStepRoleSummary.test.tsx +1250 -0
- package/Tests/App/Dashboard/CreateReviewStepSelectionSummary.test.tsx +738 -0
- package/Tests/App/Dashboard/CustomFieldsSettingsIncidentOptions.test.tsx +357 -0
- package/Tests/App/Dashboard/DeclareIncidentFromAlert.test.ts +417 -0
- package/Tests/App/Dashboard/EntityDetailPanel.test.tsx +1948 -229
- package/Tests/App/Dashboard/EntityDetailPanelLifecycle.test.tsx +493 -0
- package/Tests/App/Dashboard/EntityDetailPanelNavigation.test.tsx +439 -0
- package/Tests/App/Dashboard/EventNotes.test.tsx +776 -0
- package/Tests/App/Dashboard/EventNotesPages.test.tsx +119 -0
- package/Tests/App/Dashboard/EventNotesUtil.test.ts +116 -17
- package/Tests/App/Dashboard/EventOverviewPages.test.tsx +534 -6
- package/Tests/App/Dashboard/EventStatusPanel.test.tsx +798 -2
- package/Tests/App/Dashboard/FetchStateAndSeverityElements.test.tsx +669 -0
- package/Tests/App/Dashboard/FetchUsers.test.tsx +230 -0
- package/Tests/App/Dashboard/IncidentChangeStateNotifyDefault.test.tsx +91 -1
- package/Tests/App/Dashboard/IncidentCreateAcknowledgeAlerts.test.tsx +1611 -0
- package/Tests/App/Dashboard/IncidentCreateDetailsStep.test.tsx +643 -0
- package/Tests/App/Dashboard/IncidentCreateFromAlerts.test.tsx +8 -1
- package/Tests/App/Dashboard/IncidentCreateStatusPageScope.test.tsx +601 -0
- package/Tests/App/Dashboard/IncidentCustomFieldTemplateVariables.test.tsx +386 -0
- package/Tests/App/Dashboard/IncidentNoteTemplatePlaceholders.test.tsx +124 -0
- package/Tests/App/Dashboard/IncidentNoteTemplateVariablesLoader.test.ts +305 -0
- package/Tests/App/Dashboard/IncidentOverviewNotifyDefault.test.tsx +112 -0
- package/Tests/App/Dashboard/IncidentSettingsRenotifyOnPublish.test.tsx +674 -0
- package/Tests/App/Dashboard/IncidentSettingsStatusPageScope.test.tsx +1051 -0
- package/Tests/App/Dashboard/IncidentTemplateCustomFields.test.tsx +384 -0
- package/Tests/App/Dashboard/IncidentTemplateStatusPageScopeCard.test.tsx +215 -0
- package/Tests/App/Dashboard/InfrastructureExplorer.test.tsx +1365 -57
- package/Tests/App/Dashboard/InfrastructureGraph.test.tsx +964 -23
- package/Tests/App/Dashboard/InventoryRelationships.test.tsx +885 -0
- package/Tests/App/Dashboard/PublicNotePagesNotifyDefault.test.tsx +113 -1
- package/Tests/App/Dashboard/ServiceMapDatabaseLink.test.tsx +201 -15
- package/Tests/App/Dashboard/ServiceMapGraph.test.tsx +508 -36
- package/Tests/App/Dashboard/SubscriberAudienceSummary.test.tsx +512 -0
- package/Tests/App/Dashboard/SubscriberNotificationPreviewModal.test.tsx +837 -0
- package/Tests/App/Dashboard/SubscriberNotificationStatusLabel.test.tsx +88 -0
- package/Tests/App/Dashboard/SubscriberNotificationStatusResend.test.tsx +473 -0
- package/Tests/App/Dashboard/SubscriberTemplateLivePreview.test.tsx +196 -0
- package/Tests/App/Dashboard/TeamAddedSubscribersUnsubscribedNotice.test.tsx +248 -0
- package/Tests/App/Dashboard/TopologyDataLifecycle.test.tsx +583 -0
- package/Tests/App/Dashboard/TopologyDataLoading.test.tsx +982 -218
- package/Tests/App/Dashboard/TopologyPageNavigation.test.tsx +818 -114
- package/Tests/App/SensitiveUrlTokenBootstrap.test.ts +64 -3
- package/Tests/App/StatusPage/StatusPageUnsubscribePage.test.tsx +412 -0
- package/Tests/Models/IncidentCustomFieldApiSchemaContract.test.ts +217 -0
- package/Tests/Models/IncidentCustomFieldCreateSettingsColumns.test.ts +252 -0
- package/Tests/Models/StatusPageSubscriberUnsubscribeColumns.test.ts +218 -0
- package/Tests/Server/API/ExpiredSessionRouteGuards.test.ts +7 -0
- package/Tests/Server/API/IncidentSubscriberAudienceAPI.test.ts +1408 -0
- package/Tests/Server/API/StatusPageIncidentScope.test.ts +1868 -0
- package/Tests/Server/API/StatusPageIncidentScopePostgres.test.ts +790 -0
- package/Tests/Server/API/StatusPageManageSubscriptionRecipient.test.ts +10 -1
- package/Tests/Server/API/StatusPageManageSubscriptionTemplateVariables.test.ts +206 -18
- package/Tests/Server/API/StatusPagePostmortemVisibility.test.ts +14 -2
- package/Tests/Server/API/StatusPageSubscriberCreateResponse.test.ts +217 -0
- package/Tests/Server/API/StatusPageSubscriberOwnership.test.ts +103 -2
- package/Tests/Server/API/StatusPageUnsubscribeAPI.test.ts +396 -0
- package/Tests/Server/Infrastructure/Postgres/AddIncidentStatusPageScopeMigration.test.ts +395 -0
- package/Tests/Server/Infrastructure/Postgres/AddIncidentTemplateStatusPageScopeFlagMigration.test.ts +150 -0
- package/Tests/Server/Infrastructure/Postgres/AddSubscriberNotificationClaimedAtMigration.test.ts +156 -0
- package/Tests/Server/Infrastructure/Postgres/RenameInventoryItemMigration.test.ts +90 -21
- package/Tests/Server/Infrastructure/Postgres/SkipHiddenIncidentCreatedNotificationsMigration.test.ts +410 -0
- package/Tests/Server/Middleware/IdentityRateLimit.test.ts +551 -1
- package/Tests/Server/Middleware/SubscriberNotificationPreviewRateLimit.test.ts +238 -0
- package/Tests/Server/Middleware/SubscriberNotificationTestSendRateLimit.test.ts +245 -0
- package/Tests/Server/Services/AddStatusPageSubscriberUnsubscribeTokenMigration.test.ts +152 -0
- package/Tests/Server/Services/CrossProjectRelationWriteGuard.test.ts +221 -36
- package/Tests/Server/Services/DatabaseServiceCompareAndSetColumns.test.ts +191 -0
- package/Tests/Server/Services/DomainService.test.ts +525 -0
- package/Tests/Server/Services/IncidentAlertAcknowledgeOnDeclare.test.ts +2630 -0
- package/Tests/Server/Services/IncidentAlertPostgres.test.ts +1625 -1
- package/Tests/Server/Services/IncidentCreatedRenotifyOnPublish.test.ts +681 -0
- package/Tests/Server/Services/IncidentCreatedResend.test.ts +775 -0
- package/Tests/Server/Services/IncidentCustomFieldRenamePostgres.test.ts +713 -0
- package/Tests/Server/Services/IncidentCustomFieldService.test.ts +751 -0
- package/Tests/Server/Services/IncidentCustomFieldValueValidation.test.ts +556 -0
- package/Tests/Server/Services/IncidentDeclareAcknowledgeAlerts.test.ts +2189 -0
- package/Tests/Server/Services/IncidentStatusPageScope.test.ts +2971 -0
- package/Tests/Server/Services/IncidentStatusPageScopeFeed.test.ts +131 -0
- package/Tests/Server/Services/IncidentStatusPageScopePostgres.test.ts +625 -0
- package/Tests/Server/Services/IncidentTemplateCustomFieldsCopy.test.ts +311 -0
- package/Tests/Server/Services/IncidentTemplateStatusPageScope.test.ts +363 -0
- package/Tests/Server/Services/InventoryItemServiceOverviewCounts.test.ts +345 -0
- package/Tests/Server/Services/InventoryOverviewPostgres.test.ts +254 -0
- package/Tests/Server/Services/IoTDeviceCredentialService.test.ts +819 -0
- package/Tests/Server/Services/LinkedAffectedResourcesCreatedFeed.test.ts +420 -0
- package/Tests/Server/Services/PublicNoteEditFeedEventType.test.ts +213 -0
- package/Tests/Server/Services/PublicNoteResendAccess.test.ts +994 -0
- package/Tests/Server/Services/ScheduledMaintenanceSubscriberTemplateFormats.test.ts +289 -9
- package/Tests/Server/Services/SloAffectedResourceCreatedFeed.test.ts +92 -36
- package/Tests/Server/Services/SmsServiceFailIfNotSent.test.ts +67 -0
- package/Tests/Server/Services/StatusPageReportIncidentCounts.test.ts +610 -0
- package/Tests/Server/Services/StatusPageSubscriberAudienceCounts.test.ts +201 -0
- package/Tests/Server/Services/StatusPageSubscriberAudienceCountsPostgres.test.ts +271 -0
- package/Tests/Server/Services/StatusPageSubscriberConfirmationTemplateEscaping.test.ts +200 -0
- package/Tests/Server/Services/StatusPageSubscriberNotificationLogRedaction.test.ts +54 -0
- package/Tests/Server/Services/StatusPageSubscriberNotificationTemplateCompile.test.ts +37 -0
- package/Tests/Server/Services/StatusPageSubscriberNotificationTemplateIncidentRecordAccess.test.ts +772 -0
- package/Tests/Server/Services/StatusPageSubscriberNotificationTemplateLookup.test.ts +506 -0
- package/Tests/Server/Services/StatusPageSubscriberNotificationTemplateLookupPostgres.test.ts +261 -0
- package/Tests/Server/Services/StatusPageSubscriberReport.test.ts +21 -5
- package/Tests/Server/Services/StatusPageSubscriberUnsubscribe.test.ts +1618 -0
- package/Tests/Server/Services/StatusPageSubscriberUnsubscribeLinkSenders.test.ts +373 -0
- package/Tests/Server/Services/StatusPageSubscriberUnsubscribePostgres.test.ts +388 -0
- package/Tests/Server/Services/SubscriberNotificationInFlightRequeue.test.ts +500 -0
- package/Tests/Server/Types/MarkdownEmailLinks.test.ts +320 -0
- package/Tests/Server/Types/Workflow/Components/Email.test.ts +491 -1
- package/Tests/Server/Types/Workflow/Components/EmailSmtpPinning.test.ts +398 -0
- package/Tests/Server/Utils/AffectedResources/LinkedAffectedResources.test.ts +858 -0
- package/Tests/Server/Utils/Alert/AlertStateChangeAuthorization.test.ts +1172 -0
- package/Tests/Server/Utils/CustomField/CustomFieldRename.test.ts +586 -0
- package/Tests/Server/Utils/DataSource/EgressGuard.test.ts +246 -10
- package/Tests/Server/Utils/DataSource/EgressGuardDeploymentConfig.test.ts +226 -0
- package/Tests/Server/Utils/DataSource/EgressGuardPinning.test.ts +131 -0
- package/Tests/Server/Utils/DataSource/HttpFetch.test.ts +4 -0
- package/Tests/Server/Utils/EgressPolicyEnvironment.ts +45 -0
- package/Tests/Server/Utils/Mail/PinnedSmtpSocket.test.ts +409 -0
- package/Tests/Server/Utils/Monitor/MonitorCriteriaObservationBuilderUnits.test.ts +23 -0
- package/Tests/Server/Utils/SSRFProtection.test.ts +4 -0
- package/Tests/Server/Utils/SSRFProtectionCloudServiceAddresses.test.ts +4 -0
- package/Tests/Server/Utils/SSRFProtectionPrivateNetwork.test.ts +4 -0
- package/Tests/Server/Utils/SSRFProtectionResolutionDetail.test.ts +314 -0
- package/Tests/Server/Utils/StatusPage/IncidentStatusPageScope.test.ts +1699 -0
- package/Tests/Server/Utils/StatusPage/IncidentStatusPageScopeQueriesPostgres.test.ts +508 -0
- package/Tests/Server/Utils/StatusPage/IncidentSubscriberAudienceCallerPermission.test.ts +246 -0
- package/Tests/Server/Utils/StatusPage/IncidentTemplateVariableBuilder.test.ts +1348 -0
- package/Tests/Server/Utils/StatusPage/StatusPageReadAccess.test.ts +221 -0
- package/Tests/Server/Utils/StatusPage/StatusPageSubscriberUnsubscribeNotice.test.ts +132 -0
- package/Tests/Server/Utils/StatusPage/StatusPageSubscriberUnsubscribeToken.test.ts +155 -0
- package/Tests/Server/Utils/StatusPage/SubscriberIncidentEmailBuilder.test.ts +708 -0
- package/Tests/Server/Utils/StatusPage/SubscriberNotificationClaim.test.ts +255 -0
- package/Tests/Server/Utils/StatusPage/SubscriberNotificationClaimPostgres.test.ts +528 -0
- package/Tests/Server/Utils/StatusPage/SubscriberNotificationDeliveryRecord.test.ts +1238 -0
- package/Tests/Server/Utils/StatusPage/SubscriberNotificationFanOut.test.ts +472 -0
- package/Tests/Server/Utils/StatusPage/SubscriberNotificationPreviewBuilder.test.ts +1168 -0
- package/Tests/Server/Utils/StatusPage/SubscriberNotificationRunLimit.test.ts +275 -0
- package/Tests/Server/Utils/StatusPage/SubscriberNotificationTiming.test.ts +131 -0
- package/Tests/Server/Utils/StatusPageResource.test.ts +98 -0
- package/Tests/Server/Utils/Topology/InventoryItemEntityKeyIndexMigration.test.ts +386 -0
- package/Tests/Server/Utils/Topology/InventoryItemEntityKeyIndexMigrationPostgres.test.ts +430 -0
- package/Tests/Server/Utils/Topology/TopologyActivityParityPostgres.test.ts +279 -0
- package/Tests/Server/Utils/Topology/TopologyConcurrencyLimiter.test.ts +534 -0
- package/Tests/Server/Utils/Topology/TopologyEstateGenerator.ts +624 -0
- package/Tests/Server/Utils/Topology/TopologyJsonResponse.test.ts +90 -0
- package/Tests/Server/Utils/Topology/TopologyQueries.test.ts +1634 -0
- package/Tests/Server/Utils/Topology/TopologyQueriesDifferentialPostgres.test.ts +683 -0
- package/Tests/Server/Utils/Topology/TopologyQueriesPostgres.test.ts +2624 -0
- package/Tests/Server/Utils/Topology/TopologyReference.ts +1018 -0
- package/Tests/Server/Utils/Topology/TopologyRequest.test.ts +643 -0
- package/Tests/Server/Utils/Topology/TopologyResponseCache.test.ts +305 -0
- package/Tests/Server/Utils/Topology/TopologySql.test.ts +973 -0
- package/Tests/Server/Utils/VM/VMRunnerPrivateNetworkWiring.test.ts +17 -0
- package/Tests/Server/Utils/VM/VMRunnerSsrf.test.ts +75 -0
- package/Tests/Types/CustomField/CustomFieldSavedViews.test.ts +247 -0
- package/Tests/Types/CustomField/CustomFieldTemplateValues.test.ts +186 -0
- package/Tests/Types/CustomField/CustomFieldTypeCorrespondence.test.ts +48 -0
- package/Tests/Types/CustomField/CustomFieldValueFormat.test.ts +215 -0
- package/Tests/Types/CustomField/CustomFieldValueValidator.test.ts +343 -0
- package/Tests/Types/CustomField/CustomFieldVariableKey.test.ts +364 -0
- package/Tests/Types/SafeHtml.test.ts +102 -0
- package/Tests/Types/StatusPage/IncidentCreatedRenotify.test.ts +419 -0
- package/Tests/Types/StatusPage/IncidentCreatedResend.test.ts +118 -0
- package/Tests/Types/StatusPage/IncidentScopeAddedPagesNotification.test.ts +558 -0
- package/Tests/Types/StatusPage/IncidentSubscriberAudience.test.ts +284 -0
- package/Tests/Types/StatusPage/StatusPageSubscriberUnsubscribe.test.ts +341 -0
- package/Tests/Types/StatusPage/SubscriberNotificationPreview.test.ts +196 -0
- package/Tests/Types/StatusPage/SubscriberNotificationResend.test.ts +201 -0
- package/Tests/Types/StatusPage/SubscriberNotificationTemplateCompiler.test.ts +277 -0
- package/Tests/Types/StatusPage/SubscriberNotificationTemplatePreview.test.ts +179 -0
- package/Tests/Types/StatusPage/SubscriberNotificationTemplateVariables.test.ts +324 -0
- package/Tests/Types/StatusPage/SubscriberUpdateNotification.test.ts +60 -13
- package/Tests/Types/Topology/TopologyTypeRules.test.ts +176 -0
- package/Tests/UI/Components/CustomFields/CustomFieldFormFields.test.ts +432 -0
- package/Tests/UI/Components/CustomFields/CustomFieldModelFormFields.test.tsx +685 -0
- package/Tests/UI/Components/CustomFields/CustomFieldsDetailOrder.test.tsx +469 -0
- package/Tests/UI/Components/Forms/ModelFormCustomFieldInputs.test.tsx +325 -0
- package/Tests/UI/Components/Forms/ModelFormDropdownOptionsRefused.test.tsx +358 -0
- package/Tests/UI/Components/ModelTable/CustomFieldColumns.test.tsx +22 -0
- package/Tests/UI/Monitor/NetworkPathView.test.tsx +289 -0
- package/Tests/Utils/Incident/IncidentFromAlerts.test.ts +302 -0
- package/Tests/Utils/Incident/IncidentNoteTemplateVariables.test.ts +623 -0
- package/Tests/Utils/Markdown/MarkdownEscape.test.ts +89 -0
- package/Tests/Utils/ProbeNetworkFailureUtil.test.ts +992 -0
- package/Tests/Utils/RequestFailedDetails.test.ts +575 -0
- package/Types/CustomField/CustomFieldOrder.ts +55 -0
- package/Types/CustomField/CustomFieldSavedViews.ts +225 -0
- package/Types/CustomField/CustomFieldTemplateMerge.ts +71 -0
- package/Types/CustomField/CustomFieldType.ts +14 -0
- package/Types/CustomField/CustomFieldValueFormat.ts +161 -0
- package/Types/CustomField/CustomFieldValueValidator.ts +488 -0
- package/Types/CustomField/CustomFieldVariableKey.ts +211 -0
- package/Types/Incident/IncidentAlertLink.ts +19 -0
- package/Types/SafeHtml.ts +93 -0
- package/Types/StatusPage/IncidentCreatedRenotify.ts +224 -0
- package/Types/StatusPage/IncidentCreatedResend.ts +108 -0
- package/Types/StatusPage/IncidentScopeAddedPagesNotification.ts +343 -0
- package/Types/StatusPage/IncidentSubscriberAudience.ts +332 -0
- package/Types/StatusPage/StatusPageSubscriberUnsubscribe.ts +405 -0
- package/Types/StatusPage/SubscriberNotificationInterruption.ts +32 -0
- package/Types/StatusPage/SubscriberNotificationPreview.ts +322 -0
- package/Types/StatusPage/SubscriberNotificationResend.ts +132 -0
- package/Types/StatusPage/SubscriberNotificationTemplateCompiler.ts +180 -0
- package/Types/StatusPage/SubscriberNotificationTemplatePreview.ts +301 -0
- package/Types/StatusPage/SubscriberNotificationTemplateVariables.ts +217 -4
- package/Types/StatusPage/SubscriberUpdateNotification.ts +32 -11
- package/Types/Telemetry/InventoryLiveness.ts +26 -0
- package/Types/Topology/TopologyApi.ts +428 -0
- package/Types/Topology/TopologyTypeRules.ts +191 -0
- package/UI/Components/CustomFields/CustomFieldFormFields.ts +317 -0
- package/UI/Components/CustomFields/CustomFieldModelFormFields.tsx +395 -0
- package/UI/Components/CustomFields/CustomFieldsDetail.tsx +95 -55
- package/UI/Components/Forms/ModelForm.tsx +70 -8
- package/UI/Components/Forms/Validation.ts +1 -1
- package/UI/Components/ModelFormModal/ModelFormModal.tsx +2 -4
- package/UI/Components/ModelTable/AnalyticsModelTable.tsx +2 -6
- package/UI/Components/ModelTable/BaseModelTable.tsx +9 -8
- package/UI/Components/ModelTable/CustomFieldColumns.tsx +14 -1
- package/UI/Components/ModelTable/ModelTable.tsx +6 -7
- package/UI/Utils/SensitiveUrlToken.ts +10 -5
- package/Utils/API.ts +247 -2
- package/Utils/Incident/IncidentFromAlerts.ts +78 -0
- package/Utils/Incident/IncidentNoteTemplateVariables.ts +304 -0
- package/Utils/Markdown/MarkdownEscape.ts +65 -0
- package/Utils/ProbeNetworkFailureUtil.ts +673 -0
- package/build/dist/Models/DatabaseModels/Incident.js +267 -1
- package/build/dist/Models/DatabaseModels/Incident.js.map +1 -1
- package/build/dist/Models/DatabaseModels/IncidentCustomField.js +207 -1
- package/build/dist/Models/DatabaseModels/IncidentCustomField.js.map +1 -1
- package/build/dist/Models/DatabaseModels/IncidentEpisode.js +31 -0
- package/build/dist/Models/DatabaseModels/IncidentEpisode.js.map +1 -1
- package/build/dist/Models/DatabaseModels/IncidentTemplate.js +124 -1
- package/build/dist/Models/DatabaseModels/IncidentTemplate.js.map +1 -1
- package/build/dist/Models/DatabaseModels/InventoryItem.js +20 -11
- package/build/dist/Models/DatabaseModels/InventoryItem.js.map +1 -1
- package/build/dist/Models/DatabaseModels/StatusPage.js +56 -0
- package/build/dist/Models/DatabaseModels/StatusPage.js.map +1 -1
- package/build/dist/Models/DatabaseModels/StatusPageSubscriber.js +131 -0
- package/build/dist/Models/DatabaseModels/StatusPageSubscriber.js.map +1 -1
- package/build/dist/Server/API/IncidentAPI.js +100 -1
- package/build/dist/Server/API/IncidentAPI.js.map +1 -1
- package/build/dist/Server/API/StatusPageAPI.js +417 -176
- package/build/dist/Server/API/StatusPageAPI.js.map +1 -1
- package/build/dist/Server/API/StatusPageSubscriberAPI.js +52 -13
- package/build/dist/Server/API/StatusPageSubscriberAPI.js.map +1 -1
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1795200000000-AddInventoryItemProjectEntityKeyIndex.js +165 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1795200000000-AddInventoryItemProjectEntityKeyIndex.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1795300000000-SkipHiddenIncidentCreatedNotifications.js +41 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1795300000000-SkipHiddenIncidentCreatedNotifications.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1795400000000-AddIncidentStatusPageScope.js +57 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1795400000000-AddIncidentStatusPageScope.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1795500000000-AddIncidentTemplateStatusPageScopeFlag.js +23 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1795500000000-AddIncidentTemplateStatusPageScopeFlag.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1795600000000-AddStatusPageSubscriberUnsubscribeToken.js +40 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1795600000000-AddStatusPageSubscriberUnsubscribeToken.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1795700000000-AddStatusPageSubscriberIsAddedByTeam.js +26 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1795700000000-AddStatusPageSubscriberIsAddedByTeam.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1795800000000-AddIncidentCustomFieldCreateAndNotificationSettings.js +89 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1795800000000-AddIncidentCustomFieldCreateAndNotificationSettings.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1795900000000-AddSubscriberNotificationClaimedAt.js +29 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1795900000000-AddSubscriberNotificationClaimedAt.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js +16 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js.map +1 -1
- package/build/dist/Server/Infrastructure/Semaphore.js +3 -0
- package/build/dist/Server/Infrastructure/Semaphore.js.map +1 -1
- package/build/dist/Server/Middleware/IdentityRateLimit.js +89 -3
- package/build/dist/Server/Middleware/IdentityRateLimit.js.map +1 -1
- package/build/dist/Server/Middleware/SubscriberNotificationPreviewRateLimit.js +149 -0
- package/build/dist/Server/Middleware/SubscriberNotificationPreviewRateLimit.js.map +1 -0
- package/build/dist/Server/Middleware/SubscriberNotificationTestSendRateLimit.js +190 -0
- package/build/dist/Server/Middleware/SubscriberNotificationTestSendRateLimit.js.map +1 -0
- package/build/dist/Server/Services/AlertService.js +21 -33
- package/build/dist/Server/Services/AlertService.js.map +1 -1
- package/build/dist/Server/Services/DatabaseService.js +56 -7
- package/build/dist/Server/Services/DatabaseService.js.map +1 -1
- package/build/dist/Server/Services/IncidentAlertService.js +457 -3
- package/build/dist/Server/Services/IncidentAlertService.js.map +1 -1
- package/build/dist/Server/Services/IncidentCustomFieldService.js +204 -8
- package/build/dist/Server/Services/IncidentCustomFieldService.js.map +1 -1
- package/build/dist/Server/Services/IncidentEpisodePublicNoteService.js +24 -0
- package/build/dist/Server/Services/IncidentEpisodePublicNoteService.js.map +1 -1
- package/build/dist/Server/Services/IncidentEpisodeService.js +14 -0
- package/build/dist/Server/Services/IncidentEpisodeService.js.map +1 -1
- package/build/dist/Server/Services/IncidentEpisodeStateTimelineService.js +26 -0
- package/build/dist/Server/Services/IncidentEpisodeStateTimelineService.js.map +1 -1
- package/build/dist/Server/Services/IncidentPublicNoteService.js +26 -1
- package/build/dist/Server/Services/IncidentPublicNoteService.js.map +1 -1
- package/build/dist/Server/Services/IncidentService.js +1148 -42
- package/build/dist/Server/Services/IncidentService.js.map +1 -1
- package/build/dist/Server/Services/IncidentStateTimelineService.js +12 -0
- package/build/dist/Server/Services/IncidentStateTimelineService.js.map +1 -1
- package/build/dist/Server/Services/IncidentTemplateService.js +83 -0
- package/build/dist/Server/Services/IncidentTemplateService.js.map +1 -1
- package/build/dist/Server/Services/InventoryItemService.js +31 -0
- package/build/dist/Server/Services/InventoryItemService.js.map +1 -1
- package/build/dist/Server/Services/IoTDeviceCredentialService.js +12 -5
- package/build/dist/Server/Services/IoTDeviceCredentialService.js.map +1 -1
- package/build/dist/Server/Services/ScheduledMaintenancePublicNoteService.js +26 -1
- package/build/dist/Server/Services/ScheduledMaintenancePublicNoteService.js.map +1 -1
- package/build/dist/Server/Services/ScheduledMaintenanceService.js +84 -57
- package/build/dist/Server/Services/ScheduledMaintenanceService.js.map +1 -1
- package/build/dist/Server/Services/SmsService.js +2 -22
- package/build/dist/Server/Services/SmsService.js.map +1 -1
- package/build/dist/Server/Services/StatusPageService.js +47 -9
- package/build/dist/Server/Services/StatusPageService.js.map +1 -1
- package/build/dist/Server/Services/StatusPageSubscriberNotificationTemplateService.js +237 -32
- package/build/dist/Server/Services/StatusPageSubscriberNotificationTemplateService.js.map +1 -1
- package/build/dist/Server/Services/StatusPageSubscriberNotificationTemplateStatusPageService.js +109 -0
- package/build/dist/Server/Services/StatusPageSubscriberNotificationTemplateStatusPageService.js.map +1 -1
- package/build/dist/Server/Services/StatusPageSubscriberService.js +925 -99
- package/build/dist/Server/Services/StatusPageSubscriberService.js.map +1 -1
- package/build/dist/Server/Services/UserNotificationRuleService.js +55 -51
- package/build/dist/Server/Services/UserNotificationRuleService.js.map +1 -1
- package/build/dist/Server/Services/WorkspaceNotificationSummaryService.js +42 -25
- package/build/dist/Server/Services/WorkspaceNotificationSummaryService.js.map +1 -1
- package/build/dist/Server/Types/Markdown.js +110 -6
- package/build/dist/Server/Types/Markdown.js.map +1 -1
- package/build/dist/Server/Types/Workflow/Components/Email.js +55 -6
- package/build/dist/Server/Types/Workflow/Components/Email.js.map +1 -1
- package/build/dist/Server/Utils/AffectedResources/LinkedAffectedResources.js +405 -0
- package/build/dist/Server/Utils/AffectedResources/LinkedAffectedResources.js.map +1 -0
- package/build/dist/Server/Utils/Alert/AlertStateChangeAuthorization.js +112 -0
- package/build/dist/Server/Utils/Alert/AlertStateChangeAuthorization.js.map +1 -0
- package/build/dist/Server/Utils/CustomField/CustomFieldRename.js +211 -0
- package/build/dist/Server/Utils/CustomField/CustomFieldRename.js.map +1 -0
- package/build/dist/Server/Utils/DataSource/EgressGuard.js +41 -12
- package/build/dist/Server/Utils/DataSource/EgressGuard.js.map +1 -1
- package/build/dist/Server/Utils/Inventory/InventoryOverviewAggregation.js +81 -0
- package/build/dist/Server/Utils/Inventory/InventoryOverviewAggregation.js.map +1 -0
- package/build/dist/Server/Utils/Mail/PinnedSmtpSocket.js +101 -0
- package/build/dist/Server/Utils/Mail/PinnedSmtpSocket.js.map +1 -0
- package/build/dist/Server/Utils/Monitor/MonitorCriteriaObservationBuilder.js +9 -0
- package/build/dist/Server/Utils/Monitor/MonitorCriteriaObservationBuilder.js.map +1 -1
- package/build/dist/Server/Utils/Response.js +30 -0
- package/build/dist/Server/Utils/Response.js.map +1 -1
- package/build/dist/Server/Utils/SSRFProtection.js +48 -6
- package/build/dist/Server/Utils/SSRFProtection.js.map +1 -1
- package/build/dist/Server/Utils/StatusPage/IncidentStatusPageScope.js +631 -0
- package/build/dist/Server/Utils/StatusPage/IncidentStatusPageScope.js.map +1 -0
- package/build/dist/Server/Utils/StatusPage/IncidentSubscriberAudienceBuilder.js +403 -0
- package/build/dist/Server/Utils/StatusPage/IncidentSubscriberAudienceBuilder.js.map +1 -0
- package/build/dist/Server/Utils/StatusPage/IncidentTemplateVariableBuilder.js +451 -0
- package/build/dist/Server/Utils/StatusPage/IncidentTemplateVariableBuilder.js.map +1 -0
- package/build/dist/Server/Utils/StatusPage/StatusPageExclusion.js +13 -0
- package/build/dist/Server/Utils/StatusPage/StatusPageExclusion.js.map +1 -0
- package/build/dist/Server/Utils/StatusPage/StatusPageReadAccess.js +91 -0
- package/build/dist/Server/Utils/StatusPage/StatusPageReadAccess.js.map +1 -0
- package/build/dist/Server/Utils/StatusPage/StatusPageSubscriberUnsubscribeNotice.js +101 -0
- package/build/dist/Server/Utils/StatusPage/StatusPageSubscriberUnsubscribeNotice.js.map +1 -0
- package/build/dist/Server/Utils/StatusPage/StatusPageSubscriberUnsubscribeToken.js +47 -0
- package/build/dist/Server/Utils/StatusPage/StatusPageSubscriberUnsubscribeToken.js.map +1 -0
- package/build/dist/Server/Utils/StatusPage/SubscriberIncidentEmailBuilder.js +273 -0
- package/build/dist/Server/Utils/StatusPage/SubscriberIncidentEmailBuilder.js.map +1 -0
- package/build/dist/Server/Utils/StatusPage/SubscriberNotificationClaim.js +73 -0
- package/build/dist/Server/Utils/StatusPage/SubscriberNotificationClaim.js.map +1 -0
- package/build/dist/Server/Utils/StatusPage/SubscriberNotificationDeliveryRecord.js +722 -0
- package/build/dist/Server/Utils/StatusPage/SubscriberNotificationDeliveryRecord.js.map +1 -0
- package/build/dist/Server/Utils/StatusPage/SubscriberNotificationFanOut.js +102 -0
- package/build/dist/Server/Utils/StatusPage/SubscriberNotificationFanOut.js.map +1 -0
- package/build/dist/Server/Utils/StatusPage/SubscriberNotificationPreviewBuilder.js +527 -0
- package/build/dist/Server/Utils/StatusPage/SubscriberNotificationPreviewBuilder.js.map +1 -0
- package/build/dist/Server/Utils/StatusPage/SubscriberNotificationResendAccess.js +278 -0
- package/build/dist/Server/Utils/StatusPage/SubscriberNotificationResendAccess.js.map +1 -0
- package/build/dist/Server/Utils/StatusPage/SubscriberNotificationRunLimit.js +137 -0
- package/build/dist/Server/Utils/StatusPage/SubscriberNotificationRunLimit.js.map +1 -0
- package/build/dist/Server/Utils/StatusPage/SubscriberNotificationTiming.js +103 -0
- package/build/dist/Server/Utils/StatusPage/SubscriberNotificationTiming.js.map +1 -0
- package/build/dist/Server/Utils/StatusPage/SubscriberTemplateIncidentRecordAccess.js +114 -0
- package/build/dist/Server/Utils/StatusPage/SubscriberTemplateIncidentRecordAccess.js.map +1 -0
- package/build/dist/Server/Utils/StatusPageResource.js +39 -7
- package/build/dist/Server/Utils/StatusPageResource.js.map +1 -1
- package/build/dist/Server/Utils/Topology/TopologyConcurrencyLimiter.js +178 -0
- package/build/dist/Server/Utils/Topology/TopologyConcurrencyLimiter.js.map +1 -0
- package/build/dist/Server/Utils/Topology/TopologyQueries.js +884 -0
- package/build/dist/Server/Utils/Topology/TopologyQueries.js.map +1 -0
- package/build/dist/Server/Utils/Topology/TopologyRequest.js +275 -0
- package/build/dist/Server/Utils/Topology/TopologyRequest.js.map +1 -0
- package/build/dist/Server/Utils/Topology/TopologyResponseCache.js +146 -0
- package/build/dist/Server/Utils/Topology/TopologyResponseCache.js.map +1 -0
- package/build/dist/Server/Utils/Topology/TopologySql.js +688 -0
- package/build/dist/Server/Utils/Topology/TopologySql.js.map +1 -0
- package/build/dist/Server/Utils/VM/VMAPI.js.map +1 -1
- package/build/dist/Server/Utils/VM/VMRunner.js +1 -0
- package/build/dist/Server/Utils/VM/VMRunner.js.map +1 -1
- package/build/dist/Server/Utils/Workflow/OAuth2TokenClient.js +3 -0
- package/build/dist/Server/Utils/Workflow/OAuth2TokenClient.js.map +1 -1
- package/build/dist/Types/CustomField/CustomFieldOrder.js +36 -0
- package/build/dist/Types/CustomField/CustomFieldOrder.js.map +1 -0
- package/build/dist/Types/CustomField/CustomFieldSavedViews.js +135 -0
- package/build/dist/Types/CustomField/CustomFieldSavedViews.js.map +1 -0
- package/build/dist/Types/CustomField/CustomFieldTemplateMerge.js +27 -0
- package/build/dist/Types/CustomField/CustomFieldTemplateMerge.js.map +1 -0
- package/build/dist/Types/CustomField/CustomFieldType.js +12 -0
- package/build/dist/Types/CustomField/CustomFieldType.js.map +1 -1
- package/build/dist/Types/CustomField/CustomFieldValueFormat.js +126 -0
- package/build/dist/Types/CustomField/CustomFieldValueFormat.js.map +1 -0
- package/build/dist/Types/CustomField/CustomFieldValueValidator.js +280 -0
- package/build/dist/Types/CustomField/CustomFieldValueValidator.js.map +1 -0
- package/build/dist/Types/CustomField/CustomFieldVariableKey.js +150 -0
- package/build/dist/Types/CustomField/CustomFieldVariableKey.js.map +1 -0
- package/build/dist/Types/Incident/IncidentAlertLink.js +17 -0
- package/build/dist/Types/Incident/IncidentAlertLink.js.map +1 -1
- package/build/dist/Types/SafeHtml.js +84 -0
- package/build/dist/Types/SafeHtml.js.map +1 -0
- package/build/dist/Types/StatusPage/IncidentCreatedRenotify.js +117 -0
- package/build/dist/Types/StatusPage/IncidentCreatedRenotify.js.map +1 -0
- package/build/dist/Types/StatusPage/IncidentCreatedResend.js +86 -0
- package/build/dist/Types/StatusPage/IncidentCreatedResend.js.map +1 -0
- package/build/dist/Types/StatusPage/IncidentScopeAddedPagesNotification.js +246 -0
- package/build/dist/Types/StatusPage/IncidentScopeAddedPagesNotification.js.map +1 -0
- package/build/dist/Types/StatusPage/IncidentSubscriberAudience.js +183 -0
- package/build/dist/Types/StatusPage/IncidentSubscriberAudience.js.map +1 -0
- package/build/dist/Types/StatusPage/StatusPageSubscriberUnsubscribe.js +277 -0
- package/build/dist/Types/StatusPage/StatusPageSubscriberUnsubscribe.js.map +1 -0
- package/build/dist/Types/StatusPage/SubscriberNotificationInterruption.js +27 -0
- package/build/dist/Types/StatusPage/SubscriberNotificationInterruption.js.map +1 -0
- package/build/dist/Types/StatusPage/SubscriberNotificationPreview.js +190 -0
- package/build/dist/Types/StatusPage/SubscriberNotificationPreview.js.map +1 -0
- package/build/dist/Types/StatusPage/SubscriberNotificationResend.js +102 -0
- package/build/dist/Types/StatusPage/SubscriberNotificationResend.js.map +1 -0
- package/build/dist/Types/StatusPage/SubscriberNotificationTemplateCompiler.js +97 -0
- package/build/dist/Types/StatusPage/SubscriberNotificationTemplateCompiler.js.map +1 -0
- package/build/dist/Types/StatusPage/SubscriberNotificationTemplatePreview.js +175 -0
- package/build/dist/Types/StatusPage/SubscriberNotificationTemplatePreview.js.map +1 -0
- package/build/dist/Types/StatusPage/SubscriberNotificationTemplateVariables.js +144 -4
- package/build/dist/Types/StatusPage/SubscriberNotificationTemplateVariables.js.map +1 -1
- package/build/dist/Types/StatusPage/SubscriberUpdateNotification.js +29 -9
- package/build/dist/Types/StatusPage/SubscriberUpdateNotification.js.map +1 -1
- package/build/dist/Types/Telemetry/InventoryLiveness.js +23 -0
- package/build/dist/Types/Telemetry/InventoryLiveness.js.map +1 -1
- package/build/dist/Types/Topology/TopologyApi.js +55 -0
- package/build/dist/Types/Topology/TopologyApi.js.map +1 -0
- package/build/dist/Types/Topology/TopologyTypeRules.js +165 -0
- package/build/dist/Types/Topology/TopologyTypeRules.js.map +1 -0
- package/build/dist/UI/Components/CustomFields/CustomFieldFormFields.js +169 -0
- package/build/dist/UI/Components/CustomFields/CustomFieldFormFields.js.map +1 -0
- package/build/dist/UI/Components/CustomFields/CustomFieldModelFormFields.js +212 -0
- package/build/dist/UI/Components/CustomFields/CustomFieldModelFormFields.js.map +1 -0
- package/build/dist/UI/Components/CustomFields/CustomFieldsDetail.js +64 -49
- package/build/dist/UI/Components/CustomFields/CustomFieldsDetail.js.map +1 -1
- package/build/dist/UI/Components/Forms/ModelForm.js +39 -5
- package/build/dist/UI/Components/Forms/ModelForm.js.map +1 -1
- package/build/dist/UI/Components/Forms/Validation.js +1 -1
- package/build/dist/UI/Components/Forms/Validation.js.map +1 -1
- package/build/dist/UI/Components/ModelFormModal/ModelFormModal.js.map +1 -1
- package/build/dist/UI/Components/ModelTable/AnalyticsModelTable.js.map +1 -1
- package/build/dist/UI/Components/ModelTable/BaseModelTable.js +2 -2
- package/build/dist/UI/Components/ModelTable/BaseModelTable.js.map +1 -1
- package/build/dist/UI/Components/ModelTable/CustomFieldColumns.js +13 -1
- package/build/dist/UI/Components/ModelTable/CustomFieldColumns.js.map +1 -1
- package/build/dist/UI/Components/ModelTable/ModelTable.js +1 -1
- package/build/dist/UI/Components/ModelTable/ModelTable.js.map +1 -1
- package/build/dist/UI/Utils/SensitiveUrlToken.js +10 -5
- package/build/dist/UI/Utils/SensitiveUrlToken.js.map +1 -1
- package/build/dist/Utils/API.js +177 -1
- package/build/dist/Utils/API.js.map +1 -1
- package/build/dist/Utils/Incident/IncidentFromAlerts.js +38 -0
- package/build/dist/Utils/Incident/IncidentFromAlerts.js.map +1 -1
- package/build/dist/Utils/Incident/IncidentNoteTemplateVariables.js +155 -0
- package/build/dist/Utils/Incident/IncidentNoteTemplateVariables.js.map +1 -0
- package/build/dist/Utils/Markdown/MarkdownEscape.js +48 -0
- package/build/dist/Utils/Markdown/MarkdownEscape.js.map +1 -1
- package/build/dist/Utils/ProbeNetworkFailureUtil.js +460 -0
- package/build/dist/Utils/ProbeNetworkFailureUtil.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,190 @@
|
|
|
1
|
+
import URL from "../API/URL";
|
|
2
|
+
import IncidentSubscriberAudience from "./IncidentSubscriberAudience";
|
|
3
|
+
import StatusPageSubscriberUnsubscribe from "./StatusPageSubscriberUnsubscribe";
|
|
4
|
+
/*
|
|
5
|
+
* "Preview notification" and "Send test to me": the email a status page's
|
|
6
|
+
* subscribers would get about an incident, shown before anything is sent -
|
|
7
|
+
* on the last step of declaring an incident, and while a public note is being
|
|
8
|
+
* written.
|
|
9
|
+
*
|
|
10
|
+
* The server (App/FeatureSet/Notification/API/SubscriberNotificationPreview)
|
|
11
|
+
* builds each page's email through SubscriberIncidentEmailBuilder, the one
|
|
12
|
+
* code path the subscriber jobs send through, and renders it with the mailer's
|
|
13
|
+
* own MailService.render. So the subject and HTML shown here are the ones a
|
|
14
|
+
* subscriber gets, apart from one thing: every subscriber's unsubscribe link
|
|
15
|
+
* carries their own token, which a preview has no subscriber to take it from,
|
|
16
|
+
* so the preview's link is a sample (getPreviewUnsubscribeUrl).
|
|
17
|
+
*
|
|
18
|
+
* Only counts ever leave the server: no subscriber address is read out.
|
|
19
|
+
*
|
|
20
|
+
* Everything here is shared by the server, which answers, and the dashboard,
|
|
21
|
+
* which asks and shows, so the two cannot drift apart.
|
|
22
|
+
*/
|
|
23
|
+
// Which email is previewed.
|
|
24
|
+
export var SubscriberNotificationPreviewEvent;
|
|
25
|
+
(function (SubscriberNotificationPreviewEvent) {
|
|
26
|
+
// "Incident created", for an incident that is being declared.
|
|
27
|
+
SubscriberNotificationPreviewEvent["IncidentCreated"] = "IncidentCreated";
|
|
28
|
+
// "Incident update", for a public note being written on an incident.
|
|
29
|
+
SubscriberNotificationPreviewEvent["IncidentPublicNoteCreated"] = "IncidentPublicNoteCreated";
|
|
30
|
+
})(SubscriberNotificationPreviewEvent || (SubscriberNotificationPreviewEvent = {}));
|
|
31
|
+
/*
|
|
32
|
+
* Why a status page's subscribers get the email they get. The jobs use the
|
|
33
|
+
* page's custom email template only when it has a body and the page sends
|
|
34
|
+
* through its own SMTP server; everything else gets the default email.
|
|
35
|
+
*/
|
|
36
|
+
export var SubscriberEmailTemplateChoiceReason;
|
|
37
|
+
(function (SubscriberEmailTemplateChoiceReason) {
|
|
38
|
+
// The page's custom template, sent through the page's own SMTP server.
|
|
39
|
+
SubscriberEmailTemplateChoiceReason["CustomTemplate"] = "CustomTemplate";
|
|
40
|
+
// No custom email template is linked to the page for this event.
|
|
41
|
+
SubscriberEmailTemplateChoiceReason["NoCustomTemplate"] = "NoCustomTemplate";
|
|
42
|
+
// A custom template is linked, but the page has no SMTP server of its own.
|
|
43
|
+
SubscriberEmailTemplateChoiceReason["CustomTemplateNeedsCustomSmtp"] = "CustomTemplateNeedsCustomSmtp";
|
|
44
|
+
// A custom template is linked, but its body is empty.
|
|
45
|
+
SubscriberEmailTemplateChoiceReason["CustomTemplateIsEmpty"] = "CustomTemplateIsEmpty";
|
|
46
|
+
})(SubscriberEmailTemplateChoiceReason || (SubscriberEmailTemplateChoiceReason = {}));
|
|
47
|
+
// Why nothing will be sent, whatever the email would look like.
|
|
48
|
+
export var SubscriberNotificationPreviewNothingSentReason;
|
|
49
|
+
(function (SubscriberNotificationPreviewNothingSentReason) {
|
|
50
|
+
// No monitor: subscribers hear about an incident through its monitors.
|
|
51
|
+
SubscriberNotificationPreviewNothingSentReason["NoMonitors"] = "NoMonitors";
|
|
52
|
+
// The incident exists and is hidden from status pages (or private).
|
|
53
|
+
SubscriberNotificationPreviewNothingSentReason["HiddenFromStatusPages"] = "HiddenFromStatusPages";
|
|
54
|
+
// The incident being declared is private.
|
|
55
|
+
SubscriberNotificationPreviewNothingSentReason["PrivateIncident"] = "PrivateIncident";
|
|
56
|
+
// 'Notify Status Page Subscribers' is off on the incident being declared.
|
|
57
|
+
SubscriberNotificationPreviewNothingSentReason["NotifyOff"] = "NotifyOff";
|
|
58
|
+
// No status page that lists its monitors will show it.
|
|
59
|
+
SubscriberNotificationPreviewNothingSentReason["NoStatusPages"] = "NoStatusPages";
|
|
60
|
+
})(SubscriberNotificationPreviewNothingSentReason || (SubscriberNotificationPreviewNothingSentReason = {}));
|
|
61
|
+
class SubscriberNotificationPreview {
|
|
62
|
+
/*
|
|
63
|
+
* The unsubscribe link a preview and a test email carry. A subscriber's
|
|
64
|
+
* real link carries its own token (StatusPageSubscriberUnsubscribe), which
|
|
65
|
+
* a preview has no subscriber for, so this one names no subscription: the
|
|
66
|
+
* status page opens it as an out-of-date link and changes nothing.
|
|
67
|
+
*/
|
|
68
|
+
static getPreviewUnsubscribeUrl(statusPageUrl) {
|
|
69
|
+
return URL.fromString(statusPageUrl)
|
|
70
|
+
.addRoute(`/${StatusPageSubscriberUnsubscribe.PAGE_ROUTE_SEGMENT}/preview`)
|
|
71
|
+
.toString();
|
|
72
|
+
}
|
|
73
|
+
static toJSON(result) {
|
|
74
|
+
return {
|
|
75
|
+
event: result.event,
|
|
76
|
+
nothingSentReason: result.nothingSentReason,
|
|
77
|
+
statusPages: result.statusPages.map((statusPage) => {
|
|
78
|
+
return {
|
|
79
|
+
statusPageId: statusPage.statusPageId,
|
|
80
|
+
name: statusPage.name,
|
|
81
|
+
subscriberCounts: Object.assign({}, statusPage.subscriberCounts),
|
|
82
|
+
subject: statusPage.subject,
|
|
83
|
+
html: statusPage.html,
|
|
84
|
+
templateChoice: {
|
|
85
|
+
usesCustomTemplate: statusPage.templateChoice.usesCustomTemplate,
|
|
86
|
+
reason: statusPage.templateChoice.reason,
|
|
87
|
+
customTemplateName: statusPage.templateChoice.customTemplateName || null,
|
|
88
|
+
},
|
|
89
|
+
};
|
|
90
|
+
}),
|
|
91
|
+
audience: IncidentSubscriberAudience.toJSON(result.audience),
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
/*
|
|
95
|
+
* The server's answer as the dashboard receives it. Read defensively: a
|
|
96
|
+
* field that is missing or of the wrong type reads as "nothing", so a
|
|
97
|
+
* preview can never break the form it opens from.
|
|
98
|
+
*/
|
|
99
|
+
static fromJSON(json) {
|
|
100
|
+
const events = Object.values(SubscriberNotificationPreviewEvent);
|
|
101
|
+
const reasons = Object.values(SubscriberNotificationPreviewNothingSentReason);
|
|
102
|
+
const choiceReasons = Object.values(SubscriberEmailTemplateChoiceReason);
|
|
103
|
+
const statusPagesJson = Array.isArray(json["statusPages"])
|
|
104
|
+
? json["statusPages"].filter((item) => {
|
|
105
|
+
return Boolean(item) && typeof item === "object";
|
|
106
|
+
})
|
|
107
|
+
: [];
|
|
108
|
+
return {
|
|
109
|
+
event: events.includes(String(json["event"]))
|
|
110
|
+
? json["event"]
|
|
111
|
+
: SubscriberNotificationPreviewEvent.IncidentCreated,
|
|
112
|
+
nothingSentReason: reasons.includes(String(json["nothingSentReason"]))
|
|
113
|
+
? json["nothingSentReason"]
|
|
114
|
+
: null,
|
|
115
|
+
statusPages: statusPagesJson.map((item) => {
|
|
116
|
+
const choice = item["templateChoice"] || {};
|
|
117
|
+
return {
|
|
118
|
+
statusPageId: String(item["statusPageId"] || ""),
|
|
119
|
+
name: String(item["name"] || ""),
|
|
120
|
+
subscriberCounts: IncidentSubscriberAudience.countsFromJSON(item["subscriberCounts"]),
|
|
121
|
+
subject: String(item["subject"] || ""),
|
|
122
|
+
html: String(item["html"] || ""),
|
|
123
|
+
templateChoice: {
|
|
124
|
+
usesCustomTemplate: choice["usesCustomTemplate"] === true,
|
|
125
|
+
reason: choiceReasons.includes(String(choice["reason"]))
|
|
126
|
+
? choice["reason"]
|
|
127
|
+
: SubscriberEmailTemplateChoiceReason.NoCustomTemplate,
|
|
128
|
+
customTemplateName: typeof choice["customTemplateName"] === "string" &&
|
|
129
|
+
choice["customTemplateName"]
|
|
130
|
+
? choice["customTemplateName"]
|
|
131
|
+
: undefined,
|
|
132
|
+
},
|
|
133
|
+
};
|
|
134
|
+
}),
|
|
135
|
+
audience: IncidentSubscriberAudience.fromJSON(json["audience"] || {}),
|
|
136
|
+
};
|
|
137
|
+
}
|
|
138
|
+
// A request as it travels: the dates as ISO strings.
|
|
139
|
+
static requestToJSON(request) {
|
|
140
|
+
const json = {
|
|
141
|
+
event: request.event,
|
|
142
|
+
};
|
|
143
|
+
if (request.event === SubscriberNotificationPreviewEvent.IncidentCreated) {
|
|
144
|
+
json["incident"] = {
|
|
145
|
+
title: request.incident.title,
|
|
146
|
+
description: request.incident.description,
|
|
147
|
+
incidentSeverityId: request.incident.incidentSeverityId,
|
|
148
|
+
monitorIds: [...request.incident.monitorIds],
|
|
149
|
+
statusPageIds: [...request.incident.statusPageIds],
|
|
150
|
+
labelIds: [...request.incident.labelIds],
|
|
151
|
+
customFields: Object.assign({}, request.incident.customFields),
|
|
152
|
+
isPrivate: request.incident.isPrivate,
|
|
153
|
+
shouldStatusPageSubscribersBeNotifiedOnIncidentCreated: request.incident
|
|
154
|
+
.shouldStatusPageSubscribersBeNotifiedOnIncidentCreated,
|
|
155
|
+
};
|
|
156
|
+
}
|
|
157
|
+
else {
|
|
158
|
+
json["incidentId"] = request.incidentId;
|
|
159
|
+
json["note"] = request.note;
|
|
160
|
+
json["postedAt"] = request.postedAt
|
|
161
|
+
? request.postedAt.toISOString()
|
|
162
|
+
: null;
|
|
163
|
+
}
|
|
164
|
+
if ("statusPageId" in request && request.statusPageId) {
|
|
165
|
+
json["statusPageId"] = request.statusPageId;
|
|
166
|
+
}
|
|
167
|
+
return json;
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
// Where the router is mounted, under the notification API.
|
|
171
|
+
SubscriberNotificationPreview.routerPath = "/subscriber-notification-preview";
|
|
172
|
+
SubscriberNotificationPreview.previewPath = "/preview";
|
|
173
|
+
SubscriberNotificationPreview.sendTestPath = "/send-test";
|
|
174
|
+
// The longest note or description a preview takes.
|
|
175
|
+
SubscriberNotificationPreview.maxTextLength = 100000;
|
|
176
|
+
// The longest title a preview takes.
|
|
177
|
+
SubscriberNotificationPreview.maxTitleLength = 1000;
|
|
178
|
+
/*
|
|
179
|
+
* The most custom field values an incident being previewed carries, and
|
|
180
|
+
* how long they may be together, written out as JSON. Each value is
|
|
181
|
+
* rendered, Markdown included, and goes into every page's email, so
|
|
182
|
+
* without a bound one request could make the server render as much as it
|
|
183
|
+
* can be sent. A project's own fields fit many times over.
|
|
184
|
+
*/
|
|
185
|
+
SubscriberNotificationPreview.maxCustomFieldCount = 250;
|
|
186
|
+
SubscriberNotificationPreview.maxCustomFieldsLength = 200000;
|
|
187
|
+
// What a test email's subject starts with, so it reads as a test.
|
|
188
|
+
SubscriberNotificationPreview.testEmailSubjectPrefix = "[Test] ";
|
|
189
|
+
export default SubscriberNotificationPreview;
|
|
190
|
+
//# sourceMappingURL=SubscriberNotificationPreview.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SubscriberNotificationPreview.js","sourceRoot":"","sources":["../../../../Types/StatusPage/SubscriberNotificationPreview.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
import StatusPageSubscriberNotificationStatus from "./StatusPageSubscriberNotificationStatus";
|
|
2
|
+
/*
|
|
3
|
+
* Sending a status page subscriber notification again: an incident public
|
|
4
|
+
* note's, or the notification that an incident was created.
|
|
5
|
+
*
|
|
6
|
+
* A notification is sent again by putting its status back to Pending; the
|
|
7
|
+
* job that sends it picks up Pending rows. What that reaches differs:
|
|
8
|
+
*
|
|
9
|
+
* - a public note (and a state change) is sent to every status page the
|
|
10
|
+
* incident reaches now, including the pages that were sent it before;
|
|
11
|
+
* - the incident-created notification keeps a record of the pages it was
|
|
12
|
+
* sent to in full (Incident.statusPagesNotifiedOnCreation). Retry after a
|
|
13
|
+
* failure resumes after them; Resend after a success, and 'Resend to all
|
|
14
|
+
* pages' after a failure (IncidentCreatedResend), empty the record so every
|
|
15
|
+
* page is sent it again.
|
|
16
|
+
*
|
|
17
|
+
* Which of the two a settled notification offers is decided here, so the
|
|
18
|
+
* dashboard's buttons and the server's checks cannot drift apart:
|
|
19
|
+
*
|
|
20
|
+
* - Success offers Resend: it went out, and someone wants it to go out again
|
|
21
|
+
* (a list that was fixed, a page added after a scope change);
|
|
22
|
+
* - Failed offers Retry: not everyone was sent it;
|
|
23
|
+
* - Skipped offers nothing. A note posted with notify off keeps
|
|
24
|
+
* shouldStatusPageSubscribersBeNotifiedOnNoteCreated false - a column no
|
|
25
|
+
* one may update - and the job only sends notes with it true, so a skipped
|
|
26
|
+
* note put back to Pending would sit there forever. Other skips (a hidden
|
|
27
|
+
* incident, no monitors) would only be skipped again; publishing a hidden
|
|
28
|
+
* incident offers its own 'notify' checkbox (IncidentCreatedRenotify);
|
|
29
|
+
* - Pending and InProgress offer nothing: the notification is on its way.
|
|
30
|
+
*/
|
|
31
|
+
export var SubscriberNotificationResendAction;
|
|
32
|
+
(function (SubscriberNotificationResendAction) {
|
|
33
|
+
// After a failure: send it again to whoever was not sent it.
|
|
34
|
+
SubscriberNotificationResendAction["Retry"] = "Retry";
|
|
35
|
+
// After a success: send it again to everyone it reaches now.
|
|
36
|
+
SubscriberNotificationResendAction["Resend"] = "Resend";
|
|
37
|
+
})(SubscriberNotificationResendAction || (SubscriberNotificationResendAction = {}));
|
|
38
|
+
class SubscriberNotificationResend {
|
|
39
|
+
/*
|
|
40
|
+
* What a notification in `status` offers: Retry after a failure, and
|
|
41
|
+
* Resend after a success where the caller supports resending one
|
|
42
|
+
* (`isResendAfterSuccessOffered`). Null for anything else.
|
|
43
|
+
*
|
|
44
|
+
* A caller that leaves `isResendAfterSuccessOffered` off keeps the old
|
|
45
|
+
* behaviour: only a failed notification can be sent again.
|
|
46
|
+
*/
|
|
47
|
+
static getAction(data) {
|
|
48
|
+
if (data.status === StatusPageSubscriberNotificationStatus.Failed) {
|
|
49
|
+
return SubscriberNotificationResendAction.Retry;
|
|
50
|
+
}
|
|
51
|
+
if (data.status === StatusPageSubscriberNotificationStatus.Success &&
|
|
52
|
+
data.isResendAfterSuccessOffered) {
|
|
53
|
+
return SubscriberNotificationResendAction.Resend;
|
|
54
|
+
}
|
|
55
|
+
return null;
|
|
56
|
+
}
|
|
57
|
+
/*
|
|
58
|
+
* Why a public note's notification may not be put back to Pending by a
|
|
59
|
+
* user or an API key, or null when it may:
|
|
60
|
+
*
|
|
61
|
+
* - a note posted with notify off: the job never sends it (see the header),
|
|
62
|
+
* so the note would sit in Pending forever;
|
|
63
|
+
* - a notification being sent right now: the send settles its own status
|
|
64
|
+
* when it finishes and would overwrite the Pending, so the request would
|
|
65
|
+
* be lost without a word.
|
|
66
|
+
*
|
|
67
|
+
* Success and Failed are the cases the dashboard offers. Pending is
|
|
68
|
+
* allowed and changes nothing. A skipped notification of a note that does
|
|
69
|
+
* notify (the incident was hidden, or had no monitors, when it went out)
|
|
70
|
+
* is allowed too: the job looks at it afresh, so it goes out if what
|
|
71
|
+
* skipped it has changed. The dashboard does not offer that one.
|
|
72
|
+
*/
|
|
73
|
+
static getPublicNoteResendRefusal(data) {
|
|
74
|
+
if (data.shouldStatusPageSubscribersBeNotifiedOnNoteCreated === false) {
|
|
75
|
+
return this.notePostedWithoutNotifyingMessage;
|
|
76
|
+
}
|
|
77
|
+
if (data.status === StatusPageSubscriberNotificationStatus.InProgress) {
|
|
78
|
+
return this.beingSentMessage;
|
|
79
|
+
}
|
|
80
|
+
return null;
|
|
81
|
+
}
|
|
82
|
+
/*
|
|
83
|
+
* Whether an update asks for a public note's notification to be sent
|
|
84
|
+
* again: it writes Pending into the note's 'posted' status column. The
|
|
85
|
+
* workers write that column too, but as root, which is never checked.
|
|
86
|
+
*/
|
|
87
|
+
static isPublicNoteResendRequested(data) {
|
|
88
|
+
return ((data === null || data === void 0 ? void 0 : data.subscriberNotificationStatusOnNoteCreated) ===
|
|
89
|
+
StatusPageSubscriberNotificationStatus.Pending);
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
/*
|
|
93
|
+
* Why the server refuses to send a public note's notification again,
|
|
94
|
+
* shown to whoever asked.
|
|
95
|
+
*/
|
|
96
|
+
SubscriberNotificationResend.notePostedWithoutNotifyingMessage = "This note was posted without notifying subscribers, so there is nothing to resend. Post a new note with Notify Status Page Subscribers ticked to tell them.";
|
|
97
|
+
SubscriberNotificationResend.beingSentMessage = "This notification is being sent right now. Wait until it has finished, then send it again.";
|
|
98
|
+
SubscriberNotificationResend.noPermissionToResendNoteMessage = "You do not have permission to send this note's notification again. Sending it again needs the permission to post public notes that notify subscribers, as well as the permission to edit public notes.";
|
|
99
|
+
SubscriberNotificationResend.noPermissionToNotifyAboutEditMessage = "You do not have permission to notify subscribers about this edit. Notifying them needs the permission to post public notes that notify subscribers, as well as the permission to edit public notes. Save the edit without notifying subscribers, or ask someone who can post notifying notes.";
|
|
100
|
+
SubscriberNotificationResend.updateBeingSentMessage = "This note's update notification is being sent right now. Wait until it has finished, then save your edit with Notify subscribers about this update ticked again - or save it without notifying subscribers.";
|
|
101
|
+
export default SubscriberNotificationResend;
|
|
102
|
+
//# sourceMappingURL=SubscriberNotificationResend.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SubscriberNotificationResend.js","sourceRoot":"","sources":["../../../../Types/StatusPage/SubscriberNotificationResend.ts"],"names":[],"mappings":"AAAA,OAAO,sCAAsC,MAAM,0CAA0C,CAAC;AAE9F;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AACH,MAAM,CAAN,IAAY,kCAKX;AALD,WAAY,kCAAkC;IAC5C,6DAA6D;IAC7D,qDAAe,CAAA;IACf,6DAA6D;IAC7D,uDAAiB,CAAA;AACnB,CAAC,EALW,kCAAkC,KAAlC,kCAAkC,QAK7C;AAED,MAAqB,4BAA4B;IAoB/C;;;;;;;OAOG;IACI,MAAM,CAAC,SAAS,CAAC,IAGvB;QACC,IAAI,IAAI,CAAC,MAAM,KAAK,sCAAsC,CAAC,MAAM,EAAE,CAAC;YAClE,OAAO,kCAAkC,CAAC,KAAK,CAAC;QAClD,CAAC;QAED,IACE,IAAI,CAAC,MAAM,KAAK,sCAAsC,CAAC,OAAO;YAC9D,IAAI,CAAC,2BAA2B,EAChC,CAAC;YACD,OAAO,kCAAkC,CAAC,MAAM,CAAC;QACnD,CAAC;QAED,OAAO,IAAI,CAAC;IACd,CAAC;IAED;;;;;;;;;;;;;;;OAeG;IACI,MAAM,CAAC,0BAA0B,CAAC,IAMxC;QACC,IAAI,IAAI,CAAC,kDAAkD,KAAK,KAAK,EAAE,CAAC;YACtE,OAAO,IAAI,CAAC,iCAAiC,CAAC;QAChD,CAAC;QAED,IAAI,IAAI,CAAC,MAAM,KAAK,sCAAsC,CAAC,UAAU,EAAE,CAAC;YACtE,OAAO,IAAI,CAAC,gBAAgB,CAAC;QAC/B,CAAC;QAED,OAAO,IAAI,CAAC;IACd,CAAC;IAED;;;;OAIG;IACI,MAAM,CAAC,2BAA2B,CACvC,IAAyE;QAEzE,OAAO,CACL,CAAA,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,yCAAyC;YAC/C,sCAAsC,CAAC,OAAO,CAC/C,CAAC;IACJ,CAAC;;AA3FD;;;GAGG;AACoB,8DAAiC,GACtD,6JAA6J,CAAC;AAEzI,6CAAgB,GACrC,4FAA4F,CAAC;AAExE,4DAA+B,GACpD,wMAAwM,CAAC;AAEpL,iEAAoC,GACzD,+RAA+R,CAAC;AAE3Q,mDAAsB,GAC3C,6MAA6M,CAAC;eAlB7L,4BAA4B"}
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
import SafeHtml from "../SafeHtml";
|
|
2
|
+
/*
|
|
3
|
+
* What may sit between the braces of a placeholder: ASCII letters, digits,
|
|
4
|
+
* underscores and dots, and nothing else (`\w` without the `u` flag is ASCII
|
|
5
|
+
* only). Written once so that the fill below and isPlaceholderName, which
|
|
6
|
+
* the custom field template keys are generated against, cannot disagree.
|
|
7
|
+
*/
|
|
8
|
+
const PLACEHOLDER_NAME_SOURCE = "[\\w.]+";
|
|
9
|
+
const PLACEHOLDER_NAME_PATTERN = new RegExp(`^${PLACEHOLDER_NAME_SOURCE}$`);
|
|
10
|
+
export default class SubscriberNotificationTemplateCompiler {
|
|
11
|
+
/**
|
|
12
|
+
* Whether `{{name}}` is a placeholder these templates fill in. A name with
|
|
13
|
+
* any other character (a hyphen, a space, a non-ASCII letter) is left in
|
|
14
|
+
* the message as written, so anything that hands out variable names -
|
|
15
|
+
* incident custom field keys, for one - has to produce names this accepts.
|
|
16
|
+
*/
|
|
17
|
+
static isPlaceholderName(name) {
|
|
18
|
+
return PLACEHOLDER_NAME_PATTERN.test(name);
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* The names of the placeholders these templates hold, each once: exactly
|
|
22
|
+
* the ones the compile functions below would fill, spaces inside the
|
|
23
|
+
* braces allowed, so what a template reads can be known before it is
|
|
24
|
+
* saved or sent. Empty templates are skipped.
|
|
25
|
+
*/
|
|
26
|
+
static getPlaceholderNames(templates) {
|
|
27
|
+
const names = new Set();
|
|
28
|
+
for (const template of templates) {
|
|
29
|
+
if (typeof template !== "string" || !template) {
|
|
30
|
+
continue;
|
|
31
|
+
}
|
|
32
|
+
for (const match of template.matchAll(SubscriberNotificationTemplateCompiler.getPlaceholderPattern())) {
|
|
33
|
+
names.add(match[1]);
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
return names;
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Compile a template for a channel that does not render HTML: an email
|
|
40
|
+
* subject, SMS, Slack or Microsoft Teams. Each {{variableName}} is replaced
|
|
41
|
+
* with its value exactly as written.
|
|
42
|
+
*
|
|
43
|
+
* Never use this for the body of an email template: see
|
|
44
|
+
* compileEmailBodyTemplate.
|
|
45
|
+
*/
|
|
46
|
+
static compileTemplate(template, variables) {
|
|
47
|
+
return SubscriberNotificationTemplateCompiler.fillPlaceholders(template, (name) => {
|
|
48
|
+
if (!Object.prototype.hasOwnProperty.call(variables, name)) {
|
|
49
|
+
return null;
|
|
50
|
+
}
|
|
51
|
+
return variables[name] || "";
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Compile the body of an EMAIL template, which is sent as HTML.
|
|
56
|
+
*
|
|
57
|
+
* A SafeHtml value is inserted as it is. Any other value is plain text and
|
|
58
|
+
* is HTML-escaped, so it can neither add markup nor break out of the
|
|
59
|
+
* attribute it is placed in (href="{{detailsUrl}}").
|
|
60
|
+
*/
|
|
61
|
+
static compileEmailBodyTemplate(template, variables) {
|
|
62
|
+
return SubscriberNotificationTemplateCompiler.fillPlaceholders(template, (name) => {
|
|
63
|
+
if (!Object.prototype.hasOwnProperty.call(variables, name)) {
|
|
64
|
+
return null;
|
|
65
|
+
}
|
|
66
|
+
const value = variables[name];
|
|
67
|
+
if (SafeHtml.isSafeHtml(value)) {
|
|
68
|
+
return value.toHtml();
|
|
69
|
+
}
|
|
70
|
+
if (value === null || value === undefined) {
|
|
71
|
+
return "";
|
|
72
|
+
}
|
|
73
|
+
return SafeHtml.escape(String(value));
|
|
74
|
+
});
|
|
75
|
+
}
|
|
76
|
+
/*
|
|
77
|
+
* One pass over the template, with a replacer function:
|
|
78
|
+
* - A replacement string would give "$&", "$$", "$`" and "$'" special
|
|
79
|
+
* meaning, so a note mentioning "$$5" or a resource named "Store $&" was
|
|
80
|
+
* rewritten on its way to subscribers.
|
|
81
|
+
* - Replacing one variable at a time also expanded placeholders that
|
|
82
|
+
* appeared inside an earlier value, so a note containing
|
|
83
|
+
* "{{unsubscribeUrl}}" came out as a link.
|
|
84
|
+
* A placeholder with no variable is left as written.
|
|
85
|
+
*/
|
|
86
|
+
static fillPlaceholders(template, renderValue) {
|
|
87
|
+
return template.replace(SubscriberNotificationTemplateCompiler.getPlaceholderPattern(), (placeholder, name) => {
|
|
88
|
+
const rendered = renderValue(name);
|
|
89
|
+
return rendered === null ? placeholder : rendered;
|
|
90
|
+
});
|
|
91
|
+
}
|
|
92
|
+
// A fresh global pattern each time: a shared one would carry lastIndex.
|
|
93
|
+
static getPlaceholderPattern() {
|
|
94
|
+
return new RegExp(`{{\\s*(${PLACEHOLDER_NAME_SOURCE})\\s*}}`, "g");
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
//# sourceMappingURL=SubscriberNotificationTemplateCompiler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SubscriberNotificationTemplateCompiler.js","sourceRoot":"","sources":["../../../../Types/StatusPage/SubscriberNotificationTemplateCompiler.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,MAAM,aAAa,CAAC;AA6CnC;;;;;GAKG;AACH,MAAM,uBAAuB,GAAW,SAAS,CAAC;AAElD,MAAM,wBAAwB,GAAW,IAAI,MAAM,CACjD,IAAI,uBAAuB,GAAG,CAC/B,CAAC;AAEF,MAAM,CAAC,OAAO,OAAO,sCAAsC;IACzD;;;;;OAKG;IACI,MAAM,CAAC,iBAAiB,CAAC,IAAY;QAC1C,OAAO,wBAAwB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC7C,CAAC;IAED;;;;;OAKG;IACI,MAAM,CAAC,mBAAmB,CAC/B,SAA2C;QAE3C,MAAM,KAAK,GAAgB,IAAI,GAAG,EAAU,CAAC;QAE7C,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;YACjC,IAAI,OAAO,QAAQ,KAAK,QAAQ,IAAI,CAAC,QAAQ,EAAE,CAAC;gBAC9C,SAAS;YACX,CAAC;YAED,KAAK,MAAM,KAAK,IAAI,QAAQ,CAAC,QAAQ,CACnC,sCAAsC,CAAC,qBAAqB,EAAE,CAC/D,EAAE,CAAC;gBACF,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAE,CAAC,CAAC;YACvB,CAAC;QACH,CAAC;QAED,OAAO,KAAK,CAAC;IACf,CAAC;IAED;;;;;;;OAOG;IACI,MAAM,CAAC,eAAe,CAC3B,QAAgB,EAChB,SAAsD;QAEtD,OAAO,sCAAsC,CAAC,gBAAgB,CAC5D,QAAQ,EACR,CAAC,IAAY,EAAiB,EAAE;YAC9B,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,EAAE,CAAC;gBAC3D,OAAO,IAAI,CAAC;YACd,CAAC;YAED,OAAO,SAAS,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;QAC/B,CAAC,CACF,CAAC;IACJ,CAAC;IAED;;;;;;OAMG;IACI,MAAM,CAAC,wBAAwB,CACpC,QAAgB,EAChB,SAA2D;QAE3D,OAAO,sCAAsC,CAAC,gBAAgB,CAC5D,QAAQ,EACR,CAAC,IAAY,EAAiB,EAAE;YAC9B,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,EAAE,CAAC;gBAC3D,OAAO,IAAI,CAAC;YACd,CAAC;YAED,MAAM,KAAK,GAAkC,SAAS,CAAC,IAAI,CAAC,CAAC;YAE7D,IAAI,QAAQ,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC;gBAC/B,OAAO,KAAK,CAAC,MAAM,EAAE,CAAC;YACxB,CAAC;YAED,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;gBAC1C,OAAO,EAAE,CAAC;YACZ,CAAC;YAED,OAAO,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;QACxC,CAAC,CACF,CAAC;IACJ,CAAC;IAED;;;;;;;;;OASG;IACK,MAAM,CAAC,gBAAgB,CAC7B,QAAgB,EAChB,WAAgC;QAEhC,OAAO,QAAQ,CAAC,OAAO,CACrB,sCAAsC,CAAC,qBAAqB,EAAE,EAC9D,CAAC,WAAmB,EAAE,IAAY,EAAU,EAAE;YAC5C,MAAM,QAAQ,GAAkB,WAAW,CAAC,IAAI,CAAC,CAAC;YAElD,OAAO,QAAQ,KAAK,IAAI,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,QAAQ,CAAC;QACpD,CAAC,CACF,CAAC;IACJ,CAAC;IAED,wEAAwE;IAChE,MAAM,CAAC,qBAAqB;QAClC,OAAO,IAAI,MAAM,CAAC,UAAU,uBAAuB,SAAS,EAAE,GAAG,CAAC,CAAC;IACrE,CAAC;CACF"}
|
|
@@ -0,0 +1,175 @@
|
|
|
1
|
+
import SafeHtml from "../SafeHtml";
|
|
2
|
+
import StatusPageSubscriberNotificationEventType from "./StatusPageSubscriberNotificationEventType";
|
|
3
|
+
import StatusPageSubscriberNotificationMethod from "./StatusPageSubscriberNotificationMethod";
|
|
4
|
+
import SubscriberNotificationPreview from "./SubscriberNotificationPreview";
|
|
5
|
+
import SubscriberNotificationTemplateCompiler from "./SubscriberNotificationTemplateCompiler";
|
|
6
|
+
import SubscriberNotificationTemplateVariables from "./SubscriberNotificationTemplateVariables";
|
|
7
|
+
const SAMPLE_STATUS_PAGE_URL = "https://status.example.com";
|
|
8
|
+
const SAMPLE_VALUES = {
|
|
9
|
+
statusPageName: { text: "Acme Status" },
|
|
10
|
+
statusPageUrl: { text: SAMPLE_STATUS_PAGE_URL },
|
|
11
|
+
unsubscribeUrl: {
|
|
12
|
+
text: SubscriberNotificationPreview.getPreviewUnsubscribeUrl(SAMPLE_STATUS_PAGE_URL),
|
|
13
|
+
},
|
|
14
|
+
confirmationUrl: {
|
|
15
|
+
text: `${SAMPLE_STATUS_PAGE_URL}/confirm-subscription/sample`,
|
|
16
|
+
},
|
|
17
|
+
manageSubscriptionUrl: {
|
|
18
|
+
text: `${SAMPLE_STATUS_PAGE_URL}/update-subscription/sample`,
|
|
19
|
+
},
|
|
20
|
+
detailsUrl: { text: `${SAMPLE_STATUS_PAGE_URL}/incidents/sample` },
|
|
21
|
+
resourcesAffected: {
|
|
22
|
+
text: "Europe: Checkout API; Americas: Payments API",
|
|
23
|
+
html: "Europe: Checkout API<br/>Americas: Payments API",
|
|
24
|
+
},
|
|
25
|
+
incidentTitle: { text: "Checkout requests are failing" },
|
|
26
|
+
incidentDescription: {
|
|
27
|
+
text: "Customers in Europe cannot complete a checkout. We are investigating.",
|
|
28
|
+
markdown: "Customers in **Europe** cannot complete a checkout. We are investigating.",
|
|
29
|
+
html: "<p>Customers in <strong>Europe</strong> cannot complete a checkout. We are investigating.</p>",
|
|
30
|
+
},
|
|
31
|
+
incidentSeverity: { text: "Major" },
|
|
32
|
+
incidentState: { text: "Identified" },
|
|
33
|
+
incidentLabels: { text: "Europe, Payments" },
|
|
34
|
+
affectedStatusPages: { text: "Acme Status, Acme Europe Status" },
|
|
35
|
+
postedAt: { text: "Sep 27, 2026, 10:30 AM UTC" },
|
|
36
|
+
note: {
|
|
37
|
+
text: "We found the cause and are rolling out a fix. Next update in 30 minutes.",
|
|
38
|
+
markdown: "We found the cause and are rolling out a fix. **Next update in 30 minutes.**",
|
|
39
|
+
html: "<p>We found the cause and are rolling out a fix. <strong>Next update in 30 minutes.</strong></p>",
|
|
40
|
+
},
|
|
41
|
+
postmortemNote: {
|
|
42
|
+
text: "A configuration change overloaded the payment gateway. We have added a safeguard.",
|
|
43
|
+
markdown: "A configuration change overloaded the payment gateway. We have added a **safeguard**.",
|
|
44
|
+
html: "<p>A configuration change overloaded the payment gateway. We have added a <strong>safeguard</strong>.</p>",
|
|
45
|
+
},
|
|
46
|
+
announcementTitle: { text: "New status page features" },
|
|
47
|
+
announcementDescription: {
|
|
48
|
+
text: "You can now choose which services you hear about.",
|
|
49
|
+
markdown: "You can now choose **which services** you hear about.",
|
|
50
|
+
html: "<p>You can now choose <strong>which services</strong> you hear about.</p>",
|
|
51
|
+
},
|
|
52
|
+
scheduledMaintenanceTitle: { text: "Database upgrade" },
|
|
53
|
+
scheduledMaintenanceDescription: {
|
|
54
|
+
text: "Checkout may be slow for up to ten minutes.",
|
|
55
|
+
markdown: "Checkout may be slow for up to **ten minutes**.",
|
|
56
|
+
html: "<p>Checkout may be slow for up to <strong>ten minutes</strong>.</p>",
|
|
57
|
+
},
|
|
58
|
+
scheduledMaintenanceState: { text: "Scheduled" },
|
|
59
|
+
scheduledStartTime: { text: "Sep 30, 2026, 02:00 AM UTC" },
|
|
60
|
+
scheduledEndTime: { text: "Sep 30, 2026, 03:00 AM UTC" },
|
|
61
|
+
episodeTitle: { text: "Checkout degradation" },
|
|
62
|
+
episodeDescription: {
|
|
63
|
+
text: "Several incidents are affecting checkout.",
|
|
64
|
+
markdown: "Several incidents are affecting **checkout**.",
|
|
65
|
+
html: "<p>Several incidents are affecting <strong>checkout</strong>.</p>",
|
|
66
|
+
},
|
|
67
|
+
episodeSeverity: { text: "Major" },
|
|
68
|
+
episodeState: { text: "Identified" },
|
|
69
|
+
};
|
|
70
|
+
export default class SubscriberNotificationTemplatePreview {
|
|
71
|
+
static isAvailableForEventType(eventType) {
|
|
72
|
+
return (Boolean(eventType) &&
|
|
73
|
+
Object.values(StatusPageSubscriberNotificationEventType).includes(eventType) &&
|
|
74
|
+
eventType !== StatusPageSubscriberNotificationEventType.SubscriberReport);
|
|
75
|
+
}
|
|
76
|
+
/*
|
|
77
|
+
* A sample for every variable the event offers, and for each custom field
|
|
78
|
+
* placeholder these templates place ({{customFields.<key>}}), in each
|
|
79
|
+
* channel's format.
|
|
80
|
+
*/
|
|
81
|
+
static getSampleValues(data) {
|
|
82
|
+
const values = {
|
|
83
|
+
emailBody: {},
|
|
84
|
+
plainText: {},
|
|
85
|
+
markdown: {},
|
|
86
|
+
};
|
|
87
|
+
for (const variable of SubscriberNotificationTemplateVariables.getAvailableVariablesForEventType(data.eventType)) {
|
|
88
|
+
this.addSample({
|
|
89
|
+
values: values,
|
|
90
|
+
name: variable.name,
|
|
91
|
+
sample: SAMPLE_VALUES[variable.name] || {
|
|
92
|
+
text: `[${variable.name}]`,
|
|
93
|
+
},
|
|
94
|
+
isHtmlInEmailBody: this.isHtmlInEmailBody(variable),
|
|
95
|
+
});
|
|
96
|
+
}
|
|
97
|
+
for (const name of SubscriberNotificationTemplateCompiler.getPlaceholderNames(data.templates)) {
|
|
98
|
+
const dynamicVariable = SubscriberNotificationTemplateVariables.getDynamicVariableForName(data.eventType, name);
|
|
99
|
+
if (!dynamicVariable) {
|
|
100
|
+
continue;
|
|
101
|
+
}
|
|
102
|
+
this.addSample({
|
|
103
|
+
values: values,
|
|
104
|
+
name: name,
|
|
105
|
+
sample: {
|
|
106
|
+
text: `Sample ${name.slice(dynamicVariable.prefix.length)}`,
|
|
107
|
+
},
|
|
108
|
+
isHtmlInEmailBody: false,
|
|
109
|
+
});
|
|
110
|
+
}
|
|
111
|
+
return values;
|
|
112
|
+
}
|
|
113
|
+
// The template, filled with sample values as its channel would be.
|
|
114
|
+
static render(data) {
|
|
115
|
+
const isEmail = data.notificationMethod === StatusPageSubscriberNotificationMethod.Email;
|
|
116
|
+
const templateBody = data.templateBody || "";
|
|
117
|
+
const emailSubject = (isEmail && data.emailSubject) || "";
|
|
118
|
+
if (!this.isAvailableForEventType(data.eventType)) {
|
|
119
|
+
return {
|
|
120
|
+
isAvailable: false,
|
|
121
|
+
isHtml: isEmail,
|
|
122
|
+
subject: null,
|
|
123
|
+
body: "",
|
|
124
|
+
unknownPlaceholders: [],
|
|
125
|
+
};
|
|
126
|
+
}
|
|
127
|
+
const eventType = data.eventType;
|
|
128
|
+
const values = this.getSampleValues({
|
|
129
|
+
eventType: eventType,
|
|
130
|
+
templates: [templateBody, emailSubject],
|
|
131
|
+
});
|
|
132
|
+
const unknownPlaceholders = Array.from(SubscriberNotificationTemplateCompiler.getPlaceholderNames([
|
|
133
|
+
templateBody,
|
|
134
|
+
emailSubject,
|
|
135
|
+
]))
|
|
136
|
+
.filter((name) => {
|
|
137
|
+
return !SubscriberNotificationTemplateVariables.isVariableOffered(eventType, name);
|
|
138
|
+
})
|
|
139
|
+
.sort();
|
|
140
|
+
if (isEmail) {
|
|
141
|
+
return {
|
|
142
|
+
isAvailable: true,
|
|
143
|
+
isHtml: true,
|
|
144
|
+
subject: emailSubject
|
|
145
|
+
? SubscriberNotificationTemplateCompiler.compileTemplate(emailSubject, values.plainText)
|
|
146
|
+
: null,
|
|
147
|
+
body: SubscriberNotificationTemplateCompiler.compileEmailBodyTemplate(templateBody, values.emailBody),
|
|
148
|
+
unknownPlaceholders: unknownPlaceholders,
|
|
149
|
+
};
|
|
150
|
+
}
|
|
151
|
+
const isMarkdownChannel = data.notificationMethod ===
|
|
152
|
+
StatusPageSubscriberNotificationMethod.Slack ||
|
|
153
|
+
data.notificationMethod ===
|
|
154
|
+
StatusPageSubscriberNotificationMethod.MicrosoftTeams;
|
|
155
|
+
return {
|
|
156
|
+
isAvailable: true,
|
|
157
|
+
isHtml: false,
|
|
158
|
+
subject: null,
|
|
159
|
+
body: SubscriberNotificationTemplateCompiler.compileTemplate(templateBody, isMarkdownChannel ? values.markdown : values.plainText),
|
|
160
|
+
unknownPlaceholders: unknownPlaceholders,
|
|
161
|
+
};
|
|
162
|
+
}
|
|
163
|
+
static isHtmlInEmailBody(variable) {
|
|
164
|
+
return variable.isHtmlInEmailBody === true;
|
|
165
|
+
}
|
|
166
|
+
static addSample(data) {
|
|
167
|
+
data.values.plainText[data.name] = data.sample.text;
|
|
168
|
+
data.values.markdown[data.name] = data.sample.markdown || data.sample.text;
|
|
169
|
+
data.values.emailBody[data.name] =
|
|
170
|
+
data.isHtmlInEmailBody && data.sample.html
|
|
171
|
+
? SafeHtml.fromTrustedHtml(data.sample.html)
|
|
172
|
+
: data.sample.text;
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
//# sourceMappingURL=SubscriberNotificationTemplatePreview.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SubscriberNotificationTemplatePreview.js","sourceRoot":"","sources":["../../../../Types/StatusPage/SubscriberNotificationTemplatePreview.ts"],"names":[],"mappings":"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"}
|