@oneuptime/common 12.0.30 → 12.0.31
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/Models/AnalyticsModels/SecurityEvent.ts +48 -16
- package/Models/AnalyticsModels/ThreatIntelIndicator.ts +10 -5
- package/Models/DatabaseModels/AlertSeverity.ts +44 -0
- package/Models/DatabaseModels/DetectionRule.ts +16 -5
- package/Models/DatabaseModels/GoogleSecOpsConnection.ts +14 -5
- package/Models/DatabaseModels/IncidentSeverity.ts +44 -0
- package/Models/DatabaseModels/Index.ts +2 -0
- package/Models/DatabaseModels/NetworkDevice.ts +113 -3
- package/Models/DatabaseModels/NetworkDeviceAutoImportRule.ts +88 -0
- package/Models/DatabaseModels/NetworkDeviceDiscoveryScan.ts +22 -0
- package/Models/DatabaseModels/NetworkDeviceOidTemplate.ts +499 -0
- package/Models/DatabaseModels/ThreatIntelFeed.ts +16 -5
- package/Server/API/GlobalConfigAPI.ts +362 -183
- package/Server/API/TelemetryAPI.ts +42 -4
- package/Server/EnvironmentConfig.ts +112 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1790500000000-AddNetworkDeviceOidTemplate.ts +59 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1790600000000-AddAutoImportRuleOidTemplate.ts +25 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts +4 -0
- package/Server/Middleware/MultipartFormData.ts +118 -32
- package/Server/Services/AlertEpisodeLabelRuleEngineService.ts +9 -1
- package/Server/Services/AlertEpisodeOnCallRuleEngineService.ts +9 -1
- package/Server/Services/AlertEpisodeOwnerRuleEngineService.ts +9 -1
- package/Server/Services/AlertEpisodePrivacyRuleEngineService.ts +9 -1
- package/Server/Services/AlertGroupingEngineService.ts +9 -1
- package/Server/Services/AlertLabelRuleEngineService.ts +9 -1
- package/Server/Services/AlertOnCallRuleEngineService.ts +9 -1
- package/Server/Services/AlertOwnerRuleEngineService.ts +9 -1
- package/Server/Services/AlertPrivacyRuleEngineService.ts +9 -1
- package/Server/Services/AlertReminderRuleService.ts +9 -1
- package/Server/Services/AutoRemediationRuleEngineService.ts +9 -1
- package/Server/Services/CephClusterLabelRuleEngineService.ts +9 -1
- package/Server/Services/CephClusterOwnerRuleEngineService.ts +9 -1
- package/Server/Services/CloudResourceLabelRuleEngineService.ts +9 -1
- package/Server/Services/CloudResourceOwnerRuleEngineService.ts +9 -1
- package/Server/Services/DashboardLabelRuleEngineService.ts +9 -1
- package/Server/Services/DashboardOwnerRuleEngineService.ts +9 -1
- package/Server/Services/DockerHostLabelRuleEngineService.ts +9 -1
- package/Server/Services/DockerHostOwnerRuleEngineService.ts +9 -1
- package/Server/Services/DockerSwarmClusterLabelRuleEngineService.ts +9 -1
- package/Server/Services/DockerSwarmClusterOwnerRuleEngineService.ts +9 -1
- package/Server/Services/HostLabelRuleEngineService.ts +9 -1
- package/Server/Services/HostOwnerRuleEngineService.ts +9 -1
- package/Server/Services/IncidentEpisodeLabelRuleEngineService.ts +9 -1
- package/Server/Services/IncidentEpisodeOnCallRuleEngineService.ts +9 -1
- package/Server/Services/IncidentEpisodeOwnerRuleEngineService.ts +9 -1
- package/Server/Services/IncidentEpisodePrivacyRuleEngineService.ts +9 -1
- package/Server/Services/IncidentGroupingEngineService.ts +9 -1
- package/Server/Services/IncidentLabelRuleEngineService.ts +9 -1
- package/Server/Services/IncidentOnCallRuleEngineService.ts +9 -1
- package/Server/Services/IncidentOwnerRuleEngineService.ts +9 -1
- package/Server/Services/IncidentPrivacyRuleEngineService.ts +9 -1
- package/Server/Services/IncidentReminderRuleService.ts +9 -1
- package/Server/Services/IncidentSlaRuleService.ts +9 -1
- package/Server/Services/IncomingCallPolicyLabelRuleEngineService.ts +9 -1
- package/Server/Services/IncomingCallPolicyOwnerRuleEngineService.ts +9 -1
- package/Server/Services/Index.ts +2 -0
- package/Server/Services/IoTFleetLabelRuleEngineService.ts +9 -1
- package/Server/Services/IoTFleetOwnerRuleEngineService.ts +9 -1
- package/Server/Services/KubernetesClusterLabelRuleEngineService.ts +9 -1
- package/Server/Services/KubernetesClusterOwnerRuleEngineService.ts +9 -1
- package/Server/Services/KubernetesResourceService.ts +5 -1
- package/Server/Services/MonitorLabelRuleEngineService.ts +9 -1
- package/Server/Services/MonitorOwnerRuleEngineService.ts +9 -1
- package/Server/Services/NetworkDeviceAutoImportRuleEngineService.ts +35 -0
- package/Server/Services/NetworkDeviceAutoImportRuleService.ts +96 -0
- package/Server/Services/NetworkDeviceLabelRuleEngineService.ts +9 -1
- package/Server/Services/NetworkDeviceOidTemplateService.ts +201 -0
- package/Server/Services/NetworkDeviceOwnerRuleEngineService.ts +9 -1
- package/Server/Services/NetworkDeviceService.ts +209 -1
- package/Server/Services/OnCallDutyPolicyLabelRuleEngineService.ts +9 -1
- package/Server/Services/OnCallDutyPolicyOwnerRuleEngineService.ts +9 -1
- package/Server/Services/OnCallDutyPolicyScheduleLabelRuleEngineService.ts +9 -1
- package/Server/Services/OnCallDutyPolicyScheduleOwnerRuleEngineService.ts +9 -1
- package/Server/Services/PodmanHostLabelRuleEngineService.ts +9 -1
- package/Server/Services/PodmanHostOwnerRuleEngineService.ts +9 -1
- package/Server/Services/ProxmoxClusterLabelRuleEngineService.ts +9 -1
- package/Server/Services/ProxmoxClusterOwnerRuleEngineService.ts +9 -1
- package/Server/Services/RumApplicationLabelRuleEngineService.ts +9 -1
- package/Server/Services/RumApplicationOwnerRuleEngineService.ts +9 -1
- package/Server/Services/RunbookLabelRuleEngineService.ts +9 -1
- package/Server/Services/RunbookOwnerRuleEngineService.ts +9 -1
- package/Server/Services/RunbookRuleEngineService.ts +9 -1
- package/Server/Services/ScheduledMaintenanceLabelRuleEngineService.ts +9 -1
- package/Server/Services/ScheduledMaintenanceOwnerRuleEngineService.ts +9 -1
- package/Server/Services/ScheduledMaintenanceReminderRuleService.ts +9 -1
- package/Server/Services/ServerlessFunctionLabelRuleEngineService.ts +9 -1
- package/Server/Services/ServerlessFunctionOwnerRuleEngineService.ts +9 -1
- package/Server/Services/ServiceLabelRuleEngineService.ts +9 -1
- package/Server/Services/ServiceOwnerRuleEngineService.ts +9 -1
- package/Server/Services/StatusPageLabelRuleEngineService.ts +9 -1
- package/Server/Services/StatusPageMonitorRuleEngineService.ts +7 -0
- package/Server/Services/StatusPageOwnerRuleEngineService.ts +9 -1
- package/Server/Services/TelemetrySourceMapService.ts +266 -23
- package/Server/Services/UserService.ts +27 -0
- package/Server/Services/WorkflowLabelRuleEngineService.ts +9 -1
- package/Server/Services/WorkflowOwnerRuleEngineService.ts +9 -1
- package/Server/Utils/EnterpriseLicense/EnterpriseLicenseSeatUtil.ts +186 -0
- package/Server/Utils/Monitor/CapturedMetricAttributeUtil.ts +245 -0
- package/Server/Utils/Monitor/Criteria/SnmpMonitorCriteria.ts +21 -2
- package/Server/Utils/Monitor/MonitorMetricUtil.ts +55 -21
- package/Server/Utils/Monitor/MonitorTemplateUtil.ts +32 -0
- package/Server/Utils/Monitor/NetworkDeviceMetricUtil.ts +15 -2
- package/Server/Utils/Monitor/NetworkDeviceWalkUtil.ts +18 -1
- package/Server/Utils/Monitor/NetworkInventoryUtil.ts +10 -0
- package/Server/Utils/Monitor/SeriesResourceLabels.ts +34 -0
- package/Server/Utils/Rules/RuleEngineRuleRead.ts +48 -0
- package/Server/Utils/Telemetry/ExceptionSanitizer.ts +14 -1
- package/Server/Utils/Telemetry/LogExceptionExtractor.ts +14 -2
- package/Server/Utils/Telemetry/SourceMapResolver.ts +16 -5
- package/Server/Utils/Telemetry/StackTraceParser.ts +399 -0
- package/Tests/App/Dashboard/EventOverlayHook.test.tsx +125 -0
- package/Tests/App/Dashboard/HeaderImageAssets.test.tsx +93 -0
- package/Tests/App/Dashboard/OnCallReadinessSurfaces.test.tsx +3 -3
- package/Tests/App/Dashboard/UserElementEmail.test.tsx +12 -4
- package/Tests/App/Dashboard/UserEmailCallSites.test.tsx +1 -1
- package/Tests/Models/DatabaseModels/DomainRoleTierCoverage.test.ts +14 -0
- package/Tests/Models/DatabaseModels/ModelRegistryInvariants.test.ts +469 -0
- package/Tests/Models/SecurityDomainAccessControl.test.ts +429 -0
- package/Tests/Server/API/GlobalConfigLicense.test.ts +657 -0
- package/Tests/Server/API/SecurityEventAttributesAPI.test.ts +84 -6
- package/Tests/Server/API/TelemetryResolveStackTraceAPI.test.ts +805 -0
- package/Tests/Server/Infrastructure/Postgres/AddOnCallCalendarFeedsMigration.test.ts +32 -7
- package/Tests/Server/Middleware/IdentityRateLimit.test.ts +1144 -0
- package/Tests/Server/Middleware/MultipartFormData.test.ts +618 -3
- package/Tests/Server/Services/MonitorLabelRuleEngineScale.test.ts +520 -0
- package/Tests/Server/Services/NetworkDeviceOidTemplateService.test.ts +332 -0
- package/Tests/Server/Services/NetworkDeviceOidTemplateWriteGuards.test.ts +409 -0
- package/Tests/Server/Services/RuleEngineRuleFetchLimit.test.ts +239 -0
- package/Tests/Server/Services/TelemetrySourceMapService.test.ts +1210 -2
- package/Tests/Server/Services/UserServiceSeatLimit.test.ts +182 -0
- package/Tests/Server/Types/AnalyticsDatabase/SecurityEventModelPermission.test.ts +255 -0
- package/Tests/Server/Types/Database/Permissions/ReadBlockPermission.test.ts +212 -0
- package/Tests/Server/Types/Database/Permissions/SecurityRoleAccess.test.ts +413 -0
- package/Tests/Server/Utils/CodeRepository.test.ts +689 -0
- package/Tests/Server/Utils/EnterpriseLicense/EnterpriseLicenseSeatUtil.test.ts +495 -0
- package/Tests/Server/Utils/ExceptionSanitizer.test.ts +77 -0
- package/Tests/Server/Utils/Monitor/CapturedMetricAttributeUtil.test.ts +284 -0
- package/Tests/Server/Utils/Monitor/MonitorCustomMetricAttributes.test.ts +503 -0
- package/Tests/Server/Utils/Monitor/MonitorTemplatePrototypePollution.test.ts +106 -0
- package/Tests/Server/Utils/Monitor/NetworkDeviceWalkLogWritePath.test.ts +33 -4
- package/Tests/Server/Utils/Monitor/NetworkDeviceWalkUtil.test.ts +14 -4
- package/Tests/Server/Utils/Monitor/NetworkInventoryUtil.test.ts +44 -0
- package/Tests/Server/Utils/OpenAPISpec.test.ts +536 -0
- package/Tests/Server/Utils/Rules/RuleEngineRuleRead.test.ts +115 -0
- package/Tests/Server/Utils/StackTraceParser.test.ts +610 -0
- package/Tests/Server/Utils/Telemetry/LogExceptionExtractor.test.ts +0 -0
- package/Tests/Server/Utils/Telemetry/SourceMapLimits.test.ts +656 -0
- package/Tests/Server/Utils/Telemetry/SourceMapResolver.test.ts +100 -0
- package/Tests/Types/Monitor/SnmpMonitor/SnmpOidListUtil.test.ts +454 -0
- package/Tests/Types/SecurityRolePermissions.test.ts +193 -0
- package/Tests/UI/Components/Charts/AnnotationLayout.test.ts +773 -0
- package/Tests/UI/Components/Charts/ChartAnnotationRail.test.tsx +789 -0
- package/Tests/UI/Components/Charts/ChartBucketIdentity.test.ts +254 -0
- package/Tests/UI/Components/Charts/TimeAnnotation.test.ts +471 -0
- package/Tests/UI/Components/EditionLabelLicenseRefresh.test.tsx +405 -0
- package/Tests/UI/Components/ErrorMessageRefreshControl.test.tsx +83 -0
- package/Tests/UI/Components/MarkdownConverters.test.ts +686 -0
- package/Tests/UI/Components/ModelTable/BaseModelTableDeleteAndEmptyStates.test.tsx +341 -0
- package/Tests/UI/Components/OrderedStatesList.test.tsx +5 -5
- package/Tests/UI/Components/PendingProjectInvitations.test.tsx +1 -1
- package/Tests/UI/Components/TableSortAndMobileColumns.test.tsx +195 -0
- package/Tests/UI/Components/XAxis.test.ts +270 -5
- package/Tests/UI/Components/XAxisDaylightSaving.test.ts +113 -0
- package/Tests/UI/Styles/ChartFocusRing.test.ts +153 -0
- package/Tests/UI/Styles/ChartFocusRingCoverage.test.tsx +377 -0
- package/Tests/UI/Styles/ThemeStylesheet.ts +162 -0
- package/Tests/Utils/EnterpriseLicenseSeats.test.ts +507 -0
- package/Tests/Utils/NetworkDiscovery/DiscoveredDeviceBuilder.test.ts +951 -1
- package/Tests/Utils/NetworkDiscovery/DiscoveredHostUtil.test.ts +238 -0
- package/Tests/Utils/NetworkDiscovery/DiscoveryReverseDnsChain.test.ts +1056 -0
- package/Tests/Utils/NetworkDiscovery/ReverseDnsNameUtil.test.ts +882 -0
- package/Types/Date.ts +39 -0
- package/Types/Monitor/SnmpMonitor/SnmpOidListUtil.ts +333 -0
- package/Types/Permission.ts +96 -0
- package/Types/Rum/SessionReplay.ts +21 -0
- package/Types/Telemetry/SourceMap.ts +8 -0
- package/UI/Components/Charts/ChartLibrary/Annotations/AnnotationHoverCard.tsx +176 -0
- package/UI/Components/Charts/ChartLibrary/Annotations/AnnotationLayout.ts +745 -0
- package/UI/Components/Charts/ChartLibrary/Annotations/ChartAnnotationLayer.tsx +576 -0
- package/UI/Components/Charts/ChartLibrary/Annotations/UseChartAnnotations.tsx +204 -0
- package/UI/Components/Charts/ChartLibrary/AreaChart/AreaChart.tsx +491 -544
- package/UI/Components/Charts/ChartLibrary/BarChart/BarChart.tsx +324 -372
- package/UI/Components/Charts/ChartLibrary/LineChart/LineChart.tsx +487 -540
- package/UI/Components/Charts/ChartLibrary/Types/FormattedReferenceRegion.ts +7 -3
- package/UI/Components/Charts/ChartLibrary/Types/FormattedTimeReferenceLine.ts +14 -3
- package/UI/Components/Charts/Types/ChartEventKind.ts +13 -0
- package/UI/Components/Charts/Types/ReferenceRegionProps.ts +6 -0
- package/UI/Components/Charts/Types/TimeReferenceLineProps.ts +20 -3
- package/UI/Components/Charts/Utils/TimeAnnotation.ts +69 -35
- package/UI/Components/Charts/Utils/XAxis.ts +125 -18
- package/UI/Components/EditionLabel/EditionLabel.tsx +280 -26
- package/UI/Components/ErrorMessage/ErrorMessage.tsx +21 -10
- package/UI/Components/Feed/FeedItem.tsx +4 -5
- package/UI/Components/Header/HeaderIconDropdownButton.tsx +1 -2
- package/UI/Components/Header/UserProfile/UserProfile.tsx +1 -2
- package/UI/Components/Image/Image.tsx +20 -3
- package/UI/Components/Markdown.tsx/MarkdownConverters.ts +0 -0
- package/UI/Components/MemberRoleAssignment/MemberRoleAssignment.tsx +1 -2
- package/UI/Components/ModelTable/BaseModelTable.tsx +150 -24
- package/UI/Components/Table/TableHeader.tsx +64 -48
- package/UI/Components/Table/TableRow.tsx +13 -3
- package/UI/Styles/Theme.css +38 -0
- package/Utils/EnterpriseLicense/EnterpriseLicenseSeats.ts +271 -0
- package/Utils/NetworkDiscovery/AutoImportRuleMatcher.ts +6 -0
- package/Utils/NetworkDiscovery/DiscoveredDeviceBuilder.ts +141 -10
- package/Utils/NetworkDiscovery/DiscoveredHostUtil.ts +55 -3
- package/Utils/NetworkDiscovery/ReverseDnsNameUtil.ts +151 -0
- package/Utils/Rules/RuleEngineLimits.ts +32 -0
- package/build/dist/Models/AnalyticsModels/SecurityEvent.js +48 -16
- package/build/dist/Models/AnalyticsModels/SecurityEvent.js.map +1 -1
- package/build/dist/Models/AnalyticsModels/ThreatIntelIndicator.js +10 -5
- package/build/dist/Models/AnalyticsModels/ThreatIntelIndicator.js.map +1 -1
- package/build/dist/Models/DatabaseModels/AlertSeverity.js +46 -1
- package/build/dist/Models/DatabaseModels/AlertSeverity.js.map +1 -1
- package/build/dist/Models/DatabaseModels/DetectionRule.js +16 -5
- package/build/dist/Models/DatabaseModels/DetectionRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/GoogleSecOpsConnection.js +14 -5
- package/build/dist/Models/DatabaseModels/GoogleSecOpsConnection.js.map +1 -1
- package/build/dist/Models/DatabaseModels/IncidentSeverity.js +46 -1
- package/build/dist/Models/DatabaseModels/IncidentSeverity.js.map +1 -1
- package/build/dist/Models/DatabaseModels/Index.js +2 -0
- package/build/dist/Models/DatabaseModels/Index.js.map +1 -1
- package/build/dist/Models/DatabaseModels/NetworkDevice.js +115 -3
- package/build/dist/Models/DatabaseModels/NetworkDevice.js.map +1 -1
- package/build/dist/Models/DatabaseModels/NetworkDeviceAutoImportRule.js +88 -0
- package/build/dist/Models/DatabaseModels/NetworkDeviceAutoImportRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/NetworkDeviceDiscoveryScan.js.map +1 -1
- package/build/dist/Models/DatabaseModels/NetworkDeviceOidTemplate.js +519 -0
- package/build/dist/Models/DatabaseModels/NetworkDeviceOidTemplate.js.map +1 -0
- package/build/dist/Models/DatabaseModels/ThreatIntelFeed.js +16 -5
- package/build/dist/Models/DatabaseModels/ThreatIntelFeed.js.map +1 -1
- package/build/dist/Server/API/GlobalConfigAPI.js +293 -176
- package/build/dist/Server/API/GlobalConfigAPI.js.map +1 -1
- package/build/dist/Server/API/TelemetryAPI.js +31 -3
- package/build/dist/Server/API/TelemetryAPI.js.map +1 -1
- package/build/dist/Server/EnvironmentConfig.js +83 -0
- package/build/dist/Server/EnvironmentConfig.js.map +1 -1
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1790500000000-AddNetworkDeviceOidTemplate.js +26 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1790500000000-AddNetworkDeviceOidTemplate.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1790600000000-AddAutoImportRuleOidTemplate.js +14 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1790600000000-AddAutoImportRuleOidTemplate.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js +4 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js.map +1 -1
- package/build/dist/Server/Middleware/MultipartFormData.js +93 -28
- package/build/dist/Server/Middleware/MultipartFormData.js.map +1 -1
- package/build/dist/Server/Services/AlertEpisodeLabelRuleEngineService.js +8 -1
- package/build/dist/Server/Services/AlertEpisodeLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/AlertEpisodeOnCallRuleEngineService.js +8 -1
- package/build/dist/Server/Services/AlertEpisodeOnCallRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/AlertEpisodeOwnerRuleEngineService.js +8 -1
- package/build/dist/Server/Services/AlertEpisodeOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/AlertEpisodePrivacyRuleEngineService.js +8 -1
- package/build/dist/Server/Services/AlertEpisodePrivacyRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/AlertGroupingEngineService.js +8 -1
- package/build/dist/Server/Services/AlertGroupingEngineService.js.map +1 -1
- package/build/dist/Server/Services/AlertLabelRuleEngineService.js +8 -1
- package/build/dist/Server/Services/AlertLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/AlertOnCallRuleEngineService.js +8 -1
- package/build/dist/Server/Services/AlertOnCallRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/AlertOwnerRuleEngineService.js +8 -1
- package/build/dist/Server/Services/AlertOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/AlertPrivacyRuleEngineService.js +8 -1
- package/build/dist/Server/Services/AlertPrivacyRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/AlertReminderRuleService.js +8 -1
- package/build/dist/Server/Services/AlertReminderRuleService.js.map +1 -1
- package/build/dist/Server/Services/AutoRemediationRuleEngineService.js +8 -1
- package/build/dist/Server/Services/AutoRemediationRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/CephClusterLabelRuleEngineService.js +8 -1
- package/build/dist/Server/Services/CephClusterLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/CephClusterOwnerRuleEngineService.js +8 -1
- package/build/dist/Server/Services/CephClusterOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/CloudResourceLabelRuleEngineService.js +8 -1
- package/build/dist/Server/Services/CloudResourceLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/CloudResourceOwnerRuleEngineService.js +8 -1
- package/build/dist/Server/Services/CloudResourceOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/DashboardLabelRuleEngineService.js +8 -1
- package/build/dist/Server/Services/DashboardLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/DashboardOwnerRuleEngineService.js +8 -1
- package/build/dist/Server/Services/DashboardOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/DockerHostLabelRuleEngineService.js +8 -1
- package/build/dist/Server/Services/DockerHostLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/DockerHostOwnerRuleEngineService.js +8 -1
- package/build/dist/Server/Services/DockerHostOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/DockerSwarmClusterLabelRuleEngineService.js +8 -1
- package/build/dist/Server/Services/DockerSwarmClusterLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/DockerSwarmClusterOwnerRuleEngineService.js +8 -1
- package/build/dist/Server/Services/DockerSwarmClusterOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/HostLabelRuleEngineService.js +8 -1
- package/build/dist/Server/Services/HostLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/HostOwnerRuleEngineService.js +8 -1
- package/build/dist/Server/Services/HostOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/IncidentEpisodeLabelRuleEngineService.js +8 -1
- package/build/dist/Server/Services/IncidentEpisodeLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/IncidentEpisodeOnCallRuleEngineService.js +8 -1
- package/build/dist/Server/Services/IncidentEpisodeOnCallRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/IncidentEpisodeOwnerRuleEngineService.js +8 -1
- package/build/dist/Server/Services/IncidentEpisodeOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/IncidentEpisodePrivacyRuleEngineService.js +8 -1
- package/build/dist/Server/Services/IncidentEpisodePrivacyRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/IncidentGroupingEngineService.js +8 -1
- package/build/dist/Server/Services/IncidentGroupingEngineService.js.map +1 -1
- package/build/dist/Server/Services/IncidentLabelRuleEngineService.js +8 -1
- package/build/dist/Server/Services/IncidentLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/IncidentOnCallRuleEngineService.js +8 -1
- package/build/dist/Server/Services/IncidentOnCallRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/IncidentOwnerRuleEngineService.js +8 -1
- package/build/dist/Server/Services/IncidentOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/IncidentPrivacyRuleEngineService.js +8 -1
- package/build/dist/Server/Services/IncidentPrivacyRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/IncidentReminderRuleService.js +8 -1
- package/build/dist/Server/Services/IncidentReminderRuleService.js.map +1 -1
- package/build/dist/Server/Services/IncidentSlaRuleService.js +8 -1
- package/build/dist/Server/Services/IncidentSlaRuleService.js.map +1 -1
- package/build/dist/Server/Services/IncomingCallPolicyLabelRuleEngineService.js +8 -1
- package/build/dist/Server/Services/IncomingCallPolicyLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/IncomingCallPolicyOwnerRuleEngineService.js +8 -1
- package/build/dist/Server/Services/IncomingCallPolicyOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/Index.js +2 -0
- package/build/dist/Server/Services/Index.js.map +1 -1
- package/build/dist/Server/Services/IoTFleetLabelRuleEngineService.js +8 -1
- package/build/dist/Server/Services/IoTFleetLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/IoTFleetOwnerRuleEngineService.js +8 -1
- package/build/dist/Server/Services/IoTFleetOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/KubernetesClusterLabelRuleEngineService.js +8 -1
- package/build/dist/Server/Services/KubernetesClusterLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/KubernetesClusterOwnerRuleEngineService.js +8 -1
- package/build/dist/Server/Services/KubernetesClusterOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/KubernetesResourceService.js +5 -1
- package/build/dist/Server/Services/KubernetesResourceService.js.map +1 -1
- package/build/dist/Server/Services/MonitorLabelRuleEngineService.js +8 -1
- package/build/dist/Server/Services/MonitorLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/MonitorOwnerRuleEngineService.js +8 -1
- package/build/dist/Server/Services/MonitorOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/NetworkDeviceAutoImportRuleEngineService.js +30 -21
- package/build/dist/Server/Services/NetworkDeviceAutoImportRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/NetworkDeviceAutoImportRuleService.js +64 -0
- package/build/dist/Server/Services/NetworkDeviceAutoImportRuleService.js.map +1 -1
- package/build/dist/Server/Services/NetworkDeviceLabelRuleEngineService.js +8 -1
- package/build/dist/Server/Services/NetworkDeviceLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/NetworkDeviceOidTemplateService.js +180 -0
- package/build/dist/Server/Services/NetworkDeviceOidTemplateService.js.map +1 -0
- package/build/dist/Server/Services/NetworkDeviceOwnerRuleEngineService.js +8 -1
- package/build/dist/Server/Services/NetworkDeviceOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/NetworkDeviceService.js +154 -1
- package/build/dist/Server/Services/NetworkDeviceService.js.map +1 -1
- package/build/dist/Server/Services/OnCallDutyPolicyLabelRuleEngineService.js +8 -1
- package/build/dist/Server/Services/OnCallDutyPolicyLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/OnCallDutyPolicyOwnerRuleEngineService.js +8 -1
- package/build/dist/Server/Services/OnCallDutyPolicyOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/OnCallDutyPolicyScheduleLabelRuleEngineService.js +8 -1
- package/build/dist/Server/Services/OnCallDutyPolicyScheduleLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/OnCallDutyPolicyScheduleOwnerRuleEngineService.js +8 -1
- package/build/dist/Server/Services/OnCallDutyPolicyScheduleOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/PodmanHostLabelRuleEngineService.js +8 -1
- package/build/dist/Server/Services/PodmanHostLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/PodmanHostOwnerRuleEngineService.js +8 -1
- package/build/dist/Server/Services/PodmanHostOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/ProxmoxClusterLabelRuleEngineService.js +8 -1
- package/build/dist/Server/Services/ProxmoxClusterLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/ProxmoxClusterOwnerRuleEngineService.js +8 -1
- package/build/dist/Server/Services/ProxmoxClusterOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/RumApplicationLabelRuleEngineService.js +8 -1
- package/build/dist/Server/Services/RumApplicationLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/RumApplicationOwnerRuleEngineService.js +8 -1
- package/build/dist/Server/Services/RumApplicationOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/RunbookLabelRuleEngineService.js +8 -1
- package/build/dist/Server/Services/RunbookLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/RunbookOwnerRuleEngineService.js +8 -1
- package/build/dist/Server/Services/RunbookOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/RunbookRuleEngineService.js +8 -1
- package/build/dist/Server/Services/RunbookRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/ScheduledMaintenanceLabelRuleEngineService.js +8 -1
- package/build/dist/Server/Services/ScheduledMaintenanceLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/ScheduledMaintenanceOwnerRuleEngineService.js +8 -1
- package/build/dist/Server/Services/ScheduledMaintenanceOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/ScheduledMaintenanceReminderRuleService.js +8 -1
- package/build/dist/Server/Services/ScheduledMaintenanceReminderRuleService.js.map +1 -1
- package/build/dist/Server/Services/ServerlessFunctionLabelRuleEngineService.js +8 -1
- package/build/dist/Server/Services/ServerlessFunctionLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/ServerlessFunctionOwnerRuleEngineService.js +8 -1
- package/build/dist/Server/Services/ServerlessFunctionOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/ServiceLabelRuleEngineService.js +8 -1
- package/build/dist/Server/Services/ServiceLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/ServiceOwnerRuleEngineService.js +8 -1
- package/build/dist/Server/Services/ServiceOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/StatusPageLabelRuleEngineService.js +8 -1
- package/build/dist/Server/Services/StatusPageLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/StatusPageMonitorRuleEngineService.js +6 -0
- package/build/dist/Server/Services/StatusPageMonitorRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/StatusPageOwnerRuleEngineService.js +8 -1
- package/build/dist/Server/Services/StatusPageOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/TelemetrySourceMapService.js +213 -19
- package/build/dist/Server/Services/TelemetrySourceMapService.js.map +1 -1
- package/build/dist/Server/Services/UserService.js +25 -0
- package/build/dist/Server/Services/UserService.js.map +1 -1
- package/build/dist/Server/Services/WorkflowLabelRuleEngineService.js +8 -1
- package/build/dist/Server/Services/WorkflowLabelRuleEngineService.js.map +1 -1
- package/build/dist/Server/Services/WorkflowOwnerRuleEngineService.js +8 -1
- package/build/dist/Server/Services/WorkflowOwnerRuleEngineService.js.map +1 -1
- package/build/dist/Server/Utils/EnterpriseLicense/EnterpriseLicenseSeatUtil.js +145 -0
- package/build/dist/Server/Utils/EnterpriseLicense/EnterpriseLicenseSeatUtil.js.map +1 -0
- package/build/dist/Server/Utils/Monitor/CapturedMetricAttributeUtil.js +201 -0
- package/build/dist/Server/Utils/Monitor/CapturedMetricAttributeUtil.js.map +1 -0
- package/build/dist/Server/Utils/Monitor/Criteria/SnmpMonitorCriteria.js +19 -2
- package/build/dist/Server/Utils/Monitor/Criteria/SnmpMonitorCriteria.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorMetricUtil.js +42 -23
- package/build/dist/Server/Utils/Monitor/MonitorMetricUtil.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorTemplateUtil.js +29 -0
- package/build/dist/Server/Utils/Monitor/MonitorTemplateUtil.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/NetworkDeviceMetricUtil.js +11 -2
- package/build/dist/Server/Utils/Monitor/NetworkDeviceMetricUtil.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/NetworkDeviceWalkUtil.js +16 -1
- package/build/dist/Server/Utils/Monitor/NetworkDeviceWalkUtil.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/NetworkInventoryUtil.js +10 -0
- package/build/dist/Server/Utils/Monitor/NetworkInventoryUtil.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/SeriesResourceLabels.js +33 -0
- package/build/dist/Server/Utils/Monitor/SeriesResourceLabels.js.map +1 -1
- package/build/dist/Server/Utils/Rules/RuleEngineRuleRead.js +37 -0
- package/build/dist/Server/Utils/Rules/RuleEngineRuleRead.js.map +1 -0
- package/build/dist/Server/Utils/Telemetry/ExceptionSanitizer.js +12 -1
- package/build/dist/Server/Utils/Telemetry/ExceptionSanitizer.js.map +1 -1
- package/build/dist/Server/Utils/Telemetry/LogExceptionExtractor.js +14 -2
- package/build/dist/Server/Utils/Telemetry/LogExceptionExtractor.js.map +1 -1
- package/build/dist/Server/Utils/Telemetry/SourceMapResolver.js +15 -5
- package/build/dist/Server/Utils/Telemetry/SourceMapResolver.js.map +1 -1
- package/build/dist/Server/Utils/Telemetry/StackTraceParser.js +307 -0
- package/build/dist/Server/Utils/Telemetry/StackTraceParser.js.map +1 -1
- package/build/dist/Types/Date.js +27 -0
- package/build/dist/Types/Date.js.map +1 -1
- package/build/dist/Types/Monitor/SnmpMonitor/SnmpOidListUtil.js +253 -0
- package/build/dist/Types/Monitor/SnmpMonitor/SnmpOidListUtil.js.map +1 -0
- package/build/dist/Types/Permission.js +86 -0
- package/build/dist/Types/Permission.js.map +1 -1
- package/build/dist/Types/Rum/SessionReplay.js +19 -0
- package/build/dist/Types/Rum/SessionReplay.js.map +1 -1
- package/build/dist/UI/Components/Charts/ChartLibrary/Annotations/AnnotationHoverCard.js +83 -0
- package/build/dist/UI/Components/Charts/ChartLibrary/Annotations/AnnotationHoverCard.js.map +1 -0
- package/build/dist/UI/Components/Charts/ChartLibrary/Annotations/AnnotationLayout.js +531 -0
- package/build/dist/UI/Components/Charts/ChartLibrary/Annotations/AnnotationLayout.js.map +1 -0
- package/build/dist/UI/Components/Charts/ChartLibrary/Annotations/ChartAnnotationLayer.js +264 -0
- package/build/dist/UI/Components/Charts/ChartLibrary/Annotations/ChartAnnotationLayer.js.map +1 -0
- package/build/dist/UI/Components/Charts/ChartLibrary/Annotations/UseChartAnnotations.js +122 -0
- package/build/dist/UI/Components/Charts/ChartLibrary/Annotations/UseChartAnnotations.js.map +1 -0
- package/build/dist/UI/Components/Charts/ChartLibrary/AreaChart/AreaChart.js +213 -233
- package/build/dist/UI/Components/Charts/ChartLibrary/AreaChart/AreaChart.js.map +1 -1
- package/build/dist/UI/Components/Charts/ChartLibrary/BarChart/BarChart.js +139 -152
- package/build/dist/UI/Components/Charts/ChartLibrary/BarChart/BarChart.js.map +1 -1
- package/build/dist/UI/Components/Charts/ChartLibrary/LineChart/LineChart.js +212 -232
- package/build/dist/UI/Components/Charts/ChartLibrary/LineChart/LineChart.js.map +1 -1
- package/build/dist/UI/Components/Charts/Types/ChartEventKind.js +14 -0
- package/build/dist/UI/Components/Charts/Types/ChartEventKind.js.map +1 -0
- package/build/dist/UI/Components/Charts/Utils/TimeAnnotation.js +57 -28
- package/build/dist/UI/Components/Charts/Utils/TimeAnnotation.js.map +1 -1
- package/build/dist/UI/Components/Charts/Utils/XAxis.js +103 -17
- package/build/dist/UI/Components/Charts/Utils/XAxis.js.map +1 -1
- package/build/dist/UI/Components/EditionLabel/EditionLabel.js +198 -23
- package/build/dist/UI/Components/EditionLabel/EditionLabel.js.map +1 -1
- package/build/dist/UI/Components/ErrorMessage/ErrorMessage.js +15 -5
- package/build/dist/UI/Components/ErrorMessage/ErrorMessage.js.map +1 -1
- package/build/dist/UI/Components/Feed/FeedItem.js +4 -5
- package/build/dist/UI/Components/Feed/FeedItem.js.map +1 -1
- package/build/dist/UI/Components/Header/HeaderIconDropdownButton.js +1 -2
- package/build/dist/UI/Components/Header/HeaderIconDropdownButton.js.map +1 -1
- package/build/dist/UI/Components/Header/UserProfile/UserProfile.js.map +1 -1
- package/build/dist/UI/Components/Image/Image.js +6 -1
- package/build/dist/UI/Components/Image/Image.js.map +1 -1
- package/build/dist/UI/Components/Markdown.tsx/MarkdownConverters.js +0 -0
- package/build/dist/UI/Components/Markdown.tsx/MarkdownConverters.js.map +1 -1
- package/build/dist/UI/Components/MemberRoleAssignment/MemberRoleAssignment.js +1 -2
- package/build/dist/UI/Components/MemberRoleAssignment/MemberRoleAssignment.js.map +1 -1
- package/build/dist/UI/Components/ModelTable/BaseModelTable.js +104 -23
- package/build/dist/UI/Components/ModelTable/BaseModelTable.js.map +1 -1
- package/build/dist/UI/Components/Table/TableHeader.js +20 -22
- package/build/dist/UI/Components/Table/TableHeader.js.map +1 -1
- package/build/dist/UI/Components/Table/TableRow.js +13 -4
- package/build/dist/UI/Components/Table/TableRow.js.map +1 -1
- package/build/dist/Utils/EnterpriseLicense/EnterpriseLicenseSeats.js +153 -0
- package/build/dist/Utils/EnterpriseLicense/EnterpriseLicenseSeats.js.map +1 -0
- package/build/dist/Utils/NetworkDiscovery/AutoImportRuleMatcher.js.map +1 -1
- package/build/dist/Utils/NetworkDiscovery/DiscoveredDeviceBuilder.js +127 -7
- package/build/dist/Utils/NetworkDiscovery/DiscoveredDeviceBuilder.js.map +1 -1
- package/build/dist/Utils/NetworkDiscovery/DiscoveredHostUtil.js +50 -3
- package/build/dist/Utils/NetworkDiscovery/DiscoveredHostUtil.js.map +1 -1
- package/build/dist/Utils/NetworkDiscovery/ReverseDnsNameUtil.js +132 -0
- package/build/dist/Utils/NetworkDiscovery/ReverseDnsNameUtil.js.map +1 -0
- package/build/dist/Utils/Rules/RuleEngineLimits.js +31 -0
- package/build/dist/Utils/Rules/RuleEngineLimits.js.map +1 -0
- package/jest.config.json +1 -0
- package/package.json +2 -2
|
@@ -368,3 +368,613 @@ describe("StackTraceParser.parse - auto-detection", () => {
|
|
|
368
368
|
expect(result.frames[0]!.fileName).toBe("/app/only.js");
|
|
369
369
|
});
|
|
370
370
|
});
|
|
371
|
+
|
|
372
|
+
/*
|
|
373
|
+
* Firefox (SpiderMonkey) and Safari (JavaScriptCore) write `fn@source:line:col`
|
|
374
|
+
* — no `at`, no parentheses, no header line, and no indentation. Every frame
|
|
375
|
+
* below returned ZERO frames before parseJavaScriptBrowser existed, which is
|
|
376
|
+
* what kept browser exceptions from ever reaching source-map resolution
|
|
377
|
+
* (github.com/OneUptime/oneuptime/issues/3511).
|
|
378
|
+
*
|
|
379
|
+
* Two properties are load-bearing for the whole parse() election and are
|
|
380
|
+
* asserted separately below: the browser parser is registered LAST so it can
|
|
381
|
+
* never take a tie from another language, and it emits nothing at all until
|
|
382
|
+
* the stack has produced one unambiguous `name@<url>:line` anchor frame.
|
|
383
|
+
*/
|
|
384
|
+
describe("StackTraceParser.parse - JavaScript/Firefox (SpiderMonkey)", () => {
|
|
385
|
+
test("parses the stack reported in issue #3511", () => {
|
|
386
|
+
const trace: string = [
|
|
387
|
+
"handleSubmit@https://app.example.com/_nuxt/entry.a1b2c3d4.js:1:98217",
|
|
388
|
+
"onClick/<@https://app.example.com/_nuxt/entry.a1b2c3d4.js:1:74102",
|
|
389
|
+
"@https://app.example.com/_nuxt/entry.a1b2c3d4.js:1:2211",
|
|
390
|
+
].join("\n");
|
|
391
|
+
|
|
392
|
+
const result: ParsedStackTrace = StackTraceParser.parse(trace);
|
|
393
|
+
|
|
394
|
+
expect(result.frames).toHaveLength(3);
|
|
395
|
+
expect(result.frames[0]).toEqual({
|
|
396
|
+
functionName: "handleSubmit",
|
|
397
|
+
fileName: "https://app.example.com/_nuxt/entry.a1b2c3d4.js",
|
|
398
|
+
lineNumber: 1,
|
|
399
|
+
columnNumber: 98217,
|
|
400
|
+
inApp: true,
|
|
401
|
+
});
|
|
402
|
+
// A nested-closure name is kept as Firefox wrote it.
|
|
403
|
+
expect(result.frames[1]!.functionName).toBe("onClick/<");
|
|
404
|
+
// A nameless top-level frame gets the same placeholder the V8 parser uses.
|
|
405
|
+
expect(result.frames[2]!.functionName).toBe("<anonymous>");
|
|
406
|
+
expect(result.frames[2]!.columnNumber).toBe(2211);
|
|
407
|
+
});
|
|
408
|
+
|
|
409
|
+
test("keeps every shape of Firefox display name verbatim", () => {
|
|
410
|
+
const trace: string = [
|
|
411
|
+
"Foo.prototype.render@https://example.com/app.js:88:14",
|
|
412
|
+
"store.dispatch@https://example.com/app.js:44:7",
|
|
413
|
+
"initGrid/</<@https://example.com/app.js:214:31",
|
|
414
|
+
"initGrid/onRow/<@https://example.com/app.js:219:15",
|
|
415
|
+
"[16]</Grid.prototype.draw/<@https://example.com/app.js:1:98211",
|
|
416
|
+
].join("\n");
|
|
417
|
+
|
|
418
|
+
const result: ParsedStackTrace = StackTraceParser.parse(trace);
|
|
419
|
+
|
|
420
|
+
expect(
|
|
421
|
+
result.frames.map((f: StackFrame) => {
|
|
422
|
+
return f.functionName;
|
|
423
|
+
}),
|
|
424
|
+
).toEqual([
|
|
425
|
+
"Foo.prototype.render",
|
|
426
|
+
"store.dispatch",
|
|
427
|
+
"initGrid/</<",
|
|
428
|
+
"initGrid/onRow/<",
|
|
429
|
+
"[16]</Grid.prototype.draw/<",
|
|
430
|
+
]);
|
|
431
|
+
});
|
|
432
|
+
|
|
433
|
+
test("keeps the async cause marker as part of the function name", () => {
|
|
434
|
+
/*
|
|
435
|
+
* `<cause>*<fn>` is how Firefox marks a frame reconstructed from an async
|
|
436
|
+
* stack. Stripping the marker would render two adjacent frames as the same
|
|
437
|
+
* function at the same position, and StackFrame has no field to move it to.
|
|
438
|
+
*/
|
|
439
|
+
const trace: string = [
|
|
440
|
+
"async*loadUser@https://example.com/app.js:19:9",
|
|
441
|
+
"promise callback*fetchAll@https://example.com/app.js:33:5",
|
|
442
|
+
"setTimeout handler*poll@https://example.com/app.js:71:3",
|
|
443
|
+
"promise callback*initGrid/<@https://example.com/app.js:41:9",
|
|
444
|
+
// A getter that registers a promise callback carries BOTH forms at once.
|
|
445
|
+
"promise callback*get profile@https://example.com/app.js:52:7",
|
|
446
|
+
"async*@https://example.com/app.js:26:3",
|
|
447
|
+
].join("\n");
|
|
448
|
+
|
|
449
|
+
const result: ParsedStackTrace = StackTraceParser.parse(trace);
|
|
450
|
+
|
|
451
|
+
expect(
|
|
452
|
+
result.frames.map((f: StackFrame) => {
|
|
453
|
+
return f.functionName;
|
|
454
|
+
}),
|
|
455
|
+
).toEqual([
|
|
456
|
+
"async*loadUser",
|
|
457
|
+
"promise callback*fetchAll",
|
|
458
|
+
"setTimeout handler*poll",
|
|
459
|
+
"promise callback*initGrid/<",
|
|
460
|
+
"promise callback*get profile",
|
|
461
|
+
"async*",
|
|
462
|
+
]);
|
|
463
|
+
expect(result.frames[2]!.lineNumber).toBe(71);
|
|
464
|
+
});
|
|
465
|
+
|
|
466
|
+
test("parses the column-less form older Firefox emitted", () => {
|
|
467
|
+
const trace: string = [
|
|
468
|
+
"doStuff@https://example.com/legacy.js:112",
|
|
469
|
+
"boot@https://example.com/legacy.js:5:1",
|
|
470
|
+
].join("\n");
|
|
471
|
+
|
|
472
|
+
const result: ParsedStackTrace = StackTraceParser.parse(trace);
|
|
473
|
+
|
|
474
|
+
expect(result.frames).toHaveLength(2);
|
|
475
|
+
expect(result.frames[0]!.lineNumber).toBe(112);
|
|
476
|
+
expect(result.frames[0]!.columnNumber).toBeUndefined();
|
|
477
|
+
});
|
|
478
|
+
|
|
479
|
+
test("reports an eval frame against the introducing file and line", () => {
|
|
480
|
+
/*
|
|
481
|
+
* `https://x/app.js line 12 > eval:1:5` — the 1:5 is a position inside the
|
|
482
|
+
* eval'd text, which has no bundle and no source map. app.js:12 is the only
|
|
483
|
+
* position a source map can resolve, so that is what the frame carries and
|
|
484
|
+
* the inner column is dropped rather than aimed at the wrong file.
|
|
485
|
+
*/
|
|
486
|
+
const trace: string = [
|
|
487
|
+
"evalTarget@https://x.example.com/app.js line 12 > eval:1:5",
|
|
488
|
+
"nested@https://x.example.com/app.js line 30 > eval line 1 > eval:1:9",
|
|
489
|
+
"viaFunction@https://x.example.com/app.js line 7 > Function:1:1",
|
|
490
|
+
/*
|
|
491
|
+
* The `line N >` decoration is unmistakable, so an extensionless
|
|
492
|
+
* introducer is exempt from the script-extension rule below.
|
|
493
|
+
*/
|
|
494
|
+
"inline@https://x.example.com/checkout line 4 > eval:1:5",
|
|
495
|
+
"boot@https://x.example.com/app.js:3:1",
|
|
496
|
+
].join("\n");
|
|
497
|
+
|
|
498
|
+
const result: ParsedStackTrace = StackTraceParser.parse(trace);
|
|
499
|
+
|
|
500
|
+
expect(result.frames).toHaveLength(5);
|
|
501
|
+
expect(result.frames[0]!.fileName).toBe("https://x.example.com/app.js");
|
|
502
|
+
expect(result.frames[0]!.lineNumber).toBe(12);
|
|
503
|
+
expect(result.frames[0]!.columnNumber).toBeUndefined();
|
|
504
|
+
// Nested introductions collapse to the OUTERMOST line, not the innermost.
|
|
505
|
+
expect(result.frames[1]!.lineNumber).toBe(30);
|
|
506
|
+
expect(result.frames[2]!.lineNumber).toBe(7);
|
|
507
|
+
expect(result.frames[3]).toEqual({
|
|
508
|
+
functionName: "inline",
|
|
509
|
+
fileName: "https://x.example.com/checkout",
|
|
510
|
+
lineNumber: 4,
|
|
511
|
+
inApp: true,
|
|
512
|
+
});
|
|
513
|
+
});
|
|
514
|
+
|
|
515
|
+
test("parses a self-hosted builtin frame and marks it as library code", () => {
|
|
516
|
+
const trace: string = [
|
|
517
|
+
"next@self-hosted:1154:9",
|
|
518
|
+
"boot@https://x.example.com/a.js:1:1",
|
|
519
|
+
].join("\n");
|
|
520
|
+
|
|
521
|
+
const result: ParsedStackTrace = StackTraceParser.parse(trace);
|
|
522
|
+
|
|
523
|
+
expect(result.frames).toHaveLength(2);
|
|
524
|
+
expect(result.frames[0]).toEqual({
|
|
525
|
+
functionName: "next",
|
|
526
|
+
fileName: "self-hosted",
|
|
527
|
+
lineNumber: 1154,
|
|
528
|
+
columnNumber: 9,
|
|
529
|
+
inApp: false,
|
|
530
|
+
});
|
|
531
|
+
});
|
|
532
|
+
|
|
533
|
+
test("parses sources whose own colons must not be mistaken for the location", () => {
|
|
534
|
+
const trace: string = [
|
|
535
|
+
"boot@http://localhost:3000/static/js/bundle.js:12345:56",
|
|
536
|
+
"send@https://user:pw@cdn.example.com/sdk.js:1:9033",
|
|
537
|
+
"w@blob:https://example.com/9f0a-1:2:3",
|
|
538
|
+
"run@file:///C:/app/dist/x.js:8:2",
|
|
539
|
+
].join("\n");
|
|
540
|
+
|
|
541
|
+
const result: ParsedStackTrace = StackTraceParser.parse(trace);
|
|
542
|
+
|
|
543
|
+
expect(result.frames).toHaveLength(4);
|
|
544
|
+
// The :port survives; only the trailing two numbers are the location.
|
|
545
|
+
expect(result.frames[0]!.fileName).toBe(
|
|
546
|
+
"http://localhost:3000/static/js/bundle.js",
|
|
547
|
+
);
|
|
548
|
+
expect(result.frames[0]!.lineNumber).toBe(12345);
|
|
549
|
+
expect(result.frames[0]!.columnNumber).toBe(56);
|
|
550
|
+
// Userinfo contains both a colon and an `@` and must stay in the URL.
|
|
551
|
+
expect(result.frames[1]!.fileName).toBe(
|
|
552
|
+
"https://user:pw@cdn.example.com/sdk.js",
|
|
553
|
+
);
|
|
554
|
+
expect(result.frames[2]!.fileName).toBe("blob:https://example.com/9f0a-1");
|
|
555
|
+
expect(result.frames[3]!.fileName).toBe("file:///C:/app/dist/x.js");
|
|
556
|
+
});
|
|
557
|
+
|
|
558
|
+
test("classifies extension and vendored URLs as library code", () => {
|
|
559
|
+
const trace: string = [
|
|
560
|
+
"onMessage@moz-extension://a1b2/content.js:9:1",
|
|
561
|
+
"inject@chrome-extension://c3d4/inject.js:2:2",
|
|
562
|
+
"render@https://app.example.com/node_modules/react-dom/index.js:5:5",
|
|
563
|
+
"handleSubmit@https://app.example.com/assets/app.js:1:1",
|
|
564
|
+
].join("\n");
|
|
565
|
+
|
|
566
|
+
const result: ParsedStackTrace = StackTraceParser.parse(trace);
|
|
567
|
+
|
|
568
|
+
expect(
|
|
569
|
+
result.frames.map((f: StackFrame) => {
|
|
570
|
+
return f.inApp;
|
|
571
|
+
}),
|
|
572
|
+
).toEqual([false, false, false, true]);
|
|
573
|
+
});
|
|
574
|
+
|
|
575
|
+
test("handles CRLF line endings", () => {
|
|
576
|
+
const trace: string = [
|
|
577
|
+
"handleSubmit@https://example.com/app.js:1:2",
|
|
578
|
+
"boot@https://example.com/app.js:3:4",
|
|
579
|
+
].join("\r\n");
|
|
580
|
+
|
|
581
|
+
const result: ParsedStackTrace = StackTraceParser.parse(trace);
|
|
582
|
+
|
|
583
|
+
expect(result.frames).toHaveLength(2);
|
|
584
|
+
expect(result.frames[1]!.columnNumber).toBe(4);
|
|
585
|
+
});
|
|
586
|
+
|
|
587
|
+
test("skips a pathologically long line without dropping the rest", () => {
|
|
588
|
+
const trace: string = [
|
|
589
|
+
`x@https://example.com/${"a".repeat(5000)}.js:1:1`,
|
|
590
|
+
"boot@https://example.com/app.js:2:2",
|
|
591
|
+
].join("\n");
|
|
592
|
+
|
|
593
|
+
const result: ParsedStackTrace = StackTraceParser.parse(trace);
|
|
594
|
+
|
|
595
|
+
expect(result.frames).toHaveLength(1);
|
|
596
|
+
expect(result.frames[0]!.fileName).toBe("https://example.com/app.js");
|
|
597
|
+
});
|
|
598
|
+
});
|
|
599
|
+
|
|
600
|
+
describe("StackTraceParser.parse - JavaScript/Safari (JavaScriptCore)", () => {
|
|
601
|
+
test("parses a Safari stack including its pseudo-function names", () => {
|
|
602
|
+
const trace: string = [
|
|
603
|
+
"handleSubmit@https://app.example.com/build/main.js:12:34",
|
|
604
|
+
"global code@https://app.example.com/build/main.js:1:1",
|
|
605
|
+
"module code@https://app.example.com/build/mod.mjs:3:11",
|
|
606
|
+
"eval code@https://app.example.com/build/main.js:7:9",
|
|
607
|
+
].join("\n");
|
|
608
|
+
|
|
609
|
+
const result: ParsedStackTrace = StackTraceParser.parse(trace);
|
|
610
|
+
|
|
611
|
+
expect(result.frames).toHaveLength(4);
|
|
612
|
+
/*
|
|
613
|
+
* `global code` / `module code` / `eval code` are kept exactly as
|
|
614
|
+
* JavaScriptCore wrote them — they are the only name the engine gives the
|
|
615
|
+
* frame, and rewriting them would disagree with the raw stack shown
|
|
616
|
+
* beside the frame list.
|
|
617
|
+
*/
|
|
618
|
+
expect(
|
|
619
|
+
result.frames.map((f: StackFrame) => {
|
|
620
|
+
return f.functionName;
|
|
621
|
+
}),
|
|
622
|
+
).toEqual(["handleSubmit", "global code", "module code", "eval code"]);
|
|
623
|
+
expect(result.frames[2]!.fileName).toBe(
|
|
624
|
+
"https://app.example.com/build/mod.mjs",
|
|
625
|
+
);
|
|
626
|
+
});
|
|
627
|
+
|
|
628
|
+
test("parses `fn@[native code]` with no fabricated location", () => {
|
|
629
|
+
const trace: string = [
|
|
630
|
+
"handleSubmit@https://app.example.com/build/main.js:12:34",
|
|
631
|
+
"forEach@[native code]",
|
|
632
|
+
"promiseReactionJob@[native code]",
|
|
633
|
+
].join("\n");
|
|
634
|
+
|
|
635
|
+
const result: ParsedStackTrace = StackTraceParser.parse(trace);
|
|
636
|
+
|
|
637
|
+
expect(result.frames).toHaveLength(3);
|
|
638
|
+
expect(result.frames[1]).toEqual({
|
|
639
|
+
functionName: "forEach",
|
|
640
|
+
fileName: "[native code]",
|
|
641
|
+
/*
|
|
642
|
+
* lineNumber is not optional on StackFrame, and 0 is the same file-less
|
|
643
|
+
* sentinel parseJava already uses for `(Native Method)`. It also keeps
|
|
644
|
+
* the frame out of source-map resolution, which skips lineNumber < 1.
|
|
645
|
+
*/
|
|
646
|
+
lineNumber: 0,
|
|
647
|
+
inApp: false,
|
|
648
|
+
});
|
|
649
|
+
expect(result.frames[1]!.columnNumber).toBeUndefined();
|
|
650
|
+
});
|
|
651
|
+
|
|
652
|
+
test("parses ES2015 accessor and bound function names", () => {
|
|
653
|
+
const trace: string = [
|
|
654
|
+
"get fullName@https://example.com/app.js:4:9",
|
|
655
|
+
"bound save@https://example.com/app.js:9:2",
|
|
656
|
+
].join("\n");
|
|
657
|
+
|
|
658
|
+
const result: ParsedStackTrace = StackTraceParser.parse(trace);
|
|
659
|
+
|
|
660
|
+
expect(result.frames).toHaveLength(2);
|
|
661
|
+
expect(result.frames[0]!.functionName).toBe("get fullName");
|
|
662
|
+
expect(result.frames[1]!.functionName).toBe("bound save");
|
|
663
|
+
});
|
|
664
|
+
});
|
|
665
|
+
|
|
666
|
+
describe("StackTraceParser.parse - browser parser election", () => {
|
|
667
|
+
test("a V8 stack still elects the V8 parser", () => {
|
|
668
|
+
/*
|
|
669
|
+
* The whole reason the browser grammar is a separate parser rather than
|
|
670
|
+
* more patterns inside parseJavaScript: a V8 stack must be unaffected.
|
|
671
|
+
*/
|
|
672
|
+
const trace: string = [
|
|
673
|
+
"Error: boom",
|
|
674
|
+
" at doWork (/app/src/worker.js:42:15)",
|
|
675
|
+
" at main (/app/src/index.js:10:3)",
|
|
676
|
+
].join("\n");
|
|
677
|
+
|
|
678
|
+
const result: ParsedStackTrace = StackTraceParser.parse(trace);
|
|
679
|
+
|
|
680
|
+
expect(result.frames).toHaveLength(2);
|
|
681
|
+
expect(result.frames[0]!.fileName).toBe("/app/src/worker.js");
|
|
682
|
+
});
|
|
683
|
+
|
|
684
|
+
test("a V8 frame is never double-claimed by the browser parser", () => {
|
|
685
|
+
const v8: ParsedStackTrace = StackTraceParser.parse(
|
|
686
|
+
" at Object.send (https://app.example.com/assets/main.js:1:2)",
|
|
687
|
+
);
|
|
688
|
+
expect(v8.frames).toHaveLength(1);
|
|
689
|
+
expect(v8.frames[0]!.functionName).toBe("Object.send");
|
|
690
|
+
|
|
691
|
+
/*
|
|
692
|
+
* `at a*b` satisfies the async-cause name grammar, and no V8 pattern
|
|
693
|
+
* matches a column-less line — so without the `at ` guard in
|
|
694
|
+
* parseJavaScriptBrowser these two lines would become browser frames.
|
|
695
|
+
*/
|
|
696
|
+
const disguised: ParsedStackTrace = StackTraceParser.parse(
|
|
697
|
+
[
|
|
698
|
+
"at a*b@https://x.example.com/app.js:112",
|
|
699
|
+
"at c*d@https://x.example.com/app.js:113",
|
|
700
|
+
].join("\n"),
|
|
701
|
+
);
|
|
702
|
+
expect(disguised.frames).toEqual([]);
|
|
703
|
+
});
|
|
704
|
+
|
|
705
|
+
test("a mixed stack resolves to whichever engine has more frames", () => {
|
|
706
|
+
const trace: string = [
|
|
707
|
+
"TypeError: t is undefined",
|
|
708
|
+
"onSelect@https://app.example.com/main.js:1:46",
|
|
709
|
+
"render@https://app.example.com/main.js:2:3",
|
|
710
|
+
" at wrapper (/app/src/bridge.js:9:1)",
|
|
711
|
+
].join("\n");
|
|
712
|
+
|
|
713
|
+
const result: ParsedStackTrace = StackTraceParser.parse(trace);
|
|
714
|
+
|
|
715
|
+
expect(result.frames).toHaveLength(2);
|
|
716
|
+
expect(result.frames[0]!.functionName).toBe("onSelect");
|
|
717
|
+
});
|
|
718
|
+
|
|
719
|
+
test("browser-shaped lines never take a tie from another language", () => {
|
|
720
|
+
/*
|
|
721
|
+
* parse() keeps the FIRST parser to reach a frame count, and the browser
|
|
722
|
+
* parser is registered last, so it has to strictly out-count every
|
|
723
|
+
* language before it. These are the exact tie shapes that would otherwise
|
|
724
|
+
* silently delete a correct parse.
|
|
725
|
+
*/
|
|
726
|
+
type TieCase = { name: string; trace: string; expectedFile: string };
|
|
727
|
+
|
|
728
|
+
const cases: Array<TieCase> = [
|
|
729
|
+
{
|
|
730
|
+
name: "ruby",
|
|
731
|
+
trace: [
|
|
732
|
+
"/app/models/user.rb:12:in `save'",
|
|
733
|
+
"/app/controllers/users_controller.rb:8:in `create'",
|
|
734
|
+
"x@https://a.example.com/a.js:1:1",
|
|
735
|
+
"y@https://a.example.com/a.js:2:1",
|
|
736
|
+
].join("\n"),
|
|
737
|
+
expectedFile: "/app/models/user.rb",
|
|
738
|
+
},
|
|
739
|
+
{
|
|
740
|
+
name: "python",
|
|
741
|
+
trace: [
|
|
742
|
+
'File "/app/a.py", line 1, in a',
|
|
743
|
+
'File "/app/b.py", line 2, in b',
|
|
744
|
+
"x@https://a.example.com/a.js:1:1",
|
|
745
|
+
"y@https://a.example.com/a.js:2:1",
|
|
746
|
+
].join("\n"),
|
|
747
|
+
expectedFile: "/app/a.py",
|
|
748
|
+
},
|
|
749
|
+
{
|
|
750
|
+
name: "java",
|
|
751
|
+
trace: [
|
|
752
|
+
"at com.example.Foo.bar(Foo.java:10)",
|
|
753
|
+
"at com.example.Main.main(Main.java:5)",
|
|
754
|
+
"x@https://a.example.com/a.js:1:1",
|
|
755
|
+
"y@https://a.example.com/a.js:2:1",
|
|
756
|
+
].join("\n"),
|
|
757
|
+
expectedFile: "Foo.java",
|
|
758
|
+
},
|
|
759
|
+
{
|
|
760
|
+
name: "php",
|
|
761
|
+
trace: [
|
|
762
|
+
"#0 /app/service.php(42): Service->process()",
|
|
763
|
+
"#1 /app/index.php(10): Service->run()",
|
|
764
|
+
"#2 {main}",
|
|
765
|
+
"x@https://a.example.com/a.js:1:1",
|
|
766
|
+
"y@https://a.example.com/a.js:2:1",
|
|
767
|
+
"z@https://a.example.com/a.js:3:1",
|
|
768
|
+
].join("\n"),
|
|
769
|
+
expectedFile: "/app/service.php",
|
|
770
|
+
},
|
|
771
|
+
];
|
|
772
|
+
|
|
773
|
+
for (const testCase of cases) {
|
|
774
|
+
const result: ParsedStackTrace = StackTraceParser.parse(testCase.trace);
|
|
775
|
+
expect(result.frames[0]!.fileName).toBe(testCase.expectedFile);
|
|
776
|
+
}
|
|
777
|
+
});
|
|
778
|
+
|
|
779
|
+
test("forged `[native code]` lines cannot evict another language", () => {
|
|
780
|
+
/*
|
|
781
|
+
* A pseudo-source frame needs no URL and no digits, so without the anchor
|
|
782
|
+
* requirement two of them would be the cheapest possible way to out-count
|
|
783
|
+
* a real stack.
|
|
784
|
+
*/
|
|
785
|
+
const trace: string = [
|
|
786
|
+
"/app/models/user.rb:12:in `save'",
|
|
787
|
+
"/app/controllers/users_controller.rb:8:in `create'",
|
|
788
|
+
"map@[native code]",
|
|
789
|
+
"forEach@[native code]",
|
|
790
|
+
"reduce@[native code]",
|
|
791
|
+
].join("\n");
|
|
792
|
+
|
|
793
|
+
const result: ParsedStackTrace = StackTraceParser.parse(trace);
|
|
794
|
+
|
|
795
|
+
expect(result.frames).toHaveLength(2);
|
|
796
|
+
expect(result.frames[0]!.fileName).toBe("/app/models/user.rb");
|
|
797
|
+
});
|
|
798
|
+
|
|
799
|
+
test("keeps every frame of a browser stack that also carries context lines", () => {
|
|
800
|
+
/*
|
|
801
|
+
* Log bodies interleave frames with structured context. A frame must never
|
|
802
|
+
* be dropped because the lines around it were not frames — on the log
|
|
803
|
+
* ingest path a zero-frame parse discards the whole exception.
|
|
804
|
+
*/
|
|
805
|
+
const trace: string = [
|
|
806
|
+
"onSelect@https://app.example.com/main.js:1:46",
|
|
807
|
+
"render@https://app.example.com/main.js:2:3",
|
|
808
|
+
" request_id=abc",
|
|
809
|
+
" user_id=42",
|
|
810
|
+
].join("\n");
|
|
811
|
+
|
|
812
|
+
const result: ParsedStackTrace = StackTraceParser.parse(trace);
|
|
813
|
+
|
|
814
|
+
expect(result.frames).toHaveLength(2);
|
|
815
|
+
});
|
|
816
|
+
});
|
|
817
|
+
|
|
818
|
+
describe("StackTraceParser.parse - browser parser rejections", () => {
|
|
819
|
+
/*
|
|
820
|
+
* The browser parser runs over arbitrary ERROR log bodies via
|
|
821
|
+
* LogExceptionExtractor's raw-body path, so anything that reads as
|
|
822
|
+
* `something@something:number` has to be rejected explicitly. Each guard
|
|
823
|
+
* that does the rejecting is pinned here, because none of them is visible
|
|
824
|
+
* from the regexes alone and every one is a single edit away from being
|
|
825
|
+
* "simplified" back out.
|
|
826
|
+
*/
|
|
827
|
+
type RejectionCase = { why: string; input: string };
|
|
828
|
+
|
|
829
|
+
const rejections: Array<RejectionCase> = [
|
|
830
|
+
{
|
|
831
|
+
why: "an email address in log prose (the name has spaces)",
|
|
832
|
+
input: "failed login for user@example.com:22:1\nretrying in 5s",
|
|
833
|
+
},
|
|
834
|
+
{
|
|
835
|
+
why: "an SSH/git remote (the source names no scheme)",
|
|
836
|
+
input: "git@github.com:22:1",
|
|
837
|
+
},
|
|
838
|
+
{
|
|
839
|
+
why: "an ssh command line",
|
|
840
|
+
input: "ssh user@host:2222",
|
|
841
|
+
},
|
|
842
|
+
{
|
|
843
|
+
why: "a connection string (the name contains a colon)",
|
|
844
|
+
input: "Connection string: mongodb://svc@db.internal/app:1:1",
|
|
845
|
+
},
|
|
846
|
+
{
|
|
847
|
+
why: "a scoped npm path (what follows the `@` names no scheme)",
|
|
848
|
+
input: "/app/node_modules/@scope/pkg/index.js:10:5",
|
|
849
|
+
},
|
|
850
|
+
{
|
|
851
|
+
why: "a URL whose :port would otherwise peel as a line number",
|
|
852
|
+
input: "@http://127.0.0.1:8080\nserve@http://localhost:3000",
|
|
853
|
+
},
|
|
854
|
+
{
|
|
855
|
+
why: "a URL ending in a number with no column and no script extension",
|
|
856
|
+
input: "notify@https://hooks.slack.com/services/T000:200",
|
|
857
|
+
},
|
|
858
|
+
{
|
|
859
|
+
why: "a bare location with no `@` at all",
|
|
860
|
+
input: [
|
|
861
|
+
"https://cdn.example.com/vendor.js:99:1",
|
|
862
|
+
"https://cdn.example.com/other.js:98:2",
|
|
863
|
+
].join("\n"),
|
|
864
|
+
},
|
|
865
|
+
{
|
|
866
|
+
why: "pseudo-source frames with no anchor frame to license them",
|
|
867
|
+
input: "map@[native code]\nforEach@[native code]",
|
|
868
|
+
},
|
|
869
|
+
{
|
|
870
|
+
why: "a bare `@`",
|
|
871
|
+
input: "@\n@@",
|
|
872
|
+
},
|
|
873
|
+
/*
|
|
874
|
+
* The four below name a perfectly valid source, so the ONLY thing
|
|
875
|
+
* rejecting them is the guard each one is named for. Without them the
|
|
876
|
+
* guards are all individually deletable with the suite still green.
|
|
877
|
+
*/
|
|
878
|
+
{
|
|
879
|
+
why: "prose whose leading words cannot be a function name (spaces)",
|
|
880
|
+
input:
|
|
881
|
+
"notified on-call engineer jane@https://status.example.com/app.js:1:2",
|
|
882
|
+
},
|
|
883
|
+
{
|
|
884
|
+
why: "a name containing a colon",
|
|
885
|
+
input: "Connection string: svc@https://db.example.com/app.js:1:1",
|
|
886
|
+
},
|
|
887
|
+
{
|
|
888
|
+
why: "a scheme://authority whose :port would peel as the line number",
|
|
889
|
+
input: "boot@https://example.com:8080:1",
|
|
890
|
+
},
|
|
891
|
+
{
|
|
892
|
+
why: "a zero line number, which collides with the native-frame sentinel",
|
|
893
|
+
input: "boot@https://example.com/app.js:0:5",
|
|
894
|
+
},
|
|
895
|
+
{
|
|
896
|
+
why: "self-hosted frames with no anchor frame to license them",
|
|
897
|
+
input: "next@self-hosted:1154:9\nmap@self-hosted:1:1",
|
|
898
|
+
},
|
|
899
|
+
];
|
|
900
|
+
|
|
901
|
+
for (const rejection of rejections) {
|
|
902
|
+
test(`rejects ${rejection.why}`, () => {
|
|
903
|
+
const result: ParsedStackTrace = StackTraceParser.parse(rejection.input);
|
|
904
|
+
expect(result.frames).toEqual([]);
|
|
905
|
+
});
|
|
906
|
+
}
|
|
907
|
+
|
|
908
|
+
test("does not claim a Go file:line pair", () => {
|
|
909
|
+
/*
|
|
910
|
+
* `/app/main.go:25` is a single-number bare location — the Go parser owns
|
|
911
|
+
* it and still does. Inside a browser stack the browser parser must not
|
|
912
|
+
* add a SECOND frame for it: the two frames below are the two `@` frames,
|
|
913
|
+
* and the Go line contributes nothing.
|
|
914
|
+
*/
|
|
915
|
+
const goOnly: ParsedStackTrace = StackTraceParser.parse("/app/main.go:25");
|
|
916
|
+
expect(goOnly.frames).toHaveLength(1);
|
|
917
|
+
expect(goOnly.frames[0]!.fileName).toBe("/app/main.go");
|
|
918
|
+
|
|
919
|
+
const withAnchors: ParsedStackTrace = StackTraceParser.parse(
|
|
920
|
+
[
|
|
921
|
+
"handler@https://app.example.com/a.js:1:1",
|
|
922
|
+
"boot@https://app.example.com/a.js:2:1",
|
|
923
|
+
"/app/main.go:25",
|
|
924
|
+
].join("\n"),
|
|
925
|
+
);
|
|
926
|
+
expect(
|
|
927
|
+
withAnchors.frames.map((f: StackFrame) => {
|
|
928
|
+
return f.functionName;
|
|
929
|
+
}),
|
|
930
|
+
).toEqual(["handler", "boot"]);
|
|
931
|
+
});
|
|
932
|
+
|
|
933
|
+
test("an anchored stack still does not license bare locations", () => {
|
|
934
|
+
/*
|
|
935
|
+
* A logged asset URL sitting next to real frames must not become a frame:
|
|
936
|
+
* the no-`@` form is rejected outright, not merely gated on an anchor.
|
|
937
|
+
*/
|
|
938
|
+
const trace: string = [
|
|
939
|
+
"handler@https://app.example.com/a.js:1:1",
|
|
940
|
+
"https://cdn.example.com/vendor.js:99:1",
|
|
941
|
+
"https://cdn.example.com/other.js:98:2",
|
|
942
|
+
].join("\n");
|
|
943
|
+
|
|
944
|
+
const result: ParsedStackTrace = StackTraceParser.parse(trace);
|
|
945
|
+
|
|
946
|
+
expect(result.frames).toHaveLength(1);
|
|
947
|
+
expect(result.frames[0]!.functionName).toBe("handler");
|
|
948
|
+
});
|
|
949
|
+
|
|
950
|
+
test("never emits a fileName that a source map could not be matched to", () => {
|
|
951
|
+
/*
|
|
952
|
+
* SourceMapResolver matches a frame to a bundle by shared trailing path
|
|
953
|
+
* segments, so a fileName with junk glued to its last segment resolves to
|
|
954
|
+
* nothing. Any accepted frame must at minimum still end in its own
|
|
955
|
+
* basename.
|
|
956
|
+
*/
|
|
957
|
+
const trace: string = [
|
|
958
|
+
"a@https://app.example.com/assets/main.abc.js:1:2",
|
|
959
|
+
"b@https://app.example.com/assets/main.abc.js:abc:1",
|
|
960
|
+
"c@https://app.example.com/assets/main.abc.js?v=2:3:4",
|
|
961
|
+
].join("\n");
|
|
962
|
+
|
|
963
|
+
const result: ParsedStackTrace = StackTraceParser.parse(trace);
|
|
964
|
+
|
|
965
|
+
/*
|
|
966
|
+
* The middle frame's `:abc:` is not a location, so it is dropped outright
|
|
967
|
+
* rather than emitted with junk glued to its last path segment.
|
|
968
|
+
*/
|
|
969
|
+
expect(
|
|
970
|
+
result.frames.map((f: StackFrame) => {
|
|
971
|
+
return f.functionName;
|
|
972
|
+
}),
|
|
973
|
+
).toEqual(["a", "c"]);
|
|
974
|
+
|
|
975
|
+
for (const frame of result.frames) {
|
|
976
|
+
expect(frame.fileName).toContain("main.abc.js");
|
|
977
|
+
expect(frame.fileName).not.toContain(":abc");
|
|
978
|
+
}
|
|
979
|
+
});
|
|
980
|
+
});
|
|
Binary file
|