@oneuptime/common 14.0.10 → 14.0.11
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/AIConversation.ts +127 -1
- package/Models/DatabaseModels/CephCluster.ts +12 -0
- package/Models/DatabaseModels/CloudResource.ts +12 -0
- package/Models/DatabaseModels/DatabaseServer.ts +12 -0
- package/Models/DatabaseModels/DockerHost.ts +12 -0
- package/Models/DatabaseModels/DockerSwarmCluster.ts +12 -0
- package/Models/DatabaseModels/GlobalOidc.ts +0 -4
- package/Models/DatabaseModels/GlobalOidcProject.ts +0 -4
- package/Models/DatabaseModels/GlobalSso.ts +0 -4
- package/Models/DatabaseModels/GlobalSsoProject.ts +0 -4
- package/Models/DatabaseModels/Host.ts +12 -0
- package/Models/DatabaseModels/IncidentForm.ts +594 -0
- package/Models/DatabaseModels/IncidentFormSubmission.ts +283 -0
- package/Models/DatabaseModels/IncidentTemplate.ts +59 -0
- package/Models/DatabaseModels/Index.ts +14 -0
- package/Models/DatabaseModels/IoTFleet.ts +12 -0
- package/Models/DatabaseModels/KubernetesCluster.ts +12 -0
- package/Models/DatabaseModels/MessageQueue.ts +1102 -0
- package/Models/DatabaseModels/MessageQueueLabelRule.ts +553 -0
- package/Models/DatabaseModels/MessageQueueOwnerRule.ts +633 -0
- package/Models/DatabaseModels/MessageQueueOwnerTeam.ts +491 -0
- package/Models/DatabaseModels/MessageQueueOwnerUser.ts +490 -0
- package/Models/DatabaseModels/PodmanHost.ts +12 -0
- package/Models/DatabaseModels/Project.ts +59 -0
- package/Models/DatabaseModels/ProjectOidc.ts +0 -4
- package/Models/DatabaseModels/ProjectSso.ts +0 -4
- package/Models/DatabaseModels/ProxmoxCluster.ts +12 -0
- package/Models/DatabaseModels/RumApplication.ts +12 -0
- package/Models/DatabaseModels/ServerlessFunction.ts +12 -0
- package/Models/DatabaseModels/Service.ts +12 -0
- package/Models/DatabaseModels/StatusPageOidc.ts +0 -4
- package/Models/DatabaseModels/StatusPageSso.ts +0 -4
- package/Models/DatabaseModels/TeamComplianceSetting.ts +47 -2
- package/Models/DatabaseModels/VMwareVCenter.ts +12 -0
- package/Server/API/AIChatAPI.ts +13 -114
- package/Server/API/AIInvestigationAPI.ts +3 -3
- package/Server/API/AIInvestigationConversationAPI.ts +266 -0
- package/Server/API/IncidentFormAPI.ts +376 -0
- package/Server/API/ProjectOIDC.ts +16 -25
- package/Server/API/ProjectSSO.ts +16 -24
- package/Server/API/StatusPageAPI.ts +42 -77
- package/Server/Enterprise/EnterpriseEdition.ts +93 -28
- package/Server/Enterprise/EnterpriseFeature.ts +25 -3
- package/Server/Enterprise/EnterpriseLicenseSnapshot.ts +1 -1
- package/Server/Enterprise/EnterpriseServerModule.ts +4 -1
- package/Server/EnvironmentConfig.ts +1 -1
- package/Server/Infrastructure/Postgres/SchemaMigrations/1796400000000-AddIncidentForms.ts +129 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1796500000000-AddTeamComplianceRuleNotificationChannels.ts +52 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1796600000000-AddAIInvestigationConversationAndTimeLimits.ts +75 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1796700000000-AddMessageQueueTables.ts +477 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts +8 -0
- package/Server/Middleware/IncidentFormRateLimit.ts +847 -0
- package/Server/Middleware/UserAuthorization.ts +16 -38
- package/Server/Services/AIService.ts +10 -13
- package/Server/Services/IncidentCustomFieldService.ts +112 -2
- package/Server/Services/IncidentEpisodeMemberService.ts +24 -4
- package/Server/Services/IncidentEpisodeService.ts +10 -1
- package/Server/Services/IncidentFormService.ts +1566 -0
- package/Server/Services/IncidentFormSubmissionService.ts +97 -0
- package/Server/Services/IncidentGroupingEngineService.ts +45 -8
- package/Server/Services/IncidentService.ts +123 -5
- package/Server/Services/IncidentTemplateService.ts +22 -0
- package/Server/Services/Index.ts +14 -0
- package/Server/Services/MessageQueueLabelRuleEngineService.ts +321 -0
- package/Server/Services/MessageQueueLabelRuleService.ts +14 -0
- package/Server/Services/MessageQueueOwnerRuleEngineService.ts +412 -0
- package/Server/Services/MessageQueueOwnerRuleService.ts +14 -0
- package/Server/Services/MessageQueueOwnerTeamService.ts +62 -0
- package/Server/Services/MessageQueueOwnerUserService.ts +62 -0
- package/Server/Services/MessageQueueService.ts +1463 -0
- package/Server/Services/OpenTelemetryIngestService.ts +37 -4
- package/Server/Services/ProjectService.ts +0 -59
- package/Server/Services/StatusPagePrivateUserService.ts +1 -4
- package/Server/Services/StatusPageService.ts +1 -51
- package/Server/Services/TeamComplianceSettingService.ts +163 -42
- package/Server/Services/UserNotificationRuleService.ts +8 -1
- package/Server/Services/WorkspaceNotificationSummaryService.ts +12 -3
- package/Server/Types/Database/Permissions/CreatePermission.ts +17 -3
- package/Server/Types/Database/Permissions/EditionPermission.ts +140 -38
- package/Server/Types/Database/Permissions/OwnerTableRegistry.ts +16 -0
- package/Server/Types/Database/Permissions/TablePermission.ts +3 -3
- package/Server/Types/Database/Permissions/UpdatePermission.ts +20 -6
- package/Server/Utils/AI/Chat/AgentContextCompactor.ts +200 -0
- package/Server/Utils/AI/Chat/ChatAgentRunner.ts +307 -48
- package/Server/Utils/AI/Chat/ChatRunCancellation.ts +156 -0
- package/Server/Utils/AI/Chat/ObservabilityAssistant.ts +78 -18
- package/Server/Utils/AI/Chat/ObservabilityChatPrompt.ts +1 -1
- package/Server/Utils/AI/Chat/ToolOutputPager.ts +322 -0
- package/Server/Utils/AI/ClusterAccess/KubectlInvestigationToolkit.ts +88 -30
- package/Server/Utils/AI/ClusterAccess/KubectlJobRunner.ts +13 -1
- package/Server/Utils/AI/CodeFix/CodeFixReadiness.ts +0 -32
- package/Server/Utils/AI/CodeFix/FixRunBudget.ts +27 -25
- package/Server/Utils/AI/Remediation/RemediationCommandTools.ts +7 -1
- package/Server/Utils/AI/Remediation/RemediationExecutionRunner.ts +34 -14
- package/Server/Utils/AI/ResourceAccess/InfrastructureInvestigationToolkit.ts +69 -24
- package/Server/Utils/AI/ResourceAccess/ResourceCommandJobRunner.ts +9 -0
- package/Server/Utils/AI/SRE/AIInvestigationEngine.ts +53 -10
- package/Server/Utils/AI/SRE/AlertInvestigationRunner.ts +27 -10
- package/Server/Utils/AI/SRE/IncidentInvestigationRunner.ts +27 -10
- package/Server/Utils/AI/SRE/InvestigationQueue.ts +16 -19
- package/Server/Utils/AI/SRE/InvestigationThread.ts +646 -0
- package/Server/Utils/AI/SRE/InvestigationThreadService.ts +715 -0
- package/Server/Utils/AI/Toolbox/Serializer.ts +10 -3
- package/Server/Utils/EditionEnforcement.ts +19 -202
- package/Server/Utils/LLM/LLMService.ts +259 -63
- package/Server/Utils/RelaxedScimTeamLocksReport.ts +245 -0
- package/Server/Utils/Rules/RuleRun/RuleRunRegistry.ts +25 -0
- package/Server/Utils/SameOriginRequest.ts +203 -0
- package/Server/Utils/TeamMember/ProjectLeaveResourceCleanup.ts +2 -0
- package/Server/Utils/Telemetry/EntityRegistry.ts +4 -1
- package/Server/Utils/Telemetry/MessageQueueDiscovery.ts +1402 -0
- package/Server/Utils/Telemetry/ResourceEntityFilter.ts +4 -1
- package/Server/Utils/VendorAssets.ts +3 -3
- package/Server/Utils/Workspace/MicrosoftTeams/Actions/Incident.ts +3 -1
- package/Server/Utils/Workspace/MicrosoftTeams/Actions/IncidentEpisode.ts +3 -1
- package/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeams.ts +10 -1
- package/Tests/App/Accounts/IncidentFormPage.test.tsx +2036 -0
- package/Tests/App/Accounts/IncidentFormServerMessages.test.ts +119 -0
- package/Tests/App/Accounts/IncidentFormUtils.test.ts +1157 -0
- package/Tests/App/Accounts/LoginPasskey.test.tsx +6 -4
- package/Tests/App/Accounts/LoginSso.test.tsx +724 -0
- package/Tests/App/AdminDashboard/AdminAuthenticationRequireSso.test.tsx +338 -0
- package/Tests/App/AdminDashboard/AdminAuthenticationSsoCardLocales.test.tsx +331 -0
- package/Tests/App/AdminDashboard/AdminEnterprisePluginPage.test.tsx +47 -33
- package/Tests/App/AdminDashboard/GlobalSsoOidcPages.test.tsx +1021 -0
- package/Tests/App/Dashboard/AffectedResourcesDisplay.test.tsx +876 -78
- package/Tests/App/Dashboard/AffectedResourcesSlo.test.tsx +20 -3
- package/Tests/App/Dashboard/CephProxmoxVMwareDocumentationCards.test.tsx +359 -0
- package/Tests/App/Dashboard/CephSetupGuide.test.ts +961 -0
- package/Tests/App/Dashboard/CloudDocumentationCard.test.tsx +381 -95
- package/Tests/App/Dashboard/CloudSetupGuide.test.ts +1463 -0
- package/Tests/App/Dashboard/ClusterAccessNotice.test.tsx +174 -12
- package/Tests/App/Dashboard/ContainerSetupGuideCards.test.tsx +345 -0
- package/Tests/App/Dashboard/CoreListEmptyStates.test.tsx +501 -0
- package/Tests/App/Dashboard/DashboardLazyPages.test.tsx +0 -1
- package/Tests/App/Dashboard/DatabaseDocumentationCard.test.tsx +400 -0
- package/Tests/App/Dashboard/DatabaseDocumentationMarkdown.test.ts +5 -0
- package/Tests/App/Dashboard/DatabaseSetupGuide.test.ts +1869 -0
- package/Tests/App/Dashboard/DatabaseTelemetryScope.test.ts +44 -0
- package/Tests/App/Dashboard/DatabaseTelemetryTabs.test.tsx +50 -9
- package/Tests/App/Dashboard/DockerSetupGuide.test.ts +899 -0
- package/Tests/App/Dashboard/DockerSwarmSetupGuide.test.ts +964 -0
- package/Tests/App/Dashboard/EnterpriseFeatureUpgrade.test.tsx +141 -7
- package/Tests/App/Dashboard/EnterprisePluginPage.test.tsx +52 -39
- package/Tests/App/Dashboard/EventOverviewPages.test.tsx +7 -1
- package/Tests/App/Dashboard/GettingStartedTaskRoutes.test.tsx +331 -0
- package/Tests/App/Dashboard/HomeOverviewStatsFirstRun.test.tsx +925 -0
- package/Tests/App/Dashboard/HostDocumentationCard.test.tsx +225 -0
- package/Tests/App/Dashboard/HostSetupGuide.test.ts +1183 -0
- package/Tests/App/Dashboard/IdentityEnterpriseShells.test.tsx +69 -45
- package/Tests/App/Dashboard/IncidentCreateTemplateCustomFieldSettings.test.tsx +745 -0
- package/Tests/App/Dashboard/IncidentCreateTemplateOwners.test.tsx +414 -0
- package/Tests/App/Dashboard/IncidentCustomFieldCreateSettingsForm.test.ts +1042 -0
- package/Tests/App/Dashboard/IncidentCustomFieldSettingsCard.test.tsx +1816 -0
- package/Tests/App/Dashboard/IncidentFormPlan.test.ts +89 -0
- package/Tests/App/Dashboard/IncidentFormShareLinkCard.test.tsx +846 -0
- package/Tests/App/Dashboard/IncidentFormsPages.test.tsx +1324 -0
- package/Tests/App/Dashboard/IncidentTemplateCustomFieldSettings.test.tsx +630 -0
- package/Tests/App/Dashboard/IncidentsSideMenu.test.tsx +13 -0
- package/Tests/App/Dashboard/IncomingEmailMonitorLinkVerifyHint.test.tsx +104 -0
- package/Tests/App/Dashboard/InvestigationConversation.test.tsx +1107 -0
- package/Tests/App/Dashboard/InvestigationConversationData.test.ts +546 -0
- package/Tests/App/Dashboard/InvestigationEvidenceList.test.tsx +170 -5
- package/Tests/App/Dashboard/InvestigationNotStarted.test.tsx +207 -2
- package/Tests/App/Dashboard/InvestigationPanel.test.tsx +729 -34
- package/Tests/App/Dashboard/InvestigationPanelStatus.test.tsx +9 -21
- package/Tests/App/Dashboard/InvestigationReportView.test.tsx +274 -37
- package/Tests/App/Dashboard/InvestigationStatusBadge.test.tsx +130 -0
- package/Tests/App/Dashboard/IoTDocumentationCard.test.tsx +218 -0
- package/Tests/App/Dashboard/IoTSetupGuide.test.ts +1124 -0
- package/Tests/App/Dashboard/KubernetesClusterAiAccessSettings.test.ts +20 -6
- package/Tests/App/Dashboard/KubernetesClusterAiDocumentationMarkdown.test.ts +107 -83
- package/Tests/App/Dashboard/KubernetesSetupGuide.test.ts +787 -0
- package/Tests/App/Dashboard/MessageQueueBreadcrumbs.test.tsx +228 -0
- package/Tests/App/Dashboard/MessageQueueBrokerHealth.test.tsx +1538 -0
- package/Tests/App/Dashboard/MessageQueueBrokerHealthMetricChart.test.tsx +969 -0
- package/Tests/App/Dashboard/MessageQueueBrokerHealthReads.test.ts +889 -0
- package/Tests/App/Dashboard/MessageQueueBrokerMetricsReach.test.ts +236 -0
- package/Tests/App/Dashboard/MessageQueueDocumentationCard.test.tsx +479 -0
- package/Tests/App/Dashboard/MessageQueueListPages.test.tsx +1232 -0
- package/Tests/App/Dashboard/MessageQueueMetricDescriptions.test.ts +244 -0
- package/Tests/App/Dashboard/MessageQueueMonitorLink.test.ts +952 -0
- package/Tests/App/Dashboard/MessageQueueMonitorLinkMonitorCreate.test.tsx +859 -0
- package/Tests/App/Dashboard/MessageQueueOverview.test.tsx +1773 -0
- package/Tests/App/Dashboard/MessageQueueOverviewPresentation.test.ts +196 -0
- package/Tests/App/Dashboard/MessageQueuePresentation.test.ts +799 -0
- package/Tests/App/Dashboard/MessageQueueProducersConsumers.test.tsx +680 -0
- package/Tests/App/Dashboard/MessageQueueRoutes.test.tsx +383 -0
- package/Tests/App/Dashboard/MessageQueueRulePages.test.tsx +278 -0
- package/Tests/App/Dashboard/MessageQueueSetupGuide.test.ts +2778 -0
- package/Tests/App/Dashboard/MessageQueueSideMenus.test.tsx +273 -0
- package/Tests/App/Dashboard/MessageQueueSpanPopulations.test.ts +930 -0
- package/Tests/App/Dashboard/MessageQueueSpanStore.ts +351 -0
- package/Tests/App/Dashboard/MessageQueueTelemetryScope.test.ts +375 -0
- package/Tests/App/Dashboard/MessageQueueTelemetryScopeTabs.test.tsx +668 -0
- package/Tests/App/Dashboard/MessageQueueViewPages.test.tsx +685 -0
- package/Tests/App/Dashboard/MonitorAndHomeNotOperationalMenus.test.tsx +342 -0
- package/Tests/App/Dashboard/MonitorCreateFirstRunDefaults.test.tsx +623 -0
- package/Tests/App/Dashboard/MonitorCreateFromMonitorBackedDevice.test.tsx +442 -0
- package/Tests/App/Dashboard/MonitorLogsPageViewSummary.test.tsx +814 -0
- package/Tests/App/Dashboard/MonitorSetupCardBodies.test.tsx +246 -0
- package/Tests/App/Dashboard/NavigationSearchKeywords.test.tsx +8 -0
- package/Tests/App/Dashboard/OnboardingSsoEmptyState.test.tsx +27 -12
- package/Tests/App/Dashboard/PlanGatedPage.test.tsx +292 -0
- package/Tests/App/Dashboard/PodmanSetupGuide.test.ts +948 -0
- package/Tests/App/Dashboard/ProductOrientation.test.tsx +5 -4
- package/Tests/App/Dashboard/ProductSettingsSectionCollapsed.test.tsx +266 -0
- package/Tests/App/Dashboard/ProxmoxSetupGuide.test.ts +1318 -0
- package/Tests/App/Dashboard/ResourceAiAgentAttentionServerParity.test.ts +555 -0
- package/Tests/App/Dashboard/ResourceAiAgentPage.test.tsx +298 -9
- package/Tests/App/Dashboard/ResourceAiAgentStatus.test.ts +453 -0
- package/Tests/App/Dashboard/ResourceArchiveSettings.test.tsx +16 -0
- package/Tests/App/Dashboard/ResourceConnectionGuideCard.test.tsx +444 -0
- package/Tests/App/Dashboard/ResourceConnectionGuideOverviewsInfra.test.tsx +798 -0
- package/Tests/App/Dashboard/ResourceConnectionGuideOverviewsPlatforms.test.tsx +717 -0
- package/Tests/App/Dashboard/ResourceConnectionGuides.test.ts +981 -0
- package/Tests/App/Dashboard/ResourceConnectionState.test.ts +132 -0
- package/Tests/App/Dashboard/RumDocumentationCard.test.tsx +293 -0
- package/Tests/App/Dashboard/RumSessionReplayRetentionSettings.test.tsx +467 -0
- package/Tests/App/Dashboard/RumSetupGuide.test.ts +758 -0
- package/Tests/App/Dashboard/ScheduledMaintenanceOverviewPage.test.tsx +25 -0
- package/Tests/App/Dashboard/ServerlessDocumentationCard.test.tsx +254 -0
- package/Tests/App/Dashboard/ServerlessSetupGuide.test.ts +1074 -0
- package/Tests/App/Dashboard/SetupGuide.test.ts +246 -0
- package/Tests/App/Dashboard/SetupGuideCard.test.tsx +756 -0
- package/Tests/App/Dashboard/SloListSideMenu.test.tsx +120 -0
- package/Tests/App/Dashboard/SsoPages.test.tsx +833 -0
- package/Tests/App/Dashboard/TelemetryDocumentation.test.tsx +253 -0
- package/Tests/App/Dashboard/TelemetryRetentionShells.test.tsx +730 -0
- package/Tests/App/Dashboard/VMwareSetupGuide.test.ts +1033 -0
- package/Tests/App/StatusPage/StatusPageSsoEmptyState.test.tsx +87 -7
- package/Tests/Models/DatabaseModels/DatabaseServerModels.test.ts +28 -9
- package/Tests/Models/DatabaseModels/IncidentFormModel.test.ts +1250 -0
- package/Tests/Models/DatabaseModels/MessageQueueModels.test.ts +1983 -0
- package/Tests/Models/DatabaseModels/StaticRuleCriteriaInheritance.test.ts +4 -2
- package/Tests/Models/DatabaseModels/TeamComplianceSettingModel.test.ts +190 -14
- package/Tests/Models/IncidentTemplateCustomFieldSettingsColumn.test.ts +291 -0
- package/Tests/Server/API/AIInvestigationConversationAPI.test.ts +412 -0
- package/Tests/Server/API/GlobalConfigLicense.test.ts +38 -9
- package/Tests/Server/API/IncidentFormAPI.test.ts +942 -0
- package/Tests/Server/API/IncidentFormPublicRoutes.test.ts +1653 -0
- package/Tests/Server/API/KubernetesClusterAiAccessAPI.test.ts +2 -1
- package/Tests/Server/API/{SsoProviderListingsEdition.test.ts → SsoProviderListings.test.ts} +164 -110
- package/Tests/Server/Enterprise/EnterpriseEdition.test.ts +76 -54
- package/Tests/Server/Enterprise/EnterpriseFeatureActive.test.ts +125 -42
- package/Tests/Server/Enterprise/EnterpriseLicenseSnapshot.test.ts +36 -10
- package/Tests/Server/Enterprise/EnterpriseModelFeatureMap.test.ts +51 -9
- package/Tests/Server/Enterprise/FakeEnterpriseModule.ts +13 -8
- package/Tests/Server/Enterprise/SsoInCommunityEdition.test.ts +540 -0
- package/Tests/Server/Infrastructure/Postgres/AddConfigurableRuleCriteriaMigration.test.ts +3 -0
- package/Tests/Server/Infrastructure/Postgres/AddIncidentFormsMigration.test.ts +438 -0
- package/Tests/Server/Infrastructure/Postgres/AddTeamComplianceRuleNotificationChannelsMigration.test.ts +255 -0
- package/Tests/Server/Infrastructure/Postgres/MessageQueueTablesMigration.test.ts +637 -0
- package/Tests/Server/Middleware/IncidentFormRateLimit.test.ts +1630 -0
- package/Tests/Server/Middleware/UserAuthorization.test.ts +16 -17
- package/Tests/Server/Middleware/UserAuthorizationSsoEnforcement.test.ts +544 -0
- package/Tests/Server/Services/AIServiceDailyBudget.test.ts +37 -8
- package/Tests/Server/Services/IncidentCreatedFeedTitle.test.ts +212 -0
- package/Tests/Server/Services/IncidentCustomFieldDeleteFormQuestions.test.ts +297 -0
- package/Tests/Server/Services/IncidentFormOwnersCreatedNotification.test.ts +497 -0
- package/Tests/Server/Services/IncidentFormPostgres.test.ts +958 -0
- package/Tests/Server/Services/IncidentFormPublicForm.test.ts +1260 -0
- package/Tests/Server/Services/IncidentFormPublicSubmission.test.ts +2520 -0
- package/Tests/Server/Services/IncidentFormRegistration.test.ts +159 -0
- package/Tests/Server/Services/IncidentFormService.test.ts +663 -0
- package/Tests/Server/Services/IncidentFormSubmissionService.test.ts +430 -0
- package/Tests/Server/Services/IncidentFormSubmissionTemplateBranch.test.ts +473 -0
- package/Tests/Server/Services/IncidentGroupingTemplateSubstitution.test.ts +81 -0
- package/Tests/Server/Services/IncidentTemplateCustomFieldSettings.test.ts +262 -0
- package/Tests/Server/Services/IncidentTemplateOwnersOnDeclare.test.ts +566 -0
- package/Tests/Server/Services/IncidentTitleMarkdownSinks.test.ts +640 -0
- package/Tests/Server/Services/LlmLogServiceTokenAggregateParams.test.ts +3 -3
- package/Tests/Server/Services/MessageQueueOwnerServices.test.ts +440 -0
- package/Tests/Server/Services/MessageQueueRegistries.test.ts +577 -0
- package/Tests/Server/Services/MessageQueueRuleEngines.test.ts +900 -0
- package/Tests/Server/Services/MessageQueueService.test.ts +2210 -0
- package/Tests/Server/Services/MessageQueueSqlPostgres.test.ts +1271 -0
- package/Tests/Server/Services/OpenTelemetryResourceRetentionMemo.test.ts +28 -1
- package/Tests/Server/Services/OpenTelemetryRetentionOverrideEdition.test.ts +474 -0
- package/Tests/Server/Services/OpenTelemetryServiceResolutionCache.test.ts +21 -0
- package/Tests/Server/Services/OwnerRowUniqueness.test.ts +3 -0
- package/Tests/Server/Services/ProjectServiceAuditLogLicense.test.ts +0 -1
- package/Tests/Server/Services/RuleRun/LabelRuleEnginesGroupBRun.test.ts +56 -6
- package/Tests/Server/Services/RuleRun/OwnerRuleEnginesGroupBRun.test.ts +30 -1
- package/Tests/Server/Services/SsoRequirementReads.test.ts +454 -0
- package/Tests/Server/Services/SsoRequirementWrites.test.ts +529 -0
- package/Tests/Server/Services/StaticRuleCriteriaRuntimeCoverage.test.ts +3 -3
- package/Tests/Server/Services/StatusPagePrivateUserInvitationPolicy.test.ts +107 -89
- package/Tests/Server/Services/TeamComplianceSettingPostgres.test.ts +1068 -176
- package/Tests/Server/Services/TeamComplianceSettingService.test.ts +1962 -200
- package/Tests/Server/Types/Database/Permissions/EditionPermission.test.ts +654 -297
- package/Tests/Server/Types/Database/Permissions/RetentionOverrideColumns.test.ts +784 -0
- package/Tests/Server/Types/Database/Permissions/SsoScalePlanGate.test.ts +418 -0
- package/Tests/Server/Utils/AI/AIAlertGating.test.ts +0 -1
- package/Tests/Server/Utils/AI/AIInvestigationEngineRunLimits.test.ts +136 -0
- package/Tests/Server/Utils/AI/AIInvestigationQueue.test.ts +15 -14
- package/Tests/Server/Utils/AI/AgentContextCompactor.test.ts +351 -0
- package/Tests/Server/Utils/AI/ChatAgentRunnerSharedThread.test.ts +842 -0
- package/Tests/Server/Utils/AI/ChatRunCancellation.test.ts +195 -0
- package/Tests/Server/Utils/AI/CodeFixReadiness.test.ts +10 -57
- package/Tests/Server/Utils/AI/FixRunBudget.test.ts +20 -24
- package/Tests/Server/Utils/AI/Insights/InvestigationQueueInsightSubject.test.ts +7 -30
- package/Tests/Server/Utils/AI/InvestigationClusterAccessWiring.test.ts +225 -29
- package/Tests/Server/Utils/AI/InvestigationInfrastructureAccessWiring.test.ts +266 -25
- package/Tests/Server/Utils/AI/InvestigationThread.test.ts +580 -0
- package/Tests/Server/Utils/AI/InvestigationThreadService.test.ts +801 -0
- package/Tests/Server/Utils/AI/KubectlInvestigationToolkit.test.ts +525 -43
- package/Tests/Server/Utils/AI/KubectlJobRunner.test.ts +4 -2
- package/Tests/Server/Utils/AI/LLMServiceUnreachableProvider.test.ts +435 -0
- package/Tests/Server/Utils/AI/ObservabilityAssistantLimits.test.ts +462 -0
- package/Tests/Server/Utils/AI/RemediationExecutionRunner.test.ts +14 -25
- package/Tests/Server/Utils/AI/RemediationExecutionRunnerResourceMode.test.ts +2 -0
- package/Tests/Server/Utils/AI/ResourceAccess/InfrastructureInvestigationToolkit.test.ts +297 -15
- package/Tests/Server/Utils/AI/ResourceAccess/ResourceCommandJobRunner.test.ts +10 -6
- package/Tests/Server/Utils/AI/ToolOutputPager.test.ts +382 -0
- package/Tests/Server/Utils/AI/ToolResultSerializer.test.ts +23 -4
- package/Tests/Server/Utils/AI/Toolbox/LogTools.test.ts +25 -6
- package/Tests/Server/Utils/AI/Toolbox/Serializer.test.ts +14 -3
- package/Tests/Server/Utils/EditionEnforcement.test.ts +107 -147
- package/Tests/Server/Utils/{CommunityEditionSsoReport.test.ts → RelaxedScimTeamLocksReport.test.ts} +212 -208
- package/Tests/Server/Utils/SameOriginRequest.test.ts +372 -0
- package/Tests/Server/Utils/Telemetry/EntityRegistry.test.ts +20 -0
- package/Tests/Server/Utils/Telemetry/MessageQueueDiscovery.test.ts +2590 -0
- package/Tests/Server/Utils/Telemetry/MessageQueueSpanQueryTwin.ts +246 -0
- package/Tests/Server/Utils/Telemetry/TelemetryEntity.test.ts +23 -0
- package/Tests/Types/AI/AIAgentRunLimits.test.ts +255 -0
- package/Tests/Types/Code/JsonSyntax.test.ts +1300 -0
- package/Tests/Types/CustomField/CustomFieldCreateSettings.test.ts +1113 -0
- package/Tests/Types/CustomField/CustomFieldMappingCatalog.test.ts +91 -0
- package/Tests/Types/CustomField/CustomFieldValueValidator.test.ts +30 -0
- package/Tests/Types/Incident/IncidentFormIpAllowlist.test.ts +227 -0
- package/Tests/Types/Incident/IncidentFormPublic.test.ts +1916 -0
- package/Tests/Types/MessageQueue/MessageQueueEntityKey.test.ts +916 -0
- package/Tests/Types/MessageQueue/MessageQueueIdentity.test.ts +567 -0
- package/Tests/Types/MessageQueue/MessageQueueManualIdentity.test.ts +686 -0
- package/Tests/Types/MessageQueue/MessageQueueMetricCatalog.test.ts +1726 -0
- package/Tests/Types/MessageQueue/MessageQueueMetricResolution.test.ts +1758 -0
- package/Tests/Types/MessageQueue/MessagingInstrumentationFixtures.test.ts +4686 -0
- package/Tests/Types/MessageQueue/MessagingSystem.test.ts +840 -0
- package/Tests/Types/MessageQueue/MessagingTelemetryFixtures.ts +3287 -0
- package/Tests/Types/MessageQueue/MessagingTelemetryResolver.test.ts +2966 -0
- package/Tests/Types/Monitor/MessageQueueAlertTemplates.test.ts +5401 -0
- package/Tests/Types/Monitor/MetricEngineFold.ts +154 -0
- package/Tests/Types/ResourceAiAgent/ResourceAiAccess.test.ts +5 -3
- package/Tests/Types/Team/ComplianceRule.test.ts +588 -37
- package/Tests/Types/Team/TeamComplianceStatus.test.ts +64 -11
- package/Tests/Types/XML.test.ts +51 -0
- package/Tests/UI/Components/CodeEditor/CodeEditor.test.tsx +2362 -0
- package/Tests/UI/Components/CodeEditor/CodeEditorCommands.test.ts +810 -0
- package/Tests/UI/Components/CodeEditor/CodeEditorHighlight.test.ts +338 -0
- package/Tests/UI/Components/CodeEditor/CodeEditorLanguages.test.ts +222 -0
- package/Tests/UI/Components/CodeEditor/CodeEditorStyles.test.ts +807 -0
- package/Tests/UI/Components/CodeEditor/NoMonaco.test.ts +245 -0
- package/Tests/UI/Components/CodeEditor/YamlEditor.test.tsx +729 -0
- package/Tests/UI/Components/CopyTextButton.test.tsx +76 -0
- package/Tests/UI/Components/EditionLabelLapseCopy.ts +51 -14
- package/Tests/UI/Components/EditionLabelLicenseStatus.test.tsx +131 -23
- package/Tests/UI/Components/ErrorMessageAction.test.tsx +142 -0
- package/Tests/UI/Components/FacetSidebarInScope.test.tsx +459 -0
- package/Tests/UI/Components/FacetValuesInScope.test.ts +270 -0
- package/Tests/UI/Components/Forms/FormFieldCodeEditors.test.tsx +294 -0
- package/Tests/UI/Components/Forms/FormFieldMarkdown.test.tsx +126 -0
- package/Tests/UI/Components/Forms/FormFieldYaml.test.tsx +22 -75
- package/Tests/UI/Components/Forms/ModelFormOnBeforeCreateMiscData.test.tsx +254 -0
- package/Tests/UI/Components/Icon.test.tsx +32 -0
- package/Tests/UI/Components/Input.test.tsx +31 -0
- package/Tests/UI/Components/LockedFilterChipScope.test.tsx +501 -0
- package/Tests/UI/Components/MarkdownConverters.test.ts +253 -1
- package/Tests/UI/Components/MarkdownEditor.test.tsx +2785 -2
- package/Tests/UI/Components/MarkdownEditorHistory.test.ts +243 -0
- package/Tests/UI/Components/MarkdownListEditing.test.ts +1118 -0
- package/Tests/UI/Components/MarkdownPaste.test.ts +1180 -0
- package/Tests/UI/Components/MarkdownViewerCopy.test.tsx +466 -0
- package/Tests/UI/Components/MarkdownVisualEditing.test.ts +1089 -0
- package/Tests/UI/Components/ModelTable/BaseModelTableEmptyStateAction.test.tsx +623 -0
- package/Tests/UI/Components/ResetObjectID.test.tsx +282 -0
- package/Tests/UI/Components/RuleCriteria/RuleCriteriaModelTable.test.tsx +3 -3
- package/Tests/UI/Components/Table/EmptyTableMessage.test.ts +439 -0
- package/Tests/UI/Components/Table/TableEmptyState.test.tsx +352 -0
- package/Tests/UI/Components/TableRowMobileTitles.test.tsx +78 -0
- package/Tests/UI/Components/TextArea.test.tsx +19 -0
- package/Tests/UI/Components/Workflow/ModelColumnEditor.render.test.tsx +12 -29
- package/Tests/UI/Components/fixtures/MarkdownPasteFixtures.ts +460 -0
- package/Tests/UI/EsbuildConfig.test.ts +115 -39
- package/Tests/UI/EsbuildEnterpriseAlias.test.ts +4 -4
- package/Tests/UI/Monitor/MonitorLogSummaryRender.test.tsx +377 -0
- package/Tests/UI/Utils/Breadcrumb/fixtures/RealBreadcrumbTrails.ts +81 -1
- package/Tests/UI/Utils/Breadcrumb/fixtures/RealRoutePatterns.ts +17 -0
- package/Tests/Utils/LabelRuleImportExport.test.ts +5 -0
- package/Tests/Utils/Markdown/DashboardMarkdownRenderer.ts +81 -0
- package/Tests/Utils/Markdown/UntrustedMarkdown.test.ts +1339 -0
- package/Tests/Utils/Monitor/MonitorLogSummaryUtil.test.ts +862 -0
- package/Types/AI/AIAgentRunLimits.ts +146 -0
- package/Types/Code/CodeType.ts +2 -0
- package/Types/Code/JsonSyntax.ts +923 -0
- package/Types/CustomField/CustomFieldCreateSettings.ts +549 -0
- package/Types/CustomField/CustomFieldMappingCatalog.ts +77 -0
- package/Types/CustomField/CustomFieldValueValidator.ts +10 -7
- package/Types/EnterpriseLicense/EnterpriseLicensePeriods.ts +1 -1
- package/Types/Icon/IconProp.ts +2 -0
- package/Types/Incident/IncidentFormIpAllowlist.ts +206 -0
- package/Types/Incident/IncidentFormPublic.ts +1145 -0
- package/Types/Kubernetes/KubernetesClusterAiAccess.ts +10 -3
- package/Types/MessageQueue/MessageQueueIdentity.ts +256 -0
- package/Types/MessageQueue/MessageQueueManualIdentity.ts +325 -0
- package/Types/MessageQueue/MessageQueueMetricCatalog.ts +1357 -0
- package/Types/MessageQueue/MessagingSystem.ts +518 -0
- package/Types/MessageQueue/MessagingTelemetryResolver.ts +2311 -0
- package/Types/Monitor/MessageQueueAlertTemplates.ts +2128 -0
- package/Types/Permission.ts +310 -0
- package/Types/ResourceAiAgent/ResourceAiAccess.ts +10 -4
- package/Types/Rules/RuleCriteriaFieldRegistry.ts +12 -0
- package/Types/Rules/RuleRun.ts +4 -0
- package/Types/Team/ComplianceNotificationChannel.ts +4 -3
- package/Types/Team/ComplianceRule.ts +71 -18
- package/Types/Team/ComplianceRuleType.ts +2 -2
- package/Types/Team/TeamComplianceStatus.ts +6 -2
- package/Types/Telemetry/EntityType.ts +16 -0
- package/Types/Telemetry/LockedFilterDetail.ts +22 -0
- package/Types/XML.ts +26 -0
- package/UI/Components/CodeEditor/CodeEditor.css +379 -0
- package/UI/Components/CodeEditor/CodeEditor.tsx +1128 -294
- package/UI/Components/CodeEditor/CodeEditorCommands.ts +774 -0
- package/UI/Components/CodeEditor/CodeEditorHighlight.ts +106 -0
- package/UI/Components/CodeEditor/CodeEditorLanguages.ts +164 -0
- package/UI/Components/CodeEditor/YamlEditor.tsx +28 -326
- package/UI/Components/CopyTextButton/CopyTextButton.tsx +5 -1
- package/UI/Components/CustomFields/CustomFieldModelFormFields.tsx +6 -25
- package/UI/Components/EditionLabel/EditionLabel.tsx +14 -13
- package/UI/Components/ErrorMessage/ErrorMessage.tsx +11 -1
- package/UI/Components/Forms/Fields/FormField.tsx +8 -0
- package/UI/Components/Forms/Types/Field.ts +8 -0
- package/UI/Components/Icon/Icon.tsx +18 -0
- package/UI/Components/Input/Input.tsx +11 -4
- package/UI/Components/LogsViewer/LogsViewer.tsx +4 -0
- package/UI/Components/LogsViewer/components/LogsFacetSidebar.tsx +21 -3
- package/UI/Components/Markdown.tsx/MarkdownConverters.ts +0 -0
- package/UI/Components/Markdown.tsx/MarkdownEditor.tsx +877 -79
- package/UI/Components/Markdown.tsx/MarkdownEditorHistory.ts +284 -0
- package/UI/Components/Markdown.tsx/MarkdownListEditing.ts +1362 -0
- package/UI/Components/Markdown.tsx/MarkdownPaste.ts +1326 -0
- package/UI/Components/Markdown.tsx/MarkdownViewer.tsx +106 -10
- package/UI/Components/Markdown.tsx/MarkdownVisualEditing.ts +1032 -0
- package/UI/Components/ModelTable/BaseModelTable.tsx +85 -7
- package/UI/Components/ResetObjectID/ResetObjectID.tsx +35 -9
- package/UI/Components/Table/EmptyTableMessage.ts +81 -0
- package/UI/Components/Table/Table.tsx +50 -21
- package/UI/Components/Table/TableRow.tsx +9 -1
- package/UI/Components/TelemetryViewer/FacetVisibility.ts +97 -2
- package/UI/Components/TelemetryViewer/TelemetryViewer.tsx +13 -0
- package/UI/Components/TelemetryViewer/components/LockedFilterChip.tsx +214 -7
- package/UI/Components/TelemetryViewer/components/TelemetryFacetSidebar.tsx +21 -3
- package/UI/Components/TextArea/TextArea.tsx +9 -2
- package/UI/Components/Workflow/ModelFieldPicker.tsx +10 -12
- package/UI/Styles/Theme.css +8 -0
- package/UI/esbuild-config.js +2 -32
- package/Utils/LabelRuleImportExport.ts +2 -0
- package/Utils/Markdown/UntrustedMarkdown.ts +1513 -0
- package/Utils/Monitor/IncomingEmailMonitorRequestUtil.ts +41 -0
- package/Utils/Monitor/MonitorLogSummaryUtil.ts +212 -0
- package/Utils/Telemetry/EntityKey.ts +48 -0
- package/build/dist/Models/DatabaseModels/AIConversation.js +125 -1
- package/build/dist/Models/DatabaseModels/AIConversation.js.map +1 -1
- package/build/dist/Models/DatabaseModels/CephCluster.js +12 -0
- package/build/dist/Models/DatabaseModels/CephCluster.js.map +1 -1
- package/build/dist/Models/DatabaseModels/CloudResource.js +12 -0
- package/build/dist/Models/DatabaseModels/CloudResource.js.map +1 -1
- package/build/dist/Models/DatabaseModels/DatabaseServer.js +12 -0
- package/build/dist/Models/DatabaseModels/DatabaseServer.js.map +1 -1
- package/build/dist/Models/DatabaseModels/DockerHost.js +12 -0
- package/build/dist/Models/DatabaseModels/DockerHost.js.map +1 -1
- package/build/dist/Models/DatabaseModels/DockerSwarmCluster.js +12 -0
- package/build/dist/Models/DatabaseModels/DockerSwarmCluster.js.map +1 -1
- package/build/dist/Models/DatabaseModels/GlobalOidc.js +0 -4
- package/build/dist/Models/DatabaseModels/GlobalOidc.js.map +1 -1
- package/build/dist/Models/DatabaseModels/GlobalOidcProject.js +0 -4
- package/build/dist/Models/DatabaseModels/GlobalOidcProject.js.map +1 -1
- package/build/dist/Models/DatabaseModels/GlobalSso.js +0 -4
- package/build/dist/Models/DatabaseModels/GlobalSso.js.map +1 -1
- package/build/dist/Models/DatabaseModels/GlobalSsoProject.js +0 -4
- package/build/dist/Models/DatabaseModels/GlobalSsoProject.js.map +1 -1
- package/build/dist/Models/DatabaseModels/Host.js +12 -0
- package/build/dist/Models/DatabaseModels/Host.js.map +1 -1
- package/build/dist/Models/DatabaseModels/IncidentForm.js +605 -0
- package/build/dist/Models/DatabaseModels/IncidentForm.js.map +1 -0
- package/build/dist/Models/DatabaseModels/IncidentFormSubmission.js +299 -0
- package/build/dist/Models/DatabaseModels/IncidentFormSubmission.js.map +1 -0
- package/build/dist/Models/DatabaseModels/IncidentTemplate.js +60 -0
- package/build/dist/Models/DatabaseModels/IncidentTemplate.js.map +1 -1
- package/build/dist/Models/DatabaseModels/Index.js +14 -0
- package/build/dist/Models/DatabaseModels/Index.js.map +1 -1
- package/build/dist/Models/DatabaseModels/IoTFleet.js +12 -0
- package/build/dist/Models/DatabaseModels/IoTFleet.js.map +1 -1
- package/build/dist/Models/DatabaseModels/KubernetesCluster.js +12 -0
- package/build/dist/Models/DatabaseModels/KubernetesCluster.js.map +1 -1
- package/build/dist/Models/DatabaseModels/MessageQueue.js +1106 -0
- package/build/dist/Models/DatabaseModels/MessageQueue.js.map +1 -0
- package/build/dist/Models/DatabaseModels/MessageQueueLabelRule.js +562 -0
- package/build/dist/Models/DatabaseModels/MessageQueueLabelRule.js.map +1 -0
- package/build/dist/Models/DatabaseModels/MessageQueueOwnerRule.js +643 -0
- package/build/dist/Models/DatabaseModels/MessageQueueOwnerRule.js.map +1 -0
- package/build/dist/Models/DatabaseModels/MessageQueueOwnerTeam.js +506 -0
- package/build/dist/Models/DatabaseModels/MessageQueueOwnerTeam.js.map +1 -0
- package/build/dist/Models/DatabaseModels/MessageQueueOwnerUser.js +505 -0
- package/build/dist/Models/DatabaseModels/MessageQueueOwnerUser.js.map +1 -0
- package/build/dist/Models/DatabaseModels/PodmanHost.js +12 -0
- package/build/dist/Models/DatabaseModels/PodmanHost.js.map +1 -1
- package/build/dist/Models/DatabaseModels/Project.js +61 -0
- package/build/dist/Models/DatabaseModels/Project.js.map +1 -1
- package/build/dist/Models/DatabaseModels/ProjectOidc.js +0 -4
- package/build/dist/Models/DatabaseModels/ProjectOidc.js.map +1 -1
- package/build/dist/Models/DatabaseModels/ProjectSso.js +0 -4
- package/build/dist/Models/DatabaseModels/ProjectSso.js.map +1 -1
- package/build/dist/Models/DatabaseModels/ProxmoxCluster.js +12 -0
- package/build/dist/Models/DatabaseModels/ProxmoxCluster.js.map +1 -1
- package/build/dist/Models/DatabaseModels/RumApplication.js +12 -0
- package/build/dist/Models/DatabaseModels/RumApplication.js.map +1 -1
- package/build/dist/Models/DatabaseModels/ServerlessFunction.js +12 -0
- package/build/dist/Models/DatabaseModels/ServerlessFunction.js.map +1 -1
- package/build/dist/Models/DatabaseModels/Service.js +12 -0
- package/build/dist/Models/DatabaseModels/Service.js.map +1 -1
- package/build/dist/Models/DatabaseModels/StatusPageOidc.js +0 -4
- package/build/dist/Models/DatabaseModels/StatusPageOidc.js.map +1 -1
- package/build/dist/Models/DatabaseModels/StatusPageSso.js +0 -4
- package/build/dist/Models/DatabaseModels/StatusPageSso.js.map +1 -1
- package/build/dist/Models/DatabaseModels/TeamComplianceSetting.js +49 -3
- package/build/dist/Models/DatabaseModels/TeamComplianceSetting.js.map +1 -1
- package/build/dist/Models/DatabaseModels/VMwareVCenter.js +12 -0
- package/build/dist/Models/DatabaseModels/VMwareVCenter.js.map +1 -1
- package/build/dist/Server/API/AIChatAPI.js +9 -103
- package/build/dist/Server/API/AIChatAPI.js.map +1 -1
- package/build/dist/Server/API/AIInvestigationAPI.js +3 -3
- package/build/dist/Server/API/AIInvestigationAPI.js.map +1 -1
- package/build/dist/Server/API/AIInvestigationConversationAPI.js +162 -0
- package/build/dist/Server/API/AIInvestigationConversationAPI.js.map +1 -0
- package/build/dist/Server/API/IncidentFormAPI.js +245 -0
- package/build/dist/Server/API/IncidentFormAPI.js.map +1 -0
- package/build/dist/Server/API/ProjectOIDC.js +16 -24
- package/build/dist/Server/API/ProjectOIDC.js.map +1 -1
- package/build/dist/Server/API/ProjectSSO.js +16 -24
- package/build/dist/Server/API/ProjectSSO.js.map +1 -1
- package/build/dist/Server/API/StatusPageAPI.js +42 -75
- package/build/dist/Server/API/StatusPageAPI.js.map +1 -1
- package/build/dist/Server/Enterprise/EnterpriseEdition.js +79 -25
- package/build/dist/Server/Enterprise/EnterpriseEdition.js.map +1 -1
- package/build/dist/Server/Enterprise/EnterpriseFeature.js +24 -3
- package/build/dist/Server/Enterprise/EnterpriseFeature.js.map +1 -1
- package/build/dist/Server/Enterprise/EnterpriseLicenseSnapshot.js +1 -1
- package/build/dist/Server/Enterprise/EnterpriseServerModule.js.map +1 -1
- package/build/dist/Server/EnvironmentConfig.js +1 -1
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1796400000000-AddIncidentForms.js +63 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1796400000000-AddIncidentForms.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1796500000000-AddTeamComplianceRuleNotificationChannels.js +41 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1796500000000-AddTeamComplianceRuleNotificationChannels.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1796600000000-AddAIInvestigationConversationAndTimeLimits.js +40 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1796600000000-AddAIInvestigationConversationAndTimeLimits.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1796700000000-AddMessageQueueTables.js +183 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1796700000000-AddMessageQueueTables.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js +8 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js.map +1 -1
- package/build/dist/Server/Middleware/IncidentFormRateLimit.js +559 -0
- package/build/dist/Server/Middleware/IncidentFormRateLimit.js.map +1 -0
- package/build/dist/Server/Middleware/UserAuthorization.js +11 -30
- package/build/dist/Server/Middleware/UserAuthorization.js.map +1 -1
- package/build/dist/Server/Services/AIService.js +10 -13
- package/build/dist/Server/Services/AIService.js.map +1 -1
- package/build/dist/Server/Services/IncidentCustomFieldService.js +83 -0
- package/build/dist/Server/Services/IncidentCustomFieldService.js.map +1 -1
- package/build/dist/Server/Services/IncidentEpisodeMemberService.js +8 -4
- package/build/dist/Server/Services/IncidentEpisodeMemberService.js.map +1 -1
- package/build/dist/Server/Services/IncidentEpisodeService.js +10 -1
- package/build/dist/Server/Services/IncidentEpisodeService.js.map +1 -1
- package/build/dist/Server/Services/IncidentFormService.js +1202 -0
- package/build/dist/Server/Services/IncidentFormService.js.map +1 -0
- package/build/dist/Server/Services/IncidentFormSubmissionService.js +91 -0
- package/build/dist/Server/Services/IncidentFormSubmissionService.js.map +1 -0
- package/build/dist/Server/Services/IncidentGroupingEngineService.js +20 -8
- package/build/dist/Server/Services/IncidentGroupingEngineService.js.map +1 -1
- package/build/dist/Server/Services/IncidentService.js +106 -4
- package/build/dist/Server/Services/IncidentService.js.map +1 -1
- package/build/dist/Server/Services/IncidentTemplateService.js +18 -0
- package/build/dist/Server/Services/IncidentTemplateService.js.map +1 -1
- package/build/dist/Server/Services/Index.js +14 -0
- package/build/dist/Server/Services/Index.js.map +1 -1
- package/build/dist/Server/Services/MessageQueueLabelRuleEngineService.js +262 -0
- package/build/dist/Server/Services/MessageQueueLabelRuleEngineService.js.map +1 -0
- package/build/dist/Server/Services/MessageQueueLabelRuleService.js +13 -0
- package/build/dist/Server/Services/MessageQueueLabelRuleService.js.map +1 -0
- package/build/dist/Server/Services/MessageQueueOwnerRuleEngineService.js +334 -0
- package/build/dist/Server/Services/MessageQueueOwnerRuleEngineService.js.map +1 -0
- package/build/dist/Server/Services/MessageQueueOwnerRuleService.js +13 -0
- package/build/dist/Server/Services/MessageQueueOwnerRuleService.js.map +1 -0
- package/build/dist/Server/Services/MessageQueueOwnerTeamService.js +62 -0
- package/build/dist/Server/Services/MessageQueueOwnerTeamService.js.map +1 -0
- package/build/dist/Server/Services/MessageQueueOwnerUserService.js +62 -0
- package/build/dist/Server/Services/MessageQueueOwnerUserService.js.map +1 -0
- package/build/dist/Server/Services/MessageQueueService.js +1140 -0
- package/build/dist/Server/Services/MessageQueueService.js.map +1 -0
- package/build/dist/Server/Services/OpenTelemetryIngestService.js +25 -4
- package/build/dist/Server/Services/OpenTelemetryIngestService.js.map +1 -1
- package/build/dist/Server/Services/ProjectService.js +0 -54
- package/build/dist/Server/Services/ProjectService.js.map +1 -1
- package/build/dist/Server/Services/StatusPagePrivateUserService.js +1 -4
- package/build/dist/Server/Services/StatusPagePrivateUserService.js.map +1 -1
- package/build/dist/Server/Services/StatusPageService.js +0 -46
- package/build/dist/Server/Services/StatusPageService.js.map +1 -1
- package/build/dist/Server/Services/TeamComplianceSettingService.js +120 -31
- package/build/dist/Server/Services/TeamComplianceSettingService.js.map +1 -1
- package/build/dist/Server/Services/UserNotificationRuleService.js +8 -1
- package/build/dist/Server/Services/UserNotificationRuleService.js.map +1 -1
- package/build/dist/Server/Services/WorkspaceNotificationSummaryService.js +12 -3
- package/build/dist/Server/Services/WorkspaceNotificationSummaryService.js.map +1 -1
- package/build/dist/Server/Types/Database/Permissions/CreatePermission.js +6 -3
- package/build/dist/Server/Types/Database/Permissions/CreatePermission.js.map +1 -1
- package/build/dist/Server/Types/Database/Permissions/EditionPermission.js +109 -37
- package/build/dist/Server/Types/Database/Permissions/EditionPermission.js.map +1 -1
- package/build/dist/Server/Types/Database/Permissions/OwnerTableRegistry.js +16 -0
- package/build/dist/Server/Types/Database/Permissions/OwnerTableRegistry.js.map +1 -1
- package/build/dist/Server/Types/Database/Permissions/TablePermission.js +3 -3
- package/build/dist/Server/Types/Database/Permissions/UpdatePermission.js +9 -6
- package/build/dist/Server/Types/Database/Permissions/UpdatePermission.js.map +1 -1
- package/build/dist/Server/Utils/AI/Chat/AgentContextCompactor.js +128 -0
- package/build/dist/Server/Utils/AI/Chat/AgentContextCompactor.js.map +1 -0
- package/build/dist/Server/Utils/AI/Chat/ChatAgentRunner.js +192 -50
- package/build/dist/Server/Utils/AI/Chat/ChatAgentRunner.js.map +1 -1
- package/build/dist/Server/Utils/AI/Chat/ChatRunCancellation.js +133 -0
- package/build/dist/Server/Utils/AI/Chat/ChatRunCancellation.js.map +1 -0
- package/build/dist/Server/Utils/AI/Chat/ObservabilityAssistant.js +53 -13
- package/build/dist/Server/Utils/AI/Chat/ObservabilityAssistant.js.map +1 -1
- package/build/dist/Server/Utils/AI/Chat/ObservabilityChatPrompt.js +1 -1
- package/build/dist/Server/Utils/AI/Chat/ToolOutputPager.js +206 -0
- package/build/dist/Server/Utils/AI/Chat/ToolOutputPager.js.map +1 -0
- package/build/dist/Server/Utils/AI/ClusterAccess/KubectlInvestigationToolkit.js +53 -26
- package/build/dist/Server/Utils/AI/ClusterAccess/KubectlInvestigationToolkit.js.map +1 -1
- package/build/dist/Server/Utils/AI/ClusterAccess/KubectlJobRunner.js +4 -2
- package/build/dist/Server/Utils/AI/ClusterAccess/KubectlJobRunner.js.map +1 -1
- package/build/dist/Server/Utils/AI/CodeFix/CodeFixReadiness.js +1 -29
- package/build/dist/Server/Utils/AI/CodeFix/CodeFixReadiness.js.map +1 -1
- package/build/dist/Server/Utils/AI/CodeFix/FixRunBudget.js +24 -24
- package/build/dist/Server/Utils/AI/CodeFix/FixRunBudget.js.map +1 -1
- package/build/dist/Server/Utils/AI/Remediation/RemediationCommandTools.js +7 -2
- package/build/dist/Server/Utils/AI/Remediation/RemediationCommandTools.js.map +1 -1
- package/build/dist/Server/Utils/AI/Remediation/RemediationExecutionRunner.js +29 -14
- package/build/dist/Server/Utils/AI/Remediation/RemediationExecutionRunner.js.map +1 -1
- package/build/dist/Server/Utils/AI/ResourceAccess/InfrastructureInvestigationToolkit.js +38 -14
- package/build/dist/Server/Utils/AI/ResourceAccess/InfrastructureInvestigationToolkit.js.map +1 -1
- package/build/dist/Server/Utils/AI/ResourceAccess/ResourceCommandJobRunner.js +2 -0
- package/build/dist/Server/Utils/AI/ResourceAccess/ResourceCommandJobRunner.js.map +1 -1
- package/build/dist/Server/Utils/AI/SRE/AIInvestigationEngine.js +40 -10
- package/build/dist/Server/Utils/AI/SRE/AIInvestigationEngine.js.map +1 -1
- package/build/dist/Server/Utils/AI/SRE/AlertInvestigationRunner.js +19 -7
- package/build/dist/Server/Utils/AI/SRE/AlertInvestigationRunner.js.map +1 -1
- package/build/dist/Server/Utils/AI/SRE/IncidentInvestigationRunner.js +19 -7
- package/build/dist/Server/Utils/AI/SRE/IncidentInvestigationRunner.js.map +1 -1
- package/build/dist/Server/Utils/AI/SRE/InvestigationQueue.js +15 -18
- package/build/dist/Server/Utils/AI/SRE/InvestigationQueue.js.map +1 -1
- package/build/dist/Server/Utils/AI/SRE/InvestigationThread.js +412 -0
- package/build/dist/Server/Utils/AI/SRE/InvestigationThread.js.map +1 -0
- package/build/dist/Server/Utils/AI/SRE/InvestigationThreadService.js +495 -0
- package/build/dist/Server/Utils/AI/SRE/InvestigationThreadService.js.map +1 -0
- package/build/dist/Server/Utils/AI/Toolbox/Serializer.js +10 -3
- package/build/dist/Server/Utils/AI/Toolbox/Serializer.js.map +1 -1
- package/build/dist/Server/Utils/EditionEnforcement.js +20 -158
- package/build/dist/Server/Utils/EditionEnforcement.js.map +1 -1
- package/build/dist/Server/Utils/LLM/LLMService.js +193 -54
- package/build/dist/Server/Utils/LLM/LLMService.js.map +1 -1
- package/build/dist/Server/Utils/RelaxedScimTeamLocksReport.js +160 -0
- package/build/dist/Server/Utils/RelaxedScimTeamLocksReport.js.map +1 -0
- 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/SameOriginRequest.js +151 -0
- package/build/dist/Server/Utils/SameOriginRequest.js.map +1 -0
- 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/EntityRegistry.js +4 -1
- package/build/dist/Server/Utils/Telemetry/EntityRegistry.js.map +1 -1
- package/build/dist/Server/Utils/Telemetry/MessageQueueDiscovery.js +1015 -0
- package/build/dist/Server/Utils/Telemetry/MessageQueueDiscovery.js.map +1 -0
- package/build/dist/Server/Utils/Telemetry/ResourceEntityFilter.js +4 -1
- package/build/dist/Server/Utils/Telemetry/ResourceEntityFilter.js.map +1 -1
- package/build/dist/Server/Utils/VendorAssets.js +3 -3
- package/build/dist/Server/Utils/Workspace/MicrosoftTeams/Actions/Incident.js +3 -1
- package/build/dist/Server/Utils/Workspace/MicrosoftTeams/Actions/Incident.js.map +1 -1
- package/build/dist/Server/Utils/Workspace/MicrosoftTeams/Actions/IncidentEpisode.js +3 -1
- package/build/dist/Server/Utils/Workspace/MicrosoftTeams/Actions/IncidentEpisode.js.map +1 -1
- package/build/dist/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeams.js +10 -1
- package/build/dist/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeams.js.map +1 -1
- package/build/dist/Types/AI/AIAgentRunLimits.js +91 -0
- package/build/dist/Types/AI/AIAgentRunLimits.js.map +1 -0
- package/build/dist/Types/Code/CodeType.js +2 -0
- package/build/dist/Types/Code/CodeType.js.map +1 -1
- package/build/dist/Types/Code/JsonSyntax.js +604 -0
- package/build/dist/Types/Code/JsonSyntax.js.map +1 -0
- package/build/dist/Types/CustomField/CustomFieldCreateSettings.js +310 -0
- package/build/dist/Types/CustomField/CustomFieldCreateSettings.js.map +1 -0
- package/build/dist/Types/CustomField/CustomFieldMappingCatalog.js +38 -0
- package/build/dist/Types/CustomField/CustomFieldMappingCatalog.js.map +1 -1
- package/build/dist/Types/CustomField/CustomFieldValueValidator.js +10 -7
- package/build/dist/Types/CustomField/CustomFieldValueValidator.js.map +1 -1
- package/build/dist/Types/EnterpriseLicense/EnterpriseLicensePeriods.js +1 -1
- package/build/dist/Types/Icon/IconProp.js +2 -0
- package/build/dist/Types/Icon/IconProp.js.map +1 -1
- package/build/dist/Types/Incident/IncidentFormIpAllowlist.js +119 -0
- package/build/dist/Types/Incident/IncidentFormIpAllowlist.js.map +1 -0
- package/build/dist/Types/Incident/IncidentFormPublic.js +678 -0
- package/build/dist/Types/Incident/IncidentFormPublic.js.map +1 -0
- package/build/dist/Types/Kubernetes/KubernetesClusterAiAccess.js +10 -3
- package/build/dist/Types/Kubernetes/KubernetesClusterAiAccess.js.map +1 -1
- package/build/dist/Types/MessageQueue/MessageQueueIdentity.js +184 -0
- package/build/dist/Types/MessageQueue/MessageQueueIdentity.js.map +1 -0
- package/build/dist/Types/MessageQueue/MessageQueueManualIdentity.js +190 -0
- package/build/dist/Types/MessageQueue/MessageQueueManualIdentity.js.map +1 -0
- package/build/dist/Types/MessageQueue/MessageQueueMetricCatalog.js +1057 -0
- package/build/dist/Types/MessageQueue/MessageQueueMetricCatalog.js.map +1 -0
- package/build/dist/Types/MessageQueue/MessagingSystem.js +394 -0
- package/build/dist/Types/MessageQueue/MessagingSystem.js.map +1 -0
- package/build/dist/Types/MessageQueue/MessagingTelemetryResolver.js +1768 -0
- package/build/dist/Types/MessageQueue/MessagingTelemetryResolver.js.map +1 -0
- package/build/dist/Types/Monitor/MessageQueueAlertTemplates.js +1207 -0
- package/build/dist/Types/Monitor/MessageQueueAlertTemplates.js.map +1 -0
- package/build/dist/Types/Permission.js +274 -0
- package/build/dist/Types/Permission.js.map +1 -1
- package/build/dist/Types/ResourceAiAgent/ResourceAiAccess.js +10 -4
- package/build/dist/Types/ResourceAiAgent/ResourceAiAccess.js.map +1 -1
- package/build/dist/Types/Rules/RuleCriteriaFieldRegistry.js +12 -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/Team/ComplianceNotificationChannel.js +4 -3
- package/build/dist/Types/Team/ComplianceNotificationChannel.js.map +1 -1
- package/build/dist/Types/Team/ComplianceRule.js +48 -14
- package/build/dist/Types/Team/ComplianceRule.js.map +1 -1
- package/build/dist/Types/Team/ComplianceRuleType.js +2 -2
- package/build/dist/Types/Telemetry/EntityType.js +16 -0
- package/build/dist/Types/Telemetry/EntityType.js.map +1 -1
- package/build/dist/Types/XML.js +23 -0
- package/build/dist/Types/XML.js.map +1 -1
- package/build/dist/UI/Components/CodeEditor/CodeEditor.js +641 -266
- package/build/dist/UI/Components/CodeEditor/CodeEditor.js.map +1 -1
- package/build/dist/UI/Components/CodeEditor/CodeEditorCommands.js +464 -0
- package/build/dist/UI/Components/CodeEditor/CodeEditorCommands.js.map +1 -0
- package/build/dist/UI/Components/CodeEditor/CodeEditorHighlight.js +69 -0
- package/build/dist/UI/Components/CodeEditor/CodeEditorHighlight.js.map +1 -0
- package/build/dist/UI/Components/CodeEditor/CodeEditorLanguages.js +108 -0
- package/build/dist/UI/Components/CodeEditor/CodeEditorLanguages.js.map +1 -0
- package/build/dist/UI/Components/CodeEditor/YamlEditor.js +14 -186
- package/build/dist/UI/Components/CodeEditor/YamlEditor.js.map +1 -1
- package/build/dist/UI/Components/CopyTextButton/CopyTextButton.js +5 -1
- package/build/dist/UI/Components/CopyTextButton/CopyTextButton.js.map +1 -1
- package/build/dist/UI/Components/CustomFields/CustomFieldModelFormFields.js +5 -14
- package/build/dist/UI/Components/CustomFields/CustomFieldModelFormFields.js.map +1 -1
- package/build/dist/UI/Components/EditionLabel/EditionLabel.js +14 -13
- package/build/dist/UI/Components/EditionLabel/EditionLabel.js.map +1 -1
- package/build/dist/UI/Components/ErrorMessage/ErrorMessage.js +1 -1
- package/build/dist/UI/Components/ErrorMessage/ErrorMessage.js.map +1 -1
- package/build/dist/UI/Components/Forms/Fields/FormField.js +8 -3
- package/build/dist/UI/Components/Forms/Fields/FormField.js.map +1 -1
- package/build/dist/UI/Components/Icon/Icon.js +8 -0
- package/build/dist/UI/Components/Icon/Icon.js.map +1 -1
- package/build/dist/UI/Components/Input/Input.js +11 -3
- package/build/dist/UI/Components/Input/Input.js.map +1 -1
- package/build/dist/UI/Components/LogsViewer/LogsViewer.js +2 -1
- package/build/dist/UI/Components/LogsViewer/LogsViewer.js.map +1 -1
- package/build/dist/UI/Components/LogsViewer/components/LogsFacetSidebar.js +14 -4
- package/build/dist/UI/Components/LogsViewer/components/LogsFacetSidebar.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/Markdown.tsx/MarkdownEditor.js +710 -65
- package/build/dist/UI/Components/Markdown.tsx/MarkdownEditor.js.map +1 -1
- package/build/dist/UI/Components/Markdown.tsx/MarkdownEditorHistory.js +238 -0
- package/build/dist/UI/Components/Markdown.tsx/MarkdownEditorHistory.js.map +1 -0
- package/build/dist/UI/Components/Markdown.tsx/MarkdownListEditing.js +1028 -0
- package/build/dist/UI/Components/Markdown.tsx/MarkdownListEditing.js.map +1 -0
- package/build/dist/UI/Components/Markdown.tsx/MarkdownPaste.js +1088 -0
- package/build/dist/UI/Components/Markdown.tsx/MarkdownPaste.js.map +1 -0
- package/build/dist/UI/Components/Markdown.tsx/MarkdownViewer.js +70 -10
- package/build/dist/UI/Components/Markdown.tsx/MarkdownViewer.js.map +1 -1
- package/build/dist/UI/Components/Markdown.tsx/MarkdownVisualEditing.js +887 -0
- package/build/dist/UI/Components/Markdown.tsx/MarkdownVisualEditing.js.map +1 -0
- package/build/dist/UI/Components/ModelTable/BaseModelTable.js +57 -6
- package/build/dist/UI/Components/ModelTable/BaseModelTable.js.map +1 -1
- package/build/dist/UI/Components/ResetObjectID/ResetObjectID.js +7 -5
- package/build/dist/UI/Components/ResetObjectID/ResetObjectID.js.map +1 -1
- package/build/dist/UI/Components/Table/EmptyTableMessage.js +51 -0
- package/build/dist/UI/Components/Table/EmptyTableMessage.js.map +1 -0
- package/build/dist/UI/Components/Table/Table.js +30 -11
- package/build/dist/UI/Components/Table/Table.js.map +1 -1
- package/build/dist/UI/Components/Table/TableRow.js +9 -2
- package/build/dist/UI/Components/Table/TableRow.js.map +1 -1
- package/build/dist/UI/Components/TelemetryViewer/FacetVisibility.js +63 -1
- package/build/dist/UI/Components/TelemetryViewer/FacetVisibility.js.map +1 -1
- package/build/dist/UI/Components/TelemetryViewer/TelemetryViewer.js +4 -2
- package/build/dist/UI/Components/TelemetryViewer/TelemetryViewer.js.map +1 -1
- package/build/dist/UI/Components/TelemetryViewer/components/LockedFilterChip.js +91 -10
- package/build/dist/UI/Components/TelemetryViewer/components/LockedFilterChip.js.map +1 -1
- package/build/dist/UI/Components/TelemetryViewer/components/TelemetryFacetSidebar.js +14 -4
- package/build/dist/UI/Components/TelemetryViewer/components/TelemetryFacetSidebar.js.map +1 -1
- package/build/dist/UI/Components/TextArea/TextArea.js +9 -3
- package/build/dist/UI/Components/TextArea/TextArea.js.map +1 -1
- package/build/dist/UI/Components/Workflow/ModelFieldPicker.js +1 -2
- package/build/dist/UI/Components/Workflow/ModelFieldPicker.js.map +1 -1
- package/build/dist/Utils/LabelRuleImportExport.js +2 -0
- package/build/dist/Utils/LabelRuleImportExport.js.map +1 -1
- package/build/dist/Utils/Markdown/UntrustedMarkdown.js +988 -0
- package/build/dist/Utils/Markdown/UntrustedMarkdown.js.map +1 -0
- package/build/dist/Utils/Monitor/IncomingEmailMonitorRequestUtil.js +34 -0
- package/build/dist/Utils/Monitor/IncomingEmailMonitorRequestUtil.js.map +1 -0
- package/build/dist/Utils/Monitor/MonitorLogSummaryUtil.js +148 -0
- package/build/dist/Utils/Monitor/MonitorLogSummaryUtil.js.map +1 -0
- package/build/dist/Utils/Telemetry/EntityKey.js +36 -0
- package/build/dist/Utils/Telemetry/EntityKey.js.map +1 -1
- package/package.json +1 -3
- package/Server/Utils/CommunityEditionSsoReport.ts +0 -361
- package/Tests/App/Accounts/LoginSsoEdition.test.tsx +0 -616
- package/Tests/App/AdminDashboard/AdminAuthenticationSsoEdition.test.tsx +0 -217
- package/Tests/App/AdminDashboard/GlobalSSOEnterpriseShells.test.tsx +0 -271
- package/Tests/App/Dashboard/CloudDocumentationMarkdown.test.ts +0 -215
- package/Tests/App/Dashboard/TelemetryResourceRetentionSettings.test.tsx +0 -784
- package/Tests/Server/Middleware/UserAuthorizationEditionEnforcement.test.ts +0 -518
- package/Tests/Server/Services/SsoRequirementReadMasking.test.ts +0 -419
- package/Tests/Server/Services/SsoRequirementWriteGuard.test.ts +0 -769
- package/Tests/UI/Components/CodeEditor.test.tsx +0 -638
- package/Tests/UI/Components/MonacoLoader.test.ts +0 -67
- package/Tests/UI/Components/MonacoRuntime.test.ts +0 -121
- package/Tests/UI/Components/Telemetry/TelemetryRetentionConfigForm.test.tsx +0 -329
- package/Tests/UI/Components/YamlEditor.test.tsx +0 -847
- package/UI/Components/CodeEditor/MonacoLoader.ts +0 -36
- package/UI/Components/Telemetry/TelemetryRetentionConfigForm.tsx +0 -319
- package/UI/Components/Telemetry/TelemetryRetentionConfigSummary.tsx +0 -223
- package/build/dist/Server/Utils/CommunityEditionSsoReport.js +0 -223
- package/build/dist/Server/Utils/CommunityEditionSsoReport.js.map +0 -1
- package/build/dist/UI/Components/CodeEditor/MonacoLoader.js +0 -34
- package/build/dist/UI/Components/CodeEditor/MonacoLoader.js.map +0 -1
- package/build/dist/UI/Components/Telemetry/TelemetryRetentionConfigForm.js +0 -171
- package/build/dist/UI/Components/Telemetry/TelemetryRetentionConfigForm.js.map +0 -1
- package/build/dist/UI/Components/Telemetry/TelemetryRetentionConfigSummary.js +0 -119
- package/build/dist/UI/Components/Telemetry/TelemetryRetentionConfigSummary.js.map +0 -1
|
@@ -0,0 +1,1028 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Indenting and outdenting list items, in both of the MarkdownEditor's modes,
|
|
3
|
+
* and the list buttons' clean-up of bullet characters typed as text.
|
|
4
|
+
*
|
|
5
|
+
* Visual mode works on the contenteditable DOM directly: the selected items
|
|
6
|
+
* are moved under the item before them (indent) or out beside their parent
|
|
7
|
+
* (outdent). document.execCommand("indent") is no substitute -- Chromium,
|
|
8
|
+
* Firefox and WebKit all answer it with a <ul> directly inside a <ul>, which
|
|
9
|
+
* is not a list item at all, and the serializer drops that item on save.
|
|
10
|
+
*
|
|
11
|
+
* Markdown mode works on the source lines. A nested item has to start at its
|
|
12
|
+
* parent's content column -- two columns in under "- ", three under "1. ",
|
|
13
|
+
* four under "10. " -- or CommonMark (and the email renderer, marked) reads
|
|
14
|
+
* it as a sibling rather than a child, so indenting moves a line to the
|
|
15
|
+
* content column of the item above it rather than by a fixed width.
|
|
16
|
+
*
|
|
17
|
+
* Both return whether they changed anything. The editor only claims the Tab
|
|
18
|
+
* key when they did, so Tab still moves focus out of the editor everywhere
|
|
19
|
+
* else -- a list's first item, a top-level item on Shift+Tab, a paragraph --
|
|
20
|
+
* and a keyboard user is never trapped inside the field.
|
|
21
|
+
*/
|
|
22
|
+
/*
|
|
23
|
+
* Characters other apps put in front of a list item as plain text: Word and
|
|
24
|
+
* Outlook ("•", and "·" / U+F0B7 from the Symbol font), Slack ("•", "◦",
|
|
25
|
+
* "▪"), Google Docs and PowerPoint (the squares, diamonds and arrows), and
|
|
26
|
+
* the dashes many people type by hand. Word's second and third levels are
|
|
27
|
+
* "o" and "§" (U+F0A7 from Wingdings), recognised only before a tab so that
|
|
28
|
+
* a sentence starting with the word "o" is left alone.
|
|
29
|
+
*/
|
|
30
|
+
export const TEXT_BULLET_GLYPHS = "•◦▪▫‣⁃∙·●○■□◆◇➢➤►▶–—\uF0B7\uF0A7";
|
|
31
|
+
// Word's level-two and level-three bullets, which only count before a tab.
|
|
32
|
+
export const TAB_ONLY_BULLET_GLYPHS = "o§";
|
|
33
|
+
/*
|
|
34
|
+
* A marker at the start of a list item's own text that the list itself now
|
|
35
|
+
* draws: a bullet character followed by a space or tab (or on its own),
|
|
36
|
+
* Word's "o" / "§" before a tab, a "- " left behind as text, or a number the
|
|
37
|
+
* way Word and Outlook write one into plain text -- "1." followed by a tab
|
|
38
|
+
* or a run of spaces. A number followed by a single space is left alone:
|
|
39
|
+
* "2021. was a good year" is a sentence. So is a line whose text merely
|
|
40
|
+
* starts with one of the characters -- the dash in "–5°C overnight low" is a
|
|
41
|
+
* minus sign, and "—Mark Twain" an attribution -- which the paste's own
|
|
42
|
+
* bullet rule (MarkdownPaste) leaves alone too.
|
|
43
|
+
* \u00a0 is included because Word and browsers write the space after a
|
|
44
|
+
* marker as a non-breaking one.
|
|
45
|
+
*/
|
|
46
|
+
const RE_LEADING_TEXT_MARKER = new RegExp(`^[ \\t\\u00a0]*(?:[${TEXT_BULLET_GLYPHS}](?:[ \\t\\u00a0]+|$)|[${TAB_ONLY_BULLET_GLYPHS}]\\t[ \\t\\u00a0]*|[-*+][ \\t\\u00a0]+|\\d{1,9}[.)](?:\\t|[ \\u00a0]{2,})[ \\t\\u00a0]*)`);
|
|
47
|
+
// A tab advances to the next multiple of four columns, as in CommonMark.
|
|
48
|
+
const TAB_WIDTH = 4;
|
|
49
|
+
/*
|
|
50
|
+
* ---------------------------------------------------------------------------
|
|
51
|
+
* Visual mode: the contenteditable DOM
|
|
52
|
+
* ---------------------------------------------------------------------------
|
|
53
|
+
*/
|
|
54
|
+
const tagOf = (node) => {
|
|
55
|
+
if (!node || node.nodeType !== Node.ELEMENT_NODE) {
|
|
56
|
+
return "";
|
|
57
|
+
}
|
|
58
|
+
return node.localName.toLowerCase();
|
|
59
|
+
};
|
|
60
|
+
const isList = (node) => {
|
|
61
|
+
const tag = tagOf(node);
|
|
62
|
+
return tag === "ul" || tag === "ol";
|
|
63
|
+
};
|
|
64
|
+
const isListItem = (node) => {
|
|
65
|
+
return tagOf(node) === "li";
|
|
66
|
+
};
|
|
67
|
+
const getSelectionInRoot = (root) => {
|
|
68
|
+
const selection = root.ownerDocument.getSelection();
|
|
69
|
+
if (!selection || selection.rangeCount === 0) {
|
|
70
|
+
return null;
|
|
71
|
+
}
|
|
72
|
+
const range = selection.getRangeAt(0);
|
|
73
|
+
if (!root.contains(range.startContainer)) {
|
|
74
|
+
return null;
|
|
75
|
+
}
|
|
76
|
+
return { selection, range };
|
|
77
|
+
};
|
|
78
|
+
/*
|
|
79
|
+
* The nearest <li> at or above `node`, without leaving `root`. None from
|
|
80
|
+
* inside a code block, even one in a list item: Tab there is not a list
|
|
81
|
+
* edit, as the source mode skips the lines of a fenced block.
|
|
82
|
+
*/
|
|
83
|
+
const closestListItem = (node, root) => {
|
|
84
|
+
let current = node;
|
|
85
|
+
while (current && current !== root) {
|
|
86
|
+
if (isListItem(current)) {
|
|
87
|
+
return current;
|
|
88
|
+
}
|
|
89
|
+
if (tagOf(current) === "pre") {
|
|
90
|
+
return null;
|
|
91
|
+
}
|
|
92
|
+
current = current.parentNode;
|
|
93
|
+
}
|
|
94
|
+
return null;
|
|
95
|
+
};
|
|
96
|
+
/*
|
|
97
|
+
* The <li> the selection starts in. A boundary that sits on a list itself,
|
|
98
|
+
* or in the whitespace between two of its items, belongs to the item after
|
|
99
|
+
* it.
|
|
100
|
+
*/
|
|
101
|
+
const listItemAtSelectionStart = (range, root) => {
|
|
102
|
+
let node = range.startContainer;
|
|
103
|
+
if (node.nodeType === Node.ELEMENT_NODE) {
|
|
104
|
+
const child = node.childNodes[range.startOffset];
|
|
105
|
+
if (child) {
|
|
106
|
+
node = child;
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
if (isList(node)) {
|
|
110
|
+
const firstItem = node.querySelector(":scope > li");
|
|
111
|
+
if (firstItem) {
|
|
112
|
+
node = firstItem;
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
else if (!isListItem(node) && isList(node.parentNode)) {
|
|
116
|
+
let next = node.nextSibling;
|
|
117
|
+
while (next && !isListItem(next)) {
|
|
118
|
+
next = next.nextSibling;
|
|
119
|
+
}
|
|
120
|
+
if (next) {
|
|
121
|
+
node = next;
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
return closestListItem(node, root);
|
|
125
|
+
};
|
|
126
|
+
/*
|
|
127
|
+
* Whether the range selects any of `item` -- not merely touches it. A
|
|
128
|
+
* selection dragged down to the very start of the next item (which is what
|
|
129
|
+
* a triple click leaves behind) does not take that item along, the same way
|
|
130
|
+
* a textarea selection ending at column 0 does not take that line.
|
|
131
|
+
*/
|
|
132
|
+
const rangeSelectsInto = (range, item) => {
|
|
133
|
+
if (!range.intersectsNode(item)) {
|
|
134
|
+
return false;
|
|
135
|
+
}
|
|
136
|
+
if (!item.contains(range.endContainer)) {
|
|
137
|
+
return true;
|
|
138
|
+
}
|
|
139
|
+
const head = item.ownerDocument.createRange();
|
|
140
|
+
head.setStart(item, 0);
|
|
141
|
+
head.setEnd(range.endContainer, range.endOffset);
|
|
142
|
+
return head.toString().length > 0;
|
|
143
|
+
};
|
|
144
|
+
/*
|
|
145
|
+
* The items an indent or outdent moves: the one the selection starts in,
|
|
146
|
+
* plus the siblings after it that the selection reaches. Items at other
|
|
147
|
+
* levels move along with these (as their children) rather than on their own.
|
|
148
|
+
*/
|
|
149
|
+
const selectedSiblingItems = (range, root) => {
|
|
150
|
+
const first = listItemAtSelectionStart(range, root);
|
|
151
|
+
if (!first || !isList(first.parentNode)) {
|
|
152
|
+
return [];
|
|
153
|
+
}
|
|
154
|
+
const items = [first];
|
|
155
|
+
let sibling = first.nextElementSibling;
|
|
156
|
+
while (sibling &&
|
|
157
|
+
isListItem(sibling) &&
|
|
158
|
+
rangeSelectsInto(range, sibling)) {
|
|
159
|
+
items.push(sibling);
|
|
160
|
+
sibling = sibling.nextElementSibling;
|
|
161
|
+
}
|
|
162
|
+
return items;
|
|
163
|
+
};
|
|
164
|
+
const saveSelection = (selection) => {
|
|
165
|
+
if (!selection.anchorNode || !selection.focusNode) {
|
|
166
|
+
return null;
|
|
167
|
+
}
|
|
168
|
+
return {
|
|
169
|
+
anchorNode: selection.anchorNode,
|
|
170
|
+
anchorOffset: selection.anchorOffset,
|
|
171
|
+
focusNode: selection.focusNode,
|
|
172
|
+
focusOffset: selection.focusOffset,
|
|
173
|
+
};
|
|
174
|
+
};
|
|
175
|
+
const nodeLength = (node) => {
|
|
176
|
+
if (node.nodeType === Node.TEXT_NODE || node.nodeType === Node.COMMENT_NODE) {
|
|
177
|
+
return node.length;
|
|
178
|
+
}
|
|
179
|
+
return node.childNodes.length;
|
|
180
|
+
};
|
|
181
|
+
/*
|
|
182
|
+
* Moving a node collapses any selection inside it to the spot it was moved
|
|
183
|
+
* from, so the selection is put back by hand. The nodes it was anchored in
|
|
184
|
+
* move rather than get recreated, so the same boundary points still name the
|
|
185
|
+
* same characters.
|
|
186
|
+
*/
|
|
187
|
+
const restoreSelection = (selection, saved, root, fallback) => {
|
|
188
|
+
try {
|
|
189
|
+
if (saved &&
|
|
190
|
+
root.contains(saved.anchorNode) &&
|
|
191
|
+
root.contains(saved.focusNode)) {
|
|
192
|
+
selection.setBaseAndExtent(saved.anchorNode, Math.min(saved.anchorOffset, nodeLength(saved.anchorNode)), saved.focusNode, Math.min(saved.focusOffset, nodeLength(saved.focusNode)));
|
|
193
|
+
return;
|
|
194
|
+
}
|
|
195
|
+
const caret = root.ownerDocument.createRange();
|
|
196
|
+
caret.setStart(fallback, 0);
|
|
197
|
+
caret.collapse(true);
|
|
198
|
+
selection.removeAllRanges();
|
|
199
|
+
selection.addRange(caret);
|
|
200
|
+
}
|
|
201
|
+
catch (_a) {
|
|
202
|
+
// Leave the selection where the browser put it rather than fail the edit.
|
|
203
|
+
}
|
|
204
|
+
};
|
|
205
|
+
// The list an item's children sit in, created (like `list`) when it has none.
|
|
206
|
+
const trailingSublist = (item, like) => {
|
|
207
|
+
const last = item.lastElementChild;
|
|
208
|
+
if (last && isList(last)) {
|
|
209
|
+
return last;
|
|
210
|
+
}
|
|
211
|
+
const sublist = item.ownerDocument.createElement(tagOf(like));
|
|
212
|
+
if (like.classList.contains("task-list")) {
|
|
213
|
+
sublist.className = "task-list";
|
|
214
|
+
}
|
|
215
|
+
item.appendChild(sublist);
|
|
216
|
+
return sublist;
|
|
217
|
+
};
|
|
218
|
+
/*
|
|
219
|
+
* Indent: the selected items become the last children of the item before
|
|
220
|
+
* them, joining its nested list when it has one (and taking that list's kind)
|
|
221
|
+
* or starting a new one of their own list's kind. Their own nested items move
|
|
222
|
+
* with them. The first item of a list has nothing to nest under, so it is left
|
|
223
|
+
* alone and this returns false.
|
|
224
|
+
*/
|
|
225
|
+
export const sinkListItems = (root) => {
|
|
226
|
+
const context = getSelectionInRoot(root);
|
|
227
|
+
if (!context) {
|
|
228
|
+
return false;
|
|
229
|
+
}
|
|
230
|
+
const items = selectedSiblingItems(context.range, root);
|
|
231
|
+
const first = items[0];
|
|
232
|
+
if (!first) {
|
|
233
|
+
return false;
|
|
234
|
+
}
|
|
235
|
+
const previous = first.previousElementSibling;
|
|
236
|
+
if (!previous || !isListItem(previous)) {
|
|
237
|
+
return false;
|
|
238
|
+
}
|
|
239
|
+
const list = first.parentNode;
|
|
240
|
+
const saved = saveSelection(context.selection);
|
|
241
|
+
const target = trailingSublist(previous, list);
|
|
242
|
+
for (const item of items) {
|
|
243
|
+
target.appendChild(item);
|
|
244
|
+
}
|
|
245
|
+
restoreSelection(context.selection, saved, root, first);
|
|
246
|
+
return true;
|
|
247
|
+
};
|
|
248
|
+
/*
|
|
249
|
+
* Outdent: the selected items move out of their list to sit right after the
|
|
250
|
+
* item that held it. The items that followed them in that list stay below
|
|
251
|
+
* them, so they become the last moved item's children -- as in Google Docs
|
|
252
|
+
* and Word, the text keeps its order -- and so does whatever that item held
|
|
253
|
+
* after the list: a paragraph that goes on below the nested items, or a
|
|
254
|
+
* nested list of the other kind. Left in place, those came out above the
|
|
255
|
+
* moved items. The markdown-source outdent keeps the same order. A top-level
|
|
256
|
+
* item has nowhere to go, so this returns false for it (and never lifts an
|
|
257
|
+
* item out of `root` itself).
|
|
258
|
+
*/
|
|
259
|
+
export const liftListItems = (root) => {
|
|
260
|
+
const context = getSelectionInRoot(root);
|
|
261
|
+
if (!context) {
|
|
262
|
+
return false;
|
|
263
|
+
}
|
|
264
|
+
const items = selectedSiblingItems(context.range, root);
|
|
265
|
+
const first = items[0];
|
|
266
|
+
const last = items[items.length - 1];
|
|
267
|
+
if (!first || !last) {
|
|
268
|
+
return false;
|
|
269
|
+
}
|
|
270
|
+
const list = first.parentNode;
|
|
271
|
+
const parentItem = list.parentNode;
|
|
272
|
+
const outerList = parentItem
|
|
273
|
+
? parentItem.parentNode
|
|
274
|
+
: null;
|
|
275
|
+
if (!parentItem ||
|
|
276
|
+
!outerList ||
|
|
277
|
+
!isListItem(parentItem) ||
|
|
278
|
+
parentItem === root ||
|
|
279
|
+
!root.contains(parentItem)) {
|
|
280
|
+
return false;
|
|
281
|
+
}
|
|
282
|
+
const saved = saveSelection(context.selection);
|
|
283
|
+
const trailing = [];
|
|
284
|
+
let next = last.nextElementSibling;
|
|
285
|
+
while (next) {
|
|
286
|
+
trailing.push(next);
|
|
287
|
+
next = next.nextElementSibling;
|
|
288
|
+
}
|
|
289
|
+
if (trailing.length > 0) {
|
|
290
|
+
const sublist = trailingSublist(last, list);
|
|
291
|
+
for (const item of trailing) {
|
|
292
|
+
sublist.appendChild(item);
|
|
293
|
+
}
|
|
294
|
+
}
|
|
295
|
+
/*
|
|
296
|
+
* After the items that followed, not before: a nested list of the other
|
|
297
|
+
* kind moved in first would be taken for the last item's own sublist, and
|
|
298
|
+
* the followers would go into it.
|
|
299
|
+
*/
|
|
300
|
+
let after = list.nextSibling;
|
|
301
|
+
while (after) {
|
|
302
|
+
const following = after.nextSibling;
|
|
303
|
+
last.appendChild(after);
|
|
304
|
+
after = following;
|
|
305
|
+
}
|
|
306
|
+
let anchor = parentItem;
|
|
307
|
+
for (const item of items) {
|
|
308
|
+
outerList.insertBefore(item, anchor.nextSibling);
|
|
309
|
+
anchor = item;
|
|
310
|
+
}
|
|
311
|
+
if (list.children.length === 0) {
|
|
312
|
+
list.remove();
|
|
313
|
+
}
|
|
314
|
+
restoreSelection(context.selection, saved, root, first);
|
|
315
|
+
return true;
|
|
316
|
+
};
|
|
317
|
+
// The text nodes that make up an item's own text, in order -- not its sublists'.
|
|
318
|
+
const ownTextNodes = (item) => {
|
|
319
|
+
const texts = [];
|
|
320
|
+
const walk = (node) => {
|
|
321
|
+
for (const child of Array.from(node.childNodes)) {
|
|
322
|
+
if (child.nodeType === Node.TEXT_NODE) {
|
|
323
|
+
texts.push(child);
|
|
324
|
+
}
|
|
325
|
+
else if (child.nodeType === Node.ELEMENT_NODE && !isList(child)) {
|
|
326
|
+
walk(child);
|
|
327
|
+
}
|
|
328
|
+
}
|
|
329
|
+
};
|
|
330
|
+
walk(item);
|
|
331
|
+
return texts;
|
|
332
|
+
};
|
|
333
|
+
const INLINE_CONTENT_SELECTOR = "img, br, input";
|
|
334
|
+
/*
|
|
335
|
+
* Removes the marker at the start of one item's text. The marker can be
|
|
336
|
+
* split over several text nodes -- "•" in a <span>, the space after it
|
|
337
|
+
* outside -- so the leading text is matched as one string and then trimmed
|
|
338
|
+
* node by node. Inline elements the marker leaves empty go too, or an empty
|
|
339
|
+
* <strong> would come back as "****".
|
|
340
|
+
*/
|
|
341
|
+
const stripLeadingMarker = (item) => {
|
|
342
|
+
const texts = ownTextNodes(item);
|
|
343
|
+
const leading = texts
|
|
344
|
+
.map((text) => {
|
|
345
|
+
return text.data;
|
|
346
|
+
})
|
|
347
|
+
.join("");
|
|
348
|
+
const match = leading.match(RE_LEADING_TEXT_MARKER);
|
|
349
|
+
if (!match || match[0].length === 0) {
|
|
350
|
+
return false;
|
|
351
|
+
}
|
|
352
|
+
let remaining = match[0].length;
|
|
353
|
+
for (const text of texts) {
|
|
354
|
+
if (remaining === 0) {
|
|
355
|
+
break;
|
|
356
|
+
}
|
|
357
|
+
const take = Math.min(remaining, text.data.length);
|
|
358
|
+
remaining -= take;
|
|
359
|
+
text.data = text.data.slice(take);
|
|
360
|
+
if (text.data.length > 0) {
|
|
361
|
+
continue;
|
|
362
|
+
}
|
|
363
|
+
let emptied = text.parentNode;
|
|
364
|
+
text.remove();
|
|
365
|
+
while (emptied &&
|
|
366
|
+
emptied !== item &&
|
|
367
|
+
emptied.nodeType === Node.ELEMENT_NODE &&
|
|
368
|
+
(emptied.textContent || "").length === 0 &&
|
|
369
|
+
!emptied.querySelector(INLINE_CONTENT_SELECTOR)) {
|
|
370
|
+
const parent = emptied.parentNode;
|
|
371
|
+
emptied.remove();
|
|
372
|
+
emptied = parent;
|
|
373
|
+
}
|
|
374
|
+
}
|
|
375
|
+
return true;
|
|
376
|
+
};
|
|
377
|
+
/*
|
|
378
|
+
* The list buttons turn lines into list items with execCommand, which keeps
|
|
379
|
+
* whatever the lines started with. Text pasted from Word or Slack that still
|
|
380
|
+
* begins with "•" or "o" therefore showed two bullets -- the list's own and
|
|
381
|
+
* the character -- and saved as "- •\tService down". This strips such a
|
|
382
|
+
* marker from every item the selection reaches.
|
|
383
|
+
*/
|
|
384
|
+
export const stripTextListMarkers = (root) => {
|
|
385
|
+
const context = getSelectionInRoot(root);
|
|
386
|
+
if (!context) {
|
|
387
|
+
return false;
|
|
388
|
+
}
|
|
389
|
+
const saved = saveSelection(context.selection);
|
|
390
|
+
let changed = false;
|
|
391
|
+
const items = Array.from(root.querySelectorAll("li")).filter((item) => {
|
|
392
|
+
return context.range.intersectsNode(item);
|
|
393
|
+
});
|
|
394
|
+
for (const item of items) {
|
|
395
|
+
if (stripLeadingMarker(item)) {
|
|
396
|
+
changed = true;
|
|
397
|
+
}
|
|
398
|
+
}
|
|
399
|
+
const first = items[0];
|
|
400
|
+
if (changed && first) {
|
|
401
|
+
restoreSelection(context.selection, saved, root, first);
|
|
402
|
+
}
|
|
403
|
+
return changed;
|
|
404
|
+
};
|
|
405
|
+
const RE_SOURCE_LIST_ITEM = /^([ \t]*)([-*+]|\d{1,9}[.)])([ \t]+|$)(.*)$/;
|
|
406
|
+
const RE_BULLET_MARKER = /^[-*+]$/;
|
|
407
|
+
const RE_FENCE_OPEN = /^[ \t]*(`{3,}|~{3,})/;
|
|
408
|
+
const RE_LEADING_WHITESPACE = /^[ \t]*/;
|
|
409
|
+
const RE_BLANK = /^[ \t]*$/;
|
|
410
|
+
// How many columns `text` covers when it starts at column `start`.
|
|
411
|
+
const columnsOf = (text, start) => {
|
|
412
|
+
let column = start;
|
|
413
|
+
for (const ch of text) {
|
|
414
|
+
column += ch === "\t" ? TAB_WIDTH - (column % TAB_WIDTH) : 1;
|
|
415
|
+
}
|
|
416
|
+
return column - start;
|
|
417
|
+
};
|
|
418
|
+
const leadingWhitespace = (line) => {
|
|
419
|
+
const match = line.match(RE_LEADING_WHITESPACE);
|
|
420
|
+
return match ? match[0] : "";
|
|
421
|
+
};
|
|
422
|
+
/*
|
|
423
|
+
* CommonMark's content column: the marker's indent, plus the marker, plus the
|
|
424
|
+
* spaces after it -- unless there are none (an empty item) or five or more
|
|
425
|
+
* (the text is indented code), in which case one space counts.
|
|
426
|
+
*/
|
|
427
|
+
const contentColumnOf = (indent, marker, spacing) => {
|
|
428
|
+
const markerEnd = indent + marker.length;
|
|
429
|
+
const spacingWidth = columnsOf(spacing, markerEnd);
|
|
430
|
+
if (spacingWidth === 0 || spacingWidth > 4) {
|
|
431
|
+
return markerEnd + 1;
|
|
432
|
+
}
|
|
433
|
+
return markerEnd + spacingWidth;
|
|
434
|
+
};
|
|
435
|
+
const parseSourceLines = (lines) => {
|
|
436
|
+
const parsed = [];
|
|
437
|
+
let openFence = null;
|
|
438
|
+
for (const line of lines) {
|
|
439
|
+
const indent = columnsOf(leadingWhitespace(line), 0);
|
|
440
|
+
const blank = RE_BLANK.test(line);
|
|
441
|
+
const fence = line.match(RE_FENCE_OPEN);
|
|
442
|
+
if (openFence !== null) {
|
|
443
|
+
const fenceRun = fence ? fence[1] || "" : "";
|
|
444
|
+
const closes = fenceRun.length >= openFence.length &&
|
|
445
|
+
fenceRun.charAt(0) === openFence.charAt(0) &&
|
|
446
|
+
RE_BLANK.test(line.slice(line.indexOf(fenceRun) + fenceRun.length));
|
|
447
|
+
parsed.push({ blank, indent, fenced: true, item: null });
|
|
448
|
+
if (closes) {
|
|
449
|
+
openFence = null;
|
|
450
|
+
}
|
|
451
|
+
continue;
|
|
452
|
+
}
|
|
453
|
+
if (fence) {
|
|
454
|
+
openFence = fence[1] || "```";
|
|
455
|
+
parsed.push({ blank, indent, fenced: true, item: null });
|
|
456
|
+
continue;
|
|
457
|
+
}
|
|
458
|
+
const match = line.match(RE_SOURCE_LIST_ITEM);
|
|
459
|
+
if (!match) {
|
|
460
|
+
parsed.push({ blank, indent, fenced: false, item: null });
|
|
461
|
+
continue;
|
|
462
|
+
}
|
|
463
|
+
const marker = match[2] || "";
|
|
464
|
+
const ordered = !RE_BULLET_MARKER.test(marker);
|
|
465
|
+
const spacing = match[3] || "";
|
|
466
|
+
parsed.push({
|
|
467
|
+
blank,
|
|
468
|
+
indent,
|
|
469
|
+
fenced: false,
|
|
470
|
+
item: {
|
|
471
|
+
marker,
|
|
472
|
+
ordered,
|
|
473
|
+
number: ordered ? parseInt(marker, 10) : 0,
|
|
474
|
+
delimiter: ordered ? marker.slice(-1) : marker,
|
|
475
|
+
spacing,
|
|
476
|
+
rest: match[4] || "",
|
|
477
|
+
contentColumn: contentColumnOf(indent, marker, spacing),
|
|
478
|
+
},
|
|
479
|
+
});
|
|
480
|
+
}
|
|
481
|
+
return parsed;
|
|
482
|
+
};
|
|
483
|
+
/*
|
|
484
|
+
* Whether `offset` in the source is inside a fenced code block: on one of
|
|
485
|
+
* its fence lines, between them, or anywhere after a fence that is never
|
|
486
|
+
* closed. The editor pastes there as the browser would, text as it is --
|
|
487
|
+
* the same fences Tab and the list buttons leave alone.
|
|
488
|
+
*/
|
|
489
|
+
export const isInFencedCodeBlock = (text, offset) => {
|
|
490
|
+
var _a;
|
|
491
|
+
const line = text.slice(0, Math.max(0, offset)).split("\n").length - 1;
|
|
492
|
+
return ((_a = parseSourceLines(text.split("\n"))[line]) === null || _a === void 0 ? void 0 : _a.fenced) === true;
|
|
493
|
+
};
|
|
494
|
+
/*
|
|
495
|
+
* The end (exclusive) of the block that starts at `index`: the item's own
|
|
496
|
+
* line and everything indented deeper than it below -- its continuation
|
|
497
|
+
* lines, its nested items, a fenced block inside it -- up to the next line
|
|
498
|
+
* that is not.
|
|
499
|
+
*/
|
|
500
|
+
const blockEnd = (parsed, index) => {
|
|
501
|
+
var _a, _b;
|
|
502
|
+
const own = (_b = (_a = parsed[index]) === null || _a === void 0 ? void 0 : _a.indent) !== null && _b !== void 0 ? _b : 0;
|
|
503
|
+
let end = index + 1;
|
|
504
|
+
let j = index + 1;
|
|
505
|
+
while (j < parsed.length) {
|
|
506
|
+
const line = parsed[j];
|
|
507
|
+
if (!line.blank) {
|
|
508
|
+
if (line.indent <= own) {
|
|
509
|
+
break;
|
|
510
|
+
}
|
|
511
|
+
end = j + 1;
|
|
512
|
+
}
|
|
513
|
+
j++;
|
|
514
|
+
}
|
|
515
|
+
return end;
|
|
516
|
+
};
|
|
517
|
+
// The innermost list item whose block holds line `index`, or -1.
|
|
518
|
+
const itemHoldingLine = (parsed, index) => {
|
|
519
|
+
for (let k = index; k >= 0; k--) {
|
|
520
|
+
const line = parsed[k];
|
|
521
|
+
if (line.item && (k === index || blockEnd(parsed, k) > index)) {
|
|
522
|
+
return k;
|
|
523
|
+
}
|
|
524
|
+
if (k < index && !line.blank && line.indent === 0 && !line.item) {
|
|
525
|
+
return -1;
|
|
526
|
+
}
|
|
527
|
+
}
|
|
528
|
+
return -1;
|
|
529
|
+
};
|
|
530
|
+
// The item line `index` is nested in, or -1 for a top-level item.
|
|
531
|
+
const parentItemOf = (parsed, index) => {
|
|
532
|
+
var _a, _b;
|
|
533
|
+
const indent = (_b = (_a = parsed[index]) === null || _a === void 0 ? void 0 : _a.indent) !== null && _b !== void 0 ? _b : 0;
|
|
534
|
+
for (let k = index - 1; k >= 0; k--) {
|
|
535
|
+
const line = parsed[k];
|
|
536
|
+
if (line.item &&
|
|
537
|
+
line.indent < indent &&
|
|
538
|
+
line.item.contentColumn <= indent &&
|
|
539
|
+
blockEnd(parsed, k) > index) {
|
|
540
|
+
return k;
|
|
541
|
+
}
|
|
542
|
+
if (!line.blank && line.indent === 0 && k < index && !line.item) {
|
|
543
|
+
return -1;
|
|
544
|
+
}
|
|
545
|
+
}
|
|
546
|
+
return -1;
|
|
547
|
+
};
|
|
548
|
+
/*
|
|
549
|
+
* The item before `index` in the same list: the nearest item above it at
|
|
550
|
+
* the same level, with nothing shallower in between.
|
|
551
|
+
*/
|
|
552
|
+
const previousSiblingOf = (parsed, index) => {
|
|
553
|
+
var _a, _b;
|
|
554
|
+
const indent = (_b = (_a = parsed[index]) === null || _a === void 0 ? void 0 : _a.indent) !== null && _b !== void 0 ? _b : 0;
|
|
555
|
+
for (let k = index - 1; k >= 0; k--) {
|
|
556
|
+
const line = parsed[k];
|
|
557
|
+
if (line.blank || line.indent > indent) {
|
|
558
|
+
continue;
|
|
559
|
+
}
|
|
560
|
+
if (line.item && indent < line.item.contentColumn) {
|
|
561
|
+
return k;
|
|
562
|
+
}
|
|
563
|
+
return -1;
|
|
564
|
+
}
|
|
565
|
+
return -1;
|
|
566
|
+
};
|
|
567
|
+
/*
|
|
568
|
+
* The items after `index` in the same list, up to line `lastLine`. A marker
|
|
569
|
+
* of the other kind at the same indent starts a list of its own, so it ends
|
|
570
|
+
* the run.
|
|
571
|
+
*/
|
|
572
|
+
const followingSiblingsOf = (parsed, index, lastLine) => {
|
|
573
|
+
const start = parsed[index];
|
|
574
|
+
const siblings = [];
|
|
575
|
+
if (!start || !start.item) {
|
|
576
|
+
return siblings;
|
|
577
|
+
}
|
|
578
|
+
let j = blockEnd(parsed, index);
|
|
579
|
+
while (j < parsed.length && j <= lastLine) {
|
|
580
|
+
const line = parsed[j];
|
|
581
|
+
if (line.blank) {
|
|
582
|
+
j++;
|
|
583
|
+
continue;
|
|
584
|
+
}
|
|
585
|
+
if (!line.item ||
|
|
586
|
+
line.indent !== start.indent ||
|
|
587
|
+
line.item.ordered !== start.item.ordered) {
|
|
588
|
+
break;
|
|
589
|
+
}
|
|
590
|
+
siblings.push(j);
|
|
591
|
+
j = blockEnd(parsed, j);
|
|
592
|
+
}
|
|
593
|
+
return siblings;
|
|
594
|
+
};
|
|
595
|
+
/*
|
|
596
|
+
* The lines a selection covers. A selection that ends at column 0 of a line
|
|
597
|
+
* -- what dragging to the end of the previous line or selecting whole lines
|
|
598
|
+
* leaves -- does not include that line.
|
|
599
|
+
*/
|
|
600
|
+
const selectedLineRange = (text, selectionStart, selectionEnd) => {
|
|
601
|
+
const start = Math.max(0, Math.min(selectionStart, text.length));
|
|
602
|
+
let end = Math.max(start, Math.min(selectionEnd, text.length));
|
|
603
|
+
if (end > start && text.charAt(end - 1) === "\n") {
|
|
604
|
+
end--;
|
|
605
|
+
}
|
|
606
|
+
const lineOf = (offset) => {
|
|
607
|
+
return text.slice(0, offset).split("\n").length - 1;
|
|
608
|
+
};
|
|
609
|
+
return { first: lineOf(start), last: lineOf(end) };
|
|
610
|
+
};
|
|
611
|
+
/*
|
|
612
|
+
* The item an indent or outdent starts from: the one holding the first
|
|
613
|
+
* non-blank selected line. Nothing, when that line is in a fenced code block
|
|
614
|
+
* or is not in a list at all.
|
|
615
|
+
*/
|
|
616
|
+
const startItemOf = (parsed, first, last) => {
|
|
617
|
+
var _a;
|
|
618
|
+
let line = first;
|
|
619
|
+
while (line <= last && ((_a = parsed[line]) === null || _a === void 0 ? void 0 : _a.blank)) {
|
|
620
|
+
line++;
|
|
621
|
+
}
|
|
622
|
+
const at = parsed[line];
|
|
623
|
+
if (line > last || !at || at.fenced) {
|
|
624
|
+
return -1;
|
|
625
|
+
}
|
|
626
|
+
return itemHoldingLine(parsed, line);
|
|
627
|
+
};
|
|
628
|
+
const withIndent = (line, columns) => {
|
|
629
|
+
return `${" ".repeat(Math.max(0, columns))}${line.slice(leadingWhitespace(line).length)}`;
|
|
630
|
+
};
|
|
631
|
+
/*
|
|
632
|
+
* Rewrites item `index` to start at column `indent` with `marker`, and moves
|
|
633
|
+
* every line of its block by as much as its content column moved, so the
|
|
634
|
+
* lines nested in it stay nested in it -- including when the new marker is
|
|
635
|
+
* wider or narrower than the old one ("9." becoming "10.").
|
|
636
|
+
*/
|
|
637
|
+
const moveItem = (lines, parsed, index, indent, marker) => {
|
|
638
|
+
var _a, _b, _c;
|
|
639
|
+
const item = ((_a = parsed[index]) === null || _a === void 0 ? void 0 : _a.item) || null;
|
|
640
|
+
if (!item) {
|
|
641
|
+
return;
|
|
642
|
+
}
|
|
643
|
+
const end = blockEnd(parsed, index);
|
|
644
|
+
// Tabs in the spacing would change width with the column; write spaces.
|
|
645
|
+
const oldMarkerEnd = ((_c = (_b = parsed[index]) === null || _b === void 0 ? void 0 : _b.indent) !== null && _c !== void 0 ? _c : 0) + item.marker.length;
|
|
646
|
+
const spacing = item.spacing.includes("\t")
|
|
647
|
+
? " ".repeat(columnsOf(item.spacing, oldMarkerEnd))
|
|
648
|
+
: item.spacing;
|
|
649
|
+
lines[index] = `${" ".repeat(indent)}${marker}${spacing}${item.rest}`;
|
|
650
|
+
const shift = contentColumnOf(indent, marker, spacing) - item.contentColumn;
|
|
651
|
+
for (let j = index + 1; j < end; j++) {
|
|
652
|
+
const line = parsed[j];
|
|
653
|
+
if (!line.blank) {
|
|
654
|
+
lines[j] = withIndent(lines[j] || "", line.indent + shift);
|
|
655
|
+
}
|
|
656
|
+
}
|
|
657
|
+
};
|
|
658
|
+
const markerAfter = (item, number) => {
|
|
659
|
+
return item.ordered ? `${number}${item.delimiter}` : item.marker;
|
|
660
|
+
};
|
|
661
|
+
/*
|
|
662
|
+
* Numbers an ordered list's items one after another, from `startNumber`, so
|
|
663
|
+
* the source reads the way the visual editor would write it. CommonMark only
|
|
664
|
+
* takes a list's first number, so this changes what the text says rather than
|
|
665
|
+
* how it renders -- except for the first item, whose number is the list's
|
|
666
|
+
* start.
|
|
667
|
+
*/
|
|
668
|
+
const renumberList = (lines, firstItem, startNumber) => {
|
|
669
|
+
var _a, _b, _c, _d;
|
|
670
|
+
let parsed = parseSourceLines(lines);
|
|
671
|
+
const first = ((_a = parsed[firstItem]) === null || _a === void 0 ? void 0 : _a.item) || null;
|
|
672
|
+
if (!first || !first.ordered) {
|
|
673
|
+
return;
|
|
674
|
+
}
|
|
675
|
+
const items = [
|
|
676
|
+
firstItem,
|
|
677
|
+
...followingSiblingsOf(parsed, firstItem, lines.length),
|
|
678
|
+
];
|
|
679
|
+
let number = startNumber;
|
|
680
|
+
for (const index of items) {
|
|
681
|
+
const item = ((_b = parsed[index]) === null || _b === void 0 ? void 0 : _b.item) || null;
|
|
682
|
+
if (item) {
|
|
683
|
+
const marker = `${number}${item.delimiter}`;
|
|
684
|
+
if (marker !== item.marker) {
|
|
685
|
+
moveItem(lines, parsed, index, (_d = (_c = parsed[index]) === null || _c === void 0 ? void 0 : _c.indent) !== null && _d !== void 0 ? _d : 0, marker);
|
|
686
|
+
parsed = parseSourceLines(lines);
|
|
687
|
+
}
|
|
688
|
+
}
|
|
689
|
+
number++;
|
|
690
|
+
}
|
|
691
|
+
};
|
|
692
|
+
/*
|
|
693
|
+
* Where an offset in the old text lands in the new one. Only the start of a
|
|
694
|
+
* line (its indent and marker) ever changes, so a position in the text after
|
|
695
|
+
* that moves with it; a position inside the part that changed stays put, or
|
|
696
|
+
* moves back to the new line's end if it would pass it. A non-empty selection
|
|
697
|
+
* that started at column 0 keeps starting there, so whole lines stay selected
|
|
698
|
+
* and a second Tab indents them again.
|
|
699
|
+
*/
|
|
700
|
+
const mapOffset = (before, after, offset, keepLineStart) => {
|
|
701
|
+
let remaining = offset;
|
|
702
|
+
let line = 0;
|
|
703
|
+
while (line < before.length - 1 && remaining > (before[line] || "").length) {
|
|
704
|
+
remaining -= (before[line] || "").length + 1;
|
|
705
|
+
line++;
|
|
706
|
+
}
|
|
707
|
+
const oldLine = before[line] || "";
|
|
708
|
+
const newLine = after[line] || "";
|
|
709
|
+
let column = Math.max(0, Math.min(remaining, oldLine.length));
|
|
710
|
+
if (!(keepLineStart && column === 0)) {
|
|
711
|
+
// Everything after the changed start of the line is shared by both.
|
|
712
|
+
const unchanged = commonSuffixLength(oldLine, newLine);
|
|
713
|
+
const oldChangedEnd = oldLine.length - unchanged;
|
|
714
|
+
const newChangedEnd = newLine.length - unchanged;
|
|
715
|
+
column =
|
|
716
|
+
column >= oldChangedEnd
|
|
717
|
+
? column - oldChangedEnd + newChangedEnd
|
|
718
|
+
: Math.min(column, newChangedEnd);
|
|
719
|
+
column = Math.max(0, Math.min(column, newLine.length));
|
|
720
|
+
}
|
|
721
|
+
let result = 0;
|
|
722
|
+
for (let k = 0; k < line; k++) {
|
|
723
|
+
result += (after[k] || "").length + 1;
|
|
724
|
+
}
|
|
725
|
+
return result + column;
|
|
726
|
+
};
|
|
727
|
+
const commonSuffixLength = (a, b) => {
|
|
728
|
+
let length = 0;
|
|
729
|
+
while (length < a.length &&
|
|
730
|
+
length < b.length &&
|
|
731
|
+
a.charAt(a.length - 1 - length) === b.charAt(b.length - 1 - length)) {
|
|
732
|
+
length++;
|
|
733
|
+
}
|
|
734
|
+
return length;
|
|
735
|
+
};
|
|
736
|
+
const finishEdit = (before, after, selectionStart, selectionEnd) => {
|
|
737
|
+
const text = after.join("\n");
|
|
738
|
+
if (text === before.join("\n")) {
|
|
739
|
+
return null;
|
|
740
|
+
}
|
|
741
|
+
const collapsed = selectionStart === selectionEnd;
|
|
742
|
+
const start = mapOffset(before, after, selectionStart, !collapsed);
|
|
743
|
+
const end = collapsed
|
|
744
|
+
? start
|
|
745
|
+
: Math.max(start, mapOffset(before, after, selectionEnd, false));
|
|
746
|
+
return { text, selectionStart: start, selectionEnd: end };
|
|
747
|
+
};
|
|
748
|
+
/*
|
|
749
|
+
* Indent in the source: the selected items move to the content column of the
|
|
750
|
+
* item before them, and everything nested in them moves by the same amount.
|
|
751
|
+
* An item that becomes the first child starts a new list (an ordered one is
|
|
752
|
+
* renumbered from 1, or it would render as start="2"); one that joins
|
|
753
|
+
* existing children takes their kind of marker and the next number. The list
|
|
754
|
+
* the items left is renumbered. Returns null when there is nothing to indent
|
|
755
|
+
* -- the caret is not in a list, the item is its list's first, or the line is
|
|
756
|
+
* in a fenced code block.
|
|
757
|
+
*/
|
|
758
|
+
export const indentMarkdownLines = (text, selectionStart, selectionEnd) => {
|
|
759
|
+
var _a, _b, _c, _d;
|
|
760
|
+
const before = text.split("\n");
|
|
761
|
+
const lines = before.slice();
|
|
762
|
+
let parsed = parseSourceLines(lines);
|
|
763
|
+
const range = selectedLineRange(text, selectionStart, selectionEnd);
|
|
764
|
+
const start = startItemOf(parsed, range.first, range.last);
|
|
765
|
+
if (start === -1) {
|
|
766
|
+
return null;
|
|
767
|
+
}
|
|
768
|
+
const previous = previousSiblingOf(parsed, start);
|
|
769
|
+
const previousItem = ((_a = parsed[previous]) === null || _a === void 0 ? void 0 : _a.item) || null;
|
|
770
|
+
if (previous === -1 || !previousItem) {
|
|
771
|
+
return null;
|
|
772
|
+
}
|
|
773
|
+
const items = [
|
|
774
|
+
start,
|
|
775
|
+
...followingSiblingsOf(parsed, start, range.last),
|
|
776
|
+
];
|
|
777
|
+
const column = previousItem.contentColumn;
|
|
778
|
+
for (const index of items) {
|
|
779
|
+
const item = ((_b = parsed[index]) === null || _b === void 0 ? void 0 : _b.item) || null;
|
|
780
|
+
if (!item) {
|
|
781
|
+
continue;
|
|
782
|
+
}
|
|
783
|
+
let joins = -1;
|
|
784
|
+
for (let k = index - 1; k > previous; k--) {
|
|
785
|
+
if (((_c = parsed[k]) === null || _c === void 0 ? void 0 : _c.item) && parentItemOf(parsed, k) === previous) {
|
|
786
|
+
joins = k;
|
|
787
|
+
break;
|
|
788
|
+
}
|
|
789
|
+
}
|
|
790
|
+
const joined = ((_d = parsed[joins]) === null || _d === void 0 ? void 0 : _d.item) || null;
|
|
791
|
+
let marker;
|
|
792
|
+
if (joined) {
|
|
793
|
+
marker = markerAfter(joined, joined.number + 1);
|
|
794
|
+
}
|
|
795
|
+
else {
|
|
796
|
+
marker = item.ordered ? `1${item.delimiter}` : item.marker;
|
|
797
|
+
}
|
|
798
|
+
moveItem(lines, parsed, index, column, marker);
|
|
799
|
+
parsed = parseSourceLines(lines);
|
|
800
|
+
}
|
|
801
|
+
if (previousItem.ordered) {
|
|
802
|
+
renumberList(lines, previous, previousItem.number);
|
|
803
|
+
}
|
|
804
|
+
return finishEdit(before, lines, selectionStart, selectionEnd);
|
|
805
|
+
};
|
|
806
|
+
/*
|
|
807
|
+
* Outdent in the source: the selected items move out to their parent's
|
|
808
|
+
* column and take the parent list's kind of marker, numbered on from the
|
|
809
|
+
* parent (otherwise "1. a\n - b\n2. c" would come out as three separate
|
|
810
|
+
* lists). The items that followed them at their old level stay where they
|
|
811
|
+
* are, which now nests them in the last moved item -- re-indented to its
|
|
812
|
+
* content column if its marker is wider -- and they start a new list, so an
|
|
813
|
+
* ordered one is renumbered from 1. Returns null for a top-level item, a line
|
|
814
|
+
* outside any list, or one in a fenced code block.
|
|
815
|
+
*/
|
|
816
|
+
export const outdentMarkdownLines = (text, selectionStart, selectionEnd) => {
|
|
817
|
+
var _a, _b, _c, _d, _e, _f, _g;
|
|
818
|
+
const before = text.split("\n");
|
|
819
|
+
const lines = before.slice();
|
|
820
|
+
let parsed = parseSourceLines(lines);
|
|
821
|
+
const range = selectedLineRange(text, selectionStart, selectionEnd);
|
|
822
|
+
const start = startItemOf(parsed, range.first, range.last);
|
|
823
|
+
if (start === -1) {
|
|
824
|
+
return null;
|
|
825
|
+
}
|
|
826
|
+
const parent = parentItemOf(parsed, start);
|
|
827
|
+
const parentItem = ((_a = parsed[parent]) === null || _a === void 0 ? void 0 : _a.item) || null;
|
|
828
|
+
if (parent === -1 || !parentItem) {
|
|
829
|
+
return null;
|
|
830
|
+
}
|
|
831
|
+
const items = [
|
|
832
|
+
start,
|
|
833
|
+
...followingSiblingsOf(parsed, start, range.last),
|
|
834
|
+
];
|
|
835
|
+
const lastMoved = (_b = items[items.length - 1]) !== null && _b !== void 0 ? _b : start;
|
|
836
|
+
const oldIndent = (_d = (_c = parsed[start]) === null || _c === void 0 ? void 0 : _c.indent) !== null && _d !== void 0 ? _d : 0;
|
|
837
|
+
const trailing = followingSiblingsOf(parsed, lastMoved, lines.length);
|
|
838
|
+
const firstTrailing = trailing[0];
|
|
839
|
+
const lastTrailing = trailing[trailing.length - 1];
|
|
840
|
+
const trailingEnd = lastTrailing === undefined ? -1 : blockEnd(parsed, lastTrailing);
|
|
841
|
+
const newIndent = (_f = (_e = parsed[parent]) === null || _e === void 0 ? void 0 : _e.indent) !== null && _f !== void 0 ? _f : 0;
|
|
842
|
+
let number = parentItem.number;
|
|
843
|
+
for (const index of items) {
|
|
844
|
+
number++;
|
|
845
|
+
moveItem(lines, parsed, index, newIndent, markerAfter(parentItem, number));
|
|
846
|
+
parsed = parseSourceLines(lines);
|
|
847
|
+
}
|
|
848
|
+
if (firstTrailing !== undefined) {
|
|
849
|
+
const moved = ((_g = parsed[lastMoved]) === null || _g === void 0 ? void 0 : _g.item) || null;
|
|
850
|
+
const shortfall = moved ? moved.contentColumn - oldIndent : 0;
|
|
851
|
+
if (shortfall > 0) {
|
|
852
|
+
for (let j = firstTrailing; j < trailingEnd; j++) {
|
|
853
|
+
const line = parsed[j];
|
|
854
|
+
if (!line.blank) {
|
|
855
|
+
lines[j] = withIndent(lines[j] || "", line.indent + shortfall);
|
|
856
|
+
}
|
|
857
|
+
}
|
|
858
|
+
parsed = parseSourceLines(lines);
|
|
859
|
+
}
|
|
860
|
+
renumberList(lines, firstTrailing, 1);
|
|
861
|
+
}
|
|
862
|
+
if (parentItem.ordered) {
|
|
863
|
+
renumberList(lines, parent, parentItem.number);
|
|
864
|
+
}
|
|
865
|
+
return finishEdit(before, lines, selectionStart, selectionEnd);
|
|
866
|
+
};
|
|
867
|
+
const RE_TASK_LINE = /^[-*+][ \t]+\[([ xX])\](?:[ \t]|$)/;
|
|
868
|
+
const RE_BULLET_LINE = /^[-*+](?:[ \t]|$)/;
|
|
869
|
+
const RE_ORDERED_LINE = /^\d{1,9}[.)](?:[ \t]|$)/;
|
|
870
|
+
/*
|
|
871
|
+
* A marker at the start of a source line's text. As in the visual editor, a
|
|
872
|
+
* bullet character only counts before a space or tab (or on its own):
|
|
873
|
+
* "–5°C" keeps its minus sign, and "- –5°C" is an item, not a double bullet.
|
|
874
|
+
*/
|
|
875
|
+
const RE_SOURCE_MARKER = new RegExp(`^(?:[-*+][ \\t]+(?:\\[[ xX]\\][ \\t]+)?|\\d{1,9}[.)][ \\t]+|[${TEXT_BULLET_GLYPHS}](?:[ \\t\\u00a0]+|$)|[${TAB_ONLY_BULLET_GLYPHS}]\\t[ \\t]*)`);
|
|
876
|
+
/*
|
|
877
|
+
* The kind of item a line is. A line whose text still starts with a second
|
|
878
|
+
* marker after its own -- the "- •\tService down" a double bullet saved as
|
|
879
|
+
* -- counts as none, so the button repairs it instead of taking the list off.
|
|
880
|
+
*/
|
|
881
|
+
const listKindOf = (body) => {
|
|
882
|
+
let kind = null;
|
|
883
|
+
if (RE_TASK_LINE.test(body)) {
|
|
884
|
+
kind = "task";
|
|
885
|
+
}
|
|
886
|
+
else if (RE_BULLET_LINE.test(body)) {
|
|
887
|
+
kind = "bullet";
|
|
888
|
+
}
|
|
889
|
+
else if (RE_ORDERED_LINE.test(body)) {
|
|
890
|
+
kind = "ordered";
|
|
891
|
+
}
|
|
892
|
+
const own = body.match(RE_SOURCE_MARKER);
|
|
893
|
+
if (kind && own && RE_SOURCE_MARKER.test(body.slice(own[0].length))) {
|
|
894
|
+
return null;
|
|
895
|
+
}
|
|
896
|
+
return kind;
|
|
897
|
+
};
|
|
898
|
+
// Every marker a line starts with -- "- •\tx" (a double bullet) loses both.
|
|
899
|
+
const stripSourceMarkers = (body) => {
|
|
900
|
+
let stripped = body;
|
|
901
|
+
for (let pass = 0; pass < 3; pass++) {
|
|
902
|
+
const match = stripped.match(RE_SOURCE_MARKER);
|
|
903
|
+
if (!match || match[0].length === 0) {
|
|
904
|
+
break;
|
|
905
|
+
}
|
|
906
|
+
stripped = stripped.slice(match[0].length);
|
|
907
|
+
}
|
|
908
|
+
return stripped;
|
|
909
|
+
};
|
|
910
|
+
/*
|
|
911
|
+
* The number an item gets from the Numbered List button: 1 when it starts a
|
|
912
|
+
* list of its own, otherwise one on from the item before it at its level --
|
|
913
|
+
* counted per list, so a nested list starts again at 1 rather than carrying
|
|
914
|
+
* on from its parent's numbers.
|
|
915
|
+
*/
|
|
916
|
+
const nextListNumber = (parsed, index, counters) => {
|
|
917
|
+
var _a;
|
|
918
|
+
const parent = parentItemOf(parsed, index);
|
|
919
|
+
const previous = previousSiblingOf(parsed, index);
|
|
920
|
+
let number = 1;
|
|
921
|
+
if (previous !== -1) {
|
|
922
|
+
const counted = counters.get(parent);
|
|
923
|
+
const previousItem = ((_a = parsed[previous]) === null || _a === void 0 ? void 0 : _a.item) || null;
|
|
924
|
+
if (counted !== undefined) {
|
|
925
|
+
number = counted + 1;
|
|
926
|
+
}
|
|
927
|
+
else if (previousItem && previousItem.ordered) {
|
|
928
|
+
number = previousItem.number + 1;
|
|
929
|
+
}
|
|
930
|
+
}
|
|
931
|
+
counters.set(parent, number);
|
|
932
|
+
return number;
|
|
933
|
+
};
|
|
934
|
+
/*
|
|
935
|
+
* The Bullet List, Numbered List and Task List buttons in the source. Every
|
|
936
|
+
* selected line that has text becomes an item of that kind: whatever marker
|
|
937
|
+
* it already had -- another kind's, or a bullet character pasted as text --
|
|
938
|
+
* is replaced rather than kept beside the new one, and numbered lines count
|
|
939
|
+
* 1, 2, 3 down each list they are in. When every one of those lines already
|
|
940
|
+
* is an item of that kind, the button takes the markers off instead. A task
|
|
941
|
+
* item keeps its checked state. With no text selected, the caret's own line
|
|
942
|
+
* is used even when it is empty, to start a list there. Returns null when
|
|
943
|
+
* nothing changed (the caret is inside a fenced code block).
|
|
944
|
+
*/
|
|
945
|
+
export const toggleMarkdownList = (text, selectionStart, selectionEnd, kind) => {
|
|
946
|
+
var _a, _b;
|
|
947
|
+
const before = text.split("\n");
|
|
948
|
+
const lines = before.slice();
|
|
949
|
+
const parsed = parseSourceLines(lines);
|
|
950
|
+
const range = selectedLineRange(text, selectionStart, selectionEnd);
|
|
951
|
+
let targets = [];
|
|
952
|
+
for (let index = range.first; index <= range.last; index++) {
|
|
953
|
+
const line = parsed[index];
|
|
954
|
+
if (line && !line.blank && !line.fenced) {
|
|
955
|
+
targets.push(index);
|
|
956
|
+
}
|
|
957
|
+
}
|
|
958
|
+
if (targets.length === 0 && range.first === range.last) {
|
|
959
|
+
if ((_a = parsed[range.first]) === null || _a === void 0 ? void 0 : _a.fenced) {
|
|
960
|
+
return null;
|
|
961
|
+
}
|
|
962
|
+
targets = [range.first];
|
|
963
|
+
}
|
|
964
|
+
if (targets.length === 0) {
|
|
965
|
+
return null;
|
|
966
|
+
}
|
|
967
|
+
const bodies = targets.map((index) => {
|
|
968
|
+
const line = lines[index] || "";
|
|
969
|
+
const indent = leadingWhitespace(line);
|
|
970
|
+
return { indent, body: line.slice(indent.length) };
|
|
971
|
+
});
|
|
972
|
+
const allOfKind = bodies.every((entry) => {
|
|
973
|
+
return listKindOf(entry.body) === kind;
|
|
974
|
+
});
|
|
975
|
+
if (allOfKind) {
|
|
976
|
+
targets.forEach((index, position) => {
|
|
977
|
+
const entry = bodies[position];
|
|
978
|
+
if (entry) {
|
|
979
|
+
lines[index] = `${entry.indent}${stripSourceMarkers(entry.body)}`;
|
|
980
|
+
}
|
|
981
|
+
});
|
|
982
|
+
return finishEdit(before, lines, selectionStart, selectionEnd);
|
|
983
|
+
}
|
|
984
|
+
/*
|
|
985
|
+
* Top down, re-reading the text after each line. "1. " is wider than
|
|
986
|
+
* "- ", so an item's text starts a column further in once it is numbered
|
|
987
|
+
* -- and the lines nested in it (its sub-items, a code block in it) move
|
|
988
|
+
* with it, or " - b" under a new "1. a" would fall out of the item: the
|
|
989
|
+
* button turned "- a\n - b\n- c" into the flat list "1. a\n 2. b\n3. c".
|
|
990
|
+
* A line's own indent can have moved with its parent before it is reached.
|
|
991
|
+
*/
|
|
992
|
+
let current = parsed;
|
|
993
|
+
const counters = new Map();
|
|
994
|
+
for (const index of targets) {
|
|
995
|
+
const line = lines[index] || "";
|
|
996
|
+
const indent = leadingWhitespace(line);
|
|
997
|
+
const body = line.slice(indent.length);
|
|
998
|
+
let prefix;
|
|
999
|
+
if (kind === "ordered") {
|
|
1000
|
+
prefix = `${nextListNumber(current, index, counters)}. `;
|
|
1001
|
+
}
|
|
1002
|
+
else if (kind === "task") {
|
|
1003
|
+
const task = body.match(RE_TASK_LINE);
|
|
1004
|
+
const checked = Boolean(task && (task[1] || "").trim());
|
|
1005
|
+
prefix = checked ? "- [x] " : "- [ ] ";
|
|
1006
|
+
}
|
|
1007
|
+
else {
|
|
1008
|
+
prefix = "- ";
|
|
1009
|
+
}
|
|
1010
|
+
lines[index] = `${indent}${prefix}${stripSourceMarkers(body)}`;
|
|
1011
|
+
const item = ((_b = current[index]) === null || _b === void 0 ? void 0 : _b.item) || null;
|
|
1012
|
+
if (item) {
|
|
1013
|
+
// A task's "[ ] " is the item's text, which starts after "- ".
|
|
1014
|
+
const width = kind === "ordered" ? prefix.length : 2;
|
|
1015
|
+
const shift = columnsOf(indent, 0) + width - item.contentColumn;
|
|
1016
|
+
const end = blockEnd(current, index);
|
|
1017
|
+
for (let j = index + 1; j < end && shift !== 0; j++) {
|
|
1018
|
+
const nested = current[j];
|
|
1019
|
+
if (!nested.blank) {
|
|
1020
|
+
lines[j] = withIndent(lines[j] || "", nested.indent + shift);
|
|
1021
|
+
}
|
|
1022
|
+
}
|
|
1023
|
+
}
|
|
1024
|
+
current = parseSourceLines(lines);
|
|
1025
|
+
}
|
|
1026
|
+
return finishEdit(before, lines, selectionStart, selectionEnd);
|
|
1027
|
+
};
|
|
1028
|
+
//# sourceMappingURL=MarkdownListEditing.js.map
|