@oneuptime/common 14.0.3 → 14.0.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/Models/DatabaseModels/Alert.ts +55 -0
- package/Models/DatabaseModels/DatabaseServer.ts +1650 -0
- package/Models/DatabaseModels/DatabaseServerEndpoint.ts +540 -0
- package/Models/DatabaseModels/DatabaseServerFeed.ts +625 -0
- package/Models/DatabaseModels/DatabaseServerLabelRule.ts +514 -0
- package/Models/DatabaseModels/DatabaseServerOwnerRule.ts +596 -0
- package/Models/DatabaseModels/DatabaseServerOwnerTeam.ts +491 -0
- package/Models/DatabaseModels/DatabaseServerOwnerUser.ts +490 -0
- package/Models/DatabaseModels/Incident.ts +55 -0
- package/Models/DatabaseModels/Index.ts +16 -0
- package/Models/DatabaseModels/NetworkDeviceDiscoveryScan.ts +26 -0
- package/Models/DatabaseModels/ScheduledMaintenance.ts +55 -0
- package/Models/DatabaseModels/TelemetryException.ts +2 -0
- package/Models/DatabaseModels/UserProjectSsoConsent.ts +146 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1795000000000-AddDatabaseServerTables.ts +673 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1795100000000-AddUserProjectSsoConsent.ts +51 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts +4 -0
- package/Server/Middleware/MultipartFormData.ts +1 -1
- package/Server/Middleware/TelemetryIngest.ts +15 -8
- package/Server/Services/AlertReminderRuleService.ts +100 -24
- package/Server/Services/DatabaseServerEndpointService.ts +895 -0
- package/Server/Services/DatabaseServerFeedService.ts +128 -0
- package/Server/Services/DatabaseServerLabelRuleEngineService.ts +340 -0
- package/Server/Services/DatabaseServerLabelRuleService.ts +14 -0
- package/Server/Services/DatabaseServerOwnerRuleEngineService.ts +425 -0
- package/Server/Services/DatabaseServerOwnerRuleService.ts +14 -0
- package/Server/Services/DatabaseServerOwnerTeamService.ts +180 -0
- package/Server/Services/DatabaseServerOwnerUserService.ts +173 -0
- package/Server/Services/DatabaseServerService.ts +4546 -0
- package/Server/Services/DatabaseService.ts +14 -8
- package/Server/Services/DockerResourceService.ts +43 -2
- package/Server/Services/IncidentReminderRuleService.ts +103 -23
- package/Server/Services/Index.ts +16 -0
- package/Server/Services/InventoryItemService.ts +113 -5
- package/Server/Services/IoTDeviceService.ts +145 -37
- package/Server/Services/MetricService.ts +1 -1
- package/Server/Services/OpenTelemetryIngestService.ts +19 -0
- package/Server/Services/PodmanResourceService.ts +43 -2
- package/Server/Services/ScheduledMaintenanceReminderRuleService.ts +107 -23
- package/Server/Services/ServiceService.ts +1 -1
- package/Server/Services/TelemetryUsageBillingService.ts +29 -2
- package/Server/Services/UserProjectSsoConsentService.ts +74 -0
- package/Server/Services/UserService.ts +14 -1
- package/Server/Types/Database/Permissions/OwnerTableRegistry.ts +18 -0
- package/Server/Types/Database/QueryHelper.ts +84 -2
- package/Server/Utils/AI/Toolbox/MetricTools.ts +13 -2
- package/Server/Utils/AI/Toolbox/ResourceTools.ts +81 -2
- package/Server/Utils/AnalyticsDatabase/StatementGenerator.ts +1 -1
- package/Server/Utils/Database/AffectedResourceRelations.ts +6 -0
- package/Server/Utils/Monitor/Criteria/CompareCriteria.ts +33 -0
- package/Server/Utils/Monitor/Criteria/MetricMonitorCriteria.ts +192 -9
- package/Server/Utils/Monitor/MonitorAlert.ts +28 -1
- package/Server/Utils/Monitor/MonitorCriteriaEvaluator.ts +2264 -755
- package/Server/Utils/Monitor/MonitorIncident.ts +28 -1
- package/Server/Utils/Monitor/MonitorMaintenanceSuppression.ts +268 -6
- package/Server/Utils/Monitor/MonitorResource.ts +47 -11
- package/Server/Utils/Monitor/MonitorResourceContext.ts +1 -0
- package/Server/Utils/Monitor/MonitorStepResourceIdentity.ts +239 -21
- package/Server/Utils/Monitor/PerSeriesResolutionRootCause.ts +43 -0
- package/Server/Utils/Monitor/SeriesResourceLabels.ts +291 -0
- package/Server/Utils/Monitor/SeriesResourceLinker.ts +111 -12
- package/Server/Utils/Rules/RuleRun/RuleRunRegistry.ts +25 -0
- package/Server/Utils/StartServer.ts +26 -6
- package/Server/Utils/TeamMember/ProjectLeaveResourceCleanup.ts +2 -0
- package/Server/Utils/Telemetry/DatabaseEndpointDiscovery.ts +688 -0
- package/Server/Utils/Telemetry/EntityRegistry.ts +5 -1
- package/Server/Utils/Telemetry/LogExceptionExtractor.ts +18 -1
- package/Server/Utils/Telemetry/ResourceEntityFilter.ts +175 -12
- package/Server/Utils/Telemetry/ResourceFacetResolver.ts +12 -0
- package/Server/Utils/Telemetry/ServiceDependencyDiscovery.ts +606 -36
- package/Server/Utils/Telemetry/Telemetry.ts +16 -0
- package/Server/Utils/Telemetry/TelemetryEntity.ts +22 -22
- package/Server/Utils/Telemetry/TelemetryIngestionKeyGuard.ts +16 -10
- package/Tests/App/Accounts/SignedInRedirect.test.tsx +241 -0
- package/Tests/App/AdminDashboard/AdminHeaderSmallScreens.test.tsx +221 -4
- package/Tests/App/Dashboard/AIInsightsResourcePageContext.test.ts +42 -0
- package/Tests/App/Dashboard/AffectedResourcesDisplay.test.tsx +100 -0
- package/Tests/App/Dashboard/AffectedResourcesPicker.test.tsx +86 -0
- package/Tests/App/Dashboard/AffectedResourcesPickerHiddenTypes.test.tsx +2 -0
- package/Tests/App/Dashboard/AffectedResourcesSummaryStep.test.tsx +19 -0
- package/Tests/App/Dashboard/BreadcrumbCoverage.test.tsx +14 -0
- package/Tests/App/Dashboard/CorrelateFilterBuilder.test.tsx +26 -1
- package/Tests/App/Dashboard/DashboardAppSsoError.test.tsx +501 -0
- package/Tests/App/Dashboard/DashboardHeaderRequests.test.tsx +64 -1
- package/Tests/App/Dashboard/DashboardHeaderSmallScreens.test.tsx +178 -18
- package/Tests/App/Dashboard/DashboardMasterPageSsoRedirect.test.tsx +444 -0
- package/Tests/App/Dashboard/DashboardNavBarForeignHiddenRule.test.tsx +573 -0
- package/Tests/App/Dashboard/DatabaseChartAxes.test.tsx +431 -0
- package/Tests/App/Dashboard/DatabaseContainerDetailBadge.test.tsx +249 -0
- package/Tests/App/Dashboard/DatabaseDashboardE2EFixes.test.ts +681 -0
- package/Tests/App/Dashboard/DatabaseDocumentationMarkdown.test.ts +1801 -0
- package/Tests/App/Dashboard/DatabaseFleetSummaryRefresh.test.tsx +280 -0
- package/Tests/App/Dashboard/DatabaseFormHelpers.test.tsx +321 -0
- package/Tests/App/Dashboard/DatabaseMetricMonitorLink.test.tsx +795 -0
- package/Tests/App/Dashboard/DatabaseOverviewHeader.test.tsx +580 -0
- package/Tests/App/Dashboard/DatabaseRecommendationsEngineMetrics.test.ts +270 -0
- package/Tests/App/Dashboard/DatabaseServerComponents.test.tsx +1486 -0
- package/Tests/App/Dashboard/DatabaseServerEngineMetricsFilter.test.ts +223 -0
- package/Tests/App/Dashboard/DatabaseServerPresentation.test.ts +435 -0
- package/Tests/App/Dashboard/DatabaseServerSummary.test.ts +186 -0
- package/Tests/App/Dashboard/DatabaseServerTelemetryQueries.test.ts +1553 -0
- package/Tests/App/Dashboard/DatabaseTableTruncation.test.tsx +326 -0
- package/Tests/App/Dashboard/DatabaseTelemetryScope.test.ts +512 -0
- package/Tests/App/Dashboard/DatabaseTelemetryTabs.test.tsx +774 -0
- package/Tests/App/Dashboard/DatabaseViewLayout.test.tsx +233 -0
- package/Tests/App/Dashboard/DatabaseWorkloadBadge.test.tsx +972 -0
- package/Tests/App/Dashboard/DiscoveryReviewInventoryRefresh.test.tsx +5 -0
- package/Tests/App/Dashboard/DiscoveryReviewUnnamedHostHint.test.tsx +1061 -0
- package/Tests/App/Dashboard/EventOverlayScope.test.ts +147 -0
- package/Tests/App/Dashboard/EventOverlayScopeHook.test.tsx +1 -0
- package/Tests/App/Dashboard/LogsResourceFacetChips.test.tsx +1 -0
- package/Tests/App/Dashboard/MetricsViewerDrillDown.test.tsx +310 -0
- package/Tests/App/Dashboard/MetricsViewerEntityScopedRows.test.tsx +495 -0
- package/Tests/App/Dashboard/MonitorCreateFromMonitorBackedDevice.test.tsx +132 -1
- package/Tests/App/Dashboard/NavigationSearchKeywords.test.tsx +5 -0
- package/Tests/App/Dashboard/NetworkTopologyExplorerSearch.test.tsx +1267 -0
- package/Tests/App/Dashboard/ProductOrientation.test.tsx +4 -3
- package/Tests/App/Dashboard/RecommendationsLoadedContext.test.tsx +349 -0
- package/Tests/App/Dashboard/ResourceArchiveSettings.test.tsx +62 -0
- package/Tests/App/Dashboard/ResourceFeedPageWiring.test.ts +8 -1
- package/Tests/App/Dashboard/ResourceFeedPagesFilterSort.test.tsx +14 -0
- package/Tests/App/Dashboard/ResourceOverviewTileTooltips.test.tsx +4 -1
- package/Tests/App/Dashboard/RumOverviewPage.test.tsx +127 -0
- package/Tests/App/Dashboard/ScheduledMaintenanceOverviewPage.test.tsx +2 -0
- package/Tests/App/Dashboard/ServiceMapDatabaseLink.test.tsx +1085 -0
- package/Tests/App/Dashboard/SiteSearchBox.test.tsx +2110 -0
- package/Tests/App/Dashboard/TelemetryMetricsSignals.test.ts +168 -8
- package/Tests/App/Dashboard/TelemetryResourceRetentionSettings.test.tsx +10 -0
- package/Tests/App/Dashboard/TracesResourceFacets.test.tsx +2 -1
- package/Tests/App/StatusPage/StatusPageHeaderForeignHiddenRule.test.tsx +284 -0
- package/Tests/ClassStrings.ts +178 -0
- package/Tests/Fixtures/MobilePasskeyUser.json +1 -2
- package/Tests/ForeignHiddenRuleGuard.ts +2152 -0
- package/Tests/Models/DatabaseModels/DatabaseServerModels.test.ts +2250 -0
- package/Tests/Models/DatabaseModels/ResourceFeedModels.test.ts +24 -5
- package/Tests/Models/DatabaseModels/StaticRuleCriteriaInheritance.test.ts +4 -2
- package/Tests/RenderedMarkup.ts +518 -0
- package/Tests/ResponsiveVisibility.test.ts +490 -4
- package/Tests/ResponsiveVisibility.ts +505 -52
- package/Tests/Server/Infrastructure/Postgres/AddConfigurableRuleCriteriaMigration.test.ts +3 -0
- package/Tests/Server/Infrastructure/Postgres/AddDatabaseServerTablesMigration.test.ts +541 -0
- package/Tests/Server/Infrastructure/Postgres/AddUserProjectSsoConsentMigration.test.ts +234 -0
- package/Tests/Server/Services/ContainerSnapshotUpsertPostgres.test.ts +319 -0
- package/Tests/Server/Services/CrossProjectRelationWriteGuard.test.ts +13 -0
- package/Tests/Server/Services/DatabaseServerEndpointService.test.ts +2033 -0
- package/Tests/Server/Services/DatabaseServerFeedAndOwnerServices.test.ts +529 -0
- package/Tests/Server/Services/DatabaseServerLifecycle.test.ts +3302 -0
- package/Tests/Server/Services/DatabaseServerRegistries.test.ts +603 -0
- package/Tests/Server/Services/DatabaseServerRuleEngines.test.ts +754 -0
- package/Tests/Server/Services/DatabaseServerService.test.ts +3558 -0
- package/Tests/Server/Services/DatabaseServerSqlPostgres.test.ts +2045 -0
- package/Tests/Server/Services/DatabaseServiceUpdateColumnsIfUnlockedPostgres.test.ts +362 -0
- package/Tests/Server/Services/DatabaseServiceUpdateColumnsIfUnlockedReply.test.ts +210 -0
- package/Tests/Server/Services/HookFreeWriteLengthClamp.test.ts +18 -0
- package/Tests/Server/Services/IncidentAlertSloLinkSurvivesEdit.test.ts +2 -0
- package/Tests/Server/Services/IncomingCallPolicyEscalationRuleTarget.test.ts +225 -0
- package/Tests/Server/Services/InventoryItemDisplayName.test.ts +280 -2
- package/Tests/Server/Services/InventoryUpsertSchemaParity.test.ts +8 -2
- package/Tests/Server/Services/IoTDeviceLatestMetricsPostgres.test.ts +689 -0
- package/Tests/Server/Services/IoTDeviceService.test.ts +379 -0
- package/Tests/Server/Services/LatestMetricsValuesShape.test.ts +360 -0
- package/Tests/Server/Services/LlmModelPriceService.test.ts +402 -0
- package/Tests/Server/Services/MetricServiceAggregate.test.ts +12 -0
- package/Tests/Server/Services/OpenTelemetryResourceRetentionMemo.test.ts +7 -1
- package/Tests/Server/Services/OwnerRowUniqueness.test.ts +61 -9
- package/Tests/Server/Services/ReminderRuleLookupPostgres.test.ts +2250 -0
- package/Tests/Server/Services/ReminderRuleRefreshOpenSubjectsPaging.test.ts +653 -0
- package/Tests/Server/Services/ResourceUpdateLastSeenLivenessFallback.test.ts +68 -20
- package/Tests/Server/Services/SavedViewDefaults.test.ts +325 -0
- package/Tests/Server/Services/StaticRuleCriteriaRuntimeCoverage.test.ts +3 -3
- package/Tests/Server/Services/StatusPageCertificateService.test.ts +169 -0
- package/Tests/Server/Services/TeamComplianceSettingService.test.ts +191 -0
- package/Tests/Server/Services/TelemetryResourceFacetCounting.test.ts +9 -0
- package/Tests/Server/Services/UserProjectSsoConsentPostgres.test.ts +153 -0
- package/Tests/Server/Services/UserProjectSsoConsentService.test.ts +192 -0
- package/Tests/Server/Services/UserServiceFirstMasterAdminElection.test.ts +71 -0
- package/Tests/Server/Services/UserSignupIdTakeoverPostgres.test.ts +238 -0
- package/Tests/Server/Services/WorkspaceNotificationSummaryHelpers.test.ts +592 -0
- package/Tests/Server/Types/Billing/PayAsYouGoMeteredAuthorization.test.ts +3 -0
- package/Tests/Server/Types/Database/EventOverlayScopePostgres.test.ts +1 -0
- package/Tests/Server/Types/Database/FeedEventTypeFilterQuery.test.ts +11 -0
- package/Tests/Server/Types/Database/Permissions/InfrastructureOwnershipScope.test.ts +8 -0
- package/Tests/Server/Types/Database/QueryHelperBooleanForCriteriaBackedRule.test.ts +1094 -0
- package/Tests/Server/Types/Database/QueryHelperSearchAllWords.test.ts +651 -0
- package/Tests/Server/Utils/AI/AlertWriteTools.test.ts +256 -0
- package/Tests/Server/Utils/AI/IncidentWriteTools.test.ts +482 -0
- package/Tests/Server/Utils/AI/ResourceTools.test.ts +134 -0
- package/Tests/Server/Utils/Monitor/Criteria/CompareCriteria.test.ts +54 -0
- package/Tests/Server/Utils/Monitor/Criteria/MetricMonitorCriteria.test.ts +41 -0
- package/Tests/Server/Utils/Monitor/Criteria/MetricMonitorCriteriaAnomalyUnits.test.ts +279 -9
- package/Tests/Server/Utils/Monitor/Criteria/MetricMonitorCriteriaDisplayContext.test.ts +933 -0
- package/Tests/Server/Utils/Monitor/DatabaseMaintenanceSuppression.test.ts +582 -0
- package/Tests/Server/Utils/Monitor/DatabaseServerMonitorLinking.test.ts +753 -0
- package/Tests/Server/Utils/Monitor/MetricDecimalThreshold.test.ts +417 -0
- package/Tests/Server/Utils/Monitor/MonitorActionTimestamps.test.ts +1 -0
- package/Tests/Server/Utils/Monitor/MonitorAlertCriteriaReferences.test.ts +1 -0
- package/Tests/Server/Utils/Monitor/MonitorAlertResourceLinking.test.ts +119 -0
- package/Tests/Server/Utils/Monitor/MonitorCriteriaEvaluator.test.ts +60 -25
- package/Tests/Server/Utils/Monitor/MonitorCriteriaEvaluatorAffectedResourceEdgeCases.test.ts +1815 -0
- package/Tests/Server/Utils/Monitor/MonitorCriteriaEvaluatorKubernetesAffectedResources.test.ts +1447 -0
- package/Tests/Server/Utils/Monitor/MonitorCriteriaEvaluatorKubernetesRatioEmail.test.ts +352 -0
- package/Tests/Server/Utils/Monitor/MonitorCriteriaEvaluatorPlatformMetricUnits.test.ts +717 -0
- package/Tests/Server/Utils/Monitor/MonitorCriteriaEvaluatorPlatformRawScan.test.ts +2125 -0
- package/Tests/Server/Utils/Monitor/MonitorCriteriaEvaluatorPlatformSeriesAffectedResources.test.ts +1288 -0
- package/Tests/Server/Utils/Monitor/MonitorDependencySuppressionCreatorSkip.test.ts +1 -0
- package/Tests/Server/Utils/Monitor/MonitorIncidentCriteriaReferences.test.ts +1 -0
- package/Tests/Server/Utils/Monitor/MonitorIncidentMemberRoleMembership.test.ts +1 -0
- package/Tests/Server/Utils/Monitor/MonitorIncidentResourceLinking.test.ts +88 -0
- package/Tests/Server/Utils/Monitor/MonitorMaintenanceSuppression.test.ts +205 -0
- package/Tests/Server/Utils/Monitor/MonitorResourceContext.test.ts +62 -0
- package/Tests/Server/Utils/Monitor/MonitorResourceDatabaseMaintenance.test.ts +803 -0
- package/Tests/Server/Utils/Monitor/MonitorStepResourceIdentity.test.ts +133 -3
- package/Tests/Server/Utils/Monitor/MonitorSummaryPersistence.test.ts +1 -0
- package/Tests/Server/Utils/Monitor/PerSeriesRecoveryResolution.test.ts +472 -1
- package/Tests/Server/Utils/Monitor/PerSeriesSecondEntityAlerting.test.ts +1 -0
- package/Tests/Server/Utils/Monitor/SeriesResourceLinker.test.ts +236 -2
- package/Tests/Server/Utils/SeriesResourceLabels.test.ts +70 -0
- package/Tests/Server/Utils/StartServerProtobufContentType.test.ts +54 -0
- package/Tests/Server/Utils/Telemetry/DatabaseEndpointDiscovery.test.ts +1895 -0
- package/Tests/Server/Utils/Telemetry/EntityRegistry.test.ts +7 -0
- package/Tests/Server/Utils/Telemetry/LogExceptionExtractorSeverityGate.test.ts +90 -0
- package/Tests/Server/Utils/Telemetry/ResourceEntityFilter.test.ts +570 -0
- package/Tests/Server/Utils/Telemetry/ResourceFacetResolver.test.ts +97 -2
- package/Tests/Server/Utils/Telemetry/ServiceDependencyDiscovery.test.ts +1337 -0
- package/Tests/Server/Utils/Telemetry/TelemetryEntity.test.ts +295 -0
- package/Tests/Types/AI/AIResourceContext.test.ts +30 -0
- package/Tests/Types/BaseDatabase/AggregationType.test.ts +5 -1
- package/Tests/Types/Dashboard/KubernetesDashboardTemplate.test.ts +184 -0
- package/Tests/Types/Dashboard/KubernetesDashboardTemplates.test.ts +107 -0
- package/Tests/Types/DatabaseServer/DatabaseContainerClassifier.test.ts +3644 -0
- package/Tests/Types/DatabaseServer/DatabaseContainerCommand.test.ts +340 -0
- package/Tests/Types/DatabaseServer/DatabaseContainerCommandCorpus.ts +826 -0
- package/Tests/Types/DatabaseServer/DatabaseContainerCommandPostgres.test.ts +150 -0
- package/Tests/Types/DatabaseServer/DatabaseEndpoint.test.ts +2657 -0
- package/Tests/Types/DatabaseServer/DatabaseServerDiscoverySource.test.ts +64 -0
- package/Tests/Types/DatabaseServer/DatabaseServerEntityKeys.test.ts +952 -0
- package/Tests/Types/DatabaseServer/DatabaseServerMetricCatalog.test.ts +1161 -0
- package/Tests/Types/DatabaseServer/DatabaseSystem.test.ts +1514 -0
- package/Tests/Types/DatabaseServer/DatabaseTelemetryResolver.test.ts +1558 -0
- package/Tests/Types/Monitor/CephAlertTemplates.test.ts +255 -6
- package/Tests/Types/Monitor/DatabaseAlertTemplates.test.ts +2254 -0
- package/Tests/Types/Monitor/KubernetesAlertTemplates.test.ts +292 -0
- package/Tests/Types/Monitor/KubernetesMetricCatalog.test.ts +272 -0
- package/Tests/Types/Monitor/Recommendation/MonitorRecommendationCatalog.test.ts +253 -9
- package/Tests/Types/Monitor/Recommendation/MonitorRecommendationCoverage.test.ts +13 -5
- package/Tests/Types/Monitor/Recommendation/MonitorRecommendationNotificationMode.test.ts +4 -2
- package/Tests/Types/Monitor/Recommendation/MonitorRecommendationUtil.test.ts +111 -2
- package/Tests/Types/Monitor/Recommendation/RecommendationCriteriaBuilder.test.ts +61 -0
- package/Tests/Types/Monitor/SeriesContext/SeriesLabelDisplay.test.ts +114 -0
- package/Tests/Types/Monitor/Utils/KubernetesAgentEmittedMetrics.ts +202 -0
- package/Tests/Types/NetworkDevice/DiscoveredHostNamingStatus.test.ts +401 -0
- package/Tests/Types/Telemetry/ResourceEntityFacet.test.ts +4 -1
- package/Tests/Types/Telemetry/ResourceFacetCatalog.test.ts +24 -2
- package/Tests/UI/Components/Card.test.tsx +93 -2
- package/Tests/UI/Components/FeedOptions.test.ts +6 -0
- package/Tests/UI/Components/FeedOptionsButton.test.tsx +8 -1
- package/Tests/UI/Components/ForeignHiddenRuleResilience.test.tsx +1147 -0
- package/Tests/UI/Components/HeaderRightRail.test.tsx +41 -1
- package/Tests/UI/Components/LogsEntityNames.test.ts +16 -1
- package/Tests/UI/Components/LogsFacetSidebarHiddenFacets.test.tsx +7 -3
- package/Tests/UI/Components/ResourceFacetConfigs.test.ts +2 -1
- package/Tests/UI/Components/RuleCriteria/RuleCriteriaModelTable.test.tsx +3 -3
- package/Tests/UI/Components/SrOnlyForeignRule.test.tsx +994 -0
- package/Tests/UI/Components/StatusPage/ResourceListSelection.test.tsx +34 -1
- package/Tests/UI/Components/TelemetryFacetSidebarHiddenFacets.test.tsx +4 -1
- package/Tests/UI/ForeignHiddenRuleGuard.test.ts +1951 -0
- package/Tests/UI/Rum/ChunkLoader.test.ts +76 -0
- package/Tests/UI/Rum/ReplayPlayerChrome.test.tsx +19 -1
- package/Tests/UI/Rum/ReplayRailDetail.test.tsx +53 -0
- package/Tests/UI/Rum/ReplaySignals.test.ts +54 -0
- package/Tests/UI/Rum/ReplayTabSwitcher.test.tsx +19 -1
- package/Tests/UI/TailwindPlayCdnForeignHiddenRule.test.ts +1005 -0
- package/Tests/UI/ThemeGroupHoverReveal.test.ts +847 -0
- package/Tests/UI/Utils/Breadcrumb/fixtures/RealBreadcrumbTrails.ts +70 -0
- package/Tests/UI/Utils/Breadcrumb/fixtures/RealRoutePatterns.ts +21 -0
- package/Tests/UI/Utils/ModelAPISsoRedirect.test.ts +127 -0
- package/Tests/UI/Utils/Navigation.test.ts +102 -0
- package/Tests/UI/Utils/Telemetry/TelemetryEntityNames.test.ts +23 -0
- package/Tests/Utils/Dashboard/KubernetesClusterCpuTileRepair.test.ts +370 -0
- package/Tests/Utils/LabelRuleImportExport.test.ts +5 -0
- package/Tests/Utils/MetricUnitUtil.test.ts +227 -2
- package/Tests/Utils/Monitor/MetricValueFormatter.test.ts +288 -2
- package/Tests/Utils/Monitor/PlatformResourceIdentityAndUnits.test.ts +1559 -0
- package/Tests/Utils/NetworkDiscovery/DiscoveredHostNamingDiagnosis.test.ts +2546 -0
- package/Tests/Utils/NetworkDiscovery/DiscoveredHostUtil.test.ts +315 -0
- package/Tests/Utils/NetworkDiscovery/DiscoveryReverseDnsChain.test.ts +336 -1
- package/Tests/Utils/NetworkDiscovery/NetbiosNameUtil.test.ts +244 -0
- package/Tests/Utils/Rules/MonitorTypeRuleCriteria.test.ts +181 -0
- package/Tests/Utils/ValueFormatter.test.ts +50 -0
- package/Tests/tsconfig.json +16 -0
- package/Types/AI/AIResourceContext.ts +7 -0
- package/Types/BaseDatabase/AggregationType.ts +7 -0
- package/Types/Dashboard/DashboardTemplates.ts +22 -8
- package/Types/DatabaseServer/DatabaseConnectionSpan.ts +77 -0
- package/Types/DatabaseServer/DatabaseContainerClassifier.ts +2068 -0
- package/Types/DatabaseServer/DatabaseContainerCommand.ts +801 -0
- package/Types/DatabaseServer/DatabaseEndpoint.ts +1943 -0
- package/Types/DatabaseServer/DatabaseServerDiscoverySource.ts +68 -0
- package/Types/DatabaseServer/DatabaseServerMetricCatalog.ts +966 -0
- package/Types/DatabaseServer/DatabaseSystem.ts +2124 -0
- package/Types/DatabaseServer/DatabaseTelemetryResolver.ts +555 -0
- package/Types/Email/EmailTemplateType.ts +1 -0
- package/Types/Monitor/CephAlertTemplates.ts +18 -0
- package/Types/Monitor/DatabaseAlertTemplates.ts +2020 -0
- package/Types/Monitor/KubernetesAlertTemplates.ts +64 -24
- package/Types/Monitor/KubernetesMetricCatalog.ts +118 -19
- package/Types/Monitor/MetricMonitor/MetricCriteriaContext.ts +14 -0
- package/Types/Monitor/MetricMonitor/MetricMonitorResponse.ts +93 -10
- package/Types/Monitor/Recommendation/MonitorRecommendationCatalog.ts +109 -8
- package/Types/Monitor/Recommendation/MonitorRecommendationTypes.ts +36 -7
- package/Types/Monitor/Recommendation/MonitorRecommendationUtil.ts +43 -2
- package/Types/Monitor/Recommendation/RecommendationCriteriaBuilder.ts +41 -6
- package/Types/Monitor/SeriesContext/SeriesLabelDisplay.ts +26 -0
- package/Types/NetworkDevice/DiscoveredHostNamingStatus.ts +147 -0
- package/Types/Permission.ts +267 -0
- package/Types/Probe/ProbeApiIngestResponse.ts +8 -0
- package/Types/Rules/RuleCriteriaFieldRegistry.ts +10 -0
- package/Types/Rules/RuleRun.ts +12 -0
- package/Types/Rum/SessionReplayCustomEvents.ts +29 -3
- package/Types/Rum/WebVitals.ts +13 -0
- package/Types/Telemetry/EntityType.ts +23 -0
- package/Types/Telemetry/ResourceFacetCatalog.ts +14 -0
- package/Types/Telemetry/ServiceType.ts +8 -0
- package/UI/Components/Banner/Banner.tsx +1 -1
- package/UI/Components/Card/Card.tsx +1 -1
- package/UI/Components/Charts/ChartGroup/ChartGroup.tsx +2 -2
- package/UI/Components/Charts/Line/LineChart.tsx +7 -0
- package/UI/Components/CommandPalette/CommandPalette.tsx +1 -1
- package/UI/Components/Date/StartAndEndDate.tsx +5 -5
- package/UI/Components/Diagram/HorizontalStepChain.tsx +1 -1
- package/UI/Components/Feed/FeedOptionsButton.tsx +1 -1
- package/UI/Components/Forms/BasicForm.tsx +1 -1
- package/UI/Components/Header/Header.tsx +1 -1
- package/UI/Components/Header/HeaderIconDropdownButton.tsx +1 -1
- package/UI/Components/HeaderAlert/HeaderAlert.tsx +1 -1
- package/UI/Components/Input/Input.tsx +11 -0
- package/UI/Components/LogsViewer/components/FacetValueRow.tsx +1 -1
- package/UI/Components/LogsViewer/components/LogsFacetSidebar.tsx +1 -1
- package/UI/Components/Modal/ModalFooter.tsx +1 -1
- package/UI/Components/ModelDetail/CardModelDetail.tsx +2 -2
- package/UI/Components/ModelTable/BaseModelTable.tsx +4 -4
- package/UI/Components/Navbar/NavBar.tsx +9 -2
- package/UI/Components/Navbar/NavBarMenuModal.tsx +2 -2
- package/UI/Components/Page/Page.tsx +1 -1
- package/UI/Components/Pagination/Pagination.tsx +3 -3
- package/UI/Components/ProgressButtons/ProgressButtonItem.tsx +1 -1
- package/UI/Components/SideMenu/SideMenu.tsx +4 -1
- package/UI/Components/StatusPage/ResourceGroupNavigator.tsx +4 -2
- package/UI/Components/StatusPage/ResourceList.tsx +6 -6
- package/UI/Components/TelemetryViewer/components/TelemetryFacetSidebar.tsx +1 -1
- package/UI/Components/TelemetryViewer/components/TelemetryFacetValueRow.tsx +1 -1
- package/UI/Components/Workflow/ColumnEditor/ModelQueryBuilder.tsx +1 -1
- package/UI/Components/Workflow/ComponentsModal.tsx +2 -2
- package/UI/Components/Workflow/StepTraceViewer.tsx +1 -1
- package/UI/Styles/Theme.css +8 -1
- package/UI/Utils/Navigation.ts +89 -42
- package/UI/Utils/Telemetry/TelemetryEntityNames.ts +7 -0
- package/UI/Utils/TelemetryService.ts +4 -3
- package/Utils/Dashboard/KubernetesClusterCpuTileRepair.ts +147 -0
- package/Utils/LabelRuleImportExport.ts +2 -0
- package/Utils/MetricUnitUtil.ts +103 -11
- package/Utils/Monitor/MetricValueFormatter.ts +66 -13
- package/Utils/Monitor/PlatformMetricUnitUtil.ts +215 -0
- package/Utils/Monitor/PlatformResourceIdentity.ts +514 -0
- package/Utils/NetworkDiscovery/DiscoveredHostNamingDiagnosis.ts +425 -0
- package/Utils/NetworkDiscovery/DiscoveredHostUtil.ts +32 -0
- package/Utils/NetworkDiscovery/NetbiosNameUtil.ts +73 -0
- package/Utils/Telemetry/DatabaseServerEntityKeys.ts +275 -0
- package/Utils/Telemetry/EntityKey.ts +176 -0
- package/Utils/ValueFormatter.ts +16 -0
- package/build/dist/Models/DatabaseModels/Alert.js +54 -0
- package/build/dist/Models/DatabaseModels/Alert.js.map +1 -1
- package/build/dist/Models/DatabaseModels/DatabaseServer.js +1683 -0
- package/build/dist/Models/DatabaseModels/DatabaseServer.js.map +1 -0
- package/build/dist/Models/DatabaseModels/DatabaseServerEndpoint.js +559 -0
- package/build/dist/Models/DatabaseModels/DatabaseServerEndpoint.js.map +1 -0
- package/build/dist/Models/DatabaseModels/DatabaseServerFeed.js +648 -0
- package/build/dist/Models/DatabaseModels/DatabaseServerFeed.js.map +1 -0
- package/build/dist/Models/DatabaseModels/DatabaseServerLabelRule.js +522 -0
- package/build/dist/Models/DatabaseModels/DatabaseServerLabelRule.js.map +1 -0
- package/build/dist/Models/DatabaseModels/DatabaseServerOwnerRule.js +603 -0
- package/build/dist/Models/DatabaseModels/DatabaseServerOwnerRule.js.map +1 -0
- package/build/dist/Models/DatabaseModels/DatabaseServerOwnerTeam.js +506 -0
- package/build/dist/Models/DatabaseModels/DatabaseServerOwnerTeam.js.map +1 -0
- package/build/dist/Models/DatabaseModels/DatabaseServerOwnerUser.js +505 -0
- package/build/dist/Models/DatabaseModels/DatabaseServerOwnerUser.js.map +1 -0
- package/build/dist/Models/DatabaseModels/Incident.js +54 -0
- package/build/dist/Models/DatabaseModels/Incident.js.map +1 -1
- package/build/dist/Models/DatabaseModels/Index.js +16 -0
- package/build/dist/Models/DatabaseModels/Index.js.map +1 -1
- package/build/dist/Models/DatabaseModels/NetworkDeviceDiscoveryScan.js.map +1 -1
- package/build/dist/Models/DatabaseModels/ScheduledMaintenance.js +54 -0
- package/build/dist/Models/DatabaseModels/ScheduledMaintenance.js.map +1 -1
- package/build/dist/Models/DatabaseModels/TelemetryException.js +2 -0
- package/build/dist/Models/DatabaseModels/TelemetryException.js.map +1 -1
- package/build/dist/Models/DatabaseModels/UserProjectSsoConsent.js +162 -0
- package/build/dist/Models/DatabaseModels/UserProjectSsoConsent.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1795000000000-AddDatabaseServerTables.js +240 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1795000000000-AddDatabaseServerTables.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1795100000000-AddUserProjectSsoConsent.js +26 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1795100000000-AddUserProjectSsoConsent.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 +1 -1
- package/build/dist/Server/Middleware/TelemetryIngest.js +15 -8
- package/build/dist/Server/Middleware/TelemetryIngest.js.map +1 -1
- package/build/dist/Server/Services/AlertReminderRuleService.js +72 -23
- package/build/dist/Server/Services/AlertReminderRuleService.js.map +1 -1
- package/build/dist/Server/Services/DatabaseServerEndpointService.js +694 -0
- package/build/dist/Server/Services/DatabaseServerEndpointService.js.map +1 -0
- package/build/dist/Server/Services/DatabaseServerFeedService.js +110 -0
- package/build/dist/Server/Services/DatabaseServerFeedService.js.map +1 -0
- package/build/dist/Server/Services/DatabaseServerLabelRuleEngineService.js +272 -0
- package/build/dist/Server/Services/DatabaseServerLabelRuleEngineService.js.map +1 -0
- package/build/dist/Server/Services/DatabaseServerLabelRuleService.js +13 -0
- package/build/dist/Server/Services/DatabaseServerLabelRuleService.js.map +1 -0
- package/build/dist/Server/Services/DatabaseServerOwnerRuleEngineService.js +340 -0
- package/build/dist/Server/Services/DatabaseServerOwnerRuleEngineService.js.map +1 -0
- package/build/dist/Server/Services/DatabaseServerOwnerRuleService.js +13 -0
- package/build/dist/Server/Services/DatabaseServerOwnerRuleService.js.map +1 -0
- package/build/dist/Server/Services/DatabaseServerOwnerTeamService.js +160 -0
- package/build/dist/Server/Services/DatabaseServerOwnerTeamService.js.map +1 -0
- package/build/dist/Server/Services/DatabaseServerOwnerUserService.js +153 -0
- package/build/dist/Server/Services/DatabaseServerOwnerUserService.js.map +1 -0
- package/build/dist/Server/Services/DatabaseServerService.js +3272 -0
- package/build/dist/Server/Services/DatabaseServerService.js.map +1 -0
- package/build/dist/Server/Services/DatabaseService.js +8 -4
- package/build/dist/Server/Services/DatabaseService.js.map +1 -1
- package/build/dist/Server/Services/DockerResourceService.js +30 -3
- package/build/dist/Server/Services/DockerResourceService.js.map +1 -1
- package/build/dist/Server/Services/IncidentReminderRuleService.js +73 -23
- package/build/dist/Server/Services/IncidentReminderRuleService.js.map +1 -1
- package/build/dist/Server/Services/Index.js +16 -0
- package/build/dist/Server/Services/Index.js.map +1 -1
- package/build/dist/Server/Services/InventoryItemService.js +88 -5
- package/build/dist/Server/Services/InventoryItemService.js.map +1 -1
- package/build/dist/Server/Services/IoTDeviceService.js +111 -24
- package/build/dist/Server/Services/IoTDeviceService.js.map +1 -1
- package/build/dist/Server/Services/MetricService.js +1 -1
- package/build/dist/Server/Services/OpenTelemetryIngestService.js +24 -9
- package/build/dist/Server/Services/OpenTelemetryIngestService.js.map +1 -1
- package/build/dist/Server/Services/PodmanResourceService.js +30 -3
- package/build/dist/Server/Services/PodmanResourceService.js.map +1 -1
- package/build/dist/Server/Services/ScheduledMaintenanceReminderRuleService.js +75 -23
- package/build/dist/Server/Services/ScheduledMaintenanceReminderRuleService.js.map +1 -1
- package/build/dist/Server/Services/ServiceService.js +1 -1
- package/build/dist/Server/Services/ServiceService.js.map +1 -1
- package/build/dist/Server/Services/TelemetryUsageBillingService.js +23 -2
- package/build/dist/Server/Services/TelemetryUsageBillingService.js.map +1 -1
- package/build/dist/Server/Services/UserProjectSsoConsentService.js +79 -0
- package/build/dist/Server/Services/UserProjectSsoConsentService.js.map +1 -0
- package/build/dist/Server/Services/UserService.js +13 -1
- package/build/dist/Server/Services/UserService.js.map +1 -1
- package/build/dist/Server/Types/Database/Permissions/OwnerTableRegistry.js +18 -0
- package/build/dist/Server/Types/Database/Permissions/OwnerTableRegistry.js.map +1 -1
- package/build/dist/Server/Types/Database/QueryHelper.js +73 -2
- package/build/dist/Server/Types/Database/QueryHelper.js.map +1 -1
- package/build/dist/Server/Utils/AI/Toolbox/MetricTools.js +13 -2
- package/build/dist/Server/Utils/AI/Toolbox/MetricTools.js.map +1 -1
- package/build/dist/Server/Utils/AI/Toolbox/ResourceTools.js +58 -1
- package/build/dist/Server/Utils/AI/Toolbox/ResourceTools.js.map +1 -1
- package/build/dist/Server/Utils/AnalyticsDatabase/StatementGenerator.js +1 -1
- package/build/dist/Server/Utils/Database/AffectedResourceRelations.js +6 -0
- package/build/dist/Server/Utils/Database/AffectedResourceRelations.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/Criteria/CompareCriteria.js +31 -0
- package/build/dist/Server/Utils/Monitor/Criteria/CompareCriteria.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/Criteria/MetricMonitorCriteria.js +135 -14
- package/build/dist/Server/Utils/Monitor/Criteria/MetricMonitorCriteria.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorAlert.js +22 -6
- package/build/dist/Server/Utils/Monitor/MonitorAlert.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorCriteriaEvaluator.js +1489 -524
- package/build/dist/Server/Utils/Monitor/MonitorCriteriaEvaluator.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorIncident.js +22 -6
- package/build/dist/Server/Utils/Monitor/MonitorIncident.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorMaintenanceSuppression.js +196 -6
- package/build/dist/Server/Utils/Monitor/MonitorMaintenanceSuppression.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorResource.js +36 -9
- package/build/dist/Server/Utils/Monitor/MonitorResource.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorResourceContext.js +1 -0
- package/build/dist/Server/Utils/Monitor/MonitorResourceContext.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorStepResourceIdentity.js +175 -17
- package/build/dist/Server/Utils/Monitor/MonitorStepResourceIdentity.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/PerSeriesResolutionRootCause.js +29 -0
- package/build/dist/Server/Utils/Monitor/PerSeriesResolutionRootCause.js.map +1 -0
- package/build/dist/Server/Utils/Monitor/SeriesResourceLabels.js +211 -0
- package/build/dist/Server/Utils/Monitor/SeriesResourceLabels.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/SeriesResourceLinker.js +82 -10
- package/build/dist/Server/Utils/Monitor/SeriesResourceLinker.js.map +1 -1
- package/build/dist/Server/Utils/Rules/RuleRun/RuleRunRegistry.js +25 -0
- package/build/dist/Server/Utils/Rules/RuleRun/RuleRunRegistry.js.map +1 -1
- package/build/dist/Server/Utils/StartServer.js +20 -4
- package/build/dist/Server/Utils/StartServer.js.map +1 -1
- package/build/dist/Server/Utils/TeamMember/ProjectLeaveResourceCleanup.js +2 -0
- package/build/dist/Server/Utils/TeamMember/ProjectLeaveResourceCleanup.js.map +1 -1
- package/build/dist/Server/Utils/Telemetry/DatabaseEndpointDiscovery.js +442 -0
- package/build/dist/Server/Utils/Telemetry/DatabaseEndpointDiscovery.js.map +1 -0
- package/build/dist/Server/Utils/Telemetry/EntityRegistry.js +5 -1
- package/build/dist/Server/Utils/Telemetry/EntityRegistry.js.map +1 -1
- package/build/dist/Server/Utils/Telemetry/LogExceptionExtractor.js +15 -1
- package/build/dist/Server/Utils/Telemetry/LogExceptionExtractor.js.map +1 -1
- package/build/dist/Server/Utils/Telemetry/ResourceEntityFilter.js +121 -5
- package/build/dist/Server/Utils/Telemetry/ResourceEntityFilter.js.map +1 -1
- package/build/dist/Server/Utils/Telemetry/ResourceFacetResolver.js +12 -0
- package/build/dist/Server/Utils/Telemetry/ResourceFacetResolver.js.map +1 -1
- package/build/dist/Server/Utils/Telemetry/ServiceDependencyDiscovery.js +438 -36
- package/build/dist/Server/Utils/Telemetry/ServiceDependencyDiscovery.js.map +1 -1
- package/build/dist/Server/Utils/Telemetry/Telemetry.js +12 -0
- package/build/dist/Server/Utils/Telemetry/Telemetry.js.map +1 -1
- package/build/dist/Server/Utils/Telemetry/TelemetryEntity.js +17 -18
- package/build/dist/Server/Utils/Telemetry/TelemetryEntity.js.map +1 -1
- package/build/dist/Server/Utils/Telemetry/TelemetryIngestionKeyGuard.js +16 -10
- package/build/dist/Server/Utils/Telemetry/TelemetryIngestionKeyGuard.js.map +1 -1
- package/build/dist/Types/AI/AIResourceContext.js +7 -0
- package/build/dist/Types/AI/AIResourceContext.js.map +1 -1
- package/build/dist/Types/BaseDatabase/AggregationType.js +7 -0
- package/build/dist/Types/BaseDatabase/AggregationType.js.map +1 -1
- package/build/dist/Types/Dashboard/DashboardTemplates.js +22 -8
- package/build/dist/Types/Dashboard/DashboardTemplates.js.map +1 -1
- package/build/dist/Types/DatabaseServer/DatabaseConnectionSpan.js +71 -0
- package/build/dist/Types/DatabaseServer/DatabaseConnectionSpan.js.map +1 -0
- package/build/dist/Types/DatabaseServer/DatabaseContainerClassifier.js +1462 -0
- package/build/dist/Types/DatabaseServer/DatabaseContainerClassifier.js.map +1 -0
- package/build/dist/Types/DatabaseServer/DatabaseContainerCommand.js +691 -0
- package/build/dist/Types/DatabaseServer/DatabaseContainerCommand.js.map +1 -0
- package/build/dist/Types/DatabaseServer/DatabaseEndpoint.js +1407 -0
- package/build/dist/Types/DatabaseServer/DatabaseEndpoint.js.map +1 -0
- package/build/dist/Types/DatabaseServer/DatabaseServerDiscoverySource.js +60 -0
- package/build/dist/Types/DatabaseServer/DatabaseServerDiscoverySource.js.map +1 -0
- package/build/dist/Types/DatabaseServer/DatabaseServerMetricCatalog.js +804 -0
- package/build/dist/Types/DatabaseServer/DatabaseServerMetricCatalog.js.map +1 -0
- package/build/dist/Types/DatabaseServer/DatabaseSystem.js +1860 -0
- package/build/dist/Types/DatabaseServer/DatabaseSystem.js.map +1 -0
- package/build/dist/Types/DatabaseServer/DatabaseTelemetryResolver.js +406 -0
- package/build/dist/Types/DatabaseServer/DatabaseTelemetryResolver.js.map +1 -0
- package/build/dist/Types/Email/EmailTemplateType.js +1 -0
- package/build/dist/Types/Email/EmailTemplateType.js.map +1 -1
- package/build/dist/Types/Monitor/CephAlertTemplates.js +18 -0
- package/build/dist/Types/Monitor/CephAlertTemplates.js.map +1 -1
- package/build/dist/Types/Monitor/DatabaseAlertTemplates.js +1518 -0
- package/build/dist/Types/Monitor/DatabaseAlertTemplates.js.map +1 -0
- package/build/dist/Types/Monitor/KubernetesAlertTemplates.js +57 -24
- package/build/dist/Types/Monitor/KubernetesAlertTemplates.js.map +1 -1
- package/build/dist/Types/Monitor/KubernetesMetricCatalog.js +104 -18
- package/build/dist/Types/Monitor/KubernetesMetricCatalog.js.map +1 -1
- package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationCatalog.js +80 -3
- package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationCatalog.js.map +1 -1
- package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationTypes.js +10 -3
- package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationTypes.js.map +1 -1
- package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationUtil.js +29 -0
- package/build/dist/Types/Monitor/Recommendation/MonitorRecommendationUtil.js.map +1 -1
- package/build/dist/Types/Monitor/Recommendation/RecommendationCriteriaBuilder.js +21 -6
- package/build/dist/Types/Monitor/Recommendation/RecommendationCriteriaBuilder.js.map +1 -1
- package/build/dist/Types/Monitor/SeriesContext/SeriesLabelDisplay.js +25 -0
- package/build/dist/Types/Monitor/SeriesContext/SeriesLabelDisplay.js.map +1 -1
- package/build/dist/Types/NetworkDevice/DiscoveredHostNamingStatus.js +136 -0
- package/build/dist/Types/NetworkDevice/DiscoveredHostNamingStatus.js.map +1 -0
- package/build/dist/Types/Permission.js +234 -0
- package/build/dist/Types/Permission.js.map +1 -1
- package/build/dist/Types/Rules/RuleCriteriaFieldRegistry.js +10 -0
- package/build/dist/Types/Rules/RuleCriteriaFieldRegistry.js.map +1 -1
- package/build/dist/Types/Rules/RuleRun.js +4 -0
- package/build/dist/Types/Rules/RuleRun.js.map +1 -1
- package/build/dist/Types/Rum/SessionReplayCustomEvents.js.map +1 -1
- package/build/dist/Types/Rum/WebVitals.js +12 -0
- package/build/dist/Types/Rum/WebVitals.js.map +1 -1
- package/build/dist/Types/Telemetry/EntityType.js +23 -0
- package/build/dist/Types/Telemetry/EntityType.js.map +1 -1
- package/build/dist/Types/Telemetry/ResourceFacetCatalog.js +14 -0
- package/build/dist/Types/Telemetry/ResourceFacetCatalog.js.map +1 -1
- package/build/dist/Types/Telemetry/ServiceType.js +8 -0
- package/build/dist/Types/Telemetry/ServiceType.js.map +1 -1
- package/build/dist/UI/Components/Banner/Banner.js +1 -1
- package/build/dist/UI/Components/Banner/Banner.js.map +1 -1
- package/build/dist/UI/Components/Card/Card.js +1 -1
- package/build/dist/UI/Components/Card/Card.js.map +1 -1
- package/build/dist/UI/Components/Charts/ChartGroup/ChartGroup.js +2 -2
- package/build/dist/UI/Components/Charts/ChartGroup/ChartGroup.js.map +1 -1
- package/build/dist/UI/Components/Charts/Line/LineChart.js +1 -1
- package/build/dist/UI/Components/Charts/Line/LineChart.js.map +1 -1
- package/build/dist/UI/Components/CommandPalette/CommandPalette.js +1 -1
- package/build/dist/UI/Components/CommandPalette/CommandPalette.js.map +1 -1
- package/build/dist/UI/Components/Date/StartAndEndDate.js +5 -5
- package/build/dist/UI/Components/Date/StartAndEndDate.js.map +1 -1
- package/build/dist/UI/Components/Diagram/HorizontalStepChain.js +1 -1
- package/build/dist/UI/Components/Diagram/HorizontalStepChain.js.map +1 -1
- package/build/dist/UI/Components/Feed/FeedOptionsButton.js +1 -1
- package/build/dist/UI/Components/Feed/FeedOptionsButton.js.map +1 -1
- package/build/dist/UI/Components/Forms/BasicForm.js +1 -1
- package/build/dist/UI/Components/Forms/BasicForm.js.map +1 -1
- package/build/dist/UI/Components/Header/HeaderIconDropdownButton.js +1 -1
- package/build/dist/UI/Components/Header/HeaderIconDropdownButton.js.map +1 -1
- package/build/dist/UI/Components/HeaderAlert/HeaderAlert.js +1 -1
- package/build/dist/UI/Components/HeaderAlert/HeaderAlert.js.map +1 -1
- package/build/dist/UI/Components/Input/Input.js +1 -1
- package/build/dist/UI/Components/Input/Input.js.map +1 -1
- package/build/dist/UI/Components/LogsViewer/components/FacetValueRow.js +1 -1
- package/build/dist/UI/Components/LogsViewer/components/FacetValueRow.js.map +1 -1
- package/build/dist/UI/Components/LogsViewer/components/LogsFacetSidebar.js +1 -1
- package/build/dist/UI/Components/LogsViewer/components/LogsFacetSidebar.js.map +1 -1
- package/build/dist/UI/Components/Modal/ModalFooter.js +1 -1
- package/build/dist/UI/Components/Modal/ModalFooter.js.map +1 -1
- package/build/dist/UI/Components/ModelDetail/CardModelDetail.js +2 -2
- package/build/dist/UI/Components/ModelDetail/CardModelDetail.js.map +1 -1
- package/build/dist/UI/Components/ModelTable/BaseModelTable.js +4 -4
- package/build/dist/UI/Components/ModelTable/BaseModelTable.js.map +1 -1
- package/build/dist/UI/Components/Navbar/NavBar.js +9 -2
- package/build/dist/UI/Components/Navbar/NavBar.js.map +1 -1
- package/build/dist/UI/Components/Navbar/NavBarMenuModal.js +2 -2
- package/build/dist/UI/Components/Navbar/NavBarMenuModal.js.map +1 -1
- package/build/dist/UI/Components/Page/Page.js +1 -1
- package/build/dist/UI/Components/Page/Page.js.map +1 -1
- package/build/dist/UI/Components/Pagination/Pagination.js +3 -3
- package/build/dist/UI/Components/Pagination/Pagination.js.map +1 -1
- package/build/dist/UI/Components/ProgressButtons/ProgressButtonItem.js +1 -1
- package/build/dist/UI/Components/ProgressButtons/ProgressButtonItem.js.map +1 -1
- package/build/dist/UI/Components/SideMenu/SideMenu.js +4 -1
- package/build/dist/UI/Components/SideMenu/SideMenu.js.map +1 -1
- package/build/dist/UI/Components/StatusPage/ResourceGroupNavigator.js +3 -1
- package/build/dist/UI/Components/StatusPage/ResourceGroupNavigator.js.map +1 -1
- package/build/dist/UI/Components/StatusPage/ResourceList.js +6 -6
- package/build/dist/UI/Components/StatusPage/ResourceList.js.map +1 -1
- package/build/dist/UI/Components/TelemetryViewer/components/TelemetryFacetSidebar.js +1 -1
- package/build/dist/UI/Components/TelemetryViewer/components/TelemetryFacetSidebar.js.map +1 -1
- package/build/dist/UI/Components/TelemetryViewer/components/TelemetryFacetValueRow.js +1 -1
- package/build/dist/UI/Components/TelemetryViewer/components/TelemetryFacetValueRow.js.map +1 -1
- package/build/dist/UI/Components/Workflow/ColumnEditor/ModelQueryBuilder.js +1 -1
- package/build/dist/UI/Components/Workflow/ColumnEditor/ModelQueryBuilder.js.map +1 -1
- package/build/dist/UI/Components/Workflow/ComponentsModal.js +2 -2
- package/build/dist/UI/Components/Workflow/ComponentsModal.js.map +1 -1
- package/build/dist/UI/Components/Workflow/StepTraceViewer.js +1 -1
- package/build/dist/UI/Components/Workflow/StepTraceViewer.js.map +1 -1
- package/build/dist/UI/Utils/Navigation.js +66 -33
- package/build/dist/UI/Utils/Navigation.js.map +1 -1
- package/build/dist/UI/Utils/Telemetry/TelemetryEntityNames.js +7 -0
- package/build/dist/UI/Utils/Telemetry/TelemetryEntityNames.js.map +1 -1
- package/build/dist/UI/Utils/TelemetryService.js +3 -2
- package/build/dist/UI/Utils/TelemetryService.js.map +1 -1
- package/build/dist/Utils/Dashboard/KubernetesClusterCpuTileRepair.js +110 -0
- package/build/dist/Utils/Dashboard/KubernetesClusterCpuTileRepair.js.map +1 -0
- package/build/dist/Utils/LabelRuleImportExport.js +2 -0
- package/build/dist/Utils/LabelRuleImportExport.js.map +1 -1
- package/build/dist/Utils/MetricUnitUtil.js +77 -13
- package/build/dist/Utils/MetricUnitUtil.js.map +1 -1
- package/build/dist/Utils/Monitor/MetricValueFormatter.js +58 -13
- package/build/dist/Utils/Monitor/MetricValueFormatter.js.map +1 -1
- package/build/dist/Utils/Monitor/PlatformMetricUnitUtil.js +161 -0
- package/build/dist/Utils/Monitor/PlatformMetricUnitUtil.js.map +1 -0
- package/build/dist/Utils/Monitor/PlatformResourceIdentity.js +323 -0
- package/build/dist/Utils/Monitor/PlatformResourceIdentity.js.map +1 -0
- package/build/dist/Utils/NetworkDiscovery/DiscoveredHostNamingDiagnosis.js +270 -0
- package/build/dist/Utils/NetworkDiscovery/DiscoveredHostNamingDiagnosis.js.map +1 -0
- package/build/dist/Utils/NetworkDiscovery/DiscoveredHostUtil.js +23 -0
- package/build/dist/Utils/NetworkDiscovery/DiscoveredHostUtil.js.map +1 -1
- package/build/dist/Utils/NetworkDiscovery/NetbiosNameUtil.js +61 -0
- package/build/dist/Utils/NetworkDiscovery/NetbiosNameUtil.js.map +1 -1
- package/build/dist/Utils/Telemetry/DatabaseServerEntityKeys.js +178 -0
- package/build/dist/Utils/Telemetry/DatabaseServerEntityKeys.js.map +1 -0
- package/build/dist/Utils/Telemetry/EntityKey.js +133 -0
- package/build/dist/Utils/Telemetry/EntityKey.js.map +1 -1
- package/build/dist/Utils/ValueFormatter.js +15 -0
- package/build/dist/Utils/ValueFormatter.js.map +1 -1
- package/package.json +1 -1
- package/tsconfig.tests.json +7 -5
|
@@ -0,0 +1,847 @@
|
|
|
1
|
+
import {
|
|
2
|
+
afterEach,
|
|
3
|
+
beforeAll,
|
|
4
|
+
beforeEach,
|
|
5
|
+
describe,
|
|
6
|
+
expect,
|
|
7
|
+
test,
|
|
8
|
+
} from "@jest/globals";
|
|
9
|
+
import fs from "fs";
|
|
10
|
+
import path from "path";
|
|
11
|
+
import {
|
|
12
|
+
ClassCandidate,
|
|
13
|
+
collectClassCandidates,
|
|
14
|
+
describeCandidate,
|
|
15
|
+
} from "../ClassStrings";
|
|
16
|
+
import {
|
|
17
|
+
listScanRoots,
|
|
18
|
+
listSourceFiles,
|
|
19
|
+
toRelativePath,
|
|
20
|
+
} from "../ForeignHiddenRuleGuard";
|
|
21
|
+
import { splitVariants } from "../ResponsiveVisibility";
|
|
22
|
+
import { StyleRule, THEME_RULES } from "./Styles/ThemeStylesheet";
|
|
23
|
+
|
|
24
|
+
/*
|
|
25
|
+
* The dark theme brightens the gray text of a hover reveal while its group is
|
|
26
|
+
* hovered: the facet rows' exclude button and the Profiles hint are
|
|
27
|
+
* text-gray-400 at rest, and Theme.css lifts them to the primary text colour
|
|
28
|
+
* on hover, keyed on attribute substrings -
|
|
29
|
+
*
|
|
30
|
+
* html.dark .group:hover [class*="group-hover"][class*="text-gray-"]
|
|
31
|
+
*
|
|
32
|
+
* The foreign `.hidden{display:none !important}` fix rewrote those reveals
|
|
33
|
+
* from `hidden group-hover:flex` to `flex group-[:not(:hover)]:hidden`, which
|
|
34
|
+
* no longer contains "group-hover". Nothing failed: the elements still showed
|
|
35
|
+
* on hover, only in the wrong colour, and only in dark mode. Review caught it
|
|
36
|
+
* and Theme.css gained a twin selector keyed on "group-[:not(:hover)".
|
|
37
|
+
*
|
|
38
|
+
* These pin that twin from both ends. The sheet has to brighten both shapes
|
|
39
|
+
* with one declaration, and every hover reveal in the source that carries a
|
|
40
|
+
* gray text class has to match one of the rule's substring pairs - so a later
|
|
41
|
+
* rewrite of either the markup or the rule cannot quietly change the colour
|
|
42
|
+
* again. The reveals are found by walking the same trees the foreign-rule
|
|
43
|
+
* guard reads (ForeignHiddenRuleGuard.ts), not by listing them, and the three
|
|
44
|
+
* known ones are checked to be among what the walk found. The class strings
|
|
45
|
+
* come out of each module through ClassStrings.ts, which fills every
|
|
46
|
+
* template's branches in, so a reveal assembled in a template is read whole.
|
|
47
|
+
*
|
|
48
|
+
* jsdom then gives a second opinion: every selector in the sheet it can
|
|
49
|
+
* evaluate is matched against the converted element and against the class it
|
|
50
|
+
* replaced, and the two must be painted by the same declarations. jsdom
|
|
51
|
+
* cannot model :hover - nwsapi drops the pseudo-class entirely while the
|
|
52
|
+
* document has never had focus, and never matches it once something has been
|
|
53
|
+
* focused, because jsdom has no hovered element - so the `.group:hover` gate
|
|
54
|
+
* is taken off before matching and asserted textually instead, and selectors
|
|
55
|
+
* that need some other state (:focus, a pseudo-element, a rule nwsapi cannot
|
|
56
|
+
* parse) are left out. It is the attribute part, which is what the
|
|
57
|
+
* conversion changed, that jsdom answers.
|
|
58
|
+
*/
|
|
59
|
+
|
|
60
|
+
// packages/Common/Tests/UI -> the repository root.
|
|
61
|
+
const REPOSITORY_ROOT: string = path.resolve(__dirname, "..", "..", "..", "..");
|
|
62
|
+
|
|
63
|
+
// Exactly as Theme.css spells them.
|
|
64
|
+
const GROUP_HOVER_BRIGHTEN_SELECTOR: string =
|
|
65
|
+
'html.dark .group:hover [class*="group-hover"][class*="text-gray-"]';
|
|
66
|
+
const NEGATED_HOVER_BRIGHTEN_SELECTOR: string =
|
|
67
|
+
'html.dark .group:hover [class*="group-[:not(:hover)"][class*="text-gray-"]';
|
|
68
|
+
|
|
69
|
+
const GROUP_HOVER_GATE: string = "html.dark .group:hover ";
|
|
70
|
+
|
|
71
|
+
// The substring the review found missing.
|
|
72
|
+
const NEGATED_HOVER_SUBSTRING: string = "group-[:not(:hover)";
|
|
73
|
+
|
|
74
|
+
// The converted reveals, relative to the repository root.
|
|
75
|
+
const FACET_VALUE_ROW_FILE: string =
|
|
76
|
+
"packages/Common/UI/Components/LogsViewer/components/FacetValueRow.tsx";
|
|
77
|
+
const TELEMETRY_FACET_VALUE_ROW_FILE: string =
|
|
78
|
+
"packages/Common/UI/Components/TelemetryViewer/components/TelemetryFacetValueRow.tsx";
|
|
79
|
+
const PROFILES_DASHBOARD_FILE: string =
|
|
80
|
+
"packages/App/FeatureSet/Dashboard/src/Components/Profiles/ProfilesDashboard.tsx";
|
|
81
|
+
|
|
82
|
+
const KNOWN_REVEAL_FILES: Array<string> = [
|
|
83
|
+
FACET_VALUE_ROW_FILE,
|
|
84
|
+
TELEMETRY_FACET_VALUE_ROW_FILE,
|
|
85
|
+
PROFILES_DASHBOARD_FILE,
|
|
86
|
+
];
|
|
87
|
+
|
|
88
|
+
// The facet rows' exclude button after the fix, and before it (git 17084e6b23).
|
|
89
|
+
const CONVERTED_FACET_EXCLUDE_CLASS: string =
|
|
90
|
+
"flex h-5 w-5 items-center justify-center rounded text-[10px] text-gray-400 transition-colors hover:bg-red-50 hover:text-red-500 group-[:not(:hover)]:hidden";
|
|
91
|
+
const PRE_FIX_FACET_EXCLUDE_CLASS: string =
|
|
92
|
+
"hidden h-5 w-5 items-center justify-center rounded text-[10px] text-gray-400 transition-colors hover:bg-red-50 hover:text-red-500 group-hover:flex";
|
|
93
|
+
|
|
94
|
+
// The Profiles hint with the template's non-highlighted branch filled in.
|
|
95
|
+
const CONVERTED_PROFILES_HINT_CLASS: string =
|
|
96
|
+
"flex-shrink-0 text-[10px] text-gray-400 inline group-[:not(:hover)]:hidden";
|
|
97
|
+
const PRE_FIX_PROFILES_HINT_CLASS: string =
|
|
98
|
+
"flex-shrink-0 text-[10px] text-gray-400 hidden group-hover:inline";
|
|
99
|
+
|
|
100
|
+
// Kept in step with the list in ResponsiveVisibility.ts.
|
|
101
|
+
const DISPLAY_UTILITIES: ReadonlySet<string> = new Set<string>([
|
|
102
|
+
"block",
|
|
103
|
+
"inline-block",
|
|
104
|
+
"inline",
|
|
105
|
+
"flex",
|
|
106
|
+
"inline-flex",
|
|
107
|
+
"table",
|
|
108
|
+
"inline-table",
|
|
109
|
+
"table-caption",
|
|
110
|
+
"table-cell",
|
|
111
|
+
"table-column",
|
|
112
|
+
"table-column-group",
|
|
113
|
+
"table-footer-group",
|
|
114
|
+
"table-header-group",
|
|
115
|
+
"table-row-group",
|
|
116
|
+
"table-row",
|
|
117
|
+
"flow-root",
|
|
118
|
+
"grid",
|
|
119
|
+
"inline-grid",
|
|
120
|
+
"contents",
|
|
121
|
+
"list-item",
|
|
122
|
+
]);
|
|
123
|
+
|
|
124
|
+
// A selector tail made only of `[class*="..."]` tests.
|
|
125
|
+
const ATTRIBUTE_SUBSTRINGS_ONLY: RegExp = /^(?:\[class\*="[^"]*"\])+$/;
|
|
126
|
+
|
|
127
|
+
// `group-[:not(:hover)]`, `group-[:not(:hover):not(:focus-within)]` ...
|
|
128
|
+
const NEGATED_GROUP_HOVER_VARIANT: RegExp = /^group-\[.*:not\(:hover\).*\]$/;
|
|
129
|
+
|
|
130
|
+
const GRAY_TEXT_UTILITY: RegExp = /^text-gray-\d+/;
|
|
131
|
+
|
|
132
|
+
/* ------------------------------------------------------------------------ */
|
|
133
|
+
/* Theme.css */
|
|
134
|
+
/* ------------------------------------------------------------------------ */
|
|
135
|
+
|
|
136
|
+
/*
|
|
137
|
+
* ThemeStylesheet splits a prelude on every comma, including the ones inside
|
|
138
|
+
* :is(...), so a rule's selector list is rebuilt here and split only on the
|
|
139
|
+
* commas at the top level.
|
|
140
|
+
*/
|
|
141
|
+
function splitSelectorList(selectorText: string): Array<string> {
|
|
142
|
+
const selectors: Array<string> = [];
|
|
143
|
+
let depth: number = 0;
|
|
144
|
+
let quote: string | null = null;
|
|
145
|
+
let current: string = "";
|
|
146
|
+
|
|
147
|
+
for (const character of selectorText) {
|
|
148
|
+
if (quote) {
|
|
149
|
+
if (character === quote) {
|
|
150
|
+
quote = null;
|
|
151
|
+
}
|
|
152
|
+
} else if (character === '"' || character === "'") {
|
|
153
|
+
quote = character;
|
|
154
|
+
} else if (character === "(" || character === "[") {
|
|
155
|
+
depth++;
|
|
156
|
+
} else if (character === ")" || character === "]") {
|
|
157
|
+
depth = Math.max(0, depth - 1);
|
|
158
|
+
} else if (character === "," && depth === 0) {
|
|
159
|
+
selectors.push(current.replace(/\s+/g, " ").trim());
|
|
160
|
+
current = "";
|
|
161
|
+
continue;
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
current += character;
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
selectors.push(current.replace(/\s+/g, " ").trim());
|
|
168
|
+
|
|
169
|
+
return selectors.filter(Boolean);
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
function selectorsOf(rule: StyleRule): Array<string> {
|
|
173
|
+
return splitSelectorList(rule.selectors.join(","));
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
function rulesWithSelector(
|
|
177
|
+
rules: Array<StyleRule>,
|
|
178
|
+
selector: string,
|
|
179
|
+
): Array<StyleRule> {
|
|
180
|
+
return rules.filter((rule: StyleRule): boolean => {
|
|
181
|
+
return selectorsOf(rule).includes(selector);
|
|
182
|
+
});
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
// Every declaration the sheet gives the selector, in source order.
|
|
186
|
+
function declarationsFor(
|
|
187
|
+
rules: Array<StyleRule>,
|
|
188
|
+
selector: string,
|
|
189
|
+
): Record<string, string> {
|
|
190
|
+
const declarations: Record<string, string> = {};
|
|
191
|
+
|
|
192
|
+
for (const rule of rulesWithSelector(rules, selector)) {
|
|
193
|
+
Object.assign(declarations, rule.declarations);
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
return declarations;
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
/*
|
|
200
|
+
* The substrings a `GATE [class*="a"][class*="b"]...` selector requires of
|
|
201
|
+
* the class attribute, or null for a selector of any other shape.
|
|
202
|
+
*/
|
|
203
|
+
function requiredSubstrings(selector: string): Array<string> | null {
|
|
204
|
+
if (!selector.startsWith(GROUP_HOVER_GATE)) {
|
|
205
|
+
return null;
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
const attributePart: string = selector.slice(GROUP_HOVER_GATE.length);
|
|
209
|
+
|
|
210
|
+
if (!ATTRIBUTE_SUBSTRINGS_ONLY.test(attributePart)) {
|
|
211
|
+
return null;
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
return Array.from(
|
|
215
|
+
attributePart.matchAll(/\[class\*="([^"]*)"\]/g),
|
|
216
|
+
(match: RegExpMatchArray): string => {
|
|
217
|
+
return match[1]!;
|
|
218
|
+
},
|
|
219
|
+
);
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
/*
|
|
223
|
+
* The substring pairs of the rule that brightens a group-hover reveal: every
|
|
224
|
+
* gated attribute-substring selector in the rule(s) that carry the original
|
|
225
|
+
* group-hover selector.
|
|
226
|
+
*/
|
|
227
|
+
function brightenSubstringSets(rules: Array<StyleRule>): Array<Array<string>> {
|
|
228
|
+
const sets: Array<Array<string>> = [];
|
|
229
|
+
|
|
230
|
+
for (const rule of rulesWithSelector(rules, GROUP_HOVER_BRIGHTEN_SELECTOR)) {
|
|
231
|
+
for (const selector of selectorsOf(rule)) {
|
|
232
|
+
const substrings: Array<string> | null = requiredSubstrings(selector);
|
|
233
|
+
|
|
234
|
+
if (substrings) {
|
|
235
|
+
sets.push(substrings);
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
return sets;
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
// `[class*="x"]` is a plain substring test on the whole attribute value.
|
|
244
|
+
function isBrightened(
|
|
245
|
+
classAttribute: string,
|
|
246
|
+
substringSets: Array<Array<string>>,
|
|
247
|
+
): boolean {
|
|
248
|
+
return substringSets.some((substrings: Array<string>): boolean => {
|
|
249
|
+
return substrings.every((substring: string): boolean => {
|
|
250
|
+
return classAttribute.includes(substring);
|
|
251
|
+
});
|
|
252
|
+
});
|
|
253
|
+
}
|
|
254
|
+
|
|
255
|
+
/*
|
|
256
|
+
* The sheet as it stood when review found the regression: the same rules,
|
|
257
|
+
* minus every selector keyed on the negated-hover substring.
|
|
258
|
+
*/
|
|
259
|
+
function withoutNegatedHoverSelectors(
|
|
260
|
+
rules: Array<StyleRule>,
|
|
261
|
+
): Array<StyleRule> {
|
|
262
|
+
return rules.map((rule: StyleRule): StyleRule => {
|
|
263
|
+
return {
|
|
264
|
+
...rule,
|
|
265
|
+
selectors: selectorsOf(rule).filter((selector: string): boolean => {
|
|
266
|
+
return !selector.includes(NEGATED_HOVER_SUBSTRING);
|
|
267
|
+
}),
|
|
268
|
+
};
|
|
269
|
+
});
|
|
270
|
+
}
|
|
271
|
+
|
|
272
|
+
/* ------------------------------------------------------------------------ */
|
|
273
|
+
/* Source */
|
|
274
|
+
/* ------------------------------------------------------------------------ */
|
|
275
|
+
|
|
276
|
+
function tokensOf(classText: string): Array<string> {
|
|
277
|
+
return classText.split(/\s+/).filter(Boolean);
|
|
278
|
+
}
|
|
279
|
+
|
|
280
|
+
/*
|
|
281
|
+
* `group-[:not(:hover)]:hidden` and the like: a group-hover reveal written so
|
|
282
|
+
* the foreign rule cannot pin it shut. Only the unnamed group counts - the
|
|
283
|
+
* Theme.css rule is gated on `.group:hover`, which a named group
|
|
284
|
+
* (`group/nav-row`, revealed by `group-[...]/nav-row:hidden`) never matches.
|
|
285
|
+
*/
|
|
286
|
+
function isGroupHoverReveal(token: string): boolean {
|
|
287
|
+
const parts: Array<string> = splitVariants(token);
|
|
288
|
+
|
|
289
|
+
return (
|
|
290
|
+
parts.length === 2 &&
|
|
291
|
+
parts[1] === "hidden" &&
|
|
292
|
+
NEGATED_GROUP_HOVER_VARIANT.test(parts[0]!)
|
|
293
|
+
);
|
|
294
|
+
}
|
|
295
|
+
|
|
296
|
+
interface RevealScan {
|
|
297
|
+
reveals: Array<ClassCandidate>;
|
|
298
|
+
filesRead: number;
|
|
299
|
+
}
|
|
300
|
+
|
|
301
|
+
/*
|
|
302
|
+
* Every class string in the browser source that reveals an element on group
|
|
303
|
+
* hover, found by walking the same trees the foreign-rule guard reads.
|
|
304
|
+
*/
|
|
305
|
+
function findGroupHoverReveals(): RevealScan {
|
|
306
|
+
const reveals: Array<ClassCandidate> = [];
|
|
307
|
+
let filesRead: number = 0;
|
|
308
|
+
|
|
309
|
+
for (const root of listScanRoots(REPOSITORY_ROOT)) {
|
|
310
|
+
for (const filePath of listSourceFiles(root)) {
|
|
311
|
+
filesRead++;
|
|
312
|
+
const sourceText: string = fs.readFileSync(filePath, "utf8");
|
|
313
|
+
|
|
314
|
+
if (!sourceText.includes(":not(:hover)")) {
|
|
315
|
+
continue;
|
|
316
|
+
}
|
|
317
|
+
|
|
318
|
+
const relativePath: string = toRelativePath(REPOSITORY_ROOT, filePath);
|
|
319
|
+
|
|
320
|
+
for (const candidate of collectClassCandidates(
|
|
321
|
+
relativePath,
|
|
322
|
+
sourceText,
|
|
323
|
+
)) {
|
|
324
|
+
if (tokensOf(candidate.classText).some(isGroupHoverReveal)) {
|
|
325
|
+
reveals.push(candidate);
|
|
326
|
+
}
|
|
327
|
+
}
|
|
328
|
+
}
|
|
329
|
+
}
|
|
330
|
+
|
|
331
|
+
return { reveals: reveals, filesRead: filesRead };
|
|
332
|
+
}
|
|
333
|
+
|
|
334
|
+
/*
|
|
335
|
+
* Put the pre-fix idiom back: the element's own display utility becomes the
|
|
336
|
+
* bare `hidden` it replaced, and the negated-hover hide becomes the
|
|
337
|
+
* `group-hover:<display>` that used to show it. Every converted reveal was
|
|
338
|
+
* written that way before the fix, so this rebuilds the old class exactly.
|
|
339
|
+
*/
|
|
340
|
+
function restorePreFixHoverReveal(classText: string): string {
|
|
341
|
+
const tokens: Array<string> = tokensOf(classText);
|
|
342
|
+
const revealIndex: number = tokens.findIndex(isGroupHoverReveal);
|
|
343
|
+
const displayIndex: number = tokens.findIndex((token: string): boolean => {
|
|
344
|
+
return DISPLAY_UTILITIES.has(token);
|
|
345
|
+
});
|
|
346
|
+
|
|
347
|
+
if (revealIndex === -1 || displayIndex === -1) {
|
|
348
|
+
return classText;
|
|
349
|
+
}
|
|
350
|
+
|
|
351
|
+
const display: string = tokens[displayIndex]!;
|
|
352
|
+
tokens[displayIndex] = "hidden";
|
|
353
|
+
tokens[revealIndex] = `group-hover:${display}`;
|
|
354
|
+
|
|
355
|
+
return tokens.join(" ");
|
|
356
|
+
}
|
|
357
|
+
|
|
358
|
+
function hasGrayText(classText: string): boolean {
|
|
359
|
+
return tokensOf(classText).some((token: string): boolean => {
|
|
360
|
+
return GRAY_TEXT_UTILITY.test(splitVariants(token).pop()!);
|
|
361
|
+
});
|
|
362
|
+
}
|
|
363
|
+
|
|
364
|
+
/* ------------------------------------------------------------------------ */
|
|
365
|
+
/* jsdom */
|
|
366
|
+
/* ------------------------------------------------------------------------ */
|
|
367
|
+
|
|
368
|
+
const USER_ACTION_PSEUDO_CLASS: RegExp =
|
|
369
|
+
/:(?:hover|active|focus|focus-within|focus-visible|visited)\b/;
|
|
370
|
+
|
|
371
|
+
/*
|
|
372
|
+
* The selector with its `.group:hover` gate reduced to `.group`, or null when
|
|
373
|
+
* something jsdom cannot answer is left in it (another user-action
|
|
374
|
+
* pseudo-class, or a pseudo-element). Quoted attribute values are left alone:
|
|
375
|
+
* `[class*="group-[:not(:hover)"]` is a substring, not a pseudo-class.
|
|
376
|
+
*/
|
|
377
|
+
function withoutHoverGate(selector: string): string | null {
|
|
378
|
+
const pieces: Array<string> = selector.split(/("[^"]*"|'[^']*')/);
|
|
379
|
+
let rewritten: string = "";
|
|
380
|
+
|
|
381
|
+
for (let index: number = 0; index < pieces.length; index++) {
|
|
382
|
+
const piece: string = pieces[index]!;
|
|
383
|
+
|
|
384
|
+
if (index % 2 === 1) {
|
|
385
|
+
rewritten += piece;
|
|
386
|
+
continue;
|
|
387
|
+
}
|
|
388
|
+
|
|
389
|
+
const ungated: string = piece.replace(/\.group:hover(?![\w-])/g, ".group");
|
|
390
|
+
|
|
391
|
+
if (USER_ACTION_PSEUDO_CLASS.test(ungated) || ungated.includes("::")) {
|
|
392
|
+
return null;
|
|
393
|
+
}
|
|
394
|
+
|
|
395
|
+
rewritten += ungated;
|
|
396
|
+
}
|
|
397
|
+
|
|
398
|
+
return rewritten;
|
|
399
|
+
}
|
|
400
|
+
|
|
401
|
+
interface EvaluableRule {
|
|
402
|
+
selector: string;
|
|
403
|
+
declarations: Record<string, string>;
|
|
404
|
+
}
|
|
405
|
+
|
|
406
|
+
interface EvaluableSheet {
|
|
407
|
+
rules: Array<EvaluableRule>;
|
|
408
|
+
/*
|
|
409
|
+
* Selectors jsdom cannot answer: another user-action state, a
|
|
410
|
+
* pseudo-element, or syntax nwsapi rejects (:fullscreen, some :is(...)).
|
|
411
|
+
*/
|
|
412
|
+
skipped: number;
|
|
413
|
+
}
|
|
414
|
+
|
|
415
|
+
/*
|
|
416
|
+
* Every selector in the sheet that jsdom can evaluate once the `.group:hover`
|
|
417
|
+
* gate is lifted - the whole sheet, not just the brighten rule, so a rule
|
|
418
|
+
* that painted the old element and not the new one cannot hide anywhere
|
|
419
|
+
* jsdom can see.
|
|
420
|
+
*/
|
|
421
|
+
function jsdomEvaluableSheet(rules: Array<StyleRule>): EvaluableSheet {
|
|
422
|
+
const evaluable: Array<EvaluableRule> = [];
|
|
423
|
+
let skipped: number = 0;
|
|
424
|
+
|
|
425
|
+
for (const rule of rules) {
|
|
426
|
+
for (const selector of selectorsOf(rule)) {
|
|
427
|
+
const ungated: string | null = withoutHoverGate(selector);
|
|
428
|
+
|
|
429
|
+
if (!ungated) {
|
|
430
|
+
skipped++;
|
|
431
|
+
continue;
|
|
432
|
+
}
|
|
433
|
+
|
|
434
|
+
try {
|
|
435
|
+
document.documentElement.matches(ungated);
|
|
436
|
+
} catch {
|
|
437
|
+
skipped++;
|
|
438
|
+
continue;
|
|
439
|
+
}
|
|
440
|
+
|
|
441
|
+
evaluable.push({ selector: ungated, declarations: rule.declarations });
|
|
442
|
+
}
|
|
443
|
+
}
|
|
444
|
+
|
|
445
|
+
return { rules: evaluable, skipped: skipped };
|
|
446
|
+
}
|
|
447
|
+
|
|
448
|
+
// An element carrying the class, inside a `.group` under the dark <html>.
|
|
449
|
+
function mountRevealIn(classAttribute: string): HTMLElement {
|
|
450
|
+
const group: HTMLDivElement = document.createElement("div");
|
|
451
|
+
group.className = "group";
|
|
452
|
+
|
|
453
|
+
const revealed: HTMLButtonElement = document.createElement("button");
|
|
454
|
+
revealed.setAttribute("class", classAttribute);
|
|
455
|
+
|
|
456
|
+
group.appendChild(revealed);
|
|
457
|
+
document.body.appendChild(group);
|
|
458
|
+
|
|
459
|
+
return revealed;
|
|
460
|
+
}
|
|
461
|
+
|
|
462
|
+
/*
|
|
463
|
+
* What the sheet paints on the element, as jsdom matches it: one
|
|
464
|
+
* "property: value" per declaration, sorted, so two elements painted by the
|
|
465
|
+
* same declarations compare equal whichever selector reached them.
|
|
466
|
+
*/
|
|
467
|
+
function declarationsOn(
|
|
468
|
+
element: Element,
|
|
469
|
+
sheet: EvaluableSheet,
|
|
470
|
+
): Array<string> {
|
|
471
|
+
const applied: Array<string> = [];
|
|
472
|
+
|
|
473
|
+
for (const rule of sheet.rules) {
|
|
474
|
+
if (!element.matches(rule.selector)) {
|
|
475
|
+
continue;
|
|
476
|
+
}
|
|
477
|
+
|
|
478
|
+
for (const [property, value] of Object.entries(rule.declarations)) {
|
|
479
|
+
applied.push(`${property}: ${value}`);
|
|
480
|
+
}
|
|
481
|
+
}
|
|
482
|
+
|
|
483
|
+
return applied.sort();
|
|
484
|
+
}
|
|
485
|
+
|
|
486
|
+
// What `before` has that `after` lacks, counting duplicates.
|
|
487
|
+
function missingFrom(
|
|
488
|
+
before: Array<string>,
|
|
489
|
+
after: Array<string>,
|
|
490
|
+
): Array<string> {
|
|
491
|
+
const remaining: Array<string> = [...after];
|
|
492
|
+
|
|
493
|
+
return before.filter((entry: string): boolean => {
|
|
494
|
+
const index: number = remaining.indexOf(entry);
|
|
495
|
+
|
|
496
|
+
if (index === -1) {
|
|
497
|
+
return true;
|
|
498
|
+
}
|
|
499
|
+
|
|
500
|
+
remaining.splice(index, 1);
|
|
501
|
+
return false;
|
|
502
|
+
});
|
|
503
|
+
}
|
|
504
|
+
|
|
505
|
+
function brightenEntry(): string {
|
|
506
|
+
return `color: ${declarationsFor(THEME_RULES, GROUP_HOVER_BRIGHTEN_SELECTOR)["color"]!}`;
|
|
507
|
+
}
|
|
508
|
+
|
|
509
|
+
/* ------------------------------------------------------------------------ */
|
|
510
|
+
|
|
511
|
+
let revealScan: RevealScan = { reveals: [], filesRead: 0 };
|
|
512
|
+
|
|
513
|
+
/*
|
|
514
|
+
* Parsing ~3,300 files takes seconds. Doing it in beforeAll rather than at
|
|
515
|
+
* module scope keeps it under a timeout and reports a failure as a failed
|
|
516
|
+
* test instead of a suite that could not even be collected.
|
|
517
|
+
*/
|
|
518
|
+
beforeAll(() => {
|
|
519
|
+
revealScan = findGroupHoverReveals();
|
|
520
|
+
}, 180000);
|
|
521
|
+
|
|
522
|
+
function revealsIn(file: string): Array<ClassCandidate> {
|
|
523
|
+
return revealScan.reveals.filter((candidate: ClassCandidate): boolean => {
|
|
524
|
+
return candidate.file === file;
|
|
525
|
+
});
|
|
526
|
+
}
|
|
527
|
+
|
|
528
|
+
/*
|
|
529
|
+
* The one reveal a known file holds. A rewrite that drops the negated-hover
|
|
530
|
+
* shape (back to `hidden group-hover:flex`, or to something else entirely)
|
|
531
|
+
* fails here by name, so its dark-mode colour gets looked at again.
|
|
532
|
+
*/
|
|
533
|
+
function onlyRevealIn(file: string): ClassCandidate {
|
|
534
|
+
const reveals: Array<ClassCandidate> = revealsIn(file);
|
|
535
|
+
|
|
536
|
+
expect({ file: file, reveals: reveals.length }).toEqual({
|
|
537
|
+
file: file,
|
|
538
|
+
reveals: 1,
|
|
539
|
+
});
|
|
540
|
+
|
|
541
|
+
return reveals[0]!;
|
|
542
|
+
}
|
|
543
|
+
|
|
544
|
+
describe("Theme.css brightens a group-hover reveal in either shape", () => {
|
|
545
|
+
test("both selector shapes are in the sheet, gated on the hovered group", () => {
|
|
546
|
+
expect(
|
|
547
|
+
rulesWithSelector(THEME_RULES, GROUP_HOVER_BRIGHTEN_SELECTOR).length,
|
|
548
|
+
).toBeGreaterThan(0);
|
|
549
|
+
expect(
|
|
550
|
+
rulesWithSelector(THEME_RULES, NEGATED_HOVER_BRIGHTEN_SELECTOR).length,
|
|
551
|
+
).toBeGreaterThan(0);
|
|
552
|
+
|
|
553
|
+
/*
|
|
554
|
+
* Same gate, same specificity: the twin differs from the original in the
|
|
555
|
+
* substring it looks for and nothing else, so it wins exactly where the
|
|
556
|
+
* original did.
|
|
557
|
+
*/
|
|
558
|
+
expect(
|
|
559
|
+
NEGATED_HOVER_BRIGHTEN_SELECTOR.replace(
|
|
560
|
+
`[class*="${NEGATED_HOVER_SUBSTRING}"]`,
|
|
561
|
+
'[class*="group-hover"]',
|
|
562
|
+
),
|
|
563
|
+
).toBe(GROUP_HOVER_BRIGHTEN_SELECTOR);
|
|
564
|
+
});
|
|
565
|
+
|
|
566
|
+
test("both shapes get the same declaration", () => {
|
|
567
|
+
const original: Record<string, string> = declarationsFor(
|
|
568
|
+
THEME_RULES,
|
|
569
|
+
GROUP_HOVER_BRIGHTEN_SELECTOR,
|
|
570
|
+
);
|
|
571
|
+
const twin: Record<string, string> = declarationsFor(
|
|
572
|
+
THEME_RULES,
|
|
573
|
+
NEGATED_HOVER_BRIGHTEN_SELECTOR,
|
|
574
|
+
);
|
|
575
|
+
|
|
576
|
+
expect(original["color"]).toBeDefined();
|
|
577
|
+
expect(twin).toEqual(original);
|
|
578
|
+
|
|
579
|
+
/*
|
|
580
|
+
* The reveals are text-gray-400, which the dark theme remaps to #94a3b8
|
|
581
|
+
* with !important. A brighten without !important would lose to that
|
|
582
|
+
* however specific its selector.
|
|
583
|
+
*/
|
|
584
|
+
expect(original["color"]).toContain("!important");
|
|
585
|
+
});
|
|
586
|
+
|
|
587
|
+
test("the rule's substring pairs are the two shapes", () => {
|
|
588
|
+
expect(brightenSubstringSets(THEME_RULES)).toEqual(
|
|
589
|
+
expect.arrayContaining([
|
|
590
|
+
["group-hover", "text-gray-"],
|
|
591
|
+
[NEGATED_HOVER_SUBSTRING, "text-gray-"],
|
|
592
|
+
]),
|
|
593
|
+
);
|
|
594
|
+
});
|
|
595
|
+
});
|
|
596
|
+
|
|
597
|
+
describe("helpers", () => {
|
|
598
|
+
test("splitSelectorList keeps :is(...) and quoted commas together", () => {
|
|
599
|
+
expect(
|
|
600
|
+
splitSelectorList(
|
|
601
|
+
'html.dark :is([class~="a"], [class~="b"]):hover, .x [data-y="1,2"],.z',
|
|
602
|
+
),
|
|
603
|
+
).toEqual([
|
|
604
|
+
'html.dark :is([class~="a"], [class~="b"]):hover',
|
|
605
|
+
'.x [data-y="1,2"]',
|
|
606
|
+
".z",
|
|
607
|
+
]);
|
|
608
|
+
});
|
|
609
|
+
|
|
610
|
+
test("requiredSubstrings reads only gated attribute-substring selectors", () => {
|
|
611
|
+
expect(requiredSubstrings(NEGATED_HOVER_BRIGHTEN_SELECTOR)).toEqual([
|
|
612
|
+
NEGATED_HOVER_SUBSTRING,
|
|
613
|
+
"text-gray-",
|
|
614
|
+
]);
|
|
615
|
+
expect(
|
|
616
|
+
requiredSubstrings('html.dark .group:hover [class~="group-hover:x"]'),
|
|
617
|
+
).toBeNull();
|
|
618
|
+
expect(requiredSubstrings('html.dark [class*="group-hover"]')).toBeNull();
|
|
619
|
+
});
|
|
620
|
+
|
|
621
|
+
test("isGroupHoverReveal takes the unnamed negated-hover hide only", () => {
|
|
622
|
+
expect(isGroupHoverReveal("group-[:not(:hover)]:hidden")).toBe(true);
|
|
623
|
+
expect(
|
|
624
|
+
isGroupHoverReveal("group-[:not(:hover):not(:focus-within)]:hidden"),
|
|
625
|
+
).toBe(true);
|
|
626
|
+
expect(
|
|
627
|
+
isGroupHoverReveal(
|
|
628
|
+
"group-[:not(:hover):not(:focus-within)]/nav-row:hidden",
|
|
629
|
+
),
|
|
630
|
+
).toBe(false);
|
|
631
|
+
expect(isGroupHoverReveal("group-hover:flex")).toBe(false);
|
|
632
|
+
expect(isGroupHoverReveal("group-[:not(:hover)]:flex")).toBe(false);
|
|
633
|
+
expect(isGroupHoverReveal("hidden")).toBe(false);
|
|
634
|
+
});
|
|
635
|
+
|
|
636
|
+
test("collectClassCandidates expands a template's branches, never its condition", () => {
|
|
637
|
+
const candidates: Array<string> = collectClassCandidates(
|
|
638
|
+
"Fixture.tsx",
|
|
639
|
+
'const e = <span className={`a b ${isOn ? "" : "c group-[:not(:hover)]:hidden"}`} data-x={mode === "q" ? 1 : 2} />;',
|
|
640
|
+
).map((candidate: ClassCandidate): string => {
|
|
641
|
+
return candidate.classText;
|
|
642
|
+
});
|
|
643
|
+
|
|
644
|
+
expect(candidates).toContain("a b");
|
|
645
|
+
expect(candidates).toContain("a b c group-[:not(:hover)]:hidden");
|
|
646
|
+
// The substitution is read as part of the template, not on its own.
|
|
647
|
+
expect(candidates).not.toContain("c group-[:not(:hover)]:hidden");
|
|
648
|
+
// Every string literal is still a candidate, the condition included.
|
|
649
|
+
expect(candidates).toContain("q");
|
|
650
|
+
});
|
|
651
|
+
|
|
652
|
+
test("restorePreFixHoverReveal rebuilds the class strings git history has", () => {
|
|
653
|
+
expect(restorePreFixHoverReveal(CONVERTED_FACET_EXCLUDE_CLASS)).toBe(
|
|
654
|
+
PRE_FIX_FACET_EXCLUDE_CLASS,
|
|
655
|
+
);
|
|
656
|
+
expect(restorePreFixHoverReveal(CONVERTED_PROFILES_HINT_CLASS)).toBe(
|
|
657
|
+
PRE_FIX_PROFILES_HINT_CLASS,
|
|
658
|
+
);
|
|
659
|
+
// Nothing to restore.
|
|
660
|
+
expect(restorePreFixHoverReveal("flex text-gray-400")).toBe(
|
|
661
|
+
"flex text-gray-400",
|
|
662
|
+
);
|
|
663
|
+
});
|
|
664
|
+
|
|
665
|
+
test("withoutHoverGate lifts the gate and refuses what jsdom cannot answer", () => {
|
|
666
|
+
expect(withoutHoverGate(NEGATED_HOVER_BRIGHTEN_SELECTOR)).toBe(
|
|
667
|
+
'html.dark .group [class*="group-[:not(:hover)"][class*="text-gray-"]',
|
|
668
|
+
);
|
|
669
|
+
expect(
|
|
670
|
+
withoutHoverGate('html.dark .group:hover [class~="x"]:hover'),
|
|
671
|
+
).toBeNull();
|
|
672
|
+
expect(withoutHoverGate("html.dark .group:hover .x::placeholder")).toBe(
|
|
673
|
+
null,
|
|
674
|
+
);
|
|
675
|
+
// `.group:hover` is the gate; `.group-row:hover` is not.
|
|
676
|
+
expect(withoutHoverGate("html.dark .group-row:hover .x")).toBeNull();
|
|
677
|
+
});
|
|
678
|
+
});
|
|
679
|
+
|
|
680
|
+
describe("every group-hover reveal with gray text is brightened in dark mode", () => {
|
|
681
|
+
test("the walk read the tree and found the three converted reveals", () => {
|
|
682
|
+
// A broken walk must not let the main assertion pass over nothing.
|
|
683
|
+
expect(revealScan.filesRead).toBeGreaterThan(1000);
|
|
684
|
+
|
|
685
|
+
for (const file of KNOWN_REVEAL_FILES) {
|
|
686
|
+
onlyRevealIn(file);
|
|
687
|
+
}
|
|
688
|
+
});
|
|
689
|
+
|
|
690
|
+
test.each(KNOWN_REVEAL_FILES)(
|
|
691
|
+
"%s: the revealed element matches one of the rule's substring pairs",
|
|
692
|
+
(file: string) => {
|
|
693
|
+
const reveal: ClassCandidate = onlyRevealIn(file);
|
|
694
|
+
|
|
695
|
+
/*
|
|
696
|
+
* Pinned on purpose: swapping the gray for a class the rule does not
|
|
697
|
+
* key on (text-slate-400, say) would change the colour as surely as
|
|
698
|
+
* dropping the selector did.
|
|
699
|
+
*/
|
|
700
|
+
expect(hasGrayText(reveal.classText)).toBe(true);
|
|
701
|
+
expect({
|
|
702
|
+
reveal: describeCandidate(reveal),
|
|
703
|
+
brightened: isBrightened(
|
|
704
|
+
reveal.classText,
|
|
705
|
+
brightenSubstringSets(THEME_RULES),
|
|
706
|
+
),
|
|
707
|
+
}).toEqual({ reveal: describeCandidate(reveal), brightened: true });
|
|
708
|
+
},
|
|
709
|
+
);
|
|
710
|
+
|
|
711
|
+
test("no reveal anywhere in the source carries gray text the rule misses", () => {
|
|
712
|
+
const substringSets: Array<Array<string>> =
|
|
713
|
+
brightenSubstringSets(THEME_RULES);
|
|
714
|
+
|
|
715
|
+
const missed: Array<string> = revealScan.reveals
|
|
716
|
+
.filter((candidate: ClassCandidate): boolean => {
|
|
717
|
+
return (
|
|
718
|
+
hasGrayText(candidate.classText) &&
|
|
719
|
+
!isBrightened(candidate.classText, substringSets)
|
|
720
|
+
);
|
|
721
|
+
})
|
|
722
|
+
.map(describeCandidate);
|
|
723
|
+
|
|
724
|
+
expect(missed).toEqual([]);
|
|
725
|
+
});
|
|
726
|
+
|
|
727
|
+
test("before the fix the same elements were brightened by the group-hover pair", () => {
|
|
728
|
+
const groupHoverOnly: Array<Array<string>> = [
|
|
729
|
+
["group-hover", "text-gray-"],
|
|
730
|
+
];
|
|
731
|
+
|
|
732
|
+
for (const file of KNOWN_REVEAL_FILES) {
|
|
733
|
+
const preFix: string = restorePreFixHoverReveal(
|
|
734
|
+
onlyRevealIn(file).classText,
|
|
735
|
+
);
|
|
736
|
+
|
|
737
|
+
expect({
|
|
738
|
+
preFix: preFix,
|
|
739
|
+
brightened: isBrightened(preFix, groupHoverOnly),
|
|
740
|
+
}).toEqual({ preFix: preFix, brightened: true });
|
|
741
|
+
}
|
|
742
|
+
});
|
|
743
|
+
|
|
744
|
+
/*
|
|
745
|
+
* The regression review found: the rule as it was, without the twin, and
|
|
746
|
+
* the converted markup. Every converted reveal falls out of it - still
|
|
747
|
+
* revealed on hover, but left at the dimmed gray.
|
|
748
|
+
*/
|
|
749
|
+
test("control: without the twin selector the converted reveals are not brightened", () => {
|
|
750
|
+
const withoutTwin: Array<Array<string>> = brightenSubstringSets(
|
|
751
|
+
withoutNegatedHoverSelectors(THEME_RULES),
|
|
752
|
+
);
|
|
753
|
+
|
|
754
|
+
expect(withoutTwin.length).toBeGreaterThan(0);
|
|
755
|
+
|
|
756
|
+
for (const file of KNOWN_REVEAL_FILES) {
|
|
757
|
+
const converted: string = onlyRevealIn(file).classText;
|
|
758
|
+
|
|
759
|
+
expect({
|
|
760
|
+
converted: converted,
|
|
761
|
+
brightened: isBrightened(converted, withoutTwin),
|
|
762
|
+
}).toEqual({ converted: converted, brightened: false });
|
|
763
|
+
}
|
|
764
|
+
});
|
|
765
|
+
});
|
|
766
|
+
|
|
767
|
+
describe("jsdom agrees on the attribute part", () => {
|
|
768
|
+
beforeEach(() => {
|
|
769
|
+
document.documentElement.classList.add("dark");
|
|
770
|
+
});
|
|
771
|
+
|
|
772
|
+
afterEach(() => {
|
|
773
|
+
document.body.innerHTML = "";
|
|
774
|
+
document.documentElement.classList.remove("dark");
|
|
775
|
+
});
|
|
776
|
+
|
|
777
|
+
test("the brighten selectors are gated on .group:hover, and jsdom can evaluate the rest of the sheet", () => {
|
|
778
|
+
/*
|
|
779
|
+
* jsdom is handed the selectors without the gate (see the header), so
|
|
780
|
+
* the gate itself is checked here, on the text.
|
|
781
|
+
*/
|
|
782
|
+
for (const selector of [
|
|
783
|
+
GROUP_HOVER_BRIGHTEN_SELECTOR,
|
|
784
|
+
NEGATED_HOVER_BRIGHTEN_SELECTOR,
|
|
785
|
+
]) {
|
|
786
|
+
expect(selector.startsWith(GROUP_HOVER_GATE)).toBe(true);
|
|
787
|
+
}
|
|
788
|
+
|
|
789
|
+
const sheet: EvaluableSheet = jsdomEvaluableSheet(THEME_RULES);
|
|
790
|
+
const evaluated: Array<string> = sheet.rules.map(
|
|
791
|
+
(rule: EvaluableRule): string => {
|
|
792
|
+
return rule.selector;
|
|
793
|
+
},
|
|
794
|
+
);
|
|
795
|
+
|
|
796
|
+
expect(evaluated).toEqual(
|
|
797
|
+
expect.arrayContaining([
|
|
798
|
+
withoutHoverGate(GROUP_HOVER_BRIGHTEN_SELECTOR),
|
|
799
|
+
withoutHoverGate(NEGATED_HOVER_BRIGHTEN_SELECTOR),
|
|
800
|
+
]),
|
|
801
|
+
);
|
|
802
|
+
// Most of the sheet, so the comparison below is not made over a sliver.
|
|
803
|
+
expect(sheet.rules.length).toBeGreaterThan(sheet.skipped);
|
|
804
|
+
});
|
|
805
|
+
|
|
806
|
+
test.each(KNOWN_REVEAL_FILES)(
|
|
807
|
+
"%s: the sheet paints the converted element exactly as it painted the pre-fix one",
|
|
808
|
+
(file: string) => {
|
|
809
|
+
const converted: string = onlyRevealIn(file).classText;
|
|
810
|
+
const sheet: EvaluableSheet = jsdomEvaluableSheet(THEME_RULES);
|
|
811
|
+
|
|
812
|
+
const before: Array<string> = declarationsOn(
|
|
813
|
+
mountRevealIn(restorePreFixHoverReveal(converted)),
|
|
814
|
+
sheet,
|
|
815
|
+
);
|
|
816
|
+
const after: Array<string> = declarationsOn(
|
|
817
|
+
mountRevealIn(converted),
|
|
818
|
+
sheet,
|
|
819
|
+
);
|
|
820
|
+
|
|
821
|
+
expect(before).toContain(brightenEntry());
|
|
822
|
+
expect(after).toEqual(before);
|
|
823
|
+
},
|
|
824
|
+
);
|
|
825
|
+
|
|
826
|
+
test.each(KNOWN_REVEAL_FILES)(
|
|
827
|
+
"control, %s: without the twin selector the converted element loses exactly the brighten",
|
|
828
|
+
(file: string) => {
|
|
829
|
+
const converted: string = onlyRevealIn(file).classText;
|
|
830
|
+
const sheet: EvaluableSheet = jsdomEvaluableSheet(
|
|
831
|
+
withoutNegatedHoverSelectors(THEME_RULES),
|
|
832
|
+
);
|
|
833
|
+
|
|
834
|
+
const before: Array<string> = declarationsOn(
|
|
835
|
+
mountRevealIn(restorePreFixHoverReveal(converted)),
|
|
836
|
+
sheet,
|
|
837
|
+
);
|
|
838
|
+
const after: Array<string> = declarationsOn(
|
|
839
|
+
mountRevealIn(converted),
|
|
840
|
+
sheet,
|
|
841
|
+
);
|
|
842
|
+
|
|
843
|
+
expect(missingFrom(before, after)).toEqual([brightenEntry()]);
|
|
844
|
+
expect(missingFrom(after, before)).toEqual([]);
|
|
845
|
+
},
|
|
846
|
+
);
|
|
847
|
+
});
|