@oneuptime/common 12.0.31 → 12.0.33
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/AnalyticsModels/Span.ts +14 -0
- package/Models/DatabaseModels/AlertState.ts +0 -2
- package/Models/DatabaseModels/Domain.ts +1 -1
- package/Models/DatabaseModels/EnterpriseLicense.ts +56 -0
- package/Models/DatabaseModels/Incident.ts +1 -1
- package/Models/DatabaseModels/IncidentTemplate.ts +1 -1
- package/Models/DatabaseModels/Index.ts +12 -0
- package/Models/DatabaseModels/MetricType.ts +0 -2
- package/Models/DatabaseModels/Monitor.ts +76 -0
- package/Models/DatabaseModels/MonitorStatusTimeline.ts +0 -2
- package/Models/DatabaseModels/MonitorTest.ts +0 -2
- package/Models/DatabaseModels/NetworkAlertPolicy.ts +690 -0
- package/Models/DatabaseModels/NetworkDevice.ts +297 -3
- package/Models/DatabaseModels/NetworkDeviceOidTemplate.ts +3 -1
- package/Models/DatabaseModels/NetworkDeviceRole.ts +648 -0
- package/Models/DatabaseModels/NetworkSite.ts +201 -2
- package/Models/DatabaseModels/NetworkSiteType.ts +102 -3
- package/Models/DatabaseModels/NetworkSnmpCredentialProfile.ts +841 -0
- package/Models/DatabaseModels/ScheduledMaintenance.ts +1 -1
- package/Models/DatabaseModels/ScheduledMaintenanceTemplate.ts +1 -1
- package/Models/DatabaseModels/StatusPageAnnouncement.ts +0 -2
- package/Models/DatabaseModels/StatusPageAnnouncementTemplate.ts +0 -2
- package/Models/DatabaseModels/StatusPagePrivateUser.ts +0 -2
- package/Models/DatabaseModels/StatusPageResource.ts +0 -2
- package/Models/DatabaseModels/StatusPageSubscriber.ts +0 -2
- package/Models/DatabaseModels/TelemetryException.ts +119 -0
- package/Models/DatabaseModels/UserNotificationEmailRollupBatch.ts +334 -0
- package/Models/DatabaseModels/UserNotificationEmailRollupItem.ts +370 -0
- package/Models/DatabaseModels/UserNotificationEmailRollupSetting.ts +282 -0
- package/Server/API/EnterpriseLicenseAPI.ts +391 -64
- package/Server/API/LlmProviderAPI.ts +137 -22
- package/Server/EnvironmentConfig.ts +14 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1790700000000-AddNetworkSiteTypeParentHierarchy.ts +55 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1790800000000-AddNetworkDeviceRoleTable.ts +72 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1790900000000-AddEnterpriseLicenseUsageProvenance.ts +31 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1790900000000-AddTelemetryExceptionErrorClass.ts +124 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1791000000000-AddUserNotificationEmailRollup.ts +132 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1791100000000-AddUserNotificationEmailRollupSetting.ts +79 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1791200000000-AddNetworkSnmpCredentialProfilesAndAlertPolicies.ts +191 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts +14 -0
- package/Server/Infrastructure/QueueWorker.ts +38 -8
- package/Server/Middleware/BearerTokenAuthorization.ts +12 -0
- package/Server/Middleware/ProjectAuthorization.ts +11 -0
- package/Server/Middleware/SCIMAuthorization.ts +12 -0
- package/Server/Middleware/TelemetryIngest.ts +11 -0
- package/Server/Services/AIBillingService.ts +101 -27
- package/Server/Services/DatabaseService.ts +39 -9
- package/Server/Services/EnterpriseLicenseInstanceService.ts +197 -0
- package/Server/Services/EnterpriseLicenseService.ts +55 -0
- package/Server/Services/Index.ts +12 -0
- package/Server/Services/MonitorService.ts +143 -21
- package/Server/Services/MonitorStatusTimelineService.ts +150 -8
- package/Server/Services/MonitorTemplateService.ts +217 -1
- package/Server/Services/NetworkAlertPolicyEngineService.ts +2159 -0
- package/Server/Services/NetworkAlertPolicyService.ts +944 -0
- package/Server/Services/NetworkDeviceAutoImportRuleEngineService.ts +9 -10
- package/Server/Services/NetworkDeviceAutoImportRuleService.ts +60 -15
- package/Server/Services/NetworkDeviceRoleService.ts +90 -0
- package/Server/Services/NetworkDeviceService.ts +1032 -73
- package/Server/Services/NetworkSiteService.ts +1502 -129
- package/Server/Services/NetworkSiteTypeService.ts +1216 -0
- package/Server/Services/NetworkSnmpCredentialProfileService.ts +238 -0
- package/Server/Services/NotificationService.ts +118 -28
- package/Server/Services/ProjectService.ts +186 -44
- package/Server/Services/StatusPagePrivateUserService.ts +103 -3
- package/Server/Services/UserNotificationEmailRollupBatchService.ts +78 -0
- package/Server/Services/UserNotificationEmailRollupItemService.ts +79 -0
- package/Server/Services/UserNotificationEmailRollupSettingService.ts +113 -0
- package/Server/Services/UserNotificationSettingService.ts +62 -31
- package/Server/Services/UserService.ts +95 -0
- package/Server/Types/Database/QueryHelper.ts +2 -2
- package/Server/Utils/AI/Chat/ObservabilityChatPrompt.ts +14 -3
- package/Server/Utils/AI/SRE/Insights/Detectors/ExceptionSpikeDetector.ts +10 -0
- package/Server/Utils/AI/SRE/Insights/Detectors/NewExceptionDetector.ts +10 -0
- package/Server/Utils/AI/SRE/Insights/InsightTriageRunner.ts +62 -1
- package/Server/Utils/AI/Toolbox/AlertTools.ts +15 -1
- package/Server/Utils/Billing/BillingFailureNoticeThrottle.ts +80 -0
- package/Server/Utils/DataSource/HttpFetch.ts +9 -2
- package/Server/Utils/EmailRollup/EmailRollupConstants.ts +98 -0
- package/Server/Utils/EmailRollup/EmailRollupFlushRunner.ts +872 -0
- package/Server/Utils/EmailRollup/EmailRollupRenderer.ts +781 -0
- package/Server/Utils/EmailRollup/EmailRollupWriter.ts +368 -0
- package/Server/Utils/LLM/LLMService.ts +78 -0
- package/Server/Utils/LogRedaction.ts +8 -0
- package/Server/Utils/Logger.ts +79 -1
- package/Server/Utils/Monitor/Criteria/DatabaseMonitorCriteria.ts +190 -0
- package/Server/Utils/Monitor/Criteria/EvaluateOverTime.ts +9 -2
- package/Server/Utils/Monitor/Criteria/SnmpMonitorCriteria.ts +61 -1
- package/Server/Utils/Monitor/MonitorCriteriaDataExtractor.ts +14 -0
- package/Server/Utils/Monitor/MonitorCriteriaEvaluator.ts +49 -0
- package/Server/Utils/Monitor/MonitorCriteriaObservationBuilder.ts +255 -4
- package/Server/Utils/Monitor/MonitorMetricUtil.ts +41 -0
- package/Server/Utils/Monitor/MonitorTemplateUtil.ts +43 -0
- package/Server/Utils/Monitor/NetworkDeviceHydrationUtil.ts +499 -19
- package/Server/Utils/Monitor/NetworkDeviceMetricUtil.ts +66 -10
- package/Server/Utils/Monitor/NetworkDeviceWalkUtil.ts +238 -44
- package/Server/Utils/Monitor/NetworkInventoryUtil.ts +146 -39
- package/Server/Utils/NetworkDevice/DeviceHealthAggregation.ts +31 -18
- package/Server/Utils/NetworkSite/NetworkSiteHierarchyLock.ts +213 -0
- package/Server/Utils/OutboundUserAgent.ts +152 -0
- package/Server/Utils/StartServer.ts +51 -19
- package/Server/Utils/Telemetry/CaptureSpan.ts +32 -8
- package/Server/Utils/Telemetry/ErrorClassResolver.ts +120 -0
- package/Server/Utils/Telemetry/SpanUtil.ts +33 -0
- package/Server/Utils/Telemetry.ts +198 -51
- package/Server/Views/Partials/SensitiveUrlToken.ejs +140 -0
- package/Tests/App/Dashboard/AddNeighborToMonitoringModal.test.tsx +158 -27
- package/Tests/App/Dashboard/AskAiSuggestedPrompts.test.ts +279 -0
- package/Tests/App/Dashboard/DashboardChartWidgetZoom.test.tsx +35 -8
- package/Tests/App/Dashboard/DashboardCommandPalette.test.tsx +107 -3
- package/Tests/App/Dashboard/DashboardEditPermissions.test.tsx +517 -0
- package/Tests/App/Dashboard/DashboardVariablesDiscard.test.tsx +26 -0
- package/Tests/App/Dashboard/DashboardWideChartZoom.test.tsx +401 -0
- package/Tests/App/Dashboard/DeviceStatusHero.test.tsx +588 -0
- package/Tests/App/Dashboard/DiscoveryScanWizardValidation.test.tsx +18 -9
- package/Tests/App/Dashboard/MonitorCreateFromMonitorBackedDevice.test.tsx +632 -0
- package/Tests/App/Dashboard/MonitorRecommendationCreateProgress.test.tsx +682 -0
- package/Tests/App/Dashboard/MonitorTemplateColumnAndFacet.test.tsx +318 -0
- package/Tests/App/Dashboard/MonitorTypePicker.test.tsx +4 -2
- package/Tests/App/Dashboard/NetworkDeviceBulkDelete.test.tsx +357 -0
- package/Tests/App/Dashboard/NetworkDeviceCreateFormMonitorBinding.test.tsx +676 -0
- package/Tests/App/Dashboard/NetworkDeviceCreateFormPingMonitor.test.tsx +791 -0
- package/Tests/App/Dashboard/NetworkDeviceCreateFormProbeAndSnmp.test.tsx +833 -0
- package/Tests/App/Dashboard/NetworkDeviceCriteriaFilter.test.ts +161 -0
- package/Tests/App/Dashboard/NetworkDeviceSettingsMonitoringSection.test.tsx +458 -0
- package/Tests/App/Dashboard/NetworkSideMenu.test.tsx +626 -0
- package/Tests/App/Dashboard/PingMonitorProvisioning.test.ts +368 -0
- package/Tests/App/Dashboard/RecommendationCard.test.tsx +796 -0
- package/Tests/App/Dashboard/RecommendationToolbar.test.tsx +519 -0
- package/Tests/App/Dashboard/RecommendationsList.test.tsx +661 -0
- package/Tests/App/Dashboard/SideMenuHarness.tsx +11 -3
- package/Tests/App/Dashboard/UseBulkCreatePingMonitors.test.tsx +899 -0
- package/Tests/App/Dashboard/UseBulkSnmpCredentialProfileActions.test.tsx +732 -0
- package/Tests/App/SensitiveUrlTokenBootstrap.test.ts +256 -0
- package/Tests/App/StatusPage/StatusPageIndexPageRobotsMeta.test.ts +11 -1
- package/Tests/App/StatusPage/StatusPageLoginCodeBootstrap.test.ts +9 -4
- package/Tests/Models/DatabaseModels/ModelRegistryInvariants.test.ts +115 -41
- package/Tests/Models/NetworkSiteHierarchy.test.ts +41 -4
- package/Tests/Server/API/EnterpriseLicenseReportUserCount.test.ts +951 -7
- package/Tests/Server/API/LlmProviderConnectionTest.test.ts +522 -0
- package/Tests/Server/Infrastructure/Postgres/NetworkDeviceRoleTableMigration.test.ts +476 -0
- package/Tests/Server/Infrastructure/Postgres/NetworkSnmpCredentialProfilesAndAlertPoliciesMigration.test.ts +854 -0
- package/Tests/Server/Infrastructure/Postgres/SchemaMigrationsOrdering.test.ts +18 -0
- package/Tests/Server/Infrastructure/Postgres/UserNotificationEmailRollupTableMigration.test.ts +535 -0
- package/Tests/Server/Services/AIChatPrivacyPin.test.ts +560 -0
- package/Tests/Server/Services/BillingRechargeOwnerEmailGuards.test.ts +783 -0
- package/Tests/Server/Services/DatabaseServiceGenerateSlug.test.ts +215 -0
- package/Tests/Server/Services/EnterpriseLicenseInstanceServiceDeletionUsage.test.ts +707 -0
- package/Tests/Server/Services/EnterpriseLicenseServiceUsageAggregationLock.test.ts +329 -0
- package/Tests/Server/Services/MonitorServiceDeleteNetworkDeviceCleanup.test.ts +294 -0
- package/Tests/Server/Services/MonitorStatusBridgeProbePath.test.ts +802 -0
- package/Tests/Server/Services/MonitorStatusTimelineService.test.ts +72 -2
- package/Tests/Server/Services/NetworkAlertPolicyEngineHooks.test.ts +752 -0
- package/Tests/Server/Services/NetworkAlertPolicyEngineService.test.ts +1849 -0
- package/Tests/Server/Services/NetworkAlertPolicyModel.test.ts +1793 -0
- package/Tests/Server/Services/NetworkDeviceAutoImportRuleEngineService.test.ts +47 -4
- package/Tests/Server/Services/NetworkDeviceAutoImportRuleService.test.ts +97 -12
- package/Tests/Server/Services/NetworkDeviceAutoMonitorLifecycle.test.ts +148 -3
- package/Tests/Server/Services/NetworkDeviceMonitorBindingUpdateGuard.test.ts +514 -0
- package/Tests/Server/Services/NetworkDeviceMonitorStatusStamp.test.ts +447 -58
- package/Tests/Server/Services/NetworkDeviceMonitoringMethodTransition.test.ts +739 -0
- package/Tests/Server/Services/NetworkDevicePollingTenancy.test.ts +501 -0
- package/Tests/Server/Services/NetworkDeviceRoleModel.test.ts +672 -0
- package/Tests/Server/Services/NetworkDeviceRuleEngines.test.ts +1 -1
- package/Tests/Server/Services/NetworkDeviceSiteDefaultProbe.test.ts +432 -0
- package/Tests/Server/Services/NetworkSiteMonitoringDefaults.test.ts +498 -0
- package/Tests/Server/Services/NetworkSiteRollupPolicyAndMaintenance.test.ts +337 -55
- package/Tests/Server/Services/NetworkSiteService.test.ts +1868 -131
- package/Tests/Server/Services/NetworkSiteTypeService.test.ts +1109 -0
- package/Tests/Server/Services/NetworkSnmpCredentialProfileModel.test.ts +926 -0
- package/Tests/Server/Services/NetworkSnmpCredentialProfileService.test.ts +796 -0
- package/Tests/Server/Services/ProjectServiceCreateSubscriptionStarted.test.ts +67 -4
- package/Tests/Server/Services/ProjectServiceNetworkSiteTypeDefaults.test.ts +214 -0
- package/Tests/Server/Services/ScheduledMaintenanceSubscriberEndTime.test.ts +369 -0
- package/Tests/Server/Services/StatusPagePrivateUserEmailChangePasswordResetExpiry.test.ts +269 -0
- package/Tests/Server/Services/UserEmailChangePasswordResetExpiry.test.ts +472 -0
- package/Tests/Server/Services/UserNotificationEmailRollupModels.test.ts +569 -0
- package/Tests/Server/Services/UserNotificationEmailRollupSettingModel.test.ts +314 -0
- package/Tests/Server/Services/UserNotificationEmailRollupSettingService.test.ts +409 -0
- package/Tests/Server/Services/UserNotificationSettingMonitorDefaults.test.ts +248 -0
- package/Tests/Server/Services/UserNotificationSettingRollupRouting.test.ts +856 -0
- package/Tests/Server/Services/UserNotificationSettingWorkspaceChannels.test.ts +145 -3
- package/Tests/Server/Types/Database/Permissions/DashboardAccessPermission.test.ts +321 -0
- package/Tests/Server/Types/Database/QueryHelperOperators.test.ts +17 -0
- package/Tests/Server/Utils/AI/AlertMonitorFilters.test.ts +124 -0
- package/Tests/Server/Utils/AI/Insights/InsightTriageRunner.test.ts +208 -0
- package/Tests/Server/Utils/AI/LLMServiceToolCalling.test.ts +235 -0
- package/Tests/Server/Utils/AI/ObservabilityChatPrompt.test.ts +253 -0
- package/Tests/Server/Utils/BasicCron.test.ts +283 -0
- package/Tests/Server/Utils/Captcha.test.ts +422 -0
- package/Tests/Server/Utils/DataSource/HttpFetch.test.ts +96 -2
- package/Tests/Server/Utils/Database/MigrationFailureLog.test.ts +466 -0
- package/Tests/Server/Utils/EmailRollup/EmailRollupFlushRunnerBehaviour.test.ts +1096 -0
- package/Tests/Server/Utils/EmailRollup/EmailRollupFlushRunnerClaim.test.ts +466 -0
- package/Tests/Server/Utils/EmailRollup/EmailRollupRenderer.test.ts +1428 -0
- package/Tests/Server/Utils/EmailRollup/EmailRollupTestHarness.ts +752 -0
- package/Tests/Server/Utils/EmailRollup/EmailRollupWriter.test.ts +864 -0
- package/Tests/Server/Utils/IncomingCallPhoneNumber.test.ts +174 -0
- package/Tests/Server/Utils/LoggerFaultDemotion.test.ts +346 -0
- package/Tests/Server/Utils/Monitor/Criteria/DatabaseMonitorCriteria.test.ts +633 -0
- package/Tests/Server/Utils/Monitor/Criteria/SnmpMonitorCriteria.test.ts +196 -0
- package/Tests/Server/Utils/Monitor/DatabaseMetricWrite.test.ts +367 -0
- package/Tests/Server/Utils/Monitor/MonitorCriteriaObservationBuilderUnits.test.ts +100 -0
- package/Tests/Server/Utils/Monitor/MonitorStepResourceIdentity.test.ts +5 -0
- package/Tests/Server/Utils/Monitor/NetworkDeviceHydrationUtil.test.ts +512 -31
- package/Tests/Server/Utils/Monitor/NetworkDeviceMetricUtil.test.ts +252 -0
- package/Tests/Server/Utils/Monitor/NetworkDeviceWalkUtil.test.ts +479 -42
- package/Tests/Server/Utils/Monitor/NetworkInventoryUtil.test.ts +351 -5
- package/Tests/Server/Utils/NetworkDevice/DeviceHealthAggregation.test.ts +136 -12
- package/Tests/Server/Utils/NetworkSite/NetworkSiteHierarchyLock.test.ts +306 -0
- package/Tests/Server/Utils/OutboundUserAgent.test.ts +266 -0
- package/Tests/Server/Utils/SecurityEvent/ThreatIntel/TaxiiClientUserAgent.test.ts +141 -0
- package/Tests/Server/Utils/Telemetry/ErrorClassResolver.test.ts +298 -0
- package/Tests/Server/Utils/Telemetry.test.ts +456 -66
- package/Tests/Types/Monitor/DatabaseMetricCatalog.test.ts +388 -0
- package/Tests/Types/Monitor/MonitorStepDatabaseMonitor.test.ts +243 -0
- package/Tests/Types/Monitor/MonitorStepDefaultTelemetryConfig.test.ts +1 -0
- package/Tests/Types/Monitor/MonitorType.test.ts +1 -0
- package/Tests/Types/Monitor/MonitorTypeKeywords.test.ts +16 -7
- package/Tests/Types/Monitor/NetworkDeviceAlertPack.test.ts +60 -0
- package/Tests/Types/NetworkDevice/DefaultNetworkDeviceRole.test.ts +417 -0
- package/Tests/Types/NetworkDevice/NetworkAlertPolicyScope.test.ts +655 -0
- package/Tests/Types/NetworkDevice/NetworkDeviceMonitoringMethod.test.ts +115 -26
- package/Tests/Types/NetworkSite/DefaultNetworkSiteType.test.ts +39 -0
- package/Tests/Types/NotificationSetting/NotificationEmailRollupPolicy.test.ts +299 -0
- package/Tests/Types/Telemetry/ErrorClass.test.ts +483 -0
- package/Tests/UI/Components/BasicRadioButtons.test.tsx +336 -0
- package/Tests/UI/Components/Charts/ChartClickDoubleClickDisambiguation.test.tsx +221 -0
- package/Tests/UI/Components/Charts/ChartDoubleClickReset.test.tsx +220 -0
- package/Tests/UI/Components/ModelTable/BaseModelTableBulkDelete.test.tsx +751 -0
- package/Tests/UI/Components/ModelTable/BaseModelTableColumnCustomization.test.tsx +475 -43
- package/Tests/UI/Components/ModelTable/ColumnPreference.test.ts +89 -0
- package/Tests/UI/Components/MonitorTemplateVariables/TemplateVariablesCatalog.test.ts +15 -0
- package/Tests/UI/Components/NavBarCommandKGating.test.tsx +103 -8
- package/Tests/UI/Components/ProgressBar.test.tsx +38 -2
- package/Tests/UI/Components/SideMenuItem.test.tsx +256 -4
- package/Tests/UI/Components/SideMenuSection.test.tsx +310 -0
- package/Tests/UI/Components/SideOverSubmitState.test.tsx +335 -0
- package/Tests/UI/Utils/PageScrollLock.test.tsx +377 -0
- package/Tests/UI/Utils/PermissionGate.test.ts +78 -0
- package/Tests/UI/Utils/SensitiveUrlToken.test.ts +140 -0
- package/Tests/UI/Utils/TableColumnsToCsv.test.ts +30 -0
- package/Tests/UI/Utils/UseDashboardTimeRangeZoom.test.tsx +187 -0
- package/Tests/Utils/Dashboard/DashboardResourceListSharedArgs.test.ts +302 -0
- package/Tests/Utils/Dashboard/DashboardTimeRangeZoom.test.ts +242 -0
- package/Tests/Utils/EnterpriseLicenseSeats.test.ts +69 -0
- package/Tests/Utils/EnterpriseLicenseSync.test.ts +7 -1
- package/Tests/Utils/EnterpriseLicenseUsage.test.ts +433 -2
- package/Tests/Utils/Monitor/MonitorMetricType.test.ts +280 -1
- package/Tests/Utils/Monitor/MonitorSummarySnapshotUtil.test.ts +1 -0
- package/Tests/Utils/Monitor/NetworkDeviceRoleCatalog.test.ts +981 -0
- package/Tests/Utils/Monitor/NetworkTopologyRoleCatalog.test.ts +865 -0
- package/Tests/Utils/Monitor/NetworkTopologyUtil.test.ts +38 -0
- package/Tests/Utils/NetworkDevice/DeviceHealthStateUtil.test.ts +284 -23
- package/Tests/Utils/NetworkDevice/DeviceReachabilityUtil.test.ts +177 -0
- package/Tests/Utils/NetworkDevice/DeviceRoleKeyUtil.test.ts +538 -0
- package/Tests/Utils/NetworkDevice/MonitoringMethodThreadedClassifiers.test.ts +992 -0
- package/Tests/Utils/NetworkDevice/NetworkAlertPolicyBootstrapUtil.test.ts +427 -0
- package/Tests/Utils/NetworkDevice/ReachabilityStampConsistency.test.ts +185 -0
- package/Tests/Utils/NetworkDevice/SnmpCredentialUtil.test.ts +268 -0
- package/Tests/Utils/NetworkDiscovery/AutoImportRuleMatcher.test.ts +55 -5
- package/Tests/Utils/NetworkDiscovery/DiscoveredDeviceBuilder.test.ts +98 -21
- package/Tests/Utils/NetworkDiscovery/DiscoveryImportEligibility.test.ts +98 -20
- package/Tests/Utils/NetworkDiscovery/DiscoveryReverseDnsChain.test.ts +8 -7
- package/Tests/Utils/NetworkDiscovery/PingMonitorBuilderForAddress.test.ts +274 -0
- package/Tests/Utils/NetworkSite/SiteStatusRollupUtil.test.ts +230 -51
- package/Tests/Utils/NetworkSite/TypeHierarchyUtil.test.ts +209 -0
- package/Tests/Utils/Slo/SloEvaluation.test.ts +171 -0
- package/Tests/Utils/Slug.test.ts +61 -1
- package/Tests/Utils/Telemetry/CaptureSpanExportGating.test.ts +145 -0
- package/Tests/jest.setup.ts +19 -0
- package/Types/AI/ExceptionAIClassification.ts +10 -24
- package/Types/Email/EmailTemplateType.ts +2 -0
- package/Types/EnterpriseLicense/EnterpriseLicenseInstanceSummary.ts +5 -0
- package/Types/EnterpriseLicense/EnterpriseLicenseUsageSnapshot.ts +13 -0
- package/Types/EnterpriseLicense/EnterpriseLicenseUserCountSource.ts +6 -0
- package/Types/Exception/ApiException.ts +10 -0
- package/Types/Exception/BadDataException.ts +11 -0
- package/Types/Exception/BadRequestException.ts +11 -0
- package/Types/Exception/Exception.ts +65 -0
- package/Types/Exception/ForbiddenException.ts +10 -0
- package/Types/Exception/NotAuthenticatedException.ts +10 -0
- package/Types/Exception/NotAuthorizedException.ts +10 -0
- package/Types/Exception/NotFoundException.ts +11 -0
- package/Types/Exception/PayloadTooLargeException.ts +11 -0
- package/Types/Exception/PaymentRequiredException.ts +10 -0
- package/Types/Exception/ServiceUnavailableException.ts +10 -0
- package/Types/Exception/SsoAuthorizationException.ts +10 -0
- package/Types/Exception/TenantNotFoundException.ts +11 -0
- package/Types/Exception/TimeoutException.ts +10 -0
- package/Types/Exception/TooManyRequestsException.ts +10 -0
- package/Types/Exception/UnableToReachServer.ts +10 -0
- package/Types/Exception/WebsiteRequestException.ts +10 -0
- package/Types/Monitor/CriteriaFilter.ts +60 -2
- package/Types/Monitor/DatabaseMetricCatalog.ts +693 -0
- package/Types/Monitor/DatabaseMonitor/DatabaseMonitorResponse.ts +83 -0
- package/Types/Monitor/MonitorCriteriaInstance.ts +76 -0
- package/Types/Monitor/MonitorMetricType.ts +71 -0
- package/Types/Monitor/MonitorStep.ts +76 -0
- package/Types/Monitor/MonitorStepDatabaseMonitor.ts +171 -0
- package/Types/Monitor/MonitorStepSqlMonitor.ts +2 -20
- package/Types/Monitor/MonitorType.ts +47 -1
- package/Types/Monitor/SnmpMonitor/NetworkDeviceAlertPack.ts +22 -1
- package/Types/Monitor/SnmpMonitor/NetworkTopology.ts +61 -0
- package/Types/Monitor/SqlConnectionConfig.ts +31 -0
- package/Types/NetworkDevice/DefaultNetworkDeviceRole.ts +145 -0
- package/Types/NetworkDevice/NetworkAlertPolicyScope.ts +343 -0
- package/Types/NetworkDevice/NetworkDeviceMonitoringMethod.ts +42 -22
- package/Types/NetworkSite/DefaultNetworkSiteTypeHierarchy.ts +30 -0
- package/Types/NotificationSetting/NotificationEmailRollupCategory.ts +255 -0
- package/Types/NotificationSetting/NotificationEmailRollupPolicy.ts +104 -0
- package/Types/Permission.ts +135 -0
- package/Types/Probe/ProbeMonitorResponse.ts +16 -0
- package/Types/Telemetry/ErrorClass.ts +274 -0
- package/Types/Telemetry/UnitOfWork.ts +59 -0
- package/UI/Components/Charts/Area/AreaChart.tsx +7 -0
- package/UI/Components/Charts/Bar/BarChart.tsx +6 -0
- package/UI/Components/Charts/ChartGroup/ChartGroup.tsx +9 -1
- package/UI/Components/Charts/ChartLibrary/AreaChart/AreaChart.tsx +97 -35
- package/UI/Components/Charts/ChartLibrary/BarChart/BarChart.tsx +14 -0
- package/UI/Components/Charts/ChartLibrary/LineChart/LineChart.tsx +97 -35
- package/UI/Components/Charts/ChartLibrary/Utils/DoubleClick.ts +13 -0
- package/UI/Components/Charts/Line/LineChart.tsx +7 -0
- package/UI/Components/CommandPalette/CommandPalette.tsx +2 -8
- package/UI/Components/EditionLabel/EditionLabel.tsx +4 -0
- package/UI/Components/Modal/Modal.tsx +2 -8
- package/UI/Components/ModelTable/BaseModelTable.tsx +50 -15
- package/UI/Components/MonitorTemplateVariables/TemplateVariablesCatalog.ts +44 -0
- package/UI/Components/Navbar/NavBar.tsx +62 -13
- package/UI/Components/Navbar/NavBarMenuModal.tsx +7 -2
- package/UI/Components/ProgressBar/ProgressBar.tsx +12 -1
- package/UI/Components/RadioButtons/BasicRadioButtons.tsx +37 -7
- package/UI/Components/SideMenu/CountModelSideMenuItem.tsx +2 -0
- package/UI/Components/SideMenu/SideMenu.tsx +135 -7
- package/UI/Components/SideMenu/SideMenuItem.tsx +80 -85
- package/UI/Components/SideMenu/SideMenuSection.tsx +69 -25
- package/UI/Components/SideOver/SideOver.tsx +21 -20
- package/UI/Utils/PageScrollLock.ts +79 -3
- package/UI/Utils/PermissionGate.ts +61 -0
- package/UI/Utils/SensitiveUrlToken.ts +112 -0
- package/UI/Utils/TestLLMProvider.ts +11 -0
- package/UI/Utils/UseDashboardTimeRangeZoom.ts +77 -0
- package/Utils/Dashboard/DashboardTimeRangeZoom.ts +118 -0
- package/Utils/EnterpriseLicense/EnterpriseLicenseSeats.ts +16 -0
- package/Utils/EnterpriseLicense/EnterpriseLicenseUsage.ts +191 -11
- package/Utils/Monitor/MonitorMetricType.ts +153 -1
- package/Utils/Monitor/NetworkDeviceRoleCatalog.ts +232 -0
- package/Utils/Monitor/NetworkDeviceRoleUtil.ts +2 -1
- package/Utils/Monitor/NetworkTopologyUtil.ts +139 -36
- package/Utils/NetworkDevice/DeviceHealthStateUtil.ts +65 -14
- package/Utils/NetworkDevice/DeviceReachabilityUtil.ts +43 -14
- package/Utils/NetworkDevice/DeviceRoleKeyUtil.ts +137 -0
- package/Utils/NetworkDevice/NetworkAlertPolicyBootstrapUtil.ts +247 -0
- package/Utils/NetworkDevice/SnmpCredentialUtil.ts +68 -0
- package/Utils/NetworkDiscovery/AutoImportRuleMatcher.ts +15 -7
- package/Utils/NetworkDiscovery/DiscoveredDeviceBuilder.ts +52 -17
- package/Utils/NetworkDiscovery/DiscoveryImportEligibility.ts +55 -23
- package/Utils/NetworkDiscovery/PingMonitorBuilder.ts +115 -13
- package/Utils/NetworkSite/SiteStatusRollupUtil.ts +66 -20
- package/Utils/NetworkSite/TypeHierarchyUtil.ts +313 -0
- package/Utils/Rules/RulePatternMatchUtil.ts +1 -1
- package/Utils/Slug.ts +34 -1
- package/build/dist/Models/AnalyticsModels/Span.js +14 -0
- package/build/dist/Models/AnalyticsModels/Span.js.map +1 -1
- package/build/dist/Models/DatabaseModels/AlertState.js +0 -2
- package/build/dist/Models/DatabaseModels/AlertState.js.map +1 -1
- package/build/dist/Models/DatabaseModels/Domain.js +1 -1
- package/build/dist/Models/DatabaseModels/Domain.js.map +1 -1
- package/build/dist/Models/DatabaseModels/EnterpriseLicense.js +59 -0
- package/build/dist/Models/DatabaseModels/EnterpriseLicense.js.map +1 -1
- package/build/dist/Models/DatabaseModels/Incident.js +1 -1
- package/build/dist/Models/DatabaseModels/Incident.js.map +1 -1
- package/build/dist/Models/DatabaseModels/IncidentTemplate.js +1 -1
- package/build/dist/Models/DatabaseModels/IncidentTemplate.js.map +1 -1
- package/build/dist/Models/DatabaseModels/Index.js +12 -0
- package/build/dist/Models/DatabaseModels/Index.js.map +1 -1
- package/build/dist/Models/DatabaseModels/MetricType.js +0 -2
- package/build/dist/Models/DatabaseModels/MetricType.js.map +1 -1
- package/build/dist/Models/DatabaseModels/Monitor.js +75 -0
- package/build/dist/Models/DatabaseModels/Monitor.js.map +1 -1
- package/build/dist/Models/DatabaseModels/MonitorStatusTimeline.js +0 -2
- package/build/dist/Models/DatabaseModels/MonitorStatusTimeline.js.map +1 -1
- package/build/dist/Models/DatabaseModels/MonitorTest.js +0 -2
- package/build/dist/Models/DatabaseModels/MonitorTest.js.map +1 -1
- package/build/dist/Models/DatabaseModels/NetworkAlertPolicy.js +713 -0
- package/build/dist/Models/DatabaseModels/NetworkAlertPolicy.js.map +1 -0
- package/build/dist/Models/DatabaseModels/NetworkDevice.js +304 -4
- package/build/dist/Models/DatabaseModels/NetworkDevice.js.map +1 -1
- package/build/dist/Models/DatabaseModels/NetworkDeviceOidTemplate.js +3 -1
- package/build/dist/Models/DatabaseModels/NetworkDeviceOidTemplate.js.map +1 -1
- package/build/dist/Models/DatabaseModels/NetworkDeviceRole.js +677 -0
- package/build/dist/Models/DatabaseModels/NetworkDeviceRole.js.map +1 -0
- package/build/dist/Models/DatabaseModels/NetworkSite.js +200 -2
- package/build/dist/Models/DatabaseModels/NetworkSite.js.map +1 -1
- package/build/dist/Models/DatabaseModels/NetworkSiteType.js +102 -3
- package/build/dist/Models/DatabaseModels/NetworkSiteType.js.map +1 -1
- package/build/dist/Models/DatabaseModels/NetworkSnmpCredentialProfile.js +878 -0
- package/build/dist/Models/DatabaseModels/NetworkSnmpCredentialProfile.js.map +1 -0
- package/build/dist/Models/DatabaseModels/ScheduledMaintenance.js +1 -1
- package/build/dist/Models/DatabaseModels/ScheduledMaintenance.js.map +1 -1
- package/build/dist/Models/DatabaseModels/ScheduledMaintenanceTemplate.js +1 -1
- package/build/dist/Models/DatabaseModels/ScheduledMaintenanceTemplate.js.map +1 -1
- package/build/dist/Models/DatabaseModels/StatusPageAnnouncement.js +0 -2
- package/build/dist/Models/DatabaseModels/StatusPageAnnouncement.js.map +1 -1
- package/build/dist/Models/DatabaseModels/StatusPageAnnouncementTemplate.js +0 -2
- package/build/dist/Models/DatabaseModels/StatusPageAnnouncementTemplate.js.map +1 -1
- package/build/dist/Models/DatabaseModels/StatusPagePrivateUser.js +0 -2
- package/build/dist/Models/DatabaseModels/StatusPagePrivateUser.js.map +1 -1
- package/build/dist/Models/DatabaseModels/StatusPageResource.js +0 -2
- package/build/dist/Models/DatabaseModels/StatusPageResource.js.map +1 -1
- package/build/dist/Models/DatabaseModels/StatusPageSubscriber.js +0 -2
- package/build/dist/Models/DatabaseModels/StatusPageSubscriber.js.map +1 -1
- package/build/dist/Models/DatabaseModels/TelemetryException.js +123 -0
- package/build/dist/Models/DatabaseModels/TelemetryException.js.map +1 -1
- package/build/dist/Models/DatabaseModels/UserNotificationEmailRollupBatch.js +363 -0
- package/build/dist/Models/DatabaseModels/UserNotificationEmailRollupBatch.js.map +1 -0
- package/build/dist/Models/DatabaseModels/UserNotificationEmailRollupItem.js +402 -0
- package/build/dist/Models/DatabaseModels/UserNotificationEmailRollupItem.js.map +1 -0
- package/build/dist/Models/DatabaseModels/UserNotificationEmailRollupSetting.js +296 -0
- package/build/dist/Models/DatabaseModels/UserNotificationEmailRollupSetting.js.map +1 -0
- package/build/dist/Server/API/EnterpriseLicenseAPI.js +273 -60
- package/build/dist/Server/API/EnterpriseLicenseAPI.js.map +1 -1
- package/build/dist/Server/API/LlmProviderAPI.js +108 -13
- package/build/dist/Server/API/LlmProviderAPI.js.map +1 -1
- package/build/dist/Server/EnvironmentConfig.js +12 -0
- package/build/dist/Server/EnvironmentConfig.js.map +1 -1
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1790700000000-AddNetworkSiteTypeParentHierarchy.js +24 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1790700000000-AddNetworkSiteTypeParentHierarchy.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1790800000000-AddNetworkDeviceRoleTable.js +39 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1790800000000-AddNetworkDeviceRoleTable.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1790900000000-AddEnterpriseLicenseUsageProvenance.js +16 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1790900000000-AddEnterpriseLicenseUsageProvenance.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1790900000000-AddTelemetryExceptionErrorClass.js +111 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1790900000000-AddTelemetryExceptionErrorClass.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1791000000000-AddUserNotificationEmailRollup.js +77 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1791000000000-AddUserNotificationEmailRollup.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1791100000000-AddUserNotificationEmailRollupSetting.js +50 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1791100000000-AddUserNotificationEmailRollupSetting.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1791200000000-AddNetworkSnmpCredentialProfilesAndAlertPolicies.js +83 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1791200000000-AddNetworkSnmpCredentialProfilesAndAlertPolicies.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js +14 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js.map +1 -1
- package/build/dist/Server/Infrastructure/QueueWorker.js +33 -5
- package/build/dist/Server/Infrastructure/QueueWorker.js.map +1 -1
- package/build/dist/Server/Middleware/BearerTokenAuthorization.js +12 -0
- package/build/dist/Server/Middleware/BearerTokenAuthorization.js.map +1 -1
- package/build/dist/Server/Middleware/ProjectAuthorization.js +11 -0
- package/build/dist/Server/Middleware/ProjectAuthorization.js.map +1 -1
- package/build/dist/Server/Middleware/SCIMAuthorization.js +12 -0
- package/build/dist/Server/Middleware/SCIMAuthorization.js.map +1 -1
- package/build/dist/Server/Middleware/TelemetryIngest.js +11 -0
- package/build/dist/Server/Middleware/TelemetryIngest.js.map +1 -1
- package/build/dist/Server/Services/AIBillingService.js +70 -16
- package/build/dist/Server/Services/AIBillingService.js.map +1 -1
- package/build/dist/Server/Services/DatabaseService.js +31 -5
- package/build/dist/Server/Services/DatabaseService.js.map +1 -1
- package/build/dist/Server/Services/EnterpriseLicenseInstanceService.js +167 -0
- package/build/dist/Server/Services/EnterpriseLicenseInstanceService.js.map +1 -1
- package/build/dist/Server/Services/EnterpriseLicenseService.js +39 -0
- package/build/dist/Server/Services/EnterpriseLicenseService.js.map +1 -1
- package/build/dist/Server/Services/Index.js +12 -0
- package/build/dist/Server/Services/Index.js.map +1 -1
- package/build/dist/Server/Services/MonitorService.js +119 -21
- package/build/dist/Server/Services/MonitorService.js.map +1 -1
- package/build/dist/Server/Services/MonitorStatusTimelineService.js +127 -8
- package/build/dist/Server/Services/MonitorStatusTimelineService.js.map +1 -1
- package/build/dist/Server/Services/MonitorTemplateService.js +162 -0
- package/build/dist/Server/Services/MonitorTemplateService.js.map +1 -1
- package/build/dist/Server/Services/NetworkAlertPolicyEngineService.js +1683 -0
- package/build/dist/Server/Services/NetworkAlertPolicyEngineService.js.map +1 -0
- package/build/dist/Server/Services/NetworkAlertPolicyService.js +732 -0
- package/build/dist/Server/Services/NetworkAlertPolicyService.js.map +1 -0
- package/build/dist/Server/Services/NetworkDeviceAutoImportRuleEngineService.js +10 -9
- package/build/dist/Server/Services/NetworkDeviceAutoImportRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/NetworkDeviceAutoImportRuleService.js +54 -11
- package/build/dist/Server/Services/NetworkDeviceAutoImportRuleService.js.map +1 -1
- package/build/dist/Server/Services/NetworkDeviceRoleService.js +70 -0
- package/build/dist/Server/Services/NetworkDeviceRoleService.js.map +1 -0
- package/build/dist/Server/Services/NetworkDeviceService.js +841 -70
- package/build/dist/Server/Services/NetworkDeviceService.js.map +1 -1
- package/build/dist/Server/Services/NetworkSiteService.js +1145 -107
- package/build/dist/Server/Services/NetworkSiteService.js.map +1 -1
- package/build/dist/Server/Services/NetworkSiteTypeService.js +863 -0
- package/build/dist/Server/Services/NetworkSiteTypeService.js.map +1 -1
- package/build/dist/Server/Services/NetworkSnmpCredentialProfileService.js +217 -0
- package/build/dist/Server/Services/NetworkSnmpCredentialProfileService.js.map +1 -0
- package/build/dist/Server/Services/NotificationService.js +80 -17
- package/build/dist/Server/Services/NotificationService.js.map +1 -1
- package/build/dist/Server/Services/ProjectService.js +131 -30
- package/build/dist/Server/Services/ProjectService.js.map +1 -1
- package/build/dist/Server/Services/StatusPagePrivateUserService.js +92 -2
- package/build/dist/Server/Services/StatusPagePrivateUserService.js.map +1 -1
- package/build/dist/Server/Services/UserNotificationEmailRollupBatchService.js +76 -0
- package/build/dist/Server/Services/UserNotificationEmailRollupBatchService.js.map +1 -0
- package/build/dist/Server/Services/UserNotificationEmailRollupItemService.js +77 -0
- package/build/dist/Server/Services/UserNotificationEmailRollupItemService.js.map +1 -0
- package/build/dist/Server/Services/UserNotificationEmailRollupSettingService.js +111 -0
- package/build/dist/Server/Services/UserNotificationEmailRollupSettingService.js.map +1 -0
- package/build/dist/Server/Services/UserNotificationSettingService.js +46 -21
- package/build/dist/Server/Services/UserNotificationSettingService.js.map +1 -1
- package/build/dist/Server/Services/UserService.js +90 -0
- package/build/dist/Server/Services/UserService.js.map +1 -1
- package/build/dist/Server/Types/Database/QueryHelper.js +1 -1
- package/build/dist/Server/Types/Database/QueryHelper.js.map +1 -1
- package/build/dist/Server/Utils/AI/Chat/ObservabilityChatPrompt.js +14 -3
- package/build/dist/Server/Utils/AI/Chat/ObservabilityChatPrompt.js.map +1 -1
- package/build/dist/Server/Utils/AI/SRE/Insights/Detectors/ExceptionSpikeDetector.js +10 -0
- package/build/dist/Server/Utils/AI/SRE/Insights/Detectors/ExceptionSpikeDetector.js.map +1 -1
- package/build/dist/Server/Utils/AI/SRE/Insights/Detectors/NewExceptionDetector.js +10 -0
- package/build/dist/Server/Utils/AI/SRE/Insights/Detectors/NewExceptionDetector.js.map +1 -1
- package/build/dist/Server/Utils/AI/SRE/Insights/InsightTriageRunner.js +54 -1
- package/build/dist/Server/Utils/AI/SRE/Insights/InsightTriageRunner.js.map +1 -1
- package/build/dist/Server/Utils/AI/Toolbox/AlertTools.js +18 -4
- package/build/dist/Server/Utils/AI/Toolbox/AlertTools.js.map +1 -1
- package/build/dist/Server/Utils/Billing/BillingFailureNoticeThrottle.js +59 -0
- package/build/dist/Server/Utils/Billing/BillingFailureNoticeThrottle.js.map +1 -0
- package/build/dist/Server/Utils/DataSource/HttpFetch.js +2 -1
- package/build/dist/Server/Utils/DataSource/HttpFetch.js.map +1 -1
- package/build/dist/Server/Utils/EmailRollup/EmailRollupConstants.js +91 -0
- package/build/dist/Server/Utils/EmailRollup/EmailRollupConstants.js.map +1 -0
- package/build/dist/Server/Utils/EmailRollup/EmailRollupFlushRunner.js +691 -0
- package/build/dist/Server/Utils/EmailRollup/EmailRollupFlushRunner.js.map +1 -0
- package/build/dist/Server/Utils/EmailRollup/EmailRollupRenderer.js +497 -0
- package/build/dist/Server/Utils/EmailRollup/EmailRollupRenderer.js.map +1 -0
- package/build/dist/Server/Utils/EmailRollup/EmailRollupWriter.js +257 -0
- package/build/dist/Server/Utils/EmailRollup/EmailRollupWriter.js.map +1 -0
- package/build/dist/Server/Utils/LLM/LLMService.js +64 -1
- package/build/dist/Server/Utils/LLM/LLMService.js.map +1 -1
- package/build/dist/Server/Utils/LogRedaction.js +8 -0
- package/build/dist/Server/Utils/LogRedaction.js.map +1 -1
- package/build/dist/Server/Utils/Logger.js +63 -1
- package/build/dist/Server/Utils/Logger.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/Criteria/DatabaseMonitorCriteria.js +141 -0
- package/build/dist/Server/Utils/Monitor/Criteria/DatabaseMonitorCriteria.js.map +1 -0
- package/build/dist/Server/Utils/Monitor/Criteria/EvaluateOverTime.js +8 -1
- package/build/dist/Server/Utils/Monitor/Criteria/EvaluateOverTime.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/Criteria/SnmpMonitorCriteria.js +51 -1
- package/build/dist/Server/Utils/Monitor/Criteria/SnmpMonitorCriteria.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorCriteriaDataExtractor.js +7 -0
- package/build/dist/Server/Utils/Monitor/MonitorCriteriaDataExtractor.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorCriteriaEvaluator.js +37 -0
- package/build/dist/Server/Utils/Monitor/MonitorCriteriaEvaluator.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorCriteriaObservationBuilder.js +158 -6
- package/build/dist/Server/Utils/Monitor/MonitorCriteriaObservationBuilder.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorMetricUtil.js +33 -0
- package/build/dist/Server/Utils/Monitor/MonitorMetricUtil.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorTemplateUtil.js +32 -0
- package/build/dist/Server/Utils/Monitor/MonitorTemplateUtil.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/NetworkDeviceHydrationUtil.js +330 -21
- package/build/dist/Server/Utils/Monitor/NetworkDeviceHydrationUtil.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/NetworkDeviceMetricUtil.js +55 -10
- package/build/dist/Server/Utils/Monitor/NetworkDeviceMetricUtil.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/NetworkDeviceWalkUtil.js +178 -49
- package/build/dist/Server/Utils/Monitor/NetworkDeviceWalkUtil.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/NetworkInventoryUtil.js +119 -29
- package/build/dist/Server/Utils/Monitor/NetworkInventoryUtil.js.map +1 -1
- package/build/dist/Server/Utils/NetworkDevice/DeviceHealthAggregation.js +30 -17
- package/build/dist/Server/Utils/NetworkDevice/DeviceHealthAggregation.js.map +1 -1
- package/build/dist/Server/Utils/NetworkSite/NetworkSiteHierarchyLock.js +158 -0
- package/build/dist/Server/Utils/NetworkSite/NetworkSiteHierarchyLock.js.map +1 -0
- package/build/dist/Server/Utils/OutboundUserAgent.js +123 -0
- package/build/dist/Server/Utils/OutboundUserAgent.js.map +1 -0
- package/build/dist/Server/Utils/StartServer.js +38 -14
- package/build/dist/Server/Utils/StartServer.js.map +1 -1
- package/build/dist/Server/Utils/Telemetry/CaptureSpan.js +28 -8
- package/build/dist/Server/Utils/Telemetry/CaptureSpan.js.map +1 -1
- package/build/dist/Server/Utils/Telemetry/ErrorClassResolver.js +95 -0
- package/build/dist/Server/Utils/Telemetry/ErrorClassResolver.js.map +1 -0
- package/build/dist/Server/Utils/Telemetry/SpanUtil.js +29 -0
- package/build/dist/Server/Utils/Telemetry/SpanUtil.js.map +1 -1
- package/build/dist/Server/Utils/Telemetry.js +162 -46
- package/build/dist/Server/Utils/Telemetry.js.map +1 -1
- package/build/dist/Types/AI/ExceptionAIClassification.js +10 -24
- package/build/dist/Types/AI/ExceptionAIClassification.js.map +1 -1
- package/build/dist/Types/Email/EmailTemplateType.js +1 -0
- package/build/dist/Types/Email/EmailTemplateType.js.map +1 -1
- package/build/dist/Types/EnterpriseLicense/EnterpriseLicenseUsageSnapshot.js +2 -0
- package/build/dist/Types/EnterpriseLicense/EnterpriseLicenseUsageSnapshot.js.map +1 -0
- package/build/dist/Types/EnterpriseLicense/EnterpriseLicenseUserCountSource.js +7 -0
- package/build/dist/Types/EnterpriseLicense/EnterpriseLicenseUserCountSource.js.map +1 -0
- package/build/dist/Types/Exception/ApiException.js +9 -0
- package/build/dist/Types/Exception/ApiException.js.map +1 -1
- package/build/dist/Types/Exception/BadDataException.js +10 -0
- package/build/dist/Types/Exception/BadDataException.js.map +1 -1
- package/build/dist/Types/Exception/BadRequestException.js +10 -0
- package/build/dist/Types/Exception/BadRequestException.js.map +1 -1
- package/build/dist/Types/Exception/Exception.js +56 -0
- package/build/dist/Types/Exception/Exception.js.map +1 -1
- package/build/dist/Types/Exception/ForbiddenException.js +9 -0
- package/build/dist/Types/Exception/ForbiddenException.js.map +1 -1
- package/build/dist/Types/Exception/NotAuthenticatedException.js +9 -0
- package/build/dist/Types/Exception/NotAuthenticatedException.js.map +1 -1
- package/build/dist/Types/Exception/NotAuthorizedException.js +9 -0
- package/build/dist/Types/Exception/NotAuthorizedException.js.map +1 -1
- package/build/dist/Types/Exception/NotFoundException.js +10 -0
- package/build/dist/Types/Exception/NotFoundException.js.map +1 -1
- package/build/dist/Types/Exception/PayloadTooLargeException.js +10 -0
- package/build/dist/Types/Exception/PayloadTooLargeException.js.map +1 -1
- package/build/dist/Types/Exception/PaymentRequiredException.js +9 -0
- package/build/dist/Types/Exception/PaymentRequiredException.js.map +1 -1
- package/build/dist/Types/Exception/ServiceUnavailableException.js +9 -0
- package/build/dist/Types/Exception/ServiceUnavailableException.js.map +1 -1
- package/build/dist/Types/Exception/SsoAuthorizationException.js +9 -0
- package/build/dist/Types/Exception/SsoAuthorizationException.js.map +1 -1
- package/build/dist/Types/Exception/TenantNotFoundException.js +10 -0
- package/build/dist/Types/Exception/TenantNotFoundException.js.map +1 -1
- package/build/dist/Types/Exception/TimeoutException.js +9 -0
- package/build/dist/Types/Exception/TimeoutException.js.map +1 -1
- package/build/dist/Types/Exception/TooManyRequestsException.js +9 -0
- package/build/dist/Types/Exception/TooManyRequestsException.js.map +1 -1
- package/build/dist/Types/Exception/UnableToReachServer.js +9 -0
- package/build/dist/Types/Exception/UnableToReachServer.js.map +1 -1
- package/build/dist/Types/Exception/WebsiteRequestException.js +9 -0
- package/build/dist/Types/Exception/WebsiteRequestException.js.map +1 -1
- package/build/dist/Types/Monitor/CriteriaFilter.js +45 -2
- package/build/dist/Types/Monitor/CriteriaFilter.js.map +1 -1
- package/build/dist/Types/Monitor/DatabaseMetricCatalog.js +594 -0
- package/build/dist/Types/Monitor/DatabaseMetricCatalog.js.map +1 -0
- package/build/dist/Types/Monitor/DatabaseMonitor/DatabaseMonitorResponse.js +21 -0
- package/build/dist/Types/Monitor/DatabaseMonitor/DatabaseMonitorResponse.js.map +1 -0
- package/build/dist/Types/Monitor/MonitorCriteriaInstance.js +70 -0
- package/build/dist/Types/Monitor/MonitorCriteriaInstance.js.map +1 -1
- package/build/dist/Types/Monitor/MonitorMetricType.js +61 -0
- package/build/dist/Types/Monitor/MonitorMetricType.js.map +1 -1
- package/build/dist/Types/Monitor/MonitorStep.js +54 -0
- package/build/dist/Types/Monitor/MonitorStep.js.map +1 -1
- package/build/dist/Types/Monitor/MonitorStepDatabaseMonitor.js +122 -0
- package/build/dist/Types/Monitor/MonitorStepDatabaseMonitor.js.map +1 -0
- package/build/dist/Types/Monitor/MonitorStepSqlMonitor.js.map +1 -1
- package/build/dist/Types/Monitor/MonitorType.js +45 -1
- package/build/dist/Types/Monitor/MonitorType.js.map +1 -1
- package/build/dist/Types/Monitor/SnmpMonitor/NetworkDeviceAlertPack.js +21 -1
- package/build/dist/Types/Monitor/SnmpMonitor/NetworkDeviceAlertPack.js.map +1 -1
- package/build/dist/Types/Monitor/SqlConnectionConfig.js +2 -0
- package/build/dist/Types/Monitor/SqlConnectionConfig.js.map +1 -0
- package/build/dist/Types/NetworkDevice/DefaultNetworkDeviceRole.js +105 -0
- package/build/dist/Types/NetworkDevice/DefaultNetworkDeviceRole.js.map +1 -0
- package/build/dist/Types/NetworkDevice/NetworkAlertPolicyScope.js +172 -0
- package/build/dist/Types/NetworkDevice/NetworkAlertPolicyScope.js.map +1 -0
- package/build/dist/Types/NetworkDevice/NetworkDeviceMonitoringMethod.js +40 -22
- package/build/dist/Types/NetworkDevice/NetworkDeviceMonitoringMethod.js.map +1 -1
- package/build/dist/Types/NetworkSite/DefaultNetworkSiteTypeHierarchy.js +26 -0
- package/build/dist/Types/NetworkSite/DefaultNetworkSiteTypeHierarchy.js.map +1 -0
- package/build/dist/Types/NotificationSetting/NotificationEmailRollupCategory.js +186 -0
- package/build/dist/Types/NotificationSetting/NotificationEmailRollupCategory.js.map +1 -0
- package/build/dist/Types/NotificationSetting/NotificationEmailRollupPolicy.js +87 -0
- package/build/dist/Types/NotificationSetting/NotificationEmailRollupPolicy.js.map +1 -0
- package/build/dist/Types/Permission.js +120 -0
- package/build/dist/Types/Permission.js.map +1 -1
- package/build/dist/Types/Telemetry/ErrorClass.js +216 -0
- package/build/dist/Types/Telemetry/ErrorClass.js.map +1 -0
- package/build/dist/Types/Telemetry/UnitOfWork.js +59 -0
- package/build/dist/Types/Telemetry/UnitOfWork.js.map +1 -0
- package/build/dist/UI/Components/Charts/Area/AreaChart.js +1 -1
- package/build/dist/UI/Components/Charts/Area/AreaChart.js.map +1 -1
- package/build/dist/UI/Components/Charts/Bar/BarChart.js +1 -1
- package/build/dist/UI/Components/Charts/Bar/BarChart.js.map +1 -1
- package/build/dist/UI/Components/Charts/ChartGroup/ChartGroup.js +6 -1
- package/build/dist/UI/Components/Charts/ChartGroup/ChartGroup.js.map +1 -1
- package/build/dist/UI/Components/Charts/ChartLibrary/AreaChart/AreaChart.js +79 -31
- package/build/dist/UI/Components/Charts/ChartLibrary/AreaChart/AreaChart.js.map +1 -1
- package/build/dist/UI/Components/Charts/ChartLibrary/BarChart/BarChart.js +7 -1
- package/build/dist/UI/Components/Charts/ChartLibrary/BarChart/BarChart.js.map +1 -1
- package/build/dist/UI/Components/Charts/ChartLibrary/LineChart/LineChart.js +79 -31
- package/build/dist/UI/Components/Charts/ChartLibrary/LineChart/LineChart.js.map +1 -1
- package/build/dist/UI/Components/Charts/ChartLibrary/Utils/DoubleClick.js +14 -0
- package/build/dist/UI/Components/Charts/ChartLibrary/Utils/DoubleClick.js.map +1 -0
- package/build/dist/UI/Components/Charts/Line/LineChart.js +1 -1
- package/build/dist/UI/Components/Charts/Line/LineChart.js.map +1 -1
- package/build/dist/UI/Components/CommandPalette/CommandPalette.js +2 -7
- package/build/dist/UI/Components/CommandPalette/CommandPalette.js.map +1 -1
- package/build/dist/UI/Components/EditionLabel/EditionLabel.js +3 -0
- package/build/dist/UI/Components/EditionLabel/EditionLabel.js.map +1 -1
- package/build/dist/UI/Components/Modal/Modal.js +2 -7
- package/build/dist/UI/Components/Modal/Modal.js.map +1 -1
- package/build/dist/UI/Components/ModelTable/BaseModelTable.js +39 -13
- package/build/dist/UI/Components/ModelTable/BaseModelTable.js.map +1 -1
- package/build/dist/UI/Components/MonitorTemplateVariables/TemplateVariablesCatalog.js +39 -0
- package/build/dist/UI/Components/MonitorTemplateVariables/TemplateVariablesCatalog.js.map +1 -1
- package/build/dist/UI/Components/Navbar/NavBar.js +44 -9
- package/build/dist/UI/Components/Navbar/NavBar.js.map +1 -1
- package/build/dist/UI/Components/Navbar/NavBarMenuModal.js +2 -2
- package/build/dist/UI/Components/Navbar/NavBarMenuModal.js.map +1 -1
- package/build/dist/UI/Components/ProgressBar/ProgressBar.js +12 -1
- package/build/dist/UI/Components/ProgressBar/ProgressBar.js.map +1 -1
- package/build/dist/UI/Components/RadioButtons/BasicRadioButtons.js +6 -6
- package/build/dist/UI/Components/RadioButtons/BasicRadioButtons.js.map +1 -1
- package/build/dist/UI/Components/SideMenu/CountModelSideMenuItem.js +1 -1
- package/build/dist/UI/Components/SideMenu/CountModelSideMenuItem.js.map +1 -1
- package/build/dist/UI/Components/SideMenu/SideMenu.js +76 -11
- package/build/dist/UI/Components/SideMenu/SideMenu.js.map +1 -1
- package/build/dist/UI/Components/SideMenu/SideMenuItem.js +50 -54
- package/build/dist/UI/Components/SideMenu/SideMenuItem.js.map +1 -1
- package/build/dist/UI/Components/SideMenu/SideMenuSection.js +32 -9
- package/build/dist/UI/Components/SideMenu/SideMenuSection.js.map +1 -1
- package/build/dist/UI/Components/SideOver/SideOver.js +5 -20
- package/build/dist/UI/Components/SideOver/SideOver.js.map +1 -1
- package/build/dist/UI/Utils/PageScrollLock.js +31 -3
- package/build/dist/UI/Utils/PageScrollLock.js.map +1 -1
- package/build/dist/UI/Utils/PermissionGate.js +42 -1
- package/build/dist/UI/Utils/PermissionGate.js.map +1 -1
- package/build/dist/UI/Utils/SensitiveUrlToken.js +97 -0
- package/build/dist/UI/Utils/SensitiveUrlToken.js.map +1 -0
- package/build/dist/UI/Utils/TestLLMProvider.js +4 -5
- package/build/dist/UI/Utils/TestLLMProvider.js.map +1 -1
- package/build/dist/UI/Utils/UseDashboardTimeRangeZoom.js +42 -0
- package/build/dist/UI/Utils/UseDashboardTimeRangeZoom.js.map +1 -0
- package/build/dist/Utils/Dashboard/DashboardTimeRangeZoom.js +74 -0
- package/build/dist/Utils/Dashboard/DashboardTimeRangeZoom.js.map +1 -0
- package/build/dist/Utils/EnterpriseLicense/EnterpriseLicenseSeats.js +15 -0
- package/build/dist/Utils/EnterpriseLicense/EnterpriseLicenseSeats.js.map +1 -1
- package/build/dist/Utils/EnterpriseLicense/EnterpriseLicenseUsage.js +111 -9
- package/build/dist/Utils/EnterpriseLicense/EnterpriseLicenseUsage.js.map +1 -1
- package/build/dist/Utils/Monitor/MonitorMetricType.js +109 -1
- package/build/dist/Utils/Monitor/MonitorMetricType.js.map +1 -1
- package/build/dist/Utils/Monitor/NetworkDeviceRoleCatalog.js +126 -0
- package/build/dist/Utils/Monitor/NetworkDeviceRoleCatalog.js.map +1 -0
- package/build/dist/Utils/Monitor/NetworkDeviceRoleUtil.js +2 -1
- package/build/dist/Utils/Monitor/NetworkDeviceRoleUtil.js.map +1 -1
- package/build/dist/Utils/Monitor/NetworkTopologyUtil.js +75 -35
- package/build/dist/Utils/Monitor/NetworkTopologyUtil.js.map +1 -1
- package/build/dist/Utils/NetworkDevice/DeviceHealthStateUtil.js +27 -7
- package/build/dist/Utils/NetworkDevice/DeviceHealthStateUtil.js.map +1 -1
- package/build/dist/Utils/NetworkDevice/DeviceReachabilityUtil.js +7 -5
- package/build/dist/Utils/NetworkDevice/DeviceReachabilityUtil.js.map +1 -1
- package/build/dist/Utils/NetworkDevice/DeviceRoleKeyUtil.js +114 -0
- package/build/dist/Utils/NetworkDevice/DeviceRoleKeyUtil.js.map +1 -0
- package/build/dist/Utils/NetworkDevice/NetworkAlertPolicyBootstrapUtil.js +180 -0
- package/build/dist/Utils/NetworkDevice/NetworkAlertPolicyBootstrapUtil.js.map +1 -0
- package/build/dist/Utils/NetworkDevice/SnmpCredentialUtil.js +12 -0
- package/build/dist/Utils/NetworkDevice/SnmpCredentialUtil.js.map +1 -0
- package/build/dist/Utils/NetworkDiscovery/AutoImportRuleMatcher.js +15 -5
- package/build/dist/Utils/NetworkDiscovery/AutoImportRuleMatcher.js.map +1 -1
- package/build/dist/Utils/NetworkDiscovery/DiscoveredDeviceBuilder.js +44 -15
- package/build/dist/Utils/NetworkDiscovery/DiscoveredDeviceBuilder.js.map +1 -1
- package/build/dist/Utils/NetworkDiscovery/DiscoveryImportEligibility.js +52 -23
- package/build/dist/Utils/NetworkDiscovery/DiscoveryImportEligibility.js.map +1 -1
- package/build/dist/Utils/NetworkDiscovery/PingMonitorBuilder.js +85 -13
- package/build/dist/Utils/NetworkDiscovery/PingMonitorBuilder.js.map +1 -1
- package/build/dist/Utils/NetworkSite/SiteStatusRollupUtil.js +30 -15
- package/build/dist/Utils/NetworkSite/SiteStatusRollupUtil.js.map +1 -1
- package/build/dist/Utils/NetworkSite/TypeHierarchyUtil.js +191 -0
- package/build/dist/Utils/NetworkSite/TypeHierarchyUtil.js.map +1 -0
- package/build/dist/Utils/Rules/RulePatternMatchUtil.js +1 -1
- package/build/dist/Utils/Slug.js +31 -1
- package/build/dist/Utils/Slug.js.map +1 -1
- package/package.json +2 -2
|
@@ -0,0 +1,256 @@
|
|
|
1
|
+
import { describe, expect, it } from "@jest/globals";
|
|
2
|
+
import ejs from "ejs";
|
|
3
|
+
import fs from "fs";
|
|
4
|
+
import { JSDOM } from "jsdom";
|
|
5
|
+
import path from "path";
|
|
6
|
+
|
|
7
|
+
/*
|
|
8
|
+
* Password reset and email verification links carry a single-use bearer token
|
|
9
|
+
* in the URL path. Every analytics and advertising tag on the page reports the
|
|
10
|
+
* page URL as a matter of course, so the token used to leave the browser to
|
|
11
|
+
* whoever the Google Tag Manager container happened to be loading. Measured on
|
|
12
|
+
* production before the fix, one visit to /accounts/reset-password/<token> sent
|
|
13
|
+
* the token to region1.analytics.google.com, www.google.com, bat.bing.com,
|
|
14
|
+
* q.quora.com and alb.reddit.com.
|
|
15
|
+
*
|
|
16
|
+
* Common/Server/Views/Partials/SensitiveUrlToken.ejs closes that by rewriting
|
|
17
|
+
* the path before the container starts, and by refusing to start the container
|
|
18
|
+
* at all if the rewrite did not take. Both halves are load-order sensitive and
|
|
19
|
+
* invisible at runtime when they break — a tag moved above the partial, or a
|
|
20
|
+
* `return` dropped from the GTM guard, leaks silently and no other suite would
|
|
21
|
+
* notice — so they are pinned here.
|
|
22
|
+
*/
|
|
23
|
+
|
|
24
|
+
const REPOSITORY_ROOT: string = path.resolve(__dirname, "..", "..", "..");
|
|
25
|
+
|
|
26
|
+
const STORAGE_KEY: string = "oneuptime-sensitive-url-token";
|
|
27
|
+
|
|
28
|
+
const PARTIAL_PATH: string = path.join(
|
|
29
|
+
REPOSITORY_ROOT,
|
|
30
|
+
"Common",
|
|
31
|
+
"Server",
|
|
32
|
+
"Views",
|
|
33
|
+
"Partials",
|
|
34
|
+
"SensitiveUrlToken.ejs",
|
|
35
|
+
);
|
|
36
|
+
|
|
37
|
+
const CLIENT_UTIL_PATH: string = path.join(
|
|
38
|
+
REPOSITORY_ROOT,
|
|
39
|
+
"Common",
|
|
40
|
+
"UI",
|
|
41
|
+
"Utils",
|
|
42
|
+
"SensitiveUrlToken.ts",
|
|
43
|
+
);
|
|
44
|
+
|
|
45
|
+
interface Origin {
|
|
46
|
+
label: string;
|
|
47
|
+
viewPath: string;
|
|
48
|
+
// The first external script tag on the page; the bootstrap must precede it.
|
|
49
|
+
firstExternalScript: string;
|
|
50
|
+
// A token-bearing URL served by this origin, and the path it must become.
|
|
51
|
+
tokenUrl: string;
|
|
52
|
+
cleanedPath: string;
|
|
53
|
+
// A page on the same origin that carries no token.
|
|
54
|
+
ordinaryUrl: string;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
const ORIGINS: Array<Origin> = [
|
|
58
|
+
{
|
|
59
|
+
label: "accounts",
|
|
60
|
+
viewPath: path.join(
|
|
61
|
+
REPOSITORY_ROOT,
|
|
62
|
+
"App",
|
|
63
|
+
"FeatureSet",
|
|
64
|
+
"Accounts",
|
|
65
|
+
"views",
|
|
66
|
+
"index.ejs",
|
|
67
|
+
),
|
|
68
|
+
firstExternalScript: '<script src="/accounts/env.js">',
|
|
69
|
+
tokenUrl:
|
|
70
|
+
"https://oneuptime.com/accounts/reset-password/1522e9be-84cd-44b7-8fc9-606545bfa732",
|
|
71
|
+
cleanedPath: "/accounts/reset-password",
|
|
72
|
+
ordinaryUrl: "https://oneuptime.com/accounts/login",
|
|
73
|
+
},
|
|
74
|
+
{
|
|
75
|
+
label: "status page",
|
|
76
|
+
viewPath: path.join(
|
|
77
|
+
REPOSITORY_ROOT,
|
|
78
|
+
"App",
|
|
79
|
+
"FeatureSet",
|
|
80
|
+
"StatusPage",
|
|
81
|
+
"views",
|
|
82
|
+
"index.ejs",
|
|
83
|
+
),
|
|
84
|
+
firstExternalScript: '<script src="/status-page/env.js">',
|
|
85
|
+
tokenUrl:
|
|
86
|
+
"https://status.example/reset-password/1522e9be-84cd-44b7-8fc9-606545bfa732",
|
|
87
|
+
cleanedPath: "/reset-password",
|
|
88
|
+
ordinaryUrl: "https://status.example/login",
|
|
89
|
+
},
|
|
90
|
+
];
|
|
91
|
+
|
|
92
|
+
const TOKEN: string = "1522e9be-84cd-44b7-8fc9-606545bfa732";
|
|
93
|
+
|
|
94
|
+
function render(origin: Origin, enableGoogleTagManager: boolean): string {
|
|
95
|
+
return ejs.render(
|
|
96
|
+
fs.readFileSync(origin.viewPath, "utf8"),
|
|
97
|
+
{ title: "Acme Status", enableGoogleTagManager },
|
|
98
|
+
{ filename: origin.viewPath },
|
|
99
|
+
);
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
function loadPage(origin: Origin, url: string): JSDOM {
|
|
103
|
+
return new JSDOM(render(origin, true), {
|
|
104
|
+
url,
|
|
105
|
+
runScripts: "dangerously",
|
|
106
|
+
beforeParse: (pageWindow: JSDOM["window"]): void => {
|
|
107
|
+
(pageWindow as any).tailwind = { config: {} };
|
|
108
|
+
},
|
|
109
|
+
});
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
function gtmScript(page: JSDOM): Element | null {
|
|
113
|
+
return page.window.document.querySelector(
|
|
114
|
+
'script[src^="https://www.googletagmanager.com/gtm.js"]',
|
|
115
|
+
);
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
describe("the sensitive-URL-token partial", () => {
|
|
119
|
+
it("keeps its route list in step with the client that reads the stash", () => {
|
|
120
|
+
/*
|
|
121
|
+
* The partial decides which paths to strip; Common/UI/Utils/SensitiveUrlToken
|
|
122
|
+
* decides which paths still hold a token when the strip did not run. A route
|
|
123
|
+
* added to one and not the other either leaks (stripped nowhere) or breaks
|
|
124
|
+
* the flow (stripped, then unreadable).
|
|
125
|
+
*/
|
|
126
|
+
const routeList: string = `["reset-password", "verify-email"]`;
|
|
127
|
+
|
|
128
|
+
expect(fs.readFileSync(PARTIAL_PATH, "utf8")).toContain(routeList);
|
|
129
|
+
expect(fs.readFileSync(CLIENT_UTIL_PATH, "utf8")).toContain(routeList);
|
|
130
|
+
});
|
|
131
|
+
|
|
132
|
+
it("agrees with the client on the storage key", () => {
|
|
133
|
+
expect(fs.readFileSync(PARTIAL_PATH, "utf8")).toContain(`"${STORAGE_KEY}"`);
|
|
134
|
+
expect(fs.readFileSync(CLIENT_UTIL_PATH, "utf8")).toContain(
|
|
135
|
+
`"${STORAGE_KEY}"`,
|
|
136
|
+
);
|
|
137
|
+
});
|
|
138
|
+
});
|
|
139
|
+
|
|
140
|
+
for (const origin of ORIGINS) {
|
|
141
|
+
describe(`${origin.label}: sensitive URL tokens`, () => {
|
|
142
|
+
it("runs the bootstrap before any external script and declares no-referrer", () => {
|
|
143
|
+
const html: string = render(origin, true);
|
|
144
|
+
const bootstrap: number = html.indexOf(
|
|
145
|
+
`var STORAGE_KEY = "${STORAGE_KEY}"`,
|
|
146
|
+
);
|
|
147
|
+
|
|
148
|
+
expect(bootstrap).toBeGreaterThan(-1);
|
|
149
|
+
expect(html).toContain('<meta name="referrer" content="no-referrer" />');
|
|
150
|
+
|
|
151
|
+
/*
|
|
152
|
+
* Ordering is the whole mechanism. Anything that loads before the
|
|
153
|
+
* bootstrap sees the token.
|
|
154
|
+
*/
|
|
155
|
+
expect(html.indexOf(origin.firstExternalScript)).toBeGreaterThan(
|
|
156
|
+
bootstrap,
|
|
157
|
+
);
|
|
158
|
+
expect(html.indexOf("googletagmanager.com/gtm.js")).toBeGreaterThan(
|
|
159
|
+
bootstrap,
|
|
160
|
+
);
|
|
161
|
+
});
|
|
162
|
+
|
|
163
|
+
it("moves the token out of the address bar before page scripts run", () => {
|
|
164
|
+
const page: JSDOM = loadPage(origin, origin.tokenUrl);
|
|
165
|
+
|
|
166
|
+
expect(page.window.location.pathname).toBe(origin.cleanedPath);
|
|
167
|
+
expect(page.window.location.href).not.toContain(TOKEN);
|
|
168
|
+
expect(page.window.sessionStorage.getItem(STORAGE_KEY)).toBe(TOKEN);
|
|
169
|
+
|
|
170
|
+
page.window.close();
|
|
171
|
+
});
|
|
172
|
+
|
|
173
|
+
it("still starts analytics once the token is out of the URL", () => {
|
|
174
|
+
/*
|
|
175
|
+
* The fix must not cost the signup funnel its reporting. Stripping the
|
|
176
|
+
* token is what makes the page safe to measure, not switching measurement
|
|
177
|
+
* off.
|
|
178
|
+
*/
|
|
179
|
+
const page: JSDOM = loadPage(origin, origin.tokenUrl);
|
|
180
|
+
|
|
181
|
+
expect(
|
|
182
|
+
(page.window as any).__ONEUPTIME_SENSITIVE_URL_TOKEN_PENDING__,
|
|
183
|
+
).toBe(false);
|
|
184
|
+
expect(gtmScript(page)).not.toBeNull();
|
|
185
|
+
|
|
186
|
+
page.window.close();
|
|
187
|
+
});
|
|
188
|
+
|
|
189
|
+
it("suppresses analytics entirely when the token cannot be removed", () => {
|
|
190
|
+
/*
|
|
191
|
+
* Fail closed. If replaceState is unavailable, the token is still in the
|
|
192
|
+
* URL every tag is about to report, so no tag may load. Losing a page
|
|
193
|
+
* view is the cheaper failure.
|
|
194
|
+
*/
|
|
195
|
+
const page: JSDOM = new JSDOM(render(origin, true), {
|
|
196
|
+
url: origin.tokenUrl,
|
|
197
|
+
runScripts: "dangerously",
|
|
198
|
+
beforeParse: (pageWindow: JSDOM["window"]): void => {
|
|
199
|
+
(pageWindow as any).tailwind = { config: {} };
|
|
200
|
+
pageWindow.history.replaceState = (): void => {
|
|
201
|
+
throw new Error("replaceState unavailable");
|
|
202
|
+
};
|
|
203
|
+
},
|
|
204
|
+
});
|
|
205
|
+
|
|
206
|
+
expect(page.window.location.href).toContain(TOKEN);
|
|
207
|
+
expect(
|
|
208
|
+
(page.window as any).__ONEUPTIME_SENSITIVE_URL_TOKEN_PENDING__,
|
|
209
|
+
).toBe(true);
|
|
210
|
+
expect(gtmScript(page)).toBeNull();
|
|
211
|
+
|
|
212
|
+
page.window.close();
|
|
213
|
+
});
|
|
214
|
+
|
|
215
|
+
it("leaves ordinary pages untouched", () => {
|
|
216
|
+
const page: JSDOM = loadPage(origin, origin.ordinaryUrl);
|
|
217
|
+
|
|
218
|
+
expect(page.window.sessionStorage.getItem(STORAGE_KEY)).toBeNull();
|
|
219
|
+
expect(
|
|
220
|
+
(page.window as any).__ONEUPTIME_SENSITIVE_URL_TOKEN_PENDING__,
|
|
221
|
+
).toBe(false);
|
|
222
|
+
expect(gtmScript(page)).not.toBeNull();
|
|
223
|
+
|
|
224
|
+
page.window.close();
|
|
225
|
+
});
|
|
226
|
+
});
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
describe("accounts: email verification tokens", () => {
|
|
230
|
+
const accounts: Origin = ORIGINS[0]!;
|
|
231
|
+
|
|
232
|
+
it("strips the verify-email token too", () => {
|
|
233
|
+
const page: JSDOM = loadPage(
|
|
234
|
+
accounts,
|
|
235
|
+
`https://oneuptime.com/accounts/verify-email/${TOKEN}`,
|
|
236
|
+
);
|
|
237
|
+
|
|
238
|
+
expect(page.window.location.pathname).toBe("/accounts/verify-email");
|
|
239
|
+
expect(page.window.sessionStorage.getItem(STORAGE_KEY)).toBe(TOKEN);
|
|
240
|
+
|
|
241
|
+
page.window.close();
|
|
242
|
+
});
|
|
243
|
+
|
|
244
|
+
it("preserves the query string and fragment around the stripped token", () => {
|
|
245
|
+
const page: JSDOM = loadPage(
|
|
246
|
+
accounts,
|
|
247
|
+
`https://oneuptime.com/accounts/reset-password/${TOKEN}?utm_source=email#top`,
|
|
248
|
+
);
|
|
249
|
+
|
|
250
|
+
expect(page.window.location.pathname).toBe("/accounts/reset-password");
|
|
251
|
+
expect(page.window.location.search).toBe("?utm_source=email");
|
|
252
|
+
expect(page.window.location.hash).toBe("#top");
|
|
253
|
+
|
|
254
|
+
page.window.close();
|
|
255
|
+
});
|
|
256
|
+
});
|
|
@@ -37,7 +37,17 @@ const NOINDEX_META: RegExp =
|
|
|
37
37
|
/<meta\s+name="robots"\s+content="noindex,\s*nofollow">/;
|
|
38
38
|
|
|
39
39
|
function renderIndexPage(variables: JSONObject): string {
|
|
40
|
-
return ejs.render(
|
|
40
|
+
return ejs.render(
|
|
41
|
+
fs.readFileSync(INDEX_TEMPLATE, "utf8"),
|
|
42
|
+
variables,
|
|
43
|
+
/*
|
|
44
|
+
* The template opens <head> with an include of the shared
|
|
45
|
+
* sensitive-URL-token partial, and ejs resolves that relative path against
|
|
46
|
+
* `filename`. Without it every render below throws on the include rather
|
|
47
|
+
* than reaching the robots tag it means to assert.
|
|
48
|
+
*/
|
|
49
|
+
{ filename: INDEX_TEMPLATE },
|
|
50
|
+
);
|
|
41
51
|
}
|
|
42
52
|
|
|
43
53
|
describe("the status page index template", () => {
|
|
@@ -20,10 +20,15 @@ const INDEX_TEMPLATE: string = path.join(
|
|
|
20
20
|
const STORAGE_KEY: string = "oneuptime-status-page-login-code";
|
|
21
21
|
|
|
22
22
|
function renderIndexPage(enableGoogleTagManager: boolean): string {
|
|
23
|
-
return ejs.render(
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
23
|
+
return ejs.render(
|
|
24
|
+
fs.readFileSync(INDEX_TEMPLATE, "utf8"),
|
|
25
|
+
{
|
|
26
|
+
title: "Acme Status",
|
|
27
|
+
enableGoogleTagManager,
|
|
28
|
+
},
|
|
29
|
+
// The template includes the shared sensitive-URL-token partial.
|
|
30
|
+
{ filename: INDEX_TEMPLATE },
|
|
31
|
+
);
|
|
27
32
|
}
|
|
28
33
|
|
|
29
34
|
function loadPage(url: string, existingCode?: string): JSDOM {
|
|
@@ -217,62 +217,47 @@ describe("Database model registry", () => {
|
|
|
217
217
|
* than through the schema -- so a name that matches no declared column is a
|
|
218
218
|
* silent misfire rather than an error.
|
|
219
219
|
*
|
|
220
|
-
* Both halves misfire differently
|
|
220
|
+
* Both halves misfire differently:
|
|
221
221
|
*
|
|
222
222
|
* - A source that does not exist reads `undefined`, and Slug.getSlug(null)
|
|
223
223
|
* answers with a slug built from Faker.generateName(). The row still gets
|
|
224
224
|
* a unique, non-null slug, so nothing fails -- the slug is simply a
|
|
225
|
-
* random pair of words instead of the object's own name. Incident
|
|
226
|
-
* clearest case: it
|
|
225
|
+
* random pair of words instead of the object's own name. Incident was the
|
|
226
|
+
* clearest case: it slugified "name" while its title column is `title`,
|
|
227
227
|
* and its own slug column documents the example
|
|
228
228
|
* "database-connection-failure-in-production", which is a slugified
|
|
229
|
-
* TITLE. Every incident
|
|
229
|
+
* TITLE. Every incident created before the fix carries a random name.
|
|
230
230
|
*
|
|
231
231
|
* - A destination that does not exist has the slug assigned to a property
|
|
232
232
|
* the table has no column for, and TypeORM drops it on insert. The whole
|
|
233
233
|
* decorator is dead configuration.
|
|
234
234
|
*
|
|
235
|
-
*
|
|
236
|
-
*
|
|
237
|
-
*
|
|
238
|
-
*
|
|
239
|
-
*
|
|
235
|
+
* Fourteen models were recorded here as a baseline and have all since been
|
|
236
|
+
* fixed, so the list is empty. It is kept, rather than deleted along with
|
|
237
|
+
* its last entry, because the pair of tests below it is the ratchet: the
|
|
238
|
+
* first fails on a new misfire, the second fails on an entry left behind
|
|
239
|
+
* after a fix.
|
|
240
|
+
*
|
|
241
|
+
* Where each of the fourteen went, and why:
|
|
242
|
+
*
|
|
243
|
+
* - The four event models (Incident, ScheduledMaintenance and the two
|
|
244
|
+
* templates) had a real slug column and a source naming a column they do
|
|
245
|
+
* not have, so the slug landed and was random. Their intended sources
|
|
246
|
+
* are pinned in EXPECTED_SLUG_SOURCES below and asserted behaviourally
|
|
247
|
+
* in Tests/Server/Services/DatabaseServiceGenerateSlug.test.ts.
|
|
248
|
+
*
|
|
249
|
+
* - Domain, likewise, but its identity is the `domain` column.
|
|
250
|
+
*
|
|
251
|
+
* - The nine with no slug column had their decorator deleted rather than a
|
|
252
|
+
* column added. Nothing in the product reads any of these slugs -- the
|
|
253
|
+
* only slug consumed anywhere is Monitor's, as a template variable --
|
|
254
|
+
* and the alternative was adding a NOT NULL column to a live table with
|
|
255
|
+
* a backfill, for a value with no reader.
|
|
240
256
|
*
|
|
241
257
|
* THIS LIST MUST ONLY EVER SHRINK. A new entry means a new misfire; a stale
|
|
242
258
|
* entry means somebody fixed one and this test says so.
|
|
243
259
|
*/
|
|
244
|
-
const KNOWN_SLUG_MISFIRES: Array<string> = [
|
|
245
|
-
/*
|
|
246
|
-
* Source should almost certainly be `title` -- each of these has a title
|
|
247
|
-
* column and a real slug column, so the slug lands but is random.
|
|
248
|
-
*/
|
|
249
|
-
"Incident.slugifyColumn = name",
|
|
250
|
-
"IncidentTemplate.slugifyColumn = name",
|
|
251
|
-
"ScheduledMaintenance.slugifyColumn = name",
|
|
252
|
-
"ScheduledMaintenanceTemplate.slugifyColumn = name",
|
|
253
|
-
|
|
254
|
-
/* No name column and no title column; the slug source is `domain`. */
|
|
255
|
-
"Domain.slugifyColumn = name",
|
|
256
|
-
|
|
257
|
-
/* Has the source column, but no slug column to write to. */
|
|
258
|
-
"AlertState.saveSlugToColumn = slug",
|
|
259
|
-
"MetricType.saveSlugToColumn = slug",
|
|
260
|
-
"StatusPageAnnouncementTemplate.saveSlugToColumn = slug",
|
|
261
|
-
|
|
262
|
-
/* Neither column exists: the decorator does nothing at all. */
|
|
263
|
-
"MonitorStatusTimeline.slugifyColumn = name",
|
|
264
|
-
"MonitorStatusTimeline.saveSlugToColumn = slug",
|
|
265
|
-
"MonitorTest.slugifyColumn = name",
|
|
266
|
-
"MonitorTest.saveSlugToColumn = slug",
|
|
267
|
-
"StatusPageAnnouncement.slugifyColumn = name",
|
|
268
|
-
"StatusPageAnnouncement.saveSlugToColumn = slug",
|
|
269
|
-
"StatusPagePrivateUser.slugifyColumn = name",
|
|
270
|
-
"StatusPagePrivateUser.saveSlugToColumn = slug",
|
|
271
|
-
"StatusPageResource.slugifyColumn = name",
|
|
272
|
-
"StatusPageResource.saveSlugToColumn = slug",
|
|
273
|
-
"StatusPageSubscriber.slugifyColumn = name",
|
|
274
|
-
"StatusPageSubscriber.saveSlugToColumn = slug",
|
|
275
|
-
];
|
|
260
|
+
const KNOWN_SLUG_MISFIRES: Array<string> = [];
|
|
276
261
|
|
|
277
262
|
const findSlugMisfires: () => Array<string> = (): Array<string> => {
|
|
278
263
|
const dangling: Array<string> = [];
|
|
@@ -321,6 +306,95 @@ describe("Database model registry", () => {
|
|
|
321
306
|
expect(stale).toEqual([]);
|
|
322
307
|
});
|
|
323
308
|
|
|
309
|
+
/*
|
|
310
|
+
* The sweep above only proves a slug source names a column that EXISTS. It
|
|
311
|
+
* cannot see the other half of the same mistake: a decorator naming a real
|
|
312
|
+
* column that is not the one the model means. Incident, before the fix,
|
|
313
|
+
* would have passed such a sweep the moment "name" were changed to
|
|
314
|
+
* "description".
|
|
315
|
+
*
|
|
316
|
+
* So the models whose source was corrected are pinned by name, with the
|
|
317
|
+
* evidence for each choice. Behaviour is asserted separately in
|
|
318
|
+
* Tests/Server/Services/DatabaseServiceGenerateSlug.test.ts; this is the
|
|
319
|
+
* declaration.
|
|
320
|
+
*/
|
|
321
|
+
const EXPECTED_SLUG_SOURCES: Record<string, string> = {
|
|
322
|
+
/*
|
|
323
|
+
* The slug column's documented example is
|
|
324
|
+
* "database-connection-failure-in-production" -- the title column's
|
|
325
|
+
* example, slugified.
|
|
326
|
+
*/
|
|
327
|
+
Incident: "title",
|
|
328
|
+
ScheduledMaintenance: "title",
|
|
329
|
+
|
|
330
|
+
/*
|
|
331
|
+
* Both template models carry a title AND a templateName, so this is a
|
|
332
|
+
* choice between two real columns rather than the only one available.
|
|
333
|
+
* They mean templateName: each documents a slug example that is its
|
|
334
|
+
* templateName example slugified ("Server Outage Template" ->
|
|
335
|
+
* "server-outage-template", "Database Upgrade Template" ->
|
|
336
|
+
* "database-upgrade-template"), and the title is the incident or event
|
|
337
|
+
* the template produces rather than anything unique to the template.
|
|
338
|
+
*/
|
|
339
|
+
IncidentTemplate: "templateName",
|
|
340
|
+
ScheduledMaintenanceTemplate: "templateName",
|
|
341
|
+
|
|
342
|
+
/* Domain has neither a name nor a title; the domain is its identity. */
|
|
343
|
+
Domain: "domain",
|
|
344
|
+
};
|
|
345
|
+
|
|
346
|
+
it("slugifies the column each model actually means", () => {
|
|
347
|
+
const declared: Record<string, string | null> = {};
|
|
348
|
+
|
|
349
|
+
for (const className of Object.keys(EXPECTED_SLUG_SOURCES)) {
|
|
350
|
+
const entry: RegisteredModel | undefined = REGISTERED_MODELS.find(
|
|
351
|
+
(candidate: RegisteredModel) => {
|
|
352
|
+
return candidate.className === className;
|
|
353
|
+
},
|
|
354
|
+
);
|
|
355
|
+
|
|
356
|
+
/*
|
|
357
|
+
* A renamed or unregistered model shows up as a null rather than as a
|
|
358
|
+
* silently skipped expectation.
|
|
359
|
+
*/
|
|
360
|
+
declared[className] = entry ? entry.slugifyColumn : null;
|
|
361
|
+
}
|
|
362
|
+
|
|
363
|
+
expect(declared).toEqual(EXPECTED_SLUG_SOURCES);
|
|
364
|
+
});
|
|
365
|
+
|
|
366
|
+
/*
|
|
367
|
+
* The nine models whose decorator named columns they do not have at all.
|
|
368
|
+
* Deleting the decorator is what fixed them, so a copy-paste that puts one
|
|
369
|
+
* back has to fail here as well as in the sweep above.
|
|
370
|
+
*/
|
|
371
|
+
const MODELS_WITH_NO_SLUG: Array<string> = [
|
|
372
|
+
"AlertState",
|
|
373
|
+
"MetricType",
|
|
374
|
+
"MonitorStatusTimeline",
|
|
375
|
+
"MonitorTest",
|
|
376
|
+
"StatusPageAnnouncement",
|
|
377
|
+
"StatusPageAnnouncementTemplate",
|
|
378
|
+
"StatusPagePrivateUser",
|
|
379
|
+
"StatusPageResource",
|
|
380
|
+
"StatusPageSubscriber",
|
|
381
|
+
];
|
|
382
|
+
|
|
383
|
+
it("leaves the models with no slug column unslugified", () => {
|
|
384
|
+
const configured: Array<string> = REGISTERED_MODELS.filter(
|
|
385
|
+
(entry: RegisteredModel) => {
|
|
386
|
+
return (
|
|
387
|
+
MODELS_WITH_NO_SLUG.includes(entry.className) &&
|
|
388
|
+
Boolean(entry.slugifyColumn || entry.saveSlugToColumn)
|
|
389
|
+
);
|
|
390
|
+
},
|
|
391
|
+
).map((entry: RegisteredModel) => {
|
|
392
|
+
return entry.className;
|
|
393
|
+
});
|
|
394
|
+
|
|
395
|
+
expect(configured).toEqual([]);
|
|
396
|
+
});
|
|
397
|
+
|
|
324
398
|
/*
|
|
325
399
|
* A model that slugifies a column must have somewhere to put the result.
|
|
326
400
|
* Only the pair together produces a slug; either one alone is dead
|
|
@@ -6,13 +6,15 @@
|
|
|
6
6
|
* to break silently — a lazy-arrow typo or a decorator reorder leaves tsc
|
|
7
7
|
* green while TypeORM builds a relation to the wrong target. The FK actions
|
|
8
8
|
* are pinned too, because they carry the deletion semantics of the whole
|
|
9
|
-
* hierarchy: deleting a parent
|
|
10
|
-
*
|
|
9
|
+
* hierarchy: deleting a parent with surviving children must be rejected, not
|
|
10
|
+
* silently detach an invalid subtree or cascade it away, while
|
|
11
|
+
* timelines/links/rules still die with their site.
|
|
11
12
|
*/
|
|
12
13
|
|
|
13
14
|
import NetworkDevice from "../../Models/DatabaseModels/NetworkDevice";
|
|
14
15
|
import NetworkEndpoint from "../../Models/DatabaseModels/NetworkEndpoint";
|
|
15
16
|
import NetworkSite from "../../Models/DatabaseModels/NetworkSite";
|
|
17
|
+
import NetworkSiteType from "../../Models/DatabaseModels/NetworkSiteType";
|
|
16
18
|
import NetworkSiteAssignmentRule from "../../Models/DatabaseModels/NetworkSiteAssignmentRule";
|
|
17
19
|
import NetworkSiteLink from "../../Models/DatabaseModels/NetworkSiteLink";
|
|
18
20
|
import NetworkSiteStatusTimeline from "../../Models/DatabaseModels/NetworkSiteStatusTimeline";
|
|
@@ -58,7 +60,7 @@ describe("NetworkSite self-nesting hierarchy", () => {
|
|
|
58
60
|
expect(metadata.manyToOneRelationColumn).toBe("parentSiteId");
|
|
59
61
|
});
|
|
60
62
|
|
|
61
|
-
test("parentSite FK resolves to NetworkSite and
|
|
63
|
+
test("parentSite FK resolves to NetworkSite and protects surviving children", () => {
|
|
62
64
|
const relation: RelationMetadataArgs | undefined = relationArgs(
|
|
63
65
|
NetworkSite,
|
|
64
66
|
"parentSite",
|
|
@@ -66,7 +68,42 @@ describe("NetworkSite self-nesting hierarchy", () => {
|
|
|
66
68
|
|
|
67
69
|
expect(relation).toBeDefined();
|
|
68
70
|
expect(relationTarget(relation)).toBe(NetworkSite);
|
|
69
|
-
expect(relation?.options.onDelete).toBe("
|
|
71
|
+
expect(relation?.options.onDelete).toBe("NO ACTION");
|
|
72
|
+
});
|
|
73
|
+
|
|
74
|
+
test("site type relations protect surviving references at statement end", () => {
|
|
75
|
+
const parentTypeRelation: RelationMetadataArgs | undefined = relationArgs(
|
|
76
|
+
NetworkSiteType,
|
|
77
|
+
"parentNetworkSiteType",
|
|
78
|
+
);
|
|
79
|
+
const siteTypeRelation: RelationMetadataArgs | undefined = relationArgs(
|
|
80
|
+
NetworkSite,
|
|
81
|
+
"networkSiteType",
|
|
82
|
+
);
|
|
83
|
+
|
|
84
|
+
expect(relationTarget(parentTypeRelation)).toBe(NetworkSiteType);
|
|
85
|
+
expect(parentTypeRelation?.options.onDelete).toBe("NO ACTION");
|
|
86
|
+
expect(relationTarget(siteTypeRelation)).toBe(NetworkSiteType);
|
|
87
|
+
expect(siteTypeRelation?.options.onDelete).toBe("NO ACTION");
|
|
88
|
+
});
|
|
89
|
+
|
|
90
|
+
test("project deletion can cascade through sites and site types together", () => {
|
|
91
|
+
const siteProjectRelation: RelationMetadataArgs | undefined = relationArgs(
|
|
92
|
+
NetworkSite,
|
|
93
|
+
"project",
|
|
94
|
+
);
|
|
95
|
+
const typeProjectRelation: RelationMetadataArgs | undefined = relationArgs(
|
|
96
|
+
NetworkSiteType,
|
|
97
|
+
"project",
|
|
98
|
+
);
|
|
99
|
+
const siteTypeRelation: RelationMetadataArgs | undefined = relationArgs(
|
|
100
|
+
NetworkSite,
|
|
101
|
+
"networkSiteType",
|
|
102
|
+
);
|
|
103
|
+
|
|
104
|
+
expect(siteProjectRelation?.options.onDelete).toBe("CASCADE");
|
|
105
|
+
expect(typeProjectRelation?.options.onDelete).toBe("CASCADE");
|
|
106
|
+
expect(siteTypeRelation?.options.onDelete).toBe("NO ACTION");
|
|
70
107
|
});
|
|
71
108
|
|
|
72
109
|
test("NetworkDevice.site relation targets NetworkSite with SET NULL", () => {
|