@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
|
@@ -0,0 +1,689 @@
|
|
|
1
|
+
import { beforeEach, describe, expect, it, jest } from "@jest/globals";
|
|
2
|
+
|
|
3
|
+
/*
|
|
4
|
+
* The git wrapper behind the blog pipeline (Home/Jobs/UpdateBlog.ts and
|
|
5
|
+
* Home/Utils/BlogPost.ts), and the shared helper anything else that touches a
|
|
6
|
+
* checkout would reach for next.
|
|
7
|
+
*
|
|
8
|
+
* Two properties are worth pinning here, and neither is visible by reading a
|
|
9
|
+
* single method:
|
|
10
|
+
*
|
|
11
|
+
* 1. NOTHING GOES THROUGH A SHELL. Every git invocation is made through
|
|
12
|
+
* Execute.executeCommandFile with an ARGUMENT ARRAY, so a branch name, a
|
|
13
|
+
* commit message or a file path containing `;`, backticks or `$(...)`
|
|
14
|
+
* reaches git as one opaque argument rather than as syntax. That is the
|
|
15
|
+
* whole defence -- there is no escaping layer to get right, because there
|
|
16
|
+
* is no shell to escape for -- which is exactly why it needs a test: the
|
|
17
|
+
* property is preserved by a call shape, and a future method written with
|
|
18
|
+
* `executeCommand` and a template string would silently drop it while
|
|
19
|
+
* looking perfectly reasonable.
|
|
20
|
+
*
|
|
21
|
+
* 2. THE PATH HELPERS THAT GUARD, GUARD. `resolvePathWithinRepo` refuses a
|
|
22
|
+
* path that resolves outside the repository root. The methods that route
|
|
23
|
+
* through it must keep doing so, because the argument is otherwise handed
|
|
24
|
+
* straight to git or to the filesystem.
|
|
25
|
+
*
|
|
26
|
+
* The suite also covers the parsing that has no other check on it: the clone
|
|
27
|
+
* folder name derived from a URL, and the record/unit separated `git log`
|
|
28
|
+
* output that the contributors list is built from.
|
|
29
|
+
*/
|
|
30
|
+
|
|
31
|
+
jest.mock("../../../Server/Utils/Execute", () => {
|
|
32
|
+
return {
|
|
33
|
+
__esModule: true,
|
|
34
|
+
default: {
|
|
35
|
+
executeCommandFile: jest.fn(),
|
|
36
|
+
executeCommand: jest.fn(),
|
|
37
|
+
},
|
|
38
|
+
};
|
|
39
|
+
});
|
|
40
|
+
|
|
41
|
+
jest.mock("../../../Server/Utils/LocalFile", () => {
|
|
42
|
+
return {
|
|
43
|
+
__esModule: true,
|
|
44
|
+
default: {
|
|
45
|
+
/* The real one only collapses double slashes; keep that behaviour. */
|
|
46
|
+
sanitizeFilePath: (filePath: string): string => {
|
|
47
|
+
return filePath.replace(/\/\//g, "/");
|
|
48
|
+
},
|
|
49
|
+
read: jest.fn(),
|
|
50
|
+
write: jest.fn(),
|
|
51
|
+
makeDirectory: jest.fn(),
|
|
52
|
+
deleteFile: jest.fn(),
|
|
53
|
+
deleteDirectory: jest.fn(),
|
|
54
|
+
readDirectory: jest.fn(),
|
|
55
|
+
},
|
|
56
|
+
};
|
|
57
|
+
});
|
|
58
|
+
|
|
59
|
+
jest.mock("../../../Server/Utils/Logger", () => {
|
|
60
|
+
return {
|
|
61
|
+
__esModule: true,
|
|
62
|
+
default: {
|
|
63
|
+
debug: jest.fn(),
|
|
64
|
+
info: jest.fn(),
|
|
65
|
+
warn: jest.fn(),
|
|
66
|
+
error: jest.fn(),
|
|
67
|
+
},
|
|
68
|
+
getLogAttributesFromRequest: jest.fn().mockReturnValue({}),
|
|
69
|
+
};
|
|
70
|
+
});
|
|
71
|
+
|
|
72
|
+
import CodeRepositoryUtil from "../../../Server/Utils/CodeRepository/CodeRepository";
|
|
73
|
+
import Execute from "../../../Server/Utils/Execute";
|
|
74
|
+
import LocalFile from "../../../Server/Utils/LocalFile";
|
|
75
|
+
import path from "path";
|
|
76
|
+
|
|
77
|
+
type MockedFn = ReturnType<typeof jest.fn>;
|
|
78
|
+
|
|
79
|
+
const executeCommandFileMock: MockedFn =
|
|
80
|
+
Execute.executeCommandFile as unknown as MockedFn;
|
|
81
|
+
const executeCommandMock: MockedFn =
|
|
82
|
+
Execute.executeCommand as unknown as MockedFn;
|
|
83
|
+
const readMock: MockedFn = LocalFile.read as unknown as MockedFn;
|
|
84
|
+
const writeMock: MockedFn = LocalFile.write as unknown as MockedFn;
|
|
85
|
+
const deleteFileMock: MockedFn = LocalFile.deleteFile as unknown as MockedFn;
|
|
86
|
+
const readDirectoryMock: MockedFn =
|
|
87
|
+
LocalFile.readDirectory as unknown as MockedFn;
|
|
88
|
+
|
|
89
|
+
const REPO_PATH: string = "/tmp/oneuptime-test-repo";
|
|
90
|
+
|
|
91
|
+
interface ExecuteCall {
|
|
92
|
+
command: string;
|
|
93
|
+
args: Array<string>;
|
|
94
|
+
cwd: string;
|
|
95
|
+
maxBuffer?: number;
|
|
96
|
+
timeoutInMS?: number;
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
const callsTo: () => Array<ExecuteCall> = (): Array<ExecuteCall> => {
|
|
100
|
+
return executeCommandFileMock.mock.calls.map((call: Array<unknown>) => {
|
|
101
|
+
return call[0] as ExecuteCall;
|
|
102
|
+
});
|
|
103
|
+
};
|
|
104
|
+
|
|
105
|
+
const lastCall: () => ExecuteCall = (): ExecuteCall => {
|
|
106
|
+
const calls: Array<ExecuteCall> = callsTo();
|
|
107
|
+
|
|
108
|
+
return calls[calls.length - 1] as ExecuteCall;
|
|
109
|
+
};
|
|
110
|
+
|
|
111
|
+
describe("CodeRepositoryUtil", () => {
|
|
112
|
+
beforeEach(() => {
|
|
113
|
+
jest.clearAllMocks();
|
|
114
|
+
executeCommandFileMock.mockResolvedValue("" as never);
|
|
115
|
+
readMock.mockResolvedValue("" as never);
|
|
116
|
+
writeMock.mockResolvedValue(undefined as never);
|
|
117
|
+
readDirectoryMock.mockResolvedValue([] as never);
|
|
118
|
+
});
|
|
119
|
+
|
|
120
|
+
describe("every git call avoids the shell", () => {
|
|
121
|
+
/*
|
|
122
|
+
* The single most important assertion in the file. executeCommand runs a
|
|
123
|
+
* string through a shell; executeCommandFile spawns the binary with an
|
|
124
|
+
* argv array. If a method ever switches, metacharacters in a branch name
|
|
125
|
+
* or a commit message stop being data.
|
|
126
|
+
*/
|
|
127
|
+
it("never reaches for the shell-executing helper", async () => {
|
|
128
|
+
await CodeRepositoryUtil.getCurrentCommitHash({ repoPath: REPO_PATH });
|
|
129
|
+
await CodeRepositoryUtil.addAllChangedFilesToGit({ repoPath: REPO_PATH });
|
|
130
|
+
await CodeRepositoryUtil.pullChanges({ repoPath: REPO_PATH });
|
|
131
|
+
await CodeRepositoryUtil.checkoutBranch({
|
|
132
|
+
repoPath: REPO_PATH,
|
|
133
|
+
branchName: "main",
|
|
134
|
+
});
|
|
135
|
+
await CodeRepositoryUtil.commitChanges({
|
|
136
|
+
repoPath: REPO_PATH,
|
|
137
|
+
message: "hello",
|
|
138
|
+
});
|
|
139
|
+
|
|
140
|
+
expect(executeCommandMock).not.toHaveBeenCalled();
|
|
141
|
+
expect(executeCommandFileMock).toHaveBeenCalled();
|
|
142
|
+
});
|
|
143
|
+
|
|
144
|
+
it("always invokes the git binary by name", async () => {
|
|
145
|
+
await CodeRepositoryUtil.getCurrentCommitHash({ repoPath: REPO_PATH });
|
|
146
|
+
await CodeRepositoryUtil.discardAllChangesOnCurrentBranch({
|
|
147
|
+
repoPath: REPO_PATH,
|
|
148
|
+
});
|
|
149
|
+
|
|
150
|
+
for (const call of callsTo()) {
|
|
151
|
+
expect(call.command).toBe("git");
|
|
152
|
+
expect(Array.isArray(call.args)).toBe(true);
|
|
153
|
+
}
|
|
154
|
+
});
|
|
155
|
+
|
|
156
|
+
it("passes a hostile branch name as one opaque argument", async () => {
|
|
157
|
+
const hostile: string = "main; rm -rf /";
|
|
158
|
+
|
|
159
|
+
await CodeRepositoryUtil.checkoutBranch({
|
|
160
|
+
repoPath: REPO_PATH,
|
|
161
|
+
branchName: hostile,
|
|
162
|
+
});
|
|
163
|
+
|
|
164
|
+
expect(lastCall().args).toEqual(["checkout", hostile]);
|
|
165
|
+
});
|
|
166
|
+
|
|
167
|
+
it("passes a hostile commit message as one opaque argument", async () => {
|
|
168
|
+
const hostile: string = '$(curl evil.example.com) `id` "quoted"';
|
|
169
|
+
|
|
170
|
+
await CodeRepositoryUtil.commitChanges({
|
|
171
|
+
repoPath: REPO_PATH,
|
|
172
|
+
message: hostile,
|
|
173
|
+
});
|
|
174
|
+
|
|
175
|
+
expect(lastCall().args).toEqual(["commit", "-m", hostile]);
|
|
176
|
+
});
|
|
177
|
+
|
|
178
|
+
it("passes a hostile author identity as opaque arguments", async () => {
|
|
179
|
+
await CodeRepositoryUtil.setAuthorIdentity({
|
|
180
|
+
repoPath: REPO_PATH,
|
|
181
|
+
authorName: "a; whoami",
|
|
182
|
+
authorEmail: "b@example.com; whoami",
|
|
183
|
+
});
|
|
184
|
+
|
|
185
|
+
const calls: Array<ExecuteCall> = callsTo();
|
|
186
|
+
|
|
187
|
+
expect(calls[0]?.args).toEqual([
|
|
188
|
+
"config",
|
|
189
|
+
"--global",
|
|
190
|
+
"user.name",
|
|
191
|
+
"a; whoami",
|
|
192
|
+
]);
|
|
193
|
+
expect(calls[1]?.args).toEqual([
|
|
194
|
+
"config",
|
|
195
|
+
"--global",
|
|
196
|
+
"user.email",
|
|
197
|
+
"b@example.com; whoami",
|
|
198
|
+
]);
|
|
199
|
+
});
|
|
200
|
+
|
|
201
|
+
it("runs git from the resolved repository directory", async () => {
|
|
202
|
+
await CodeRepositoryUtil.pullChanges({ repoPath: REPO_PATH });
|
|
203
|
+
|
|
204
|
+
expect(lastCall().cwd).toBe(path.resolve(REPO_PATH));
|
|
205
|
+
});
|
|
206
|
+
});
|
|
207
|
+
|
|
208
|
+
describe("command shapes", () => {
|
|
209
|
+
it("reads the current commit with rev-parse HEAD", async () => {
|
|
210
|
+
executeCommandFileMock.mockResolvedValue("abc123\n" as never);
|
|
211
|
+
|
|
212
|
+
await CodeRepositoryUtil.getCurrentCommitHash({ repoPath: REPO_PATH });
|
|
213
|
+
|
|
214
|
+
expect(lastCall().args).toEqual(["rev-parse", "HEAD"]);
|
|
215
|
+
});
|
|
216
|
+
|
|
217
|
+
it("stages everything with add -A", async () => {
|
|
218
|
+
await CodeRepositoryUtil.addAllChangedFilesToGit({ repoPath: REPO_PATH });
|
|
219
|
+
|
|
220
|
+
expect(lastCall().args).toEqual(["add", "-A"]);
|
|
221
|
+
});
|
|
222
|
+
|
|
223
|
+
it("discards working-tree changes with checkout .", async () => {
|
|
224
|
+
await CodeRepositoryUtil.discardChanges({ repoPath: REPO_PATH });
|
|
225
|
+
|
|
226
|
+
expect(lastCall().args).toEqual(["checkout", "."]);
|
|
227
|
+
});
|
|
228
|
+
|
|
229
|
+
it("creates a branch with checkout -b", async () => {
|
|
230
|
+
await CodeRepositoryUtil.createBranch({
|
|
231
|
+
repoPath: REPO_PATH,
|
|
232
|
+
branchName: "feature",
|
|
233
|
+
});
|
|
234
|
+
|
|
235
|
+
expect(lastCall().args).toEqual(["checkout", "-b", "feature"]);
|
|
236
|
+
});
|
|
237
|
+
});
|
|
238
|
+
|
|
239
|
+
describe("createOrCheckoutBranch", () => {
|
|
240
|
+
/*
|
|
241
|
+
* The decision is made by whether `rev-parse --verify` throws, so a
|
|
242
|
+
* checkout that fails for a reason other than "no such branch" would end
|
|
243
|
+
* up creating one. Both directions are pinned.
|
|
244
|
+
*/
|
|
245
|
+
it("checks out a branch that already exists", async () => {
|
|
246
|
+
executeCommandFileMock.mockResolvedValue("hash" as never);
|
|
247
|
+
|
|
248
|
+
await CodeRepositoryUtil.createOrCheckoutBranch({
|
|
249
|
+
repoPath: REPO_PATH,
|
|
250
|
+
branchName: "existing",
|
|
251
|
+
});
|
|
252
|
+
|
|
253
|
+
const calls: Array<ExecuteCall> = callsTo();
|
|
254
|
+
|
|
255
|
+
expect(calls[0]?.args).toEqual(["rev-parse", "--verify", "existing"]);
|
|
256
|
+
expect(calls[1]?.args).toEqual(["checkout", "existing"]);
|
|
257
|
+
expect(calls).toHaveLength(2);
|
|
258
|
+
});
|
|
259
|
+
|
|
260
|
+
it("creates a branch that does not exist yet", async () => {
|
|
261
|
+
executeCommandFileMock
|
|
262
|
+
.mockRejectedValueOnce(new Error("unknown revision") as never)
|
|
263
|
+
.mockResolvedValue("" as never);
|
|
264
|
+
|
|
265
|
+
await CodeRepositoryUtil.createOrCheckoutBranch({
|
|
266
|
+
repoPath: REPO_PATH,
|
|
267
|
+
branchName: "brand-new",
|
|
268
|
+
});
|
|
269
|
+
|
|
270
|
+
expect(lastCall().args).toEqual(["checkout", "-b", "brand-new"]);
|
|
271
|
+
});
|
|
272
|
+
});
|
|
273
|
+
|
|
274
|
+
describe("cloneRepository", () => {
|
|
275
|
+
it("clones the URL it was given", async () => {
|
|
276
|
+
await CodeRepositoryUtil.cloneRepository({
|
|
277
|
+
repoPath: REPO_PATH,
|
|
278
|
+
repoUrl: "https://github.com/OneUptime/oneuptime.git",
|
|
279
|
+
});
|
|
280
|
+
|
|
281
|
+
expect(lastCall().args).toEqual([
|
|
282
|
+
"clone",
|
|
283
|
+
"https://github.com/OneUptime/oneuptime.git",
|
|
284
|
+
]);
|
|
285
|
+
});
|
|
286
|
+
|
|
287
|
+
it("derives the folder name from an https URL", async () => {
|
|
288
|
+
await expect(
|
|
289
|
+
CodeRepositoryUtil.cloneRepository({
|
|
290
|
+
repoPath: REPO_PATH,
|
|
291
|
+
repoUrl: "https://github.com/OneUptime/oneuptime.git",
|
|
292
|
+
}),
|
|
293
|
+
).resolves.toBe("oneuptime");
|
|
294
|
+
});
|
|
295
|
+
|
|
296
|
+
it("derives the folder name from an https URL with no .git suffix", async () => {
|
|
297
|
+
await expect(
|
|
298
|
+
CodeRepositoryUtil.cloneRepository({
|
|
299
|
+
repoPath: REPO_PATH,
|
|
300
|
+
repoUrl: "https://github.com/OneUptime/oneuptime",
|
|
301
|
+
}),
|
|
302
|
+
).resolves.toBe("oneuptime");
|
|
303
|
+
});
|
|
304
|
+
|
|
305
|
+
it("ignores a trailing slash", async () => {
|
|
306
|
+
await expect(
|
|
307
|
+
CodeRepositoryUtil.cloneRepository({
|
|
308
|
+
repoPath: REPO_PATH,
|
|
309
|
+
repoUrl: "https://github.com/OneUptime/oneuptime/",
|
|
310
|
+
}),
|
|
311
|
+
).resolves.toBe("oneuptime");
|
|
312
|
+
});
|
|
313
|
+
|
|
314
|
+
it("derives the folder name from an scp-style SSH URL", async () => {
|
|
315
|
+
await expect(
|
|
316
|
+
CodeRepositoryUtil.cloneRepository({
|
|
317
|
+
repoPath: REPO_PATH,
|
|
318
|
+
repoUrl: "git@github.com:OneUptime/oneuptime.git",
|
|
319
|
+
}),
|
|
320
|
+
).resolves.toBe("oneuptime");
|
|
321
|
+
});
|
|
322
|
+
|
|
323
|
+
it("strips the .git suffix case-insensitively", async () => {
|
|
324
|
+
await expect(
|
|
325
|
+
CodeRepositoryUtil.cloneRepository({
|
|
326
|
+
repoPath: REPO_PATH,
|
|
327
|
+
repoUrl: "https://github.com/OneUptime/oneuptime.GIT",
|
|
328
|
+
}),
|
|
329
|
+
).resolves.toBe("oneuptime");
|
|
330
|
+
});
|
|
331
|
+
|
|
332
|
+
/*
|
|
333
|
+
* Returning "" here would have the caller build paths against the repo
|
|
334
|
+
* root itself, so this fails loudly instead.
|
|
335
|
+
*/
|
|
336
|
+
it("refuses a URL it cannot derive a folder name from", async () => {
|
|
337
|
+
await expect(
|
|
338
|
+
CodeRepositoryUtil.cloneRepository({
|
|
339
|
+
repoPath: REPO_PATH,
|
|
340
|
+
repoUrl: "/",
|
|
341
|
+
}),
|
|
342
|
+
).rejects.toThrow("Unable to determine repository folder name");
|
|
343
|
+
});
|
|
344
|
+
});
|
|
345
|
+
|
|
346
|
+
describe("paths that are guarded", () => {
|
|
347
|
+
/*
|
|
348
|
+
* These three route through resolvePathWithinRepo, so a path that escapes
|
|
349
|
+
* the repository is refused rather than handed to git or to the
|
|
350
|
+
* filesystem.
|
|
351
|
+
*/
|
|
352
|
+
/*
|
|
353
|
+
* getFileContent is not `async`, so the guard throws SYNCHRONOUSLY out of
|
|
354
|
+
* the call rather than rejecting the promise it would otherwise return.
|
|
355
|
+
* Asserting it as a rejection would pass whether or not the guard fired,
|
|
356
|
+
* because the throw escapes before there is a promise to reject.
|
|
357
|
+
*/
|
|
358
|
+
it("refuses to read a file outside the repository", () => {
|
|
359
|
+
expect(() => {
|
|
360
|
+
return CodeRepositoryUtil.getFileContent({
|
|
361
|
+
repoPath: REPO_PATH,
|
|
362
|
+
filePath: "../../etc/passwd",
|
|
363
|
+
});
|
|
364
|
+
}).toThrow("File path is outside the repository");
|
|
365
|
+
|
|
366
|
+
expect(readMock).not.toHaveBeenCalled();
|
|
367
|
+
});
|
|
368
|
+
|
|
369
|
+
it("refuses to stage a file outside the repository", async () => {
|
|
370
|
+
await expect(
|
|
371
|
+
CodeRepositoryUtil.addFilesToGit({
|
|
372
|
+
repoPath: REPO_PATH,
|
|
373
|
+
filePaths: ["../../etc/passwd"],
|
|
374
|
+
}),
|
|
375
|
+
).rejects.toThrow("File path is outside the repository");
|
|
376
|
+
|
|
377
|
+
expect(executeCommandFileMock).not.toHaveBeenCalled();
|
|
378
|
+
});
|
|
379
|
+
|
|
380
|
+
it("refuses to log a file outside the repository", async () => {
|
|
381
|
+
await expect(
|
|
382
|
+
CodeRepositoryUtil.getGitCommitHashForFile({
|
|
383
|
+
repoPath: REPO_PATH,
|
|
384
|
+
filePath: "../../etc/passwd",
|
|
385
|
+
}),
|
|
386
|
+
).rejects.toThrow("File path is outside the repository");
|
|
387
|
+
});
|
|
388
|
+
|
|
389
|
+
it("reads a file inside the repository from its absolute path", async () => {
|
|
390
|
+
readMock.mockResolvedValue("contents" as never);
|
|
391
|
+
|
|
392
|
+
await expect(
|
|
393
|
+
CodeRepositoryUtil.getFileContent({
|
|
394
|
+
repoPath: REPO_PATH,
|
|
395
|
+
filePath: "posts/hello.md",
|
|
396
|
+
}),
|
|
397
|
+
).resolves.toBe("contents");
|
|
398
|
+
|
|
399
|
+
expect(readMock).toHaveBeenCalledWith(
|
|
400
|
+
path.resolve(REPO_PATH, "posts/hello.md"),
|
|
401
|
+
);
|
|
402
|
+
});
|
|
403
|
+
|
|
404
|
+
/*
|
|
405
|
+
* A traversal that lands back inside the repository is not an escape, and
|
|
406
|
+
* refusing it would break a legitimate relative path.
|
|
407
|
+
*/
|
|
408
|
+
it("allows a traversal that resolves back inside the repository", async () => {
|
|
409
|
+
readMock.mockResolvedValue("contents" as never);
|
|
410
|
+
|
|
411
|
+
await expect(
|
|
412
|
+
CodeRepositoryUtil.getFileContent({
|
|
413
|
+
repoPath: REPO_PATH,
|
|
414
|
+
filePath: "posts/../posts/hello.md",
|
|
415
|
+
}),
|
|
416
|
+
).resolves.toBe("contents");
|
|
417
|
+
});
|
|
418
|
+
});
|
|
419
|
+
|
|
420
|
+
describe("addFilesToGit", () => {
|
|
421
|
+
it("stages paths relative to the repository root", async () => {
|
|
422
|
+
await CodeRepositoryUtil.addFilesToGit({
|
|
423
|
+
repoPath: REPO_PATH,
|
|
424
|
+
filePaths: ["posts/a.md", "posts/b.md"],
|
|
425
|
+
});
|
|
426
|
+
|
|
427
|
+
expect(lastCall().args).toEqual(["add", "posts/a.md", "posts/b.md"]);
|
|
428
|
+
});
|
|
429
|
+
|
|
430
|
+
it("accepts a leading slash as repository-relative", async () => {
|
|
431
|
+
await CodeRepositoryUtil.addFilesToGit({
|
|
432
|
+
repoPath: REPO_PATH,
|
|
433
|
+
filePaths: ["/posts/a.md"],
|
|
434
|
+
});
|
|
435
|
+
|
|
436
|
+
expect(lastCall().args).toEqual(["add", "posts/a.md"]);
|
|
437
|
+
});
|
|
438
|
+
|
|
439
|
+
it("skips blank paths", async () => {
|
|
440
|
+
await CodeRepositoryUtil.addFilesToGit({
|
|
441
|
+
repoPath: REPO_PATH,
|
|
442
|
+
filePaths: [" ", "posts/a.md"],
|
|
443
|
+
});
|
|
444
|
+
|
|
445
|
+
expect(lastCall().args).toEqual(["add", "posts/a.md"]);
|
|
446
|
+
});
|
|
447
|
+
|
|
448
|
+
/*
|
|
449
|
+
* `git add` with no pathspec is not a no-op -- it is an error in older git
|
|
450
|
+
* and a full-tree stage in some configurations. Skipping the call is the
|
|
451
|
+
* only safe answer.
|
|
452
|
+
*/
|
|
453
|
+
it("does not run git at all when nothing is left to stage", async () => {
|
|
454
|
+
await CodeRepositoryUtil.addFilesToGit({
|
|
455
|
+
repoPath: REPO_PATH,
|
|
456
|
+
filePaths: ["", " "],
|
|
457
|
+
});
|
|
458
|
+
|
|
459
|
+
expect(executeCommandFileMock).not.toHaveBeenCalled();
|
|
460
|
+
});
|
|
461
|
+
|
|
462
|
+
it("does not run git for an empty list", async () => {
|
|
463
|
+
await CodeRepositoryUtil.addFilesToGit({
|
|
464
|
+
repoPath: REPO_PATH,
|
|
465
|
+
filePaths: [],
|
|
466
|
+
});
|
|
467
|
+
|
|
468
|
+
expect(executeCommandFileMock).not.toHaveBeenCalled();
|
|
469
|
+
});
|
|
470
|
+
});
|
|
471
|
+
|
|
472
|
+
describe("getGitCommitHashForFile", () => {
|
|
473
|
+
it("asks git for the last commit touching that path", async () => {
|
|
474
|
+
executeCommandFileMock.mockResolvedValue("deadbeef\n" as never);
|
|
475
|
+
|
|
476
|
+
await expect(
|
|
477
|
+
CodeRepositoryUtil.getGitCommitHashForFile({
|
|
478
|
+
repoPath: REPO_PATH,
|
|
479
|
+
filePath: "posts/hello.md",
|
|
480
|
+
}),
|
|
481
|
+
).resolves.toBe("deadbeef");
|
|
482
|
+
|
|
483
|
+
expect(lastCall().args).toEqual([
|
|
484
|
+
"log",
|
|
485
|
+
"-1",
|
|
486
|
+
"--pretty=format:%H",
|
|
487
|
+
"./posts/hello.md",
|
|
488
|
+
]);
|
|
489
|
+
});
|
|
490
|
+
|
|
491
|
+
/*
|
|
492
|
+
* The `./` prefix is what stops git reading a path that happens to match a
|
|
493
|
+
* ref name as a revision instead of a file.
|
|
494
|
+
*/
|
|
495
|
+
it("prefixes the pathspec so git cannot read it as a revision", async () => {
|
|
496
|
+
executeCommandFileMock.mockResolvedValue("hash" as never);
|
|
497
|
+
|
|
498
|
+
await CodeRepositoryUtil.getGitCommitHashForFile({
|
|
499
|
+
repoPath: REPO_PATH,
|
|
500
|
+
filePath: "main",
|
|
501
|
+
});
|
|
502
|
+
|
|
503
|
+
expect(lastCall().args[3]).toBe("./main");
|
|
504
|
+
});
|
|
505
|
+
});
|
|
506
|
+
|
|
507
|
+
describe("getCommitAuthorsWithFiles", () => {
|
|
508
|
+
const RECORD: string = "\x1e";
|
|
509
|
+
const UNIT: string = "\x1f";
|
|
510
|
+
|
|
511
|
+
it("asks for non-merge commits with names only", async () => {
|
|
512
|
+
executeCommandFileMock.mockResolvedValue("" as never);
|
|
513
|
+
|
|
514
|
+
await CodeRepositoryUtil.getCommitAuthorsWithFiles({
|
|
515
|
+
repoPath: REPO_PATH,
|
|
516
|
+
});
|
|
517
|
+
|
|
518
|
+
expect(lastCall().args).toEqual([
|
|
519
|
+
"log",
|
|
520
|
+
"--no-merges",
|
|
521
|
+
`--pretty=format:${RECORD}%an${UNIT}%ae`,
|
|
522
|
+
"--name-only",
|
|
523
|
+
]);
|
|
524
|
+
});
|
|
525
|
+
|
|
526
|
+
/*
|
|
527
|
+
* A pathspec has to come after `--`, or a directory whose name matches a
|
|
528
|
+
* branch is read as a revision.
|
|
529
|
+
*/
|
|
530
|
+
it("separates a pathspec from the revision arguments", async () => {
|
|
531
|
+
executeCommandFileMock.mockResolvedValue("" as never);
|
|
532
|
+
|
|
533
|
+
await CodeRepositoryUtil.getCommitAuthorsWithFiles({
|
|
534
|
+
repoPath: REPO_PATH,
|
|
535
|
+
path: "posts",
|
|
536
|
+
});
|
|
537
|
+
|
|
538
|
+
const args: Array<string> = lastCall().args;
|
|
539
|
+
|
|
540
|
+
expect(args[args.length - 2]).toBe("--");
|
|
541
|
+
expect(args[args.length - 1]).toBe("posts");
|
|
542
|
+
});
|
|
543
|
+
|
|
544
|
+
it("raises the output buffer past the default", async () => {
|
|
545
|
+
executeCommandFileMock.mockResolvedValue("" as never);
|
|
546
|
+
|
|
547
|
+
await CodeRepositoryUtil.getCommitAuthorsWithFiles({
|
|
548
|
+
repoPath: REPO_PATH,
|
|
549
|
+
});
|
|
550
|
+
|
|
551
|
+
expect(lastCall().maxBuffer).toBeGreaterThan(1024 * 1024);
|
|
552
|
+
});
|
|
553
|
+
|
|
554
|
+
it("passes a timeout through when one is given", async () => {
|
|
555
|
+
executeCommandFileMock.mockResolvedValue("" as never);
|
|
556
|
+
|
|
557
|
+
await CodeRepositoryUtil.getCommitAuthorsWithFiles({
|
|
558
|
+
repoPath: REPO_PATH,
|
|
559
|
+
timeoutInMS: 5000,
|
|
560
|
+
});
|
|
561
|
+
|
|
562
|
+
expect(lastCall().timeoutInMS).toBe(5000);
|
|
563
|
+
});
|
|
564
|
+
|
|
565
|
+
it("omits the timeout entirely when none is given", async () => {
|
|
566
|
+
executeCommandFileMock.mockResolvedValue("" as never);
|
|
567
|
+
|
|
568
|
+
await CodeRepositoryUtil.getCommitAuthorsWithFiles({
|
|
569
|
+
repoPath: REPO_PATH,
|
|
570
|
+
});
|
|
571
|
+
|
|
572
|
+
expect(lastCall()).not.toHaveProperty("timeoutInMS");
|
|
573
|
+
});
|
|
574
|
+
|
|
575
|
+
it("parses author and files out of one commit", async () => {
|
|
576
|
+
executeCommandFileMock.mockResolvedValue(
|
|
577
|
+
`${RECORD}Ada Lovelace${UNIT}ada@example.com\nposts/a.md\nposts/b.md\n` as never,
|
|
578
|
+
);
|
|
579
|
+
|
|
580
|
+
await expect(
|
|
581
|
+
CodeRepositoryUtil.getCommitAuthorsWithFiles({ repoPath: REPO_PATH }),
|
|
582
|
+
).resolves.toEqual([
|
|
583
|
+
{
|
|
584
|
+
authorName: "Ada Lovelace",
|
|
585
|
+
authorEmail: "ada@example.com",
|
|
586
|
+
files: ["posts/a.md", "posts/b.md"],
|
|
587
|
+
},
|
|
588
|
+
]);
|
|
589
|
+
});
|
|
590
|
+
|
|
591
|
+
it("parses several commits", async () => {
|
|
592
|
+
executeCommandFileMock.mockResolvedValue(
|
|
593
|
+
(`${RECORD}A${UNIT}a@example.com\nx.md\n` +
|
|
594
|
+
(`${RECORD}B${UNIT}b@example.com\ny.md\n` as string)) as never,
|
|
595
|
+
);
|
|
596
|
+
|
|
597
|
+
const commits: Array<{ authorName: string }> =
|
|
598
|
+
await CodeRepositoryUtil.getCommitAuthorsWithFiles({
|
|
599
|
+
repoPath: REPO_PATH,
|
|
600
|
+
});
|
|
601
|
+
|
|
602
|
+
expect(commits).toHaveLength(2);
|
|
603
|
+
expect(commits[0]?.authorName).toBe("A");
|
|
604
|
+
expect(commits[1]?.authorName).toBe("B");
|
|
605
|
+
});
|
|
606
|
+
|
|
607
|
+
it("keeps a commit that changed no files", async () => {
|
|
608
|
+
executeCommandFileMock.mockResolvedValue(
|
|
609
|
+
`${RECORD}A${UNIT}a@example.com\n` as never,
|
|
610
|
+
);
|
|
611
|
+
|
|
612
|
+
await expect(
|
|
613
|
+
CodeRepositoryUtil.getCommitAuthorsWithFiles({ repoPath: REPO_PATH }),
|
|
614
|
+
).resolves.toEqual([
|
|
615
|
+
{ authorName: "A", authorEmail: "a@example.com", files: [] },
|
|
616
|
+
]);
|
|
617
|
+
});
|
|
618
|
+
|
|
619
|
+
it("returns nothing for an empty log", async () => {
|
|
620
|
+
executeCommandFileMock.mockResolvedValue("" as never);
|
|
621
|
+
|
|
622
|
+
await expect(
|
|
623
|
+
CodeRepositoryUtil.getCommitAuthorsWithFiles({ repoPath: REPO_PATH }),
|
|
624
|
+
).resolves.toEqual([]);
|
|
625
|
+
});
|
|
626
|
+
|
|
627
|
+
it("survives a header with no email", async () => {
|
|
628
|
+
executeCommandFileMock.mockResolvedValue(
|
|
629
|
+
`${RECORD}OnlyName\nx.md\n` as never,
|
|
630
|
+
);
|
|
631
|
+
|
|
632
|
+
await expect(
|
|
633
|
+
CodeRepositoryUtil.getCommitAuthorsWithFiles({ repoPath: REPO_PATH }),
|
|
634
|
+
).resolves.toEqual([
|
|
635
|
+
{ authorName: "OnlyName", authorEmail: "", files: ["x.md"] },
|
|
636
|
+
]);
|
|
637
|
+
});
|
|
638
|
+
});
|
|
639
|
+
|
|
640
|
+
describe("filesystem helpers", () => {
|
|
641
|
+
it("writes a file under the repository path", async () => {
|
|
642
|
+
await CodeRepositoryUtil.writeToFile({
|
|
643
|
+
repoPath: REPO_PATH,
|
|
644
|
+
filePath: "posts/a.md",
|
|
645
|
+
content: "body",
|
|
646
|
+
});
|
|
647
|
+
|
|
648
|
+
expect(writeMock).toHaveBeenCalledWith(`${REPO_PATH}/posts/a.md`, "body");
|
|
649
|
+
});
|
|
650
|
+
|
|
651
|
+
/*
|
|
652
|
+
* The repo path and the file path are joined with a slash, so a file path
|
|
653
|
+
* that already starts with one would otherwise produce a doubled
|
|
654
|
+
* separator.
|
|
655
|
+
*/
|
|
656
|
+
it("collapses the doubled separator from a rooted file path", async () => {
|
|
657
|
+
await CodeRepositoryUtil.writeToFile({
|
|
658
|
+
repoPath: REPO_PATH,
|
|
659
|
+
filePath: "/posts/a.md",
|
|
660
|
+
content: "body",
|
|
661
|
+
});
|
|
662
|
+
|
|
663
|
+
expect(writeMock).toHaveBeenCalledWith(`${REPO_PATH}/posts/a.md`, "body");
|
|
664
|
+
});
|
|
665
|
+
|
|
666
|
+
it("deletes a file under the repository path", async () => {
|
|
667
|
+
await CodeRepositoryUtil.deleteFile({
|
|
668
|
+
repoPath: REPO_PATH,
|
|
669
|
+
filePath: "posts/a.md",
|
|
670
|
+
});
|
|
671
|
+
|
|
672
|
+
expect(deleteFileMock).toHaveBeenCalledWith(`${REPO_PATH}/posts/a.md`);
|
|
673
|
+
});
|
|
674
|
+
|
|
675
|
+
it("lists a directory by entry name", async () => {
|
|
676
|
+
readDirectoryMock.mockResolvedValue([
|
|
677
|
+
{ name: "a.md" },
|
|
678
|
+
{ name: "b.md" },
|
|
679
|
+
] as never);
|
|
680
|
+
|
|
681
|
+
await expect(
|
|
682
|
+
CodeRepositoryUtil.listFilesInDirectory({
|
|
683
|
+
repoPath: REPO_PATH,
|
|
684
|
+
directoryPath: "posts",
|
|
685
|
+
}),
|
|
686
|
+
).resolves.toEqual(["a.md", "b.md"]);
|
|
687
|
+
});
|
|
688
|
+
});
|
|
689
|
+
});
|